semantifold 0.4.0 → 0.5.0

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 (42) hide show
  1. package/README.md +5 -2
  2. package/build/index.d.ts +12 -8
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +10 -7
  5. package/build/src/backends/android.d.ts +49 -0
  6. package/build/src/backends/android.d.ts.map +1 -0
  7. package/build/src/backends/android.js +1274 -0
  8. package/build/src/backends/identifiers.d.ts.map +1 -1
  9. package/build/src/backends/identifiers.js +7 -1
  10. package/build/src/backends/kotlin.d.ts +10 -0
  11. package/build/src/backends/kotlin.d.ts.map +1 -1
  12. package/build/src/backends/kotlin.js +11 -9
  13. package/build/src/backends/program.d.ts +6 -4
  14. package/build/src/backends/program.d.ts.map +1 -1
  15. package/build/src/backends/program.js +5 -4
  16. package/build/src/backends/shared.d.ts.map +1 -1
  17. package/build/src/backends/shared.js +17 -1
  18. package/build/src/backends/writer.d.ts +21 -1
  19. package/build/src/backends/writer.d.ts.map +1 -1
  20. package/build/src/backends/writer.js +25 -2
  21. package/build/src/language-registry.d.ts.map +1 -1
  22. package/build/src/language-registry.js +11 -1
  23. package/build/src/semantic/types.d.ts +182 -2
  24. package/build/src/semantic/types.d.ts.map +1 -1
  25. package/build/src/semantic/types.js +44 -2
  26. package/docs/android.md +79 -0
  27. package/docs/architecture.md +2 -0
  28. package/docs/ios.md +1 -1
  29. package/docs/language-support.md +8 -1
  30. package/docs/source-maps.md +2 -0
  31. package/docs/specification.md +5 -0
  32. package/docs/testing.md +15 -0
  33. package/index.js +9 -6
  34. package/package.json +1 -1
  35. package/src/backends/android.js +1370 -0
  36. package/src/backends/identifiers.js +6 -0
  37. package/src/backends/kotlin.js +11 -8
  38. package/src/backends/program.js +4 -3
  39. package/src/backends/shared.js +19 -0
  40. package/src/backends/writer.js +27 -2
  41. package/src/language-registry.js +10 -0
  42. package/src/semantic/types.js +46 -1
@@ -21,7 +21,7 @@ import { programImportName, SourceWriter } from "./writer.js";
21
21
  /** @type {Readonly<Set<import("../semantic/types.js").SemanticLanguage>>} */
22
22
  const programTargets = new Set(["php", "ruby", "javascript", "typescript", "java"]);
23
23
  /** @type {Readonly<Set<import("../semantic/types.js").BackendLanguage>>} */
24
- const programApplicationTargets = new Set(["ios"]);
24
+ const programApplicationTargets = new Set(["android", "ios"]);
25
25
  /**
26
26
  * Validates and prepares a complete semantic program for a non-text backend without allocating a writer.
27
27
  * @param {object} input - Backend preflight request.
@@ -63,8 +63,9 @@ export function preflightSemanticProgram({ backendLanguage, diagnosticLanguage,
63
63
  * @param {import("../semantic/types.js").BackendLanguage} input.language - Registered program target.
64
64
  * @param {import("../semantic/types.js").SemanticProgram} input.program - Complete semantic program.
65
65
  * @param {"text" | "application"} [input.role] - Explicit artifact role; omitted preserves text generation.
66
- * @param {import("../semantic/types.js").IosApplicationConfigurationInput} [input.configuration] - iOS application configuration.
67
- * @param {import("../semantic/types.js").IosApplicationAssetInput[]} [input.assets] - Exact iOS caller assets.
66
+ * @param {import("../semantic/types.js").IosApplicationConfigurationInput | import("../semantic/types.js").AndroidApplicationConfigurationInput} [input.configuration] - Application configuration.
67
+ * @param {import("../semantic/types.js").IosApplicationAssetInput[] | import("../semantic/types.js").AndroidApplicationInputFile[]} [input.assets] - Exact caller assets.
68
+ * @param {import("../semantic/types.js").AndroidApplicationInputFile[]} [input.resources] - Exact Android caller resources.
68
69
  * @returns {import("../semantic/types.js").GeneratedArtifactSet} Transactionally validated artifact set.
69
70
  */
70
71
  export function generateProgramArtifacts(input) {
@@ -1305,4 +1306,4 @@ function isPlainObject(value) {
1305
1306
  function invalidProgramGeneration(message) {
1306
1307
  throw new SemantifoldDiagnostic({ code: "INVALID_PROGRAM", language: "program", message });
1307
1308
  }
1308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9wcm9ncmFtLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ3hFLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQzFELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUM5RixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUMxRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUN4RCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUM1RCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFBO0FBQzdGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUN6RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUNoRixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNuRSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQTtBQUNqRSxPQUFPLEVBQUMsNkJBQTZCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQTtBQUN4RixPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM3RCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDeEQsT0FBTyxFQUFDLCtCQUEr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QyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQy9GLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJO0lBQ2hDLE9BQU8sUUFBUSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7QUFDbkUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFLO0lBQzFCLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFBO0FBQ2hJLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FBQyxPQUFPO0lBQ3ZDLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyxFQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7QUFDMUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2lzRGVuc2VBcnJheX0gZnJvbSBcIi4uL2FycmF5LmpzXCJcbmltcG9ydCB7aXNTYWZlQXJ0aWZhY3RQYXRoLCBpc1NhZmVTb3VyY2VQYXRofSBmcm9tIFwiLi4vYXJ0aWZhY3QtcGF0aC5qc1wiXG5pbXBvcnQge2NyZWF0ZUdlbmVyYXRlZEFydGlmYWN0U2V0fSBmcm9tIFwiLi4vYXJ0aWZhY3RzLmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljLCB1bnN1cHBvcnRlZENhcGFiaWxpdHksIHVuc3VwcG9ydGVkUm9sZX0gZnJvbSBcIi4uL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtwYXJzZVByb2dyYW1Tb3VyY2V9IGZyb20gXCIuLi9mcm9udGVuZHMvcHJvZ3JhbS5qc1wiXG5pbXBvcnQge2xhbmd1YWdlUmVnaXN0cnl9IGZyb20gXCIuLi9sYW5ndWFnZS1yZWdpc3RyeS5qc1wiXG5pbXBvcnQge2ZpbmFsaXplTWFwcGluZywgdG9Tb3VyY2VNYXBWM30gZnJvbSBcIi4uL21hcHBpbmcuanNcIlxuaW1wb3J0IHtjcmVhdGVDb29yZGluYXRlSW5kZXgsIGluZGV4ZWRQb2ludEF0LCBtb2R1bGVMb2NhdGlvbn0gZnJvbSBcIi4uL3NlbWFudGljL2xvY2F0aW9uLmpzXCJcbmltcG9ydCB7c2VtYW50aWNFbnRyaWVzfSBmcm9tIFwiLi4vc2VtYW50aWMvcHJvdmVuYW5jZS5qc1wiXG5pbXBvcnQge2xpc3RTdGRsaWJNb2R1bGVzLCBwYXJzZVN0ZGxpYlZlcnNpb25SYW5nZX0gZnJvbSBcIi4uL3NlbWFudGljL3N0ZGxpYi5qc1wiXG5pbXBvcnQge21vZHVsZVVuY2hlY2tlZEVycm9yRWZmZWN0c30gZnJvbSBcIi4uL3NlbWFudGljL3ZhbGlkYXRlLmpzXCJcbmltcG9ydCB7bmVnb3RpYXRlU3RkbGliUHJvdmlkZXJzfSBmcm9tIFwiLi4vc3RkbGliLW5lZ290aWF0aW9uLmpzXCJcbmltcG9ydCB7c3RkbGliRmFjYWRlUHJvZ3JhbURlc2NyaXB0b3IsIHN0ZGxpYkZhY2FkZVJlZ2lzdHJ5fSBmcm9tIFwiLi4vc3RkbGliLWZhY2FkZXMuanNcIlxuaW1wb3J0IHtzdGRsaWJQcm92aWRlclJlZ2lzdHJ5fSBmcm9tIFwiLi4vc3RkbGliLXByb3ZpZGVycy5qc1wiXG5pbXBvcnQge3ByZWZsaWdodEVmZmVjdENhcGFiaWxpdGllc30gZnJvbSBcIi4vZWZmZWN0cy5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlVGFyZ2V0QmluZGluZ0lkZW50aWZpZXIsIHZhbGlkYXRlVGFyZ2V0SWRlbnRpZmllciwgdmFsaWRhdGVUYXJnZXRUeXBlSWRlbnRpZmllcn0gZnJvbSBcIi4vaWRlbnRpZmllcnMuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVN0ZGxpYlByb3ZpZGVyQ29udGVudH0gZnJvbSBcIi4vc3RkbGliLXN1cHBvcnQuanNcIlxuaW1wb3J0IHt2YWxpZGF0ZUJhY2tlbmRNb2R1bGV9IGZyb20gXCIuL3NoYXJlZC5qc1wiXG5pbXBvcnQge3Byb2dyYW1JbXBvcnROYW1lLCBTb3VyY2VXcml0ZXJ9IGZyb20gXCIuL3dyaXRlci5qc1wiXG5cbi8qKiBAdHlwZSB7UmVhZG9ubHk8U2V0PGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2U+Pn0gKi9cbmNvbnN0IHByb2dyYW1UYXJnZXRzID0gbmV3IFNldChbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdKVxuLyoqIEB0eXBlIHtSZWFkb25seTxTZXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmFja2VuZExhbmd1YWdlPj59ICovXG5jb25zdCBwcm9ncmFtQXBwbGljYXRpb25UYXJnZXRzID0gbmV3IFNldChbXCJpb3NcIl0pXG5cbi8qKlxuICogVmFsaWRhdGVzIGFuZCBwcmVwYXJlcyBhIGNvbXBsZXRlIHNlbWFudGljIHByb2dyYW0gZm9yIGEgbm9uLXRleHQgYmFja2VuZCB3aXRob3V0IGFsbG9jYXRpbmcgYSB3cml0ZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBCYWNrZW5kIHByZWZsaWdodCByZXF1ZXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBpbnB1dC5iYWNrZW5kTGFuZ3VhZ2UgLSBFeGlzdGluZyBzZW1hbnRpYyBiYWNrZW5kIHByb2ZpbGUgdG8gZW5mb3JjZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmFja2VuZExhbmd1YWdlfSBpbnB1dC5kaWFnbm9zdGljTGFuZ3VhZ2UgLSBQdWJsaWMgdGFyZ2V0IGlkZW50aXR5IGZvciBjYXBhYmlsaXR5IGZhaWx1cmVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IGlucHV0LnByb2dyYW0gLSBDb21wbGV0ZSBjYW5kaWRhdGUgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8U2V0PGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2U+Pn0gW2lucHV0LnNvdXJjZUxhbmd1YWdlc10gLSBBY2NlcHRlZCBzb3VyY2UgcHJvdmVuYW5jZSBsYW5ndWFnZXMuXG4gKiBAcmV0dXJucyB7e21vZHVsZXM6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlW10sIHByb2dyYW06IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbSwgc291cmNlczoge2NvbnRlbnQ6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfX0gUHJlcGFyZWQgaW1tdXRhYmxlLWlucHV0IHZpZXdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlZmxpZ2h0U2VtYW50aWNQcm9ncmFtKHtiYWNrZW5kTGFuZ3VhZ2UsIGRpYWdub3N0aWNMYW5ndWFnZSwgcHJvZ3JhbTogY2FuZGlkYXRlLCBzb3VyY2VMYW5ndWFnZXN9KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IHZhbGlkYXRlUHJvZ3JhbShjYW5kaWRhdGUsIGJhY2tlbmRMYW5ndWFnZSwgc291cmNlTGFuZ3VhZ2VzKVxuICAgIGNvbnN0IG1vZHVsZXMgPSBwcmVwYXJlRW1pc3Npb25Nb2R1bGVzKHByb2dyYW0sIGJhY2tlbmRMYW5ndWFnZSlcblxuICAgIHZhbGlkYXRlUHJvZ3JhbVNvdXJjZU93bmVyc2hpcChwcm9ncmFtLCBiYWNrZW5kTGFuZ3VhZ2UpXG4gICAgY29uc3Qgc291cmNlcyA9IHByb2dyYW0uc291cmNlcy5tYXAoKHNvdXJjZSkgPT4ge1xuICAgICAgaWYgKHNvdXJjZS5jb250ZW50ID09PSBudWxsKSBpbnZhbGlkUHJvZ3JhbUdlbmVyYXRpb24oYFByb2dyYW0gc291cmNlICcke3NvdXJjZS5maWxlbmFtZX0nIGhhcyBubyByZXRhaW5lZCBjb250ZW50LmApXG5cbiAgICAgIHJldHVybiB7Y29udGVudDogc291cmNlLmNvbnRlbnQsIGZpbGVuYW1lOiBzb3VyY2UuZmlsZW5hbWUsIC4uLihzb3VyY2UubGFuZ3VhZ2UgPyB7bGFuZ3VhZ2U6IHNvdXJjZS5sYW5ndWFnZX0gOiB7fSl9XG4gICAgfSlcblxuICAgIHJldHVybiB7bW9kdWxlcywgcHJvZ3JhbSwgc291cmNlc31cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZW1hbnRpZm9sZERpYWdub3N0aWMgJiYgZXJyb3IuY29kZSA9PSBcIlVOU1VQUE9SVEVEX0NBUEFCSUxJVFlcIiAmJlxuICAgICAgZXJyb3IubGFuZ3VhZ2UgIT0gZGlhZ25vc3RpY0xhbmd1YWdlKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICBjb2RlOiBlcnJvci5jb2RlLFxuICAgICAgICBsYW5ndWFnZTogZGlhZ25vc3RpY0xhbmd1YWdlLFxuICAgICAgICBsb2NhdGlvbjogZXJyb3IubG9jYXRpb24sXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLmRldGFpbFxuICAgICAgfSlcbiAgICB9XG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGNvbXBsZXRlIGRldGVybWluaXN0aWMgbWFwcGVkIGFydGlmYWN0IHNldCBmb3Igb25lIHNlbWFudGljIHByb2dyYW0uXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBQcm9ncmFtIGdlbmVyYXRpb24gcmVxdWVzdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmFja2VuZExhbmd1YWdlfSBpbnB1dC5sYW5ndWFnZSAtIFJlZ2lzdGVyZWQgcHJvZ3JhbSB0YXJnZXQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gaW5wdXQucHJvZ3JhbSAtIENvbXBsZXRlIHNlbWFudGljIHByb2dyYW0uXG4gKiBAcGFyYW0ge1widGV4dFwiIHwgXCJhcHBsaWNhdGlvblwifSBbaW5wdXQucm9sZV0gLSBFeHBsaWNpdCBhcnRpZmFjdCByb2xlOyBvbWl0dGVkIHByZXNlcnZlcyB0ZXh0IGdlbmVyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLklvc0FwcGxpY2F0aW9uQ29uZmlndXJhdGlvbklucHV0fSBbaW5wdXQuY29uZmlndXJhdGlvbl0gLSBpT1MgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW9zQXBwbGljYXRpb25Bc3NldElucHV0W119IFtpbnB1dC5hc3NldHNdIC0gRXhhY3QgaU9TIGNhbGxlciBhc3NldHMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkQXJ0aWZhY3RTZXR9IFRyYW5zYWN0aW9uYWxseSB2YWxpZGF0ZWQgYXJ0aWZhY3Qgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVQcm9ncmFtQXJ0aWZhY3RzKGlucHV0KSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dCkgfHwgdHlwZW9mIGlucHV0Lmxhbmd1YWdlICE9IFwic3RyaW5nXCIpIGludmFsaWRQcm9ncmFtR2VuZXJhdGlvbihcIlByb2dyYW0gZ2VuZXJhdGlvbiByZXF1aXJlcyBhIHRhcmdldCBsYW5ndWFnZSBhbmQgcHJvZ3JhbS5cIilcbiAgY29uc3Qgcm9sZSA9IGlucHV0LnJvbGUgPz8gXCJ0ZXh0XCJcblxuICBpZiAocm9sZSAhPSBcInRleHRcIiAmJiByb2xlICE9IFwiYXBwbGljYXRpb25cIikgaW52YWxpZFByb2dyYW1HZW5lcmF0aW9uKFwiUHJvZ3JhbSBhcnRpZmFjdCByb2xlIG11c3QgYmUgJ3RleHQnIG9yICdhcHBsaWNhdGlvbicuXCIpXG4gIGxhbmd1YWdlUmVnaXN0cnkucmVjb3JkKGlucHV0Lmxhbmd1YWdlKVxuICBpZiAocm9sZSA9PSBcImFwcGxpY2F0aW9uXCIpIHtcbiAgICBpZiAoIXByb2dyYW1BcHBsaWNhdGlvblRhcmdldHMuaGFzKGlucHV0Lmxhbmd1YWdlKSkgdW5zdXBwb3J0ZWRSb2xlKGlucHV0Lmxhbmd1YWdlLCBcIm11bHRpLWZpbGUgYXBwbGljYXRpb24gYmFja2VuZFwiKVxuICAgIGNvbnN0IGJhY2tlbmQgPSBsYW5ndWFnZVJlZ2lzdHJ5LnJlc29sdmUoaW5wdXQubGFuZ3VhZ2UsIFwiYXBwbGljYXRpb25CYWNrZW5kXCIpXG5cbiAgICByZXR1cm4gY3JlYXRlR2VuZXJhdGVkQXJ0aWZhY3RTZXQoYmFja2VuZChpbnB1dCkpXG4gIH1cbiAgaWYgKCFwcm9ncmFtVGFyZ2V0cy5oYXMoLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSAqLyAoaW5wdXQubGFuZ3VhZ2UpKSkge1xuICAgIHVuc3VwcG9ydGVkUm9sZShpbnB1dC5sYW5ndWFnZSwgXCJtdWx0aS1maWxlIHRleHQgYmFja2VuZFwiKVxuICB9XG4gIGNvbnN0IGxhbmd1YWdlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSAqLyAoaW5wdXQubGFuZ3VhZ2UpXG4gIGNvbnN0IHByb2dyYW0gPSB2YWxpZGF0ZVByb2dyYW0oaW5wdXQucHJvZ3JhbSwgbGFuZ3VhZ2UpXG4gIGNvbnN0IGxpbmtpbmcgPSBwbGFuU3RkbGliTGlua2luZyhwcm9ncmFtLCBsYW5ndWFnZSlcbiAgY29uc3QgZW1pc3Npb25Nb2R1bGVzID0gcHJlcGFyZUVtaXNzaW9uTW9kdWxlcyhwcm9ncmFtLCBsYW5ndWFnZSwgbGlua2luZylcbiAgdmFsaWRhdGVQcm9ncmFtU291cmNlT3duZXJzaGlwKHByb2dyYW0sIGxhbmd1YWdlKVxuICBjb25zdCBwYXRocyA9IHBsYW5Nb2R1bGVQYXRocyhwcm9ncmFtLCBsYW5ndWFnZSwgbGlua2luZylcbiAgY29uc3Qgc291cmNlcyA9IHByb2dyYW0uc291cmNlcy5tYXAoKHNvdXJjZSkgPT4ge1xuICAgIGlmIChzb3VyY2UuY29udGVudCA9PT0gbnVsbCkgaW52YWxpZFByb2dyYW1HZW5lcmF0aW9uKGBQcm9ncmFtIHNvdXJjZSAnJHtzb3VyY2UuZmlsZW5hbWV9JyBoYXMgbm8gcmV0YWluZWQgY29udGVudC5gKVxuXG4gICAgcmV0dXJuIHtjb250ZW50OiBzb3VyY2UuY29udGVudCwgZmlsZW5hbWU6IHNvdXJjZS5maWxlbmFtZSwgLi4uKHNvdXJjZS5sYW5ndWFnZSA/IHtsYW5ndWFnZTogc291cmNlLmxhbmd1YWdlfSA6IHt9KX1cbiAgfSlcbiAgY29uc3QgYmFja2VuZCA9IC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vamF2YXNjcmlwdC5qc1wiKS5nZW5lcmF0ZUphdmFTY3JpcHR9ICovIChcbiAgICBsYW5ndWFnZVJlZ2lzdHJ5LnJlc29sdmUobGFuZ3VhZ2UsIFwidGV4dEJhY2tlbmRcIikpXG4gIGNvbnN0IG1lZGlhVHlwZSA9IGxhbmd1YWdlUmVnaXN0cnkucmVjb3JkKGxhbmd1YWdlKS5tZWRpYVR5cGVcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRTZXRBcnRpZmFjdFtdfSAqL1xuICBjb25zdCBhcnRpZmFjdHMgPSBsYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCBsYW5ndWFnZSA9PSBcInR5cGVzY3JpcHRcIiA/IFt7XG4gICAgY29udGVudDogXCJ7XFxuICBcXFwidHlwZVxcXCI6IFxcXCJtb2R1bGVcXFwiXFxufVxcblwiLFxuICAgIGNvbnRlbnRLaW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJ0ZXh0XCIpLFxuICAgIG1lZGlhVHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgb3duZXJzaGlwOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJnZW5lcmF0ZWRcIiksXG4gICAgcGF0aDogXCJwYWNrYWdlLmpzb25cIixcbiAgICBwcm92ZW5hbmNlOiB7XG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJzeW50aGV0aWNcIiksXG4gICAgICByZWFzb246IFwiRGVjbGFyZXMgdGhlIGdlbmVyYXRlZCBKYXZhU2NyaXB0LWZhbWlseSBhcnRpZmFjdCBzZXQgYXMgY2Fub25pY2FsIEVTTS5cIixcbiAgICAgIHJlbGF0ZWRPcmlnaW5zOiBbXVxuICAgIH0sXG4gICAgcm9sZTogXCJtYW5pZmVzdFwiXG4gIH1dIDogW11cblxuICBpZiAobGlua2luZyAmJiBsYW5ndWFnZSAhPSBcImphdmFcIikge1xuICAgIGZvciAoY29uc3QgcHJvdmlkZXIgb2YgbGlua2luZy5uZWdvdGlhdGlvbi5wcm92aWRlcnMpIHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc3RkbGliLXByb3ZpZGVycy5qc1wiKS5TdGRsaWJQcm92aWRlclJlY29yZH0gKi8gKGxpbmtpbmcucmVjb3Jkcy5nZXQocHJvdmlkZXIubW9kdWxlKSlcblxuICAgICAgYXJ0aWZhY3RzLnB1c2goe1xuICAgICAgICBjb250ZW50OiBnZW5lcmF0ZVN0ZGxpYlByb3ZpZGVyQ29udGVudCgvKiogQHR5cGUge1wicGhwXCIgfCBcInJ1YnlcIiB8IFwiamF2YXNjcmlwdFwiIHwgXCJ0eXBlc2NyaXB0XCJ9ICovIChsYW5ndWFnZSksXG4gICAgICAgICAgWy4uLnByb3ZpZGVyLm9wZXJhdGlvbnNdLCBwcm92aWRlci5tb2R1bGUpLFxuICAgICAgICBjb250ZW50S2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwidGV4dFwiKSxcbiAgICAgICAgbWVkaWFUeXBlOiByZWNvcmQuYXJ0aWZhY3QubWVkaWFUeXBlLFxuICAgICAgICBvd25lcnNoaXA6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImdlbmVyYXRlZFwiKSxcbiAgICAgICAgcGF0aDogcmVjb3JkLmFydGlmYWN0LnBhdGgsXG4gICAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJzeW50aGV0aWNcIiksXG4gICAgICAgICAgcmVhc29uOiBgc2VtYW50aWZvbGQtc3RkbGliLXByb3ZpZGVyOiR7cmVjb3JkLmlkZW50aXR5fWAsXG4gICAgICAgICAgcmVsYXRlZE9yaWdpbnM6IFtdXG4gICAgICAgIH0sXG4gICAgICAgIHJvbGU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN1cHBvcnRcIilcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbWlzc2lvbk1vZHVsZSBvZiBlbWlzc2lvbk1vZHVsZXMpIHtcbiAgICBjb25zdCBtb2R1bGVJZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoUmVmbGVjdC5nZXQoZW1pc3Npb25Nb2R1bGUsIFwiaWRcIikpXG4gICAgY29uc3QgZmlsZW5hbWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhdGhzLmdldChtb2R1bGVJZCkpXG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcih7XG4gICAgICBmaWxlbmFtZSxcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgbW9kdWxlOiBlbWlzc2lvbk1vZHVsZSxcbiAgICAgIHByb2dyYW0sXG4gICAgICBwcm9ncmFtUGF0aHM6IHBhdGhzLFxuICAgICAgc291cmNlcyxcbiAgICAgIC4uLihsaW5raW5nICYmIGVtaXNzaW9uTW9kdWxlLmNhcGFiaWxpdGllcyAhPT0gdW5kZWZpbmVkID8ge1xuICAgICAgICBzdGRsaWJQcm92aWRlckVudHJpZXM6IE9iamVjdC5mcm9tRW50cmllcygobGlua2luZy51c2VkT3BlcmF0aW9uc0J5TW9kdWxlLmdldChtb2R1bGVJZCkgPz8gW10pLm1hcCgoe21vZHVsZSwgb3BlcmF0aW9ufSkgPT4gW1xuICAgICAgICAgIHF1YWxpZmllZE9wZXJhdGlvbktleShtb2R1bGUsIG9wZXJhdGlvbiksXG4gICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovIChsaW5raW5nLnJlY29yZHMuZ2V0KG1vZHVsZSk/Lm5hdGl2ZUVudHJpZXNbb3BlcmF0aW9uXSlcbiAgICAgICAgXSkpLFxuICAgICAgICBzdGRsaWJQcm92aWRlckltcG9ydHM6IGxhbmd1YWdlID09IFwiamF2YVwiIHx8IGxhbmd1YWdlID09IFwiamF2YXNjcmlwdFwiIHx8IGxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiID9cbiAgICAgICAgICBsaW5raW5nLnByb3ZpZGVySW1wb3J0c0J5TW9kdWxlLmdldChtb2R1bGVJZCkgOiB1bmRlZmluZWQsXG4gICAgICAgIHN0ZGxpYlByb3ZpZGVyUGF0aHM6IGxpbmtpbmcucHJvdmlkZXJQYXRoc0J5TW9kdWxlLmdldChtb2R1bGVJZCksXG4gICAgICAgIC4uLihsYW5ndWFnZSA9PSBcImphdmFcIiA/IHtcbiAgICAgICAgICBzdGRsaWJQcm92aWRlck93bmVyTW9kdWxlOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGxpbmtpbmcub3duZXJNb2R1bGVJZCksXG4gICAgICAgICAgc3RkbGliUHJvdmlkZXJTaGltczogbW9kdWxlSWQgPT0gbGlua2luZy5vd25lck1vZHVsZUlkID8gbGlua2luZy51c2VkT3BlcmF0aW9ucy5tYXAoKHtvcGVyYXRpb259KSA9PiBvcGVyYXRpb24pIDogdW5kZWZpbmVkXG4gICAgICAgIH0gOiB7fSlcbiAgICAgIH0gOiB7fSlcbiAgICB9KVxuXG4gICAgYmFja2VuZChlbWlzc2lvbk1vZHVsZSwgd3JpdGVyKVxuICAgIGNvbnN0IG1hcHBpbmcgPSBmaW5hbGl6ZU1hcHBpbmcod3JpdGVyLmZpbmlzaCgpKVxuXG4gICAgYXJ0aWZhY3RzLnB1c2goe1xuICAgICAgY29udGVudDogbWFwcGluZy5nZW5lcmF0ZWQuY29udGVudCxcbiAgICAgIGNvbnRlbnRLaW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJ0ZXh0XCIpLFxuICAgICAgbWVkaWFUeXBlOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKG1lZGlhVHlwZSksXG4gICAgICBvd25lcnNoaXA6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImdlbmVyYXRlZFwiKSxcbiAgICAgIHBhdGg6IGZpbGVuYW1lLFxuICAgICAgcHJvdmVuYW5jZToge1xuICAgICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJ0ZXh0XCIpLFxuICAgICAgICBtYXBwaW5nLFxuICAgICAgICBzb3VyY2VNYXA6IHRvU291cmNlTWFwVjMobWFwcGluZyksXG4gICAgICAgIHNvdXJjZU1hcEZpbGVuYW1lOiBgJHtmaWxlbmFtZX0ubWFwYFxuICAgICAgfSxcbiAgICAgIHJvbGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuR2VuZXJhdGVkQXJ0aWZhY3RSb2xlfSAqLyAoXG4gICAgICAgIG1vZHVsZUlkID09IHByb2dyYW0uZW50cnlNb2R1bGUgPyBcImVudHJ5XCIgOiBSZWZsZWN0LmdldChlbWlzc2lvbk1vZHVsZSwgXCJzdGRsaWJGYWNhZGVcIikgPyBcInN1cHBvcnRcIiA6IFwic291cmNlXCIpXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVHZW5lcmF0ZWRBcnRpZmFjdFNldCh7XG4gICAgYXJ0aWZhY3RzLFxuICAgIC4uLihsaW5raW5nIHx8IHByb2dyYW0uc3RkbGliRmFjYWRlcyA/IHttZXRhZGF0YTogc3RkbGliTGlua01ldGFkYXRhKGxpbmtpbmcsIHBhdGhzLCBwcm9ncmFtLnN0ZGxpYkZhY2FkZXMpfSA6IHt9KSxcbiAgICB0YXJnZXQ6IGxhbmd1YWdlXG4gIH0pXG59XG5cbi8qKlxuICogQHR5cGVkZWYgU3RkbGliUHJvZ3JhbUxpbmtpbmdcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vc3RkbGliLW5lZ290aWF0aW9uLmpzXCIpLlN0ZGxpYk5lZ290aWF0aW9uUmVzdWx0fSBuZWdvdGlhdGlvbiAtIE5lZ290aWF0ZWQgcHJvdmlkZXIgY2xvc3VyZS5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc3RkbGliLXByb3ZpZGVycy5qc1wiKS5TdGRsaWJQcm92aWRlclJlY29yZD59IHJlY29yZHMgLSBNYXRlcmlhbGl6ZWQgcHJvdmlkZXIgcmVjb3JkcyBieSBjYW5vbmljYWwgbW9kdWxlLlxuICogQHByb3BlcnR5IHtRdWFsaWZpZWRTdGRsaWJPcGVyYXRpb25bXX0gdXNlZE9wZXJhdGlvbnMgLSBQcm9ncmFtLXdpZGUgdXNlZCBjYW5vbmljYWwgb3BlcmF0aW9ucyBpbiBzdGFibGUgb3JkZXIuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIFF1YWxpZmllZFN0ZGxpYk9wZXJhdGlvbltdPn0gdXNlZE9wZXJhdGlvbnNCeU1vZHVsZSAtIFVzZWQgY2Fub25pY2FsIG9wZXJhdGlvbnMgYnkgcHJvZ3JhbSBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIHN0cmluZ1tdPn0gcHJvdmlkZXJJbXBvcnRzQnlNb2R1bGUgLSBPcmRlcmVkIHByb3ZpZGVyIGltcG9ydCBuYW1lcyBieSBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIHN0cmluZ1tdPn0gcHJvdmlkZXJQYXRoc0J5TW9kdWxlIC0gUHJvdmlkZXIgYXJ0aWZhY3QgY2xvc3VyZSBieSBwcm9ncmFtIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gb3duZXJNb2R1bGVJZCAtIEphdmEgdGFyZ2V0OiBmaXJzdCBvcGVyYXRpb24tdXNpbmcgbW9kdWxlIGlkZW50aXR5IGhvc3RpbmcgdGhlIHNoYXJlZCBzdXBwb3J0OyBudWxsIGZvciBhcnRpZmFjdC1tYXRlcmlhbGl6aW5nIHRhcmdldHMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBRdWFsaWZpZWRTdGRsaWJPcGVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2R1bGUgLSBDYW5vbmljYWwgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbiAtIENhbm9uaWNhbCBvcGVyYXRpb24gbmFtZS5cbiAqL1xuXG4vKipcbiAqIFBsYW5zIHRoZSBsaW5rZWQgc3RkbGliIHByb3ZpZGVyIGZvciBvbmUgcHJvZ3JhbSwgb3IgcmVwb3J0cyB0aGF0IG5vIG9wZXJhdGlvbiBpcyB1c2VkLlxuICogSmF2YSByZXNvbHZlcyB0aGUgc2FtZSBuZWdvdGlhdGVkIHByb3ZpZGVyIHJlY29yZCBidXQgaG9zdHMgaXRzIHN1cHBvcnQgaW4gdGhlIGZpcnN0XG4gKiBvcGVyYXRpb24tdXNpbmcgbW9kdWxlIGluc3RlYWQgb2YgYSBzZXBhcmF0ZSBwcm92aWRlciBhcnRpZmFjdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBwcm9ncmFtIC0gVmFsaWRhdGVkIHNlbWFudGljIHByb2dyYW0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHJldHVybnMge1N0ZGxpYlByb2dyYW1MaW5raW5nIHwgbnVsbH0gTGlua2luZyBwbGFuLCBvciBudWxsIHdoZW4gbm90aGluZyBpcyB1c2VkLlxuICovXG5mdW5jdGlvbiBwbGFuU3RkbGliTGlua2luZyhwcm9ncmFtLCBsYW5ndWFnZSkge1xuICBjb25zdCB7cHJvZ3JhbVdpZGUsIHVzZWRPcGVyYXRpb25zQnlNb2R1bGV9ID0gY29sbGVjdFVzZWRFZmZlY3RPcGVyYXRpb25zKHByb2dyYW0pXG5cbiAgaWYgKHByb2dyYW1XaWRlLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbFxuICBjb25zdCBjb250cmFjdHMgPSBwcm9ncmFtLnN0ZGxpYkNvbnRyYWN0cyA/PyBbLyoqIEB0eXBlIHt7aWRlbnRpdHk6IHN0cmluZywgY29udHJhY3RWZXJzaW9uPzogc3RyaW5nfX0gKi8gKHByb2dyYW0uc3RkbGliQ29udHJhY3QpXVxuICBjb25zdCBjb250cmFjdHNCeUlkZW50aXR5ID0gbmV3IE1hcChjb250cmFjdHMubWFwKChjb250cmFjdCkgPT4gW2NvbnRyYWN0LmlkZW50aXR5LCBjb250cmFjdF0pKVxuICBjb25zdCByZXF1aXJlbWVudHNCeU1vZHVsZSA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgcXVhbGlmaWVkIG9mIHByb2dyYW1XaWRlKSB7XG4gICAgY29uc3QgcmVxdWlyZW1lbnQgPSByZXF1aXJlbWVudHNCeU1vZHVsZS5nZXQocXVhbGlmaWVkLm1vZHVsZSkgPz8gW11cblxuICAgIHJlcXVpcmVtZW50LnB1c2gocXVhbGlmaWVkLm9wZXJhdGlvbilcbiAgICByZXF1aXJlbWVudHNCeU1vZHVsZS5zZXQocXVhbGlmaWVkLm1vZHVsZSwgcmVxdWlyZW1lbnQpXG4gIH1cbiAgY29uc3QgbmVnb3RpYXRpb24gPSBuZWdvdGlhdGVTdGRsaWJQcm92aWRlcnMoe1xuICAgIHJlcXVpcmVtZW50czogWy4uLnJlcXVpcmVtZW50c0J5TW9kdWxlXS5tYXAoKFttb2R1bGUsIG9wZXJhdGlvbnNdKSA9PiB7XG4gICAgICBjb25zdCBjb250cmFjdCA9IGNvbnRyYWN0c0J5SWRlbnRpdHkuZ2V0KG1vZHVsZSlcblxuICAgICAgaWYgKCFjb250cmFjdCkgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgbWVzc2FnZTogYFJlYWNoYWJsZSBjYW5vbmljYWwgb3BlcmF0aW9uICcke21vZHVsZX0uJHtvcGVyYXRpb25zWzBdfScgaGFzIG5vIGRlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QuYFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7bW9kdWxlLCBvcGVyYXRpb25zLCAuLi4oY29udHJhY3QuY29udHJhY3RWZXJzaW9uICE9PSB1bmRlZmluZWQgPyB7cmFuZ2U6IGNvbnRyYWN0LmNvbnRyYWN0VmVyc2lvbn0gOiB7fSl9XG4gICAgfSksXG4gICAgdGFyZ2V0OiBsYW5ndWFnZVxuICB9KVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3N0ZGxpYi1wcm92aWRlcnMuanNcIikuU3RkbGliUHJvdmlkZXJSZWNvcmQ+fSAqL1xuICBjb25zdCByZWNvcmRzID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBzZWxlY3RlZCBvZiBuZWdvdGlhdGlvbi5tb2R1bGVzKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IHN0ZGxpYlByb3ZpZGVyUmVnaXN0cnkucHJvdmlkZXJzRm9yKGxhbmd1YWdlLCBzZWxlY3RlZC5pZGVudGl0eSwgc2VsZWN0ZWQudmVyc2lvbilcblxuICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCAhPSAxKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgY29kZTogXCJTVERMSUJfTElOS19GQUlMVVJFXCIsXG4gICAgICAgIGxhbmd1YWdlLFxuICAgICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgZXhhY3RseSBvbmUgcmVnaXN0ZXJlZCBzdGRsaWIgcHJvdmlkZXIgZm9yICcke3NlbGVjdGVkLmlkZW50aXR5fScgb24gJyR7bGFuZ3VhZ2V9Jy5gXG4gICAgICB9KVxuICAgIH1cbiAgICByZWNvcmRzLnNldChzZWxlY3RlZC5pZGVudGl0eSwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zdGRsaWItcHJvdmlkZXJzLmpzXCIpLlN0ZGxpYlByb3ZpZGVyUmVjb3JkfSAqLyAoY2FuZGlkYXRlc1swXSkpXG4gIH1cbiAgY29uc3Qgb3duZXJNb2R1bGVJZCA9IGxhbmd1YWdlID09IFwiamF2YVwiXG4gICAgPyBwcm9ncmFtLm1vZHVsZXMubWFwKChtb2R1bGUpID0+IG1vZHVsZS5pZCkuZmluZCgoaWQpID0+ICh1c2VkT3BlcmF0aW9uc0J5TW9kdWxlLmdldChpZCkgPz8gW10pLmxlbmd0aCA+IDApXG4gICAgOiBudWxsXG5cbiAgaWYgKG93bmVyTW9kdWxlSWQgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgY29kZTogXCJTVERMSUJfTElOS19GQUlMVVJFXCIsXG4gICAgbGFuZ3VhZ2UsXG4gICAgbWVzc2FnZTogXCJKYXZhIHByb2dyYW0gbGlua2luZyByZXF1aXJlcyBvbmUgbW9kdWxlIHVzaW5nIGNhbm9uaWNhbCBvcGVyYXRpb25zLlwiXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBuZWdvdGlhdGlvbixcbiAgICBvd25lck1vZHVsZUlkLFxuICAgIHByb3ZpZGVySW1wb3J0c0J5TW9kdWxlOiBjb2xsZWN0UHJvdmlkZXJJbXBvcnRzKHByb2dyYW0sIG5lZ290aWF0aW9uLCByZWNvcmRzLCB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlLCBsYW5ndWFnZSwgb3duZXJNb2R1bGVJZCksXG4gICAgcHJvdmlkZXJQYXRoc0J5TW9kdWxlOiBjb2xsZWN0UHJvdmlkZXJQYXRocyhuZWdvdGlhdGlvbiwgcmVjb3JkcywgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZSksXG4gICAgcmVjb3JkcyxcbiAgICB1c2VkT3BlcmF0aW9uczogWy4uLnByb2dyYW1XaWRlXSxcbiAgICB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlXG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBleGFjdCBwcm92aWRlci90eXBlIGRlcGVuZGVuY3kgY2xvc3VyZSByZXF1aXJlZCBieSBlYWNoIGVtaXR0aW5nIHByb2dyYW0gbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zdGRsaWItbmVnb3RpYXRpb24uanNcIikuU3RkbGliTmVnb3RpYXRpb25SZXN1bHR9IG5lZ290aWF0aW9uIC0gTmVnb3RpYXRlZCBwcm9ncmFtIGNsb3N1cmUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3N0ZGxpYi1wcm92aWRlcnMuanNcIikuU3RkbGliUHJvdmlkZXJSZWNvcmQ+fSByZWNvcmRzIC0gU2VsZWN0ZWQgcHJvdmlkZXIgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgUXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uW10+fSB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlIC0gUmVhY2hhYmxlIG9wZXJhdGlvbnMgYnkgcHJvZ3JhbSBtb2R1bGUuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgc3RyaW5nW10+fSBPcmRlcmVkIHByb3ZpZGVyIHBhdGhzIGJ5IHByb2dyYW0gbW9kdWxlLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0UHJvdmlkZXJQYXRocyhuZWdvdGlhdGlvbiwgcmVjb3JkcywgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZSkge1xuICBjb25zdCBwYXRocyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgW21vZHVsZUlkLCBvcGVyYXRpb25zXSBvZiB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgU2V0KG9wZXJhdGlvbnMubWFwKCh7bW9kdWxlfSkgPT4gbW9kdWxlKSlcbiAgICBsZXQgY2hhbmdlZCA9IHRydWVcblxuICAgIHdoaWxlIChjaGFuZ2VkKSB7XG4gICAgICBjaGFuZ2VkID0gZmFsc2VcbiAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIFsuLi5zZWxlY3RlZF0pIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHJlY29yZHMuZ2V0KG1vZHVsZSk/LmRlcGVuZGVuY2llcyA/PyBbXSkge1xuICAgICAgICAgIGlmICghc2VsZWN0ZWQuaGFzKGRlcGVuZGVuY3kubW9kdWxlKSkge1xuICAgICAgICAgICAgc2VsZWN0ZWQuYWRkKGRlcGVuZGVuY3kubW9kdWxlKVxuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcGF0aHMuc2V0KG1vZHVsZUlkLCBuZWdvdGlhdGlvbi5wcm92aWRlcnMuZmlsdGVyKCh7bW9kdWxlfSkgPT4gc2VsZWN0ZWQuaGFzKG1vZHVsZSkpLm1hcCgoe21vZHVsZX0pID0+XG4gICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3N0ZGxpYi1wcm92aWRlcnMuanNcIikuU3RkbGliUHJvdmlkZXJSZWNvcmR9ICovIChyZWNvcmRzLmdldChtb2R1bGUpKS5hcnRpZmFjdC5wYXRoKSlcbiAgfVxuICByZXR1cm4gcGF0aHNcbn1cblxuLyoqXG4gKiBDb2xsZWN0cyB0aGUgY2Fub25pY2FsIG9wZXJhdGlvbnMgaW52b2tlZCBieSBlYWNoIHByb2dyYW0gbW9kdWxlIGluIHN0YWJsZSBvcmRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBwcm9ncmFtIC0gVmFsaWRhdGVkIHNlbWFudGljIHByb2dyYW0uXG4gKiBAcmV0dXJucyB7e3Byb2dyYW1XaWRlOiBRdWFsaWZpZWRTdGRsaWJPcGVyYXRpb25bXSwgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZTogTWFwPHN0cmluZywgUXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uW10+fX0gVXNlZCBvcGVyYXRpb25zLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0VXNlZEVmZmVjdE9wZXJhdGlvbnMocHJvZ3JhbSkge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFF1YWxpZmllZFN0ZGxpYk9wZXJhdGlvbltdPn0gKi9cbiAgY29uc3QgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZSA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFF1YWxpZmllZFN0ZGxpYk9wZXJhdGlvbj59ICovXG4gIGNvbnN0IHByb2dyYW1XaWRlID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge2JvZHk6IHVua25vd24sIG1vZHVsZTogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfT59ICovXG4gIGNvbnN0IGJvZGllcyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgbW9kdWxlIG9mIHByb2dyYW0ubW9kdWxlcykge1xuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmZ1bmN0aW9ucykgYm9kaWVzLnNldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwge2JvZHk6IGRlY2xhcmF0aW9uLmJvZHksIG1vZHVsZX0pXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuY2xhc3NlcyA/PyBbXSkge1xuICAgICAgYm9kaWVzLnNldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmlkKSwge2JvZHk6IGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmJvZHksIG1vZHVsZX0pXG4gICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzKSBib2RpZXMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobWV0aG9kLmlkKSwge2JvZHk6IG1ldGhvZC5ib2R5LCBtb2R1bGV9KVxuICAgIH1cbiAgICB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlLnNldChtb2R1bGUuaWQsIFtdKVxuICB9XG4gIGNvbnN0IGVudHJ5TW9kdWxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9ICovIChcbiAgICBwcm9ncmFtLm1vZHVsZXMuZmluZCgoe2lkfSkgPT4gaWQgPT0gcHJvZ3JhbS5lbnRyeU1vZHVsZSkpXG4gIC8qKiBAdHlwZSB7e2JvZHk6IHVua25vd24sIG1vZHVsZTogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfVtdfSAqL1xuICBjb25zdCBwZW5kaW5nID0gW3tib2R5OiBlbnRyeU1vZHVsZS5lbnRyeVBvaW50Py5ib2R5LCBtb2R1bGU6IGVudHJ5TW9kdWxlfV1cbiAgY29uc3QgcmVhY2hlZERlY2xhcmF0aW9ucyA9IG5ldyBTZXQoKVxuXG4gIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjdXJyZW50ID0gLyoqIEB0eXBlIHt7Ym9keTogdW5rbm93biwgbW9kdWxlOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9fSAqLyAocGVuZGluZy5zaGlmdCgpKVxuICAgIGNvbnN0IG9wZXJhdGlvbk5hbWVzID0gbmV3IE1hcChjdXJyZW50Lm1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKGNhcGFiaWxpdHkpID0+XG4gICAgICBjYXBhYmlsaXR5Lm9wZXJhdGlvbnMubWFwKChvcGVyYXRpb24pID0+IFtvcGVyYXRpb24uaWQsIHttb2R1bGU6IGNhcGFiaWxpdHkuYXV0aG9yaXR5SWQsIG9wZXJhdGlvbjogb3BlcmF0aW9uLm5hbWV9XSkpID8/IFtdKVxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KClcblxuICAgIC8qKlxuICAgICAqIFZpc2l0cyBvbmUgcmVhY2hhYmxlIHNlbWFudGljIHN1YnRyZWUuXG4gICAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyBzdWJ0cmVlLlxuICAgICAqL1xuICAgIGNvbnN0IHZpc2l0ID0gKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuXG4gICAgICBzZWVuLmFkZCh2YWx1ZSlcblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBraW5kID0gUmVmbGVjdC5nZXQodmFsdWUsIFwia2luZFwiKVxuXG4gICAgICAgIGlmIChraW5kID09IFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IFJlZmxlY3QuZ2V0KHZhbHVlLCBcIm9wZXJhdGlvblwiKVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBvcGVyYXRpb24gPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgcXVhbGlmaWVkID0gb3BlcmF0aW9uTmFtZXMuZ2V0KG9wZXJhdGlvbilcblxuICAgICAgICAgICAgaWYgKHF1YWxpZmllZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGtleSA9IHF1YWxpZmllZE9wZXJhdGlvbktleShxdWFsaWZpZWQubW9kdWxlLCBxdWFsaWZpZWQub3BlcmF0aW9uKVxuICAgICAgICAgICAgICBjb25zdCBtb2R1bGVPcGVyYXRpb25zID0gLyoqIEB0eXBlIHtRdWFsaWZpZWRTdGRsaWJPcGVyYXRpb25bXX0gKi8gKHVzZWRPcGVyYXRpb25zQnlNb2R1bGUuZ2V0KGN1cnJlbnQubW9kdWxlLmlkKSlcblxuICAgICAgICAgICAgICBpZiAoIW1vZHVsZU9wZXJhdGlvbnMuc29tZSgoaXRlbSkgPT4gcXVhbGlmaWVkT3BlcmF0aW9uS2V5KGl0ZW0ubW9kdWxlLCBpdGVtLm9wZXJhdGlvbikgPT0ga2V5KSkgbW9kdWxlT3BlcmF0aW9ucy5wdXNoKHF1YWxpZmllZClcbiAgICAgICAgICAgICAgcHJvZ3JhbVdpZGUuc2V0KGtleSwgcXVhbGlmaWVkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWNsYXJhdGlvbklkID0gaXNQbGFpbk9iamVjdChSZWZsZWN0LmdldCh2YWx1ZSwgXCJyZXNvbHV0aW9uXCIpKVxuICAgICAgICAgID8gUmVmbGVjdC5nZXQoUmVmbGVjdC5nZXQodmFsdWUsIFwicmVzb2x1dGlvblwiKSwgXCJkZWNsYXJhdGlvbklkXCIpIDogdW5kZWZpbmVkXG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIgJiYgIXJlYWNoZWREZWNsYXJhdGlvbnMuaGFzKGRlY2xhcmF0aW9uSWQpKSB7XG4gICAgICAgICAgY29uc3QgZGVjbGFyYXRpb24gPSBib2RpZXMuZ2V0KGRlY2xhcmF0aW9uSWQpXG5cbiAgICAgICAgICBpZiAoZGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIHJlYWNoZWREZWNsYXJhdGlvbnMuYWRkKGRlY2xhcmF0aW9uSWQpXG4gICAgICAgICAgICBwZW5kaW5nLnB1c2goZGVjbGFyYXRpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICAgIGlmIChbXCJjYXBhYmlsaXRpZXNcIiwgXCJsb2NhdGlvblwiLCBcInByb3ZlbmFuY2VcIiwgXCJyZXNvbHV0aW9uXCIsIFwic291cmNlUHJvdmVuYW5jZVwiXS5pbmNsdWRlcyhrZXkpKSBjb250aW51ZVxuICAgICAgICAgIHZpc2l0KGNoaWxkKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgZm9yIChjb25zdCBjaGlsZCBvZiB2YWx1ZSkgdmlzaXQoY2hpbGQpXG4gICAgfVxuXG4gICAgdmlzaXQoY3VycmVudC5ib2R5KVxuICB9XG4gIGZvciAoY29uc3Qgb3BlcmF0aW9ucyBvZiB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlLnZhbHVlcygpKSB7XG4gICAgb3BlcmF0aW9ucy5zb3J0KChsZWZ0LCByaWdodCkgPT4gcXVhbGlmaWVkT3BlcmF0aW9uS2V5KGxlZnQubW9kdWxlLCBsZWZ0Lm9wZXJhdGlvbilcbiAgICAgIC5sb2NhbGVDb21wYXJlKHF1YWxpZmllZE9wZXJhdGlvbktleShyaWdodC5tb2R1bGUsIHJpZ2h0Lm9wZXJhdGlvbiksIFwiZW5cIikpXG4gIH1cbiAgcmV0dXJuIHtwcm9ncmFtV2lkZTogWy4uLnByb2dyYW1XaWRlLnZhbHVlcygpXS5zb3J0KChsZWZ0LCByaWdodCkgPT4gcXVhbGlmaWVkT3BlcmF0aW9uS2V5KGxlZnQubW9kdWxlLCBsZWZ0Lm9wZXJhdGlvbilcbiAgICAubG9jYWxlQ29tcGFyZShxdWFsaWZpZWRPcGVyYXRpb25LZXkocmlnaHQubW9kdWxlLCByaWdodC5vcGVyYXRpb24pLCBcImVuXCIpKSwgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZX1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gdW5hbWJpZ3VvdXMgaW50ZXJuYWwga2V5IGZvciBvbmUgY2Fub25pY2FsIG9wZXJhdGlvbiBhdXRob3JpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlIC0gQ2Fub25pY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRpb24gLSBDYW5vbmljYWwgb3BlcmF0aW9uIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBRdWFsaWZpZWQgaW50ZXJuYWwga2V5LlxuICovXG5mdW5jdGlvbiBxdWFsaWZpZWRPcGVyYXRpb25LZXkobW9kdWxlLCBvcGVyYXRpb24pIHtcbiAgcmV0dXJuIGAke21vZHVsZX1cXHUwMDAwJHtvcGVyYXRpb259YFxufVxuXG4vKipcbiAqIENvbGxlY3RzIHRoZSBvcmRlcmVkIHByb3ZpZGVyIGltcG9ydCBuYW1lcyBlYWNoIG1vZHVsZSBtdXN0IHB1bGwgZnJvbSB0aGUgbGlua2VkIHByb3ZpZGVyLlxuICogSmF2YSBtb2R1bGVzIGxpc3QgcmVmZXJlbmNlZCBjYXBhYmlsaXR5IHR5cGUgbmFtZXMgb25seTsgdGhlIG93bmVyIGxpc3RzIG5vbmUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gcHJvZ3JhbSAtIFZhbGlkYXRlZCBzZW1hbnRpYyBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zdGRsaWItbmVnb3RpYXRpb24uanNcIikuU3RkbGliTmVnb3RpYXRpb25SZXN1bHR9IG5lZ290aWF0aW9uIC0gTmVnb3RpYXRlZCBjbG9zdXJlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zdGRsaWItcHJvdmlkZXJzLmpzXCIpLlN0ZGxpYlByb3ZpZGVyUmVjb3JkPn0gcmVjb3JkcyAtIFByb3ZpZGVyIHJlY29yZHMgYnkgY2Fub25pY2FsIG1vZHVsZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgUXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uW10+fSB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlIC0gVXNlZCBjYW5vbmljYWwgb3BlcmF0aW9ucyBieSBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBbb3duZXJNb2R1bGVJZF0gLSBKYXZhIG93bmVyIG1vZHVsZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBzdHJpbmdbXT59IE9yZGVyZWQgcHJvdmlkZXIgaW1wb3J0IG5hbWVzIGJ5IG1vZHVsZSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFByb3ZpZGVySW1wb3J0cyhwcm9ncmFtLCBuZWdvdGlhdGlvbiwgcmVjb3JkcywgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZSwgbGFuZ3VhZ2UsIG93bmVyTW9kdWxlSWQgPSBudWxsKSB7XG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nW10+fSAqL1xuICBjb25zdCBwcm92aWRlckltcG9ydHNCeU1vZHVsZSA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgbW9kdWxlIG9mIHByb2dyYW0ubW9kdWxlcykge1xuICAgIGlmIChtb2R1bGUuY2FwYWJpbGl0aWVzID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgY29uc3QgdXNlZCA9IG5ldyBTZXQoKHVzZWRPcGVyYXRpb25zQnlNb2R1bGUuZ2V0KG1vZHVsZS5pZCkgPz8gW10pLm1hcCgoe21vZHVsZTogb3duZXIsIG9wZXJhdGlvbn0pID0+XG4gICAgICBxdWFsaWZpZWRPcGVyYXRpb25LZXkob3duZXIsIG9wZXJhdGlvbikpKVxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3Qgc3VyZmFjZSA9IG5ldyBTZXQoKVxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBjb25zdCByZXNvdXJjZU5hbWVCeUlkID0gbmV3IE1hcCgpXG5cbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZz59ICovXG4gICAgY29uc3QgZGVjbGFyYXRpb25OYW1lcyA9IG5ldyBNYXAoKG1vZHVsZS5yZWNvcmRzID8/IFtdKS5tYXAoKGRlY2xhcmF0aW9uKSA9PiBbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uLm5hbWVdKSlcblxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmVycm9ycyA/PyBbXSkge1xuICAgICAgZGVjbGFyYXRpb25OYW1lcy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uLm5hbWUpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIG1vZHVsZS5jYXBhYmlsaXRpZXMpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgY2FwYWJpbGl0eS5yZXNvdXJjZXMpIHtcbiAgICAgICAgc3VyZmFjZS5hZGQocmVzb3VyY2UubmFtZSlcbiAgICAgICAgcmVzb3VyY2VOYW1lQnlJZC5zZXQocmVzb3VyY2UuaWQsIHJlc291cmNlLm5hbWUpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGZhaWx1cmUgb2YgY2FwYWJpbGl0eS5mYWlsdXJlcykge1xuICAgICAgICBzdXJmYWNlLmFkZChmYWlsdXJlLm5hbWUpXG4gICAgICAgIGRlY2xhcmF0aW9uTmFtZXMuc2V0KGZhaWx1cmUuaWQsIGZhaWx1cmUubmFtZSlcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KClcblxuICAgIC8qKlxuICAgICAqIFZpc2l0cyBvbmUgc2VtYW50aWMgdmFsdWUuXG4gICAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyBzdWJ0cmVlLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGNvbnN0IHZpc2l0ID0gKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuXG4gICAgICBzZWVuLmFkZCh2YWx1ZSlcblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBraW5kID0gUmVmbGVjdC5nZXQodmFsdWUsIFwia2luZFwiKVxuXG4gICAgICAgIGlmIChraW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIikge1xuICAgICAgICAgIGNvbnN0IHJlc291cmNlSWQgPSBSZWZsZWN0LmdldCh2YWx1ZSwgXCJyZXNvdXJjZUlkXCIpXG5cbiAgICAgICAgICBpZiAodHlwZW9mIHJlc291cmNlSWQgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHJlc291cmNlTmFtZUJ5SWQuZ2V0KHJlc291cmNlSWQpXG5cbiAgICAgICAgICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHJlZmVyZW5jZWQuYWRkKG5hbWUpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIgfHwga2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiIHx8IGtpbmQgPT0gXCJFcnJvclR5cGVcIikge1xuICAgICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uSWQgPSBSZWZsZWN0LmdldCh2YWx1ZSwgXCJkZWNsYXJhdGlvbklkXCIpXG5cbiAgICAgICAgICBpZiAodHlwZW9mIGRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGRlY2xhcmF0aW9uTmFtZXMuZ2V0KGRlY2xhcmF0aW9uSWQpXG5cbiAgICAgICAgICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQgJiYgc3VyZmFjZS5oYXMobmFtZSkpIHJlZmVyZW5jZWQuYWRkKG5hbWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICAgIGlmIChrZXkgPT0gXCJjYXBhYmlsaXRpZXNcIiB8fCBrZXkgPT0gXCJsb2NhdGlvblwiIHx8IGtleSA9PSBcInNvdXJjZVByb3ZlbmFuY2VcIikgY29udGludWVcbiAgICAgICAgICB2aXNpdChjaGlsZClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGZvciAoY29uc3QgY2hpbGQgb2YgdmFsdWUpIHZpc2l0KGNoaWxkKVxuICAgIH1cblxuICAgIHZpc2l0KG1vZHVsZSlcbiAgICBjb25zdCBuYW1lcyA9IFtdXG5cbiAgICBpZiAobGFuZ3VhZ2UgIT0gXCJqYXZhXCIgfHwgbW9kdWxlLmlkICE9IG93bmVyTW9kdWxlSWQpIHtcbiAgICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiBtb2R1bGUuY2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgY2FwYWJpbGl0eS5yZXNvdXJjZXMpIGlmIChyZWZlcmVuY2VkLmhhcyhyZXNvdXJjZS5uYW1lKSkgbmFtZXMucHVzaChyZXNvdXJjZS5uYW1lKVxuICAgICAgICBmb3IgKGNvbnN0IGZhaWx1cmUgb2YgY2FwYWJpbGl0eS5mYWlsdXJlcykgaWYgKHJlZmVyZW5jZWQuaGFzKGZhaWx1cmUubmFtZSkpIG5hbWVzLnB1c2goZmFpbHVyZS5uYW1lKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGFuZ3VhZ2UgIT0gXCJqYXZhXCIpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvdmlkZXIgb2YgbmVnb3RpYXRpb24ucHJvdmlkZXJzKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHMuZ2V0KHByb3ZpZGVyLm1vZHVsZSlcblxuICAgICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBwcm92aWRlci5vcGVyYXRpb25zKSB7XG4gICAgICAgICAgaWYgKHVzZWQuaGFzKHF1YWxpZmllZE9wZXJhdGlvbktleShwcm92aWRlci5tb2R1bGUsIG9wZXJhdGlvbikpKSB7XG4gICAgICAgICAgICBuYW1lcy5wdXNoKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVjb3JkPy5uYXRpdmVFbnRyaWVzW29wZXJhdGlvbl0pKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHByb3ZpZGVySW1wb3J0c0J5TW9kdWxlLnNldChtb2R1bGUuaWQsIG5hbWVzKVxuICB9XG4gIHJldHVybiBwcm92aWRlckltcG9ydHNCeU1vZHVsZVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgdHJ1dGhmdWwgZ2VuZXJhdGVkIHN0ZGxpYiBsaW5rIG1ldGFkYXRhIGZvciBvbmUgbmVnb3RpYXRlZCBjbG9zdXJlLlxuICogSmF2YSByZXBvcnRzIHRoZSBvd25lciBtb2R1bGUgZmlsZSBhcyB0aGUgcHJvdmlkZXIgY2FycmllciBpbnN0ZWFkIG9mIGEgc2VwYXJhdGUgYXJ0aWZhY3QuXG4gKiBAcGFyYW0ge1N0ZGxpYlByb2dyYW1MaW5raW5nIHwgbnVsbH0gbGlua2luZyAtIExpbmtpbmcgcGxhbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgc3RyaW5nPn0gcGF0aHMgLSBQbGFubmVkIGFydGlmYWN0IHBhdGggYnkgbW9kdWxlIGlkZW50aXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGRsaWJGYWNhZGVQcm9ncmFtRGVzY3JpcHRvciB8IHVuZGVmaW5lZH0gZmFjYWRlcyAtIFNlbGVjdGVkIHNvdXJjZSBmYWNhZGUgY2xvc3VyZS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gUGxhaW4gSlNPTiBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gc3RkbGliTGlua01ldGFkYXRhKGxpbmtpbmcsIHBhdGhzLCBmYWNhZGVzKSB7XG4gIHJldHVybiB7XG4gICAgLi4uKGZhY2FkZXMgPyB7ZmFjYWRlc30gOiB7fSksXG4gICAgbW9kdWxlczogKGxpbmtpbmc/Lm5lZ290aWF0aW9uLm1vZHVsZXMgPz8gW10pLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIGlkZW50aXR5OiBpdGVtLmlkZW50aXR5LFxuICAgICAgb3BlcmF0aW9uczogWy4uLml0ZW0ub3BlcmF0aW9uc10sXG4gICAgICB2ZXJzaW9uOiBpdGVtLnZlcnNpb25cbiAgICB9KSksXG4gICAgcHJvdmlkZXJzOiAobGlua2luZz8ubmVnb3RpYXRpb24ucHJvdmlkZXJzID8/IFtdKS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IGxpbmtpbmc/LnJlY29yZHMuZ2V0KGl0ZW0ubW9kdWxlKVxuICAgICAgY29uc3QgYXJ0aWZhY3RQYXRoID0gbGlua2luZz8ub3duZXJNb2R1bGVJZCAhPT0gbnVsbCAmJiBsaW5raW5nPy5vd25lck1vZHVsZUlkICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyAvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhdGhzLmdldChsaW5raW5nLm93bmVyTW9kdWxlSWQpKVxuICAgICAgICA6IHJlY29yZD8uYXJ0aWZhY3QucGF0aFxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcnRpZmFjdDoge21lZGlhVHlwZTogcmVjb3JkPy5hcnRpZmFjdC5tZWRpYVR5cGUsIHBhdGg6IGFydGlmYWN0UGF0aH0sXG4gICAgICAgIGRlcGVuZGVuY2llczogKHJlY29yZD8uZGVwZW5kZW5jaWVzID8/IFtdKS5tYXAoKGRlcGVuZGVuY3kpID0+ICh7bW9kdWxlOiBkZXBlbmRlbmN5Lm1vZHVsZSwgcmFuZ2U6IGRlcGVuZGVuY3kucmFuZ2V9KSksXG4gICAgICAgIGlkZW50aXR5OiBpdGVtLmlkZW50aXR5LFxuICAgICAgICBtb2R1bGU6IGl0ZW0ubW9kdWxlLFxuICAgICAgICBuYXRpdmVFbnRyaWVzOiB7Li4uaXRlbS5uYXRpdmVFbnRyaWVzfSxcbiAgICAgICAgb3BlcmF0aW9uczogWy4uLml0ZW0ub3BlcmF0aW9uc10sXG4gICAgICAgIHRhcmdldDogaXRlbS50YXJnZXQsXG4gICAgICAgIHZlcnNpb246IGl0ZW0udmVyc2lvblxuICAgICAgfVxuICAgIH0pLFxuICAgIHNjaGVtYTogXCJTZW1hbnRpZm9sZFN0ZGxpYkxpbmtcIixcbiAgICB2ZXJzaW9uOiAxXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgZXZlcnkgbWFuZGF0b3J5IHNlbWFudGljIGxvY2F0aW9uIGFnYWluc3QgaXRzIG93bmluZyBtb2R1bGUgc291cmNlIGJlZm9yZSB3cml0ZXIgYWxsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBwcm9ncmFtIC0gU3RydWN0dXJhbGx5IGFuZCBzZW1hbnRpY2FsbHkgdmFsaWRhdGVkIHByb2dyYW0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvZ3JhbVNvdXJjZU93bmVyc2hpcChwcm9ncmFtLCBsYW5ndWFnZSkge1xuICBjb25zdCBzb3VyY2VzID0gbmV3IE1hcChwcm9ncmFtLnNvdXJjZXMubWFwKChzb3VyY2UpID0+IFtzb3VyY2UuZmlsZW5hbWUsIHtcbiAgICAuLi5zb3VyY2UsXG4gICAgY29vcmRpbmF0ZXM6IGNyZWF0ZUNvb3JkaW5hdGVJbmRleCgvKiogQHR5cGUge3N0cmluZ30gKi8gKHNvdXJjZS5jb250ZW50KSlcbiAgfV0pKVxuXG4gIGZvciAoY29uc3QgbW9kdWxlIG9mIHByb2dyYW0ubW9kdWxlcykge1xuICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXMuZ2V0KG1vZHVsZS5zb3VyY2VGaWxlbmFtZSlcblxuICAgIGlmICghc291cmNlKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwic2VtYW50aWMgcHJvZ3JhbSBtb2R1bGUgc291cmNlIG93bmVyc2hpcFwiLCB1bmRlZmluZWQpXG4gICAgY29uc3QgZmFsbGJhY2sgPSBtb2R1bGVMb2NhdGlvbihzb3VyY2UuZmlsZW5hbWUsIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc291cmNlLmNvbnRlbnQpKVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBzZW1hbnRpY0VudHJpZXMobW9kdWxlKSkge1xuICAgICAgY29uc3Qgc3ViamVjdCA9IGVudHJ5Lm5vZGUua2luZCA9PSBcIk1vZHVsZVwiID8gXCJtb2R1bGVcIiA6IGVudHJ5Lm5vZGUua2luZCA9PSBcIkltcG9ydFwiID8gXCJpbXBvcnRcIiA6XG4gICAgICAgIGVudHJ5Lm5vZGUua2luZCA9PSBcIkV4cG9ydFwiID8gXCJleHBvcnRcIiA6IFwic2VtYW50aWMgbm9kZVwiXG5cbiAgICAgIGlmICghKFwibG9jYXRpb25cIiBpbiBlbnRyeS5ub2RlKSkge1xuICAgICAgICBpZiAoc3ViamVjdCAhPSBcInNlbWFudGljIG5vZGVcIikgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBgc2VtYW50aWMgcHJvZ3JhbSAke3N1YmplY3R9IGxvY2F0aW9uYCwgZmFsbGJhY2spXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IGVudHJ5Lm5vZGUubG9jYXRpb25cblxuICAgICAgaWYgKHNvdXJjZU93bnNMb2NhdGlvbihzb3VyY2UsIGxvY2F0aW9uKSkgY29udGludWVcblxuICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBgc2VtYW50aWMgcHJvZ3JhbSAke3N1YmplY3R9IGxvY2F0aW9uIHNvdXJjZSBvd25lcnNoaXBgLCBmYWxsYmFjaylcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgYSBub3JtYWxpemVkIFVURi0xNiBsb2NhdGlvbiBhZ2FpbnN0IG9uZSBleGFjdCByZWdpc3RlcmVkIHNvdXJjZSB3aXRob3V0IHRocm93aW5nLlxuICogQHBhcmFtIHt7ZmlsZW5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nIHwgbnVsbCwgY29vcmRpbmF0ZXM6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvb3JkaW5hdGVJbmRleD59fSBzb3VyY2UgLSBPd25pbmcgc291cmNlLlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGUgLSBDYW5kaWRhdGUgbG9jYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc291cmNlIG93bnMgdGhlIGxvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBzb3VyY2VPd25zTG9jYXRpb24oc291cmNlLCBjYW5kaWRhdGUpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KGNhbmRpZGF0ZSkgfHwgY2FuZGlkYXRlLmZpbGVuYW1lICE9IHNvdXJjZS5maWxlbmFtZSB8fCAhaXNQbGFpbk9iamVjdChjYW5kaWRhdGUuc3RhcnQpIHx8XG4gICAgIWlzUGxhaW5PYmplY3QoY2FuZGlkYXRlLmVuZCkgfHwgIU51bWJlci5pc0ludGVnZXIoY2FuZGlkYXRlLnN0YXJ0Lm9mZnNldCkgfHwgIU51bWJlci5pc0ludGVnZXIoY2FuZGlkYXRlLmVuZC5vZmZzZXQpIHx8XG4gICAgIU51bWJlci5pc0ludGVnZXIoY2FuZGlkYXRlLnN0YXJ0LmxpbmUpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydC5jb2x1bW4pIHx8XG4gICAgIU51bWJlci5pc0ludGVnZXIoY2FuZGlkYXRlLmVuZC5saW5lKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihjYW5kaWRhdGUuZW5kLmNvbHVtbikpIHJldHVybiBmYWxzZVxuICBjb25zdCBzdGFydE9mZnNldCA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY2FuZGlkYXRlLnN0YXJ0Lm9mZnNldClcbiAgY29uc3QgZW5kT2Zmc2V0ID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChjYW5kaWRhdGUuZW5kLm9mZnNldClcblxuICBpZiAoc3RhcnRPZmZzZXQgPCAwIHx8IGVuZE9mZnNldCA8IHN0YXJ0T2Zmc2V0IHx8IGVuZE9mZnNldCA+IHNvdXJjZS5jb29yZGluYXRlcy5zb3VyY2UubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgY29uc3QgZXhwZWN0ZWRTdGFydCA9IGluZGV4ZWRQb2ludEF0KHNvdXJjZS5jb29yZGluYXRlcywgc3RhcnRPZmZzZXQpXG4gIGNvbnN0IGV4cGVjdGVkRW5kID0gaW5kZXhlZFBvaW50QXQoc291cmNlLmNvb3JkaW5hdGVzLCBlbmRPZmZzZXQpXG5cbiAgcmV0dXJuIHNhbWVQb2ludChjYW5kaWRhdGUuc3RhcnQsIGV4cGVjdGVkU3RhcnQpICYmIHNhbWVQb2ludChjYW5kaWRhdGUuZW5kLCBleHBlY3RlZEVuZClcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBhbiB1bnRydXN0ZWQgcG9pbnQgd2l0aCBvbmUgY2Fub25pY2FsIGluZGV4ZWQgcG9pbnQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBjYW5kaWRhdGUgLSBDYW5kaWRhdGUgcG9pbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZVBvaW50fSBleHBlY3RlZCAtIENhbm9uaWNhbCBwb2ludC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGV2ZXJ5IGNvb3JkaW5hdGUgYWdyZWVzLlxuICovXG5mdW5jdGlvbiBzYW1lUG9pbnQoY2FuZGlkYXRlLCBleHBlY3RlZCkge1xuICByZXR1cm4gY2FuZGlkYXRlLm9mZnNldCA9PSBleHBlY3RlZC5vZmZzZXQgJiYgY2FuZGlkYXRlLmxpbmUgPT0gZXhwZWN0ZWQubGluZSAmJiBjYW5kaWRhdGUuY29sdW1uID09IGV4cGVjdGVkLmNvbHVtblxufVxuXG4vKipcbiAqIENvbGxlY3RzIG5vbWluYWwgZmFpbHVyZSBpZGVudGl0aWVzIHJlZmVyZW5jZWQgYnkgZXhlY3V0YWJsZS90eXBlIG5vZGVzIG91dHNpZGUgdGhlIG1vZHVsZSdzIGF1dGhvcml0eSBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX0gbW9kdWxlIC0gUHJvZ3JhbSBtb2R1bGUuXG4gKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IFJlZmVyZW5jZWQgZmFpbHVyZSBkZWNsYXJhdGlvbiBpZGVudGl0aWVzLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0UmVmZXJlbmNlZEZhaWx1cmVJZHMobW9kdWxlKSB7XG4gIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gIGNvbnN0IGlkcyA9IG5ldyBTZXQoKVxuICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG4gIC8qKlxuICAgKiBWaXNpdHMgb25lIHNlbWFudGljIHN1YnRyZWUgZm9yIHJlZmVyZW5jZWQgZmFpbHVyZXMuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgc2VtYW50aWMgc3VidHJlZS5cbiAgICovXG4gIGNvbnN0IHZpc2l0ID0gKHZhbHVlKSA9PiB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyh2YWx1ZSkpIHJldHVyblxuICAgIHNlZW4uYWRkKHZhbHVlKVxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmIChSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiRXJyb3JUeXBlXCIgJiYgdHlwZW9mIFJlZmxlY3QuZ2V0KHZhbHVlLCBcImRlY2xhcmF0aW9uSWRcIikgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZHMuYWRkKFJlZmxlY3QuZ2V0KHZhbHVlLCBcImRlY2xhcmF0aW9uSWRcIikpXG4gICAgICB9XG4gICAgICBjb25zdCBmYWlsdXJlSWRzID0gUmVmbGVjdC5nZXQodmFsdWUsIFwiZmFpbHVyZUlkc1wiKVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmYWlsdXJlSWRzKSkgZm9yIChjb25zdCBpZCBvZiBmYWlsdXJlSWRzKSBpZiAodHlwZW9mIGlkID09IFwic3RyaW5nXCIpIGlkcy5hZGQoaWQpXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKFtcImNhcGFiaWxpdGllc1wiLCBcImxvY2F0aW9uXCIsIFwicHJvdmVuYW5jZVwiLCBcInNvdXJjZVByb3ZlbmFuY2VcIl0uaW5jbHVkZXMoa2V5KSkgY29udGludWVcbiAgICAgICAgdmlzaXQoY2hpbGQpXG4gICAgICB9XG4gICAgfSBlbHNlIGZvciAoY29uc3QgY2hpbGQgb2YgdmFsdWUpIHZpc2l0KGNoaWxkKVxuICB9XG5cbiAgdmlzaXQoe2NsYXNzZXM6IG1vZHVsZS5jbGFzc2VzLCBlbnRyeVBvaW50OiBtb2R1bGUuZW50cnlQb2ludCwgZnVuY3Rpb25zOiBtb2R1bGUuZnVuY3Rpb25zfSlcbiAgcmV0dXJuIGlkc1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW5kIHZhbGlkYXRlcyBldmVyeSBiYWNrZW5kLXNoYXBlZCBtb2R1bGUgYmVmb3JlIGFueSB3cml0ZXIgaXMgYWxsb2NhdGVkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBWYWxpZGF0ZWQgc2VtYW50aWMgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge1N0ZGxpYlByb2dyYW1MaW5raW5nIHwgbnVsbH0gW2xpbmtpbmddIC0gUGxhbm5lZCBzdGRsaWIgcHJvdmlkZXIgbGluay5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZVtdfSBFbWlzc2lvbiB2aWV3cyBpbiBkZXBlbmRlbmN5IG9yZGVyLlxuICovXG5mdW5jdGlvbiBwcmVwYXJlRW1pc3Npb25Nb2R1bGVzKHByb2dyYW0sIGxhbmd1YWdlLCBsaW5raW5nID0gbnVsbCkge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPn0gKi9cbiAgY29uc3QgZGVjbGFyYXRpb25zID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgcHJvZ3JhbS5tb2R1bGVzKSB7XG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUucmVjb3JkcyA/PyBbXSkgZGVjbGFyYXRpb25zLnNldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgZGVjbGFyYXRpb24pXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuY2xhc3NlcyA/PyBbXSkgZGVjbGFyYXRpb25zLnNldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgZGVjbGFyYXRpb24pXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZXJyb3JzID8/IFtdKSBkZWNsYXJhdGlvbnMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBkZWNsYXJhdGlvbilcbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5mdW5jdGlvbnMpIGRlY2xhcmF0aW9ucy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uKVxuICB9XG4gIGNvbnN0IG1vZHVsZXMgPSBwcm9ncmFtLm1vZHVsZXMubWFwKChtb2R1bGUpID0+IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9ICovICh7XG4gICAgLi4ubW9kdWxlLFxuICAgIGVudHJ5UG9pbnQ6IG1vZHVsZS5lbnRyeVBvaW50ID8/IHtcbiAgICAgIGJvZHk6IHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJCbG9ja1wiKSwgbG9jYXRpb246IG1vZHVsZS5sb2NhdGlvbiwgc3RhdGVtZW50czogW119LFxuICAgICAga2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiRW50cnlQb2ludFwiKSxcbiAgICAgIGxvY2F0aW9uOiBtb2R1bGUubG9jYXRpb25cbiAgICB9XG4gIH0pKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn0gKi9cbiAgY29uc3QgY2FsbEVmZmVjdHNCeURlY2xhcmF0aW9uSWQgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgY29uc3QgcHJvZ3JhbU1vZHVsZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAobW9kdWxlKSlcbiAgICBjb25zdCB2aXNpYmxlRnVuY3Rpb25zID0gbmV3IE1hcCgpXG4gICAgY29uc3QgdmlzaWJsZUNhbGxFZmZlY3RzID0gbmV3IE1hcCgpXG4gICAgY29uc3QgdmlzaWJsZVJlY29yZHMgPSBuZXcgTWFwKClcbiAgICBjb25zdCB2aXNpYmxlQ2xhc3NlcyA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IHZpc2libGVFcnJvcnMgPSBuZXcgTWFwKClcbiAgICBjb25zdCBleHRlcm5hbERlY2xhcmF0aW9uSWRzID0gbmV3IFNldCgpXG5cbiAgICBjb25zdCBuZWVkZWRGYWlsdXJlSWRzID0gY29sbGVjdFJlZmVyZW5jZWRGYWlsdXJlSWRzKHByb2dyYW1Nb2R1bGUpXG4gICAgY29uc3QgbG9jYWxGYWlsdXJlSWRzID0gbmV3IFNldChwcm9ncmFtTW9kdWxlLmNhcGFiaWxpdGllcz8uZmxhdE1hcCgoe2ZhaWx1cmVzfSkgPT4gZmFpbHVyZXMubWFwKCh7aWR9KSA9PiBpZCkpID8/IFtdKVxuXG4gICAgZm9yIChjb25zdCBvd25lciBvZiBwcm9ncmFtLm1vZHVsZXMpIHtcbiAgICAgIGlmIChvd25lci5pZCA9PSBwcm9ncmFtTW9kdWxlLmlkKSBjb250aW51ZVxuICAgICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIG93bmVyLmNhcGFiaWxpdGllcyA/PyBbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGZhaWx1cmUgb2YgY2FwYWJpbGl0eS5mYWlsdXJlcykge1xuICAgICAgICAgIGlmICghbG9jYWxGYWlsdXJlSWRzLmhhcyhmYWlsdXJlLmlkKSAmJiBuZWVkZWRGYWlsdXJlSWRzLmhhcyhmYWlsdXJlLmlkKSkgdmlzaWJsZUVycm9ycy5zZXQoZmFpbHVyZS5pZCwgZmFpbHVyZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgaW1wb3J0ZWQgb2YgcHJvZ3JhbU1vZHVsZS5pbXBvcnRzKSB7XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9ucy5nZXQoaW1wb3J0ZWQuZGVjbGFyYXRpb25JZClcblxuICAgICAgaWYgKCFkZWNsYXJhdGlvbikgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcInByb2dyYW0gaW1wb3J0IHdpdGhvdXQgYSBkZWNsYXJhdGlvblwiLCBpbXBvcnRlZC5sb2NhdGlvbilcbiAgICAgIGV4dGVybmFsRGVjbGFyYXRpb25JZHMuYWRkKGltcG9ydGVkLmRlY2xhcmF0aW9uSWQpXG4gICAgICBpZiAoaW1wb3J0ZWQuc3ltYm9sS2luZCA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdmlzaWJsZUZ1bmN0aW9ucy5zZXQoaW1wb3J0ZWQubG9jYWxOYW1lLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb259ICovIChkZWNsYXJhdGlvbikpXG4gICAgICAgIHZpc2libGVDYWxsRWZmZWN0cy5zZXQoaW1wb3J0ZWQubG9jYWxOYW1lLCBuZXcgU2V0KGNhbGxFZmZlY3RzQnlEZWNsYXJhdGlvbklkLmdldChpbXBvcnRlZC5kZWNsYXJhdGlvbklkKSA/PyBbXSkpXG4gICAgICB9IGVsc2UgaWYgKGltcG9ydGVkLnN5bWJvbEtpbmQgPT0gXCJyZWNvcmRcIikge1xuICAgICAgICB2aXNpYmxlUmVjb3Jkcy5zZXQoaW1wb3J0ZWQuZGVjbGFyYXRpb25JZCwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbn0gKi8gKGRlY2xhcmF0aW9uKSlcbiAgICAgIH0gZWxzZSBpZiAoaW1wb3J0ZWQuc3ltYm9sS2luZCA9PSBcImNsYXNzXCIpIHtcbiAgICAgICAgdmlzaWJsZUNsYXNzZXMuc2V0KGltcG9ydGVkLmRlY2xhcmF0aW9uSWQsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gKi8gKGRlY2xhcmF0aW9uKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpc2libGVFcnJvcnMuc2V0KGltcG9ydGVkLmRlY2xhcmF0aW9uSWQsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbn0gKi8gKGRlY2xhcmF0aW9uKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vZHVsZS5jYXBhYmlsaXRpZXMgIT09IHVuZGVmaW5lZCB8fCAhbGlua2luZykge1xuICAgICAgcHJlZmxpZ2h0RWZmZWN0Q2FwYWJpbGl0aWVzKG1vZHVsZSwgbGFuZ3VhZ2UsIGxpbmtpbmcgPyB7dXNlZE9wZXJhdGlvbnM6IChsaW5raW5nLnVzZWRPcGVyYXRpb25zQnlNb2R1bGUuZ2V0KHByb2dyYW1Nb2R1bGUuaWQpID8/IFtdKVxuICAgICAgICAubWFwKCh7b3BlcmF0aW9ufSkgPT4gb3BlcmF0aW9uKX0gOiB7fSlcbiAgICB9XG4gICAgdmFsaWRhdGVCYWNrZW5kTW9kdWxlKG1vZHVsZSwgbGFuZ3VhZ2UsIHtcbiAgICAgIGV4dGVybmFsRGVjbGFyYXRpb25JZHMsXG4gICAgICBwcm9ncmFtOiB0cnVlLFxuICAgICAgdmlzaWJsZUNhbGxFZmZlY3RzLFxuICAgICAgdmlzaWJsZUNsYXNzZXMsXG4gICAgICB2aXNpYmxlRXJyb3JzLFxuICAgICAgdmlzaWJsZUZ1bmN0aW9ucyxcbiAgICAgIHZpc2libGVSZWNvcmRzXG4gICAgfSlcbiAgICBjb25zdCBsb2NhbENhbGxFZmZlY3RzID0gbW9kdWxlVW5jaGVja2VkRXJyb3JFZmZlY3RzKG1vZHVsZSwge2NhbGxFZmZlY3RzOiB2aXNpYmxlQ2FsbEVmZmVjdHMsIGZ1bmN0aW9uczogdmlzaWJsZUZ1bmN0aW9uc30pXG5cbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5mdW5jdGlvbnMpIHtcbiAgICAgIGNhbGxFZmZlY3RzQnlEZWNsYXJhdGlvbklkLnNldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgbmV3IFNldChsb2NhbENhbGxFZmZlY3RzLmdldChkZWNsYXJhdGlvbi5uYW1lKSA/PyBbXSkpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1vZHVsZXNcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIGNsb3NlZCBwYXJzZXItbmV1dHJhbCBwcm9ncmFtIGdyYXBoIGJlZm9yZSBhbnkgdGFyZ2V0IGVtaXNzaW9uLlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGUgLSBDYW5kaWRhdGUgc2VtYW50aWMgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFNldDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlPj59IFtzb3VyY2VMYW5ndWFnZXNdIC0gQWNjZXB0ZWQgc291cmNlIGxhbmd1YWdlcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IFZhbGlkYXRlZCBwcm9ncmFtLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVByb2dyYW0oY2FuZGlkYXRlLCBsYW5ndWFnZSwgc291cmNlTGFuZ3VhZ2VzID0gcHJvZ3JhbVRhcmdldHMpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KGNhbmRpZGF0ZSkgfHwgY2FuZGlkYXRlLmtpbmQgIT0gXCJQcm9ncmFtXCIgfHwgdHlwZW9mIGNhbmRpZGF0ZS5lbnRyeU1vZHVsZSAhPSBcInN0cmluZ1wiIHx8XG4gICAgIWlzRGVuc2VBcnJheShjYW5kaWRhdGUubW9kdWxlcykgfHwgY2FuZGlkYXRlLm1vZHVsZXMubGVuZ3RoID09IDAgfHwgIWlzRGVuc2VBcnJheShjYW5kaWRhdGUuc291cmNlcykgfHwgY2FuZGlkYXRlLnNvdXJjZXMubGVuZ3RoID09IDApIHtcbiAgICBpbnZhbGlkUHJvZ3JhbUdlbmVyYXRpb24oXCJNYWxmb3JtZWQgc2VtYW50aWMgcHJvZ3JhbS5cIilcbiAgfVxuICBjb25zdCBwcm9ncmFtID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19ICovIChjYW5kaWRhdGUpXG4gIGNvbnN0IG1vZHVsZXMgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7ZGVjbGFyYXRpb246IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uLCBtb2R1bGU6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX0+fSAqL1xuICBjb25zdCBkZWNsYXJhdGlvbnMgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGVbXX0gKi9cbiAgY29uc3QgY2FwYWJpbGl0eU1vZHVsZXMgPSBbXVxuICBsZXQgZW50cnlDb3VudCA9IDBcbiAgY29uc3Qgc291cmNlSWRzID0gbmV3IFNldCgpXG4gIGNvbnN0IHNvdXJjZUZpbGVuYW1lcyA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIHByb2dyYW0uc291cmNlcykge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChzb3VyY2UpIHx8IHR5cGVvZiBzb3VyY2UuaWQgIT0gXCJzdHJpbmdcIiB8fCBzb3VyY2VJZHMuaGFzKHNvdXJjZS5pZCkgfHxcbiAgICAgIHR5cGVvZiBzb3VyY2UuZmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fCAhaXNTYWZlU291cmNlUGF0aChzb3VyY2UuZmlsZW5hbWUpIHx8IHNvdXJjZUZpbGVuYW1lcy5oYXMoc291cmNlLmZpbGVuYW1lKSB8fFxuICAgICAgdHlwZW9mIHNvdXJjZS5jb250ZW50ICE9IFwic3RyaW5nXCIgfHwgdHlwZW9mIHNvdXJjZS5sYW5ndWFnZSAhPSBcInN0cmluZ1wiIHx8ICFzb3VyY2VMYW5ndWFnZXMuaGFzKHNvdXJjZS5sYW5ndWFnZSkpIHtcbiAgICAgIGludmFsaWRQcm9ncmFtR2VuZXJhdGlvbihcIk1hbGZvcm1lZCBvciBkdXBsaWNhdGUgc2VtYW50aWMgcHJvZ3JhbSBzb3VyY2UgcmVnaXN0cnkuXCIpXG4gICAgfVxuICAgIHNvdXJjZUlkcy5hZGQoc291cmNlLmlkKVxuICAgIHNvdXJjZUZpbGVuYW1lcy5hZGQoc291cmNlLmZpbGVuYW1lKVxuICB9XG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgcHJvZ3JhbS5tb2R1bGVzKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KG1vZHVsZSkgfHwgbW9kdWxlLmtpbmQgIT0gXCJNb2R1bGVcIiB8fCB0eXBlb2YgbW9kdWxlLmlkICE9IFwic3RyaW5nXCIgfHxcbiAgICAgICEvXlthLXpdW2EtejAtOV9dKig/OlsuLV1bYS16XVthLXowLTlfXSopKiQvdS50ZXN0KG1vZHVsZS5pZCkgfHwgbW9kdWxlcy5oYXMobW9kdWxlLmlkKSB8fFxuICAgICAgIWlzRGVuc2VBcnJheShtb2R1bGUuZnVuY3Rpb25zKSB8fCBtb2R1bGUucmVjb3JkcyAhPT0gdW5kZWZpbmVkICYmICFpc0RlbnNlQXJyYXkobW9kdWxlLnJlY29yZHMpIHx8XG4gICAgICBtb2R1bGUuZXJyb3JzICE9PSB1bmRlZmluZWQgJiYgIWlzRGVuc2VBcnJheShtb2R1bGUuZXJyb3JzKSB8fFxuICAgICAgIWlzRGVuc2VBcnJheShtb2R1bGUuaW1wb3J0cykgfHwgIWlzRGVuc2VBcnJheShtb2R1bGUuZXhwb3J0cykpIHtcbiAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJtYWxmb3JtZWQgb3IgZHVwbGljYXRlIHNlbWFudGljIHByb2dyYW0gbW9kdWxlXCIsIG1vZHVsZT8ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChSZWZsZWN0LmdldChtb2R1bGUsIFwiY2xhc3Nlc1wiKSAhPT0gdW5kZWZpbmVkICYmICghaXNEZW5zZUFycmF5KG1vZHVsZS5jbGFzc2VzKSB8fFxuICAgICAgUmVmbGVjdC5nZXQobW9kdWxlLCBcInN0ZGxpYkZhY2FkZVwiKSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcIlRhc2sgMDMzIHJlZmVyZW5jZSBjbGFzc2VzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHNlbWFudGljIHByb2dyYW0gZ2VuZXJhdGlvblwiLFxuICAgICAgICBSZWZsZWN0LmdldChtb2R1bGUsIFwiY2xhc3Nlc1wiKT8uWzBdPy5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChSZWZsZWN0LmdldChtb2R1bGUsIFwiY2FwYWJpbGl0aWVzXCIpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghaXNEZW5zZUFycmF5KG1vZHVsZS5jYXBhYmlsaXRpZXMpIHx8IG1vZHVsZS5jYXBhYmlsaXRpZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcIm1hbGZvcm1lZCBvciBlbXB0eSBUYXNrIDAzNCBjYXBhYmlsaXR5IGdyYXBoXCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNhcGFiaWxpdHlNb2R1bGVzLnB1c2gobW9kdWxlKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG1vZHVsZS5zb3VyY2VGaWxlbmFtZSAhPSBcInN0cmluZ1wiIHx8ICFzb3VyY2VGaWxlbmFtZXMuaGFzKG1vZHVsZS5zb3VyY2VGaWxlbmFtZSkpIHtcbiAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJzZW1hbnRpYyBwcm9ncmFtIG1vZHVsZSBzb3VyY2UgaWRlbnRpdHlcIiwgbW9kdWxlLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAobW9kdWxlLmVudHJ5UG9pbnQpIHtcbiAgICAgIGVudHJ5Q291bnQrK1xuICAgICAgaWYgKG1vZHVsZS5pZCAhPSBwcm9ncmFtLmVudHJ5TW9kdWxlKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwiZW50cnkgcG9pbnQgb24gYW4gdW5zZWxlY3RlZCBtb2R1bGVcIiwgbW9kdWxlLmVudHJ5UG9pbnQubG9jYXRpb24pXG4gICAgfVxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgWy4uLm1vZHVsZS5yZWNvcmRzID8/IFtdLCAuLi5tb2R1bGUuY2xhc3NlcyA/PyBbXSwgLi4ubW9kdWxlLmVycm9ycyA/PyBbXSwgLi4ubW9kdWxlLmZ1bmN0aW9uc10pIHtcbiAgICAgIGlmICghaXNQbGFpbk9iamVjdChkZWNsYXJhdGlvbikgfHwgdHlwZW9mIGRlY2xhcmF0aW9uLmlkICE9IFwic3RyaW5nXCIgfHxcbiAgICAgICAgIWRlY2xhcmF0aW9uLmlkLnN0YXJ0c1dpdGgoYCR7bW9kdWxlLmlkfSNgKSB8fCBkZWNsYXJhdGlvbnMuaGFzKGRlY2xhcmF0aW9uLmlkKSkge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwiZHVwbGljYXRlIG9yIHVuc3RhYmxlIHByb2dyYW0gZGVjbGFyYXRpb24gaWRlbnRpdHlcIiwgZGVjbGFyYXRpb24/LmxvY2F0aW9uID8/IG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGRlY2xhcmF0aW9ucy5zZXQoZGVjbGFyYXRpb24uaWQsIHtkZWNsYXJhdGlvbiwgbW9kdWxlfSlcbiAgICB9XG4gICAgZm9yIChjb25zdCBpbXBvcnRlZCBvZiBtb2R1bGUuaW1wb3J0cykge1xuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGltcG9ydGVkKSB8fCBpbXBvcnRlZC5raW5kICE9IFwiSW1wb3J0XCIgfHwgdHlwZW9mIGltcG9ydGVkLm1vZHVsZUlkICE9IFwic3RyaW5nXCIgfHxcbiAgICAgICAgdHlwZW9mIGltcG9ydGVkLmltcG9ydGVkTmFtZSAhPSBcInN0cmluZ1wiIHx8IHR5cGVvZiBpbXBvcnRlZC5sb2NhbE5hbWUgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICB0eXBlb2YgaW1wb3J0ZWQuZGVjbGFyYXRpb25JZCAhPSBcInN0cmluZ1wiIHx8ICFbXCJmdW5jdGlvblwiLCBcInJlY29yZFwiLCBcImNsYXNzXCIsIFwiZXJyb3JcIl0uaW5jbHVkZXMoaW1wb3J0ZWQuc3ltYm9sS2luZCkgfHxcbiAgICAgICAgdHlwZW9mIGltcG9ydGVkLnR5cGVPbmx5ICE9IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJtYWxmb3JtZWQgc2VtYW50aWMgcHJvZ3JhbSBpbXBvcnRcIiwgaW1wb3J0ZWQ/LmxvY2F0aW9uID8/IG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBleHBvcnRlZCBvZiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGV4cG9ydGVkKSB8fCBleHBvcnRlZC5raW5kICE9IFwiRXhwb3J0XCIgfHwgdHlwZW9mIGV4cG9ydGVkLmV4cG9ydGVkTmFtZSAhPSBcInN0cmluZ1wiIHx8XG4gICAgICAgIHR5cGVvZiBleHBvcnRlZC5kZWNsYXJhdGlvbklkICE9IFwic3RyaW5nXCIgfHwgIVtcImZ1bmN0aW9uXCIsIFwicmVjb3JkXCIsIFwiY2xhc3NcIiwgXCJlcnJvclwiXS5pbmNsdWRlcyhleHBvcnRlZC5zeW1ib2xLaW5kKSkge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwibWFsZm9ybWVkIHNlbWFudGljIHByb2dyYW0gZXhwb3J0XCIsIGV4cG9ydGVkPy5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuICAgIG1vZHVsZXMuc2V0KG1vZHVsZS5pZCwgbW9kdWxlKVxuICB9XG4gIGlmIChlbnRyeUNvdW50ICE9IDEgfHwgIW1vZHVsZXMuZ2V0KHByb2dyYW0uZW50cnlNb2R1bGUpPy5lbnRyeVBvaW50KSB7XG4gICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcInByb2dyYW0gd2l0aG91dCBleGFjdGx5IG9uZSBzZWxlY3RlZCBlbnRyeSBwb2ludFwiLCBtb2R1bGVzLmdldChwcm9ncmFtLmVudHJ5TW9kdWxlKT8ubG9jYXRpb24pXG4gIH1cbiAgY29uc3Qgc2VsZWN0ZWRNb2R1bGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX0gKi8gKG1vZHVsZXMuZ2V0KHByb2dyYW0uZW50cnlNb2R1bGUpKVxuICBjb25zdCBzZWxlY3RlZEVudHJ5ID0gc2VsZWN0ZWRNb2R1bGUuZW50cnlQb2ludFxuXG4gIGlmICghaXNQbGFpbk9iamVjdChzZWxlY3RlZEVudHJ5Py5ib2R5KSB8fCAhaXNEZW5zZUFycmF5KHNlbGVjdGVkRW50cnkuYm9keS5zdGF0ZW1lbnRzKSB8fCBzZWxlY3RlZEVudHJ5LmJvZHkuc3RhdGVtZW50cy5sZW5ndGggPT0gMCkge1xuICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJwcm9ncmFtIHdpdGhvdXQgYSBkZW5zZSBub24tZW1wdHkgc2VsZWN0ZWQgZW50cnkgcG9pbnQgYmxvY2tcIixcbiAgICAgIHNlbGVjdGVkRW50cnk/LmxvY2F0aW9uID8/IHNlbGVjdGVkTW9kdWxlLmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGVhcmxpZXIgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBwcm9ncmFtLm1vZHVsZXMpIHtcbiAgICBjb25zdCBsb2NhbFRhcmdldE5hbWVzID0gbmV3IFNldChbLi4ubW9kdWxlLnJlY29yZHMgPz8gW10sIC4uLm1vZHVsZS5jbGFzc2VzID8/IFtdLCAuLi5tb2R1bGUuZXJyb3JzID8/IFtdLCAuLi5tb2R1bGUuZnVuY3Rpb25zXVxuICAgICAgLm1hcCgoe25hbWV9KSA9PiB0YXJnZXROYW1lKGxhbmd1YWdlLCBuYW1lKSkpXG4gICAgY29uc3QgaW1wb3J0ZWRUYXJnZXROYW1lcyA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IGxvY2FsSmF2YUNsYXNzID0gbW9kdWxlLnJlY29yZHM/LlswXT8ubmFtZSA/PyBtb2R1bGUuY2xhc3Nlcz8uWzBdPy5uYW1lID8/IG1vZHVsZS5lcnJvcnM/LlswXT8ubmFtZSA/P1xuICAgICAgKG1vZHVsZS5pZCA9PSBwcm9ncmFtLmVudHJ5TW9kdWxlID8gXCJNYWluXCIgOiBtb2R1bGVDbGFzc05hbWUobW9kdWxlLmlkKSlcbiAgICBjb25zdCBqYXZhSW1wb3J0Q2xhc3NlcyA9IG5ldyBNYXAobGFuZ3VhZ2UgPT0gXCJqYXZhXCIgPyBbW2xvY2FsSmF2YUNsYXNzLCBtb2R1bGUuaWRdXSA6IFtdKVxuXG4gICAgZm9yIChjb25zdCBpbXBvcnRlZCBvZiBtb2R1bGUuaW1wb3J0cykge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBkZWNsYXJhdGlvbnMuZ2V0KGltcG9ydGVkLmRlY2xhcmF0aW9uSWQpXG4gICAgICBjb25zdCByZW1vdGVFeHBvcnQgPSByZXNvbHZlZD8ubW9kdWxlLmV4cG9ydHMuZmluZCgoaXRlbSkgPT5cbiAgICAgICAgaXRlbS5kZWNsYXJhdGlvbklkID09IGltcG9ydGVkLmRlY2xhcmF0aW9uSWQgJiYgaXRlbS5leHBvcnRlZE5hbWUgPT0gaW1wb3J0ZWQuaW1wb3J0ZWROYW1lKVxuXG4gICAgICBpZiAoIXJlc29sdmVkIHx8IHJlc29sdmVkLm1vZHVsZS5pZCAhPSBpbXBvcnRlZC5tb2R1bGVJZCB8fCAhZWFybGllci5oYXMoaW1wb3J0ZWQubW9kdWxlSWQpIHx8XG4gICAgICAgICFyZW1vdGVFeHBvcnQpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcInVucmVzb2x2ZWQsIHByaXZhdGUsIGN5Y2xpYywgb3Igb3V0LW9mLW9yZGVyIHByb2dyYW0gaW1wb3J0XCIsIGltcG9ydGVkLmxvY2F0aW9uID8/IG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY2xhcmF0aW9uS2luZCA9IHJlc29sdmVkLmRlY2xhcmF0aW9uLmtpbmQgPT0gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIgPyBcImZ1bmN0aW9uXCIgOlxuICAgICAgICByZXNvbHZlZC5kZWNsYXJhdGlvbi5raW5kID09IFwiUmVjb3JkRGVjbGFyYXRpb25cIiA/IFwicmVjb3JkXCIgOlxuICAgICAgICAgIHJlc29sdmVkLmRlY2xhcmF0aW9uLmtpbmQgPT0gXCJDbGFzc0RlY2xhcmF0aW9uXCIgPyBcImNsYXNzXCIgOiBcImVycm9yXCJcblxuICAgICAgaWYgKGltcG9ydGVkLnN5bWJvbEtpbmQgIT0gcmVtb3RlRXhwb3J0LnN5bWJvbEtpbmQgfHwgaW1wb3J0ZWQuc3ltYm9sS2luZCAhPSBkZWNsYXJhdGlvbktpbmQgfHxcbiAgICAgICAgaW1wb3J0ZWQudHlwZU9ubHkgJiYgZGVjbGFyYXRpb25LaW5kICE9IFwicmVjb3JkXCIgJiYgZGVjbGFyYXRpb25LaW5kICE9IFwiY2xhc3NcIikge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwicHJvZ3JhbSBpbXBvcnQgZGVjbGFyYXRpb24ga2luZCBtaXNtYXRjaFwiLCBpbXBvcnRlZC5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBpbXBvcnROYW1lID0gcHJvZ3JhbUltcG9ydE5hbWUocHJvZ3JhbSwgbW9kdWxlLCBpbXBvcnRlZClcblxuICAgICAgaWYgKGxhbmd1YWdlICE9IFwicnVieVwiICYmIGxhbmd1YWdlICE9IFwiamF2YVwiKSB7XG4gICAgICAgIGlmIChpbXBvcnRlZC5zeW1ib2xLaW5kICE9IFwiZnVuY3Rpb25cIikgdmFsaWRhdGVUYXJnZXRUeXBlSWRlbnRpZmllcihsYW5ndWFnZSwgaW1wb3J0TmFtZSwgaW1wb3J0ZWQubG9jYXRpb24pXG4gICAgICAgIGVsc2UgdmFsaWRhdGVUYXJnZXRCaW5kaW5nSWRlbnRpZmllcihsYW5ndWFnZSwgaW1wb3J0TmFtZSwgXCJpbXBvcnRcIiwgaW1wb3J0ZWQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBuYW1lID0gdGFyZ2V0TmFtZShsYW5ndWFnZSwgaW1wb3J0TmFtZSlcblxuICAgICAgaWYgKGxhbmd1YWdlICE9IFwicnVieVwiICYmIGxhbmd1YWdlICE9IFwiamF2YVwiICYmIChsb2NhbFRhcmdldE5hbWVzLmhhcyhuYW1lKSB8fCBpbXBvcnRlZFRhcmdldE5hbWVzLmhhcyhuYW1lKSkpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBgdGFyZ2V0IGltcG9ydC1uYW1lIGNvbGxpc2lvbiAnJHtpbXBvcnROYW1lfSdgLCBpbXBvcnRlZC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChsYW5ndWFnZSA9PSBcImphdmFcIikge1xuICAgICAgICBjb25zdCBpbXBvcnRlZENsYXNzID0gaW1wb3J0ZWQuc3ltYm9sS2luZCA9PSBcImZ1bmN0aW9uXCIgPyBtb2R1bGVDbGFzc05hbWUocmVzb2x2ZWQubW9kdWxlLmlkKSA6IHJlc29sdmVkLmRlY2xhcmF0aW9uLm5hbWVcbiAgICAgICAgY29uc3QgZXhpc3RpbmdPd25lciA9IGphdmFJbXBvcnRDbGFzc2VzLmdldChpbXBvcnRlZENsYXNzKVxuXG4gICAgICAgIGlmIChleGlzdGluZ093bmVyICYmIGV4aXN0aW5nT3duZXIgIT0gcmVzb2x2ZWQubW9kdWxlLmlkKSB7XG4gICAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBgdGFyZ2V0IGltcG9ydC1jbGFzcyBjb2xsaXNpb24gJyR7aW1wb3J0ZWRDbGFzc30nYCwgaW1wb3J0ZWQubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgamF2YUltcG9ydENsYXNzZXMuc2V0KGltcG9ydGVkQ2xhc3MsIHJlc29sdmVkLm1vZHVsZS5pZClcbiAgICAgIH1cbiAgICAgIGlmIChsYW5ndWFnZSA9PSBcInJ1YnlcIikge1xuICAgICAgICBjb25zdCBpbXBvcnRlZE1vZHVsZSA9IG1vZHVsZUNsYXNzTmFtZShyZXNvbHZlZC5tb2R1bGUuaWQpXG5cbiAgICAgICAgaWYgKGxvY2FsVGFyZ2V0TmFtZXMuaGFzKGltcG9ydGVkTW9kdWxlKSkge1xuICAgICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYHRhcmdldCBpbXBvcnQtbW9kdWxlIGNvbGxpc2lvbiAnJHtpbXBvcnRlZE1vZHVsZX0nYCwgaW1wb3J0ZWQubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGltcG9ydGVkVGFyZ2V0TmFtZXMuYWRkKG5hbWUpXG4gICAgfVxuICAgIGNvbnN0IHZhbHVlRGVjbGFyYXRpb25JZHMgPSBuZXcgU2V0KG1vZHVsZS5pbXBvcnRzLmZpbHRlcigoe3R5cGVPbmx5fSkgPT4gIXR5cGVPbmx5KS5tYXAoKHtkZWNsYXJhdGlvbklkfSkgPT4gZGVjbGFyYXRpb25JZCkpXG4gICAgY29uc3QgdHlwZU9ubHlEZWNsYXJhdGlvbklkcyA9IG5ldyBTZXQobW9kdWxlLmltcG9ydHNcbiAgICAgIC5maWx0ZXIoKHtkZWNsYXJhdGlvbklkLCB0eXBlT25seX0pID0+IHR5cGVPbmx5ICYmICF2YWx1ZURlY2xhcmF0aW9uSWRzLmhhcyhkZWNsYXJhdGlvbklkKSlcbiAgICAgIC5tYXAoKHtkZWNsYXJhdGlvbklkfSkgPT4gZGVjbGFyYXRpb25JZCkpXG4gICAgY29uc3QgdmFsdWVDb25zdHJ1Y3Rpb24gPSBmaW5kVHlwZU9ubHlWYWx1ZUNvbnN0cnVjdGlvbihtb2R1bGUsIHR5cGVPbmx5RGVjbGFyYXRpb25JZHMpXG5cbiAgICBpZiAodmFsdWVDb25zdHJ1Y3Rpb24pIHtcbiAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJ0eXBlLW9ubHkgcHJvZ3JhbSBpbXBvcnQgdXNlZCBhcyBhIHZhbHVlXCIsIHZhbHVlQ29uc3RydWN0aW9uLmxvY2F0aW9uID8/IG1vZHVsZS5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgZXhwb3J0TmFtZXMgPSBuZXcgU2V0KClcblxuICAgIGZvciAoY29uc3QgZXhwb3J0ZWQgb2YgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gZGVjbGFyYXRpb25zLmdldChleHBvcnRlZC5kZWNsYXJhdGlvbklkKVxuICAgICAgY29uc3QgbmFtZSA9IHRhcmdldE5hbWUobGFuZ3VhZ2UsIGV4cG9ydGVkLmV4cG9ydGVkTmFtZSlcblxuICAgICAgaWYgKGxhbmd1YWdlID09IFwiamF2YXNjcmlwdFwiIHx8IGxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiKSB7XG4gICAgICAgIHZhbGlkYXRlVGFyZ2V0SWRlbnRpZmllcihsYW5ndWFnZSwgZXhwb3J0ZWQuZXhwb3J0ZWROYW1lLCBcImV4cG9ydFwiLCBleHBvcnRlZC5sb2NhdGlvbiA/PyBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzb2x2ZWQgfHwgcmVzb2x2ZWQubW9kdWxlLmlkICE9IG1vZHVsZS5pZCB8fCBleHBvcnROYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBgdW5yZXNvbHZlZCBvciBjb2xsaWRpbmcgdGFyZ2V0IGV4cG9ydCAnJHtleHBvcnRlZC5leHBvcnRlZE5hbWV9J2AsIGV4cG9ydGVkLmxvY2F0aW9uID8/IG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY2xhcmF0aW9uS2luZCA9IHJlc29sdmVkLmRlY2xhcmF0aW9uLmtpbmQgPT0gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIgPyBcImZ1bmN0aW9uXCIgOlxuICAgICAgICByZXNvbHZlZC5kZWNsYXJhdGlvbi5raW5kID09IFwiUmVjb3JkRGVjbGFyYXRpb25cIiA/IFwicmVjb3JkXCIgOlxuICAgICAgICAgIHJlc29sdmVkLmRlY2xhcmF0aW9uLmtpbmQgPT0gXCJDbGFzc0RlY2xhcmF0aW9uXCIgPyBcImNsYXNzXCIgOiBcImVycm9yXCJcblxuICAgICAgaWYgKGV4cG9ydGVkLnN5bWJvbEtpbmQgIT0gZGVjbGFyYXRpb25LaW5kKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJwcm9ncmFtIGV4cG9ydCBkZWNsYXJhdGlvbiBraW5kIG1pc21hdGNoXCIsIGV4cG9ydGVkLmxvY2F0aW9uID8/IG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChsYW5ndWFnZSAhPSBcImphdmFzY3JpcHRcIiAmJiBsYW5ndWFnZSAhPSBcInR5cGVzY3JpcHRcIiAmJiBleHBvcnRlZC5leHBvcnRlZE5hbWUgIT0gcmVzb2x2ZWQuZGVjbGFyYXRpb24ubmFtZSkge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGBleHBvcnQgYWxpYXMgJyR7ZXhwb3J0ZWQuZXhwb3J0ZWROYW1lfScgd2l0aG91dCBhbiBlcXVpdmFsZW50IHRhcmdldCBiaW5kaW5nYCxcbiAgICAgICAgICBleHBvcnRlZC5sb2NhdGlvbiA/PyByZXNvbHZlZC5kZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGV4cG9ydE5hbWVzLmFkZChuYW1lKVxuICAgIH1cbiAgICBpZiAobGFuZ3VhZ2UgPT0gXCJwaHBcIikge1xuICAgICAgY29uc3QgZXhwb3J0ZWREZWNsYXJhdGlvbklkcyA9IG5ldyBTZXQobW9kdWxlLmV4cG9ydHMubWFwKCh7ZGVjbGFyYXRpb25JZH0pID0+IGRlY2xhcmF0aW9uSWQpKVxuICAgICAgY29uc3QgcHJpdmF0ZURlY2xhcmF0aW9uID0gWy4uLm1vZHVsZS5yZWNvcmRzID8/IFtdLCAuLi5tb2R1bGUuY2xhc3NlcyA/PyBbXSwgLi4ubW9kdWxlLmVycm9ycyA/PyBbXSwgLi4ubW9kdWxlLmZ1bmN0aW9uc10uZmluZCgoe2lkfSkgPT5cbiAgICAgICAgdHlwZW9mIGlkID09IFwic3RyaW5nXCIgJiYgIWV4cG9ydGVkRGVjbGFyYXRpb25JZHMuaGFzKGlkKSlcblxuICAgICAgaWYgKHByaXZhdGVEZWNsYXJhdGlvbikge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGBub24tZXhwb3J0ZWQgZGVjbGFyYXRpb24gJyR7cHJpdmF0ZURlY2xhcmF0aW9uLm5hbWV9JyB3aXRob3V0IHRhcmdldC1wcml2YXRlIG1vZHVsZSB2aXNpYmlsaXR5YCxcbiAgICAgICAgICBwcml2YXRlRGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuICAgIGVhcmxpZXIuYWRkKG1vZHVsZS5pZClcbiAgfVxuXG4gIHZhbGlkYXRlUHJvZ3JhbVN0ZGxpYkNvbnRyYWN0KHByb2dyYW0sIGxhbmd1YWdlLCBjYXBhYmlsaXR5TW9kdWxlcylcbiAgdmFsaWRhdGVQcm9ncmFtU3RkbGliRmFjYWRlcyhwcm9ncmFtLCBsYW5ndWFnZSlcblxuICByZXR1cm4gcHJvZ3JhbVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBjb21waWxlci1zZWxlY3RlZCBmYWNhZGUgZGVzY3JpcHRvcnMsIGV4ZWN1dGFibGUgc291cmNlcywgbW9kdWxlIG1hcmtlcnMsIGFuZCBuYXRpdmUgaWRlbnRpdHkgZXZpZGVuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gcHJvZ3JhbSAtIENhbmRpZGF0ZSBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZSBmb3IgZGlhZ25vc3RpY3MuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9ncmFtU3RkbGliRmFjYWRlcyhwcm9ncmFtLCBsYW5ndWFnZSkge1xuICBjb25zdCBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXQocHJvZ3JhbSwgXCJzdGRsaWJGYWNhZGVzXCIpXG4gIGNvbnN0IG1hcmtlZE1vZHVsZXMgPSBwcm9ncmFtLm1vZHVsZXMuZmlsdGVyKChtb2R1bGUpID0+IFJlZmxlY3QuZ2V0KG1vZHVsZSwgXCJzdGRsaWJGYWNhZGVcIikgIT09IHVuZGVmaW5lZClcbiAgY29uc3QgZmFjYWRlU291cmNlcyA9IHByb2dyYW0uc291cmNlcy5maWx0ZXIoKHNvdXJjZSkgPT4gUmVmbGVjdC5nZXQoc291cmNlLCBcIm93bmVyc2hpcFwiKSA9PSBcImZhY2FkZVwiKVxuICBjb25zdCBldmlkZW5jZWRJbXBvcnRzID0gcHJvZ3JhbS5tb2R1bGVzLmZsYXRNYXAoKG1vZHVsZSkgPT4gbW9kdWxlLmltcG9ydHMuZmlsdGVyKChpdGVtKSA9PiBSZWZsZWN0LmdldChpdGVtLCBcInN0ZGxpYkZhY2FkZVwiKSAhPT0gdW5kZWZpbmVkKSlcblxuICBpZiAoZGVzY3JpcHRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG1hcmtlZE1vZHVsZXMubGVuZ3RoID4gMCB8fCBmYWNhZGVTb3VyY2VzLmxlbmd0aCA+IDAgfHwgZXZpZGVuY2VkSW1wb3J0cy5sZW5ndGggPiAwKSB7XG4gICAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgXCJGYWNhZGUgbW9kdWxlcywgc291cmNlcywgb3IgaW1wb3J0IGV2aWRlbmNlIHJlcXVpcmUgYSBjb21wbGV0ZSBwcm9ncmFtIGZhY2FkZSBkZXNjcmlwdG9yLlwiKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBpZiAoIWlzUGxhaW5PYmplY3QoZGVzY3JpcHRvcikgfHwgZGVzY3JpcHRvci5zY2hlbWEgIT0gXCJTZW1hbnRpZm9sZFN0ZGxpYkZhY2FkZXNcIiB8fCBkZXNjcmlwdG9yLnZlcnNpb24gIT0gMSB8fFxuICAgIHR5cGVvZiBkZXNjcmlwdG9yLmxhbmd1YWdlICE9IFwic3RyaW5nXCIgfHwgIXByb2dyYW1UYXJnZXRzLmhhcyhkZXNjcmlwdG9yLmxhbmd1YWdlKSB8fCAhaXNEZW5zZUFycmF5KGRlc2NyaXB0b3IubW9kdWxlcykgfHxcbiAgICBkZXNjcmlwdG9yLm1vZHVsZXMubGVuZ3RoID09IDApIHtcbiAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgXCJUaGUgcHJvZ3JhbSBmYWNhZGUgZGVzY3JpcHRvciBpcyBtYWxmb3JtZWQuXCIpXG4gIH1cbiAgY29uc3QgZmFjYWRlTGFuZ3VhZ2UgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9ICovIChkZXNjcmlwdG9yLmxhbmd1YWdlKVxuICBjb25zdCByZWNvcmRzID0gZGVzY3JpcHRvci5tb2R1bGVzLm1hcCgoaXRlbSkgPT4ge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChpdGVtKSB8fCB0eXBlb2YgaXRlbS5pZGVudGl0eSAhPSBcInN0cmluZ1wiIHx8IHR5cGVvZiBpdGVtLnZlcnNpb24gIT0gXCJzdHJpbmdcIikge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiVGhlIHByb2dyYW0gZmFjYWRlIG1vZHVsZSBkZXNjcmlwdG9yIGlzIG1hbGZvcm1lZC5cIilcbiAgICB9XG4gICAgcmV0dXJuIHN0ZGxpYkZhY2FkZVJlZ2lzdHJ5LnJlc29sdmVJZGVudGl0eShpdGVtLmlkZW50aXR5LCBmYWNhZGVMYW5ndWFnZSwgaXRlbS52ZXJzaW9uKVxuICB9KVxuICBjb25zdCBleHBlY3RlZCA9IHN0ZGxpYkZhY2FkZVByb2dyYW1EZXNjcmlwdG9yKGZhY2FkZUxhbmd1YWdlLCByZWNvcmRzKVxuXG4gIGlmICghZXF1YWxQbGFpbkRhdGEoZGVzY3JpcHRvciwgZXhwZWN0ZWQpKSB7XG4gICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiVGhlIHByb2dyYW0gZmFjYWRlIGRlc2NyaXB0b3IgZG9lcyBub3QgbWF0Y2ggdGhlIHJlZ2lzdGVyZWQgdmVyc2lvbmVkIGZhY2FkZSBjbG9zdXJlLlwiKVxuICB9XG4gIGNvbnN0IHNlbGVjdGVkUmVjb3JkcyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICBpZiAoc2VsZWN0ZWRSZWNvcmRzLmhhcyhyZWNvcmQuaWRlbnRpdHkpKSB7XG4gICAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgYEZhY2FkZSAnJHtyZWNvcmQuaWRlbnRpdHl9JyBpcyBzZWxlY3RlZCBtb3JlIHRoYW4gb25jZS5gKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgcmVjb3JkLmRlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBzdGRsaWJGYWNhZGVSZWdpc3RyeS5yZXNvbHZlSWRlbnRpdHkoZGVwZW5kZW5jeS5pZGVudGl0eSwgZmFjYWRlTGFuZ3VhZ2UsIGRlcGVuZGVuY3kucmFuZ2UpXG4gICAgICBjb25zdCBzZWxlY3RlZCA9IHNlbGVjdGVkUmVjb3Jkcy5nZXQocmVzb2x2ZWQuaWRlbnRpdHkpXG5cbiAgICAgIGlmICghc2VsZWN0ZWQgfHwgc2VsZWN0ZWQudmVyc2lvbiAhPSByZXNvbHZlZC52ZXJzaW9uKSB7XG4gICAgICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBgRmFjYWRlICcke3JlY29yZC5pZGVudGl0eX0nIGRlcGVuZGVuY3kgJyR7cmVzb2x2ZWQuaWRlbnRpdHl9QCR7cmVzb2x2ZWQudmVyc2lvbn0nIGlzIG1pc3Npbmcgb3Igb3V0IG9mIG9yZGVyLmApXG4gICAgICB9XG4gICAgfVxuICAgIHNlbGVjdGVkUmVjb3Jkcy5zZXQocmVjb3JkLmlkZW50aXR5LCByZWNvcmQpXG4gIH1cbiAgaWYgKG1hcmtlZE1vZHVsZXMubGVuZ3RoICE9IHJlY29yZHMubGVuZ3RoKSB7XG4gICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiVGhlIHByb2dyYW0gZmFjYWRlIGRlc2NyaXB0b3IgZG9lcyBub3QgbWF0Y2ggaXRzIGV4ZWN1dGFibGUgc2VtYW50aWMgbW9kdWxlcy5cIilcbiAgfVxuICBpZiAocHJvZ3JhbS5zb3VyY2VzLnNvbWUoKHNvdXJjZSkgPT4gc291cmNlLmxhbmd1YWdlICE9IGZhY2FkZUxhbmd1YWdlIHx8XG4gICAgIVtcImFwcGxpY2F0aW9uXCIsIFwiZmFjYWRlXCJdLmluY2x1ZGVzKFN0cmluZyhSZWZsZWN0LmdldChzb3VyY2UsIFwib3duZXJzaGlwXCIpKSkpKSB7XG4gICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiRmFjYWRlIHByb2dyYW1zIHJlcXVpcmUgb25lIHNvdXJjZSBsYW5ndWFnZSBhbmQgZXhwbGljaXQgYXBwbGljYXRpb24vZmFjYWRlIG93bmVyc2hpcC5cIilcbiAgfVxuICBjb25zdCBzZWxlY3RlZElkZW50aXRpZXMgPSBuZXcgU2V0KHJlY29yZHMubWFwKCh7aWRlbnRpdHl9KSA9PiBpZGVudGl0eSkpXG4gIGNvbnN0IHJlZ2lzdGVyZWRNb2R1bGVzID0gcmVwYXJzZVJlZ2lzdGVyZWRGYWNhZGVNb2R1bGVzKHByb2dyYW0sIGZhY2FkZUxhbmd1YWdlLCBsYW5ndWFnZSlcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVjb3Jkcy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCByZWNvcmQgPSByZWNvcmRzW2luZGV4XVxuICAgIGNvbnN0IG1vZHVsZSA9IG1hcmtlZE1vZHVsZXNbaW5kZXhdXG4gICAgY29uc3QgbWFya2VyID0gUmVmbGVjdC5nZXQobW9kdWxlLCBcInN0ZGxpYkZhY2FkZVwiKVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KG1hcmtlcikgfHwgT2JqZWN0LmtleXMobWFya2VyKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJpZGVudGl0eSx2ZXJzaW9uXCIgfHxcbiAgICAgIG1hcmtlci5pZGVudGl0eSAhPSByZWNvcmQuaWRlbnRpdHkgfHwgbWFya2VyLnZlcnNpb24gIT0gcmVjb3JkLnZlcnNpb24gfHwgbW9kdWxlLmlkICE9IHJlY29yZC5zb3VyY2UuaWQgfHxcbiAgICAgIG1vZHVsZS5zb3VyY2VGaWxlbmFtZSAhPSByZWNvcmQuc291cmNlLmZpbGVuYW1lKSB7XG4gICAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgYEZhY2FkZSAnJHtyZWNvcmQuaWRlbnRpdHl9JyBzZW1hbnRpYyBtb2R1bGUgaWRlbnRpdHkgaXMgbm90IGNhbm9uaWNhbC5gKVxuICAgIH1cbiAgICBjb25zdCBzb3VyY2UgPSBwcm9ncmFtLnNvdXJjZXMuZmluZCgoe2ZpbGVuYW1lfSkgPT4gZmlsZW5hbWUgPT0gcmVjb3JkLnNvdXJjZS5maWxlbmFtZSlcblxuICAgIGlmICghc291cmNlIHx8IHNvdXJjZS5jb250ZW50ICE9IHJlY29yZC5zb3VyY2UuY29udGVudCB8fCBSZWZsZWN0LmdldChzb3VyY2UsIFwib3duZXJzaGlwXCIpICE9IFwiZmFjYWRlXCIpIHtcbiAgICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBgRmFjYWRlICcke3JlY29yZC5pZGVudGl0eX0nIGV4ZWN1dGFibGUgc291cmNlIGRvZXMgbm90IG1hdGNoIGl0cyByZWdpc3RlcmVkIGRlZmluaXRpb24uYClcbiAgICB9XG4gICAgY29uc3QgcmVnaXN0ZXJlZE1vZHVsZSA9IHJlZ2lzdGVyZWRNb2R1bGVzLmdldChyZWNvcmQuaWRlbnRpdHkpXG5cbiAgICBpZiAoIXJlZ2lzdGVyZWRNb2R1bGUgfHwgIWVxdWFsUGxhaW5EYXRhKG1vZHVsZSwgcmVnaXN0ZXJlZE1vZHVsZSkpIHtcbiAgICAgIGludmFsaWRGYWNhZGVBdXRob3JpdHkobGFuZ3VhZ2UsXG4gICAgICAgIGBGYWNhZGUgJyR7cmVjb3JkLmlkZW50aXR5fScgc2VtYW50aWMgbW9kdWxlIGRvZXMgbm90IG1hdGNoIGl0cyByZWdpc3RlcmVkIGV4ZWN1dGFibGUgc291cmNlLmAsIG1vZHVsZS5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgYWxsb3dlZE9wZXJhdGlvbnMgPSBuZXcgU2V0KHJlY29yZC5yZXF1aXJlbWVudHMuZmxhdE1hcCgoe29wZXJhdGlvbnN9KSA9PiBvcGVyYXRpb25zKSlcbiAgICBjb25zdCB1c2VkT3BlcmF0aW9ucyA9IGNvbGxlY3REZWNsYXJlZEVmZmVjdE9wZXJhdGlvbnMobW9kdWxlKVxuXG4gICAgaWYgKGFsbG93ZWRPcGVyYXRpb25zLnNpemUgIT0gdXNlZE9wZXJhdGlvbnMuc2l6ZSB8fCBbLi4uYWxsb3dlZE9wZXJhdGlvbnNdLnNvbWUoKG9wZXJhdGlvbikgPT4gIXVzZWRPcGVyYXRpb25zLmhhcyhvcGVyYXRpb24pKSkge1xuICAgICAgaW52YWxpZEZhY2FkZUF1dGhvcml0eShsYW5ndWFnZSwgYEZhY2FkZSAnJHtyZWNvcmQuaWRlbnRpdHl9JyBzZW1hbnRpYyBib2R5IGRvZXMgbm90IG1hdGNoIGl0cyBkZWNsYXJlZCBjYW5vbmljYWwgcmVxdWlyZW1lbnRzLmAsIG1vZHVsZS5sb2NhdGlvbilcbiAgICB9XG4gIH1cbiAgaWYgKGZhY2FkZVNvdXJjZXMubGVuZ3RoICE9IHJlY29yZHMubGVuZ3RoKSB7XG4gICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiVGhlIHByb2dyYW0gY29udGFpbnMgYW4gdW5zZWxlY3RlZCBjb21waWxlci1vd25lZCBmYWNhZGUgc291cmNlLlwiKVxuICB9XG4gIGlmIChldmlkZW5jZWRJbXBvcnRzLmxlbmd0aCA9PSAwKSB7XG4gICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIFwiVGhlIHNlbGVjdGVkIGZhY2FkZSBjbG9zdXJlIGhhcyBubyBwYXJzZXItcHJvdmVkIG5hdGl2ZSBpbXBvcnQgZXZpZGVuY2UuXCIpXG4gIH1cbiAgZm9yIChjb25zdCBpbXBvcnRlZCBvZiBldmlkZW5jZWRJbXBvcnRzKSB7XG4gICAgY29uc3QgZXZpZGVuY2UgPSBSZWZsZWN0LmdldChpbXBvcnRlZCwgXCJzdGRsaWJGYWNhZGVcIilcblxuICAgIGlmICghaXNQbGFpbk9iamVjdChldmlkZW5jZSkgfHwgT2JqZWN0LmtleXMoZXZpZGVuY2UpLnNvcnQoKS5qb2luKFwiLFwiKSAhPVxuICAgICAgXCJmYWNhZGVJZGVudGl0eSxmYWNhZGVWZXJzaW9uLG5hdGl2ZU1vZHVsZSxuYXRpdmVTeW1ib2wsc2NoZW1hLHZlcnNpb25cIiB8fFxuICAgICAgZXZpZGVuY2Uuc2NoZW1hICE9IFwiU2VtYW50aWZvbGRTdGRsaWJGYWNhZGVSZXNvbHV0aW9uXCIgfHwgZXZpZGVuY2UudmVyc2lvbiAhPSAxIHx8XG4gICAgICB0eXBlb2YgZXZpZGVuY2UuZmFjYWRlSWRlbnRpdHkgIT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgZXZpZGVuY2UuZmFjYWRlVmVyc2lvbiAhPSBcInN0cmluZ1wiIHx8XG4gICAgICB0eXBlb2YgZXZpZGVuY2UubmF0aXZlTW9kdWxlICE9IFwic3RyaW5nXCIgfHwgdHlwZW9mIGV2aWRlbmNlLm5hdGl2ZVN5bWJvbCAhPSBcInN0cmluZ1wiKSB7XG4gICAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgXCJBIGZhY2FkZSBpbXBvcnQgaGFzIG1hbGZvcm1lZCBuYXRpdmUgaWRlbnRpdHkgZXZpZGVuY2UuXCIpXG4gICAgfVxuICAgIGNvbnN0IHJlY29yZCA9IHN0ZGxpYkZhY2FkZVJlZ2lzdHJ5LnJlc29sdmVGYWNhZGUoZmFjYWRlTGFuZ3VhZ2UsIGV2aWRlbmNlLm5hdGl2ZU1vZHVsZSwgZXZpZGVuY2UubmF0aXZlU3ltYm9sLFxuICAgICAgZXZpZGVuY2UuZmFjYWRlVmVyc2lvbilcblxuICAgIGlmIChyZWNvcmQuaWRlbnRpdHkgIT0gZXZpZGVuY2UuZmFjYWRlSWRlbnRpdHkgfHwgIXNlbGVjdGVkSWRlbnRpdGllcy5oYXMocmVjb3JkLmlkZW50aXR5KSB8fCBpbXBvcnRlZC5tb2R1bGVJZCAhPSByZWNvcmQuc291cmNlLmlkIHx8XG4gICAgICBpbXBvcnRlZC5pbXBvcnRlZE5hbWUgIT0gZXZpZGVuY2UubmF0aXZlU3ltYm9sKSB7XG4gICAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgXCJBIGZhY2FkZSBpbXBvcnQgZG9lcyBub3QgbWF0Y2ggaXRzIHJlZ2lzdGVyZWQgbmF0aXZlIG1vZHVsZSBhbmQgc3ltYm9sIGlkZW50aXR5LlwiKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3RzIGV2ZXJ5IGNhbm9uaWNhbCBvcGVyYXRpb24gcHJlc2VudCBpbiBvbmUgdmFsaWRhdGVkIGZhY2FkZSBpbXBsZW1lbnRhdGlvbi5cbiAqIFRoaXMgY2hlY2tzIHRoZSBmYWNhZGUncyBjb21wbGV0ZSBkZWNsYXJlZCBhdXRob3JpdHkgaW5kZXBlbmRlbnRseSBmcm9tIHByb2dyYW0gcmVhY2hhYmlsaXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9IG1vZHVsZSAtIEZhY2FkZSBtb2R1bGUuXG4gKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IFVzZWQgb3BlcmF0aW9uIG5hbWVzLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0RGVjbGFyZWRFZmZlY3RPcGVyYXRpb25zKG1vZHVsZSkge1xuICBjb25zdCBvcGVyYXRpb25OYW1lcyA9IG5ldyBNYXAobW9kdWxlLmNhcGFiaWxpdGllcz8uZmxhdE1hcCgoe29wZXJhdGlvbnN9KSA9PlxuICAgIG9wZXJhdGlvbnMubWFwKChvcGVyYXRpb24pID0+IFtvcGVyYXRpb24uaWQsIG9wZXJhdGlvbi5uYW1lXSkpID8/IFtdKVxuICBjb25zdCB1c2VkID0gbmV3IFNldCgpXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KClcbiAgLyoqXG4gICAqIFZpc2l0cyBvbmUgZmFjYWRlIHNlbWFudGljIHN1YnRyZWUuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgc2VtYW50aWMgc3VidHJlZS5cbiAgICovXG4gIGNvbnN0IHZpc2l0ID0gKHZhbHVlKSA9PiB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyh2YWx1ZSkpIHJldHVyblxuICAgIHNlZW4uYWRkKHZhbHVlKVxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiID8gUmVmbGVjdC5nZXQodmFsdWUsIFwib3BlcmF0aW9uXCIpIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmICh0eXBlb2Ygb3BlcmF0aW9uID09IFwic3RyaW5nXCIgJiYgb3BlcmF0aW9uTmFtZXMuaGFzKG9wZXJhdGlvbikpIHVzZWQuYWRkKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAob3BlcmF0aW9uTmFtZXMuZ2V0KG9wZXJhdGlvbikpKVxuICAgICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgIGlmIChbXCJjYXBhYmlsaXRpZXNcIiwgXCJsb2NhdGlvblwiLCBcInByb3ZlbmFuY2VcIiwgXCJyZXNvbHV0aW9uXCIsIFwic291cmNlUHJvdmVuYW5jZVwiXS5pbmNsdWRlcyhrZXkpKSBjb250aW51ZVxuICAgICAgICB2aXNpdChjaGlsZClcbiAgICAgIH1cbiAgICB9IGVsc2UgZm9yIChjb25zdCBjaGlsZCBvZiB2YWx1ZSkgdmlzaXQoY2hpbGQpXG4gIH1cblxuICB2aXNpdCh7Y2xhc3NlczogbW9kdWxlLmNsYXNzZXMsIGVudHJ5UG9pbnQ6IG1vZHVsZS5lbnRyeVBvaW50LCBmdW5jdGlvbnM6IG1vZHVsZS5mdW5jdGlvbnN9KVxuICByZXR1cm4gdXNlZFxufVxuXG4vKipcbiAqIFJlY29tcGlsZXMgdGhlIHJlZ2lzdHJ5LXNlbGVjdGVkIGZhY2FkZSBjbG9zdXJlIGZyb20gcmV0YWluZWQgY2FsbGVyIGlucHV0cyBhbmQgcmVnaXN0ZXJlZCBmYWNhZGUgc291cmNlLlxuICogVGhpcyBwYXJzZXItYmFja2VkIHJlZmVyZW5jZSBncmFwaCBpcyBjcmVhdGVkIGR1cmluZyB2YWxpZGF0aW9uLCBiZWZvcmUgcHJvdmlkZXIgcGxhbm5pbmcgb3Igd3JpdGVyIGFsbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gcHJvZ3JhbSAtIFVudHJ1c3RlZCBtdXRhYmxlIHNlbWFudGljIHByb2dyYW0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGZhY2FkZUxhbmd1YWdlIC0gU2VsZWN0ZWQgc291cmNlLWxhbmd1YWdlIGZhY2FkZSBwcm9maWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBkaWFnbm9zdGljTGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UgZm9yIGJvdW5kYXJ5IGRpYWdub3N0aWNzLlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZT59IENhbm9uaWNhbCBzZW1hbnRpYyBtb2R1bGVzIGJ5IGZhY2FkZSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gcmVwYXJzZVJlZ2lzdGVyZWRGYWNhZGVNb2R1bGVzKHByb2dyYW0sIGZhY2FkZUxhbmd1YWdlLCBkaWFnbm9zdGljTGFuZ3VhZ2UpIHtcbiAgY29uc3QgYXBwbGljYXRpb25Nb2R1bGVzID0gcHJvZ3JhbS5tb2R1bGVzLmZpbHRlcigobW9kdWxlKSA9PiBSZWZsZWN0LmdldChtb2R1bGUsIFwic3RkbGliRmFjYWRlXCIpID09PSB1bmRlZmluZWQpXG4gIGNvbnN0IG1vZHVsZXNCeUZpbGVuYW1lID0gbmV3IE1hcChhcHBsaWNhdGlvbk1vZHVsZXMubWFwKChtb2R1bGUpID0+IFttb2R1bGUuc291cmNlRmlsZW5hbWUsIG1vZHVsZV0pKVxuICBjb25zdCBhcHBsaWNhdGlvblNvdXJjZXMgPSBwcm9ncmFtLnNvdXJjZXMuZmlsdGVyKChzb3VyY2UpID0+IFJlZmxlY3QuZ2V0KHNvdXJjZSwgXCJvd25lcnNoaXBcIikgPT0gXCJhcHBsaWNhdGlvblwiKS5tYXAoKHNvdXJjZSkgPT4ge1xuICAgIGNvbnN0IG1vZHVsZSA9IG1vZHVsZXNCeUZpbGVuYW1lLmdldChzb3VyY2UuZmlsZW5hbWUpXG5cbiAgICBpZiAoIW1vZHVsZSkgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IoZGlhZ25vc3RpY0xhbmd1YWdlLFxuICAgICAgYEFwcGxpY2F0aW9uIHNvdXJjZSAnJHtzb3VyY2UuZmlsZW5hbWV9JyBoYXMgbm8gbWF0Y2hpbmcgc2VtYW50aWMgbW9kdWxlIGZvciBmYWNhZGUgdmVyaWZpY2F0aW9uLmApXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lOiBzb3VyY2UuZmlsZW5hbWUsXG4gICAgICBpZDogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9ICovIChtb2R1bGUpLmlkLFxuICAgICAgbGFuZ3VhZ2U6IGZhY2FkZUxhbmd1YWdlLFxuICAgICAgc291cmNlOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKHNvdXJjZS5jb250ZW50KVxuICAgIH1cbiAgfSlcblxuICBpZiAoYXBwbGljYXRpb25Tb3VyY2VzLmxlbmd0aCAhPSBhcHBsaWNhdGlvbk1vZHVsZXMubGVuZ3RoKSB7XG4gICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IoZGlhZ25vc3RpY0xhbmd1YWdlLCBcIkZhY2FkZSB2ZXJpZmljYXRpb24gcmVxdWlyZXMgb25lIHJldGFpbmVkIGFwcGxpY2F0aW9uIHNvdXJjZSBwZXIgc2VtYW50aWMgbW9kdWxlLlwiKVxuICB9XG4gIGNvbnN0IHJlcGFyc2VkID0gcGFyc2VQcm9ncmFtU291cmNlKHtlbnRyeU1vZHVsZTogcHJvZ3JhbS5lbnRyeU1vZHVsZSwgc291cmNlczogYXBwbGljYXRpb25Tb3VyY2VzfSlcbiAgY29uc3QgbW9kdWxlcyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgbW9kdWxlIG9mIHJlcGFyc2VkLm1vZHVsZXMpIHtcbiAgICBpZiAoIW1vZHVsZS5zdGRsaWJGYWNhZGUpIGNvbnRpbnVlXG4gICAgaWYgKG1vZHVsZXMuaGFzKG1vZHVsZS5zdGRsaWJGYWNhZGUuaWRlbnRpdHkpKSB7XG4gICAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihkaWFnbm9zdGljTGFuZ3VhZ2UsIGBSZWdpc3RlcmVkIGZhY2FkZSAnJHttb2R1bGUuc3RkbGliRmFjYWRlLmlkZW50aXR5fScgcmVwYXJzZWQgbW9yZSB0aGFuIG9uY2UuYClcbiAgICB9XG4gICAgbW9kdWxlcy5zZXQobW9kdWxlLnN0ZGxpYkZhY2FkZS5pZGVudGl0eSwgbW9kdWxlKVxuICB9XG4gIHJldHVybiBtb2R1bGVzXG59XG5cbi8qKlxuICogQ29tcGFyZXMgY2xvc2VkIHBsYWluIEpTT04tc2hhcGVkIGRhdGEgd2l0aG91dCBjb2VyY2lvbiBvciBrZXktb3JkZXIgYXNzdW1wdGlvbnMuXG4gKiBAcGFyYW0ge3Vua25vd259IGxlZnQgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcGFyYW0ge3Vua25vd259IHJpZ2h0IC0gRXhwZWN0ZWQgdmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gRXhhY3QgcmVjdXJzaXZlIGVxdWl2YWxlbmNlLlxuICovXG5mdW5jdGlvbiBlcXVhbFBsYWluRGF0YShsZWZ0LCByaWdodCkge1xuICBpZiAobGVmdCA9PT0gcmlnaHQpIHJldHVybiB0cnVlXG4gIGlmIChBcnJheS5pc0FycmF5KGxlZnQpIHx8IEFycmF5LmlzQXJyYXkocmlnaHQpKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobGVmdCkgJiYgQXJyYXkuaXNBcnJheShyaWdodCkgJiYgaXNEZW5zZUFycmF5KGxlZnQpICYmIGlzRGVuc2VBcnJheShyaWdodCkgJiZcbiAgICAgIGxlZnQubGVuZ3RoID09IHJpZ2h0Lmxlbmd0aCAmJiBsZWZ0LmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IGVxdWFsUGxhaW5EYXRhKHZhbHVlLCByaWdodFtpbmRleF0pKVxuICB9XG4gIGlmICghaXNQbGFpbk9iamVjdChsZWZ0KSB8fCAhaXNQbGFpbk9iamVjdChyaWdodCkpIHJldHVybiBmYWxzZVxuICBjb25zdCBsZWZ0S2V5cyA9IE9iamVjdC5rZXlzKGxlZnQpLnNvcnQoKVxuICBjb25zdCByaWdodEtleXMgPSBPYmplY3Qua2V5cyhyaWdodCkuc29ydCgpXG5cbiAgcmV0dXJuIGxlZnRLZXlzLmxlbmd0aCA9PSByaWdodEtleXMubGVuZ3RoICYmIGxlZnRLZXlzLmV2ZXJ5KChrZXksIGluZGV4KSA9PlxuICAgIGtleSA9PSByaWdodEtleXNbaW5kZXhdICYmIGVxdWFsUGxhaW5EYXRhKGxlZnRba2V5XSwgcmlnaHRba2V5XSkpXG59XG5cbi8qKlxuICogVGhyb3dzIG9uZSBzdGFibGUgZmFjYWRlIGFydGlmYWN0LWJvdW5kYXJ5IGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBEaWFnbm9zdGljIGRldGFpbC5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIG1lc3NhZ2UpIHtcbiAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7Y29kZTogXCJTVERMSUJfRkFDQURFX0RFU0NSSVBUT1JfSU5WQUxJRFwiLCBsYW5ndWFnZSwgbWVzc2FnZX0pXG59XG5cbi8qKlxuICogVGhyb3dzIHdoZW4gYSBmYWNhZGUgc2VtYW50aWMgYm9keSBleGNlZWRzIG9yIG9taXRzIGl0cyByZWdpc3RyeS1kZWNsYXJlZCBhdXRob3JpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBEaWFnbm9zdGljIGRldGFpbC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRmFjYWRlIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZEZhY2FkZUF1dGhvcml0eShsYW5ndWFnZSwgbWVzc2FnZSwgbG9jYXRpb24pIHtcbiAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7Y29kZTogXCJTVERMSUJfRkFDQURFX0FVVEhPUklUWV9GT1JHRURcIiwgbGFuZ3VhZ2UsIGxvY2F0aW9uLCBtZXNzYWdlfSlcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIHByb2dyYW0gc3RkbGliIGxpbmsgZGVzY3JpcHRvciBhZ2FpbnN0IGl0cyBjYXBhYmlsaXR5IG1vZHVsZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gcHJvZ3JhbSAtIENhbmRpZGF0ZSBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlW119IGNhcGFiaWxpdHlNb2R1bGVzIC0gTW9kdWxlcyBjYXJyeWluZyBjYXBhYmlsaXRpZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9ncmFtU3RkbGliQ29udHJhY3QocHJvZ3JhbSwgbGFuZ3VhZ2UsIGNhcGFiaWxpdHlNb2R1bGVzKSB7XG4gIGNvbnN0IGNvbnRyYWN0ID0gUmVmbGVjdC5nZXQocHJvZ3JhbSwgXCJzdGRsaWJDb250cmFjdFwiKVxuICBjb25zdCBjb250cmFjdHMgPSBSZWZsZWN0LmdldChwcm9ncmFtLCBcInN0ZGxpYkNvbnRyYWN0c1wiKVxuXG4gIGlmIChjYXBhYmlsaXR5TW9kdWxlcy5sZW5ndGggPT0gMCkge1xuICAgIGlmIChjb250cmFjdCAhPT0gdW5kZWZpbmVkIHx8IGNvbnRyYWN0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgY29kZTogXCJTVERMSUJfTElOS19GQUlMVVJFXCIsXG4gICAgICAgIGxhbmd1YWdlLFxuICAgICAgICBtZXNzYWdlOiBcIkEgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdCByZXF1aXJlcyBjYXBhYmlsaXR5IG1vZHVsZXMuXCJcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIGlmIChjb250cmFjdCAhPT0gdW5kZWZpbmVkICYmIGNvbnRyYWN0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgbWVzc2FnZTogXCJBIHByb2dyYW0gY2Fubm90IGRlY2xhcmUgYm90aCBzaW5ndWxhciBhbmQgcGx1cmFsIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QgZGVzY3JpcHRvcnMuXCJcbiAgICB9KVxuICB9XG4gIGlmIChjb250cmFjdCA9PT0gdW5kZWZpbmVkICYmIGNvbnRyYWN0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcInByb2dyYW0gbW9kdWxlcyB3aXRoIGNhcGFiaWxpdGllcyByZXF1aXJlIGEgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdFwiLFxuICAgICAgY2FwYWJpbGl0eU1vZHVsZXNbMF0ubG9jYXRpb24pXG4gIH1cbiAgY29uc3QgZGVjbGFyZWQgPSBjb250cmFjdHMgPT09IHVuZGVmaW5lZCA/IFtjb250cmFjdF0gOiBjb250cmFjdHNcblxuICBpZiAoIWlzRGVuc2VBcnJheShkZWNsYXJlZCkgfHwgZGVjbGFyZWQubGVuZ3RoID09IDApIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgICAgbGFuZ3VhZ2UsXG4gICAgICBtZXNzYWdlOiBcIlRoZSBkZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IGRlc2NyaXB0b3IgbGlzdCBpcyBtYWxmb3JtZWQgb3IgZW1wdHkuXCJcbiAgICB9KVxuICB9XG4gIGNvbnN0IGlkZW50aXRpZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IGRlc2NyaXB0b3Igb2YgZGVjbGFyZWQpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoZGVzY3JpcHRvcikgfHwgT2JqZWN0LmtleXMoZGVzY3JpcHRvcikuc29tZSgoa2V5KSA9PiBrZXkgIT0gXCJpZGVudGl0eVwiICYmIGtleSAhPSBcImNvbnRyYWN0VmVyc2lvblwiKSkge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgbWVzc2FnZTogXCJUaGUgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdCBkZXNjcmlwdG9yIGlzIG1hbGZvcm1lZC5cIlxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgaWRlbnRpdHkgPSBkZXNjcmlwdG9yLmlkZW50aXR5XG5cbiAgICBpZiAodHlwZW9mIGlkZW50aXR5ICE9IFwic3RyaW5nXCIgfHwgaWRlbnRpdHkubGVuZ3RoID09IDAgfHwgaWRlbnRpdGllcy5oYXMoaWRlbnRpdHkpIHx8XG4gICAgICAhbGlzdFN0ZGxpYk1vZHVsZXMoKS5zb21lKCh7aWRlbnRpdHk6IHJlZ2lzdGVyZWR9KSA9PiByZWdpc3RlcmVkID09IGlkZW50aXR5KSkge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgbWVzc2FnZTogYERlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QgJyR7U3RyaW5nKGlkZW50aXR5KX0nIGlzIGR1cGxpY2F0ZSBvciBub3QgYSByZWdpc3RlcmVkIGNhbm9uaWNhbCBtb2R1bGUuYFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0b3IuY29udHJhY3RWZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgcGFyc2VTdGRsaWJWZXJzaW9uUmFuZ2UoZGVzY3JpcHRvci5jb250cmFjdFZlcnNpb24pID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgY29kZTogXCJTVERMSUJfTElOS19GQUlMVVJFXCIsXG4gICAgICAgIGxhbmd1YWdlLFxuICAgICAgICBtZXNzYWdlOiBgRGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdCB2ZXJzaW9uICcke1N0cmluZyhkZXNjcmlwdG9yLmNvbnRyYWN0VmVyc2lvbil9JyBpcyBub3QgY2Fub25pY2FsLmBcbiAgICAgIH0pXG4gICAgfVxuICAgIGlkZW50aXRpZXMuYWRkKGlkZW50aXR5KVxuICB9XG4gIGZvciAoY29uc3QgbW9kdWxlIG9mIGNhcGFiaWxpdHlNb2R1bGVzKSB7XG4gICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIG1vZHVsZS5jYXBhYmlsaXRpZXMgPz8gW10pIHtcbiAgICAgIGlmICghaXNQbGFpbk9iamVjdChjYXBhYmlsaXR5KSB8fCB0eXBlb2YgY2FwYWJpbGl0eS5hdXRob3JpdHlJZCAhPSBcInN0cmluZ1wiIHx8ICFpZGVudGl0aWVzLmhhcyhjYXBhYmlsaXR5LmF1dGhvcml0eUlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQ2FwYWJpbGl0eSBhdXRob3JpdHkgJyR7U3RyaW5nKFJlZmxlY3QuZ2V0KGNhcGFiaWxpdHksIFwiYXV0aG9yaXR5SWRcIikpfScgZG9lcyBub3QgbWF0Y2ggYSBkZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0LmBcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5kcyBhIHJlY29yZCBjb25zdHJ1Y3Rpb24gdGhhdCBjcm9zc2VzIGEgdHlwZS1vbmx5IGltcG9ydCBlZGdlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9IG1vZHVsZSAtIEltcG9ydGluZyBzZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSB0eXBlT25seURlY2xhcmF0aW9uSWRzIC0gSW1wb3J0ZWQgaWRlbnRpdGllcyB1bmF2YWlsYWJsZSBpbiB2YWx1ZSBwb3NpdGlvbnMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkQ29uc3RydWN0aW9uIHwgdW5kZWZpbmVkfSBJbnZhbGlkIGNvbnN0cnVjdGlvbiB3aGVuIHByZXNlbnQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRUeXBlT25seVZhbHVlQ29uc3RydWN0aW9uKG1vZHVsZSwgdHlwZU9ubHlEZWNsYXJhdGlvbklkcykge1xuICBpZiAodHlwZU9ubHlEZWNsYXJhdGlvbklkcy5zaXplID09IDApIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3Qgc2VlbiA9IG5ldyBXZWFrU2V0KClcblxuICAvKipcbiAgICogVmlzaXRzIG9uZSBzZW1hbnRpYyB2YWx1ZS5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyBzdWJ0cmVlLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkQ29uc3RydWN0aW9uIHwgdW5kZWZpbmVkfSBJbnZhbGlkIGNvbnN0cnVjdGlvbiB3aGVuIHByZXNlbnQuXG4gICAqL1xuICBmdW5jdGlvbiB2aXNpdCh2YWx1ZSkge1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXModmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgc2Vlbi5hZGQodmFsdWUpXG4gICAgY29uc3Qgb2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVxuXG4gICAgaWYgKG9iamVjdC5raW5kID09IFwiUmVjb3JkQ29uc3RydWN0aW9uXCIgJiYgaXNQbGFpbk9iamVjdChvYmplY3QucmVjb3JkKSAmJlxuICAgICAgdHlwZW9mIG9iamVjdC5yZWNvcmQuZGVjbGFyYXRpb25JZCA9PSBcInN0cmluZ1wiICYmIHR5cGVPbmx5RGVjbGFyYXRpb25JZHMuaGFzKG9iamVjdC5yZWNvcmQuZGVjbGFyYXRpb25JZCkpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZENvbnN0cnVjdGlvbn0gKi8gKHZhbHVlKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXMob2JqZWN0KSkge1xuICAgICAgY29uc3QgZm91bmQgPSB2aXNpdChjaGlsZClcblxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmRcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICByZXR1cm4gdmlzaXQoe2VudHJ5UG9pbnQ6IG1vZHVsZS5lbnRyeVBvaW50LCBmdW5jdGlvbnM6IG1vZHVsZS5mdW5jdGlvbnN9KVxufVxuXG4vKipcbiAqIFBsYW5zIGFsbCBwYXRocyBiZWZvcmUgZW1pc3Npb24gYW5kIHJlamVjdHMgZXhhY3QvY2FzZS9maWxlLWRpcmVjdG9yeSBjb2xsaXNpb25zLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBWYWxpZGF0ZWQgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge1N0ZGxpYlByb2dyYW1MaW5raW5nIHwgbnVsbH0gW2xpbmtpbmddIC0gUGxhbm5lZCBzdGRsaWIgcHJvdmlkZXIgbGluay5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBQYXRoIGJ5IG1vZHVsZSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gcGxhbk1vZHVsZVBhdGhzKHByb2dyYW0sIGxhbmd1YWdlLCBsaW5raW5nID0gbnVsbCkge1xuICBjb25zdCBleHRlbnNpb24gPSBsYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiA/IFwiLmpzXCIgOiBsYW5ndWFnZSA9PSBcInR5cGVzY3JpcHRcIiA/IFwiLnRzXCIgOiBsYW5ndWFnZSA9PSBcInJ1YnlcIiA/IFwiLnJiXCIgOlxuICAgIGxhbmd1YWdlID09IFwicGhwXCIgPyBcIi5waHBcIiA6IFwiLmphdmFcIlxuICBjb25zdCBwYXRocyA9IG5ldyBNYXAoKVxuICBjb25zdCBmb2xkZWQgPSBuZXcgU2V0KClcbiAgY29uc3QgdGFyZ2V0TW9kdWxlTmFtZXMgPSBuZXcgU2V0KClcbiAgY29uc3QgcHJvdmlkZXJQYXRocyA9IGxpbmtpbmcgPyBsaW5raW5nLm5lZ290aWF0aW9uLnByb3ZpZGVycy5tYXAoKHttb2R1bGV9KSA9PlxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc3RkbGliLXByb3ZpZGVycy5qc1wiKS5TdGRsaWJQcm92aWRlclJlY29yZH0gKi8gKGxpbmtpbmcucmVjb3Jkcy5nZXQobW9kdWxlKSkuYXJ0aWZhY3QucGF0aCkgOiBbXVxuICBjb25zdCBmb2xkZWRQcm92aWRlcnMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IHByb3ZpZGVyUGF0aCBvZiBwcm92aWRlclBhdGhzKSB7XG4gICAgY29uc3Qga2V5ID0gcHJvdmlkZXJQYXRoLnRvTG9jYWxlTG93ZXJDYXNlKFwiZW4tVVNcIilcblxuICAgIGlmICghaXNTYWZlQXJ0aWZhY3RQYXRoKHByb3ZpZGVyUGF0aCkgfHwgZm9sZGVkLmhhcyhrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIlNURExJQl9OQU1FX0NPTExJU0lPTlwiLCBsYW5ndWFnZSxcbiAgICAgICAgbWVzc2FnZTogYFN0ZGxpYiBwcm92aWRlciBhcnRpZmFjdCBwYXRoICcke3Byb3ZpZGVyUGF0aH0nIGlzIHVuc2FmZSBvciBjb2xsaWRpbmcuYH0pXG4gICAgfVxuICAgIGZvbGRlZC5hZGQoa2V5KVxuICAgIGZvbGRlZFByb3ZpZGVycy5zZXQocHJvdmlkZXJQYXRoLnRvTG9jYWxlTG93ZXJDYXNlKFwiZW4tVVNcIikucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpLCBwcm92aWRlclBhdGgpXG4gIH1cblxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBwcm9ncmFtLm1vZHVsZXMpIHtcbiAgICBsZXQgcGF0aCA9IGAke21vZHVsZS5pZC5yZXBsYWNlQWxsKFwiLlwiLCBcIi9cIil9JHtleHRlbnNpb259YFxuICAgIGNvbnN0IHByb3ZpZGVyUGF0aCA9IGZvbGRlZFByb3ZpZGVycy5nZXQocGF0aC50b0xvY2FsZUxvd2VyQ2FzZShcImVuLVVTXCIpLnJlcGxhY2VBbGwoXCIuXCIsIFwiL1wiKSlcblxuICAgIGlmIChwcm92aWRlclBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX05BTUVfQ09MTElTSU9OXCIsXG4gICAgICAgIGxhbmd1YWdlLFxuICAgICAgICBtZXNzYWdlOiBgTW9kdWxlIHBhdGggJyR7cGF0aH0nIGNvbGxpZGVzIHdpdGggdGhlIHN0ZGxpYiBwcm92aWRlciBhcnRpZmFjdCAnJHtwcm92aWRlclBhdGh9Jy5gXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXRNb2R1bGVOYW1lID0gbW9kdWxlQ2xhc3NOYW1lKG1vZHVsZS5pZClcblxuICAgIGlmIChsYW5ndWFnZSA9PSBcInBocFwiIHx8IGxhbmd1YWdlID09IFwicnVieVwiKSB7XG4gICAgICBjb25zdCBrZXkgPSBsYW5ndWFnZSA9PSBcInBocFwiID8gdGFyZ2V0TW9kdWxlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZShcImVuLVVTXCIpIDogdGFyZ2V0TW9kdWxlTmFtZVxuXG4gICAgICBpZiAodGFyZ2V0TW9kdWxlTmFtZXMuaGFzKGtleSkpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBgdGFyZ2V0IG1vZHVsZS1uYW1lIGNvbGxpc2lvbiAnJHt0YXJnZXRNb2R1bGVOYW1lfSdgLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICB0YXJnZXRNb2R1bGVOYW1lcy5hZGQoa2V5KVxuICAgIH1cblxuICAgIGlmIChsYW5ndWFnZSA9PSBcInBocFwiKSB7XG4gICAgICB2YWxpZGF0ZVRhcmdldElkZW50aWZpZXIobGFuZ3VhZ2UsIHRhcmdldE1vZHVsZU5hbWUsIFwibW9kdWxlXCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIHZhbGlkYXRlVGFyZ2V0VHlwZUlkZW50aWZpZXIobGFuZ3VhZ2UsIHRhcmdldE1vZHVsZU5hbWUsIG1vZHVsZS5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGxhbmd1YWdlID09IFwicnVieVwiKSB2YWxpZGF0ZVRhcmdldFR5cGVJZGVudGlmaWVyKGxhbmd1YWdlLCB0YXJnZXRNb2R1bGVOYW1lLCBtb2R1bGUubG9jYXRpb24pXG5cbiAgICBpZiAobGFuZ3VhZ2UgPT0gXCJqYXZhXCIpIHtcbiAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBtb2R1bGUuaWQuc3BsaXQoXCIuXCIpKSB2YWxpZGF0ZVRhcmdldElkZW50aWZpZXIobGFuZ3VhZ2UsIHNlZ21lbnQsIFwibW9kdWxlXCIsIG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIGNvbnN0IG5vbWluYWxDb3VudCA9IChtb2R1bGUucmVjb3Jkcz8ubGVuZ3RoID8/IDApICsgKG1vZHVsZS5jbGFzc2VzPy5sZW5ndGggPz8gMCkgKyAobW9kdWxlLmVycm9ycz8ubGVuZ3RoID8/IDApXG5cbiAgICAgIGlmIChtb2R1bGUuaWQuaW5jbHVkZXMoXCItXCIpIHx8IG5vbWluYWxDb3VudCA+IDEgfHxcbiAgICAgICAgbm9taW5hbENvdW50ID4gMCAmJiAobW9kdWxlLmZ1bmN0aW9ucy5sZW5ndGggPiAwIHx8IG1vZHVsZS5lbnRyeVBvaW50KSkge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwiSmF2YSBtb2R1bGUgbGF5b3V0IHJlcXVpcmluZyBtdWx0aXBsZSBwdWJsaWMgZGVjbGFyYXRpb25zIGluIG9uZSBzZW1hbnRpYyBtb2R1bGVcIiwgbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgY2xhc3NOYW1lID0gbW9kdWxlLnJlY29yZHM/LlswXT8ubmFtZSA/PyBtb2R1bGUuY2xhc3Nlcz8uWzBdPy5uYW1lID8/IG1vZHVsZS5lcnJvcnM/LlswXT8ubmFtZSA/P1xuICAgICAgICAobW9kdWxlLmlkID09IHByb2dyYW0uZW50cnlNb2R1bGUgPyBcIk1haW5cIiA6IHRhcmdldE1vZHVsZU5hbWUpXG5cbiAgICAgIGlmICghL15bQS1aYS16XyRdW0EtWmEtejAtOV8kXSokL3UudGVzdChjbGFzc05hbWUpKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYGludmFsaWQgSmF2YSBwdWJsaWMgY2xhc3MgbmFtZSAnJHtjbGFzc05hbWV9J2AsIG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChtb2R1bGUuaWQgIT0gcHJvZ3JhbS5lbnRyeU1vZHVsZSkgdmFsaWRhdGVUYXJnZXRUeXBlSWRlbnRpZmllcihsYW5ndWFnZSwgY2xhc3NOYW1lLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICBwYXRoID0gYHNlbWFudGlmb2xkL2dlbmVyYXRlZC8ke21vZHVsZS5pZC5yZXBsYWNlQWxsKFwiLlwiLCBcIi9cIil9LyR7Y2xhc3NOYW1lfS5qYXZhYFxuICAgIH1cbiAgICBjb25zdCBrZXkgPSBwYXRoLnRvTG9jYWxlTG93ZXJDYXNlKFwiZW4tVVNcIilcblxuICAgIGlmICghaXNTYWZlQXJ0aWZhY3RQYXRoKHBhdGgpIHx8IGZvbGRlZC5oYXMoa2V5KSkgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBgdW5zYWZlIG9yIGNvbGxpZGluZyB0YXJnZXQgcGF0aCAnJHtwYXRofSdgLCBtb2R1bGUubG9jYXRpb24pXG4gICAgZm9sZGVkLmFkZChrZXkpXG4gICAgcGF0aHMuc2V0KG1vZHVsZS5pZCwgcGF0aClcbiAgfVxuXG4gIHJldHVybiBwYXRoc1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbG9naWNhbCBtb2R1bGUgaWRlbnRpdHkgdG8gaXRzIGNhbm9uaWNhbCB0YXJnZXQgdHlwZSBzZWdtZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gTG9naWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUYXJnZXQgY2xhc3MgbmFtZS5cbiAqL1xuZnVuY3Rpb24gbW9kdWxlQ2xhc3NOYW1lKGlkKSB7XG4gIHJldHVybiBpZC5zcGxpdCgvWy5fLV0rL3UpLm1hcCgocGFydCkgPT4gYCR7cGFydFswXS50b1VwcGVyQ2FzZSgpfSR7cGFydC5zbGljZSgxKX1gKS5qb2luKFwiXCIpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGRlY2xhcmF0aW9uIG9yIGJpbmRpbmcgbmFtZSBmb3IgdGFyZ2V0IGNvbGxpc2lvbiBjaGVja3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0LlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBOYW1lLlxuICogQHJldHVybnMge3N0cmluZ30gQ29sbGlzaW9uIGtleS5cbiAqL1xuZnVuY3Rpb24gdGFyZ2V0TmFtZShsYW5ndWFnZSwgbmFtZSkge1xuICByZXR1cm4gbGFuZ3VhZ2UgPT0gXCJwaHBcIiA/IG5hbWUudG9Mb2NhbGVMb3dlckNhc2UoXCJlbi1VU1wiKSA6IG5hbWVcbn1cblxuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgYSBjYW5kaWRhdGUgaXMgYSBkaXJlY3QgcGxhaW4gb2JqZWN0LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUpICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09IE9iamVjdC5wcm90b3R5cGVcbn1cblxuLyoqXG4gKiBSYWlzZXMgYSBzdGFibGUgbWFsZm9ybWVkIHByb2dyYW0tZ2VuZXJhdGlvbiByZXF1ZXN0IGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFN0YWJsZSBmYWlsdXJlLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBpbnZhbGlkUHJvZ3JhbUdlbmVyYXRpb24obWVzc2FnZSkge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIklOVkFMSURfUFJPR1JBTVwiLCBsYW5ndWFnZTogXCJwcm9ncmFtXCIsIG1lc3NhZ2V9KVxufVxuIl19
1309
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9wcm9ncmFtLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ3hFLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQzFELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUM5RixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUMxRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUN4RCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUM1RCxPQUFPLEVBQUMscUJBQXFCLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFBO0FBQzdGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUN6RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUNoRixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNuRSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQTtBQUNqRSxPQUFPLEVBQUMsNkJBQTZCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQTtBQUN4RixPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM3RCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDeEQsT0FBTyxFQUFDLCtCQUEr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QUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDL0YsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUk7SUFDaEMsT0FBTyxRQUFRLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUNuRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQUs7SUFDMUIsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUE7QUFDaEksQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHdCQUF3QixDQUFDLE9BQU87SUFDdkMsTUFBTSxJQUFJLHFCQUFxQixDQUFDLEVBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtBQUMxRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7aXNEZW5zZUFycmF5fSBmcm9tIFwiLi4vYXJyYXkuanNcIlxuaW1wb3J0IHtpc1NhZmVBcnRpZmFjdFBhdGgsIGlzU2FmZVNvdXJjZVBhdGh9IGZyb20gXCIuLi9hcnRpZmFjdC1wYXRoLmpzXCJcbmltcG9ydCB7Y3JlYXRlR2VuZXJhdGVkQXJ0aWZhY3RTZXR9IGZyb20gXCIuLi9hcnRpZmFjdHMuanNcIlxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWMsIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eSwgdW5zdXBwb3J0ZWRSb2xlfSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge3BhcnNlUHJvZ3JhbVNvdXJjZX0gZnJvbSBcIi4uL2Zyb250ZW5kcy9wcm9ncmFtLmpzXCJcbmltcG9ydCB7bGFuZ3VhZ2VSZWdpc3RyeX0gZnJvbSBcIi4uL2xhbmd1YWdlLXJlZ2lzdHJ5LmpzXCJcbmltcG9ydCB7ZmluYWxpemVNYXBwaW5nLCB0b1NvdXJjZU1hcFYzfSBmcm9tIFwiLi4vbWFwcGluZy5qc1wiXG5pbXBvcnQge2NyZWF0ZUNvb3JkaW5hdGVJbmRleCwgaW5kZXhlZFBvaW50QXQsIG1vZHVsZUxvY2F0aW9ufSBmcm9tIFwiLi4vc2VtYW50aWMvbG9jYXRpb24uanNcIlxuaW1wb3J0IHtzZW1hbnRpY0VudHJpZXN9IGZyb20gXCIuLi9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzXCJcbmltcG9ydCB7bGlzdFN0ZGxpYk1vZHVsZXMsIHBhcnNlU3RkbGliVmVyc2lvblJhbmdlfSBmcm9tIFwiLi4vc2VtYW50aWMvc3RkbGliLmpzXCJcbmltcG9ydCB7bW9kdWxlVW5jaGVja2VkRXJyb3JFZmZlY3RzfSBmcm9tIFwiLi4vc2VtYW50aWMvdmFsaWRhdGUuanNcIlxuaW1wb3J0IHtuZWdvdGlhdGVTdGRsaWJQcm92aWRlcnN9IGZyb20gXCIuLi9zdGRsaWItbmVnb3RpYXRpb24uanNcIlxuaW1wb3J0IHtzdGRsaWJGYWNhZGVQcm9ncmFtRGVzY3JpcHRvciwgc3RkbGliRmFjYWRlUmVnaXN0cnl9IGZyb20gXCIuLi9zdGRsaWItZmFjYWRlcy5qc1wiXG5pbXBvcnQge3N0ZGxpYlByb3ZpZGVyUmVnaXN0cnl9IGZyb20gXCIuLi9zdGRsaWItcHJvdmlkZXJzLmpzXCJcbmltcG9ydCB7cHJlZmxpZ2h0RWZmZWN0Q2FwYWJpbGl0aWVzfSBmcm9tIFwiLi9lZmZlY3RzLmpzXCJcbmltcG9ydCB7dmFsaWRhdGVUYXJnZXRCaW5kaW5nSWRlbnRpZmllciwgdmFsaWRhdGVUYXJnZXRJZGVudGlmaWVyLCB2YWxpZGF0ZVRhcmdldFR5cGVJZGVudGlmaWVyfSBmcm9tIFwiLi9pZGVudGlmaWVycy5qc1wiXG5pbXBvcnQge2dlbmVyYXRlU3RkbGliUHJvdmlkZXJDb250ZW50fSBmcm9tIFwiLi9zdGRsaWItc3VwcG9ydC5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlQmFja2VuZE1vZHVsZX0gZnJvbSBcIi4vc2hhcmVkLmpzXCJcbmltcG9ydCB7cHJvZ3JhbUltcG9ydE5hbWUsIFNvdXJjZVdyaXRlcn0gZnJvbSBcIi4vd3JpdGVyLmpzXCJcblxuLyoqIEB0eXBlIHtSZWFkb25seTxTZXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZT4+fSAqL1xuY29uc3QgcHJvZ3JhbVRhcmdldHMgPSBuZXcgU2V0KFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0pXG4vKiogQHR5cGUge1JlYWRvbmx5PFNldDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CYWNrZW5kTGFuZ3VhZ2U+Pn0gKi9cbmNvbnN0IHByb2dyYW1BcHBsaWNhdGlvblRhcmdldHMgPSBuZXcgU2V0KFtcImFuZHJvaWRcIiwgXCJpb3NcIl0pXG5cbi8qKlxuICogVmFsaWRhdGVzIGFuZCBwcmVwYXJlcyBhIGNvbXBsZXRlIHNlbWFudGljIHByb2dyYW0gZm9yIGEgbm9uLXRleHQgYmFja2VuZCB3aXRob3V0IGFsbG9jYXRpbmcgYSB3cml0ZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBCYWNrZW5kIHByZWZsaWdodCByZXF1ZXN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBpbnB1dC5iYWNrZW5kTGFuZ3VhZ2UgLSBFeGlzdGluZyBzZW1hbnRpYyBiYWNrZW5kIHByb2ZpbGUgdG8gZW5mb3JjZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmFja2VuZExhbmd1YWdlfSBpbnB1dC5kaWFnbm9zdGljTGFuZ3VhZ2UgLSBQdWJsaWMgdGFyZ2V0IGlkZW50aXR5IGZvciBjYXBhYmlsaXR5IGZhaWx1cmVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IGlucHV0LnByb2dyYW0gLSBDb21wbGV0ZSBjYW5kaWRhdGUgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8U2V0PGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2U+Pn0gW2lucHV0LnNvdXJjZUxhbmd1YWdlc10gLSBBY2NlcHRlZCBzb3VyY2UgcHJvdmVuYW5jZSBsYW5ndWFnZXMuXG4gKiBAcmV0dXJucyB7e21vZHVsZXM6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlW10sIHByb2dyYW06IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbSwgc291cmNlczoge2NvbnRlbnQ6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfX0gUHJlcGFyZWQgaW1tdXRhYmxlLWlucHV0IHZpZXdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlZmxpZ2h0U2VtYW50aWNQcm9ncmFtKHtiYWNrZW5kTGFuZ3VhZ2UsIGRpYWdub3N0aWNMYW5ndWFnZSwgcHJvZ3JhbTogY2FuZGlkYXRlLCBzb3VyY2VMYW5ndWFnZXN9KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IHZhbGlkYXRlUHJvZ3JhbShjYW5kaWRhdGUsIGJhY2tlbmRMYW5ndWFnZSwgc291cmNlTGFuZ3VhZ2VzKVxuICAgIGNvbnN0IG1vZHVsZXMgPSBwcmVwYXJlRW1pc3Npb25Nb2R1bGVzKHByb2dyYW0sIGJhY2tlbmRMYW5ndWFnZSlcblxuICAgIHZhbGlkYXRlUHJvZ3JhbVNvdXJjZU93bmVyc2hpcChwcm9ncmFtLCBiYWNrZW5kTGFuZ3VhZ2UpXG4gICAgY29uc3Qgc291cmNlcyA9IHByb2dyYW0uc291cmNlcy5tYXAoKHNvdXJjZSkgPT4ge1xuICAgICAgaWYgKHNvdXJjZS5jb250ZW50ID09PSBudWxsKSBpbnZhbGlkUHJvZ3JhbUdlbmVyYXRpb24oYFByb2dyYW0gc291cmNlICcke3NvdXJjZS5maWxlbmFtZX0nIGhhcyBubyByZXRhaW5lZCBjb250ZW50LmApXG5cbiAgICAgIHJldHVybiB7Y29udGVudDogc291cmNlLmNvbnRlbnQsIGZpbGVuYW1lOiBzb3VyY2UuZmlsZW5hbWUsIC4uLihzb3VyY2UubGFuZ3VhZ2UgPyB7bGFuZ3VhZ2U6IHNvdXJjZS5sYW5ndWFnZX0gOiB7fSl9XG4gICAgfSlcblxuICAgIHJldHVybiB7bW9kdWxlcywgcHJvZ3JhbSwgc291cmNlc31cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZW1hbnRpZm9sZERpYWdub3N0aWMgJiYgZXJyb3IuY29kZSA9PSBcIlVOU1VQUE9SVEVEX0NBUEFCSUxJVFlcIiAmJlxuICAgICAgZXJyb3IubGFuZ3VhZ2UgIT0gZGlhZ25vc3RpY0xhbmd1YWdlKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICBjb2RlOiBlcnJvci5jb2RlLFxuICAgICAgICBsYW5ndWFnZTogZGlhZ25vc3RpY0xhbmd1YWdlLFxuICAgICAgICBsb2NhdGlvbjogZXJyb3IubG9jYXRpb24sXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLmRldGFpbFxuICAgICAgfSlcbiAgICB9XG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGNvbXBsZXRlIGRldGVybWluaXN0aWMgbWFwcGVkIGFydGlmYWN0IHNldCBmb3Igb25lIHNlbWFudGljIHByb2dyYW0uXG4gKiBAcGFyYW0ge29iamVjdH0gaW5wdXQgLSBQcm9ncmFtIGdlbmVyYXRpb24gcmVxdWVzdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmFja2VuZExhbmd1YWdlfSBpbnB1dC5sYW5ndWFnZSAtIFJlZ2lzdGVyZWQgcHJvZ3JhbSB0YXJnZXQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gaW5wdXQucHJvZ3JhbSAtIENvbXBsZXRlIHNlbWFudGljIHByb2dyYW0uXG4gKiBAcGFyYW0ge1widGV4dFwiIHwgXCJhcHBsaWNhdGlvblwifSBbaW5wdXQucm9sZV0gLSBFeHBsaWNpdCBhcnRpZmFjdCByb2xlOyBvbWl0dGVkIHByZXNlcnZlcyB0ZXh0IGdlbmVyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLklvc0FwcGxpY2F0aW9uQ29uZmlndXJhdGlvbklucHV0IHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQW5kcm9pZEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbklucHV0fSBbaW5wdXQuY29uZmlndXJhdGlvbl0gLSBBcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Jb3NBcHBsaWNhdGlvbkFzc2V0SW5wdXRbXSB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkFuZHJvaWRBcHBsaWNhdGlvbklucHV0RmlsZVtdfSBbaW5wdXQuYXNzZXRzXSAtIEV4YWN0IGNhbGxlciBhc3NldHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkFuZHJvaWRBcHBsaWNhdGlvbklucHV0RmlsZVtdfSBbaW5wdXQucmVzb3VyY2VzXSAtIEV4YWN0IEFuZHJvaWQgY2FsbGVyIHJlc291cmNlcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRBcnRpZmFjdFNldH0gVHJhbnNhY3Rpb25hbGx5IHZhbGlkYXRlZCBhcnRpZmFjdCBzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVByb2dyYW1BcnRpZmFjdHMoaW5wdXQpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KGlucHV0KSB8fCB0eXBlb2YgaW5wdXQubGFuZ3VhZ2UgIT0gXCJzdHJpbmdcIikgaW52YWxpZFByb2dyYW1HZW5lcmF0aW9uKFwiUHJvZ3JhbSBnZW5lcmF0aW9uIHJlcXVpcmVzIGEgdGFyZ2V0IGxhbmd1YWdlIGFuZCBwcm9ncmFtLlwiKVxuICBjb25zdCByb2xlID0gaW5wdXQucm9sZSA/PyBcInRleHRcIlxuXG4gIGlmIChyb2xlICE9IFwidGV4dFwiICYmIHJvbGUgIT0gXCJhcHBsaWNhdGlvblwiKSBpbnZhbGlkUHJvZ3JhbUdlbmVyYXRpb24oXCJQcm9ncmFtIGFydGlmYWN0IHJvbGUgbXVzdCBiZSAndGV4dCcgb3IgJ2FwcGxpY2F0aW9uJy5cIilcbiAgbGFuZ3VhZ2VSZWdpc3RyeS5yZWNvcmQoaW5wdXQubGFuZ3VhZ2UpXG4gIGlmIChyb2xlID09IFwiYXBwbGljYXRpb25cIikge1xuICAgIGlmICghcHJvZ3JhbUFwcGxpY2F0aW9uVGFyZ2V0cy5oYXMoaW5wdXQubGFuZ3VhZ2UpKSB1bnN1cHBvcnRlZFJvbGUoaW5wdXQubGFuZ3VhZ2UsIFwibXVsdGktZmlsZSBhcHBsaWNhdGlvbiBiYWNrZW5kXCIpXG4gICAgY29uc3QgYmFja2VuZCA9IGxhbmd1YWdlUmVnaXN0cnkucmVzb2x2ZShpbnB1dC5sYW5ndWFnZSwgXCJhcHBsaWNhdGlvbkJhY2tlbmRcIilcblxuICAgIHJldHVybiBjcmVhdGVHZW5lcmF0ZWRBcnRpZmFjdFNldChiYWNrZW5kKGlucHV0KSlcbiAgfVxuICBpZiAoIXByb2dyYW1UYXJnZXRzLmhhcygvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9ICovIChpbnB1dC5sYW5ndWFnZSkpKSB7XG4gICAgdW5zdXBwb3J0ZWRSb2xlKGlucHV0Lmxhbmd1YWdlLCBcIm11bHRpLWZpbGUgdGV4dCBiYWNrZW5kXCIpXG4gIH1cbiAgY29uc3QgbGFuZ3VhZ2UgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9ICovIChpbnB1dC5sYW5ndWFnZSlcbiAgY29uc3QgcHJvZ3JhbSA9IHZhbGlkYXRlUHJvZ3JhbShpbnB1dC5wcm9ncmFtLCBsYW5ndWFnZSlcbiAgY29uc3QgbGlua2luZyA9IHBsYW5TdGRsaWJMaW5raW5nKHByb2dyYW0sIGxhbmd1YWdlKVxuICBjb25zdCBlbWlzc2lvbk1vZHVsZXMgPSBwcmVwYXJlRW1pc3Npb25Nb2R1bGVzKHByb2dyYW0sIGxhbmd1YWdlLCBsaW5raW5nKVxuICB2YWxpZGF0ZVByb2dyYW1Tb3VyY2VPd25lcnNoaXAocHJvZ3JhbSwgbGFuZ3VhZ2UpXG4gIGNvbnN0IHBhdGhzID0gcGxhbk1vZHVsZVBhdGhzKHByb2dyYW0sIGxhbmd1YWdlLCBsaW5raW5nKVxuICBjb25zdCBzb3VyY2VzID0gcHJvZ3JhbS5zb3VyY2VzLm1hcCgoc291cmNlKSA9PiB7XG4gICAgaWYgKHNvdXJjZS5jb250ZW50ID09PSBudWxsKSBpbnZhbGlkUHJvZ3JhbUdlbmVyYXRpb24oYFByb2dyYW0gc291cmNlICcke3NvdXJjZS5maWxlbmFtZX0nIGhhcyBubyByZXRhaW5lZCBjb250ZW50LmApXG5cbiAgICByZXR1cm4ge2NvbnRlbnQ6IHNvdXJjZS5jb250ZW50LCBmaWxlbmFtZTogc291cmNlLmZpbGVuYW1lLCAuLi4oc291cmNlLmxhbmd1YWdlID8ge2xhbmd1YWdlOiBzb3VyY2UubGFuZ3VhZ2V9IDoge30pfVxuICB9KVxuICBjb25zdCBiYWNrZW5kID0gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9qYXZhc2NyaXB0LmpzXCIpLmdlbmVyYXRlSmF2YVNjcmlwdH0gKi8gKFxuICAgIGxhbmd1YWdlUmVnaXN0cnkucmVzb2x2ZShsYW5ndWFnZSwgXCJ0ZXh0QmFja2VuZFwiKSlcbiAgY29uc3QgbWVkaWFUeXBlID0gbGFuZ3VhZ2VSZWdpc3RyeS5yZWNvcmQobGFuZ3VhZ2UpLm1lZGlhVHlwZVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZFNldEFydGlmYWN0W119ICovXG4gIGNvbnN0IGFydGlmYWN0cyA9IGxhbmd1YWdlID09IFwiamF2YXNjcmlwdFwiIHx8IGxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiID8gW3tcbiAgICBjb250ZW50OiBcIntcXG4gIFxcXCJ0eXBlXFxcIjogXFxcIm1vZHVsZVxcXCJcXG59XFxuXCIsXG4gICAgY29udGVudEtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInRleHRcIiksXG4gICAgbWVkaWFUeXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICBvd25lcnNoaXA6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImdlbmVyYXRlZFwiKSxcbiAgICBwYXRoOiBcInBhY2thZ2UuanNvblwiLFxuICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN5bnRoZXRpY1wiKSxcbiAgICAgIHJlYXNvbjogXCJEZWNsYXJlcyB0aGUgZ2VuZXJhdGVkIEphdmFTY3JpcHQtZmFtaWx5IGFydGlmYWN0IHNldCBhcyBjYW5vbmljYWwgRVNNLlwiLFxuICAgICAgcmVsYXRlZE9yaWdpbnM6IFtdXG4gICAgfSxcbiAgICByb2xlOiBcIm1hbmlmZXN0XCJcbiAgfV0gOiBbXVxuXG4gIGlmIChsaW5raW5nICYmIGxhbmd1YWdlICE9IFwiamF2YVwiKSB7XG4gICAgZm9yIChjb25zdCBwcm92aWRlciBvZiBsaW5raW5nLm5lZ290aWF0aW9uLnByb3ZpZGVycykge1xuICAgICAgY29uc3QgcmVjb3JkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zdGRsaWItcHJvdmlkZXJzLmpzXCIpLlN0ZGxpYlByb3ZpZGVyUmVjb3JkfSAqLyAobGlua2luZy5yZWNvcmRzLmdldChwcm92aWRlci5tb2R1bGUpKVxuXG4gICAgICBhcnRpZmFjdHMucHVzaCh7XG4gICAgICAgIGNvbnRlbnQ6IGdlbmVyYXRlU3RkbGliUHJvdmlkZXJDb250ZW50KC8qKiBAdHlwZSB7XCJwaHBcIiB8IFwicnVieVwiIHwgXCJqYXZhc2NyaXB0XCIgfCBcInR5cGVzY3JpcHRcIn0gKi8gKGxhbmd1YWdlKSxcbiAgICAgICAgICBbLi4ucHJvdmlkZXIub3BlcmF0aW9uc10sIHByb3ZpZGVyLm1vZHVsZSksXG4gICAgICAgIGNvbnRlbnRLaW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJ0ZXh0XCIpLFxuICAgICAgICBtZWRpYVR5cGU6IHJlY29yZC5hcnRpZmFjdC5tZWRpYVR5cGUsXG4gICAgICAgIG93bmVyc2hpcDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiZ2VuZXJhdGVkXCIpLFxuICAgICAgICBwYXRoOiByZWNvcmQuYXJ0aWZhY3QucGF0aCxcbiAgICAgICAgcHJvdmVuYW5jZToge1xuICAgICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN5bnRoZXRpY1wiKSxcbiAgICAgICAgICByZWFzb246IGBzZW1hbnRpZm9sZC1zdGRsaWItcHJvdmlkZXI6JHtyZWNvcmQuaWRlbnRpdHl9YCxcbiAgICAgICAgICByZWxhdGVkT3JpZ2luczogW11cbiAgICAgICAgfSxcbiAgICAgICAgcm9sZTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwic3VwcG9ydFwiKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGVtaXNzaW9uTW9kdWxlIG9mIGVtaXNzaW9uTW9kdWxlcykge1xuICAgIGNvbnN0IG1vZHVsZUlkID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChSZWZsZWN0LmdldChlbWlzc2lvbk1vZHVsZSwgXCJpZFwiKSlcbiAgICBjb25zdCBmaWxlbmFtZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGF0aHMuZ2V0KG1vZHVsZUlkKSlcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgbGFuZ3VhZ2UsXG4gICAgICBtb2R1bGU6IGVtaXNzaW9uTW9kdWxlLFxuICAgICAgcHJvZ3JhbSxcbiAgICAgIHByb2dyYW1QYXRoczogcGF0aHMsXG4gICAgICBzb3VyY2VzLFxuICAgICAgLi4uKGxpbmtpbmcgJiYgZW1pc3Npb25Nb2R1bGUuY2FwYWJpbGl0aWVzICE9PSB1bmRlZmluZWQgPyB7XG4gICAgICAgIHN0ZGxpYlByb3ZpZGVyRW50cmllczogT2JqZWN0LmZyb21FbnRyaWVzKChsaW5raW5nLnVzZWRPcGVyYXRpb25zQnlNb2R1bGUuZ2V0KG1vZHVsZUlkKSA/PyBbXSkubWFwKCh7bW9kdWxlLCBvcGVyYXRpb259KSA9PiBbXG4gICAgICAgICAgcXVhbGlmaWVkT3BlcmF0aW9uS2V5KG1vZHVsZSwgb3BlcmF0aW9uKSxcbiAgICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8gKGxpbmtpbmcucmVjb3Jkcy5nZXQobW9kdWxlKT8ubmF0aXZlRW50cmllc1tvcGVyYXRpb25dKVxuICAgICAgICBdKSksXG4gICAgICAgIHN0ZGxpYlByb3ZpZGVySW1wb3J0czogbGFuZ3VhZ2UgPT0gXCJqYXZhXCIgfHwgbGFuZ3VhZ2UgPT0gXCJqYXZhc2NyaXB0XCIgfHwgbGFuZ3VhZ2UgPT0gXCJ0eXBlc2NyaXB0XCIgP1xuICAgICAgICAgIGxpbmtpbmcucHJvdmlkZXJJbXBvcnRzQnlNb2R1bGUuZ2V0KG1vZHVsZUlkKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RkbGliUHJvdmlkZXJQYXRoczogbGlua2luZy5wcm92aWRlclBhdGhzQnlNb2R1bGUuZ2V0KG1vZHVsZUlkKSxcbiAgICAgICAgLi4uKGxhbmd1YWdlID09IFwiamF2YVwiID8ge1xuICAgICAgICAgIHN0ZGxpYlByb3ZpZGVyT3duZXJNb2R1bGU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobGlua2luZy5vd25lck1vZHVsZUlkKSxcbiAgICAgICAgICBzdGRsaWJQcm92aWRlclNoaW1zOiBtb2R1bGVJZCA9PSBsaW5raW5nLm93bmVyTW9kdWxlSWQgPyBsaW5raW5nLnVzZWRPcGVyYXRpb25zLm1hcCgoe29wZXJhdGlvbn0pID0+IG9wZXJhdGlvbikgOiB1bmRlZmluZWRcbiAgICAgICAgfSA6IHt9KVxuICAgICAgfSA6IHt9KVxuICAgIH0pXG5cbiAgICBiYWNrZW5kKGVtaXNzaW9uTW9kdWxlLCB3cml0ZXIpXG4gICAgY29uc3QgbWFwcGluZyA9IGZpbmFsaXplTWFwcGluZyh3cml0ZXIuZmluaXNoKCkpXG5cbiAgICBhcnRpZmFjdHMucHVzaCh7XG4gICAgICBjb250ZW50OiBtYXBwaW5nLmdlbmVyYXRlZC5jb250ZW50LFxuICAgICAgY29udGVudEtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInRleHRcIiksXG4gICAgICBtZWRpYVR5cGU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobWVkaWFUeXBlKSxcbiAgICAgIG93bmVyc2hpcDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiZ2VuZXJhdGVkXCIpLFxuICAgICAgcGF0aDogZmlsZW5hbWUsXG4gICAgICBwcm92ZW5hbmNlOiB7XG4gICAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInRleHRcIiksXG4gICAgICAgIG1hcHBpbmcsXG4gICAgICAgIHNvdXJjZU1hcDogdG9Tb3VyY2VNYXBWMyhtYXBwaW5nKSxcbiAgICAgICAgc291cmNlTWFwRmlsZW5hbWU6IGAke2ZpbGVuYW1lfS5tYXBgXG4gICAgICB9LFxuICAgICAgcm9sZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRBcnRpZmFjdFJvbGV9ICovIChcbiAgICAgICAgbW9kdWxlSWQgPT0gcHJvZ3JhbS5lbnRyeU1vZHVsZSA/IFwiZW50cnlcIiA6IFJlZmxlY3QuZ2V0KGVtaXNzaW9uTW9kdWxlLCBcInN0ZGxpYkZhY2FkZVwiKSA/IFwic3VwcG9ydFwiIDogXCJzb3VyY2VcIilcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUdlbmVyYXRlZEFydGlmYWN0U2V0KHtcbiAgICBhcnRpZmFjdHMsXG4gICAgLi4uKGxpbmtpbmcgfHwgcHJvZ3JhbS5zdGRsaWJGYWNhZGVzID8ge21ldGFkYXRhOiBzdGRsaWJMaW5rTWV0YWRhdGEobGlua2luZywgcGF0aHMsIHByb2dyYW0uc3RkbGliRmFjYWRlcyl9IDoge30pLFxuICAgIHRhcmdldDogbGFuZ3VhZ2VcbiAgfSlcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJQcm9ncmFtTGlua2luZ1xuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9zdGRsaWItbmVnb3RpYXRpb24uanNcIikuU3RkbGliTmVnb3RpYXRpb25SZXN1bHR9IG5lZ290aWF0aW9uIC0gTmVnb3RpYXRlZCBwcm92aWRlciBjbG9zdXJlLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zdGRsaWItcHJvdmlkZXJzLmpzXCIpLlN0ZGxpYlByb3ZpZGVyUmVjb3JkPn0gcmVjb3JkcyAtIE1hdGVyaWFsaXplZCBwcm92aWRlciByZWNvcmRzIGJ5IGNhbm9uaWNhbCBtb2R1bGUuXG4gKiBAcHJvcGVydHkge1F1YWxpZmllZFN0ZGxpYk9wZXJhdGlvbltdfSB1c2VkT3BlcmF0aW9ucyAtIFByb2dyYW0td2lkZSB1c2VkIGNhbm9uaWNhbCBvcGVyYXRpb25zIGluIHN0YWJsZSBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgUXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uW10+fSB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlIC0gVXNlZCBjYW5vbmljYWwgb3BlcmF0aW9ucyBieSBwcm9ncmFtIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgc3RyaW5nW10+fSBwcm92aWRlckltcG9ydHNCeU1vZHVsZSAtIE9yZGVyZWQgcHJvdmlkZXIgaW1wb3J0IG5hbWVzIGJ5IG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgc3RyaW5nW10+fSBwcm92aWRlclBhdGhzQnlNb2R1bGUgLSBQcm92aWRlciBhcnRpZmFjdCBjbG9zdXJlIGJ5IHByb2dyYW0gbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBvd25lck1vZHVsZUlkIC0gSmF2YSB0YXJnZXQ6IGZpcnN0IG9wZXJhdGlvbi11c2luZyBtb2R1bGUgaWRlbnRpdHkgaG9zdGluZyB0aGUgc2hhcmVkIHN1cHBvcnQ7IG51bGwgZm9yIGFydGlmYWN0LW1hdGVyaWFsaXppbmcgdGFyZ2V0cy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFF1YWxpZmllZFN0ZGxpYk9wZXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZSAtIENhbm9uaWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gQ2Fub25pY2FsIG9wZXJhdGlvbiBuYW1lLlxuICovXG5cbi8qKlxuICogUGxhbnMgdGhlIGxpbmtlZCBzdGRsaWIgcHJvdmlkZXIgZm9yIG9uZSBwcm9ncmFtLCBvciByZXBvcnRzIHRoYXQgbm8gb3BlcmF0aW9uIGlzIHVzZWQuXG4gKiBKYXZhIHJlc29sdmVzIHRoZSBzYW1lIG5lZ290aWF0ZWQgcHJvdmlkZXIgcmVjb3JkIGJ1dCBob3N0cyBpdHMgc3VwcG9ydCBpbiB0aGUgZmlyc3RcbiAqIG9wZXJhdGlvbi11c2luZyBtb2R1bGUgaW5zdGVhZCBvZiBhIHNlcGFyYXRlIHByb3ZpZGVyIGFydGlmYWN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBWYWxpZGF0ZWQgc2VtYW50aWMgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcmV0dXJucyB7U3RkbGliUHJvZ3JhbUxpbmtpbmcgfCBudWxsfSBMaW5raW5nIHBsYW4sIG9yIG51bGwgd2hlbiBub3RoaW5nIGlzIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIHBsYW5TdGRsaWJMaW5raW5nKHByb2dyYW0sIGxhbmd1YWdlKSB7XG4gIGNvbnN0IHtwcm9ncmFtV2lkZSwgdXNlZE9wZXJhdGlvbnNCeU1vZHVsZX0gPSBjb2xsZWN0VXNlZEVmZmVjdE9wZXJhdGlvbnMocHJvZ3JhbSlcblxuICBpZiAocHJvZ3JhbVdpZGUubGVuZ3RoID09IDApIHJldHVybiBudWxsXG4gIGNvbnN0IGNvbnRyYWN0cyA9IHByb2dyYW0uc3RkbGliQ29udHJhY3RzID8/IFsvKiogQHR5cGUge3tpZGVudGl0eTogc3RyaW5nLCBjb250cmFjdFZlcnNpb24/OiBzdHJpbmd9fSAqLyAocHJvZ3JhbS5zdGRsaWJDb250cmFjdCldXG4gIGNvbnN0IGNvbnRyYWN0c0J5SWRlbnRpdHkgPSBuZXcgTWFwKGNvbnRyYWN0cy5tYXAoKGNvbnRyYWN0KSA9PiBbY29udHJhY3QuaWRlbnRpdHksIGNvbnRyYWN0XSkpXG4gIGNvbnN0IHJlcXVpcmVtZW50c0J5TW9kdWxlID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBxdWFsaWZpZWQgb2YgcHJvZ3JhbVdpZGUpIHtcbiAgICBjb25zdCByZXF1aXJlbWVudCA9IHJlcXVpcmVtZW50c0J5TW9kdWxlLmdldChxdWFsaWZpZWQubW9kdWxlKSA/PyBbXVxuXG4gICAgcmVxdWlyZW1lbnQucHVzaChxdWFsaWZpZWQub3BlcmF0aW9uKVxuICAgIHJlcXVpcmVtZW50c0J5TW9kdWxlLnNldChxdWFsaWZpZWQubW9kdWxlLCByZXF1aXJlbWVudClcbiAgfVxuICBjb25zdCBuZWdvdGlhdGlvbiA9IG5lZ290aWF0ZVN0ZGxpYlByb3ZpZGVycyh7XG4gICAgcmVxdWlyZW1lbnRzOiBbLi4ucmVxdWlyZW1lbnRzQnlNb2R1bGVdLm1hcCgoW21vZHVsZSwgb3BlcmF0aW9uc10pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyYWN0ID0gY29udHJhY3RzQnlJZGVudGl0eS5nZXQobW9kdWxlKVxuXG4gICAgICBpZiAoIWNvbnRyYWN0KSB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgY29kZTogXCJTVERMSUJfTElOS19GQUlMVVJFXCIsXG4gICAgICAgIGxhbmd1YWdlLFxuICAgICAgICBtZXNzYWdlOiBgUmVhY2hhYmxlIGNhbm9uaWNhbCBvcGVyYXRpb24gJyR7bW9kdWxlfS4ke29wZXJhdGlvbnNbMF19JyBoYXMgbm8gZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdC5gXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHttb2R1bGUsIG9wZXJhdGlvbnMsIC4uLihjb250cmFjdC5jb250cmFjdFZlcnNpb24gIT09IHVuZGVmaW5lZCA/IHtyYW5nZTogY29udHJhY3QuY29udHJhY3RWZXJzaW9ufSA6IHt9KX1cbiAgICB9KSxcbiAgICB0YXJnZXQ6IGxhbmd1YWdlXG4gIH0pXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc3RkbGliLXByb3ZpZGVycy5qc1wiKS5TdGRsaWJQcm92aWRlclJlY29yZD59ICovXG4gIGNvbnN0IHJlY29yZHMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IHNlbGVjdGVkIG9mIG5lZ290aWF0aW9uLm1vZHVsZXMpIHtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gc3RkbGliUHJvdmlkZXJSZWdpc3RyeS5wcm92aWRlcnNGb3IobGFuZ3VhZ2UsIHNlbGVjdGVkLmlkZW50aXR5LCBzZWxlY3RlZC52ZXJzaW9uKVxuXG4gICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoICE9IDEpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCBleGFjdGx5IG9uZSByZWdpc3RlcmVkIHN0ZGxpYiBwcm92aWRlciBmb3IgJyR7c2VsZWN0ZWQuaWRlbnRpdHl9JyBvbiAnJHtsYW5ndWFnZX0nLmBcbiAgICAgIH0pXG4gICAgfVxuICAgIHJlY29yZHMuc2V0KHNlbGVjdGVkLmlkZW50aXR5LCAvKiogQHR5cGUge2ltcG9ydChcIi4uL3N0ZGxpYi1wcm92aWRlcnMuanNcIikuU3RkbGliUHJvdmlkZXJSZWNvcmR9ICovIChjYW5kaWRhdGVzWzBdKSlcbiAgfVxuICBjb25zdCBvd25lck1vZHVsZUlkID0gbGFuZ3VhZ2UgPT0gXCJqYXZhXCJcbiAgICA/IHByb2dyYW0ubW9kdWxlcy5tYXAoKG1vZHVsZSkgPT4gbW9kdWxlLmlkKS5maW5kKChpZCkgPT4gKHVzZWRPcGVyYXRpb25zQnlNb2R1bGUuZ2V0KGlkKSA/PyBbXSkubGVuZ3RoID4gMClcbiAgICA6IG51bGxcblxuICBpZiAob3duZXJNb2R1bGVJZCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICBsYW5ndWFnZSxcbiAgICBtZXNzYWdlOiBcIkphdmEgcHJvZ3JhbSBsaW5raW5nIHJlcXVpcmVzIG9uZSBtb2R1bGUgdXNpbmcgY2Fub25pY2FsIG9wZXJhdGlvbnMuXCJcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIG5lZ290aWF0aW9uLFxuICAgIG93bmVyTW9kdWxlSWQsXG4gICAgcHJvdmlkZXJJbXBvcnRzQnlNb2R1bGU6IGNvbGxlY3RQcm92aWRlckltcG9ydHMocHJvZ3JhbSwgbmVnb3RpYXRpb24sIHJlY29yZHMsIHVzZWRPcGVyYXRpb25zQnlNb2R1bGUsIGxhbmd1YWdlLCBvd25lck1vZHVsZUlkKSxcbiAgICBwcm92aWRlclBhdGhzQnlNb2R1bGU6IGNvbGxlY3RQcm92aWRlclBhdGhzKG5lZ290aWF0aW9uLCByZWNvcmRzLCB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlKSxcbiAgICByZWNvcmRzLFxuICAgIHVzZWRPcGVyYXRpb25zOiBbLi4ucHJvZ3JhbVdpZGVdLFxuICAgIHVzZWRPcGVyYXRpb25zQnlNb2R1bGVcbiAgfVxufVxuXG4vKipcbiAqIFNlbGVjdHMgdGhlIGV4YWN0IHByb3ZpZGVyL3R5cGUgZGVwZW5kZW5jeSBjbG9zdXJlIHJlcXVpcmVkIGJ5IGVhY2ggZW1pdHRpbmcgcHJvZ3JhbSBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3N0ZGxpYi1uZWdvdGlhdGlvbi5qc1wiKS5TdGRsaWJOZWdvdGlhdGlvblJlc3VsdH0gbmVnb3RpYXRpb24gLSBOZWdvdGlhdGVkIHByb2dyYW0gY2xvc3VyZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc3RkbGliLXByb3ZpZGVycy5qc1wiKS5TdGRsaWJQcm92aWRlclJlY29yZD59IHJlY29yZHMgLSBTZWxlY3RlZCBwcm92aWRlciByZWNvcmRzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBRdWFsaWZpZWRTdGRsaWJPcGVyYXRpb25bXT59IHVzZWRPcGVyYXRpb25zQnlNb2R1bGUgLSBSZWFjaGFibGUgb3BlcmF0aW9ucyBieSBwcm9ncmFtIG1vZHVsZS5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBzdHJpbmdbXT59IE9yZGVyZWQgcHJvdmlkZXIgcGF0aHMgYnkgcHJvZ3JhbSBtb2R1bGUuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQcm92aWRlclBhdGhzKG5lZ290aWF0aW9uLCByZWNvcmRzLCB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlKSB7XG4gIGNvbnN0IHBhdGhzID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBbbW9kdWxlSWQsIG9wZXJhdGlvbnNdIG9mIHVzZWRPcGVyYXRpb25zQnlNb2R1bGUpIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQob3BlcmF0aW9ucy5tYXAoKHttb2R1bGV9KSA9PiBtb2R1bGUpKVxuICAgIGxldCBjaGFuZ2VkID0gdHJ1ZVxuXG4gICAgd2hpbGUgKGNoYW5nZWQpIHtcbiAgICAgIGNoYW5nZWQgPSBmYWxzZVxuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgWy4uLnNlbGVjdGVkXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgcmVjb3Jkcy5nZXQobW9kdWxlKT8uZGVwZW5kZW5jaWVzID8/IFtdKSB7XG4gICAgICAgICAgaWYgKCFzZWxlY3RlZC5oYXMoZGVwZW5kZW5jeS5tb2R1bGUpKSB7XG4gICAgICAgICAgICBzZWxlY3RlZC5hZGQoZGVwZW5kZW5jeS5tb2R1bGUpXG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwYXRocy5zZXQobW9kdWxlSWQsIG5lZ290aWF0aW9uLnByb3ZpZGVycy5maWx0ZXIoKHttb2R1bGV9KSA9PiBzZWxlY3RlZC5oYXMobW9kdWxlKSkubWFwKCh7bW9kdWxlfSkgPT5cbiAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc3RkbGliLXByb3ZpZGVycy5qc1wiKS5TdGRsaWJQcm92aWRlclJlY29yZH0gKi8gKHJlY29yZHMuZ2V0KG1vZHVsZSkpLmFydGlmYWN0LnBhdGgpKVxuICB9XG4gIHJldHVybiBwYXRoc1xufVxuXG4vKipcbiAqIENvbGxlY3RzIHRoZSBjYW5vbmljYWwgb3BlcmF0aW9ucyBpbnZva2VkIGJ5IGVhY2ggcHJvZ3JhbSBtb2R1bGUgaW4gc3RhYmxlIG9yZGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBWYWxpZGF0ZWQgc2VtYW50aWMgcHJvZ3JhbS5cbiAqIEByZXR1cm5zIHt7cHJvZ3JhbVdpZGU6IFF1YWxpZmllZFN0ZGxpYk9wZXJhdGlvbltdLCB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlOiBNYXA8c3RyaW5nLCBRdWFsaWZpZWRTdGRsaWJPcGVyYXRpb25bXT59fSBVc2VkIG9wZXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RVc2VkRWZmZWN0T3BlcmF0aW9ucyhwcm9ncmFtKSB7XG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgUXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uW10+fSAqL1xuICBjb25zdCB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgUXVhbGlmaWVkU3RkbGliT3BlcmF0aW9uPn0gKi9cbiAgY29uc3QgcHJvZ3JhbVdpZGUgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7Ym9keTogdW5rbm93biwgbW9kdWxlOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9Pn0gKi9cbiAgY29uc3QgYm9kaWVzID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgcHJvZ3JhbS5tb2R1bGVzKSB7XG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZnVuY3Rpb25zKSBib2RpZXMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCB7Ym9keTogZGVjbGFyYXRpb24uYm9keSwgbW9kdWxlfSlcbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5jbGFzc2VzID8/IFtdKSB7XG4gICAgICBib2RpZXMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uY29uc3RydWN0b3IuaWQpLCB7Ym9keTogZGVjbGFyYXRpb24uY29uc3RydWN0b3IuYm9keSwgbW9kdWxlfSlcbiAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGRlY2xhcmF0aW9uLm1ldGhvZHMpIGJvZGllcy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChtZXRob2QuaWQpLCB7Ym9keTogbWV0aG9kLmJvZHksIG1vZHVsZX0pXG4gICAgfVxuICAgIHVzZWRPcGVyYXRpb25zQnlNb2R1bGUuc2V0KG1vZHVsZS5pZCwgW10pXG4gIH1cbiAgY29uc3QgZW50cnlNb2R1bGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX0gKi8gKFxuICAgIHByb2dyYW0ubW9kdWxlcy5maW5kKCh7aWR9KSA9PiBpZCA9PSBwcm9ncmFtLmVudHJ5TW9kdWxlKSlcbiAgLyoqIEB0eXBlIHt7Ym9keTogdW5rbm93biwgbW9kdWxlOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9W119ICovXG4gIGNvbnN0IHBlbmRpbmcgPSBbe2JvZHk6IGVudHJ5TW9kdWxlLmVudHJ5UG9pbnQ/LmJvZHksIG1vZHVsZTogZW50cnlNb2R1bGV9XVxuICBjb25zdCByZWFjaGVkRGVjbGFyYXRpb25zID0gbmV3IFNldCgpXG5cbiAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSAvKiogQHR5cGUge3tib2R5OiB1bmtub3duLCBtb2R1bGU6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX19ICovIChwZW5kaW5nLnNoaWZ0KCkpXG4gICAgY29uc3Qgb3BlcmF0aW9uTmFtZXMgPSBuZXcgTWFwKGN1cnJlbnQubW9kdWxlLmNhcGFiaWxpdGllcz8uZmxhdE1hcCgoY2FwYWJpbGl0eSkgPT5cbiAgICAgIGNhcGFiaWxpdHkub3BlcmF0aW9ucy5tYXAoKG9wZXJhdGlvbikgPT4gW29wZXJhdGlvbi5pZCwge21vZHVsZTogY2FwYWJpbGl0eS5hdXRob3JpdHlJZCwgb3BlcmF0aW9uOiBvcGVyYXRpb24ubmFtZX1dKSkgPz8gW10pXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuXG4gICAgLyoqXG4gICAgICogVmlzaXRzIG9uZSByZWFjaGFibGUgc2VtYW50aWMgc3VidHJlZS5cbiAgICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHN1YnRyZWUuXG4gICAgICovXG4gICAgY29uc3QgdmlzaXQgPSAodmFsdWUpID0+IHtcbiAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXModmFsdWUpKSByZXR1cm5cbiAgICAgIHNlZW4uYWRkKHZhbHVlKVxuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGtpbmQgPSBSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpXG5cbiAgICAgICAgaWYgKGtpbmQgPT0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gUmVmbGVjdC5nZXQodmFsdWUsIFwib3BlcmF0aW9uXCIpXG5cbiAgICAgICAgICBpZiAodHlwZW9mIG9wZXJhdGlvbiA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBxdWFsaWZpZWQgPSBvcGVyYXRpb25OYW1lcy5nZXQob3BlcmF0aW9uKVxuXG4gICAgICAgICAgICBpZiAocXVhbGlmaWVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY29uc3Qga2V5ID0gcXVhbGlmaWVkT3BlcmF0aW9uS2V5KHF1YWxpZmllZC5tb2R1bGUsIHF1YWxpZmllZC5vcGVyYXRpb24pXG4gICAgICAgICAgICAgIGNvbnN0IG1vZHVsZU9wZXJhdGlvbnMgPSAvKiogQHR5cGUge1F1YWxpZmllZFN0ZGxpYk9wZXJhdGlvbltdfSAqLyAodXNlZE9wZXJhdGlvbnNCeU1vZHVsZS5nZXQoY3VycmVudC5tb2R1bGUuaWQpKVxuXG4gICAgICAgICAgICAgIGlmICghbW9kdWxlT3BlcmF0aW9ucy5zb21lKChpdGVtKSA9PiBxdWFsaWZpZWRPcGVyYXRpb25LZXkoaXRlbS5tb2R1bGUsIGl0ZW0ub3BlcmF0aW9uKSA9PSBrZXkpKSBtb2R1bGVPcGVyYXRpb25zLnB1c2gocXVhbGlmaWVkKVxuICAgICAgICAgICAgICBwcm9ncmFtV2lkZS5zZXQoa2V5LCBxdWFsaWZpZWQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uSWQgPSBpc1BsYWluT2JqZWN0KFJlZmxlY3QuZ2V0KHZhbHVlLCBcInJlc29sdXRpb25cIikpXG4gICAgICAgICAgPyBSZWZsZWN0LmdldChSZWZsZWN0LmdldCh2YWx1ZSwgXCJyZXNvbHV0aW9uXCIpLCBcImRlY2xhcmF0aW9uSWRcIikgOiB1bmRlZmluZWRcblxuICAgICAgICBpZiAodHlwZW9mIGRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIiAmJiAhcmVhY2hlZERlY2xhcmF0aW9ucy5oYXMoZGVjbGFyYXRpb25JZCkpIHtcbiAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGJvZGllcy5nZXQoZGVjbGFyYXRpb25JZClcblxuICAgICAgICAgIGlmIChkZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgcmVhY2hlZERlY2xhcmF0aW9ucy5hZGQoZGVjbGFyYXRpb25JZClcbiAgICAgICAgICAgIHBlbmRpbmcucHVzaChkZWNsYXJhdGlvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgaWYgKFtcImNhcGFiaWxpdGllc1wiLCBcImxvY2F0aW9uXCIsIFwicHJvdmVuYW5jZVwiLCBcInJlc29sdXRpb25cIiwgXCJzb3VyY2VQcm92ZW5hbmNlXCJdLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlXG4gICAgICAgICAgdmlzaXQoY2hpbGQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBmb3IgKGNvbnN0IGNoaWxkIG9mIHZhbHVlKSB2aXNpdChjaGlsZClcbiAgICB9XG5cbiAgICB2aXNpdChjdXJyZW50LmJvZHkpXG4gIH1cbiAgZm9yIChjb25zdCBvcGVyYXRpb25zIG9mIHVzZWRPcGVyYXRpb25zQnlNb2R1bGUudmFsdWVzKCkpIHtcbiAgICBvcGVyYXRpb25zLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBxdWFsaWZpZWRPcGVyYXRpb25LZXkobGVmdC5tb2R1bGUsIGxlZnQub3BlcmF0aW9uKVxuICAgICAgLmxvY2FsZUNvbXBhcmUocXVhbGlmaWVkT3BlcmF0aW9uS2V5KHJpZ2h0Lm1vZHVsZSwgcmlnaHQub3BlcmF0aW9uKSwgXCJlblwiKSlcbiAgfVxuICByZXR1cm4ge3Byb2dyYW1XaWRlOiBbLi4ucHJvZ3JhbVdpZGUudmFsdWVzKCldLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBxdWFsaWZpZWRPcGVyYXRpb25LZXkobGVmdC5tb2R1bGUsIGxlZnQub3BlcmF0aW9uKVxuICAgIC5sb2NhbGVDb21wYXJlKHF1YWxpZmllZE9wZXJhdGlvbktleShyaWdodC5tb2R1bGUsIHJpZ2h0Lm9wZXJhdGlvbiksIFwiZW5cIikpLCB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhbiB1bmFtYmlndW91cyBpbnRlcm5hbCBrZXkgZm9yIG9uZSBjYW5vbmljYWwgb3BlcmF0aW9uIGF1dGhvcml0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGUgLSBDYW5vbmljYWwgbW9kdWxlIGlkZW50aXR5LlxuICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdGlvbiAtIENhbm9uaWNhbCBvcGVyYXRpb24gbmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFF1YWxpZmllZCBpbnRlcm5hbCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHF1YWxpZmllZE9wZXJhdGlvbktleShtb2R1bGUsIG9wZXJhdGlvbikge1xuICByZXR1cm4gYCR7bW9kdWxlfVxcdTAwMDAke29wZXJhdGlvbn1gXG59XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIG9yZGVyZWQgcHJvdmlkZXIgaW1wb3J0IG5hbWVzIGVhY2ggbW9kdWxlIG11c3QgcHVsbCBmcm9tIHRoZSBsaW5rZWQgcHJvdmlkZXIuXG4gKiBKYXZhIG1vZHVsZXMgbGlzdCByZWZlcmVuY2VkIGNhcGFiaWxpdHkgdHlwZSBuYW1lcyBvbmx5OyB0aGUgb3duZXIgbGlzdHMgbm9uZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBwcm9ncmFtIC0gVmFsaWRhdGVkIHNlbWFudGljIHByb2dyYW0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3N0ZGxpYi1uZWdvdGlhdGlvbi5qc1wiKS5TdGRsaWJOZWdvdGlhdGlvblJlc3VsdH0gbmVnb3RpYXRpb24gLSBOZWdvdGlhdGVkIGNsb3N1cmUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3N0ZGxpYi1wcm92aWRlcnMuanNcIikuU3RkbGliUHJvdmlkZXJSZWNvcmQ+fSByZWNvcmRzIC0gUHJvdmlkZXIgcmVjb3JkcyBieSBjYW5vbmljYWwgbW9kdWxlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBRdWFsaWZpZWRTdGRsaWJPcGVyYXRpb25bXT59IHVzZWRPcGVyYXRpb25zQnlNb2R1bGUgLSBVc2VkIGNhbm9uaWNhbCBvcGVyYXRpb25zIGJ5IG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IFtvd25lck1vZHVsZUlkXSAtIEphdmEgb3duZXIgbW9kdWxlIGlkZW50aXR5LlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIHN0cmluZ1tdPn0gT3JkZXJlZCBwcm92aWRlciBpbXBvcnQgbmFtZXMgYnkgbW9kdWxlIGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiBjb2xsZWN0UHJvdmlkZXJJbXBvcnRzKHByb2dyYW0sIG5lZ290aWF0aW9uLCByZWNvcmRzLCB1c2VkT3BlcmF0aW9uc0J5TW9kdWxlLCBsYW5ndWFnZSwgb3duZXJNb2R1bGVJZCA9IG51bGwpIHtcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmdbXT59ICovXG4gIGNvbnN0IHByb3ZpZGVySW1wb3J0c0J5TW9kdWxlID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgcHJvZ3JhbS5tb2R1bGVzKSB7XG4gICAgaWYgKG1vZHVsZS5jYXBhYmlsaXRpZXMgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICBjb25zdCB1c2VkID0gbmV3IFNldCgodXNlZE9wZXJhdGlvbnNCeU1vZHVsZS5nZXQobW9kdWxlLmlkKSA/PyBbXSkubWFwKCh7bW9kdWxlOiBvd25lciwgb3BlcmF0aW9ufSkgPT5cbiAgICAgIHF1YWxpZmllZE9wZXJhdGlvbktleShvd25lciwgb3BlcmF0aW9uKSkpXG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBzdXJmYWNlID0gbmV3IFNldCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICAgIGNvbnN0IHJlc291cmNlTmFtZUJ5SWQgPSBuZXcgTWFwKClcblxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBjb25zdCBkZWNsYXJhdGlvbk5hbWVzID0gbmV3IE1hcCgobW9kdWxlLnJlY29yZHMgPz8gW10pLm1hcCgoZGVjbGFyYXRpb24pID0+IFsvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgZGVjbGFyYXRpb24ubmFtZV0pKVxuXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZXJyb3JzID8/IFtdKSB7XG4gICAgICBkZWNsYXJhdGlvbk5hbWVzLnNldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgZGVjbGFyYXRpb24ubmFtZSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgbW9kdWxlLmNhcGFiaWxpdGllcykge1xuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBjYXBhYmlsaXR5LnJlc291cmNlcykge1xuICAgICAgICBzdXJmYWNlLmFkZChyZXNvdXJjZS5uYW1lKVxuICAgICAgICByZXNvdXJjZU5hbWVCeUlkLnNldChyZXNvdXJjZS5pZCwgcmVzb3VyY2UubmFtZSlcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZmFpbHVyZSBvZiBjYXBhYmlsaXR5LmZhaWx1cmVzKSB7XG4gICAgICAgIHN1cmZhY2UuYWRkKGZhaWx1cmUubmFtZSlcbiAgICAgICAgZGVjbGFyYXRpb25OYW1lcy5zZXQoZmFpbHVyZS5pZCwgZmFpbHVyZS5uYW1lKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZWZlcmVuY2VkID0gbmV3IFNldCgpXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuXG4gICAgLyoqXG4gICAgICogVmlzaXRzIG9uZSBzZW1hbnRpYyB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHN1YnRyZWUuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgY29uc3QgdmlzaXQgPSAodmFsdWUpID0+IHtcbiAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXModmFsdWUpKSByZXR1cm5cbiAgICAgIHNlZW4uYWRkKHZhbHVlKVxuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGtpbmQgPSBSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpXG5cbiAgICAgICAgaWYgKGtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSB7XG4gICAgICAgICAgY29uc3QgcmVzb3VyY2VJZCA9IFJlZmxlY3QuZ2V0KHZhbHVlLCBcInJlc291cmNlSWRcIilcblxuICAgICAgICAgIGlmICh0eXBlb2YgcmVzb3VyY2VJZCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gcmVzb3VyY2VOYW1lQnlJZC5nZXQocmVzb3VyY2VJZClcblxuICAgICAgICAgICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkgcmVmZXJlbmNlZC5hZGQobmFtZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIiB8fCBraW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIgfHwga2luZCA9PSBcIkVycm9yVHlwZVwiKSB7XG4gICAgICAgICAgY29uc3QgZGVjbGFyYXRpb25JZCA9IFJlZmxlY3QuZ2V0KHZhbHVlLCBcImRlY2xhcmF0aW9uSWRcIilcblxuICAgICAgICAgIGlmICh0eXBlb2YgZGVjbGFyYXRpb25JZCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gZGVjbGFyYXRpb25OYW1lcy5nZXQoZGVjbGFyYXRpb25JZClcblxuICAgICAgICAgICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCAmJiBzdXJmYWNlLmhhcyhuYW1lKSkgcmVmZXJlbmNlZC5hZGQobmFtZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgaWYgKGtleSA9PSBcImNhcGFiaWxpdGllc1wiIHx8IGtleSA9PSBcImxvY2F0aW9uXCIgfHwga2V5ID09IFwic291cmNlUHJvdmVuYW5jZVwiKSBjb250aW51ZVxuICAgICAgICAgIHZpc2l0KGNoaWxkKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgZm9yIChjb25zdCBjaGlsZCBvZiB2YWx1ZSkgdmlzaXQoY2hpbGQpXG4gICAgfVxuXG4gICAgdmlzaXQobW9kdWxlKVxuICAgIGNvbnN0IG5hbWVzID0gW11cblxuICAgIGlmIChsYW5ndWFnZSAhPSBcImphdmFcIiB8fCBtb2R1bGUuaWQgIT0gb3duZXJNb2R1bGVJZCkge1xuICAgICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIG1vZHVsZS5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBjYXBhYmlsaXR5LnJlc291cmNlcykgaWYgKHJlZmVyZW5jZWQuaGFzKHJlc291cmNlLm5hbWUpKSBuYW1lcy5wdXNoKHJlc291cmNlLm5hbWUpXG4gICAgICAgIGZvciAoY29uc3QgZmFpbHVyZSBvZiBjYXBhYmlsaXR5LmZhaWx1cmVzKSBpZiAocmVmZXJlbmNlZC5oYXMoZmFpbHVyZS5uYW1lKSkgbmFtZXMucHVzaChmYWlsdXJlLm5hbWUpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsYW5ndWFnZSAhPSBcImphdmFcIikge1xuICAgICAgZm9yIChjb25zdCBwcm92aWRlciBvZiBuZWdvdGlhdGlvbi5wcm92aWRlcnMpIHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gcmVjb3Jkcy5nZXQocHJvdmlkZXIubW9kdWxlKVxuXG4gICAgICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIHByb3ZpZGVyLm9wZXJhdGlvbnMpIHtcbiAgICAgICAgICBpZiAodXNlZC5oYXMocXVhbGlmaWVkT3BlcmF0aW9uS2V5KHByb3ZpZGVyLm1vZHVsZSwgb3BlcmF0aW9uKSkpIHtcbiAgICAgICAgICAgIG5hbWVzLnB1c2goLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWNvcmQ/Lm5hdGl2ZUVudHJpZXNbb3BlcmF0aW9uXSkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdmlkZXJJbXBvcnRzQnlNb2R1bGUuc2V0KG1vZHVsZS5pZCwgbmFtZXMpXG4gIH1cbiAgcmV0dXJuIHByb3ZpZGVySW1wb3J0c0J5TW9kdWxlXG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSB0cnV0aGZ1bCBnZW5lcmF0ZWQgc3RkbGliIGxpbmsgbWV0YWRhdGEgZm9yIG9uZSBuZWdvdGlhdGVkIGNsb3N1cmUuXG4gKiBKYXZhIHJlcG9ydHMgdGhlIG93bmVyIG1vZHVsZSBmaWxlIGFzIHRoZSBwcm92aWRlciBjYXJyaWVyIGluc3RlYWQgb2YgYSBzZXBhcmF0ZSBhcnRpZmFjdC5cbiAqIEBwYXJhbSB7U3RkbGliUHJvZ3JhbUxpbmtpbmcgfCBudWxsfSBsaW5raW5nIC0gTGlua2luZyBwbGFuLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBwYXRocyAtIFBsYW5uZWQgYXJ0aWZhY3QgcGF0aCBieSBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlN0ZGxpYkZhY2FkZVByb2dyYW1EZXNjcmlwdG9yIHwgdW5kZWZpbmVkfSBmYWNhZGVzIC0gU2VsZWN0ZWQgc291cmNlIGZhY2FkZSBjbG9zdXJlLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBQbGFpbiBKU09OIG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiBzdGRsaWJMaW5rTWV0YWRhdGEobGlua2luZywgcGF0aHMsIGZhY2FkZXMpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi4oZmFjYWRlcyA/IHtmYWNhZGVzfSA6IHt9KSxcbiAgICBtb2R1bGVzOiAobGlua2luZz8ubmVnb3RpYXRpb24ubW9kdWxlcyA/PyBbXSkubWFwKChpdGVtKSA9PiAoe1xuICAgICAgaWRlbnRpdHk6IGl0ZW0uaWRlbnRpdHksXG4gICAgICBvcGVyYXRpb25zOiBbLi4uaXRlbS5vcGVyYXRpb25zXSxcbiAgICAgIHZlcnNpb246IGl0ZW0udmVyc2lvblxuICAgIH0pKSxcbiAgICBwcm92aWRlcnM6IChsaW5raW5nPy5uZWdvdGlhdGlvbi5wcm92aWRlcnMgPz8gW10pLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkID0gbGlua2luZz8ucmVjb3Jkcy5nZXQoaXRlbS5tb2R1bGUpXG4gICAgICBjb25zdCBhcnRpZmFjdFBhdGggPSBsaW5raW5nPy5vd25lck1vZHVsZUlkICE9PSBudWxsICYmIGxpbmtpbmc/Lm93bmVyTW9kdWxlSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGF0aHMuZ2V0KGxpbmtpbmcub3duZXJNb2R1bGVJZCkpXG4gICAgICAgIDogcmVjb3JkPy5hcnRpZmFjdC5wYXRoXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFydGlmYWN0OiB7bWVkaWFUeXBlOiByZWNvcmQ/LmFydGlmYWN0Lm1lZGlhVHlwZSwgcGF0aDogYXJ0aWZhY3RQYXRofSxcbiAgICAgICAgZGVwZW5kZW5jaWVzOiAocmVjb3JkPy5kZXBlbmRlbmNpZXMgPz8gW10pLm1hcCgoZGVwZW5kZW5jeSkgPT4gKHttb2R1bGU6IGRlcGVuZGVuY3kubW9kdWxlLCByYW5nZTogZGVwZW5kZW5jeS5yYW5nZX0pKSxcbiAgICAgICAgaWRlbnRpdHk6IGl0ZW0uaWRlbnRpdHksXG4gICAgICAgIG1vZHVsZTogaXRlbS5tb2R1bGUsXG4gICAgICAgIG5hdGl2ZUVudHJpZXM6IHsuLi5pdGVtLm5hdGl2ZUVudHJpZXN9LFxuICAgICAgICBvcGVyYXRpb25zOiBbLi4uaXRlbS5vcGVyYXRpb25zXSxcbiAgICAgICAgdGFyZ2V0OiBpdGVtLnRhcmdldCxcbiAgICAgICAgdmVyc2lvbjogaXRlbS52ZXJzaW9uXG4gICAgICB9XG4gICAgfSksXG4gICAgc2NoZW1hOiBcIlNlbWFudGlmb2xkU3RkbGliTGlua1wiLFxuICAgIHZlcnNpb246IDFcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBldmVyeSBtYW5kYXRvcnkgc2VtYW50aWMgbG9jYXRpb24gYWdhaW5zdCBpdHMgb3duaW5nIG1vZHVsZSBzb3VyY2UgYmVmb3JlIHdyaXRlciBhbGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBTdHJ1Y3R1cmFsbHkgYW5kIHNlbWFudGljYWxseSB2YWxpZGF0ZWQgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9ncmFtU291cmNlT3duZXJzaGlwKHByb2dyYW0sIGxhbmd1YWdlKSB7XG4gIGNvbnN0IHNvdXJjZXMgPSBuZXcgTWFwKHByb2dyYW0uc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gW3NvdXJjZS5maWxlbmFtZSwge1xuICAgIC4uLnNvdXJjZSxcbiAgICBjb29yZGluYXRlczogY3JlYXRlQ29vcmRpbmF0ZUluZGV4KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc291cmNlLmNvbnRlbnQpKVxuICB9XSkpXG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgcHJvZ3JhbS5tb2R1bGVzKSB7XG4gICAgY29uc3Qgc291cmNlID0gc291cmNlcy5nZXQobW9kdWxlLnNvdXJjZUZpbGVuYW1lKVxuXG4gICAgaWYgKCFzb3VyY2UpIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJzZW1hbnRpYyBwcm9ncmFtIG1vZHVsZSBzb3VyY2Ugb3duZXJzaGlwXCIsIHVuZGVmaW5lZClcbiAgICBjb25zdCBmYWxsYmFjayA9IG1vZHVsZUxvY2F0aW9uKHNvdXJjZS5maWxlbmFtZSwgLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzb3VyY2UuY29udGVudCkpXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNlbWFudGljRW50cmllcyhtb2R1bGUpKSB7XG4gICAgICBjb25zdCBzdWJqZWN0ID0gZW50cnkubm9kZS5raW5kID09IFwiTW9kdWxlXCIgPyBcIm1vZHVsZVwiIDogZW50cnkubm9kZS5raW5kID09IFwiSW1wb3J0XCIgPyBcImltcG9ydFwiIDpcbiAgICAgICAgZW50cnkubm9kZS5raW5kID09IFwiRXhwb3J0XCIgPyBcImV4cG9ydFwiIDogXCJzZW1hbnRpYyBub2RlXCJcblxuICAgICAgaWYgKCEoXCJsb2NhdGlvblwiIGluIGVudHJ5Lm5vZGUpKSB7XG4gICAgICAgIGlmIChzdWJqZWN0ICE9IFwic2VtYW50aWMgbm9kZVwiKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGBzZW1hbnRpYyBwcm9ncmFtICR7c3ViamVjdH0gbG9jYXRpb25gLCBmYWxsYmFjaylcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvY2F0aW9uID0gZW50cnkubm9kZS5sb2NhdGlvblxuXG4gICAgICBpZiAoc291cmNlT3duc0xvY2F0aW9uKHNvdXJjZSwgbG9jYXRpb24pKSBjb250aW51ZVxuXG4gICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGBzZW1hbnRpYyBwcm9ncmFtICR7c3ViamVjdH0gbG9jYXRpb24gc291cmNlIG93bmVyc2hpcGAsIGZhbGxiYWNrKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBhIG5vcm1hbGl6ZWQgVVRGLTE2IGxvY2F0aW9uIGFnYWluc3Qgb25lIGV4YWN0IHJlZ2lzdGVyZWQgc291cmNlIHdpdGhvdXQgdGhyb3dpbmcuXG4gKiBAcGFyYW0ge3tmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfCBudWxsLCBjb29yZGluYXRlczogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pn19IHNvdXJjZSAtIE93bmluZyBzb3VyY2UuXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBsb2NhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBzb3VyY2Ugb3ducyB0aGUgbG9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHNvdXJjZU93bnNMb2NhdGlvbihzb3VyY2UsIGNhbmRpZGF0ZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QoY2FuZGlkYXRlKSB8fCBjYW5kaWRhdGUuZmlsZW5hbWUgIT0gc291cmNlLmZpbGVuYW1lIHx8ICFpc1BsYWluT2JqZWN0KGNhbmRpZGF0ZS5zdGFydCkgfHxcbiAgICAhaXNQbGFpbk9iamVjdChjYW5kaWRhdGUuZW5kKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihjYW5kaWRhdGUuc3RhcnQub2Zmc2V0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihjYW5kaWRhdGUuZW5kLm9mZnNldCkgfHxcbiAgICAhTnVtYmVyLmlzSW50ZWdlcihjYW5kaWRhdGUuc3RhcnQubGluZSkgfHwgIU51bWJlci5pc0ludGVnZXIoY2FuZGlkYXRlLnN0YXJ0LmNvbHVtbikgfHxcbiAgICAhTnVtYmVyLmlzSW50ZWdlcihjYW5kaWRhdGUuZW5kLmxpbmUpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGNhbmRpZGF0ZS5lbmQuY29sdW1uKSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChjYW5kaWRhdGUuc3RhcnQub2Zmc2V0KVxuICBjb25zdCBlbmRPZmZzZXQgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGNhbmRpZGF0ZS5lbmQub2Zmc2V0KVxuXG4gIGlmIChzdGFydE9mZnNldCA8IDAgfHwgZW5kT2Zmc2V0IDwgc3RhcnRPZmZzZXQgfHwgZW5kT2Zmc2V0ID4gc291cmNlLmNvb3JkaW5hdGVzLnNvdXJjZS5sZW5ndGgpIHJldHVybiBmYWxzZVxuICBjb25zdCBleHBlY3RlZFN0YXJ0ID0gaW5kZXhlZFBvaW50QXQoc291cmNlLmNvb3JkaW5hdGVzLCBzdGFydE9mZnNldClcbiAgY29uc3QgZXhwZWN0ZWRFbmQgPSBpbmRleGVkUG9pbnRBdChzb3VyY2UuY29vcmRpbmF0ZXMsIGVuZE9mZnNldClcblxuICByZXR1cm4gc2FtZVBvaW50KGNhbmRpZGF0ZS5zdGFydCwgZXhwZWN0ZWRTdGFydCkgJiYgc2FtZVBvaW50KGNhbmRpZGF0ZS5lbmQsIGV4cGVjdGVkRW5kKVxufVxuXG4vKipcbiAqIENvbXBhcmVzIGFuIHVudHJ1c3RlZCBwb2ludCB3aXRoIG9uZSBjYW5vbmljYWwgaW5kZXhlZCBwb2ludC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBwb2ludC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlUG9pbnR9IGV4cGVjdGVkIC0gQ2Fub25pY2FsIHBvaW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgZXZlcnkgY29vcmRpbmF0ZSBhZ3JlZXMuXG4gKi9cbmZ1bmN0aW9uIHNhbWVQb2ludChjYW5kaWRhdGUsIGV4cGVjdGVkKSB7XG4gIHJldHVybiBjYW5kaWRhdGUub2Zmc2V0ID09IGV4cGVjdGVkLm9mZnNldCAmJiBjYW5kaWRhdGUubGluZSA9PSBleHBlY3RlZC5saW5lICYmIGNhbmRpZGF0ZS5jb2x1bW4gPT0gZXhwZWN0ZWQuY29sdW1uXG59XG5cbi8qKlxuICogQ29sbGVjdHMgbm9taW5hbCBmYWlsdXJlIGlkZW50aXRpZXMgcmVmZXJlbmNlZCBieSBleGVjdXRhYmxlL3R5cGUgbm9kZXMgb3V0c2lkZSB0aGUgbW9kdWxlJ3MgYXV0aG9yaXR5IGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSBtb2R1bGUgLSBQcm9ncmFtIG1vZHVsZS5cbiAqIEByZXR1cm5zIHtTZXQ8c3RyaW5nPn0gUmVmZXJlbmNlZCBmYWlsdXJlIGRlY2xhcmF0aW9uIGlkZW50aXRpZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RSZWZlcmVuY2VkRmFpbHVyZUlkcyhtb2R1bGUpIHtcbiAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgY29uc3QgaWRzID0gbmV3IFNldCgpXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KClcbiAgLyoqXG4gICAqIFZpc2l0cyBvbmUgc2VtYW50aWMgc3VidHJlZSBmb3IgcmVmZXJlbmNlZCBmYWlsdXJlcy5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyBzdWJ0cmVlLlxuICAgKi9cbiAgY29uc3QgdmlzaXQgPSAodmFsdWUpID0+IHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuXG4gICAgc2Vlbi5hZGQodmFsdWUpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJFcnJvclR5cGVcIiAmJiB0eXBlb2YgUmVmbGVjdC5nZXQodmFsdWUsIFwiZGVjbGFyYXRpb25JZFwiKSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlkcy5hZGQoUmVmbGVjdC5nZXQodmFsdWUsIFwiZGVjbGFyYXRpb25JZFwiKSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZhaWx1cmVJZHMgPSBSZWZsZWN0LmdldCh2YWx1ZSwgXCJmYWlsdXJlSWRzXCIpXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGZhaWx1cmVJZHMpKSBmb3IgKGNvbnN0IGlkIG9mIGZhaWx1cmVJZHMpIGlmICh0eXBlb2YgaWQgPT0gXCJzdHJpbmdcIikgaWRzLmFkZChpZClcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICBpZiAoW1wiY2FwYWJpbGl0aWVzXCIsIFwibG9jYXRpb25cIiwgXCJwcm92ZW5hbmNlXCIsIFwic291cmNlUHJvdmVuYW5jZVwiXS5pbmNsdWRlcyhrZXkpKSBjb250aW51ZVxuICAgICAgICB2aXNpdChjaGlsZClcbiAgICAgIH1cbiAgICB9IGVsc2UgZm9yIChjb25zdCBjaGlsZCBvZiB2YWx1ZSkgdmlzaXQoY2hpbGQpXG4gIH1cblxuICB2aXNpdCh7Y2xhc3NlczogbW9kdWxlLmNsYXNzZXMsIGVudHJ5UG9pbnQ6IG1vZHVsZS5lbnRyeVBvaW50LCBmdW5jdGlvbnM6IG1vZHVsZS5mdW5jdGlvbnN9KVxuICByZXR1cm4gaWRzXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgdmFsaWRhdGVzIGV2ZXJ5IGJhY2tlbmQtc2hhcGVkIG1vZHVsZSBiZWZvcmUgYW55IHdyaXRlciBpcyBhbGxvY2F0ZWQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gcHJvZ3JhbSAtIFZhbGlkYXRlZCBzZW1hbnRpYyBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7U3RkbGliUHJvZ3JhbUxpbmtpbmcgfCBudWxsfSBbbGlua2luZ10gLSBQbGFubmVkIHN0ZGxpYiBwcm92aWRlciBsaW5rLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlW119IEVtaXNzaW9uIHZpZXdzIGluIGRlcGVuZGVuY3kgb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVFbWlzc2lvbk1vZHVsZXMocHJvZ3JhbSwgbGFuZ3VhZ2UsIGxpbmtpbmcgPSBudWxsKSB7XG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+fSAqL1xuICBjb25zdCBkZWNsYXJhdGlvbnMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBwcm9ncmFtLm1vZHVsZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5yZWNvcmRzID8/IFtdKSBkZWNsYXJhdGlvbnMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBkZWNsYXJhdGlvbilcbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5jbGFzc2VzID8/IFtdKSBkZWNsYXJhdGlvbnMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBkZWNsYXJhdGlvbilcbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5lcnJvcnMgPz8gW10pIGRlY2xhcmF0aW9ucy5zZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIGRlY2xhcmF0aW9uKVxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmZ1bmN0aW9ucykgZGVjbGFyYXRpb25zLnNldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgZGVjbGFyYXRpb24pXG4gIH1cbiAgY29uc3QgbW9kdWxlcyA9IHByb2dyYW0ubW9kdWxlcy5tYXAoKG1vZHVsZSkgPT4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gKi8gKHtcbiAgICAuLi5tb2R1bGUsXG4gICAgZW50cnlQb2ludDogbW9kdWxlLmVudHJ5UG9pbnQgPz8ge1xuICAgICAgYm9keToge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIkJsb2NrXCIpLCBsb2NhdGlvbjogbW9kdWxlLmxvY2F0aW9uLCBzdGF0ZW1lbnRzOiBbXX0sXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJFbnRyeVBvaW50XCIpLFxuICAgICAgbG9jYXRpb246IG1vZHVsZS5sb2NhdGlvblxuICAgIH1cbiAgfSkpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSAqL1xuICBjb25zdCBjYWxsRWZmZWN0c0J5RGVjbGFyYXRpb25JZCA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICBjb25zdCBwcm9ncmFtTW9kdWxlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChtb2R1bGUpKVxuICAgIGNvbnN0IHZpc2libGVGdW5jdGlvbnMgPSBuZXcgTWFwKClcbiAgICBjb25zdCB2aXNpYmxlQ2FsbEVmZmVjdHMgPSBuZXcgTWFwKClcbiAgICBjb25zdCB2aXNpYmxlUmVjb3JkcyA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IHZpc2libGVDbGFzc2VzID0gbmV3IE1hcCgpXG4gICAgY29uc3QgdmlzaWJsZUVycm9ycyA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IGV4dGVybmFsRGVjbGFyYXRpb25JZHMgPSBuZXcgU2V0KClcblxuICAgIGNvbnN0IG5lZWRlZEZhaWx1cmVJZHMgPSBjb2xsZWN0UmVmZXJlbmNlZEZhaWx1cmVJZHMocHJvZ3JhbU1vZHVsZSlcbiAgICBjb25zdCBsb2NhbEZhaWx1cmVJZHMgPSBuZXcgU2V0KHByb2dyYW1Nb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKCh7ZmFpbHVyZXN9KSA9PiBmYWlsdXJlcy5tYXAoKHtpZH0pID0+IGlkKSkgPz8gW10pXG5cbiAgICBmb3IgKGNvbnN0IG93bmVyIG9mIHByb2dyYW0ubW9kdWxlcykge1xuICAgICAgaWYgKG93bmVyLmlkID09IHByb2dyYW1Nb2R1bGUuaWQpIGNvbnRpbnVlXG4gICAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2Ygb3duZXIuY2FwYWJpbGl0aWVzID8/IFtdKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmFpbHVyZSBvZiBjYXBhYmlsaXR5LmZhaWx1cmVzKSB7XG4gICAgICAgICAgaWYgKCFsb2NhbEZhaWx1cmVJZHMuaGFzKGZhaWx1cmUuaWQpICYmIG5lZWRlZEZhaWx1cmVJZHMuaGFzKGZhaWx1cmUuaWQpKSB2aXNpYmxlRXJyb3JzLnNldChmYWlsdXJlLmlkLCBmYWlsdXJlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBpbXBvcnRlZCBvZiBwcm9ncmFtTW9kdWxlLmltcG9ydHMpIHtcbiAgICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb25zLmdldChpbXBvcnRlZC5kZWNsYXJhdGlvbklkKVxuXG4gICAgICBpZiAoIWRlY2xhcmF0aW9uKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwicHJvZ3JhbSBpbXBvcnQgd2l0aG91dCBhIGRlY2xhcmF0aW9uXCIsIGltcG9ydGVkLmxvY2F0aW9uKVxuICAgICAgZXh0ZXJuYWxEZWNsYXJhdGlvbklkcy5hZGQoaW1wb3J0ZWQuZGVjbGFyYXRpb25JZClcbiAgICAgIGlmIChpbXBvcnRlZC5zeW1ib2xLaW5kID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB2aXNpYmxlRnVuY3Rpb25zLnNldChpbXBvcnRlZC5sb2NhbE5hbWUsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbn0gKi8gKGRlY2xhcmF0aW9uKSlcbiAgICAgICAgdmlzaWJsZUNhbGxFZmZlY3RzLnNldChpbXBvcnRlZC5sb2NhbE5hbWUsIG5ldyBTZXQoY2FsbEVmZmVjdHNCeURlY2xhcmF0aW9uSWQuZ2V0KGltcG9ydGVkLmRlY2xhcmF0aW9uSWQpID8/IFtdKSlcbiAgICAgIH0gZWxzZSBpZiAoaW1wb3J0ZWQuc3ltYm9sS2luZCA9PSBcInJlY29yZFwiKSB7XG4gICAgICAgIHZpc2libGVSZWNvcmRzLnNldChpbXBvcnRlZC5kZWNsYXJhdGlvbklkLCAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSAqLyAoZGVjbGFyYXRpb24pKVxuICAgICAgfSBlbHNlIGlmIChpbXBvcnRlZC5zeW1ib2xLaW5kID09IFwiY2xhc3NcIikge1xuICAgICAgICB2aXNpYmxlQ2xhc3Nlcy5zZXQoaW1wb3J0ZWQuZGVjbGFyYXRpb25JZCwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9ufSAqLyAoZGVjbGFyYXRpb24pKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmlzaWJsZUVycm9ycy5zZXQoaW1wb3J0ZWQuZGVjbGFyYXRpb25JZCwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9ufSAqLyAoZGVjbGFyYXRpb24pKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobW9kdWxlLmNhcGFiaWxpdGllcyAhPT0gdW5kZWZpbmVkIHx8ICFsaW5raW5nKSB7XG4gICAgICBwcmVmbGlnaHRFZmZlY3RDYXBhYmlsaXRpZXMobW9kdWxlLCBsYW5ndWFnZSwgbGlua2luZyA/IHt1c2VkT3BlcmF0aW9uczogKGxpbmtpbmcudXNlZE9wZXJhdGlvbnNCeU1vZHVsZS5nZXQocHJvZ3JhbU1vZHVsZS5pZCkgPz8gW10pXG4gICAgICAgIC5tYXAoKHtvcGVyYXRpb259KSA9PiBvcGVyYXRpb24pfSA6IHt9KVxuICAgIH1cbiAgICB2YWxpZGF0ZUJhY2tlbmRNb2R1bGUobW9kdWxlLCBsYW5ndWFnZSwge1xuICAgICAgZXh0ZXJuYWxEZWNsYXJhdGlvbklkcyxcbiAgICAgIHByb2dyYW06IHRydWUsXG4gICAgICB2aXNpYmxlQ2FsbEVmZmVjdHMsXG4gICAgICB2aXNpYmxlQ2xhc3NlcyxcbiAgICAgIHZpc2libGVFcnJvcnMsXG4gICAgICB2aXNpYmxlRnVuY3Rpb25zLFxuICAgICAgdmlzaWJsZVJlY29yZHNcbiAgICB9KVxuICAgIGNvbnN0IGxvY2FsQ2FsbEVmZmVjdHMgPSBtb2R1bGVVbmNoZWNrZWRFcnJvckVmZmVjdHMobW9kdWxlLCB7Y2FsbEVmZmVjdHM6IHZpc2libGVDYWxsRWZmZWN0cywgZnVuY3Rpb25zOiB2aXNpYmxlRnVuY3Rpb25zfSlcblxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmZ1bmN0aW9ucykge1xuICAgICAgY2FsbEVmZmVjdHNCeURlY2xhcmF0aW9uSWQuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBuZXcgU2V0KGxvY2FsQ2FsbEVmZmVjdHMuZ2V0KGRlY2xhcmF0aW9uLm5hbWUpID8/IFtdKSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbW9kdWxlc1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgY2xvc2VkIHBhcnNlci1uZXV0cmFsIHByb2dyYW0gZ3JhcGggYmVmb3JlIGFueSB0YXJnZXQgZW1pc3Npb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8U2V0PGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2U+Pn0gW3NvdXJjZUxhbmd1YWdlc10gLSBBY2NlcHRlZCBzb3VyY2UgbGFuZ3VhZ2VzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gVmFsaWRhdGVkIHByb2dyYW0uXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvZ3JhbShjYW5kaWRhdGUsIGxhbmd1YWdlLCBzb3VyY2VMYW5ndWFnZXMgPSBwcm9ncmFtVGFyZ2V0cykge1xuICBpZiAoIWlzUGxhaW5PYmplY3QoY2FuZGlkYXRlKSB8fCBjYW5kaWRhdGUua2luZCAhPSBcIlByb2dyYW1cIiB8fCB0eXBlb2YgY2FuZGlkYXRlLmVudHJ5TW9kdWxlICE9IFwic3RyaW5nXCIgfHxcbiAgICAhaXNEZW5zZUFycmF5KGNhbmRpZGF0ZS5tb2R1bGVzKSB8fCBjYW5kaWRhdGUubW9kdWxlcy5sZW5ndGggPT0gMCB8fCAhaXNEZW5zZUFycmF5KGNhbmRpZGF0ZS5zb3VyY2VzKSB8fCBjYW5kaWRhdGUuc291cmNlcy5sZW5ndGggPT0gMCkge1xuICAgIGludmFsaWRQcm9ncmFtR2VuZXJhdGlvbihcIk1hbGZvcm1lZCBzZW1hbnRpYyBwcm9ncmFtLlwiKVxuICB9XG4gIGNvbnN0IHByb2dyYW0gPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gKi8gKGNhbmRpZGF0ZSlcbiAgY29uc3QgbW9kdWxlcyA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtkZWNsYXJhdGlvbjogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24sIG1vZHVsZTogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfT59ICovXG4gIGNvbnN0IGRlY2xhcmF0aW9ucyA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZVtdfSAqL1xuICBjb25zdCBjYXBhYmlsaXR5TW9kdWxlcyA9IFtdXG4gIGxldCBlbnRyeUNvdW50ID0gMFxuICBjb25zdCBzb3VyY2VJZHMgPSBuZXcgU2V0KClcbiAgY29uc3Qgc291cmNlRmlsZW5hbWVzID0gbmV3IFNldCgpXG5cbiAgZm9yIChjb25zdCBzb3VyY2Ugb2YgcHJvZ3JhbS5zb3VyY2VzKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHNvdXJjZSkgfHwgdHlwZW9mIHNvdXJjZS5pZCAhPSBcInN0cmluZ1wiIHx8IHNvdXJjZUlkcy5oYXMoc291cmNlLmlkKSB8fFxuICAgICAgdHlwZW9mIHNvdXJjZS5maWxlbmFtZSAhPSBcInN0cmluZ1wiIHx8ICFpc1NhZmVTb3VyY2VQYXRoKHNvdXJjZS5maWxlbmFtZSkgfHwgc291cmNlRmlsZW5hbWVzLmhhcyhzb3VyY2UuZmlsZW5hbWUpIHx8XG4gICAgICB0eXBlb2Ygc291cmNlLmNvbnRlbnQgIT0gXCJzdHJpbmdcIiB8fCB0eXBlb2Ygc291cmNlLmxhbmd1YWdlICE9IFwic3RyaW5nXCIgfHwgIXNvdXJjZUxhbmd1YWdlcy5oYXMoc291cmNlLmxhbmd1YWdlKSkge1xuICAgICAgaW52YWxpZFByb2dyYW1HZW5lcmF0aW9uKFwiTWFsZm9ybWVkIG9yIGR1cGxpY2F0ZSBzZW1hbnRpYyBwcm9ncmFtIHNvdXJjZSByZWdpc3RyeS5cIilcbiAgICB9XG4gICAgc291cmNlSWRzLmFkZChzb3VyY2UuaWQpXG4gICAgc291cmNlRmlsZW5hbWVzLmFkZChzb3VyY2UuZmlsZW5hbWUpXG4gIH1cblxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBwcm9ncmFtLm1vZHVsZXMpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QobW9kdWxlKSB8fCBtb2R1bGUua2luZCAhPSBcIk1vZHVsZVwiIHx8IHR5cGVvZiBtb2R1bGUuaWQgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgIS9eW2Etel1bYS16MC05X10qKD86Wy4tXVthLXpdW2EtejAtOV9dKikqJC91LnRlc3QobW9kdWxlLmlkKSB8fCBtb2R1bGVzLmhhcyhtb2R1bGUuaWQpIHx8XG4gICAgICAhaXNEZW5zZUFycmF5KG1vZHVsZS5mdW5jdGlvbnMpIHx8IG1vZHVsZS5yZWNvcmRzICE9PSB1bmRlZmluZWQgJiYgIWlzRGVuc2VBcnJheShtb2R1bGUucmVjb3JkcykgfHxcbiAgICAgIG1vZHVsZS5lcnJvcnMgIT09IHVuZGVmaW5lZCAmJiAhaXNEZW5zZUFycmF5KG1vZHVsZS5lcnJvcnMpIHx8XG4gICAgICAhaXNEZW5zZUFycmF5KG1vZHVsZS5pbXBvcnRzKSB8fCAhaXNEZW5zZUFycmF5KG1vZHVsZS5leHBvcnRzKSkge1xuICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcIm1hbGZvcm1lZCBvciBkdXBsaWNhdGUgc2VtYW50aWMgcHJvZ3JhbSBtb2R1bGVcIiwgbW9kdWxlPy5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKFJlZmxlY3QuZ2V0KG1vZHVsZSwgXCJjbGFzc2VzXCIpICE9PSB1bmRlZmluZWQgJiYgKCFpc0RlbnNlQXJyYXkobW9kdWxlLmNsYXNzZXMpIHx8XG4gICAgICBSZWZsZWN0LmdldChtb2R1bGUsIFwic3RkbGliRmFjYWRlXCIpID09PSB1bmRlZmluZWQpKSB7XG4gICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwiVGFzayAwMzMgcmVmZXJlbmNlIGNsYXNzZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgc2VtYW50aWMgcHJvZ3JhbSBnZW5lcmF0aW9uXCIsXG4gICAgICAgIFJlZmxlY3QuZ2V0KG1vZHVsZSwgXCJjbGFzc2VzXCIpPy5bMF0/LmxvY2F0aW9uID8/IG1vZHVsZS5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKFJlZmxlY3QuZ2V0KG1vZHVsZSwgXCJjYXBhYmlsaXRpZXNcIikgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFpc0RlbnNlQXJyYXkobW9kdWxlLmNhcGFiaWxpdGllcykgfHwgbW9kdWxlLmNhcGFiaWxpdGllcy5sZW5ndGggPT0gMCkge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwibWFsZm9ybWVkIG9yIGVtcHR5IFRhc2sgMDM0IGNhcGFiaWxpdHkgZ3JhcGhcIiwgbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY2FwYWJpbGl0eU1vZHVsZXMucHVzaChtb2R1bGUpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgbW9kdWxlLnNvdXJjZUZpbGVuYW1lICE9IFwic3RyaW5nXCIgfHwgIXNvdXJjZUZpbGVuYW1lcy5oYXMobW9kdWxlLnNvdXJjZUZpbGVuYW1lKSkge1xuICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcInNlbWFudGljIHByb2dyYW0gbW9kdWxlIHNvdXJjZSBpZGVudGl0eVwiLCBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChtb2R1bGUuZW50cnlQb2ludCkge1xuICAgICAgZW50cnlDb3VudCsrXG4gICAgICBpZiAobW9kdWxlLmlkICE9IHByb2dyYW0uZW50cnlNb2R1bGUpIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJlbnRyeSBwb2ludCBvbiBhbiB1bnNlbGVjdGVkIG1vZHVsZVwiLCBtb2R1bGUuZW50cnlQb2ludC5sb2NhdGlvbilcbiAgICB9XG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBbLi4ubW9kdWxlLnJlY29yZHMgPz8gW10sIC4uLm1vZHVsZS5jbGFzc2VzID8/IFtdLCAuLi5tb2R1bGUuZXJyb3JzID8/IFtdLCAuLi5tb2R1bGUuZnVuY3Rpb25zXSkge1xuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGRlY2xhcmF0aW9uKSB8fCB0eXBlb2YgZGVjbGFyYXRpb24uaWQgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAhZGVjbGFyYXRpb24uaWQuc3RhcnRzV2l0aChgJHttb2R1bGUuaWR9I2ApIHx8IGRlY2xhcmF0aW9ucy5oYXMoZGVjbGFyYXRpb24uaWQpKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJkdXBsaWNhdGUgb3IgdW5zdGFibGUgcHJvZ3JhbSBkZWNsYXJhdGlvbiBpZGVudGl0eVwiLCBkZWNsYXJhdGlvbj8ubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgZGVjbGFyYXRpb25zLnNldChkZWNsYXJhdGlvbi5pZCwge2RlY2xhcmF0aW9uLCBtb2R1bGV9KVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGltcG9ydGVkIG9mIG1vZHVsZS5pbXBvcnRzKSB7XG4gICAgICBpZiAoIWlzUGxhaW5PYmplY3QoaW1wb3J0ZWQpIHx8IGltcG9ydGVkLmtpbmQgIT0gXCJJbXBvcnRcIiB8fCB0eXBlb2YgaW1wb3J0ZWQubW9kdWxlSWQgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICB0eXBlb2YgaW1wb3J0ZWQuaW1wb3J0ZWROYW1lICE9IFwic3RyaW5nXCIgfHwgdHlwZW9mIGltcG9ydGVkLmxvY2FsTmFtZSAhPSBcInN0cmluZ1wiIHx8XG4gICAgICAgIHR5cGVvZiBpbXBvcnRlZC5kZWNsYXJhdGlvbklkICE9IFwic3RyaW5nXCIgfHwgIVtcImZ1bmN0aW9uXCIsIFwicmVjb3JkXCIsIFwiY2xhc3NcIiwgXCJlcnJvclwiXS5pbmNsdWRlcyhpbXBvcnRlZC5zeW1ib2xLaW5kKSB8fFxuICAgICAgICB0eXBlb2YgaW1wb3J0ZWQudHlwZU9ubHkgIT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcIm1hbGZvcm1lZCBzZW1hbnRpYyBwcm9ncmFtIGltcG9ydFwiLCBpbXBvcnRlZD8ubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4cG9ydGVkIG9mIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICBpZiAoIWlzUGxhaW5PYmplY3QoZXhwb3J0ZWQpIHx8IGV4cG9ydGVkLmtpbmQgIT0gXCJFeHBvcnRcIiB8fCB0eXBlb2YgZXhwb3J0ZWQuZXhwb3J0ZWROYW1lICE9IFwic3RyaW5nXCIgfHxcbiAgICAgICAgdHlwZW9mIGV4cG9ydGVkLmRlY2xhcmF0aW9uSWQgIT0gXCJzdHJpbmdcIiB8fCAhW1wiZnVuY3Rpb25cIiwgXCJyZWNvcmRcIiwgXCJjbGFzc1wiLCBcImVycm9yXCJdLmluY2x1ZGVzKGV4cG9ydGVkLnN5bWJvbEtpbmQpKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJtYWxmb3JtZWQgc2VtYW50aWMgcHJvZ3JhbSBleHBvcnRcIiwgZXhwb3J0ZWQ/LmxvY2F0aW9uID8/IG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gICAgbW9kdWxlcy5zZXQobW9kdWxlLmlkLCBtb2R1bGUpXG4gIH1cbiAgaWYgKGVudHJ5Q291bnQgIT0gMSB8fCAhbW9kdWxlcy5nZXQocHJvZ3JhbS5lbnRyeU1vZHVsZSk/LmVudHJ5UG9pbnQpIHtcbiAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwicHJvZ3JhbSB3aXRob3V0IGV4YWN0bHkgb25lIHNlbGVjdGVkIGVudHJ5IHBvaW50XCIsIG1vZHVsZXMuZ2V0KHByb2dyYW0uZW50cnlNb2R1bGUpPy5sb2NhdGlvbilcbiAgfVxuICBjb25zdCBzZWxlY3RlZE1vZHVsZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSAqLyAobW9kdWxlcy5nZXQocHJvZ3JhbS5lbnRyeU1vZHVsZSkpXG4gIGNvbnN0IHNlbGVjdGVkRW50cnkgPSBzZWxlY3RlZE1vZHVsZS5lbnRyeVBvaW50XG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KHNlbGVjdGVkRW50cnk/LmJvZHkpIHx8ICFpc0RlbnNlQXJyYXkoc2VsZWN0ZWRFbnRyeS5ib2R5LnN0YXRlbWVudHMpIHx8IHNlbGVjdGVkRW50cnkuYm9keS5zdGF0ZW1lbnRzLmxlbmd0aCA9PSAwKSB7XG4gICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcInByb2dyYW0gd2l0aG91dCBhIGRlbnNlIG5vbi1lbXB0eSBzZWxlY3RlZCBlbnRyeSBwb2ludCBibG9ja1wiLFxuICAgICAgc2VsZWN0ZWRFbnRyeT8ubG9jYXRpb24gPz8gc2VsZWN0ZWRNb2R1bGUubG9jYXRpb24pXG4gIH1cbiAgY29uc3QgZWFybGllciA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3QgbW9kdWxlIG9mIHByb2dyYW0ubW9kdWxlcykge1xuICAgIGNvbnN0IGxvY2FsVGFyZ2V0TmFtZXMgPSBuZXcgU2V0KFsuLi5tb2R1bGUucmVjb3JkcyA/PyBbXSwgLi4ubW9kdWxlLmNsYXNzZXMgPz8gW10sIC4uLm1vZHVsZS5lcnJvcnMgPz8gW10sIC4uLm1vZHVsZS5mdW5jdGlvbnNdXG4gICAgICAubWFwKCh7bmFtZX0pID0+IHRhcmdldE5hbWUobGFuZ3VhZ2UsIG5hbWUpKSlcbiAgICBjb25zdCBpbXBvcnRlZFRhcmdldE5hbWVzID0gbmV3IFNldCgpXG4gICAgY29uc3QgbG9jYWxKYXZhQ2xhc3MgPSBtb2R1bGUucmVjb3Jkcz8uWzBdPy5uYW1lID8/IG1vZHVsZS5jbGFzc2VzPy5bMF0/Lm5hbWUgPz8gbW9kdWxlLmVycm9ycz8uWzBdPy5uYW1lID8/XG4gICAgICAobW9kdWxlLmlkID09IHByb2dyYW0uZW50cnlNb2R1bGUgPyBcIk1haW5cIiA6IG1vZHVsZUNsYXNzTmFtZShtb2R1bGUuaWQpKVxuICAgIGNvbnN0IGphdmFJbXBvcnRDbGFzc2VzID0gbmV3IE1hcChsYW5ndWFnZSA9PSBcImphdmFcIiA/IFtbbG9jYWxKYXZhQ2xhc3MsIG1vZHVsZS5pZF1dIDogW10pXG5cbiAgICBmb3IgKGNvbnN0IGltcG9ydGVkIG9mIG1vZHVsZS5pbXBvcnRzKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IGRlY2xhcmF0aW9ucy5nZXQoaW1wb3J0ZWQuZGVjbGFyYXRpb25JZClcbiAgICAgIGNvbnN0IHJlbW90ZUV4cG9ydCA9IHJlc29sdmVkPy5tb2R1bGUuZXhwb3J0cy5maW5kKChpdGVtKSA9PlxuICAgICAgICBpdGVtLmRlY2xhcmF0aW9uSWQgPT0gaW1wb3J0ZWQuZGVjbGFyYXRpb25JZCAmJiBpdGVtLmV4cG9ydGVkTmFtZSA9PSBpbXBvcnRlZC5pbXBvcnRlZE5hbWUpXG5cbiAgICAgIGlmICghcmVzb2x2ZWQgfHwgcmVzb2x2ZWQubW9kdWxlLmlkICE9IGltcG9ydGVkLm1vZHVsZUlkIHx8ICFlYXJsaWVyLmhhcyhpbXBvcnRlZC5tb2R1bGVJZCkgfHxcbiAgICAgICAgIXJlbW90ZUV4cG9ydCkge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwidW5yZXNvbHZlZCwgcHJpdmF0ZSwgY3ljbGljLCBvciBvdXQtb2Ytb3JkZXIgcHJvZ3JhbSBpbXBvcnRcIiwgaW1wb3J0ZWQubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgZGVjbGFyYXRpb25LaW5kID0gcmVzb2x2ZWQuZGVjbGFyYXRpb24ua2luZCA9PSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiA/IFwiZnVuY3Rpb25cIiA6XG4gICAgICAgIHJlc29sdmVkLmRlY2xhcmF0aW9uLmtpbmQgPT0gXCJSZWNvcmREZWNsYXJhdGlvblwiID8gXCJyZWNvcmRcIiA6XG4gICAgICAgICAgcmVzb2x2ZWQuZGVjbGFyYXRpb24ua2luZCA9PSBcIkNsYXNzRGVjbGFyYXRpb25cIiA/IFwiY2xhc3NcIiA6IFwiZXJyb3JcIlxuXG4gICAgICBpZiAoaW1wb3J0ZWQuc3ltYm9sS2luZCAhPSByZW1vdGVFeHBvcnQuc3ltYm9sS2luZCB8fCBpbXBvcnRlZC5zeW1ib2xLaW5kICE9IGRlY2xhcmF0aW9uS2luZCB8fFxuICAgICAgICBpbXBvcnRlZC50eXBlT25seSAmJiBkZWNsYXJhdGlvbktpbmQgIT0gXCJyZWNvcmRcIiAmJiBkZWNsYXJhdGlvbktpbmQgIT0gXCJjbGFzc1wiKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJwcm9ncmFtIGltcG9ydCBkZWNsYXJhdGlvbiBraW5kIG1pc21hdGNoXCIsIGltcG9ydGVkLmxvY2F0aW9uID8/IG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGltcG9ydE5hbWUgPSBwcm9ncmFtSW1wb3J0TmFtZShwcm9ncmFtLCBtb2R1bGUsIGltcG9ydGVkKVxuXG4gICAgICBpZiAobGFuZ3VhZ2UgIT0gXCJydWJ5XCIgJiYgbGFuZ3VhZ2UgIT0gXCJqYXZhXCIpIHtcbiAgICAgICAgaWYgKGltcG9ydGVkLnN5bWJvbEtpbmQgIT0gXCJmdW5jdGlvblwiKSB2YWxpZGF0ZVRhcmdldFR5cGVJZGVudGlmaWVyKGxhbmd1YWdlLCBpbXBvcnROYW1lLCBpbXBvcnRlZC5sb2NhdGlvbilcbiAgICAgICAgZWxzZSB2YWxpZGF0ZVRhcmdldEJpbmRpbmdJZGVudGlmaWVyKGxhbmd1YWdlLCBpbXBvcnROYW1lLCBcImltcG9ydFwiLCBpbXBvcnRlZC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5hbWUgPSB0YXJnZXROYW1lKGxhbmd1YWdlLCBpbXBvcnROYW1lKVxuXG4gICAgICBpZiAobGFuZ3VhZ2UgIT0gXCJydWJ5XCIgJiYgbGFuZ3VhZ2UgIT0gXCJqYXZhXCIgJiYgKGxvY2FsVGFyZ2V0TmFtZXMuaGFzKG5hbWUpIHx8IGltcG9ydGVkVGFyZ2V0TmFtZXMuaGFzKG5hbWUpKSkge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGB0YXJnZXQgaW1wb3J0LW5hbWUgY29sbGlzaW9uICcke2ltcG9ydE5hbWV9J2AsIGltcG9ydGVkLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKGxhbmd1YWdlID09IFwiamF2YVwiKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydGVkQ2xhc3MgPSBpbXBvcnRlZC5zeW1ib2xLaW5kID09IFwiZnVuY3Rpb25cIiA/IG1vZHVsZUNsYXNzTmFtZShyZXNvbHZlZC5tb2R1bGUuaWQpIDogcmVzb2x2ZWQuZGVjbGFyYXRpb24ubmFtZVxuICAgICAgICBjb25zdCBleGlzdGluZ093bmVyID0gamF2YUltcG9ydENsYXNzZXMuZ2V0KGltcG9ydGVkQ2xhc3MpXG5cbiAgICAgICAgaWYgKGV4aXN0aW5nT3duZXIgJiYgZXhpc3RpbmdPd25lciAhPSByZXNvbHZlZC5tb2R1bGUuaWQpIHtcbiAgICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGB0YXJnZXQgaW1wb3J0LWNsYXNzIGNvbGxpc2lvbiAnJHtpbXBvcnRlZENsYXNzfSdgLCBpbXBvcnRlZC5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBqYXZhSW1wb3J0Q2xhc3Nlcy5zZXQoaW1wb3J0ZWRDbGFzcywgcmVzb2x2ZWQubW9kdWxlLmlkKVxuICAgICAgfVxuICAgICAgaWYgKGxhbmd1YWdlID09IFwicnVieVwiKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydGVkTW9kdWxlID0gbW9kdWxlQ2xhc3NOYW1lKHJlc29sdmVkLm1vZHVsZS5pZClcblxuICAgICAgICBpZiAobG9jYWxUYXJnZXROYW1lcy5oYXMoaW1wb3J0ZWRNb2R1bGUpKSB7XG4gICAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBgdGFyZ2V0IGltcG9ydC1tb2R1bGUgY29sbGlzaW9uICcke2ltcG9ydGVkTW9kdWxlfSdgLCBpbXBvcnRlZC5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaW1wb3J0ZWRUYXJnZXROYW1lcy5hZGQobmFtZSlcbiAgICB9XG4gICAgY29uc3QgdmFsdWVEZWNsYXJhdGlvbklkcyA9IG5ldyBTZXQobW9kdWxlLmltcG9ydHMuZmlsdGVyKCh7dHlwZU9ubHl9KSA9PiAhdHlwZU9ubHkpLm1hcCgoe2RlY2xhcmF0aW9uSWR9KSA9PiBkZWNsYXJhdGlvbklkKSlcbiAgICBjb25zdCB0eXBlT25seURlY2xhcmF0aW9uSWRzID0gbmV3IFNldChtb2R1bGUuaW1wb3J0c1xuICAgICAgLmZpbHRlcigoe2RlY2xhcmF0aW9uSWQsIHR5cGVPbmx5fSkgPT4gdHlwZU9ubHkgJiYgIXZhbHVlRGVjbGFyYXRpb25JZHMuaGFzKGRlY2xhcmF0aW9uSWQpKVxuICAgICAgLm1hcCgoe2RlY2xhcmF0aW9uSWR9KSA9PiBkZWNsYXJhdGlvbklkKSlcbiAgICBjb25zdCB2YWx1ZUNvbnN0cnVjdGlvbiA9IGZpbmRUeXBlT25seVZhbHVlQ29uc3RydWN0aW9uKG1vZHVsZSwgdHlwZU9ubHlEZWNsYXJhdGlvbklkcylcblxuICAgIGlmICh2YWx1ZUNvbnN0cnVjdGlvbikge1xuICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcInR5cGUtb25seSBwcm9ncmFtIGltcG9ydCB1c2VkIGFzIGEgdmFsdWVcIiwgdmFsdWVDb25zdHJ1Y3Rpb24ubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBleHBvcnROYW1lcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBleHBvcnRlZCBvZiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBkZWNsYXJhdGlvbnMuZ2V0KGV4cG9ydGVkLmRlY2xhcmF0aW9uSWQpXG4gICAgICBjb25zdCBuYW1lID0gdGFyZ2V0TmFtZShsYW5ndWFnZSwgZXhwb3J0ZWQuZXhwb3J0ZWROYW1lKVxuXG4gICAgICBpZiAobGFuZ3VhZ2UgPT0gXCJqYXZhc2NyaXB0XCIgfHwgbGFuZ3VhZ2UgPT0gXCJ0eXBlc2NyaXB0XCIpIHtcbiAgICAgICAgdmFsaWRhdGVUYXJnZXRJZGVudGlmaWVyKGxhbmd1YWdlLCBleHBvcnRlZC5leHBvcnRlZE5hbWUsIFwiZXhwb3J0XCIsIGV4cG9ydGVkLmxvY2F0aW9uID8/IG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXNvbHZlZCB8fCByZXNvbHZlZC5tb2R1bGUuaWQgIT0gbW9kdWxlLmlkIHx8IGV4cG9ydE5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGB1bnJlc29sdmVkIG9yIGNvbGxpZGluZyB0YXJnZXQgZXhwb3J0ICcke2V4cG9ydGVkLmV4cG9ydGVkTmFtZX0nYCwgZXhwb3J0ZWQubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgZGVjbGFyYXRpb25LaW5kID0gcmVzb2x2ZWQuZGVjbGFyYXRpb24ua2luZCA9PSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiA/IFwiZnVuY3Rpb25cIiA6XG4gICAgICAgIHJlc29sdmVkLmRlY2xhcmF0aW9uLmtpbmQgPT0gXCJSZWNvcmREZWNsYXJhdGlvblwiID8gXCJyZWNvcmRcIiA6XG4gICAgICAgICAgcmVzb2x2ZWQuZGVjbGFyYXRpb24ua2luZCA9PSBcIkNsYXNzRGVjbGFyYXRpb25cIiA/IFwiY2xhc3NcIiA6IFwiZXJyb3JcIlxuXG4gICAgICBpZiAoZXhwb3J0ZWQuc3ltYm9sS2luZCAhPSBkZWNsYXJhdGlvbktpbmQpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBcInByb2dyYW0gZXhwb3J0IGRlY2xhcmF0aW9uIGtpbmQgbWlzbWF0Y2hcIiwgZXhwb3J0ZWQubG9jYXRpb24gPz8gbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKGxhbmd1YWdlICE9IFwiamF2YXNjcmlwdFwiICYmIGxhbmd1YWdlICE9IFwidHlwZXNjcmlwdFwiICYmIGV4cG9ydGVkLmV4cG9ydGVkTmFtZSAhPSByZXNvbHZlZC5kZWNsYXJhdGlvbi5uYW1lKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYGV4cG9ydCBhbGlhcyAnJHtleHBvcnRlZC5leHBvcnRlZE5hbWV9JyB3aXRob3V0IGFuIGVxdWl2YWxlbnQgdGFyZ2V0IGJpbmRpbmdgLFxuICAgICAgICAgIGV4cG9ydGVkLmxvY2F0aW9uID8/IHJlc29sdmVkLmRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgZXhwb3J0TmFtZXMuYWRkKG5hbWUpXG4gICAgfVxuICAgIGlmIChsYW5ndWFnZSA9PSBcInBocFwiKSB7XG4gICAgICBjb25zdCBleHBvcnRlZERlY2xhcmF0aW9uSWRzID0gbmV3IFNldChtb2R1bGUuZXhwb3J0cy5tYXAoKHtkZWNsYXJhdGlvbklkfSkgPT4gZGVjbGFyYXRpb25JZCkpXG4gICAgICBjb25zdCBwcml2YXRlRGVjbGFyYXRpb24gPSBbLi4ubW9kdWxlLnJlY29yZHMgPz8gW10sIC4uLm1vZHVsZS5jbGFzc2VzID8/IFtdLCAuLi5tb2R1bGUuZXJyb3JzID8/IFtdLCAuLi5tb2R1bGUuZnVuY3Rpb25zXS5maW5kKCh7aWR9KSA9PlxuICAgICAgICB0eXBlb2YgaWQgPT0gXCJzdHJpbmdcIiAmJiAhZXhwb3J0ZWREZWNsYXJhdGlvbklkcy5oYXMoaWQpKVxuXG4gICAgICBpZiAocHJpdmF0ZURlY2xhcmF0aW9uKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgYG5vbi1leHBvcnRlZCBkZWNsYXJhdGlvbiAnJHtwcml2YXRlRGVjbGFyYXRpb24ubmFtZX0nIHdpdGhvdXQgdGFyZ2V0LXByaXZhdGUgbW9kdWxlIHZpc2liaWxpdHlgLFxuICAgICAgICAgIHByaXZhdGVEZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gICAgZWFybGllci5hZGQobW9kdWxlLmlkKVxuICB9XG5cbiAgdmFsaWRhdGVQcm9ncmFtU3RkbGliQ29udHJhY3QocHJvZ3JhbSwgbGFuZ3VhZ2UsIGNhcGFiaWxpdHlNb2R1bGVzKVxuICB2YWxpZGF0ZVByb2dyYW1TdGRsaWJGYWNhZGVzKHByb2dyYW0sIGxhbmd1YWdlKVxuXG4gIHJldHVybiBwcm9ncmFtXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGNvbXBpbGVyLXNlbGVjdGVkIGZhY2FkZSBkZXNjcmlwdG9ycywgZXhlY3V0YWJsZSBzb3VyY2VzLCBtb2R1bGUgbWFya2VycywgYW5kIG5hdGl2ZSBpZGVudGl0eSBldmlkZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBwcm9ncmFtIC0gQ2FuZGlkYXRlIHByb2dyYW0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlIGZvciBkaWFnbm9zdGljcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVByb2dyYW1TdGRsaWJGYWNhZGVzKHByb2dyYW0sIGxhbmd1YWdlKSB7XG4gIGNvbnN0IGRlc2NyaXB0b3IgPSBSZWZsZWN0LmdldChwcm9ncmFtLCBcInN0ZGxpYkZhY2FkZXNcIilcbiAgY29uc3QgbWFya2VkTW9kdWxlcyA9IHByb2dyYW0ubW9kdWxlcy5maWx0ZXIoKG1vZHVsZSkgPT4gUmVmbGVjdC5nZXQobW9kdWxlLCBcInN0ZGxpYkZhY2FkZVwiKSAhPT0gdW5kZWZpbmVkKVxuICBjb25zdCBmYWNhZGVTb3VyY2VzID0gcHJvZ3JhbS5zb3VyY2VzLmZpbHRlcigoc291cmNlKSA9PiBSZWZsZWN0LmdldChzb3VyY2UsIFwib3duZXJzaGlwXCIpID09IFwiZmFjYWRlXCIpXG4gIGNvbnN0IGV2aWRlbmNlZEltcG9ydHMgPSBwcm9ncmFtLm1vZHVsZXMuZmxhdE1hcCgobW9kdWxlKSA9PiBtb2R1bGUuaW1wb3J0cy5maWx0ZXIoKGl0ZW0pID0+IFJlZmxlY3QuZ2V0KGl0ZW0sIFwic3RkbGliRmFjYWRlXCIpICE9PSB1bmRlZmluZWQpKVxuXG4gIGlmIChkZXNjcmlwdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAobWFya2VkTW9kdWxlcy5sZW5ndGggPiAwIHx8IGZhY2FkZVNvdXJjZXMubGVuZ3RoID4gMCB8fCBldmlkZW5jZWRJbXBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIkZhY2FkZSBtb2R1bGVzLCBzb3VyY2VzLCBvciBpbXBvcnQgZXZpZGVuY2UgcmVxdWlyZSBhIGNvbXBsZXRlIHByb2dyYW0gZmFjYWRlIGRlc2NyaXB0b3IuXCIpXG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIGlmICghaXNQbGFpbk9iamVjdChkZXNjcmlwdG9yKSB8fCBkZXNjcmlwdG9yLnNjaGVtYSAhPSBcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlc1wiIHx8IGRlc2NyaXB0b3IudmVyc2lvbiAhPSAxIHx8XG4gICAgdHlwZW9mIGRlc2NyaXB0b3IubGFuZ3VhZ2UgIT0gXCJzdHJpbmdcIiB8fCAhcHJvZ3JhbVRhcmdldHMuaGFzKGRlc2NyaXB0b3IubGFuZ3VhZ2UpIHx8ICFpc0RlbnNlQXJyYXkoZGVzY3JpcHRvci5tb2R1bGVzKSB8fFxuICAgIGRlc2NyaXB0b3IubW9kdWxlcy5sZW5ndGggPT0gMCkge1xuICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIlRoZSBwcm9ncmFtIGZhY2FkZSBkZXNjcmlwdG9yIGlzIG1hbGZvcm1lZC5cIilcbiAgfVxuICBjb25zdCBmYWNhZGVMYW5ndWFnZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gKi8gKGRlc2NyaXB0b3IubGFuZ3VhZ2UpXG4gIGNvbnN0IHJlY29yZHMgPSBkZXNjcmlwdG9yLm1vZHVsZXMubWFwKChpdGVtKSA9PiB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGl0ZW0pIHx8IHR5cGVvZiBpdGVtLmlkZW50aXR5ICE9IFwic3RyaW5nXCIgfHwgdHlwZW9mIGl0ZW0udmVyc2lvbiAhPSBcInN0cmluZ1wiKSB7XG4gICAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgXCJUaGUgcHJvZ3JhbSBmYWNhZGUgbW9kdWxlIGRlc2NyaXB0b3IgaXMgbWFsZm9ybWVkLlwiKVxuICAgIH1cbiAgICByZXR1cm4gc3RkbGliRmFjYWRlUmVnaXN0cnkucmVzb2x2ZUlkZW50aXR5KGl0ZW0uaWRlbnRpdHksIGZhY2FkZUxhbmd1YWdlLCBpdGVtLnZlcnNpb24pXG4gIH0pXG4gIGNvbnN0IGV4cGVjdGVkID0gc3RkbGliRmFjYWRlUHJvZ3JhbURlc2NyaXB0b3IoZmFjYWRlTGFuZ3VhZ2UsIHJlY29yZHMpXG5cbiAgaWYgKCFlcXVhbFBsYWluRGF0YShkZXNjcmlwdG9yLCBleHBlY3RlZCkpIHtcbiAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgXCJUaGUgcHJvZ3JhbSBmYWNhZGUgZGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCB0aGUgcmVnaXN0ZXJlZCB2ZXJzaW9uZWQgZmFjYWRlIGNsb3N1cmUuXCIpXG4gIH1cbiAgY29uc3Qgc2VsZWN0ZWRSZWNvcmRzID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgIGlmIChzZWxlY3RlZFJlY29yZHMuaGFzKHJlY29yZC5pZGVudGl0eSkpIHtcbiAgICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBgRmFjYWRlICcke3JlY29yZC5pZGVudGl0eX0nIGlzIHNlbGVjdGVkIG1vcmUgdGhhbiBvbmNlLmApXG4gICAgfVxuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiByZWNvcmQuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHN0ZGxpYkZhY2FkZVJlZ2lzdHJ5LnJlc29sdmVJZGVudGl0eShkZXBlbmRlbmN5LmlkZW50aXR5LCBmYWNhZGVMYW5ndWFnZSwgZGVwZW5kZW5jeS5yYW5nZSlcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gc2VsZWN0ZWRSZWNvcmRzLmdldChyZXNvbHZlZC5pZGVudGl0eSlcblxuICAgICAgaWYgKCFzZWxlY3RlZCB8fCBzZWxlY3RlZC52ZXJzaW9uICE9IHJlc29sdmVkLnZlcnNpb24pIHtcbiAgICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIGBGYWNhZGUgJyR7cmVjb3JkLmlkZW50aXR5fScgZGVwZW5kZW5jeSAnJHtyZXNvbHZlZC5pZGVudGl0eX1AJHtyZXNvbHZlZC52ZXJzaW9ufScgaXMgbWlzc2luZyBvciBvdXQgb2Ygb3JkZXIuYClcbiAgICAgIH1cbiAgICB9XG4gICAgc2VsZWN0ZWRSZWNvcmRzLnNldChyZWNvcmQuaWRlbnRpdHksIHJlY29yZClcbiAgfVxuICBpZiAobWFya2VkTW9kdWxlcy5sZW5ndGggIT0gcmVjb3Jkcy5sZW5ndGgpIHtcbiAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgXCJUaGUgcHJvZ3JhbSBmYWNhZGUgZGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCBpdHMgZXhlY3V0YWJsZSBzZW1hbnRpYyBtb2R1bGVzLlwiKVxuICB9XG4gIGlmIChwcm9ncmFtLnNvdXJjZXMuc29tZSgoc291cmNlKSA9PiBzb3VyY2UubGFuZ3VhZ2UgIT0gZmFjYWRlTGFuZ3VhZ2UgfHxcbiAgICAhW1wiYXBwbGljYXRpb25cIiwgXCJmYWNhZGVcIl0uaW5jbHVkZXMoU3RyaW5nKFJlZmxlY3QuZ2V0KHNvdXJjZSwgXCJvd25lcnNoaXBcIikpKSkpIHtcbiAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgXCJGYWNhZGUgcHJvZ3JhbXMgcmVxdWlyZSBvbmUgc291cmNlIGxhbmd1YWdlIGFuZCBleHBsaWNpdCBhcHBsaWNhdGlvbi9mYWNhZGUgb3duZXJzaGlwLlwiKVxuICB9XG4gIGNvbnN0IHNlbGVjdGVkSWRlbnRpdGllcyA9IG5ldyBTZXQocmVjb3Jkcy5tYXAoKHtpZGVudGl0eX0pID0+IGlkZW50aXR5KSlcbiAgY29uc3QgcmVnaXN0ZXJlZE1vZHVsZXMgPSByZXBhcnNlUmVnaXN0ZXJlZEZhY2FkZU1vZHVsZXMocHJvZ3JhbSwgZmFjYWRlTGFuZ3VhZ2UsIGxhbmd1YWdlKVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByZWNvcmRzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHNbaW5kZXhdXG4gICAgY29uc3QgbW9kdWxlID0gbWFya2VkTW9kdWxlc1tpbmRleF1cbiAgICBjb25zdCBtYXJrZXIgPSBSZWZsZWN0LmdldChtb2R1bGUsIFwic3RkbGliRmFjYWRlXCIpXG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QobWFya2VyKSB8fCBPYmplY3Qua2V5cyhtYXJrZXIpLnNvcnQoKS5qb2luKFwiLFwiKSAhPSBcImlkZW50aXR5LHZlcnNpb25cIiB8fFxuICAgICAgbWFya2VyLmlkZW50aXR5ICE9IHJlY29yZC5pZGVudGl0eSB8fCBtYXJrZXIudmVyc2lvbiAhPSByZWNvcmQudmVyc2lvbiB8fCBtb2R1bGUuaWQgIT0gcmVjb3JkLnNvdXJjZS5pZCB8fFxuICAgICAgbW9kdWxlLnNvdXJjZUZpbGVuYW1lICE9IHJlY29yZC5zb3VyY2UuZmlsZW5hbWUpIHtcbiAgICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBgRmFjYWRlICcke3JlY29yZC5pZGVudGl0eX0nIHNlbWFudGljIG1vZHVsZSBpZGVudGl0eSBpcyBub3QgY2Fub25pY2FsLmApXG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHByb2dyYW0uc291cmNlcy5maW5kKCh7ZmlsZW5hbWV9KSA9PiBmaWxlbmFtZSA9PSByZWNvcmQuc291cmNlLmZpbGVuYW1lKVxuXG4gICAgaWYgKCFzb3VyY2UgfHwgc291cmNlLmNvbnRlbnQgIT0gcmVjb3JkLnNvdXJjZS5jb250ZW50IHx8IFJlZmxlY3QuZ2V0KHNvdXJjZSwgXCJvd25lcnNoaXBcIikgIT0gXCJmYWNhZGVcIikge1xuICAgICAgaW52YWxpZEZhY2FkZURlc2NyaXB0b3IobGFuZ3VhZ2UsIGBGYWNhZGUgJyR7cmVjb3JkLmlkZW50aXR5fScgZXhlY3V0YWJsZSBzb3VyY2UgZG9lcyBub3QgbWF0Y2ggaXRzIHJlZ2lzdGVyZWQgZGVmaW5pdGlvbi5gKVxuICAgIH1cbiAgICBjb25zdCByZWdpc3RlcmVkTW9kdWxlID0gcmVnaXN0ZXJlZE1vZHVsZXMuZ2V0KHJlY29yZC5pZGVudGl0eSlcblxuICAgIGlmICghcmVnaXN0ZXJlZE1vZHVsZSB8fCAhZXF1YWxQbGFpbkRhdGEobW9kdWxlLCByZWdpc3RlcmVkTW9kdWxlKSkge1xuICAgICAgaW52YWxpZEZhY2FkZUF1dGhvcml0eShsYW5ndWFnZSxcbiAgICAgICAgYEZhY2FkZSAnJHtyZWNvcmQuaWRlbnRpdHl9JyBzZW1hbnRpYyBtb2R1bGUgZG9lcyBub3QgbWF0Y2ggaXRzIHJlZ2lzdGVyZWQgZXhlY3V0YWJsZSBzb3VyY2UuYCwgbW9kdWxlLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBhbGxvd2VkT3BlcmF0aW9ucyA9IG5ldyBTZXQocmVjb3JkLnJlcXVpcmVtZW50cy5mbGF0TWFwKCh7b3BlcmF0aW9uc30pID0+IG9wZXJhdGlvbnMpKVxuICAgIGNvbnN0IHVzZWRPcGVyYXRpb25zID0gY29sbGVjdERlY2xhcmVkRWZmZWN0T3BlcmF0aW9ucyhtb2R1bGUpXG5cbiAgICBpZiAoYWxsb3dlZE9wZXJhdGlvbnMuc2l6ZSAhPSB1c2VkT3BlcmF0aW9ucy5zaXplIHx8IFsuLi5hbGxvd2VkT3BlcmF0aW9uc10uc29tZSgob3BlcmF0aW9uKSA9PiAhdXNlZE9wZXJhdGlvbnMuaGFzKG9wZXJhdGlvbikpKSB7XG4gICAgICBpbnZhbGlkRmFjYWRlQXV0aG9yaXR5KGxhbmd1YWdlLCBgRmFjYWRlICcke3JlY29yZC5pZGVudGl0eX0nIHNlbWFudGljIGJvZHkgZG9lcyBub3QgbWF0Y2ggaXRzIGRlY2xhcmVkIGNhbm9uaWNhbCByZXF1aXJlbWVudHMuYCwgbW9kdWxlLmxvY2F0aW9uKVxuICAgIH1cbiAgfVxuICBpZiAoZmFjYWRlU291cmNlcy5sZW5ndGggIT0gcmVjb3Jkcy5sZW5ndGgpIHtcbiAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgXCJUaGUgcHJvZ3JhbSBjb250YWlucyBhbiB1bnNlbGVjdGVkIGNvbXBpbGVyLW93bmVkIGZhY2FkZSBzb3VyY2UuXCIpXG4gIH1cbiAgaWYgKGV2aWRlbmNlZEltcG9ydHMubGVuZ3RoID09IDApIHtcbiAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgXCJUaGUgc2VsZWN0ZWQgZmFjYWRlIGNsb3N1cmUgaGFzIG5vIHBhcnNlci1wcm92ZWQgbmF0aXZlIGltcG9ydCBldmlkZW5jZS5cIilcbiAgfVxuICBmb3IgKGNvbnN0IGltcG9ydGVkIG9mIGV2aWRlbmNlZEltcG9ydHMpIHtcbiAgICBjb25zdCBldmlkZW5jZSA9IFJlZmxlY3QuZ2V0KGltcG9ydGVkLCBcInN0ZGxpYkZhY2FkZVwiKVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGV2aWRlbmNlKSB8fCBPYmplY3Qua2V5cyhldmlkZW5jZSkuc29ydCgpLmpvaW4oXCIsXCIpICE9XG4gICAgICBcImZhY2FkZUlkZW50aXR5LGZhY2FkZVZlcnNpb24sbmF0aXZlTW9kdWxlLG5hdGl2ZVN5bWJvbCxzY2hlbWEsdmVyc2lvblwiIHx8XG4gICAgICBldmlkZW5jZS5zY2hlbWEgIT0gXCJTZW1hbnRpZm9sZFN0ZGxpYkZhY2FkZVJlc29sdXRpb25cIiB8fCBldmlkZW5jZS52ZXJzaW9uICE9IDEgfHxcbiAgICAgIHR5cGVvZiBldmlkZW5jZS5mYWNhZGVJZGVudGl0eSAhPSBcInN0cmluZ1wiIHx8IHR5cGVvZiBldmlkZW5jZS5mYWNhZGVWZXJzaW9uICE9IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVvZiBldmlkZW5jZS5uYXRpdmVNb2R1bGUgIT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgZXZpZGVuY2UubmF0aXZlU3ltYm9sICE9IFwic3RyaW5nXCIpIHtcbiAgICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIkEgZmFjYWRlIGltcG9ydCBoYXMgbWFsZm9ybWVkIG5hdGl2ZSBpZGVudGl0eSBldmlkZW5jZS5cIilcbiAgICB9XG4gICAgY29uc3QgcmVjb3JkID0gc3RkbGliRmFjYWRlUmVnaXN0cnkucmVzb2x2ZUZhY2FkZShmYWNhZGVMYW5ndWFnZSwgZXZpZGVuY2UubmF0aXZlTW9kdWxlLCBldmlkZW5jZS5uYXRpdmVTeW1ib2wsXG4gICAgICBldmlkZW5jZS5mYWNhZGVWZXJzaW9uKVxuXG4gICAgaWYgKHJlY29yZC5pZGVudGl0eSAhPSBldmlkZW5jZS5mYWNhZGVJZGVudGl0eSB8fCAhc2VsZWN0ZWRJZGVudGl0aWVzLmhhcyhyZWNvcmQuaWRlbnRpdHkpIHx8IGltcG9ydGVkLm1vZHVsZUlkICE9IHJlY29yZC5zb3VyY2UuaWQgfHxcbiAgICAgIGltcG9ydGVkLmltcG9ydGVkTmFtZSAhPSBldmlkZW5jZS5uYXRpdmVTeW1ib2wpIHtcbiAgICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGxhbmd1YWdlLCBcIkEgZmFjYWRlIGltcG9ydCBkb2VzIG5vdCBtYXRjaCBpdHMgcmVnaXN0ZXJlZCBuYXRpdmUgbW9kdWxlIGFuZCBzeW1ib2wgaWRlbnRpdHkuXCIpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdHMgZXZlcnkgY2Fub25pY2FsIG9wZXJhdGlvbiBwcmVzZW50IGluIG9uZSB2YWxpZGF0ZWQgZmFjYWRlIGltcGxlbWVudGF0aW9uLlxuICogVGhpcyBjaGVja3MgdGhlIGZhY2FkZSdzIGNvbXBsZXRlIGRlY2xhcmVkIGF1dGhvcml0eSBpbmRlcGVuZGVudGx5IGZyb20gcHJvZ3JhbSByZWFjaGFiaWxpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX0gbW9kdWxlIC0gRmFjYWRlIG1vZHVsZS5cbiAqIEByZXR1cm5zIHtTZXQ8c3RyaW5nPn0gVXNlZCBvcGVyYXRpb24gbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3REZWNsYXJlZEVmZmVjdE9wZXJhdGlvbnMobW9kdWxlKSB7XG4gIGNvbnN0IG9wZXJhdGlvbk5hbWVzID0gbmV3IE1hcChtb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKCh7b3BlcmF0aW9uc30pID0+XG4gICAgb3BlcmF0aW9ucy5tYXAoKG9wZXJhdGlvbikgPT4gW29wZXJhdGlvbi5pZCwgb3BlcmF0aW9uLm5hbWVdKSkgPz8gW10pXG4gIGNvbnN0IHVzZWQgPSBuZXcgU2V0KClcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAvKipcbiAgICogVmlzaXRzIG9uZSBmYWNhZGUgc2VtYW50aWMgc3VidHJlZS5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyBzdWJ0cmVlLlxuICAgKi9cbiAgY29uc3QgdmlzaXQgPSAodmFsdWUpID0+IHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuXG4gICAgc2Vlbi5hZGQodmFsdWUpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uID0gUmVmbGVjdC5nZXQodmFsdWUsIFwia2luZFwiKSA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIgPyBSZWZsZWN0LmdldCh2YWx1ZSwgXCJvcGVyYXRpb25cIikgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHR5cGVvZiBvcGVyYXRpb24gPT0gXCJzdHJpbmdcIiAmJiBvcGVyYXRpb25OYW1lcy5oYXMob3BlcmF0aW9uKSkgdXNlZC5hZGQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChvcGVyYXRpb25OYW1lcy5nZXQob3BlcmF0aW9uKSkpXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKFtcImNhcGFiaWxpdGllc1wiLCBcImxvY2F0aW9uXCIsIFwicHJvdmVuYW5jZVwiLCBcInJlc29sdXRpb25cIiwgXCJzb3VyY2VQcm92ZW5hbmNlXCJdLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlXG4gICAgICAgIHZpc2l0KGNoaWxkKVxuICAgICAgfVxuICAgIH0gZWxzZSBmb3IgKGNvbnN0IGNoaWxkIG9mIHZhbHVlKSB2aXNpdChjaGlsZClcbiAgfVxuXG4gIHZpc2l0KHtjbGFzc2VzOiBtb2R1bGUuY2xhc3NlcywgZW50cnlQb2ludDogbW9kdWxlLmVudHJ5UG9pbnQsIGZ1bmN0aW9uczogbW9kdWxlLmZ1bmN0aW9uc30pXG4gIHJldHVybiB1c2VkXG59XG5cbi8qKlxuICogUmVjb21waWxlcyB0aGUgcmVnaXN0cnktc2VsZWN0ZWQgZmFjYWRlIGNsb3N1cmUgZnJvbSByZXRhaW5lZCBjYWxsZXIgaW5wdXRzIGFuZCByZWdpc3RlcmVkIGZhY2FkZSBzb3VyY2UuXG4gKiBUaGlzIHBhcnNlci1iYWNrZWQgcmVmZXJlbmNlIGdyYXBoIGlzIGNyZWF0ZWQgZHVyaW5nIHZhbGlkYXRpb24sIGJlZm9yZSBwcm92aWRlciBwbGFubmluZyBvciB3cml0ZXIgYWxsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBwcm9ncmFtIC0gVW50cnVzdGVkIG11dGFibGUgc2VtYW50aWMgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gZmFjYWRlTGFuZ3VhZ2UgLSBTZWxlY3RlZCBzb3VyY2UtbGFuZ3VhZ2UgZmFjYWRlIHByb2ZpbGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGRpYWdub3N0aWNMYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZSBmb3IgYm91bmRhcnkgZGlhZ25vc3RpY3MuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlPn0gQ2Fub25pY2FsIHNlbWFudGljIG1vZHVsZXMgYnkgZmFjYWRlIGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiByZXBhcnNlUmVnaXN0ZXJlZEZhY2FkZU1vZHVsZXMocHJvZ3JhbSwgZmFjYWRlTGFuZ3VhZ2UsIGRpYWdub3N0aWNMYW5ndWFnZSkge1xuICBjb25zdCBhcHBsaWNhdGlvbk1vZHVsZXMgPSBwcm9ncmFtLm1vZHVsZXMuZmlsdGVyKChtb2R1bGUpID0+IFJlZmxlY3QuZ2V0KG1vZHVsZSwgXCJzdGRsaWJGYWNhZGVcIikgPT09IHVuZGVmaW5lZClcbiAgY29uc3QgbW9kdWxlc0J5RmlsZW5hbWUgPSBuZXcgTWFwKGFwcGxpY2F0aW9uTW9kdWxlcy5tYXAoKG1vZHVsZSkgPT4gW21vZHVsZS5zb3VyY2VGaWxlbmFtZSwgbW9kdWxlXSkpXG4gIGNvbnN0IGFwcGxpY2F0aW9uU291cmNlcyA9IHByb2dyYW0uc291cmNlcy5maWx0ZXIoKHNvdXJjZSkgPT4gUmVmbGVjdC5nZXQoc291cmNlLCBcIm93bmVyc2hpcFwiKSA9PSBcImFwcGxpY2F0aW9uXCIpLm1hcCgoc291cmNlKSA9PiB7XG4gICAgY29uc3QgbW9kdWxlID0gbW9kdWxlc0J5RmlsZW5hbWUuZ2V0KHNvdXJjZS5maWxlbmFtZSlcblxuICAgIGlmICghbW9kdWxlKSBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihkaWFnbm9zdGljTGFuZ3VhZ2UsXG4gICAgICBgQXBwbGljYXRpb24gc291cmNlICcke3NvdXJjZS5maWxlbmFtZX0nIGhhcyBubyBtYXRjaGluZyBzZW1hbnRpYyBtb2R1bGUgZm9yIGZhY2FkZSB2ZXJpZmljYXRpb24uYClcbiAgICByZXR1cm4ge1xuICAgICAgZmlsZW5hbWU6IHNvdXJjZS5maWxlbmFtZSxcbiAgICAgIGlkOiAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX0gKi8gKG1vZHVsZSkuaWQsXG4gICAgICBsYW5ndWFnZTogZmFjYWRlTGFuZ3VhZ2UsXG4gICAgICBzb3VyY2U6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc291cmNlLmNvbnRlbnQpXG4gICAgfVxuICB9KVxuXG4gIGlmIChhcHBsaWNhdGlvblNvdXJjZXMubGVuZ3RoICE9IGFwcGxpY2F0aW9uTW9kdWxlcy5sZW5ndGgpIHtcbiAgICBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihkaWFnbm9zdGljTGFuZ3VhZ2UsIFwiRmFjYWRlIHZlcmlmaWNhdGlvbiByZXF1aXJlcyBvbmUgcmV0YWluZWQgYXBwbGljYXRpb24gc291cmNlIHBlciBzZW1hbnRpYyBtb2R1bGUuXCIpXG4gIH1cbiAgY29uc3QgcmVwYXJzZWQgPSBwYXJzZVByb2dyYW1Tb3VyY2Uoe2VudHJ5TW9kdWxlOiBwcm9ncmFtLmVudHJ5TW9kdWxlLCBzb3VyY2VzOiBhcHBsaWNhdGlvblNvdXJjZXN9KVxuICBjb25zdCBtb2R1bGVzID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgcmVwYXJzZWQubW9kdWxlcykge1xuICAgIGlmICghbW9kdWxlLnN0ZGxpYkZhY2FkZSkgY29udGludWVcbiAgICBpZiAobW9kdWxlcy5oYXMobW9kdWxlLnN0ZGxpYkZhY2FkZS5pZGVudGl0eSkpIHtcbiAgICAgIGludmFsaWRGYWNhZGVEZXNjcmlwdG9yKGRpYWdub3N0aWNMYW5ndWFnZSwgYFJlZ2lzdGVyZWQgZmFjYWRlICcke21vZHVsZS5zdGRsaWJGYWNhZGUuaWRlbnRpdHl9JyByZXBhcnNlZCBtb3JlIHRoYW4gb25jZS5gKVxuICAgIH1cbiAgICBtb2R1bGVzLnNldChtb2R1bGUuc3RkbGliRmFjYWRlLmlkZW50aXR5LCBtb2R1bGUpXG4gIH1cbiAgcmV0dXJuIG1vZHVsZXNcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBjbG9zZWQgcGxhaW4gSlNPTi1zaGFwZWQgZGF0YSB3aXRob3V0IGNvZXJjaW9uIG9yIGtleS1vcmRlciBhc3N1bXB0aW9ucy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gbGVmdCAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcmlnaHQgLSBFeHBlY3RlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBFeGFjdCByZWN1cnNpdmUgZXF1aXZhbGVuY2UuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsUGxhaW5EYXRhKGxlZnQsIHJpZ2h0KSB7XG4gIGlmIChsZWZ0ID09PSByaWdodCkgcmV0dXJuIHRydWVcbiAgaWYgKEFycmF5LmlzQXJyYXkobGVmdCkgfHwgQXJyYXkuaXNBcnJheShyaWdodCkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShsZWZ0KSAmJiBBcnJheS5pc0FycmF5KHJpZ2h0KSAmJiBpc0RlbnNlQXJyYXkobGVmdCkgJiYgaXNEZW5zZUFycmF5KHJpZ2h0KSAmJlxuICAgICAgbGVmdC5sZW5ndGggPT0gcmlnaHQubGVuZ3RoICYmIGxlZnQuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gZXF1YWxQbGFpbkRhdGEodmFsdWUsIHJpZ2h0W2luZGV4XSkpXG4gIH1cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGxlZnQpIHx8ICFpc1BsYWluT2JqZWN0KHJpZ2h0KSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IGxlZnRLZXlzID0gT2JqZWN0LmtleXMobGVmdCkuc29ydCgpXG4gIGNvbnN0IHJpZ2h0S2V5cyA9IE9iamVjdC5rZXlzKHJpZ2h0KS5zb3J0KClcblxuICByZXR1cm4gbGVmdEtleXMubGVuZ3RoID09IHJpZ2h0S2V5cy5sZW5ndGggJiYgbGVmdEtleXMuZXZlcnkoKGtleSwgaW5kZXgpID0+XG4gICAga2V5ID09IHJpZ2h0S2V5c1tpbmRleF0gJiYgZXF1YWxQbGFpbkRhdGEobGVmdFtrZXldLCByaWdodFtrZXldKSlcbn1cblxuLyoqXG4gKiBUaHJvd3Mgb25lIHN0YWJsZSBmYWNhZGUgYXJ0aWZhY3QtYm91bmRhcnkgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIERpYWdub3N0aWMgZGV0YWlsLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBpbnZhbGlkRmFjYWRlRGVzY3JpcHRvcihsYW5ndWFnZSwgbWVzc2FnZSkge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIlNURExJQl9GQUNBREVfREVTQ1JJUFRPUl9JTlZBTElEXCIsIGxhbmd1YWdlLCBtZXNzYWdlfSlcbn1cblxuLyoqXG4gKiBUaHJvd3Mgd2hlbiBhIGZhY2FkZSBzZW1hbnRpYyBib2R5IGV4Y2VlZHMgb3Igb21pdHMgaXRzIHJlZ2lzdHJ5LWRlY2xhcmVkIGF1dGhvcml0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIERpYWdub3N0aWMgZGV0YWlsLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBGYWNhZGUgc291cmNlIGxvY2F0aW9uLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBpbnZhbGlkRmFjYWRlQXV0aG9yaXR5KGxhbmd1YWdlLCBtZXNzYWdlLCBsb2NhdGlvbikge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIlNURExJQl9GQUNBREVfQVVUSE9SSVRZX0ZPUkdFRFwiLCBsYW5ndWFnZSwgbG9jYXRpb24sIG1lc3NhZ2V9KVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgcHJvZ3JhbSBzdGRsaWIgbGluayBkZXNjcmlwdG9yIGFnYWluc3QgaXRzIGNhcGFiaWxpdHkgbW9kdWxlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBwcm9ncmFtIC0gQ2FuZGlkYXRlIHByb2dyYW0uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gVGFyZ2V0IGxhbmd1YWdlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGVbXX0gY2FwYWJpbGl0eU1vZHVsZXMgLSBNb2R1bGVzIGNhcnJ5aW5nIGNhcGFiaWxpdGllcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVByb2dyYW1TdGRsaWJDb250cmFjdChwcm9ncmFtLCBsYW5ndWFnZSwgY2FwYWJpbGl0eU1vZHVsZXMpIHtcbiAgY29uc3QgY29udHJhY3QgPSBSZWZsZWN0LmdldChwcm9ncmFtLCBcInN0ZGxpYkNvbnRyYWN0XCIpXG4gIGNvbnN0IGNvbnRyYWN0cyA9IFJlZmxlY3QuZ2V0KHByb2dyYW0sIFwic3RkbGliQ29udHJhY3RzXCIpXG5cbiAgaWYgKGNhcGFiaWxpdHlNb2R1bGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgaWYgKGNvbnRyYWN0ICE9PSB1bmRlZmluZWQgfHwgY29udHJhY3RzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IFwiQSBkZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IHJlcXVpcmVzIGNhcGFiaWxpdHkgbW9kdWxlcy5cIlxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGNvbnRyYWN0ICE9PSB1bmRlZmluZWQgJiYgY29udHJhY3RzICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgICAgbGFuZ3VhZ2UsXG4gICAgICBtZXNzYWdlOiBcIkEgcHJvZ3JhbSBjYW5ub3QgZGVjbGFyZSBib3RoIHNpbmd1bGFyIGFuZCBwbHVyYWwgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdCBkZXNjcmlwdG9ycy5cIlxuICAgIH0pXG4gIH1cbiAgaWYgKGNvbnRyYWN0ID09PSB1bmRlZmluZWQgJiYgY29udHJhY3RzID09PSB1bmRlZmluZWQpIHtcbiAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIFwicHJvZ3JhbSBtb2R1bGVzIHdpdGggY2FwYWJpbGl0aWVzIHJlcXVpcmUgYSBkZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0XCIsXG4gICAgICBjYXBhYmlsaXR5TW9kdWxlc1swXS5sb2NhdGlvbilcbiAgfVxuICBjb25zdCBkZWNsYXJlZCA9IGNvbnRyYWN0cyA9PT0gdW5kZWZpbmVkID8gW2NvbnRyYWN0XSA6IGNvbnRyYWN0c1xuXG4gIGlmICghaXNEZW5zZUFycmF5KGRlY2xhcmVkKSB8fCBkZWNsYXJlZC5sZW5ndGggPT0gMCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJTVERMSUJfTElOS19GQUlMVVJFXCIsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgIG1lc3NhZ2U6IFwiVGhlIGRlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QgZGVzY3JpcHRvciBsaXN0IGlzIG1hbGZvcm1lZCBvciBlbXB0eS5cIlxuICAgIH0pXG4gIH1cbiAgY29uc3QgaWRlbnRpdGllcyA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3QgZGVzY3JpcHRvciBvZiBkZWNsYXJlZCkge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChkZXNjcmlwdG9yKSB8fCBPYmplY3Qua2V5cyhkZXNjcmlwdG9yKS5zb21lKChrZXkpID0+IGtleSAhPSBcImlkZW50aXR5XCIgJiYga2V5ICE9IFwiY29udHJhY3RWZXJzaW9uXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgY29kZTogXCJTVERMSUJfTElOS19GQUlMVVJFXCIsXG4gICAgICAgIGxhbmd1YWdlLFxuICAgICAgICBtZXNzYWdlOiBcIlRoZSBkZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IGRlc2NyaXB0b3IgaXMgbWFsZm9ybWVkLlwiXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBpZGVudGl0eSA9IGRlc2NyaXB0b3IuaWRlbnRpdHlcblxuICAgIGlmICh0eXBlb2YgaWRlbnRpdHkgIT0gXCJzdHJpbmdcIiB8fCBpZGVudGl0eS5sZW5ndGggPT0gMCB8fCBpZGVudGl0aWVzLmhhcyhpZGVudGl0eSkgfHxcbiAgICAgICFsaXN0U3RkbGliTW9kdWxlcygpLnNvbWUoKHtpZGVudGl0eTogcmVnaXN0ZXJlZH0pID0+IHJlZ2lzdGVyZWQgPT0gaWRlbnRpdHkpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgY29kZTogXCJTVERMSUJfTElOS19GQUlMVVJFXCIsXG4gICAgICAgIGxhbmd1YWdlLFxuICAgICAgICBtZXNzYWdlOiBgRGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdCAnJHtTdHJpbmcoaWRlbnRpdHkpfScgaXMgZHVwbGljYXRlIG9yIG5vdCBhIHJlZ2lzdGVyZWQgY2Fub25pY2FsIG1vZHVsZS5gXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRvci5jb250cmFjdFZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBwYXJzZVN0ZGxpYlZlcnNpb25SYW5nZShkZXNjcmlwdG9yLmNvbnRyYWN0VmVyc2lvbikgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9MSU5LX0ZBSUxVUkVcIixcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IGBEZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IHZlcnNpb24gJyR7U3RyaW5nKGRlc2NyaXB0b3IuY29udHJhY3RWZXJzaW9uKX0nIGlzIG5vdCBjYW5vbmljYWwuYFxuICAgICAgfSlcbiAgICB9XG4gICAgaWRlbnRpdGllcy5hZGQoaWRlbnRpdHkpXG4gIH1cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgY2FwYWJpbGl0eU1vZHVsZXMpIHtcbiAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgbW9kdWxlLmNhcGFiaWxpdGllcyA/PyBbXSkge1xuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGNhcGFiaWxpdHkpIHx8IHR5cGVvZiBjYXBhYmlsaXR5LmF1dGhvcml0eUlkICE9IFwic3RyaW5nXCIgfHwgIWlkZW50aXRpZXMuaGFzKGNhcGFiaWxpdHkuYXV0aG9yaXR5SWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICAgIGNvZGU6IFwiU1RETElCX0xJTktfRkFJTFVSRVwiLFxuICAgICAgICAgIGxhbmd1YWdlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBDYXBhYmlsaXR5IGF1dGhvcml0eSAnJHtTdHJpbmcoUmVmbGVjdC5nZXQoY2FwYWJpbGl0eSwgXCJhdXRob3JpdHlJZFwiKSl9JyBkb2VzIG5vdCBtYXRjaCBhIGRlY2xhcmVkIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QuYFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEZpbmRzIGEgcmVjb3JkIGNvbnN0cnVjdGlvbiB0aGF0IGNyb3NzZXMgYSB0eXBlLW9ubHkgaW1wb3J0IGVkZ2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZX0gbW9kdWxlIC0gSW1wb3J0aW5nIHNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IHR5cGVPbmx5RGVjbGFyYXRpb25JZHMgLSBJbXBvcnRlZCBpZGVudGl0aWVzIHVuYXZhaWxhYmxlIGluIHZhbHVlIHBvc2l0aW9ucy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmRDb25zdHJ1Y3Rpb24gfCB1bmRlZmluZWR9IEludmFsaWQgY29uc3RydWN0aW9uIHdoZW4gcHJlc2VudC5cbiAqL1xuZnVuY3Rpb24gZmluZFR5cGVPbmx5VmFsdWVDb25zdHJ1Y3Rpb24obW9kdWxlLCB0eXBlT25seURlY2xhcmF0aW9uSWRzKSB7XG4gIGlmICh0eXBlT25seURlY2xhcmF0aW9uSWRzLnNpemUgPT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBzZWVuID0gbmV3IFdlYWtTZXQoKVxuXG4gIC8qKlxuICAgKiBWaXNpdHMgb25lIHNlbWFudGljIHZhbHVlLlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHN1YnRyZWUuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmRDb25zdHJ1Y3Rpb24gfCB1bmRlZmluZWR9IEludmFsaWQgY29uc3RydWN0aW9uIHdoZW4gcHJlc2VudC5cbiAgICovXG4gIGZ1bmN0aW9uIHZpc2l0KHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyh2YWx1ZSkpIHJldHVybiB1bmRlZmluZWRcbiAgICBzZWVuLmFkZCh2YWx1ZSlcbiAgICBjb25zdCBvYmplY3QgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpXG5cbiAgICBpZiAob2JqZWN0LmtpbmQgPT0gXCJSZWNvcmRDb25zdHJ1Y3Rpb25cIiAmJiBpc1BsYWluT2JqZWN0KG9iamVjdC5yZWNvcmQpICYmXG4gICAgICB0eXBlb2Ygb2JqZWN0LnJlY29yZC5kZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIgJiYgdHlwZU9ubHlEZWNsYXJhdGlvbklkcy5oYXMob2JqZWN0LnJlY29yZC5kZWNsYXJhdGlvbklkKSkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkQ29uc3RydWN0aW9ufSAqLyAodmFsdWUpXG4gICAgfVxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyhvYmplY3QpKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IHZpc2l0KGNoaWxkKVxuXG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZFxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHJldHVybiB2aXNpdCh7ZW50cnlQb2ludDogbW9kdWxlLmVudHJ5UG9pbnQsIGZ1bmN0aW9uczogbW9kdWxlLmZ1bmN0aW9uc30pXG59XG5cbi8qKlxuICogUGxhbnMgYWxsIHBhdGhzIGJlZm9yZSBlbWlzc2lvbiBhbmQgcmVqZWN0cyBleGFjdC9jYXNlL2ZpbGUtZGlyZWN0b3J5IGNvbGxpc2lvbnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gcHJvZ3JhbSAtIFZhbGlkYXRlZCBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFRhcmdldCBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7U3RkbGliUHJvZ3JhbUxpbmtpbmcgfCBudWxsfSBbbGlua2luZ10gLSBQbGFubmVkIHN0ZGxpYiBwcm92aWRlciBsaW5rLlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIHN0cmluZz59IFBhdGggYnkgbW9kdWxlIGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiBwbGFuTW9kdWxlUGF0aHMocHJvZ3JhbSwgbGFuZ3VhZ2UsIGxpbmtpbmcgPSBudWxsKSB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGxhbmd1YWdlID09IFwiamF2YXNjcmlwdFwiID8gXCIuanNcIiA6IGxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiID8gXCIudHNcIiA6IGxhbmd1YWdlID09IFwicnVieVwiID8gXCIucmJcIiA6XG4gICAgbGFuZ3VhZ2UgPT0gXCJwaHBcIiA/IFwiLnBocFwiIDogXCIuamF2YVwiXG4gIGNvbnN0IHBhdGhzID0gbmV3IE1hcCgpXG4gIGNvbnN0IGZvbGRlZCA9IG5ldyBTZXQoKVxuICBjb25zdCB0YXJnZXRNb2R1bGVOYW1lcyA9IG5ldyBTZXQoKVxuICBjb25zdCBwcm92aWRlclBhdGhzID0gbGlua2luZyA/IGxpbmtpbmcubmVnb3RpYXRpb24ucHJvdmlkZXJzLm1hcCgoe21vZHVsZX0pID0+XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zdGRsaWItcHJvdmlkZXJzLmpzXCIpLlN0ZGxpYlByb3ZpZGVyUmVjb3JkfSAqLyAobGlua2luZy5yZWNvcmRzLmdldChtb2R1bGUpKS5hcnRpZmFjdC5wYXRoKSA6IFtdXG4gIGNvbnN0IGZvbGRlZFByb3ZpZGVycyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgcHJvdmlkZXJQYXRoIG9mIHByb3ZpZGVyUGF0aHMpIHtcbiAgICBjb25zdCBrZXkgPSBwcm92aWRlclBhdGgudG9Mb2NhbGVMb3dlckNhc2UoXCJlbi1VU1wiKVxuXG4gICAgaWYgKCFpc1NhZmVBcnRpZmFjdFBhdGgocHJvdmlkZXJQYXRoKSB8fCBmb2xkZWQuaGFzKGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiU1RETElCX05BTUVfQ09MTElTSU9OXCIsIGxhbmd1YWdlLFxuICAgICAgICBtZXNzYWdlOiBgU3RkbGliIHByb3ZpZGVyIGFydGlmYWN0IHBhdGggJyR7cHJvdmlkZXJQYXRofScgaXMgdW5zYWZlIG9yIGNvbGxpZGluZy5gfSlcbiAgICB9XG4gICAgZm9sZGVkLmFkZChrZXkpXG4gICAgZm9sZGVkUHJvdmlkZXJzLnNldChwcm92aWRlclBhdGgudG9Mb2NhbGVMb3dlckNhc2UoXCJlbi1VU1wiKS5yZXBsYWNlQWxsKFwiLlwiLCBcIi9cIiksIHByb3ZpZGVyUGF0aClcbiAgfVxuXG4gIGZvciAoY29uc3QgbW9kdWxlIG9mIHByb2dyYW0ubW9kdWxlcykge1xuICAgIGxldCBwYXRoID0gYCR7bW9kdWxlLmlkLnJlcGxhY2VBbGwoXCIuXCIsIFwiL1wiKX0ke2V4dGVuc2lvbn1gXG4gICAgY29uc3QgcHJvdmlkZXJQYXRoID0gZm9sZGVkUHJvdmlkZXJzLmdldChwYXRoLnRvTG9jYWxlTG93ZXJDYXNlKFwiZW4tVVNcIikucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpKVxuXG4gICAgaWYgKHByb3ZpZGVyUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgY29kZTogXCJTVERMSUJfTkFNRV9DT0xMSVNJT05cIixcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IGBNb2R1bGUgcGF0aCAnJHtwYXRofScgY29sbGlkZXMgd2l0aCB0aGUgc3RkbGliIHByb3ZpZGVyIGFydGlmYWN0ICcke3Byb3ZpZGVyUGF0aH0nLmBcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IHRhcmdldE1vZHVsZU5hbWUgPSBtb2R1bGVDbGFzc05hbWUobW9kdWxlLmlkKVxuXG4gICAgaWYgKGxhbmd1YWdlID09IFwicGhwXCIgfHwgbGFuZ3VhZ2UgPT0gXCJydWJ5XCIpIHtcbiAgICAgIGNvbnN0IGtleSA9IGxhbmd1YWdlID09IFwicGhwXCIgPyB0YXJnZXRNb2R1bGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKFwiZW4tVVNcIikgOiB0YXJnZXRNb2R1bGVOYW1lXG5cbiAgICAgIGlmICh0YXJnZXRNb2R1bGVOYW1lcy5oYXMoa2V5KSkge1xuICAgICAgICB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGB0YXJnZXQgbW9kdWxlLW5hbWUgY29sbGlzaW9uICcke3RhcmdldE1vZHVsZU5hbWV9J2AsIG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIHRhcmdldE1vZHVsZU5hbWVzLmFkZChrZXkpXG4gICAgfVxuXG4gICAgaWYgKGxhbmd1YWdlID09IFwicGhwXCIpIHtcbiAgICAgIHZhbGlkYXRlVGFyZ2V0SWRlbnRpZmllcihsYW5ndWFnZSwgdGFyZ2V0TW9kdWxlTmFtZSwgXCJtb2R1bGVcIiwgbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgdmFsaWRhdGVUYXJnZXRUeXBlSWRlbnRpZmllcihsYW5ndWFnZSwgdGFyZ2V0TW9kdWxlTmFtZSwgbW9kdWxlLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAobGFuZ3VhZ2UgPT0gXCJydWJ5XCIpIHZhbGlkYXRlVGFyZ2V0VHlwZUlkZW50aWZpZXIobGFuZ3VhZ2UsIHRhcmdldE1vZHVsZU5hbWUsIG1vZHVsZS5sb2NhdGlvbilcblxuICAgIGlmIChsYW5ndWFnZSA9PSBcImphdmFcIikge1xuICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG1vZHVsZS5pZC5zcGxpdChcIi5cIikpIHZhbGlkYXRlVGFyZ2V0SWRlbnRpZmllcihsYW5ndWFnZSwgc2VnbWVudCwgXCJtb2R1bGVcIiwgbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgY29uc3Qgbm9taW5hbENvdW50ID0gKG1vZHVsZS5yZWNvcmRzPy5sZW5ndGggPz8gMCkgKyAobW9kdWxlLmNsYXNzZXM/Lmxlbmd0aCA/PyAwKSArIChtb2R1bGUuZXJyb3JzPy5sZW5ndGggPz8gMClcblxuICAgICAgaWYgKG1vZHVsZS5pZC5pbmNsdWRlcyhcIi1cIikgfHwgbm9taW5hbENvdW50ID4gMSB8fFxuICAgICAgICBub21pbmFsQ291bnQgPiAwICYmIChtb2R1bGUuZnVuY3Rpb25zLmxlbmd0aCA+IDAgfHwgbW9kdWxlLmVudHJ5UG9pbnQpKSB7XG4gICAgICAgIHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgXCJKYXZhIG1vZHVsZSBsYXlvdXQgcmVxdWlyaW5nIG11bHRpcGxlIHB1YmxpYyBkZWNsYXJhdGlvbnMgaW4gb25lIHNlbWFudGljIG1vZHVsZVwiLCBtb2R1bGUubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjbGFzc05hbWUgPSBtb2R1bGUucmVjb3Jkcz8uWzBdPy5uYW1lID8/IG1vZHVsZS5jbGFzc2VzPy5bMF0/Lm5hbWUgPz8gbW9kdWxlLmVycm9ycz8uWzBdPy5uYW1lID8/XG4gICAgICAgIChtb2R1bGUuaWQgPT0gcHJvZ3JhbS5lbnRyeU1vZHVsZSA/IFwiTWFpblwiIDogdGFyZ2V0TW9kdWxlTmFtZSlcblxuICAgICAgaWYgKCEvXltBLVphLXpfJF1bQS1aYS16MC05XyRdKiQvdS50ZXN0KGNsYXNzTmFtZSkpIHtcbiAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBgaW52YWxpZCBKYXZhIHB1YmxpYyBjbGFzcyBuYW1lICcke2NsYXNzTmFtZX0nYCwgbW9kdWxlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKG1vZHVsZS5pZCAhPSBwcm9ncmFtLmVudHJ5TW9kdWxlKSB2YWxpZGF0ZVRhcmdldFR5cGVJZGVudGlmaWVyKGxhbmd1YWdlLCBjbGFzc05hbWUsIG1vZHVsZS5sb2NhdGlvbilcbiAgICAgIHBhdGggPSBgc2VtYW50aWZvbGQvZ2VuZXJhdGVkLyR7bW9kdWxlLmlkLnJlcGxhY2VBbGwoXCIuXCIsIFwiL1wiKX0vJHtjbGFzc05hbWV9LmphdmFgXG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHBhdGgudG9Mb2NhbGVMb3dlckNhc2UoXCJlbi1VU1wiKVxuXG4gICAgaWYgKCFpc1NhZmVBcnRpZmFjdFBhdGgocGF0aCkgfHwgZm9sZGVkLmhhcyhrZXkpKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkobGFuZ3VhZ2UsIGB1bnNhZmUgb3IgY29sbGlkaW5nIHRhcmdldCBwYXRoICcke3BhdGh9J2AsIG1vZHVsZS5sb2NhdGlvbilcbiAgICBmb2xkZWQuYWRkKGtleSlcbiAgICBwYXRocy5zZXQobW9kdWxlLmlkLCBwYXRoKVxuICB9XG5cbiAgcmV0dXJuIHBhdGhzXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsb2dpY2FsIG1vZHVsZSBpZGVudGl0eSB0byBpdHMgY2Fub25pY2FsIHRhcmdldCB0eXBlIHNlZ21lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBMb2dpY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCBjbGFzcyBuYW1lLlxuICovXG5mdW5jdGlvbiBtb2R1bGVDbGFzc05hbWUoaWQpIHtcbiAgcmV0dXJuIGlkLnNwbGl0KC9bLl8tXSsvdSkubWFwKChwYXJ0KSA9PiBgJHtwYXJ0WzBdLnRvVXBwZXJDYXNlKCl9JHtwYXJ0LnNsaWNlKDEpfWApLmpvaW4oXCJcIilcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgZGVjbGFyYXRpb24gb3IgYmluZGluZyBuYW1lIGZvciB0YXJnZXQgY29sbGlzaW9uIGNoZWNrcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBUYXJnZXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIE5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb2xsaXNpb24ga2V5LlxuICovXG5mdW5jdGlvbiB0YXJnZXROYW1lKGxhbmd1YWdlLCBuYW1lKSB7XG4gIHJldHVybiBsYW5ndWFnZSA9PSBcInBocFwiID8gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZShcImVuLVVTXCIpIDogbmFtZVxufVxuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciBhIGNhbmRpZGF0ZSBpcyBhIGRpcmVjdCBwbGFpbiBvYmplY3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gQm9vbGVhbih2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT0gT2JqZWN0LnByb3RvdHlwZVxufVxuXG4vKipcbiAqIFJhaXNlcyBhIHN0YWJsZSBtYWxmb3JtZWQgcHJvZ3JhbS1nZW5lcmF0aW9uIHJlcXVlc3QgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gU3RhYmxlIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7bmV2ZXJ9IEFsd2F5cyB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIGludmFsaWRQcm9ncmFtR2VuZXJhdGlvbihtZXNzYWdlKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiSU5WQUxJRF9QUk9HUkFNXCIsIGxhbmd1YWdlOiBcInByb2dyYW1cIiwgbWVzc2FnZX0pXG59XG4iXX0=