semantifold 0.12.0 → 0.14.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 (73) hide show
  1. package/README.md +2 -0
  2. package/build/src/backends/effects.js +5 -2
  3. package/build/src/backends/java.js +33 -14
  4. package/build/src/backends/javascript.js +83 -18
  5. package/build/src/backends/php.d.ts.map +1 -1
  6. package/build/src/backends/php.js +88 -16
  7. package/build/src/backends/ruby.js +37 -12
  8. package/build/src/backends/scalars.js +2 -2
  9. package/build/src/backends/shared.d.ts +2 -1
  10. package/build/src/backends/shared.d.ts.map +1 -1
  11. package/build/src/backends/shared.js +299 -42
  12. package/build/src/backends/typescript.js +83 -18
  13. package/build/src/backends/writer.d.ts +18 -4
  14. package/build/src/backends/writer.d.ts.map +1 -1
  15. package/build/src/backends/writer.js +40 -4
  16. package/build/src/frontends/java.d.ts +9 -1
  17. package/build/src/frontends/java.d.ts.map +1 -1
  18. package/build/src/frontends/java.js +90 -43
  19. package/build/src/frontends/javascript-typescript.d.ts +3 -1
  20. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  21. package/build/src/frontends/javascript-typescript.js +133 -52
  22. package/build/src/frontends/php.d.ts +13 -1
  23. package/build/src/frontends/php.d.ts.map +1 -1
  24. package/build/src/frontends/php.js +226 -59
  25. package/build/src/frontends/ruby.d.ts +4 -1
  26. package/build/src/frontends/ruby.d.ts.map +1 -1
  27. package/build/src/frontends/ruby.js +113 -37
  28. package/build/src/frontends/types.d.ts +9 -2
  29. package/build/src/frontends/types.d.ts.map +1 -1
  30. package/build/src/frontends/types.js +26 -9
  31. package/build/src/language-registry.d.ts.map +1 -1
  32. package/build/src/language-registry.js +14 -6
  33. package/build/src/mapping.d.ts.map +1 -1
  34. package/build/src/mapping.js +4 -2
  35. package/build/src/semantic/effects.d.ts.map +1 -1
  36. package/build/src/semantic/effects.js +20 -6
  37. package/build/src/semantic/lifetime.js +28 -4
  38. package/build/src/semantic/provenance.d.ts.map +1 -1
  39. package/build/src/semantic/provenance.js +61 -9
  40. package/build/src/semantic/types.d.ts +214 -23
  41. package/build/src/semantic/types.d.ts.map +1 -1
  42. package/build/src/semantic/types.js +58 -11
  43. package/build/src/semantic/validate.d.ts +31 -2
  44. package/build/src/semantic/validate.d.ts.map +1 -1
  45. package/build/src/semantic/validate.js +450 -60
  46. package/docs/adr/20261026-typed-error-handling-extension.md +55 -0
  47. package/docs/adr-bounded-subtyping.md +180 -0
  48. package/docs/adr-numeric-tower.md +156 -0
  49. package/docs/architecture.md +1 -1
  50. package/docs/language-support.md +8 -8
  51. package/docs/testing.md +5 -3
  52. package/package.json +1 -1
  53. package/src/backends/effects.js +3 -1
  54. package/src/backends/java.js +33 -14
  55. package/src/backends/javascript.js +83 -18
  56. package/src/backends/php.js +89 -16
  57. package/src/backends/ruby.js +36 -12
  58. package/src/backends/scalars.js +1 -1
  59. package/src/backends/shared.js +298 -47
  60. package/src/backends/typescript.js +83 -18
  61. package/src/backends/writer.js +41 -3
  62. package/src/frontends/java.js +95 -43
  63. package/src/frontends/javascript-typescript.js +145 -53
  64. package/src/frontends/php.js +243 -58
  65. package/src/frontends/ruby.js +117 -35
  66. package/src/frontends/types.js +26 -8
  67. package/src/language-registry.js +13 -5
  68. package/src/mapping.js +3 -1
  69. package/src/semantic/effects.js +18 -5
  70. package/src/semantic/lifetime.js +29 -3
  71. package/src/semantic/provenance.js +60 -14
  72. package/src/semantic/types.js +62 -10
  73. package/src/semantic/validate.js +481 -61
@@ -120,6 +120,10 @@ function analyzeStatement(statement, state, fail, locals, errorEffects) {
120
120
  ? { errorId: statement.error.error.declarationId, kind: "raise", location: statement.location, state: flow.state }
121
121
  : { ...flow, location: statement.location });
122
122
  }
123
+ if (statement.kind == "RethrowStatement") {
124
+ // A rethrow re-raises the caught binding's exact nominal type, so an enclosing handler must see it.
125
+ return [{ errorId: statement.bindingNode?.type?.declarationId, kind: "raise", location: statement.location, state: cloneState(state) }];
126
+ }
123
127
  if (statement.kind == "IfStatement") {
124
128
  const conditions = evaluateExpression(statement.condition, cloneState(state), fail, errorEffects);
125
129
  /** @type {LifetimeExit[]} */
@@ -136,9 +140,29 @@ function analyzeStatement(statement, state, fail, locals, errorEffects) {
136
140
  if (statement.kind == "TryStatement") {
137
141
  const bodyExits = analyzeBlock(statement.body, [{ kind: "normal", state: cloneState(state) }], fail, errorEffects);
138
142
  /** @type {LifetimeExit[]} */
139
- const result = bodyExits.filter((flow) => flow.kind != "raise" || flow.errorId != statement.catchType.declarationId);
140
- for (const caught of bodyExits.filter((flow) => flow.kind == "raise" && flow.errorId == statement.catchType.declarationId)) {
141
- result.push(...analyzeBlock(statement.catchBody, [{ kind: "normal", state: cloneState(caught.state) }], fail, errorEffects));
143
+ let result = bodyExits;
144
+ for (const handler of statement.handlers ?? []) {
145
+ const caughtId = handler.catchType?.declarationId;
146
+ const caught = result.filter((flow) => flow.kind == "raise" && flow.errorId == caughtId);
147
+ if (caught.length == 0)
148
+ continue;
149
+ result = result.filter((flow) => flow.kind != "raise" || flow.errorId != caughtId);
150
+ for (const flow of caught) {
151
+ result.push(...analyzeBlock(handler.catchBody, [{ kind: "normal", state: cloneState(flow.state) }], fail, errorEffects));
152
+ }
153
+ }
154
+ if (statement.finallyBody) {
155
+ /** @type {LifetimeExit[]} */
156
+ const afterFinally = [];
157
+ for (const flow of result) {
158
+ const finallyExits = analyzeBlock(statement.finallyBody, [{ kind: "normal", state: cloneState(flow.state) }], fail, errorEffects);
159
+ for (const finallyExit of finallyExits) {
160
+ afterFinally.push(finallyExit.kind == "normal"
161
+ ? { ...flow, location: statement.location }
162
+ : { ...finallyExit, location: statement.location });
163
+ }
164
+ }
165
+ result = afterFinally;
142
166
  }
143
167
  return mergeEquivalentNormals(result, statement.location, fail);
144
168
  }
@@ -524,4 +548,4 @@ function moduleContainsOwnedType(module) {
524
548
  }
525
549
  return false;
526
550
  }
527
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZXRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvbGlmZXRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLHFIQUFxSDtBQUNySCwrVkFBK1Y7QUFDL1YsNkxBQTZMO0FBRTdMOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUk7SUFDbEUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTTtJQUV4SCxLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7UUFDL0MsWUFBWSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDN0csS0FBSyxNQUFNLE1BQU0sSUFBSSxXQUFXLENBQUMsT0FBTztZQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUN6RixXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFDN0csQ0FBQztJQUNELEtBQUssTUFBTSxXQUFXLElBQUksTUFBTSxDQUFDLFNBQVM7UUFBRSxZQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMs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dHJpbmcsIGRldGFpbDogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbikgPT4gbmV2ZXJ9IExpZmV0aW1lRmFpbCAqL1xuLyoqIEB0eXBlZGVmIHt7a2luZDogXCJvcGVuXCIsIG9yaWdpbklkOiBzdHJpbmcsIG9yaWdpbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gfCB7a2luZDogXCJtb3ZlZFwiLCBvcmlnaW5JZDogc3RyaW5nLCBvcmlnaW46IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIGRlc3RpbmF0aW9uOiBzdHJpbmd9IHwge2tpbmQ6IFwidGVybWluYWxcIiwgb3JpZ2luSWQ6IHN0cmluZywgb3JpZ2luOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCBjbG9zZVNpdGVJZDogc3RyaW5nIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn19IE93bmVyU3RhdGUgKi9cbi8qKiBAdHlwZWRlZiB7e2tpbmQ6IFwibm9ybWFsXCIgfCBcInJldHVyblwiIHwgXCJyYWlzZVwiIHwgXCJicmVha1wiIHwgXCJjb250aW51ZVwiLCBzdGF0ZTogTWFwPHN0cmluZywgT3duZXJTdGF0ZT4sIGxvY2F0aW9uPzogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgZXJyb3JJZD86IHN0cmluZ319IExpZmV0aW1lRXhpdCAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIHBhdGgtc2Vuc2l0aXZlIHN0cnVjdHVyZWQgbGlmZXRpbWUgdmFsaWRhdGlvbiBmb3IgVGFzayAwMzQgb3duZWQgdmFsdWVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBGdWxseSB0eXBlLXJlc29sdmVkIG1vZHVsZS5cbiAqIEBwYXJhbSB7e2Z1bmN0aW9uczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LCBtZXRob2RzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBlcnJvckVmZmVjdHMgLSBDb21wbGV0ZSBlc2NhcGluZyBlcnJvciBzZXRzIHBlciBmdW5jdGlvbiBhbmQgbWV0aG9kLlxuICogQHBhcmFtIHtMaWZldGltZUZhaWx9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmVzb3VyY2VMaWZldGltZXMobW9kdWxlLCBlcnJvckVmZmVjdHMsIGZhaWwpIHtcbiAgaWYgKCEobW9kdWxlLmNhcGFiaWxpdGllcyA/PyBbXSkuc29tZSgoe3Jlc291cmNlc30pID0+IHJlc291cmNlcy5sZW5ndGggPiAwKSAmJiAhbW9kdWxlQ29udGFpbnNPd25lZFR5cGUobW9kdWxlKSkgcmV0dXJuXG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuY2xhc3NlcyA/PyBbXSkge1xuICAgIGFuYWx5emVPd25lcihkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCBkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5ib2R5LCBmYWlsLCB1bmRlZmluZWQsIGVycm9yRWZmZWN0cylcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzKSBhbmFseXplT3duZXIobWV0aG9kLnBhcmFtZXRlcnMsIG1ldGhvZC5ib2R5LCBmYWlsLFxuICAgICAgZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiID8gZGVjbGFyYXRpb24ub3duZXJzaGlwLmZpZWxkSWQgOiB1bmRlZmluZWQsIGVycm9yRWZmZWN0cylcbiAgfVxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5mdW5jdGlvbnMpIGFuYWx5emVPd25lcihkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLCBkZWNsYXJhdGlvbi5ib2R5LCBmYWlsLCB1bmRlZmluZWQsIGVycm9yRWZmZWN0cylcbiAgYW5hbHl6ZU93bmVyKFtdLCBtb2R1bGUuZW50cnlQb2ludC5ib2R5LCBmYWlsLCB1bmRlZmluZWQsIGVycm9yRWZmZWN0cylcbn1cblxuLyoqXG4gKiBBbmFseXplcyBvbmUgZnVuY3Rpb24sIGNvbnN0cnVjdG9yLCBtZXRob2QsIG9yIGVudHJ5LXBvaW50IG93bmVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlBhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gT3duZWQgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CbG9ja30gYm9keSAtIFN0cnVjdHVyZWQgYm9keS5cbiAqIEBwYXJhbSB7TGlmZXRpbWVGYWlsfSBmYWlsIC0gTG9jYXRlZCBmYWlsdXJlLlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGJvcnJvd2VkRmllbGRJZCAtIE93bmVkIHJlY2VpdmVyIGZpZWxkLCB3aGVuIHByZXNlbnQuXG4gKiBAcGFyYW0ge3tmdW5jdGlvbnM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiwgbWV0aG9kczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gZXJyb3JFZmZlY3RzIC0gQ29tcGxldGUgZXNjYXBpbmcgZXJyb3Igc2V0cyBwZXIgZnVuY3Rpb24gYW5kIG1ldGhvZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhbmFseXplT3duZXIocGFyYW1ldGVycywgYm9keSwgZmFpbCwgYm9ycm93ZWRGaWVsZElkLCBlcnJvckVmZmVjdHMpIHtcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBPd25lclN0YXRlPn0gKi9cbiAgY29uc3QgaW5pdGlhbCA9IG5ldyBNYXAoKVxuICBjb25zdCBvYmxpZ2F0aW9ucyA9IG5ldyBTZXQocGFyYW1ldGVycy5maWx0ZXIoKHt0eXBlfSkgPT4gaXNPd25lZCh0eXBlKSkubWFwKCh7bmFtZX0pID0+IG5hbWUpKVxuXG4gIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIHBhcmFtZXRlcnMpIHtcbiAgICBpZiAoaXNPd25lZChwYXJhbWV0ZXIudHlwZSkpIGluaXRpYWwuc2V0KHBhcmFtZXRlci5uYW1lLCBvcGVuU3RhdGUoYHBhcmFtZXRlcjoke3BhcmFtZXRlci5uYW1lfWAsIHBhcmFtZXRlci5sb2NhdGlvbikpXG4gIH1cbiAgaWYgKGJvcnJvd2VkRmllbGRJZCkgaW5pdGlhbC5zZXQoYHRoaXMuJHtib3Jyb3dlZEZpZWxkSWR9YCwgb3BlblN0YXRlKGByZWNlaXZlcjoke2JvcnJvd2VkRmllbGRJZH1gLCBib2R5LmxvY2F0aW9uKSlcbiAgY29uc3QgZXhpdHMgPSBhbmFseXplQmxvY2soYm9keSwgW3traW5kOiBcIm5vcm1hbFwiLCBzdGF0ZTogaW5pdGlhbH1dLCBmYWlsLCBlcnJvckVmZmVjdHMpXG5cbiAgZm9yIChjb25zdCBleGl0IG9mIGV4aXRzKSBjaGVja0xlYWtzKGV4aXQuc3RhdGUsIG9ibGlnYXRpb25zLCBleGl0LmxvY2F0aW9uID8/IGJvZHkubG9jYXRpb24sIGZhaWwpXG59XG5cbi8qKlxuICogRXZhbHVhdGVzIG9uZSBsZXhpY2FsIGJsb2NrIHdoaWxlIHJldGFpbmluZyBldmVyeSBhYnJ1cHQgZXhpdCBzZXBhcmF0ZWx5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFN0cnVjdHVyZWQgYmxvY2suXG4gKiBAcGFyYW0ge0xpZmV0aW1lRXhpdFtdfSBpbmNvbWluZyAtIEluY29taW5nIGNvbnRyb2wtZmxvdyBzdGF0ZXMuXG4gKiBAcGFyYW0ge0xpZmV0aW1lRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEBwYXJhbSB7e2Z1bmN0aW9uczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LCBtZXRob2RzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBlcnJvckVmZmVjdHMgLSBDb21wbGV0ZSBlc2NhcGluZyBlcnJvciBzZXRzIHBlciBmdW5jdGlvbiBhbmQgbWV0aG9kLlxuICogQHJldHVybnMge0xpZmV0aW1lRXhpdFtdfSBSZWFjaGFibGUgZXhpdHMuXG4gKi9cbmZ1bmN0aW9uIGFuYWx5emVCbG9jayhibG9jaywgaW5jb21pbmcsIGZhaWwsIGVycm9yRWZmZWN0cykge1xuICBsZXQgYWN0aXZlID0gaW5jb21pbmcuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgPT0gXCJub3JtYWxcIilcbiAgY29uc3QgZGVwYXJ0ZWQgPSBpbmNvbWluZy5maWx0ZXIoKHtraW5kfSkgPT4ga2luZCAhPSBcIm5vcm1hbFwiKVxuICAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICBjb25zdCBsb2NhbHMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBibG9jay5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKGFjdGl2ZS5sZW5ndGggPT0gMCkgYnJlYWtcbiAgICBjb25zdCBuZXh0ID0gW11cblxuICAgIGZvciAoY29uc3QgZmxvdyBvZiBhY3RpdmUpIG5leHQucHVzaCguLi5hbmFseXplU3RhdGVtZW50KHN0YXRlbWVudCwgZmxvdy5zdGF0ZSwgZmFpbCwgbG9jYWxzLCBlcnJvckVmZmVjdHMpKVxuICAgIGRlcGFydGVkLnB1c2goLi4ubmV4dC5maWx0ZXIoKHtraW5kfSkgPT4ga2luZCAhPSBcIm5vcm1hbFwiKSlcbiAgICBhY3RpdmUgPSBtZXJnZUVxdWl2YWxlbnROb3JtYWxzKG5leHQuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgPT0gXCJub3JtYWxcIiksIHN0YXRlbWVudC5sb2NhdGlvbiwgZmFpbClcbiAgfVxuICBjb25zdCBleGl0cyA9IFsuLi5kZXBhcnRlZCwgLi4uYWN0aXZlLm1hcCgoZmxvdykgPT4gKHsuLi5mbG93LCBsb2NhdGlvbjogZmxvdy5sb2NhdGlvbiA/PyBibG9jay5sb2NhdGlvbn0pKV1cblxuICBmb3IgKGNvbnN0IGV4aXQgb2YgZXhpdHMpIHtcbiAgICBjaGVja0xlYWtzKGV4aXQuc3RhdGUsIGxvY2FscywgZXhpdC5sb2NhdGlvbiA/PyBibG9jay5sb2NhdGlvbiwgZmFpbClcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbG9jYWxzKSBleGl0LnN0YXRlLmRlbGV0ZShuYW1lKVxuICB9XG4gIHJldHVybiBleGl0c1xufVxuXG4vKipcbiAqIEV2YWx1YXRlcyBvbmUgc3RhdGVtZW50IGZyb20gb25lIG5vcm1hbCBzdGF0ZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IHN0YXRlbWVudCAtIFN0YXRlbWVudC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgT3duZXJTdGF0ZT59IHN0YXRlIC0gSW5jb21pbmcgb3duZXJzaGlwIHN0YXRlLlxuICogQHBhcmFtIHtMaWZldGltZUZhaWx9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBsb2NhbHMgLSBMb2NhbHMgaW50cm9kdWNlZCBpbiB0aGUgY3VycmVudCBibG9jay5cbiAqIEBwYXJhbSB7e2Z1bmN0aW9uczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LCBtZXRob2RzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBlcnJvckVmZmVjdHMgLSBDb21wbGV0ZSBlc2NhcGluZyBlcnJvciBzZXRzIHBlciBmdW5jdGlvbiBhbmQgbWV0aG9kLlxuICogQHJldHVybnMge0xpZmV0aW1lRXhpdFtdfSBSZWFjaGFibGUgZXhpdHMuXG4gKi9cbmZ1bmN0aW9uIGFuYWx5emVTdGF0ZW1lbnQoc3RhdGVtZW50LCBzdGF0ZSwgZmFpbCwgbG9jYWxzLCBlcnJvckVmZmVjdHMpIHtcbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSB7XG4gICAgY29uc3QgZmxvd3MgPSBldmFsdWF0ZUV4cHJlc3Npb24oc3RhdGVtZW50LmluaXRpYWxpemVyLCBjbG9uZVN0YXRlKHN0YXRlKSwgZmFpbCwgZXJyb3JFZmZlY3RzKVxuXG4gICAgaWYgKGlzT3duZWQoc3RhdGVtZW50LnR5cGUpKSB7XG4gICAgICBsb2NhbHMuYWRkKHN0YXRlbWVudC5uYW1lKVxuICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgIGlmIChmbG93LmtpbmQgIT0gXCJub3JtYWxcIikgY29udGludWVcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gc3RhdGVtZW50LmluaXRpYWxpemVyLmtpbmQgPT0gXCJPd25lZE1vdmVFeHByZXNzaW9uXCJcbiAgICAgICAgICA/IGZsb3cuc3RhdGUuZ2V0KHN0YXRlbWVudC5pbml0aWFsaXplci5leHByZXNzaW9uLm5hbWUpPy5vcmlnaW4gPz8gc3RhdGVtZW50LmluaXRpYWxpemVyLmxvY2F0aW9uXG4gICAgICAgICAgOiBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIubG9jYXRpb25cbiAgICAgICAgZmxvdy5zdGF0ZS5zZXQoc3RhdGVtZW50Lm5hbWUsIG9wZW5TdGF0ZShgbG9jYWw6JHtzdGF0ZW1lbnQubmFtZX1gLCBvcmlnaW4pKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmxvd3MubWFwKChmbG93KSA9PiAoey4uLmZsb3csIGxvY2F0aW9uOiBzdGF0ZW1lbnQubG9jYXRpb259KSlcbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB7XG4gICAgcmV0dXJuIGV2YWx1YXRlRXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgY2xvbmVTdGF0ZShzdGF0ZSksIGZhaWwsIGVycm9yRWZmZWN0cylcbiAgICAgIC5tYXAoKGZsb3cpID0+ICh7Li4uZmxvdywgbG9jYXRpb246IHN0YXRlbWVudC5sb2NhdGlvbn0pKVxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCIpIHtcbiAgICByZXR1cm4gZXZhbHVhdGVFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uLCBjbG9uZVN0YXRlKHN0YXRlKSwgZmFpbCwgZXJyb3JFZmZlY3RzKVxuICAgICAgLm1hcCgoZmxvdykgPT4gKHsuLi5mbG93LCBsb2NhdGlvbjogc3RhdGVtZW50LmxvY2F0aW9ufSkpXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIpIHtcbiAgICBjb25zdCBmbG93cyA9IHN0YXRlbWVudC5leHByZXNzaW9uID8gZXZhbHVhdGVFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uLCBjbG9uZVN0YXRlKHN0YXRlKSwgZmFpbCwgZXJyb3JFZmZlY3RzKSA6XG4gICAgICAvKiogQHR5cGUge0xpZmV0aW1lRXhpdFtdfSAqLyAoW3traW5kOiBcIm5vcm1hbFwiLCBzdGF0ZTogY2xvbmVTdGF0ZShzdGF0ZSl9XSlcbiAgICByZXR1cm4gZmxvd3MubWFwKChmbG93KSA9PiBmbG93LmtpbmQgPT0gXCJub3JtYWxcIlxuICAgICAgPyB7a2luZDogXCJyZXR1cm5cIiwgbG9jYXRpb246IHN0YXRlbWVudC5sb2NhdGlvbiwgc3RhdGU6IGZsb3cuc3RhdGV9XG4gICAgICA6IHsuLi5mbG93LCBsb2NhdGlvbjogc3RhdGVtZW50LmxvY2F0aW9ufSlcbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSYWlzZVN0YXRlbWVudFwiKSB7XG4gICAgY29uc3QgZmxvd3MgPSBldmFsdWF0ZUV4cHJlc3Npb24oc3RhdGVtZW50LmVycm9yLm1lc3NhZ2UsIGNsb25lU3RhdGUoc3RhdGUpLCBmYWlsLCBlcnJvckVmZmVjdHMpXG4gICAgcmV0dXJuIGZsb3dzLm1hcCgoZmxvdykgPT4gZmxvdy5raW5kID09IFwibm9ybWFsXCJcbiAgICAgID8ge2Vycm9ySWQ6IHN0YXRlbWVudC5lcnJvci5lcnJvci5kZWNsYXJhdGlvbklkLCBraW5kOiBcInJhaXNlXCIsIGxvY2F0aW9uOiBzdGF0ZW1lbnQubG9jYXRpb24sIHN0YXRlOiBmbG93LnN0YXRlfVxuICAgICAgOiB7Li4uZmxvdywgbG9jYXRpb246IHN0YXRlbWVudC5sb2NhdGlvbn0pXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIikge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBldmFsdWF0ZUV4cHJlc3Npb24oc3RhdGVtZW50LmNvbmRpdGlvbiwgY2xvbmVTdGF0ZShzdGF0ZSksIGZhaWwsIGVycm9yRWZmZWN0cylcbiAgICAvKiogQHR5cGUge0xpZmV0aW1lRXhpdFtdfSAqL1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmRpdGlvbnMuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgIT0gXCJub3JtYWxcIilcblxuICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgPT0gXCJub3JtYWxcIikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmFuYWx5emVCbG9jayhzdGF0ZW1lbnQuY29uc2VxdWVudCwgW3traW5kOiBcIm5vcm1hbFwiLCBzdGF0ZTogY2xvbmVTdGF0ZShjb25kaXRpb24uc3RhdGUpfV0sIGZhaWwsXG4gICAgICAgIGVycm9yRWZmZWN0cykpXG4gICAgICBjb25zdCBhbHRlcm5hdGUgPSBzdGF0ZW1lbnQuYWx0ZXJuYXRlXG4gICAgICAgID8gYW5hbHl6ZUJsb2NrKHN0YXRlbWVudC5hbHRlcm5hdGUsIFt7a2luZDogXCJub3JtYWxcIiwgc3RhdGU6IGNsb25lU3RhdGUoY29uZGl0aW9uLnN0YXRlKX1dLCBmYWlsLCBlcnJvckVmZmVjdHMpXG4gICAgICAgIDogLyoqIEB0eXBlIHtMaWZldGltZUV4aXRbXX0gKi8gKFt7a2luZDogXCJub3JtYWxcIiwgbG9jYXRpb246IHN0YXRlbWVudC5sb2NhdGlvbiwgc3RhdGU6IGNsb25lU3RhdGUoY29uZGl0aW9uLnN0YXRlKX1dKVxuXG4gICAgICByZXN1bHQucHVzaCguLi5hbHRlcm5hdGUpXG4gICAgfVxuICAgIHJldHVybiBtZXJnZUVxdWl2YWxlbnROb3JtYWxzKHJlc3VsdCwgc3RhdGVtZW50LmxvY2F0aW9uLCBmYWlsKVxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlRyeVN0YXRlbWVudFwiKSB7XG4gICAgY29uc3QgYm9keUV4aXRzID0gYW5hbHl6ZUJsb2NrKHN0YXRlbWVudC5ib2R5LCBbe2tpbmQ6IFwibm9ybWFsXCIsIHN0YXRlOiBjbG9uZVN0YXRlKHN0YXRlKX1dLCBmYWlsLCBlcnJvckVmZmVjdHMpXG4gICAgLyoqIEB0eXBlIHtMaWZldGltZUV4aXRbXX0gKi9cbiAgICBjb25zdCByZXN1bHQgPSBib2R5RXhpdHMuZmlsdGVyKChmbG93KSA9PiBmbG93LmtpbmQgIT0gXCJyYWlzZVwiIHx8IGZsb3cuZXJyb3JJZCAhPSBzdGF0ZW1lbnQuY2F0Y2hUeXBlLmRlY2xhcmF0aW9uSWQpXG5cbiAgICBmb3IgKGNvbnN0IGNhdWdodCBvZiBib2R5RXhpdHMuZmlsdGVyKChmbG93KSA9PiBmbG93LmtpbmQgPT0gXCJyYWlzZVwiICYmIGZsb3cuZXJyb3JJZCA9PSBzdGF0ZW1lbnQuY2F0Y2hUeXBlLmRlY2xhcmF0aW9uSWQpKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5hbmFseXplQmxvY2soc3RhdGVtZW50LmNhdGNoQm9keSwgW3traW5kOiBcIm5vcm1hbFwiLCBzdGF0ZTogY2xvbmVTdGF0ZShjYXVnaHQuc3RhdGUpfV0sIGZhaWwsIGVycm9yRWZmZWN0cykpXG4gICAgfVxuICAgIHJldHVybiBtZXJnZUVxdWl2YWxlbnROb3JtYWxzKHJlc3VsdCwgc3RhdGVtZW50LmxvY2F0aW9uLCBmYWlsKVxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIldoaWxlU3RhdGVtZW50XCIpIHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gZXZhbHVhdGVFeHByZXNzaW9uKHN0YXRlbWVudC5jb25kaXRpb24sIGNsb25lU3RhdGUoc3RhdGUpLCBmYWlsLCBlcnJvckVmZmVjdHMpXG4gICAgLyoqIEB0eXBlIHtMaWZldGltZUV4aXRbXX0gKi9cbiAgICBjb25zdCByZXN1bHQgPSBjb25kaXRpb25zLmZpbHRlcigoe2tpbmR9KSA9PiBraW5kICE9IFwibm9ybWFsXCIpXG5cbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zLmZpbHRlcigoe2tpbmR9KSA9PiBraW5kID09IFwibm9ybWFsXCIpKSB7XG4gICAgICBjb25zdCBib2R5RXhpdHMgPSBhbmFseXplQmxvY2soc3RhdGVtZW50LmJvZHksIFt7a2luZDogXCJub3JtYWxcIiwgc3RhdGU6IGNsb25lU3RhdGUoY29uZGl0aW9uLnN0YXRlKX1dLCBmYWlsLFxuICAgICAgICBlcnJvckVmZmVjdHMpXG4gICAgICBmb3IgKGNvbnN0IGV4aXQgb2YgYm9keUV4aXRzKSB7XG4gICAgICAgIGlmIChleGl0LmtpbmQgPT0gXCJub3JtYWxcIiB8fCBleGl0LmtpbmQgPT0gXCJjb250aW51ZVwiKSByZXF1aXJlU2FtZVN0YXRlKGNvbmRpdGlvbi5zdGF0ZSwgZXhpdC5zdGF0ZSwgc3RhdGVtZW50LmxvY2F0aW9uLCBmYWlsKVxuICAgICAgICBlbHNlIGlmIChleGl0LmtpbmQgPT0gXCJicmVha1wiKSB7XG4gICAgICAgICAgcmVxdWlyZVNhbWVTdGF0ZShjb25kaXRpb24uc3RhdGUsIGV4aXQuc3RhdGUsIHN0YXRlbWVudC5sb2NhdGlvbiwgZmFpbClcbiAgICAgICAgICByZXN1bHQucHVzaCh7a2luZDogXCJub3JtYWxcIiwgbG9jYXRpb246IHN0YXRlbWVudC5sb2NhdGlvbiwgc3RhdGU6IGV4aXQuc3RhdGV9KVxuICAgICAgICB9IGVsc2UgcmVzdWx0LnB1c2goZXhpdClcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHtraW5kOiBcIm5vcm1hbFwiLCBsb2NhdGlvbjogc3RhdGVtZW50LmxvY2F0aW9uLCBzdGF0ZTogY29uZGl0aW9uLnN0YXRlfSlcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlRXF1aXZhbGVudE5vcm1hbHMocmVzdWx0LCBzdGF0ZW1lbnQubG9jYXRpb24sIGZhaWwpXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRm9yRWFjaFN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiRm9yRWFjaE1hcFN0YXRlbWVudFwiKSB7XG4gICAgY29uc3Qgb3BlcmFuZCA9IHN0YXRlbWVudC5raW5kID09IFwiRm9yRWFjaFN0YXRlbWVudFwiID8gc3RhdGVtZW50Lmxpc3QgOiBzdGF0ZW1lbnQubWFwXG4gICAgY29uc3Qgb3BlcmFuZHMgPSBldmFsdWF0ZUV4cHJlc3Npb24ob3BlcmFuZCwgY2xvbmVTdGF0ZShzdGF0ZSksIGZhaWwsIGVycm9yRWZmZWN0cylcbiAgICAvKiogQHR5cGUge0xpZmV0aW1lRXhpdFtdfSAqL1xuICAgIGNvbnN0IHJlc3VsdCA9IG9wZXJhbmRzLmZpbHRlcigoe2tpbmR9KSA9PiBraW5kICE9IFwibm9ybWFsXCIpXG5cbiAgICBmb3IgKGNvbnN0IGV2YWx1YXRlZCBvZiBvcGVyYW5kcy5maWx0ZXIoKHtraW5kfSkgPT4ga2luZCA9PSBcIm5vcm1hbFwiKSkge1xuICAgICAgY29uc3QgYm9keUV4aXRzID0gYW5hbHl6ZUJsb2NrKHN0YXRlbWVudC5ib2R5LCBbe2tpbmQ6IFwibm9ybWFsXCIsIHN0YXRlOiBjbG9uZVN0YXRlKGV2YWx1YXRlZC5zdGF0ZSl9XSwgZmFpbCxcbiAgICAgICAgZXJyb3JFZmZlY3RzKVxuICAgICAgZm9yIChjb25zdCBleGl0IG9mIGJvZHlFeGl0cykge1xuICAgICAgICBpZiAoZXhpdC5raW5kID09IFwibm9ybWFsXCIgfHwgZXhpdC5raW5kID09IFwiY29udGludWVcIikgcmVxdWlyZVNhbWVTdGF0ZShldmFsdWF0ZWQuc3RhdGUsIGV4aXQuc3RhdGUsIHN0YXRlbWVudC5sb2NhdGlvbiwgZmFpbClcbiAgICAgICAgZWxzZSBpZiAoZXhpdC5raW5kID09IFwiYnJlYWtcIikge1xuICAgICAgICAgIHJlcXVpcmVTYW1lU3RhdGUoZXZhbHVhdGVkLnN0YXRlLCBleGl0LnN0YXRlLCBzdGF0ZW1lbnQubG9jYXRpb24sIGZhaWwpXG4gICAgICAgICAgcmVzdWx0LnB1c2goe2tpbmQ6IFwibm9ybWFsXCIsIGxvY2F0aW9uOiBzdGF0ZW1lbnQubG9jYXRpb24sIHN0YXRlOiBleGl0LnN0YXRlfSlcbiAgICAgICAgfSBlbHNlIHJlc3VsdC5wdXNoKGV4aXQpXG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh7a2luZDogXCJub3JtYWxcIiwgbG9jYXRpb246IHN0YXRlbWVudC5sb2NhdGlvbiwgc3RhdGU6IGV2YWx1YXRlZC5zdGF0ZX0pXG4gICAgfVxuICAgIHJldHVybiBtZXJnZUVxdWl2YWxlbnROb3JtYWxzKHJlc3VsdCwgc3RhdGVtZW50LmxvY2F0aW9uLCBmYWlsKVxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkJyZWFrU3RhdGVtZW50XCIpIHJldHVybiBbe2tpbmQ6IFwiYnJlYWtcIiwgbG9jYXRpb246IHN0YXRlbWVudC5sb2NhdGlvbiwgc3RhdGU6IGNsb25lU3RhdGUoc3RhdGUpfV1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQ29udGludWVTdGF0ZW1lbnRcIikgcmV0dXJuIFt7a2luZDogXCJjb250aW51ZVwiLCBsb2NhdGlvbjogc3RhdGVtZW50LmxvY2F0aW9uLCBzdGF0ZTogY2xvbmVTdGF0ZShzdGF0ZSl9XVxuXG4gIHJldHVybiBbXVxufVxuXG4vKipcbiAqIEV2YWx1YXRlcyBvbmUgZXhwcmVzc2lvbiB3aXRoIGZhaWx1cmUgc3RhdGVzIGF0IGV4YWN0IGV2YWx1YXRpb24gYm91bmRhcmllcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gRXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgT3duZXJTdGF0ZT59IHN0YXRlIC0gSW5jb21pbmcgb3duZXJzaGlwIHN0YXRlLlxuICogQHBhcmFtIHtMaWZldGltZUZhaWx9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcGFyYW0ge3tmdW5jdGlvbnM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiwgbWV0aG9kczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gZXJyb3JFZmZlY3RzIC0gQ29tcGxldGUgZXNjYXBpbmcgZXJyb3Igc2V0cyBwZXIgZnVuY3Rpb24gYW5kIG1ldGhvZC5cbiAqIEByZXR1cm5zIHtMaWZldGltZUV4aXRbXX0gUmVhY2hhYmxlIGV4aXRzLlxuICovXG5mdW5jdGlvbiBldmFsdWF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc3RhdGUsIGZhaWwsIGVycm9yRWZmZWN0cykge1xuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3duZWRNb3ZlRXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3Qgb3duZXIgPSByZXF1aXJlT3duZXIoZXhwcmVzc2lvbi5leHByZXNzaW9uLm5hbWUsIHN0YXRlLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsKVxuXG4gICAgaWYgKG93bmVyLmtpbmQgPT0gXCJtb3ZlZFwiKSBmYWlsKFwiVVNFX0FGVEVSX01PVkVcIiwgYFJlc291cmNlICcke2V4cHJlc3Npb24uZXhwcmVzc2lvbi5uYW1lfScgd2FzIGFscmVhZHkgbW92ZWQuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICBpZiAob3duZXIua2luZCA9PSBcInRlcm1pbmFsXCIpIGZhaWwoXCJVU0VfQUZURVJfQ0xPU0VcIiwgYFJlc291cmNlICcke2V4cHJlc3Npb24uZXhwcmVzc2lvbi5uYW1lfScgaXMgdGVybWluYWwgYWZ0ZXIgY2xvc2UuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICBzdGF0ZS5zZXQoZXhwcmVzc2lvbi5leHByZXNzaW9uLm5hbWUsIHsuLi5vd25lciwgZGVzdGluYXRpb246IFwidHJhbnNmZXJcIiwga2luZDogXCJtb3ZlZFwifSlcbiAgICByZXR1cm4gW3traW5kOiBcIm5vcm1hbFwiLCBzdGF0ZX1dXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgbmFtZSA9IHBsYWNlTmFtZShleHByZXNzaW9uLmV4cHJlc3Npb24pXG4gICAgY29uc3Qgb3duZXIgPSByZXF1aXJlT3duZXIobmFtZSwgc3RhdGUsIGV4cHJlc3Npb24ubG9jYXRpb24sIGZhaWwpXG5cbiAgICBpZiAob3duZXIua2luZCA9PSBcIm1vdmVkXCIpIGZhaWwoXCJVU0VfQUZURVJfTU9WRVwiLCBgUmVzb3VyY2UgJyR7bmFtZX0nIHdhcyBtb3ZlZCBiZWZvcmUgdGhpcyBib3Jyb3cuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICByZXR1cm4gW3traW5kOiBcIm5vcm1hbFwiLCBzdGF0ZX1dXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIpIHJldHVybiBldmFsdWF0ZUVmZmVjdENhbGwoZXhwcmVzc2lvbiwgc3RhdGUsIGZhaWwsIGVycm9yRWZmZWN0cylcbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIgfHwgZXhwcmVzc2lvbi5raW5kID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIiB8fCBleHByZXNzaW9uLmtpbmQgPT0gXCJSZWZlcmVuY2VDb25zdHJ1Y3Rpb25cIikge1xuICAgIHJldHVybiBldmFsdWF0ZU9yZGluYXJ5Q2FsbChleHByZXNzaW9uLCBzdGF0ZSwgZmFpbCwgZXJyb3JFZmZlY3RzKVxuICB9XG5cbiAgLyoqIEB0eXBlIHtMaWZldGltZUV4aXRbXX0gKi9cbiAgbGV0IGZsb3dzID0gW3traW5kOiBcIm5vcm1hbFwiLCBzdGF0ZX1dXG4gIGZvciAoY29uc3QgY2hpbGQgb2YgZXhwcmVzc2lvbkNoaWxkcmVuKGV4cHJlc3Npb24pKSBmbG93cyA9IGV2YWx1YXRlRm9yRmxvd3MoY2hpbGQsIGZsb3dzLCBmYWlsLCBlcnJvckVmZmVjdHMpXG4gIHJldHVybiBmbG93c1xufVxuXG4vKipcbiAqIEFwcGxpZXMgb25lIGNhcGFiaWxpdHkgb3BlcmF0aW9uJ3MgZGVjbGFyZWQgb3duZXJzaGlwIGFuZCBmYWlsdXJlIGZsb3cuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRWZmZWN0Q2FsbEV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBFZmZlY3QgY2FsbC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgT3duZXJTdGF0ZT59IHN0YXRlIC0gSW5jb21pbmcgb3duZXJzaGlwIHN0YXRlLlxuICogQHBhcmFtIHtMaWZldGltZUZhaWx9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcGFyYW0ge3tmdW5jdGlvbnM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiwgbWV0aG9kczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gZXJyb3JFZmZlY3RzIC0gQ29tcGxldGUgZXNjYXBpbmcgZXJyb3Igc2V0cyBwZXIgZnVuY3Rpb24gYW5kIG1ldGhvZC5cbiAqIEByZXR1cm5zIHtMaWZldGltZUV4aXRbXX0gUmVhY2hhYmxlIGV4aXRzLlxuICovXG5mdW5jdGlvbiBldmFsdWF0ZUVmZmVjdENhbGwoZXhwcmVzc2lvbiwgc3RhdGUsIGZhaWwsIGVycm9yRWZmZWN0cykge1xuICAvKiogQHR5cGUge0xpZmV0aW1lRXhpdFtdfSAqL1xuICBsZXQgZmxvd3MgPSBbe2tpbmQ6IFwibm9ybWFsXCIsIHN0YXRlfV1cblxuICBmb3IgKGNvbnN0IGFyZ3VtZW50IG9mIGV4cHJlc3Npb24uYXJndW1lbnRzKSBmbG93cyA9IGV2YWx1YXRlRm9yRmxvd3MoYXJndW1lbnQsIGZsb3dzLCBmYWlsLCBlcnJvckVmZmVjdHMpXG4gIGNvbnN0IHJlc3VsdCA9IGZsb3dzLmZpbHRlcigoe2tpbmR9KSA9PiBraW5kICE9IFwibm9ybWFsXCIpXG4gIGNvbnN0IHJlc291cmNlRmxvdyA9IGV4cHJlc3Npb24ucmVzb2x1dGlvbi5yZXNvdXJjZUZsb3dcblxuICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgPT0gXCJub3JtYWxcIikpIHtcbiAgICBsZXQgb3BlcmF0aW9uU3RhdGUgPSBjbG9uZVN0YXRlKGZsb3cuc3RhdGUpXG4gICAgbGV0IHRlcm1pbmFsRmFpbHVyZVxuXG4gICAgaWYgKHJlc291cmNlRmxvdy5raW5kID09IFwiYm9ycm93XCIgfHwgcmVzb3VyY2VGbG93LmtpbmQgPT0gXCJjbG9zZVwiKSB7XG4gICAgICBjb25zdCBhcmd1bWVudCA9IGV4cHJlc3Npb24uYXJndW1lbnRzW3Jlc291cmNlRmxvdy5wYXJhbWV0ZXJJbmRleF1cbiAgICAgIGlmIChhcmd1bWVudC5raW5kICE9IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIpIGZhaWwoXCJJTlZBTElEX1JFU09VUkNFX0JPUlJPV1wiLCBcIlJlc291cmNlIG9wZXJhdGlvbiBsYWNrcyBhbiBpbW1lZGlhdGUgYm9ycm93LlwiLCBhcmd1bWVudC5sb2NhdGlvbilcbiAgICAgIGNvbnN0IG5hbWUgPSBwbGFjZU5hbWUoYXJndW1lbnQuZXhwcmVzc2lvbilcbiAgICAgIGNvbnN0IG93bmVyID0gcmVxdWlyZU93bmVyKG5hbWUsIG9wZXJhdGlvblN0YXRlLCBhcmd1bWVudC5sb2NhdGlvbiwgZmFpbClcblxuICAgICAgaWYgKG93bmVyLmtpbmQgPT0gXCJtb3ZlZFwiKSBmYWlsKFwiVVNFX0FGVEVSX01PVkVcIiwgYFJlc291cmNlICcke25hbWV9JyB3YXMgbW92ZWQgYmVmb3JlIHRoaXMgb3BlcmF0aW9uLmAsIGFyZ3VtZW50LmxvY2F0aW9uKVxuICAgICAgaWYgKG93bmVyLmtpbmQgPT0gXCJ0ZXJtaW5hbFwiKSB0ZXJtaW5hbEZhaWx1cmUgPSByZXNvdXJjZUZsb3cudGVybWluYWxGYWlsdXJlSWRcbiAgICAgIGVsc2UgaWYgKHJlc291cmNlRmxvdy5raW5kID09IFwiY2xvc2VcIikgb3BlcmF0aW9uU3RhdGUuc2V0KG5hbWUsIHsuLi5vd25lciwgY2xvc2VTaXRlSWQ6IGV4cHJlc3Npb24uZWZmZWN0U2l0ZUlkLCBraW5kOiBcInRlcm1pbmFsXCJ9KVxuICAgIH1cbiAgICBpZiAodGVybWluYWxGYWlsdXJlKSB7XG4gICAgICByZXN1bHQucHVzaCh7ZXJyb3JJZDogdGVybWluYWxGYWlsdXJlLCBraW5kOiBcInJhaXNlXCIsIGxvY2F0aW9uOiBleHByZXNzaW9uLmxvY2F0aW9uLCBzdGF0ZTogb3BlcmF0aW9uU3RhdGV9KVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgZmFpbHVyZUlkcyA9IGV4cHJlc3Npb24ucmVzb2x1dGlvbi5mYWlsdXJlSWRzLmZpbHRlcigoaWQpID0+XG4gICAgICByZXNvdXJjZUZsb3cua2luZCAhPSBcImJvcnJvd1wiICYmIHJlc291cmNlRmxvdy5raW5kICE9IFwiY2xvc2VcIiB8fCBpZCAhPSByZXNvdXJjZUZsb3cudGVybWluYWxGYWlsdXJlSWQpXG5cbiAgICByZXN1bHQucHVzaCh7a2luZDogXCJub3JtYWxcIiwgc3RhdGU6IGNsb25lU3RhdGUob3BlcmF0aW9uU3RhdGUpfSlcbiAgICBmb3IgKGNvbnN0IGVycm9ySWQgb2YgZmFpbHVyZUlkcykge1xuICAgICAgcmVzdWx0LnB1c2goe2Vycm9ySWQsIGtpbmQ6IFwicmFpc2VcIiwgbG9jYXRpb246IGV4cHJlc3Npb24ubG9jYXRpb24sIHN0YXRlOiBjbG9uZVN0YXRlKG9wZXJhdGlvblN0YXRlKX0pXG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGNhbGwtZW50cnkgb3duZXJzaGlwIGNvbW1pdCBzZW1hbnRpY3MgYWZ0ZXIgb3JkZXJlZCBhcmd1bWVudCBldmFsdWF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNhbGxFeHByZXNzaW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5NZXRob2RDYWxsRXhwcmVzc2lvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVmZXJlbmNlQ29uc3RydWN0aW9ufSBleHByZXNzaW9uIC0gQ2FsbC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgT3duZXJTdGF0ZT59IHN0YXRlIC0gSW5jb21pbmcgb3duZXJzaGlwIHN0YXRlLlxuICogQHBhcmFtIHtMaWZldGltZUZhaWx9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcGFyYW0ge3tmdW5jdGlvbnM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiwgbWV0aG9kczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gZXJyb3JFZmZlY3RzIC0gQ29tcGxldGUgZXNjYXBpbmcgZXJyb3Igc2V0cyBwZXIgZnVuY3Rpb24gYW5kIG1ldGhvZC5cbiAqIEByZXR1cm5zIHtMaWZldGltZUV4aXRbXX0gUmVhY2hhYmxlIGV4aXRzLlxuICovXG5mdW5jdGlvbiBldmFsdWF0ZU9yZGluYXJ5Q2FsbChleHByZXNzaW9uLCBzdGF0ZSwgZmFpbCwgZXJyb3JFZmZlY3RzKSB7XG4gIGNvbnN0IGFyZ3VtZW50c18gPSBleHByZXNzaW9uLmtpbmQgPT0gXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiID8gW2V4cHJlc3Npb24ucmVjZWl2ZXIsIC4uLmV4cHJlc3Npb24uYXJndW1lbnRzXSA6IGV4cHJlc3Npb24uYXJndW1lbnRzXG4gIC8qKiBAdHlwZSB7TGlmZXRpbWVFeGl0W119ICovXG4gIGxldCBmbG93cyA9IFt7a2luZDogXCJub3JtYWxcIiwgc3RhdGV9XVxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCByZXNlcnZlZE1vdmVzID0gW11cblxuICBmb3IgKGNvbnN0IGFyZ3VtZW50IG9mIGFyZ3VtZW50c18pIHtcbiAgICBpZiAoYXJndW1lbnQua2luZCA9PSBcIk93bmVkTW92ZUV4cHJlc3Npb25cIikge1xuICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzLmZpbHRlcigoe2tpbmR9KSA9PiBraW5kID09IFwibm9ybWFsXCIpKSB7XG4gICAgICAgIGNvbnN0IG93bmVyID0gcmVxdWlyZU93bmVyKGFyZ3VtZW50LmV4cHJlc3Npb24ubmFtZSwgZmxvdy5zdGF0ZSwgYXJndW1lbnQubG9jYXRpb24sIGZhaWwpXG4gICAgICAgIGlmIChvd25lci5raW5kID09IFwibW92ZWRcIikgZmFpbChcIlVTRV9BRlRFUl9NT1ZFXCIsIGBSZXNvdXJjZSAnJHthcmd1bWVudC5leHByZXNzaW9uLm5hbWV9JyB3YXMgYWxyZWFkeSBtb3ZlZC5gLCBhcmd1bWVudC5sb2NhdGlvbilcbiAgICAgICAgaWYgKG93bmVyLmtpbmQgPT0gXCJ0ZXJtaW5hbFwiKSBmYWlsKFwiVVNFX0FGVEVSX0NMT1NFXCIsIGBSZXNvdXJjZSAnJHthcmd1bWVudC5leHByZXNzaW9uLm5hbWV9JyBpcyB0ZXJtaW5hbCBhZnRlciBjbG9zZS5gLCBhcmd1bWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChyZXNlcnZlZE1vdmVzLmluY2x1ZGVzKGFyZ3VtZW50LmV4cHJlc3Npb24ubmFtZSkpIHtcbiAgICAgICAgZmFpbChcIlJFU09VUkNFX0FMSUFTXCIsIGBSZXNvdXJjZSAnJHthcmd1bWVudC5leHByZXNzaW9uLm5hbWV9JyBjYW5ub3QgYmUgdHJhbnNmZXJyZWQgdG8gdHdvIHBhcmFtZXRlcnMuYCwgYXJndW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICByZXNlcnZlZE1vdmVzLnB1c2goYXJndW1lbnQuZXhwcmVzc2lvbi5uYW1lKVxuICAgIH0gZWxzZSBmbG93cyA9IGV2YWx1YXRlRm9yRmxvd3MoYXJndW1lbnQsIGZsb3dzLCBmYWlsLCBlcnJvckVmZmVjdHMpXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gZmxvd3MuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgIT0gXCJub3JtYWxcIilcblxuICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgPT0gXCJub3JtYWxcIikpIHtcbiAgICBjb25zdCBlbnRlcmVkID0gY2xvbmVTdGF0ZShmbG93LnN0YXRlKVxuICAgIGZvciAoY29uc3QgbmFtZSBvZiByZXNlcnZlZE1vdmVzKSB7XG4gICAgICBjb25zdCBvd25lciA9IHJlcXVpcmVPd25lcihuYW1lLCBlbnRlcmVkLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsKVxuICAgICAgaWYgKG93bmVyLmtpbmQgPT0gXCJtb3ZlZFwiKSBmYWlsKFwiVVNFX0FGVEVSX01PVkVcIiwgYFJlc291cmNlICcke25hbWV9JyB3YXMgYWxyZWFkeSBtb3ZlZC5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgaWYgKG93bmVyLmtpbmQgPT0gXCJ0ZXJtaW5hbFwiKSBmYWlsKFwiVVNFX0FGVEVSX0NMT1NFXCIsIGBSZXNvdXJjZSAnJHtuYW1lfScgaXMgdGVybWluYWwgYWZ0ZXIgY2xvc2UuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIGVudGVyZWQuc2V0KG5hbWUsIHsuLi5vd25lciwgZGVzdGluYXRpb246IFwiY2FsbGVlXCIsIGtpbmQ6IFwibW92ZWRcIn0pXG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiICYmIGV4cHJlc3Npb24ucmVzb2x1dGlvbj8ucmVzb3VyY2VGbG93KSB7XG4gICAgICBjb25zdCByZWNlaXZlciA9IGV4cHJlc3Npb24ucmVjZWl2ZXIua2luZCA9PSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiID8gZXhwcmVzc2lvbi5yZWNlaXZlci5leHByZXNzaW9uIDogZXhwcmVzc2lvbi5yZWNlaXZlclxuICAgICAgaWYgKHJlY2VpdmVyLmtpbmQgIT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiICYmIHJlY2VpdmVyLmtpbmQgIT0gXCJSZWNlaXZlckV4cHJlc3Npb25cIiAmJiByZWNlaXZlci5raW5kICE9IFwiUHJpdmF0ZUZpZWxkUmVhZFwiKSB7XG4gICAgICAgIGZhaWwoXCJJTlZBTElEX1JFU09VUkNFX0JPUlJPV1wiLCBcIk93bmVkIG1ldGhvZCByZWNlaXZlciBtdXN0IGJlIGFuIGltbWVkaWF0ZSBib3Jyb3dlZCBwbGFjZS5cIiwgcmVjZWl2ZXIubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBuYW1lID0gcGxhY2VOYW1lKHJlY2VpdmVyKVxuICAgICAgY29uc3Qgb3duZXIgPSByZXF1aXJlT3duZXIobmFtZSwgZW50ZXJlZCwgZXhwcmVzc2lvbi5sb2NhdGlvbiwgZmFpbClcblxuICAgICAgaWYgKG93bmVyLmtpbmQgPT0gXCJ0ZXJtaW5hbFwiKSB7XG4gICAgICAgIGlmIChleHByZXNzaW9uLnJlc29sdXRpb24ucmVzb3VyY2VGbG93LnRlcm1pbmFsRmFpbHVyZUlkKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goe2Vycm9ySWQ6IGV4cHJlc3Npb24ucmVzb2x1dGlvbi5yZXNvdXJjZUZsb3cudGVybWluYWxGYWlsdXJlSWQsIGtpbmQ6IFwicmFpc2VcIixcbiAgICAgICAgICAgIGxvY2F0aW9uOiBleHByZXNzaW9uLmxvY2F0aW9uLCBzdGF0ZTogZW50ZXJlZH0pXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmYWlsKFwiVVNFX0FGVEVSX0NMT1NFXCIsIGBSZXNvdXJjZSAnJHtuYW1lfScgaXMgdGVybWluYWwgYWZ0ZXIgY2xvc2UuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChleHByZXNzaW9uLnJlc29sdXRpb24ucmVzb3VyY2VGbG93LmtpbmQgPT0gXCJ0ZXJtaW5hbFwiKSB7XG4gICAgICAgIGVudGVyZWQuc2V0KG5hbWUsIHsuLi5vd25lciwgY2xvc2VTaXRlSWQ6IGV4cHJlc3Npb24uZWZmZWN0U2l0ZUlkID8/IGV4cHJlc3Npb24ubG9jYXRpb24sIGtpbmQ6IFwidGVybWluYWxcIn0pXG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKHtraW5kOiBcIm5vcm1hbFwiLCBzdGF0ZTogY2xvbmVTdGF0ZShlbnRlcmVkKX0pXG4gICAgY29uc3QgZXNjYXBpbmcgPSBuZXcgU2V0KGV4cHJlc3Npb24uZmFpbHVyZUlkcyA/PyBbXSlcblxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGVycm9ySWQgb2YgZXJyb3JFZmZlY3RzLmZ1bmN0aW9ucy5nZXQoZXhwcmVzc2lvbi5jYWxsZWUpID8/IFtdKSBlc2NhcGluZy5hZGQoZXJyb3JJZClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1ldGhvZENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgIGZvciAoY29uc3QgZXJyb3JJZCBvZiBlcnJvckVmZmVjdHMubWV0aG9kcy5nZXQoZXhwcmVzc2lvbi5tZXRob2QpID8/IFtdKSBlc2NhcGluZy5hZGQoZXJyb3JJZClcbiAgICB9XG4gICAgZm9yIChjb25zdCBlcnJvcklkIG9mIGVzY2FwaW5nKSB7XG4gICAgICByZXN1bHQucHVzaCh7ZXJyb3JJZCwga2luZDogXCJyYWlzZVwiLCBsb2NhdGlvbjogZXhwcmVzc2lvbi5sb2NhdGlvbiwgc3RhdGU6IGNsb25lU3RhdGUoZW50ZXJlZCl9KVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogRXZhbHVhdGVzIGEgY2hpbGQgZXhwcmVzc2lvbiBvbmx5IGFsb25nIG5vcm1hbCBpbmNvbWluZyBwYXRocy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQ2hpbGQgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7TGlmZXRpbWVFeGl0W119IGZsb3dzIC0gSW5jb21pbmcgcGF0aHMuXG4gKiBAcGFyYW0ge0xpZmV0aW1lRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEBwYXJhbSB7e2Z1bmN0aW9uczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LCBtZXRob2RzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBlcnJvckVmZmVjdHMgLSBDb21wbGV0ZSBlc2NhcGluZyBlcnJvciBzZXRzIHBlciBmdW5jdGlvbiBhbmQgbWV0aG9kLlxuICogQHJldHVybnMge0xpZmV0aW1lRXhpdFtdfSBSZWFjaGFibGUgZXhpdHMuXG4gKi9cbmZ1bmN0aW9uIGV2YWx1YXRlRm9yRmxvd3MoZXhwcmVzc2lvbiwgZmxvd3MsIGZhaWwsIGVycm9yRWZmZWN0cykge1xuICBjb25zdCByZXN1bHQgPSBmbG93cy5maWx0ZXIoKHtraW5kfSkgPT4ga2luZCAhPSBcIm5vcm1hbFwiKVxuICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgPT0gXCJub3JtYWxcIikpIHtcbiAgICByZXN1bHQucHVzaCguLi5ldmFsdWF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY2xvbmVTdGF0ZShmbG93LnN0YXRlKSwgZmFpbCwgZXJyb3JFZmZlY3RzKSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogUmV0dXJucyBub24tY2FsbCBleHByZXNzaW9uIGNoaWxkcmVuIGluIGV2YWx1YXRpb24gb3JkZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFBhcmVudCBleHByZXNzaW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbltdfSBDaGlsZHJlbi5cbiAqL1xuZnVuY3Rpb24gZXhwcmVzc2lvbkNoaWxkcmVuKGV4cHJlc3Npb24pIHtcbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLmxlZnQsIGV4cHJlc3Npb24ucmlnaHRdXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLm9wZXJhbmRdXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbFNvbWVcIikgcmV0dXJuIFtleHByZXNzaW9uLnZhbHVlXVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3B0aW9uYWxJc1ByZXNlbnRcIiB8fCBleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbFVud3JhcFwiKSByZXR1cm4gW2V4cHJlc3Npb24ub3BlcmFuZF1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkxpc3RMaXRlcmFsXCIpIHJldHVybiBleHByZXNzaW9uLmVsZW1lbnRzXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNYXBMaXRlcmFsXCIgfHwgZXhwcmVzc2lvbi5raW5kID09IFwiT3JkZXJlZE1hcExpdGVyYWxcIikgcmV0dXJuIGV4cHJlc3Npb24uZW50cmllcy5tYXAoKHt2YWx1ZX0pID0+IHZhbHVlKVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTGlzdEluZGV4RXhwcmVzc2lvblwiKSByZXR1cm4gW2V4cHJlc3Npb24uY29sbGVjdGlvbiwgZXhwcmVzc2lvbi5pbmRleF1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1hcExvb2t1cEV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLmNvbGxlY3Rpb24sIGV4cHJlc3Npb24ua2V5XVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ29sbGVjdGlvblNpemVFeHByZXNzaW9uXCIpIHJldHVybiBbZXhwcmVzc2lvbi5jb2xsZWN0aW9uXVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiUmVjb3JkQ29uc3RydWN0aW9uXCIpIHJldHVybiBleHByZXNzaW9uLmFyZ3VtZW50c1xuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWVtYmVyUmVhZFwiKSByZXR1cm4gW2V4cHJlc3Npb24ucmVjZWl2ZXJdXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJQcml2YXRlRmllbGRSZWFkXCIpIHJldHVybiBbZXhwcmVzc2lvbi5yZWNlaXZlcl1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVycm9yTWVzc2FnZVJlYWRcIikgcmV0dXJuIFtleHByZXNzaW9uLnJlY2VpdmVyXVxuICByZXR1cm4gW11cbn1cblxuLyoqXG4gKiBNZXJnZXMgbm9ybWFsIHBhdGhzIG9ubHkgYWZ0ZXIgcHJvdmluZyBpZGVudGljYWwgb3duZXJzaGlwIHN0YXRlcy5cbiAqIEBwYXJhbSB7TGlmZXRpbWVFeGl0W119IGZsb3dzIC0gQ2FuZGlkYXRlIHBhdGhzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEpvaW4gbG9jYXRpb24uXG4gKiBAcGFyYW0ge0xpZmV0aW1lRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHtMaWZldGltZUV4aXRbXX0gTWVyZ2VkIHBhdGhzLlxuICovXG5mdW5jdGlvbiBtZXJnZUVxdWl2YWxlbnROb3JtYWxzKGZsb3dzLCBsb2NhdGlvbiwgZmFpbCkge1xuICBjb25zdCBub3JtYWwgPSBmbG93cy5maWx0ZXIoKHtraW5kfSkgPT4ga2luZCA9PSBcIm5vcm1hbFwiKVxuICBpZiAobm9ybWFsLmxlbmd0aCA+IDEpIHtcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBub3JtYWwuc2xpY2UoMSkpIHJlcXVpcmVTYW1lU3RhdGUobm9ybWFsWzBdLnN0YXRlLCBjYW5kaWRhdGUuc3RhdGUsIGxvY2F0aW9uLCBmYWlsKVxuICB9XG4gIHJldHVybiBbLi4uZmxvd3MuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgIT0gXCJub3JtYWxcIiksIC4uLihub3JtYWwubGVuZ3RoID4gMCA/IFtub3JtYWxbMF1dIDogW10pXVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgZmluaXRlIG93bmVyc2hpcCBpbnZhcmlhbnQgYXQgYSBicmFuY2ggb3IgbG9vcCBqb2luLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBPd25lclN0YXRlPn0gbGVmdCAtIEZpcnN0IG93bmVyc2hpcCBzdGF0ZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgT3duZXJTdGF0ZT59IHJpZ2h0IC0gU2Vjb25kIG93bmVyc2hpcCBzdGF0ZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBKb2luIGxvY2F0aW9uLlxuICogQHBhcmFtIHtMaWZldGltZUZhaWx9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZVNhbWVTdGF0ZShsZWZ0LCByaWdodCwgbG9jYXRpb24sIGZhaWwpIHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KFsuLi5sZWZ0LmtleXMoKSwgLi4ucmlnaHQua2V5cygpXSlcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgY29uc3QgbGVmdFN0YXRlID0gbGVmdC5nZXQobmFtZSlcbiAgICBjb25zdCByaWdodFN0YXRlID0gcmlnaHQuZ2V0KG5hbWUpXG4gICAgaWYgKGxlZnRTdGF0ZT8ua2luZCAhPSByaWdodFN0YXRlPy5raW5kIHx8IGxlZnRTdGF0ZT8ub3JpZ2luSWQgIT0gcmlnaHRTdGF0ZT8ub3JpZ2luSWQpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9TVEFURV9NSVNNQVRDSFwiLCBgUmVzb3VyY2UgJyR7bmFtZX0nIGhhcyBkaWZmZXJlbnQgb3duZXJzaGlwIHN0YXRlIGFjcm9zcyByZWFjaGFibGUgcGF0aHMuYCwgbG9jYXRpb24pXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVqZWN0cyBldmVyeSBvd25lZCB2YWx1ZSB0aGF0IGxlYXZlcyBpdHMgaW50cm9kdWNpbmcgc2NvcGUgb3Blbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgT3duZXJTdGF0ZT59IHN0YXRlIC0gT3duZXJzaGlwIHN0YXRlLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gbmFtZXMgLSBPd25lcnMgaW50cm9kdWNlZCBpbiB0aGUgc2NvcGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhpdCBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7TGlmZXRpbWVGYWlsfSBmYWlsIC0gTG9jYXRlZCBmYWlsdXJlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGNoZWNrTGVha3Moc3RhdGUsIG5hbWVzLCBsb2NhdGlvbiwgZmFpbCkge1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBjb25zdCBvd25lciA9IHN0YXRlLmdldChuYW1lKVxuICAgIGlmIChvd25lcj8ua2luZCA9PSBcIm9wZW5cIikge1xuICAgICAgY29uc3Qgb3JpZ2luID0gb3duZXIub3JpZ2luXG4gICAgICBmYWlsKFwiTEVBS0VEX1JFU09VUkNFXCIsIGBPd25lZCByZXNvdXJjZSAnJHtuYW1lfScgcmVtYWlucyBvcGVuOyBhY3F1aXJlZCBhdCAke29yaWdpbi5maWxlbmFtZX06JHtvcmlnaW4uc3RhcnQubGluZX06JHtvcmlnaW4uc3RhcnQuY29sdW1ufS5gLCBsb2NhdGlvbilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhbiBvd25lZCBwbGFjZSBpbiB0aGUgY3VycmVudCBzY29wZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gU3RhYmxlIHBsYWNlIG5hbWUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIE93bmVyU3RhdGU+fSBzdGF0ZSAtIE93bmVyc2hpcCBzdGF0ZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBVc2UgbG9jYXRpb24uXG4gKiBAcGFyYW0ge0xpZmV0aW1lRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHtPd25lclN0YXRlfSBPd25lciBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZU93bmVyKG5hbWUsIHN0YXRlLCBsb2NhdGlvbiwgZmFpbCkge1xuICBjb25zdCBvd25lciA9IHN0YXRlLmdldChuYW1lKVxuICBpZiAoIW93bmVyKSByZXR1cm4gZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfQk9SUk9XXCIsIGBObyBvd25lZCByZXNvdXJjZSBwbGFjZSAnJHtuYW1lfScgaXMgaW4gc2NvcGUuYCwgbG9jYXRpb24pXG4gIHJldHVybiBvd25lclxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGltbWVkaWF0ZSBvd25lZCBleHByZXNzaW9uIHRvIGEgc3RhYmxlIHBsYWNlIG5hbWUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuSWRlbnRpZmllckV4cHJlc3Npb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlY2VpdmVyRXhwcmVzc2lvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUHJpdmF0ZUZpZWxkUmVhZH0gZXhwcmVzc2lvbiAtIE93bmVkIHBsYWNlLlxuICogQHJldHVybnMge3N0cmluZ30gUGxhY2UgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHBsYWNlTmFtZShleHByZXNzaW9uKSB7XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZXR1cm4gZXhwcmVzc2lvbi5uYW1lXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJSZWNlaXZlckV4cHJlc3Npb25cIikgcmV0dXJuIFwidGhpc1wiXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJQcml2YXRlRmllbGRSZWFkXCIpIHJldHVybiBgdGhpcy4ke2V4cHJlc3Npb24uZmllbGR9YFxuICByZXR1cm4gXCI8aW52YWxpZD5cIlxufVxuXG4vKipcbiAqIENyZWF0ZXMgb25lIG9wZW4gb3duZXJzaGlwIHN0YXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IG9yaWdpbklkIC0gRGV0ZXJtaW5pc3RpYyBvcmlnaW4gaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IG9yaWdpbiAtIEFjcXVpc2l0aW9uIGxvY2F0aW9uLlxuICogQHJldHVybnMge093bmVyU3RhdGV9IE9wZW4gc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIG9wZW5TdGF0ZShvcmlnaW5JZCwgb3JpZ2luKSB7XG4gIHJldHVybiB7a2luZDogXCJvcGVuXCIsIG9yaWdpbiwgb3JpZ2luSWR9XG59XG5cbi8qKlxuICogQ2xvbmVzIGFuIG93bmVyc2hpcCBzdGF0ZSBmb3IgYSBjb250cm9sLWZsb3cgZm9yay5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgT3duZXJTdGF0ZT59IHN0YXRlIC0gU3RhdGUgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgT3duZXJTdGF0ZT59IERldGFjaGVkIHN0YXRlLlxuICovXG5mdW5jdGlvbiBjbG9uZVN0YXRlKHN0YXRlKSB7XG4gIHJldHVybiBuZXcgTWFwKFsuLi5zdGF0ZV0ubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBbbmFtZSwgey4uLnZhbHVlfV0pKVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdHlwZSBjYXJyaWVzIGxpbmVhciBvd25lcnNoaXAuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHR5cGUgLSBTZW1hbnRpYyB0eXBlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHR5cGUgaXMgb3duZWQuXG4gKi9cbmZ1bmN0aW9uIGlzT3duZWQodHlwZSkge1xuICByZXR1cm4gdHlwZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIiB8fCB0eXBlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIlxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBtb2R1bGUgY29udGFpbnMgYW55IG93bmVkIHNlbWFudGljIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGxpZmV0aW1lIGFuYWx5c2lzIGlzIHJlcXVpcmVkLlxuICovXG5mdW5jdGlvbiBtb2R1bGVDb250YWluc093bmVkVHlwZShtb2R1bGUpIHtcbiAgY29uc3QgcGVuZGluZyA9IFsvKiogQHR5cGUge3Vua25vd259ICovIChtb2R1bGUpXVxuICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG5cbiAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHZhbHVlID0gcGVuZGluZy5wb3AoKVxuXG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyh2YWx1ZSkpIGNvbnRpbnVlXG4gICAgc2Vlbi5hZGQodmFsdWUpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAoUmVmbGVjdC5nZXQodmFsdWUsIFwia2luZFwiKSA9PSBcIk93bmVkUmVzb3VyY2VUeXBlXCIgfHxcbiAgICAgIFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikpIHJldHVybiB0cnVlXG4gICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICBpZiAoW1wibG9jYXRpb25cIiwgXCJwcm92ZW5hbmNlXCIsIFwic291cmNlUHJvdmVuYW5jZVwiXS5pbmNsdWRlcyhrZXkpKSBjb250aW51ZVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGQpKSBwZW5kaW5nLnB1c2goLi4uY2hpbGQpXG4gICAgICBlbHNlIGlmIChjaGlsZCAmJiB0eXBlb2YgY2hpbGQgPT0gXCJvYmplY3RcIikgcGVuZGluZy5wdXNoKGNoaWxkKVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cbiJdfQ==
551
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZXRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvbGlmZXRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLHFIQUFxSDtBQUNySCwrVkFBK1Y7QUFDL1YsNkxBQTZMO0FBRTdMOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUk7SUFDbEUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTTtJQUV4SCxLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7UUFDL0MsWUFBWSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDN0csS0FBSyxNQUFNLE1BQU0sSUFBSSxXQUFXLENBQUMsT0FBTztZQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUN6RixXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFDN0csQ0FBQztJQUNELEtBQUssTUFBTSxXQUFXLElBQUksTUFBTSxDQUFDLFNBQVM7UUFBRSxZQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMs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QUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKiogQHR5cGVkZWYgeyhjb2RlOiBzdHJpbmcsIGRldGFpbDogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbikgPT4gbmV2ZXJ9IExpZmV0aW1lRmFpbCAqL1xuLyoqIEB0eXBlZGVmIHt7a2luZDogXCJvcGVuXCIsIG9yaWdpbklkOiBzdHJpbmcsIG9yaWdpbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gfCB7a2luZDogXCJtb3ZlZFwiLCBvcmlnaW5JZDogc3RyaW5nLCBvcmlnaW46IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIGRlc3RpbmF0aW9uOiBzdHJpbmd9IHwge2tpbmQ6IFwidGVybWluYWxcIiwgb3JpZ2luSWQ6IHN0cmluZywgb3JpZ2luOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uLCBjbG9zZVNpdGVJZDogc3RyaW5nIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn19IE93bmVyU3RhdGUgKi9cbi8qKiBAdHlwZWRlZiB7e2tpbmQ6IFwibm9ybWFsXCIgfCBcInJldHVyblwiIHwgXCJyYWlzZVwiIHwgXCJicmVha1wiIHwgXCJjb250aW51ZVwiLCBzdGF0ZTogTWFwPHN0cmluZywgT3duZXJTdGF0ZT4sIGxvY2F0aW9uPzogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgZXJyb3JJZD86IHN0cmluZ319IExpZmV0aW1lRXhpdCAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIHBhdGgtc2Vuc2l0aXZlIHN0cnVjdHVyZWQgbGlmZXRpbWUgdmFsaWRhdGlvbiBmb3IgVGFzayAwMzQgb3duZWQgdmFsdWVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBGdWxseSB0eXBlLXJlc29sdmVkIG1vZHVsZS5cbiAqIEBwYXJhbSB7e2Z1bmN0aW9uczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LCBtZXRob2RzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBlcnJvckVmZmVjdHMgLSBDb21wbGV0ZSBlc2NhcGluZyBlcnJvciBzZXRzIHBlciBmdW5jdGlvbiBhbmQgbWV0aG9kLlxuICogQHBhcmFtIHtMaWZldGltZUZhaWx9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmVzb3VyY2VMaWZldGltZXMobW9kdWxlLCBlcnJvckVmZmVjdHMsIGZhaWwpIHtcbiAgaWYgKCEobW9kdWxlLmNhcGFiaWxpdGllcyA/PyBbXSkuc29tZSgoe3Jlc291cmNlc30pID0+IHJlc291cmNlcy5sZW5ndGggPiAwKSAmJiAhbW9kdWxlQ29udGFpbnNPd25lZFR5cGUobW9kdWxlKSkgcmV0dXJuXG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuY2xhc3NlcyA/PyBbXSkge1xuICAgIGFuYWx5emVPd25lcihkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLCBkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5ib2R5LCBmYWlsLCB1bmRlZmluZWQsIGVycm9yRWZmZWN0cylcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzKSBhbmFseXplT3duZXIobWV0aG9kLnBhcmFtZXRlcnMsIG1ldGhvZC5ib2R5LCBmYWlsLFxuICAgICAgZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiID8gZGVjbGFyYXRpb24ub3duZXJzaGlwLmZpZWxkSWQgOiB1bmRlZmluZWQsIGVycm9yRWZmZWN0cylcbiAgfVxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5mdW5jdGlvbnMpIGFuYWx5emVPd25lcihkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLCBkZWNsYXJhdGlvbi5ib2R5LCBmYWlsLCB1bmRlZmluZWQsIGVycm9yRWZmZWN0cylcbiAgYW5hbHl6ZU93bmVyKFtdLCBtb2R1bGUuZW50cnlQb2ludC5ib2R5LCBmYWlsLCB1bmRlZmluZWQsIGVycm9yRWZmZWN0cylcbn1cblxuLyoqXG4gKiBBbmFseXplcyBvbmUgZnVuY3Rpb24sIGNvbnN0cnVjdG9yLCBtZXRob2QsIG9yIGVudHJ5LXBvaW50IG93bmVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlBhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gT3duZWQgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CbG9ja30gYm9keSAtIFN0cnVjdHVyZWQgYm9keS5cbiAqIEBwYXJhbSB7TGlmZXRpbWVGYWlsfSBmYWlsIC0gTG9jYXRlZCBmYWlsdXJlLlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGJvcnJvd2VkRmllbGRJZCAtIE93bmVkIHJlY2VpdmVyIGZpZWxkLCB3aGVuIHByZXNlbnQuXG4gKiBAcGFyYW0ge3tmdW5jdGlvbnM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiwgbWV0aG9kczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gZXJyb3JFZmZlY3RzIC0gQ29tcGxldGUgZXNjYXBpbmcgZXJyb3Igc2V0cyBwZXIgZnVuY3Rpb24gYW5kIG1ldGhvZC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhbmFseXplT3duZXIocGFyYW1ldGVycywgYm9keSwgZmFpbCwgYm9ycm93ZWRGaWVsZElkLCBlcnJvckVmZmVjdHMpIHtcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBPd25lclN0YXRlPn0gKi9cbiAgY29uc3QgaW5pdGlhbCA9IG5ldyBNYXAoKVxuICBjb25zdCBvYmxpZ2F0aW9ucyA9IG5ldyBTZXQocGFyYW1ldGVycy5maWx0ZXIoKHt0eXBlfSkgPT4gaXNPd25lZCh0eXBlKSkubWFwKCh7bmFtZX0pID0+IG5hbWUpKVxuXG4gIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIHBhcmFtZXRlcnMpIHtcbiAgICBpZiAoaXNPd25lZChwYXJhbWV0ZXIudHlwZSkpIGluaXRpYWwuc2V0KHBhcmFtZXRlci5uYW1lLCBvcGVuU3RhdGUoYHBhcmFtZXRlcjoke3BhcmFtZXRlci5uYW1lfWAsIHBhcmFtZXRlci5sb2NhdGlvbikpXG4gIH1cbiAgaWYgKGJvcnJvd2VkRmllbGRJZCkgaW5pdGlhbC5zZXQoYHRoaXMuJHtib3Jyb3dlZEZpZWxkSWR9YCwgb3BlblN0YXRlKGByZWNlaXZlcjoke2JvcnJvd2VkRmllbGRJZH1gLCBib2R5LmxvY2F0aW9uKSlcbiAgY29uc3QgZXhpdHMgPSBhbmFseXplQmxvY2soYm9keSwgW3traW5kOiBcIm5vcm1hbFwiLCBzdGF0ZTogaW5pdGlhbH1dLCBmYWlsLCBlcnJvckVmZmVjdHMpXG5cbiAgZm9yIChjb25zdCBleGl0IG9mIGV4aXRzKSBjaGVja0xlYWtzKGV4aXQuc3RhdGUsIG9ibGlnYXRpb25zLCBleGl0LmxvY2F0aW9uID8/IGJvZHkubG9jYXRpb24sIGZhaWwpXG59XG5cbi8qKlxuICogRXZhbHVhdGVzIG9uZSBsZXhpY2FsIGJsb2NrIHdoaWxlIHJldGFpbmluZyBldmVyeSBhYnJ1cHQgZXhpdCBzZXBhcmF0ZWx5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFN0cnVjdHVyZWQgYmxvY2suXG4gKiBAcGFyYW0ge0xpZmV0aW1lRXhpdFtdfSBpbmNvbWluZyAtIEluY29taW5nIGNvbnRyb2wtZmxvdyBzdGF0ZXMuXG4gKiBAcGFyYW0ge0xpZmV0aW1lRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEBwYXJhbSB7e2Z1bmN0aW9uczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LCBtZXRob2RzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBlcnJvckVmZmVjdHMgLSBDb21wbGV0ZSBlc2NhcGluZyBlcnJvciBzZXRzIHBlciBmdW5jdGlvbiBhbmQgbWV0aG9kLlxuICogQHJldHVybnMge0xpZmV0aW1lRXhpdFtdfSBSZWFjaGFibGUgZXhpdHMuXG4gKi9cbmZ1bmN0aW9uIGFuYWx5emVCbG9jayhibG9jaywgaW5jb21pbmcsIGZhaWwsIGVycm9yRWZmZWN0cykge1xuICBsZXQgYWN0aXZlID0gaW5jb21pbmcuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgPT0gXCJub3JtYWxcIilcbiAgY29uc3QgZGVwYXJ0ZWQgPSBpbmNvbWluZy5maWx0ZXIoKHtraW5kfSkgPT4ga2luZCAhPSBcIm5vcm1hbFwiKVxuICAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICBjb25zdCBsb2NhbHMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBibG9jay5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKGFjdGl2ZS5sZW5ndGggPT0gMCkgYnJlYWtcbiAgICBjb25zdCBuZXh0ID0gW11cblxuICAgIGZvciAoY29uc3QgZmxvdyBvZiBhY3RpdmUpIG5leHQucHVzaCguLi5hbmFseXplU3RhdGVtZW50KHN0YXRlbWVudCwgZmxvdy5zdGF0ZSwgZmFpbCwgbG9jYWxzLCBlcnJvckVmZmVjdHMpKVxuICAgIGRlcGFydGVkLnB1c2goLi4ubmV4dC5maWx0ZXIoKHtraW5kfSkgPT4ga2luZCAhPSBcIm5vcm1hbFwiKSlcbiAgICBhY3RpdmUgPSBtZXJnZUVxdWl2YWxlbnROb3JtYWxzKG5leHQuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgPT0gXCJub3JtYWxcIiksIHN0YXRlbWVudC5sb2NhdGlvbiwgZmFpbClcbiAgfVxuICBjb25zdCBleGl0cyA9IFsuLi5kZXBhcnRlZCwgLi4uYWN0aXZlLm1hcCgoZmxvdykgPT4gKHsuLi5mbG93LCBsb2NhdGlvbjogZmxvdy5sb2NhdGlvbiA/PyBibG9jay5sb2NhdGlvbn0pKV1cblxuICBmb3IgKGNvbnN0IGV4aXQgb2YgZXhpdHMpIHtcbiAgICBjaGVja0xlYWtzKGV4aXQuc3RhdGUsIGxvY2FscywgZXhpdC5sb2NhdGlvbiA/PyBibG9jay5sb2NhdGlvbiwgZmFpbClcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbG9jYWxzKSBleGl0LnN0YXRlLmRlbGV0ZShuYW1lKVxuICB9XG4gIHJldHVybiBleGl0c1xufVxuXG4vKipcbiAqIEV2YWx1YXRlcyBvbmUgc3RhdGVtZW50IGZyb20gb25lIG5vcm1hbCBzdGF0ZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IHN0YXRlbWVudCAtIFN0YXRlbWVudC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgT3duZXJTdGF0ZT59IHN0YXRlIC0gSW5jb21pbmcgb3duZXJzaGlwIHN0YXRlLlxuICogQHBhcmFtIHtMaWZldGltZUZhaWx9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBsb2NhbHMgLSBMb2NhbHMgaW50cm9kdWNlZCBpbiB0aGUgY3VycmVudCBibG9jay5cbiAqIEBwYXJhbSB7e2Z1bmN0aW9uczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LCBtZXRob2RzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBlcnJvckVmZmVjdHMgLSBDb21wbGV0ZSBlc2NhcGluZyBlcnJvciBzZXRzIHBlciBmdW5jdGlvbiBhbmQgbWV0aG9kLlxuICogQHJldHVybnMge0xpZmV0aW1lRXhpdFtdfSBSZWFjaGFibGUgZXhpdHMuXG4gKi9cbmZ1bmN0aW9uIGFuYWx5emVTdGF0ZW1lbnQoc3RhdGVtZW50LCBzdGF0ZSwgZmFpbCwgbG9jYWxzLCBlcnJvckVmZmVjdHMpIHtcbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSB7XG4gICAgY29uc3QgZmxvd3MgPSBldmFsdWF0ZUV4cHJlc3Npb24oc3RhdGVtZW50LmluaXRpYWxpemVyLCBjbG9uZVN0YXRlKHN0YXRlKSwgZmFpbCwgZXJyb3JFZmZlY3RzKVxuXG4gICAgaWYgKGlzT3duZWQoc3RhdGVtZW50LnR5cGUpKSB7XG4gICAgICBsb2NhbHMuYWRkKHN0YXRlbWVudC5uYW1lKVxuICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgIGlmIChmbG93LmtpbmQgIT0gXCJub3JtYWxcIikgY29udGludWVcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gc3RhdGVtZW50LmluaXRpYWxpemVyLmtpbmQgPT0gXCJPd25lZE1vdmVFeHByZXNzaW9uXCJcbiAgICAgICAgICA/IGZsb3cuc3RhdGUuZ2V0KHN0YXRlbWVudC5pbml0aWFsaXplci5leHByZXNzaW9uLm5hbWUpPy5vcmlnaW4gPz8gc3RhdGVtZW50LmluaXRpYWxpemVyLmxvY2F0aW9uXG4gICAgICAgICAgOiBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIubG9jYXRpb25cbiAgICAgICAgZmxvdy5zdGF0ZS5zZXQoc3RhdGVtZW50Lm5hbWUsIG9wZW5TdGF0ZShgbG9jYWw6JHtzdGF0ZW1lbnQubmFtZX1gLCBvcmlnaW4pKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmxvd3MubWFwKChmbG93KSA9PiAoey4uLmZsb3csIGxvY2F0aW9uOiBzdGF0ZW1lbnQubG9jYXRpb259KSlcbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB7XG4gICAgcmV0dXJuIGV2YWx1YXRlRXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgY2xvbmVTdGF0ZShzdGF0ZSksIGZhaWwsIGVycm9yRWZmZWN0cylcbiAgICAgIC5tYXAoKGZsb3cpID0+ICh7Li4uZmxvdywgbG9jYXRpb246IHN0YXRlbWVudC5sb2NhdGlvbn0pKVxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCIpIHtcbiAgICByZXR1cm4gZXZhbHVhdGVFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uLCBjbG9uZVN0YXRlKHN0YXRlKSwgZmFpbCwgZXJyb3JFZmZlY3RzKVxuICAgICAgLm1hcCgoZmxvdykgPT4gKHsuLi5mbG93LCBsb2NhdGlvbjogc3RhdGVtZW50LmxvY2F0aW9ufSkpXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIpIHtcbiAgICBjb25zdCBmbG93cyA9IHN0YXRlbWVudC5leHByZXNzaW9uID8gZXZhbHVhdGVFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uLCBjbG9uZVN0YXRlKHN0YXRlKSwgZmFpbCwgZXJyb3JFZmZlY3RzKSA6XG4gICAgICAvKiogQHR5cGUge0xpZmV0aW1lRXhpdFtdfSAqLyAoW3traW5kOiBcIm5vcm1hbFwiLCBzdGF0ZTogY2xvbmVTdGF0ZShzdGF0ZSl9XSlcbiAgICByZXR1cm4gZmxvd3MubWFwKChmbG93KSA9PiBmbG93LmtpbmQgPT0gXCJub3JtYWxcIlxuICAgICAgPyB7a2luZDogXCJyZXR1cm5cIiwgbG9jYXRpb246IHN0YXRlbWVudC5sb2NhdGlvbiwgc3RhdGU6IGZsb3cuc3RhdGV9XG4gICAgICA6IHsuLi5mbG93LCBsb2NhdGlvbjogc3RhdGVtZW50LmxvY2F0aW9ufSlcbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSYWlzZVN0YXRlbWVudFwiKSB7XG4gICAgY29uc3QgZmxvd3MgPSBldmFsdWF0ZUV4cHJlc3Npb24oc3RhdGVtZW50LmVycm9yLm1lc3NhZ2UsIGNsb25lU3RhdGUoc3RhdGUpLCBmYWlsLCBlcnJvckVmZmVjdHMpXG4gICAgcmV0dXJuIGZsb3dzLm1hcCgoZmxvdykgPT4gZmxvdy5raW5kID09IFwibm9ybWFsXCJcbiAgICAgID8ge2Vycm9ySWQ6IHN0YXRlbWVudC5lcnJvci5lcnJvci5kZWNsYXJhdGlvbklkLCBraW5kOiBcInJhaXNlXCIsIGxvY2F0aW9uOiBzdGF0ZW1lbnQubG9jYXRpb24sIHN0YXRlOiBmbG93LnN0YXRlfVxuICAgICAgOiB7Li4uZmxvdywgbG9jYXRpb246IHN0YXRlbWVudC5sb2NhdGlvbn0pXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0aHJvd1N0YXRlbWVudFwiKSB7XG4gICAgLy8gQSByZXRocm93IHJlLXJhaXNlcyB0aGUgY2F1Z2h0IGJpbmRpbmcncyBleGFjdCBub21pbmFsIHR5cGUsIHNvIGFuIGVuY2xvc2luZyBoYW5kbGVyIG11c3Qgc2VlIGl0LlxuICAgIHJldHVybiBbe2Vycm9ySWQ6IHN0YXRlbWVudC5iaW5kaW5nTm9kZT8udHlwZT8uZGVjbGFyYXRpb25JZCwga2luZDogXCJyYWlzZVwiLCBsb2NhdGlvbjogc3RhdGVtZW50LmxvY2F0aW9uLCBzdGF0ZTogY2xvbmVTdGF0ZShzdGF0ZSl9XVxuICB9XG4gIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gZXZhbHVhdGVFeHByZXNzaW9uKHN0YXRlbWVudC5jb25kaXRpb24sIGNsb25lU3RhdGUoc3RhdGUpLCBmYWlsLCBlcnJvckVmZmVjdHMpXG4gICAgLyoqIEB0eXBlIHtMaWZldGltZUV4aXRbXX0gKi9cbiAgICBjb25zdCByZXN1bHQgPSBjb25kaXRpb25zLmZpbHRlcigoe2tpbmR9KSA9PiBraW5kICE9IFwibm9ybWFsXCIpXG5cbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zLmZpbHRlcigoe2tpbmR9KSA9PiBraW5kID09IFwibm9ybWFsXCIpKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5hbmFseXplQmxvY2soc3RhdGVtZW50LmNvbnNlcXVlbnQsIFt7a2luZDogXCJub3JtYWxcIiwgc3RhdGU6IGNsb25lU3RhdGUoY29uZGl0aW9uLnN0YXRlKX1dLCBmYWlsLFxuICAgICAgICBlcnJvckVmZmVjdHMpKVxuICAgICAgY29uc3QgYWx0ZXJuYXRlID0gc3RhdGVtZW50LmFsdGVybmF0ZVxuICAgICAgICA/IGFuYWx5emVCbG9jayhzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBbe2tpbmQ6IFwibm9ybWFsXCIsIHN0YXRlOiBjbG9uZVN0YXRlKGNvbmRpdGlvbi5zdGF0ZSl9XSwgZmFpbCwgZXJyb3JFZmZlY3RzKVxuICAgICAgICA6IC8qKiBAdHlwZSB7TGlmZXRpbWVFeGl0W119ICovIChbe2tpbmQ6IFwibm9ybWFsXCIsIGxvY2F0aW9uOiBzdGF0ZW1lbnQubG9jYXRpb24sIHN0YXRlOiBjbG9uZVN0YXRlKGNvbmRpdGlvbi5zdGF0ZSl9XSlcblxuICAgICAgcmVzdWx0LnB1c2goLi4uYWx0ZXJuYXRlKVxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VFcXVpdmFsZW50Tm9ybWFscyhyZXN1bHQsIHN0YXRlbWVudC5sb2NhdGlvbiwgZmFpbClcbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgIGNvbnN0IGJvZHlFeGl0cyA9IGFuYWx5emVCbG9jayhzdGF0ZW1lbnQuYm9keSwgW3traW5kOiBcIm5vcm1hbFwiLCBzdGF0ZTogY2xvbmVTdGF0ZShzdGF0ZSl9XSwgZmFpbCwgZXJyb3JFZmZlY3RzKVxuICAgIC8qKiBAdHlwZSB7TGlmZXRpbWVFeGl0W119ICovXG4gICAgbGV0IHJlc3VsdCA9IGJvZHlFeGl0c1xuXG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHN0YXRlbWVudC5oYW5kbGVycyA/PyBbXSkge1xuICAgICAgY29uc3QgY2F1Z2h0SWQgPSBoYW5kbGVyLmNhdGNoVHlwZT8uZGVjbGFyYXRpb25JZFxuICAgICAgY29uc3QgY2F1Z2h0ID0gcmVzdWx0LmZpbHRlcigoZmxvdykgPT4gZmxvdy5raW5kID09IFwicmFpc2VcIiAmJiBmbG93LmVycm9ySWQgPT0gY2F1Z2h0SWQpXG5cbiAgICAgIGlmIChjYXVnaHQubGVuZ3RoID09IDApIGNvbnRpbnVlXG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChmbG93KSA9PiBmbG93LmtpbmQgIT0gXCJyYWlzZVwiIHx8IGZsb3cuZXJyb3JJZCAhPSBjYXVnaHRJZClcbiAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBjYXVnaHQpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goLi4uYW5hbHl6ZUJsb2NrKGhhbmRsZXIuY2F0Y2hCb2R5LCBbe2tpbmQ6IFwibm9ybWFsXCIsIHN0YXRlOiBjbG9uZVN0YXRlKGZsb3cuc3RhdGUpfV0sIGZhaWwsIGVycm9yRWZmZWN0cykpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQuZmluYWxseUJvZHkpIHtcbiAgICAgIC8qKiBAdHlwZSB7TGlmZXRpbWVFeGl0W119ICovXG4gICAgICBjb25zdCBhZnRlckZpbmFsbHkgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGZsb3cgb2YgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IGZpbmFsbHlFeGl0cyA9IGFuYWx5emVCbG9jayhzdGF0ZW1lbnQuZmluYWxseUJvZHksIFt7a2luZDogXCJub3JtYWxcIiwgc3RhdGU6IGNsb25lU3RhdGUoZmxvdy5zdGF0ZSl9XSwgZmFpbCwgZXJyb3JFZmZlY3RzKVxuXG4gICAgICAgIGZvciAoY29uc3QgZmluYWxseUV4aXQgb2YgZmluYWxseUV4aXRzKSB7XG4gICAgICAgICAgYWZ0ZXJGaW5hbGx5LnB1c2goZmluYWxseUV4aXQua2luZCA9PSBcIm5vcm1hbFwiXG4gICAgICAgICAgICA/IHsuLi5mbG93LCBsb2NhdGlvbjogc3RhdGVtZW50LmxvY2F0aW9ufVxuICAgICAgICAgICAgOiB7Li4uZmluYWxseUV4aXQsIGxvY2F0aW9uOiBzdGF0ZW1lbnQubG9jYXRpb259KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBhZnRlckZpbmFsbHlcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlRXF1aXZhbGVudE5vcm1hbHMocmVzdWx0LCBzdGF0ZW1lbnQubG9jYXRpb24sIGZhaWwpXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiV2hpbGVTdGF0ZW1lbnRcIikge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBldmFsdWF0ZUV4cHJlc3Npb24oc3RhdGVtZW50LmNvbmRpdGlvbiwgY2xvbmVTdGF0ZShzdGF0ZSksIGZhaWwsIGVycm9yRWZmZWN0cylcbiAgICAvKiogQHR5cGUge0xpZmV0aW1lRXhpdFtdfSAqL1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmRpdGlvbnMuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgIT0gXCJub3JtYWxcIilcblxuICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgPT0gXCJub3JtYWxcIikpIHtcbiAgICAgIGNvbnN0IGJvZHlFeGl0cyA9IGFuYWx5emVCbG9jayhzdGF0ZW1lbnQuYm9keSwgW3traW5kOiBcIm5vcm1hbFwiLCBzdGF0ZTogY2xvbmVTdGF0ZShjb25kaXRpb24uc3RhdGUpfV0sIGZhaWwsXG4gICAgICAgIGVycm9yRWZmZWN0cylcbiAgICAgIGZvciAoY29uc3QgZXhpdCBvZiBib2R5RXhpdHMpIHtcbiAgICAgICAgaWYgKGV4aXQua2luZCA9PSBcIm5vcm1hbFwiIHx8IGV4aXQua2luZCA9PSBcImNvbnRpbnVlXCIpIHJlcXVpcmVTYW1lU3RhdGUoY29uZGl0aW9uLnN0YXRlLCBleGl0LnN0YXRlLCBzdGF0ZW1lbnQubG9jYXRpb24sIGZhaWwpXG4gICAgICAgIGVsc2UgaWYgKGV4aXQua2luZCA9PSBcImJyZWFrXCIpIHtcbiAgICAgICAgICByZXF1aXJlU2FtZVN0YXRlKGNvbmRpdGlvbi5zdGF0ZSwgZXhpdC5zdGF0ZSwgc3RhdGVtZW50LmxvY2F0aW9uLCBmYWlsKVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHtraW5kOiBcIm5vcm1hbFwiLCBsb2NhdGlvbjogc3RhdGVtZW50LmxvY2F0aW9uLCBzdGF0ZTogZXhpdC5zdGF0ZX0pXG4gICAgICAgIH0gZWxzZSByZXN1bHQucHVzaChleGl0KVxuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goe2tpbmQ6IFwibm9ybWFsXCIsIGxvY2F0aW9uOiBzdGF0ZW1lbnQubG9jYXRpb24sIHN0YXRlOiBjb25kaXRpb24uc3RhdGV9KVxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VFcXVpdmFsZW50Tm9ybWFscyhyZXN1bHQsIHN0YXRlbWVudC5sb2NhdGlvbiwgZmFpbClcbiAgfVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoTWFwU3RhdGVtZW50XCIpIHtcbiAgICBjb25zdCBvcGVyYW5kID0gc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIgPyBzdGF0ZW1lbnQubGlzdCA6IHN0YXRlbWVudC5tYXBcbiAgICBjb25zdCBvcGVyYW5kcyA9IGV2YWx1YXRlRXhwcmVzc2lvbihvcGVyYW5kLCBjbG9uZVN0YXRlKHN0YXRlKSwgZmFpbCwgZXJyb3JFZmZlY3RzKVxuICAgIC8qKiBAdHlwZSB7TGlmZXRpbWVFeGl0W119ICovXG4gICAgY29uc3QgcmVzdWx0ID0gb3BlcmFuZHMuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgIT0gXCJub3JtYWxcIilcblxuICAgIGZvciAoY29uc3QgZXZhbHVhdGVkIG9mIG9wZXJhbmRzLmZpbHRlcigoe2tpbmR9KSA9PiBraW5kID09IFwibm9ybWFsXCIpKSB7XG4gICAgICBjb25zdCBib2R5RXhpdHMgPSBhbmFseXplQmxvY2soc3RhdGVtZW50LmJvZHksIFt7a2luZDogXCJub3JtYWxcIiwgc3RhdGU6IGNsb25lU3RhdGUoZXZhbHVhdGVkLnN0YXRlKX1dLCBmYWlsLFxuICAgICAgICBlcnJvckVmZmVjdHMpXG4gICAgICBmb3IgKGNvbnN0IGV4aXQgb2YgYm9keUV4aXRzKSB7XG4gICAgICAgIGlmIChleGl0LmtpbmQgPT0gXCJub3JtYWxcIiB8fCBleGl0LmtpbmQgPT0gXCJjb250aW51ZVwiKSByZXF1aXJlU2FtZVN0YXRlKGV2YWx1YXRlZC5zdGF0ZSwgZXhpdC5zdGF0ZSwgc3RhdGVtZW50LmxvY2F0aW9uLCBmYWlsKVxuICAgICAgICBlbHNlIGlmIChleGl0LmtpbmQgPT0gXCJicmVha1wiKSB7XG4gICAgICAgICAgcmVxdWlyZVNhbWVTdGF0ZShldmFsdWF0ZWQuc3RhdGUsIGV4aXQuc3RhdGUsIHN0YXRlbWVudC5sb2NhdGlvbiwgZmFpbClcbiAgICAgICAgICByZXN1bHQucHVzaCh7a2luZDogXCJub3JtYWxcIiwgbG9jYXRpb246IHN0YXRlbWVudC5sb2NhdGlvbiwgc3RhdGU6IGV4aXQuc3RhdGV9KVxuICAgICAgICB9IGVsc2UgcmVzdWx0LnB1c2goZXhpdClcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHtraW5kOiBcIm5vcm1hbFwiLCBsb2NhdGlvbjogc3RhdGVtZW50LmxvY2F0aW9uLCBzdGF0ZTogZXZhbHVhdGVkLnN0YXRlfSlcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlRXF1aXZhbGVudE5vcm1hbHMocmVzdWx0LCBzdGF0ZW1lbnQubG9jYXRpb24sIGZhaWwpXG4gIH1cbiAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQnJlYWtTdGF0ZW1lbnRcIikgcmV0dXJuIFt7a2luZDogXCJicmVha1wiLCBsb2NhdGlvbjogc3RhdGVtZW50LmxvY2F0aW9uLCBzdGF0ZTogY2xvbmVTdGF0ZShzdGF0ZSl9XVxuICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJDb250aW51ZVN0YXRlbWVudFwiKSByZXR1cm4gW3traW5kOiBcImNvbnRpbnVlXCIsIGxvY2F0aW9uOiBzdGF0ZW1lbnQubG9jYXRpb24sIHN0YXRlOiBjbG9uZVN0YXRlKHN0YXRlKX1dXG5cbiAgcmV0dXJuIFtdXG59XG5cbi8qKlxuICogRXZhbHVhdGVzIG9uZSBleHByZXNzaW9uIHdpdGggZmFpbHVyZSBzdGF0ZXMgYXQgZXhhY3QgZXZhbHVhdGlvbiBib3VuZGFyaWVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBFeHByZXNzaW9uLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBPd25lclN0YXRlPn0gc3RhdGUgLSBJbmNvbWluZyBvd25lcnNoaXAgc3RhdGUuXG4gKiBAcGFyYW0ge0xpZmV0aW1lRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEBwYXJhbSB7e2Z1bmN0aW9uczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LCBtZXRob2RzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBlcnJvckVmZmVjdHMgLSBDb21wbGV0ZSBlc2NhcGluZyBlcnJvciBzZXRzIHBlciBmdW5jdGlvbiBhbmQgbWV0aG9kLlxuICogQHJldHVybnMge0xpZmV0aW1lRXhpdFtdfSBSZWFjaGFibGUgZXhpdHMuXG4gKi9cbmZ1bmN0aW9uIGV2YWx1YXRlRXhwcmVzc2lvbihleHByZXNzaW9uLCBzdGF0ZSwgZmFpbCwgZXJyb3JFZmZlY3RzKSB7XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPd25lZE1vdmVFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBvd25lciA9IHJlcXVpcmVPd25lcihleHByZXNzaW9uLmV4cHJlc3Npb24ubmFtZSwgc3RhdGUsIGV4cHJlc3Npb24ubG9jYXRpb24sIGZhaWwpXG5cbiAgICBpZiAob3duZXIua2luZCA9PSBcIm1vdmVkXCIpIGZhaWwoXCJVU0VfQUZURVJfTU9WRVwiLCBgUmVzb3VyY2UgJyR7ZXhwcmVzc2lvbi5leHByZXNzaW9uLm5hbWV9JyB3YXMgYWxyZWFkeSBtb3ZlZC5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIGlmIChvd25lci5raW5kID09IFwidGVybWluYWxcIikgZmFpbChcIlVTRV9BRlRFUl9DTE9TRVwiLCBgUmVzb3VyY2UgJyR7ZXhwcmVzc2lvbi5leHByZXNzaW9uLm5hbWV9JyBpcyB0ZXJtaW5hbCBhZnRlciBjbG9zZS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIHN0YXRlLnNldChleHByZXNzaW9uLmV4cHJlc3Npb24ubmFtZSwgey4uLm93bmVyLCBkZXN0aW5hdGlvbjogXCJ0cmFuc2ZlclwiLCBraW5kOiBcIm1vdmVkXCJ9KVxuICAgIHJldHVybiBbe2tpbmQ6IFwibm9ybWFsXCIsIHN0YXRlfV1cbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBuYW1lID0gcGxhY2VOYW1lKGV4cHJlc3Npb24uZXhwcmVzc2lvbilcbiAgICBjb25zdCBvd25lciA9IHJlcXVpcmVPd25lcihuYW1lLCBzdGF0ZSwgZXhwcmVzc2lvbi5sb2NhdGlvbiwgZmFpbClcblxuICAgIGlmIChvd25lci5raW5kID09IFwibW92ZWRcIikgZmFpbChcIlVTRV9BRlRFUl9NT1ZFXCIsIGBSZXNvdXJjZSAnJHtuYW1lfScgd2FzIG1vdmVkIGJlZm9yZSB0aGlzIGJvcnJvdy5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIHJldHVybiBbe2tpbmQ6IFwibm9ybWFsXCIsIHN0YXRlfV1cbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIikgcmV0dXJuIGV2YWx1YXRlRWZmZWN0Q2FsbChleHByZXNzaW9uLCBzdGF0ZSwgZmFpbCwgZXJyb3JFZmZlY3RzKVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIiB8fCBleHByZXNzaW9uLmtpbmQgPT0gXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiIHx8IGV4cHJlc3Npb24ua2luZCA9PSBcIlJlZmVyZW5jZUNvbnN0cnVjdGlvblwiKSB7XG4gICAgcmV0dXJuIGV2YWx1YXRlT3JkaW5hcnlDYWxsKGV4cHJlc3Npb24sIHN0YXRlLCBmYWlsLCBlcnJvckVmZmVjdHMpXG4gIH1cblxuICAvKiogQHR5cGUge0xpZmV0aW1lRXhpdFtdfSAqL1xuICBsZXQgZmxvd3MgPSBbe2tpbmQ6IFwibm9ybWFsXCIsIHN0YXRlfV1cbiAgZm9yIChjb25zdCBjaGlsZCBvZiBleHByZXNzaW9uQ2hpbGRyZW4oZXhwcmVzc2lvbikpIGZsb3dzID0gZXZhbHVhdGVGb3JGbG93cyhjaGlsZCwgZmxvd3MsIGZhaWwsIGVycm9yRWZmZWN0cylcbiAgcmV0dXJuIGZsb3dzXG59XG5cbi8qKlxuICogQXBwbGllcyBvbmUgY2FwYWJpbGl0eSBvcGVyYXRpb24ncyBkZWNsYXJlZCBvd25lcnNoaXAgYW5kIGZhaWx1cmUgZmxvdy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FZmZlY3RDYWxsRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEVmZmVjdCBjYWxsLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBPd25lclN0YXRlPn0gc3RhdGUgLSBJbmNvbWluZyBvd25lcnNoaXAgc3RhdGUuXG4gKiBAcGFyYW0ge0xpZmV0aW1lRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEBwYXJhbSB7e2Z1bmN0aW9uczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LCBtZXRob2RzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBlcnJvckVmZmVjdHMgLSBDb21wbGV0ZSBlc2NhcGluZyBlcnJvciBzZXRzIHBlciBmdW5jdGlvbiBhbmQgbWV0aG9kLlxuICogQHJldHVybnMge0xpZmV0aW1lRXhpdFtdfSBSZWFjaGFibGUgZXhpdHMuXG4gKi9cbmZ1bmN0aW9uIGV2YWx1YXRlRWZmZWN0Q2FsbChleHByZXNzaW9uLCBzdGF0ZSwgZmFpbCwgZXJyb3JFZmZlY3RzKSB7XG4gIC8qKiBAdHlwZSB7TGlmZXRpbWVFeGl0W119ICovXG4gIGxldCBmbG93cyA9IFt7a2luZDogXCJub3JtYWxcIiwgc3RhdGV9XVxuXG4gIGZvciAoY29uc3QgYXJndW1lbnQgb2YgZXhwcmVzc2lvbi5hcmd1bWVudHMpIGZsb3dzID0gZXZhbHVhdGVGb3JGbG93cyhhcmd1bWVudCwgZmxvd3MsIGZhaWwsIGVycm9yRWZmZWN0cylcbiAgY29uc3QgcmVzdWx0ID0gZmxvd3MuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgIT0gXCJub3JtYWxcIilcbiAgY29uc3QgcmVzb3VyY2VGbG93ID0gZXhwcmVzc2lvbi5yZXNvbHV0aW9uLnJlc291cmNlRmxvd1xuXG4gIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cy5maWx0ZXIoKHtraW5kfSkgPT4ga2luZCA9PSBcIm5vcm1hbFwiKSkge1xuICAgIGxldCBvcGVyYXRpb25TdGF0ZSA9IGNsb25lU3RhdGUoZmxvdy5zdGF0ZSlcbiAgICBsZXQgdGVybWluYWxGYWlsdXJlXG5cbiAgICBpZiAocmVzb3VyY2VGbG93LmtpbmQgPT0gXCJib3Jyb3dcIiB8fCByZXNvdXJjZUZsb3cua2luZCA9PSBcImNsb3NlXCIpIHtcbiAgICAgIGNvbnN0IGFyZ3VtZW50ID0gZXhwcmVzc2lvbi5hcmd1bWVudHNbcmVzb3VyY2VGbG93LnBhcmFtZXRlckluZGV4XVxuICAgICAgaWYgKGFyZ3VtZW50LmtpbmQgIT0gXCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIikgZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfQk9SUk9XXCIsIFwiUmVzb3VyY2Ugb3BlcmF0aW9uIGxhY2tzIGFuIGltbWVkaWF0ZSBib3Jyb3cuXCIsIGFyZ3VtZW50LmxvY2F0aW9uKVxuICAgICAgY29uc3QgbmFtZSA9IHBsYWNlTmFtZShhcmd1bWVudC5leHByZXNzaW9uKVxuICAgICAgY29uc3Qgb3duZXIgPSByZXF1aXJlT3duZXIobmFtZSwgb3BlcmF0aW9uU3RhdGUsIGFyZ3VtZW50LmxvY2F0aW9uLCBmYWlsKVxuXG4gICAgICBpZiAob3duZXIua2luZCA9PSBcIm1vdmVkXCIpIGZhaWwoXCJVU0VfQUZURVJfTU9WRVwiLCBgUmVzb3VyY2UgJyR7bmFtZX0nIHdhcyBtb3ZlZCBiZWZvcmUgdGhpcyBvcGVyYXRpb24uYCwgYXJndW1lbnQubG9jYXRpb24pXG4gICAgICBpZiAob3duZXIua2luZCA9PSBcInRlcm1pbmFsXCIpIHRlcm1pbmFsRmFpbHVyZSA9IHJlc291cmNlRmxvdy50ZXJtaW5hbEZhaWx1cmVJZFxuICAgICAgZWxzZSBpZiAocmVzb3VyY2VGbG93LmtpbmQgPT0gXCJjbG9zZVwiKSBvcGVyYXRpb25TdGF0ZS5zZXQobmFtZSwgey4uLm93bmVyLCBjbG9zZVNpdGVJZDogZXhwcmVzc2lvbi5lZmZlY3RTaXRlSWQsIGtpbmQ6IFwidGVybWluYWxcIn0pXG4gICAgfVxuICAgIGlmICh0ZXJtaW5hbEZhaWx1cmUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHtlcnJvcklkOiB0ZXJtaW5hbEZhaWx1cmUsIGtpbmQ6IFwicmFpc2VcIiwgbG9jYXRpb246IGV4cHJlc3Npb24ubG9jYXRpb24sIHN0YXRlOiBvcGVyYXRpb25TdGF0ZX0pXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCBmYWlsdXJlSWRzID0gZXhwcmVzc2lvbi5yZXNvbHV0aW9uLmZhaWx1cmVJZHMuZmlsdGVyKChpZCkgPT5cbiAgICAgIHJlc291cmNlRmxvdy5raW5kICE9IFwiYm9ycm93XCIgJiYgcmVzb3VyY2VGbG93LmtpbmQgIT0gXCJjbG9zZVwiIHx8IGlkICE9IHJlc291cmNlRmxvdy50ZXJtaW5hbEZhaWx1cmVJZClcblxuICAgIHJlc3VsdC5wdXNoKHtraW5kOiBcIm5vcm1hbFwiLCBzdGF0ZTogY2xvbmVTdGF0ZShvcGVyYXRpb25TdGF0ZSl9KVxuICAgIGZvciAoY29uc3QgZXJyb3JJZCBvZiBmYWlsdXJlSWRzKSB7XG4gICAgICByZXN1bHQucHVzaCh7ZXJyb3JJZCwga2luZDogXCJyYWlzZVwiLCBsb2NhdGlvbjogZXhwcmVzc2lvbi5sb2NhdGlvbiwgc3RhdGU6IGNsb25lU3RhdGUob3BlcmF0aW9uU3RhdGUpfSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIEFwcGxpZXMgY2FsbC1lbnRyeSBvd25lcnNoaXAgY29tbWl0IHNlbWFudGljcyBhZnRlciBvcmRlcmVkIGFyZ3VtZW50IGV2YWx1YXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQ2FsbEV4cHJlc3Npb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk1ldGhvZENhbGxFeHByZXNzaW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWZlcmVuY2VDb25zdHJ1Y3Rpb259IGV4cHJlc3Npb24gLSBDYWxsLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBPd25lclN0YXRlPn0gc3RhdGUgLSBJbmNvbWluZyBvd25lcnNoaXAgc3RhdGUuXG4gKiBAcGFyYW0ge0xpZmV0aW1lRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEBwYXJhbSB7e2Z1bmN0aW9uczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LCBtZXRob2RzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBlcnJvckVmZmVjdHMgLSBDb21wbGV0ZSBlc2NhcGluZyBlcnJvciBzZXRzIHBlciBmdW5jdGlvbiBhbmQgbWV0aG9kLlxuICogQHJldHVybnMge0xpZmV0aW1lRXhpdFtdfSBSZWFjaGFibGUgZXhpdHMuXG4gKi9cbmZ1bmN0aW9uIGV2YWx1YXRlT3JkaW5hcnlDYWxsKGV4cHJlc3Npb24sIHN0YXRlLCBmYWlsLCBlcnJvckVmZmVjdHMpIHtcbiAgY29uc3QgYXJndW1lbnRzXyA9IGV4cHJlc3Npb24ua2luZCA9PSBcIk1ldGhvZENhbGxFeHByZXNzaW9uXCIgPyBbZXhwcmVzc2lvbi5yZWNlaXZlciwgLi4uZXhwcmVzc2lvbi5hcmd1bWVudHNdIDogZXhwcmVzc2lvbi5hcmd1bWVudHNcbiAgLyoqIEB0eXBlIHtMaWZldGltZUV4aXRbXX0gKi9cbiAgbGV0IGZsb3dzID0gW3traW5kOiBcIm5vcm1hbFwiLCBzdGF0ZX1dXG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IHJlc2VydmVkTW92ZXMgPSBbXVxuXG4gIGZvciAoY29uc3QgYXJndW1lbnQgb2YgYXJndW1lbnRzXykge1xuICAgIGlmIChhcmd1bWVudC5raW5kID09IFwiT3duZWRNb3ZlRXhwcmVzc2lvblwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MuZmlsdGVyKCh7a2luZH0pID0+IGtpbmQgPT0gXCJub3JtYWxcIikpIHtcbiAgICAgICAgY29uc3Qgb3duZXIgPSByZXF1aXJlT3duZXIoYXJndW1lbnQuZXhwcmVzc2lvbi5uYW1lLCBmbG93LnN0YXRlLCBhcmd1bWVudC5sb2NhdGlvbiwgZmFpbClcbiAgICAgICAgaWYgKG93bmVyLmtpbmQgPT0gXCJtb3ZlZFwiKSBmYWlsKFwiVVNFX0FGVEVSX01PVkVcIiwgYFJlc291cmNlICcke2FyZ3VtZW50LmV4cHJlc3Npb24ubmFtZX0nIHdhcyBhbHJlYWR5IG1vdmVkLmAsIGFyZ3VtZW50LmxvY2F0aW9uKVxuICAgICAgICBpZiAob3duZXIua2luZCA9PSBcInRlcm1pbmFsXCIpIGZhaWwoXCJVU0VfQUZURVJfQ0xPU0VcIiwgYFJlc291cmNlICcke2FyZ3VtZW50LmV4cHJlc3Npb24ubmFtZX0nIGlzIHRlcm1pbmFsIGFmdGVyIGNsb3NlLmAsIGFyZ3VtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKHJlc2VydmVkTW92ZXMuaW5jbHVkZXMoYXJndW1lbnQuZXhwcmVzc2lvbi5uYW1lKSkge1xuICAgICAgICBmYWlsKFwiUkVTT1VSQ0VfQUxJQVNcIiwgYFJlc291cmNlICcke2FyZ3VtZW50LmV4cHJlc3Npb24ubmFtZX0nIGNhbm5vdCBiZSB0cmFuc2ZlcnJlZCB0byB0d28gcGFyYW1ldGVycy5gLCBhcmd1bWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIHJlc2VydmVkTW92ZXMucHVzaChhcmd1bWVudC5leHByZXNzaW9uLm5hbWUpXG4gICAgfSBlbHNlIGZsb3dzID0gZXZhbHVhdGVGb3JGbG93cyhhcmd1bWVudCwgZmxvd3MsIGZhaWwsIGVycm9yRWZmZWN0cylcbiAgfVxuICBjb25zdCByZXN1bHQgPSBmbG93cy5maWx0ZXIoKHtraW5kfSkgPT4ga2luZCAhPSBcIm5vcm1hbFwiKVxuXG4gIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cy5maWx0ZXIoKHtraW5kfSkgPT4ga2luZCA9PSBcIm5vcm1hbFwiKSkge1xuICAgIGNvbnN0IGVudGVyZWQgPSBjbG9uZVN0YXRlKGZsb3cuc3RhdGUpXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc2VydmVkTW92ZXMpIHtcbiAgICAgIGNvbnN0IG93bmVyID0gcmVxdWlyZU93bmVyKG5hbWUsIGVudGVyZWQsIGV4cHJlc3Npb24ubG9jYXRpb24sIGZhaWwpXG4gICAgICBpZiAob3duZXIua2luZCA9PSBcIm1vdmVkXCIpIGZhaWwoXCJVU0VfQUZURVJfTU9WRVwiLCBgUmVzb3VyY2UgJyR7bmFtZX0nIHdhcyBhbHJlYWR5IG1vdmVkLmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICBpZiAob3duZXIua2luZCA9PSBcInRlcm1pbmFsXCIpIGZhaWwoXCJVU0VfQUZURVJfQ0xPU0VcIiwgYFJlc291cmNlICcke25hbWV9JyBpcyB0ZXJtaW5hbCBhZnRlciBjbG9zZS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgZW50ZXJlZC5zZXQobmFtZSwgey4uLm93bmVyLCBkZXN0aW5hdGlvbjogXCJjYWxsZWVcIiwga2luZDogXCJtb3ZlZFwifSlcbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1ldGhvZENhbGxFeHByZXNzaW9uXCIgJiYgZXhwcmVzc2lvbi5yZXNvbHV0aW9uPy5yZXNvdXJjZUZsb3cpIHtcbiAgICAgIGNvbnN0IHJlY2VpdmVyID0gZXhwcmVzc2lvbi5yZWNlaXZlci5raW5kID09IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIgPyBleHByZXNzaW9uLnJlY2VpdmVyLmV4cHJlc3Npb24gOiBleHByZXNzaW9uLnJlY2VpdmVyXG4gICAgICBpZiAocmVjZWl2ZXIua2luZCAhPSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIgJiYgcmVjZWl2ZXIua2luZCAhPSBcIlJlY2VpdmVyRXhwcmVzc2lvblwiICYmIHJlY2VpdmVyLmtpbmQgIT0gXCJQcml2YXRlRmllbGRSZWFkXCIpIHtcbiAgICAgICAgZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfQk9SUk9XXCIsIFwiT3duZWQgbWV0aG9kIHJlY2VpdmVyIG11c3QgYmUgYW4gaW1tZWRpYXRlIGJvcnJvd2VkIHBsYWNlLlwiLCByZWNlaXZlci5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5hbWUgPSBwbGFjZU5hbWUocmVjZWl2ZXIpXG4gICAgICBjb25zdCBvd25lciA9IHJlcXVpcmVPd25lcihuYW1lLCBlbnRlcmVkLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsKVxuXG4gICAgICBpZiAob3duZXIua2luZCA9PSBcInRlcm1pbmFsXCIpIHtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24ucmVzb2x1dGlvbi5yZXNvdXJjZUZsb3cudGVybWluYWxGYWlsdXJlSWQpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh7ZXJyb3JJZDogZXhwcmVzc2lvbi5yZXNvbHV0aW9uLnJlc291cmNlRmxvdy50ZXJtaW5hbEZhaWx1cmVJZCwga2luZDogXCJyYWlzZVwiLFxuICAgICAgICAgICAgbG9jYXRpb246IGV4cHJlc3Npb24ubG9jYXRpb24sIHN0YXRlOiBlbnRlcmVkfSlcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZhaWwoXCJVU0VfQUZURVJfQ0xPU0VcIiwgYFJlc291cmNlICcke25hbWV9JyBpcyB0ZXJtaW5hbCBhZnRlciBjbG9zZS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKGV4cHJlc3Npb24ucmVzb2x1dGlvbi5yZXNvdXJjZUZsb3cua2luZCA9PSBcInRlcm1pbmFsXCIpIHtcbiAgICAgICAgZW50ZXJlZC5zZXQobmFtZSwgey4uLm93bmVyLCBjbG9zZVNpdGVJZDogZXhwcmVzc2lvbi5lZmZlY3RTaXRlSWQgPz8gZXhwcmVzc2lvbi5sb2NhdGlvbiwga2luZDogXCJ0ZXJtaW5hbFwifSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnB1c2goe2tpbmQ6IFwibm9ybWFsXCIsIHN0YXRlOiBjbG9uZVN0YXRlKGVudGVyZWQpfSlcbiAgICBjb25zdCBlc2NhcGluZyA9IG5ldyBTZXQoZXhwcmVzc2lvbi5mYWlsdXJlSWRzID8/IFtdKVxuXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgIGZvciAoY29uc3QgZXJyb3JJZCBvZiBlcnJvckVmZmVjdHMuZnVuY3Rpb25zLmdldChleHByZXNzaW9uLmNhbGxlZSkgPz8gW10pIGVzY2FwaW5nLmFkZChlcnJvcklkKVxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgZm9yIChjb25zdCBlcnJvcklkIG9mIGVycm9yRWZmZWN0cy5tZXRob2RzLmdldChleHByZXNzaW9uLm1ldGhvZCkgPz8gW10pIGVzY2FwaW5nLmFkZChlcnJvcklkKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVycm9ySWQgb2YgZXNjYXBpbmcpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHtlcnJvcklkLCBraW5kOiBcInJhaXNlXCIsIGxvY2F0aW9uOiBleHByZXNzaW9uLmxvY2F0aW9uLCBzdGF0ZTogY2xvbmVTdGF0ZShlbnRlcmVkKX0pXG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZXMgYSBjaGlsZCBleHByZXNzaW9uIG9ubHkgYWxvbmcgbm9ybWFsIGluY29taW5nIHBhdGhzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBDaGlsZCBleHByZXNzaW9uLlxuICogQHBhcmFtIHtMaWZldGltZUV4aXRbXX0gZmxvd3MgLSBJbmNvbWluZyBwYXRocy5cbiAqIEBwYXJhbSB7TGlmZXRpbWVGYWlsfSBmYWlsIC0gTG9jYXRlZCBmYWlsdXJlLlxuICogQHBhcmFtIHt7ZnVuY3Rpb25zOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4sIG1ldGhvZHM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn19IGVycm9yRWZmZWN0cyAtIENvbXBsZXRlIGVzY2FwaW5nIGVycm9yIHNldHMgcGVyIGZ1bmN0aW9uIGFuZCBtZXRob2QuXG4gKiBAcmV0dXJucyB7TGlmZXRpbWVFeGl0W119IFJlYWNoYWJsZSBleGl0cy5cbiAqL1xuZnVuY3Rpb24gZXZhbHVhdGVGb3JGbG93cyhleHByZXNzaW9uLCBmbG93cywgZmFpbCwgZXJyb3JFZmZlY3RzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IGZsb3dzLmZpbHRlcigoe2tpbmR9KSA9PiBraW5kICE9IFwibm9ybWFsXCIpXG4gIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cy5maWx0ZXIoKHtraW5kfSkgPT4ga2luZCA9PSBcIm5vcm1hbFwiKSkge1xuICAgIHJlc3VsdC5wdXNoKC4uLmV2YWx1YXRlRXhwcmVzc2lvbihleHByZXNzaW9uLCBjbG9uZVN0YXRlKGZsb3cuc3RhdGUpLCBmYWlsLCBlcnJvckVmZmVjdHMpKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5vbi1jYWxsIGV4cHJlc3Npb24gY2hpbGRyZW4gaW4gZXZhbHVhdGlvbiBvcmRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gUGFyZW50IGV4cHJlc3Npb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9uW119IENoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBleHByZXNzaW9uQ2hpbGRyZW4oZXhwcmVzc2lvbikge1xuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQmluYXJ5RXhwcmVzc2lvblwiKSByZXR1cm4gW2V4cHJlc3Npb24ubGVmdCwgZXhwcmVzc2lvbi5yaWdodF1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSByZXR1cm4gW2V4cHJlc3Npb24ub3BlcmFuZF1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk9wdGlvbmFsU29tZVwiKSByZXR1cm4gW2V4cHJlc3Npb24udmFsdWVdXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbElzUHJlc2VudFwiIHx8IGV4cHJlc3Npb24ua2luZCA9PSBcIk9wdGlvbmFsVW53cmFwXCIpIHJldHVybiBbZXhwcmVzc2lvbi5vcGVyYW5kXVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTGlzdExpdGVyYWxcIikgcmV0dXJuIGV4cHJlc3Npb24uZWxlbWVudHNcbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1hcExpdGVyYWxcIiB8fCBleHByZXNzaW9uLmtpbmQgPT0gXCJPcmRlcmVkTWFwTGl0ZXJhbFwiKSByZXR1cm4gZXhwcmVzc2lvbi5lbnRyaWVzLm1hcCgoe3ZhbHVlfSkgPT4gdmFsdWUpXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJMaXN0SW5kZXhFeHByZXNzaW9uXCIpIHJldHVybiBbZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBleHByZXNzaW9uLmluZGV4XVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWFwTG9va3VwRXhwcmVzc2lvblwiKSByZXR1cm4gW2V4cHJlc3Npb24uY29sbGVjdGlvbiwgZXhwcmVzc2lvbi5rZXldXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDb2xsZWN0aW9uU2l6ZUV4cHJlc3Npb25cIikgcmV0dXJuIFtleHByZXNzaW9uLmNvbGxlY3Rpb25dXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJSZWNvcmRDb25zdHJ1Y3Rpb25cIikgcmV0dXJuIGV4cHJlc3Npb24uYXJndW1lbnRzXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNZW1iZXJSZWFkXCIpIHJldHVybiBbZXhwcmVzc2lvbi5yZWNlaXZlcl1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlByaXZhdGVGaWVsZFJlYWRcIikgcmV0dXJuIFtleHByZXNzaW9uLnJlY2VpdmVyXVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiRXJyb3JNZXNzYWdlUmVhZFwiKSByZXR1cm4gW2V4cHJlc3Npb24ucmVjZWl2ZXJdXG4gIHJldHVybiBbXVxufVxuXG4vKipcbiAqIE1lcmdlcyBub3JtYWwgcGF0aHMgb25seSBhZnRlciBwcm92aW5nIGlkZW50aWNhbCBvd25lcnNoaXAgc3RhdGVzLlxuICogQHBhcmFtIHtMaWZldGltZUV4aXRbXX0gZmxvd3MgLSBDYW5kaWRhdGUgcGF0aHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gSm9pbiBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7TGlmZXRpbWVGYWlsfSBmYWlsIC0gTG9jYXRlZCBmYWlsdXJlLlxuICogQHJldHVybnMge0xpZmV0aW1lRXhpdFtdfSBNZXJnZWQgcGF0aHMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlRXF1aXZhbGVudE5vcm1hbHMoZmxvd3MsIGxvY2F0aW9uLCBmYWlsKSB7XG4gIGNvbnN0IG5vcm1hbCA9IGZsb3dzLmZpbHRlcigoe2tpbmR9KSA9PiBraW5kID09IFwibm9ybWFsXCIpXG4gIGlmIChub3JtYWwubGVuZ3RoID4gMSkge1xuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIG5vcm1hbC5zbGljZSgxKSkgcmVxdWlyZVNhbWVTdGF0ZShub3JtYWxbMF0uc3RhdGUsIGNhbmRpZGF0ZS5zdGF0ZSwgbG9jYXRpb24sIGZhaWwpXG4gIH1cbiAgcmV0dXJuIFsuLi5mbG93cy5maWx0ZXIoKHtraW5kfSkgPT4ga2luZCAhPSBcIm5vcm1hbFwiKSwgLi4uKG5vcm1hbC5sZW5ndGggPiAwID8gW25vcm1hbFswXV0gOiBbXSldXG59XG5cbi8qKlxuICogUmVxdWlyZXMgYSBmaW5pdGUgb3duZXJzaGlwIGludmFyaWFudCBhdCBhIGJyYW5jaCBvciBsb29wIGpvaW4uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIE93bmVyU3RhdGU+fSBsZWZ0IC0gRmlyc3Qgb3duZXJzaGlwIHN0YXRlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBPd25lclN0YXRlPn0gcmlnaHQgLSBTZWNvbmQgb3duZXJzaGlwIHN0YXRlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEpvaW4gbG9jYXRpb24uXG4gKiBAcGFyYW0ge0xpZmV0aW1lRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiByZXF1aXJlU2FtZVN0YXRlKGxlZnQsIHJpZ2h0LCBsb2NhdGlvbiwgZmFpbCkge1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoWy4uLmxlZnQua2V5cygpLCAuLi5yaWdodC5rZXlzKCldKVxuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBjb25zdCBsZWZ0U3RhdGUgPSBsZWZ0LmdldChuYW1lKVxuICAgIGNvbnN0IHJpZ2h0U3RhdGUgPSByaWdodC5nZXQobmFtZSlcbiAgICBpZiAobGVmdFN0YXRlPy5raW5kICE9IHJpZ2h0U3RhdGU/LmtpbmQgfHwgbGVmdFN0YXRlPy5vcmlnaW5JZCAhPSByaWdodFN0YXRlPy5vcmlnaW5JZCkge1xuICAgICAgZmFpbChcIlJFU09VUkNFX1NUQVRFX01JU01BVENIXCIsIGBSZXNvdXJjZSAnJHtuYW1lfScgaGFzIGRpZmZlcmVudCBvd25lcnNoaXAgc3RhdGUgYWNyb3NzIHJlYWNoYWJsZSBwYXRocy5gLCBsb2NhdGlvbilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZWplY3RzIGV2ZXJ5IG93bmVkIHZhbHVlIHRoYXQgbGVhdmVzIGl0cyBpbnRyb2R1Y2luZyBzY29wZSBvcGVuLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBPd25lclN0YXRlPn0gc3RhdGUgLSBPd25lcnNoaXAgc3RhdGUuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBuYW1lcyAtIE93bmVycyBpbnRyb2R1Y2VkIGluIHRoZSBzY29wZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGl0IGxvY2F0aW9uLlxuICogQHBhcmFtIHtMaWZldGltZUZhaWx9IGZhaWwgLSBMb2NhdGVkIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gY2hlY2tMZWFrcyhzdGF0ZSwgbmFtZXMsIGxvY2F0aW9uLCBmYWlsKSB7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGNvbnN0IG93bmVyID0gc3RhdGUuZ2V0KG5hbWUpXG4gICAgaWYgKG93bmVyPy5raW5kID09IFwib3BlblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW4gPSBvd25lci5vcmlnaW5cbiAgICAgIGZhaWwoXCJMRUFLRURfUkVTT1VSQ0VcIiwgYE93bmVkIHJlc291cmNlICcke25hbWV9JyByZW1haW5zIG9wZW47IGFjcXVpcmVkIGF0ICR7b3JpZ2luLmZpbGVuYW1lfToke29yaWdpbi5zdGFydC5saW5lfToke29yaWdpbi5zdGFydC5jb2x1bW59LmAsIGxvY2F0aW9uKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuIG93bmVkIHBsYWNlIGluIHRoZSBjdXJyZW50IHNjb3BlLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBTdGFibGUgcGxhY2UgbmFtZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgT3duZXJTdGF0ZT59IHN0YXRlIC0gT3duZXJzaGlwIHN0YXRlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFVzZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7TGlmZXRpbWVGYWlsfSBmYWlsIC0gTG9jYXRlZCBmYWlsdXJlLlxuICogQHJldHVybnMge093bmVyU3RhdGV9IE93bmVyIHN0YXRlLlxuICovXG5mdW5jdGlvbiByZXF1aXJlT3duZXIobmFtZSwgc3RhdGUsIGxvY2F0aW9uLCBmYWlsKSB7XG4gIGNvbnN0IG93bmVyID0gc3RhdGUuZ2V0KG5hbWUpXG4gIGlmICghb3duZXIpIHJldHVybiBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9CT1JST1dcIiwgYE5vIG93bmVkIHJlc291cmNlIHBsYWNlICcke25hbWV9JyBpcyBpbiBzY29wZS5gLCBsb2NhdGlvbilcbiAgcmV0dXJuIG93bmVyXG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gaW1tZWRpYXRlIG93bmVkIGV4cHJlc3Npb24gdG8gYSBzdGFibGUgcGxhY2UgbmFtZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5JZGVudGlmaWVyRXhwcmVzc2lvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjZWl2ZXJFeHByZXNzaW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Qcml2YXRlRmllbGRSZWFkfSBleHByZXNzaW9uIC0gT3duZWQgcGxhY2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBQbGFjZSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gcGxhY2VOYW1lKGV4cHJlc3Npb24pIHtcbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpIHJldHVybiBleHByZXNzaW9uLm5hbWVcbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlJlY2VpdmVyRXhwcmVzc2lvblwiKSByZXR1cm4gXCJ0aGlzXCJcbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlByaXZhdGVGaWVsZFJlYWRcIikgcmV0dXJuIGB0aGlzLiR7ZXhwcmVzc2lvbi5maWVsZH1gXG4gIHJldHVybiBcIjxpbnZhbGlkPlwiXG59XG5cbi8qKlxuICogQ3JlYXRlcyBvbmUgb3BlbiBvd25lcnNoaXAgc3RhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3JpZ2luSWQgLSBEZXRlcm1pbmlzdGljIG9yaWdpbiBpZGVudGl0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gb3JpZ2luIC0gQWNxdWlzaXRpb24gbG9jYXRpb24uXG4gKiBAcmV0dXJucyB7T3duZXJTdGF0ZX0gT3BlbiBzdGF0ZS5cbiAqL1xuZnVuY3Rpb24gb3BlblN0YXRlKG9yaWdpbklkLCBvcmlnaW4pIHtcbiAgcmV0dXJuIHtraW5kOiBcIm9wZW5cIiwgb3JpZ2luLCBvcmlnaW5JZH1cbn1cblxuLyoqXG4gKiBDbG9uZXMgYW4gb3duZXJzaGlwIHN0YXRlIGZvciBhIGNvbnRyb2wtZmxvdyBmb3JrLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBPd25lclN0YXRlPn0gc3RhdGUgLSBTdGF0ZSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBPd25lclN0YXRlPn0gRGV0YWNoZWQgc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIGNsb25lU3RhdGUoc3RhdGUpIHtcbiAgcmV0dXJuIG5ldyBNYXAoWy4uLnN0YXRlXS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+IFtuYW1lLCB7Li4udmFsdWV9XSkpXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB0eXBlIGNhcnJpZXMgbGluZWFyIG93bmVyc2hpcC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gdHlwZSAtIFNlbWFudGljIHR5cGUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdHlwZSBpcyBvd25lZC5cbiAqL1xuZnVuY3Rpb24gaXNPd25lZCh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiIHx8IHR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1vZHVsZSBjb250YWlucyBhbnkgb3duZWQgc2VtYW50aWMgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgbGlmZXRpbWUgYW5hbHlzaXMgaXMgcmVxdWlyZWQuXG4gKi9cbmZ1bmN0aW9uIG1vZHVsZUNvbnRhaW5zT3duZWRUeXBlKG1vZHVsZSkge1xuICBjb25zdCBwZW5kaW5nID0gWy8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKG1vZHVsZSldXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KClcblxuICB3aGlsZSAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwZW5kaW5nLnBvcCgpXG5cbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHNlZW4uaGFzKHZhbHVlKSkgY29udGludWVcbiAgICBzZWVuLmFkZCh2YWx1ZSlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIChSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIiB8fFxuICAgICAgUmVmbGVjdC5nZXQodmFsdWUsIFwia2luZFwiKSA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSkgcmV0dXJuIHRydWVcbiAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGlmIChbXCJsb2NhdGlvblwiLCBcInByb3ZlbmFuY2VcIiwgXCJzb3VyY2VQcm92ZW5hbmNlXCJdLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHBlbmRpbmcucHVzaCguLi5jaGlsZClcbiAgICAgIGVsc2UgaWYgKGNoaWxkICYmIHR5cGVvZiBjaGlsZCA9PSBcIm9iamVjdFwiKSBwZW5kaW5nLnB1c2goY2hpbGQpXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../../src/semantic/provenance.js"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAJzB,MAIyB,EAAE,MAAM,EAHjC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,YAAY,EAAE,cAAc,CAAC,CAG3B,GAF/B,IAAI,CAIhB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CALV,IAAI,SAAZ,MAAY,EAKO,IAAI,EAJ1B,IAI0B,EAAE,MAAM,EAHlC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,YAAY,EAAE,cAAc,CAAC,CAG1B,GAFhC,IAAI,CAMhB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAJxB,MAIwB,EAAE,IAAI,EAH9B,MAG8B,GAF5B,OAAO,YAAY,EAAE,cAAc,GAAG,SAAS,CAI3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAPhC,OAAO,YAAY,EAAE,cAOW,EAAE,EAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAC,EALtE;IAAuB,QAAQ,EAAvB,MAAM,CACd;IAAsD,QAAQ,EAAtD,OAAO,YAAY,EAAE,gBAAgB,CAC7C;IAAuB,MAAM,EAArB,MAAM,CACd;CAEsE,GAF5D,OAAO,YAAY,EAAE,cAAc,CAkD/C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAJjC,OAAO,YAAY,EAAE,cAIY,EAAE,eAAe,AAH1D,CACA,EADQ;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,YAAY,EAAE,gBAAgB,CAAA;CAAC,EAG9B,GAFrD;IAAC,UAAU,EAAE,OAAO,YAAY,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,YAAY,EAAE,sBAAsB,CAAA;CAAC,CAmHrL;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAH3B,OAAO,YAAY,EAAE,cAGM,GAFzB,OAAO,YAAY,EAAE,cAAc,GAAG,SAAS,CAO3D;AA4LD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAJ7B,OAAO,YAAY,EAAE,cAIQ,EAAE,IAAI,EAHnC,OAAO,YAAY,EAAE,YAAY,GAAG,MAGD,GAFjC,OAAO,YAAY,EAAE,sBAAsB,CAYvD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAJ/B,OAAO,YAAY,EAAE,cAIU,EAAE,QAAQ,EAHzC,MAGyC,GAFvC,OAAO,YAAY,EAAE,wBAAwB,CASzD;AAaD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAH3B,OAAO,YAAY,EAAE,cAAc,GAAG,OAAO,YAAY,EAAE,qBAGhC,GAFzB;IAAC,IAAI,EAAE,OAAO,YAAY,EAAE,YAAY,CAAC;IAAC,aAAa,EAAE,OAAO,YAAY,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,EAAE,CA8KzH"}
1
+ {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../../src/semantic/provenance.js"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAJzB,MAIyB,EAAE,MAAM,EAHjC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,YAAY,EAAE,cAAc,CAAC,CAG3B,GAF/B,IAAI,CAIhB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CALV,IAAI,SAAZ,MAAY,EAKO,IAAI,EAJ1B,IAI0B,EAAE,MAAM,EAHlC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,YAAY,EAAE,cAAc,CAAC,CAG1B,GAFhC,IAAI,CAMhB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAJxB,MAIwB,EAAE,IAAI,EAH9B,MAG8B,GAF5B,OAAO,YAAY,EAAE,cAAc,GAAG,SAAS,CAI3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAPhC,OAAO,YAAY,EAAE,cAOW,EAAE,EAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAC,EALtE;IAAuB,QAAQ,EAAvB,MAAM,CACd;IAAsD,QAAQ,EAAtD,OAAO,YAAY,EAAE,gBAAgB,CAC7C;IAAuB,MAAM,EAArB,MAAM,CACd;CAEsE,GAF5D,OAAO,YAAY,EAAE,cAAc,CAkD/C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAJjC,OAAO,YAAY,EAAE,cAIY,EAAE,eAAe,AAH1D,CACA,EADQ;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,YAAY,EAAE,gBAAgB,CAAA;CAAC,EAG9B,GAFrD;IAAC,UAAU,EAAE,OAAO,YAAY,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,YAAY,EAAE,sBAAsB,CAAA;CAAC,CAmHrL;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAH3B,OAAO,YAAY,EAAE,cAGM,GAFzB,OAAO,YAAY,EAAE,cAAc,GAAG,SAAS,CAO3D;AA4LD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAJ7B,OAAO,YAAY,EAAE,cAIQ,EAAE,IAAI,EAHnC,OAAO,YAAY,EAAE,YAAY,GAAG,MAGD,GAFjC,OAAO,YAAY,EAAE,sBAAsB,CAYvD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAJ/B,OAAO,YAAY,EAAE,cAIU,EAAE,QAAQ,EAHzC,MAGyC,GAFvC,OAAO,YAAY,EAAE,wBAAwB,CASzD;AAaD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAH3B,OAAO,YAAY,EAAE,cAAc,GAAG,OAAO,YAAY,EAAE,qBAGhC,GAFzB;IAAC,IAAI,EAAE,OAAO,YAAY,EAAE,YAAY,CAAC;IAAC,aAAa,EAAE,OAAO,YAAY,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,EAAE,CA4LzH"}