@cartanova/qgrid-cli 2.6.11 → 2.7.1

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 (153) hide show
  1. package/bundle/dist/_virtual/_rolldown/runtime.js +20 -1
  2. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +17 -6
  3. package/bundle/dist/application/qgrid/qgrid.frame.js +1 -1
  4. package/bundle/dist/application/qgrid/schema-prompt.js +240 -0
  5. package/bundle/dist/application/qgrid/tool-emulation.js +7 -5
  6. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/2020.js +112 -0
  7. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/code.js +140 -0
  8. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/index.js +676 -0
  9. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/scope.js +143 -0
  10. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/errors.js +104 -0
  11. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/index.js +225 -0
  12. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/names.js +30 -0
  13. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/ref_error.js +20 -0
  14. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/resolve.js +135 -0
  15. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/rules.js +63 -0
  16. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/util.js +148 -0
  17. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/applicability.js +25 -0
  18. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/boolSchema.js +50 -0
  19. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/dataType.js +174 -0
  20. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/defaults.js +33 -0
  21. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/index.js +435 -0
  22. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/keyword.js +115 -0
  23. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/subschema.js +74 -0
  24. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/core.js +585 -0
  25. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/data.js +20 -0
  26. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/index.js +44 -0
  27. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/applicator.js +52 -0
  28. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/content.js +22 -0
  29. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/core.js +53 -0
  30. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/format-annotation.js +18 -0
  31. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/meta-data.js +38 -0
  32. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/unevaluated.js +21 -0
  33. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/validation.js +87 -0
  34. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/schema.js +61 -0
  35. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/equal.js +14 -0
  36. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/ucs2length.js +27 -0
  37. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/uri.js +14 -0
  38. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/validation_error.js +18 -0
  39. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +59 -0
  40. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +98 -0
  41. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/allOf.js +31 -0
  42. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +18 -0
  43. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/contains.js +91 -0
  44. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +89 -0
  45. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js +18 -0
  46. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/if.js +64 -0
  47. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/index.js +62 -0
  48. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/items.js +61 -0
  49. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/items2020.js +36 -0
  50. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/not.js +33 -0
  51. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +53 -0
  52. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +63 -0
  53. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +19 -0
  54. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/properties.js +54 -0
  55. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +43 -0
  56. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +19 -0
  57. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/code.js +132 -0
  58. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/id.js +16 -0
  59. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/index.js +24 -0
  60. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/ref.js +114 -0
  61. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/discriminator/index.js +103 -0
  62. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/discriminator/types.js +16 -0
  63. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/draft2020.js +37 -0
  64. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js +48 -0
  65. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js +47 -0
  66. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/index.js +24 -0
  67. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js +22 -0
  68. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js +17 -0
  69. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/format/format.js +94 -0
  70. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/format/index.js +12 -0
  71. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/metadata.js +25 -0
  72. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/next.js +21 -0
  73. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/unevaluated/index.js +15 -0
  74. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js +48 -0
  75. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js +61 -0
  76. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/const.js +29 -0
  77. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/dependentRequired.js +19 -0
  78. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/enum.js +51 -0
  79. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/index.js +50 -0
  80. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitContains.js +20 -0
  81. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitItems.js +30 -0
  82. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitLength.js +35 -0
  83. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +49 -0
  84. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +30 -0
  85. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +29 -0
  86. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/pattern.js +40 -0
  87. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/required.js +74 -0
  88. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +72 -0
  89. package/bundle/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.js +35 -0
  90. package/bundle/dist/node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/index.js +238 -0
  91. package/bundle/dist/node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/lib/schemes.js +189 -0
  92. package/bundle/dist/node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/lib/utils.js +284 -0
  93. package/bundle/dist/node_modules/.pnpm/json-schema-traverse@1.0.0/node_modules/json-schema-traverse/index.js +80 -0
  94. package/bundle/dist/testing/schema-bench.js +0 -0
  95. package/bundle/dist/utils/providers/anthropic/fence-strip.js +83 -0
  96. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +3 -5
  97. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +250 -34
  98. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +36 -5
  99. package/bundle/src/application/qgrid/qgrid.frame.test.ts +120 -153
  100. package/bundle/src/application/qgrid/qgrid.frame.ts +2 -0
  101. package/bundle/src/application/qgrid/schema-prompt.test.ts +166 -0
  102. package/bundle/src/application/qgrid/schema-prompt.ts +293 -0
  103. package/bundle/src/application/qgrid/tool-emulation.test.ts +36 -0
  104. package/bundle/src/application/qgrid/tool-emulation.ts +19 -7
  105. package/bundle/src/testing/schema-bench.test.ts +358 -0
  106. package/bundle/src/testing/schema-bench.ts +352 -0
  107. package/bundle/src/utils/providers/anthropic/fence-strip.test.ts +122 -0
  108. package/bundle/src/utils/providers/anthropic/fence-strip.ts +105 -0
  109. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +2 -8
  110. package/bundle/web-dist/client/assets/chat-icon-JYfue7fB.png +0 -0
  111. package/bundle/web-dist/client/assets/index-C0594sjh.js +106 -0
  112. package/bundle/web-dist/client/assets/index-CcMEpCgt.css +1 -0
  113. package/bundle/web-dist/client/assets/logs-BotUcOEB.js +1 -0
  114. package/bundle/web-dist/client/assets/monit-kk3vnGvu.js +1 -0
  115. package/bundle/web-dist/client/assets/{routes-DVseTo6T.js → routes-J4bnHVfl.js} +2 -2
  116. package/bundle/web-dist/client/assets/services.generated-jGypfumC.js +51 -0
  117. package/bundle/web-dist/client/assets/settings-CAAQSIyg.js +1 -0
  118. package/bundle/web-dist/client/assets/show-BryNvjUT.js +2 -0
  119. package/bundle/web-dist/client/assets/tokens-DDrATjGA.js +1 -0
  120. package/bundle/web-dist/client/assets/{use-oauth-login-flow-CuLvs_CW.js → use-oauth-login-flow-CptleCFM.js} +1 -1
  121. package/bundle/web-dist/client/index.html +3 -3
  122. package/bundle/web-dist/server/assets/{lazyRouteComponent-C-N6sd5N.js → lazyRouteComponent-DOc8TV-P.js} +2 -2
  123. package/bundle/web-dist/server/assets/{logs-CVkeSr1S.js → logs-CfF3nmLM.js} +3 -4
  124. package/bundle/web-dist/server/assets/{monit-Bb6QfT9V.js → monit-BSaKhh5D.js} +2 -3
  125. package/bundle/web-dist/server/assets/{plus-B8JRuCb9.js → plus-DLFUHsfx.js} +1 -1
  126. package/bundle/web-dist/server/assets/{react-dom-ByF9tqTB.js → react-dom-BotjLnTK.js} +1 -1
  127. package/bundle/web-dist/server/assets/{routes-Dnm-Eti6.js → routes-CHMxrTT0.js} +4 -5
  128. package/bundle/web-dist/server/assets/{sd.generated-CuyajYtc.js → services.generated-D3Q3FYot.js} +16008 -14698
  129. package/bundle/web-dist/server/assets/{settings-4T3nBfY8.js → settings-DOQjV28c.js} +5 -21
  130. package/bundle/web-dist/server/assets/show-Cn_C6Qvl.js +2776 -0
  131. package/bundle/web-dist/server/assets/{tokens-Di_SGPYj.js → tokens-c0EN3iCx.js} +4 -5
  132. package/bundle/web-dist/server/assets/{use-oauth-login-flow-DiYCMNAQ.js → use-oauth-login-flow-B68AbMDE.js} +1 -2
  133. package/bundle/web-dist/server/entry-server.generated.js +23856 -40
  134. package/package.json +1 -1
  135. package/skills/qgrid/references/ai-sdk-provider-contract.md +20 -15
  136. package/skills/qgrid/references/anthropic-claude-code-runtime.md +31 -14
  137. package/skills/qgrid/references/decision-rationale.md +13 -3
  138. package/skills/qgrid/references/prompt-cache-and-usage.md +4 -1
  139. package/skills/qgrid/references/provider-runtime-differences.md +3 -3
  140. package/skills/qgrid/references/tool-calling-and-multiturn.md +16 -6
  141. package/bundle/web-dist/client/assets/index-CFvFRDk_.js +0 -78
  142. package/bundle/web-dist/client/assets/index-CJ9iTI_V.css +0 -1
  143. package/bundle/web-dist/client/assets/logs-DeAK5Uyu.js +0 -1
  144. package/bundle/web-dist/client/assets/monit-Rj94Sz3_.js +0 -1
  145. package/bundle/web-dist/client/assets/sd.generated-W6XqgWK6.js +0 -51
  146. package/bundle/web-dist/client/assets/services.generated-Dz5pA5Fb.js +0 -1
  147. package/bundle/web-dist/client/assets/settings-DvuRDFfS.js +0 -1
  148. package/bundle/web-dist/client/assets/show-C7etBj89.js +0 -30
  149. package/bundle/web-dist/client/assets/tokens-BroPe7Tn.js +0 -1
  150. package/bundle/web-dist/server/assets/services.generated-BAGLi2r8.js +0 -1313
  151. package/bundle/web-dist/server/assets/show-CQw03iTP.js +0 -25968
  152. /package/bundle/web-dist/client/assets/{plus-p4vtg6LN.js → plus-DqBd6gHk.js} +0 -0
  153. /package/bundle/web-dist/server/assets/{cost-DzjfVtUr.js → cost-CSH_t17I.js} +0 -0
@@ -1,5 +1,10 @@
1
1
  //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
3
8
  var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
4
9
  var __exportAll = (all, no_symbols) => {
5
10
  let target = {};
@@ -10,5 +15,19 @@ var __exportAll = (all, no_symbols) => {
10
15
  if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
11
16
  return target;
12
17
  };
18
+ var __copyProps = (to, from, except, desc) => {
19
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
20
+ key = keys[i];
21
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
22
+ get: ((k) => from[k]).bind(null, key),
23
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
24
+ });
25
+ }
26
+ return to;
27
+ };
28
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
29
+ value: mod,
30
+ enumerable: true
31
+ }) : target, mod));
13
32
  //#endregion
14
- export { __commonJSMin, __exportAll };
33
+ export { __commonJSMin, __exportAll, __toESM };
@@ -1,10 +1,12 @@
1
1
  import { SD } from "../../i18n/sd.generated.js";
2
+ import { createFenceStripTransform } from "../../utils/providers/anthropic/fence-strip.js";
2
3
  import { getAccessToken } from "../../utils/providers/common/credentials.js";
3
4
  import { calculateCostUsd } from "../../utils/providers/common/model-cost.js";
4
5
  import { parseAndValidateCallerSchemas, serializeAndValidateDispatchSchema } from "../../utils/providers/common/schema-validation.js";
5
6
  import { strictify } from "../../utils/providers/common/strictifier.js";
6
7
  import { decideConvRouting, issueConvContext } from "./conv-routing.js";
7
8
  import { ProcessError, maskToken } from "./qgrid.types.js";
9
+ import { composeSystemWithSchemaContract } from "./schema-prompt.js";
8
10
  import { applyToolCallEmulation } from "./tool-emulation.js";
9
11
  import { buildToolCallSchema } from "./tool-emulation-schema.js";
10
12
  import { InternalServerErrorException, ServiceUnavailableException } from "sonamu";
@@ -101,8 +103,7 @@ var QgridDispatcherClass = class {
101
103
  const decision = decideConvRouting(input);
102
104
  const result = await this.anthropicDispatcher.generate({
103
105
  model: input.model,
104
- systemPrompt: input.system,
105
- outputSchema,
106
+ systemPrompt: composeSystemWithSchemaContract(input.system, input),
106
107
  effort: input.effort,
107
108
  timeoutMs: input.timeout,
108
109
  abortSignal,
@@ -155,11 +156,15 @@ var QgridDispatcherClass = class {
155
156
  return;
156
157
  } else if (route.provider === "anthropic") {
157
158
  if (!this.anthropicDispatcher) throw this.notReadyError("anthropic");
159
+ const fenceStrip = input.jsonSchema !== void 0 || Boolean(input.tools?.length) ? createFenceStripTransform() : void 0;
160
+ const emitDelta = fenceStrip ? (text) => {
161
+ const safe = fenceStrip.push(text);
162
+ if (safe) cb.onDelta(safe);
163
+ } : cb.onDelta;
158
164
  const decision = decideConvRouting(input);
159
165
  await this.anthropicDispatcher.generateStream({
160
166
  model: input.model,
161
- systemPrompt: input.system,
162
- outputSchema,
167
+ systemPrompt: composeSystemWithSchemaContract(input.system, input),
163
168
  effort: input.effort,
164
169
  coldInput: decision.coldInput,
165
170
  coldHistory: decision.coldHistory,
@@ -168,9 +173,11 @@ var QgridDispatcherClass = class {
168
173
  imageGeneration: input.imageGeneration,
169
174
  imageGenerationOptions: input.imageGenerationOptions
170
175
  }, {
171
- onDelta: cb.onDelta,
176
+ onDelta: emitDelta,
172
177
  onThreadId: cb.onThreadId,
173
178
  onComplete: (turnResult) => {
179
+ const rest = fenceStrip?.flush();
180
+ if (rest) cb.onDelta(rest);
174
181
  const issuedCoord = issueConvContext(turnResult.threadCoord, decision);
175
182
  cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult), input.tools, {
176
183
  threadCoord: issuedCoord,
@@ -201,6 +208,10 @@ function buildStrictOutputSchema(input, provider) {
201
208
  return outputSchema ? strictify(outputSchema, { provider }) : void 0;
202
209
  }
203
210
  function buildAndValidateStrictOutputSchema(input, provider = parseProviderRoute(input.model).provider) {
211
+ if (provider === "anthropic") {
212
+ parseAndValidateCallerSchemas(input);
213
+ return;
214
+ }
204
215
  const outputSchema = buildStrictOutputSchema(input, provider);
205
216
  serializeAndValidateDispatchSchema(outputSchema, provider);
206
217
  return outputSchema;
@@ -242,4 +253,4 @@ const QgridDispatcher = new QgridDispatcherClass();
242
253
  //#endregion
243
254
  export { QgridDispatcher, QgridDispatcherClass, buildAndValidateStrictOutputSchema, buildStrictOutputSchema };
244
255
 
245
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgcHJvdmlkZXIgZGlzcGF0Y2hlciDrnbzsmrDtjIUgKyDthqDtgbAg7LqQ7IucL+2GteqzhCDsi7HquIDthLQuXG4gKlxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBPcGVuQUkvQW50aHJvcGljIOyalOyyreydgCDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDroZzrp4wg7Iuk7ZaJXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMXG4gKiAtIGRpc3BhdGNoZXIg66+47KSA67mE64qUIOq4sOuPmSDspJEoNTAzKS/stIjquLDtmZQg7Iuk7YyoKDUwMCnroZwg6rWs67aE7ZW0IOuNmOynhOuLpFxuICovXG5cbmltcG9ydCB7IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sIFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiB9IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uLy4uL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0Rpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgZ2V0QWNjZXNzVG9rZW4gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHsgY2FsY3VsYXRlQ29zdFVzZCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL21vZGVsLWNvc3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXN1bHQsXG4gIHR5cGUgU3RyZWFtQ2FsbGJhY2tzLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyxcbiAgc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc2NoZW1hLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7XG4gIG1hc2tUb2tlbixcbiAgUHJvY2Vzc0Vycm9yLFxuICB0eXBlIFByb3ZpZGVyU3RhcnR1cFN0YXRlLFxuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG4gIHR5cGUgVG9rZW5TdGF0cyxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbiB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uXCI7XG5pbXBvcnQgeyBidWlsZFRvb2xDYWxsU2NoZW1hIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb24tc2NoZW1hXCI7XG5cbmV4cG9ydCBjbGFzcyBRZ3JpZERpc3BhdGNoZXJDbGFzcyB7XG4gIHRva2VucyA9IG5ldyBNYXA8bnVtYmVyLCBUb2tlblN1YnNldEE+KCk7XG5cbiAgLy8gVG9rZW5TdGF0cyBzaGFwZSDrs7TsobTsmqkuIOyLpOygnCBwcm92aWRlciDsmpTssq0g7Lm07Jq07YyF7J2AIOqwgSBkaXNwYXRjaGVyIOuhnCDsnbTrj5ntlojri6QuXG4gIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIC8vIHNvbmFtdS5jb25maWcgb25TdGFydCDsl5DshJwg7LKY66as7ZWY64qUIOuzgOyImFxuICBzdWJzY3JpYmVyOiBUb2tlblN1YnNjcmliZXIgfCBudWxsID0gbnVsbDtcbiAgb3BlbmFpRGlzcGF0Y2hlcjogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICBhbnRocm9waWNEaXNwYXRjaGVyOiBBbnRocm9waWNEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIHByb3ZpZGVyIOuzhCDquLDrj5kg7IOB7YOcLiBkaXNwYXRjaGVyIOqwgCDsl4bripQg7J207Jyg66W8IOq1rOu2hO2VmOq4sCDsnITtlbQg7ZWE7JqU7ZWY64ukIOKAlFxuICAgKiBIVFRQIOumrOyKpOuLneydgCBkaXNwYXRjaGVyIOykgOu5hOuztOuLpCDrqLzsoIAg7Je066as66+A66GcKHNvbmFtdS5jb25maWcgb25TdGFydCksXG4gICAqIOq3uCDsgqzsnbQg65Ok7Ja07JioIOyalOyyreydgCBcIuyeoOyLnCDtm4Qg65CY64qUXCIg7IOB7YOc7JmAIFwi7J6s7Iuc64+E7ZW064+EIOyViCDrkJjripRcIiDsg4Htg5zqsIAg64uk66W064ukLlxuICAgKlxuICAgKiAtIGBzdGFydGluZ2A6IOybjOy7pCBzcGF3biDspJEuIGRldjAg6riw7KSAIDI1IOybjOy7pCDDlyA1MDBtcyDqsITqsqnsnbTrnbwgMX4y67aEIOqxuOumsOuLpCDihpIg7J6s7Iuc64+EIOqwgOuKpVxuICAgKiAtIGByZWFkeWA6IOygleyDgVxuICAgKiAtIGBmYWlsZWRgOiBzdGFydCgpIOqwgCDsmIjsmbjroZwg64Gd64KoIOKGkiDsnqzsi5zrj4TtlbTrj4Qg6rCZ7J2AIOqysOqzvFxuICAgKi9cbiAgc3RhcnR1cFN0YXRlOiBSZWNvcmQ8XCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIsIFByb3ZpZGVyU3RhcnR1cFN0YXRlPiA9IHtcbiAgICBvcGVuYWk6IFwic3RhcnRpbmdcIixcbiAgICBhbnRocm9waWM6IFwic3RhcnRpbmdcIixcbiAgfTtcblxuICAvKipcbiAgICogZGlzcGF0Y2hlciDqsIAg7KSA67mE65CY7KeAIOyViuyVmOydhCDrlYwg642Y7KeIIOyYiOyZuOulvCDrp4zrk6Dri6QuXG4gICAqXG4gICAqIOq4sOuPmSDspJHsnbTrqbQgNTAzKCtSZXRyeS1BZnRlcikg7Jy866GcIOyerOyLnOuPhCDqsIDriqXtlajsnYQg7JWM66as6rOgLCDstIjquLDtmZTqsIAg7Iuk7Yyo66GcIOuBneuCrOycvOuptFxuICAgKiA1MDAg7Jy866GcIOyerOyLnOuPhOqwgCDrrLTsnZjrr7jtlajsnYQg7JWM66aw64ukLiDsnbTsoITsl5DripQg65GYIOuLpCBRdW90YUVycm9yIOyYgOuKlOuNsCwg7L+87YSwIOyGjOynhOydtFxuICAgKiDslYTri4wg7IOB7YOc66W8IOq3uOugh+qyjCDtkZztmITtlZjrqbQg7Zi47Lac7J6Q6rCAIO2GoO2BsCDrrLjsoJzroZwg7Jik7ZW07ZWY6rOgIOyerOyLnOuPhCDtjJDri6jrj4Qg66q7IO2VnOuLpC5cbiAgICovXG4gIHByaXZhdGUgbm90UmVhZHlFcnJvcihwcm92aWRlcjogXCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIpOiBFcnJvciB7XG4gICAgY29uc3QgbGFiZWwgPSBwcm92aWRlciA9PT0gXCJvcGVuYWlcIiA/IFwiT3BlbkFJXCIgOiBcIkFudGhyb3BpY1wiO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0dXBTdGF0ZVtwcm92aWRlcl0gPT09IFwiZmFpbGVkXCJcbiAgICAgID8gbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oU0QoXCJxZ3JpZC5kaXNwYXRjaGVyRmFpbGVkXCIpKGxhYmVsKSlcbiAgICAgIDogbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInFncmlkLmRpc3BhdGNoZXJTdGFydGluZ1wiKShsYWJlbCkpO1xuICB9XG5cbiAgY291bnRPZihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KG5hbWUpID8/IDA7XG4gIH1cblxuICAvLyBUb2tlblN1YnNjcmliZXIg7L2c67CxIOKAlCDsupDsi5wgbXV0YXRpb25cbiAgdXBzZXJ0Q2FjaGUoaWQ6IG51bWJlciwgcm93OiBUb2tlblN1YnNldEEpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5zZXQoaWQsIHJvdyk7XG4gIH1cblxuICByZW1vdmVDYWNoZShpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIHJlcGxhY2VDYWNoZShyb3dzOiBUb2tlblN1YnNldEFbXSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zID0gbmV3IE1hcChyb3dzLm1hcCgocikgPT4gW3IuaWQsIHJdKSk7XG4gIH1cblxuICBnZXRTdGF0cygpOiBUb2tlblN0YXRzW10ge1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbnMudmFsdWVzKCldLm1hcCgocikgPT4gKHtcbiAgICAgIHRva2VuOiBtYXNrVG9rZW4oZ2V0QWNjZXNzVG9rZW4oci5jcmVkZW50aWFscykpLFxuICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgcHJvdmlkZXI6IHIucHJvdmlkZXIsXG4gICAgICByZXF1ZXN0czogdGhpcy5jb3VudE9mKHIubmFtZSksXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnkoaW5wdXQ6IFF1ZXJ5SW5wdXQsIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICAvLyBhbnN3ZXIg7J247L2U65SpIO2MkOyglToganNvblNjaGVtYSDsnojsnLzrqbQg7IKs7Jqp7J6QIOyKpO2CpOuniCBKU09OLCDsl4bsnLzrqbQg7Y+J66y4IHN0cmluZy4gNOqwnCDrsKnstpwg7KeA7KCQ7J20IOqzteycoC5cbiAgICBjb25zdCBhbnN3ZXJLaW5kID0gaW5wdXQuanNvblNjaGVtYSA/IChcImpzb25cIiBhcyBjb25zdCkgOiAoXCJ0ZXh0XCIgYXMgY29uc3QpO1xuXG4gICAgLy8gcHJvdmlkZXIgcHJlZml4IHJvdXRpbmc6ICdvcGVuYWkvZ3B0LTUuNCcg4oaSIE9wZW5BSURpc3BhdGNoZXJcbiAgICBpZiAocm91dGUucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyB0aGlzLm5vdFJlYWR5RXJyb3IoXCJvcGVuYWlcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcGVuYWlEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgbW9kZWw6IHJvdXRlLm1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IGlucHV0LnJlYXNvbmluZ1N1bW1hcnksXG4gICAgICAgIHNlcnZpY2VUaWVyOiBpbnB1dC5zZXJ2aWNlVGllcixcbiAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICByZXVzZUlucHV0OiBkZWNpc2lvbi5yZXVzZUlucHV0LFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICB9KTtcblxuICAgICAgLy8g7J2066+47KeAIOyalOyyreydgCBjb2xkLW9ubHkoUjgp6528IOyerOyCrOyaqSDsooztkZzrpbwg67Cc6riJ7ZWY7KeAIOyViuuKlOuLpC4g7KKM7ZGc66W8IOyLpOycvOuptFxuICAgICAgLy8gc2Vzc2lvbktleSDshozruYTsnpDsnZggd2FybSDsooztkZzrpbwg7KO97J2AIOyijO2RnOuhnCDrja7slrTsjagg64uk7J2MIO2FjeyKpO2KuCB0dXJuIOydtCBjb2xkIOuhnCDrlqjslrTsp4Tri6QuXG4gICAgICBjb25zdCBjb29yZCA9IGlucHV0LmltYWdlR2VuZXJhdGlvblxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG5cbiAgICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHJlc3VsdCksIGlucHV0LnRvb2xzLCB7XG4gICAgICAgIHRocmVhZENvb3JkOiBjb29yZCxcbiAgICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgaWYgKCF0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcImFudGhyb3BpY1wiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICAvLyBBbnRocm9waWNEaXNwYXRjaGVyIOuCtOu2gOyXkOyEnCDslYzslYTshJwgcHJvdmlkZXIgcHJlZml4IOulvCBjYW5vbmljYWwgbW9kZWwg66GcIOygleq3nO2ZlO2VqFxuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICAvLyBhbnN3ZXIg7J247L2U65SpIO2MkOyglToganNvblNjaGVtYSDsnojsnLzrqbQg7IKs7Jqp7J6QIOyKpO2CpOuniCBKU09OLCDsl4bsnLzrqbQg7Y+J66y4IHN0cmluZy4gNOqwnCDrsKnstpwg7KeA7KCQ7J20IOqzteycoC5cbiAgICBjb25zdCBhbnN3ZXJLaW5kID0gaW5wdXQuanNvblNjaGVtYSA/IChcImpzb25cIiBhcyBjb25zdCkgOiAoXCJ0ZXh0XCIgYXMgY29uc3QpO1xuXG4gICAgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIXRoaXMub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgdGhpcy5ub3RSZWFkeUVycm9yKFwib3BlbmFpXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgICByZXVzZUlucHV0OiBkZWNpc2lvbi5yZXVzZUlucHV0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIC8vIOydtOuvuOyngCDtlIzrnpjqt7jrpbwg7KCE64us7ZW07JW8IGdlbmVyYXRlU3RyZWFtIOydmCBub24tc3RyZWFtIOyghOyaqSDqsbDrtoAoUjIp6rCAIOuwnOuPme2VnOuLpC5cbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogY2Iub25EZWx0YSxcbiAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dCh0dXJuUmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbiksXG4gICAgICAgICAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogY2Iub25FcnJvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgaWYgKCF0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcImFudGhyb3BpY1wiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICAgIHtcbiAgICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgICAgb25UaHJlYWRJZDogY2Iub25UaHJlYWRJZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgICAgIGNiLm9uQ29tcGxldGUoXG4gICAgICAgICAgICAgIGFwcGx5VG9vbENhbGxFbXVsYXRpb24odG9FbXVsYXRpb25SZXN1bHQodHVyblJlc3VsdCksIGlucHV0LnRvb2xzLCB7XG4gICAgICAgICAgICAgICAgdGhyZWFkQ29vcmQ6IGlzc3VlZENvb3JkLFxuICAgICAgICAgICAgICAgIGFuc3dlcktpbmQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvdmlkZXJSb3V0ZShtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyBwcm92aWRlcj86IHN0cmluZzsgbW9kZWw6IHN0cmluZyB9IHtcbiAgaWYgKCFtb2RlbD8uaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgcmV0dXJuIHsgbW9kZWw6IG1vZGVsID8/IFwiXCIgfTtcbiAgfVxuXG4gIGNvbnN0IFtwcm92aWRlciwgcm91dGVkTW9kZWxdID0gbW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICBpZiAoIXByb3ZpZGVyIHx8ICFyb3V0ZWRNb2RlbCkgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInVua25vd24gbW9kZWxcIik7XG4gIHJldHVybiB7IHByb3ZpZGVyLCBtb2RlbDogcm91dGVkTW9kZWwgfTtcbn1cblxuLy8gcWdyaWQgcHJvdmlkZXIgZGlzcGF0Y2hlciDsl5DshJwg7LKY66as7ZWY7KeAIOyViuuKlCDrqqjrjbjsnYAg7Zal7ZuEIOyngeygkSBMTE0gQVBJIO2YuOy2nCDsp4DsoJDsnLzroZwg67O064K464ukLlxuZnVuY3Rpb24gZGlyZWN0TGxtQXBpRmFsbGJhY2tOb3RJbXBsZW1lbnRlZChpbnB1dDogUXVlcnlJbnB1dCk6IFByb2Nlc3NFcnJvciB7XG4gIHJldHVybiBuZXcgUHJvY2Vzc0Vycm9yKFxuICAgIGBEaXJlY3QgTExNIEFQSSBmYWxsYmFjayBub3QgaW1wbGVtZW50ZWQgZm9yIG1vZGVsOiAke2lucHV0Lm1vZGVsID8/IFwiPGRlZmF1bHQ+XCJ9YCxcbiAgKTtcbn1cblxuLy8g66qo65OgIHByb3ZpZGVyKE9wZW5BSS9BbnRocm9waWMp6rCAIOuPmeydvO2VmOqyjCBzdHJpY3Qgb3V0cHV0IHNjaGVtYSDrpbwg7JO064ukLlxuLy9cbi8vIFNPTi00OTUg6rWQ7ZuIOiDtlZzrlYwgQW50aHJvcGljIHJvdXRlIOunjCByZXF1aXJlZCDrpbwg7KCc6rGwKG9wdGlvbmFsaXplKe2VtCBwYXJ0aWFsL3JlamVjdGVkIGF0dGVtcHQg6rCAXG4vLyDshJ7sl6zrj4Qg7Ya16rO87ZWY6rKMIO2WiOycvOuCmCwg7Iuk7LihIOqysOqzvCDqt7jqsowg7Jik7Z6I66CkIFwi66qo64247J20IOu5hOuKlCDtlYTrk5zrpbwg7YKk7Ke4IOyDneuetVwi7ZWY64+E66GdIOycoOuPhO2WiOuLpFxuLy8gKHJlcXVpcmVkIOyCtOumsCBzY2hlbWEg64qUIOuIhOudvSAwLCBsb29zZSDripQg64iE6529IOuLpOuwnCkuIHN0cmljdCDroZwg65GQ66m0IOuqqOuNuOydtCDruaDsp5Dsl4bsnbQg7LGE7Jqw6rOgLFxuLy8g65Oc66y86rKMIOyWtOqyqCBwcm92aWRlciByZXRyeSDsmIjsgrDsnYQg7IaM7KeE7ZWcIOu5hOygleyDgSDsooXro4zrj4Qg7KCV7KeB7ZWcIOyXkOufrOuhnCDrsJvslYTspIDri6QuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdHJpY3RPdXRwdXRTY2hlbWEoXG4gIGlucHV0OiBQaWNrPFF1ZXJ5SW5wdXQsIFwidG9vbHNcIiB8IFwianNvblNjaGVtYVwiPixcbiAgcHJvdmlkZXI/OiBzdHJpbmcsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFJhd091dHB1dFNjaGVtYShpbnB1dCk7XG5cbiAgcmV0dXJuIG91dHB1dFNjaGVtYVxuICAgID8gKHN0cmljdGlmeShvdXRwdXRTY2hlbWEgYXMgUGFyYW1ldGVyczx0eXBlb2Ygc3RyaWN0aWZ5PlswXSwgeyBwcm92aWRlciB9KSBhcyBKc29uVmFsdWUpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcIm1vZGVsXCIgfCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4gIHByb3ZpZGVyID0gcGFyc2VQcm92aWRlclJvdXRlKGlucHV0Lm1vZGVsKS5wcm92aWRlcixcbik6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0LCBwcm92aWRlcik7XG4gIHNlcmlhbGl6ZUFuZFZhbGlkYXRlRGlzcGF0Y2hTY2hlbWEob3V0cHV0U2NoZW1hLCBwcm92aWRlcik7XG4gIHJldHVybiBvdXRwdXRTY2hlbWE7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmF3T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYWxsZXJPdXRwdXRTY2hlbWEgPSBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyhpbnB1dCk7XG5cbiAgcmV0dXJuIGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICA/IGJ1aWxkVG9vbENhbGxTY2hlbWEoaW5wdXQudG9vbHMsIGNhbGxlck91dHB1dFNjaGVtYSlcbiAgICA6IGNhbGxlck91dHB1dFNjaGVtYTtcbn1cblxuLy8gR2VuZXJhdGVSZXN1bHQocHJvdmlkZXIgZGlzcGF0Y2hlciDsnZHri7Up66W8IGFwcGx5VG9vbENhbGxFbXVsYXRpb24g7J6F66ClIHNoYXBlIOuhnCDrp6TtlZHtlZzri6QuXG4vLyBPcGVuQUkvQW50aHJvcGljLCBxdWVyeS9xdWVyeVN0cmVhbSA0IOqyveuhnOqwgCDrj5nsnbztlZjqsowg7JO064ukLlxuLy8gQW50aHJvcGljIGFkYXB0ZXIg64qUIGNhY2hlIGNyZWF0aW9uIOydhCBpbnB1dFRva2VucyDsl5Ag7Y+s7ZWo7ZW0IO2RnOykgO2ZlO2VmOqzoCwg67OE64+EIO2VhOuTnOyXkOuPhCDrs7TsobTtlZzri6QuXG4vLyBwZXItcmVxdWVzdCBjb3N0IOuKlCBwcm92aWRlciDqsIAg7KSAIOqwkuydhCDsmrDshKAg7IKs7Jqp7ZWY6rOgLCDsl4bsnLzrqbQg6rO17Ya1IGNvc3Qg7ZWo7IiY66W8IOyTtOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuKTogT21pdDxRdWVyeU91dHB1dCwgXCJjb250ZW50XCIgfCBcImZpbmlzaFJlYXNvblwiIHwgXCJydW5Db250ZXh0XCI+IHtcbiAgY29uc3QgaGFzUHJvdmlkZXJDb3N0ID0gcmVzdWx0LmNvc3RVc2QgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQuY29zdFVzZCA+IDA7XG4gIHJldHVybiB7XG4gICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgdG9rZW5OYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgcmVxdWVzdGVkTW9kZWw6IHJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCxcbiAgICBtb2RlbEZhbGxiYWNrczogcmVzdWx0Lm1vZGVsRmFsbGJhY2tzLFxuICAgIHVzYWdlOiB7XG4gICAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWgsXG4gICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgIH0sXG4gICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgdHRmdE1zOiByZXN1bHQudHRmdE1zID8/IDAsXG4gICAgY29zdFVzZDogaGFzUHJvdmlkZXJDb3N0XG4gICAgICA/IHJlc3VsdC5jb3N0VXNkIVxuICAgICAgOiBjYWxjdWxhdGVDb3N0VXNkKHJlc3VsdC5tb2RlbCwge1xuICAgICAgICAgIGlucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW06IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgICB9KSxcbiAgICBjb3N0U291cmNlOiBoYXNQcm92aWRlckNvc3QgPyBcInByb3ZpZGVyXCIgOiBcInByaWNpbmdfdGFibGVcIixcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRGlzcGF0Y2hlciA9IG5ldyBRZ3JpZERpc3BhdGNoZXJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0NBLElBQWEsdUJBQWIsTUFBa0M7Q0FDaEMseUJBQVMsSUFBSSxJQUEwQjtDQUd2QyxnQ0FBZ0IsSUFBSSxJQUFvQjtDQUd4QyxhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEOzs7Ozs7Ozs7O0NBV2xELGVBQXFFO0VBQ25FLFFBQVE7RUFDUixXQUFXO0NBQ2I7Ozs7Ozs7O0NBU0EsY0FBc0IsVUFBeUM7RUFDN0QsTUFBTSxRQUFRLGFBQWEsV0FBVyxXQUFXO0VBQ2pELE9BQU8sS0FBSyxhQUFhLGNBQWMsV0FDbkMsSUFBSSw2QkFBNkIsR0FBRyx3QkFBd0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUNwRSxJQUFJLDRCQUE0QixHQUFHLDBCQUEwQixDQUFDLENBQUMsS0FBSyxDQUFDO0NBQzNFO0NBRUEsUUFBUSxNQUFzQjtFQUM1QixPQUFPLEtBQUssY0FBYyxJQUFJLElBQUksS0FBSztDQUN6QztDQUdBLFlBQVksSUFBWSxLQUF5QjtFQUMvQyxLQUFLLE9BQU8sSUFBSSxJQUFJLEdBQUc7Q0FDekI7Q0FFQSxZQUFZLElBQWtCO0VBQzVCLEtBQUssT0FBTyxPQUFPLEVBQUU7Q0FD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
256
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgcHJvdmlkZXIgZGlzcGF0Y2hlciDrnbzsmrDtjIUgKyDthqDtgbAg7LqQ7IucL+2GteqzhCDsi7HquIDthLQuXG4gKlxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBPcGVuQUkvQW50aHJvcGljIOyalOyyreydgCDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDroZzrp4wg7Iuk7ZaJXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMXG4gKiAtIGRpc3BhdGNoZXIg66+47KSA67mE64qUIOq4sOuPmSDspJEoNTAzKS/stIjquLDtmZQg7Iuk7YyoKDUwMCnroZwg6rWs67aE7ZW0IOuNmOynhOuLpFxuICovXG5cbmltcG9ydCB7IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sIFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiB9IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uLy4uL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0Rpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgY3JlYXRlRmVuY2VTdHJpcFRyYW5zZm9ybSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2ZlbmNlLXN0cmlwXCI7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBHZW5lcmF0ZVJlc3VsdCxcbiAgdHlwZSBTdHJlYW1DYWxsYmFja3MsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHBhcnNlQW5kVmFsaWRhdGVDYWxsZXJTY2hlbWFzLFxuICBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9zY2hlbWEtdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgc3RyaWN0aWZ5IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc3RyaWN0aWZpZXJcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBkZWNpZGVDb252Um91dGluZywgaXNzdWVDb252Q29udGV4dCB9IGZyb20gXCIuL2NvbnYtcm91dGluZ1wiO1xuaW1wb3J0IHtcbiAgbWFza1Rva2VuLFxuICBQcm9jZXNzRXJyb3IsXG4gIHR5cGUgUHJvdmlkZXJTdGFydHVwU3RhdGUsXG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbiAgdHlwZSBUb2tlblN0YXRzLFxufSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgY29tcG9zZVN5c3RlbVdpdGhTY2hlbWFDb250cmFjdCB9IGZyb20gXCIuL3NjaGVtYS1wcm9tcHRcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbiB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uXCI7XG5pbXBvcnQgeyBidWlsZFRvb2xDYWxsU2NoZW1hIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb24tc2NoZW1hXCI7XG5cbmV4cG9ydCBjbGFzcyBRZ3JpZERpc3BhdGNoZXJDbGFzcyB7XG4gIHRva2VucyA9IG5ldyBNYXA8bnVtYmVyLCBUb2tlblN1YnNldEE+KCk7XG5cbiAgLy8gVG9rZW5TdGF0cyBzaGFwZSDrs7TsobTsmqkuIOyLpOygnCBwcm92aWRlciDsmpTssq0g7Lm07Jq07YyF7J2AIOqwgSBkaXNwYXRjaGVyIOuhnCDsnbTrj5ntlojri6QuXG4gIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIC8vIHNvbmFtdS5jb25maWcgb25TdGFydCDsl5DshJwg7LKY66as7ZWY64qUIOuzgOyImFxuICBzdWJzY3JpYmVyOiBUb2tlblN1YnNjcmliZXIgfCBudWxsID0gbnVsbDtcbiAgb3BlbmFpRGlzcGF0Y2hlcjogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICBhbnRocm9waWNEaXNwYXRjaGVyOiBBbnRocm9waWNEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIHByb3ZpZGVyIOuzhCDquLDrj5kg7IOB7YOcLiBkaXNwYXRjaGVyIOqwgCDsl4bripQg7J207Jyg66W8IOq1rOu2hO2VmOq4sCDsnITtlbQg7ZWE7JqU7ZWY64ukIOKAlFxuICAgKiBIVFRQIOumrOyKpOuLneydgCBkaXNwYXRjaGVyIOykgOu5hOuztOuLpCDrqLzsoIAg7Je066as66+A66GcKHNvbmFtdS5jb25maWcgb25TdGFydCksXG4gICAqIOq3uCDsgqzsnbQg65Ok7Ja07JioIOyalOyyreydgCBcIuyeoOyLnCDtm4Qg65CY64qUXCIg7IOB7YOc7JmAIFwi7J6s7Iuc64+E7ZW064+EIOyViCDrkJjripRcIiDsg4Htg5zqsIAg64uk66W064ukLlxuICAgKlxuICAgKiAtIGBzdGFydGluZ2A6IOybjOy7pCBzcGF3biDspJEuIGRldjAg6riw7KSAIDI1IOybjOy7pCDDlyA1MDBtcyDqsITqsqnsnbTrnbwgMX4y67aEIOqxuOumsOuLpCDihpIg7J6s7Iuc64+EIOqwgOuKpVxuICAgKiAtIGByZWFkeWA6IOygleyDgVxuICAgKiAtIGBmYWlsZWRgOiBzdGFydCgpIOqwgCDsmIjsmbjroZwg64Gd64KoIOKGkiDsnqzsi5zrj4TtlbTrj4Qg6rCZ7J2AIOqysOqzvFxuICAgKi9cbiAgc3RhcnR1cFN0YXRlOiBSZWNvcmQ8XCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIsIFByb3ZpZGVyU3RhcnR1cFN0YXRlPiA9IHtcbiAgICBvcGVuYWk6IFwic3RhcnRpbmdcIixcbiAgICBhbnRocm9waWM6IFwic3RhcnRpbmdcIixcbiAgfTtcblxuICAvKipcbiAgICogZGlzcGF0Y2hlciDqsIAg7KSA67mE65CY7KeAIOyViuyVmOydhCDrlYwg642Y7KeIIOyYiOyZuOulvCDrp4zrk6Dri6QuXG4gICAqXG4gICAqIOq4sOuPmSDspJHsnbTrqbQgNTAzKCtSZXRyeS1BZnRlcikg7Jy866GcIOyerOyLnOuPhCDqsIDriqXtlajsnYQg7JWM66as6rOgLCDstIjquLDtmZTqsIAg7Iuk7Yyo66GcIOuBneuCrOycvOuptFxuICAgKiA1MDAg7Jy866GcIOyerOyLnOuPhOqwgCDrrLTsnZjrr7jtlajsnYQg7JWM66aw64ukLiDsnbTsoITsl5DripQg65GYIOuLpCBRdW90YUVycm9yIOyYgOuKlOuNsCwg7L+87YSwIOyGjOynhOydtFxuICAgKiDslYTri4wg7IOB7YOc66W8IOq3uOugh+qyjCDtkZztmITtlZjrqbQg7Zi47Lac7J6Q6rCAIO2GoO2BsCDrrLjsoJzroZwg7Jik7ZW07ZWY6rOgIOyerOyLnOuPhCDtjJDri6jrj4Qg66q7IO2VnOuLpC5cbiAgICovXG4gIHByaXZhdGUgbm90UmVhZHlFcnJvcihwcm92aWRlcjogXCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIpOiBFcnJvciB7XG4gICAgY29uc3QgbGFiZWwgPSBwcm92aWRlciA9PT0gXCJvcGVuYWlcIiA/IFwiT3BlbkFJXCIgOiBcIkFudGhyb3BpY1wiO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0dXBTdGF0ZVtwcm92aWRlcl0gPT09IFwiZmFpbGVkXCJcbiAgICAgID8gbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oU0QoXCJxZ3JpZC5kaXNwYXRjaGVyRmFpbGVkXCIpKGxhYmVsKSlcbiAgICAgIDogbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInFncmlkLmRpc3BhdGNoZXJTdGFydGluZ1wiKShsYWJlbCkpO1xuICB9XG5cbiAgY291bnRPZihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KG5hbWUpID8/IDA7XG4gIH1cblxuICAvLyBUb2tlblN1YnNjcmliZXIg7L2c67CxIOKAlCDsupDsi5wgbXV0YXRpb25cbiAgdXBzZXJ0Q2FjaGUoaWQ6IG51bWJlciwgcm93OiBUb2tlblN1YnNldEEpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5zZXQoaWQsIHJvdyk7XG4gIH1cblxuICByZW1vdmVDYWNoZShpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIHJlcGxhY2VDYWNoZShyb3dzOiBUb2tlblN1YnNldEFbXSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zID0gbmV3IE1hcChyb3dzLm1hcCgocikgPT4gW3IuaWQsIHJdKSk7XG4gIH1cblxuICBnZXRTdGF0cygpOiBUb2tlblN0YXRzW10ge1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbnMudmFsdWVzKCldLm1hcCgocikgPT4gKHtcbiAgICAgIHRva2VuOiBtYXNrVG9rZW4oZ2V0QWNjZXNzVG9rZW4oci5jcmVkZW50aWFscykpLFxuICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgcHJvdmlkZXI6IHIucHJvdmlkZXIsXG4gICAgICByZXF1ZXN0czogdGhpcy5jb3VudE9mKHIubmFtZSksXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnkoaW5wdXQ6IFF1ZXJ5SW5wdXQsIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICAvLyBhbnN3ZXIg7J247L2U65SpIO2MkOyglToganNvblNjaGVtYSDsnojsnLzrqbQg7IKs7Jqp7J6QIOyKpO2CpOuniCBKU09OLCDsl4bsnLzrqbQg7Y+J66y4IHN0cmluZy4gNOqwnCDrsKnstpwg7KeA7KCQ7J20IOqzteycoC5cbiAgICBjb25zdCBhbnN3ZXJLaW5kID0gaW5wdXQuanNvblNjaGVtYSA/IChcImpzb25cIiBhcyBjb25zdCkgOiAoXCJ0ZXh0XCIgYXMgY29uc3QpO1xuXG4gICAgLy8gcHJvdmlkZXIgcHJlZml4IHJvdXRpbmc6ICdvcGVuYWkvZ3B0LTUuNCcg4oaSIE9wZW5BSURpc3BhdGNoZXJcbiAgICBpZiAocm91dGUucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyB0aGlzLm5vdFJlYWR5RXJyb3IoXCJvcGVuYWlcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcGVuYWlEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgbW9kZWw6IHJvdXRlLm1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IGlucHV0LnJlYXNvbmluZ1N1bW1hcnksXG4gICAgICAgIHNlcnZpY2VUaWVyOiBpbnB1dC5zZXJ2aWNlVGllcixcbiAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICByZXVzZUlucHV0OiBkZWNpc2lvbi5yZXVzZUlucHV0LFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICB9KTtcblxuICAgICAgLy8g7J2066+47KeAIOyalOyyreydgCBjb2xkLW9ubHkoUjgp6528IOyerOyCrOyaqSDsooztkZzrpbwg67Cc6riJ7ZWY7KeAIOyViuuKlOuLpC4g7KKM7ZGc66W8IOyLpOycvOuptFxuICAgICAgLy8gc2Vzc2lvbktleSDshozruYTsnpDsnZggd2FybSDsooztkZzrpbwg7KO97J2AIOyijO2RnOuhnCDrja7slrTsjagg64uk7J2MIO2FjeyKpO2KuCB0dXJuIOydtCBjb2xkIOuhnCDrlqjslrTsp4Tri6QuXG4gICAgICBjb25zdCBjb29yZCA9IGlucHV0LmltYWdlR2VuZXJhdGlvblxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG5cbiAgICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHJlc3VsdCksIGlucHV0LnRvb2xzLCB7XG4gICAgICAgIHRocmVhZENvb3JkOiBjb29yZCxcbiAgICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgaWYgKCF0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcImFudGhyb3BpY1wiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICAvLyBBbnRocm9waWNEaXNwYXRjaGVyIOuCtOu2gOyXkOyEnCDslYzslYTshJwgcHJvdmlkZXIgcHJlZml4IOulvCBjYW5vbmljYWwgbW9kZWwg66GcIOygleq3nO2ZlO2VqFxuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIC8vIOyKpO2CpOuniC9lbnZlbG9wZSDqs4Tslb3snYAgLS1qc29uLXNjaGVtYSDrjIDsi6Agc3lzdGVtIOunkOuvuOydmCDthY3siqTtirjroZwg7JWI64K07ZWc64ukKFNPTi01MzIpLlxuICAgICAgICAvLyBvdXRwdXRTY2hlbWEg64qUIOyghOuLrO2VmOyngCDslYrripTri6Qg4oCUIGFudGhyb3BpYyDsl5DshJwg7ZWt7IOBIHVuZGVmaW5lZChVMSnsnbTrqbAsXG4gICAgICAgIC8vIENDIOuhnCDqsIDripQgLS1qc29uLXNjaGVtYSDssYTrhJAg7J6Q7LK06rCAIOuLq+2YgCDsnojsnYzsnYQg7Jes6riw7IScIOuqheyLnO2VnOuLpC5cbiAgICAgICAgc3lzdGVtUHJvbXB0OiBjb21wb3NlU3lzdGVtV2l0aFNjaGVtYUNvbnRyYWN0KGlucHV0LnN5c3RlbSwgaW5wdXQpLFxuICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFwcGx5VG9vbENhbGxFbXVsYXRpb24odG9FbXVsYXRpb25SZXN1bHQocmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgdGhyZWFkQ29vcmQ6IGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbiksXG4gICAgICAgIGFuc3dlcktpbmQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0KTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKFxuICAgIGlucHV0OiBRdWVyeUlucHV0LFxuICAgIGNiOiBTdHJlYW1DYWxsYmFja3M8UXVlcnlPdXRwdXQ+LFxuICAgIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvdXRlID0gcGFyc2VQcm92aWRlclJvdXRlKGlucHV0Lm1vZGVsKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0LCByb3V0ZS5wcm92aWRlcik7XG4gICAgLy8gYW5zd2VyIOyduOy9lOuUqSDtjJDsoJU6IGpzb25TY2hlbWEg7J6I7Jy866m0IOyCrOyaqeyekCDsiqTtgqTrp4ggSlNPTiwg7JeG7Jy866m0IO2PieusuCBzdHJpbmcuIDTqsJwg67Cp7LacIOyngOygkOydtCDqs7XsnKAuXG4gICAgY29uc3QgYW5zd2VyS2luZCA9IGlucHV0Lmpzb25TY2hlbWEgPyAoXCJqc29uXCIgYXMgY29uc3QpIDogKFwidGV4dFwiIGFzIGNvbnN0KTtcblxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcIm9wZW5haVwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBhd2FpdCB0aGlzLm9wZW5haURpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICAgIHtcbiAgICAgICAgICBtb2RlbDogcm91dGUubW9kZWwsXG4gICAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IGlucHV0LnJlYXNvbmluZ1N1bW1hcnksXG4gICAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgICByZXVzZTogZGVjaXNpb24ucmV1c2UsXG4gICAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICAvLyDsnbTrr7jsp4Ag7ZSM656Y6re466W8IOyghOuLrO2VtOyVvCBnZW5lcmF0ZVN0cmVhbSDsnZggbm9uLXN0cmVhbSDsoITsmqkg6rGw67aAKFIyKeqwgCDrsJzrj5ntlZzri6QuXG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgICAgb25UaHJlYWRJZDogY2Iub25UaHJlYWRJZCxcbiAgICAgICAgICBvblR1cm5JZDogY2Iub25UdXJuSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNiLm9uQ29tcGxldGUoXG4gICAgICAgICAgICAgIGFwcGx5VG9vbENhbGxFbXVsYXRpb24odG9FbXVsYXRpb25SZXN1bHQodHVyblJlc3VsdCksIGlucHV0LnRvb2xzLCB7XG4gICAgICAgICAgICAgICAgdGhyZWFkQ29vcmQ6IGlzc3VlQ29udkNvbnRleHQodHVyblJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pLFxuICAgICAgICAgICAgICAgIGFuc3dlcktpbmQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAocm91dGUucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIGlmICghdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyKSB0aHJvdyB0aGlzLm5vdFJlYWR5RXJyb3IoXCJhbnRocm9waWNcIik7XG5cbiAgICAgIC8vIOqzhOyVvSjsiqTtgqTrp4gvZW52ZWxvcGUp7J20IOyjvOyeheuQnCDsmpTssq3snZgg64247YOA7JeQ7IScIOy9lOuTnO2OnOyKpOulvCDrspfquLTri6QoU09OLTUzMikuXG4gICAgICAvLyDruYTsiqTtirjrprwg7LWc7KKFIO2FjeyKpO2KuOuKlCBzdHJlYW0tanNvbi1hZGFwdGVyIOydmCBzdHJpcEZlbmNlcyDqsIAg6rCZ7J2AIOyLnOunqO2LseycvOuhnFxuICAgICAgLy8g7LKY66as7ZWY66+A66GcIOuNuO2DgCDsl7DqsrDqs7wgZG9uZS50ZXh0IOqwgCDslrTquIvrgpjsp4Ag7JWK64qU64ukLiDsnbzrsJgg7YWN7Iqk7Yq4IOyalOyyreydgCDrrLTrs4Dqsr0uXG4gICAgICBjb25zdCBoYXNTY2hlbWFDb250cmFjdCA9IGlucHV0Lmpzb25TY2hlbWEgIT09IHVuZGVmaW5lZCB8fCBCb29sZWFuKGlucHV0LnRvb2xzPy5sZW5ndGgpO1xuICAgICAgY29uc3QgZmVuY2VTdHJpcCA9IGhhc1NjaGVtYUNvbnRyYWN0ID8gY3JlYXRlRmVuY2VTdHJpcFRyYW5zZm9ybSgpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZW1pdERlbHRhID0gZmVuY2VTdHJpcFxuICAgICAgICA/ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNhZmUgPSBmZW5jZVN0cmlwLnB1c2godGV4dCk7XG4gICAgICAgICAgICBpZiAoc2FmZSkgY2Iub25EZWx0YShzYWZlKTtcbiAgICAgICAgICB9XG4gICAgICAgIDogY2Iub25EZWx0YTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICAgIHtcbiAgICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgICAgLy8g7Iqk7YKk66eIL2VudmVsb3BlIOqzhOyVveydgCAtLWpzb24tc2NoZW1hIOuMgOyLoCBzeXN0ZW0g66eQ66+47J2YIO2FjeyKpO2KuOuhnCDslYjrgrTtlZzri6QoU09OLTUzMilcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGNvbXBvc2VTeXN0ZW1XaXRoU2NoZW1hQ29udHJhY3QoaW5wdXQuc3lzdGVtLCBpbnB1dCksXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIHRpbWVvdXRNczogaW5wdXQudGltZW91dCxcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogZW1pdERlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIC8vIO2ZgOuTnOuwsSDsnpTsl6wo64ur64qUIO2OnOyKpOqwgCDslYTri4jsl4jrjZggdGFpbCnrpbwgZG9uZSDsoITsl5Ag66eI7KCAIOuwqey2nO2VnOuLpCDigJRcbiAgICAgICAgICAgIC8vIOuNuO2DgOulvCDsobDrpr3tlZjripQg7YG065287J207Ja47Yq4KEVudmVsb3BlU3RyZWFtUGFyc2VyIOuTsSnsnZgg66y07IaQ7IukIOuztOyepS5cbiAgICAgICAgICAgIGNvbnN0IHJlc3QgPSBmZW5jZVN0cmlwPy5mbHVzaCgpO1xuICAgICAgICAgICAgaWYgKHJlc3QpIGNiLm9uRGVsdGEocmVzdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGlzc3VlZENvb3JkID0gaXNzdWVDb252Q29udGV4dCh0dXJuUmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICAgICAgICAgIHRocmVhZENvb3JkOiBpc3N1ZWRDb29yZCxcbiAgICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVByb3ZpZGVyUm91dGUobW9kZWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgcHJvdmlkZXI/OiBzdHJpbmc7IG1vZGVsOiBzdHJpbmcgfSB7XG4gIGlmICghbW9kZWw/LmluY2x1ZGVzKFwiL1wiKSkge1xuICAgIHJldHVybiB7IG1vZGVsOiBtb2RlbCA/PyBcIlwiIH07XG4gIH1cblxuICBjb25zdCBbcHJvdmlkZXIsIHJvdXRlZE1vZGVsXSA9IG1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcbiAgaWYgKCFwcm92aWRlciB8fCAhcm91dGVkTW9kZWwpIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ1bmtub3duIG1vZGVsXCIpO1xuICByZXR1cm4geyBwcm92aWRlciwgbW9kZWw6IHJvdXRlZE1vZGVsIH07XG59XG5cbi8vIHFncmlkIHByb3ZpZGVyIGRpc3BhdGNoZXIg7JeQ7IScIOyymOumrO2VmOyngCDslYrripQg66qo64247J2AIO2Wpe2bhCDsp4HsoJEgTExNIEFQSSDtmLjstpwg7KeA7KCQ7Jy866GcIOuztOuCuOuLpC5cbmZ1bmN0aW9uIGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQ6IFF1ZXJ5SW5wdXQpOiBQcm9jZXNzRXJyb3Ige1xuICByZXR1cm4gbmV3IFByb2Nlc3NFcnJvcihcbiAgICBgRGlyZWN0IExMTSBBUEkgZmFsbGJhY2sgbm90IGltcGxlbWVudGVkIGZvciBtb2RlbDogJHtpbnB1dC5tb2RlbCA/PyBcIjxkZWZhdWx0PlwifWAsXG4gICk7XG59XG5cbi8vIOuqqOuToCBwcm92aWRlcihPcGVuQUkvQW50aHJvcGljKeqwgCDrj5nsnbztlZjqsowgc3RyaWN0IG91dHB1dCBzY2hlbWEg66W8IOyTtOuLpC5cbi8vXG4vLyBTT04tNDk1IOq1kO2biDog7ZWc65WMIEFudGhyb3BpYyByb3V0ZSDrp4wgcmVxdWlyZWQg66W8IOygnOqxsChvcHRpb25hbGl6ZSntlbQgcGFydGlhbC9yZWplY3RlZCBhdHRlbXB0IOqwgFxuLy8g7ISe7Jes64+EIO2GteqzvO2VmOqyjCDtlojsnLzrgpgsIOyLpOy4oSDqsrDqs7wg6re46rKMIOyYpO2eiOugpCBcIuuqqOuNuOydtCDruYTripQg7ZWE65Oc66W8IO2CpOynuCDsg53rnrVcIu2VmOuPhOuhnSDsnKDrj4Ttlojri6Rcbi8vIChyZXF1aXJlZCDsgrTrprAgc2NoZW1hIOuKlCDriITrnb0gMCwgbG9vc2Ug64qUIOuIhOudvSDri6TrsJwpLiBzdHJpY3Qg66GcIOuRkOuptCDrqqjrjbjsnbQg67mg7KeQ7JeG7J20IOyxhOyasOqzoCxcbi8vIOuTnOusvOqyjCDslrTqsqggcHJvdmlkZXIgcmV0cnkg7JiI7IKw7J2EIOyGjOynhO2VnCDruYTsoJXsg4Eg7KKF66OM64+EIOygleynge2VnCDsl5Drn6zroZwg67Cb7JWE7KSA64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4gIHByb3ZpZGVyPzogc3RyaW5nLFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRSYXdPdXRwdXRTY2hlbWEoaW5wdXQpO1xuXG4gIHJldHVybiBvdXRwdXRTY2hlbWFcbiAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0sIHsgcHJvdmlkZXIgfSkgYXMgSnNvblZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJtb2RlbFwiIHwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuICBwcm92aWRlciA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCkucHJvdmlkZXIsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICAvLyBhbnRocm9waWMoU09OLTUzMik6IENDIOyXkCAtLWpzb24tc2NoZW1hIOulvCDsoITri6ztlZjsp4Ag7JWK64qU64ukIOKAlCDqsJXsoJwg7JeG64qUIOyCrO2bhCDssYTsoJDsnbRcbiAgLy8g7IaM67mE7J6QIOydmOuPhChudWxsaXNoIOyDneuetSDrk7Ep7JmAIOy2qeuPjO2VtCBDQyDrgrTrtoAg7J6s7Iuc64+EIOujqO2UhOulvCDrsJztmZTsi5zsvLDri6Qo7JmV67O1IDJ+NO2ajCxcbiAgLy8gNC43fjkuMeuwsCDstpzroKUg7LKt6rWsIOyLpOy4oSkuIOyKpO2CpOuniC9lbnZlbG9wZSDqs4Tslb3snYAg7ZSE66Gs7ZSE7Yq4IO2FjeyKpO2KuOuhnCDslYjrgrTtlZjqs6Ag7YyQ7KCV7J2AXG4gIC8vIOyGjOu5hOyekCh6b2QpL3BhcnNlRW52ZWxvcGUg6rCAIOunoeuKlOuLpC4g65Sw65287IScIHN0cmljdCDrs4DtmZjCt2FyZ3YgNjRLaUIg7KCc7ZWcIOyXhuydtCDsiJjsi6BcbiAgLy8g7JuQ7ZiV7J2YIOq1rOusuMK367O17J6h64+EKOyghOyXrSA1MTJLaUIg7ZWc64+EKeunjCDqsoDspp3tlbQgY2FsbGVyLWZhdWx0IOulvCDsobDquLDsl5Ag64+M66Ck7KSA64ukLlxuICBpZiAocHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyhpbnB1dCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0LCBwcm92aWRlcik7XG4gIHNlcmlhbGl6ZUFuZFZhbGlkYXRlRGlzcGF0Y2hTY2hlbWEob3V0cHV0U2NoZW1hLCBwcm92aWRlcik7XG4gIHJldHVybiBvdXRwdXRTY2hlbWE7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmF3T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYWxsZXJPdXRwdXRTY2hlbWEgPSBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyhpbnB1dCk7XG5cbiAgcmV0dXJuIGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICA/IGJ1aWxkVG9vbENhbGxTY2hlbWEoaW5wdXQudG9vbHMsIGNhbGxlck91dHB1dFNjaGVtYSlcbiAgICA6IGNhbGxlck91dHB1dFNjaGVtYTtcbn1cblxuLy8gR2VuZXJhdGVSZXN1bHQocHJvdmlkZXIgZGlzcGF0Y2hlciDsnZHri7Up66W8IGFwcGx5VG9vbENhbGxFbXVsYXRpb24g7J6F66ClIHNoYXBlIOuhnCDrp6TtlZHtlZzri6QuXG4vLyBPcGVuQUkvQW50aHJvcGljLCBxdWVyeS9xdWVyeVN0cmVhbSA0IOqyveuhnOqwgCDrj5nsnbztlZjqsowg7JO064ukLlxuLy8gQW50aHJvcGljIGFkYXB0ZXIg64qUIGNhY2hlIGNyZWF0aW9uIOydhCBpbnB1dFRva2VucyDsl5Ag7Y+s7ZWo7ZW0IO2RnOykgO2ZlO2VmOqzoCwg67OE64+EIO2VhOuTnOyXkOuPhCDrs7TsobTtlZzri6QuXG4vLyBwZXItcmVxdWVzdCBjb3N0IOuKlCBwcm92aWRlciDqsIAg7KSAIOqwkuydhCDsmrDshKAg7IKs7Jqp7ZWY6rOgLCDsl4bsnLzrqbQg6rO17Ya1IGNvc3Qg7ZWo7IiY66W8IOyTtOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuKTogT21pdDxRdWVyeU91dHB1dCwgXCJjb250ZW50XCIgfCBcImZpbmlzaFJlYXNvblwiIHwgXCJydW5Db250ZXh0XCI+IHtcbiAgY29uc3QgaGFzUHJvdmlkZXJDb3N0ID0gcmVzdWx0LmNvc3RVc2QgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQuY29zdFVzZCA+IDA7XG4gIHJldHVybiB7XG4gICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgdG9rZW5OYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgcmVxdWVzdGVkTW9kZWw6IHJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCxcbiAgICBtb2RlbEZhbGxiYWNrczogcmVzdWx0Lm1vZGVsRmFsbGJhY2tzLFxuICAgIHVzYWdlOiB7XG4gICAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWgsXG4gICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgIH0sXG4gICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgdHRmdE1zOiByZXN1bHQudHRmdE1zID8/IDAsXG4gICAgY29zdFVzZDogaGFzUHJvdmlkZXJDb3N0XG4gICAgICA/IHJlc3VsdC5jb3N0VXNkIVxuICAgICAgOiBjYWxjdWxhdGVDb3N0VXNkKHJlc3VsdC5tb2RlbCwge1xuICAgICAgICAgIGlucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW06IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgICB9KSxcbiAgICBjb3N0U291cmNlOiBoYXNQcm92aWRlckNvc3QgPyBcInByb3ZpZGVyXCIgOiBcInByaWNpbmdfdGFibGVcIixcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRGlzcGF0Y2hlciA9IG5ldyBRZ3JpZERpc3BhdGNoZXJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7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
@@ -750,4 +750,4 @@ function convertAnthropicUsage(raw) {
750
750
  //#endregion
751
751
  export { QgridFrame };
752
752
 
753
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3NjaGVtYS12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNSUNST19VU0QsIFJlcXVlc3RMb2dNb2RlbCB9IGZyb20gXCIuLi9yZXF1ZXN0LWxvZy9yZXF1ZXN0LWxvZy5tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0TG9nTGlzdFBhcmFtcyB9IGZyb20gXCIuLi9yZXF1ZXN0LWxvZy9yZXF1ZXN0LWxvZy50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCwgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyB9IGZyb20gXCIuLi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgVG9rZW5DcmVkZW50aWFscyB9IGZyb20gXCIuLi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBBbnRocm9waWNVc2FnZVJhdyxcbiAgYnVpbGRBdXRoVXJsLFxuICBDT05TT0xFX0NBTExCQUNLX1VSTCxcbiAgZXhjaGFuZ2VDb2RlRm9yVG9rZW5zLFxuICBmZXRjaFVzYWdlLFxuICBnZW5lcmF0ZVBLQ0UsXG4gIHJlZnJlc2hBY2Nlc3NUb2tlbixcbiAgUmVmcmVzaEZhaWxlZEVycm9yLFxufSBmcm9tIFwiLi9vYXV0aFwiO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmF0aXZlUnVuQWRtaXNzaW9uLFxuICBhZnRlclF1ZXJ5LFxuICBiZWZvcmVRdWVyeSxcbiAgZmluaXNoUnVuQWJvcnRlZCxcbiAgZmluaXNoUnVuV2l0aEVycm9yLFxufSBmcm9tIFwiLi9xZ3JpZC1ydW4tbGlmZWN5Y2xlXCI7XG5pbXBvcnQgeyBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hLCBRZ3JpZERpc3BhdGNoZXIgfSBmcm9tIFwiLi9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgQXBwZW5kU3RlcElucHV0LFxuICB0eXBlIENyZWF0ZVJ1bklucHV0LFxuICB0eXBlIEZpbmlzaFJ1bklucHV0LFxuICB0eXBlIEhlYWx0aFJlc3BvbnNlLFxuICB0eXBlIE9BdXRoU3RhcnRSZXN1bHQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG4gIHR5cGUgUWdyaWRSdW5Db250ZXh0LFxuICBTdHJlYW1FdmVudHMsXG4gIHR5cGUgVG9rZW5TdGF0cyxcbiAgdHlwZSBVc2FnZVJlc3BvbnNlLFxufSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgZGVhY3RpdmF0ZUF1dGhEZWFkVG9rZW4sIG5vdGlmeVRva2VuQWRkZWQgfSBmcm9tIFwiLi90b2tlbi1kZWF0aFwiO1xuaW1wb3J0IHsgVG9vbFNjaGVtYUNvbXBvc2l0aW9uRXJyb3IgfSBmcm9tIFwiLi90b29sLWVtdWxhdGlvbi1zY2hlbWFcIjtcblxuY29uc3QgcGVuZGluZ1N0cmVhbXMgPSBuZXcgTWFwPHN0cmluZywgUXVlcnlJbnB1dD4oKTtcblxudHlwZSBQZW5kaW5nT0F1dGggPSB7IGNvZGVWZXJpZmllcjogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHJlZGlyZWN0VXJpOiBzdHJpbmcgfTtcbmNvbnN0IE9BVVRIX1NUQVRFX1BSRUZJWCA9IFwib2F1dGg6c3RhdGU6XCI7XG5jb25zdCBPQVVUSF9TVEFURV9UVEwgPSBcIjVtXCI7XG5cbmZ1bmN0aW9uIHVuaXhTZWNvbmRzVG9Jc28oc2Vjb25kczogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdHlwZW9mIHNlY29uZHMgPT09IFwibnVtYmVyXCIgPyBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCkudG9JU09TdHJpbmcoKSA6IG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldE9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZywgZGF0YTogUGVuZGluZ09BdXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGVNYW5hZ2VyUmVmKCk7XG4gIGlmICghY2FjaGUpIHRocm93IG5ldyBFcnJvcihcIkNhY2hlTWFuYWdlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gIGF3YWl0IGNhY2hlLnNldCh7XG4gICAga2V5OiBgJHtPQVVUSF9TVEFURV9QUkVGSVh9JHtzdGF0ZX1gLFxuICAgIHZhbHVlOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICB0dGw6IE9BVVRIX1NUQVRFX1RUTCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZyk6IFByb21pc2U8UGVuZGluZ09BdXRoIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGVNYW5hZ2VyUmVmKCk7XG4gIGlmICghY2FjaGUpIHRocm93IG5ldyBFcnJvcihcIkNhY2hlTWFuYWdlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGNhY2hlLmdldDxzdHJpbmc+KHsga2V5OiBgJHtPQVVUSF9TVEFURV9QUkVGSVh9JHtzdGF0ZX1gIH0pO1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBQZW5kaW5nT0F1dGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSByZXR1cm47XG4gIGF3YWl0IGNhY2hlLmRlbGV0ZSh7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbn1cblxuLy8gT0F1dGgg7KCR7IaNIOyjvOyGjOuKlCDruIzrnbzsmrDsoIDqsIAg67O064K4IE9yaWdpbijsmrDshKApIOuYkOuKlCBIb3N0IO2XpOuNlOyXkOyEnCDtjIzsg53tlZzri6QuXG4vLyBIVFRQIGNvbnRleHQg6rCAIOyXhuuKlCDsp4HsoJEg7Zi47LacKO2FjOyKpO2KuCDrk7Ep7J2AIG51bGwg7J2EIOuwmO2ZmO2VnOuLpC5cbmZ1bmN0aW9uIGRlcml2ZVJlcXVlc3RCYXNlVXJsKCk6IHN0cmluZyB8IG51bGwge1xuICB0cnkge1xuICAgIGNvbnN0IHsgaGVhZGVycywgcmVxdWVzdCB9ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBvcmlnaW4gPSBoZWFkZXJzLm9yaWdpbjtcbiAgICBpZiAodHlwZW9mIG9yaWdpbiA9PT0gXCJzdHJpbmdcIiAmJiAvXmh0dHBzPzpcXC9cXC8vLnRlc3Qob3JpZ2luKSkge1xuICAgICAgcmV0dXJuIG9yaWdpbi5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpO1xuICAgIH1cbiAgICBjb25zdCBmb3J3YXJkZWRIb3N0ID0gaGVhZGVyc1tcIngtZm9yd2FyZGVkLWhvc3RcIl07XG4gICAgY29uc3QgaG9zdCA9IChBcnJheS5pc0FycmF5KGZvcndhcmRlZEhvc3QpID8gZm9yd2FyZGVkSG9zdFswXSA6IGZvcndhcmRlZEhvc3QpID8/IGhlYWRlcnMuaG9zdDtcbiAgICBpZiAoaG9zdCkge1xuICAgICAgY29uc3QgZm9yd2FyZGVkUHJvdG8gPSBoZWFkZXJzW1wieC1mb3J3YXJkZWQtcHJvdG9cIl07XG4gICAgICBjb25zdCBwcm90byA9XG4gICAgICAgIChBcnJheS5pc0FycmF5KGZvcndhcmRlZFByb3RvKSA/IGZvcndhcmRlZFByb3RvWzBdIDogZm9yd2FyZGVkUHJvdG8pPy5zcGxpdChcIixcIilbMF0gPz9cbiAgICAgICAgcmVxdWVzdC5wcm90b2NvbDtcbiAgICAgIHJldHVybiBgJHtwcm90b306Ly8ke2hvc3R9YDtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRpcmVjdCBmcmFtZSBjYWxsIOKAlCBIVFRQIGNvbnRleHQg7JeG7J2MXG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IExPT1BCQUNLX0hPU1ROQU1FUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiWzo6MV1cIiwgXCI6OjFcIl0pO1xuXG5mdW5jdGlvbiBpc0xvb3BiYWNrQmFzZShiYXNlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gTE9PUEJBQ0tfSE9TVE5BTUVTLmhhcyhuZXcgVVJMKGJhc2UpLmhvc3RuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8vIEFudGhyb3BpYyBPQXV0aCBjbGllbnQg64qUIHJlZGlyZWN0X3VyaSDtl4jsmqkg66qp66Gd7J2EIOqwleygnO2VnOuLpDog66Oo7ZSE67CxKGxvY2FsaG9zdCnqs7xcbi8vIOy9mOyGlCDsvZzrsLHrp4wg7ZeI7Jqp65Cc64ukLiDrlLDrnbzshJwg66Oo7ZSE67CxIOygkeyGjeydgCDsnpDrj5kg66as64uk7J2066CJ7Yq4IO2UjOuhnOyasOulvCxcbi8vIOybkOqyqSDsoJHsho3snYAg7L2Y7IaUIOy9nOuwsSArIOy9lOuTnCDrtpnsl6zrhKPquLAg7ZSM66Gc7JqwKENsYXVkZSBDb2RlIENMSSDsmYAg64+Z7J28KeulvCDsk7Tri6QuXG5mdW5jdGlvbiByZXNvbHZlT0F1dGhSZWRpcmVjdCgpOiB7IHJlZGlyZWN0VXJpOiBzdHJpbmc7IG1vZGU6IFwicmVkaXJlY3RcIiB8IFwiY29kZVwiIH0ge1xuICBjb25zdCBiYXNlID0gZGVyaXZlUmVxdWVzdEJhc2VVcmwoKTtcbiAgaWYgKGJhc2UgJiYgIWlzTG9vcGJhY2tCYXNlKGJhc2UpKSB7XG4gICAgcmV0dXJuIHsgcmVkaXJlY3RVcmk6IENPTlNPTEVfQ0FMTEJBQ0tfVVJMLCBtb2RlOiBcImNvZGVcIiB9O1xuICB9XG4gIGNvbnN0IGxvb3BiYWNrQmFzZSA9IGJhc2UgPz8gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9jZXNzLmVudi5QT1JUID8/IFwiNDQ5MDBcIn1gO1xuICByZXR1cm4geyByZWRpcmVjdFVyaTogYCR7bG9vcGJhY2tCYXNlfS9jYWxsYmFja2AsIG1vZGU6IFwicmVkaXJlY3RcIiB9O1xufVxuXG5mdW5jdGlvbiByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJnczogUXVlcnlJbnB1dCk6IHZvaWQge1xuICBpZiAoIWFyZ3MuaW1hZ2VHZW5lcmF0aW9uKSByZXR1cm47XG4gIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgIFwicWdyaWQ6IGltYWdlR2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggc3RyZWFtaW5nOyB1c2UgcXVlcnkvZ2VuZXJhdGVUZXh0IGluc3RlYWQuXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICApO1xufVxuXG5mdW5jdGlvbiByZWplY3RJbnZhbGlkQ2FsbGVyU2NoZW1hcyhhcmdzOiBRdWVyeUlucHV0KTogdm9pZCB7XG4gIGlmIChhcmdzLmpzb25TY2hlbWEgPT09IHVuZGVmaW5lZCAmJiAhYXJncy50b29scz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKGFyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yIHx8XG4gICAgICBlcnJvciBpbnN0YW5jZW9mIFRvb2xTY2hlbWFDb21wb3NpdGlvbkVycm9yXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihlcnJvci5tZXNzYWdlIGFzIExvY2FsaXplZFN0cmluZyk7XG4gICAgfVxuICAgIC8vIOyemOuqu+uQnCBrZXl3b3JkIO2Yle2DnChhbnlPZiDrpbwg6rCd7LK066GcIOuztOuCtOuKlCDrk7Ep64qUIO2MjOydtO2UhOudvOyduOyXkOyEnCB1bnR5cGVkIOyYpOulmOuhnCDrgpjsmKTrr4DroZwsXG4gICAgLy8g7YOA7J6FIOyige2eiOq4sCDrjIDsi6AgRXJyb3Ig7KCE7LK066W8IGNhbGxlci1mYXVsdCA0MDAg7Jy866GcIOunpO2Vke2VnOuLpCjqs4Tslb0g7YWM7Iqk7Yq466GcIOqzoOygleuQqCkuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBgcWdyaWQ6IGNhbGxlciBzY2hlbWEgY2Fubm90IGJlIG5vcm1hbGl6ZWQ6ICR7ZXJyb3IubWVzc2FnZX1gIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUh0dHBEaXNjb25uZWN0SGFuZGxlKCk6IHtcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgZGlzcG9zZTogKCkgPT4gdm9pZDtcbn0ge1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGxldCByZXF1ZXN0UmF3OiBGYXN0aWZ5UmVxdWVzdFtcInJhd1wiXSB8IHVuZGVmaW5lZDtcbiAgbGV0IHJlc3BvbnNlUmF3OiBGYXN0aWZ5UmVwbHlbXCJyYXdcIl0gfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIHJlcXVlc3RSYXcgPSBjdHgucmVxdWVzdD8ucmF3O1xuICAgIGlmIChjdHgudHJhbnNwb3J0ID09PSBcImh0dHBcIikgcmVzcG9uc2VSYXcgPSBjdHgucmVwbHkucmF3O1xuICB9IGNhdGNoIHtcbiAgICAvLyBEaXJlY3QgZnJhbWUgY2FsbHMgKGZvciBleGFtcGxlIHVuaXQgdGVzdHMpIGRvIG5vdCBoYXZlIGFuIEhUVFAgY29udGV4dC5cbiAgfVxuXG4gIGNvbnN0IGFib3J0ID0gKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gIGNvbnN0IGFib3J0T25JbmNvbXBsZXRlUmVzcG9uc2VDbG9zZSA9ICgpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlUmF3Py53cml0YWJsZUVuZGVkKSBhYm9ydCgpO1xuICB9O1xuXG4gIHJlcXVlc3RSYXc/Lm9uY2UoXCJhYm9ydGVkXCIsIGFib3J0KTtcbiAgcmVzcG9uc2VSYXc/Lm9uY2UoXCJjbG9zZVwiLCBhYm9ydE9uSW5jb21wbGV0ZVJlc3BvbnNlQ2xvc2UpO1xuXG4gIGlmIChyZXF1ZXN0UmF3Py5hYm9ydGVkIHx8IChyZXNwb25zZVJhdz8uZGVzdHJveWVkICYmICFyZXNwb25zZVJhdy53cml0YWJsZUVuZGVkKSkge1xuICAgIGFib3J0KCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICByZXF1ZXN0UmF3Py5yZW1vdmVMaXN0ZW5lcihcImFib3J0ZWRcIiwgYWJvcnQpO1xuICAgICAgcmVzcG9uc2VSYXc/LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgYWJvcnRPbkluY29tcGxldGVSZXNwb25zZUNsb3NlKTtcbiAgICB9LFxuICB9O1xufVxuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIl0pO1xuY29uc3Qgb2F1dGhMb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvYXV0aFwiXSk7XG5cbi8vIHBlci10b2tlbiByZWZyZXNoIGRlZHVwIOKAlCDtmozsoIQg6rK57Lmo7Jy866GcIOyduO2VnCDsgqzrp50g7Jik7YyQ7J2EIOunieuKlOuLpC5cbmNvbnN0IGluZmxpZ2h0QW50aHJvcGljUmVmcmVzaCA9IG5ldyBNYXA8bnVtYmVyLCBQcm9taXNlPHN0cmluZz4+KCk7XG5cbmNsYXNzIFFncmlkRnJhbWVDbGFzcyBleHRlbmRzIEJhc2VGcmFtZUNsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJRZ3JpZFwiKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBxdWVyeShhcmdzOiBRdWVyeUlucHV0KTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIGFzc2VydE5hdGl2ZVJ1bkFkbWlzc2lvbigpO1xuICAgIHJlamVjdEludmFsaWRDYWxsZXJTY2hlbWFzKGFyZ3MpO1xuICAgIGNvbnN0IGRpc2Nvbm5lY3QgPSBjcmVhdGVIdHRwRGlzY29ubmVjdEhhbmRsZSgpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXJncy5sb2dnZXIgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkoYXJncywgZGlzY29ubmVjdC5zaWduYWwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHJlcXVlc3RMb2dJZCwgc3RlcEluZGV4IH0gPSBhd2FpdCBiZWZvcmVRdWVyeShhcmdzKTtcbiAgICAgIGxldCByZXN1bHQ6IFF1ZXJ5T3V0cHV0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLnF1ZXJ5KGFyZ3MsIGRpc2Nvbm5lY3Quc2lnbmFsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGRpc2Nvbm5lY3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IGF3YWl0IGFmdGVyUXVlcnkocmVxdWVzdExvZ0lkLCBzdGVwSW5kZXgsIGFyZ3MsIHJlc3VsdCk7XG4gICAgICAgIGlmIChkaXNjb25uZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRvb2wtY2FsbCByZXF1ZXN0TG9nSWTsmYAgcHJvdmlkZXIgdGhyZWFkQ29vcmTripQg7ISc66GcIOuPheumveyggeycvOuhnCDsnKDsp4DtlZzri6QuXG4gICAgICAgIGNvbnN0IHRocmVhZENvb3JkID0gcmVzdWx0LnJ1bkNvbnRleHQ/LnRocmVhZENvb3JkO1xuICAgICAgICBjb25zdCBydW5Db250ZXh0ID1cbiAgICAgICAgICBsaWZlY3ljbGUucnVuQ29udGV4dCB8fCB0aHJlYWRDb29yZFxuICAgICAgICAgICAgPyB7IC4uLmxpZmVjeWNsZS5ydW5Db250ZXh0LCAuLi4odGhyZWFkQ29vcmQgPyB7IHRocmVhZENvb3JkIH0gOiB7fSkgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IC4uLnJlc3VsdCwgcnVuQ29udGV4dCB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYHF1ZXJ5IGFmdGVyUXVlcnkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICBpZiAoZGlzY29ubmVjdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocmVxdWVzdExvZ0lkLCAoZSBhcyBFcnJvcikubWVzc2FnZSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcHJvdmlkZXIg7J2R64u17J2AIOyEseqzte2WiOycvOuvgOuhnCDroZzquYUg7J6l7JWg6rCAIOyDneyEsSDqsrDqs7zrpbwg642u7Ja07JOw7KeAIOyViuuKlOuLpC5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGlzY29ubmVjdC5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHByZXBhcmVTdHJlYW0oYXJnczogUXVlcnlJbnB1dCk6IFByb21pc2U8eyBzdHJlYW1JZDogc3RyaW5nIH0+IHtcbiAgICBhc3NlcnROYXRpdmVSdW5BZG1pc3Npb24oKTtcbiAgICByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJncyk7XG4gICAgcmVqZWN0SW52YWxpZENhbGxlclNjaGVtYXMoYXJncyk7XG4gICAgY29uc3Qgc3RyZWFtSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgIHBlbmRpbmdTdHJlYW1zLnNldChzdHJlYW1JZCwgYXJncyk7XG4gICAgY29uc3QgZXhwaXJ5ID0gc2V0VGltZW91dCgoKSA9PiBwZW5kaW5nU3RyZWFtcy5kZWxldGUoc3RyZWFtSWQpLCAzMF8wMDApO1xuICAgIGV4cGlyeS51bnJlZj8uKCk7XG4gICAgcmV0dXJuIHsgc3RyZWFtSWQgfTtcbiAgfVxuXG4gIEBzdHJlYW0oeyB0eXBlOiBcInNzZVwiLCBldmVudHM6IFN0cmVhbUV2ZW50cyB9KVxuICBhc3luYyBxdWVyeVN0cmVhbShzdHJlYW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXJncyA9IHBlbmRpbmdTdHJlYW1zLmdldChzdHJlYW1JZCk7XG4gICAgcGVuZGluZ1N0cmVhbXMuZGVsZXRlKHN0cmVhbUlkKTtcbiAgICBpZiAoIWFyZ3MpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgb3IgZXhwaXJlZCBzdHJlYW1JZFwiKTtcbiAgICBhc3NlcnROYXRpdmVSdW5BZG1pc3Npb24oKTtcbiAgICByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJncyk7XG5cbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGNvbnN0IHNzZSA9IGN0eC5jcmVhdGVTU0UoU3RyZWFtRXZlbnRzKTtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdHVybklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0cmVhbVJlc3VsdDogUXVlcnlPdXRwdXQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0cmVhbUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY2xpZW50Q2xvc2VkID0gZmFsc2U7XG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgY29uc3QgaW50ZXJydXB0T3BlbkFJID0gKCkgPT4ge1xuICAgICAgaWYgKHRocmVhZElkICYmIHR1cm5JZCkge1xuICAgICAgICBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8uaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZCwgdHVybklkKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHNzZS5vbkNsb3NlKCgpID0+IHtcbiAgICAgIGNsaWVudENsb3NlZCA9IHRydWU7XG4gICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIGludGVycnVwdE9wZW5BSSgpO1xuICAgIH0pO1xuXG4gICAgbGV0IHJ1bkluZm86IHsgcmVxdWVzdExvZ0lkOiBudW1iZXI7IHN0ZXBJbmRleDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGFyZ3MubG9nZ2VyICE9PSBmYWxzZSkge1xuICAgICAgLy8gcHJvdmlkZXIg7Iuk7ZaJIOyghCBydW5uaW5nIHJvdyDsg53shLHsl5Ag7Iuk7Yyo7ZWY66m0IGxvZ2dlZCDsmpTssq3snLzroZwg7KeE7ZaJ7ZWY7KeAIOyViuuKlOuLpC5cbiAgICAgIHJ1bkluZm8gPSBhd2FpdCBiZWZvcmVRdWVyeShhcmdzKTtcbiAgICB9XG5cbiAgICAvLyBiZWZvcmVRdWVyeSBEQiDsnpHsl4Ug7KSRIGNsb3Nl66W8IOuGk+y5mOyngCDslYrqs6AgcHJvdmlkZXIg7Iuk7ZaJIOyghOyXkCDrp4jqsJDtlZzri6QuXG4gICAgaWYgKGNsaWVudENsb3NlZCB8fCBzc2UuY2xvc2VkKSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeVN0cmVhbShcbiAgICAgICAgYXJncyxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsdGE6ICh0ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNsaWVudENsb3NlZCAmJiAhc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJkZWx0YVwiLCB7IHRleHQgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblRocmVhZElkOiAoaWQpID0+IHtcbiAgICAgICAgICAgIHRocmVhZElkID0gaWQ7XG4gICAgICAgICAgICBpZiAoKGNsaWVudENsb3NlZCB8fCBzc2UuY2xvc2VkKSAmJiB0dXJuSWQpIHtcbiAgICAgICAgICAgICAgaW50ZXJydXB0T3BlbkFJKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblR1cm5JZDogKGlkKSA9PiB7XG4gICAgICAgICAgICB0dXJuSWQgPSBpZDtcbiAgICAgICAgICAgIGlmICgoY2xpZW50Q2xvc2VkIHx8IHNzZS5jbG9zZWQpICYmIHRocmVhZElkKSB7XG4gICAgICAgICAgICAgIGludGVycnVwdE9wZW5BSSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Db21wbGV0ZTogKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgc3RyZWFtRXJyb3IgPSBlcnI7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RyZWFtRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgIH1cblxuICAgIC8vIHByb3ZpZGVyIOqysOqzvOqwgCDsl4bripQgY2xvc2XripQg7KaJ7IucIGFib3J0ZWTroZwg66eI6rCQ7ZWc64ukLlxuICAgIGlmIChjbGllbnRDbG9zZWQgJiYgIXN0cmVhbVJlc3VsdCkge1xuICAgICAgaWYgKHJ1bkluZm8pIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGRpc3BhdGNoZXIg7JmE66OMIO2bhCBsaWZlY3ljbGUg7LKY66asIChhd2FpdCDslYjsoIQpXG4gICAgaWYgKHN0cmVhbVJlc3VsdCkge1xuICAgICAgLy8gZGlzcGF0Y2hlciDqsIAg7Iuk7J2AIHRocmVhZCDsnqzsgqzsmqkg7KKM7ZGc64qUIGxvZ2dlciDshKTsoJXqs7wg66y06rSA7ZWY6rKMIO2ajOyGoe2VnOuLpC5cbiAgICAgIGNvbnN0IHRocmVhZENvb3JkID0gc3RyZWFtUmVzdWx0LnJ1bkNvbnRleHQ/LnRocmVhZENvb3JkO1xuICAgICAgbGV0IHJ1bkNvbnRleHQ6IFFncmlkUnVuQ29udGV4dCB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHRocmVhZENvb3JkICE9PSB1bmRlZmluZWQgPyB7IHRocmVhZENvb3JkIH0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAocnVuSW5mbykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGNsb3NlIO2bhCDrj4TssKntlZwg6rKw6rO864+EIHN0ZXAvdXNhZ2XripQg64Ko6riw65CYLCDslYTrnpjsl5DshJwg7LWc7KKFIHN0YXR1c+ulvCBhYm9ydGVk66GcIOuNruyWtOyTtOuLpC5cbiAgICAgICAgICBjb25zdCBsaWZlY3ljbGUgPSBhd2FpdCBhZnRlclF1ZXJ5KFxuICAgICAgICAgICAgcnVuSW5mby5yZXF1ZXN0TG9nSWQsXG4gICAgICAgICAgICBydW5JbmZvLnN0ZXBJbmRleCxcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICBzdHJlYW1SZXN1bHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBydW5Db250ZXh0ID1cbiAgICAgICAgICAgIGxpZmVjeWNsZS5ydW5Db250ZXh0IHx8IHRocmVhZENvb3JkXG4gICAgICAgICAgICAgID8geyAuLi5saWZlY3ljbGUucnVuQ29udGV4dCwgLi4uKHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDoge30pIH1cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAvLyBhZnRlclF1ZXJ56rCAIOynhO2WieuQmOuKlCDsgqzsnbQgY2xpZW506rCAIOuLq+2ejCDqsr3smrAg7JmE66OMIOyDge2DnOulvCBhYm9ydGVk66GcIOuQmOuPjOumsOuLpC5cbiAgICAgICAgICBpZiAoY2xpZW50Q2xvc2VkKSB7XG4gICAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgICAgICAgIGF3YWl0IHNzZS5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYHN0cmVhbSBhZnRlclF1ZXJ5IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocnVuSW5mby5yZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCBhcmdzKTtcblxuICAgICAgICAgIGlmIChjbGllbnRDbG9zZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFjbGllbnRDbG9zZWQgJiYgIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZG9uZVwiLCB7IC4uLnN0cmVhbVJlc3VsdCwgcnVuQ29udGV4dCB9KTtcbiAgICB9IGVsc2UgaWYgKHN0cmVhbUVycm9yKSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBzdHJlYW1FcnJvci5tZXNzYWdlLCBhcmdzKTtcbiAgICAgIGlmICghY2xpZW50Q2xvc2VkICYmICFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImVycm9yXCIsIHsgbWVzc2FnZTogc3RyZWFtRXJyb3IubWVzc2FnZSB9KTtcbiAgICB9IGVsc2UgaWYgKChjbGllbnRDbG9zZWQgfHwgc3NlLmNsb3NlZCkgJiYgcnVuSW5mbykge1xuICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgfVxuXG4gICAgYXdhaXQgc3NlLmVuZCgpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGNyZWF0ZVJ1bihpbnB1dDogQ3JlYXRlUnVuSW5wdXQpOiBQcm9taXNlPHsgcmVxdWVzdExvZ0lkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJlcXVlc3RMb2dJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jcmVhdGVSdW4oe1xuICAgICAgdXNlcl9wcm9tcHQ6IGlucHV0LnVzZXJQcm9tcHQsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogaW5wdXQubW9kZWxOYW1lLFxuICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICBwcm9qZWN0X25hbWU6IGlucHV0LnByb2plY3ROYW1lLFxuICAgICAgc3lzdGVtX3Byb21wdDogaW5wdXQuc3lzdGVtUHJvbXB0LFxuICAgICAgaGlzdG9yeTogaW5wdXQuaGlzdG9yeSA/IEpTT04ucGFyc2UoaW5wdXQuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcmVxdWVzdExvZ0lkIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgYXBwZW5kU3RlcChpbnB1dDogQXBwZW5kU3RlcElucHV0KTogUHJvbWlzZTx7IHN0ZXBJZDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGVwSWQgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYXBwZW5kU3RlcChpbnB1dC5yZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0ZXBfaW5kZXg6IGlucHV0LnN0ZXBJbmRleCxcbiAgICAgIHR5cGU6IGlucHV0LnR5cGUsXG4gICAgICBtb2RlbF9uYW1lOiBpbnB1dC5tb2RlbE5hbWUsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogaW5wdXQucmVxdWVzdGVkTW9kZWxOYW1lLFxuICAgICAgZmFsbGJhY2tfY291bnQ6IGlucHV0LmZhbGxiYWNrQ291bnQsXG4gICAgICBpbnB1dF90b2tlbnM6IGlucHV0LmlucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogaW5wdXQub3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGlucHV0LmNhY2hlUmVhZFRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogaW5wdXQuY2FjaGVDcmVhdGlvblRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogaW5wdXQuY2FjaGVDcmVhdGlvbjVtVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uMWhUb2tlbnMsXG4gICAgICBjb3N0X3VzZDogaW5wdXQuY29zdFVzZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogTWF0aC5yb3VuZChpbnB1dC5jb3N0VXNkICogTUlDUk9fVVNEKSxcbiAgICAgIGNvc3Rfc291cmNlOiBpbnB1dC5jb3N0U291cmNlLFxuICAgICAgZHVyYXRpb25fbXM6IGlucHV0LmR1cmF0aW9uTXMsXG4gICAgICB0dGZ0X21zOiBpbnB1dC50dGZ0TXMgPz8gbnVsbCxcbiAgICAgIGZpbmlzaF9yZWFzb246IGlucHV0LmZpbmlzaFJlYXNvbixcbiAgICAgIHJlYXNvbmluZ190ZXh0OiBpbnB1dC5yZWFzb25pbmdUZXh0LFxuICAgICAgcmVhc29uaW5nX3Rva2VuczogaW5wdXQucmVhc29uaW5nVG9rZW5zLFxuICAgICAgdG9vbF9jYWxsX2luZGV4OiBpbnB1dC50b29sQ2FsbEluZGV4LFxuICAgICAgdG9vbF9jYWxsX2lkOiBpbnB1dC50b29sQ2FsbElkLFxuICAgICAgdG9vbF9uYW1lOiBpbnB1dC50b29sTmFtZSxcbiAgICAgIHRvb2xfYXJnczogaW5wdXQudG9vbEFyZ3MsXG4gICAgICB0b29sX3Jlc3VsdDogaW5wdXQudG9vbFJlc3VsdCxcbiAgICAgIHRvb2xfZHVyYXRpb25fbXM6IGlucHV0LnRvb2xEdXJhdGlvbk1zLFxuICAgICAgZXJyb3I6IGlucHV0LmVycm9yLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZXBJZCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGZpbmlzaFJ1bihpbnB1dDogRmluaXNoUnVuSW5wdXQpOiBQcm9taXNlPHsgb2s6IGJvb2xlYW4gfT4ge1xuICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5maW5pc2hSdW4oaW5wdXQucmVxdWVzdExvZ0lkLCB7XG4gICAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlOiBpbnB1dC5yZXNwb25zZSxcbiAgICAgIHRva2VuX25hbWU6IGlucHV0LnRva2VuTmFtZSxcbiAgICAgIG1vZGVsX25hbWU6IGlucHV0Lm1vZGVsTmFtZSxcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBpbnB1dC5yZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgICBmYWxsYmFja19jb3VudDogaW5wdXQuZmFsbGJhY2tDb3VudCxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQudG90YWxJbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IGlucHV0LnRvdGFsT3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC50b3RhbENhY2hlQ3JlYXRpb25Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvbjVtVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBpbnB1dC50b3RhbENhY2hlQ3JlYXRpb24xaFRva2VucyxcbiAgICAgIGNvc3RfdXNkOiBpbnB1dC5jb3N0VXNkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBNYXRoLnJvdW5kKGlucHV0LmNvc3RVc2QgKiBNSUNST19VU0QpLFxuICAgICAgY29zdF9zb3VyY2U6IGlucHV0LmNvc3RTb3VyY2UsXG4gICAgICBkdXJhdGlvbl9tczogaW5wdXQudG90YWxEdXJhdGlvbk1zLFxuICAgICAgaGlzdG9yeTogaW5wdXQuaGlzdG9yeSA/IEpTT04ucGFyc2UoaW5wdXQuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgICBlcnJvcl9tZXNzYWdlOiBpbnB1dC5lcnJvck1lc3NhZ2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgb2s6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8VG9rZW5TdGF0c1tdPiB7XG4gICAgcmV0dXJuIFFncmlkRGlzcGF0Y2hlci5nZXRTdGF0cygpO1xuICB9XG5cbiAgLy8g7ZmU66m07J2YIOuqqeuhnSDtlYTthLDrpbwg6re464yA66GcIOuwm+yVhCDqsJnsnYAg7KGw6rG07J2YIO2VqeqzhOulvCDrj4zroKTspIDri6Qg4oCUIOuqqeuhneqzvCDruYTsmqnsnbRcbiAgLy8g7ISc66GcIOuLpOuluCDrqqjsiJjrpbwg67O066m0IOyCrOyaqeyekOyXkOqyjOuKlCDsiKvsnpDqsIAg7Ja06riL64KcIOqyg+ycvOuhnCDsnb3tnozri6QuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHRvdGFsQ29zdChwYXJhbXM/OiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyk6IFByb21pc2U8eyB1c2Q6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHsgdXNkOiBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwudG90YWxDb3N0KHBhcmFtcykgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHByb2plY3ROYW1lcygpOiBQcm9taXNlPHsgbmFtZXM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4geyBuYW1lczogYXdhaXQgUmVxdWVzdExvZ01vZGVsLmRpc3RpbmN0UHJvamVjdE5hbWVzKCkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIG1vZGVsTmFtZXMoKTogUHJvbWlzZTx7IG5hbWVzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIHsgbmFtZXM6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5kaXN0aW5jdE1vZGVsTmFtZXMoKSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGFkZFRva2VuKFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IFRva2VuQ3JlZGVudGlhbHMsXG4gICAgbmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgYWRkZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIHByb3ZpZGVyLFxuICAgICAgICBjcmVkZW50aWFscyxcbiAgICAgICAgbmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHsgYWRkZWQ6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIl0gfSlcbiAgYXN5bmMgdXBkYXRlVG9rZW4oXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQ/OiBudW1iZXIsXG4gICk6IFByb21pc2U8eyB1cGRhdGVkOiBib29sZWFuIH0+IHtcbiAgICBpZiAoXG4gICAgICBxdW90YVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBxdW90YVRocmVzaG9sZCAhPT0gbnVsbCAmJlxuICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHF1b3RhVGhyZXNob2xkKSB8fCBxdW90YVRocmVzaG9sZCA8IDEgfHwgcXVvdGFUaHJlc2hvbGQgPiAxMDApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgXCJxdW90YVRocmVzaG9sZCBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAsIG9yIG51bGxcIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAod2VpZ2h0ICE9PSB1bmRlZmluZWQgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKHdlaWdodCkgfHwgd2VpZ2h0IDwgMSB8fCB3ZWlnaHQgPiAxMDApKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgXCJ3ZWlnaHQgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRjaDogVG9rZW5VcGRhdGVGaWVsZHMgPSB7fTtcbiAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSBwYXRjaC5uYW1lID0gbmFtZTtcbiAgICBpZiAocXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCkgcGF0Y2gucXVvdGFfdGhyZXNob2xkID0gcXVvdGFUaHJlc2hvbGQ7XG4gICAgaWYgKHdlaWdodCAhPT0gdW5kZWZpbmVkKSBwYXRjaC53ZWlnaHQgPSB3ZWlnaHQ7XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGggPT09IDApIHJldHVybiB7IHVwZGF0ZWQ6IGZhbHNlIH07XG5cbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgVG9rZW5Nb2RlbC51cGRhdGVGaWVsZHMoaWQsIHBhdGNoKTtcbiAgICByZXR1cm4geyB1cGRhdGVkOiB1cGRhdGVkID4gMCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHJlbW92ZVRva2VuKGlkOiBudW1iZXIpOiBQcm9taXNlPHsgcmVtb3ZlZDogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQgfSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIHsgcmVtb3ZlZDogZmFsc2UgfTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLmRlbChbZW50cnkuaWRdKTtcbiAgICByZXR1cm4geyByZW1vdmVkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICog7Yag7YGwIO2ZnOyEse2ZlC/ruYTtmZzshLHtmZQg7Yag6riAIERC7J2YIGFjdGl2ZSDtlYTrk5wg7JeF642w7J207Yq4XG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdG9nZ2xlVG9rZW4oaWQ6IG51bWJlcik6IFByb21pc2U8eyBhY3RpdmU6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkIH0pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IGFjdGl2ZTogZmFsc2UgfTtcblxuICAgIGNvbnN0IG5ld0FjdGl2ZSA9ICFlbnRyeS5hY3RpdmU7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3ZpZGVyOiBlbnRyeS5wcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHM6IGVudHJ5LmNyZWRlbnRpYWxzLFxuICAgICAgICBhY3RpdmU6IG5ld0FjdGl2ZSxcbiAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBuZXdBY3RpdmUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBvYXV0aFN0YXJ0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8T0F1dGhTdGFydFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgY29kZVZlcmlmaWVyLCBjb2RlQ2hhbGxlbmdlLCBzdGF0ZSB9ID0gZ2VuZXJhdGVQS0NFKCk7XG5cbiAgICBjb25zdCB7IHJlZGlyZWN0VXJpLCBtb2RlIH0gPSByZXNvbHZlT0F1dGhSZWRpcmVjdCgpO1xuICAgIGNvbnN0IGF1dGhVcmwgPSBidWlsZEF1dGhVcmwoY29kZUNoYWxsZW5nZSwgc3RhdGUsIHJlZGlyZWN0VXJpKTtcblxuICAgIGF3YWl0IHNldE9BdXRoU3RhdGUoc3RhdGUsIHsgY29kZVZlcmlmaWVyLCBuYW1lLCByZWRpcmVjdFVyaSB9KTtcblxuICAgIHJldHVybiB7IGF1dGhVcmwsIG1vZGUgfTtcbiAgfVxuXG4gIC8vIOy9lOuTnCDrtpnsl6zrhKPquLAg7ZSM66Gc7JqwKOybkOqyqSDsoJHsho0pOiDsvZjshpQg7L2c67Cx7J20IO2RnOyLnO2VnCBgY29kZSNzdGF0ZWAg66W8IOuwm+yVhCDqtZDtmZjtlZzri6QuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBvYXV0aENvbXBsZXRlKHBhc3RlZENvZGU6IHN0cmluZyk6IFByb21pc2U8eyBhZGRlZDogYm9vbGVhbjsgbmFtZTogc3RyaW5nIH0+IHtcbiAgICBjb25zdCB0cmltbWVkID0gcGFzdGVkQ29kZS50cmltKCk7XG4gICAgY29uc3Qgc2VwYXJhdG9yQXQgPSB0cmltbWVkLmluZGV4T2YoXCIjXCIpO1xuICAgIGNvbnN0IGNvZGUgPSBzZXBhcmF0b3JBdCA+IDAgPyB0cmltbWVkLnNsaWNlKDAsIHNlcGFyYXRvckF0KSA6IFwiXCI7XG4gICAgY29uc3Qgc3RhdGUgPSBzZXBhcmF0b3JBdCA+IDAgPyB0cmltbWVkLnNsaWNlKHNlcGFyYXRvckF0ICsgMSkgOiBcIlwiO1xuICAgIGlmICghY29kZSB8fCAhc3RhdGUpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBcImV4cGVjdGVkIHRoZSBjb2RlIHNob3duIGFmdGVyIGxvZ2luLCBpbiBjb2RlI3N0YXRlIGZvcm1cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmcgPSBhd2FpdCBnZXRPQXV0aFN0YXRlKHN0YXRlKTtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBcImxvZ2luIHNlc3Npb24gbm90IGZvdW5kIG9yIGV4cGlyZWQg4oCUIHN0YXJ0IHRoZSBsb2dpbiBhZ2FpblwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGRlbGV0ZU9BdXRoU3RhdGUoc3RhdGUpO1xuXG4gICAgYXdhaXQgdGhpcy5jb21wbGV0ZUFudGhyb3BpY0xvZ2luKGNvZGUsIHN0YXRlLCBwZW5kaW5nKTtcbiAgICByZXR1cm4geyBhZGRlZDogdHJ1ZSwgbmFtZTogcGVuZGluZy5uYW1lIH07XG4gIH1cblxuICAvLyDqtZDtmZggKyDqs4TsoJUg7KSR67O1IOygnOqxsCArIOyggOyepSDigJQgcmVkaXJlY3Qg7L2c67Cx6rO8IOy9lOuTnCDrtpnsl6zrhKPquLAg7ZSM66Gc7Jqw6rCAIOqzteycoO2VnOuLpC5cbiAgcHJpdmF0ZSBhc3luYyBjb21wbGV0ZUFudGhyb3BpY0xvZ2luKFxuICAgIGNvZGU6IHN0cmluZyxcbiAgICBzdGF0ZTogc3RyaW5nLFxuICAgIHBlbmRpbmc6IFBlbmRpbmdPQXV0aCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW5zID0gYXdhaXQgZXhjaGFuZ2VDb2RlRm9yVG9rZW5zKFxuICAgICAgY29kZSxcbiAgICAgIHBlbmRpbmcuY29kZVZlcmlmaWVyLFxuICAgICAgc3RhdGUsXG4gICAgICBwZW5kaW5nLnJlZGlyZWN0VXJpLFxuICAgICk7XG5cbiAgICBhd2FpdCBUb2tlbk1vZGVsLnJlcGxhY2VCeUFjY291bnQoXCJhbnRocm9waWNcIiwgdG9rZW5zLmFjY291bnRVdWlkLCB7XG4gICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzVG9rZW4sXG4gICAgICAgIHJlZnJlc2hUb2tlbjogdG9rZW5zLnJlZnJlc2hUb2tlbixcbiAgICAgICAgZXhwaXJlc0F0OiB0b2tlbnMuZXhwaXJlc0F0ID8/IDAsXG4gICAgICAgIGFjY291bnRVdWlkOiB0b2tlbnMuYWNjb3VudFV1aWQgPz8gXCJcIixcbiAgICAgIH0sXG4gICAgICBuYW1lOiBwZW5kaW5nLm5hbWUsXG4gICAgfSk7XG5cbiAgICBub3RpZnlUb2tlbkFkZGVkKHBlbmRpbmcubmFtZSwgXCJhbnRocm9waWNcIik7XG4gIH1cblxuICBhc3luYyBoYW5kbGVPQXV0aENhbGxiYWNrKGNvZGU6IHN0cmluZywgc3RhdGU6IHN0cmluZywgcmVwbHk6IEZhc3RpZnlSZXBseSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBlbmRpbmcgPSBhd2FpdCBnZXRPQXV0aFN0YXRlKHN0YXRlKTtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwib2F1dGggY2FsbGJhY2s6IGludmFsaWRfc3RhdGVcIik7XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1pbnZhbGlkX3N0YXRlXCIpO1xuICAgIH1cbiAgICBhd2FpdCBkZWxldGVPQXV0aFN0YXRlKHN0YXRlKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbXBsZXRlQW50aHJvcGljTG9naW4oY29kZSwgc3RhdGUsIHBlbmRpbmcpO1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KGAvP29hdXRoPXN1Y2Nlc3MmbmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChwZW5kaW5nLm5hbWUpfWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChgLz9vYXV0aD1lcnJvciZyZWFzb249JHtlbmNvZGVVUklDb21wb25lbnQoKGUgYXMgRXJyb3IpLm1lc3NhZ2UpfWApO1xuICAgIH1cbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBvYXV0aFN0YXJ0T3BlbkFJKG5hbWU6IHN0cmluZyk6IFByb21pc2U8T0F1dGhTdGFydFJlc3VsdD4ge1xuICAgIGlmICghUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICBjb25zdCB7IGF1dGhVcmwgfSA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyLnN0YXJ0QnJvd3NlckxvZ2luKG5hbWUpO1xuXG4gICAgLy8gZmlyZS1hbmQtZm9yZ2V0OiBjb2RleCBsb2dpbiDsmYTro4wg64yA6riwIOKGkiDthqDtgbAg7KCA7J6lXG4gICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgIC5jb21wbGV0ZUJyb3dzZXJMb2dpbigpXG4gICAgICAudGhlbihhc3luYyAoY3JlZHMpID0+IHtcbiAgICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5yZXBsYWNlQnlBY2NvdW50KFwib3BlbmFpXCIsIGNyZWRzLmFjY291bnRJZCwge1xuICAgICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogY3JlZHMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICByZWZyZXNoVG9rZW46IGNyZWRzLnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgIGlkVG9rZW46IGNyZWRzLmlkVG9rZW4sXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyZXNBdDogRGF0ZS5ub3coKSArIDEwICogMjQgKiAzNjAwICogMTAwMCxcbiAgICAgICAgICAgIGFjY291bnRJZDogY3JlZHMuYWNjb3VudElkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBPcGVuQUkgdG9rZW4gc2F2ZWQgZm9yICR7bmFtZX1gKTtcbiAgICAgICAgbm90aWZ5VG9rZW5BZGRlZChuYW1lLCBcIm9wZW5haVwiKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYE9wZW5BSSBicm93c2VyIGxvZ2luIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgYXV0aFVybCwgbW9kZTogXCJyZWRpcmVjdFwiIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB1c2FnZSh0b2tlbklkPzogbnVtYmVyKTogUHJvbWlzZTxVc2FnZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyByb3dzOiBhbGxUb2tlbnMgfSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE1hbnkoXCJBXCIpO1xuICAgIGNvbnN0IGVudHJ5ID0gdG9rZW5JZFxuICAgICAgPyBhbGxUb2tlbnMuZmluZCgoZSkgPT4gZS5pZCA9PT0gdG9rZW5JZClcbiAgICAgIDogYWxsVG9rZW5zLmZpbmRMYXN0KChlKSA9PiBlLmFjdGl2ZSAmJiBlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKTtcblxuICAgIGlmICghZW50cnkpIHJldHVybiB7IGVycm9yOiBcIk5PVF9GT1VORFwiIH07XG5cbiAgICBpZiAoZW50cnkucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghZW50cnkuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB7IHByb3ZpZGVyOiBcIm9wZW5haVwiLCBmaXZlSG91cjogbnVsbCwgc2V2ZW5EYXk6IG51bGwgfTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LmdldFJhdGVMaW1pdHNCeVRva2VuSWQoZW50cnkuaWQpO1xuICAgICAgICBjb25zdCBybCA9IHJhdz8uZGF0YS5yYXRlTGltaXRzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICAgIGZpdmVIb3VyOiBybD8ucHJpbWFyeVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdXRpbGl6YXRpb246IHJsLnByaW1hcnkudXNlZFBlcmNlbnQsXG4gICAgICAgICAgICAgICAgcmVzZXRzQXQ6IHVuaXhTZWNvbmRzVG9Jc28ocmwucHJpbWFyeS5yZXNldHNBdCksXG4gICAgICAgICAgICAgICAgd2luZG93RHVyYXRpb25NaW5zOiBybC5wcmltYXJ5LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHNldmVuRGF5OiBybD8uc2Vjb25kYXJ5XG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICB1dGlsaXphdGlvbjogcmwuc2Vjb25kYXJ5LnVzZWRQZXJjZW50LFxuICAgICAgICAgICAgICAgIHJlc2V0c0F0OiB1bml4U2Vjb25kc1RvSXNvKHJsLnNlY29uZGFyeS5yZXNldHNBdCksXG4gICAgICAgICAgICAgICAgd2luZG93RHVyYXRpb25NaW5zOiBybC5zZWNvbmRhcnkud2luZG93RHVyYXRpb25NaW5zLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgT3BlbkFJIHVzYWdlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LnByb3ZpZGVyICE9PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICByZXR1cm4geyBlcnJvcjogYHVzYWdlIEFQSSBub3Qgc3VwcG9ydGVkIGZvciBwcm92aWRlcjogJHtlbnRyeS5wcm92aWRlcn1gIH07XG4gICAgfVxuXG4gICAgbGV0IGFjY2Vzc1Rva2VuID0gZ2V0QWNjZXNzVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpO1xuICAgIGNvbnN0IGlzRXhwaXJlZCA9IGdldEV4cGlyZXNBdChlbnRyeS5jcmVkZW50aWFscykgPCBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGlzRXhwaXJlZCAmJiBnZXRSZWZyZXNoVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKGVudHJ5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb2F1dGhMb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZW50cnkubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBcInJlLWxvZ2luIHJlcXVpcmVkXCIgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByYXcgPSBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcbiAgICBpZiAocmF3LmVycm9yICYmIGdldFJlZnJlc2hUb2tlbihlbnRyeS5jcmVkZW50aWFscykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oZW50cnkpO1xuICAgICAgICBjb25zdCByZXRyaWVkID0gYXdhaXQgZmV0Y2hVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgICAgIGlmIChyZXRyaWVkLmVycm9yKSByZXR1cm4geyBlcnJvcjogcmV0cmllZC5lcnJvciB9O1xuICAgICAgICByZXR1cm4gY29udmVydEFudGhyb3BpY1VzYWdlKHJldHJpZWQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvYXV0aExvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHtlbnRyeS5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IFwicmUtbG9naW4gcmVxdWlyZWRcIiB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmF3LmVycm9yKSByZXR1cm4geyBlcnJvcjogcmF3LmVycm9yIH07XG4gICAgcmV0dXJuIGNvbnZlcnRBbnRocm9waWNVc2FnZShyYXcpO1xuICB9XG5cbiAgLy8g64+Z7IucIHJlZnJlc2gg6rCAIO2ajOyghOydhCDqsrnsuZjrqbQg65Kk64qm7J2AIO2YuOy2nOydtCDsnbTrr7gg7Y+Q6riw65CcIHJlZnJlc2ggdG9rZW4g7J2EIOyTsOqyjCDrkJjslrRcbiAgLy8g66mA7Kmh7ZWcIO2GoO2BsOydtCDsgqzrp53snLzroZwg7Jik7YyQ65Cc64ukLiBvcGVuYWktcmVmcmVzaC50cyDsmYAg6rCZ7J2AIHBlci10b2tlbiBkZWR1cCDsnYQg65GU64ukLlxuICBhc3luYyByZWZyZXNoVG9rZW4odG9rZW46IFRva2VuU3Vic2V0QSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaW5mbGlnaHQgPSBpbmZsaWdodEFudGhyb3BpY1JlZnJlc2guZ2V0KHRva2VuLmlkKTtcbiAgICBpZiAoaW5mbGlnaHQpIHJldHVybiBpbmZsaWdodDtcblxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLmRvUmVmcmVzaFRva2VuKHRva2VuKTtcbiAgICBpbmZsaWdodEFudGhyb3BpY1JlZnJlc2guc2V0KHRva2VuLmlkLCBwcm9taXNlKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGluZmxpZ2h0QW50aHJvcGljUmVmcmVzaC5kZWxldGUodG9rZW4uaWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZG9SZWZyZXNoVG9rZW4odG9rZW46IFRva2VuU3Vic2V0QSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgY3JlZHMgPSB0b2tlbi5jcmVkZW50aWFscztcbiAgICBjb25zdCBydCA9IGdldFJlZnJlc2hUb2tlbihjcmVkcyk7XG4gICAgaWYgKCFydCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVmcmVzaCB0b2tlblwiKTtcblxuICAgIGxldCByZWZyZXNoZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlZnJlc2hlZCA9IGF3YWl0IHJlZnJlc2hBY2Nlc3NUb2tlbihydCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZWZyZXNoRmFpbGVkRXJyb3IgJiYgZS5pc0F1dGhEZWFkKSB7XG4gICAgICAgIGF3YWl0IGRlYWN0aXZhdGVBdXRoRGVhZFRva2VuKHRva2VuLCBydCwgYGFudGhyb3BpYzoke2Uuc3RhdHVzfWApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVkID0gVG9rZW5DcmVkZW50aWFscy5wYXJzZSh7XG4gICAgICAuLi5jcmVkcyxcbiAgICAgIGFjY2Vzc1Rva2VuOiByZWZyZXNoZWQuYWNjZXNzVG9rZW4sXG4gICAgICByZWZyZXNoVG9rZW46IHJlZnJlc2hlZC5yZWZyZXNoVG9rZW4sXG4gICAgICBleHBpcmVzQXQ6IHJlZnJlc2hlZC5leHBpcmVzQXQsXG4gICAgfSk7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRva2VuLmlkLFxuICAgICAgICBwcm92aWRlcjogdG9rZW4ucHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiB1cGRhdGVkLFxuICAgICAgICBuYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4gcmVmcmVzaGVkLmFjY2Vzc1Rva2VuO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgaGVhbHRoKCk6IFByb21pc2U8SGVhbHRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm92aWRlcnMgPSB7IC4uLlFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUgfTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBcIm9rXCIsXG4gICAgICBhY3RpdmVUb2tlbnM6IFFncmlkRGlzcGF0Y2hlci50b2tlbnMuc2l6ZSxcbiAgICAgIHN1YnNjcmliZXI6IFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyPy5zdGF0dXMoKSA/PyBudWxsLFxuICAgICAgLy8gcHJvdmlkZXIg67OEIOudvOyasO2MheydtOudvCDtlZjrgpjrp4wg7KSA67mE64+864+EIOq3uCBwcm92aWRlciDsmpTssq3snYAg7LKY66as65Cc64ukLlxuICAgICAgcmVhZHk6IE9iamVjdC52YWx1ZXMocHJvdmlkZXJzKS5pbmNsdWRlcyhcInJlYWR5XCIpLFxuICAgICAgcHJvdmlkZXJzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRnJhbWUgPSBuZXcgUWdyaWRGcmFtZUNsYXNzKCk7XG5cbmZ1bmN0aW9uIGNvbnZlcnRBbnRocm9waWNVc2FnZShyYXc6IEFudGhyb3BpY1VzYWdlUmF3KTogVXNhZ2VSZXNwb25zZSB7XG4gIHJldHVybiB7XG4gICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgZml2ZUhvdXI6IHJhdy5maXZlX2hvdXJcbiAgICAgID8geyB1dGlsaXphdGlvbjogcmF3LmZpdmVfaG91ci51dGlsaXphdGlvbiwgcmVzZXRzQXQ6IHJhdy5maXZlX2hvdXIucmVzZXRzX2F0IH1cbiAgICAgIDogbnVsbCxcbiAgICBzZXZlbkRheTogcmF3LnNldmVuX2RheVxuICAgICAgPyB7IHV0aWxpemF0aW9uOiByYXcuc2V2ZW5fZGF5LnV0aWxpemF0aW9uLCByZXNldHNBdDogcmF3LnNldmVuX2RheS5yZXNldHNfYXQgfVxuICAgICAgOiBudWxsLFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxREEsTUFBTSxp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
753
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3NjaGVtYS12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNSUNST19VU0QsIFJlcXVlc3RMb2dNb2RlbCB9IGZyb20gXCIuLi9yZXF1ZXN0LWxvZy9yZXF1ZXN0LWxvZy5tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0TG9nTGlzdFBhcmFtcyB9IGZyb20gXCIuLi9yZXF1ZXN0LWxvZy9yZXF1ZXN0LWxvZy50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCwgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyB9IGZyb20gXCIuLi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgVG9rZW5DcmVkZW50aWFscyB9IGZyb20gXCIuLi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBBbnRocm9waWNVc2FnZVJhdyxcbiAgYnVpbGRBdXRoVXJsLFxuICBDT05TT0xFX0NBTExCQUNLX1VSTCxcbiAgZXhjaGFuZ2VDb2RlRm9yVG9rZW5zLFxuICBmZXRjaFVzYWdlLFxuICBnZW5lcmF0ZVBLQ0UsXG4gIHJlZnJlc2hBY2Nlc3NUb2tlbixcbiAgUmVmcmVzaEZhaWxlZEVycm9yLFxufSBmcm9tIFwiLi9vYXV0aFwiO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmF0aXZlUnVuQWRtaXNzaW9uLFxuICBhZnRlclF1ZXJ5LFxuICBiZWZvcmVRdWVyeSxcbiAgZmluaXNoUnVuQWJvcnRlZCxcbiAgZmluaXNoUnVuV2l0aEVycm9yLFxufSBmcm9tIFwiLi9xZ3JpZC1ydW4tbGlmZWN5Y2xlXCI7XG5pbXBvcnQgeyBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hLCBRZ3JpZERpc3BhdGNoZXIgfSBmcm9tIFwiLi9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgQXBwZW5kU3RlcElucHV0LFxuICB0eXBlIENyZWF0ZVJ1bklucHV0LFxuICB0eXBlIEZpbmlzaFJ1bklucHV0LFxuICB0eXBlIEhlYWx0aFJlc3BvbnNlLFxuICB0eXBlIE9BdXRoU3RhcnRSZXN1bHQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG4gIHR5cGUgUWdyaWRSdW5Db250ZXh0LFxuICBTdHJlYW1FdmVudHMsXG4gIHR5cGUgVG9rZW5TdGF0cyxcbiAgdHlwZSBVc2FnZVJlc3BvbnNlLFxufSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgZGVhY3RpdmF0ZUF1dGhEZWFkVG9rZW4sIG5vdGlmeVRva2VuQWRkZWQgfSBmcm9tIFwiLi90b2tlbi1kZWF0aFwiO1xuaW1wb3J0IHsgVG9vbFNjaGVtYUNvbXBvc2l0aW9uRXJyb3IgfSBmcm9tIFwiLi90b29sLWVtdWxhdGlvbi1zY2hlbWFcIjtcblxuY29uc3QgcGVuZGluZ1N0cmVhbXMgPSBuZXcgTWFwPHN0cmluZywgUXVlcnlJbnB1dD4oKTtcblxudHlwZSBQZW5kaW5nT0F1dGggPSB7IGNvZGVWZXJpZmllcjogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHJlZGlyZWN0VXJpOiBzdHJpbmcgfTtcbmNvbnN0IE9BVVRIX1NUQVRFX1BSRUZJWCA9IFwib2F1dGg6c3RhdGU6XCI7XG5jb25zdCBPQVVUSF9TVEFURV9UVEwgPSBcIjVtXCI7XG5cbmZ1bmN0aW9uIHVuaXhTZWNvbmRzVG9Jc28oc2Vjb25kczogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdHlwZW9mIHNlY29uZHMgPT09IFwibnVtYmVyXCIgPyBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCkudG9JU09TdHJpbmcoKSA6IG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldE9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZywgZGF0YTogUGVuZGluZ09BdXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGVNYW5hZ2VyUmVmKCk7XG4gIGlmICghY2FjaGUpIHRocm93IG5ldyBFcnJvcihcIkNhY2hlTWFuYWdlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gIGF3YWl0IGNhY2hlLnNldCh7XG4gICAga2V5OiBgJHtPQVVUSF9TVEFURV9QUkVGSVh9JHtzdGF0ZX1gLFxuICAgIHZhbHVlOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICB0dGw6IE9BVVRIX1NUQVRFX1RUTCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZyk6IFByb21pc2U8UGVuZGluZ09BdXRoIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGVNYW5hZ2VyUmVmKCk7XG4gIGlmICghY2FjaGUpIHRocm93IG5ldyBFcnJvcihcIkNhY2hlTWFuYWdlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGNhY2hlLmdldDxzdHJpbmc+KHsga2V5OiBgJHtPQVVUSF9TVEFURV9QUkVGSVh9JHtzdGF0ZX1gIH0pO1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBQZW5kaW5nT0F1dGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSByZXR1cm47XG4gIGF3YWl0IGNhY2hlLmRlbGV0ZSh7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbn1cblxuLy8gT0F1dGgg7KCR7IaNIOyjvOyGjOuKlCDruIzrnbzsmrDsoIDqsIAg67O064K4IE9yaWdpbijsmrDshKApIOuYkOuKlCBIb3N0IO2XpOuNlOyXkOyEnCDtjIzsg53tlZzri6QuXG4vLyBIVFRQIGNvbnRleHQg6rCAIOyXhuuKlCDsp4HsoJEg7Zi47LacKO2FjOyKpO2KuCDrk7Ep7J2AIG51bGwg7J2EIOuwmO2ZmO2VnOuLpC5cbmZ1bmN0aW9uIGRlcml2ZVJlcXVlc3RCYXNlVXJsKCk6IHN0cmluZyB8IG51bGwge1xuICB0cnkge1xuICAgIGNvbnN0IHsgaGVhZGVycywgcmVxdWVzdCB9ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBvcmlnaW4gPSBoZWFkZXJzLm9yaWdpbjtcbiAgICBpZiAodHlwZW9mIG9yaWdpbiA9PT0gXCJzdHJpbmdcIiAmJiAvXmh0dHBzPzpcXC9cXC8vLnRlc3Qob3JpZ2luKSkge1xuICAgICAgcmV0dXJuIG9yaWdpbi5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpO1xuICAgIH1cbiAgICBjb25zdCBmb3J3YXJkZWRIb3N0ID0gaGVhZGVyc1tcIngtZm9yd2FyZGVkLWhvc3RcIl07XG4gICAgY29uc3QgaG9zdCA9IChBcnJheS5pc0FycmF5KGZvcndhcmRlZEhvc3QpID8gZm9yd2FyZGVkSG9zdFswXSA6IGZvcndhcmRlZEhvc3QpID8/IGhlYWRlcnMuaG9zdDtcbiAgICBpZiAoaG9zdCkge1xuICAgICAgY29uc3QgZm9yd2FyZGVkUHJvdG8gPSBoZWFkZXJzW1wieC1mb3J3YXJkZWQtcHJvdG9cIl07XG4gICAgICBjb25zdCBwcm90byA9XG4gICAgICAgIChBcnJheS5pc0FycmF5KGZvcndhcmRlZFByb3RvKSA/IGZvcndhcmRlZFByb3RvWzBdIDogZm9yd2FyZGVkUHJvdG8pPy5zcGxpdChcIixcIilbMF0gPz9cbiAgICAgICAgcmVxdWVzdC5wcm90b2NvbDtcbiAgICAgIHJldHVybiBgJHtwcm90b306Ly8ke2hvc3R9YDtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRpcmVjdCBmcmFtZSBjYWxsIOKAlCBIVFRQIGNvbnRleHQg7JeG7J2MXG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IExPT1BCQUNLX0hPU1ROQU1FUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiWzo6MV1cIiwgXCI6OjFcIl0pO1xuXG5mdW5jdGlvbiBpc0xvb3BiYWNrQmFzZShiYXNlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gTE9PUEJBQ0tfSE9TVE5BTUVTLmhhcyhuZXcgVVJMKGJhc2UpLmhvc3RuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8vIEFudGhyb3BpYyBPQXV0aCBjbGllbnQg64qUIHJlZGlyZWN0X3VyaSDtl4jsmqkg66qp66Gd7J2EIOqwleygnO2VnOuLpDog66Oo7ZSE67CxKGxvY2FsaG9zdCnqs7xcbi8vIOy9mOyGlCDsvZzrsLHrp4wg7ZeI7Jqp65Cc64ukLiDrlLDrnbzshJwg66Oo7ZSE67CxIOygkeyGjeydgCDsnpDrj5kg66as64uk7J2066CJ7Yq4IO2UjOuhnOyasOulvCxcbi8vIOybkOqyqSDsoJHsho3snYAg7L2Y7IaUIOy9nOuwsSArIOy9lOuTnCDrtpnsl6zrhKPquLAg7ZSM66Gc7JqwKENsYXVkZSBDb2RlIENMSSDsmYAg64+Z7J28KeulvCDsk7Tri6QuXG5mdW5jdGlvbiByZXNvbHZlT0F1dGhSZWRpcmVjdCgpOiB7IHJlZGlyZWN0VXJpOiBzdHJpbmc7IG1vZGU6IFwicmVkaXJlY3RcIiB8IFwiY29kZVwiIH0ge1xuICBjb25zdCBiYXNlID0gZGVyaXZlUmVxdWVzdEJhc2VVcmwoKTtcbiAgaWYgKGJhc2UgJiYgIWlzTG9vcGJhY2tCYXNlKGJhc2UpKSB7XG4gICAgcmV0dXJuIHsgcmVkaXJlY3RVcmk6IENPTlNPTEVfQ0FMTEJBQ0tfVVJMLCBtb2RlOiBcImNvZGVcIiB9O1xuICB9XG4gIGNvbnN0IGxvb3BiYWNrQmFzZSA9IGJhc2UgPz8gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9jZXNzLmVudi5QT1JUID8/IFwiNDQ5MDBcIn1gO1xuICByZXR1cm4geyByZWRpcmVjdFVyaTogYCR7bG9vcGJhY2tCYXNlfS9jYWxsYmFja2AsIG1vZGU6IFwicmVkaXJlY3RcIiB9O1xufVxuXG5mdW5jdGlvbiByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJnczogUXVlcnlJbnB1dCk6IHZvaWQge1xuICBpZiAoIWFyZ3MuaW1hZ2VHZW5lcmF0aW9uKSByZXR1cm47XG4gIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgIFwicWdyaWQ6IGltYWdlR2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggc3RyZWFtaW5nOyB1c2UgcXVlcnkvZ2VuZXJhdGVUZXh0IGluc3RlYWQuXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICApO1xufVxuXG4vLyBhbnRocm9waWMg7J2AIC0tanNvbi1zY2hlbWEg66W8IOyTsOyngCDslYrsnLzrr4DroZwoU09OLTUzMikgc3RyaWN0IOuzgO2ZmMK3YXJndiDsoJztlZwg7JeG7J20IOybkO2YleydmFxuLy8g6rWs66y4wrfrs7XsnqHrj4Trp4wg6rKA7Kad65Cc64ukIOKAlCBwcm92aWRlciDrtoTquLDripQgYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYSDqsIAg7IaM7Jyg7ZWc64ukLlxuZnVuY3Rpb24gcmVqZWN0SW52YWxpZENhbGxlclNjaGVtYXMoYXJnczogUXVlcnlJbnB1dCk6IHZvaWQge1xuICBpZiAoYXJncy5qc29uU2NoZW1hID09PSB1bmRlZmluZWQgJiYgIWFyZ3MudG9vbHM/Lmxlbmd0aCkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShhcmdzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciB8fFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvclxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oZXJyb3IubWVzc2FnZSBhcyBMb2NhbGl6ZWRTdHJpbmcpO1xuICAgIH1cbiAgICAvLyDsnpjrqrvrkJwga2V5d29yZCDtmJXtg5woYW55T2Yg66W8IOqwneyytOuhnCDrs7TrgrTripQg65OxKeuKlCDtjIzsnbTtlITrnbzsnbjsl5DshJwgdW50eXBlZCDsmKTrpZjroZwg64KY7Jik66+A66GcLFxuICAgIC8vIO2DgOyehSDsooHtnojquLAg64yA7IugIEVycm9yIOyghOyytOulvCBjYWxsZXItZmF1bHQgNDAwIOycvOuhnCDrp6TtlZHtlZzri6Qo6rOE7JW9IO2FjOyKpO2KuOuhnCDqs6DsoJXrkKgpLlxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgYHFncmlkOiBjYWxsZXIgc2NoZW1hIGNhbm5vdCBiZSBub3JtYWxpemVkOiAke2Vycm9yLm1lc3NhZ2V9YCBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVIdHRwRGlzY29ubmVjdEhhbmRsZSgpOiB7XG4gIHNpZ25hbDogQWJvcnRTaWduYWw7XG4gIGRpc3Bvc2U6ICgpID0+IHZvaWQ7XG59IHtcbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBsZXQgcmVxdWVzdFJhdzogRmFzdGlmeVJlcXVlc3RbXCJyYXdcIl0gfCB1bmRlZmluZWQ7XG4gIGxldCByZXNwb25zZVJhdzogRmFzdGlmeVJlcGx5W1wicmF3XCJdIHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY3R4ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICByZXF1ZXN0UmF3ID0gY3R4LnJlcXVlc3Q/LnJhdztcbiAgICBpZiAoY3R4LnRyYW5zcG9ydCA9PT0gXCJodHRwXCIpIHJlc3BvbnNlUmF3ID0gY3R4LnJlcGx5LnJhdztcbiAgfSBjYXRjaCB7XG4gICAgLy8gRGlyZWN0IGZyYW1lIGNhbGxzIChmb3IgZXhhbXBsZSB1bml0IHRlc3RzKSBkbyBub3QgaGF2ZSBhbiBIVFRQIGNvbnRleHQuXG4gIH1cblxuICBjb25zdCBhYm9ydCA9ICgpID0+IGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICBjb25zdCBhYm9ydE9uSW5jb21wbGV0ZVJlc3BvbnNlQ2xvc2UgPSAoKSA9PiB7XG4gICAgaWYgKCFyZXNwb25zZVJhdz8ud3JpdGFibGVFbmRlZCkgYWJvcnQoKTtcbiAgfTtcblxuICByZXF1ZXN0UmF3Py5vbmNlKFwiYWJvcnRlZFwiLCBhYm9ydCk7XG4gIHJlc3BvbnNlUmF3Py5vbmNlKFwiY2xvc2VcIiwgYWJvcnRPbkluY29tcGxldGVSZXNwb25zZUNsb3NlKTtcblxuICBpZiAocmVxdWVzdFJhdz8uYWJvcnRlZCB8fCAocmVzcG9uc2VSYXc/LmRlc3Ryb3llZCAmJiAhcmVzcG9uc2VSYXcud3JpdGFibGVFbmRlZCkpIHtcbiAgICBhYm9ydCgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgcmVxdWVzdFJhdz8ucmVtb3ZlTGlzdGVuZXIoXCJhYm9ydGVkXCIsIGFib3J0KTtcbiAgICAgIHJlc3BvbnNlUmF3Py5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsIGFib3J0T25JbmNvbXBsZXRlUmVzcG9uc2VDbG9zZSk7XG4gICAgfSxcbiAgfTtcbn1cblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCJdKTtcbmNvbnN0IG9hdXRoTG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwib2F1dGhcIl0pO1xuXG4vLyBwZXItdG9rZW4gcmVmcmVzaCBkZWR1cCDigJQg7ZqM7KCEIOqyuey5qOycvOuhnCDsnbjtlZwg7IKs66edIOyYpO2MkOydhCDrp4nripTri6QuXG5jb25zdCBpbmZsaWdodEFudGhyb3BpY1JlZnJlc2ggPSBuZXcgTWFwPG51bWJlciwgUHJvbWlzZTxzdHJpbmc+PigpO1xuXG5jbGFzcyBRZ3JpZEZyYW1lQ2xhc3MgZXh0ZW5kcyBCYXNlRnJhbWVDbGFzcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiUWdyaWRcIik7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcXVlcnkoYXJnczogUXVlcnlJbnB1dCk6IFByb21pc2U8UXVlcnlPdXRwdXQ+IHtcbiAgICBhc3NlcnROYXRpdmVSdW5BZG1pc3Npb24oKTtcbiAgICByZWplY3RJbnZhbGlkQ2FsbGVyU2NoZW1hcyhhcmdzKTtcbiAgICBjb25zdCBkaXNjb25uZWN0ID0gY3JlYXRlSHR0cERpc2Nvbm5lY3RIYW5kbGUoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGFyZ3MubG9nZ2VyID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUWdyaWREaXNwYXRjaGVyLnF1ZXJ5KGFyZ3MsIGRpc2Nvbm5lY3Quc2lnbmFsKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyByZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCB9ID0gYXdhaXQgYmVmb3JlUXVlcnkoYXJncyk7XG4gICAgICBsZXQgcmVzdWx0OiBRdWVyeU91dHB1dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeShhcmdzLCBkaXNjb25uZWN0LnNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkaXNjb25uZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihyZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBsaWZlY3ljbGUgPSBhd2FpdCBhZnRlclF1ZXJ5KHJlcXVlc3RMb2dJZCwgc3RlcEluZGV4LCBhcmdzLCByZXN1bHQpO1xuICAgICAgICBpZiAoZGlzY29ubmVjdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0b29sLWNhbGwgcmVxdWVzdExvZ0lk7JmAIHByb3ZpZGVyIHRocmVhZENvb3Jk64qUIOyEnOuhnCDrj4Xrpr3soIHsnLzroZwg7Jyg7KeA7ZWc64ukLlxuICAgICAgICBjb25zdCB0aHJlYWRDb29yZCA9IHJlc3VsdC5ydW5Db250ZXh0Py50aHJlYWRDb29yZDtcbiAgICAgICAgY29uc3QgcnVuQ29udGV4dCA9XG4gICAgICAgICAgbGlmZWN5Y2xlLnJ1bkNvbnRleHQgfHwgdGhyZWFkQ29vcmRcbiAgICAgICAgICAgID8geyAuLi5saWZlY3ljbGUucnVuQ29udGV4dCwgLi4uKHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDoge30pIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyAuLi5yZXN1bHQsIHJ1bkNvbnRleHQgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBxdWVyeSBhZnRlclF1ZXJ5IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgaWYgKGRpc2Nvbm5lY3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHByb3ZpZGVyIOydkeuLteydgCDshLHqs7XtlojsnLzrr4DroZwg66Gc6rmFIOyepeyVoOqwgCDsg53shLEg6rKw6rO866W8IOuNruyWtOyTsOyngCDslYrripTri6QuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc2Nvbm5lY3QuZGlzcG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBwcmVwYXJlU3RyZWFtKGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHsgc3RyZWFtSWQ6IHN0cmluZyB9PiB7XG4gICAgYXNzZXJ0TmF0aXZlUnVuQWRtaXNzaW9uKCk7XG4gICAgcmVqZWN0SW1hZ2VHZW5lcmF0aW9uU3RyZWFtKGFyZ3MpO1xuICAgIHJlamVjdEludmFsaWRDYWxsZXJTY2hlbWFzKGFyZ3MpO1xuICAgIGNvbnN0IHN0cmVhbUlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBwZW5kaW5nU3RyZWFtcy5zZXQoc3RyZWFtSWQsIGFyZ3MpO1xuICAgIGNvbnN0IGV4cGlyeSA9IHNldFRpbWVvdXQoKCkgPT4gcGVuZGluZ1N0cmVhbXMuZGVsZXRlKHN0cmVhbUlkKSwgMzBfMDAwKTtcbiAgICBleHBpcnkudW5yZWY/LigpO1xuICAgIHJldHVybiB7IHN0cmVhbUlkIH07XG4gIH1cblxuICBAc3RyZWFtKHsgdHlwZTogXCJzc2VcIiwgZXZlbnRzOiBTdHJlYW1FdmVudHMgfSlcbiAgYXN5bmMgcXVlcnlTdHJlYW0oc3RyZWFtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFyZ3MgPSBwZW5kaW5nU3RyZWFtcy5nZXQoc3RyZWFtSWQpO1xuICAgIHBlbmRpbmdTdHJlYW1zLmRlbGV0ZShzdHJlYW1JZCk7XG4gICAgaWYgKCFhcmdzKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIG9yIGV4cGlyZWQgc3RyZWFtSWRcIik7XG4gICAgYXNzZXJ0TmF0aXZlUnVuQWRtaXNzaW9uKCk7XG4gICAgcmVqZWN0SW1hZ2VHZW5lcmF0aW9uU3RyZWFtKGFyZ3MpO1xuXG4gICAgY29uc3QgY3R4ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBzc2UgPSBjdHguY3JlYXRlU1NFKFN0cmVhbUV2ZW50cyk7XG4gICAgbGV0IHRocmVhZElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHR1cm5JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1SZXN1bHQ6IFF1ZXJ5T3V0cHV0IHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1FcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNsaWVudENsb3NlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGNvbnN0IGludGVycnVwdE9wZW5BSSA9ICgpID0+IHtcbiAgICAgIGlmICh0aHJlYWRJZCAmJiB0dXJuSWQpIHtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LmludGVycnVwdFdvcmtlclR1cm4odGhyZWFkSWQsIHR1cm5JZCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzc2Uub25DbG9zZSgoKSA9PiB7XG4gICAgICBjbGllbnRDbG9zZWQgPSB0cnVlO1xuICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBpbnRlcnJ1cHRPcGVuQUkoKTtcbiAgICB9KTtcblxuICAgIGxldCBydW5JbmZvOiB7IHJlcXVlc3RMb2dJZDogbnVtYmVyOyBzdGVwSW5kZXg6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgIGlmIChhcmdzLmxvZ2dlciAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIHByb3ZpZGVyIOyLpO2WiSDsoIQgcnVubmluZyByb3cg7IOd7ISx7JeQIOyLpO2MqO2VmOuptCBsb2dnZWQg7JqU7LKt7Jy866GcIOynhO2Wie2VmOyngCDslYrripTri6QuXG4gICAgICBydW5JbmZvID0gYXdhaXQgYmVmb3JlUXVlcnkoYXJncyk7XG4gICAgfVxuXG4gICAgLy8gYmVmb3JlUXVlcnkgREIg7J6R7JeFIOykkSBjbG9zZeulvCDrhpPsuZjsp4Ag7JWK6rOgIHByb3ZpZGVyIOyLpO2WiSDsoITsl5Ag66eI6rCQ7ZWc64ukLlxuICAgIGlmIChjbGllbnRDbG9zZWQgfHwgc3NlLmNsb3NlZCkge1xuICAgICAgaWYgKHJ1bkluZm8pIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnlTdHJlYW0oXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiAodGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjbGllbnRDbG9zZWQgJiYgIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZGVsdGFcIiwgeyB0ZXh0IH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25UaHJlYWRJZDogKGlkKSA9PiB7XG4gICAgICAgICAgICB0aHJlYWRJZCA9IGlkO1xuICAgICAgICAgICAgaWYgKChjbGllbnRDbG9zZWQgfHwgc3NlLmNsb3NlZCkgJiYgdHVybklkKSB7XG4gICAgICAgICAgICAgIGludGVycnVwdE9wZW5BSSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25UdXJuSWQ6IChpZCkgPT4ge1xuICAgICAgICAgICAgdHVybklkID0gaWQ7XG4gICAgICAgICAgICBpZiAoKGNsaWVudENsb3NlZCB8fCBzc2UuY2xvc2VkKSAmJiB0aHJlYWRJZCkge1xuICAgICAgICAgICAgICBpbnRlcnJ1cHRPcGVuQUkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ29tcGxldGU6IChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHN0cmVhbVJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgIHN0cmVhbUVycm9yID0gZXJyO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0cmVhbUVycm9yID0gZSBhcyBFcnJvcjtcbiAgICB9XG5cbiAgICAvLyBwcm92aWRlciDqsrDqs7zqsIAg7JeG64qUIGNsb3Nl64qUIOymieyLnCBhYm9ydGVk66GcIOuniOqwkO2VnOuLpC5cbiAgICBpZiAoY2xpZW50Q2xvc2VkICYmICFzdHJlYW1SZXN1bHQpIHtcbiAgICAgIGlmIChydW5JbmZvKSBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgIGF3YWl0IHNzZS5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBkaXNwYXRjaGVyIOyZhOujjCDtm4QgbGlmZWN5Y2xlIOyymOumrCAoYXdhaXQg7JWI7KCEKVxuICAgIGlmIChzdHJlYW1SZXN1bHQpIHtcbiAgICAgIC8vIGRpc3BhdGNoZXIg6rCAIOyLpOydgCB0aHJlYWQg7J6s7IKs7JqpIOyijO2RnOuKlCBsb2dnZXIg7ISk7KCV6rO8IOustOq0gO2VmOqyjCDtmozshqHtlZzri6QuXG4gICAgICBjb25zdCB0aHJlYWRDb29yZCA9IHN0cmVhbVJlc3VsdC5ydW5Db250ZXh0Py50aHJlYWRDb29yZDtcbiAgICAgIGxldCBydW5Db250ZXh0OiBRZ3JpZFJ1bkNvbnRleHQgfCB1bmRlZmluZWQgPVxuICAgICAgICB0aHJlYWRDb29yZCAhPT0gdW5kZWZpbmVkID8geyB0aHJlYWRDb29yZCB9IDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHJ1bkluZm8pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBjbG9zZSDtm4Qg64+E7LCp7ZWcIOqysOqzvOuPhCBzdGVwL3VzYWdl64qUIOuCqOq4sOuQmCwg7JWE656Y7JeQ7IScIOy1nOyihSBzdGF0dXPrpbwgYWJvcnRlZOuhnCDrja7slrTsk7Tri6QuXG4gICAgICAgICAgY29uc3QgbGlmZWN5Y2xlID0gYXdhaXQgYWZ0ZXJRdWVyeShcbiAgICAgICAgICAgIHJ1bkluZm8ucmVxdWVzdExvZ0lkLFxuICAgICAgICAgICAgcnVuSW5mby5zdGVwSW5kZXgsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgc3RyZWFtUmVzdWx0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuQ29udGV4dCA9XG4gICAgICAgICAgICBsaWZlY3ljbGUucnVuQ29udGV4dCB8fCB0aHJlYWRDb29yZFxuICAgICAgICAgICAgICA/IHsgLi4ubGlmZWN5Y2xlLnJ1bkNvbnRleHQsIC4uLih0aHJlYWRDb29yZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHt9KSB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgLy8gYWZ0ZXJRdWVyeeqwgCDsp4TtlonrkJjripQg7IKs7J20IGNsaWVudOqwgCDri6vtnowg6rK97JqwIOyZhOujjCDsg4Htg5zrpbwgYWJvcnRlZOuhnCDrkJjrj4zrprDri6QuXG4gICAgICAgICAgaWYgKGNsaWVudENsb3NlZCkge1xuICAgICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICAgICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBzdHJlYW0gYWZ0ZXJRdWVyeSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCAoZSBhcyBFcnJvcikubWVzc2FnZSwgYXJncyk7XG5cbiAgICAgICAgICBpZiAoY2xpZW50Q2xvc2VkKSB7XG4gICAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgICAgICAgIGF3YWl0IHNzZS5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghY2xpZW50Q2xvc2VkICYmICFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImRvbmVcIiwgeyAuLi5zdHJlYW1SZXN1bHQsIHJ1bkNvbnRleHQgfSk7XG4gICAgfSBlbHNlIGlmIChzdHJlYW1FcnJvcikge1xuICAgICAgaWYgKHJ1bkluZm8pIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihydW5JbmZvLnJlcXVlc3RMb2dJZCwgc3RyZWFtRXJyb3IubWVzc2FnZSwgYXJncyk7XG4gICAgICBpZiAoIWNsaWVudENsb3NlZCAmJiAhc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJlcnJvclwiLCB7IG1lc3NhZ2U6IHN0cmVhbUVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfSBlbHNlIGlmICgoY2xpZW50Q2xvc2VkIHx8IHNzZS5jbG9zZWQpICYmIHJ1bkluZm8pIHtcbiAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgIH1cblxuICAgIGF3YWl0IHNzZS5lbmQoKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBjcmVhdGVSdW4oaW5wdXQ6IENyZWF0ZVJ1bklucHV0KTogUHJvbWlzZTx7IHJlcXVlc3RMb2dJZDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCByZXF1ZXN0TG9nSWQgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY3JlYXRlUnVuKHtcbiAgICAgIHVzZXJfcHJvbXB0OiBpbnB1dC51c2VyUHJvbXB0LFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IGlucHV0Lm1vZGVsTmFtZSxcbiAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgcHJvamVjdF9uYW1lOiBpbnB1dC5wcm9qZWN0TmFtZSxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IGlucHV0LnN5c3RlbVByb21wdCxcbiAgICAgIGhpc3Rvcnk6IGlucHV0Lmhpc3RvcnkgPyBKU09OLnBhcnNlKGlucHV0Lmhpc3RvcnkpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHJlcXVlc3RMb2dJZCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGFwcGVuZFN0ZXAoaW5wdXQ6IEFwcGVuZFN0ZXBJbnB1dCk6IFByb21pc2U8eyBzdGVwSWQ6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RlcElkID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAoaW5wdXQucmVxdWVzdExvZ0lkLCB7XG4gICAgICBzdGVwX2luZGV4OiBpbnB1dC5zdGVwSW5kZXgsXG4gICAgICB0eXBlOiBpbnB1dC50eXBlLFxuICAgICAgbW9kZWxfbmFtZTogaW5wdXQubW9kZWxOYW1lLFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IGlucHV0LnJlcXVlc3RlZE1vZGVsTmFtZSxcbiAgICAgIGZhbGxiYWNrX2NvdW50OiBpbnB1dC5mYWxsYmFja0NvdW50LFxuICAgICAgaW5wdXRfdG9rZW5zOiBpbnB1dC5pbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IGlucHV0Lm91dHB1dFRva2VucyxcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBpbnB1dC5jYWNoZVJlYWRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGlucHV0LmNhY2hlQ3JlYXRpb25Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IGlucHV0LmNhY2hlQ3JlYXRpb241bVRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogaW5wdXQuY2FjaGVDcmVhdGlvbjFoVG9rZW5zLFxuICAgICAgY29zdF91c2Q6IGlucHV0LmNvc3RVc2QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE1hdGgucm91bmQoaW5wdXQuY29zdFVzZCAqIE1JQ1JPX1VTRCksXG4gICAgICBjb3N0X3NvdXJjZTogaW5wdXQuY29zdFNvdXJjZSxcbiAgICAgIGR1cmF0aW9uX21zOiBpbnB1dC5kdXJhdGlvbk1zLFxuICAgICAgdHRmdF9tczogaW5wdXQudHRmdE1zID8/IG51bGwsXG4gICAgICBmaW5pc2hfcmVhc29uOiBpbnB1dC5maW5pc2hSZWFzb24sXG4gICAgICByZWFzb25pbmdfdGV4dDogaW5wdXQucmVhc29uaW5nVGV4dCxcbiAgICAgIHJlYXNvbmluZ190b2tlbnM6IGlucHV0LnJlYXNvbmluZ1Rva2VucyxcbiAgICAgIHRvb2xfY2FsbF9pbmRleDogaW5wdXQudG9vbENhbGxJbmRleCxcbiAgICAgIHRvb2xfY2FsbF9pZDogaW5wdXQudG9vbENhbGxJZCxcbiAgICAgIHRvb2xfbmFtZTogaW5wdXQudG9vbE5hbWUsXG4gICAgICB0b29sX2FyZ3M6IGlucHV0LnRvb2xBcmdzLFxuICAgICAgdG9vbF9yZXN1bHQ6IGlucHV0LnRvb2xSZXN1bHQsXG4gICAgICB0b29sX2R1cmF0aW9uX21zOiBpbnB1dC50b29sRHVyYXRpb25NcyxcbiAgICAgIGVycm9yOiBpbnB1dC5lcnJvcixcbiAgICB9KTtcbiAgICByZXR1cm4geyBzdGVwSWQgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBmaW5pc2hSdW4oaW5wdXQ6IEZpbmlzaFJ1bklucHV0KTogUHJvbWlzZTx7IG9rOiBib29sZWFuIH0+IHtcbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKGlucHV0LnJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RhdHVzOiBpbnB1dC5zdGF0dXMsXG4gICAgICByZXNwb25zZTogaW5wdXQucmVzcG9uc2UsXG4gICAgICB0b2tlbl9uYW1lOiBpbnB1dC50b2tlbk5hbWUsXG4gICAgICBtb2RlbF9uYW1lOiBpbnB1dC5tb2RlbE5hbWUsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogaW5wdXQucmVxdWVzdGVkTW9kZWxOYW1lLFxuICAgICAgZmFsbGJhY2tfY291bnQ6IGlucHV0LmZhbGxiYWNrQ291bnQsXG4gICAgICBpbnB1dF90b2tlbnM6IGlucHV0LnRvdGFsSW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBpbnB1dC50b3RhbE91dHB1dFRva2VucyxcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBpbnB1dC50b3RhbENhY2hlUmVhZFRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogaW5wdXQudG90YWxDYWNoZUNyZWF0aW9uVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBpbnB1dC50b3RhbENhY2hlQ3JlYXRpb241bVRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogaW5wdXQudG90YWxDYWNoZUNyZWF0aW9uMWhUb2tlbnMsXG4gICAgICBjb3N0X3VzZDogaW5wdXQuY29zdFVzZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogTWF0aC5yb3VuZChpbnB1dC5jb3N0VXNkICogTUlDUk9fVVNEKSxcbiAgICAgIGNvc3Rfc291cmNlOiBpbnB1dC5jb3N0U291cmNlLFxuICAgICAgZHVyYXRpb25fbXM6IGlucHV0LnRvdGFsRHVyYXRpb25NcyxcbiAgICAgIGhpc3Rvcnk6IGlucHV0Lmhpc3RvcnkgPyBKU09OLnBhcnNlKGlucHV0Lmhpc3RvcnkpIDogdW5kZWZpbmVkLFxuICAgICAgZXJyb3JfbWVzc2FnZTogaW5wdXQuZXJyb3JNZXNzYWdlLFxuICAgIH0pO1xuICAgIHJldHVybiB7IG9rOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBzdGF0cygpOiBQcm9taXNlPFRva2VuU3RhdHNbXT4ge1xuICAgIHJldHVybiBRZ3JpZERpc3BhdGNoZXIuZ2V0U3RhdHMoKTtcbiAgfVxuXG4gIC8vIO2ZlOuptOydmCDrqqnroZ0g7ZWE7YSw66W8IOq3uOuMgOuhnCDrsJvslYQg6rCZ7J2AIOyhsOqxtOydmCDtlanqs4Trpbwg64+M66Ck7KSA64ukIOKAlCDrqqnroZ3qs7wg67mE7Jqp7J20XG4gIC8vIOyEnOuhnCDri6Trpbgg66qo7IiY66W8IOuztOuptCDsgqzsmqnsnpDsl5DqsozripQg7Iir7J6Q6rCAIOyWtOq4i+uCnCDqsoPsnLzroZwg7J297Z6M64ukLlxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB0b3RhbENvc3QocGFyYW1zPzogUmVxdWVzdExvZ0xpc3RQYXJhbXMpOiBQcm9taXNlPHsgdXNkOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB7IHVzZDogYXdhaXQgUmVxdWVzdExvZ01vZGVsLnRvdGFsQ29zdChwYXJhbXMpIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBwcm9qZWN0TmFtZXMoKTogUHJvbWlzZTx7IG5hbWVzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIHsgbmFtZXM6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5kaXN0aW5jdFByb2plY3ROYW1lcygpIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBtb2RlbE5hbWVzKCk6IFByb21pc2U8eyBuYW1lczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiB7IG5hbWVzOiBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZGlzdGluY3RNb2RlbE5hbWVzKCkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhZGRUb2tlbihcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGFkZGVkOiBib29sZWFuIH0+IHtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBwcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHMsXG4gICAgICAgIG5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFkZGVkOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCJdIH0pXG4gIGFzeW5jIHVwZGF0ZVRva2VuKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0PzogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgdXBkYXRlZDogYm9vbGVhbiB9PiB7XG4gICAgaWYgKFxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IG51bGwgJiZcbiAgICAgICghTnVtYmVyLmlzSW50ZWdlcihxdW90YVRocmVzaG9sZCkgfHwgcXVvdGFUaHJlc2hvbGQgPCAxIHx8IHF1b3RhVGhyZXNob2xkID4gMTAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwicXVvdGFUaHJlc2hvbGQgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwLCBvciBudWxsXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHdlaWdodCAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzSW50ZWdlcih3ZWlnaHQpIHx8IHdlaWdodCA8IDEgfHwgd2VpZ2h0ID4gMTAwKSkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwid2VpZ2h0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMFwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0Y2g6IFRva2VuVXBkYXRlRmllbGRzID0ge307XG4gICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkgcGF0Y2gubmFtZSA9IG5hbWU7XG4gICAgaWYgKHF1b3RhVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHBhdGNoLnF1b3RhX3RocmVzaG9sZCA9IHF1b3RhVGhyZXNob2xkO1xuICAgIGlmICh3ZWlnaHQgIT09IHVuZGVmaW5lZCkgcGF0Y2gud2VpZ2h0ID0gd2VpZ2h0O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoID09PSAwKSByZXR1cm4geyB1cGRhdGVkOiBmYWxzZSB9O1xuXG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IFRva2VuTW9kZWwudXBkYXRlRmllbGRzKGlkLCBwYXRjaCk7XG4gICAgcmV0dXJuIHsgdXBkYXRlZDogdXBkYXRlZCA+IDAgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW1vdmVUb2tlbihpZDogbnVtYmVyKTogUHJvbWlzZTx7IHJlbW92ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkIH0pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IHJlbW92ZWQ6IGZhbHNlIH07XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwoW2VudHJ5LmlkXSk7XG4gICAgcmV0dXJuIHsgcmVtb3ZlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIO2GoO2BsCDtmZzshLHtmZQv67mE7Zmc7ISx7ZmUIO2GoOq4gCBEQuydmCBhY3RpdmUg7ZWE65OcIOyXheuNsOydtO2KuFxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHRvZ2dsZVRva2VuKGlkOiBudW1iZXIpOiBQcm9taXNlPHsgYWN0aXZlOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyBhY3RpdmU6IGZhbHNlIH07XG5cbiAgICBjb25zdCBuZXdBY3RpdmUgPSAhZW50cnkuYWN0aXZlO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkLFxuICAgICAgICBwcm92aWRlcjogZW50cnkucHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBlbnRyeS5jcmVkZW50aWFscyxcbiAgICAgICAgYWN0aXZlOiBuZXdBY3RpdmUsXG4gICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFjdGl2ZTogbmV3QWN0aXZlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhTdGFydChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoU3RhcnRSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGNvZGVWZXJpZmllciwgY29kZUNoYWxsZW5nZSwgc3RhdGUgfSA9IGdlbmVyYXRlUEtDRSgpO1xuXG4gICAgY29uc3QgeyByZWRpcmVjdFVyaSwgbW9kZSB9ID0gcmVzb2x2ZU9BdXRoUmVkaXJlY3QoKTtcbiAgICBjb25zdCBhdXRoVXJsID0gYnVpbGRBdXRoVXJsKGNvZGVDaGFsbGVuZ2UsIHN0YXRlLCByZWRpcmVjdFVyaSk7XG5cbiAgICBhd2FpdCBzZXRPQXV0aFN0YXRlKHN0YXRlLCB7IGNvZGVWZXJpZmllciwgbmFtZSwgcmVkaXJlY3RVcmkgfSk7XG5cbiAgICByZXR1cm4geyBhdXRoVXJsLCBtb2RlIH07XG4gIH1cblxuICAvLyDsvZTrk5wg67aZ7Jes64Sj6riwIO2UjOuhnOyasCjsm5Dqsqkg7KCR7IaNKTog7L2Y7IaUIOy9nOuwseydtCDtkZzsi5ztlZwgYGNvZGUjc3RhdGVgIOulvCDrsJvslYQg6rWQ7ZmY7ZWc64ukLlxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhDb21wbGV0ZShwYXN0ZWRDb2RlOiBzdHJpbmcpOiBQcm9taXNlPHsgYWRkZWQ6IGJvb2xlYW47IG5hbWU6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHBhc3RlZENvZGUudHJpbSgpO1xuICAgIGNvbnN0IHNlcGFyYXRvckF0ID0gdHJpbW1lZC5pbmRleE9mKFwiI1wiKTtcbiAgICBjb25zdCBjb2RlID0gc2VwYXJhdG9yQXQgPiAwID8gdHJpbW1lZC5zbGljZSgwLCBzZXBhcmF0b3JBdCkgOiBcIlwiO1xuICAgIGNvbnN0IHN0YXRlID0gc2VwYXJhdG9yQXQgPiAwID8gdHJpbW1lZC5zbGljZShzZXBhcmF0b3JBdCArIDEpIDogXCJcIjtcbiAgICBpZiAoIWNvZGUgfHwgIXN0YXRlKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgXCJleHBlY3RlZCB0aGUgY29kZSBzaG93biBhZnRlciBsb2dpbiwgaW4gY29kZSNzdGF0ZSBmb3JtXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgZ2V0T0F1dGhTdGF0ZShzdGF0ZSk7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgXCJsb2dpbiBzZXNzaW9uIG5vdCBmb3VuZCBvciBleHBpcmVkIOKAlCBzdGFydCB0aGUgbG9naW4gYWdhaW5cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cbiAgICBhd2FpdCBkZWxldGVPQXV0aFN0YXRlKHN0YXRlKTtcblxuICAgIGF3YWl0IHRoaXMuY29tcGxldGVBbnRocm9waWNMb2dpbihjb2RlLCBzdGF0ZSwgcGVuZGluZyk7XG4gICAgcmV0dXJuIHsgYWRkZWQ6IHRydWUsIG5hbWU6IHBlbmRpbmcubmFtZSB9O1xuICB9XG5cbiAgLy8g6rWQ7ZmYICsg6rOE7KCVIOykkeuztSDsoJzqsbAgKyDsoIDsnqUg4oCUIHJlZGlyZWN0IOy9nOuwseqzvCDsvZTrk5wg67aZ7Jes64Sj6riwIO2UjOuhnOyasOqwgCDqs7XsnKDtlZzri6QuXG4gIHByaXZhdGUgYXN5bmMgY29tcGxldGVBbnRocm9waWNMb2dpbihcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgc3RhdGU6IHN0cmluZyxcbiAgICBwZW5kaW5nOiBQZW5kaW5nT0F1dGgsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IGV4Y2hhbmdlQ29kZUZvclRva2VucyhcbiAgICAgIGNvZGUsXG4gICAgICBwZW5kaW5nLmNvZGVWZXJpZmllcixcbiAgICAgIHN0YXRlLFxuICAgICAgcGVuZGluZy5yZWRpcmVjdFVyaSxcbiAgICApO1xuXG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5yZXBsYWNlQnlBY2NvdW50KFwiYW50aHJvcGljXCIsIHRva2Vucy5hY2NvdW50VXVpZCwge1xuICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBhY2Nlc3NUb2tlbjogdG9rZW5zLmFjY2Vzc1Rva2VuLFxuICAgICAgICByZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoVG9rZW4sXG4gICAgICAgIGV4cGlyZXNBdDogdG9rZW5zLmV4cGlyZXNBdCA/PyAwLFxuICAgICAgICBhY2NvdW50VXVpZDogdG9rZW5zLmFjY291bnRVdWlkID8/IFwiXCIsXG4gICAgICB9LFxuICAgICAgbmFtZTogcGVuZGluZy5uYW1lLFxuICAgIH0pO1xuXG4gICAgbm90aWZ5VG9rZW5BZGRlZChwZW5kaW5nLm5hbWUsIFwiYW50aHJvcGljXCIpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlT0F1dGhDYWxsYmFjayhjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgZ2V0T0F1dGhTdGF0ZShzdGF0ZSk7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBsb2dnZXIud2FybihcIm9hdXRoIGNhbGxiYWNrOiBpbnZhbGlkX3N0YXRlXCIpO1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249aW52YWxpZF9zdGF0ZVwiKTtcbiAgICB9XG4gICAgYXdhaXQgZGVsZXRlT0F1dGhTdGF0ZShzdGF0ZSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb21wbGV0ZUFudGhyb3BpY0xvZ2luKGNvZGUsIHN0YXRlLCBwZW5kaW5nKTtcbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChgLz9vYXV0aD1zdWNjZXNzJm5hbWU9JHtlbmNvZGVVUklDb21wb25lbnQocGVuZGluZy5uYW1lKX1gKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9ZXJyb3ImcmVhc29uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KChlIGFzIEVycm9yKS5tZXNzYWdlKX1gKTtcbiAgICB9XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhTdGFydE9wZW5BSShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoU3RhcnRSZXN1bHQ+IHtcbiAgICBpZiAoIVFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJPcGVuQUkgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgY29uc3QgeyBhdXRoVXJsIH0gPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlci5zdGFydEJyb3dzZXJMb2dpbihuYW1lKTtcblxuICAgIC8vIGZpcmUtYW5kLWZvcmdldDogY29kZXggbG9naW4g7JmE66OMIOuMgOq4sCDihpIg7Yag7YGwIOyggOyepVxuICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyXG4gICAgICAuY29tcGxldGVCcm93c2VyTG9naW4oKVxuICAgICAgLnRoZW4oYXN5bmMgKGNyZWRzKSA9PiB7XG4gICAgICAgIGF3YWl0IFRva2VuTW9kZWwucmVwbGFjZUJ5QWNjb3VudChcIm9wZW5haVwiLCBjcmVkcy5hY2NvdW50SWQsIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICAgICAgYWNjZXNzVG9rZW46IGNyZWRzLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgcmVmcmVzaFRva2VuOiBjcmVkcy5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgICBpZFRva2VuOiBjcmVkcy5pZFRva2VuLFxuICAgICAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmVzQXQ6IERhdGUubm93KCkgKyAxMCAqIDI0ICogMzYwMCAqIDEwMDAsXG4gICAgICAgICAgICBhY2NvdW50SWQ6IGNyZWRzLmFjY291bnRJZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBsb2dnZXIuaW5mbyhgT3BlbkFJIHRva2VuIHNhdmVkIGZvciAke25hbWV9YCk7XG4gICAgICAgIG5vdGlmeVRva2VuQWRkZWQobmFtZSwgXCJvcGVuYWlcIik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBPcGVuQUkgYnJvd3NlciBsb2dpbiBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB7IGF1dGhVcmwsIG1vZGU6IFwicmVkaXJlY3RcIiB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdXNhZ2UodG9rZW5JZD86IG51bWJlcik6IFByb21pc2U8VXNhZ2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgcm93czogYWxsVG9rZW5zIH0gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRNYW55KFwiQVwiKTtcbiAgICBjb25zdCBlbnRyeSA9IHRva2VuSWRcbiAgICAgID8gYWxsVG9rZW5zLmZpbmQoKGUpID0+IGUuaWQgPT09IHRva2VuSWQpXG4gICAgICA6IGFsbFRva2Vucy5maW5kTGFzdCgoZSkgPT4gZS5hY3RpdmUgJiYgZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIik7XG5cbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyBlcnJvcjogXCJOT1RfRk9VTkRcIiB9O1xuXG4gICAgaWYgKGVudHJ5LnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIWVudHJ5LmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4geyBwcm92aWRlcjogXCJvcGVuYWlcIiwgZml2ZUhvdXI6IG51bGwsIHNldmVuRGF5OiBudWxsIH07XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5nZXRSYXRlTGltaXRzQnlUb2tlbklkKGVudHJ5LmlkKTtcbiAgICAgICAgY29uc3QgcmwgPSByYXc/LmRhdGEucmF0ZUxpbWl0cztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgICBmaXZlSG91cjogcmw/LnByaW1hcnlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHV0aWxpemF0aW9uOiBybC5wcmltYXJ5LnVzZWRQZXJjZW50LFxuICAgICAgICAgICAgICAgIHJlc2V0c0F0OiB1bml4U2Vjb25kc1RvSXNvKHJsLnByaW1hcnkucmVzZXRzQXQpLFxuICAgICAgICAgICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmwucHJpbWFyeS53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzZXZlbkRheTogcmw/LnNlY29uZGFyeVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdXRpbGl6YXRpb246IHJsLnNlY29uZGFyeS51c2VkUGVyY2VudCxcbiAgICAgICAgICAgICAgICByZXNldHNBdDogdW5peFNlY29uZHNUb0lzbyhybC5zZWNvbmRhcnkucmVzZXRzQXQpLFxuICAgICAgICAgICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmwuc2Vjb25kYXJ5LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYE9wZW5BSSB1c2FnZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeS5wcm92aWRlciAhPT0gXCJhbnRocm9waWNcIikge1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGB1c2FnZSBBUEkgbm90IHN1cHBvcnRlZCBmb3IgcHJvdmlkZXI6ICR7ZW50cnkucHJvdmlkZXJ9YCB9O1xuICAgIH1cblxuICAgIGxldCBhY2Nlc3NUb2tlbiA9IGdldEFjY2Vzc1Rva2VuKGVudHJ5LmNyZWRlbnRpYWxzKTtcbiAgICBjb25zdCBpc0V4cGlyZWQgPSBnZXRFeHBpcmVzQXQoZW50cnkuY3JlZGVudGlhbHMpIDwgRGF0ZS5ub3coKTtcblxuICAgIGlmIChpc0V4cGlyZWQgJiYgZ2V0UmVmcmVzaFRva2VuKGVudHJ5LmNyZWRlbnRpYWxzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbihlbnRyeSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9hdXRoTG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke2VudHJ5Lm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4geyBlcnJvcjogXCJyZS1sb2dpbiByZXF1aXJlZFwiIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gYXdhaXQgZmV0Y2hVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgaWYgKHJhdy5lcnJvciAmJiBnZXRSZWZyZXNoVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKGVudHJ5KTtcbiAgICAgICAgY29uc3QgcmV0cmllZCA9IGF3YWl0IGZldGNoVXNhZ2UoYWNjZXNzVG9rZW4pO1xuICAgICAgICBpZiAocmV0cmllZC5lcnJvcikgcmV0dXJuIHsgZXJyb3I6IHJldHJpZWQuZXJyb3IgfTtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRBbnRocm9waWNVc2FnZShyZXRyaWVkKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb2F1dGhMb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZW50cnkubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBcInJlLWxvZ2luIHJlcXVpcmVkXCIgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJhdy5lcnJvcikgcmV0dXJuIHsgZXJyb3I6IHJhdy5lcnJvciB9O1xuICAgIHJldHVybiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmF3KTtcbiAgfVxuXG4gIC8vIOuPmeyLnCByZWZyZXNoIOqwgCDtmozsoITsnYQg6rK57LmY66m0IOuSpOuKpuydgCDtmLjstpzsnbQg7J2066+4IO2PkOq4sOuQnCByZWZyZXNoIHRva2VuIOydhCDsk7Dqsowg65CY7Ja0XG4gIC8vIOupgOypoe2VnCDthqDtgbDsnbQg7IKs66ed7Jy866GcIOyYpO2MkOuQnOuLpC4gb3BlbmFpLXJlZnJlc2gudHMg7JmAIOqwmeydgCBwZXItdG9rZW4gZGVkdXAg7J2EIOuRlOuLpC5cbiAgYXN5bmMgcmVmcmVzaFRva2VuKHRva2VuOiBUb2tlblN1YnNldEEpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGluZmxpZ2h0ID0gaW5mbGlnaHRBbnRocm9waWNSZWZyZXNoLmdldCh0b2tlbi5pZCk7XG4gICAgaWYgKGluZmxpZ2h0KSByZXR1cm4gaW5mbGlnaHQ7XG5cbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5kb1JlZnJlc2hUb2tlbih0b2tlbik7XG4gICAgaW5mbGlnaHRBbnRocm9waWNSZWZyZXNoLnNldCh0b2tlbi5pZCwgcHJvbWlzZSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwcm9taXNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpbmZsaWdodEFudGhyb3BpY1JlZnJlc2guZGVsZXRlKHRva2VuLmlkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRvUmVmcmVzaFRva2VuKHRva2VuOiBUb2tlblN1YnNldEEpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGNyZWRzID0gdG9rZW4uY3JlZGVudGlhbHM7XG4gICAgY29uc3QgcnQgPSBnZXRSZWZyZXNoVG9rZW4oY3JlZHMpO1xuICAgIGlmICghcnQpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlZnJlc2ggdG9rZW5cIik7XG5cbiAgICBsZXQgcmVmcmVzaGVkO1xuICAgIHRyeSB7XG4gICAgICByZWZyZXNoZWQgPSBhd2FpdCByZWZyZXNoQWNjZXNzVG9rZW4ocnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgUmVmcmVzaEZhaWxlZEVycm9yICYmIGUuaXNBdXRoRGVhZCkge1xuICAgICAgICBhd2FpdCBkZWFjdGl2YXRlQXV0aERlYWRUb2tlbih0b2tlbiwgcnQsIGBhbnRocm9waWM6JHtlLnN0YXR1c31gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgY29uc3QgdXBkYXRlZCA9IFRva2VuQ3JlZGVudGlhbHMucGFyc2Uoe1xuICAgICAgLi4uY3JlZHMsXG4gICAgICBhY2Nlc3NUb2tlbjogcmVmcmVzaGVkLmFjY2Vzc1Rva2VuLFxuICAgICAgcmVmcmVzaFRva2VuOiByZWZyZXNoZWQucmVmcmVzaFRva2VuLFxuICAgICAgZXhwaXJlc0F0OiByZWZyZXNoZWQuZXhwaXJlc0F0LFxuICAgIH0pO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkOiB0b2tlbi5pZCxcbiAgICAgICAgcHJvdmlkZXI6IHRva2VuLnByb3ZpZGVyLFxuICAgICAgICBjcmVkZW50aWFsczogdXBkYXRlZCxcbiAgICAgICAgbmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHJlZnJlc2hlZC5hY2Nlc3NUb2tlbjtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIGhlYWx0aCgpOiBQcm9taXNlPEhlYWx0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvdmlkZXJzID0geyAuLi5RZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogXCJva1wiLFxuICAgICAgYWN0aXZlVG9rZW5zOiBRZ3JpZERpc3BhdGNoZXIudG9rZW5zLnNpemUsXG4gICAgICBzdWJzY3JpYmVyOiBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlcj8uc3RhdHVzKCkgPz8gbnVsbCxcbiAgICAgIC8vIHByb3ZpZGVyIOuzhCDrnbzsmrDtjIXsnbTrnbwg7ZWY64KY66eMIOykgOu5hOuPvOuPhCDqt7ggcHJvdmlkZXIg7JqU7LKt7J2AIOyymOumrOuQnOuLpC5cbiAgICAgIHJlYWR5OiBPYmplY3QudmFsdWVzKHByb3ZpZGVycykuaW5jbHVkZXMoXCJyZWFkeVwiKSxcbiAgICAgIHByb3ZpZGVycyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZEZyYW1lID0gbmV3IFFncmlkRnJhbWVDbGFzcygpO1xuXG5mdW5jdGlvbiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmF3OiBBbnRocm9waWNVc2FnZVJhdyk6IFVzYWdlUmVzcG9uc2Uge1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgIGZpdmVIb3VyOiByYXcuZml2ZV9ob3VyXG4gICAgICA/IHsgdXRpbGl6YXRpb246IHJhdy5maXZlX2hvdXIudXRpbGl6YXRpb24sIHJlc2V0c0F0OiByYXcuZml2ZV9ob3VyLnJlc2V0c19hdCB9XG4gICAgICA6IG51bGwsXG4gICAgc2V2ZW5EYXk6IHJhdy5zZXZlbl9kYXlcbiAgICAgID8geyB1dGlsaXphdGlvbjogcmF3LnNldmVuX2RheS51dGlsaXphdGlvbiwgcmVzZXRzQXQ6IHJhdy5zZXZlbl9kYXkucmVzZXRzX2F0IH1cbiAgICAgIDogbnVsbCxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcURBLE1BQU0saUNBQWlCLElBQUksSUFBd0I7QUFHbkQsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFFeEIsU0FBUyxpQkFBaUIsU0FBbUQ7Q0FDM0UsT0FBTyxPQUFPLFlBQVksNEJBQVcsSUFBSSxLQUFLLFVBQVUsR0FBSSxFQUFDLENBQUMsWUFBWSxJQUFJO0FBQ2hGO0FBRUEsZUFBZSxjQUFjLE9BQWUsTUFBbUM7Q0FDN0UsTUFBTSxRQUFRLG1CQUFtQjtDQUNqQyxJQUFJLENBQUMsT0FBTyxNQUFNLElBQUksTUFBTSw4QkFBOEI7Q0FDMUQsTUFBTSxNQUFNLElBQUk7RUFDZCxLQUFLLEdBQUcscUJBQXFCO0VBQzdCLE9BQU8sS0FBSyxVQUFVLElBQUk7RUFDMUIsS0FBSztDQUNQLENBQUM7QUFDSDtBQUVBLGVBQWUsY0FBYyxPQUFrRDtDQUM3RSxNQUFNLFFBQVEsbUJBQW1CO0NBQ2pDLElBQUksQ0FBQyxPQUFPLE1BQU0sSUFBSSxNQUFNLDhCQUE4QjtDQUMxRCxNQUFNLE1BQU0sTUFBTSxNQUFNLElBQVksRUFBRSxLQUFLLEdBQUcscUJBQXFCLFFBQVEsQ0FBQztDQUM1RSxJQUFJLENBQUMsS0FBSyxPQUFPO0NBQ2pCLE9BQU8sS0FBSyxNQUFNLEdBQUc7QUFDdkI7QUFFQSxlQUFlLGlCQUFpQixPQUE4QjtDQUM1RCxNQUFNLFFBQVEsbUJBQW1CO0NBQ2pDLElBQUksQ0FBQyxPQUFPO0NBQ1osTUFBTSxNQUFNLE9BQU8sRUFBRSxLQUFLLEdBQUcscUJBQXFCLFFBQVEsQ0FBQztBQUM3RDtBQUlBLFNB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