jsii-pacmak 1.56.0 → 1.59.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 (119) hide show
  1. package/bin/jsii-pacmak.d.ts +1 -0
  2. package/bin/jsii-pacmak.d.ts.map +1 -0
  3. package/lib/builder.d.ts +1 -0
  4. package/lib/builder.d.ts.map +1 -0
  5. package/lib/dependency-graph.d.ts +1 -0
  6. package/lib/dependency-graph.d.ts.map +1 -0
  7. package/lib/generator.d.ts +1 -0
  8. package/lib/generator.d.ts.map +1 -0
  9. package/lib/index.d.ts +1 -0
  10. package/lib/index.d.ts.map +1 -0
  11. package/lib/index.js +7 -2
  12. package/lib/logging.d.ts +1 -0
  13. package/lib/logging.d.ts.map +1 -0
  14. package/lib/markdown.d.ts +1 -0
  15. package/lib/markdown.d.ts.map +1 -0
  16. package/lib/naming-util.d.ts +1 -0
  17. package/lib/naming-util.d.ts.map +1 -0
  18. package/lib/npm-modules.d.ts +1 -0
  19. package/lib/npm-modules.d.ts.map +1 -0
  20. package/lib/packaging.d.ts +1 -0
  21. package/lib/packaging.d.ts.map +1 -0
  22. package/lib/target.d.ts +1 -0
  23. package/lib/target.d.ts.map +1 -0
  24. package/lib/targets/_utils.d.ts +1 -0
  25. package/lib/targets/_utils.d.ts.map +1 -0
  26. package/lib/targets/dotnet/dotnetdocgenerator.d.ts +1 -0
  27. package/lib/targets/dotnet/dotnetdocgenerator.d.ts.map +1 -0
  28. package/lib/targets/dotnet/dotnetgenerator.d.ts +1 -0
  29. package/lib/targets/dotnet/dotnetgenerator.d.ts.map +1 -0
  30. package/lib/targets/dotnet/dotnetruntimegenerator.d.ts +1 -0
  31. package/lib/targets/dotnet/dotnetruntimegenerator.d.ts.map +1 -0
  32. package/lib/targets/dotnet/dotnettyperesolver.d.ts +1 -0
  33. package/lib/targets/dotnet/dotnettyperesolver.d.ts.map +1 -0
  34. package/lib/targets/dotnet/filegenerator.d.ts +1 -0
  35. package/lib/targets/dotnet/filegenerator.d.ts.map +1 -0
  36. package/lib/targets/dotnet/nameutils.d.ts +1 -0
  37. package/lib/targets/dotnet/nameutils.d.ts.map +1 -0
  38. package/lib/targets/dotnet.d.ts +1 -0
  39. package/lib/targets/dotnet.d.ts.map +1 -0
  40. package/lib/targets/go/comparators.d.ts +1 -0
  41. package/lib/targets/go/comparators.d.ts.map +1 -0
  42. package/lib/targets/go/dependencies.d.ts +1 -0
  43. package/lib/targets/go/dependencies.d.ts.map +1 -0
  44. package/lib/targets/go/documentation.d.ts +2 -0
  45. package/lib/targets/go/documentation.d.ts.map +1 -0
  46. package/lib/targets/go/documentation.js +10 -1
  47. package/lib/targets/go/emit-context.d.ts +1 -0
  48. package/lib/targets/go/emit-context.d.ts.map +1 -0
  49. package/lib/targets/go/package.d.ts +5 -5
  50. package/lib/targets/go/package.d.ts.map +1 -0
  51. package/lib/targets/go/package.js +14 -14
  52. package/lib/targets/go/readme-file.d.ts +4 -2
  53. package/lib/targets/go/readme-file.d.ts.map +1 -0
  54. package/lib/targets/go/readme-file.js +7 -13
  55. package/lib/targets/go/runtime/class-constructor.d.ts +1 -0
  56. package/lib/targets/go/runtime/class-constructor.d.ts.map +1 -0
  57. package/lib/targets/go/runtime/constants.d.ts +1 -0
  58. package/lib/targets/go/runtime/constants.d.ts.map +1 -0
  59. package/lib/targets/go/runtime/emit-arguments.d.ts +1 -0
  60. package/lib/targets/go/runtime/emit-arguments.d.ts.map +1 -0
  61. package/lib/targets/go/runtime/function-call.d.ts +1 -0
  62. package/lib/targets/go/runtime/function-call.d.ts.map +1 -0
  63. package/lib/targets/go/runtime/index.d.ts +1 -0
  64. package/lib/targets/go/runtime/index.d.ts.map +1 -0
  65. package/lib/targets/go/runtime/method-call.d.ts +1 -0
  66. package/lib/targets/go/runtime/method-call.d.ts.map +1 -0
  67. package/lib/targets/go/runtime/property-access.d.ts +1 -0
  68. package/lib/targets/go/runtime/property-access.d.ts.map +1 -0
  69. package/lib/targets/go/runtime/util.d.ts +1 -0
  70. package/lib/targets/go/runtime/util.d.ts.map +1 -0
  71. package/lib/targets/go/types/class.d.ts +1 -0
  72. package/lib/targets/go/types/class.d.ts.map +1 -0
  73. package/lib/targets/go/types/enum.d.ts +1 -0
  74. package/lib/targets/go/types/enum.d.ts.map +1 -0
  75. package/lib/targets/go/types/go-type-reference.d.ts +1 -0
  76. package/lib/targets/go/types/go-type-reference.d.ts.map +1 -0
  77. package/lib/targets/go/types/go-type.d.ts +1 -0
  78. package/lib/targets/go/types/go-type.d.ts.map +1 -0
  79. package/lib/targets/go/types/index.d.ts +1 -0
  80. package/lib/targets/go/types/index.d.ts.map +1 -0
  81. package/lib/targets/go/types/interface.d.ts +1 -0
  82. package/lib/targets/go/types/interface.d.ts.map +1 -0
  83. package/lib/targets/go/types/struct.d.ts +1 -0
  84. package/lib/targets/go/types/struct.d.ts.map +1 -0
  85. package/lib/targets/go/types/type-member.d.ts +1 -0
  86. package/lib/targets/go/types/type-member.d.ts.map +1 -0
  87. package/lib/targets/go/types/type-member.js +3 -2
  88. package/lib/targets/go/util.d.ts +1 -0
  89. package/lib/targets/go/util.d.ts.map +1 -0
  90. package/lib/targets/go/version-file.d.ts +1 -0
  91. package/lib/targets/go/version-file.d.ts.map +1 -0
  92. package/lib/targets/go.d.ts +1 -0
  93. package/lib/targets/go.d.ts.map +1 -0
  94. package/lib/targets/index.d.ts +1 -0
  95. package/lib/targets/index.d.ts.map +1 -0
  96. package/lib/targets/java.d.ts +1 -0
  97. package/lib/targets/java.d.ts.map +1 -0
  98. package/lib/targets/js.d.ts +1 -0
  99. package/lib/targets/js.d.ts.map +1 -0
  100. package/lib/targets/python/requirements-dev.txt +2 -3
  101. package/lib/targets/python/type-name.d.ts +1 -0
  102. package/lib/targets/python/type-name.d.ts.map +1 -0
  103. package/lib/targets/python/util.d.ts +1 -0
  104. package/lib/targets/python/util.d.ts.map +1 -0
  105. package/lib/targets/python.d.ts +1 -0
  106. package/lib/targets/python.d.ts.map +1 -0
  107. package/lib/targets/python.js +61 -20
  108. package/lib/targets/version-utils.d.ts +1 -0
  109. package/lib/targets/version-utils.d.ts.map +1 -0
  110. package/lib/timer.d.ts +1 -0
  111. package/lib/timer.d.ts.map +1 -0
  112. package/lib/toposort.d.ts +1 -0
  113. package/lib/toposort.d.ts.map +1 -0
  114. package/lib/util.d.ts +1 -0
  115. package/lib/util.d.ts.map +1 -0
  116. package/lib/version.d.ts +3 -2
  117. package/lib/version.d.ts.map +1 -0
  118. package/lib/version.js +4 -4
  119. package/package.json +16 -16
@@ -35,7 +35,11 @@ class Python extends target_1.Target {
35
35
  // Create a fresh virtual env
36
36
  const venv = await fs.mkdtemp(path.join(sourceDir, '.env-'));
37
37
  const venvBin = path.join(venv, process.platform === 'win32' ? 'Scripts' : 'bin');
38
- await util_1.shell('python3', [
38
+ // On Windows, there is usually no python3.exe (the GitHub action workers will have a python3
39
+ // shim, but using this actually results in a WinError with Python 3.7 and 3.8 where venv will
40
+ // fail to copy the python binary if it's not invoked as python.exe). More on this particular
41
+ // issue can be read here: https://bugs.python.org/issue43749
42
+ await util_1.shell(process.platform === 'win32' ? 'python' : 'python3', [
39
43
  '-m',
40
44
  'venv',
41
45
  '--system-site-packages',
@@ -1057,7 +1061,22 @@ class PythonModule {
1057
1061
  }
1058
1062
  addPythonModule(pyMod) {
1059
1063
  assert(!this.loadAssembly, 'PythonModule.addPythonModule CANNOT be called on assembly-loading modules (it would cause a load cycle)!');
1060
- this.modules.push(pyMod);
1064
+ assert(pyMod.pythonName.startsWith(`${this.pythonName}.`), `Attempted to register ${pyMod.pythonName} as a child module of ${this.pythonName}, but the names don't match!`);
1065
+ const [firstLevel, ...rest] = pyMod.pythonName
1066
+ .substring(this.pythonName.length + 1)
1067
+ .split('.');
1068
+ if (rest.length === 0) {
1069
+ // This is a direct child module...
1070
+ this.modules.push(pyMod);
1071
+ }
1072
+ else {
1073
+ // This is a nested child module, so we delegate to the directly nested module...
1074
+ const parent = this.modules.find((m) => m.pythonName === `${this.pythonName}.${firstLevel}`);
1075
+ if (!parent) {
1076
+ throw new Error(`Attempted to register ${pyMod.pythonName} within ${this.pythonName}, but ${this.pythonName}.${firstLevel} wasn't registered yet!`);
1077
+ }
1078
+ parent.addPythonModule(pyMod);
1079
+ }
1061
1080
  }
1062
1081
  requiredImports(context) {
1063
1082
  return type_name_1.mergePythonImports(...this.members.map((mem) => mem.requiredImports(context)));
@@ -1112,7 +1131,21 @@ class PythonModule {
1112
1131
  member.emit(code, context);
1113
1132
  }
1114
1133
  // Whatever names we've exported, we'll write out our __all__ that lists them.
1115
- const exportedMembers = this.members.map((m) => `"${m.pythonName}"`);
1134
+ //
1135
+ // __all__ is normally used for when users write `from library import *`, but we also
1136
+ // use it with the `publication` module to hide everything that's NOT in the list.
1137
+ //
1138
+ // Normally adding submodules to `__all__` has the (negative?) side-effect
1139
+ // that all submodules get loaded when the user does `import *`, but we
1140
+ // already load submodules anyway so it doesn't make a difference, and in combination
1141
+ // with the `publication` module NOT having them in this list hides any submodules
1142
+ // we import as part of typechecking.
1143
+ const exportedMembers = [
1144
+ ...this.members.map((m) => `"${m.pythonName}"`),
1145
+ ...this.modules
1146
+ .filter((m) => this.isDirectChild(m))
1147
+ .map((m) => `"${lastComponent(m.pythonName)}"`),
1148
+ ];
1116
1149
  if (this.loadAssembly) {
1117
1150
  exportedMembers.push('"__jsii_assembly__"');
1118
1151
  }
@@ -1142,20 +1175,11 @@ class PythonModule {
1142
1175
  code.line('# Loading modules to ensure their types are registered with the jsii runtime library');
1143
1176
  for (const module of this.modules.sort((l, r) => l.pythonName.localeCompare(r.pythonName))) {
1144
1177
  // Rather than generating an absolute import like
1145
- // "import jsii_calc.submodule.nested_submodule.deeply_nested"
1146
- // this builds a relative import like
1147
- // "from .submodule.nested_submodule import deeply_nested"
1148
- // This enables distributing python packages and using the
1149
- // generated modules in the same codebase.
1150
- const assemblyName = type_name_1.toPythonFqn(module.assembly.name, module.assembly).pythonFqn;
1151
- const submodule = module.pythonName
1152
- .replace(`${assemblyName}.`, '')
1153
- .split('.');
1154
- const submodulePath = submodule
1155
- .slice(0, submodule.length - 1)
1156
- .join('.');
1157
- const submoduleName = submodule[submodule.length - 1];
1158
- code.line(`from .${submodulePath} import ${submoduleName}`);
1178
+ // "import jsii_calc.submodule" this builds a relative import like
1179
+ // "from . import submodule". This enables distributing python packages
1180
+ // and using the generated modules in the same codebase.
1181
+ const submodule = module.pythonName.substring(this.pythonName.length + 1);
1182
+ code.line(`from . import ${submodule}`);
1159
1183
  }
1160
1184
  }
1161
1185
  }
@@ -1193,6 +1217,16 @@ class PythonModule {
1193
1217
  }
1194
1218
  return scripts;
1195
1219
  }
1220
+ isDirectChild(pyMod) {
1221
+ if (this.pythonName === pyMod.pythonName ||
1222
+ !pyMod.pythonName.startsWith(`${this.pythonName}.`)) {
1223
+ return false;
1224
+ }
1225
+ // Must include only one more component
1226
+ return !pyMod.pythonName
1227
+ .substring(this.pythonName.length + 1)
1228
+ .includes('.');
1229
+ }
1196
1230
  /**
1197
1231
  * Emit the README as module docstring if this is the entry point module (it loads the assembly)
1198
1232
  */
@@ -1342,7 +1376,7 @@ class Package {
1342
1376
  package_dir: { '': 'src' },
1343
1377
  packages: modules.map((m) => m.pythonName),
1344
1378
  package_data: packageData,
1345
- python_requires: '>=3.6',
1379
+ python_requires: '~=3.7',
1346
1380
  install_requires: [
1347
1381
  `jsii${version_utils_1.toPythonVersionRange(`^${jsiiVersionSimple}`)}`,
1348
1382
  'publication>=0.0.3',
@@ -1354,10 +1388,10 @@ class Package {
1354
1388
  'Operating System :: OS Independent',
1355
1389
  'Programming Language :: JavaScript',
1356
1390
  'Programming Language :: Python :: 3 :: Only',
1357
- 'Programming Language :: Python :: 3.6',
1358
1391
  'Programming Language :: Python :: 3.7',
1359
1392
  'Programming Language :: Python :: 3.8',
1360
1393
  'Programming Language :: Python :: 3.9',
1394
+ 'Programming Language :: Python :: 3.10',
1361
1395
  'Typing :: Typed',
1362
1396
  ],
1363
1397
  scripts,
@@ -2071,4 +2105,11 @@ function nestedContext(context, fqn) {
2071
2105
  };
2072
2106
  }
2073
2107
  const isDeprecated = (x) => { var _a; return ((_a = x.docs) === null || _a === void 0 ? void 0 : _a.deprecated) !== undefined; };
2074
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHl0aG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQW1DO0FBQ25DLGlDQUFpQztBQUNqQyx5Q0FBbUQ7QUFDbkQsMkRBQTJEO0FBQzNELCtCQUErQjtBQUUvQiwrQ0FLc0I7QUFDdEIsNkJBQTZCO0FBRTdCLDRDQUEyRDtBQUMzRCx3Q0FBa0M7QUFDbEMsMENBQXFDO0FBQ3JDLHNDQUFrRDtBQUNsRCxrQ0FBZ0M7QUFDaEMscUNBQTZEO0FBQzdELGtEQU80QjtBQUM1Qix3Q0FBd0Q7QUFDeEQsbURBQXlFO0FBRXpFLG1DQUFxQztBQUVyQyxvR0FBb0c7QUFDcEcsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFckQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUNuQyxTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixDQUN2QixDQUFDO0FBRUYsMkVBQTJFO0FBQzNFLCtGQUErRjtBQUMvRixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUUvQixNQUFxQixNQUFPLFNBQVEsZUFBTTtJQUd4QyxZQUFtQixPQUFzQjtRQUN2QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFZixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFjLEVBQUUsT0FBZTtRQUN2RCxNQUFNLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQWlCLEVBQUUsTUFBYztRQUNsRCw2QkFBNkI7UUFDN0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FB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QUFDO1lBQy9DLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CO0tBQ2xDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFhLEVBQUUsRUFBRSxXQUFDLE9BQUEsT0FBQSxDQUFDLENBQUMsSUFBSSwwQ0FBRSxVQUFVLE1BQUssU0FBUyxDQUFBLEVBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNwZWMgZnJvbSAnQGpzaWkvc3BlYyc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IENvZGVNYWtlciwgdG9TbmFrZUNhc2UgfSBmcm9tICdjb2RlbWFrZXInO1xuaW1wb3J0ICogYXMgZXNjYXBlU3RyaW5nUmVnZXhwIGZyb20gJ2VzY2FwZS1zdHJpbmctcmVnZXhwJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHJlZmxlY3QgZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCB7XG4gIFRhcmdldExhbmd1YWdlLFxuICBSb3NldHRhLFxuICBlbmZvcmNlc1N0cmljdE1vZGUsXG4gIEFwaUxvY2F0aW9uLFxufSBmcm9tICdqc2lpLXJvc2V0dGEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgR2VuZXJhdG9yLCBHZW5lcmF0b3JPcHRpb25zIH0gZnJvbSAnLi4vZ2VuZXJhdG9yJztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICcuLi9sb2dnaW5nJztcbmltcG9ydCB7IG1kMnJzdCB9IGZyb20gJy4uL21hcmtkb3duJztcbmltcG9ydCB7IFRhcmdldCwgVGFyZ2V0T3B0aW9ucyB9IGZyb20gJy4uL3RhcmdldCc7XG5pbXBvcnQgeyBzaGVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgcmVuZGVyU3VtbWFyeSwgUHJvcGVydHlEZWZpbml0aW9uIH0gZnJvbSAnLi9fdXRpbHMnO1xuaW1wb3J0IHtcbiAgTmFtaW5nQ29udGV4dCxcbiAgdG9UeXBlTmFtZSxcbiAgUHl0aG9uSW1wb3J0cyxcbiAgbWVyZ2VQeXRob25JbXBvcnRzLFxuICB0b1BhY2thZ2VOYW1lLFxuICB0b1B5dGhvbkZxbixcbn0gZnJvbSAnLi9weXRob24vdHlwZS1uYW1lJztcbmltcG9ydCB7IGRpZSwgdG9QeXRob25JZGVudGlmaWVyIH0gZnJvbSAnLi9weXRob24vdXRpbCc7XG5pbXBvcnQgeyB0b1B5dGhvblZlcnNpb25SYW5nZSwgdG9SZWxlYXNlVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi11dGlscyc7XG5cbmltcG9ydCB7IFRhcmdldE5hbWUgfSBmcm9tICcuL2luZGV4JztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXMsQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3Qgc3BkeExpY2Vuc2VMaXN0ID0gcmVxdWlyZSgnc3BkeC1saWNlbnNlLWxpc3QnKTtcblxuY29uc3QgcmVxdWlyZW1lbnRzRmlsZSA9IHBhdGgucmVzb2x2ZShcbiAgX19kaXJuYW1lLFxuICAncHl0aG9uJyxcbiAgJ3JlcXVpcmVtZW50cy1kZXYudHh0Jyxcbik7XG5cbi8vIHdlIHVzZSBzaW5nbGUtcXVvdGVzIGZvciBtdWx0aS1saW5lIHN0cmluZ3MgdG8gYWxsb3cgZXhhbXBsZXMgd2l0aGluIHRoZVxuLy8gZG9jc3RyaW5ncyB0aGVtc2VsdmVzIHRvIGluY2x1ZGUgZG91YmxlLXF1b3RlcyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjU2OSlcbmNvbnN0IERPQ1NUUklOR19RVU9URVMgPSBcIicnJ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQeXRob24gZXh0ZW5kcyBUYXJnZXQge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3I7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRhcmdldE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuZ2VuZXJhdG9yID0gbmV3IFB5dGhvbkdlbmVyYXRvcihvcHRpb25zLnJvc2V0dGEpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdlbmVyYXRlQ29kZShvdXREaXI6IHN0cmluZywgdGFyYmFsbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuZ2VuZXJhdGVDb2RlKG91dERpciwgdGFyYmFsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYnVpbGQoc291cmNlRGlyOiBzdHJpbmcsIG91dERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ3JlYXRlIGEgZnJlc2ggdmlydHVhbCBlbnZcbiAgICBjb25zdCB2ZW52ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4oc291cmNlRGlyLCAnLmVudi0nKSk7XG4gICAgY29uc3QgdmVudkJpbiA9IHBhdGguam9pbihcbiAgICAgIHZlbnYsXG4gICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ1NjcmlwdHMnIDogJ2JpbicsXG4gICAgKTtcbiAgICBhd2FpdCBzaGVsbCgncHl0aG9uMycsIFtcbiAgICAgICctbScsXG4gICAgICAndmVudicsXG4gICAgICAnLS1zeXN0ZW0tc2l0ZS1wYWNrYWdlcycsIC8vIEFsbG93IHVzaW5nIGdsb2JhbGx5IGluc3RhbGxlZCBwYWNrYWdlcyAoc2F2ZXMgdGltZSAmIGRpc2sgc3BhY2UpXG4gICAgICB2ZW52LFxuICAgIF0pO1xuICAgIGNvbnN0IGVudiA9IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgUEFUSDogYCR7dmVudkJpbn06JHtwcm9jZXNzLmVudi5QQVRIfWAsXG4gICAgICBWSVJUVUFMX0VOVjogdmVudixcbiAgICB9O1xuICAgIGNvbnN0IHB5dGhvbiA9IHBhdGguam9pbih2ZW52QmluLCAncHl0aG9uJyk7XG5cbiAgICAvLyBJbnN0YWxsIHRoZSBuZWNlc3NhcnkgdGhpbmdzXG4gICAgYXdhaXQgc2hlbGwoXG4gICAgICBweXRob24sXG4gICAgICBbJy1tJywgJ3BpcCcsICdpbnN0YWxsJywgJy0tbm8taW5wdXQnLCAnLXInLCByZXF1aXJlbWVudHNGaWxlXSxcbiAgICAgIHtcbiAgICAgICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgICAgIGVudixcbiAgICAgICAgcmV0cnk6IHsgbWF4QXR0ZW1wdHM6IDUgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEFjdHVhbGx5IHBhY2thZ2UgdXAgb3VyIGNvZGUsIGJvdGggYXMgYSBzZGlzdCBhbmQgYSB3aGVlbCBmb3IgcHVibGlzaGluZy5cbiAgICBhd2FpdCBzaGVsbChweXRob24sIFsnc2V0dXAucHknLCAnc2Rpc3QnLCAnLS1kaXN0LWRpcicsIG91dERpcl0sIHtcbiAgICAgIGN3ZDogc291cmNlRGlyLFxuICAgICAgZW52LFxuICAgIH0pO1xuICAgIGF3YWl0IHNoZWxsKFxuICAgICAgcHl0aG9uLFxuICAgICAgWyctbScsICdwaXAnLCAnd2hlZWwnLCAnLS1uby1kZXBzJywgJy0td2hlZWwtZGlyJywgb3V0RGlyLCBzb3VyY2VEaXJdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgICAgZW52LFxuICAgICAgICByZXRyeTogeyBtYXhBdHRlbXB0czogNSB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIGF3YWl0IHNoZWxsKHB5dGhvbiwgWyctbScsICd0d2luZScsICdjaGVjaycsIHBhdGguam9pbihvdXREaXIsICcqJyldLCB7XG4gICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgIGVudixcbiAgICB9KTtcbiAgfVxufVxuXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyNcbi8vICMgQ09ERSBHRU5FUkFUT1IgI1xuLy8gIyMjIyMjIyMjIyMjIyMjIyMjXG5cbmludGVyZmFjZSBFbWl0Q29udGV4dCBleHRlbmRzIE5hbWluZ0NvbnRleHQge1xuICAvKiogQGRlcHJlY2F0ZWQgVGhlIFR5cGVSZXNvbHZlciAqL1xuICByZWFkb25seSByZXNvbHZlcjogVHlwZVJlc29sdmVyO1xufVxuXG5jb25zdCBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gcGF0aC5qb2luKC4uLm5hbWUuc3BsaXQoJy4nKSk7XG59O1xuXG5jb25zdCB0b1B5dGhvbk1ldGhvZE5hbWUgPSAobmFtZTogc3RyaW5nLCBwcm90ZWN0ZWRJdGVtID0gZmFsc2UpOiBzdHJpbmcgPT4ge1xuICBsZXQgdmFsdWUgPSB0b1B5dGhvbklkZW50aWZpZXIodG9TbmFrZUNhc2UobmFtZSkpO1xuICBpZiAocHJvdGVjdGVkSXRlbSkge1xuICAgIHZhbHVlID0gYF8ke3ZhbHVlfWA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuY29uc3QgdG9QeXRob25Qcm9wZXJ0eU5hbWUgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgY29uc3RhbnQgPSBmYWxzZSxcbiAgcHJvdGVjdGVkSXRlbSA9IGZhbHNlLFxuKTogc3RyaW5nID0+IHtcbiAgbGV0IHZhbHVlID0gdG9QeXRob25JZGVudGlmaWVyKHRvU25ha2VDYXNlKG5hbWUpKTtcblxuICBpZiAoY29uc3RhbnQpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICBpZiAocHJvdGVjdGVkSXRlbSkge1xuICAgIHZhbHVlID0gYF8ke3ZhbHVlfWA7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZ2l2ZW4gc2lnbmF0dXJlJ3MgcGFyYW1ldGVyIG5hbWUgdG8gd2hhdCBzaG91bGQgYmUgZW1pdHRlZCBpbiBQeXRob24uIEl0IHNsdWdpZmllcyB0aGVcbiAqIHBvc2l0aW9uYWwgcGFyYW1ldGVyIG5hbWVzIHRoYXQgY29sbGlkZSB3aXRoIGEgbGlmdGVkIHByb3AgYnkgYXBwZW5kaW5nIHRyYWlsaW5nIGBfYC4gVGhlcmUgaXMgbm9cbiAqIHJpc2sgb2YgY29uZmxpY3Rpbmcgd2l0aCBhbiBvdGhlciBwb3NpdGlvbmFsIHBhcmFtZXRlciB0aGF0IGVuZHMgd2l0aCBhIGBfYCBjaGFyYWN0ZXIgYmVjYXVzZVxuICogdGhpcyBpcyBwcm9oaWJpdGVkIGJ5IHRoZSBganNpaWAgY29tcGlsZXIgKHBhcmFtZXRlciBuYW1lcyBNVVNUIGJlIGNhbWVsQ2FzZSwgYW5kIG9ubHkgYSBzaW5nbGVcbiAqIGBfYCBpcyBwZXJtaXR0ZWQgd2hlbiBpdCBpcyBvbiAqKmxlYWRpbmcqKiBwb3NpdGlvbilcbiAqXG4gKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0aGF0IG5lZWRzIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0gbGlmdGVkUGFyYW1OYW1lcyAgdGhlIGxpc3Qgb2YgXCJsaWZ0ZWRcIiBrZXl3b3JkIHBhcmFtZXRlcnMgaW4gdGhpcyBzaWduYXR1cmUuIFRoaXMgbXVzdCBiZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQgd2hlbiBnZW5lcmF0aW5nIGEgbmFtZSBmb3IgYSBwYXJhbWV0ZXIgdGhhdCAqKmlzKiogbGlmdGVkLlxuICovXG5mdW5jdGlvbiB0b1B5dGhvblBhcmFtZXRlck5hbWUoXG4gIG5hbWU6IHN0cmluZyxcbiAgbGlmdGVkUGFyYW1OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9IHRvUHl0aG9uSWRlbnRpZmllcih0b1NuYWtlQ2FzZShuYW1lKSk7XG5cbiAgd2hpbGUgKGxpZnRlZFBhcmFtTmFtZXMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXN1bHQgKz0gJ18nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3Qgc2V0RGlmZmVyZW5jZSA9IDxUPihzZXRBOiBTZXQ8VD4sIHNldEI6IFNldDxUPik6IFNldDxUPiA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQ8VD4oKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIHNldEEpIHtcbiAgICBpZiAoIXNldEIuaGFzKGl0ZW0pKSB7XG4gICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBQcmVwYXJlIHB5dGhvbiBtZW1iZXJzIGZvciBlbWlzc2lvbi5cbiAqXG4gKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lLCB0aGV5IHdpbGwgYWxsIG1hcCB0byB0aGUgc2FtZSBweXRob25cbiAqIG5hbWUsIHNvIHdlIHdpbGwgZmlsdGVyIGFsbCBkZXByZWNhdGVkIG1lbWJlcnMgYW5kIGV4cGVjdCB0aGF0IHRoZXJlIHdpbGwgYmUgb25seSBvbmVcbiAqIGxlZnQuXG4gKlxuICogUmV0dXJucyB0aGUgbWVtYmVycyBpbiBhIHNvcnRlZCBsaXN0LlxuICovXG5mdW5jdGlvbiBwcmVwYXJlTWVtYmVycyhtZW1iZXJzOiBQeXRob25CYXNlW10sIHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpIHtcbiAgLy8gY3JlYXRlIGEgbWFwIGZyb20gcHl0aG9uIG5hbWUgdG8gbGlzdCBvZiBtZW1iZXJzXG4gIGNvbnN0IG1hcDogeyBbcHl0aG9uTmFtZTogc3RyaW5nXTogUHl0aG9uQmFzZVtdIH0gPSB7fTtcbiAgZm9yIChjb25zdCBtIG9mIG1lbWJlcnMpIHtcbiAgICBsZXQgbGlzdCA9IG1hcFttLnB5dGhvbk5hbWVdO1xuICAgIGlmICghbGlzdCkge1xuICAgICAgbGlzdCA9IG1hcFttLnB5dGhvbk5hbWVdID0gW107XG4gICAgfVxuXG4gICAgbGlzdC5wdXNoKG0pO1xuICB9XG5cbiAgLy8gbm93IHJldHVybiBhbGwgdGhlIG1lbWJlcnNcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFB5dGhvbkJhc2U+KCk7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgbGlzdF0gb2YgT2JqZWN0LmVudHJpZXMobWFwKSkge1xuICAgIGxldCBtZW1iZXI7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGlmIHdlIGhhdmUgYSBzaW5nbGUgbWVtYmVyIGZvciB0aGlzIG5vcm1hbGl6ZWQgbmFtZSwgdGhlbiB1c2UgaXRcbiAgICAgIG1lbWJlciA9IGxpc3RbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdlIGZvdW5kIG1vcmUgdGhhbiBvbmUgbWVtYmVyIHdpdGggdGhlIHNhbWUgcHl0aG9uIG5hbWUsIGZpbHRlciBhbGxcbiAgICAgIC8vIGRlcHJlY2F0ZWQgdmVyc2lvbnMgYW5kIGNoZWNrIHRoYXQgd2UgYXJlIGxlZnQgd2l0aCBleGFjdGx5IG9uZS5cbiAgICAgIC8vIG90aGVyd2lzZSwgdGhleSB3aWxsIG92ZXJ3cml0ZSBlYWNoIG90aGVyXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yNTA4XG4gICAgICBjb25zdCBub25EZXByZWNhdGVkID0gbGlzdC5maWx0ZXIoKHgpID0+ICFpc0RlcHJlY2F0ZWQoeCkpO1xuICAgICAgaWYgKG5vbkRlcHJlY2F0ZWQubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIG5vbi1kZXByZWNhdGVkIG1lbWJlcnMgd2hpY2ggbWFwIHRvIHRoZSBQeXRob24gbmFtZSBcIiR7bmFtZX1cImAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub25EZXByZWNhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIG1lbWJlcnMgd2hpY2ggbWFwIHRvIHRoZSBQeXRob24gbmFtZSBcIiR7bmFtZX1cIiwgYnV0IGFsbCBvZiB0aGVtIGFyZSBkZXByZWNhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbWVtYmVyID0gbm9uRGVwcmVjYXRlZFswXTtcbiAgICB9XG5cbiAgICByZXQucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcmV0dXJuIHNvcnRNZW1iZXJzKHJldCwgcmVzb2x2ZXIpO1xufVxuXG5jb25zdCBzb3J0TWVtYmVycyA9IChcbiAgbWVtYmVyczogUHl0aG9uQmFzZVtdLFxuICByZXNvbHZlcjogVHlwZVJlc29sdmVyLFxuKTogUHl0aG9uQmFzZVtdID0+IHtcbiAgbGV0IHNvcnRhYmxlID0gbmV3IEFycmF5PHtcbiAgICBtZW1iZXI6IFB5dGhvbkJhc2UgJiBJU29ydGFibGVUeXBlO1xuICAgIGRlcGVuZHNPbjogU2V0PFB5dGhvblR5cGU+O1xuICB9PigpO1xuICBjb25zdCBzb3J0ZWQgPSBuZXcgQXJyYXk8UHl0aG9uQmFzZT4oKTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8UHl0aG9uQmFzZT4oKTtcblxuICAvLyBUaGUgZmlyc3QgdGhpbmcgd2Ugd2FudCB0byBkbywgaXMgcHVzaCBhbnkgaXRlbSB3aGljaCBpcyBub3Qgc29ydGFibGUgdG8gdGhlIHZlcnlcbiAgLy8gZnJvbnQgb2YgdGhlIGxpc3QuIFRoaXMgd2lsbCBiZSB0aGluZ3MgbGlrZSBtZXRob2RzLCBwcm9wZXJ0aWVzLCBldGMuXG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMpIHtcbiAgICBpZiAoIWlzU29ydGFibGVUeXBlKG1lbWJlcikpIHtcbiAgICAgIHNvcnRlZC5wdXNoKG1lbWJlcik7XG4gICAgICBzZWVuLmFkZChtZW1iZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3J0YWJsZS5wdXNoKHsgbWVtYmVyLCBkZXBlbmRzT246IG5ldyBTZXQobWVtYmVyLmRlcGVuZHNPbihyZXNvbHZlcikpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB0aGF0IHdlJ3ZlIHB1bGxlZCBvdXQgZXZlcnl0aGluZyB0aGF0IGNvdWxkbid0IHBvc3NpYmx5IGhhdmUgZGVwZW5kZW5jaWVzLFxuICAvLyB3ZSB3aWxsIGdvIHRocm91Z2ggdGhlIHJlbWFpbmluZyBpdGVtcywgYW5kIHB1bGwgb2ZmIGFueSBpdGVtcyB3aGljaCBoYXZlIG5vXG4gIC8vIGRlcGVuZGVuY2llcyB0aGF0IHdlIGhhdmVuJ3QgYWxyZWFkeSBzb3J0ZWQuXG4gIHdoaWxlIChzb3J0YWJsZS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCB7IG1lbWJlciwgZGVwZW5kc09uIH0gb2Ygc29ydGFibGUpIHtcbiAgICAgIGNvbnN0IGRpZmYgPSBzZXREaWZmZXJlbmNlKGRlcGVuZHNPbiwgc2Vlbik7XG4gICAgICBpZiAoWy4uLmRpZmZdLmZpbmQoKGRlcCkgPT4gIShkZXAgaW5zdGFuY2VvZiBQeXRob25Nb2R1bGUpKSA9PSBudWxsKSB7XG4gICAgICAgIHNvcnRlZC5wdXNoKG1lbWJlcik7XG4gICAgICAgIHNlZW4uYWRkKG1lbWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGVmdG92ZXIgPSBzb3J0YWJsZS5maWx0ZXIoKHsgbWVtYmVyIH0pID0+ICFzZWVuLmhhcyhtZW1iZXIpKTtcbiAgICBpZiAobGVmdG92ZXIubGVuZ3RoID09PSBzb3J0YWJsZS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBzb3J0IG1lbWJlcnMgKGNpcmN1bGFyIGRlcGVuZGVuY3k/KS4gTGVmdG92ZXI6ICR7bGVmdG92ZXJcbiAgICAgICAgICAubWFwKChsbykgPT4gbG8ubWVtYmVyLnB5dGhvbk5hbWUpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvcnRhYmxlID0gbGVmdG92ZXI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNvcnRlZDtcbn07XG5cbmludGVyZmFjZSBQeXRob25CYXNlIHtcbiAgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkb2NzPzogc3BlYy5Eb2NzO1xuXG4gIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCwgb3B0cz86IGFueSk6IHZvaWQ7XG5cbiAgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cztcbn1cblxuaW50ZXJmYWNlIFB5dGhvblR5cGUgZXh0ZW5kcyBQeXRob25CYXNlIHtcbiAgLy8gVGhlIEpTSUkgRlFOIGZvciB0aGlzIGl0ZW0sIGlmIHRoaXMgaXRlbSBkb2Vzbid0IGV4aXN0IGFzIGEgSlNJSSB0eXBlLCB0aGVuIGl0XG4gIC8vIGRvZXNuJ3QgaGF2ZSBhIEZRTiBhbmQgaXQgc2hvdWxkIGJlIG51bGw7XG4gIHJlYWRvbmx5IGZxbj86IHN0cmluZztcblxuICBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIElTb3J0YWJsZVR5cGUge1xuICBkZXBlbmRzT24ocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFB5dGhvblR5cGVbXTtcbn1cblxuZnVuY3Rpb24gaXNTb3J0YWJsZVR5cGUoYXJnOiB1bmtub3duKTogYXJnIGlzIElTb3J0YWJsZVR5cGUge1xuICByZXR1cm4gKGFyZyBhcyBQYXJ0aWFsPElTb3J0YWJsZVR5cGU+KS5kZXBlbmRzT24gIT09IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIFB5dGhvblR5cGVPcHRzIHtcbiAgYmFzZXM/OiBzcGVjLlR5cGVSZWZlcmVuY2VbXTtcbn1cblxuYWJzdHJhY3QgY2xhc3MgQmFzZVB5dGhvbkNsYXNzVHlwZSBpbXBsZW1lbnRzIFB5dGhvblR5cGUsIElTb3J0YWJsZVR5cGUge1xuICBwcm90ZWN0ZWQgYmFzZXM6IHNwZWMuVHlwZVJlZmVyZW5jZVtdO1xuICBwcm90ZWN0ZWQgbWVtYmVyczogUHl0aG9uQmFzZVtdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VwYXJhdGVNZW1iZXJzOiBib29sZWFuID0gdHJ1ZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHNwZWM6IHNwZWMuVHlwZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZnFuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0czogUHl0aG9uVHlwZU9wdHMsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgY29uc3QgeyBiYXNlcyA9IFtdIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5iYXNlcyA9IGJhc2VzO1xuICAgIHRoaXMubWVtYmVycyA9IFtdO1xuICB9XG5cbiAgcHVibGljIGRlcGVuZHNPbihyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogUHl0aG9uVHlwZVtdIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXk8UHl0aG9uVHlwZT4oKTtcbiAgICBjb25zdCBwYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQodGhpcy5mcW4hKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmV0dXJuIGFueSBiYXNlcyB0aGF0IGFyZSBpbiB0aGUgc2FtZSBtb2R1bGUgYXQgdGhlIHNhbWUgbGV2ZWwgb2ZcbiAgICAvLyBuZXN0aW5nLlxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGJhc2Ugb2YgdGhpcy5iYXNlcykge1xuICAgICAgaWYgKHNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UoYmFzZSkpIHtcbiAgICAgICAgaWYgKHJlc29sdmVyLmlzSW5Nb2R1bGUoYmFzZSkpIHtcbiAgICAgICAgICAvLyBHaXZlbiBhIGJhc2UsIHdlIG5lZWQgdG8gbG9jYXRlIHRoZSBiYXNlJ3MgcGFyZW50IHRoYXQgaXMgdGhlIHNhbWUgYXNcbiAgICAgICAgICAvLyBvdXIgcGFyZW50LCBiZWNhdXNlIHdlIG9ubHkgY2FyZSBhYm91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYXQgdGhlXG4gICAgICAgICAgLy8gc2FtZSBsZXZlbCBvZiBvdXIgb3duLlxuICAgICAgICAgIC8vIFRPRE86IFdlIG1pZ2h0IG5lZWQgdG8gcmVjdXJzZSBpbnRvIG91ciBtZW1iZXJzIHRvIGFsc28gZmluZCB0aGVpclxuICAgICAgICAgIC8vICAgICAgIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICBsZXQgYmFzZUl0ZW0gPSByZXNvbHZlci5nZXRUeXBlKGJhc2UpO1xuICAgICAgICAgIGxldCBiYXNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGJhc2UpO1xuICAgICAgICAgIHdoaWxlIChiYXNlUGFyZW50ICE9PSBwYXJlbnQpIHtcbiAgICAgICAgICAgIGJhc2VJdGVtID0gYmFzZVBhcmVudDtcbiAgICAgICAgICAgIGJhc2VQYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQoYmFzZUl0ZW0uZnFuISk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzZWVuLmhhcyhiYXNlSXRlbS5mcW4hKSkge1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYmFzZUl0ZW0pO1xuICAgICAgICAgICAgc2Vlbi5hZGQoYmFzZUl0ZW0uZnFuISk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgLi4udGhpcy5iYXNlcy5tYXAoKGJhc2UpID0+IHRvVHlwZU5hbWUoYmFzZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpKSxcbiAgICAgIC4uLnRoaXMubWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKSB7XG4gICAgdGhpcy5tZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIGlmICghdGhpcy5mcW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBtYWtlIGFwaUxvY2F0aW9uIGZvciAke3RoaXMucHl0aG9uTmFtZX0sIGRvZXMgbm90IGhhdmUgRlFOYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7IGFwaTogJ3R5cGUnLCBmcW46IHRoaXMuZnFuIH07XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29udGV4dCA9IG5lc3RlZENvbnRleHQoY29udGV4dCwgdGhpcy5mcW4pO1xuXG4gICAgY29uc3QgY2xhc3NQYXJhbXMgPSB0aGlzLmdldENsYXNzUGFyYW1zKGNvbnRleHQpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5weXRob25OYW1lLCBjbGFzc1BhcmFtcyk7XG5cbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgICB0cmFpbGluZ05ld0xpbmU6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5ib3VuZFJlc29sdmVyKGNvbnRleHQucmVzb2x2ZXIpO1xuICAgICAgbGV0IHNob3VsZFNlcGFyYXRlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcmVwYXJlTWVtYmVycyh0aGlzLm1lbWJlcnMsIHJlc29sdmVyKSkge1xuICAgICAgICBpZiAoc2hvdWxkU2VwYXJhdGUpIHtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRTZXBhcmF0ZSA9IHRoaXMuc2VwYXJhdGVNZW1iZXJzO1xuICAgICAgICBtZW1iZXIuZW1pdChjb2RlLCB7IC4uLmNvbnRleHQsIHJlc29sdmVyIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGlmICh0aGlzLmZxbiAhPSBudWxsKSB7XG4gICAgICBjb250ZXh0LmVtaXR0ZWRUeXBlcy5hZGQodGhpcy5mcW4pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBib3VuZFJlc29sdmVyKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBUeXBlUmVzb2x2ZXIge1xuICAgIGlmICh0aGlzLmZxbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlci5iaW5kKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgQmFzZU1ldGhvZE9wdHMge1xuICBhYnN0cmFjdD86IGJvb2xlYW47XG4gIGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG59XG5cbmludGVyZmFjZSBCYXNlTWV0aG9kRW1pdE9wdHMge1xuICByZW5kZXJBYnN0cmFjdD86IGJvb2xlYW47XG4gIGZvcmNlRW1pdEJvZHk/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlTWV0aG9kIGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBjbGFzc0FzRmlyc3RQYXJhbWV0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJldHVybkZyb21KU0lJTWV0aG9kOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBqc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtZXRlcnM6IHNwZWMuUGFyYW1ldGVyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXR1cm5zOiBzcGVjLk9wdGlvbmFsVmFsdWUgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNTdGF0aWM6IGJvb2xlYW4sXG4gICAgb3B0czogQmFzZU1ldGhvZE9wdHMsXG4gICkge1xuICAgIHRoaXMuYWJzdHJhY3QgPSAhIW9wdHMuYWJzdHJhY3Q7XG4gICAgdGhpcy5saWZ0ZWRQcm9wID0gb3B0cy5saWZ0ZWRQcm9wO1xuICAgIHRoaXMucGFyZW50ID0gb3B0cy5wYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogdGhpcy5wYXJlbnQuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogdGhpcy5qc05hbWUgPz8gJycsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgdG9UeXBlTmFtZSh0aGlzLnJldHVybnMpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgIC4uLnRoaXMucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PlxuICAgICAgICB0b1R5cGVOYW1lKHBhcmFtKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksXG4gICAgICApLFxuICAgICAgLi4ubGlmdGVkUHJvcGVydGllcyh0aGlzLmxpZnRlZFByb3ApLFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiogbGlmdGVkUHJvcGVydGllcyhcbiAgICAgIHN0cnVjdDogc3BlYy5JbnRlcmZhY2VUeXBlIHwgdW5kZWZpbmVkLFxuICAgICk6IEl0ZXJhYmxlSXRlcmF0b3I8UHl0aG9uSW1wb3J0cz4ge1xuICAgICAgaWYgKHN0cnVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBzdHJ1Y3QucHJvcGVydGllcyA/PyBbXSkge1xuICAgICAgICB5aWVsZCB0b1R5cGVOYW1lKHByb3AudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBiYXNlIG9mIHN0cnVjdC5pbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGlmYWNlID0gY29udGV4dC5yZXNvbHZlci5kZXJlZmVyZW5jZShiYXNlKSBhcyBzcGVjLkludGVyZmFjZVR5cGU7XG4gICAgICAgIGZvciAoY29uc3QgaW1wb3J0cyBvZiBsaWZ0ZWRQcm9wZXJ0aWVzKGlmYWNlKSkge1xuICAgICAgICAgIHlpZWxkIGltcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZW1pdChcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgb3B0cz86IEJhc2VNZXRob2RFbWl0T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyByZW5kZXJBYnN0cmFjdCA9IHRydWUsIGZvcmNlRW1pdEJvZHkgPSBmYWxzZSB9ID0gb3B0cyA/PyB7fTtcblxuICAgIGNvbnN0IHJldHVyblR5cGU6IHN0cmluZyA9IHRvVHlwZU5hbWUodGhpcy5yZXR1cm5zKS5weXRob25UeXBlKGNvbnRleHQpO1xuXG4gICAgLy8gV2UgY2Fubm90IChjdXJyZW50bHk/KSBibGluZGx5IHVzZSB0aGUgbmFtZXMgZ2l2ZW4gdG8gdXMgYnkgdGhlIEpTSUkgZm9yXG4gICAgLy8gaW5pdGlhbGl6ZXJzLCBiZWNhdXNlIG91ciBrZXl3b3JkIGxpZnRpbmcgd2lsbCBhbGxvdyB0d28gbmFtZXMgdG8gY2xhc2guXG4gICAgLy8gVGhpcyBjYW4gaG9wZWZ1bGx5IGJlIHJlbW92ZWQgb25jZSB3ZSBnZXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yODhcbiAgICAvLyByZXNvbHZlZCwgc28gYnVpbGQgdXAgYSBsaXN0IG9mIGFsbCBvZiB0aGUgcHJvcCBuYW1lcyBzbyB3ZSBjYW4gY2hlY2sgYWdhaW5zdFxuICAgIC8vIHRoZW0gbGF0ZXIuXG4gICAgY29uc3QgbGlmdGVkUHJvcE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgaWYgKHRoaXMubGlmdGVkUHJvcD8ucHJvcGVydGllcyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5saWZ0ZWRQcm9wLnByb3BlcnRpZXMpIHtcbiAgICAgICAgbGlmdGVkUHJvcE5hbWVzLmFkZCh0b1B5dGhvblBhcmFtZXRlck5hbWUocHJvcC5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgbmVlZCB0byB0dXJuIGEgbGlzdCBvZiBKU0lJIHBhcmFtZXRlcnMsIGludG8gUHl0aG9uIHN0eWxlIGFyZ3VtZW50cyB3aXRoXG4gICAgLy8gZ3JhZHVhbCB0eXBpbmcsIHNvIHdlJ2xsIGhhdmUgdG8gaXRlcmF0ZSBvdmVyIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMsIGFuZFxuICAgIC8vIGJ1aWxkIHRoZSBsaXN0LCBjb252ZXJ0aW5nIGFzIHdlIGdvLlxuICAgIGNvbnN0IHB5dGhvblBhcmFtczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHRoaXMucGFyYW1ldGVycykge1xuICAgICAgLy8gV2UgY2Fubm90IChjdXJyZW50bHk/KSBibGluZGx5IHVzZSB0aGUgbmFtZXMgZ2l2ZW4gdG8gdXMgYnkgdGhlIEpTSUkgZm9yXG4gICAgICAvLyBpbml0aWFsaXplcnMsIGJlY2F1c2Ugb3VyIGtleXdvcmQgbGlmdGluZyB3aWxsIGFsbG93IHR3byBuYW1lcyB0byBjbGFzaC5cbiAgICAgIC8vIFRoaXMgY2FuIGhvcGVmdWxseSBiZSByZW1vdmVkIG9uY2Ugd2UgZ2V0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjg4XG4gICAgICAvLyByZXNvbHZlZC5cbiAgICAgIGNvbnN0IHBhcmFtTmFtZTogc3RyaW5nID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKFxuICAgICAgICBwYXJhbS5uYW1lLFxuICAgICAgICBsaWZ0ZWRQcm9wTmFtZXMsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBwYXJhbVR5cGUgPSB0b1R5cGVOYW1lKHBhcmFtKS5weXRob25UeXBlKHtcbiAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgcGFyYW1ldGVyVHlwZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGFyYW1EZWZhdWx0ID0gcGFyYW0ub3B0aW9uYWwgPyAnID0gTm9uZScgOiAnJztcblxuICAgICAgcHl0aG9uUGFyYW1zLnB1c2goYCR7cGFyYW1OYW1lfTogJHtwYXJhbVR5cGV9JHtwYXJhbURlZmF1bHR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jdW1lbnRhYmxlQXJnczogRG9jdW1lbnRhYmxlQXJndW1lbnRbXSA9IHRoaXMucGFyYW1ldGVyc1xuICAgICAgLm1hcChcbiAgICAgICAgKHApID0+XG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICAgIGRvY3M6IHAuZG9jcyxcbiAgICAgICAgICAgIGRlZmluaW5nVHlwZTogdGhpcy5wYXJlbnQsXG4gICAgICAgICAgfSBhcyBEb2N1bWVudGFibGVBcmd1bWVudCksXG4gICAgICApXG4gICAgICAvLyBJZiB0aGVyZSdzIGxpZnRlZFByb3BzLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgc3RydWN0IGFuZCBpdCB3b24ndCBiZSBfYWN0dWFsbHlfIGVtaXR0ZWQuXG4gICAgICAuZmlsdGVyKChfLCBpbmRleCkgPT5cbiAgICAgICAgdGhpcy5saWZ0ZWRQcm9wICE9IG51bGwgPyBpbmRleCA8IHRoaXMucGFyYW1ldGVycy5sZW5ndGggLSAxIDogdHJ1ZSxcbiAgICAgIClcbiAgICAgIC5tYXAoKHBhcmFtKSA9PiAoe1xuICAgICAgICAuLi5wYXJhbSxcbiAgICAgICAgbmFtZTogdG9QeXRob25QYXJhbWV0ZXJOYW1lKHBhcmFtLm5hbWUsIGxpZnRlZFByb3BOYW1lcyksXG4gICAgICB9KSk7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgbGlmdGVkIHBhcmFtZXRlciwgdGhlbiB3ZSdsbCBkcm9wIHRoZSBsYXN0IGFyZ3VtZW50IHRvIG91ciBwYXJhbXNcbiAgICAvLyBhbmQgdGhlbiB3ZSdsbCBsaWZ0IGFsbCBvZiB0aGUgcGFyYW1zIG9mIHRoZSBsaWZ0ZWQgdHlwZSBhcyBrZXl3b3JkIGFyZ3VtZW50c1xuICAgIC8vIHRvIHRoZSBmdW5jdGlvbi5cbiAgICBpZiAodGhpcy5saWZ0ZWRQcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFJlbW92ZSBvdXIgbGFzdCBpdGVtLlxuICAgICAgcHl0aG9uUGFyYW1zLnBvcCgpO1xuICAgICAgY29uc3QgbGlmdGVkUHJvcGVydGllcyA9IHRoaXMuZ2V0TGlmdGVkUHJvcGVydGllcyhjb250ZXh0LnJlc29sdmVyKTtcblxuICAgICAgaWYgKGxpZnRlZFByb3BlcnRpZXMubGVuZ3RoID49IDEpIHtcbiAgICAgICAgLy8gQWxsIG9mIHRoZXNlIHBhcmFtZXRlcnMgYXJlIGtleXdvcmQgb25seSBhcmd1bWVudHMsIHNvIHdlJ2xsIG1hcmsgdGhlbVxuICAgICAgICAvLyBhcyBzdWNoLlxuICAgICAgICBweXRob25QYXJhbXMucHVzaCgnKicpO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgb2Ygb3VyIHByb3BzLCBhbmQgcmVmbGVjdCB0aGVtIGludG8gb3VyIHBhcmFtcy5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGxpZnRlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUocHJvcC5wcm9wLm5hbWUpO1xuICAgICAgICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRvVHlwZU5hbWUocHJvcC5wcm9wKS5weXRob25UeXBlKHtcbiAgICAgICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgICAgICBwYXJhbWV0ZXJUeXBlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHBhcmFtRGVmYXVsdCA9IHByb3AucHJvcC5vcHRpb25hbCA/ICcgPSBOb25lJyA6ICcnO1xuXG4gICAgICAgICAgcHl0aG9uUGFyYW1zLnB1c2goYCR7cGFyYW1OYW1lfTogJHtwYXJhbVR5cGV9JHtwYXJhbURlZmF1bHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRG9jdW1lbnQgdGhlbSBhcyBrZXl3b3JkIGFyZ3VtZW50c1xuICAgICAgZG9jdW1lbnRhYmxlQXJncy5wdXNoKFxuICAgICAgICAuLi5saWZ0ZWRQcm9wZXJ0aWVzLm1hcChcbiAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgIG5hbWU6IHAucHJvcC5uYW1lLFxuICAgICAgICAgICAgICBkb2NzOiBwLnByb3AuZG9jcyxcbiAgICAgICAgICAgICAgZGVmaW5pbmdUeXBlOiBwLmRlZmluaW5nVHlwZSxcbiAgICAgICAgICAgIH0gYXMgRG9jdW1lbnRhYmxlQXJndW1lbnQpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCA+PSAxICYmXG4gICAgICB0aGlzLnBhcmFtZXRlcnNbdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCAtIDFdLnZhcmlhZGljXG4gICAgKSB7XG4gICAgICAvLyBBbm90aGVyIHNpdHVhdGlvbiB3ZSBjb3VsZCBiZSBpbiwgaXMgdGhhdCBpbnN0ZWFkIG9mIGhhdmluZyBhIHBsYWluIHBhcmFtZXRlclxuICAgICAgLy8gd2UgaGF2ZSBhIHZhcmlhZGljIHBhcmFtZXRlciB3aGVyZSB3ZSBuZWVkIHRvIGV4cGFuZCB0aGUgbGFzdCBwYXJhbWV0ZXIgYXMgYVxuICAgICAgLy8gKmFyZ3MuXG4gICAgICBweXRob25QYXJhbXMucG9wKCk7XG5cbiAgICAgIGNvbnN0IGxhc3RQYXJhbWV0ZXIgPSB0aGlzLnBhcmFtZXRlcnMuc2xpY2UoLTEpWzBdO1xuICAgICAgY29uc3QgcGFyYW1OYW1lID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKGxhc3RQYXJhbWV0ZXIubmFtZSk7XG4gICAgICBjb25zdCBwYXJhbVR5cGUgPSB0b1R5cGVOYW1lKGxhc3RQYXJhbWV0ZXIudHlwZSkucHl0aG9uVHlwZShjb250ZXh0KTtcblxuICAgICAgcHl0aG9uUGFyYW1zLnB1c2goYCoke3BhcmFtTmFtZX06ICR7cGFyYW1UeXBlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY29yYXRvcnMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgaWYgKHRoaXMuanNOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBuZWVkZWQgYmVjYXVzZSBteXB5IGRvZXMgbm90IGtub3cgaG93IHRvIGNoZWNrIGRlY29yYXRlZCBkZWNsYXJhdGlvbnNcbiAgICAgIGRlY29yYXRvcnMucHVzaChgQGpzaWkubWVtYmVyKGpzaWlfbmFtZT1cIiR7dGhpcy5qc05hbWV9XCIpYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVjb3JhdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaChgQCR7dGhpcy5kZWNvcmF0b3J9YCk7XG4gICAgfVxuXG4gICAgaWYgKHJlbmRlckFic3RyYWN0ICYmIHRoaXMuYWJzdHJhY3QpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaCgnQGFiYy5hYnN0cmFjdG1ldGhvZCcpO1xuICAgIH1cblxuICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBuZWVkZWQgYmVjYXVzZSBteXB5IGRvZXMgbm90IGtub3cgaG93IHRvIGNoZWNrIGRlY29yYXRlZCBkZWNsYXJhdGlvbnNcbiAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnNcbiAgICAgICAgLmpvaW4oJyAjIHR5cGU6IGlnbm9yZVttaXNjXVxcbicpXG4gICAgICAgIC5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgY29kZS5saW5lKGRlY29yYXRvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHl0aG9uUGFyYW1zLnVuc2hpZnQoXG4gICAgICBzbHVnaWZ5QXNOZWVkZWQoXG4gICAgICAgIHRoaXMuaW1wbGljaXRQYXJhbWV0ZXIsXG4gICAgICAgIHB5dGhvblBhcmFtcy5tYXAoKHBhcmFtKSA9PiBwYXJhbS5zcGxpdCgnOicpWzBdLnRyaW0oKSksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBvcGVuU2lnbmF0dXJlKFxuICAgICAgY29kZSxcbiAgICAgICdkZWYnLFxuICAgICAgdGhpcy5weXRob25OYW1lLFxuICAgICAgcHl0aG9uUGFyYW1zLFxuICAgICAgZmFsc2UsXG4gICAgICByZXR1cm5UeXBlLFxuICAgICk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGFyZ3VtZW50czogZG9jdW1lbnRhYmxlQXJncyxcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBtZXRob2QtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRCb2R5KFxuICAgICAgY29kZSxcbiAgICAgIGNvbnRleHQsXG4gICAgICByZW5kZXJBYnN0cmFjdCxcbiAgICAgIGZvcmNlRW1pdEJvZHksXG4gICAgICBsaWZ0ZWRQcm9wTmFtZXMsXG4gICAgICBweXRob25QYXJhbXNbMF0sXG4gICAgICByZXR1cm5UeXBlLFxuICAgICk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRCb2R5KFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICByZW5kZXJBYnN0cmFjdDogYm9vbGVhbixcbiAgICBmb3JjZUVtaXRCb2R5OiBib29sZWFuLFxuICAgIGxpZnRlZFByb3BOYW1lczogU2V0PHN0cmluZz4sXG4gICAgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyxcbiAgICByZXR1cm5UeXBlOiBzdHJpbmcsXG4gICkge1xuICAgIGlmIChcbiAgICAgICghdGhpcy5zaG91bGRFbWl0Qm9keSAmJiAhZm9yY2VFbWl0Qm9keSkgfHxcbiAgICAgIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KVxuICAgICkge1xuICAgICAgY29kZS5saW5lKCcuLi4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubGlmdGVkUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZW1pdEF1dG9Qcm9wcyhjb2RlLCBjb250ZXh0LCBsaWZ0ZWRQcm9wTmFtZXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXRKc2lpTWV0aG9kQ2FsbChcbiAgICAgICAgY29kZSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgbGlmdGVkUHJvcE5hbWVzLFxuICAgICAgICBpbXBsaWNpdFBhcmFtZXRlcixcbiAgICAgICAgcmV0dXJuVHlwZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0QXV0b1Byb3BzKFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICBsaWZ0ZWRQcm9wTmFtZXM6IFNldDxzdHJpbmc+LFxuICApIHtcbiAgICBjb25zdCBsYXN0UGFyYW1ldGVyID0gdGhpcy5wYXJhbWV0ZXJzLnNsaWNlKC0xKVswXTtcbiAgICBjb25zdCBhcmdOYW1lID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKGxhc3RQYXJhbWV0ZXIubmFtZSwgbGlmdGVkUHJvcE5hbWVzKTtcbiAgICBjb25zdCB0eXBlTmFtZSA9IHRvVHlwZU5hbWUobGFzdFBhcmFtZXRlci50eXBlKS5weXRob25UeXBlKHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBwcm9wZXJ0aWVzLCB3aGljaCBhcmUgbWFuZGF0b3J5LCB0aGVzZSBhcmUgdGhlXG4gICAgLy8gb25lcyB3ZSB3aWxsIHNwZWNpZml5IHRvIHN0YXJ0IHdpdGggaW4gb3VyIGRpY3Rpb25hcnkgbGl0ZXJhbC5cbiAgICBjb25zdCBsaWZ0ZWRQcm9wcyA9IHRoaXMuZ2V0TGlmdGVkUHJvcGVydGllcyhjb250ZXh0LnJlc29sdmVyKS5tYXAoXG4gICAgICAocCkgPT4gbmV3IFN0cnVjdEZpZWxkKHRoaXMuZ2VuZXJhdG9yLCBwLnByb3AsIHAuZGVmaW5pbmdUeXBlKSxcbiAgICApO1xuICAgIGNvbnN0IGFzc2lnbm1lbnRzID0gbGlmdGVkUHJvcHNcbiAgICAgIC5tYXAoKHApID0+IHAucHl0aG9uTmFtZSlcbiAgICAgIC5tYXAoKHYpID0+IGAke3Z9PSR7dn1gKTtcblxuICAgIGFzc2lnbkNhbGxSZXN1bHQoY29kZSwgYXJnTmFtZSwgdHlwZU5hbWUsIGFzc2lnbm1lbnRzKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEpzaWlNZXRob2RDYWxsKFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICBsaWZ0ZWRQcm9wTmFtZXM6IFNldDxzdHJpbmc+LFxuICAgIGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcsXG4gICAgcmV0dXJuVHlwZTogc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCBtZXRob2RQcmVmaXg6IHN0cmluZyA9IHRoaXMucmV0dXJuRnJvbUpTSUlNZXRob2QgPyAncmV0dXJuICcgOiAnJztcblxuICAgIGNvbnN0IGpzaWlNZXRob2RQYXJhbXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHRoaXMuY2xhc3NBc0ZpcnN0UGFyYW1ldGVyKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBub3Qga25vd24uJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1N0YXRpYykge1xuICAgICAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goXG4gICAgICAgICAgdG9UeXBlTmFtZSh0aGlzLnBhcmVudCkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNpbmcgdGhlIGR5bmFtaWMgY2xhc3Mgb2YgYHNlbGZgLlxuICAgICAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goYCR7aW1wbGljaXRQYXJhbWV0ZXJ9Ll9fY2xhc3NfX2ApO1xuICAgICAgfVxuICAgIH1cbiAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goaW1wbGljaXRQYXJhbWV0ZXIpO1xuICAgIGlmICh0aGlzLmpzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goYFwiJHt0aGlzLmpzTmFtZX1cImApO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBsYXN0IGFyZyBpcyB2YXJpYWRpYywgZXhwYW5kIHRoZSB0dXBsZVxuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHRoaXMucGFyYW1ldGVycykge1xuICAgICAgbGV0IGV4cHIgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUocGFyYW0ubmFtZSwgbGlmdGVkUHJvcE5hbWVzKTtcbiAgICAgIGlmIChwYXJhbS52YXJpYWRpYykge1xuICAgICAgICBleHByID0gYCoke2V4cHJ9YDtcbiAgICAgIH1cbiAgICAgIHBhcmFtcy5wdXNoKGV4cHIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gYGpzaWkuJHt0aGlzLmpzaWlNZXRob2R9KCR7anNpaU1ldGhvZFBhcmFtcy5qb2luKFxuICAgICAgJywgJyxcbiAgICApfSwgWyR7cGFyYW1zLmpvaW4oJywgJyl9XSlgO1xuICAgIGNvZGUubGluZShcbiAgICAgIGAke21ldGhvZFByZWZpeH0ke1xuICAgICAgICB0aGlzLnJldHVybkZyb21KU0lJTWV0aG9kICYmIHJldHVyblR5cGVcbiAgICAgICAgICA/IGB0eXBpbmcuY2FzdCgke3JldHVyblR5cGV9LCAke3ZhbHVlfSlgXG4gICAgICAgICAgOiB2YWx1ZVxuICAgICAgfWAsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGlmdGVkUHJvcGVydGllcyhyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogUHJvcGVydHlEZWZpbml0aW9uW10ge1xuICAgIGNvbnN0IGxpZnRlZFByb3BlcnRpZXM6IFByb3BlcnR5RGVmaW5pdGlvbltdID0gW107XG5cbiAgICBjb25zdCBzdGFjayA9IFt0aGlzLmxpZnRlZFByb3BdO1xuICAgIGNvbnN0IGtub3duSWZhY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qga25vd25Qcm9wcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoXG4gICAgICBsZXQgY3VycmVudCA9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICBjdXJyZW50ICE9IG51bGw7XG4gICAgICBjdXJyZW50ID0gc3RhY2suc2hpZnQoKVxuICAgICkge1xuICAgICAga25vd25JZmFjZXMuYWRkKGN1cnJlbnQuZnFuKTtcblxuICAgICAgLy8gQWRkIGFueSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBpbnRlcmZhY2UgZGVwZW5kcyBvbiwgdG8gdGhlIGxpc3QuXG4gICAgICBpZiAoY3VycmVudC5pbnRlcmZhY2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZmFjZSBvZiBjdXJyZW50LmludGVyZmFjZXMpIHtcbiAgICAgICAgICBpZiAoa25vd25JZmFjZXMuaGFzKGlmYWNlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YWNrLnB1c2gocmVzb2x2ZXIuZGVyZWZlcmVuY2UoaWZhY2UpIGFzIHNwZWMuSW50ZXJmYWNlVHlwZSk7XG4gICAgICAgICAga25vd25JZmFjZXMuYWRkKGlmYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgaW50ZXJmYWNlIHRvIG91ciBsaXN0IG9mIHByb3BlcnRpZXMuXG4gICAgICBpZiAoY3VycmVudC5wcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGN1cnJlbnQucHJvcGVydGllcykge1xuICAgICAgICAgIGlmIChrbm93blByb3BzLmhhcyhwcm9wLm5hbWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGlmdGVkUHJvcGVydGllcy5wdXNoKHsgcHJvcCwgZGVmaW5pbmdUeXBlOiBjdXJyZW50IH0pO1xuICAgICAgICAgIGtub3duUHJvcHMuYWRkKHByb3AubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGlmdGVkUHJvcGVydGllcztcbiAgfVxufVxuXG5pbnRlcmZhY2UgQmFzZVByb3BlcnR5T3B0cyB7XG4gIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgaXNTdGF0aWM/OiBib29sZWFuO1xuICBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xufVxuXG5pbnRlcmZhY2UgQmFzZVByb3BlcnR5RW1pdE9wdHMge1xuICByZW5kZXJBYnN0cmFjdD86IGJvb2xlYW47XG4gIGZvcmNlRW1pdEJvZHk/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlUHJvcGVydHkgaW1wbGVtZW50cyBQeXRob25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFic3RyYWN0OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNTdGF0aWM6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpU2V0TWV0aG9kITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1tdXRhYmxlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGpzTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHlwZTogc3BlYy5PcHRpb25hbFZhbHVlLFxuICAgIHB1YmxpYyByZWFkb25seSBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICAgb3B0czogQmFzZVByb3BlcnR5T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyBhYnN0cmFjdCA9IGZhbHNlLCBpbW11dGFibGUgPSBmYWxzZSwgaXNTdGF0aWMgPSBmYWxzZSB9ID0gb3B0cztcblxuICAgIHRoaXMuYWJzdHJhY3QgPSBhYnN0cmFjdDtcbiAgICB0aGlzLmltbXV0YWJsZSA9IGltbXV0YWJsZTtcbiAgICB0aGlzLmlzU3RhdGljID0gaXNTdGF0aWM7XG4gICAgdGhpcy5wYXJlbnQgPSBvcHRzLnBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIHJldHVybiB7IGFwaTogJ21lbWJlcicsIGZxbjogdGhpcy5wYXJlbnQuZnFuLCBtZW1iZXJOYW1lOiB0aGlzLmpzTmFtZSB9O1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIG9wdHM/OiBCYXNlUHJvcGVydHlFbWl0T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyByZW5kZXJBYnN0cmFjdCA9IHRydWUsIGZvcmNlRW1pdEJvZHkgPSBmYWxzZSB9ID0gb3B0cyA/PyB7fTtcbiAgICBjb25zdCBweXRob25UeXBlID0gdG9UeXBlTmFtZSh0aGlzLnR5cGUpLnB5dGhvblR5cGUoY29udGV4dCk7XG5cbiAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgaXMgbmVlZGVkIGJlY2F1c2UgbXlweSBjYW5ub3QgY2hlY2sgZGVjb3JhdGVkIHRoaW5nc1xuICAgIGNvZGUubGluZShgQCR7dGhpcy5kZWNvcmF0b3J9ICMgdHlwZTogaWdub3JlW21pc2NdYCk7XG4gICAgY29kZS5saW5lKGBAanNpaS5tZW1iZXIoanNpaV9uYW1lPVwiJHt0aGlzLmpzTmFtZX1cIilgKTtcbiAgICBpZiAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdCkge1xuICAgICAgY29kZS5saW5lKCdAYWJjLmFic3RyYWN0bWV0aG9kJyk7XG4gICAgfVxuICAgIG9wZW5TaWduYXR1cmUoXG4gICAgICBjb2RlLFxuICAgICAgJ2RlZicsXG4gICAgICB0aGlzLnB5dGhvbk5hbWUsXG4gICAgICBbdGhpcy5pbXBsaWNpdFBhcmFtZXRlcl0sXG4gICAgICB0cnVlLFxuICAgICAgcHl0aG9uVHlwZSxcbiAgICApO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgcHJvcC0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgICh0aGlzLnNob3VsZEVtaXRCb2R5IHx8IGZvcmNlRW1pdEJvZHkpICYmXG4gICAgICAoIXJlbmRlckFic3RyYWN0IHx8ICF0aGlzLmFic3RyYWN0KVxuICAgICkge1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgcmV0dXJuIHR5cGluZy5jYXN0KCR7cHl0aG9uVHlwZX0sIGpzaWkuJHt0aGlzLmpzaWlHZXRNZXRob2R9KCR7dGhpcy5pbXBsaWNpdFBhcmFtZXRlcn0sIFwiJHt0aGlzLmpzTmFtZX1cIikpYCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgfVxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgaWYgKCF0aGlzLmltbXV0YWJsZSkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGBAJHt0aGlzLnB5dGhvbk5hbWV9LnNldHRlciR7XG4gICAgICAgICAgdGhpcy5pc1N0YXRpYyA/ICcgIyB0eXBlOiBpZ25vcmVbbm8tcmVkZWZdJyA6ICcnXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICAgIGlmIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KSB7XG4gICAgICAgIGNvZGUubGluZSgnQGFiYy5hYnN0cmFjdG1ldGhvZCcpO1xuICAgICAgfVxuICAgICAgb3BlblNpZ25hdHVyZShcbiAgICAgICAgY29kZSxcbiAgICAgICAgJ2RlZicsXG4gICAgICAgIHRoaXMucHl0aG9uTmFtZSxcbiAgICAgICAgW3RoaXMuaW1wbGljaXRQYXJhbWV0ZXIsIGB2YWx1ZTogJHtweXRob25UeXBlfWBdLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgJ05vbmUnLFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgKHRoaXMuc2hvdWxkRW1pdEJvZHkgfHwgZm9yY2VFbWl0Qm9keSkgJiZcbiAgICAgICAgKCFyZW5kZXJBYnN0cmFjdCB8fCAhdGhpcy5hYnN0cmFjdClcbiAgICAgICkge1xuICAgICAgICBjb2RlLmxpbmUoXG4gICAgICAgICAgYGpzaWkuJHt0aGlzLmpzaWlTZXRNZXRob2R9KCR7dGhpcy5pbXBsaWNpdFBhcmFtZXRlcn0sIFwiJHt0aGlzLmpzTmFtZX1cIiwgdmFsdWUpYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgICB9XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgSW50ZXJmYWNlIGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSB7XG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgZW1pdExpc3QoY29kZSwgJ0Bqc2lpLmludGVyZmFjZSgnLCBbYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgXSwgJyknKTtcblxuICAgIC8vIEZpcnN0IHdlIGRvIG91ciBub3JtYWwgY2xhc3MgbG9naWMgZm9yIGVtaXR0aW5nIG91ciBtZW1iZXJzLlxuICAgIHN1cGVyLmVtaXQoY29kZSwgY29udGV4dCk7XG5cbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoKTtcblxuICAgIC8vIFRoZW4sIHdlIGhhdmUgdG8gZW1pdCBhIFByb3h5IGNsYXNzIHdoaWNoIGltcGxlbWVudHMgb3VyIHByb3h5IGludGVyZmFjZS5cbiAgICBjb25zdCBwcm94eUJhc2VzOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKFxuICAgICAgKGIpID0+XG4gICAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBiZWNhdXNlIE15UHkgY2Fubm90IGNoZWNrIGR5bmFtaWMgYmFzZSBjbGFzc2VzIChuYXR1cmFsbHkpXG4gICAgICAgIGBqc2lpLnByb3h5X2Zvcigke3RvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7XG4gICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgICAgIH0pfSkgIyB0eXBlOiBpZ25vcmVbbWlzY11gLFxuICAgICk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnByb3h5Q2xhc3NOYW1lLCBwcm94eUJhc2VzKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgICB0cmFpbGluZ05ld0xpbmU6IHRydWUsXG4gICAgfSk7XG4gICAgY29kZS5saW5lKGBfX2pzaWlfdHlwZV9fOiB0eXBpbmcuQ2xhc3NWYXJbc3RyXSA9IFwiJHt0aGlzLmZxbn1cImApO1xuXG4gICAgaWYgKHRoaXMubWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLm1lbWJlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VwYXJhdGVNZW1iZXJzKSB7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgbWVtYmVyLmVtaXQoY29kZSwgY29udGV4dCwgeyBmb3JjZUVtaXRCb2R5OiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICAnIyBBZGRpbmcgYSBcIl9fanNpaV9wcm94eV9jbGFzc19fKCk6IHR5cGluZy5UeXBlXCIgZnVuY3Rpb24gdG8gdGhlIGludGVyZmFjZScsXG4gICAgKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICBgdHlwaW5nLmNhc3QodHlwaW5nLkFueSwgJHt0aGlzLnB5dGhvbk5hbWV9KS5fX2pzaWlfcHJveHlfY2xhc3NfXyA9IGxhbWJkYSA6ICR7dGhpcy5wcm94eUNsYXNzTmFtZX1gLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5mcW4gIT0gbnVsbCkge1xuICAgICAgY29udGV4dC5lbWl0dGVkVHlwZXMuYWRkKHRoaXMuZnFuKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG5cbiAgICBwYXJhbXMucHVzaCgndHlwaW5nX2V4dGVuc2lvbnMuUHJvdG9jb2wnKTtcblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBwcm94eUNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXyR7dGhpcy5weXRob25OYW1lfVByb3h5YDtcbiAgfVxufVxuXG5jbGFzcyBJbnRlcmZhY2VNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnaW52b2tlJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gZmFsc2U7XG59XG5cbmNsYXNzIEludGVyZmFjZVByb3BlcnR5IGV4dGVuZHMgQmFzZVByb3BlcnR5IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nID0gJ2J1aWx0aW5zLnByb3BlcnR5JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpR2V0TWV0aG9kOiBzdHJpbmcgPSAnZ2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2Q6IHN0cmluZyA9ICdzZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgU3RydWN0IGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSB7XG4gIHByb3RlY3RlZCBkaXJlY3RNZW1iZXJzID0gbmV3IEFycmF5PFN0cnVjdEZpZWxkPigpO1xuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKTogdm9pZCB7XG4gICAgaWYgKCEobWVtYmVyIGluc3RhbmNlb2YgU3RydWN0RmllbGQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYWRkIFN0cnVjdEZpZWxkIHRvIFN0cnVjdCcpO1xuICAgIH1cbiAgICB0aGlzLmRpcmVjdE1lbWJlcnMucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcbiAgICBjb25zdCBiYXNlSW50ZXJmYWNlcyA9IHRoaXMuZ2V0Q2xhc3NQYXJhbXMoY29udGV4dCk7XG5cbiAgICBjb2RlLmluZGVudCgnQGpzaWkuZGF0YV90eXBlKCcpO1xuICAgIGNvZGUubGluZShganNpaV90eXBlPSR7SlNPTi5zdHJpbmdpZnkodGhpcy5mcW4pfSxgKTtcbiAgICBlbWl0TGlzdChjb2RlLCAnanNpaV9zdHJ1Y3RfYmFzZXM9WycsIGJhc2VJbnRlcmZhY2VzLCAnXSwnKTtcbiAgICBhc3NpZ25EaWN0aW9uYXJ5KGNvZGUsICduYW1lX21hcHBpbmcnLCB0aGlzLnByb3BlcnR5TWFwKCksICcsJywgdHJ1ZSk7XG4gICAgY29kZS51bmluZGVudCgnKScpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5weXRob25OYW1lLCBiYXNlSW50ZXJmYWNlcyk7XG4gICAgdGhpcy5lbWl0Q29uc3RydWN0b3IoY29kZSwgY29udGV4dCk7XG5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLmFsbE1lbWJlcnMpIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgdGhpcy5lbWl0R2V0dGVyKG1lbWJlciwgY29kZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0TWFnaWNNZXRob2RzKGNvZGUpO1xuXG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBpZiAodGhpcy5mcW4gIT0gbnVsbCkge1xuICAgICAgY29udGV4dC5lbWl0dGVkVHlwZXMuYWRkKHRoaXMuZnFuKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIHN1cGVyLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgIC4uLnRoaXMuYWxsTWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlcy5tYXAoKGIpID0+XG4gICAgICB0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoeyAuLi5jb250ZXh0LCB0eXBlQW5ub3RhdGlvbjogZmFsc2UgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFsbCBmaWVsZHMgKGluaGVyaXRlZCBhcyB3ZWxsKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgYWxsTWVtYmVycygpOiBTdHJ1Y3RGaWVsZFtdIHtcbiAgICByZXR1cm4gdGhpcy50aGlzSW50ZXJmYWNlLmFsbFByb3BlcnRpZXMubWFwKFxuICAgICAgKHgpID0+IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLmdlbmVyYXRvciwgeC5zcGVjLCB4LmRlZmluaW5nVHlwZS5zcGVjKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdGhpc0ludGVyZmFjZSgpIHtcbiAgICBpZiAodGhpcy5mcW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGUU4gbm90IHNldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0b3IucmVmbGVjdEFzc2VtYmx5LnN5c3RlbS5maW5kSW50ZXJmYWNlKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCBtZW1iZXJzID0gdGhpcy5hbGxNZW1iZXJzO1xuXG4gICAgY29uc3Qga3dhcmdzID0gbWVtYmVycy5tYXAoKG0pID0+IG0uY29uc3RydWN0b3JEZWNsKGNvbnRleHQpKTtcblxuICAgIGNvbnN0IGltcGxpY2l0UGFyYW1ldGVyID0gc2x1Z2lmeUFzTmVlZGVkKFxuICAgICAgJ3NlbGYnLFxuICAgICAgbWVtYmVycy5tYXAoKG0pID0+IG0ucHl0aG9uTmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBjb25zdHJ1Y3RvckFyZ3VtZW50cyA9XG4gICAgICBrd2FyZ3MubGVuZ3RoID4gMFxuICAgICAgICA/IFtpbXBsaWNpdFBhcmFtZXRlciwgJyonLCAuLi5rd2FyZ3NdXG4gICAgICAgIDogW2ltcGxpY2l0UGFyYW1ldGVyXTtcblxuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2RlZicsICdfX2luaXRfXycsIGNvbnN0cnVjdG9yQXJndW1lbnRzLCBmYWxzZSwgJ05vbmUnKTtcbiAgICB0aGlzLmVtaXRDb25zdHJ1Y3RvckRvY3N0cmluZyhjb2RlKTtcblxuICAgIC8vIFJlLXR5cGUgc3RydWN0IGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGFzIFwiZGljdFwiXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0uaXNTdHJ1Y3QodGhpcy5nZW5lcmF0b3IpKSkge1xuICAgICAgLy8gTm90ZSB0aGF0IFwiTm9uZVwiIGlzIE5PVCBhbiBpbnN0YW5jZSBvZiBkaWN0ICh0aGF0J3MgY29udmVuaWVudCEpXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IHRvVHlwZU5hbWUobWVtYmVyLnR5cGUudHlwZSkucHl0aG9uVHlwZSh7XG4gICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgY29kZS5vcGVuQmxvY2soYGlmIGlzaW5zdGFuY2UoJHttZW1iZXIucHl0aG9uTmFtZX0sIGRpY3QpYCk7XG4gICAgICBjb2RlLmxpbmUoYCR7bWVtYmVyLnB5dGhvbk5hbWV9ID0gJHt0eXBlTmFtZX0oKioke21lbWJlci5weXRob25OYW1lfSlgKTtcbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cblxuICAgIC8vIFJlcXVpcmVkIHByb3BlcnRpZXMsIHRob3NlIHdpbGwgYWx3YXlzIGJlIHB1dCBpbnRvIHRoZSBkaWN0XG4gICAgYXNzaWduRGljdGlvbmFyeShcbiAgICAgIGNvZGUsXG4gICAgICBgJHtpbXBsaWNpdFBhcmFtZXRlcn0uX3ZhbHVlczogdHlwaW5nLkRpY3Rbc3RyLCB0eXBpbmcuQW55XWAsXG4gICAgICBtZW1iZXJzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICFtLm9wdGlvbmFsKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIChtZW1iZXIpID0+XG4gICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9OiAke21lbWJlci5weXRob25OYW1lfWAsXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIC8vIE9wdGlvbmFsIHByb3BlcnRpZXMsIHdpbGwgb25seSBiZSBwdXQgaW50byB0aGUgZGljdCBpZiB0aGV5J3JlIG5vdCBOb25lXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0ub3B0aW9uYWwpKSB7XG4gICAgICBjb2RlLm9wZW5CbG9jayhgaWYgJHttZW1iZXIucHl0aG9uTmFtZX0gaXMgbm90IE5vbmVgKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYCR7aW1wbGljaXRQYXJhbWV0ZXJ9Ll92YWx1ZXNbXCIke21lbWJlci5weXRob25OYW1lfVwiXSA9ICR7bWVtYmVyLnB5dGhvbk5hbWV9YCxcbiAgICAgICk7XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yRG9jc3RyaW5nKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGNvbnN0IGFyZ3M6IERvY3VtZW50YWJsZUFyZ3VtZW50W10gPSB0aGlzLmFsbE1lbWJlcnMubWFwKChtKSA9PiAoe1xuICAgICAgbmFtZTogbS5weXRob25OYW1lLFxuICAgICAgZG9jczogbS5kb2NzLFxuICAgICAgZGVmaW5pbmdUeXBlOiB0aGlzLnNwZWMsXG4gICAgfSkpO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBhcmd1bWVudHM6IGFyZ3MsXG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgY2xhc3MtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEdldHRlcihcbiAgICBtZW1iZXI6IFN0cnVjdEZpZWxkLFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgKSB7XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9IG1lbWJlci50eXBlQW5ub3RhdGlvbihjb250ZXh0KTtcblxuICAgIGNvZGUubGluZSgnQGJ1aWx0aW5zLnByb3BlcnR5Jyk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnZGVmJywgbWVtYmVyLnB5dGhvbk5hbWUsIFsnc2VsZiddLCB0cnVlLCBweXRob25UeXBlKTtcbiAgICBtZW1iZXIuZW1pdERvY1N0cmluZyhjb2RlKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICBgcmVzdWx0ID0gc2VsZi5fdmFsdWVzLmdldCgke0pTT04uc3RyaW5naWZ5KG1lbWJlci5weXRob25OYW1lKX0pYCxcbiAgICApO1xuICAgIGlmICghbWVtYmVyLm9wdGlvbmFsKSB7XG4gICAgICAvLyBBZGQgYW4gYXNzZXJ0aW9uIHRvIG1heWUgTXlQWSBoYXBweSFcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYGFzc2VydCByZXN1bHQgaXMgbm90IE5vbmUsIFwiUmVxdWlyZWQgcHJvcGVydHkgJyR7bWVtYmVyLnB5dGhvbk5hbWV9JyBpcyBtaXNzaW5nXCJgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29kZS5saW5lKGByZXR1cm4gdHlwaW5nLmNhc3QoJHtweXRob25UeXBlfSwgcmVzdWx0KWApO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TWFnaWNNZXRob2RzKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCdkZWYgX19lcV9fKHNlbGYsIHJoczogdHlwaW5nLkFueSkgLT4gYnVpbHRpbnMuYm9vbCcpO1xuICAgIGNvZGUubGluZShcbiAgICAgICdyZXR1cm4gaXNpbnN0YW5jZShyaHMsIHNlbGYuX19jbGFzc19fKSBhbmQgcmhzLl92YWx1ZXMgPT0gc2VsZi5fdmFsdWVzJyxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5vcGVuQmxvY2soJ2RlZiBfX25lX18oc2VsZiwgcmhzOiB0eXBpbmcuQW55KSAtPiBidWlsdGlucy5ib29sJyk7XG4gICAgY29kZS5saW5lKCdyZXR1cm4gbm90IChyaHMgPT0gc2VsZiknKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCdkZWYgX19yZXByX18oc2VsZikgLT4gc3RyJyk7XG4gICAgY29kZS5pbmRlbnQoYHJldHVybiBcIiR7dGhpcy5weXRob25OYW1lfSglcylcIiAlIFwiLCBcIi5qb2luKGApO1xuICAgIGNvZGUubGluZSgnayArIFwiPVwiICsgcmVwcih2KSBmb3IgaywgdiBpbiBzZWxmLl92YWx1ZXMuaXRlbXMoKScpO1xuICAgIGNvZGUudW5pbmRlbnQoJyknKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvcGVydHlNYXAoKSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLmFsbE1lbWJlcnMpIHtcbiAgICAgIHJldC5wdXNoKFxuICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9OiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIG1lbWJlci5qc2lpTmFtZSxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxufVxuXG5jbGFzcyBTdHJ1Y3RGaWVsZCBpbXBsZW1lbnRzIFB5dGhvbkJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkganNpaU5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRvY3M/OiBzcGVjLkRvY3M7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBzcGVjLk9wdGlvbmFsVmFsdWU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWZpbmluZ1R5cGU6IHNwZWMuVHlwZSxcbiAgKSB7XG4gICAgdGhpcy5weXRob25OYW1lID0gdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lKTtcbiAgICB0aGlzLmpzaWlOYW1lID0gcHJvcC5uYW1lO1xuICAgIHRoaXMudHlwZSA9IHByb3A7XG4gICAgdGhpcy5kb2NzID0gcHJvcC5kb2NzO1xuICB9XG5cbiAgcHVibGljIGdldCBhcGlMb2NhdGlvbigpOiBBcGlMb2NhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IHRoaXMuZGVmaW5pbmdUeXBlLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IHRoaXMuanNpaU5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3B0aW9uYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy50eXBlLm9wdGlvbmFsO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGlzU3RydWN0KGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzU3RydWN0KGdlbmVyYXRvci5yZWZsZWN0QXNzZW1ibHkuc3lzdGVtLCB0aGlzLnR5cGUudHlwZSk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3JEZWNsKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3Qgb3B0ID0gdGhpcy5vcHRpb25hbCA/ICcgPSBOb25lJyA6ICcnO1xuICAgIHJldHVybiBgJHt0aGlzLnB5dGhvbk5hbWV9OiAke3RoaXMudHlwZUFubm90YXRpb24oe1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHBhcmFtZXRlclR5cGU6IHRydWUsXG4gICAgfSl9JHtvcHR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIFB5dGhvbiB0eXBlIGFubm90YXRpb24gZm9yIHRoaXMgdHlwZVxuICAgKi9cbiAgcHVibGljIHR5cGVBbm5vdGF0aW9uKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgcmV0dXJuIHRvVHlwZU5hbWUodGhpcy50eXBlKS5weXRob25UeXBlKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGVtaXREb2NTdHJpbmcoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBwcm9wLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3QgcmVzb2x2ZWRUeXBlID0gdGhpcy50eXBlQW5ub3RhdGlvbihjb250ZXh0KTtcbiAgICBjb2RlLmxpbmUoYCR7dGhpcy5weXRob25OYW1lfTogJHtyZXNvbHZlZFR5cGV9YCk7XG4gICAgdGhpcy5lbWl0RG9jU3RyaW5nKGNvZGUpO1xuICB9XG59XG5cbmludGVyZmFjZSBDbGFzc09wdHMgZXh0ZW5kcyBQeXRob25UeXBlT3B0cyB7XG4gIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgaW50ZXJmYWNlcz86IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlW107XG4gIGFic3RyYWN0QmFzZXM/OiBzcGVjLkNsYXNzVHlwZVtdO1xufVxuXG5jbGFzcyBDbGFzcyBleHRlbmRzIEJhc2VQeXRob25DbGFzc1R5cGUgaW1wbGVtZW50cyBJU29ydGFibGVUeXBlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBhYnN0cmFjdEJhc2VzOiBzcGVjLkNsYXNzVHlwZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVyZmFjZXM6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlW107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzcGVjOiBzcGVjLlR5cGUsXG4gICAgZnFuOiBzdHJpbmcsXG4gICAgb3B0czogQ2xhc3NPcHRzLFxuICAgIGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgc3VwZXIoZ2VuZXJhdG9yLCBuYW1lLCBzcGVjLCBmcW4sIG9wdHMsIGRvY3MpO1xuXG4gICAgY29uc3QgeyBhYnN0cmFjdCA9IGZhbHNlLCBpbnRlcmZhY2VzID0gW10sIGFic3RyYWN0QmFzZXMgPSBbXSB9ID0gb3B0cztcblxuICAgIHRoaXMuYWJzdHJhY3QgPSBhYnN0cmFjdDtcbiAgICB0aGlzLmludGVyZmFjZXMgPSBpbnRlcmZhY2VzO1xuICAgIHRoaXMuYWJzdHJhY3RCYXNlcyA9IGFic3RyYWN0QmFzZXM7XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kc09uKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBQeXRob25UeXBlW10ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llczogUHl0aG9uVHlwZVtdID0gc3VwZXIuZGVwZW5kc09uKHJlc29sdmVyKTtcbiAgICBjb25zdCBwYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQodGhpcy5mcW4hKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmV0dXJuIGFueSBpZmFjZXMgdGhhdCBhcmUgaW4gdGhlIHNhbWUgbW9kdWxlIGF0IHRoZSBzYW1lIGxldmVsIG9mXG4gICAgLy8gbmVzdGluZy5cbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBpZmFjZSBvZiB0aGlzLmludGVyZmFjZXMpIHtcbiAgICAgIGlmIChyZXNvbHZlci5pc0luTW9kdWxlKGlmYWNlKSkge1xuICAgICAgICAvLyBHaXZlbiBhIGlmYWNlLCB3ZSBuZWVkIHRvIGxvY2F0ZSB0aGUgaWZhY2VzJ3MgcGFyZW50IHRoYXQgaXMgdGhlIHNhbWVcbiAgICAgICAgLy8gYXMgb3VyIHBhcmVudCwgYmVjYXVzZSB3ZSBvbmx5IGNhcmUgYWJvdXQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGF0IHRoZVxuICAgICAgICAvLyBzYW1lIGxldmVsIG9mIG91ciBvd24uXG4gICAgICAgIC8vIFRPRE86IFdlIG1pZ2h0IG5lZWQgdG8gcmVjdXJzZSBpbnRvIG91ciBtZW1iZXJzIHRvIGFsc28gZmluZCB0aGVpclxuICAgICAgICAvLyAgICAgICBkZXBlbmRlbmNpZXMuXG4gICAgICAgIGxldCBpZmFjZUl0ZW0gPSByZXNvbHZlci5nZXRUeXBlKGlmYWNlKTtcbiAgICAgICAgbGV0IGlmYWNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGlmYWNlKTtcbiAgICAgICAgd2hpbGUgKGlmYWNlUGFyZW50ICE9PSBwYXJlbnQpIHtcbiAgICAgICAgICBpZmFjZUl0ZW0gPSBpZmFjZVBhcmVudDtcbiAgICAgICAgICBpZmFjZVBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudChpZmFjZUl0ZW0uZnFuISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlZW4uaGFzKGlmYWNlSXRlbS5mcW4hKSkge1xuICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGlmYWNlSXRlbSk7XG4gICAgICAgICAgc2Vlbi5hZGQoaWZhY2VJdGVtLmZxbiEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgc3VwZXIucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLCAvLyBUYWtlcyBjYXJlIG9mIGJhc2UgJiBtZW1iZXJzXG4gICAgICAuLi50aGlzLmludGVyZmFjZXMubWFwKChiYXNlKSA9PlxuICAgICAgICB0b1R5cGVOYW1lKGJhc2UpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICAvLyBGaXJzdCB3ZSBlbWl0IG91ciBpbXBsbWVudHMgZGVjb3JhdG9yXG4gICAgaWYgKHRoaXMuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpbnRlcmZhY2VzOiBzdHJpbmdbXSA9IHRoaXMuaW50ZXJmYWNlcy5tYXAoKGIpID0+XG4gICAgICAgIHRvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7IC4uLmNvbnRleHQsIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSB9KSxcbiAgICAgICk7XG4gICAgICBjb2RlLmxpbmUoYEBqc2lpLmltcGxlbWVudHMoJHtpbnRlcmZhY2VzLmpvaW4oJywgJyl9KWApO1xuICAgIH1cblxuICAgIC8vIFRoZW4gd2UgZG8gb3VyIG5vcm1hbCBjbGFzcyBsb2dpYyBmb3IgZW1pdHRpbmcgb3VyIG1lbWJlcnMuXG4gICAgc3VwZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcblxuICAgIC8vIFRoZW4sIGlmIG91ciBjbGFzcyBpcyBBYnN0cmFjdCwgd2UgaGF2ZSB0byBnbyB0aHJvdWdoIGFuZCByZWRvIGFsbCBvZlxuICAgIC8vIHRoaXMgbG9naWMsIGV4Y2VwdCBvbmx5IGVtaXRpbmcgYWJzdHJhY3QgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcyBub25cbiAgICAvLyBhYnN0cmFjdCwgYW5kIHN1YmNsYXNzaW5nIG91ciBpbml0aWFsIGNsYXNzLlxuICAgIGlmICh0aGlzLmFic3RyYWN0KSB7XG4gICAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG5cbiAgICAgIGNvbnN0IHByb3h5QmFzZXMgPSBbdGhpcy5weXRob25OYW1lXTtcbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiB0aGlzLmFic3RyYWN0QmFzZXMpIHtcbiAgICAgICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIGJlY2F1c2UgTXlQeSBjYW5ub3QgY2hlY2sgZHluYW1pYyBiYXNlIGNsYXNzZXMgKG5hdHVyYWxseSlcbiAgICAgICAgcHJveHlCYXNlcy5wdXNoKFxuICAgICAgICAgIGBqc2lpLnByb3h5X2Zvcigke3RvVHlwZU5hbWUoYmFzZSkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgICAgIH0pfSkgIyB0eXBlOiBpZ25vcmVbbWlzY11gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnByb3h5Q2xhc3NOYW1lLCBwcm94eUJhc2VzKTtcblxuICAgICAgLy8gRmlsdGVyIG91ciBsaXN0IG9mIG1lbWJlcnMgdG8gKm9ubHkqIGJlIGFic3RyYWN0IG1lbWJlcnMsIGFuZCBub3QgYW55XG4gICAgICAvLyBvdGhlciB0eXBlcy5cbiAgICAgIGNvbnN0IGFic3RyYWN0TWVtYmVycyA9IHRoaXMubWVtYmVycy5maWx0ZXIoXG4gICAgICAgIChtKSA9PlxuICAgICAgICAgIChtIGluc3RhbmNlb2YgQmFzZU1ldGhvZCB8fCBtIGluc3RhbmNlb2YgQmFzZVByb3BlcnR5KSAmJiBtLmFic3RyYWN0LFxuICAgICAgKTtcbiAgICAgIGlmIChhYnN0cmFjdE1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBhYnN0cmFjdE1lbWJlcnMpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZXBhcmF0ZU1lbWJlcnMpIHtcbiAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQsIHsgcmVuZGVyQWJzdHJhY3Q6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICAgIH1cblxuICAgICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgJyMgQWRkaW5nIGEgXCJfX2pzaWlfcHJveHlfY2xhc3NfXygpOiB0eXBpbmcuVHlwZVwiIGZ1bmN0aW9uIHRvIHRoZSBhYnN0cmFjdCBjbGFzcycsXG4gICAgICApO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgdHlwaW5nLmNhc3QodHlwaW5nLkFueSwgJHt0aGlzLnB5dGhvbk5hbWV9KS5fX2pzaWlfcHJveHlfY2xhc3NfXyA9IGxhbWJkYSA6ICR7dGhpcy5wcm94eUNsYXNzTmFtZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG4gICAgY29uc3QgbWV0YWNsYXNzOiBzdHJpbmcgPSB0aGlzLmFic3RyYWN0ID8gJ0pTSUlBYnN0cmFjdENsYXNzJyA6ICdKU0lJTWV0YSc7XG5cbiAgICBwYXJhbXMucHVzaChgbWV0YWNsYXNzPWpzaWkuJHttZXRhY2xhc3N9YCk7XG4gICAgcGFyYW1zLnB1c2goYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgKTtcblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBwcm94eUNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXyR7dGhpcy5weXRob25OYW1lfVByb3h5YDtcbiAgfVxufVxuXG5jbGFzcyBTdGF0aWNNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcj86IHN0cmluZyA9ICdidWlsdGlucy5jbGFzc21ldGhvZCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ2Nscyc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnc2ludm9rZSc7XG59XG5cbmNsYXNzIEluaXRpYWxpemVyIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2NyZWF0ZSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBjbGFzc0FzRmlyc3RQYXJhbWV0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmV0dXJuRnJvbUpTSUlNZXRob2Q6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2ludm9rZSc7XG59XG5cbmNsYXNzIEFzeW5jTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2FpbnZva2UnO1xufVxuXG5jbGFzcyBTdGF0aWNQcm9wZXJ0eSBleHRlbmRzIEJhc2VQcm9wZXJ0eSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I6IHN0cmluZyA9ICdqc2lpLnB5dGhvbi5jbGFzc3Byb3BlcnR5JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnY2xzJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdzZ2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2Q6IHN0cmluZyA9ICdzc2V0Jztcbn1cblxuY2xhc3MgUHJvcGVydHkgZXh0ZW5kcyBCYXNlUHJvcGVydHkge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVjb3JhdG9yOiBzdHJpbmcgPSAnYnVpbHRpbnMucHJvcGVydHknO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdzZWxmJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdnZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaVNldE1ldGhvZDogc3RyaW5nID0gJ3NldCc7XG59XG5cbmNsYXNzIEVudW0gZXh0ZW5kcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcGFyYXRlTWVtYmVycyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgZW1pdExpc3QoY29kZSwgJ0Bqc2lpLmVudW0oJywgW2Bqc2lpX3R5cGU9XCIke3RoaXMuZnFufVwiYF0sICcpJyk7XG4gICAgcmV0dXJuIHN1cGVyLmVtaXQoY29kZSwgY29udGV4dCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoX2NvbnRleHQ6IEVtaXRDb250ZXh0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ2VudW0uRW51bSddO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBzdXBlci5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gIH1cbn1cblxuY2xhc3MgRW51bU1lbWJlciBpbXBsZW1lbnRzIFB5dGhvbkJhc2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsdWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5weXRob25OYW1lID0gcHl0aG9uTmFtZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICByZXR1cm4geyBhcGk6ICdtZW1iZXInLCBmcW46IHRoaXMucGFyZW50LmZxbiwgbWVtYmVyTmFtZTogdGhpcy52YWx1ZSB9O1xuICB9XG5cbiAgcHVibGljIGRlcGVuZHNPbk1vZHVsZXMoKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQ8c3RyaW5nPigpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBfY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb2RlLmxpbmUoYCR7dGhpcy5weXRob25OYW1lfSA9IFwiJHt0aGlzLnZhbHVlfVwiYCk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBlbnVtLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKF9jb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgTW9kdWxlT3B0cyB7XG4gIHJlYWRvbmx5IGFzc2VtYmx5OiBzcGVjLkFzc2VtYmx5O1xuICByZWFkb25seSBhc3NlbWJseUZpbGVuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvYWRBc3NlbWJseT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHBhY2thZ2U/OiBQYWNrYWdlO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jc3RyaW5nIHRvIGVtaXQgYXQgdGhlIHRvcCBvZiB0aGlzIG1vZHVsZSwgaWYgYW55LlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWxlRG9jdW1lbnRhdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQeXRob24gbW9kdWxlXG4gKlxuICogV2lsbCBiZSBjYWxsZWQgZm9yIGpzaWkgc3VibW9kdWxlcyBhbmQgbmFtZXNwYWNlcy5cbiAqL1xuY2xhc3MgUHl0aG9uTW9kdWxlIGltcGxlbWVudHMgUHl0aG9uVHlwZSB7XG4gIC8qKlxuICAgKiBDb252ZXJ0ZWQgdG8gcHV0IG9uIHRoZSBtb2R1bGVcbiAgICpcbiAgICogVGhlIGZvcm1hdCBpcyBpbiBtYXJrZG93biwgd2l0aCBjb2RlIHNhbXBsZXMgY29udmVydGVkIGZyb20gVFMgdG8gUHl0aG9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vZHVsZURvY3VtZW50YXRpb24/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhc3NlbWJseTogc3BlYy5Bc3NlbWJseTtcbiAgcHJpdmF0ZSByZWFkb25seSBhc3NlbWJseUZpbGVuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEFzc2VtYmx5OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbWJlcnMgPSBuZXcgQXJyYXk8UHl0aG9uQmFzZT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZXMgPSBuZXcgQXJyYXk8UHl0aG9uTW9kdWxlPigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBmcW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiBNb2R1bGVPcHRzLFxuICApIHtcbiAgICB0aGlzLmFzc2VtYmx5ID0gb3B0cy5hc3NlbWJseTtcbiAgICB0aGlzLmFzc2VtYmx5RmlsZW5hbWUgPSBvcHRzLmFzc2VtYmx5RmlsZW5hbWU7XG4gICAgdGhpcy5sb2FkQXNzZW1ibHkgPSAhIW9wdHMubG9hZEFzc2VtYmx5O1xuICAgIHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbiA9IG9wdHMubW9kdWxlRG9jdW1lbnRhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKSB7XG4gICAgdGhpcy5tZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRQeXRob25Nb2R1bGUocHlNb2Q6IFB5dGhvbk1vZHVsZSkge1xuICAgIGFzc2VydChcbiAgICAgICF0aGlzLmxvYWRBc3NlbWJseSxcbiAgICAgICdQeXRob25Nb2R1bGUuYWRkUHl0aG9uTW9kdWxlIENBTk5PVCBiZSBjYWxsZWQgb24gYXNzZW1ibHktbG9hZGluZyBtb2R1bGVzIChpdCB3b3VsZCBjYXVzZSBhIGxvYWQgY3ljbGUpIScsXG4gICAgKTtcbiAgICB0aGlzLm1vZHVsZXMucHVzaChweU1vZCk7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIC4uLnRoaXMubWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICB0aGlzLmVtaXRNb2R1bGVEb2N1bWVudGF0aW9uKGNvZGUpO1xuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmZxblxuICAgICAgPyBjb250ZXh0LnJlc29sdmVyLmJpbmQodGhpcy5mcW4sIHRoaXMucHl0aG9uTmFtZSlcbiAgICAgIDogY29udGV4dC5yZXNvbHZlcjtcbiAgICBjb250ZXh0ID0ge1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHN1Ym1vZHVsZTogdGhpcy5mcW4gPz8gY29udGV4dC5zdWJtb2R1bGUsXG4gICAgICByZXNvbHZlcixcbiAgICB9O1xuXG4gICAgLy8gQmVmb3JlIHdlIHdyaXRlIGFueXRoaW5nIGVsc2UsIHdlIG5lZWQgdG8gd3JpdGUgb3V0IG91ciBtb2R1bGUgaGVhZGVycywgdGhpc1xuICAgIC8vIGlzIHdoZXJlIHdlIGhhbmRsZSBzdHVmZiBsaWtlIGltcG9ydHMsIGFueSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiwgZXRjLlxuICAgIGNvZGUubGluZSgnaW1wb3J0IGFiYycpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGJ1aWx0aW5zJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgZGF0ZXRpbWUnKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBlbnVtJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgdHlwaW5nJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQganNpaScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IHB1YmxpY2F0aW9uJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgdHlwaW5nX2V4dGVuc2lvbnMnKTtcblxuICAgIC8vIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIG91dCB0aGUga2VybmVsIGxvYWQgbGluZS5cbiAgICBpZiAodGhpcy5sb2FkQXNzZW1ibHkpIHtcbiAgICAgIHRoaXMuZW1pdERlcGVuZGVuY3lJbXBvcnRzKGNvZGUpO1xuXG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGVtaXRMaXN0KFxuICAgICAgICBjb2RlLFxuICAgICAgICAnX19qc2lpX2Fzc2VtYmx5X18gPSBqc2lpLkpTSUlBc3NlbWJseS5sb2FkKCcsXG4gICAgICAgIFtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5Lm5hbWUpLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkudmVyc2lvbiksXG4gICAgICAgICAgJ19fbmFtZV9fWzA6LTZdJyxcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5RmlsZW5hbWUpfWAsXG4gICAgICAgIF0sXG4gICAgICAgICcpJyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZW4gd2UgbXVzdCBpbXBvcnQgdGhlIC5fanNpaSBzdWJwYWNrYWdlLlxuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBsZXQgZGlzdGFuY2VGcm9tUm9vdCA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgY3VyciA9IHRoaXMuZnFuITtcbiAgICAgICAgY3VyciAhPT0gdGhpcy5hc3NlbWJseS5uYW1lO1xuICAgICAgICBjdXJyID0gY3Vyci5zdWJzdHJpbmcoMCwgY3Vyci5sYXN0SW5kZXhPZignLicpKVxuICAgICAgKSB7XG4gICAgICAgIGRpc3RhbmNlRnJvbVJvb3QrKztcbiAgICAgIH1cbiAgICAgIGNvZGUubGluZShgZnJvbSAkeycuJy5yZXBlYXQoZGlzdGFuY2VGcm9tUm9vdCArIDEpfV9qc2lpIGltcG9ydCAqYCk7XG5cbiAgICAgIHRoaXMuZW1pdFJlcXVpcmVkSW1wb3J0cyhjb2RlLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGFsbCBvZiBvdXIgbWVtYmVycy5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcmVwYXJlTWVtYmVycyh0aGlzLm1lbWJlcnMsIHJlc29sdmVyKSkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFdoYXRldmVyIG5hbWVzIHdlJ3ZlIGV4cG9ydGVkLCB3ZSdsbCB3cml0ZSBvdXQgb3VyIF9fYWxsX18gdGhhdCBsaXN0cyB0aGVtLlxuICAgIGNvbnN0IGV4cG9ydGVkTWVtYmVycyA9IHRoaXMubWVtYmVycy5tYXAoKG0pID0+IGBcIiR7bS5weXRob25OYW1lfVwiYCk7XG4gICAgaWYgKHRoaXMubG9hZEFzc2VtYmx5KSB7XG4gICAgICBleHBvcnRlZE1lbWJlcnMucHVzaCgnXCJfX2pzaWlfYXNzZW1ibHlfX1wiJyk7XG4gICAgfVxuXG4gICAgLy8gRGVjbGFyZSB0aGUgbGlzdCBvZiBcInB1YmxpY1wiIG1lbWJlcnMgdGhpcyBtb2R1bGUgZXhwb3J0c1xuICAgIGlmICh0aGlzLm1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgfVxuICAgIGNvZGUubGluZSgpO1xuXG4gICAgaWYgKGV4cG9ydGVkTWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmluZGVudCgnX19hbGxfXyA9IFsnKTtcbiAgICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIGV4cG9ydGVkTWVtYmVycy5zb3J0KCkpIHtcbiAgICAgICAgLy8gV3JpdGluZyBvbmUgYnkgbGluZSBtaWdodCBiZSBfYSBsb3RfIG9mIGxpbmVzLCBidXQgaXQnbGwgbWFrZSByZXZpZXdpbmcgY2hhbmdlcyB0byB0aGUgbGlzdCBlYXNpZXIuIFRydXN0IG1lLlxuICAgICAgICBjb2RlLmxpbmUoYCR7bWVtYmVyfSxgKTtcbiAgICAgIH1cbiAgICAgIGNvZGUudW5pbmRlbnQoJ10nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZS5saW5lKCdfX2FsbF9fOiB0eXBpbmcuTGlzdFt0eXBpbmcuQW55XSA9IFtdJyk7XG4gICAgfVxuXG4gICAgLy8gTmV4dCB1cCwgd2UnbGwgdXNlIHB1YmxpY2F0aW9uIHRvIGVuc3VyZSB0aGF0IGFsbCBvZiB0aGUgbm9uLXB1YmxpYyBuYW1lc1xuICAgIC8vIGdldCBoaWRkZW4gZnJvbSBkaXIoKSwgdGFiLWNvbXBsZXRlLCBldGMuXG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdwdWJsaWNhdGlvbi5wdWJsaXNoKCknKTtcblxuICAgIC8vIEZpbmFsbHksIHdlJ2xsIGxvYWQgYWxsIHJlZ2lzdGVyZWQgcHl0aG9uIG1vZHVsZXNcbiAgICBpZiAodGhpcy5tb2R1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICAnIyBMb2FkaW5nIG1vZHVsZXMgdG8gZW5zdXJlIHRoZWlyIHR5cGVzIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIGpzaWkgcnVudGltZSBsaWJyYXJ5JyxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiB0aGlzLm1vZHVsZXMuc29ydCgobCwgcikgPT5cbiAgICAgICAgbC5weXRob25OYW1lLmxvY2FsZUNvbXBhcmUoci5weXRob25OYW1lKSxcbiAgICAgICkpIHtcbiAgICAgICAgLy8gUmF0aGVyIHRoYW4gZ2VuZXJhdGluZyBhbiBhYnNvbHV0ZSBpbXBvcnQgbGlrZVxuICAgICAgICAvLyBcImltcG9ydCBqc2lpX2NhbGMuc3VibW9kdWxlLm5lc3RlZF9zdWJtb2R1bGUuZGVlcGx5X25lc3RlZFwiXG4gICAgICAgIC8vIHRoaXMgYnVpbGRzIGEgcmVsYXRpdmUgaW1wb3J0IGxpa2VcbiAgICAgICAgLy8gXCJmcm9tIC5zdWJtb2R1bGUubmVzdGVkX3N1Ym1vZHVsZSBpbXBvcnQgZGVlcGx5X25lc3RlZFwiXG4gICAgICAgIC8vIFRoaXMgZW5hYmxlcyBkaXN0cmlidXRpbmcgcHl0aG9uIHBhY2thZ2VzIGFuZCB1c2luZyB0aGVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIG1vZHVsZXMgaW4gdGhlIHNhbWUgY29kZWJhc2UuXG4gICAgICAgIGNvbnN0IGFzc2VtYmx5TmFtZSA9IHRvUHl0aG9uRnFuKFxuICAgICAgICAgIG1vZHVsZS5hc3NlbWJseS5uYW1lLFxuICAgICAgICAgIG1vZHVsZS5hc3NlbWJseSxcbiAgICAgICAgKS5weXRob25GcW47XG5cbiAgICAgICAgY29uc3Qgc3VibW9kdWxlID0gbW9kdWxlLnB5dGhvbk5hbWVcbiAgICAgICAgICAucmVwbGFjZShgJHthc3NlbWJseU5hbWV9LmAsICcnKVxuICAgICAgICAgIC5zcGxpdCgnLicpO1xuXG4gICAgICAgIGNvbnN0IHN1Ym1vZHVsZVBhdGggPSBzdWJtb2R1bGVcbiAgICAgICAgICAuc2xpY2UoMCwgc3VibW9kdWxlLmxlbmd0aCAtIDEpXG4gICAgICAgICAgLmpvaW4oJy4nKTtcbiAgICAgICAgY29uc3Qgc3VibW9kdWxlTmFtZSA9IHN1Ym1vZHVsZVtzdWJtb2R1bGUubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvZGUubGluZShgZnJvbSAuJHtzdWJtb2R1bGVQYXRofSBpbXBvcnQgJHtzdWJtb2R1bGVOYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IHRoZSBiaW4gc2NyaXB0cyBpZiBiaW4gc2VjdGlvbiBkZWZpbmVkLlxuICAgKi9cbiAgcHVibGljIGVtaXRCaW5TY3JpcHRzKGNvZGU6IENvZGVNYWtlcik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzY3JpcHRzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBpZiAodGhpcy5sb2FkQXNzZW1ibHkpIHtcbiAgICAgIGlmICh0aGlzLmFzc2VtYmx5LmJpbiAhPSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLmFzc2VtYmx5LmJpbikpIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHRfZmlsZSA9IHBhdGguam9pbihcbiAgICAgICAgICAgICdzcmMnLFxuICAgICAgICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUodGhpcy5weXRob25OYW1lKSxcbiAgICAgICAgICAgICdiaW4nLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvZGUub3BlbkZpbGUoc2NyaXB0X2ZpbGUpO1xuICAgICAgICAgIGNvZGUubGluZSgnIyEvdXNyL2Jpbi9lbnYgcHl0aG9uJyk7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgY29kZS5saW5lKCdpbXBvcnQganNpaScpO1xuICAgICAgICAgIGNvZGUubGluZSgnaW1wb3J0IHN5cycpO1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICAgIGVtaXRMaXN0KFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICdfX2pzaWlfYXNzZW1ibHlfXyA9IGpzaWkuSlNJSUFzc2VtYmx5LmxvYWQoJyxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseS5uYW1lKSxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseS52ZXJzaW9uKSxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5weXRob25OYW1lLnJlcGxhY2UoJy5fanNpaScsICcnKSksXG4gICAgICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHlGaWxlbmFtZSl9YCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnKScsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgICBlbWl0TGlzdChcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAnX19qc2lpX2Fzc2VtYmx5X18uaW52b2tlQmluU2NyaXB0KCcsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkubmFtZSksXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWUpLFxuICAgICAgICAgICAgICAnc3lzLmFyZ3ZbMTpdJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnKScsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2RlLmNsb3NlRmlsZShzY3JpcHRfZmlsZSk7XG4gICAgICAgICAgc2NyaXB0cy5wdXNoKHNjcmlwdF9maWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCB0aGUgUkVBRE1FIGFzIG1vZHVsZSBkb2NzdHJpbmcgaWYgdGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgbW9kdWxlIChpdCBsb2FkcyB0aGUgYXNzZW1ibHkpXG4gICAqL1xuICBwcml2YXRlIGVtaXRNb2R1bGVEb2N1bWVudGF0aW9uKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGlmICh0aGlzLm1vZHVsZURvY3VtZW50YXRpb24pIHtcbiAgICAgIGNvZGUubGluZShET0NTVFJJTkdfUVVPVEVTKTtcbiAgICAgIGNvZGUubGluZSh0aGlzLm1vZHVsZURvY3VtZW50YXRpb24pO1xuICAgICAgY29kZS5saW5lKERPQ1NUUklOR19RVU9URVMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdERlcGVuZGVuY3lJbXBvcnRzKGNvZGU6IENvZGVNYWtlcikge1xuICAgIC8vIENvbGxlY3QgYWxsIHRoZSAoZGlyZWN0KSBkZXBlbmRlbmNpZXMnIC5fanNpaSBwYWNrYWdlcy5cbiAgICBjb25zdCBkZXBzID0gT2JqZWN0LmtleXModGhpcy5hc3NlbWJseS5kZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAubWFwKFxuICAgICAgICAoZGVwKSA9PlxuICAgICAgICAgIHRoaXMuYXNzZW1ibHkuZGVwZW5kZW5jeUNsb3N1cmU/LltkZXBdPy50YXJnZXRzPy5weXRob24/Lm1vZHVsZSA/P1xuICAgICAgICAgIGRpZShgTm8gUHl0aG9uIHRhcmdldCB3YXMgY29uZmlncnVlZCBmb3IgdGhlIGRlcGVuZGVuY3kgXCIke2RlcH1cIi5gKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKG1vZCkgPT4gYCR7bW9kfS5fanNpaWApXG4gICAgICAuc29ydCgpO1xuXG4gICAgLy8gTm93IGFjdHVhbGx5IHdyaXRlIHRoZSBpbXBvcnQgc3RhdGVtZW50cy4uLlxuICAgIGlmIChkZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGVOYW1lIG9mIGRlcHMpIHtcbiAgICAgICAgY29kZS5saW5lKGBpbXBvcnQgJHttb2R1bGVOYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdFJlcXVpcmVkSW1wb3J0cyhjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3QgcmVxdWlyZWRJbXBvcnRzID0gdGhpcy5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IE9iamVjdC5lbnRyaWVzKHJlcXVpcmVkSW1wb3J0cylcbiAgICAgIC5tYXAoKFtzb3VyY2VQYWNrYWdlLCBpdGVtc10pID0+IHRvSW1wb3J0U3RhdGVtZW50cyhzb3VyY2VQYWNrYWdlLCBpdGVtcykpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYWNjLCBlbHQpID0+IFsuLi5hY2MsIC4uLmVsdF0sXG4gICAgICAgIG5ldyBBcnJheTx7IGVtaXQ6ICgpID0+IHZvaWQ7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfT4oKSxcbiAgICAgIClcbiAgICAgIC5zb3J0KGltcG9ydENvbXBhcmF0b3IpO1xuXG4gICAgaWYgKHN0YXRlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHN0YXRlbWVudHMpIHtcbiAgICAgIHN0YXRlbWVudC5lbWl0KGNvZGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW1wb3J0U3RhdGVtZW50cyhcbiAgICAgIHNvdXJjZVBrZzogc3RyaW5nLFxuICAgICAgaXRlbXM6IFJlYWRvbmx5U2V0PHN0cmluZz4sXG4gICAgKTogQXJyYXk8eyBlbWl0OiAoY29kZTogQ29kZU1ha2VyKSA9PiB2b2lkOyBjb21wYXJpc29uQmFzZTogc3RyaW5nIH0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTx7XG4gICAgICAgIGVtaXQ6IChjb2RlOiBDb2RlTWFrZXIpID0+IHZvaWQ7XG4gICAgICAgIGNvbXBhcmlzb25CYXNlOiBzdHJpbmc7XG4gICAgICB9PigpO1xuICAgICAgaWYgKGl0ZW1zLmhhcygnJykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIGNvbXBhcmlzb25CYXNlOiBgaW1wb3J0ICR7c291cmNlUGtnfWAsXG4gICAgICAgICAgZW1pdChjb2RlKSB7XG4gICAgICAgICAgICBjb2RlLmxpbmUodGhpcy5jb21wYXJpc29uQmFzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwaWVjZU1lYWwgPSBBcnJheS5mcm9tKGl0ZW1zKVxuICAgICAgICAuZmlsdGVyKChpKSA9PiBpICE9PSAnJylcbiAgICAgICAgLnNvcnQoKTtcbiAgICAgIGlmIChwaWVjZU1lYWwubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgY29tcGFyaXNvbkJhc2U6IGBmcm9tICR7c291cmNlUGtnfSBpbXBvcnRgLFxuICAgICAgICAgIGVtaXQ6IChjb2RlKSA9PlxuICAgICAgICAgICAgZW1pdExpc3QoY29kZSwgYGZyb20gJHtzb3VyY2VQa2d9IGltcG9ydCBgLCBwaWVjZU1lYWwsICcnLCB7XG4gICAgICAgICAgICAgIGlmTXVsdGk6IFsnKCcsICcpJ10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGltcG9ydENvbXBhcmF0b3IoXG4gICAgICBsZWZ0OiB7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfSxcbiAgICAgIHJpZ2h0OiB7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfSxcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGVmdC5jb21wYXJpc29uQmFzZS5zdGFydHNXaXRoKCdpbXBvcnQnKSA9PT1cbiAgICAgICAgcmlnaHQuY29tcGFyaXNvbkJhc2Uuc3RhcnRzV2l0aCgnaW1wb3J0JylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbGVmdC5jb21wYXJpc29uQmFzZS5sb2NhbGVDb21wYXJlKHJpZ2h0LmNvbXBhcmlzb25CYXNlKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIHdhbnQgXCJmcm9tIC5mb28gaW1wb3J0ICguLi4pXCIgdG8gYmUgKmFmdGVyKiBcImltcG9ydCBiYXJcIlxuICAgICAgcmV0dXJuIHJpZ2h0LmNvbXBhcmlzb25CYXNlLmxvY2FsZUNvbXBhcmUobGVmdC5jb21wYXJpc29uQmFzZSk7XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBQYWNrYWdlRGF0YSB7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG4gIGRhdGE6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuY2xhc3MgUGFja2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgUHl0aG9uTW9kdWxlIHRoYXQgcmVwcmVzZW50cyB0aGUgcm9vdCBtb2R1bGUgb2YgdGhlIHBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyByb290TW9kdWxlPzogUHl0aG9uTW9kdWxlO1xuXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YTogc3BlYy5Bc3NlbWJseTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZXMgPSBuZXcgTWFwPHN0cmluZywgUHl0aG9uTW9kdWxlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGEgPSBuZXcgTWFwPHN0cmluZywgUGFja2FnZURhdGFbXT4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIG1ldGFkYXRhOiBzcGVjLkFzc2VtYmx5KSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNb2R1bGUobW9kdWxlOiBQeXRob25Nb2R1bGUpIHtcbiAgICB0aGlzLm1vZHVsZXMuc2V0KG1vZHVsZS5weXRob25OYW1lLCBtb2R1bGUpO1xuXG4gICAgLy8gVGhpcyBpcyB0aGUgbW9kdWxlIHRoYXQgcmVwcmVzZW50cyB0aGUgYXNzZW1ibHlcbiAgICBpZiAobW9kdWxlLmZxbiA9PT0gdGhpcy5tZXRhZGF0YS5uYW1lKSB7XG4gICAgICB0aGlzLnJvb3RNb2R1bGUgPSBtb2R1bGU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZERhdGEoXG4gICAgbW9kdWxlOiBQeXRob25Nb2R1bGUsXG4gICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICBkYXRhOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGlmICghdGhpcy5kYXRhLmhhcyhtb2R1bGUucHl0aG9uTmFtZSkpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXQobW9kdWxlLnB5dGhvbk5hbWUsIFtdKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEuZ2V0KG1vZHVsZS5weXRob25OYW1lKSEucHVzaCh7IGZpbGVuYW1lLCBkYXRhIH0pO1xuICB9XG5cbiAgcHVibGljIHdyaXRlKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCBtb2R1bGVzID0gWy4uLnRoaXMubW9kdWxlcy52YWx1ZXMoKV0uc29ydCgoYSwgYikgPT5cbiAgICAgIGEucHl0aG9uTmFtZS5sb2NhbGVDb21wYXJlKGIucHl0aG9uTmFtZSksXG4gICAgKTtcblxuICAgIGNvbnN0IHNjcmlwdHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvZiBvdXIgbW9kdWxlcywgYW5kIHdyaXRlIHRoZW0gb3V0IHRvIGRpc2suXG4gICAgZm9yIChjb25zdCBtb2Qgb2YgbW9kdWxlcykge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmpvaW4oXG4gICAgICAgICdzcmMnLFxuICAgICAgICBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZShtb2QucHl0aG9uTmFtZSksXG4gICAgICAgICdfX2luaXRfXy5weScsXG4gICAgICApO1xuXG4gICAgICBjb2RlLm9wZW5GaWxlKGZpbGVuYW1lKTtcbiAgICAgIG1vZC5lbWl0KGNvZGUsIGNvbnRleHQpO1xuICAgICAgY29kZS5jbG9zZUZpbGUoZmlsZW5hbWUpO1xuXG4gICAgICBzY3JpcHRzLnB1c2goLi4ubW9kLmVtaXRCaW5TY3JpcHRzKGNvZGUpKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgb3VyIHBhY2thZ2UgZGF0YS5cbiAgICBjb25zdCBwYWNrYWdlRGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgZm9yIChjb25zdCBbbW9kLCBwZGF0YV0gb2YgdGhpcy5kYXRhKSB7XG4gICAgICBmb3IgKGNvbnN0IGRhdGEgb2YgcGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEuZGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAnc3JjJyxcbiAgICAgICAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKG1vZCksXG4gICAgICAgICAgICBkYXRhLmZpbGVuYW1lLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb2RlLm9wZW5GaWxlKGZpbGVwYXRoKTtcbiAgICAgICAgICBjb2RlLmxpbmUoZGF0YS5kYXRhKTtcbiAgICAgICAgICBjb2RlLmNsb3NlRmlsZShmaWxlcGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFja2FnZURhdGFbbW9kXSA9IHBkYXRhLm1hcCgocGQpID0+IHBkLmZpbGVuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIG91ciBsaXN0IG9mIGRlcGVuZGVuY2llc1xuICAgIGNvbnN0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtkZXBOYW1lLCB2ZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIHRoaXMubWV0YWRhdGEuZGVwZW5kZW5jaWVzID8/IHt9LFxuICAgICkpIHtcbiAgICAgIGNvbnN0IGRlcEluZm8gPSB0aGlzLm1ldGFkYXRhLmRlcGVuZGVuY3lDbG9zdXJlIVtkZXBOYW1lXTtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKFxuICAgICAgICBgJHtkZXBJbmZvLnRhcmdldHMhLnB5dGhvbiEuZGlzdE5hbWV9JHt0b1B5dGhvblZlcnNpb25SYW5nZSh2ZXJzaW9uKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBOZWVkIHRvIGFsd2F5cyB3cml0ZSB0aGlzIGZpbGUgYXMgdGhlIGJ1aWxkIHByb2Nlc3MgZGVwZW5kcyBvbiBpdC5cbiAgICAvLyBNYWtlIHVwIHNvbWUgY29udGVudHMgaWYgd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB1c2VmdWwgdG8gc2F5LlxuICAgIGNvZGUub3BlbkZpbGUoJ1JFQURNRS5tZCcpO1xuICAgIGNvZGUubGluZShcbiAgICAgIHRoaXMucm9vdE1vZHVsZT8ubW9kdWxlRG9jdW1lbnRhdGlvbiA/P1xuICAgICAgICBgJHt0aGlzLm5hbWV9XFxuJHsnPScucmVwZWF0KHRoaXMubmFtZS5sZW5ndGgpfWAsXG4gICAgKTtcbiAgICBjb2RlLmNsb3NlRmlsZSgnUkVBRE1FLm1kJyk7XG5cbiAgICAvLyBTdHJpcCBcIiAoYnVpbGQgYWJjZGVmKVwiIGZyb20gdGhlIGpzaWkgdmVyc2lvblxuICAgIGNvbnN0IGpzaWlWZXJzaW9uU2ltcGxlID0gdGhpcy5tZXRhZGF0YS5qc2lpVmVyc2lvbi5yZXBsYWNlKC8gLiokLywgJycpO1xuXG4gICAgY29uc3Qgc2V0dXBLd2FyZ3MgPSB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5tZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIGxpY2Vuc2U6IHRoaXMubWV0YWRhdGEubGljZW5zZSxcbiAgICAgIHVybDogdGhpcy5tZXRhZGF0YS5ob21lcGFnZSxcbiAgICAgIGxvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlOiAndGV4dC9tYXJrZG93bicsXG4gICAgICBhdXRob3I6XG4gICAgICAgIHRoaXMubWV0YWRhdGEuYXV0aG9yLm5hbWUgK1xuICAgICAgICAodGhpcy5tZXRhZGF0YS5hdXRob3IuZW1haWwgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gYDwke3RoaXMubWV0YWRhdGEuYXV0aG9yLmVtYWlsfT5gXG4gICAgICAgICAgOiAnJyksXG4gICAgICBiZGlzdF93aGVlbDoge1xuICAgICAgICB1bml2ZXJzYWw6IHRydWUsXG4gICAgICB9LFxuICAgICAgcHJvamVjdF91cmxzOiB7XG4gICAgICAgIFNvdXJjZTogdGhpcy5tZXRhZGF0YS5yZXBvc2l0b3J5LnVybCxcbiAgICAgIH0sXG4gICAgICBwYWNrYWdlX2RpcjogeyAnJzogJ3NyYycgfSxcbiAgICAgIHBhY2thZ2VzOiBtb2R1bGVzLm1hcCgobSkgPT4gbS5weXRob25OYW1lKSxcbiAgICAgIHBhY2thZ2VfZGF0YTogcGFja2FnZURhdGEsXG4gICAgICBweXRob25fcmVxdWlyZXM6ICc+PTMuNicsXG4gICAgICBpbnN0YWxsX3JlcXVpcmVzOiBbXG4gICAgICAgIGBqc2lpJHt0b1B5dGhvblZlcnNpb25SYW5nZShgXiR7anNpaVZlcnNpb25TaW1wbGV9YCl9YCxcbiAgICAgICAgJ3B1YmxpY2F0aW9uPj0wLjAuMycsXG4gICAgICBdXG4gICAgICAgIC5jb25jYXQoZGVwZW5kZW5jaWVzKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgY2xhc3NpZmllcnM6IFtcbiAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnLFxuICAgICAgICAnT3BlcmF0aW5nIFN5c3RlbSA6OiBPUyBJbmRlcGVuZGVudCcsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBKYXZhU2NyaXB0JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzIDo6IE9ubHknLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNicsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy43JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjgnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuOScsXG4gICAgICAgICdUeXBpbmcgOjogVHlwZWQnLFxuICAgICAgXSxcbiAgICAgIHNjcmlwdHMsXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy5tZXRhZGF0YS5kb2NzPy5zdGFiaWxpdHkpIHtcbiAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuRXhwZXJpbWVudGFsOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdEZXZlbG9wbWVudCBTdGF0dXMgOjogNCAtIEJldGEnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LlN0YWJsZTpcbiAgICAgICAgc2V0dXBLd2FyZ3MuY2xhc3NpZmllcnMucHVzaChcbiAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZScsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5EZXByZWNhdGVkOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdEZXZlbG9wbWVudCBTdGF0dXMgOjogNyAtIEluYWN0aXZlJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIE5vICdEZXZlbG9wbWVudCBTdGF0dXMnIHRyb3ZlIGNsYXNzaWZpZXIgZm9yIHlvdSFcbiAgICB9XG5cbiAgICBpZiAoc3BkeExpY2Vuc2VMaXN0W3RoaXMubWV0YWRhdGEubGljZW5zZV0/Lm9zaUFwcHJvdmVkKSB7XG4gICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZGl0aW9uYWxDbGFzc2lmaWVycyA9IHRoaXMubWV0YWRhdGEudGFyZ2V0cz8ucHl0aG9uPy5jbGFzc2lmaWVycztcbiAgICBpZiAoYWRkaXRpb25hbENsYXNzaWZpZXJzICE9IG51bGwpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhZGRpdGlvbmFsQ2xhc3NpZmllcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIFwianNpaS50YXJnZXRzLnB5dGhvbi5jbGFzc2lmaWVyc1wiIHZhbHVlIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyBpZiBwcm92aWRlZCwgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBhZGRpdGlvbmFsQ2xhc3NpZmllcnMsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBXZSBkaXNjb3VyYWdlIHVzaW5nIHRob3NlIHNpbmNlIHdlIGF1dG9tYXRpY2FsbHkgc2V0IGEgdmFsdWUgZm9yIHRoZW1cbiAgICAgIGZvciAobGV0IGNsYXNzaWZpZXIgb2YgYWRkaXRpb25hbENsYXNzaWZpZXJzLnNvcnQoKSkge1xuICAgICAgICBpZiAodHlwZW9mIGNsYXNzaWZpZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBcImpzaWkudGFyZ2V0cy5weXRob24uY2xhc3NpZmllcnNcIiB2YWx1ZSBjYW4gb25seSBjb250YWluIHN0cmluZ3MsIGJ1dCBmb3VuZCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICBjbGFzc2lmaWVyLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UnbGwgc3BsaXQgb24gYDo6YCBhbmQgcmUtam9pbiBsYXRlciBzbyBjbGFzc2lmaWVycyBhcmUgXCJub3JtYWxpemVkXCIgdG8gYSBzdGFuZGFyZCBzcGFjaW5nXG4gICAgICAgIGNvbnN0IHBhcnRzID0gY2xhc3NpZmllci5zcGxpdCgnOjonKS5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKTtcbiAgICAgICAgY29uc3QgcmVzZXJ2ZWRDbGFzc2lmaWVycyA9IFtcbiAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzJyxcbiAgICAgICAgICAnTGljZW5zZScsXG4gICAgICAgICAgJ09wZXJhdGluZyBTeXN0ZW0nLFxuICAgICAgICAgICdUeXBpbmcnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAocmVzZXJ2ZWRDbGFzc2lmaWVycy5pbmNsdWRlcyhwYXJ0c1swXSkpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYENsYXNzaWZpZXJzIHN0YXJ0aW5nIHdpdGggJHtyZXNlcnZlZENsYXNzaWZpZXJzXG4gICAgICAgICAgICAgIC5tYXAoKHgpID0+IGBcIiR7eH0gOjpcImApXG4gICAgICAgICAgICAgIC5qb2luKFxuICAgICAgICAgICAgICAgICcsICcsXG4gICAgICAgICAgICAgICl9IGFyZSBhdXRvbWF0aWNhbGx5IHNldCBhbmQgc2hvdWxkIG5vdCBiZSBtYW51YWxseSBjb25maWd1cmVkYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzaWZpZXIgPSBwYXJ0cy5qb2luKCcgOjogJyk7XG4gICAgICAgIGlmIChzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5pbmNsdWRlcyhjbGFzc2lmaWVyKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goY2xhc3NpZmllcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgTmVlZCBhIHNldHVwLnB5IHRvIG1ha2UgdGhpcyBQYWNrYWdlLCBhY3R1YWxseSBhIFBhY2thZ2UuXG4gICAgY29kZS5vcGVuRmlsZSgnc2V0dXAucHknKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBqc29uJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgc2V0dXB0b29scycpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgna3dhcmdzID0ganNvbi5sb2FkcygnKTtcbiAgICBjb2RlLmxpbmUoJyAgICBcIlwiXCInKTtcbiAgICBjb2RlLmxpbmUoSlNPTi5zdHJpbmdpZnkoc2V0dXBLd2FyZ3MsIG51bGwsIDQpKTtcbiAgICBjb2RlLmxpbmUoJ1wiXCJcIicpO1xuICAgIGNvZGUubGluZSgnKScpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCd3aXRoIG9wZW4oXCJSRUFETUUubWRcIiwgZW5jb2Rpbmc9XCJ1dGY4XCIpIGFzIGZwJyk7XG4gICAgY29kZS5saW5lKCdrd2FyZ3NbXCJsb25nX2Rlc2NyaXB0aW9uXCJdID0gZnAucmVhZCgpJyk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdzZXR1cHRvb2xzLnNldHVwKCoqa3dhcmdzKScpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdzZXR1cC5weScpO1xuXG4gICAgLy8gQmVjYXVzZSB3ZSdyZSBnb29kIGNpdGl6ZW5zLCB3ZSdyZSBnb2luZyB0byBnbyBhaGVhZCBhbmQgc3VwcG9ydCBweXByb2plY3QudG9tbFxuICAgIC8vIGFzIHdlbGwuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgZWFzaWVyIHRvIGp1c3QgdXNlIGEgVE9NTCBsaWJyYXJ5IHRvIHdyaXRlIHRoaXMgb3V0LlxuICAgIGNvZGUub3BlbkZpbGUoJ3B5cHJvamVjdC50b21sJyk7XG4gICAgY29kZS5saW5lKCdbYnVpbGQtc3lzdGVtXScpO1xuICAgIGNvbnN0IGJ1aWxkVG9vbHMgPSBmc1xuICAgICAgLnJlYWRGaWxlU3luYyhyZXF1aXJlbWVudHNGaWxlLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAubWFwKChsaW5lKSA9PiAvXlxccyooLispXFxzKiNcXHMqYnVpbGQtc3lzdGVtXFxzKiQvLmV4ZWMobGluZSk/LlsxXT8udHJpbSgpKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKGJ1aWxkVG9vbHMsIGVudHJ5KSA9PiAoZW50cnkgPyBbLi4uYnVpbGRUb29scywgZW50cnldIDogYnVpbGRUb29scyksXG4gICAgICAgIG5ldyBBcnJheTxzdHJpbmc+KCksXG4gICAgICApO1xuICAgIGNvZGUubGluZShgcmVxdWlyZXMgPSBbJHtidWlsZFRvb2xzLm1hcCgoeCkgPT4gYFwiJHt4fVwiYCkuam9pbignLCAnKX1dYCk7XG4gICAgY29kZS5saW5lKCdidWlsZC1iYWNrZW5kID0gXCJzZXR1cHRvb2xzLmJ1aWxkX21ldGFcIicpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdweXByb2plY3QudG9tbCcpO1xuXG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIHdyaXRlIG91dCBhIE1BTklGRVNULmluIHRvIGVuc3VyZSB0aGF0IGFsbCBvZiBvdXIgcmVxdWlyZWRcbiAgICAvLyBmaWxlcyBhcmUgaW5jbHVkZWQuXG4gICAgY29kZS5vcGVuRmlsZSgnTUFOSUZFU1QuaW4nKTtcbiAgICBjb2RlLmxpbmUoJ2luY2x1ZGUgcHlwcm9qZWN0LnRvbWwnKTtcbiAgICBjb2RlLmNsb3NlRmlsZSgnTUFOSUZFU1QuaW4nKTtcbiAgfVxufVxuXG50eXBlIEZpbmRNb2R1bGVDYWxsYmFjayA9IChmcW46IHN0cmluZykgPT4gc3BlYy5Bc3NlbWJseUNvbmZpZ3VyYXRpb247XG50eXBlIEZpbmRUeXBlQ2FsbGJhY2sgPSAoZnFuOiBzdHJpbmcpID0+IHNwZWMuVHlwZTtcblxuY2xhc3MgVHlwZVJlc29sdmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRUbz86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZFJlITogUmVnRXhwO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZU5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlUmUhOiBSZWdFeHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmluZE1vZHVsZTogRmluZE1vZHVsZUNhbGxiYWNrO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbmRUeXBlOiBGaW5kVHlwZUNhbGxiYWNrO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT4sXG4gICAgZmluZE1vZHVsZTogRmluZE1vZHVsZUNhbGxiYWNrLFxuICAgIGZpbmRUeXBlOiBGaW5kVHlwZUNhbGxiYWNrLFxuICAgIGJvdW5kVG8/OiBzdHJpbmcsXG4gICAgbW9kdWxlTmFtZT86IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy50eXBlcyA9IHR5cGVzO1xuICAgIHRoaXMuZmluZE1vZHVsZSA9IGZpbmRNb2R1bGU7XG4gICAgdGhpcy5maW5kVHlwZSA9IGZpbmRUeXBlO1xuICAgIHRoaXMubW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7XG4gICAgdGhpcy5ib3VuZFRvID0gYm91bmRUbyAhPT0gdW5kZWZpbmVkID8gdGhpcy50b1B5dGhvbkZRTihib3VuZFRvKSA6IGJvdW5kVG87XG5cbiAgICBpZiAodGhpcy5tb2R1bGVOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubW9kdWxlUmUgPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXigke2VzY2FwZVN0cmluZ1JlZ2V4cCh0aGlzLm1vZHVsZU5hbWUpfSlcXFxcLiguKykkYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYm91bmRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJvdW5kUmUgPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXigke2VzY2FwZVN0cmluZ1JlZ2V4cCh0aGlzLmJvdW5kVG8pfSlcXFxcLiguKykkYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJpbmQoZnFuOiBzdHJpbmcsIG1vZHVsZU5hbWU/OiBzdHJpbmcpOiBUeXBlUmVzb2x2ZXIge1xuICAgIHJldHVybiBuZXcgVHlwZVJlc29sdmVyKFxuICAgICAgdGhpcy50eXBlcyxcbiAgICAgIHRoaXMuZmluZE1vZHVsZSxcbiAgICAgIHRoaXMuZmluZFR5cGUsXG4gICAgICBmcW4sXG4gICAgICBtb2R1bGVOYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoJy4nKVxuICAgICAgICAgID8gYCR7dGhpcy5tb2R1bGVOYW1lfSR7bW9kdWxlTmFtZX1gXG4gICAgICAgICAgOiBtb2R1bGVOYW1lXG4gICAgICAgIDogdGhpcy5tb2R1bGVOYW1lLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaXNJbk1vZHVsZSh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPVxuICAgICAgdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdGhpcy50b1B5dGhvbkZRTih0eXBlUmVmLmZxbikgOiB0eXBlUmVmO1xuICAgIHJldHVybiB0aGlzLm1vZHVsZVJlLnRlc3QocHl0aG9uVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgaXNJbk5hbWVzcGFjZSh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPVxuICAgICAgdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdGhpcy50b1B5dGhvbkZRTih0eXBlUmVmLmZxbikgOiB0eXBlUmVmO1xuICAgIHJldHVybiB0aGlzLmJvdW5kUmUudGVzdChweXRob25UeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJlbnQodHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UgfCBzdHJpbmcpOiBQeXRob25UeXBlIHtcbiAgICBjb25zdCBmcW4gPSB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0eXBlUmVmLmZxbiA6IHR5cGVSZWY7XG4gICAgY29uc3QgbWF0Y2hlcyA9IC9eKC4rKVxcLlteLl0rJC8uZXhlYyhmcW4pO1xuICAgIGlmIChtYXRjaGVzID09IG51bGwgfHwgIUFycmF5LmlzQXJyYXkobWF0Y2hlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBGUU46ICR7ZnFufWApO1xuICAgIH1cbiAgICBjb25zdCBbLCBwYXJlbnRGUU5dID0gbWF0Y2hlcztcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnR5cGVzLmdldChwYXJlbnRGUU4pO1xuXG4gICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHBhcmVudDogICR7cGFyZW50RlFOfWApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVmaW5pbmdQeXRob25Nb2R1bGUoXG4gICAgdHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UgfCBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZnFuID0gdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdHlwZVJlZi5mcW4gOiB0eXBlUmVmO1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMudHlwZXMuZ2V0KGZxbik7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBsZXQgbW9kID0gcGFyZW50O1xuICAgICAgd2hpbGUgKCEobW9kIGluc3RhbmNlb2YgUHl0aG9uTW9kdWxlKSkge1xuICAgICAgICBtb2QgPSB0aGlzLmdldFBhcmVudChtb2QuZnFuISk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbW9kLnB5dGhvbk5hbWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2hlcyA9IC9eKFteLl0rKVxcLi8uZXhlYyhmcW4pO1xuICAgIGlmIChtYXRjaGVzID09IG51bGwgfHwgIUFycmF5LmlzQXJyYXkobWF0Y2hlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBGUU46ICR7ZnFufWApO1xuICAgIH1cbiAgICBjb25zdCBbLCBhc3NtXSA9IG1hdGNoZXM7XG4gICAgcmV0dXJuIHRoaXMuZmluZE1vZHVsZShhc3NtKS50YXJnZXRzIS5weXRob24hLm1vZHVsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUeXBlKHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlKTogUHl0aG9uVHlwZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZXMuZ2V0KHR5cGVSZWYuZnFuKTtcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvY2F0ZSB0eXBlOiBcIiR7dHlwZVJlZi5mcW59XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBkZXJlZmVyZW5jZSh0eXBlUmVmOiBzdHJpbmcgfCBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSk6IHNwZWMuVHlwZSB7XG4gICAgaWYgKHR5cGVvZiB0eXBlUmVmICE9PSAnc3RyaW5nJykge1xuICAgICAgdHlwZVJlZiA9IHR5cGVSZWYuZnFuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5kVHlwZSh0eXBlUmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9QeXRob25GUU4oZnFuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IFthc3NlbWJseU5hbWUsIC4uLnF1YWxpZmllZElkZW50aWZpZXJzXSA9IGZxbi5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGZxblBhcnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgIHRoaXMuZmluZE1vZHVsZShhc3NlbWJseU5hbWUpLnRhcmdldHMhLnB5dGhvbiEubW9kdWxlLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcXVhbGlmaWVkSWRlbnRpZmllcnMpIHtcbiAgICAgIGZxblBhcnRzLnB1c2godG9QeXRob25JZGVudGlmaWVyKHBhcnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnFuUGFydHMuam9pbignLicpO1xuICB9XG59XG5cbmNsYXNzIFB5dGhvbkdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7XG4gIHByaXZhdGUgcGFja2FnZSE6IFBhY2thZ2U7XG4gIHByaXZhdGUgcm9vdE1vZHVsZT86IFB5dGhvbk1vZHVsZTtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm9zZXR0YTogUm9zZXR0YSxcbiAgICBvcHRpb25zOiBHZW5lcmF0b3JPcHRpb25zID0ge30sXG4gICkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9ja0Zvcm1hdHRlciA9IChzKSA9PiBgJHtzfTpgO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrRm9ybWF0dGVyID0gKF9zKSA9PiBmYWxzZTtcblxuICAgIHRoaXMudHlwZXMgPSBuZXcgTWFwKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBwdWJsaWMgZW1pdERvY1N0cmluZyhcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgYXBpTG9jYXRpb246IEFwaUxvY2F0aW9uLFxuICAgIGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiB7XG4gICAgICBhcmd1bWVudHM/OiBEb2N1bWVudGFibGVBcmd1bWVudFtdO1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbT86IHN0cmluZztcbiAgICAgIHRyYWlsaW5nTmV3TGluZT86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICBpZiAoKCFkb2NzIHx8IE9iamVjdC5rZXlzKGRvY3MpLmxlbmd0aCA9PT0gMCkgJiYgIW9wdGlvbnMuYXJndW1lbnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZG9jcykge1xuICAgICAgZG9jcyA9IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGlmIChkb2NzLnN1bW1hcnkpIHtcbiAgICAgIGxpbmVzLnB1c2gobWQycnN0KHJlbmRlclN1bW1hcnkoZG9jcykpKTtcbiAgICAgIGJyaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBicmsoKSB7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJsb2NrKGhlYWRpbmc6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBkb0JyayA9IHRydWUpIHtcbiAgICAgIGlmIChkb0Jyaykge1xuICAgICAgICBicmsoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRlbnRMaW5lcyA9IG1kMnJzdChjb250ZW50KS5zcGxpdCgnXFxuJyk7XG4gICAgICBpZiAoY29udGVudExpbmVzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYDoke2hlYWRpbmd9OiAke2NvbnRlbnRMaW5lcy5qb2luKCcnKX1gLnRyaW0oKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lcy5wdXNoKGA6JHtoZWFkaW5nfTpgKTtcbiAgICAgICAgYnJrKCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50TGluZXMpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRvQnJrKSB7XG4gICAgICAgIGJyaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkb2NzLnJlbWFya3MpIHtcbiAgICAgIGJyaygpO1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgLi4ubWQycnN0KHRoaXMuY29udmVydE1hcmtkb3duKGRvY3MucmVtYXJrcyA/PyAnJywgYXBpTG9jYXRpb24pKS5zcGxpdChcbiAgICAgICAgICAnXFxuJyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBicmsoKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hcmd1bWVudHM/Lmxlbmd0aCA/PyAwID4gMCkge1xuICAgICAgYnJrKCk7XG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIG9wdGlvbnMuYXJndW1lbnRzISkge1xuICAgICAgICAvLyBBZGQgYSBsaW5lIGZvciBldmVyeSBhcmd1bWVudC4gRXZlbiBpZiB0aGVyZSBpcyBubyBkZXNjcmlwdGlvbiwgd2UgbmVlZFxuICAgICAgICAvLyB0aGUgZG9jc3RyaW5nIHNvIHRoYXQgdGhlIFNwaGlueCBleHRlbnNpb24gY2FuIGFkZCB0aGUgdHlwZSBhbm5vdGF0aW9ucy5cbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgOnBhcmFtICR7dG9QeXRob25QYXJhbWV0ZXJOYW1lKHBhcmFtLm5hbWUpfTogJHtvbmVsaW5lRGVzY3JpcHRpb24oXG4gICAgICAgICAgICBwYXJhbS5kb2NzLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyaygpO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmRlZmF1bHQpIHtcbiAgICAgIGJsb2NrKCdkZWZhdWx0JywgZG9jcy5kZWZhdWx0KTtcbiAgICB9XG4gICAgaWYgKGRvY3MucmV0dXJucykge1xuICAgICAgYmxvY2soJ3JldHVybicsIGRvY3MucmV0dXJucyk7XG4gICAgfVxuICAgIGlmIChkb2NzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIGJsb2NrKCdkZXByZWNhdGVkJywgZG9jcy5kZXByZWNhdGVkKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc2VlKSB7XG4gICAgICBibG9jaygnc2VlJywgZG9jcy5zZWUsIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc3RhYmlsaXR5ICYmIHNob3VsZE1lbnRpb25TdGFiaWxpdHkoZG9jcy5zdGFiaWxpdHkpKSB7XG4gICAgICBibG9jaygnc3RhYmlsaXR5JywgZG9jcy5zdGFiaWxpdHksIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc3ViY2xhc3NhYmxlKSB7XG4gICAgICBibG9jaygnc3ViY2xhc3NhYmxlJywgJ1llcycpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRvY3MuY3VzdG9tID8/IHt9KSkge1xuICAgICAgYmxvY2soaywgdiwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmV4YW1wbGUpIHtcbiAgICAgIGJyaygpO1xuICAgICAgbGluZXMucHVzaCgnRXhhbXBsZTo6Jyk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIGNvbnN0IGV4YW1wbGVUZXh0ID0gdGhpcy5jb252ZXJ0RXhhbXBsZShkb2NzLmV4YW1wbGUsIGFwaUxvY2F0aW9uKTtcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGV4YW1wbGVUZXh0LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICBsaW5lcy5wdXNoKGAgICAgJHtsaW5lfWApO1xuICAgICAgfVxuICAgICAgYnJrKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGxpbmVzLmxlbmd0aCA+IDAgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPT09ICcnKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICB9XG5cbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29kZS5saW5lKGAke0RPQ1NUUklOR19RVU9URVN9JHtsaW5lc1swXX0ke0RPQ1NUUklOR19RVU9URVN9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZShgJHtET0NTVFJJTkdfUVVPVEVTfSR7bGluZXNbMF19YCk7XG4gICAgICBsaW5lcy5zcGxpY2UoMCwgMSk7XG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBjb2RlLmxpbmUobGluZSk7XG4gICAgICB9XG5cbiAgICAgIGNvZGUubGluZShET0NTVFJJTkdfUVVPVEVTKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudHJhaWxpbmdOZXdMaW5lKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY29udmVydEV4YW1wbGUoZXhhbXBsZTogc3RyaW5nLCBhcGlMb2M6IEFwaUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCB0cmFuc2xhdGVkID0gdGhpcy5yb3NldHRhLnRyYW5zbGF0ZUV4YW1wbGUoXG4gICAgICBhcGlMb2MsXG4gICAgICBleGFtcGxlLFxuICAgICAgVGFyZ2V0TGFuZ3VhZ2UuUFlUSE9OLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICk7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWQuc291cmNlO1xuICB9XG5cbiAgcHVibGljIGNvbnZlcnRNYXJrZG93bihtYXJrZG93bjogc3RyaW5nLCBhcGlMb2M6IEFwaUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yb3NldHRhLnRyYW5zbGF0ZVNuaXBwZXRzSW5NYXJrZG93bihcbiAgICAgIGFwaUxvYyxcbiAgICAgIG1hcmtkb3duLFxuICAgICAgVGFyZ2V0TGFuZ3VhZ2UuUFlUSE9OLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHl0aG9uVHlwZShmcW46IHN0cmluZyk6IFB5dGhvblR5cGUge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGVzLmdldChmcW4pO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9jYXRlIHR5cGU6IFwiJHtmcW59XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBc3NlbWJseU91dHB1dERpcihhc3NtOiBzcGVjLkFzc2VtYmx5KSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihcbiAgICAgICdzcmMnLFxuICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUodGhpcy5nZXRBc3NlbWJseU1vZHVsZU5hbWUoYXNzbSkpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkFzc2VtYmx5KGFzc206IHNwZWMuQXNzZW1ibHksIF9maW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIHRoaXMucGFja2FnZSA9IG5ldyBQYWNrYWdlKFxuICAgICAgYXNzbS50YXJnZXRzIS5weXRob24hLmRpc3ROYW1lLFxuICAgICAgdG9SZWxlYXNlVmVyc2lvbihhc3NtLnZlcnNpb24sIFRhcmdldE5hbWUuUFlUSE9OKSxcbiAgICAgIGFzc20sXG4gICAgKTtcblxuICAgIC8vIFRoaXMgaXMgdGhlICc8cGFja2FnZW5hbWU+Ll9qc2lpJyBtb2R1bGUgZm9yIHRoaXMgYXNzZW1ibHlcbiAgICBjb25zdCBhc3NlbWJseU1vZHVsZSA9IG5ldyBQeXRob25Nb2R1bGUoXG4gICAgICB0aGlzLmdldEFzc2VtYmx5TW9kdWxlTmFtZShhc3NtKSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgYXNzZW1ibHk6IGFzc20sXG4gICAgICAgIGFzc2VtYmx5RmlsZW5hbWU6IHRoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpLFxuICAgICAgICBsb2FkQXNzZW1ibHk6IHRydWUsXG4gICAgICAgIHBhY2thZ2U6IHRoaXMucGFja2FnZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMucGFja2FnZS5hZGRNb2R1bGUoYXNzZW1ibHlNb2R1bGUpO1xuICAgIHRoaXMucGFja2FnZS5hZGREYXRhKGFzc2VtYmx5TW9kdWxlLCB0aGlzLmdldEFzc2VtYmx5RmlsZU5hbWUoKSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZEFzc2VtYmx5KGFzc206IHNwZWMuQXNzZW1ibHksIF9maW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIGNvbnN0IHJlc29sdmVyID0gbmV3IFR5cGVSZXNvbHZlcihcbiAgICAgIHRoaXMudHlwZXMsXG4gICAgICAoZnFuOiBzdHJpbmcpID0+IHRoaXMuZmluZE1vZHVsZShmcW4pLFxuICAgICAgKGZxbjogc3RyaW5nKSA9PiB0aGlzLmZpbmRUeXBlKGZxbiksXG4gICAgKTtcbiAgICB0aGlzLnBhY2thZ2Uud3JpdGUodGhpcy5jb2RlLCB7XG4gICAgICBhc3NlbWJseTogYXNzbSxcbiAgICAgIGVtaXR0ZWRUeXBlczogbmV3IFNldCgpLFxuICAgICAgcmVzb2x2ZXIsXG4gICAgICBzdWJtb2R1bGU6IGFzc20ubmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaWxsIGJlIGNhbGxlZCBmb3IgYXNzZW1ibHkgcm9vdCwgbmFtZXNwYWNlcyBhbmQgc3VibW9kdWxlcyAoYW55dGhpbmcgdGhhdCBjb250YWlucyBvdGhlciB0eXBlcywgYmFzZWQgb24gaXRzIEZRTilcbiAgICovXG4gIHByb3RlY3RlZCBvbkJlZ2luTmFtZXNwYWNlKG5zOiBzdHJpbmcpIHtcbiAgICAvLyAnbnMnIGNvbnRhaW5zIHNvbWV0aGluZyBsaWtlICdAc2NvcGUvanNpaS1jYWxjLWJhc2Utb2YtYmFzZSdcbiAgICBjb25zdCBzdWJtb2R1bGVMaWtlID1cbiAgICAgIG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWVcbiAgICAgICAgPyB0aGlzLmFzc2VtYmx5XG4gICAgICAgIDogdGhpcy5hc3NlbWJseS5zdWJtb2R1bGVzPy5bbnNdO1xuXG4gICAgY29uc3QgcmVhZG1lTG9jYXRpb246IEFwaUxvY2F0aW9uID0geyBhcGk6ICdtb2R1bGVSZWFkbWUnLCBtb2R1bGVGcW46IG5zIH07XG5cbiAgICBjb25zdCBtb2R1bGUgPSBuZXcgUHl0aG9uTW9kdWxlKHRvUGFja2FnZU5hbWUobnMsIHRoaXMuYXNzZW1ibHkpLCBucywge1xuICAgICAgYXNzZW1ibHk6IHRoaXMuYXNzZW1ibHksXG4gICAgICBhc3NlbWJseUZpbGVuYW1lOiB0aGlzLmdldEFzc2VtYmx5RmlsZU5hbWUoKSxcbiAgICAgIHBhY2thZ2U6IHRoaXMucGFja2FnZSxcbiAgICAgIG1vZHVsZURvY3VtZW50YXRpb246IHN1Ym1vZHVsZUxpa2U/LnJlYWRtZVxuICAgICAgICA/IHRoaXMuY29udmVydE1hcmtkb3duKFxuICAgICAgICAgICAgc3VibW9kdWxlTGlrZS5yZWFkbWU/Lm1hcmtkb3duLFxuICAgICAgICAgICAgcmVhZG1lTG9jYXRpb24sXG4gICAgICAgICAgKS50cmltKClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhY2thZ2UuYWRkTW9kdWxlKG1vZHVsZSk7XG4gICAgdGhpcy50eXBlcy5zZXQobnMsIG1vZHVsZSk7XG4gICAgaWYgKG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWUpIHtcbiAgICAgIC8vIFRoaXMgYXBwbGllcyByZWN1cnNpdmVseSB0byBzdWJtb2R1bGVzLCBzbyBubyBuZWVkIHRvIGR1cGxpY2F0ZSFcbiAgICAgIHRoaXMucGFja2FnZS5hZGREYXRhKG1vZHVsZSwgJ3B5LnR5cGVkJywgJycpO1xuICAgIH1cblxuICAgIGlmIChucyA9PT0gdGhpcy5hc3NlbWJseS5uYW1lKSB7XG4gICAgICB0aGlzLnJvb3RNb2R1bGUgPSBtb2R1bGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSEuYWRkUHl0aG9uTW9kdWxlKG1vZHVsZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kTmFtZXNwYWNlKG5zOiBzdHJpbmcpIHtcbiAgICBpZiAobnMgPT09IHRoaXMuYXNzZW1ibHkubmFtZSkge1xuICAgICAgZGVsZXRlIHRoaXMucm9vdE1vZHVsZTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkNsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUsIGFic3RyYWN0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qga2xhc3MgPSBuZXcgQ2xhc3MoXG4gICAgICB0aGlzLFxuICAgICAgdG9QeXRob25JZGVudGlmaWVyKGNscy5uYW1lKSxcbiAgICAgIGNscyxcbiAgICAgIGNscy5mcW4sXG4gICAgICB7XG4gICAgICAgIGFic3RyYWN0LFxuICAgICAgICBiYXNlczogY2xzLmJhc2UgPyBbdGhpcy5maW5kVHlwZShjbHMuYmFzZSldIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcmZhY2VzOiBjbHMuaW50ZXJmYWNlcz8ubWFwKChiYXNlKSA9PiB0aGlzLmZpbmRUeXBlKGJhc2UpKSxcbiAgICAgICAgYWJzdHJhY3RCYXNlczogYWJzdHJhY3QgPyB0aGlzLmdldEFic3RyYWN0QmFzZXMoY2xzKSA6IFtdLFxuICAgICAgfSxcbiAgICAgIGNscy5kb2NzLFxuICAgICk7XG5cbiAgICBpZiAoY2xzLmluaXRpYWxpemVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBjbHMuaW5pdGlhbGl6ZXI7XG5cbiAgICAgIGtsYXNzLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IEluaXRpYWxpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgJ19faW5pdF9fJyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgY2xzLmluaXRpYWxpemVyLmRvY3MsXG4gICAgICAgICAgZmFsc2UsIC8vIE5ldmVyIHN0YXRpY1xuICAgICAgICAgIHsgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKGNscy5pbml0aWFsaXplciksIHBhcmVudDogY2xzIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWRkUHl0aG9uVHlwZShrbGFzcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBtZXRob2Q7XG5cbiAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IFN0YXRpY01ldGhvZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lKSxcbiAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgdHJ1ZSwgLy8gQWx3YXlzIHN0YXRpY1xuICAgICAgICB7XG4gICAgICAgICAgYWJzdHJhY3Q6IG1ldGhvZC5hYnN0cmFjdCxcbiAgICAgICAgICBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AobWV0aG9kKSxcbiAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY1Byb3BlcnR5KGNsczogc3BlYy5DbGFzc1R5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IFN0YXRpY1Byb3BlcnR5KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvblByb3BlcnR5TmFtZShwcm9wLm5hbWUsIHByb3AuY29uc3QpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAge1xuICAgICAgICAgIGFic3RyYWN0OiBwcm9wLmFic3RyYWN0LFxuICAgICAgICAgIGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsXG4gICAgICAgICAgaXNTdGF0aWM6IHByb3Auc3RhdGljLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kKGNsczogc3BlYy5DbGFzc1R5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICBjb25zdCB7IHBhcmFtZXRlcnMgPSBbXSB9ID0gbWV0aG9kO1xuXG4gICAgaWYgKG1ldGhvZC5hc3luYykge1xuICAgICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IEFzeW5jTWV0aG9kKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lLCBtZXRob2QucHJvdGVjdGVkKSxcbiAgICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICAgICEhbWV0aG9kLnN0YXRpYyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhYnN0cmFjdDogbWV0aG9kLmFic3RyYWN0LFxuICAgICAgICAgICAgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksXG4gICAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IE1ldGhvZChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRvUHl0aG9uTWV0aG9kTmFtZShtZXRob2QubmFtZSwgbWV0aG9kLnByb3RlY3RlZCksXG4gICAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICBtZXRob2QucmV0dXJucyxcbiAgICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgICAhIW1ldGhvZC5zdGF0aWMsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWJzdHJhY3Q6IG1ldGhvZC5hYnN0cmFjdCxcbiAgICAgICAgICAgIGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLFxuICAgICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgUHJvcGVydHkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uUHJvcGVydHlOYW1lKHByb3AubmFtZSwgcHJvcC5jb25zdCwgcHJvcC5wcm90ZWN0ZWQpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAge1xuICAgICAgICAgIGFic3RyYWN0OiBwcm9wLmFic3RyYWN0LFxuICAgICAgICAgIGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsXG4gICAgICAgICAgaXNTdGF0aWM6IHByb3Auc3RhdGljLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVW5pb25Qcm9wZXJ0eShcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgX3VuaW9uOiBzcGVjLlVuaW9uVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5vblByb3BlcnR5KGNscywgcHJvcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIGxldCBpZmFjZTogSW50ZXJmYWNlIHwgU3RydWN0O1xuXG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgaWZhY2UgPSBuZXcgU3RydWN0KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIoaWZjLm5hbWUpLFxuICAgICAgICBpZmMsXG4gICAgICAgIGlmYy5mcW4sXG4gICAgICAgIHsgYmFzZXM6IGlmYy5pbnRlcmZhY2VzPy5tYXAoKGJhc2UpID0+IHRoaXMuZmluZFR5cGUoYmFzZSkpIH0sXG4gICAgICAgIGlmYy5kb2NzLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWZhY2UgPSBuZXcgSW50ZXJmYWNlKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIoaWZjLm5hbWUpLFxuICAgICAgICBpZmMsXG4gICAgICAgIGlmYy5mcW4sXG4gICAgICAgIHsgYmFzZXM6IGlmYy5pbnRlcmZhY2VzPy5tYXAoKGJhc2UpID0+IHRoaXMuZmluZFR5cGUoYmFzZSkpIH0sXG4gICAgICAgIGlmYy5kb2NzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFB5dGhvblR5cGUoaWZhY2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kSW50ZXJmYWNlKF9pZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZChpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBtZXRob2Q7XG5cbiAgICB0aGlzLmdldFB5dGhvblR5cGUoaWZjLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IEludGVyZmFjZU1ldGhvZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lLCBtZXRob2QucHJvdGVjdGVkKSxcbiAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgISFtZXRob2Quc3RhdGljLFxuICAgICAgICB7IGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLCBwYXJlbnQ6IGlmYyB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlUHJvcGVydHkoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICBsZXQgaWZhY2VQcm9wZXJ0eTogSW50ZXJmYWNlUHJvcGVydHkgfCBTdHJ1Y3RGaWVsZDtcblxuICAgIGlmIChpZmMuZGF0YXR5cGUpIHtcbiAgICAgIGlmYWNlUHJvcGVydHkgPSBuZXcgU3RydWN0RmllbGQodGhpcywgcHJvcCwgaWZjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWZhY2VQcm9wZXJ0eSA9IG5ldyBJbnRlcmZhY2VQcm9wZXJ0eShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lLCBwcm9wLmNvbnN0LCBwcm9wLnByb3RlY3RlZCksXG4gICAgICAgIHByb3AubmFtZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgcHJvcC5kb2NzLFxuICAgICAgICB7IGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsIGlzU3RhdGljOiBwcm9wLnN0YXRpYywgcGFyZW50OiBpZmMgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGlmYy5mcW4pLmFkZE1lbWJlcihpZmFjZVByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luRW51bShlbm06IHNwZWMuRW51bVR5cGUpIHtcbiAgICB0aGlzLmFkZFB5dGhvblR5cGUoXG4gICAgICBuZXcgRW51bSh0aGlzLCB0b1B5dGhvbklkZW50aWZpZXIoZW5tLm5hbWUpLCBlbm0sIGVubS5mcW4sIHt9LCBlbm0uZG9jcyksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVudW1NZW1iZXIoZW5tOiBzcGVjLkVudW1UeXBlLCBtZW1iZXI6IHNwZWMuRW51bU1lbWJlcikge1xuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShlbm0uZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgRW51bU1lbWJlcihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25JZGVudGlmaWVyKG1lbWJlci5uYW1lKSxcbiAgICAgICAgbWVtYmVyLm5hbWUsXG4gICAgICAgIG1lbWJlci5kb2NzLFxuICAgICAgICBlbm0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VNZXRob2RPdmVybG9hZChcbiAgICBfaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsXG4gICAgX292ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBUeXBlOiBJbnRlcmZhY2VNZXRob2RPdmVybG9hZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kT3ZlcmxvYWQoXG4gICAgX2Nsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgX292ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBUeXBlOiBNZXRob2RPdmVybG9hZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljTWV0aG9kT3ZlcmxvYWQoXG4gICAgX2Nsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgX292ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBUeXBlOiBTdGF0aWNNZXRob2RPdmVybG9hZCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBc3NlbWJseU1vZHVsZU5hbWUoYXNzbTogc3BlYy5Bc3NlbWJseSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Fzc20udGFyZ2V0cyEucHl0aG9uIS5tb2R1bGV9Ll9qc2lpYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyZW50RlFOKGZxbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtID0gL14oLispXFwuW14uXSskLy5leGVjKGZxbik7XG5cbiAgICBpZiAobSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgcGFyZW50IEZRTiBvZjogJHtmcW59YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1bMV07XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmVudChmcW46IHN0cmluZyk6IFB5dGhvblR5cGUge1xuICAgIHJldHVybiB0aGlzLmdldFB5dGhvblR5cGUodGhpcy5nZXRQYXJlbnRGUU4oZnFuKSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFB5dGhvblR5cGUodHlwZTogUHl0aG9uVHlwZSkge1xuICAgIGlmICh0eXBlLmZxbiA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgYSBQeXRob24gdHlwZSB3aXRob3V0IGEgRlFOLicpO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0UGFyZW50KHR5cGUuZnFuKS5hZGRNZW1iZXIodHlwZSk7XG4gICAgdGhpcy50eXBlcy5zZXQodHlwZS5mcW4sIHR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRsaWZ0ZWRQcm9wKFxuICAgIG1ldGhvZDogc3BlYy5NZXRob2QgfCBzcGVjLkluaXRpYWxpemVyLFxuICApOiBzcGVjLkludGVyZmFjZVR5cGUgfCB1bmRlZmluZWQge1xuICAgIC8vIElmIHRoZXJlIGFyZSBwYXJhbWV0ZXJzIHRvIHRoaXMgbWV0aG9kLCBhbmQgaWYgdGhlIGxhc3QgcGFyYW1ldGVyJ3MgdHlwZSBpc1xuICAgIC8vIGEgZGF0YXR5cGUgaW50ZXJmYWNlLCB0aGVuIHdlIHdhbnQgdG8gbGlmdCB0aGUgbWVtYmVycyBvZiB0aGF0IGxhc3QgcGFyYW10ZXJcbiAgICAvLyBhcyBrZXl3b3JkIGFyZ3VtZW50cyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgIGlmIChtZXRob2QucGFyYW1ldGVycz8ubGVuZ3RoID8/IDAgPj0gMSkge1xuICAgICAgY29uc3QgbGFzdFBhcmFtZXRlciA9IG1ldGhvZC5wYXJhbWV0ZXJzIS5zbGljZSgtMSlbMF07XG4gICAgICBpZiAoXG4gICAgICAgICFsYXN0UGFyYW1ldGVyLnZhcmlhZGljICYmXG4gICAgICAgIHNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UobGFzdFBhcmFtZXRlci50eXBlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGxhc3RQYXJhbWV0ZXJUeXBlID0gdGhpcy5maW5kVHlwZShsYXN0UGFyYW1ldGVyLnR5cGUuZnFuKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNwZWMuaXNJbnRlcmZhY2VUeXBlKGxhc3RQYXJhbWV0ZXJUeXBlKSAmJlxuICAgICAgICAgIGxhc3RQYXJhbWV0ZXJUeXBlLmRhdGF0eXBlXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBsYXN0UGFyYW1ldGVyVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEFic3RyYWN0QmFzZXMoY2xzOiBzcGVjLkNsYXNzVHlwZSk6IHNwZWMuQ2xhc3NUeXBlW10ge1xuICAgIGNvbnN0IGFic3RyYWN0QmFzZXM6IHNwZWMuQ2xhc3NUeXBlW10gPSBbXTtcblxuICAgIGlmIChjbHMuYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5maW5kVHlwZShjbHMuYmFzZSk7XG5cbiAgICAgIGlmICghc3BlYy5pc0NsYXNzVHlwZShiYXNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDbGFzcyBpbmhlcml0ZW5jZSB0aGF0IGlzbid0IGEgY2xhc3M/XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmFzZS5hYnN0cmFjdCkge1xuICAgICAgICBhYnN0cmFjdEJhc2VzLnB1c2goYmFzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFic3RyYWN0QmFzZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBQb3NpdGlvbmFsIGFyZ3VtZW50IG9yIGtleXdvcmQgcGFyYW1ldGVyXG4gKi9cbmludGVyZmFjZSBEb2N1bWVudGFibGVBcmd1bWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVmaW5pbmdUeXBlOiBzcGVjLlR5cGU7XG4gIGRvY3M/OiBzcGVjLkRvY3M7XG59XG5cbi8qKlxuICogUmVuZGVyIGEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIGdpdmVuIGRvY3MsIHVzZWQgZm9yIG1ldGhvZCBhcmd1bWVudHMgYW5kIGlubGluZWQgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBvbmVsaW5lRGVzY3JpcHRpb24oZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkKSB7XG4gIC8vIE9ubHkgY29uc2lkZXIgYSBzdWJzZXQgb2YgZmllbGRzIGhlcmUsIHdlIGRvbid0IGhhdmUgYSBsb3Qgb2YgZm9ybWF0dGluZyBzcGFjZVxuICBpZiAoIWRvY3MgfHwgT2JqZWN0LmtleXMoZG9jcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICctJztcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gW107XG4gIGlmIChkb2NzLnN1bW1hcnkpIHtcbiAgICBwYXJ0cy5wdXNoKG1kMnJzdChyZW5kZXJTdW1tYXJ5KGRvY3MpKSk7XG4gIH1cbiAgaWYgKGRvY3MucmVtYXJrcykge1xuICAgIHBhcnRzLnB1c2gobWQycnN0KGRvY3MucmVtYXJrcykpO1xuICB9XG4gIGlmIChkb2NzLmRlZmF1bHQpIHtcbiAgICBwYXJ0cy5wdXNoKGBEZWZhdWx0OiAke21kMnJzdChkb2NzLmRlZmF1bHQpfWApO1xuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKCcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRNZW50aW9uU3RhYmlsaXR5KHM6IHNwZWMuU3RhYmlsaXR5KSB7XG4gIC8vIERvbid0IHJlbmRlciBcInN0YWJsZVwiIG9yIFwiZXh0ZXJuYWxcIiwgdGhvc2UgYXJlIGJvdGggc3RhYmxlIGJ5IGltcGxpY2F0aW9uLlxuICByZXR1cm4gcyA9PT0gc3BlYy5TdGFiaWxpdHkuRGVwcmVjYXRlZCB8fCBzID09PSBzcGVjLlN0YWJpbGl0eS5FeHBlcmltZW50YWw7XG59XG5cbmZ1bmN0aW9uIGlzU3RydWN0KFxuICB0eXBlU3lzdGVtOiByZWZsZWN0LlR5cGVTeXN0ZW0sXG4gIHJlZjogc3BlYy5UeXBlUmVmZXJlbmNlLFxuKTogYm9vbGVhbiB7XG4gIGlmICghc3BlYy5pc05hbWVkVHlwZVJlZmVyZW5jZShyZWYpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHR5cGUgPSB0eXBlU3lzdGVtLnRyeUZpbmRGcW4ocmVmLmZxbik7XG4gIHJldHVybiAhISh0eXBlPy5pc0ludGVyZmFjZVR5cGUoKSAmJiB0eXBlPy5pc0RhdGFUeXBlKCkpO1xufVxuXG4vKipcbiAqIEFwcGVuZHMgYF9gIGF0IHRoZSBlbmQgb2YgYG5hbWVgIHVudGlsIGl0IG5vIGxvbmdlciBjb25mbGljdHMgd2l0aCBhbnkgb2YgdGhlXG4gKiBlbnRyaWVzIGluIGBpblVzZWAuXG4gKlxuICogQHBhcmFtIG5hbWUgIHRoZSBuYW1lIHRvIGJlIHNsdWdpZmllZC5cbiAqIEBwYXJhbSBpblVzZSB0aGUgbmFtZXMgdGhhdCBhcmUgYWxyZWFkeSBiZWluZyB1c2VkLlxuICpcbiAqIEByZXR1cm5zIHRoZSBzbHVnaWZpZWQgbmFtZS5cbiAqL1xuZnVuY3Rpb24gc2x1Z2lmeUFzTmVlZGVkKG5hbWU6IHN0cmluZywgaW5Vc2U6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgaW5Vc2VTZXQgPSBuZXcgU2V0KGluVXNlKTtcbiAgd2hpbGUgKGluVXNlU2V0LmhhcyhuYW1lKSkge1xuICAgIG5hbWUgPSBgJHtuYW1lfV9gO1xuICB9XG4gIHJldHVybiBuYW1lO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gQkVIT0xEOiBIZWxwZXJzIHRvIG91dHB1dCBjb2RlIHRoYXQgbG9va3MgbGlrZSB3aGF0IEJsYWNrIHdvdWxkIGZvcm1hdCBpbnRvLi4uXG4vL1xuLy8gQHNlZSBodHRwczovL2JsYWNrLnJlYWR0aGVkb2NzLmlvL2VuL3N0YWJsZS90aGVfYmxhY2tfY29kZV9zdHlsZS5odG1sXG5cbmNvbnN0IFRBUkdFVF9MSU5FX0xFTkdUSCA9IDg4O1xuXG5mdW5jdGlvbiBvcGVuU2lnbmF0dXJlKFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIGtleXdvcmQ6ICdjbGFzcycsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGFyYW1zOiByZWFkb25seSBzdHJpbmdbXSxcbik6IHZvaWQ7XG5mdW5jdGlvbiBvcGVuU2lnbmF0dXJlKFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIGtleXdvcmQ6ICdkZWYnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHRyYWlsaW5nQ29tbWE6IGJvb2xlYW4sXG4gIHJldHVyblR5cGU6IHN0cmluZyxcbik6IHZvaWQ7XG5mdW5jdGlvbiBvcGVuU2lnbmF0dXJlKFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIGtleXdvcmQ6ICdjbGFzcycgfCAnZGVmJyxcbiAgbmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB0cmFpbGluZ0NvbW1hID0gZmFsc2UsXG4gIHJldHVyblR5cGU/OiBzdHJpbmcsXG4pIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7a2V5d29yZH0gJHtuYW1lfWA7XG4gIGNvbnN0IHN1ZmZpeCA9IHJldHVyblR5cGUgPyBgIC0+ICR7cmV0dXJuVHlwZX1gIDogJyc7XG4gIGlmIChwYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5vcGVuQmxvY2soYCR7cHJlZml4fSR7cmV0dXJuVHlwZSA/ICcoKScgOiAnJ30ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBqb2luID0gJywgJztcbiAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihwYXJhbXMsIGpvaW4pO1xuXG4gIGNvbnN0IGhhc0NvbW1lbnRzID0gIXBhcmFtcy5zb21lKChwYXJhbSkgPT4gLyMgLiskLy5leGVjKHBhcmFtKSk7XG5cbiAgaWYgKFxuICAgIGhhc0NvbW1lbnRzICYmXG4gICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgICBqb2luU2l6ZSArXG4gICAgICAgIHN1ZmZpeC5sZW5ndGggK1xuICAgICAgICAyXG4gICkge1xuICAgIGNvZGUub3BlbkJsb2NrKGAke3ByZWZpeH0oJHtwYXJhbXMuam9pbihqb2luKX0pJHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29kZS5pbmRlbnQoYCR7cHJlZml4fShgKTtcbiAgaWYgKFxuICAgICFoYXNDb21tZW50cyAmJlxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgICBqb2luU2l6ZSArXG4gICAgICAgICh0cmFpbGluZ0NvbW1hID8gMSA6IDApXG4gICkge1xuICAgIGNvZGUubGluZShgJHtwYXJhbXMuam9pbihqb2luKX0ke3RyYWlsaW5nQ29tbWEgPyAnLCcgOiAnJ31gKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgY29kZS5saW5lKHBhcmFtLnJlcGxhY2UoLyhcXHMqIyAuKyk/JC8sICcsJDEnKSk7XG4gICAgfVxuICB9XG4gIGNvZGUudW5pbmRlbnQoZmFsc2UpO1xuICBjb2RlLm9wZW5CbG9jayhgKSR7c3VmZml4fWApO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DYWxsUmVzdWx0KFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIHZhcmlhYmxlOiBzdHJpbmcsXG4gIGZ1bmN0OiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4pIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7dmFyaWFibGV9ID0gJHtmdW5jdH0oYDtcbiAgY29uc3Qgc3VmZml4ID0gJyknO1xuXG4gIGlmIChwYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBqb2luID0gJywgJztcbiAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihwYXJhbXMsIGpvaW4pO1xuXG4gIGlmIChcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICBqb2luU2l6ZSArXG4gICAgICBzdWZmaXgubGVuZ3RoXG4gICkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtwYXJhbXMuam9pbihqb2luKX0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb2RlLmluZGVudChwcmVmaXgpO1xuICBpZiAoVEFSR0VUX0xJTkVfTEVOR1RIID4gY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICsgZWxlbWVudHNTaXplICsgam9pblNpemUpIHtcbiAgICBjb2RlLmxpbmUocGFyYW1zLmpvaW4oam9pbikpO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG4gICAgICBjb2RlLmxpbmUoYCR7cGFyYW19LGApO1xuICAgIH1cbiAgfVxuICBjb2RlLnVuaW5kZW50KHN1ZmZpeCk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkRpY3Rpb25hcnkoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAgdmFyaWFibGU6IHN0cmluZyxcbiAgZWxlbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB0cmFpbGluZz86IHN0cmluZyxcbiAgY29tcGFjdCA9IGZhbHNlLFxuKTogdm9pZCB7XG4gIGNvbnN0IHNwYWNlID0gY29tcGFjdCA/ICcnIDogJyAnO1xuXG4gIGNvbnN0IHByZWZpeCA9IGAke3ZhcmlhYmxlfSR7c3BhY2V9PSR7c3BhY2V9e2A7XG4gIGNvbnN0IHN1ZmZpeCA9IGB9JHt0cmFpbGluZyA/PyAnJ31gO1xuXG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChjb21wYWN0KSB7XG4gICAgY29uc3Qgam9pbiA9ICcsICc7XG4gICAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihlbGVtZW50cywgam9pbik7XG4gICAgaWYgKFxuICAgICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgICBqb2luU2l6ZSArXG4gICAgICAgIHN1ZmZpeC5sZW5ndGhcbiAgICApIHtcbiAgICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtlbGVtZW50cy5qb2luKGpvaW4pfSR7c3VmZml4fWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGNvZGUuaW5kZW50KHByZWZpeCk7XG4gIGZvciAoY29uc3QgZWx0IG9mIGVsZW1lbnRzKSB7XG4gICAgY29kZS5saW5lKGAke2VsdH0sYCk7XG4gIH1cbiAgY29kZS51bmluZGVudChzdWZmaXgpO1xufVxuXG5mdW5jdGlvbiBlbWl0TGlzdChcbiAgY29kZTogQ29kZU1ha2VyLFxuICBwcmVmaXg6IHN0cmluZyxcbiAgZWxlbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBzdWZmaXg6IHN0cmluZyxcbiAgb3B0cz86IHsgaWZNdWx0aTogW3N0cmluZywgc3RyaW5nXSB9LFxuKSB7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGpvaW4gPSAnLCAnO1xuICBjb25zdCB7IGVsZW1lbnRzU2l6ZSwgam9pblNpemUgfSA9IHRvdGFsU2l6ZU9mKGVsZW1lbnRzLCBqb2luKTtcbiAgaWYgKFxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgIGpvaW5TaXplICtcbiAgICAgIHN1ZmZpeC5sZW5ndGhcbiAgKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke2VsZW1lbnRzLmpvaW4oam9pbil9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgW2JlZm9yZSwgYWZ0ZXJdID0gb3B0cz8uaWZNdWx0aSA/PyBbJycsICcnXTtcblxuICBjb2RlLmluZGVudChgJHtwcmVmaXh9JHtiZWZvcmV9YCk7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICBjb2RlLmxpbmUoZWxlbWVudHNbMF0pO1xuICB9IGVsc2Uge1xuICAgIGlmIChcbiAgICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggKyBlbGVtZW50c1NpemUgKyBqb2luU2l6ZVxuICAgICkge1xuICAgICAgY29kZS5saW5lKGVsZW1lbnRzLmpvaW4oam9pbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGVsdCBvZiBlbGVtZW50cykge1xuICAgICAgICBjb2RlLmxpbmUoYCR7ZWx0fSxgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29kZS51bmluZGVudChgJHthZnRlcn0ke3N1ZmZpeH1gKTtcbn1cblxuZnVuY3Rpb24gdG90YWxTaXplT2Yoc3RyaW5nczogcmVhZG9ubHkgc3RyaW5nW10sIGpvaW46IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIGVsZW1lbnRzU2l6ZTogc3RyaW5nc1xuICAgICAgLm1hcCgoc3RyKSA9PiBzdHIubGVuZ3RoKVxuICAgICAgLnJlZHVjZSgoYWNjLCBlbHQpID0+IGFjYyArIGVsdCwgMCksXG4gICAgam9pblNpemU6IHN0cmluZ3MubGVuZ3RoID4gMSA/IGpvaW4ubGVuZ3RoICogKHN0cmluZ3MubGVuZ3RoIC0gMSkgOiAwLFxuICB9O1xufVxuXG5mdW5jdGlvbiBuZXN0ZWRDb250ZXh0KFxuICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgZnFuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBFbWl0Q29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgLi4uY29udGV4dCxcbiAgICBzdXJyb3VuZGluZ1R5cGVGcW5zOlxuICAgICAgZnFuICE9IG51bGxcbiAgICAgICAgPyBbLi4uKGNvbnRleHQuc3Vycm91bmRpbmdUeXBlRnFucyA/PyBbXSksIGZxbl1cbiAgICAgICAgOiBjb250ZXh0LnN1cnJvdW5kaW5nVHlwZUZxbnMsXG4gIH07XG59XG5cbmNvbnN0IGlzRGVwcmVjYXRlZCA9ICh4OiBQeXRob25CYXNlKSA9PiB4LmRvY3M/LmRlcHJlY2F0ZWQgIT09IHVuZGVmaW5lZDtcbiJdfQ==
2108
+ /**
2109
+ * Last component of a .-separated name
2110
+ */
2111
+ function lastComponent(n) {
2112
+ const parts = n.split('.');
2113
+ return parts[parts.length - 1];
2114
+ }
2115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHl0aG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQW1DO0FBQ25DLGlDQUFpQztBQUNqQyx5Q0FBbUQ7QUFDbkQsMkRBQTJEO0FBQzNELCtCQUErQjtBQUUvQiwrQ0FLc0I7QUFDdEIsNkJBQTZCO0FBRTdCLDRDQUEyRDtBQUMzRCx3Q0FBa0M7QUFDbEMsMENBQXFDO0FBQ3JDLHNDQUFrRDtBQUNsRCxrQ0FBZ0M7QUFDaEMscUNBQTZEO0FBQzdELGtEQU00QjtBQUM1Qix3Q0FBd0Q7QUFDeEQsbURBQXlFO0FBRXpFLG1DQUFxQztBQUVyQyxvR0FBb0c7QUFDcEcsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFckQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUNuQyxTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixDQUN2QixDQUFDO0FBRUYsMkVBQTJFO0FBQzNFLCtGQUErRjtBQUMvRixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUUvQixNQUFxQixNQUFPLFNBQVEsZUFBTTtJQUd4QyxZQUFtQixPQUFzQjtRQUN2QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFZixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFjLEVBQUUsT0FBZTtRQUN2RCxNQUFNLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQWlCLEVBQUUsTUFBYztRQUNsRCw2QkFBNkI7UUFDN0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FB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Q0FBQyxDQUFDO0tBQ3RFLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQ3BCLE9BQW9CLEVBQ3BCLEdBQXVCOztJQUV2QixPQUFPO1FBQ0wsR0FBRyxPQUFPO1FBQ1YsbUJBQW1CLEVBQ2pCLEdBQUcsSUFBSSxJQUFJO1lBQ1QsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFDLE9BQU8sQ0FBQyxtQkFBbUIsbUNBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQy9DLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CO0tBQ2xDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFhLEVBQUUsRUFBRSxXQUFDLE9BQUEsT0FBQSxDQUFDLENBQUMsSUFBSSwwQ0FBRSxVQUFVLE1BQUssU0FBUyxDQUFBLEVBQUEsQ0FBQztBQUV6RTs7R0FFRztBQUNILFNBQVMsYUFBYSxDQUFDLENBQVM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzcGVjIGZyb20gJ0Bqc2lpL3NwZWMnO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBDb2RlTWFrZXIsIHRvU25ha2VDYXNlIH0gZnJvbSAnY29kZW1ha2VyJztcbmltcG9ydCAqIGFzIGVzY2FwZVN0cmluZ1JlZ2V4cCBmcm9tICdlc2NhcGUtc3RyaW5nLXJlZ2V4cCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQge1xuICBUYXJnZXRMYW5ndWFnZSxcbiAgUm9zZXR0YSxcbiAgZW5mb3JjZXNTdHJpY3RNb2RlLFxuICBBcGlMb2NhdGlvbixcbn0gZnJvbSAnanNpaS1yb3NldHRhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEdlbmVyYXRvciwgR2VuZXJhdG9yT3B0aW9ucyB9IGZyb20gJy4uL2dlbmVyYXRvcic7XG5pbXBvcnQgeyB3YXJuIH0gZnJvbSAnLi4vbG9nZ2luZyc7XG5pbXBvcnQgeyBtZDJyc3QgfSBmcm9tICcuLi9tYXJrZG93bic7XG5pbXBvcnQgeyBUYXJnZXQsIFRhcmdldE9wdGlvbnMgfSBmcm9tICcuLi90YXJnZXQnO1xuaW1wb3J0IHsgc2hlbGwgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IHJlbmRlclN1bW1hcnksIFByb3BlcnR5RGVmaW5pdGlvbiB9IGZyb20gJy4vX3V0aWxzJztcbmltcG9ydCB7XG4gIE5hbWluZ0NvbnRleHQsXG4gIHRvVHlwZU5hbWUsXG4gIFB5dGhvbkltcG9ydHMsXG4gIG1lcmdlUHl0aG9uSW1wb3J0cyxcbiAgdG9QYWNrYWdlTmFtZSxcbn0gZnJvbSAnLi9weXRob24vdHlwZS1uYW1lJztcbmltcG9ydCB7IGRpZSwgdG9QeXRob25JZGVudGlmaWVyIH0gZnJvbSAnLi9weXRob24vdXRpbCc7XG5pbXBvcnQgeyB0b1B5dGhvblZlcnNpb25SYW5nZSwgdG9SZWxlYXNlVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi11dGlscyc7XG5cbmltcG9ydCB7IFRhcmdldE5hbWUgfSBmcm9tICcuL2luZGV4JztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXMsQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3Qgc3BkeExpY2Vuc2VMaXN0ID0gcmVxdWlyZSgnc3BkeC1saWNlbnNlLWxpc3QnKTtcblxuY29uc3QgcmVxdWlyZW1lbnRzRmlsZSA9IHBhdGgucmVzb2x2ZShcbiAgX19kaXJuYW1lLFxuICAncHl0aG9uJyxcbiAgJ3JlcXVpcmVtZW50cy1kZXYudHh0Jyxcbik7XG5cbi8vIHdlIHVzZSBzaW5nbGUtcXVvdGVzIGZvciBtdWx0aS1saW5lIHN0cmluZ3MgdG8gYWxsb3cgZXhhbXBsZXMgd2l0aGluIHRoZVxuLy8gZG9jc3RyaW5ncyB0aGVtc2VsdmVzIHRvIGluY2x1ZGUgZG91YmxlLXF1b3RlcyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjU2OSlcbmNvbnN0IERPQ1NUUklOR19RVU9URVMgPSBcIicnJ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQeXRob24gZXh0ZW5kcyBUYXJnZXQge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3I7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRhcmdldE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuZ2VuZXJhdG9yID0gbmV3IFB5dGhvbkdlbmVyYXRvcihvcHRpb25zLnJvc2V0dGEpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdlbmVyYXRlQ29kZShvdXREaXI6IHN0cmluZywgdGFyYmFsbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuZ2VuZXJhdGVDb2RlKG91dERpciwgdGFyYmFsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYnVpbGQoc291cmNlRGlyOiBzdHJpbmcsIG91dERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ3JlYXRlIGEgZnJlc2ggdmlydHVhbCBlbnZcbiAgICBjb25zdCB2ZW52ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4oc291cmNlRGlyLCAnLmVudi0nKSk7XG4gICAgY29uc3QgdmVudkJpbiA9IHBhdGguam9pbihcbiAgICAgIHZlbnYsXG4gICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ1NjcmlwdHMnIDogJ2JpbicsXG4gICAgKTtcbiAgICAvLyBPbiBXaW5kb3dzLCB0aGVyZSBpcyB1c3VhbGx5IG5vIHB5dGhvbjMuZXhlICh0aGUgR2l0SHViIGFjdGlvbiB3b3JrZXJzIHdpbGwgaGF2ZSBhIHB5dGhvbjNcbiAgICAvLyBzaGltLCBidXQgdXNpbmcgdGhpcyBhY3R1YWxseSByZXN1bHRzIGluIGEgV2luRXJyb3Igd2l0aCBQeXRob24gMy43IGFuZCAzLjggd2hlcmUgdmVudiB3aWxsXG4gICAgLy8gZmFpbCB0byBjb3B5IHRoZSBweXRob24gYmluYXJ5IGlmIGl0J3Mgbm90IGludm9rZWQgYXMgcHl0aG9uLmV4ZSkuIE1vcmUgb24gdGhpcyBwYXJ0aWN1bGFyXG4gICAgLy8gaXNzdWUgY2FuIGJlIHJlYWQgaGVyZTogaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU0Mzc0OVxuICAgIGF3YWl0IHNoZWxsKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAncHl0aG9uJyA6ICdweXRob24zJywgW1xuICAgICAgJy1tJyxcbiAgICAgICd2ZW52JyxcbiAgICAgICctLXN5c3RlbS1zaXRlLXBhY2thZ2VzJywgLy8gQWxsb3cgdXNpbmcgZ2xvYmFsbHkgaW5zdGFsbGVkIHBhY2thZ2VzIChzYXZlcyB0aW1lICYgZGlzayBzcGFjZSlcbiAgICAgIHZlbnYsXG4gICAgXSk7XG4gICAgY29uc3QgZW52ID0ge1xuICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICBQQVRIOiBgJHt2ZW52QmlufToke3Byb2Nlc3MuZW52LlBBVEh9YCxcbiAgICAgIFZJUlRVQUxfRU5WOiB2ZW52LFxuICAgIH07XG4gICAgY29uc3QgcHl0aG9uID0gcGF0aC5qb2luKHZlbnZCaW4sICdweXRob24nKTtcblxuICAgIC8vIEluc3RhbGwgdGhlIG5lY2Vzc2FyeSB0aGluZ3NcbiAgICBhd2FpdCBzaGVsbChcbiAgICAgIHB5dGhvbixcbiAgICAgIFsnLW0nLCAncGlwJywgJ2luc3RhbGwnLCAnLS1uby1pbnB1dCcsICctcicsIHJlcXVpcmVtZW50c0ZpbGVdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgICAgZW52LFxuICAgICAgICByZXRyeTogeyBtYXhBdHRlbXB0czogNSB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gQWN0dWFsbHkgcGFja2FnZSB1cCBvdXIgY29kZSwgYm90aCBhcyBhIHNkaXN0IGFuZCBhIHdoZWVsIGZvciBwdWJsaXNoaW5nLlxuICAgIGF3YWl0IHNoZWxsKHB5dGhvbiwgWydzZXR1cC5weScsICdzZGlzdCcsICctLWRpc3QtZGlyJywgb3V0RGlyXSwge1xuICAgICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgICBlbnYsXG4gICAgfSk7XG4gICAgYXdhaXQgc2hlbGwoXG4gICAgICBweXRob24sXG4gICAgICBbJy1tJywgJ3BpcCcsICd3aGVlbCcsICctLW5vLWRlcHMnLCAnLS13aGVlbC1kaXInLCBvdXREaXIsIHNvdXJjZURpcl0sXG4gICAgICB7XG4gICAgICAgIGN3ZDogc291cmNlRGlyLFxuICAgICAgICBlbnYsXG4gICAgICAgIHJldHJ5OiB7IG1heEF0dGVtcHRzOiA1IH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgYXdhaXQgc2hlbGwocHl0aG9uLCBbJy1tJywgJ3R3aW5lJywgJ2NoZWNrJywgcGF0aC5qb2luKG91dERpciwgJyonKV0sIHtcbiAgICAgIGN3ZDogc291cmNlRGlyLFxuICAgICAgZW52LFxuICAgIH0pO1xuICB9XG59XG5cbi8vICMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gIyBDT0RFIEdFTkVSQVRPUiAjXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyNcblxuaW50ZXJmYWNlIEVtaXRDb250ZXh0IGV4dGVuZHMgTmFtaW5nQ29udGV4dCB7XG4gIC8qKiBAZGVwcmVjYXRlZCBUaGUgVHlwZVJlc29sdmVyICovXG4gIHJlYWRvbmx5IHJlc29sdmVyOiBUeXBlUmVzb2x2ZXI7XG59XG5cbmNvbnN0IHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBwYXRoLmpvaW4oLi4ubmFtZS5zcGxpdCgnLicpKTtcbn07XG5cbmNvbnN0IHRvUHl0aG9uTWV0aG9kTmFtZSA9IChuYW1lOiBzdHJpbmcsIHByb3RlY3RlZEl0ZW0gPSBmYWxzZSk6IHN0cmluZyA9PiB7XG4gIGxldCB2YWx1ZSA9IHRvUHl0aG9uSWRlbnRpZmllcih0b1NuYWtlQ2FzZShuYW1lKSk7XG4gIGlmIChwcm90ZWN0ZWRJdGVtKSB7XG4gICAgdmFsdWUgPSBgXyR7dmFsdWV9YDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5jb25zdCB0b1B5dGhvblByb3BlcnR5TmFtZSA9IChcbiAgbmFtZTogc3RyaW5nLFxuICBjb25zdGFudCA9IGZhbHNlLFxuICBwcm90ZWN0ZWRJdGVtID0gZmFsc2UsXG4pOiBzdHJpbmcgPT4ge1xuICBsZXQgdmFsdWUgPSB0b1B5dGhvbklkZW50aWZpZXIodG9TbmFrZUNhc2UobmFtZSkpO1xuXG4gIGlmIChjb25zdGFudCkge1xuICAgIHZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIGlmIChwcm90ZWN0ZWRJdGVtKSB7XG4gICAgdmFsdWUgPSBgXyR7dmFsdWV9YDtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBnaXZlbiBzaWduYXR1cmUncyBwYXJhbWV0ZXIgbmFtZSB0byB3aGF0IHNob3VsZCBiZSBlbWl0dGVkIGluIFB5dGhvbi4gSXQgc2x1Z2lmaWVzIHRoZVxuICogcG9zaXRpb25hbCBwYXJhbWV0ZXIgbmFtZXMgdGhhdCBjb2xsaWRlIHdpdGggYSBsaWZ0ZWQgcHJvcCBieSBhcHBlbmRpbmcgdHJhaWxpbmcgYF9gLiBUaGVyZSBpcyBub1xuICogcmlzayBvZiBjb25mbGljdGluZyB3aXRoIGFuIG90aGVyIHBvc2l0aW9uYWwgcGFyYW1ldGVyIHRoYXQgZW5kcyB3aXRoIGEgYF9gIGNoYXJhY3RlciBiZWNhdXNlXG4gKiB0aGlzIGlzIHByb2hpYml0ZWQgYnkgdGhlIGBqc2lpYCBjb21waWxlciAocGFyYW1ldGVyIG5hbWVzIE1VU1QgYmUgY2FtZWxDYXNlLCBhbmQgb25seSBhIHNpbmdsZVxuICogYF9gIGlzIHBlcm1pdHRlZCB3aGVuIGl0IGlzIG9uICoqbGVhZGluZyoqIHBvc2l0aW9uKVxuICpcbiAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRoYXQgbmVlZHMgY29udmVyc2lvbi5cbiAqIEBwYXJhbSBsaWZ0ZWRQYXJhbU5hbWVzICB0aGUgbGlzdCBvZiBcImxpZnRlZFwiIGtleXdvcmQgcGFyYW1ldGVycyBpbiB0aGlzIHNpZ25hdHVyZS4gVGhpcyBtdXN0IGJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb21pdHRlZCB3aGVuIGdlbmVyYXRpbmcgYSBuYW1lIGZvciBhIHBhcmFtZXRlciB0aGF0ICoqaXMqKiBsaWZ0ZWQuXG4gKi9cbmZ1bmN0aW9uIHRvUHl0aG9uUGFyYW1ldGVyTmFtZShcbiAgbmFtZTogc3RyaW5nLFxuICBsaWZ0ZWRQYXJhbU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCksXG4pOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gdG9QeXRob25JZGVudGlmaWVyKHRvU25ha2VDYXNlKG5hbWUpKTtcblxuICB3aGlsZSAobGlmdGVkUGFyYW1OYW1lcy5oYXMocmVzdWx0KSkge1xuICAgIHJlc3VsdCArPSAnXyc7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5jb25zdCBzZXREaWZmZXJlbmNlID0gPFQ+KHNldEE6IFNldDxUPiwgc2V0QjogU2V0PFQ+KTogU2V0PFQ+ID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFNldDxUPigpO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc2V0QSkge1xuICAgIGlmICghc2V0Qi5oYXMoaXRlbSkpIHtcbiAgICAgIHJlc3VsdC5hZGQoaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFByZXBhcmUgcHl0aG9uIG1lbWJlcnMgZm9yIGVtaXNzaW9uLlxuICpcbiAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtZW1iZXJzIG9mIHRoZSBzYW1lIG5hbWUsIHRoZXkgd2lsbCBhbGwgbWFwIHRvIHRoZSBzYW1lIHB5dGhvblxuICogbmFtZSwgc28gd2Ugd2lsbCBmaWx0ZXIgYWxsIGRlcHJlY2F0ZWQgbWVtYmVycyBhbmQgZXhwZWN0IHRoYXQgdGhlcmUgd2lsbCBiZSBvbmx5IG9uZVxuICogbGVmdC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBtZW1iZXJzIGluIGEgc29ydGVkIGxpc3QuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVNZW1iZXJzKG1lbWJlcnM6IFB5dGhvbkJhc2VbXSwgcmVzb2x2ZXI6IFR5cGVSZXNvbHZlcikge1xuICAvLyBjcmVhdGUgYSBtYXAgZnJvbSBweXRob24gbmFtZSB0byBsaXN0IG9mIG1lbWJlcnNcbiAgY29uc3QgbWFwOiB7IFtweXRob25OYW1lOiBzdHJpbmddOiBQeXRob25CYXNlW10gfSA9IHt9O1xuICBmb3IgKGNvbnN0IG0gb2YgbWVtYmVycykge1xuICAgIGxldCBsaXN0ID0gbWFwW20ucHl0aG9uTmFtZV07XG4gICAgaWYgKCFsaXN0KSB7XG4gICAgICBsaXN0ID0gbWFwW20ucHl0aG9uTmFtZV0gPSBbXTtcbiAgICB9XG5cbiAgICBsaXN0LnB1c2gobSk7XG4gIH1cblxuICAvLyBub3cgcmV0dXJuIGFsbCB0aGUgbWVtYmVyc1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXk8UHl0aG9uQmFzZT4oKTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBsaXN0XSBvZiBPYmplY3QuZW50cmllcyhtYXApKSB7XG4gICAgbGV0IG1lbWJlcjtcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gaWYgd2UgaGF2ZSBhIHNpbmdsZSBtZW1iZXIgZm9yIHRoaXMgbm9ybWFsaXplZCBuYW1lLCB0aGVuIHVzZSBpdFxuICAgICAgbWVtYmVyID0gbGlzdFswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gd2UgZm91bmQgbW9yZSB0aGFuIG9uZSBtZW1iZXIgd2l0aCB0aGUgc2FtZSBweXRob24gbmFtZSwgZmlsdGVyIGFsbFxuICAgICAgLy8gZGVwcmVjYXRlZCB2ZXJzaW9ucyBhbmQgY2hlY2sgdGhhdCB3ZSBhcmUgbGVmdCB3aXRoIGV4YWN0bHkgb25lLlxuICAgICAgLy8gb3RoZXJ3aXNlLCB0aGV5IHdpbGwgb3ZlcndyaXRlIGVhY2ggb3RoZXJcbiAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvaXNzdWVzLzI1MDhcbiAgICAgIGNvbnN0IG5vbkRlcHJlY2F0ZWQgPSBsaXN0LmZpbHRlcigoeCkgPT4gIWlzRGVwcmVjYXRlZCh4KSk7XG4gICAgICBpZiAobm9uRGVwcmVjYXRlZC5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTXVsdGlwbGUgbm9uLWRlcHJlY2F0ZWQgbWVtYmVycyB3aGljaCBtYXAgdG8gdGhlIFB5dGhvbiBuYW1lIFwiJHtuYW1lfVwiYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vbkRlcHJlY2F0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTXVsdGlwbGUgbWVtYmVycyB3aGljaCBtYXAgdG8gdGhlIFB5dGhvbiBuYW1lIFwiJHtuYW1lfVwiLCBidXQgYWxsIG9mIHRoZW0gYXJlIGRlcHJlY2F0ZWRgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBtZW1iZXIgPSBub25EZXByZWNhdGVkWzBdO1xuICAgIH1cblxuICAgIHJldC5wdXNoKG1lbWJlcik7XG4gIH1cblxuICByZXR1cm4gc29ydE1lbWJlcnMocmV0LCByZXNvbHZlcik7XG59XG5cbmNvbnN0IHNvcnRNZW1iZXJzID0gKFxuICBtZW1iZXJzOiBQeXRob25CYXNlW10sXG4gIHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIsXG4pOiBQeXRob25CYXNlW10gPT4ge1xuICBsZXQgc29ydGFibGUgPSBuZXcgQXJyYXk8e1xuICAgIG1lbWJlcjogUHl0aG9uQmFzZSAmIElTb3J0YWJsZVR5cGU7XG4gICAgZGVwZW5kc09uOiBTZXQ8UHl0aG9uVHlwZT47XG4gIH0+KCk7XG4gIGNvbnN0IHNvcnRlZCA9IG5ldyBBcnJheTxQeXRob25CYXNlPigpO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxQeXRob25CYXNlPigpO1xuXG4gIC8vIFRoZSBmaXJzdCB0aGluZyB3ZSB3YW50IHRvIGRvLCBpcyBwdXNoIGFueSBpdGVtIHdoaWNoIGlzIG5vdCBzb3J0YWJsZSB0byB0aGUgdmVyeVxuICAvLyBmcm9udCBvZiB0aGUgbGlzdC4gVGhpcyB3aWxsIGJlIHRoaW5ncyBsaWtlIG1ldGhvZHMsIHByb3BlcnRpZXMsIGV0Yy5cbiAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycykge1xuICAgIGlmICghaXNTb3J0YWJsZVR5cGUobWVtYmVyKSkge1xuICAgICAgc29ydGVkLnB1c2gobWVtYmVyKTtcbiAgICAgIHNlZW4uYWRkKG1lbWJlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvcnRhYmxlLnB1c2goeyBtZW1iZXIsIGRlcGVuZHNPbjogbmV3IFNldChtZW1iZXIuZGVwZW5kc09uKHJlc29sdmVyKSkgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTm93IHRoYXQgd2UndmUgcHVsbGVkIG91dCBldmVyeXRoaW5nIHRoYXQgY291bGRuJ3QgcG9zc2libHkgaGF2ZSBkZXBlbmRlbmNpZXMsXG4gIC8vIHdlIHdpbGwgZ28gdGhyb3VnaCB0aGUgcmVtYWluaW5nIGl0ZW1zLCBhbmQgcHVsbCBvZmYgYW55IGl0ZW1zIHdoaWNoIGhhdmUgbm9cbiAgLy8gZGVwZW5kZW5jaWVzIHRoYXQgd2UgaGF2ZW4ndCBhbHJlYWR5IHNvcnRlZC5cbiAgd2hpbGUgKHNvcnRhYmxlLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHsgbWVtYmVyLCBkZXBlbmRzT24gfSBvZiBzb3J0YWJsZSkge1xuICAgICAgY29uc3QgZGlmZiA9IHNldERpZmZlcmVuY2UoZGVwZW5kc09uLCBzZWVuKTtcbiAgICAgIGlmIChbLi4uZGlmZl0uZmluZCgoZGVwKSA9PiAhKGRlcCBpbnN0YW5jZW9mIFB5dGhvbk1vZHVsZSkpID09IG51bGwpIHtcbiAgICAgICAgc29ydGVkLnB1c2gobWVtYmVyKTtcbiAgICAgICAgc2Vlbi5hZGQobWVtYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsZWZ0b3ZlciA9IHNvcnRhYmxlLmZpbHRlcigoeyBtZW1iZXIgfSkgPT4gIXNlZW4uaGFzKG1lbWJlcikpO1xuICAgIGlmIChsZWZ0b3Zlci5sZW5ndGggPT09IHNvcnRhYmxlLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHNvcnQgbWVtYmVycyAoY2lyY3VsYXIgZGVwZW5kZW5jeT8pLiBMZWZ0b3ZlcjogJHtsZWZ0b3ZlclxuICAgICAgICAgIC5tYXAoKGxvKSA9PiBsby5tZW1iZXIucHl0aG9uTmFtZSlcbiAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc29ydGFibGUgPSBsZWZ0b3ZlcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc29ydGVkO1xufTtcblxuaW50ZXJmYWNlIFB5dGhvbkJhc2Uge1xuICByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvY3M/OiBzcGVjLkRvY3M7XG5cbiAgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0LCBvcHRzPzogYW55KTogdm9pZDtcblxuICByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzO1xufVxuXG5pbnRlcmZhY2UgUHl0aG9uVHlwZSBleHRlbmRzIFB5dGhvbkJhc2Uge1xuICAvLyBUaGUgSlNJSSBGUU4gZm9yIHRoaXMgaXRlbSwgaWYgdGhpcyBpdGVtIGRvZXNuJ3QgZXhpc3QgYXMgYSBKU0lJIHR5cGUsIHRoZW4gaXRcbiAgLy8gZG9lc24ndCBoYXZlIGEgRlFOIGFuZCBpdCBzaG91bGQgYmUgbnVsbDtcbiAgcmVhZG9ubHkgZnFuPzogc3RyaW5nO1xuXG4gIGFkZE1lbWJlcihtZW1iZXI6IFB5dGhvbkJhc2UpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVNvcnRhYmxlVHlwZSB7XG4gIGRlcGVuZHNPbihyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogUHl0aG9uVHlwZVtdO1xufVxuXG5mdW5jdGlvbiBpc1NvcnRhYmxlVHlwZShhcmc6IHVua25vd24pOiBhcmcgaXMgSVNvcnRhYmxlVHlwZSB7XG4gIHJldHVybiAoYXJnIGFzIFBhcnRpYWw8SVNvcnRhYmxlVHlwZT4pLmRlcGVuZHNPbiAhPT0gdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgUHl0aG9uVHlwZU9wdHMge1xuICBiYXNlcz86IHNwZWMuVHlwZVJlZmVyZW5jZVtdO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIGltcGxlbWVudHMgUHl0aG9uVHlwZSwgSVNvcnRhYmxlVHlwZSB7XG4gIHByb3RlY3RlZCBiYXNlczogc3BlYy5UeXBlUmVmZXJlbmNlW107XG4gIHByb3RlY3RlZCBtZW1iZXJzOiBQeXRob25CYXNlW107XG4gIHByb3RlY3RlZCByZWFkb25seSBzZXBhcmF0ZU1lbWJlcnM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3BlYzogc3BlYy5UeXBlLFxuICAgIHB1YmxpYyByZWFkb25seSBmcW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiBQeXRob25UeXBlT3B0cyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBjb25zdCB7IGJhc2VzID0gW10gfSA9IG9wdHM7XG5cbiAgICB0aGlzLmJhc2VzID0gYmFzZXM7XG4gICAgdGhpcy5tZW1iZXJzID0gW107XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kc09uKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBQeXRob25UeXBlW10ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IG5ldyBBcnJheTxQeXRob25UeXBlPigpO1xuICAgIGNvbnN0IHBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudCh0aGlzLmZxbiEpO1xuXG4gICAgLy8gV2UgbmVlZCB0byByZXR1cm4gYW55IGJhc2VzIHRoYXQgYXJlIGluIHRoZSBzYW1lIG1vZHVsZSBhdCB0aGUgc2FtZSBsZXZlbCBvZlxuICAgIC8vIG5lc3RpbmcuXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgYmFzZSBvZiB0aGlzLmJhc2VzKSB7XG4gICAgICBpZiAoc3BlYy5pc05hbWVkVHlwZVJlZmVyZW5jZShiYXNlKSkge1xuICAgICAgICBpZiAocmVzb2x2ZXIuaXNJbk1vZHVsZShiYXNlKSkge1xuICAgICAgICAgIC8vIEdpdmVuIGEgYmFzZSwgd2UgbmVlZCB0byBsb2NhdGUgdGhlIGJhc2UncyBwYXJlbnQgdGhhdCBpcyB0aGUgc2FtZSBhc1xuICAgICAgICAgIC8vIG91ciBwYXJlbnQsIGJlY2F1c2Ugd2Ugb25seSBjYXJlIGFib3V0IGRlcGVuZGVuY2llcyB0aGF0IGFyZSBhdCB0aGVcbiAgICAgICAgICAvLyBzYW1lIGxldmVsIG9mIG91ciBvd24uXG4gICAgICAgICAgLy8gVE9ETzogV2UgbWlnaHQgbmVlZCB0byByZWN1cnNlIGludG8gb3VyIG1lbWJlcnMgdG8gYWxzbyBmaW5kIHRoZWlyXG4gICAgICAgICAgLy8gICAgICAgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgIGxldCBiYXNlSXRlbSA9IHJlc29sdmVyLmdldFR5cGUoYmFzZSk7XG4gICAgICAgICAgbGV0IGJhc2VQYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQoYmFzZSk7XG4gICAgICAgICAgd2hpbGUgKGJhc2VQYXJlbnQgIT09IHBhcmVudCkge1xuICAgICAgICAgICAgYmFzZUl0ZW0gPSBiYXNlUGFyZW50O1xuICAgICAgICAgICAgYmFzZVBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudChiYXNlSXRlbS5mcW4hKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXNlZW4uaGFzKGJhc2VJdGVtLmZxbiEpKSB7XG4gICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChiYXNlSXRlbSk7XG4gICAgICAgICAgICBzZWVuLmFkZChiYXNlSXRlbS5mcW4hKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBtZXJnZVB5dGhvbkltcG9ydHMoXG4gICAgICAuLi50aGlzLmJhc2VzLm1hcCgoYmFzZSkgPT4gdG9UeXBlTmFtZShiYXNlKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCkpLFxuICAgICAgLi4udGhpcy5tZW1iZXJzLm1hcCgobWVtKSA9PiBtZW0ucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFkZE1lbWJlcihtZW1iZXI6IFB5dGhvbkJhc2UpIHtcbiAgICB0aGlzLm1lbWJlcnMucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcHVibGljIGdldCBhcGlMb2NhdGlvbigpOiBBcGlMb2NhdGlvbiB7XG4gICAgaWYgKCF0aGlzLmZxbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IG1ha2UgYXBpTG9jYXRpb24gZm9yICR7dGhpcy5weXRob25OYW1lfSwgZG9lcyBub3QgaGF2ZSBGUU5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYXBpOiAndHlwZScsIGZxbjogdGhpcy5mcW4gfTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG5cbiAgICBjb25zdCBjbGFzc1BhcmFtcyA9IHRoaXMuZ2V0Q2xhc3NQYXJhbXMoY29udGV4dCk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnB5dGhvbk5hbWUsIGNsYXNzUGFyYW1zKTtcblxuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgY2xhc3MtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICAgIHRyYWlsaW5nTmV3TGluZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmJvdW5kUmVzb2x2ZXIoY29udGV4dC5yZXNvbHZlcik7XG4gICAgICBsZXQgc2hvdWxkU2VwYXJhdGUgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIHByZXBhcmVNZW1iZXJzKHRoaXMubWVtYmVycywgcmVzb2x2ZXIpKSB7XG4gICAgICAgIGlmIChzaG91bGRTZXBhcmF0ZSkge1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICB9XG4gICAgICAgIHNob3VsZFNlcGFyYXRlID0gdGhpcy5zZXBhcmF0ZU1lbWJlcnM7XG4gICAgICAgIG1lbWJlci5lbWl0KGNvZGUsIHsgLi4uY29udGV4dCwgcmVzb2x2ZXIgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgncGFzcycpO1xuICAgIH1cblxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgaWYgKHRoaXMuZnFuICE9IG51bGwpIHtcbiAgICAgIGNvbnRleHQuZW1pdHRlZFR5cGVzLmFkZCh0aGlzLmZxbik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJvdW5kUmVzb2x2ZXIocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFR5cGVSZXNvbHZlciB7XG4gICAgaWYgKHRoaXMuZnFuID09IG51bGwpIHtcbiAgICAgIHJldHVybiByZXNvbHZlcjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVyLmJpbmQodGhpcy5mcW4pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldENsYXNzUGFyYW1zKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBCYXNlTWV0aG9kT3B0cyB7XG4gIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgbGlmdGVkUHJvcD86IHNwZWMuSW50ZXJmYWNlVHlwZTtcbiAgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcbn1cblxuaW50ZXJmYWNlIEJhc2VNZXRob2RFbWl0T3B0cyB7XG4gIHJlbmRlckFic3RyYWN0PzogYm9vbGVhbjtcbiAgZm9yY2VFbWl0Qm9keT86IGJvb2xlYW47XG59XG5cbmFic3RyYWN0IGNsYXNzIEJhc2VNZXRob2QgaW1wbGVtZW50cyBQeXRob25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFic3RyYWN0OiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZCE6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcj86IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsYXNzQXNGaXJzdFBhcmFtZXRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmV0dXJuRnJvbUpTSUlNZXRob2Q6IGJvb2xlYW4gPSB0cnVlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbGlmdGVkUHJvcD86IHNwZWMuSW50ZXJmYWNlVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGpzTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyYW1ldGVyczogc3BlYy5QYXJhbWV0ZXJbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJldHVybnM6IHNwZWMuT3B0aW9uYWxWYWx1ZSB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBpc1N0YXRpYzogYm9vbGVhbixcbiAgICBvcHRzOiBCYXNlTWV0aG9kT3B0cyxcbiAgKSB7XG4gICAgdGhpcy5hYnN0cmFjdCA9ICEhb3B0cy5hYnN0cmFjdDtcbiAgICB0aGlzLmxpZnRlZFByb3AgPSBvcHRzLmxpZnRlZFByb3A7XG4gICAgdGhpcy5wYXJlbnQgPSBvcHRzLnBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBhcGk6ICdtZW1iZXInLFxuICAgICAgZnFuOiB0aGlzLnBhcmVudC5mcW4sXG4gICAgICBtZW1iZXJOYW1lOiB0aGlzLmpzTmFtZSA/PyAnJyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBtZXJnZVB5dGhvbkltcG9ydHMoXG4gICAgICB0b1R5cGVOYW1lKHRoaXMucmV0dXJucykucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLFxuICAgICAgLi4udGhpcy5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+XG4gICAgICAgIHRvVHlwZU5hbWUocGFyYW0pLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgICksXG4gICAgICAuLi5saWZ0ZWRQcm9wZXJ0aWVzKHRoaXMubGlmdGVkUHJvcCksXG4gICAgKTtcblxuICAgIGZ1bmN0aW9uKiBsaWZ0ZWRQcm9wZXJ0aWVzKFxuICAgICAgc3RydWN0OiBzcGVjLkludGVyZmFjZVR5cGUgfCB1bmRlZmluZWQsXG4gICAgKTogSXRlcmFibGVJdGVyYXRvcjxQeXRob25JbXBvcnRzPiB7XG4gICAgICBpZiAoc3RydWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHN0cnVjdC5wcm9wZXJ0aWVzID8/IFtdKSB7XG4gICAgICAgIHlpZWxkIHRvVHlwZU5hbWUocHJvcC50eXBlKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGJhc2Ugb2Ygc3RydWN0LmludGVyZmFjZXMgPz8gW10pIHtcbiAgICAgICAgY29uc3QgaWZhY2UgPSBjb250ZXh0LnJlc29sdmVyLmRlcmVmZXJlbmNlKGJhc2UpIGFzIHNwZWMuSW50ZXJmYWNlVHlwZTtcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRzIG9mIGxpZnRlZFByb3BlcnRpZXMoaWZhY2UpKSB7XG4gICAgICAgICAgeWllbGQgaW1wb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlbWl0KFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICBvcHRzPzogQmFzZU1ldGhvZEVtaXRPcHRzLFxuICApIHtcbiAgICBjb25zdCB7IHJlbmRlckFic3RyYWN0ID0gdHJ1ZSwgZm9yY2VFbWl0Qm9keSA9IGZhbHNlIH0gPSBvcHRzID8/IHt9O1xuXG4gICAgY29uc3QgcmV0dXJuVHlwZTogc3RyaW5nID0gdG9UeXBlTmFtZSh0aGlzLnJldHVybnMpLnB5dGhvblR5cGUoY29udGV4dCk7XG5cbiAgICAvLyBXZSBjYW5ub3QgKGN1cnJlbnRseT8pIGJsaW5kbHkgdXNlIHRoZSBuYW1lcyBnaXZlbiB0byB1cyBieSB0aGUgSlNJSSBmb3JcbiAgICAvLyBpbml0aWFsaXplcnMsIGJlY2F1c2Ugb3VyIGtleXdvcmQgbGlmdGluZyB3aWxsIGFsbG93IHR3byBuYW1lcyB0byBjbGFzaC5cbiAgICAvLyBUaGlzIGNhbiBob3BlZnVsbHkgYmUgcmVtb3ZlZCBvbmNlIHdlIGdldCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2pzaWkvaXNzdWVzLzI4OFxuICAgIC8vIHJlc29sdmVkLCBzbyBidWlsZCB1cCBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBwcm9wIG5hbWVzIHNvIHdlIGNhbiBjaGVjayBhZ2FpbnN0XG4gICAgLy8gdGhlbSBsYXRlci5cbiAgICBjb25zdCBsaWZ0ZWRQcm9wTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBpZiAodGhpcy5saWZ0ZWRQcm9wPy5wcm9wZXJ0aWVzICE9IG51bGwpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiB0aGlzLmxpZnRlZFByb3AucHJvcGVydGllcykge1xuICAgICAgICBsaWZ0ZWRQcm9wTmFtZXMuYWRkKHRvUHl0aG9uUGFyYW1ldGVyTmFtZShwcm9wLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBuZWVkIHRvIHR1cm4gYSBsaXN0IG9mIEpTSUkgcGFyYW1ldGVycywgaW50byBQeXRob24gc3R5bGUgYXJndW1lbnRzIHdpdGhcbiAgICAvLyBncmFkdWFsIHR5cGluZywgc28gd2UnbGwgaGF2ZSB0byBpdGVyYXRlIG92ZXIgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycywgYW5kXG4gICAgLy8gYnVpbGQgdGhlIGxpc3QsIGNvbnZlcnRpbmcgYXMgd2UgZ28uXG4gICAgY29uc3QgcHl0aG9uUGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgdGhpcy5wYXJhbWV0ZXJzKSB7XG4gICAgICAvLyBXZSBjYW5ub3QgKGN1cnJlbnRseT8pIGJsaW5kbHkgdXNlIHRoZSBuYW1lcyBnaXZlbiB0byB1cyBieSB0aGUgSlNJSSBmb3JcbiAgICAgIC8vIGluaXRpYWxpemVycywgYmVjYXVzZSBvdXIga2V5d29yZCBsaWZ0aW5nIHdpbGwgYWxsb3cgdHdvIG5hbWVzIHRvIGNsYXNoLlxuICAgICAgLy8gVGhpcyBjYW4gaG9wZWZ1bGx5IGJlIHJlbW92ZWQgb25jZSB3ZSBnZXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yODhcbiAgICAgIC8vIHJlc29sdmVkLlxuICAgICAgY29uc3QgcGFyYW1OYW1lOiBzdHJpbmcgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUoXG4gICAgICAgIHBhcmFtLm5hbWUsXG4gICAgICAgIGxpZnRlZFByb3BOYW1lcyxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRvVHlwZU5hbWUocGFyYW0pLnB5dGhvblR5cGUoe1xuICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICBwYXJhbWV0ZXJUeXBlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwYXJhbURlZmF1bHQgPSBwYXJhbS5vcHRpb25hbCA/ICcgPSBOb25lJyA6ICcnO1xuXG4gICAgICBweXRob25QYXJhbXMucHVzaChgJHtwYXJhbU5hbWV9OiAke3BhcmFtVHlwZX0ke3BhcmFtRGVmYXVsdH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkb2N1bWVudGFibGVBcmdzOiBEb2N1bWVudGFibGVBcmd1bWVudFtdID0gdGhpcy5wYXJhbWV0ZXJzXG4gICAgICAubWFwKFxuICAgICAgICAocCkgPT5cbiAgICAgICAgICAoe1xuICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgICAgZG9jczogcC5kb2NzLFxuICAgICAgICAgICAgZGVmaW5pbmdUeXBlOiB0aGlzLnBhcmVudCxcbiAgICAgICAgICB9IGFzIERvY3VtZW50YWJsZUFyZ3VtZW50KSxcbiAgICAgIClcbiAgICAgIC8vIElmIHRoZXJlJ3MgbGlmdGVkUHJvcHMsIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZSBzdHJ1Y3QgYW5kIGl0IHdvbid0IGJlIF9hY3R1YWxseV8gZW1pdHRlZC5cbiAgICAgIC5maWx0ZXIoKF8sIGluZGV4KSA9PlxuICAgICAgICB0aGlzLmxpZnRlZFByb3AgIT0gbnVsbCA/IGluZGV4IDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCAtIDEgOiB0cnVlLFxuICAgICAgKVxuICAgICAgLm1hcCgocGFyYW0pID0+ICh7XG4gICAgICAgIC4uLnBhcmFtLFxuICAgICAgICBuYW1lOiB0b1B5dGhvblBhcmFtZXRlck5hbWUocGFyYW0ubmFtZSwgbGlmdGVkUHJvcE5hbWVzKSxcbiAgICAgIH0pKTtcblxuICAgIC8vIElmIHdlIGhhdmUgYSBsaWZ0ZWQgcGFyYW1ldGVyLCB0aGVuIHdlJ2xsIGRyb3AgdGhlIGxhc3QgYXJndW1lbnQgdG8gb3VyIHBhcmFtc1xuICAgIC8vIGFuZCB0aGVuIHdlJ2xsIGxpZnQgYWxsIG9mIHRoZSBwYXJhbXMgb2YgdGhlIGxpZnRlZCB0eXBlIGFzIGtleXdvcmQgYXJndW1lbnRzXG4gICAgLy8gdG8gdGhlIGZ1bmN0aW9uLlxuICAgIGlmICh0aGlzLmxpZnRlZFByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVtb3ZlIG91ciBsYXN0IGl0ZW0uXG4gICAgICBweXRob25QYXJhbXMucG9wKCk7XG4gICAgICBjb25zdCBsaWZ0ZWRQcm9wZXJ0aWVzID0gdGhpcy5nZXRMaWZ0ZWRQcm9wZXJ0aWVzKGNvbnRleHQucmVzb2x2ZXIpO1xuXG4gICAgICBpZiAobGlmdGVkUHJvcGVydGllcy5sZW5ndGggPj0gMSkge1xuICAgICAgICAvLyBBbGwgb2YgdGhlc2UgcGFyYW1ldGVycyBhcmUga2V5d29yZCBvbmx5IGFyZ3VtZW50cywgc28gd2UnbGwgbWFyayB0aGVtXG4gICAgICAgIC8vIGFzIHN1Y2guXG4gICAgICAgIHB5dGhvblBhcmFtcy5wdXNoKCcqJyk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvZiBvdXIgcHJvcHMsIGFuZCByZWZsZWN0IHRoZW0gaW50byBvdXIgcGFyYW1zLlxuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgbGlmdGVkUHJvcGVydGllcykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShwcm9wLnByb3AubmFtZSk7XG4gICAgICAgICAgY29uc3QgcGFyYW1UeXBlID0gdG9UeXBlTmFtZShwcm9wLnByb3ApLnB5dGhvblR5cGUoe1xuICAgICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICAgIHBhcmFtZXRlclR5cGU6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcGFyYW1EZWZhdWx0ID0gcHJvcC5wcm9wLm9wdGlvbmFsID8gJyA9IE5vbmUnIDogJyc7XG5cbiAgICAgICAgICBweXRob25QYXJhbXMucHVzaChgJHtwYXJhbU5hbWV9OiAke3BhcmFtVHlwZX0ke3BhcmFtRGVmYXVsdH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEb2N1bWVudCB0aGVtIGFzIGtleXdvcmQgYXJndW1lbnRzXG4gICAgICBkb2N1bWVudGFibGVBcmdzLnB1c2goXG4gICAgICAgIC4uLmxpZnRlZFByb3BlcnRpZXMubWFwKFxuICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgbmFtZTogcC5wcm9wLm5hbWUsXG4gICAgICAgICAgICAgIGRvY3M6IHAucHJvcC5kb2NzLFxuICAgICAgICAgICAgICBkZWZpbmluZ1R5cGU6IHAuZGVmaW5pbmdUeXBlLFxuICAgICAgICAgICAgfSBhcyBEb2N1bWVudGFibGVBcmd1bWVudCksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoID49IDEgJiZcbiAgICAgIHRoaXMucGFyYW1ldGVyc1t0aGlzLnBhcmFtZXRlcnMubGVuZ3RoIC0gMV0udmFyaWFkaWNcbiAgICApIHtcbiAgICAgIC8vIEFub3RoZXIgc2l0dWF0aW9uIHdlIGNvdWxkIGJlIGluLCBpcyB0aGF0IGluc3RlYWQgb2YgaGF2aW5nIGEgcGxhaW4gcGFyYW1ldGVyXG4gICAgICAvLyB3ZSBoYXZlIGEgdmFyaWFkaWMgcGFyYW1ldGVyIHdoZXJlIHdlIG5lZWQgdG8gZXhwYW5kIHRoZSBsYXN0IHBhcmFtZXRlciBhcyBhXG4gICAgICAvLyAqYXJncy5cbiAgICAgIHB5dGhvblBhcmFtcy5wb3AoKTtcblxuICAgICAgY29uc3QgbGFzdFBhcmFtZXRlciA9IHRoaXMucGFyYW1ldGVycy5zbGljZSgtMSlbMF07XG4gICAgICBjb25zdCBwYXJhbU5hbWUgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUobGFzdFBhcmFtZXRlci5uYW1lKTtcbiAgICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRvVHlwZU5hbWUobGFzdFBhcmFtZXRlci50eXBlKS5weXRob25UeXBlKGNvbnRleHQpO1xuXG4gICAgICBweXRob25QYXJhbXMucHVzaChgKiR7cGFyYW1OYW1lfTogJHtwYXJhbVR5cGV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjb3JhdG9ycyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBpZiAodGhpcy5qc05hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIG5lZWRlZCBiZWNhdXNlIG15cHkgZG9lcyBub3Qga25vdyBob3cgdG8gY2hlY2sgZGVjb3JhdGVkIGRlY2xhcmF0aW9uc1xuICAgICAgZGVjb3JhdG9ycy5wdXNoKGBAanNpaS5tZW1iZXIoanNpaV9uYW1lPVwiJHt0aGlzLmpzTmFtZX1cIilgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZWNvcmF0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVjb3JhdG9ycy5wdXNoKGBAJHt0aGlzLmRlY29yYXRvcn1gKTtcbiAgICB9XG5cbiAgICBpZiAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdCkge1xuICAgICAgZGVjb3JhdG9ycy5wdXNoKCdAYWJjLmFic3RyYWN0bWV0aG9kJyk7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIG5lZWRlZCBiZWNhdXNlIG15cHkgZG9lcyBub3Qga25vdyBob3cgdG8gY2hlY2sgZGVjb3JhdGVkIGRlY2xhcmF0aW9uc1xuICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9yc1xuICAgICAgICAuam9pbignICMgdHlwZTogaWdub3JlW21pc2NdXFxuJylcbiAgICAgICAgLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICBjb2RlLmxpbmUoZGVjb3JhdG9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBweXRob25QYXJhbXMudW5zaGlmdChcbiAgICAgIHNsdWdpZnlBc05lZWRlZChcbiAgICAgICAgdGhpcy5pbXBsaWNpdFBhcmFtZXRlcixcbiAgICAgICAgcHl0aG9uUGFyYW1zLm1hcCgocGFyYW0pID0+IHBhcmFtLnNwbGl0KCc6JylbMF0udHJpbSgpKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIG9wZW5TaWduYXR1cmUoXG4gICAgICBjb2RlLFxuICAgICAgJ2RlZicsXG4gICAgICB0aGlzLnB5dGhvbk5hbWUsXG4gICAgICBweXRob25QYXJhbXMsXG4gICAgICBmYWxzZSxcbiAgICAgIHJldHVyblR5cGUsXG4gICAgKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgYXJndW1lbnRzOiBkb2N1bWVudGFibGVBcmdzLFxuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYG1ldGhvZC0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICAgIHRoaXMuZW1pdEJvZHkoXG4gICAgICBjb2RlLFxuICAgICAgY29udGV4dCxcbiAgICAgIHJlbmRlckFic3RyYWN0LFxuICAgICAgZm9yY2VFbWl0Qm9keSxcbiAgICAgIGxpZnRlZFByb3BOYW1lcyxcbiAgICAgIHB5dGhvblBhcmFtc1swXSxcbiAgICAgIHJldHVyblR5cGUsXG4gICAgKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEJvZHkoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIHJlbmRlckFic3RyYWN0OiBib29sZWFuLFxuICAgIGZvcmNlRW1pdEJvZHk6IGJvb2xlYW4sXG4gICAgbGlmdGVkUHJvcE5hbWVzOiBTZXQ8c3RyaW5nPixcbiAgICBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nLFxuICAgIHJldHVyblR5cGU6IHN0cmluZyxcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgKCF0aGlzLnNob3VsZEVtaXRCb2R5ICYmICFmb3JjZUVtaXRCb2R5KSB8fFxuICAgICAgKHJlbmRlckFic3RyYWN0ICYmIHRoaXMuYWJzdHJhY3QpXG4gICAgKSB7XG4gICAgICBjb2RlLmxpbmUoJy4uLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5saWZ0ZWRQcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5lbWl0QXV0b1Byb3BzKGNvZGUsIGNvbnRleHQsIGxpZnRlZFByb3BOYW1lcyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdEpzaWlNZXRob2RDYWxsKFxuICAgICAgICBjb2RlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBsaWZ0ZWRQcm9wTmFtZXMsXG4gICAgICAgIGltcGxpY2l0UGFyYW1ldGVyLFxuICAgICAgICByZXR1cm5UeXBlLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRBdXRvUHJvcHMoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIGxpZnRlZFByb3BOYW1lczogU2V0PHN0cmluZz4sXG4gICkge1xuICAgIGNvbnN0IGxhc3RQYXJhbWV0ZXIgPSB0aGlzLnBhcmFtZXRlcnMuc2xpY2UoLTEpWzBdO1xuICAgIGNvbnN0IGFyZ05hbWUgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUobGFzdFBhcmFtZXRlci5uYW1lLCBsaWZ0ZWRQcm9wTmFtZXMpO1xuICAgIGNvbnN0IHR5cGVOYW1lID0gdG9UeXBlTmFtZShsYXN0UGFyYW1ldGVyLnR5cGUpLnB5dGhvblR5cGUoe1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIC8vIFdlIG5lZWQgdG8gYnVpbGQgdXAgYSBsaXN0IG9mIHByb3BlcnRpZXMsIHdoaWNoIGFyZSBtYW5kYXRvcnksIHRoZXNlIGFyZSB0aGVcbiAgICAvLyBvbmVzIHdlIHdpbGwgc3BlY2lmaXkgdG8gc3RhcnQgd2l0aCBpbiBvdXIgZGljdGlvbmFyeSBsaXRlcmFsLlxuICAgIGNvbnN0IGxpZnRlZFByb3BzID0gdGhpcy5nZXRMaWZ0ZWRQcm9wZXJ0aWVzKGNvbnRleHQucmVzb2x2ZXIpLm1hcChcbiAgICAgIChwKSA9PiBuZXcgU3RydWN0RmllbGQodGhpcy5nZW5lcmF0b3IsIHAucHJvcCwgcC5kZWZpbmluZ1R5cGUpLFxuICAgICk7XG4gICAgY29uc3QgYXNzaWdubWVudHMgPSBsaWZ0ZWRQcm9wc1xuICAgICAgLm1hcCgocCkgPT4gcC5weXRob25OYW1lKVxuICAgICAgLm1hcCgodikgPT4gYCR7dn09JHt2fWApO1xuXG4gICAgYXNzaWduQ2FsbFJlc3VsdChjb2RlLCBhcmdOYW1lLCB0eXBlTmFtZSwgYXNzaWdubWVudHMpO1xuICAgIGNvZGUubGluZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0SnNpaU1ldGhvZENhbGwoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIGxpZnRlZFByb3BOYW1lczogU2V0PHN0cmluZz4sXG4gICAgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyxcbiAgICByZXR1cm5UeXBlOiBzdHJpbmcsXG4gICkge1xuICAgIGNvbnN0IG1ldGhvZFByZWZpeDogc3RyaW5nID0gdGhpcy5yZXR1cm5Gcm9tSlNJSU1ldGhvZCA/ICdyZXR1cm4gJyA6ICcnO1xuXG4gICAgY29uc3QganNpaU1ldGhvZFBhcmFtczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5jbGFzc0FzRmlyc3RQYXJhbWV0ZXIpIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyZW50IG5vdCBrbm93bi4nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzU3RhdGljKSB7XG4gICAgICAgIGpzaWlNZXRob2RQYXJhbXMucHVzaChcbiAgICAgICAgICB0b1R5cGVOYW1lKHRoaXMucGFyZW50KS5weXRob25UeXBlKHtcbiAgICAgICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVc2luZyB0aGUgZHluYW1pYyBjbGFzcyBvZiBgc2VsZmAuXG4gICAgICAgIGpzaWlNZXRob2RQYXJhbXMucHVzaChgJHtpbXBsaWNpdFBhcmFtZXRlcn0uX19jbGFzc19fYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGpzaWlNZXRob2RQYXJhbXMucHVzaChpbXBsaWNpdFBhcmFtZXRlcik7XG4gICAgaWYgKHRoaXMuanNOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGpzaWlNZXRob2RQYXJhbXMucHVzaChgXCIke3RoaXMuanNOYW1lfVwiYCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGxhc3QgYXJnIGlzIHZhcmlhZGljLCBleHBhbmQgdGhlIHR1cGxlXG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgdGhpcy5wYXJhbWV0ZXJzKSB7XG4gICAgICBsZXQgZXhwciA9IHRvUHl0aG9uUGFyYW1ldGVyTmFtZShwYXJhbS5uYW1lLCBsaWZ0ZWRQcm9wTmFtZXMpO1xuICAgICAgaWYgKHBhcmFtLnZhcmlhZGljKSB7XG4gICAgICAgIGV4cHIgPSBgKiR7ZXhwcn1gO1xuICAgICAgfVxuICAgICAgcGFyYW1zLnB1c2goZXhwcik7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBganNpaS4ke3RoaXMuanNpaU1ldGhvZH0oJHtqc2lpTWV0aG9kUGFyYW1zLmpvaW4oXG4gICAgICAnLCAnLFxuICAgICl9LCBbJHtwYXJhbXMuam9pbignLCAnKX1dKWA7XG4gICAgY29kZS5saW5lKFxuICAgICAgYCR7bWV0aG9kUHJlZml4fSR7XG4gICAgICAgIHRoaXMucmV0dXJuRnJvbUpTSUlNZXRob2QgJiYgcmV0dXJuVHlwZVxuICAgICAgICAgID8gYHR5cGluZy5jYXN0KCR7cmV0dXJuVHlwZX0sICR7dmFsdWV9KWBcbiAgICAgICAgICA6IHZhbHVlXG4gICAgICB9YCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMaWZ0ZWRQcm9wZXJ0aWVzKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBQcm9wZXJ0eURlZmluaXRpb25bXSB7XG4gICAgY29uc3QgbGlmdGVkUHJvcGVydGllczogUHJvcGVydHlEZWZpbml0aW9uW10gPSBbXTtcblxuICAgIGNvbnN0IHN0YWNrID0gW3RoaXMubGlmdGVkUHJvcF07XG4gICAgY29uc3Qga25vd25JZmFjZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBrbm93blByb3BzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChcbiAgICAgIGxldCBjdXJyZW50ID0gc3RhY2suc2hpZnQoKTtcbiAgICAgIGN1cnJlbnQgIT0gbnVsbDtcbiAgICAgIGN1cnJlbnQgPSBzdGFjay5zaGlmdCgpXG4gICAgKSB7XG4gICAgICBrbm93bklmYWNlcy5hZGQoY3VycmVudC5mcW4pO1xuXG4gICAgICAvLyBBZGQgYW55IGludGVyZmFjZXMgdGhhdCB0aGlzIGludGVyZmFjZSBkZXBlbmRzIG9uLCB0byB0aGUgbGlzdC5cbiAgICAgIGlmIChjdXJyZW50LmludGVyZmFjZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlmYWNlIG9mIGN1cnJlbnQuaW50ZXJmYWNlcykge1xuICAgICAgICAgIGlmIChrbm93bklmYWNlcy5oYXMoaWZhY2UpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhY2sucHVzaChyZXNvbHZlci5kZXJlZmVyZW5jZShpZmFjZSkgYXMgc3BlYy5JbnRlcmZhY2VUeXBlKTtcbiAgICAgICAgICBrbm93bklmYWNlcy5hZGQoaWZhY2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBpbnRlcmZhY2UgdG8gb3VyIGxpc3Qgb2YgcHJvcGVydGllcy5cbiAgICAgIGlmIChjdXJyZW50LnByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgY3VycmVudC5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgaWYgKGtub3duUHJvcHMuaGFzKHByb3AubmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsaWZ0ZWRQcm9wZXJ0aWVzLnB1c2goeyBwcm9wLCBkZWZpbmluZ1R5cGU6IGN1cnJlbnQgfSk7XG4gICAgICAgICAga25vd25Qcm9wcy5hZGQocHJvcC5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsaWZ0ZWRQcm9wZXJ0aWVzO1xuICB9XG59XG5cbmludGVyZmFjZSBCYXNlUHJvcGVydHlPcHRzIHtcbiAgYWJzdHJhY3Q/OiBib29sZWFuO1xuICBpbW11dGFibGU/OiBib29sZWFuO1xuICBpc1N0YXRpYz86IGJvb2xlYW47XG4gIHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG59XG5cbmludGVyZmFjZSBCYXNlUHJvcGVydHlFbWl0T3B0cyB7XG4gIHJlbmRlckFic3RyYWN0PzogYm9vbGVhbjtcbiAgZm9yY2VFbWl0Qm9keT86IGJvb2xlYW47XG59XG5cbmFic3RyYWN0IGNsYXNzIEJhc2VQcm9wZXJ0eSBpbXBsZW1lbnRzIFB5dGhvbkJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgYWJzdHJhY3Q6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBpc1N0YXRpYzogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgZGVjb3JhdG9yOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaUdldE1ldGhvZCE6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG91bGRFbWl0Qm9keTogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbW11dGFibGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkganNOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBzcGVjLk9wdGlvbmFsVmFsdWUsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiBCYXNlUHJvcGVydHlPcHRzLFxuICApIHtcbiAgICBjb25zdCB7IGFic3RyYWN0ID0gZmFsc2UsIGltbXV0YWJsZSA9IGZhbHNlLCBpc1N0YXRpYyA9IGZhbHNlIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5hYnN0cmFjdCA9IGFic3RyYWN0O1xuICAgIHRoaXMuaW1tdXRhYmxlID0gaW1tdXRhYmxlO1xuICAgIHRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYztcbiAgICB0aGlzLnBhcmVudCA9IG9wdHMucGFyZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBhcGlMb2NhdGlvbigpOiBBcGlMb2NhdGlvbiB7XG4gICAgcmV0dXJuIHsgYXBpOiAnbWVtYmVyJywgZnFuOiB0aGlzLnBhcmVudC5mcW4sIG1lbWJlck5hbWU6IHRoaXMuanNOYW1lIH07XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIHRvVHlwZU5hbWUodGhpcy50eXBlKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgb3B0cz86IEJhc2VQcm9wZXJ0eUVtaXRPcHRzLFxuICApIHtcbiAgICBjb25zdCB7IHJlbmRlckFic3RyYWN0ID0gdHJ1ZSwgZm9yY2VFbWl0Qm9keSA9IGZhbHNlIH0gPSBvcHRzID8/IHt9O1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPSB0b1R5cGVOYW1lKHRoaXMudHlwZSkucHl0aG9uVHlwZShjb250ZXh0KTtcblxuICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBpcyBuZWVkZWQgYmVjYXVzZSBteXB5IGNhbm5vdCBjaGVjayBkZWNvcmF0ZWQgdGhpbmdzXG4gICAgY29kZS5saW5lKGBAJHt0aGlzLmRlY29yYXRvcn0gIyB0eXBlOiBpZ25vcmVbbWlzY11gKTtcbiAgICBjb2RlLmxpbmUoYEBqc2lpLm1lbWJlcihqc2lpX25hbWU9XCIke3RoaXMuanNOYW1lfVwiKWApO1xuICAgIGlmIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KSB7XG4gICAgICBjb2RlLmxpbmUoJ0BhYmMuYWJzdHJhY3RtZXRob2QnKTtcbiAgICB9XG4gICAgb3BlblNpZ25hdHVyZShcbiAgICAgIGNvZGUsXG4gICAgICAnZGVmJyxcbiAgICAgIHRoaXMucHl0aG9uTmFtZSxcbiAgICAgIFt0aGlzLmltcGxpY2l0UGFyYW1ldGVyXSxcbiAgICAgIHRydWUsXG4gICAgICBweXRob25UeXBlLFxuICAgICk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBwcm9wLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgKHRoaXMuc2hvdWxkRW1pdEJvZHkgfHwgZm9yY2VFbWl0Qm9keSkgJiZcbiAgICAgICghcmVuZGVyQWJzdHJhY3QgfHwgIXRoaXMuYWJzdHJhY3QpXG4gICAgKSB7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGByZXR1cm4gdHlwaW5nLmNhc3QoJHtweXRob25UeXBlfSwganNpaS4ke3RoaXMuanNpaUdldE1ldGhvZH0oJHt0aGlzLmltcGxpY2l0UGFyYW1ldGVyfSwgXCIke3RoaXMuanNOYW1lfVwiKSlgLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZS5saW5lKCcuLi4nKTtcbiAgICB9XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBpZiAoIXRoaXMuaW1tdXRhYmxlKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYEAke3RoaXMucHl0aG9uTmFtZX0uc2V0dGVyJHtcbiAgICAgICAgICB0aGlzLmlzU3RhdGljID8gJyAjIHR5cGU6IGlnbm9yZVtuby1yZWRlZl0nIDogJydcbiAgICAgICAgfWAsXG4gICAgICApO1xuICAgICAgaWYgKHJlbmRlckFic3RyYWN0ICYmIHRoaXMuYWJzdHJhY3QpIHtcbiAgICAgICAgY29kZS5saW5lKCdAYWJjLmFic3RyYWN0bWV0aG9kJyk7XG4gICAgICB9XG4gICAgICBvcGVuU2lnbmF0dXJlKFxuICAgICAgICBjb2RlLFxuICAgICAgICAnZGVmJyxcbiAgICAgICAgdGhpcy5weXRob25OYW1lLFxuICAgICAgICBbdGhpcy5pbXBsaWNpdFBhcmFtZXRlciwgYHZhbHVlOiAke3B5dGhvblR5cGV9YF0sXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAnTm9uZScsXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICAodGhpcy5zaG91bGRFbWl0Qm9keSB8fCBmb3JjZUVtaXRCb2R5KSAmJlxuICAgICAgICAoIXJlbmRlckFic3RyYWN0IHx8ICF0aGlzLmFic3RyYWN0KVxuICAgICAgKSB7XG4gICAgICAgIGNvZGUubGluZShcbiAgICAgICAgICBganNpaS4ke3RoaXMuanNpaVNldE1ldGhvZH0oJHt0aGlzLmltcGxpY2l0UGFyYW1ldGVyfSwgXCIke3RoaXMuanNOYW1lfVwiLCB2YWx1ZSlgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29kZS5saW5lKCcuLi4nKTtcbiAgICAgIH1cbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBJbnRlcmZhY2UgZXh0ZW5kcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIHtcbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcbiAgICBlbWl0TGlzdChjb2RlLCAnQGpzaWkuaW50ZXJmYWNlKCcsIFtganNpaV90eXBlPVwiJHt0aGlzLmZxbn1cImBdLCAnKScpO1xuXG4gICAgLy8gRmlyc3Qgd2UgZG8gb3VyIG5vcm1hbCBjbGFzcyBsb2dpYyBmb3IgZW1pdHRpbmcgb3VyIG1lbWJlcnMuXG4gICAgc3VwZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcblxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgpO1xuXG4gICAgLy8gVGhlbiwgd2UgaGF2ZSB0byBlbWl0IGEgUHJveHkgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBvdXIgcHJveHkgaW50ZXJmYWNlLlxuICAgIGNvbnN0IHByb3h5QmFzZXM6IHN0cmluZ1tdID0gdGhpcy5iYXNlcy5tYXAoXG4gICAgICAoYikgPT5cbiAgICAgICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIGJlY2F1c2UgTXlQeSBjYW5ub3QgY2hlY2sgZHluYW1pYyBiYXNlIGNsYXNzZXMgKG5hdHVyYWxseSlcbiAgICAgICAgYGpzaWkucHJveHlfZm9yKCR7dG9UeXBlTmFtZShiKS5weXRob25UeXBlKHtcbiAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgICAgfSl9KSAjIHR5cGU6IGlnbm9yZVttaXNjXWAsXG4gICAgKTtcbiAgICBvcGVuU2lnbmF0dXJlKGNvZGUsICdjbGFzcycsIHRoaXMucHJveHlDbGFzc05hbWUsIHByb3h5QmFzZXMpO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgY2xhc3MtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICAgIHRyYWlsaW5nTmV3TGluZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb2RlLmxpbmUoYF9fanNpaV90eXBlX186IHR5cGluZy5DbGFzc1ZhcltzdHJdID0gXCIke3RoaXMuZnFufVwiYCk7XG5cbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIHRoaXMubWVtYmVycykge1xuICAgICAgICBpZiAodGhpcy5zZXBhcmF0ZU1lbWJlcnMpIHtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBtZW1iZXIuZW1pdChjb2RlLCBjb250ZXh0LCB7IGZvcmNlRW1pdEJvZHk6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgncGFzcycpO1xuICAgIH1cblxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZShcbiAgICAgICcjIEFkZGluZyBhIFwiX19qc2lpX3Byb3h5X2NsYXNzX18oKTogdHlwaW5nLlR5cGVcIiBmdW5jdGlvbiB0byB0aGUgaW50ZXJmYWNlJyxcbiAgICApO1xuICAgIGNvZGUubGluZShcbiAgICAgIGB0eXBpbmcuY2FzdCh0eXBpbmcuQW55LCAke3RoaXMucHl0aG9uTmFtZX0pLl9fanNpaV9wcm94eV9jbGFzc19fID0gbGFtYmRhIDogJHt0aGlzLnByb3h5Q2xhc3NOYW1lfWAsXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmZxbiAhPSBudWxsKSB7XG4gICAgICBjb250ZXh0LmVtaXR0ZWRUeXBlcy5hZGQodGhpcy5mcW4pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gdGhpcy5iYXNlcy5tYXAoKGIpID0+XG4gICAgICB0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoeyAuLi5jb250ZXh0LCB0eXBlQW5ub3RhdGlvbjogZmFsc2UgfSksXG4gICAgKTtcblxuICAgIHBhcmFtcy5wdXNoKCd0eXBpbmdfZXh0ZW5zaW9ucy5Qcm90b2NvbCcpO1xuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHByb3h5Q2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBfJHt0aGlzLnB5dGhvbk5hbWV9UHJveHlgO1xuICB9XG59XG5cbmNsYXNzIEludGVyZmFjZU1ldGhvZCBleHRlbmRzIEJhc2VNZXRob2Qge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdzZWxmJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2Q6IHN0cmluZyA9ICdpbnZva2UnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgSW50ZXJmYWNlUHJvcGVydHkgZXh0ZW5kcyBCYXNlUHJvcGVydHkge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVjb3JhdG9yOiBzdHJpbmcgPSAnYnVpbHRpbnMucHJvcGVydHknO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdzZWxmJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdnZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaVNldE1ldGhvZDogc3RyaW5nID0gJ3NldCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG91bGRFbWl0Qm9keTogYm9vbGVhbiA9IGZhbHNlO1xufVxuXG5jbGFzcyBTdHJ1Y3QgZXh0ZW5kcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIHtcbiAgcHJvdGVjdGVkIGRpcmVjdE1lbWJlcnMgPSBuZXcgQXJyYXk8U3RydWN0RmllbGQ+KCk7XG5cbiAgcHVibGljIGFkZE1lbWJlcihtZW1iZXI6IFB5dGhvbkJhc2UpOiB2b2lkIHtcbiAgICBpZiAoIShtZW1iZXIgaW5zdGFuY2VvZiBTdHJ1Y3RGaWVsZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBhZGQgU3RydWN0RmllbGQgdG8gU3RydWN0Jyk7XG4gICAgfVxuICAgIHRoaXMuZGlyZWN0TWVtYmVycy5wdXNoKG1lbWJlcik7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29udGV4dCA9IG5lc3RlZENvbnRleHQoY29udGV4dCwgdGhpcy5mcW4pO1xuICAgIGNvbnN0IGJhc2VJbnRlcmZhY2VzID0gdGhpcy5nZXRDbGFzc1BhcmFtcyhjb250ZXh0KTtcblxuICAgIGNvZGUuaW5kZW50KCdAanNpaS5kYXRhX3R5cGUoJyk7XG4gICAgY29kZS5saW5lKGBqc2lpX3R5cGU9JHtKU09OLnN0cmluZ2lmeSh0aGlzLmZxbil9LGApO1xuICAgIGVtaXRMaXN0KGNvZGUsICdqc2lpX3N0cnVjdF9iYXNlcz1bJywgYmFzZUludGVyZmFjZXMsICddLCcpO1xuICAgIGFzc2lnbkRpY3Rpb25hcnkoY29kZSwgJ25hbWVfbWFwcGluZycsIHRoaXMucHJvcGVydHlNYXAoKSwgJywnLCB0cnVlKTtcbiAgICBjb2RlLnVuaW5kZW50KCcpJyk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnB5dGhvbk5hbWUsIGJhc2VJbnRlcmZhY2VzKTtcbiAgICB0aGlzLmVtaXRDb25zdHJ1Y3Rvcihjb2RlLCBjb250ZXh0KTtcblxuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIHRoaXMuYWxsTWVtYmVycykge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICB0aGlzLmVtaXRHZXR0ZXIobWVtYmVyLCBjb2RlLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXRNYWdpY01ldGhvZHMoY29kZSk7XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGlmICh0aGlzLmZxbiAhPSBudWxsKSB7XG4gICAgICBjb250ZXh0LmVtaXR0ZWRUeXBlcy5hZGQodGhpcy5mcW4pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgc3VwZXIucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLFxuICAgICAgLi4udGhpcy5hbGxNZW1iZXJzLm1hcCgobWVtKSA9PiBtZW0ucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENsYXNzUGFyYW1zKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmJhc2VzLm1hcCgoYikgPT5cbiAgICAgIHRvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7IC4uLmNvbnRleHQsIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYWxsIGZpZWxkcyAoaW5oZXJpdGVkIGFzIHdlbGwpXG4gICAqL1xuICBwcml2YXRlIGdldCBhbGxNZW1iZXJzKCk6IFN0cnVjdEZpZWxkW10ge1xuICAgIHJldHVybiB0aGlzLnRoaXNJbnRlcmZhY2UuYWxsUHJvcGVydGllcy5tYXAoXG4gICAgICAoeCkgPT4gbmV3IFN0cnVjdEZpZWxkKHRoaXMuZ2VuZXJhdG9yLCB4LnNwZWMsIHguZGVmaW5pbmdUeXBlLnNwZWMpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldCB0aGlzSW50ZXJmYWNlKCkge1xuICAgIGlmICh0aGlzLmZxbiA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZRTiBub3Qgc2V0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRvci5yZWZsZWN0QXNzZW1ibHkuc3lzdGVtLmZpbmRJbnRlcmZhY2UodGhpcy5mcW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q29uc3RydWN0b3IoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IG1lbWJlcnMgPSB0aGlzLmFsbE1lbWJlcnM7XG5cbiAgICBjb25zdCBrd2FyZ3MgPSBtZW1iZXJzLm1hcCgobSkgPT4gbS5jb25zdHJ1Y3RvckRlY2woY29udGV4dCkpO1xuXG4gICAgY29uc3QgaW1wbGljaXRQYXJhbWV0ZXIgPSBzbHVnaWZ5QXNOZWVkZWQoXG4gICAgICAnc2VsZicsXG4gICAgICBtZW1iZXJzLm1hcCgobSkgPT4gbS5weXRob25OYW1lKSxcbiAgICApO1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yQXJndW1lbnRzID1cbiAgICAgIGt3YXJncy5sZW5ndGggPiAwXG4gICAgICAgID8gW2ltcGxpY2l0UGFyYW1ldGVyLCAnKicsIC4uLmt3YXJnc11cbiAgICAgICAgOiBbaW1wbGljaXRQYXJhbWV0ZXJdO1xuXG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnZGVmJywgJ19faW5pdF9fJywgY29uc3RydWN0b3JBcmd1bWVudHMsIGZhbHNlLCAnTm9uZScpO1xuICAgIHRoaXMuZW1pdENvbnN0cnVjdG9yRG9jc3RyaW5nKGNvZGUpO1xuXG4gICAgLy8gUmUtdHlwZSBzdHJ1Y3QgYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQgYXMgXCJkaWN0XCJcbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzLmZpbHRlcigobSkgPT4gbS5pc1N0cnVjdCh0aGlzLmdlbmVyYXRvcikpKSB7XG4gICAgICAvLyBOb3RlIHRoYXQgXCJOb25lXCIgaXMgTk9UIGFuIGluc3RhbmNlIG9mIGRpY3QgKHRoYXQncyBjb252ZW5pZW50ISlcbiAgICAgIGNvbnN0IHR5cGVOYW1lID0gdG9UeXBlTmFtZShtZW1iZXIudHlwZS50eXBlKS5weXRob25UeXBlKHtcbiAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBjb2RlLm9wZW5CbG9jayhgaWYgaXNpbnN0YW5jZSgke21lbWJlci5weXRob25OYW1lfSwgZGljdClgKTtcbiAgICAgIGNvZGUubGluZShgJHttZW1iZXIucHl0aG9uTmFtZX0gPSAke3R5cGVOYW1lfSgqKiR7bWVtYmVyLnB5dGhvbk5hbWV9KWApO1xuICAgICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgfVxuXG4gICAgLy8gUmVxdWlyZWQgcHJvcGVydGllcywgdGhvc2Ugd2lsbCBhbHdheXMgYmUgcHV0IGludG8gdGhlIGRpY3RcbiAgICBhc3NpZ25EaWN0aW9uYXJ5KFxuICAgICAgY29kZSxcbiAgICAgIGAke2ltcGxpY2l0UGFyYW1ldGVyfS5fdmFsdWVzOiB0eXBpbmcuRGljdFtzdHIsIHR5cGluZy5BbnldYCxcbiAgICAgIG1lbWJlcnNcbiAgICAgICAgLmZpbHRlcigobSkgPT4gIW0ub3B0aW9uYWwpXG4gICAgICAgIC5tYXAoXG4gICAgICAgICAgKG1lbWJlcikgPT5cbiAgICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KG1lbWJlci5weXRob25OYW1lKX06ICR7bWVtYmVyLnB5dGhvbk5hbWV9YCxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgLy8gT3B0aW9uYWwgcHJvcGVydGllcywgd2lsbCBvbmx5IGJlIHB1dCBpbnRvIHRoZSBkaWN0IGlmIHRoZXkncmUgbm90IE5vbmVcbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzLmZpbHRlcigobSkgPT4gbS5vcHRpb25hbCkpIHtcbiAgICAgIGNvZGUub3BlbkJsb2NrKGBpZiAke21lbWJlci5weXRob25OYW1lfSBpcyBub3QgTm9uZWApO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgJHtpbXBsaWNpdFBhcmFtZXRlcn0uX3ZhbHVlc1tcIiR7bWVtYmVyLnB5dGhvbk5hbWV9XCJdID0gJHttZW1iZXIucHl0aG9uTmFtZX1gLFxuICAgICAgKTtcbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cblxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q29uc3RydWN0b3JEb2NzdHJpbmcoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgY29uc3QgYXJnczogRG9jdW1lbnRhYmxlQXJndW1lbnRbXSA9IHRoaXMuYWxsTWVtYmVycy5tYXAoKG0pID0+ICh7XG4gICAgICBuYW1lOiBtLnB5dGhvbk5hbWUsXG4gICAgICBkb2NzOiBtLmRvY3MsXG4gICAgICBkZWZpbmluZ1R5cGU6IHRoaXMuc3BlYyxcbiAgICB9KSk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGFyZ3VtZW50czogYXJncyxcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBjbGFzcy0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0R2V0dGVyKFxuICAgIG1lbWJlcjogU3RydWN0RmllbGQsXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICApIHtcbiAgICBjb25zdCBweXRob25UeXBlID0gbWVtYmVyLnR5cGVBbm5vdGF0aW9uKGNvbnRleHQpO1xuXG4gICAgY29kZS5saW5lKCdAYnVpbHRpbnMucHJvcGVydHknKTtcbiAgICBvcGVuU2lnbmF0dXJlKGNvZGUsICdkZWYnLCBtZW1iZXIucHl0aG9uTmFtZSwgWydzZWxmJ10sIHRydWUsIHB5dGhvblR5cGUpO1xuICAgIG1lbWJlci5lbWl0RG9jU3RyaW5nKGNvZGUpO1xuICAgIGNvZGUubGluZShcbiAgICAgIGByZXN1bHQgPSBzZWxmLl92YWx1ZXMuZ2V0KCR7SlNPTi5zdHJpbmdpZnkobWVtYmVyLnB5dGhvbk5hbWUpfSlgLFxuICAgICk7XG4gICAgaWYgKCFtZW1iZXIub3B0aW9uYWwpIHtcbiAgICAgIC8vIEFkZCBhbiBhc3NlcnRpb24gdG8gbWF5ZSBNeVBZIGhhcHB5IVxuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgYXNzZXJ0IHJlc3VsdCBpcyBub3QgTm9uZSwgXCJSZXF1aXJlZCBwcm9wZXJ0eSAnJHttZW1iZXIucHl0aG9uTmFtZX0nIGlzIG1pc3NpbmdcImAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb2RlLmxpbmUoYHJldHVybiB0eXBpbmcuY2FzdCgke3B5dGhvblR5cGV9LCByZXN1bHQpYCk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRNYWdpY01ldGhvZHMoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5vcGVuQmxvY2soJ2RlZiBfX2VxX18oc2VsZiwgcmhzOiB0eXBpbmcuQW55KSAtPiBidWlsdGlucy5ib29sJyk7XG4gICAgY29kZS5saW5lKFxuICAgICAgJ3JldHVybiBpc2luc3RhbmNlKHJocywgc2VsZi5fX2NsYXNzX18pIGFuZCByaHMuX3ZhbHVlcyA9PSBzZWxmLl92YWx1ZXMnLFxuICAgICk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLm9wZW5CbG9jaygnZGVmIF9fbmVfXyhzZWxmLCByaHM6IHR5cGluZy5BbnkpIC0+IGJ1aWx0aW5zLmJvb2wnKTtcbiAgICBjb2RlLmxpbmUoJ3JldHVybiBub3QgKHJocyA9PSBzZWxmKScpO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5vcGVuQmxvY2soJ2RlZiBfX3JlcHJfXyhzZWxmKSAtPiBzdHInKTtcbiAgICBjb2RlLmluZGVudChgcmV0dXJuIFwiJHt0aGlzLnB5dGhvbk5hbWV9KCVzKVwiICUgXCIsIFwiLmpvaW4oYCk7XG4gICAgY29kZS5saW5lKCdrICsgXCI9XCIgKyByZXByKHYpIGZvciBrLCB2IGluIHNlbGYuX3ZhbHVlcy5pdGVtcygpJyk7XG4gICAgY29kZS51bmluZGVudCgnKScpO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9wZXJ0eU1hcCgpIHtcbiAgICBjb25zdCByZXQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIHRoaXMuYWxsTWVtYmVycykge1xuICAgICAgcmV0LnB1c2goXG4gICAgICAgIGAke0pTT04uc3RyaW5naWZ5KG1lbWJlci5weXRob25OYW1lKX06ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgbWVtYmVyLmpzaWlOYW1lLFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG5cbmNsYXNzIFN0cnVjdEZpZWxkIGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBqc2lpTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZG9jcz86IHNwZWMuRG9jcztcbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHNwZWMuT3B0aW9uYWxWYWx1ZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJvcDogc3BlYy5Qcm9wZXJ0eSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlZmluaW5nVHlwZTogc3BlYy5UeXBlLFxuICApIHtcbiAgICB0aGlzLnB5dGhvbk5hbWUgPSB0b1B5dGhvblByb3BlcnR5TmFtZShwcm9wLm5hbWUpO1xuICAgIHRoaXMuanNpaU5hbWUgPSBwcm9wLm5hbWU7XG4gICAgdGhpcy50eXBlID0gcHJvcDtcbiAgICB0aGlzLmRvY3MgPSBwcm9wLmRvY3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogdGhpcy5kZWZpbmluZ1R5cGUuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogdGhpcy5qc2lpTmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldCBvcHRpb25hbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnR5cGUub3B0aW9uYWw7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIHRvVHlwZU5hbWUodGhpcy50eXBlKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gIH1cblxuICBwdWJsaWMgaXNTdHJ1Y3QoZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNTdHJ1Y3QoZ2VuZXJhdG9yLnJlZmxlY3RBc3NlbWJseS5zeXN0ZW0sIHRoaXMudHlwZS50eXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvckRlY2woY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCBvcHQgPSB0aGlzLm9wdGlvbmFsID8gJyA9IE5vbmUnIDogJyc7XG4gICAgcmV0dXJuIGAke3RoaXMucHl0aG9uTmFtZX06ICR7dGhpcy50eXBlQW5ub3RhdGlvbih7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgcGFyYW1ldGVyVHlwZTogdHJ1ZSxcbiAgICB9KX0ke29wdH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgUHl0aG9uIHR5cGUgYW5ub3RhdGlvbiBmb3IgdGhpcyB0eXBlXG4gICAqL1xuICBwdWJsaWMgdHlwZUFubm90YXRpb24oY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICByZXR1cm4gdG9UeXBlTmFtZSh0aGlzLnR5cGUpLnB5dGhvblR5cGUoY29udGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdERvY1N0cmluZyhjb2RlOiBDb2RlTWFrZXIpIHtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYHByb3AtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCByZXNvbHZlZFR5cGUgPSB0aGlzLnR5cGVBbm5vdGF0aW9uKGNvbnRleHQpO1xuICAgIGNvZGUubGluZShgJHt0aGlzLnB5dGhvbk5hbWV9OiAke3Jlc29sdmVkVHlwZX1gKTtcbiAgICB0aGlzLmVtaXREb2NTdHJpbmcoY29kZSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENsYXNzT3B0cyBleHRlbmRzIFB5dGhvblR5cGVPcHRzIHtcbiAgYWJzdHJhY3Q/OiBib29sZWFuO1xuICBpbnRlcmZhY2VzPzogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2VbXTtcbiAgYWJzdHJhY3RCYXNlcz86IHNwZWMuQ2xhc3NUeXBlW107XG59XG5cbmNsYXNzIENsYXNzIGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSBpbXBsZW1lbnRzIElTb3J0YWJsZVR5cGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGFic3RyYWN0OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGFic3RyYWN0QmFzZXM6IHNwZWMuQ2xhc3NUeXBlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJmYWNlczogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2VbXTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHNwZWM6IHNwZWMuVHlwZSxcbiAgICBmcW46IHN0cmluZyxcbiAgICBvcHRzOiBDbGFzc09wdHMsXG4gICAgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBzdXBlcihnZW5lcmF0b3IsIG5hbWUsIHNwZWMsIGZxbiwgb3B0cywgZG9jcyk7XG5cbiAgICBjb25zdCB7IGFic3RyYWN0ID0gZmFsc2UsIGludGVyZmFjZXMgPSBbXSwgYWJzdHJhY3RCYXNlcyA9IFtdIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5hYnN0cmFjdCA9IGFic3RyYWN0O1xuICAgIHRoaXMuaW50ZXJmYWNlcyA9IGludGVyZmFjZXM7XG4gICAgdGhpcy5hYnN0cmFjdEJhc2VzID0gYWJzdHJhY3RCYXNlcztcbiAgfVxuXG4gIHB1YmxpYyBkZXBlbmRzT24ocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFB5dGhvblR5cGVbXSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzOiBQeXRob25UeXBlW10gPSBzdXBlci5kZXBlbmRzT24ocmVzb2x2ZXIpO1xuICAgIGNvbnN0IHBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudCh0aGlzLmZxbiEpO1xuXG4gICAgLy8gV2UgbmVlZCB0byByZXR1cm4gYW55IGlmYWNlcyB0aGF0IGFyZSBpbiB0aGUgc2FtZSBtb2R1bGUgYXQgdGhlIHNhbWUgbGV2ZWwgb2ZcbiAgICAvLyBuZXN0aW5nLlxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGlmYWNlIG9mIHRoaXMuaW50ZXJmYWNlcykge1xuICAgICAgaWYgKHJlc29sdmVyLmlzSW5Nb2R1bGUoaWZhY2UpKSB7XG4gICAgICAgIC8vIEdpdmVuIGEgaWZhY2UsIHdlIG5lZWQgdG8gbG9jYXRlIHRoZSBpZmFjZXMncyBwYXJlbnQgdGhhdCBpcyB0aGUgc2FtZVxuICAgICAgICAvLyBhcyBvdXIgcGFyZW50LCBiZWNhdXNlIHdlIG9ubHkgY2FyZSBhYm91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYXQgdGhlXG4gICAgICAgIC8vIHNhbWUgbGV2ZWwgb2Ygb3VyIG93bi5cbiAgICAgICAgLy8gVE9ETzogV2UgbWlnaHQgbmVlZCB0byByZWN1cnNlIGludG8gb3VyIG1lbWJlcnMgdG8gYWxzbyBmaW5kIHRoZWlyXG4gICAgICAgIC8vICAgICAgIGRlcGVuZGVuY2llcy5cbiAgICAgICAgbGV0IGlmYWNlSXRlbSA9IHJlc29sdmVyLmdldFR5cGUoaWZhY2UpO1xuICAgICAgICBsZXQgaWZhY2VQYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQoaWZhY2UpO1xuICAgICAgICB3aGlsZSAoaWZhY2VQYXJlbnQgIT09IHBhcmVudCkge1xuICAgICAgICAgIGlmYWNlSXRlbSA9IGlmYWNlUGFyZW50O1xuICAgICAgICAgIGlmYWNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGlmYWNlSXRlbS5mcW4hKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2Vlbi5oYXMoaWZhY2VJdGVtLmZxbiEpKSB7XG4gICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goaWZhY2VJdGVtKTtcbiAgICAgICAgICBzZWVuLmFkZChpZmFjZUl0ZW0uZnFuISk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBtZXJnZVB5dGhvbkltcG9ydHMoXG4gICAgICBzdXBlci5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksIC8vIFRha2VzIGNhcmUgb2YgYmFzZSAmIG1lbWJlcnNcbiAgICAgIC4uLnRoaXMuaW50ZXJmYWNlcy5tYXAoKGJhc2UpID0+XG4gICAgICAgIHRvVHlwZU5hbWUoYmFzZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIC8vIEZpcnN0IHdlIGVtaXQgb3VyIGltcGxtZW50cyBkZWNvcmF0b3JcbiAgICBpZiAodGhpcy5pbnRlcmZhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGludGVyZmFjZXM6IHN0cmluZ1tdID0gdGhpcy5pbnRlcmZhY2VzLm1hcCgoYikgPT5cbiAgICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICAgKTtcbiAgICAgIGNvZGUubGluZShgQGpzaWkuaW1wbGVtZW50cygke2ludGVyZmFjZXMuam9pbignLCAnKX0pYCk7XG4gICAgfVxuXG4gICAgLy8gVGhlbiB3ZSBkbyBvdXIgbm9ybWFsIGNsYXNzIGxvZ2ljIGZvciBlbWl0dGluZyBvdXIgbWVtYmVycy5cbiAgICBzdXBlci5lbWl0KGNvZGUsIGNvbnRleHQpO1xuXG4gICAgLy8gVGhlbiwgaWYgb3VyIGNsYXNzIGlzIEFic3RyYWN0LCB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggYW5kIHJlZG8gYWxsIG9mXG4gICAgLy8gdGhpcyBsb2dpYywgZXhjZXB0IG9ubHkgZW1pdGluZyBhYnN0cmFjdCBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGFzIG5vblxuICAgIC8vIGFic3RyYWN0LCBhbmQgc3ViY2xhc3Npbmcgb3VyIGluaXRpYWwgY2xhc3MuXG4gICAgaWYgKHRoaXMuYWJzdHJhY3QpIHtcbiAgICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcblxuICAgICAgY29uc3QgcHJveHlCYXNlcyA9IFt0aGlzLnB5dGhvbk5hbWVdO1xuICAgICAgZm9yIChjb25zdCBiYXNlIG9mIHRoaXMuYWJzdHJhY3RCYXNlcykge1xuICAgICAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgYmVjYXVzZSBNeVB5IGNhbm5vdCBjaGVjayBkeW5hbWljIGJhc2UgY2xhc3NlcyAobmF0dXJhbGx5KVxuICAgICAgICBwcm94eUJhc2VzLnB1c2goXG4gICAgICAgICAgYGpzaWkucHJveHlfZm9yKCR7dG9UeXBlTmFtZShiYXNlKS5weXRob25UeXBlKHtcbiAgICAgICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgICAgICAgfSl9KSAjIHR5cGU6IGlnbm9yZVttaXNjXWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBvcGVuU2lnbmF0dXJlKGNvZGUsICdjbGFzcycsIHRoaXMucHJveHlDbGFzc05hbWUsIHByb3h5QmFzZXMpO1xuXG4gICAgICAvLyBGaWx0ZXIgb3VyIGxpc3Qgb2YgbWVtYmVycyB0byAqb25seSogYmUgYWJzdHJhY3QgbWVtYmVycywgYW5kIG5vdCBhbnlcbiAgICAgIC8vIG90aGVyIHR5cGVzLlxuICAgICAgY29uc3QgYWJzdHJhY3RNZW1iZXJzID0gdGhpcy5tZW1iZXJzLmZpbHRlcihcbiAgICAgICAgKG0pID0+XG4gICAgICAgICAgKG0gaW5zdGFuY2VvZiBCYXNlTWV0aG9kIHx8IG0gaW5zdGFuY2VvZiBCYXNlUHJvcGVydHkpICYmIG0uYWJzdHJhY3QsXG4gICAgICApO1xuICAgICAgaWYgKGFic3RyYWN0TWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIGFic3RyYWN0TWVtYmVycykge1xuICAgICAgICAgIGlmICh0aGlzLnNlcGFyYXRlTWVtYmVycykge1xuICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbWVtYmVyLmVtaXQoY29kZSwgY29udGV4dCwgeyByZW5kZXJBYnN0cmFjdDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvZGUubGluZSgncGFzcycpO1xuICAgICAgfVxuXG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICAnIyBBZGRpbmcgYSBcIl9fanNpaV9wcm94eV9jbGFzc19fKCk6IHR5cGluZy5UeXBlXCIgZnVuY3Rpb24gdG8gdGhlIGFic3RyYWN0IGNsYXNzJyxcbiAgICAgICk7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGB0eXBpbmcuY2FzdCh0eXBpbmcuQW55LCAke3RoaXMucHl0aG9uTmFtZX0pLl9fanNpaV9wcm94eV9jbGFzc19fID0gbGFtYmRhIDogJHt0aGlzLnByb3h5Q2xhc3NOYW1lfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gdGhpcy5iYXNlcy5tYXAoKGIpID0+XG4gICAgICB0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoeyAuLi5jb250ZXh0LCB0eXBlQW5ub3RhdGlvbjogZmFsc2UgfSksXG4gICAgKTtcbiAgICBjb25zdCBtZXRhY2xhc3M6IHN0cmluZyA9IHRoaXMuYWJzdHJhY3QgPyAnSlNJSUFic3RyYWN0Q2xhc3MnIDogJ0pTSUlNZXRhJztcblxuICAgIHBhcmFtcy5wdXNoKGBtZXRhY2xhc3M9anNpaS4ke21ldGFjbGFzc31gKTtcbiAgICBwYXJhbXMucHVzaChganNpaV90eXBlPVwiJHt0aGlzLmZxbn1cImApO1xuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHByb3h5Q2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBfJHt0aGlzLnB5dGhvbk5hbWV9UHJveHlgO1xuICB9XG59XG5cbmNsYXNzIFN0YXRpY01ldGhvZCBleHRlbmRzIEJhc2VNZXRob2Qge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVjb3JhdG9yPzogc3RyaW5nID0gJ2J1aWx0aW5zLmNsYXNzbWV0aG9kJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnY2xzJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2Q6IHN0cmluZyA9ICdzaW52b2tlJztcbn1cblxuY2xhc3MgSW5pdGlhbGl6ZXIgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnY3JlYXRlJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsYXNzQXNGaXJzdFBhcmFtZXRlcjogYm9vbGVhbiA9IHRydWU7XG4gIHByb3RlY3RlZCByZWFkb25seSByZXR1cm5Gcm9tSlNJSU1ldGhvZDogYm9vbGVhbiA9IGZhbHNlO1xufVxuXG5jbGFzcyBNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnaW52b2tlJztcbn1cblxuY2xhc3MgQXN5bmNNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnYWludm9rZSc7XG59XG5cbmNsYXNzIFN0YXRpY1Byb3BlcnR5IGV4dGVuZHMgQmFzZVByb3BlcnR5IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nID0gJ2pzaWkucHl0aG9uLmNsYXNzcHJvcGVydHknO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdjbHMnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaUdldE1ldGhvZDogc3RyaW5nID0gJ3NnZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaVNldE1ldGhvZDogc3RyaW5nID0gJ3NzZXQnO1xufVxuXG5jbGFzcyBQcm9wZXJ0eSBleHRlbmRzIEJhc2VQcm9wZXJ0eSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I6IHN0cmluZyA9ICdidWlsdGlucy5wcm9wZXJ0eSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaUdldE1ldGhvZDogc3RyaW5nID0gJ2dldCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpU2V0TWV0aG9kOiBzdHJpbmcgPSAnc2V0Jztcbn1cblxuY2xhc3MgRW51bSBleHRlbmRzIEJhc2VQeXRob25DbGFzc1R5cGUge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VwYXJhdGVNZW1iZXJzID0gZmFsc2U7XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcbiAgICBlbWl0TGlzdChjb2RlLCAnQGpzaWkuZW51bSgnLCBbYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgXSwgJyknKTtcbiAgICByZXR1cm4gc3VwZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhfY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnZW51bS5FbnVtJ107XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIHN1cGVyLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgfVxufVxuXG5jbGFzcyBFbnVtTWVtYmVyIGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSB2YWx1ZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICB0aGlzLnB5dGhvbk5hbWUgPSBweXRob25OYW1lO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIHJldHVybiB7IGFwaTogJ21lbWJlcicsIGZxbjogdGhpcy5wYXJlbnQuZnFuLCBtZW1iZXJOYW1lOiB0aGlzLnZhbHVlIH07XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kc09uTW9kdWxlcygpIHtcbiAgICByZXR1cm4gbmV3IFNldDxzdHJpbmc+KCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIF9jb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvZGUubGluZShgJHt0aGlzLnB5dGhvbk5hbWV9ID0gXCIke3RoaXMudmFsdWV9XCJgKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGVudW0tJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoX2NvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbmludGVyZmFjZSBNb2R1bGVPcHRzIHtcbiAgcmVhZG9ubHkgYXNzZW1ibHk6IHNwZWMuQXNzZW1ibHk7XG4gIHJlYWRvbmx5IGFzc2VtYmx5RmlsZW5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9hZEFzc2VtYmx5PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcGFja2FnZT86IFBhY2thZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2NzdHJpbmcgdG8gZW1pdCBhdCB0aGUgdG9wIG9mIHRoaXMgbW9kdWxlLCBpZiBhbnkuXG4gICAqL1xuICByZWFkb25seSBtb2R1bGVEb2N1bWVudGF0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFB5dGhvbiBtb2R1bGVcbiAqXG4gKiBXaWxsIGJlIGNhbGxlZCBmb3IganNpaSBzdWJtb2R1bGVzIGFuZCBuYW1lc3BhY2VzLlxuICovXG5jbGFzcyBQeXRob25Nb2R1bGUgaW1wbGVtZW50cyBQeXRob25UeXBlIHtcbiAgLyoqXG4gICAqIENvbnZlcnRlZCB0byBwdXQgb24gdGhlIG1vZHVsZVxuICAgKlxuICAgKiBUaGUgZm9ybWF0IGlzIGluIG1hcmtkb3duLCB3aXRoIGNvZGUgc2FtcGxlcyBjb252ZXJ0ZWQgZnJvbSBUUyB0byBQeXRob24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbW9kdWxlRG9jdW1lbnRhdGlvbj86IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGFzc2VtYmx5OiBzcGVjLkFzc2VtYmx5O1xuICBwcml2YXRlIHJlYWRvbmx5IGFzc2VtYmx5RmlsZW5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkQXNzZW1ibHk6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVtYmVycyA9IG5ldyBBcnJheTxQeXRob25CYXNlPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlcyA9IG5ldyBBcnJheTxQeXRob25Nb2R1bGU+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGZxbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdHM6IE1vZHVsZU9wdHMsXG4gICkge1xuICAgIHRoaXMuYXNzZW1ibHkgPSBvcHRzLmFzc2VtYmx5O1xuICAgIHRoaXMuYXNzZW1ibHlGaWxlbmFtZSA9IG9wdHMuYXNzZW1ibHlGaWxlbmFtZTtcbiAgICB0aGlzLmxvYWRBc3NlbWJseSA9ICEhb3B0cy5sb2FkQXNzZW1ibHk7XG4gICAgdGhpcy5tb2R1bGVEb2N1bWVudGF0aW9uID0gb3B0cy5tb2R1bGVEb2N1bWVudGF0aW9uO1xuICB9XG5cbiAgcHVibGljIGFkZE1lbWJlcihtZW1iZXI6IFB5dGhvbkJhc2UpIHtcbiAgICB0aGlzLm1lbWJlcnMucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcHVibGljIGFkZFB5dGhvbk1vZHVsZShweU1vZDogUHl0aG9uTW9kdWxlKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgIXRoaXMubG9hZEFzc2VtYmx5LFxuICAgICAgJ1B5dGhvbk1vZHVsZS5hZGRQeXRob25Nb2R1bGUgQ0FOTk9UIGJlIGNhbGxlZCBvbiBhc3NlbWJseS1sb2FkaW5nIG1vZHVsZXMgKGl0IHdvdWxkIGNhdXNlIGEgbG9hZCBjeWNsZSkhJyxcbiAgICApO1xuXG4gICAgYXNzZXJ0KFxuICAgICAgcHlNb2QucHl0aG9uTmFtZS5zdGFydHNXaXRoKGAke3RoaXMucHl0aG9uTmFtZX0uYCksXG4gICAgICBgQXR0ZW1wdGVkIHRvIHJlZ2lzdGVyICR7cHlNb2QucHl0aG9uTmFtZX0gYXMgYSBjaGlsZCBtb2R1bGUgb2YgJHt0aGlzLnB5dGhvbk5hbWV9LCBidXQgdGhlIG5hbWVzIGRvbid0IG1hdGNoIWAsXG4gICAgKTtcblxuICAgIGNvbnN0IFtmaXJzdExldmVsLCAuLi5yZXN0XSA9IHB5TW9kLnB5dGhvbk5hbWVcbiAgICAgIC5zdWJzdHJpbmcodGhpcy5weXRob25OYW1lLmxlbmd0aCArIDEpXG4gICAgICAuc3BsaXQoJy4nKTtcbiAgICBpZiAocmVzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBkaXJlY3QgY2hpbGQgbW9kdWxlLi4uXG4gICAgICB0aGlzLm1vZHVsZXMucHVzaChweU1vZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBuZXN0ZWQgY2hpbGQgbW9kdWxlLCBzbyB3ZSBkZWxlZ2F0ZSB0byB0aGUgZGlyZWN0bHkgbmVzdGVkIG1vZHVsZS4uLlxuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5tb2R1bGVzLmZpbmQoXG4gICAgICAgIChtKSA9PiBtLnB5dGhvbk5hbWUgPT09IGAke3RoaXMucHl0aG9uTmFtZX0uJHtmaXJzdExldmVsfWAsXG4gICAgICApO1xuICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBdHRlbXB0ZWQgdG8gcmVnaXN0ZXIgJHtweU1vZC5weXRob25OYW1lfSB3aXRoaW4gJHt0aGlzLnB5dGhvbk5hbWV9LCBidXQgJHt0aGlzLnB5dGhvbk5hbWV9LiR7Zmlyc3RMZXZlbH0gd2Fzbid0IHJlZ2lzdGVyZWQgeWV0IWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBwYXJlbnQuYWRkUHl0aG9uTW9kdWxlKHB5TW9kKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIC4uLnRoaXMubWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICB0aGlzLmVtaXRNb2R1bGVEb2N1bWVudGF0aW9uKGNvZGUpO1xuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmZxblxuICAgICAgPyBjb250ZXh0LnJlc29sdmVyLmJpbmQodGhpcy5mcW4sIHRoaXMucHl0aG9uTmFtZSlcbiAgICAgIDogY29udGV4dC5yZXNvbHZlcjtcbiAgICBjb250ZXh0ID0ge1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHN1Ym1vZHVsZTogdGhpcy5mcW4gPz8gY29udGV4dC5zdWJtb2R1bGUsXG4gICAgICByZXNvbHZlcixcbiAgICB9O1xuXG4gICAgLy8gQmVmb3JlIHdlIHdyaXRlIGFueXRoaW5nIGVsc2UsIHdlIG5lZWQgdG8gd3JpdGUgb3V0IG91ciBtb2R1bGUgaGVhZGVycywgdGhpc1xuICAgIC8vIGlzIHdoZXJlIHdlIGhhbmRsZSBzdHVmZiBsaWtlIGltcG9ydHMsIGFueSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiwgZXRjLlxuICAgIGNvZGUubGluZSgnaW1wb3J0IGFiYycpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGJ1aWx0aW5zJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgZGF0ZXRpbWUnKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBlbnVtJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgdHlwaW5nJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQganNpaScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IHB1YmxpY2F0aW9uJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgdHlwaW5nX2V4dGVuc2lvbnMnKTtcblxuICAgIC8vIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIG91dCB0aGUga2VybmVsIGxvYWQgbGluZS5cbiAgICBpZiAodGhpcy5sb2FkQXNzZW1ibHkpIHtcbiAgICAgIHRoaXMuZW1pdERlcGVuZGVuY3lJbXBvcnRzKGNvZGUpO1xuXG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGVtaXRMaXN0KFxuICAgICAgICBjb2RlLFxuICAgICAgICAnX19qc2lpX2Fzc2VtYmx5X18gPSBqc2lpLkpTSUlBc3NlbWJseS5sb2FkKCcsXG4gICAgICAgIFtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5Lm5hbWUpLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkudmVyc2lvbiksXG4gICAgICAgICAgJ19fbmFtZV9fWzA6LTZdJyxcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5RmlsZW5hbWUpfWAsXG4gICAgICAgIF0sXG4gICAgICAgICcpJyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZW4gd2UgbXVzdCBpbXBvcnQgdGhlIC5fanNpaSBzdWJwYWNrYWdlLlxuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBsZXQgZGlzdGFuY2VGcm9tUm9vdCA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgY3VyciA9IHRoaXMuZnFuITtcbiAgICAgICAgY3VyciAhPT0gdGhpcy5hc3NlbWJseS5uYW1lO1xuICAgICAgICBjdXJyID0gY3Vyci5zdWJzdHJpbmcoMCwgY3Vyci5sYXN0SW5kZXhPZignLicpKVxuICAgICAgKSB7XG4gICAgICAgIGRpc3RhbmNlRnJvbVJvb3QrKztcbiAgICAgIH1cbiAgICAgIGNvZGUubGluZShgZnJvbSAkeycuJy5yZXBlYXQoZGlzdGFuY2VGcm9tUm9vdCArIDEpfV9qc2lpIGltcG9ydCAqYCk7XG5cbiAgICAgIHRoaXMuZW1pdFJlcXVpcmVkSW1wb3J0cyhjb2RlLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGFsbCBvZiBvdXIgbWVtYmVycy5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcmVwYXJlTWVtYmVycyh0aGlzLm1lbWJlcnMsIHJlc29sdmVyKSkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFdoYXRldmVyIG5hbWVzIHdlJ3ZlIGV4cG9ydGVkLCB3ZSdsbCB3cml0ZSBvdXQgb3VyIF9fYWxsX18gdGhhdCBsaXN0cyB0aGVtLlxuICAgIC8vXG4gICAgLy8gX19hbGxfXyBpcyBub3JtYWxseSB1c2VkIGZvciB3aGVuIHVzZXJzIHdyaXRlIGBmcm9tIGxpYnJhcnkgaW1wb3J0ICpgLCBidXQgd2UgYWxzb1xuICAgIC8vIHVzZSBpdCB3aXRoIHRoZSBgcHVibGljYXRpb25gIG1vZHVsZSB0byBoaWRlIGV2ZXJ5dGhpbmcgdGhhdCdzIE5PVCBpbiB0aGUgbGlzdC5cbiAgICAvL1xuICAgIC8vIE5vcm1hbGx5IGFkZGluZyBzdWJtb2R1bGVzIHRvIGBfX2FsbF9fYCBoYXMgdGhlIChuZWdhdGl2ZT8pIHNpZGUtZWZmZWN0XG4gICAgLy8gdGhhdCBhbGwgc3VibW9kdWxlcyBnZXQgbG9hZGVkIHdoZW4gdGhlIHVzZXIgZG9lcyBgaW1wb3J0ICpgLCBidXQgd2VcbiAgICAvLyBhbHJlYWR5IGxvYWQgc3VibW9kdWxlcyBhbnl3YXkgc28gaXQgZG9lc24ndCBtYWtlIGEgZGlmZmVyZW5jZSwgYW5kIGluIGNvbWJpbmF0aW9uXG4gICAgLy8gd2l0aCB0aGUgYHB1YmxpY2F0aW9uYCBtb2R1bGUgTk9UIGhhdmluZyB0aGVtIGluIHRoaXMgbGlzdCBoaWRlcyBhbnkgc3VibW9kdWxlc1xuICAgIC8vIHdlIGltcG9ydCBhcyBwYXJ0IG9mIHR5cGVjaGVja2luZy5cbiAgICBjb25zdCBleHBvcnRlZE1lbWJlcnMgPSBbXG4gICAgICAuLi50aGlzLm1lbWJlcnMubWFwKChtKSA9PiBgXCIke20ucHl0aG9uTmFtZX1cImApLFxuICAgICAgLi4udGhpcy5tb2R1bGVzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+IHRoaXMuaXNEaXJlY3RDaGlsZChtKSlcbiAgICAgICAgLm1hcCgobSkgPT4gYFwiJHtsYXN0Q29tcG9uZW50KG0ucHl0aG9uTmFtZSl9XCJgKSxcbiAgICBdO1xuICAgIGlmICh0aGlzLmxvYWRBc3NlbWJseSkge1xuICAgICAgZXhwb3J0ZWRNZW1iZXJzLnB1c2goJ1wiX19qc2lpX2Fzc2VtYmx5X19cIicpO1xuICAgIH1cblxuICAgIC8vIERlY2xhcmUgdGhlIGxpc3Qgb2YgXCJwdWJsaWNcIiBtZW1iZXJzIHRoaXMgbW9kdWxlIGV4cG9ydHNcbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgIH1cbiAgICBjb2RlLmxpbmUoKTtcblxuICAgIGlmIChleHBvcnRlZE1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5pbmRlbnQoJ19fYWxsX18gPSBbJyk7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBleHBvcnRlZE1lbWJlcnMuc29ydCgpKSB7XG4gICAgICAgIC8vIFdyaXRpbmcgb25lIGJ5IGxpbmUgbWlnaHQgYmUgX2EgbG90XyBvZiBsaW5lcywgYnV0IGl0J2xsIG1ha2UgcmV2aWV3aW5nIGNoYW5nZXMgdG8gdGhlIGxpc3QgZWFzaWVyLiBUcnVzdCBtZS5cbiAgICAgICAgY29kZS5saW5lKGAke21lbWJlcn0sYCk7XG4gICAgICB9XG4gICAgICBjb2RlLnVuaW5kZW50KCddJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgnX19hbGxfXzogdHlwaW5nLkxpc3RbdHlwaW5nLkFueV0gPSBbXScpO1xuICAgIH1cblxuICAgIC8vIE5leHQgdXAsIHdlJ2xsIHVzZSBwdWJsaWNhdGlvbiB0byBlbnN1cmUgdGhhdCBhbGwgb2YgdGhlIG5vbi1wdWJsaWMgbmFtZXNcbiAgICAvLyBnZXQgaGlkZGVuIGZyb20gZGlyKCksIHRhYi1jb21wbGV0ZSwgZXRjLlxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgncHVibGljYXRpb24ucHVibGlzaCgpJyk7XG5cbiAgICAvLyBGaW5hbGx5LCB3ZSdsbCBsb2FkIGFsbCByZWdpc3RlcmVkIHB5dGhvbiBtb2R1bGVzXG4gICAgaWYgKHRoaXMubW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgJyMgTG9hZGluZyBtb2R1bGVzIHRvIGVuc3VyZSB0aGVpciB0eXBlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBqc2lpIHJ1bnRpbWUgbGlicmFyeScsXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgdGhpcy5tb2R1bGVzLnNvcnQoKGwsIHIpID0+XG4gICAgICAgIGwucHl0aG9uTmFtZS5sb2NhbGVDb21wYXJlKHIucHl0aG9uTmFtZSksXG4gICAgICApKSB7XG4gICAgICAgIC8vIFJhdGhlciB0aGFuIGdlbmVyYXRpbmcgYW4gYWJzb2x1dGUgaW1wb3J0IGxpa2VcbiAgICAgICAgLy8gXCJpbXBvcnQganNpaV9jYWxjLnN1Ym1vZHVsZVwiIHRoaXMgYnVpbGRzIGEgcmVsYXRpdmUgaW1wb3J0IGxpa2VcbiAgICAgICAgLy8gXCJmcm9tIC4gaW1wb3J0IHN1Ym1vZHVsZVwiLiBUaGlzIGVuYWJsZXMgZGlzdHJpYnV0aW5nIHB5dGhvbiBwYWNrYWdlc1xuICAgICAgICAvLyBhbmQgdXNpbmcgdGhlIGdlbmVyYXRlZCBtb2R1bGVzIGluIHRoZSBzYW1lIGNvZGViYXNlLlxuICAgICAgICBjb25zdCBzdWJtb2R1bGUgPSBtb2R1bGUucHl0aG9uTmFtZS5zdWJzdHJpbmcoXG4gICAgICAgICAgdGhpcy5weXRob25OYW1lLmxlbmd0aCArIDEsXG4gICAgICAgICk7XG4gICAgICAgIGNvZGUubGluZShgZnJvbSAuIGltcG9ydCAke3N1Ym1vZHVsZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdCB0aGUgYmluIHNjcmlwdHMgaWYgYmluIHNlY3Rpb24gZGVmaW5lZC5cbiAgICovXG4gIHB1YmxpYyBlbWl0QmluU2NyaXB0cyhjb2RlOiBDb2RlTWFrZXIpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgaWYgKHRoaXMubG9hZEFzc2VtYmx5KSB7XG4gICAgICBpZiAodGhpcy5hc3NlbWJseS5iaW4gIT0gbnVsbCkge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXModGhpcy5hc3NlbWJseS5iaW4pKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0X2ZpbGUgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAnc3JjJyxcbiAgICAgICAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKHRoaXMucHl0aG9uTmFtZSksXG4gICAgICAgICAgICAnYmluJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2RlLm9wZW5GaWxlKHNjcmlwdF9maWxlKTtcbiAgICAgICAgICBjb2RlLmxpbmUoJyMhL3Vzci9iaW4vZW52IHB5dGhvbicpO1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICAgIGNvZGUubGluZSgnaW1wb3J0IGpzaWknKTtcbiAgICAgICAgICBjb2RlLmxpbmUoJ2ltcG9ydCBzeXMnKTtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgICBlbWl0TGlzdChcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAnX19qc2lpX2Fzc2VtYmx5X18gPSBqc2lpLkpTSUlBc3NlbWJseS5sb2FkKCcsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkubmFtZSksXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkudmVyc2lvbiksXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMucHl0aG9uTmFtZS5yZXBsYWNlKCcuX2pzaWknLCAnJykpLFxuICAgICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5RmlsZW5hbWUpfWAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgJyknLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgZW1pdExpc3QoXG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgJ19fanNpaV9hc3NlbWJseV9fLmludm9rZUJpblNjcmlwdCgnLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5Lm5hbWUpLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuYW1lKSxcbiAgICAgICAgICAgICAgJ3N5cy5hcmd2WzE6XScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgJyknLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29kZS5jbG9zZUZpbGUoc2NyaXB0X2ZpbGUpO1xuICAgICAgICAgIHNjcmlwdHMucHVzaChzY3JpcHRfZmlsZS5yZXBsYWNlKC9cXFxcL2csICcvJykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RpcmVjdENoaWxkKHB5TW9kOiBQeXRob25Nb2R1bGUpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnB5dGhvbk5hbWUgPT09IHB5TW9kLnB5dGhvbk5hbWUgfHxcbiAgICAgICFweU1vZC5weXRob25OYW1lLnN0YXJ0c1dpdGgoYCR7dGhpcy5weXRob25OYW1lfS5gKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBNdXN0IGluY2x1ZGUgb25seSBvbmUgbW9yZSBjb21wb25lbnRcbiAgICByZXR1cm4gIXB5TW9kLnB5dGhvbk5hbWVcbiAgICAgIC5zdWJzdHJpbmcodGhpcy5weXRob25OYW1lLmxlbmd0aCArIDEpXG4gICAgICAuaW5jbHVkZXMoJy4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IHRoZSBSRUFETUUgYXMgbW9kdWxlIGRvY3N0cmluZyBpZiB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBtb2R1bGUgKGl0IGxvYWRzIHRoZSBhc3NlbWJseSlcbiAgICovXG4gIHByaXZhdGUgZW1pdE1vZHVsZURvY3VtZW50YXRpb24oY29kZTogQ29kZU1ha2VyKSB7XG4gICAgaWYgKHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbikge1xuICAgICAgY29kZS5saW5lKERPQ1NUUklOR19RVU9URVMpO1xuICAgICAgY29kZS5saW5lKHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbik7XG4gICAgICBjb2RlLmxpbmUoRE9DU1RSSU5HX1FVT1RFUyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RGVwZW5kZW5jeUltcG9ydHMoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgdGhlIChkaXJlY3QpIGRlcGVuZGVuY2llcycgLl9qc2lpIHBhY2thZ2VzLlxuICAgIGNvbnN0IGRlcHMgPSBPYmplY3Qua2V5cyh0aGlzLmFzc2VtYmx5LmRlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgIC5tYXAoXG4gICAgICAgIChkZXApID0+XG4gICAgICAgICAgdGhpcy5hc3NlbWJseS5kZXBlbmRlbmN5Q2xvc3VyZT8uW2RlcF0/LnRhcmdldHM/LnB5dGhvbj8ubW9kdWxlID8/XG4gICAgICAgICAgZGllKGBObyBQeXRob24gdGFyZ2V0IHdhcyBjb25maWdydWVkIGZvciB0aGUgZGVwZW5kZW5jeSBcIiR7ZGVwfVwiLmApLFxuICAgICAgKVxuICAgICAgLm1hcCgobW9kKSA9PiBgJHttb2R9Ll9qc2lpYClcbiAgICAgIC5zb3J0KCk7XG5cbiAgICAvLyBOb3cgYWN0dWFsbHkgd3JpdGUgdGhlIGltcG9ydCBzdGF0ZW1lbnRzLi4uXG4gICAgaWYgKGRlcHMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZU5hbWUgb2YgZGVwcykge1xuICAgICAgICBjb2RlLmxpbmUoYGltcG9ydCAke21vZHVsZU5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVxdWlyZWRJbXBvcnRzKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCByZXF1aXJlZEltcG9ydHMgPSB0aGlzLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRJbXBvcnRzKVxuICAgICAgLm1hcCgoW3NvdXJjZVBhY2thZ2UsIGl0ZW1zXSkgPT4gdG9JbXBvcnRTdGF0ZW1lbnRzKHNvdXJjZVBhY2thZ2UsIGl0ZW1zKSlcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGVsdCkgPT4gWy4uLmFjYywgLi4uZWx0XSxcbiAgICAgICAgbmV3IEFycmF5PHsgZW1pdDogKCkgPT4gdm9pZDsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9PigpLFxuICAgICAgKVxuICAgICAgLnNvcnQoaW1wb3J0Q29tcGFyYXRvcik7XG5cbiAgICBpZiAoc3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgICAgc3RhdGVtZW50LmVtaXQoY29kZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JbXBvcnRTdGF0ZW1lbnRzKFxuICAgICAgc291cmNlUGtnOiBzdHJpbmcsXG4gICAgICBpdGVtczogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbiAgICApOiBBcnJheTx7IGVtaXQ6IChjb2RlOiBDb2RlTWFrZXIpID0+IHZvaWQ7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PHtcbiAgICAgICAgZW1pdDogKGNvZGU6IENvZGVNYWtlcikgPT4gdm9pZDtcbiAgICAgICAgY29tcGFyaXNvbkJhc2U6IHN0cmluZztcbiAgICAgIH0+KCk7XG4gICAgICBpZiAoaXRlbXMuaGFzKCcnKSkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgY29tcGFyaXNvbkJhc2U6IGBpbXBvcnQgJHtzb3VyY2VQa2d9YCxcbiAgICAgICAgICBlbWl0KGNvZGUpIHtcbiAgICAgICAgICAgIGNvZGUubGluZSh0aGlzLmNvbXBhcmlzb25CYXNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBpZWNlTWVhbCA9IEFycmF5LmZyb20oaXRlbXMpXG4gICAgICAgIC5maWx0ZXIoKGkpID0+IGkgIT09ICcnKVxuICAgICAgICAuc29ydCgpO1xuICAgICAgaWYgKHBpZWNlTWVhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBjb21wYXJpc29uQmFzZTogYGZyb20gJHtzb3VyY2VQa2d9IGltcG9ydGAsXG4gICAgICAgICAgZW1pdDogKGNvZGUpID0+XG4gICAgICAgICAgICBlbWl0TGlzdChjb2RlLCBgZnJvbSAke3NvdXJjZVBrZ30gaW1wb3J0IGAsIHBpZWNlTWVhbCwgJycsIHtcbiAgICAgICAgICAgICAgaWZNdWx0aTogWycoJywgJyknXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW1wb3J0Q29tcGFyYXRvcihcbiAgICAgIGxlZnQ6IHsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9LFxuICAgICAgcmlnaHQ6IHsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9LFxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBsZWZ0LmNvbXBhcmlzb25CYXNlLnN0YXJ0c1dpdGgoJ2ltcG9ydCcpID09PVxuICAgICAgICByaWdodC5jb21wYXJpc29uQmFzZS5zdGFydHNXaXRoKCdpbXBvcnQnKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBsZWZ0LmNvbXBhcmlzb25CYXNlLmxvY2FsZUNvbXBhcmUocmlnaHQuY29tcGFyaXNvbkJhc2UpO1xuICAgICAgfVxuICAgICAgLy8gV2Ugd2FudCBcImZyb20gLmZvbyBpbXBvcnQgKC4uLilcIiB0byBiZSAqYWZ0ZXIqIFwiaW1wb3J0IGJhclwiXG4gICAgICByZXR1cm4gcmlnaHQuY29tcGFyaXNvbkJhc2UubG9jYWxlQ29tcGFyZShsZWZ0LmNvbXBhcmlzb25CYXNlKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIFBhY2thZ2VEYXRhIHtcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgZGF0YTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5jbGFzcyBQYWNrYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBQeXRob25Nb2R1bGUgdGhhdCByZXByZXNlbnRzIHRoZSByb290IG1vZHVsZSBvZiB0aGUgcGFja2FnZVxuICAgKi9cbiAgcHVibGljIHJvb3RNb2R1bGU/OiBQeXRob25Nb2R1bGU7XG5cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG1ldGFkYXRhOiBzcGVjLkFzc2VtYmx5O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBQeXRob25Nb2R1bGU+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBQYWNrYWdlRGF0YVtdPigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgbWV0YWRhdGE6IHNwZWMuQXNzZW1ibHkpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICB9XG5cbiAgcHVibGljIGFkZE1vZHVsZShtb2R1bGU6IFB5dGhvbk1vZHVsZSkge1xuICAgIHRoaXMubW9kdWxlcy5zZXQobW9kdWxlLnB5dGhvbk5hbWUsIG1vZHVsZSk7XG5cbiAgICAvLyBUaGlzIGlzIHRoZSBtb2R1bGUgdGhhdCByZXByZXNlbnRzIHRoZSBhc3NlbWJseVxuICAgIGlmIChtb2R1bGUuZnFuID09PSB0aGlzLm1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSA9IG1vZHVsZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkRGF0YShcbiAgICBtb2R1bGU6IFB5dGhvbk1vZHVsZSxcbiAgICBmaWxlbmFtZTogc3RyaW5nLFxuICAgIGRhdGE6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEuaGFzKG1vZHVsZS5weXRob25OYW1lKSkge1xuICAgICAgdGhpcy5kYXRhLnNldChtb2R1bGUucHl0aG9uTmFtZSwgW10pO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YS5nZXQobW9kdWxlLnB5dGhvbk5hbWUpIS5wdXNoKHsgZmlsZW5hbWUsIGRhdGEgfSk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGUoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IG1vZHVsZXMgPSBbLi4udGhpcy5tb2R1bGVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5weXRob25OYW1lLmxvY2FsZUNvbXBhcmUoYi5weXRob25OYW1lKSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIG9mIG91ciBtb2R1bGVzLCBhbmQgd3JpdGUgdGhlbSBvdXQgdG8gZGlzay5cbiAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2R1bGVzKSB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihcbiAgICAgICAgJ3NyYycsXG4gICAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKG1vZC5weXRob25OYW1lKSxcbiAgICAgICAgJ19faW5pdF9fLnB5JyxcbiAgICAgICk7XG5cbiAgICAgIGNvZGUub3BlbkZpbGUoZmlsZW5hbWUpO1xuICAgICAgbW9kLmVtaXQoY29kZSwgY29udGV4dCk7XG4gICAgICBjb2RlLmNsb3NlRmlsZShmaWxlbmFtZSk7XG5cbiAgICAgIHNjcmlwdHMucHVzaCguLi5tb2QuZW1pdEJpblNjcmlwdHMoY29kZSkpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvdXIgcGFja2FnZSBkYXRhLlxuICAgIGNvbnN0IHBhY2thZ2VEYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFttb2QsIHBkYXRhXSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGZvciAoY29uc3QgZGF0YSBvZiBwZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5kYXRhICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICdzcmMnLFxuICAgICAgICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUobW9kKSxcbiAgICAgICAgICAgIGRhdGEuZmlsZW5hbWUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvZGUub3BlbkZpbGUoZmlsZXBhdGgpO1xuICAgICAgICAgIGNvZGUubGluZShkYXRhLmRhdGEpO1xuICAgICAgICAgIGNvZGUuY2xvc2VGaWxlKGZpbGVwYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYWNrYWdlRGF0YVttb2RdID0gcGRhdGEubWFwKChwZCkgPT4gcGQuZmlsZW5hbWUpO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgb3VyIGxpc3Qgb2YgZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2RlcE5hbWUsIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgdGhpcy5tZXRhZGF0YS5kZXBlbmRlbmNpZXMgPz8ge30sXG4gICAgKSkge1xuICAgICAgY29uc3QgZGVwSW5mbyA9IHRoaXMubWV0YWRhdGEuZGVwZW5kZW5jeUNsb3N1cmUhW2RlcE5hbWVdO1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICAgIGAke2RlcEluZm8udGFyZ2V0cyEucHl0aG9uIS5kaXN0TmFtZX0ke3RvUHl0aG9uVmVyc2lvblJhbmdlKHZlcnNpb24pfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE5lZWQgdG8gYWx3YXlzIHdyaXRlIHRoaXMgZmlsZSBhcyB0aGUgYnVpbGQgcHJvY2VzcyBkZXBlbmRzIG9uIGl0LlxuICAgIC8vIE1ha2UgdXAgc29tZSBjb250ZW50cyBpZiB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHVzZWZ1bCB0byBzYXkuXG4gICAgY29kZS5vcGVuRmlsZSgnUkVBRE1FLm1kJyk7XG4gICAgY29kZS5saW5lKFxuICAgICAgdGhpcy5yb290TW9kdWxlPy5tb2R1bGVEb2N1bWVudGF0aW9uID8/XG4gICAgICAgIGAke3RoaXMubmFtZX1cXG4keyc9Jy5yZXBlYXQodGhpcy5uYW1lLmxlbmd0aCl9YCxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdSRUFETUUubWQnKTtcblxuICAgIC8vIFN0cmlwIFwiIChidWlsZCBhYmNkZWYpXCIgZnJvbSB0aGUganNpaSB2ZXJzaW9uXG4gICAgY29uc3QganNpaVZlcnNpb25TaW1wbGUgPSB0aGlzLm1ldGFkYXRhLmpzaWlWZXJzaW9uLnJlcGxhY2UoLyAuKiQvLCAnJyk7XG5cbiAgICBjb25zdCBzZXR1cEt3YXJncyA9IHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgbGljZW5zZTogdGhpcy5tZXRhZGF0YS5saWNlbnNlLFxuICAgICAgdXJsOiB0aGlzLm1ldGFkYXRhLmhvbWVwYWdlLFxuICAgICAgbG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGU6ICd0ZXh0L21hcmtkb3duJyxcbiAgICAgIGF1dGhvcjpcbiAgICAgICAgdGhpcy5tZXRhZGF0YS5hdXRob3IubmFtZSArXG4gICAgICAgICh0aGlzLm1ldGFkYXRhLmF1dGhvci5lbWFpbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBgPCR7dGhpcy5tZXRhZGF0YS5hdXRob3IuZW1haWx9PmBcbiAgICAgICAgICA6ICcnKSxcbiAgICAgIGJkaXN0X3doZWVsOiB7XG4gICAgICAgIHVuaXZlcnNhbDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBwcm9qZWN0X3VybHM6IHtcbiAgICAgICAgU291cmNlOiB0aGlzLm1ldGFkYXRhLnJlcG9zaXRvcnkudXJsLFxuICAgICAgfSxcbiAgICAgIHBhY2thZ2VfZGlyOiB7ICcnOiAnc3JjJyB9LFxuICAgICAgcGFja2FnZXM6IG1vZHVsZXMubWFwKChtKSA9PiBtLnB5dGhvbk5hbWUpLFxuICAgICAgcGFja2FnZV9kYXRhOiBwYWNrYWdlRGF0YSxcbiAgICAgIHB5dGhvbl9yZXF1aXJlczogJ349My43JyxcbiAgICAgIGluc3RhbGxfcmVxdWlyZXM6IFtcbiAgICAgICAgYGpzaWkke3RvUHl0aG9uVmVyc2lvblJhbmdlKGBeJHtqc2lpVmVyc2lvblNpbXBsZX1gKX1gLFxuICAgICAgICAncHVibGljYXRpb24+PTAuMC4zJyxcbiAgICAgIF1cbiAgICAgICAgLmNvbmNhdChkZXBlbmRlbmNpZXMpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICBjbGFzc2lmaWVyczogW1xuICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsXG4gICAgICAgICdPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IEphdmFTY3JpcHQnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMgOjogT25seScsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy43JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjgnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuOScsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4xMCcsXG4gICAgICAgICdUeXBpbmcgOjogVHlwZWQnLFxuICAgICAgXSxcbiAgICAgIHNjcmlwdHMsXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy5tZXRhZGF0YS5kb2NzPy5zdGFiaWxpdHkpIHtcbiAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuRXhwZXJpbWVudGFsOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdEZXZlbG9wbWVudCBTdGF0dXMgOjogNCAtIEJldGEnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LlN0YWJsZTpcbiAgICAgICAgc2V0dXBLd2FyZ3MuY2xhc3NpZmllcnMucHVzaChcbiAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZScsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5EZXByZWNhdGVkOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdEZXZlbG9wbWVudCBTdGF0dXMgOjogNyAtIEluYWN0aXZlJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIE5vICdEZXZlbG9wbWVudCBTdGF0dXMnIHRyb3ZlIGNsYXNzaWZpZXIgZm9yIHlvdSFcbiAgICB9XG5cbiAgICBpZiAoc3BkeExpY2Vuc2VMaXN0W3RoaXMubWV0YWRhdGEubGljZW5zZV0/Lm9zaUFwcHJvdmVkKSB7XG4gICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZGl0aW9uYWxDbGFzc2lmaWVycyA9IHRoaXMubWV0YWRhdGEudGFyZ2V0cz8ucHl0aG9uPy5jbGFzc2lmaWVycztcbiAgICBpZiAoYWRkaXRpb25hbENsYXNzaWZpZXJzICE9IG51bGwpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhZGRpdGlvbmFsQ2xhc3NpZmllcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIFwianNpaS50YXJnZXRzLnB5dGhvbi5jbGFzc2lmaWVyc1wiIHZhbHVlIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyBpZiBwcm92aWRlZCwgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBhZGRpdGlvbmFsQ2xhc3NpZmllcnMsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBXZSBkaXNjb3VyYWdlIHVzaW5nIHRob3NlIHNpbmNlIHdlIGF1dG9tYXRpY2FsbHkgc2V0IGEgdmFsdWUgZm9yIHRoZW1cbiAgICAgIGZvciAobGV0IGNsYXNzaWZpZXIgb2YgYWRkaXRpb25hbENsYXNzaWZpZXJzLnNvcnQoKSkge1xuICAgICAgICBpZiAodHlwZW9mIGNsYXNzaWZpZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBcImpzaWkudGFyZ2V0cy5weXRob24uY2xhc3NpZmllcnNcIiB2YWx1ZSBjYW4gb25seSBjb250YWluIHN0cmluZ3MsIGJ1dCBmb3VuZCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICBjbGFzc2lmaWVyLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UnbGwgc3BsaXQgb24gYDo6YCBhbmQgcmUtam9pbiBsYXRlciBzbyBjbGFzc2lmaWVycyBhcmUgXCJub3JtYWxpemVkXCIgdG8gYSBzdGFuZGFyZCBzcGFjaW5nXG4gICAgICAgIGNvbnN0IHBhcnRzID0gY2xhc3NpZmllci5zcGxpdCgnOjonKS5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKTtcbiAgICAgICAgY29uc3QgcmVzZXJ2ZWRDbGFzc2lmaWVycyA9IFtcbiAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzJyxcbiAgICAgICAgICAnTGljZW5zZScsXG4gICAgICAgICAgJ09wZXJhdGluZyBTeXN0ZW0nLFxuICAgICAgICAgICdUeXBpbmcnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAocmVzZXJ2ZWRDbGFzc2lmaWVycy5pbmNsdWRlcyhwYXJ0c1swXSkpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYENsYXNzaWZpZXJzIHN0YXJ0aW5nIHdpdGggJHtyZXNlcnZlZENsYXNzaWZpZXJzXG4gICAgICAgICAgICAgIC5tYXAoKHgpID0+IGBcIiR7eH0gOjpcImApXG4gICAgICAgICAgICAgIC5qb2luKFxuICAgICAgICAgICAgICAgICcsICcsXG4gICAgICAgICAgICAgICl9IGFyZSBhdXRvbWF0aWNhbGx5IHNldCBhbmQgc2hvdWxkIG5vdCBiZSBtYW51YWxseSBjb25maWd1cmVkYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzaWZpZXIgPSBwYXJ0cy5qb2luKCcgOjogJyk7XG4gICAgICAgIGlmIChzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5pbmNsdWRlcyhjbGFzc2lmaWVyKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goY2xhc3NpZmllcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgTmVlZCBhIHNldHVwLnB5IHRvIG1ha2UgdGhpcyBQYWNrYWdlLCBhY3R1YWxseSBhIFBhY2thZ2UuXG4gICAgY29kZS5vcGVuRmlsZSgnc2V0dXAucHknKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBqc29uJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgc2V0dXB0b29scycpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgna3dhcmdzID0ganNvbi5sb2FkcygnKTtcbiAgICBjb2RlLmxpbmUoJyAgICBcIlwiXCInKTtcbiAgICBjb2RlLmxpbmUoSlNPTi5zdHJpbmdpZnkoc2V0dXBLd2FyZ3MsIG51bGwsIDQpKTtcbiAgICBjb2RlLmxpbmUoJ1wiXCJcIicpO1xuICAgIGNvZGUubGluZSgnKScpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCd3aXRoIG9wZW4oXCJSRUFETUUubWRcIiwgZW5jb2Rpbmc9XCJ1dGY4XCIpIGFzIGZwJyk7XG4gICAgY29kZS5saW5lKCdrd2FyZ3NbXCJsb25nX2Rlc2NyaXB0aW9uXCJdID0gZnAucmVhZCgpJyk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdzZXR1cHRvb2xzLnNldHVwKCoqa3dhcmdzKScpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdzZXR1cC5weScpO1xuXG4gICAgLy8gQmVjYXVzZSB3ZSdyZSBnb29kIGNpdGl6ZW5zLCB3ZSdyZSBnb2luZyB0byBnbyBhaGVhZCBhbmQgc3VwcG9ydCBweXByb2plY3QudG9tbFxuICAgIC8vIGFzIHdlbGwuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgZWFzaWVyIHRvIGp1c3QgdXNlIGEgVE9NTCBsaWJyYXJ5IHRvIHdyaXRlIHRoaXMgb3V0LlxuICAgIGNvZGUub3BlbkZpbGUoJ3B5cHJvamVjdC50b21sJyk7XG4gICAgY29kZS5saW5lKCdbYnVpbGQtc3lzdGVtXScpO1xuICAgIGNvbnN0IGJ1aWxkVG9vbHMgPSBmc1xuICAgICAgLnJlYWRGaWxlU3luYyhyZXF1aXJlbWVudHNGaWxlLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAubWFwKChsaW5lKSA9PiAvXlxccyooLispXFxzKiNcXHMqYnVpbGQtc3lzdGVtXFxzKiQvLmV4ZWMobGluZSk/LlsxXT8udHJpbSgpKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKGJ1aWxkVG9vbHMsIGVudHJ5KSA9PiAoZW50cnkgPyBbLi4uYnVpbGRUb29scywgZW50cnldIDogYnVpbGRUb29scyksXG4gICAgICAgIG5ldyBBcnJheTxzdHJpbmc+KCksXG4gICAgICApO1xuICAgIGNvZGUubGluZShgcmVxdWlyZXMgPSBbJHtidWlsZFRvb2xzLm1hcCgoeCkgPT4gYFwiJHt4fVwiYCkuam9pbignLCAnKX1dYCk7XG4gICAgY29kZS5saW5lKCdidWlsZC1iYWNrZW5kID0gXCJzZXR1cHRvb2xzLmJ1aWxkX21ldGFcIicpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdweXByb2plY3QudG9tbCcpO1xuXG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIHdyaXRlIG91dCBhIE1BTklGRVNULmluIHRvIGVuc3VyZSB0aGF0IGFsbCBvZiBvdXIgcmVxdWlyZWRcbiAgICAvLyBmaWxlcyBhcmUgaW5jbHVkZWQuXG4gICAgY29kZS5vcGVuRmlsZSgnTUFOSUZFU1QuaW4nKTtcbiAgICBjb2RlLmxpbmUoJ2luY2x1ZGUgcHlwcm9qZWN0LnRvbWwnKTtcbiAgICBjb2RlLmNsb3NlRmlsZSgnTUFOSUZFU1QuaW4nKTtcbiAgfVxufVxuXG50eXBlIEZpbmRNb2R1bGVDYWxsYmFjayA9IChmcW46IHN0cmluZykgPT4gc3BlYy5Bc3NlbWJseUNvbmZpZ3VyYXRpb247XG50eXBlIEZpbmRUeXBlQ2FsbGJhY2sgPSAoZnFuOiBzdHJpbmcpID0+IHNwZWMuVHlwZTtcblxuY2xhc3MgVHlwZVJlc29sdmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRUbz86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZFJlITogUmVnRXhwO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZU5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlUmUhOiBSZWdFeHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmluZE1vZHVsZTogRmluZE1vZHVsZUNhbGxiYWNrO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbmRUeXBlOiBGaW5kVHlwZUNhbGxiYWNrO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT4sXG4gICAgZmluZE1vZHVsZTogRmluZE1vZHVsZUNhbGxiYWNrLFxuICAgIGZpbmRUeXBlOiBGaW5kVHlwZUNhbGxiYWNrLFxuICAgIGJvdW5kVG8/OiBzdHJpbmcsXG4gICAgbW9kdWxlTmFtZT86IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy50eXBlcyA9IHR5cGVzO1xuICAgIHRoaXMuZmluZE1vZHVsZSA9IGZpbmRNb2R1bGU7XG4gICAgdGhpcy5maW5kVHlwZSA9IGZpbmRUeXBlO1xuICAgIHRoaXMubW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7XG4gICAgdGhpcy5ib3VuZFRvID0gYm91bmRUbyAhPT0gdW5kZWZpbmVkID8gdGhpcy50b1B5dGhvbkZRTihib3VuZFRvKSA6IGJvdW5kVG87XG5cbiAgICBpZiAodGhpcy5tb2R1bGVOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubW9kdWxlUmUgPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXigke2VzY2FwZVN0cmluZ1JlZ2V4cCh0aGlzLm1vZHVsZU5hbWUpfSlcXFxcLiguKykkYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYm91bmRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJvdW5kUmUgPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXigke2VzY2FwZVN0cmluZ1JlZ2V4cCh0aGlzLmJvdW5kVG8pfSlcXFxcLiguKykkYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJpbmQoZnFuOiBzdHJpbmcsIG1vZHVsZU5hbWU/OiBzdHJpbmcpOiBUeXBlUmVzb2x2ZXIge1xuICAgIHJldHVybiBuZXcgVHlwZVJlc29sdmVyKFxuICAgICAgdGhpcy50eXBlcyxcbiAgICAgIHRoaXMuZmluZE1vZHVsZSxcbiAgICAgIHRoaXMuZmluZFR5cGUsXG4gICAgICBmcW4sXG4gICAgICBtb2R1bGVOYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoJy4nKVxuICAgICAgICAgID8gYCR7dGhpcy5tb2R1bGVOYW1lfSR7bW9kdWxlTmFtZX1gXG4gICAgICAgICAgOiBtb2R1bGVOYW1lXG4gICAgICAgIDogdGhpcy5tb2R1bGVOYW1lLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaXNJbk1vZHVsZSh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPVxuICAgICAgdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdGhpcy50b1B5dGhvbkZRTih0eXBlUmVmLmZxbikgOiB0eXBlUmVmO1xuICAgIHJldHVybiB0aGlzLm1vZHVsZVJlLnRlc3QocHl0aG9uVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgaXNJbk5hbWVzcGFjZSh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPVxuICAgICAgdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdGhpcy50b1B5dGhvbkZRTih0eXBlUmVmLmZxbikgOiB0eXBlUmVmO1xuICAgIHJldHVybiB0aGlzLmJvdW5kUmUudGVzdChweXRob25UeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJlbnQodHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UgfCBzdHJpbmcpOiBQeXRob25UeXBlIHtcbiAgICBjb25zdCBmcW4gPSB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0eXBlUmVmLmZxbiA6IHR5cGVSZWY7XG4gICAgY29uc3QgbWF0Y2hlcyA9IC9eKC4rKVxcLlteLl0rJC8uZXhlYyhmcW4pO1xuICAgIGlmIChtYXRjaGVzID09IG51bGwgfHwgIUFycmF5LmlzQXJyYXkobWF0Y2hlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBGUU46ICR7ZnFufWApO1xuICAgIH1cbiAgICBjb25zdCBbLCBwYXJlbnRGUU5dID0gbWF0Y2hlcztcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnR5cGVzLmdldChwYXJlbnRGUU4pO1xuXG4gICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHBhcmVudDogICR7cGFyZW50RlFOfWApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVmaW5pbmdQeXRob25Nb2R1bGUoXG4gICAgdHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UgfCBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZnFuID0gdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdHlwZVJlZi5mcW4gOiB0eXBlUmVmO1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMudHlwZXMuZ2V0KGZxbik7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBsZXQgbW9kID0gcGFyZW50O1xuICAgICAgd2hpbGUgKCEobW9kIGluc3RhbmNlb2YgUHl0aG9uTW9kdWxlKSkge1xuICAgICAgICBtb2QgPSB0aGlzLmdldFBhcmVudChtb2QuZnFuISk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbW9kLnB5dGhvbk5hbWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2hlcyA9IC9eKFteLl0rKVxcLi8uZXhlYyhmcW4pO1xuICAgIGlmIChtYXRjaGVzID09IG51bGwgfHwgIUFycmF5LmlzQXJyYXkobWF0Y2hlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBGUU46ICR7ZnFufWApO1xuICAgIH1cbiAgICBjb25zdCBbLCBhc3NtXSA9IG1hdGNoZXM7XG4gICAgcmV0dXJuIHRoaXMuZmluZE1vZHVsZShhc3NtKS50YXJnZXRzIS5weXRob24hLm1vZHVsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUeXBlKHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlKTogUHl0aG9uVHlwZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZXMuZ2V0KHR5cGVSZWYuZnFuKTtcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvY2F0ZSB0eXBlOiBcIiR7dHlwZVJlZi5mcW59XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBkZXJlZmVyZW5jZSh0eXBlUmVmOiBzdHJpbmcgfCBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSk6IHNwZWMuVHlwZSB7XG4gICAgaWYgKHR5cGVvZiB0eXBlUmVmICE9PSAnc3RyaW5nJykge1xuICAgICAgdHlwZVJlZiA9IHR5cGVSZWYuZnFuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5kVHlwZSh0eXBlUmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9QeXRob25GUU4oZnFuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IFthc3NlbWJseU5hbWUsIC4uLnF1YWxpZmllZElkZW50aWZpZXJzXSA9IGZxbi5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGZxblBhcnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgIHRoaXMuZmluZE1vZHVsZShhc3NlbWJseU5hbWUpLnRhcmdldHMhLnB5dGhvbiEubW9kdWxlLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcXVhbGlmaWVkSWRlbnRpZmllcnMpIHtcbiAgICAgIGZxblBhcnRzLnB1c2godG9QeXRob25JZGVudGlmaWVyKHBhcnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnFuUGFydHMuam9pbignLicpO1xuICB9XG59XG5cbmNsYXNzIFB5dGhvbkdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7XG4gIHByaXZhdGUgcGFja2FnZSE6IFBhY2thZ2U7XG4gIHByaXZhdGUgcm9vdE1vZHVsZT86IFB5dGhvbk1vZHVsZTtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm9zZXR0YTogUm9zZXR0YSxcbiAgICBvcHRpb25zOiBHZW5lcmF0b3JPcHRpb25zID0ge30sXG4gICkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9ja0Zvcm1hdHRlciA9IChzKSA9PiBgJHtzfTpgO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrRm9ybWF0dGVyID0gKF9zKSA9PiBmYWxzZTtcblxuICAgIHRoaXMudHlwZXMgPSBuZXcgTWFwKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBwdWJsaWMgZW1pdERvY1N0cmluZyhcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgYXBpTG9jYXRpb246IEFwaUxvY2F0aW9uLFxuICAgIGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiB7XG4gICAgICBhcmd1bWVudHM/OiBEb2N1bWVudGFibGVBcmd1bWVudFtdO1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbT86IHN0cmluZztcbiAgICAgIHRyYWlsaW5nTmV3TGluZT86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICBpZiAoKCFkb2NzIHx8IE9iamVjdC5rZXlzKGRvY3MpLmxlbmd0aCA9PT0gMCkgJiYgIW9wdGlvbnMuYXJndW1lbnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZG9jcykge1xuICAgICAgZG9jcyA9IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGlmIChkb2NzLnN1bW1hcnkpIHtcbiAgICAgIGxpbmVzLnB1c2gobWQycnN0KHJlbmRlclN1bW1hcnkoZG9jcykpKTtcbiAgICAgIGJyaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBicmsoKSB7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJsb2NrKGhlYWRpbmc6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBkb0JyayA9IHRydWUpIHtcbiAgICAgIGlmIChkb0Jyaykge1xuICAgICAgICBicmsoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRlbnRMaW5lcyA9IG1kMnJzdChjb250ZW50KS5zcGxpdCgnXFxuJyk7XG4gICAgICBpZiAoY29udGVudExpbmVzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYDoke2hlYWRpbmd9OiAke2NvbnRlbnRMaW5lcy5qb2luKCcnKX1gLnRyaW0oKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lcy5wdXNoKGA6JHtoZWFkaW5nfTpgKTtcbiAgICAgICAgYnJrKCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50TGluZXMpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRvQnJrKSB7XG4gICAgICAgIGJyaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkb2NzLnJlbWFya3MpIHtcbiAgICAgIGJyaygpO1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgLi4ubWQycnN0KHRoaXMuY29udmVydE1hcmtkb3duKGRvY3MucmVtYXJrcyA/PyAnJywgYXBpTG9jYXRpb24pKS5zcGxpdChcbiAgICAgICAgICAnXFxuJyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBicmsoKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hcmd1bWVudHM/Lmxlbmd0aCA/PyAwID4gMCkge1xuICAgICAgYnJrKCk7XG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIG9wdGlvbnMuYXJndW1lbnRzISkge1xuICAgICAgICAvLyBBZGQgYSBsaW5lIGZvciBldmVyeSBhcmd1bWVudC4gRXZlbiBpZiB0aGVyZSBpcyBubyBkZXNjcmlwdGlvbiwgd2UgbmVlZFxuICAgICAgICAvLyB0aGUgZG9jc3RyaW5nIHNvIHRoYXQgdGhlIFNwaGlueCBleHRlbnNpb24gY2FuIGFkZCB0aGUgdHlwZSBhbm5vdGF0aW9ucy5cbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgOnBhcmFtICR7dG9QeXRob25QYXJhbWV0ZXJOYW1lKHBhcmFtLm5hbWUpfTogJHtvbmVsaW5lRGVzY3JpcHRpb24oXG4gICAgICAgICAgICBwYXJhbS5kb2NzLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyaygpO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmRlZmF1bHQpIHtcbiAgICAgIGJsb2NrKCdkZWZhdWx0JywgZG9jcy5kZWZhdWx0KTtcbiAgICB9XG4gICAgaWYgKGRvY3MucmV0dXJucykge1xuICAgICAgYmxvY2soJ3JldHVybicsIGRvY3MucmV0dXJucyk7XG4gICAgfVxuICAgIGlmIChkb2NzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIGJsb2NrKCdkZXByZWNhdGVkJywgZG9jcy5kZXByZWNhdGVkKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc2VlKSB7XG4gICAgICBibG9jaygnc2VlJywgZG9jcy5zZWUsIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc3RhYmlsaXR5ICYmIHNob3VsZE1lbnRpb25TdGFiaWxpdHkoZG9jcy5zdGFiaWxpdHkpKSB7XG4gICAgICBibG9jaygnc3RhYmlsaXR5JywgZG9jcy5zdGFiaWxpdHksIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc3ViY2xhc3NhYmxlKSB7XG4gICAgICBibG9jaygnc3ViY2xhc3NhYmxlJywgJ1llcycpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRvY3MuY3VzdG9tID8/IHt9KSkge1xuICAgICAgYmxvY2soaywgdiwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmV4YW1wbGUpIHtcbiAgICAgIGJyaygpO1xuICAgICAgbGluZXMucHVzaCgnRXhhbXBsZTo6Jyk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIGNvbnN0IGV4YW1wbGVUZXh0ID0gdGhpcy5jb252ZXJ0RXhhbXBsZShkb2NzLmV4YW1wbGUsIGFwaUxvY2F0aW9uKTtcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGV4YW1wbGVUZXh0LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICBsaW5lcy5wdXNoKGAgICAgJHtsaW5lfWApO1xuICAgICAgfVxuICAgICAgYnJrKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGxpbmVzLmxlbmd0aCA+IDAgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPT09ICcnKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICB9XG5cbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29kZS5saW5lKGAke0RPQ1NUUklOR19RVU9URVN9JHtsaW5lc1swXX0ke0RPQ1NUUklOR19RVU9URVN9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZShgJHtET0NTVFJJTkdfUVVPVEVTfSR7bGluZXNbMF19YCk7XG4gICAgICBsaW5lcy5zcGxpY2UoMCwgMSk7XG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBjb2RlLmxpbmUobGluZSk7XG4gICAgICB9XG5cbiAgICAgIGNvZGUubGluZShET0NTVFJJTkdfUVVPVEVTKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudHJhaWxpbmdOZXdMaW5lKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY29udmVydEV4YW1wbGUoZXhhbXBsZTogc3RyaW5nLCBhcGlMb2M6IEFwaUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCB0cmFuc2xhdGVkID0gdGhpcy5yb3NldHRhLnRyYW5zbGF0ZUV4YW1wbGUoXG4gICAgICBhcGlMb2MsXG4gICAgICBleGFtcGxlLFxuICAgICAgVGFyZ2V0TGFuZ3VhZ2UuUFlUSE9OLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICk7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWQuc291cmNlO1xuICB9XG5cbiAgcHVibGljIGNvbnZlcnRNYXJrZG93bihtYXJrZG93bjogc3RyaW5nLCBhcGlMb2M6IEFwaUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yb3NldHRhLnRyYW5zbGF0ZVNuaXBwZXRzSW5NYXJrZG93bihcbiAgICAgIGFwaUxvYyxcbiAgICAgIG1hcmtkb3duLFxuICAgICAgVGFyZ2V0TGFuZ3VhZ2UuUFlUSE9OLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHl0aG9uVHlwZShmcW46IHN0cmluZyk6IFB5dGhvblR5cGUge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGVzLmdldChmcW4pO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9jYXRlIHR5cGU6IFwiJHtmcW59XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBc3NlbWJseU91dHB1dERpcihhc3NtOiBzcGVjLkFzc2VtYmx5KSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihcbiAgICAgICdzcmMnLFxuICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUodGhpcy5nZXRBc3NlbWJseU1vZHVsZU5hbWUoYXNzbSkpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkFzc2VtYmx5KGFzc206IHNwZWMuQXNzZW1ibHksIF9maW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIHRoaXMucGFja2FnZSA9IG5ldyBQYWNrYWdlKFxuICAgICAgYXNzbS50YXJnZXRzIS5weXRob24hLmRpc3ROYW1lLFxuICAgICAgdG9SZWxlYXNlVmVyc2lvbihhc3NtLnZlcnNpb24sIFRhcmdldE5hbWUuUFlUSE9OKSxcbiAgICAgIGFzc20sXG4gICAgKTtcblxuICAgIC8vIFRoaXMgaXMgdGhlICc8cGFja2FnZW5hbWU+Ll9qc2lpJyBtb2R1bGUgZm9yIHRoaXMgYXNzZW1ibHlcbiAgICBjb25zdCBhc3NlbWJseU1vZHVsZSA9IG5ldyBQeXRob25Nb2R1bGUoXG4gICAgICB0aGlzLmdldEFzc2VtYmx5TW9kdWxlTmFtZShhc3NtKSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgYXNzZW1ibHk6IGFzc20sXG4gICAgICAgIGFzc2VtYmx5RmlsZW5hbWU6IHRoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpLFxuICAgICAgICBsb2FkQXNzZW1ibHk6IHRydWUsXG4gICAgICAgIHBhY2thZ2U6IHRoaXMucGFja2FnZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMucGFja2FnZS5hZGRNb2R1bGUoYXNzZW1ibHlNb2R1bGUpO1xuICAgIHRoaXMucGFja2FnZS5hZGREYXRhKGFzc2VtYmx5TW9kdWxlLCB0aGlzLmdldEFzc2VtYmx5RmlsZU5hbWUoKSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZEFzc2VtYmx5KGFzc206IHNwZWMuQXNzZW1ibHksIF9maW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIGNvbnN0IHJlc29sdmVyID0gbmV3IFR5cGVSZXNvbHZlcihcbiAgICAgIHRoaXMudHlwZXMsXG4gICAgICAoZnFuOiBzdHJpbmcpID0+IHRoaXMuZmluZE1vZHVsZShmcW4pLFxuICAgICAgKGZxbjogc3RyaW5nKSA9PiB0aGlzLmZpbmRUeXBlKGZxbiksXG4gICAgKTtcbiAgICB0aGlzLnBhY2thZ2Uud3JpdGUodGhpcy5jb2RlLCB7XG4gICAgICBhc3NlbWJseTogYXNzbSxcbiAgICAgIGVtaXR0ZWRUeXBlczogbmV3IFNldCgpLFxuICAgICAgcmVzb2x2ZXIsXG4gICAgICBzdWJtb2R1bGU6IGFzc20ubmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaWxsIGJlIGNhbGxlZCBmb3IgYXNzZW1ibHkgcm9vdCwgbmFtZXNwYWNlcyBhbmQgc3VibW9kdWxlcyAoYW55dGhpbmcgdGhhdCBjb250YWlucyBvdGhlciB0eXBlcywgYmFzZWQgb24gaXRzIEZRTilcbiAgICovXG4gIHByb3RlY3RlZCBvbkJlZ2luTmFtZXNwYWNlKG5zOiBzdHJpbmcpIHtcbiAgICAvLyAnbnMnIGNvbnRhaW5zIHNvbWV0aGluZyBsaWtlICdAc2NvcGUvanNpaS1jYWxjLWJhc2Utb2YtYmFzZSdcbiAgICBjb25zdCBzdWJtb2R1bGVMaWtlID1cbiAgICAgIG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWVcbiAgICAgICAgPyB0aGlzLmFzc2VtYmx5XG4gICAgICAgIDogdGhpcy5hc3NlbWJseS5zdWJtb2R1bGVzPy5bbnNdO1xuXG4gICAgY29uc3QgcmVhZG1lTG9jYXRpb246IEFwaUxvY2F0aW9uID0geyBhcGk6ICdtb2R1bGVSZWFkbWUnLCBtb2R1bGVGcW46IG5zIH07XG5cbiAgICBjb25zdCBtb2R1bGUgPSBuZXcgUHl0aG9uTW9kdWxlKHRvUGFja2FnZU5hbWUobnMsIHRoaXMuYXNzZW1ibHkpLCBucywge1xuICAgICAgYXNzZW1ibHk6IHRoaXMuYXNzZW1ibHksXG4gICAgICBhc3NlbWJseUZpbGVuYW1lOiB0aGlzLmdldEFzc2VtYmx5RmlsZU5hbWUoKSxcbiAgICAgIHBhY2thZ2U6IHRoaXMucGFja2FnZSxcbiAgICAgIG1vZHVsZURvY3VtZW50YXRpb246IHN1Ym1vZHVsZUxpa2U/LnJlYWRtZVxuICAgICAgICA/IHRoaXMuY29udmVydE1hcmtkb3duKFxuICAgICAgICAgICAgc3VibW9kdWxlTGlrZS5yZWFkbWU/Lm1hcmtkb3duLFxuICAgICAgICAgICAgcmVhZG1lTG9jYXRpb24sXG4gICAgICAgICAgKS50cmltKClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhY2thZ2UuYWRkTW9kdWxlKG1vZHVsZSk7XG4gICAgdGhpcy50eXBlcy5zZXQobnMsIG1vZHVsZSk7XG4gICAgaWYgKG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWUpIHtcbiAgICAgIC8vIFRoaXMgYXBwbGllcyByZWN1cnNpdmVseSB0byBzdWJtb2R1bGVzLCBzbyBubyBuZWVkIHRvIGR1cGxpY2F0ZSFcbiAgICAgIHRoaXMucGFja2FnZS5hZGREYXRhKG1vZHVsZSwgJ3B5LnR5cGVkJywgJycpO1xuICAgIH1cblxuICAgIGlmIChucyA9PT0gdGhpcy5hc3NlbWJseS5uYW1lKSB7XG4gICAgICB0aGlzLnJvb3RNb2R1bGUgPSBtb2R1bGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSEuYWRkUHl0aG9uTW9kdWxlKG1vZHVsZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kTmFtZXNwYWNlKG5zOiBzdHJpbmcpIHtcbiAgICBpZiAobnMgPT09IHRoaXMuYXNzZW1ibHkubmFtZSkge1xuICAgICAgZGVsZXRlIHRoaXMucm9vdE1vZHVsZTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkNsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUsIGFic3RyYWN0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qga2xhc3MgPSBuZXcgQ2xhc3MoXG4gICAgICB0aGlzLFxuICAgICAgdG9QeXRob25JZGVudGlmaWVyKGNscy5uYW1lKSxcbiAgICAgIGNscyxcbiAgICAgIGNscy5mcW4sXG4gICAgICB7XG4gICAgICAgIGFic3RyYWN0LFxuICAgICAgICBiYXNlczogY2xzLmJhc2UgPyBbdGhpcy5maW5kVHlwZShjbHMuYmFzZSldIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcmZhY2VzOiBjbHMuaW50ZXJmYWNlcz8ubWFwKChiYXNlKSA9PiB0aGlzLmZpbmRUeXBlKGJhc2UpKSxcbiAgICAgICAgYWJzdHJhY3RCYXNlczogYWJzdHJhY3QgPyB0aGlzLmdldEFic3RyYWN0QmFzZXMoY2xzKSA6IFtdLFxuICAgICAgfSxcbiAgICAgIGNscy5kb2NzLFxuICAgICk7XG5cbiAgICBpZiAoY2xzLmluaXRpYWxpemVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBjbHMuaW5pdGlhbGl6ZXI7XG5cbiAgICAgIGtsYXNzLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IEluaXRpYWxpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgJ19faW5pdF9fJyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgY2xzLmluaXRpYWxpemVyLmRvY3MsXG4gICAgICAgICAgZmFsc2UsIC8vIE5ldmVyIHN0YXRpY1xuICAgICAgICAgIHsgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKGNscy5pbml0aWFsaXplciksIHBhcmVudDogY2xzIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWRkUHl0aG9uVHlwZShrbGFzcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBtZXRob2Q7XG5cbiAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IFN0YXRpY01ldGhvZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lKSxcbiAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgdHJ1ZSwgLy8gQWx3YXlzIHN0YXRpY1xuICAgICAgICB7XG4gICAgICAgICAgYWJzdHJhY3Q6IG1ldGhvZC5hYnN0cmFjdCxcbiAgICAgICAgICBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AobWV0aG9kKSxcbiAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY1Byb3BlcnR5KGNsczogc3BlYy5DbGFzc1R5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IFN0YXRpY1Byb3BlcnR5KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvblByb3BlcnR5TmFtZShwcm9wLm5hbWUsIHByb3AuY29uc3QpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAge1xuICAgICAgICAgIGFic3RyYWN0OiBwcm9wLmFic3RyYWN0LFxuICAgICAgICAgIGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsXG4gICAgICAgICAgaXNTdGF0aWM6IHByb3Auc3RhdGljLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kKGNsczogc3BlYy5DbGFzc1R5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICBjb25zdCB7IHBhcmFtZXRlcnMgPSBbXSB9ID0gbWV0aG9kO1xuXG4gICAgaWYgKG1ldGhvZC5hc3luYykge1xuICAgICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IEFzeW5jTWV0aG9kKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lLCBtZXRob2QucHJvdGVjdGVkKSxcbiAgICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICAgICEhbWV0aG9kLnN0YXRpYyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhYnN0cmFjdDogbWV0aG9kLmFic3RyYWN0LFxuICAgICAgICAgICAgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksXG4gICAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IE1ldGhvZChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRvUHl0aG9uTWV0aG9kTmFtZShtZXRob2QubmFtZSwgbWV0aG9kLnByb3RlY3RlZCksXG4gICAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICBtZXRob2QucmV0dXJucyxcbiAgICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgICAhIW1ldGhvZC5zdGF0aWMsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWJzdHJhY3Q6IG1ldGhvZC5hYnN0cmFjdCxcbiAgICAgICAgICAgIGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLFxuICAgICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgUHJvcGVydHkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uUHJvcGVydHlOYW1lKHByb3AubmFtZSwgcHJvcC5jb25zdCwgcHJvcC5wcm90ZWN0ZWQpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAge1xuICAgICAgICAgIGFic3RyYWN0OiBwcm9wLmFic3RyYWN0LFxuICAgICAgICAgIGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsXG4gICAgICAgICAgaXNTdGF0aWM6IHByb3Auc3RhdGljLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVW5pb25Qcm9wZXJ0eShcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgX3VuaW9uOiBzcGVjLlVuaW9uVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5vblByb3BlcnR5KGNscywgcHJvcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIGxldCBpZmFjZTogSW50ZXJmYWNlIHwgU3RydWN0O1xuXG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgaWZhY2UgPSBuZXcgU3RydWN0KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIoaWZjLm5hbWUpLFxuICAgICAgICBpZmMsXG4gICAgICAgIGlmYy5mcW4sXG4gICAgICAgIHsgYmFzZXM6IGlmYy5pbnRlcmZhY2VzPy5tYXAoKGJhc2UpID0+IHRoaXMuZmluZFR5cGUoYmFzZSkpIH0sXG4gICAgICAgIGlmYy5kb2NzLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWZhY2UgPSBuZXcgSW50ZXJmYWNlKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIoaWZjLm5hbWUpLFxuICAgICAgICBpZmMsXG4gICAgICAgIGlmYy5mcW4sXG4gICAgICAgIHsgYmFzZXM6IGlmYy5pbnRlcmZhY2VzPy5tYXAoKGJhc2UpID0+IHRoaXMuZmluZFR5cGUoYmFzZSkpIH0sXG4gICAgICAgIGlmYy5kb2NzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFB5dGhvblR5cGUoaWZhY2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kSW50ZXJmYWNlKF9pZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZChpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBtZXRob2Q7XG5cbiAgICB0aGlzLmdldFB5dGhvblR5cGUoaWZjLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IEludGVyZmFjZU1ldGhvZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lLCBtZXRob2QucHJvdGVjdGVkKSxcbiAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgISFtZXRob2Quc3RhdGljLFxuICAgICAgICB7IGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLCBwYXJlbnQ6IGlmYyB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlUHJvcGVydHkoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICBsZXQgaWZhY2VQcm9wZXJ0eTogSW50ZXJmYWNlUHJvcGVydHkgfCBTdHJ1Y3RGaWVsZDtcblxuICAgIGlmIChpZmMuZGF0YXR5cGUpIHtcbiAgICAgIGlmYWNlUHJvcGVydHkgPSBuZXcgU3RydWN0RmllbGQodGhpcywgcHJvcCwgaWZjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWZhY2VQcm9wZXJ0eSA9IG5ldyBJbnRlcmZhY2VQcm9wZXJ0eShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lLCBwcm9wLmNvbnN0LCBwcm9wLnByb3RlY3RlZCksXG4gICAgICAgIHByb3AubmFtZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgcHJvcC5kb2NzLFxuICAgICAgICB7IGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsIGlzU3RhdGljOiBwcm9wLnN0YXRpYywgcGFyZW50OiBpZmMgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGlmYy5mcW4pLmFkZE1lbWJlcihpZmFjZVByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luRW51bShlbm06IHNwZWMuRW51bVR5cGUpIHtcbiAgICB0aGlzLmFkZFB5dGhvblR5cGUoXG4gICAgICBuZXcgRW51bSh0aGlzLCB0b1B5dGhvbklkZW50aWZpZXIoZW5tLm5hbWUpLCBlbm0sIGVubS5mcW4sIHt9LCBlbm0uZG9jcyksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVudW1NZW1iZXIoZW5tOiBzcGVjLkVudW1UeXBlLCBtZW1iZXI6IHNwZWMuRW51bU1lbWJlcikge1xuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShlbm0uZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgRW51bU1lbWJlcihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25JZGVudGlmaWVyKG1lbWJlci5uYW1lKSxcbiAgICAgICAgbWVtYmVyLm5hbWUsXG4gICAgICAgIG1lbWJlci5kb2NzLFxuICAgICAgICBlbm0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VNZXRob2RPdmVybG9hZChcbiAgICBfaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsXG4gICAgX292ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBUeXBlOiBJbnRlcmZhY2VNZXRob2RPdmVybG9hZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kT3ZlcmxvYWQoXG4gICAgX2Nsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgX292ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBUeXBlOiBNZXRob2RPdmVybG9hZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljTWV0aG9kT3ZlcmxvYWQoXG4gICAgX2Nsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgX292ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBUeXBlOiBTdGF0aWNNZXRob2RPdmVybG9hZCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBc3NlbWJseU1vZHVsZU5hbWUoYXNzbTogc3BlYy5Bc3NlbWJseSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Fzc20udGFyZ2V0cyEucHl0aG9uIS5tb2R1bGV9Ll9qc2lpYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyZW50RlFOKGZxbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtID0gL14oLispXFwuW14uXSskLy5leGVjKGZxbik7XG5cbiAgICBpZiAobSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgcGFyZW50IEZRTiBvZjogJHtmcW59YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1bMV07XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmVudChmcW46IHN0cmluZyk6IFB5dGhvblR5cGUge1xuICAgIHJldHVybiB0aGlzLmdldFB5dGhvblR5cGUodGhpcy5nZXRQYXJlbnRGUU4oZnFuKSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFB5dGhvblR5cGUodHlwZTogUHl0aG9uVHlwZSkge1xuICAgIGlmICh0eXBlLmZxbiA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgYSBQeXRob24gdHlwZSB3aXRob3V0IGEgRlFOLicpO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0UGFyZW50KHR5cGUuZnFuKS5hZGRNZW1iZXIodHlwZSk7XG4gICAgdGhpcy50eXBlcy5zZXQodHlwZS5mcW4sIHR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRsaWZ0ZWRQcm9wKFxuICAgIG1ldGhvZDogc3BlYy5NZXRob2QgfCBzcGVjLkluaXRpYWxpemVyLFxuICApOiBzcGVjLkludGVyZmFjZVR5cGUgfCB1bmRlZmluZWQge1xuICAgIC8vIElmIHRoZXJlIGFyZSBwYXJhbWV0ZXJzIHRvIHRoaXMgbWV0aG9kLCBhbmQgaWYgdGhlIGxhc3QgcGFyYW1ldGVyJ3MgdHlwZSBpc1xuICAgIC8vIGEgZGF0YXR5cGUgaW50ZXJmYWNlLCB0aGVuIHdlIHdhbnQgdG8gbGlmdCB0aGUgbWVtYmVycyBvZiB0aGF0IGxhc3QgcGFyYW10ZXJcbiAgICAvLyBhcyBrZXl3b3JkIGFyZ3VtZW50cyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgIGlmIChtZXRob2QucGFyYW1ldGVycz8ubGVuZ3RoID8/IDAgPj0gMSkge1xuICAgICAgY29uc3QgbGFzdFBhcmFtZXRlciA9IG1ldGhvZC5wYXJhbWV0ZXJzIS5zbGljZSgtMSlbMF07XG4gICAgICBpZiAoXG4gICAgICAgICFsYXN0UGFyYW1ldGVyLnZhcmlhZGljICYmXG4gICAgICAgIHNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UobGFzdFBhcmFtZXRlci50eXBlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGxhc3RQYXJhbWV0ZXJUeXBlID0gdGhpcy5maW5kVHlwZShsYXN0UGFyYW1ldGVyLnR5cGUuZnFuKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNwZWMuaXNJbnRlcmZhY2VUeXBlKGxhc3RQYXJhbWV0ZXJUeXBlKSAmJlxuICAgICAgICAgIGxhc3RQYXJhbWV0ZXJUeXBlLmRhdGF0eXBlXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBsYXN0UGFyYW1ldGVyVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEFic3RyYWN0QmFzZXMoY2xzOiBzcGVjLkNsYXNzVHlwZSk6IHNwZWMuQ2xhc3NUeXBlW10ge1xuICAgIGNvbnN0IGFic3RyYWN0QmFzZXM6IHNwZWMuQ2xhc3NUeXBlW10gPSBbXTtcblxuICAgIGlmIChjbHMuYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5maW5kVHlwZShjbHMuYmFzZSk7XG5cbiAgICAgIGlmICghc3BlYy5pc0NsYXNzVHlwZShiYXNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDbGFzcyBpbmhlcml0ZW5jZSB0aGF0IGlzbid0IGEgY2xhc3M/XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmFzZS5hYnN0cmFjdCkge1xuICAgICAgICBhYnN0cmFjdEJhc2VzLnB1c2goYmFzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFic3RyYWN0QmFzZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBQb3NpdGlvbmFsIGFyZ3VtZW50IG9yIGtleXdvcmQgcGFyYW1ldGVyXG4gKi9cbmludGVyZmFjZSBEb2N1bWVudGFibGVBcmd1bWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVmaW5pbmdUeXBlOiBzcGVjLlR5cGU7XG4gIGRvY3M/OiBzcGVjLkRvY3M7XG59XG5cbi8qKlxuICogUmVuZGVyIGEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIGdpdmVuIGRvY3MsIHVzZWQgZm9yIG1ldGhvZCBhcmd1bWVudHMgYW5kIGlubGluZWQgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBvbmVsaW5lRGVzY3JpcHRpb24oZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkKSB7XG4gIC8vIE9ubHkgY29uc2lkZXIgYSBzdWJzZXQgb2YgZmllbGRzIGhlcmUsIHdlIGRvbid0IGhhdmUgYSBsb3Qgb2YgZm9ybWF0dGluZyBzcGFjZVxuICBpZiAoIWRvY3MgfHwgT2JqZWN0LmtleXMoZG9jcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICctJztcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gW107XG4gIGlmIChkb2NzLnN1bW1hcnkpIHtcbiAgICBwYXJ0cy5wdXNoKG1kMnJzdChyZW5kZXJTdW1tYXJ5KGRvY3MpKSk7XG4gIH1cbiAgaWYgKGRvY3MucmVtYXJrcykge1xuICAgIHBhcnRzLnB1c2gobWQycnN0KGRvY3MucmVtYXJrcykpO1xuICB9XG4gIGlmIChkb2NzLmRlZmF1bHQpIHtcbiAgICBwYXJ0cy5wdXNoKGBEZWZhdWx0OiAke21kMnJzdChkb2NzLmRlZmF1bHQpfWApO1xuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKCcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRNZW50aW9uU3RhYmlsaXR5KHM6IHNwZWMuU3RhYmlsaXR5KSB7XG4gIC8vIERvbid0IHJlbmRlciBcInN0YWJsZVwiIG9yIFwiZXh0ZXJuYWxcIiwgdGhvc2UgYXJlIGJvdGggc3RhYmxlIGJ5IGltcGxpY2F0aW9uLlxuICByZXR1cm4gcyA9PT0gc3BlYy5TdGFiaWxpdHkuRGVwcmVjYXRlZCB8fCBzID09PSBzcGVjLlN0YWJpbGl0eS5FeHBlcmltZW50YWw7XG59XG5cbmZ1bmN0aW9uIGlzU3RydWN0KFxuICB0eXBlU3lzdGVtOiByZWZsZWN0LlR5cGVTeXN0ZW0sXG4gIHJlZjogc3BlYy5UeXBlUmVmZXJlbmNlLFxuKTogYm9vbGVhbiB7XG4gIGlmICghc3BlYy5pc05hbWVkVHlwZVJlZmVyZW5jZShyZWYpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHR5cGUgPSB0eXBlU3lzdGVtLnRyeUZpbmRGcW4ocmVmLmZxbik7XG4gIHJldHVybiAhISh0eXBlPy5pc0ludGVyZmFjZVR5cGUoKSAmJiB0eXBlPy5pc0RhdGFUeXBlKCkpO1xufVxuXG4vKipcbiAqIEFwcGVuZHMgYF9gIGF0IHRoZSBlbmQgb2YgYG5hbWVgIHVudGlsIGl0IG5vIGxvbmdlciBjb25mbGljdHMgd2l0aCBhbnkgb2YgdGhlXG4gKiBlbnRyaWVzIGluIGBpblVzZWAuXG4gKlxuICogQHBhcmFtIG5hbWUgIHRoZSBuYW1lIHRvIGJlIHNsdWdpZmllZC5cbiAqIEBwYXJhbSBpblVzZSB0aGUgbmFtZXMgdGhhdCBhcmUgYWxyZWFkeSBiZWluZyB1c2VkLlxuICpcbiAqIEByZXR1cm5zIHRoZSBzbHVnaWZpZWQgbmFtZS5cbiAqL1xuZnVuY3Rpb24gc2x1Z2lmeUFzTmVlZGVkKG5hbWU6IHN0cmluZywgaW5Vc2U6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgaW5Vc2VTZXQgPSBuZXcgU2V0KGluVXNlKTtcbiAgd2hpbGUgKGluVXNlU2V0LmhhcyhuYW1lKSkge1xuICAgIG5hbWUgPSBgJHtuYW1lfV9gO1xuICB9XG4gIHJldHVybiBuYW1lO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gQkVIT0xEOiBIZWxwZXJzIHRvIG91dHB1dCBjb2RlIHRoYXQgbG9va3MgbGlrZSB3aGF0IEJsYWNrIHdvdWxkIGZvcm1hdCBpbnRvLi4uXG4vL1xuLy8gQHNlZSBodHRwczovL2JsYWNrLnJlYWR0aGVkb2NzLmlvL2VuL3N0YWJsZS90aGVfYmxhY2tfY29kZV9zdHlsZS5odG1sXG5cbmNvbnN0IFRBUkdFVF9MSU5FX0xFTkdUSCA9IDg4O1xuXG5mdW5jdGlvbiBvcGVuU2lnbmF0dXJlKFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIGtleXdvcmQ6ICdjbGFzcycsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGFyYW1zOiByZWFkb25seSBzdHJpbmdbXSxcbik6IHZvaWQ7XG5mdW5jdGlvbiBvcGVuU2lnbmF0dXJlKFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIGtleXdvcmQ6ICdkZWYnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHRyYWlsaW5nQ29tbWE6IGJvb2xlYW4sXG4gIHJldHVyblR5cGU6IHN0cmluZyxcbik6IHZvaWQ7XG5mdW5jdGlvbiBvcGVuU2lnbmF0dXJlKFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIGtleXdvcmQ6ICdjbGFzcycgfCAnZGVmJyxcbiAgbmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB0cmFpbGluZ0NvbW1hID0gZmFsc2UsXG4gIHJldHVyblR5cGU/OiBzdHJpbmcsXG4pIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7a2V5d29yZH0gJHtuYW1lfWA7XG4gIGNvbnN0IHN1ZmZpeCA9IHJldHVyblR5cGUgPyBgIC0+ICR7cmV0dXJuVHlwZX1gIDogJyc7XG4gIGlmIChwYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5vcGVuQmxvY2soYCR7cHJlZml4fSR7cmV0dXJuVHlwZSA/ICcoKScgOiAnJ30ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBqb2luID0gJywgJztcbiAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihwYXJhbXMsIGpvaW4pO1xuXG4gIGNvbnN0IGhhc0NvbW1lbnRzID0gIXBhcmFtcy5zb21lKChwYXJhbSkgPT4gLyMgLiskLy5leGVjKHBhcmFtKSk7XG5cbiAgaWYgKFxuICAgIGhhc0NvbW1lbnRzICYmXG4gICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgICBqb2luU2l6ZSArXG4gICAgICAgIHN1ZmZpeC5sZW5ndGggK1xuICAgICAgICAyXG4gICkge1xuICAgIGNvZGUub3BlbkJsb2NrKGAke3ByZWZpeH0oJHtwYXJhbXMuam9pbihqb2luKX0pJHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29kZS5pbmRlbnQoYCR7cHJlZml4fShgKTtcbiAgaWYgKFxuICAgICFoYXNDb21tZW50cyAmJlxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgICBqb2luU2l6ZSArXG4gICAgICAgICh0cmFpbGluZ0NvbW1hID8gMSA6IDApXG4gICkge1xuICAgIGNvZGUubGluZShgJHtwYXJhbXMuam9pbihqb2luKX0ke3RyYWlsaW5nQ29tbWEgPyAnLCcgOiAnJ31gKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgY29kZS5saW5lKHBhcmFtLnJlcGxhY2UoLyhcXHMqIyAuKyk/JC8sICcsJDEnKSk7XG4gICAgfVxuICB9XG4gIGNvZGUudW5pbmRlbnQoZmFsc2UpO1xuICBjb2RlLm9wZW5CbG9jayhgKSR7c3VmZml4fWApO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DYWxsUmVzdWx0KFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIHZhcmlhYmxlOiBzdHJpbmcsXG4gIGZ1bmN0OiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4pIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7dmFyaWFibGV9ID0gJHtmdW5jdH0oYDtcbiAgY29uc3Qgc3VmZml4ID0gJyknO1xuXG4gIGlmIChwYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBqb2luID0gJywgJztcbiAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihwYXJhbXMsIGpvaW4pO1xuXG4gIGlmIChcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICBqb2luU2l6ZSArXG4gICAgICBzdWZmaXgubGVuZ3RoXG4gICkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtwYXJhbXMuam9pbihqb2luKX0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb2RlLmluZGVudChwcmVmaXgpO1xuICBpZiAoVEFSR0VUX0xJTkVfTEVOR1RIID4gY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICsgZWxlbWVudHNTaXplICsgam9pblNpemUpIHtcbiAgICBjb2RlLmxpbmUocGFyYW1zLmpvaW4oam9pbikpO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG4gICAgICBjb2RlLmxpbmUoYCR7cGFyYW19LGApO1xuICAgIH1cbiAgfVxuICBjb2RlLnVuaW5kZW50KHN1ZmZpeCk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkRpY3Rpb25hcnkoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAgdmFyaWFibGU6IHN0cmluZyxcbiAgZWxlbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB0cmFpbGluZz86IHN0cmluZyxcbiAgY29tcGFjdCA9IGZhbHNlLFxuKTogdm9pZCB7XG4gIGNvbnN0IHNwYWNlID0gY29tcGFjdCA/ICcnIDogJyAnO1xuXG4gIGNvbnN0IHByZWZpeCA9IGAke3ZhcmlhYmxlfSR7c3BhY2V9PSR7c3BhY2V9e2A7XG4gIGNvbnN0IHN1ZmZpeCA9IGB9JHt0cmFpbGluZyA/PyAnJ31gO1xuXG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChjb21wYWN0KSB7XG4gICAgY29uc3Qgam9pbiA9ICcsICc7XG4gICAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihlbGVtZW50cywgam9pbik7XG4gICAgaWYgKFxuICAgICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgICBqb2luU2l6ZSArXG4gICAgICAgIHN1ZmZpeC5sZW5ndGhcbiAgICApIHtcbiAgICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtlbGVtZW50cy5qb2luKGpvaW4pfSR7c3VmZml4fWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGNvZGUuaW5kZW50KHByZWZpeCk7XG4gIGZvciAoY29uc3QgZWx0IG9mIGVsZW1lbnRzKSB7XG4gICAgY29kZS5saW5lKGAke2VsdH0sYCk7XG4gIH1cbiAgY29kZS51bmluZGVudChzdWZmaXgpO1xufVxuXG5mdW5jdGlvbiBlbWl0TGlzdChcbiAgY29kZTogQ29kZU1ha2VyLFxuICBwcmVmaXg6IHN0cmluZyxcbiAgZWxlbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBzdWZmaXg6IHN0cmluZyxcbiAgb3B0cz86IHsgaWZNdWx0aTogW3N0cmluZywgc3RyaW5nXSB9LFxuKSB7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGpvaW4gPSAnLCAnO1xuICBjb25zdCB7IGVsZW1lbnRzU2l6ZSwgam9pblNpemUgfSA9IHRvdGFsU2l6ZU9mKGVsZW1lbnRzLCBqb2luKTtcbiAgaWYgKFxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgIGpvaW5TaXplICtcbiAgICAgIHN1ZmZpeC5sZW5ndGhcbiAgKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke2VsZW1lbnRzLmpvaW4oam9pbil9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgW2JlZm9yZSwgYWZ0ZXJdID0gb3B0cz8uaWZNdWx0aSA/PyBbJycsICcnXTtcblxuICBjb2RlLmluZGVudChgJHtwcmVmaXh9JHtiZWZvcmV9YCk7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICBjb2RlLmxpbmUoZWxlbWVudHNbMF0pO1xuICB9IGVsc2Uge1xuICAgIGlmIChcbiAgICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggKyBlbGVtZW50c1NpemUgKyBqb2luU2l6ZVxuICAgICkge1xuICAgICAgY29kZS5saW5lKGVsZW1lbnRzLmpvaW4oam9pbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGVsdCBvZiBlbGVtZW50cykge1xuICAgICAgICBjb2RlLmxpbmUoYCR7ZWx0fSxgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29kZS51bmluZGVudChgJHthZnRlcn0ke3N1ZmZpeH1gKTtcbn1cblxuZnVuY3Rpb24gdG90YWxTaXplT2Yoc3RyaW5nczogcmVhZG9ubHkgc3RyaW5nW10sIGpvaW46IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIGVsZW1lbnRzU2l6ZTogc3RyaW5nc1xuICAgICAgLm1hcCgoc3RyKSA9PiBzdHIubGVuZ3RoKVxuICAgICAgLnJlZHVjZSgoYWNjLCBlbHQpID0+IGFjYyArIGVsdCwgMCksXG4gICAgam9pblNpemU6IHN0cmluZ3MubGVuZ3RoID4gMSA/IGpvaW4ubGVuZ3RoICogKHN0cmluZ3MubGVuZ3RoIC0gMSkgOiAwLFxuICB9O1xufVxuXG5mdW5jdGlvbiBuZXN0ZWRDb250ZXh0KFxuICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgZnFuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBFbWl0Q29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgLi4uY29udGV4dCxcbiAgICBzdXJyb3VuZGluZ1R5cGVGcW5zOlxuICAgICAgZnFuICE9IG51bGxcbiAgICAgICAgPyBbLi4uKGNvbnRleHQuc3Vycm91bmRpbmdUeXBlRnFucyA/PyBbXSksIGZxbl1cbiAgICAgICAgOiBjb250ZXh0LnN1cnJvdW5kaW5nVHlwZUZxbnMsXG4gIH07XG59XG5cbmNvbnN0IGlzRGVwcmVjYXRlZCA9ICh4OiBQeXRob25CYXNlKSA9PiB4LmRvY3M/LmRlcHJlY2F0ZWQgIT09IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBMYXN0IGNvbXBvbmVudCBvZiBhIC4tc2VwYXJhdGVkIG5hbWVcbiAqL1xuZnVuY3Rpb24gbGFzdENvbXBvbmVudChuOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBuLnNwbGl0KCcuJyk7XG4gIHJldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbn1cbiJdfQ==