footprintjs 9.35.0 → 9.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/CLAUDE.md +2 -2
  2. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +3 -32
  3. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
  4. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
  5. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
  6. package/dist/esm/lib/engine/narrative/types.d.ts +1 -9
  7. package/dist/esm/lib/engine/narrative/types.js +1 -1
  8. package/dist/esm/lib/engine/types.d.ts +1 -3
  9. package/dist/esm/lib/engine/types.js +1 -1
  10. package/dist/esm/lib/memory/StageContext.d.ts +1 -17
  11. package/dist/esm/lib/memory/StageContext.js +2 -37
  12. package/dist/esm/lib/memory/runPolicy.d.ts +2 -3
  13. package/dist/esm/lib/memory/runPolicy.js +3 -4
  14. package/dist/esm/lib/recorder/CombinedRecorder.d.ts +2 -33
  15. package/dist/esm/lib/recorder/CombinedRecorder.js +10 -62
  16. package/dist/esm/lib/recorder/CompositeRecorder.d.ts +15 -26
  17. package/dist/esm/lib/recorder/CompositeRecorder.js +33 -97
  18. package/dist/esm/lib/recorder/EmitRecorder.d.ts +2 -7
  19. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  20. package/dist/esm/lib/recorder/hooks.d.ts +249 -0
  21. package/dist/esm/lib/recorder/hooks.js +132 -0
  22. package/dist/esm/lib/recorder/snapshot.d.ts +19 -0
  23. package/dist/esm/lib/recorder/snapshot.js +26 -0
  24. package/dist/esm/lib/runner/DeferredObserverTier.js +13 -23
  25. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +1 -18
  26. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -37
  27. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +4 -8
  28. package/dist/esm/lib/runner/FlowChartExecutor.js +27 -24
  29. package/dist/esm/lib/scope/ScopeFacade.d.ts +5 -0
  30. package/dist/esm/lib/scope/ScopeFacade.js +30 -52
  31. package/dist/esm/lib/scope/types.d.ts +1 -9
  32. package/dist/esm/lib/scope/types.js +1 -1
  33. package/dist/lib/engine/handlers/SubflowExecutor.js +3 -32
  34. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +24 -157
  35. package/dist/lib/engine/narrative/types.js +1 -1
  36. package/dist/lib/engine/types.js +1 -1
  37. package/dist/lib/memory/StageContext.js +1 -36
  38. package/dist/lib/memory/runPolicy.js +3 -4
  39. package/dist/lib/recorder/CombinedRecorder.js +11 -63
  40. package/dist/lib/recorder/CompositeRecorder.js +33 -97
  41. package/dist/lib/recorder/EmitRecorder.js +1 -1
  42. package/dist/lib/recorder/hooks.js +140 -0
  43. package/dist/lib/recorder/snapshot.js +30 -0
  44. package/dist/lib/runner/DeferredObserverTier.js +14 -24
  45. package/dist/lib/runner/ExecutionRuntime.js +1 -36
  46. package/dist/lib/runner/FlowChartExecutor.js +27 -24
  47. package/dist/lib/scope/ScopeFacade.js +30 -52
  48. package/dist/lib/scope/types.js +1 -1
  49. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
  50. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +3 -2
  51. package/dist/types/lib/engine/narrative/types.d.ts +1 -9
  52. package/dist/types/lib/engine/types.d.ts +1 -3
  53. package/dist/types/lib/memory/StageContext.d.ts +1 -17
  54. package/dist/types/lib/memory/runPolicy.d.ts +2 -3
  55. package/dist/types/lib/recorder/CombinedRecorder.d.ts +2 -33
  56. package/dist/types/lib/recorder/CompositeRecorder.d.ts +15 -26
  57. package/dist/types/lib/recorder/EmitRecorder.d.ts +2 -7
  58. package/dist/types/lib/recorder/hooks.d.ts +249 -0
  59. package/dist/types/lib/recorder/snapshot.d.ts +19 -0
  60. package/dist/types/lib/runner/ExecutionRuntime.d.ts +1 -18
  61. package/dist/types/lib/runner/FlowChartExecutor.d.ts +4 -8
  62. package/dist/types/lib/scope/ScopeFacade.d.ts +5 -0
  63. package/dist/types/lib/scope/types.d.ts +1 -9
  64. package/package.json +1 -1
  65. package/dist/esm/lib/recorder/invokeHook.d.ts +0 -8
  66. package/dist/esm/lib/recorder/invokeHook.js +0 -9
  67. package/dist/lib/recorder/invokeHook.js +0 -13
  68. package/dist/types/lib/recorder/invokeHook.d.ts +0 -8
@@ -42,7 +42,7 @@
42
42
  import { invokeRecorderHook } from '../capture/invokeHook.js';
43
43
  import { isDevMode } from '../devMode.js';
44
44
  import { DeferredDispatcher, } from '../observer-queue/index.js';
45
- import { EMIT_RECORDER_EVENT_METHODS, FLOW_RECORDER_EVENT_METHODS, RECORDER_EVENT_METHODS, } from '../recorder/CombinedRecorder.js';
45
+ import { describeThrown, hooksOn, operationFor } from '../recorder/hooks.js';
46
46
  /** Well-known ids of the synthetic capture taps (internal, documented for debugging). */
47
47
  export const DEFERRED_SCOPE_TAP_ID = '__deferred-scope-tap__';
48
48
  export const DEFERRED_FLOW_TAP_ID = '__deferred-flow-tap__';
@@ -50,15 +50,6 @@ export const DEFERRED_FLOW_TAP_ID = '__deferred-flow-tap__';
50
50
  const SCOPE_LIST_CHANNELS = ['scope', 'emit'];
51
51
  /** Channel reach of the flow-recorder list. */
52
52
  const FLOW_LIST_CHANNELS = ['flow'];
53
- /** Map an envelope method onto the scope error-event `operation` vocabulary
54
- * (same mapping `ScopeFacade._invokeHook` uses for inline failures). */
55
- function operationFor(method) {
56
- if (method === 'onRead')
57
- return 'read';
58
- if (method === 'onCommit')
59
- return 'commit';
60
- return 'write';
61
- }
62
53
  export class DeferredObserverTier {
63
54
  dispatcher;
64
55
  registrations = new Map();
@@ -181,15 +172,14 @@ export class DeferredObserverTier {
181
172
  if (recorders.length === 0)
182
173
  return undefined;
183
174
  const tap = { id: DEFERRED_SCOPE_TAP_ID };
184
- for (const method of RECORDER_EVENT_METHODS) {
185
- if (!this.anyImplements(recorders, method))
186
- continue;
187
- tap[method] = (event) => this.captureScopeEvent('scope', method, event);
188
- }
189
- for (const method of EMIT_RECORDER_EVENT_METHODS) {
190
- if (!this.anyImplements(recorders, method))
191
- continue;
192
- tap[method] = (event) => this.captureScopeEvent('emit', method, event);
175
+ // Derived from the hook registry: every hook of the scope channel and of the emit channel
176
+ // (which rides the scope list) — a hook the registry gains is tapped with no edit here.
177
+ for (const channel of ['scope', 'emit']) {
178
+ for (const method of hooksOn(channel)) {
179
+ if (!this.anyImplements(recorders, method))
180
+ continue;
181
+ tap[method] = (event) => this.captureScopeEvent(channel, method, event);
182
+ }
193
183
  }
194
184
  return tap;
195
185
  }
@@ -203,7 +193,7 @@ export class DeferredObserverTier {
203
193
  if (recorders.length === 0)
204
194
  return undefined;
205
195
  const tap = { id: DEFERRED_FLOW_TAP_ID };
206
- for (const method of FLOW_RECORDER_EVENT_METHODS) {
196
+ for (const method of hooksOn('flow')) {
207
197
  if (!this.anyImplements(recorders, method))
208
198
  continue;
209
199
  tap[method] = (event) => this.captureFlowEvent(method, event);
@@ -303,7 +293,7 @@ export class DeferredObserverTier {
303
293
  runtimeStageId: envelope.runtimeStageId,
304
294
  pipelineId: envelope.runId,
305
295
  timestamp: Date.now(),
306
- error: error instanceof Error ? error : new Error(String(error)),
296
+ error: error instanceof Error ? error : new Error(describeThrown(error)),
307
297
  operation: operationFor(envelope.method),
308
298
  channel: 'scope',
309
299
  };
@@ -326,7 +316,7 @@ export class DeferredObserverTier {
326
316
  if (isDevMode()) {
327
317
  // eslint-disable-next-line no-console
328
318
  console.warn(`[footprintjs] deferred observer '${listenerId}' failed (${phase}) handling ` +
329
- `${envelope.channel}.${envelope.method} (seq ${envelope.seq}): ${String(error)}`);
319
+ `${envelope.channel}.${envelope.method} (seq ${envelope.seq}): ${describeThrown(error)}`);
330
320
  }
331
321
  }
332
322
  /** Dispatcher-level options are first-attach-wins; differing later values dev-warn. */
@@ -363,4 +353,4 @@ export class DeferredObserverTier {
363
353
  console.warn(message);
364
354
  }
365
355
  }
366
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmZXJyZWRPYnNlcnZlclRpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9EZWZlcnJlZE9ic2VydmVyVGllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdDRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQU9MLGtCQUFrQixHQUNuQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFDTCwyQkFBMkIsRUFDM0IsMkJBQTJCLEVBQzNCLHNCQUFzQixHQUN2QixNQUFNLGlDQUFpQyxDQUFDO0FBNkR6Qyx5RkFBeUY7QUFDekYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsd0JBQXdCLENBQUM7QUFDOUQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7QUFFNUQsNkVBQTZFO0FBQzdFLE1BQU0sbUJBQW1CLEdBQThCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3pFLCtDQUErQztBQUMvQyxNQUFNLGtCQUFrQixHQUE4QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBaUIvRDt5RUFDeUU7QUFDekUsU0FBUyxZQUFZLENBQUMsTUFBYztJQUNsQyxJQUFJLE1BQU0sS0FBSyxRQUFRO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDdkMsSUFBSSxNQUFNLEtBQUssVUFBVTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzNDLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxNQUFNLE9BQU8sb0JBQW9CO0lBQ2QsVUFBVSxDQUFxQjtJQUMvQixhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFDeEQsYUFBYSxDQUEwQjtJQUN4RCwyRUFBMkU7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O1lBQ2pGLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMvRSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzlCLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxjQUFjLENBQ2pCLHlCQUF5QixVQUFVLHdEQUF3RDtnQkFDekYsMkVBQTJFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQ25HLCtFQUErRSxDQUNsRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxzRUFBc0U7SUFDOUQsY0FBYyxDQUFDLE9BQWU7UUFDcEMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUFFLE9BQU87UUFDekIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFBRSxPQUFPO1FBQzdDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcnVubmVyL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLnRzIOKAlCBSRkMtMDAxIEJsb2NrcyA24oCTOTogdGhlIGVuZ2luZSB3aXJpbmcgb2ZcbiAqIHRoZSBkZWZlcnJlZC1vYnNlcnZlciBwaXBlbGluZS5cbiAqXG4gKiBQYXR0ZXJuOiAgVGhpbiBhZGFwdGVyIGJldHdlZW4gdGhlIGV4ZWN1dG9yJ3MgdGhyZWUgb2JzZXJ2ZXIgY2hhbm5lbHMgYW5kXG4gKiAgICAgICAgICAgdGhlIFBVUkUgYG9ic2VydmVyLXF1ZXVlYCBtb2R1bGUuIFRoZSBwdXJlIG1vZHVsZSBzdGF5c1xuICogICAgICAgICAgIGVuZ2luZS1mcmVlIChpdCBpbXBvcnRzIG5vdGhpbmcgZnJvbSB0aGUgZW5naW5lIOKAlCB0aGUgZW5naW5lXG4gKiAgICAgICAgICAgaW1wb3J0cyBJVCk7IHRoaXMgdGllciBvd25zIGV2ZXJ5IGVuZ2luZS1mbGF2b3JlZCBjb25jZXJuOlxuICogICAgICAgICAgICAgLSB0aGUgYGlzRGV2TW9kZSgpYC1nYXRlZCwgZGVkdXBsaWNhdGVkIGBDYXB0dXJlSG9va3Mud2FybmBcbiAqICAgICAgICAgICAgICAgYmluZGluZyAodGhlIGRldi13YXJuIHNlYW0sIFJGQy0wMDEgwqdcIlJlc29sdXRpb25cIik7XG4gKiAgICAgICAgICAgICAtIHJvdXRpbmcgYERlZmVycmVkRGlzcGF0Y2hlci5vbkVycm9yYCBpbnRvIHRoZSBleGlzdGluZ1xuICogICAgICAgICAgICAgICByZWNvcmRlciBlcnJvciBjaGFubmVsIChgb25FcnJvcmAgb24gc2libGluZyBvYnNlcnZlcnMpO1xuICogICAgICAgICAgICAgLSB0aGUgY2FwdHVyZSBUQVBTIOKAlCBzeW50aGV0aWMgcmVjb3JkZXJzIHBsYWNlZCBvbiB0aGVcbiAqICAgICAgICAgICAgICAgZXhpc3RpbmcgaW5saW5lIGRpc3BhdGNoIGxpc3RzIHNvIHRoZSB0aHJlZSBkaXNwYXRjaCBzaXRlc1xuICogICAgICAgICAgICAgICAoYFNjb3BlRmFjYWRlLl9pbnZva2VIb29rYCwgYFNjb3BlRmFjYWRlLmVtaXRFdmVudGAsXG4gKiAgICAgICAgICAgICAgIGBGbG93UmVjb3JkZXJEaXNwYXRjaGVyYCkgbmVlZCBOTyBwZXItc2l0ZSB0aWVyIGxvZ2ljOiBhXG4gKiAgICAgICAgICAgICAgIHRhcCdzIGhvb2sgYm9keSBJUyBgZGlzcGF0Y2hlci5jYXB0dXJlKC4uLilgLCBhbmQgYmVjYXVzZVxuICogICAgICAgICAgICAgICB0aGUgdGFwIHNpdHMgaW4gdGhlIHNhbWUgbG9vcCBhcyBpbmxpbmUgcmVjb3JkZXJzIGl0IHNlZXNcbiAqICAgICAgICAgICAgICAgZXhhY3RseSB0aGUgcG9zdC1yZWRhY3Rpb24gZXZlbnQgb2JqZWN0IGlubGluZSBvYnNlcnZlcnNcbiAqICAgICAgICAgICAgICAgc2VlIOKAlCBjYXB0dXJlIGNhbiBuZXZlciBvYnNlcnZlIGEgcHJlLXJlZGFjdGlvbiB2YWx1ZTtcbiAqICAgICAgICAgICAgIC0gdGhlIHRlcm1pbmFsIGZsdXNoIChCbG9jayA4KSB3aXRoIGhvbmVzdCBzdHJhbmRpbmdcbiAqICAgICAgICAgICAgICAgYWNjb3VudGluZywgYW5kIHRoZSBCbG9jayA5IHN0YXRzIHN1cmZhY2UuXG4gKlxuICogUm9sZTogICAgIE9uZSBpbnN0YW5jZSBwZXIgYEZsb3dDaGFydEV4ZWN1dG9yYCwgY3JlYXRlZCBMQVpJTFkgb24gdGhlXG4gKiAgICAgICAgICAgZmlyc3QgYGRlbGl2ZXJ5OiAnZGVmZXJyZWQnYCBhdHRhY2ggKHplcm8gYWxsb2NhdGlvbiB3aGVuIG5vYm9keVxuICogICAgICAgICAgIG9wdHMgaW4g4oCUIG1pcnJvcnMgdGhlIGVtaXQgZmFzdC1wYXRoIHByZWNlZGVudCkuIEhvbGRzIHRoZSBPTkVcbiAqICAgICAgICAgICBgRGVmZXJyZWREaXNwYXRjaGVyYCAob25lIG1lcmdlZCBxdWV1ZSwgdG90YWwgb3JkZXIgYWNyb3NzXG4gKiAgICAgICAgICAgY2hhbm5lbHMpIHBsdXMgdGhlIHJlZ2lzdHJ5IG9mIGRlZmVycmVkIHJlY29yZGVycy5cbiAqXG4gKiBEZWxpdmVyeTogYSBkZWZlcnJlZCByZWNvcmRlcidzIGhvb2tzIGFyZSBpbnZva2VkIHRocm91Z2ggdGhlIFNBTUVcbiAqIGBpbnZva2VSZWNvcmRlckhvb2tgIGhlbHBlciB0aGUgaW5saW5lIHRpZXIgdXNlcyAoUkZDLTAwMSDCpzkgbWl0aWdhdGlvbikg4oCUXG4gKiBvbmUgYmVhdCBiZWhpbmQsIHdpdGggYGVudmVsb3BlLnBheWxvYWRgIG1hdGVyaWFsaXplZCBwZXIgdGhlIGNhcHR1cmVcbiAqIHBvbGljeSAoYCdzdW1tYXJ5J2AgZGVmYXVsdCDigJQgYm91bmRlZCwgcmVmZXJlbmNlLWZyZWU7IGAnY2xvbmUnYCDigJQgZnVsbFxuICogc3RydWN0dXJhbCBjb3B5LCBldmVudC1zaGFwZSBjb21wYXRpYmxlIHdpdGggaW5saW5lOyBgJ3JlZidgIOKAlCB0aGUgbGl2ZVxuICogZXZlbnQgb2JqZWN0LCBkZXYtd2FybmVkKS5cbiAqXG4gKiBDaGFubmVsIGZpbHRlcjogYSByZWdpc3RyYXRpb24gcmVtZW1iZXJzIHdoaWNoIGNoYW5uZWxzIHdvdWxkIGhhdmVcbiAqIHJlYWNoZWQgdGhlIHJlY29yZGVyIGlubGluZSAoc2NvcGUtbGlzdCByZWNvcmRlcnMgc2VlIGBzY29wZWAgKyBgZW1pdGBcbiAqIGVudmVsb3BlczsgZmxvdy1saXN0IHJlY29yZGVycyBzZWUgYGZsb3dgIGVudmVsb3BlcykgYW5kIHNraXBzIHRoZSByZXN0IOKAlFxuICogc2FtZSByZWFjaCBhcyB0aGUgaW5saW5lIHRpZXIsIG9uZSBiZWF0IGJlaGluZC5cbiAqL1xuXG5pbXBvcnQgeyBpbnZva2VSZWNvcmRlckhvb2sgfSBmcm9tICcuLi9jYXB0dXJlL2ludm9rZUhvb2suanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBDYXB0dXJlQ2hhbm5lbCxcbiAgdHlwZSBDYXB0dXJlRW52ZWxvcGUsXG4gIHR5cGUgQ2FwdHVyZVBvbGljeSxcbiAgdHlwZSBEaXNwYXRjaGVyU3RhdHMsXG4gIHR5cGUgRHJhaW5SZXN1bHQsXG4gIHR5cGUgT3ZlcmZsb3dQb2xpY3ksXG4gIERlZmVycmVkRGlzcGF0Y2hlcixcbn0gZnJvbSAnLi4vb2JzZXJ2ZXItcXVldWUvaW5kZXguanMnO1xuaW1wb3J0IHtcbiAgRU1JVF9SRUNPUkRFUl9FVkVOVF9NRVRIT0RTLFxuICBGTE9XX1JFQ09SREVSX0VWRU5UX01FVEhPRFMsXG4gIFJFQ09SREVSX0VWRU5UX01FVEhPRFMsXG59IGZyb20gJy4uL3JlY29yZGVyL0NvbWJpbmVkUmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuXG4vKiogRGVsaXZlcnkgdGllciBmb3IgYW4gYXR0YWNoZWQgb2JzZXJ2ZXIgKFJGQy0wMDEpLiAqL1xuZXhwb3J0IHR5cGUgT2JzZXJ2ZXJEZWxpdmVyeSA9ICdpbmxpbmUnIHwgJ2RlZmVycmVkJztcblxuLyoqXG4gKiBPcHRpb25zIGJhZyBhY2NlcHRlZCBieSBldmVyeSBgYXR0YWNoKlJlY29yZGVyYCBjYWxsLlxuICpcbiAqIGBkZWxpdmVyeTogJ2RlZmVycmVkJ2Agb3B0cyB0aGUgcmVjb3JkZXIgaW50byB0aGUgYm91bmRlZCBjYXB0dXJlIHF1ZXVlXG4gKiAoXCJvbmUgYmVhdCBiZWhpbmRcIik7IGFic2VudCAvIGAnaW5saW5lJ2Aga2VlcHMgdGhlIGhpc3RvcmljYWwgc3luY2hyb25vdXNcbiAqIGNhbGwg4oCUIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBwcmUtUkZDIHBhdGguXG4gKlxuICogVGhlIHJlbWFpbmluZyBmaWVsZHMgY29uZmlndXJlIHRoZSBleGVjdXRvcidzIE9ORSBzaGFyZWQgZGlzcGF0Y2hlciBhbmRcbiAqIGFyZSBhcHBsaWVkIHdoZW4gdGhlIEZJUlNUIGRlZmVycmVkIGF0dGFjaCBjcmVhdGVzIGl0OyBsYXRlciBhdHRhY2hlc1xuICogcGFzc2luZyBkaWZmZXJlbnQgdmFsdWVzIGdldCBhIGRldi1tb2RlIHdhcm5pbmcgYW5kIGtlZXAgdGhlIG9yaWdpbmFsXG4gKiBjb25maWd1cmF0aW9uIChvbmUgcXVldWUgcGVyIGV4ZWN1dG9yIOKAlCBwZXItcmVjb3JkZXIgcXVldWVzIHdvdWxkIGJyZWFrXG4gKiB0aGUgdG90YWwgY3Jvc3MtY2hhbm5lbCBvcmRlcikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXR0YWNoUmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqIGAnZGVmZXJyZWQnYCA9IGNhcHR1cmUg4oaSIHF1ZXVlIOKGkiBuZXh0LWNoZWNrcG9pbnQgZGVsaXZlcnkuIERlZmF1bHQgYCdpbmxpbmUnYC4gKi9cbiAgcmVhZG9ubHkgZGVsaXZlcnk/OiBPYnNlcnZlckRlbGl2ZXJ5O1xuICAvKipcbiAgICogUGF5bG9hZCBtYXRlcmlhbGl6YXRpb24gYXQgY2FwdHVyZSB0aW1lLiBEZWZhdWx0IGAnY2xvbmUnYCDigJQgeW91clxuICAgKiByZWNvcmRlcidzIGhvb2tzIHJlY2VpdmUgdGhlIFNBTUUgZXZlbnQgc2hhcGUgYXMgaW5saW5lIGRlbGl2ZXJ5XG4gICAqIChgc3RydWN0dXJlZENsb25lYGQ7IGBlLmtleWAvYGUudmFsdWVgL2BlLnJ1bnRpbWVTdGFnZUlkYCBhbGwgd29ya1xuICAgKiB1bmNoYW5nZWQpLCBzbyBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCBpcyBhIGRyb3AtaW4gcG9ydC5cbiAgICogYCdzdW1tYXJ5J2Ag4oCUIGEgYm91bmRlZCB0eXBlL3NpemUvcHJldmlldyBkaWdlc3QgKGBQYXlsb2FkU3VtbWFyeWApXG4gICAqIGluc3RlYWQgb2YgdGhlIGV2ZW50IHNoYXBlOiBjaGVhcGVyIGNhcHR1cmUgZm9yIHRlbGVtZXRyeS1vbmx5XG4gICAqIGNvbnN1bWVycyB0aGF0IGRvbid0IHJlYWQgZG9tYWluIGZpZWxkcy4gYCdyZWYnYCDigJQgcGFzcy10aHJvdWdoIGJ5XG4gICAqIHJlZmVyZW5jZTsgdGhlIGNhbGxlciBhc3NlcnRzIGltbXV0YWJpbGl0eSAoZGV2LW1vZGUgd2FybnMpLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FwdHVyZT86IENhcHR1cmVQb2xpY3k7XG4gIC8qKiBRdWV1ZSBib3VuZCDigJQgZGVmYXVsdCAxMCAwMDAuICovXG4gIHJlYWRvbmx5IG1heFF1ZXVlPzogbnVtYmVyO1xuICAvKiogT3ZlcmZsb3cgcG9saWN5IGF0IGBtYXhRdWV1ZWAg4oCUIGRlZmF1bHQgYCdkcm9wLW9sZGVzdCdgLiAqL1xuICByZWFkb25seSBvdmVyZmxvdz86IE92ZXJmbG93UG9saWN5O1xuICAvKiogYCdzYW1wbGUnYCBvdmVyZmxvdyBvbmx5IOKAlCBhZG1pdCAxIGluIHRoaXMgbWFueSBzYXR1cmF0ZWQgYXJyaXZhbHMuICovXG4gIHJlYWRvbmx5IHNhbXBsZUV2ZXJ5PzogbnVtYmVyO1xuICAvKiogUGVyLWNoZWNrcG9pbnQgZmx1c2ggYnVkZ2V0LCBtcyAoQTEpIOKAlCBkZWZhdWx0IDI7IGBJbmZpbml0eWAgPSBmdWxsIGRyYWluLiAqL1xuICByZWFkb25seSBmbHVzaEJ1ZGdldE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBCbG9jayA5IG9ic2VydmFiaWxpdHkgc3VyZmFjZSDigJQgYHNuYXBzaG90Lm9ic2VydmVyU3RhdHNgLiBUaGUgQTRcbiAqIGRpc3BhdGNoZXIgc3RhdHMgcGx1cyB0aGUgdGVybWluYWwtZmx1c2ggc3RyYW5kaW5nIGNvdW50IGZyb20gQmxvY2sgOC5cbiAqIFByZXNlbnQgb24gYFJ1bnRpbWVTbmFwc2hvdGAgb25seSB3aGVuIGEgZGVmZXJyZWQgb2JzZXJ2ZXIgd2FzIGF0dGFjaGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2VydmVyU3RhdHMgZXh0ZW5kcyBEaXNwYXRjaGVyU3RhdHMge1xuICAvKipcbiAgICogRW52ZWxvcGVzIHN0aWxsIHF1ZXVlZCB3aGVuIGEgdGVybWluYWwgZmx1c2ggaGl0IGl0cyBydW5hd2F5LWNhc2NhZGVcbiAgICogcm91bmQgY2FwIChCbG9jayA4KS4gYDBgIGluIGFueSBzYW5lIHJ1biDigJQgYSBub24temVybyB2YWx1ZSBtZWFucyBhXG4gICAqIGxpc3RlbmVyIGtlcHQgZW5xdWV1ZWluZyB3b3JrIGF0IGVuZC1vZi1ydW4gYW5kIGRlbGl2ZXJ5IHdhcyBjdXQgb2ZmXG4gICAqIChhbHNvIGRldi13YXJuZWQgYXQgdGhlIG1vbWVudCBpdCBoYXBwZW5lZCkuIE5ldmVyIHNpbGVudC5cbiAgICovXG4gIHJlYWRvbmx5IHRlcm1pbmFsU3RyYW5kZWQ6IG51bWJlcjtcbn1cblxuLyoqIFJlc3VsdCBzaGFwZSBvZiBgZXhlY3V0b3IuZHJhaW5PYnNlcnZlcnMoKWAg4oCUIHNlZSBgRHJhaW5SZXN1bHRgLiAqL1xuZXhwb3J0IHR5cGUgT2JzZXJ2ZXJEcmFpblJlc3VsdCA9IERyYWluUmVzdWx0O1xuXG4vKiogV2VsbC1rbm93biBpZHMgb2YgdGhlIHN5bnRoZXRpYyBjYXB0dXJlIHRhcHMgKGludGVybmFsLCBkb2N1bWVudGVkIGZvciBkZWJ1Z2dpbmcpLiAqL1xuZXhwb3J0IGNvbnN0IERFRkVSUkVEX1NDT1BFX1RBUF9JRCA9ICdfX2RlZmVycmVkLXNjb3BlLXRhcF9fJztcbmV4cG9ydCBjb25zdCBERUZFUlJFRF9GTE9XX1RBUF9JRCA9ICdfX2RlZmVycmVkLWZsb3ctdGFwX18nO1xuXG4vKiogQ2hhbm5lbCByZWFjaCBvZiB0aGUgc2NvcGUtcmVjb3JkZXIgbGlzdCAoc2NvcGUgZXZlbnRzICsgZW1pdCBldmVudHMpLiAqL1xuY29uc3QgU0NPUEVfTElTVF9DSEFOTkVMUzogcmVhZG9ubHkgQ2FwdHVyZUNoYW5uZWxbXSA9IFsnc2NvcGUnLCAnZW1pdCddO1xuLyoqIENoYW5uZWwgcmVhY2ggb2YgdGhlIGZsb3ctcmVjb3JkZXIgbGlzdC4gKi9cbmNvbnN0IEZMT1dfTElTVF9DSEFOTkVMUzogcmVhZG9ubHkgQ2FwdHVyZUNoYW5uZWxbXSA9IFsnZmxvdyddO1xuXG4vKiogRGlzcGF0Y2hlci1sZXZlbCBvcHRpb25zIHNuYXBzaG90LCBrZXB0IGZvciBjb25mbGljdCBkZXRlY3Rpb24uICovXG5pbnRlcmZhY2UgQXBwbGllZERpc3BhdGNoZXJDb25maWcge1xuICByZWFkb25seSBjYXB0dXJlPzogQ2FwdHVyZVBvbGljeTtcbiAgcmVhZG9ubHkgbWF4UXVldWU/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG92ZXJmbG93PzogT3ZlcmZsb3dQb2xpY3k7XG4gIHJlYWRvbmx5IHNhbXBsZUV2ZXJ5PzogbnVtYmVyO1xuICByZWFkb25seSBmbHVzaEJ1ZGdldE1zPzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRGVmZXJyZWRSZWdpc3RyYXRpb24ge1xuICByZWFkb25seSByZWNvcmRlcjogU2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlcjtcbiAgLyoqIFdoaWNoIGVudmVsb3BlIGNoYW5uZWxzIHJlYWNoIHRoaXMgcmVjb3JkZXIgKGlubGluZS10aWVyIHBhcml0eSkuICovXG4gIHJlYWRvbmx5IGNoYW5uZWxzOiBTZXQ8Q2FwdHVyZUNoYW5uZWw+O1xufVxuXG4vKiogTWFwIGFuIGVudmVsb3BlIG1ldGhvZCBvbnRvIHRoZSBzY29wZSBlcnJvci1ldmVudCBgb3BlcmF0aW9uYCB2b2NhYnVsYXJ5XG4gKiAgKHNhbWUgbWFwcGluZyBgU2NvcGVGYWNhZGUuX2ludm9rZUhvb2tgIHVzZXMgZm9yIGlubGluZSBmYWlsdXJlcykuICovXG5mdW5jdGlvbiBvcGVyYXRpb25Gb3IobWV0aG9kOiBzdHJpbmcpOiAncmVhZCcgfCAnd3JpdGUnIHwgJ2NvbW1pdCcge1xuICBpZiAobWV0aG9kID09PSAnb25SZWFkJykgcmV0dXJuICdyZWFkJztcbiAgaWYgKG1ldGhvZCA9PT0gJ29uQ29tbWl0JykgcmV0dXJuICdjb21taXQnO1xuICByZXR1cm4gJ3dyaXRlJztcbn1cblxuZXhwb3J0IGNsYXNzIERlZmVycmVkT2JzZXJ2ZXJUaWVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwYXRjaGVyOiBEZWZlcnJlZERpc3BhdGNoZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cmF0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBEZWZlcnJlZFJlZ2lzdHJhdGlvbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHBsaWVkQ29uZmlnOiBBcHBsaWVkRGlzcGF0Y2hlckNvbmZpZztcbiAgLyoqIERlZHVwIG1lbW9yeSBmb3IgdGhlIGRldi13YXJuIHNlYW0gKG9uZSB3YXJuaW5nIHBlciB1bmlxdWUgbWVzc2FnZSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgd2FybmVkTWVzc2FnZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSB0ZXJtaW5hbFN0cmFuZGVkID0gMDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKSB7XG4gICAgdGhpcy5hcHBsaWVkQ29uZmlnID0ge1xuICAgICAgLy8gQXR0YWNoLXN1cmZhY2UgZGVmYXVsdCBpcyAnY2xvbmUnIChyZXZpZXcgQ1JJVElDQUwtMik6IGEgcmVjb3JkZXJcbiAgICAgIC8vIHBvcnRlZCB3aXRoIGB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH1gIGtlZXBzIHJlY2VpdmluZyB0aGUgU0FNRVxuICAgICAgLy8gZXZlbnQgc2hhcGUgYXMgaW5saW5lIChlLmtleS9lLnZhbHVlL2UucnVudGltZVN0YWdlSWQgYWxsIGludGFjdCkuXG4gICAgICAvLyBUaGUgbW9kdWxlLWludGVybmFsIGVudmVsb3BlIGRlZmF1bHQgc3RheXMgJ3N1bW1hcnknIGZvciByYXctXG4gICAgICAvLyBlbnZlbG9wZSBjb25zdW1lcnM7ICdzdW1tYXJ5JyBoZXJlIGlzIGFuIGV4cGxpY2l0IHRlbGVtZXRyeSBjaG9pY2UuXG4gICAgICBjYXB0dXJlOiBvcHRpb25zPy5jYXB0dXJlID8/ICdjbG9uZScsXG4gICAgICBtYXhRdWV1ZTogb3B0aW9ucz8ubWF4UXVldWUsXG4gICAgICBvdmVyZmxvdzogb3B0aW9ucz8ub3ZlcmZsb3csXG4gICAgICBzYW1wbGVFdmVyeTogb3B0aW9ucz8uc2FtcGxlRXZlcnksXG4gICAgICBmbHVzaEJ1ZGdldE1zOiBvcHRpb25zPy5mbHVzaEJ1ZGdldE1zLFxuICAgIH07XG4gICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IERlZmVycmVkRGlzcGF0Y2hlcih7XG4gICAgICBtYXhRdWV1ZTogb3B0aW9ucz8ubWF4UXVldWUsXG4gICAgICBvdmVyZmxvdzogb3B0aW9ucz8ub3ZlcmZsb3csXG4gICAgICBzYW1wbGVFdmVyeTogb3B0aW9ucz8uc2FtcGxlRXZlcnksXG4gICAgICBjYXB0dXJlUG9saWN5OiBvcHRpb25zPy5jYXB0dXJlID8/ICdjbG9uZScsXG4gICAgICBmbHVzaEJ1ZGdldE1zOiBvcHRpb25zPy5mbHVzaEJ1ZGdldE1zLFxuICAgICAgLy8gVGhlIGRldi13YXJuIHNlYW0gKFJGQy0wMDEgwqdcIlJlc29sdXRpb246IHRoZSBkZXYtd2FybiBzZWFtXCIpOiB0aGVcbiAgICAgIC8vIHB1cmUgbW9kdWxlIGludm9rZXMgYHdhcm5gIG9uIGV2ZXJ5ICdyZWYnIGNhcHR1cmUgYW5kIGV2ZXJ5ICdjbG9uZSdcbiAgICAgIC8vIGRlZ3JhZGF0aW9uOyB0aGUgdGllciBiaW5kcyBpdCB0byB0aGUgY2VudHJhbCBpc0Rldk1vZGUoKSBmbGFnIGFuZFxuICAgICAgLy8gZGVkdXBlcyBieSBtZXNzYWdlIHNvIGEgaG90IGxvb3AgY2Fubm90IHNwYW0gdGhlIGNvbnNvbGUuXG4gICAgICBob29rczogeyB3YXJuOiAobWVzc2FnZSkgPT4gdGhpcy5kZXZXYXJuRGVkdXBlZChtZXNzYWdlKSB9LFxuICAgICAgLy8gTGlzdGVuZXIgZmFpbHVyZXMgKHN5bmMgdGhyb3dzIEFORCBhc3luYyByZWplY3Rpb25zKSByb3V0ZSBpbnRvIHRoZVxuICAgICAgLy8gZXhpc3RpbmcgcmVjb3JkZXIgZXJyb3IgY2hhbm5lbCDigJQgc2VlIHJvdXRlTGlzdGVuZXJFcnJvci5cbiAgICAgIG9uRXJyb3I6IChlcnJvciwgY3R4KSA9PiB0aGlzLnJvdXRlTGlzdGVuZXJFcnJvcihlcnJvciwgY3R4Lmxpc3RlbmVySWQsIGN0eC5lbnZlbG9wZSwgY3R4LnBoYXNlKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWdpc3RyeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSByZWNvcmRlciBmb3IgZGVmZXJyZWQgZGVsaXZlcnkgb24gdGhlIHNjb3BlLWxpc3QgY2hhbm5lbHNcbiAgICogKGBzY29wZWAgKyBgZW1pdGApIGFuZC9vciB0aGUgZmxvdyBjaGFubmVsLiBJZGVtcG90ZW50IGJ5IGlkIOKAlCBzYW1lIGlkXG4gICAqIHJlcGxhY2VzIHRoZSByZWNvcmRlciBvYmplY3Q7IGNoYW5uZWwgbGlzdHMgTUVSR0UgYWNyb3NzIGNhbGxzIChzYW1lIGFzXG4gICAqIHRoZSBpbmxpbmUgdGllciwgd2hlcmUgYGF0dGFjaFNjb3BlUmVjb3JkZXIoeClgICsgYGF0dGFjaEZsb3dSZWNvcmRlcih4KWBcbiAgICogbGFuZHMgYHhgIG9uIGJvdGggbGlzdHMpLiBMYXRlciBhdHRhY2hlcyBwYXNzaW5nIGRpc3BhdGNoZXItbGV2ZWxcbiAgICogb3B0aW9ucyB0aGF0IGRpZmZlciBmcm9tIHRoZSBmaXJzdCBhdHRhY2gncyBjb25maWd1cmF0aW9uIGtlZXAgdGhlXG4gICAqIG9yaWdpbmFsIGNvbmZpZyBhbmQgZGV2LXdhcm4uXG4gICAqL1xuICByZWdpc3RlcihcbiAgICByZWNvcmRlcjogU2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlcixcbiAgICBsaXN0czogeyBzY29wZT86IGJvb2xlYW47IGZsb3c/OiBib29sZWFuIH0sXG4gICAgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy53YXJuT25Db25maWdDb25mbGljdChyZWNvcmRlci5pZCwgb3B0aW9ucyk7XG4gICAgY29uc3QgY2hhbm5lbHMgPSB0aGlzLnJlZ2lzdHJhdGlvbnMuZ2V0KHJlY29yZGVyLmlkKT8uY2hhbm5lbHMgPz8gbmV3IFNldDxDYXB0dXJlQ2hhbm5lbD4oKTtcbiAgICBpZiAobGlzdHMuc2NvcGUpIGZvciAoY29uc3QgYyBvZiBTQ09QRV9MSVNUX0NIQU5ORUxTKSBjaGFubmVscy5hZGQoYyk7XG4gICAgaWYgKGxpc3RzLmZsb3cpIGZvciAoY29uc3QgYyBvZiBGTE9XX0xJU1RfQ0hBTk5FTFMpIGNoYW5uZWxzLmFkZChjKTtcbiAgICB0aGlzLnJlZ2lzdHJhdGlvbnMuc2V0KHJlY29yZGVyLmlkLCB7IHJlY29yZGVyLCBjaGFubmVscyB9KTtcbiAgICB0aGlzLmRpc3BhdGNoZXIuYWRkTGlzdGVuZXIocmVjb3JkZXIuaWQsIChlbnZlbG9wZSkgPT4ge1xuICAgICAgY29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5yZWdpc3RyYXRpb25zLmdldChyZWNvcmRlci5pZCk7XG4gICAgICBpZiAoIXJlZ2lzdHJhdGlvbiB8fCAhcmVnaXN0cmF0aW9uLmNoYW5uZWxzLmhhcyhlbnZlbG9wZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgICAgLy8gU0FNRSBpbnZva2UgaGVscGVyIGFzIHRoZSBpbmxpbmUgdGllciAoUkZDLTAwMSDCpzkgbWl0aWdhdGlvbikg4oCUIGFcbiAgICAgIC8vIHJldHVybmVkIFByb21pc2UgbGFuZHMgaW4gdGhlIGRpc3BhdGNoZXIncyBpbmZsaWdodCBzZXQuXG4gICAgICByZXR1cm4gaW52b2tlUmVjb3JkZXJIb29rKHJlY29yZGVyLCBlbnZlbG9wZS5tZXRob2QsIGVudmVsb3BlLnBheWxvYWQpIGFzIHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZ2l2ZW4gY2hhbm5lbCBsaXN0cyBmcm9tIGEgcmVnaXN0cmF0aW9uIChtaXJyb3JzIHRoZSBpbmxpbmVcbiAgICogdGllciwgd2hlcmUgYGRldGFjaFNjb3BlUmVjb3JkZXJgIC8gYGRldGFjaEZsb3dSZWNvcmRlcmAgZWFjaCBjbGVhciBvbmVcbiAgICogbGlzdCkuIFdoZW4gbm8gY2hhbm5lbHMgcmVtYWluLCB0aGUgbGlzdGVuZXIgaXMgZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIHJlbW92ZUZyb21MaXN0cyhpZDogc3RyaW5nLCBsaXN0czogeyBzY29wZT86IGJvb2xlYW47IGZsb3c/OiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnJlZ2lzdHJhdGlvbnMuZ2V0KGlkKTtcbiAgICBpZiAoIXJlZ2lzdHJhdGlvbikgcmV0dXJuO1xuICAgIGlmIChsaXN0cy5zY29wZSkgZm9yIChjb25zdCBjIG9mIFNDT1BFX0xJU1RfQ0hBTk5FTFMpIHJlZ2lzdHJhdGlvbi5jaGFubmVscy5kZWxldGUoYyk7XG4gICAgaWYgKGxpc3RzLmZsb3cpIGZvciAoY29uc3QgYyBvZiBGTE9XX0xJU1RfQ0hBTk5FTFMpIHJlZ2lzdHJhdGlvbi5jaGFubmVscy5kZWxldGUoYyk7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbi5jaGFubmVscy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLnJlZ2lzdHJhdGlvbnMuZGVsZXRlKGlkKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5yZW1vdmVMaXN0ZW5lcihpZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBgaWRgIGlzIHJlZ2lzdGVyZWQgZm9yIGRlZmVycmVkIGRlbGl2ZXJ5IChhbnkgY2hhbm5lbCkuICovXG4gIGhhcyhpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cmF0aW9ucy5oYXMoaWQpO1xuICB9XG5cbiAgLyoqIERlZmVycmVkIHJlY29yZGVycyB3aG9zZSByZWFjaCBpbmNsdWRlcyB0aGUgc2NvcGUgbGlzdCAoc2NvcGUrZW1pdCkuICovXG4gIHNjb3BlTGlzdFJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW10ge1xuICAgIHJldHVybiB0aGlzLmJ5Q2hhbm5lbCgnc2NvcGUnKSBhcyBTY29wZVJlY29yZGVyW107XG4gIH1cblxuICAvKiogRGVmZXJyZWQgcmVjb3JkZXJzIHdob3NlIHJlYWNoIGluY2x1ZGVzIHRoZSBmbG93IGNoYW5uZWwuICovXG4gIGZsb3dMaXN0UmVjb3JkZXJzKCk6IEZsb3dSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5ieUNoYW5uZWwoJ2Zsb3cnKSBhcyBGbG93UmVjb3JkZXJbXTtcbiAgfVxuXG4gIC8qKiBSZXNldCBkZWZlcnJlZCByZWNvcmRlcnMgYmVmb3JlIGEgZnJlc2ggcnVuIChzYW1lIGNvbnRyYWN0IGFzIGlubGluZSkuICovXG4gIGNsZWFyUmVjb3JkZXJzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgeyByZWNvcmRlciB9IG9mIHRoaXMucmVnaXN0cmF0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgKHJlY29yZGVyIGFzIHsgY2xlYXI/OiAoKSA9PiB2b2lkIH0pLmNsZWFyPy4oKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgQ2FwdHVyZSB0YXBzIChCbG9jayA3KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQnVpbGQgdGhlIHN5bnRoZXRpYyBzY29wZS1jaGFubmVsIHRhcCDigJQgYSBgU2NvcGVSZWNvcmRlcmAgcGxhY2VkIG9uIHRoZVxuICAgKiBub3JtYWwgc2NvcGUtcmVjb3JkZXIgbGlzdCB3aG9zZSBob29rcyBjYXB0dXJlIGludG8gdGhlIHF1ZXVlLiBCdWlsdFxuICAgKiBmcmVzaCBwZXIgdHJhdmVyc2VyIHNvIGl0IHJlZmxlY3RzIHRoZSBjdXJyZW50IHJlZ2lzdHJhdGlvbnMuIE9ubHlcbiAgICogbWV0aG9kcyBzb21lIGRlZmVycmVkIHJlY29yZGVyIGFjdHVhbGx5IGltcGxlbWVudHMgYXJlIHByZXNlbnQgKG5vXG4gICAqIHdhc3RlZCBjYXB0dXJlcykuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBub3RoaW5nIGlzIHJlZ2lzdGVyZWQgZm9yXG4gICAqIHRoZSBzY29wZSBsaXN0LlxuICAgKlxuICAgKiBSZWRhY3Rpb24gb3JkZXJpbmc6IHRoZSB0YXAgaXMgaW52b2tlZCBmcm9tIHRoZSBTQU1FIGxvb3BzIGFzIGlubGluZVxuICAgKiByZWNvcmRlcnMgKGBfaW52b2tlSG9va2AgLyBgZW1pdEV2ZW50YCksIHdoaWNoIHJlY2VpdmUgZXZlbnRzIEFGVEVSIHRoZVxuICAgKiByZWRhY3Rpb24gZGVjaXNpb24g4oCUIHNvIGEgY2FwdHVyZWQgcGF5bG9hZCBjYW4gbmV2ZXIgY29udGFpbiBhXG4gICAqIHByZS1yZWRhY3Rpb24gdmFsdWUgdGhlIGlubGluZSB0aWVyIHdvdWxkIG5vdCBoYXZlIHNlZW4uXG4gICAqL1xuICBidWlsZFNjb3BlVGFwKCk6IFNjb3BlUmVjb3JkZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVycyA9IHRoaXMuc2NvcGVMaXN0UmVjb3JkZXJzKCk7XG4gICAgaWYgKHJlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgaWQ6IERFRkVSUkVEX1NDT1BFX1RBUF9JRCB9O1xuICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIFJFQ09SREVSX0VWRU5UX01FVEhPRFMpIHtcbiAgICAgIGlmICghdGhpcy5hbnlJbXBsZW1lbnRzKHJlY29yZGVycywgbWV0aG9kKSkgY29udGludWU7XG4gICAgICB0YXBbbWV0aG9kXSA9IChldmVudDogdW5rbm93bikgPT4gdGhpcy5jYXB0dXJlU2NvcGVFdmVudCgnc2NvcGUnLCBtZXRob2QsIGV2ZW50KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgRU1JVF9SRUNPUkRFUl9FVkVOVF9NRVRIT0RTKSB7XG4gICAgICBpZiAoIXRoaXMuYW55SW1wbGVtZW50cyhyZWNvcmRlcnMsIG1ldGhvZCkpIGNvbnRpbnVlO1xuICAgICAgdGFwW21ldGhvZF0gPSAoZXZlbnQ6IHVua25vd24pID0+IHRoaXMuY2FwdHVyZVNjb3BlRXZlbnQoJ2VtaXQnLCBtZXRob2QsIGV2ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcCBhcyB1bmtub3duIGFzIFNjb3BlUmVjb3JkZXI7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHN5bnRoZXRpYyBmbG93LWNoYW5uZWwgdGFwIOKAlCBhIGBGbG93UmVjb3JkZXJgIGFwcGVuZGVkIHRvIHRoZVxuICAgKiBmbG93LXJlY29yZGVycyBsaXN0IGhhbmRlZCB0byB0aGUgdHJhdmVyc2VyLiBTYW1lIGNvbnRyYWN0IGFzXG4gICAqIHtAbGluayBidWlsZFNjb3BlVGFwfS5cbiAgICovXG4gIGJ1aWxkRmxvd1RhcCgpOiBGbG93UmVjb3JkZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVycyA9IHRoaXMuZmxvd0xpc3RSZWNvcmRlcnMoKTtcbiAgICBpZiAocmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB0YXA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBpZDogREVGRVJSRURfRkxPV19UQVBfSUQgfTtcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBGTE9XX1JFQ09SREVSX0VWRU5UX01FVEhPRFMpIHtcbiAgICAgIGlmICghdGhpcy5hbnlJbXBsZW1lbnRzKHJlY29yZGVycywgbWV0aG9kKSkgY29udGludWU7XG4gICAgICB0YXBbbWV0aG9kXSA9IChldmVudDogdW5rbm93bikgPT4gdGhpcy5jYXB0dXJlRmxvd0V2ZW50KG1ldGhvZCwgZXZlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gdGFwIGFzIHVua25vd24gYXMgRmxvd1JlY29yZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIERpcmVjdCBjYXB0dXJlIGZvciBleGVjdXRvci1zeW50aGVzaXplZCBldmVudHMgdGhhdCBieXBhc3MgdGhlIGRpc3BhdGNoXG4gICAqIHNpdGVzIChlLmcuIHRoZSBzeW50aGV0aWMgYG9uUmVzdW1lYCB0aGUgZXhlY3V0b3IgZmlyZXMgb24gcmVzdW1lKS5cbiAgICovXG4gIGNhcHR1cmUoY2hhbm5lbDogQ2FwdHVyZUNoYW5uZWwsIG1ldGhvZDogc3RyaW5nLCBydW50aW1lU3RhZ2VJZDogc3RyaW5nLCBydW5JZDogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaGVyLmNhcHR1cmUoeyBjaGFubmVsLCBtZXRob2QsIHJ1bnRpbWVTdGFnZUlkLCBydW5JZCwgcGF5bG9hZCB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUZXJtaW5hbCBmbHVzaCArIGRyYWluIChCbG9jayA4KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogU3luY2hyb25vdXNseSBkZWxpdmVyIGV2ZXJ5dGhpbmcgc3RpbGwgcXVldWVkIOKAlCBjYWxsZWQgYnkgdGhlIGV4ZWN1dG9yXG4gICAqIGF0IHRoZSBPVVRFUk1PU1QgcnVuIGJvdW5kYXJ5IChyZXNvbHZlLCByZWplY3QsIHBhdXNlKSwgQkVGT1JFIGBydW4oKWBcbiAgICogcmV0dXJucyAvIHJldGhyb3dzIC8gdGhlIGNoZWNrcG9pbnQgYmVjb21lcyBhdmFpbGFibGUuIEluc3BlY3RzXG4gICAqIGBmbHVzaFN5bmNgJ3MgYHJlbWFpbmluZ2AgKHJldmlld2VyIE4xKTogYGZsdXNoU3luY2AgYWxyZWFkeSBsb29wc1xuICAgKiBzbmFwc2hvdCByb3VuZHMgdXAgdG8gaXRzIHJ1bmF3YXktY2FzY2FkZSBjYXAsIHNvIGEgbm9uLXplcm8gcmVtYWluZGVyXG4gICAqIG1lYW5zIGEgcGF0aG9sb2dpY2FsIHNlbGYtZW5xdWV1ZWluZyBsaXN0ZW5lciDigJQgY291bnRlZCBpblxuICAgKiBgb2JzZXJ2ZXJTdGF0cy50ZXJtaW5hbFN0cmFuZGVkYCBhbmQgZGV2LXdhcm5lZCwgbmV2ZXIgc2lsZW50LlxuICAgKi9cbiAgdGVybWluYWxGbHVzaCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlbWFpbmluZyB9ID0gdGhpcy5kaXNwYXRjaGVyLmZsdXNoTm93KCk7XG4gICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgIHRoaXMudGVybWluYWxTdHJhbmRlZCArPSByZW1haW5pbmc7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50anNdIGRlZmVycmVkIG9ic2VydmVyczogdGVybWluYWwgZmx1c2ggaGl0IHRoZSBydW5hd2F5LWNhc2NhZGUgY2FwIHdpdGggJHtyZW1haW5pbmd9IGAgK1xuICAgICAgICAgICAgJ2V2ZW50KHMpIHN0aWxsIHF1ZXVlZCDigJQgYSBsaXN0ZW5lciBrZXB0IGVucXVldWVpbmcgZHVyaW5nIHRoZSBmbHVzaC4gVGhlIHN0cmFuZGVkIGNvdW50IGlzICcgK1xuICAgICAgICAgICAgJ3N1cmZhY2VkIG9uIHNuYXBzaG90Lm9ic2VydmVyU3RhdHMudGVybWluYWxTdHJhbmRlZC4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCB0aGUgYmFja2xvZywgdGhlbiBzZXR0bGUgYXN5bmMgbGlzdGVuZXIgY29udGludWF0aW9ucyB1bmRlciBhXG4gICAqIGRlYWRsaW5lIOKAlCB0aGUgc2VydmVybGVzcyAvIGdyYWNlZnVsLXNodXRkb3duIHBhdHRlcm4gKFJGQy0wMDEgwqcxMSkuXG4gICAqL1xuICBkcmFpbihvcHRzPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IFByb21pc2U8T2JzZXJ2ZXJEcmFpblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXIuZHJhaW4ob3B0cyk7XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMgKEJsb2NrIDkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUaGUgYHNuYXBzaG90Lm9ic2VydmVyU3RhdHNgIHBheWxvYWQg4oCUIEE0IHN0YXRzICsgQmxvY2sgOCBzdHJhbmRpbmcuICovXG4gIGdldFN0YXRzKCk6IE9ic2VydmVyU3RhdHMge1xuICAgIHJldHVybiB7IC4uLnRoaXMuZGlzcGF0Y2hlci5nZXRTdGF0cygpLCB0ZXJtaW5hbFN0cmFuZGVkOiB0aGlzLnRlcm1pbmFsU3RyYW5kZWQgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbnRlcm5hbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBieUNoYW5uZWwoY2hhbm5lbDogQ2FwdHVyZUNoYW5uZWwpOiBBcnJheTxTY29wZVJlY29yZGVyIHwgRmxvd1JlY29yZGVyPiB7XG4gICAgY29uc3Qgb3V0OiBBcnJheTxTY29wZVJlY29yZGVyIHwgRmxvd1JlY29yZGVyPiA9IFtdO1xuICAgIGZvciAoY29uc3QgeyByZWNvcmRlciwgY2hhbm5lbHMgfSBvZiB0aGlzLnJlZ2lzdHJhdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChjaGFubmVscy5oYXMoY2hhbm5lbCkpIG91dC5wdXNoKHJlY29yZGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBOb3JtYWwgcHJvcGVydHkgbG9va3VwIOKAlCBpbnZvY2F0aW9uIHBhcml0eSB3aXRoIHRoZSBpbmxpbmUgdGllci4gKi9cbiAgcHJpdmF0ZSBhbnlJbXBsZW1lbnRzKHJlY29yZGVyczogQXJyYXk8U2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlcj4sIG1ldGhvZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlY29yZGVycy5zb21lKChyKSA9PiB0eXBlb2YgKHIgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJyk7XG4gIH1cblxuICAvKiogU2NvcGUvZW1pdCBldmVudHMgY2FycnkgdGhlaXIgb3duIGlkcyAoYHJ1bnRpbWVTdGFnZUlkYCArIGBwaXBlbGluZUlkYCkuICovXG4gIHByaXZhdGUgY2FwdHVyZVNjb3BlRXZlbnQoY2hhbm5lbDogQ2FwdHVyZUNoYW5uZWwsIG1ldGhvZDogc3RyaW5nLCBldmVudDogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGUgPSBldmVudCBhcyB7IHJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nOyBwaXBlbGluZUlkPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgdGhpcy5kaXNwYXRjaGVyLmNhcHR1cmUoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBlPy5ydW50aW1lU3RhZ2VJZCA/PyAnJyxcbiAgICAgIHJ1bklkOiBlPy5waXBlbGluZUlkID8/ICcnLFxuICAgICAgcGF5bG9hZDogZXZlbnQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogRmxvdyBldmVudHMgY2FycnkgaWRzIG9uIGB0cmF2ZXJzYWxDb250ZXh0YCAoYWJzZW50IG9uIGEgZmV3IGV2ZW50cykuICovXG4gIHByaXZhdGUgY2FwdHVyZUZsb3dFdmVudChtZXRob2Q6IHN0cmluZywgZXZlbnQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSAoZXZlbnQgYXMgeyB0cmF2ZXJzYWxDb250ZXh0PzogeyBydW50aW1lU3RhZ2VJZD86IHN0cmluZzsgcnVuSWQ/OiBzdHJpbmcgfSB9IHwgdW5kZWZpbmVkKVxuICAgICAgPy50cmF2ZXJzYWxDb250ZXh0O1xuICAgIHRoaXMuZGlzcGF0Y2hlci5jYXB0dXJlKHtcbiAgICAgIGNoYW5uZWw6ICdmbG93JyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBjdHg/LnJ1bnRpbWVTdGFnZUlkID8/ICcnLFxuICAgICAgcnVuSWQ6IGN0eD8ucnVuSWQgPz8gJycsXG4gICAgICBwYXlsb2FkOiBldmVudCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZSBhIGRlZmVycmVkIGxpc3RlbmVyIGZhaWx1cmUgaW50byB0aGUgZXhpc3RpbmcgcmVjb3JkZXIgZXJyb3JcbiAgICogY2hhbm5lbDogZXZlcnkgT1RIRVIgcmVnaXN0ZXJlZCBvYnNlcnZlciAoZGVmZXJyZWQgc2libGluZ3MgZmlyc3QsIGluXG4gICAqIHJlZ2lzdHJhdGlvbiBvcmRlcikgcmVjZWl2ZXMgYSBzY29wZS1zaGFwZWQgYG9uRXJyb3JgIGV2ZW50IOKAlCB0aGUgc2FtZVxuICAgKiBjb250cmFjdCB0aGUgaW5saW5lIHRpZXIgaG9ub3JzIHdoZW4gYSByZWNvcmRlciB0aHJvd3MgbWlkLWRpc3BhdGNoLlxuICAgKiBUaGUgZXJyb3Igc2luayBtdXN0IG5ldmVyIGJlY29tZSBhbiBlcnJvciBzb3VyY2U6IHNpbmsgdGhyb3dzIGFyZVxuICAgKiBzd2FsbG93ZWQgKGlzb2xhdGlvbiBpcyBhYnNvbHV0ZSkuXG4gICAqL1xuICBwcml2YXRlIHJvdXRlTGlzdGVuZXJFcnJvcihcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICBsaXN0ZW5lcklkOiBzdHJpbmcsXG4gICAgZW52ZWxvcGU6IENhcHR1cmVFbnZlbG9wZSxcbiAgICBwaGFzZTogJ3N5bmMnIHwgJ2FzeW5jJyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaGFzaElkeCA9IGVudmVsb3BlLnJ1bnRpbWVTdGFnZUlkLmxhc3RJbmRleE9mKCcjJyk7XG4gICAgY29uc3QgZXJyb3JFdmVudCA9IHtcbiAgICAgIHN0YWdlTmFtZTogJycsXG4gICAgICBzdGFnZUlkOiBoYXNoSWR4ID49IDAgPyBlbnZlbG9wZS5ydW50aW1lU3RhZ2VJZC5zbGljZSgwLCBoYXNoSWR4KSA6IGVudmVsb3BlLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGVudmVsb3BlLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogZW52ZWxvcGUucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpLFxuICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25Gb3IoZW52ZWxvcGUubWV0aG9kKSxcbiAgICAgIGNoYW5uZWw6ICdzY29wZScgYXMgY29uc3QsXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IFtpZCwgeyByZWNvcmRlciwgY2hhbm5lbHMgfV0gb2YgdGhpcy5yZWdpc3RyYXRpb25zKSB7XG4gICAgICBpZiAoaWQgPT09IGxpc3RlbmVySWQpIGNvbnRpbnVlO1xuICAgICAgLy8gSW5saW5lLXRpZXIgcGFyaXR5IChyZXZpZXcgQ1JJVElDQUwtMSk6IHRoZSBzeW50aGVzaXplZCBldmVudCBpc1xuICAgICAgLy8gc2NvcGUtdHlwZWQsIHNvIGl0IHJlYWNoZXMgT05MWSByZWNvcmRlcnMgcmVnaXN0ZXJlZCBvbiB0aGUgc2NvcGVcbiAgICAgIC8vIGxpc3RzIOKAlCBhIGZsb3ctb25seSByZWNvcmRlciBuZXZlciByZWNlaXZlcyBzY29wZS1jaGFubmVsIGVycm9yc1xuICAgICAgLy8gaW5saW5lIGFuZCBtdXN0IG5vdCBoZXJlIGVpdGhlci5cbiAgICAgIGlmICghY2hhbm5lbHMuaGFzKCdzY29wZScpKSBjb250aW51ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGludm9rZVJlY29yZGVySG9vayhyZWNvcmRlciwgJ29uRXJyb3InLCBlcnJvckV2ZW50KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBTd2FsbG93IOKAlCBzYW1lIHJ1bGUgYXMgRGVmZXJyZWREaXNwYXRjaGVyLnNhZmVPbkVycm9yLlxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50anNdIGRlZmVycmVkIG9ic2VydmVyICcke2xpc3RlbmVySWR9JyBmYWlsZWQgKCR7cGhhc2V9KSBoYW5kbGluZyBgICtcbiAgICAgICAgICBgJHtlbnZlbG9wZS5jaGFubmVsfS4ke2VudmVsb3BlLm1ldGhvZH0gKHNlcSAke2VudmVsb3BlLnNlcX0pOiAke1N0cmluZyhlcnJvcil9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqIERpc3BhdGNoZXItbGV2ZWwgb3B0aW9ucyBhcmUgZmlyc3QtYXR0YWNoLXdpbnM7IGRpZmZlcmluZyBsYXRlciB2YWx1ZXMgZGV2LXdhcm4uICovXG4gIHByaXZhdGUgd2Fybk9uQ29uZmlnQ29uZmxpY3QocmVjb3JkZXJJZDogc3RyaW5nLCBvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm47XG4gICAgY29uc3QgY29uZmxpY3RzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlcXVlc3RlZDogQXBwbGllZERpc3BhdGNoZXJDb25maWcgPSB7XG4gICAgICBjYXB0dXJlOiBvcHRpb25zLmNhcHR1cmUsXG4gICAgICBtYXhRdWV1ZTogb3B0aW9ucy5tYXhRdWV1ZSxcbiAgICAgIG92ZXJmbG93OiBvcHRpb25zLm92ZXJmbG93LFxuICAgICAgc2FtcGxlRXZlcnk6IG9wdGlvbnMuc2FtcGxlRXZlcnksXG4gICAgICBmbHVzaEJ1ZGdldE1zOiBvcHRpb25zLmZsdXNoQnVkZ2V0TXMsXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZXF1ZXN0ZWQpIGFzIEFycmF5PGtleW9mIEFwcGxpZWREaXNwYXRjaGVyQ29uZmlnPikge1xuICAgICAgaWYgKHJlcXVlc3RlZFtrZXldICE9PSB1bmRlZmluZWQgJiYgcmVxdWVzdGVkW2tleV0gIT09IHRoaXMuYXBwbGllZENvbmZpZ1trZXldKSB7XG4gICAgICAgIGNvbmZsaWN0cy5wdXNoKFN0cmluZyhrZXkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZsaWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRldldhcm5EZWR1cGVkKFxuICAgICAgICBgW2Zvb3RwcmludGpzXSBhdHRhY2ggJyR7cmVjb3JkZXJJZH0nOiB0aGUgZXhlY3V0b3IncyBkZWZlcnJlZC1vYnNlcnZlciBxdWV1ZSB3YXMgYWxyZWFkeSBgICtcbiAgICAgICAgICBgY29uZmlndXJlZCBieSB0aGUgZmlyc3QgZGVmZXJyZWQgYXR0YWNoIOKAlCBpZ25vcmluZyBkaWZmZXJpbmcgb3B0aW9uKHMpOiAke2NvbmZsaWN0cy5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICAgJ09uZSBleGVjdXRvciBoYXMgT05FIG1lcmdlZCBxdWV1ZTsgY29uZmlndXJlIGl0IG9uIHRoZSBmaXJzdCBkZWZlcnJlZCBhdHRhY2guJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqIGBpc0Rldk1vZGUoKWAtZ2F0ZWQsIGRlZHVwbGljYXRlZCB3YXJuZXIg4oCUIHRoZSBib3VuZCB3YXJuIHNlYW0uICovXG4gIHByaXZhdGUgZGV2V2FybkRlZHVwZWQobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFpc0Rldk1vZGUoKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLndhcm5lZE1lc3NhZ2VzLmhhcyhtZXNzYWdlKSkgcmV0dXJuO1xuICAgIHRoaXMud2FybmVkTWVzc2FnZXMuYWRkKG1lc3NhZ2UpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICB9XG59XG4iXX0=
356
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmZXJyZWRPYnNlcnZlclRpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9EZWZlcnJlZE9ic2VydmVyVGllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdDRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQU9MLGtCQUFrQixHQUNuQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBNkQ3RSx5RkFBeUY7QUFDekYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsd0JBQXdCLENBQUM7QUFDOUQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7QUFFNUQsNkVBQTZFO0FBQzdFLE1BQU0sbUJBQW1CLEdBQThCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3pFLCtDQUErQztBQUMvQyxNQUFNLGtCQUFrQixHQUE4QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBaUIvRCxNQUFNLE9BQU8sb0JBQW9CO0lBQ2QsVUFBVSxDQUFxQjtJQUMvQixhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFDeEQsYUFBYSxDQUEwQjtJQUN4RCwyRUFBMkU7SUFDMUQsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDNUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0lBRTdCLFlBQVksT0FBK0I7UUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNuQixvRUFBb0U7WUFDcEUsa0VBQWtFO1lBQ2xFLHFFQUFxRTtZQUNyRSxnRUFBZ0U7WUFDaEUsc0VBQXNF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RDtnQkFDekYsMkVBQTJFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQ25HLCtFQUErRSxDQUNsRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxzRUFBc0U7SUFDOUQsY0FBYyxDQUFDLE9BQWU7UUFDcEMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUFFLE9BQU87UUFDekIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFBRSxPQUFPO1FBQzdDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcnVubmVyL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLnRzIOKAlCBSRkMtMDAxIEJsb2NrcyA24oCTOTogdGhlIGVuZ2luZSB3aXJpbmcgb2ZcbiAqIHRoZSBkZWZlcnJlZC1vYnNlcnZlciBwaXBlbGluZS5cbiAqXG4gKiBQYXR0ZXJuOiAgVGhpbiBhZGFwdGVyIGJldHdlZW4gdGhlIGV4ZWN1dG9yJ3MgdGhyZWUgb2JzZXJ2ZXIgY2hhbm5lbHMgYW5kXG4gKiAgICAgICAgICAgdGhlIFBVUkUgYG9ic2VydmVyLXF1ZXVlYCBtb2R1bGUuIFRoZSBwdXJlIG1vZHVsZSBzdGF5c1xuICogICAgICAgICAgIGVuZ2luZS1mcmVlIChpdCBpbXBvcnRzIG5vdGhpbmcgZnJvbSB0aGUgZW5naW5lIOKAlCB0aGUgZW5naW5lXG4gKiAgICAgICAgICAgaW1wb3J0cyBJVCk7IHRoaXMgdGllciBvd25zIGV2ZXJ5IGVuZ2luZS1mbGF2b3JlZCBjb25jZXJuOlxuICogICAgICAgICAgICAgLSB0aGUgYGlzRGV2TW9kZSgpYC1nYXRlZCwgZGVkdXBsaWNhdGVkIGBDYXB0dXJlSG9va3Mud2FybmBcbiAqICAgICAgICAgICAgICAgYmluZGluZyAodGhlIGRldi13YXJuIHNlYW0sIFJGQy0wMDEgwqdcIlJlc29sdXRpb25cIik7XG4gKiAgICAgICAgICAgICAtIHJvdXRpbmcgYERlZmVycmVkRGlzcGF0Y2hlci5vbkVycm9yYCBpbnRvIHRoZSBleGlzdGluZ1xuICogICAgICAgICAgICAgICByZWNvcmRlciBlcnJvciBjaGFubmVsIChgb25FcnJvcmAgb24gc2libGluZyBvYnNlcnZlcnMpO1xuICogICAgICAgICAgICAgLSB0aGUgY2FwdHVyZSBUQVBTIOKAlCBzeW50aGV0aWMgcmVjb3JkZXJzIHBsYWNlZCBvbiB0aGVcbiAqICAgICAgICAgICAgICAgZXhpc3RpbmcgaW5saW5lIGRpc3BhdGNoIGxpc3RzIHNvIHRoZSB0aHJlZSBkaXNwYXRjaCBzaXRlc1xuICogICAgICAgICAgICAgICAoYFNjb3BlRmFjYWRlLl9pbnZva2VIb29rYCwgYFNjb3BlRmFjYWRlLmVtaXRFdmVudGAsXG4gKiAgICAgICAgICAgICAgIGBGbG93UmVjb3JkZXJEaXNwYXRjaGVyYCkgbmVlZCBOTyBwZXItc2l0ZSB0aWVyIGxvZ2ljOiBhXG4gKiAgICAgICAgICAgICAgIHRhcCdzIGhvb2sgYm9keSBJUyBgZGlzcGF0Y2hlci5jYXB0dXJlKC4uLilgLCBhbmQgYmVjYXVzZVxuICogICAgICAgICAgICAgICB0aGUgdGFwIHNpdHMgaW4gdGhlIHNhbWUgbG9vcCBhcyBpbmxpbmUgcmVjb3JkZXJzIGl0IHNlZXNcbiAqICAgICAgICAgICAgICAgZXhhY3RseSB0aGUgcG9zdC1yZWRhY3Rpb24gZXZlbnQgb2JqZWN0IGlubGluZSBvYnNlcnZlcnNcbiAqICAgICAgICAgICAgICAgc2VlIOKAlCBjYXB0dXJlIGNhbiBuZXZlciBvYnNlcnZlIGEgcHJlLXJlZGFjdGlvbiB2YWx1ZTtcbiAqICAgICAgICAgICAgIC0gdGhlIHRlcm1pbmFsIGZsdXNoIChCbG9jayA4KSB3aXRoIGhvbmVzdCBzdHJhbmRpbmdcbiAqICAgICAgICAgICAgICAgYWNjb3VudGluZywgYW5kIHRoZSBCbG9jayA5IHN0YXRzIHN1cmZhY2UuXG4gKlxuICogUm9sZTogICAgIE9uZSBpbnN0YW5jZSBwZXIgYEZsb3dDaGFydEV4ZWN1dG9yYCwgY3JlYXRlZCBMQVpJTFkgb24gdGhlXG4gKiAgICAgICAgICAgZmlyc3QgYGRlbGl2ZXJ5OiAnZGVmZXJyZWQnYCBhdHRhY2ggKHplcm8gYWxsb2NhdGlvbiB3aGVuIG5vYm9keVxuICogICAgICAgICAgIG9wdHMgaW4g4oCUIG1pcnJvcnMgdGhlIGVtaXQgZmFzdC1wYXRoIHByZWNlZGVudCkuIEhvbGRzIHRoZSBPTkVcbiAqICAgICAgICAgICBgRGVmZXJyZWREaXNwYXRjaGVyYCAob25lIG1lcmdlZCBxdWV1ZSwgdG90YWwgb3JkZXIgYWNyb3NzXG4gKiAgICAgICAgICAgY2hhbm5lbHMpIHBsdXMgdGhlIHJlZ2lzdHJ5IG9mIGRlZmVycmVkIHJlY29yZGVycy5cbiAqXG4gKiBEZWxpdmVyeTogYSBkZWZlcnJlZCByZWNvcmRlcidzIGhvb2tzIGFyZSBpbnZva2VkIHRocm91Z2ggdGhlIFNBTUVcbiAqIGBpbnZva2VSZWNvcmRlckhvb2tgIGhlbHBlciB0aGUgaW5saW5lIHRpZXIgdXNlcyAoUkZDLTAwMSDCpzkgbWl0aWdhdGlvbikg4oCUXG4gKiBvbmUgYmVhdCBiZWhpbmQsIHdpdGggYGVudmVsb3BlLnBheWxvYWRgIG1hdGVyaWFsaXplZCBwZXIgdGhlIGNhcHR1cmVcbiAqIHBvbGljeSAoYCdzdW1tYXJ5J2AgZGVmYXVsdCDigJQgYm91bmRlZCwgcmVmZXJlbmNlLWZyZWU7IGAnY2xvbmUnYCDigJQgZnVsbFxuICogc3RydWN0dXJhbCBjb3B5LCBldmVudC1zaGFwZSBjb21wYXRpYmxlIHdpdGggaW5saW5lOyBgJ3JlZidgIOKAlCB0aGUgbGl2ZVxuICogZXZlbnQgb2JqZWN0LCBkZXYtd2FybmVkKS5cbiAqXG4gKiBDaGFubmVsIGZpbHRlcjogYSByZWdpc3RyYXRpb24gcmVtZW1iZXJzIHdoaWNoIGNoYW5uZWxzIHdvdWxkIGhhdmVcbiAqIHJlYWNoZWQgdGhlIHJlY29yZGVyIGlubGluZSAoc2NvcGUtbGlzdCByZWNvcmRlcnMgc2VlIGBzY29wZWAgKyBgZW1pdGBcbiAqIGVudmVsb3BlczsgZmxvdy1saXN0IHJlY29yZGVycyBzZWUgYGZsb3dgIGVudmVsb3BlcykgYW5kIHNraXBzIHRoZSByZXN0IOKAlFxuICogc2FtZSByZWFjaCBhcyB0aGUgaW5saW5lIHRpZXIsIG9uZSBiZWF0IGJlaGluZC5cbiAqL1xuXG5pbXBvcnQgeyBpbnZva2VSZWNvcmRlckhvb2sgfSBmcm9tICcuLi9jYXB0dXJlL2ludm9rZUhvb2suanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBDYXB0dXJlQ2hhbm5lbCxcbiAgdHlwZSBDYXB0dXJlRW52ZWxvcGUsXG4gIHR5cGUgQ2FwdHVyZVBvbGljeSxcbiAgdHlwZSBEaXNwYXRjaGVyU3RhdHMsXG4gIHR5cGUgRHJhaW5SZXN1bHQsXG4gIHR5cGUgT3ZlcmZsb3dQb2xpY3ksXG4gIERlZmVycmVkRGlzcGF0Y2hlcixcbn0gZnJvbSAnLi4vb2JzZXJ2ZXItcXVldWUvaW5kZXguanMnO1xuaW1wb3J0IHsgZGVzY3JpYmVUaHJvd24sIGhvb2tzT24sIG9wZXJhdGlvbkZvciB9IGZyb20gJy4uL3JlY29yZGVyL2hvb2tzLmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcblxuLyoqIERlbGl2ZXJ5IHRpZXIgZm9yIGFuIGF0dGFjaGVkIG9ic2VydmVyIChSRkMtMDAxKS4gKi9cbmV4cG9ydCB0eXBlIE9ic2VydmVyRGVsaXZlcnkgPSAnaW5saW5lJyB8ICdkZWZlcnJlZCc7XG5cbi8qKlxuICogT3B0aW9ucyBiYWcgYWNjZXB0ZWQgYnkgZXZlcnkgYGF0dGFjaCpSZWNvcmRlcmAgY2FsbC5cbiAqXG4gKiBgZGVsaXZlcnk6ICdkZWZlcnJlZCdgIG9wdHMgdGhlIHJlY29yZGVyIGludG8gdGhlIGJvdW5kZWQgY2FwdHVyZSBxdWV1ZVxuICogKFwib25lIGJlYXQgYmVoaW5kXCIpOyBhYnNlbnQgLyBgJ2lubGluZSdgIGtlZXBzIHRoZSBoaXN0b3JpY2FsIHN5bmNocm9ub3VzXG4gKiBjYWxsIOKAlCBieXRlLWlkZW50aWNhbCB0byB0aGUgcHJlLVJGQyBwYXRoLlxuICpcbiAqIFRoZSByZW1haW5pbmcgZmllbGRzIGNvbmZpZ3VyZSB0aGUgZXhlY3V0b3IncyBPTkUgc2hhcmVkIGRpc3BhdGNoZXIgYW5kXG4gKiBhcmUgYXBwbGllZCB3aGVuIHRoZSBGSVJTVCBkZWZlcnJlZCBhdHRhY2ggY3JlYXRlcyBpdDsgbGF0ZXIgYXR0YWNoZXNcbiAqIHBhc3NpbmcgZGlmZmVyZW50IHZhbHVlcyBnZXQgYSBkZXYtbW9kZSB3YXJuaW5nIGFuZCBrZWVwIHRoZSBvcmlnaW5hbFxuICogY29uZmlndXJhdGlvbiAob25lIHF1ZXVlIHBlciBleGVjdXRvciDigJQgcGVyLXJlY29yZGVyIHF1ZXVlcyB3b3VsZCBicmVha1xuICogdGhlIHRvdGFsIGNyb3NzLWNoYW5uZWwgb3JkZXIpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dGFjaFJlY29yZGVyT3B0aW9ucyB7XG4gIC8qKiBgJ2RlZmVycmVkJ2AgPSBjYXB0dXJlIOKGkiBxdWV1ZSDihpIgbmV4dC1jaGVja3BvaW50IGRlbGl2ZXJ5LiBEZWZhdWx0IGAnaW5saW5lJ2AuICovXG4gIHJlYWRvbmx5IGRlbGl2ZXJ5PzogT2JzZXJ2ZXJEZWxpdmVyeTtcbiAgLyoqXG4gICAqIFBheWxvYWQgbWF0ZXJpYWxpemF0aW9uIGF0IGNhcHR1cmUgdGltZS4gRGVmYXVsdCBgJ2Nsb25lJ2Ag4oCUIHlvdXJcbiAgICogcmVjb3JkZXIncyBob29rcyByZWNlaXZlIHRoZSBTQU1FIGV2ZW50IHNoYXBlIGFzIGlubGluZSBkZWxpdmVyeVxuICAgKiAoYHN0cnVjdHVyZWRDbG9uZWBkOyBgZS5rZXlgL2BlLnZhbHVlYC9gZS5ydW50aW1lU3RhZ2VJZGAgYWxsIHdvcmtcbiAgICogdW5jaGFuZ2VkKSwgc28gYHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfWAgaXMgYSBkcm9wLWluIHBvcnQuXG4gICAqIGAnc3VtbWFyeSdgIOKAlCBhIGJvdW5kZWQgdHlwZS9zaXplL3ByZXZpZXcgZGlnZXN0IChgUGF5bG9hZFN1bW1hcnlgKVxuICAgKiBpbnN0ZWFkIG9mIHRoZSBldmVudCBzaGFwZTogY2hlYXBlciBjYXB0dXJlIGZvciB0ZWxlbWV0cnktb25seVxuICAgKiBjb25zdW1lcnMgdGhhdCBkb24ndCByZWFkIGRvbWFpbiBmaWVsZHMuIGAncmVmJ2Ag4oCUIHBhc3MtdGhyb3VnaCBieVxuICAgKiByZWZlcmVuY2U7IHRoZSBjYWxsZXIgYXNzZXJ0cyBpbW11dGFiaWxpdHkgKGRldi1tb2RlIHdhcm5zKS5cbiAgICovXG4gIHJlYWRvbmx5IGNhcHR1cmU/OiBDYXB0dXJlUG9saWN5O1xuICAvKiogUXVldWUgYm91bmQg4oCUIGRlZmF1bHQgMTAgMDAwLiAqL1xuICByZWFkb25seSBtYXhRdWV1ZT86IG51bWJlcjtcbiAgLyoqIE92ZXJmbG93IHBvbGljeSBhdCBgbWF4UXVldWVgIOKAlCBkZWZhdWx0IGAnZHJvcC1vbGRlc3QnYC4gKi9cbiAgcmVhZG9ubHkgb3ZlcmZsb3c/OiBPdmVyZmxvd1BvbGljeTtcbiAgLyoqIGAnc2FtcGxlJ2Agb3ZlcmZsb3cgb25seSDigJQgYWRtaXQgMSBpbiB0aGlzIG1hbnkgc2F0dXJhdGVkIGFycml2YWxzLiAqL1xuICByZWFkb25seSBzYW1wbGVFdmVyeT86IG51bWJlcjtcbiAgLyoqIFBlci1jaGVja3BvaW50IGZsdXNoIGJ1ZGdldCwgbXMgKEExKSDigJQgZGVmYXVsdCAyOyBgSW5maW5pdHlgID0gZnVsbCBkcmFpbi4gKi9cbiAgcmVhZG9ubHkgZmx1c2hCdWRnZXRNcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgQmxvY2sgOSBvYnNlcnZhYmlsaXR5IHN1cmZhY2Ug4oCUIGBzbmFwc2hvdC5vYnNlcnZlclN0YXRzYC4gVGhlIEE0XG4gKiBkaXNwYXRjaGVyIHN0YXRzIHBsdXMgdGhlIHRlcm1pbmFsLWZsdXNoIHN0cmFuZGluZyBjb3VudCBmcm9tIEJsb2NrIDguXG4gKiBQcmVzZW50IG9uIGBSdW50aW1lU25hcHNob3RgIG9ubHkgd2hlbiBhIGRlZmVycmVkIG9ic2VydmVyIHdhcyBhdHRhY2hlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNlcnZlclN0YXRzIGV4dGVuZHMgRGlzcGF0Y2hlclN0YXRzIHtcbiAgLyoqXG4gICAqIEVudmVsb3BlcyBzdGlsbCBxdWV1ZWQgd2hlbiBhIHRlcm1pbmFsIGZsdXNoIGhpdCBpdHMgcnVuYXdheS1jYXNjYWRlXG4gICAqIHJvdW5kIGNhcCAoQmxvY2sgOCkuIGAwYCBpbiBhbnkgc2FuZSBydW4g4oCUIGEgbm9uLXplcm8gdmFsdWUgbWVhbnMgYVxuICAgKiBsaXN0ZW5lciBrZXB0IGVucXVldWVpbmcgd29yayBhdCBlbmQtb2YtcnVuIGFuZCBkZWxpdmVyeSB3YXMgY3V0IG9mZlxuICAgKiAoYWxzbyBkZXYtd2FybmVkIGF0IHRoZSBtb21lbnQgaXQgaGFwcGVuZWQpLiBOZXZlciBzaWxlbnQuXG4gICAqL1xuICByZWFkb25seSB0ZXJtaW5hbFN0cmFuZGVkOiBudW1iZXI7XG59XG5cbi8qKiBSZXN1bHQgc2hhcGUgb2YgYGV4ZWN1dG9yLmRyYWluT2JzZXJ2ZXJzKClgIOKAlCBzZWUgYERyYWluUmVzdWx0YC4gKi9cbmV4cG9ydCB0eXBlIE9ic2VydmVyRHJhaW5SZXN1bHQgPSBEcmFpblJlc3VsdDtcblxuLyoqIFdlbGwta25vd24gaWRzIG9mIHRoZSBzeW50aGV0aWMgY2FwdHVyZSB0YXBzIChpbnRlcm5hbCwgZG9jdW1lbnRlZCBmb3IgZGVidWdnaW5nKS4gKi9cbmV4cG9ydCBjb25zdCBERUZFUlJFRF9TQ09QRV9UQVBfSUQgPSAnX19kZWZlcnJlZC1zY29wZS10YXBfXyc7XG5leHBvcnQgY29uc3QgREVGRVJSRURfRkxPV19UQVBfSUQgPSAnX19kZWZlcnJlZC1mbG93LXRhcF9fJztcblxuLyoqIENoYW5uZWwgcmVhY2ggb2YgdGhlIHNjb3BlLXJlY29yZGVyIGxpc3QgKHNjb3BlIGV2ZW50cyArIGVtaXQgZXZlbnRzKS4gKi9cbmNvbnN0IFNDT1BFX0xJU1RfQ0hBTk5FTFM6IHJlYWRvbmx5IENhcHR1cmVDaGFubmVsW10gPSBbJ3Njb3BlJywgJ2VtaXQnXTtcbi8qKiBDaGFubmVsIHJlYWNoIG9mIHRoZSBmbG93LXJlY29yZGVyIGxpc3QuICovXG5jb25zdCBGTE9XX0xJU1RfQ0hBTk5FTFM6IHJlYWRvbmx5IENhcHR1cmVDaGFubmVsW10gPSBbJ2Zsb3cnXTtcblxuLyoqIERpc3BhdGNoZXItbGV2ZWwgb3B0aW9ucyBzbmFwc2hvdCwga2VwdCBmb3IgY29uZmxpY3QgZGV0ZWN0aW9uLiAqL1xuaW50ZXJmYWNlIEFwcGxpZWREaXNwYXRjaGVyQ29uZmlnIHtcbiAgcmVhZG9ubHkgY2FwdHVyZT86IENhcHR1cmVQb2xpY3k7XG4gIHJlYWRvbmx5IG1heFF1ZXVlPzogbnVtYmVyO1xuICByZWFkb25seSBvdmVyZmxvdz86IE92ZXJmbG93UG9saWN5O1xuICByZWFkb25seSBzYW1wbGVFdmVyeT86IG51bWJlcjtcbiAgcmVhZG9ubHkgZmx1c2hCdWRnZXRNcz86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIERlZmVycmVkUmVnaXN0cmF0aW9uIHtcbiAgcmVhZG9ubHkgcmVjb3JkZXI6IFNjb3BlUmVjb3JkZXIgfCBGbG93UmVjb3JkZXI7XG4gIC8qKiBXaGljaCBlbnZlbG9wZSBjaGFubmVscyByZWFjaCB0aGlzIHJlY29yZGVyIChpbmxpbmUtdGllciBwYXJpdHkpLiAqL1xuICByZWFkb25seSBjaGFubmVsczogU2V0PENhcHR1cmVDaGFubmVsPjtcbn1cblxuZXhwb3J0IGNsYXNzIERlZmVycmVkT2JzZXJ2ZXJUaWVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwYXRjaGVyOiBEZWZlcnJlZERpc3BhdGNoZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cmF0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBEZWZlcnJlZFJlZ2lzdHJhdGlvbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHBsaWVkQ29uZmlnOiBBcHBsaWVkRGlzcGF0Y2hlckNvbmZpZztcbiAgLyoqIERlZHVwIG1lbW9yeSBmb3IgdGhlIGRldi13YXJuIHNlYW0gKG9uZSB3YXJuaW5nIHBlciB1bmlxdWUgbWVzc2FnZSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgd2FybmVkTWVzc2FnZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSB0ZXJtaW5hbFN0cmFuZGVkID0gMDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKSB7XG4gICAgdGhpcy5hcHBsaWVkQ29uZmlnID0ge1xuICAgICAgLy8gQXR0YWNoLXN1cmZhY2UgZGVmYXVsdCBpcyAnY2xvbmUnIChyZXZpZXcgQ1JJVElDQUwtMik6IGEgcmVjb3JkZXJcbiAgICAgIC8vIHBvcnRlZCB3aXRoIGB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH1gIGtlZXBzIHJlY2VpdmluZyB0aGUgU0FNRVxuICAgICAgLy8gZXZlbnQgc2hhcGUgYXMgaW5saW5lIChlLmtleS9lLnZhbHVlL2UucnVudGltZVN0YWdlSWQgYWxsIGludGFjdCkuXG4gICAgICAvLyBUaGUgbW9kdWxlLWludGVybmFsIGVudmVsb3BlIGRlZmF1bHQgc3RheXMgJ3N1bW1hcnknIGZvciByYXctXG4gICAgICAvLyBlbnZlbG9wZSBjb25zdW1lcnM7ICdzdW1tYXJ5JyBoZXJlIGlzIGFuIGV4cGxpY2l0IHRlbGVtZXRyeSBjaG9pY2UuXG4gICAgICBjYXB0dXJlOiBvcHRpb25zPy5jYXB0dXJlID8/ICdjbG9uZScsXG4gICAgICBtYXhRdWV1ZTogb3B0aW9ucz8ubWF4UXVldWUsXG4gICAgICBvdmVyZmxvdzogb3B0aW9ucz8ub3ZlcmZsb3csXG4gICAgICBzYW1wbGVFdmVyeTogb3B0aW9ucz8uc2FtcGxlRXZlcnksXG4gICAgICBmbHVzaEJ1ZGdldE1zOiBvcHRpb25zPy5mbHVzaEJ1ZGdldE1zLFxuICAgIH07XG4gICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IERlZmVycmVkRGlzcGF0Y2hlcih7XG4gICAgICBtYXhRdWV1ZTogb3B0aW9ucz8ubWF4UXVldWUsXG4gICAgICBvdmVyZmxvdzogb3B0aW9ucz8ub3ZlcmZsb3csXG4gICAgICBzYW1wbGVFdmVyeTogb3B0aW9ucz8uc2FtcGxlRXZlcnksXG4gICAgICBjYXB0dXJlUG9saWN5OiBvcHRpb25zPy5jYXB0dXJlID8/ICdjbG9uZScsXG4gICAgICBmbHVzaEJ1ZGdldE1zOiBvcHRpb25zPy5mbHVzaEJ1ZGdldE1zLFxuICAgICAgLy8gVGhlIGRldi13YXJuIHNlYW0gKFJGQy0wMDEgwqdcIlJlc29sdXRpb246IHRoZSBkZXYtd2FybiBzZWFtXCIpOiB0aGVcbiAgICAgIC8vIHB1cmUgbW9kdWxlIGludm9rZXMgYHdhcm5gIG9uIGV2ZXJ5ICdyZWYnIGNhcHR1cmUgYW5kIGV2ZXJ5ICdjbG9uZSdcbiAgICAgIC8vIGRlZ3JhZGF0aW9uOyB0aGUgdGllciBiaW5kcyBpdCB0byB0aGUgY2VudHJhbCBpc0Rldk1vZGUoKSBmbGFnIGFuZFxuICAgICAgLy8gZGVkdXBlcyBieSBtZXNzYWdlIHNvIGEgaG90IGxvb3AgY2Fubm90IHNwYW0gdGhlIGNvbnNvbGUuXG4gICAgICBob29rczogeyB3YXJuOiAobWVzc2FnZSkgPT4gdGhpcy5kZXZXYXJuRGVkdXBlZChtZXNzYWdlKSB9LFxuICAgICAgLy8gTGlzdGVuZXIgZmFpbHVyZXMgKHN5bmMgdGhyb3dzIEFORCBhc3luYyByZWplY3Rpb25zKSByb3V0ZSBpbnRvIHRoZVxuICAgICAgLy8gZXhpc3RpbmcgcmVjb3JkZXIgZXJyb3IgY2hhbm5lbCDigJQgc2VlIHJvdXRlTGlzdGVuZXJFcnJvci5cbiAgICAgIG9uRXJyb3I6IChlcnJvciwgY3R4KSA9PiB0aGlzLnJvdXRlTGlzdGVuZXJFcnJvcihlcnJvciwgY3R4Lmxpc3RlbmVySWQsIGN0eC5lbnZlbG9wZSwgY3R4LnBoYXNlKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWdpc3RyeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSByZWNvcmRlciBmb3IgZGVmZXJyZWQgZGVsaXZlcnkgb24gdGhlIHNjb3BlLWxpc3QgY2hhbm5lbHNcbiAgICogKGBzY29wZWAgKyBgZW1pdGApIGFuZC9vciB0aGUgZmxvdyBjaGFubmVsLiBJZGVtcG90ZW50IGJ5IGlkIOKAlCBzYW1lIGlkXG4gICAqIHJlcGxhY2VzIHRoZSByZWNvcmRlciBvYmplY3Q7IGNoYW5uZWwgbGlzdHMgTUVSR0UgYWNyb3NzIGNhbGxzIChzYW1lIGFzXG4gICAqIHRoZSBpbmxpbmUgdGllciwgd2hlcmUgYGF0dGFjaFNjb3BlUmVjb3JkZXIoeClgICsgYGF0dGFjaEZsb3dSZWNvcmRlcih4KWBcbiAgICogbGFuZHMgYHhgIG9uIGJvdGggbGlzdHMpLiBMYXRlciBhdHRhY2hlcyBwYXNzaW5nIGRpc3BhdGNoZXItbGV2ZWxcbiAgICogb3B0aW9ucyB0aGF0IGRpZmZlciBmcm9tIHRoZSBmaXJzdCBhdHRhY2gncyBjb25maWd1cmF0aW9uIGtlZXAgdGhlXG4gICAqIG9yaWdpbmFsIGNvbmZpZyBhbmQgZGV2LXdhcm4uXG4gICAqL1xuICByZWdpc3RlcihcbiAgICByZWNvcmRlcjogU2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlcixcbiAgICBsaXN0czogeyBzY29wZT86IGJvb2xlYW47IGZsb3c/OiBib29sZWFuIH0sXG4gICAgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy53YXJuT25Db25maWdDb25mbGljdChyZWNvcmRlci5pZCwgb3B0aW9ucyk7XG4gICAgY29uc3QgY2hhbm5lbHMgPSB0aGlzLnJlZ2lzdHJhdGlvbnMuZ2V0KHJlY29yZGVyLmlkKT8uY2hhbm5lbHMgPz8gbmV3IFNldDxDYXB0dXJlQ2hhbm5lbD4oKTtcbiAgICBpZiAobGlzdHMuc2NvcGUpIGZvciAoY29uc3QgYyBvZiBTQ09QRV9MSVNUX0NIQU5ORUxTKSBjaGFubmVscy5hZGQoYyk7XG4gICAgaWYgKGxpc3RzLmZsb3cpIGZvciAoY29uc3QgYyBvZiBGTE9XX0xJU1RfQ0hBTk5FTFMpIGNoYW5uZWxzLmFkZChjKTtcbiAgICB0aGlzLnJlZ2lzdHJhdGlvbnMuc2V0KHJlY29yZGVyLmlkLCB7IHJlY29yZGVyLCBjaGFubmVscyB9KTtcbiAgICB0aGlzLmRpc3BhdGNoZXIuYWRkTGlzdGVuZXIocmVjb3JkZXIuaWQsIChlbnZlbG9wZSkgPT4ge1xuICAgICAgY29uc3QgcmVnaXN0cmF0aW9uID0gdGhpcy5yZWdpc3RyYXRpb25zLmdldChyZWNvcmRlci5pZCk7XG4gICAgICBpZiAoIXJlZ2lzdHJhdGlvbiB8fCAhcmVnaXN0cmF0aW9uLmNoYW5uZWxzLmhhcyhlbnZlbG9wZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgICAgLy8gU0FNRSBpbnZva2UgaGVscGVyIGFzIHRoZSBpbmxpbmUgdGllciAoUkZDLTAwMSDCpzkgbWl0aWdhdGlvbikg4oCUIGFcbiAgICAgIC8vIHJldHVybmVkIFByb21pc2UgbGFuZHMgaW4gdGhlIGRpc3BhdGNoZXIncyBpbmZsaWdodCBzZXQuXG4gICAgICByZXR1cm4gaW52b2tlUmVjb3JkZXJIb29rKHJlY29yZGVyLCBlbnZlbG9wZS5tZXRob2QsIGVudmVsb3BlLnBheWxvYWQpIGFzIHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZ2l2ZW4gY2hhbm5lbCBsaXN0cyBmcm9tIGEgcmVnaXN0cmF0aW9uIChtaXJyb3JzIHRoZSBpbmxpbmVcbiAgICogdGllciwgd2hlcmUgYGRldGFjaFNjb3BlUmVjb3JkZXJgIC8gYGRldGFjaEZsb3dSZWNvcmRlcmAgZWFjaCBjbGVhciBvbmVcbiAgICogbGlzdCkuIFdoZW4gbm8gY2hhbm5lbHMgcmVtYWluLCB0aGUgbGlzdGVuZXIgaXMgZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIHJlbW92ZUZyb21MaXN0cyhpZDogc3RyaW5nLCBsaXN0czogeyBzY29wZT86IGJvb2xlYW47IGZsb3c/OiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSB0aGlzLnJlZ2lzdHJhdGlvbnMuZ2V0KGlkKTtcbiAgICBpZiAoIXJlZ2lzdHJhdGlvbikgcmV0dXJuO1xuICAgIGlmIChsaXN0cy5zY29wZSkgZm9yIChjb25zdCBjIG9mIFNDT1BFX0xJU1RfQ0hBTk5FTFMpIHJlZ2lzdHJhdGlvbi5jaGFubmVscy5kZWxldGUoYyk7XG4gICAgaWYgKGxpc3RzLmZsb3cpIGZvciAoY29uc3QgYyBvZiBGTE9XX0xJU1RfQ0hBTk5FTFMpIHJlZ2lzdHJhdGlvbi5jaGFubmVscy5kZWxldGUoYyk7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbi5jaGFubmVscy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLnJlZ2lzdHJhdGlvbnMuZGVsZXRlKGlkKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5yZW1vdmVMaXN0ZW5lcihpZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBgaWRgIGlzIHJlZ2lzdGVyZWQgZm9yIGRlZmVycmVkIGRlbGl2ZXJ5IChhbnkgY2hhbm5lbCkuICovXG4gIGhhcyhpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cmF0aW9ucy5oYXMoaWQpO1xuICB9XG5cbiAgLyoqIERlZmVycmVkIHJlY29yZGVycyB3aG9zZSByZWFjaCBpbmNsdWRlcyB0aGUgc2NvcGUgbGlzdCAoc2NvcGUrZW1pdCkuICovXG4gIHNjb3BlTGlzdFJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW10ge1xuICAgIHJldHVybiB0aGlzLmJ5Q2hhbm5lbCgnc2NvcGUnKSBhcyBTY29wZVJlY29yZGVyW107XG4gIH1cblxuICAvKiogRGVmZXJyZWQgcmVjb3JkZXJzIHdob3NlIHJlYWNoIGluY2x1ZGVzIHRoZSBmbG93IGNoYW5uZWwuICovXG4gIGZsb3dMaXN0UmVjb3JkZXJzKCk6IEZsb3dSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5ieUNoYW5uZWwoJ2Zsb3cnKSBhcyBGbG93UmVjb3JkZXJbXTtcbiAgfVxuXG4gIC8qKiBSZXNldCBkZWZlcnJlZCByZWNvcmRlcnMgYmVmb3JlIGEgZnJlc2ggcnVuIChzYW1lIGNvbnRyYWN0IGFzIGlubGluZSkuICovXG4gIGNsZWFyUmVjb3JkZXJzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgeyByZWNvcmRlciB9IG9mIHRoaXMucmVnaXN0cmF0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgKHJlY29yZGVyIGFzIHsgY2xlYXI/OiAoKSA9PiB2b2lkIH0pLmNsZWFyPy4oKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgQ2FwdHVyZSB0YXBzIChCbG9jayA3KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQnVpbGQgdGhlIHN5bnRoZXRpYyBzY29wZS1jaGFubmVsIHRhcCDigJQgYSBgU2NvcGVSZWNvcmRlcmAgcGxhY2VkIG9uIHRoZVxuICAgKiBub3JtYWwgc2NvcGUtcmVjb3JkZXIgbGlzdCB3aG9zZSBob29rcyBjYXB0dXJlIGludG8gdGhlIHF1ZXVlLiBCdWlsdFxuICAgKiBmcmVzaCBwZXIgdHJhdmVyc2VyIHNvIGl0IHJlZmxlY3RzIHRoZSBjdXJyZW50IHJlZ2lzdHJhdGlvbnMuIE9ubHlcbiAgICogbWV0aG9kcyBzb21lIGRlZmVycmVkIHJlY29yZGVyIGFjdHVhbGx5IGltcGxlbWVudHMgYXJlIHByZXNlbnQgKG5vXG4gICAqIHdhc3RlZCBjYXB0dXJlcykuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBub3RoaW5nIGlzIHJlZ2lzdGVyZWQgZm9yXG4gICAqIHRoZSBzY29wZSBsaXN0LlxuICAgKlxuICAgKiBSZWRhY3Rpb24gb3JkZXJpbmc6IHRoZSB0YXAgaXMgaW52b2tlZCBmcm9tIHRoZSBTQU1FIGxvb3BzIGFzIGlubGluZVxuICAgKiByZWNvcmRlcnMgKGBfaW52b2tlSG9va2AgLyBgZW1pdEV2ZW50YCksIHdoaWNoIHJlY2VpdmUgZXZlbnRzIEFGVEVSIHRoZVxuICAgKiByZWRhY3Rpb24gZGVjaXNpb24g4oCUIHNvIGEgY2FwdHVyZWQgcGF5bG9hZCBjYW4gbmV2ZXIgY29udGFpbiBhXG4gICAqIHByZS1yZWRhY3Rpb24gdmFsdWUgdGhlIGlubGluZSB0aWVyIHdvdWxkIG5vdCBoYXZlIHNlZW4uXG4gICAqL1xuICBidWlsZFNjb3BlVGFwKCk6IFNjb3BlUmVjb3JkZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVycyA9IHRoaXMuc2NvcGVMaXN0UmVjb3JkZXJzKCk7XG4gICAgaWYgKHJlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgaWQ6IERFRkVSUkVEX1NDT1BFX1RBUF9JRCB9O1xuICAgIC8vIERlcml2ZWQgZnJvbSB0aGUgaG9vayByZWdpc3RyeTogZXZlcnkgaG9vayBvZiB0aGUgc2NvcGUgY2hhbm5lbCBhbmQgb2YgdGhlIGVtaXQgY2hhbm5lbFxuICAgIC8vICh3aGljaCByaWRlcyB0aGUgc2NvcGUgbGlzdCkg4oCUIGEgaG9vayB0aGUgcmVnaXN0cnkgZ2FpbnMgaXMgdGFwcGVkIHdpdGggbm8gZWRpdCBoZXJlLlxuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBbJ3Njb3BlJywgJ2VtaXQnXSBhcyBjb25zdCkge1xuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgaG9va3NPbihjaGFubmVsKSkge1xuICAgICAgICBpZiAoIXRoaXMuYW55SW1wbGVtZW50cyhyZWNvcmRlcnMsIG1ldGhvZCkpIGNvbnRpbnVlO1xuICAgICAgICB0YXBbbWV0aG9kXSA9IChldmVudDogdW5rbm93bikgPT4gdGhpcy5jYXB0dXJlU2NvcGVFdmVudChjaGFubmVsLCBtZXRob2QsIGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcCBhcyB1bmtub3duIGFzIFNjb3BlUmVjb3JkZXI7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHN5bnRoZXRpYyBmbG93LWNoYW5uZWwgdGFwIOKAlCBhIGBGbG93UmVjb3JkZXJgIGFwcGVuZGVkIHRvIHRoZVxuICAgKiBmbG93LXJlY29yZGVycyBsaXN0IGhhbmRlZCB0byB0aGUgdHJhdmVyc2VyLiBTYW1lIGNvbnRyYWN0IGFzXG4gICAqIHtAbGluayBidWlsZFNjb3BlVGFwfS5cbiAgICovXG4gIGJ1aWxkRmxvd1RhcCgpOiBGbG93UmVjb3JkZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVycyA9IHRoaXMuZmxvd0xpc3RSZWNvcmRlcnMoKTtcbiAgICBpZiAocmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB0YXA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBpZDogREVGRVJSRURfRkxPV19UQVBfSUQgfTtcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBob29rc09uKCdmbG93JykpIHtcbiAgICAgIGlmICghdGhpcy5hbnlJbXBsZW1lbnRzKHJlY29yZGVycywgbWV0aG9kKSkgY29udGludWU7XG4gICAgICB0YXBbbWV0aG9kXSA9IChldmVudDogdW5rbm93bikgPT4gdGhpcy5jYXB0dXJlRmxvd0V2ZW50KG1ldGhvZCwgZXZlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gdGFwIGFzIHVua25vd24gYXMgRmxvd1JlY29yZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIERpcmVjdCBjYXB0dXJlIGZvciBleGVjdXRvci1zeW50aGVzaXplZCBldmVudHMgdGhhdCBieXBhc3MgdGhlIGRpc3BhdGNoXG4gICAqIHNpdGVzIChlLmcuIHRoZSBzeW50aGV0aWMgYG9uUmVzdW1lYCB0aGUgZXhlY3V0b3IgZmlyZXMgb24gcmVzdW1lKS5cbiAgICovXG4gIGNhcHR1cmUoY2hhbm5lbDogQ2FwdHVyZUNoYW5uZWwsIG1ldGhvZDogc3RyaW5nLCBydW50aW1lU3RhZ2VJZDogc3RyaW5nLCBydW5JZDogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaGVyLmNhcHR1cmUoeyBjaGFubmVsLCBtZXRob2QsIHJ1bnRpbWVTdGFnZUlkLCBydW5JZCwgcGF5bG9hZCB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUZXJtaW5hbCBmbHVzaCArIGRyYWluIChCbG9jayA4KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogU3luY2hyb25vdXNseSBkZWxpdmVyIGV2ZXJ5dGhpbmcgc3RpbGwgcXVldWVkIOKAlCBjYWxsZWQgYnkgdGhlIGV4ZWN1dG9yXG4gICAqIGF0IHRoZSBPVVRFUk1PU1QgcnVuIGJvdW5kYXJ5IChyZXNvbHZlLCByZWplY3QsIHBhdXNlKSwgQkVGT1JFIGBydW4oKWBcbiAgICogcmV0dXJucyAvIHJldGhyb3dzIC8gdGhlIGNoZWNrcG9pbnQgYmVjb21lcyBhdmFpbGFibGUuIEluc3BlY3RzXG4gICAqIGBmbHVzaFN5bmNgJ3MgYHJlbWFpbmluZ2AgKHJldmlld2VyIE4xKTogYGZsdXNoU3luY2AgYWxyZWFkeSBsb29wc1xuICAgKiBzbmFwc2hvdCByb3VuZHMgdXAgdG8gaXRzIHJ1bmF3YXktY2FzY2FkZSBjYXAsIHNvIGEgbm9uLXplcm8gcmVtYWluZGVyXG4gICAqIG1lYW5zIGEgcGF0aG9sb2dpY2FsIHNlbGYtZW5xdWV1ZWluZyBsaXN0ZW5lciDigJQgY291bnRlZCBpblxuICAgKiBgb2JzZXJ2ZXJTdGF0cy50ZXJtaW5hbFN0cmFuZGVkYCBhbmQgZGV2LXdhcm5lZCwgbmV2ZXIgc2lsZW50LlxuICAgKi9cbiAgdGVybWluYWxGbHVzaCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlbWFpbmluZyB9ID0gdGhpcy5kaXNwYXRjaGVyLmZsdXNoTm93KCk7XG4gICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgIHRoaXMudGVybWluYWxTdHJhbmRlZCArPSByZW1haW5pbmc7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50anNdIGRlZmVycmVkIG9ic2VydmVyczogdGVybWluYWwgZmx1c2ggaGl0IHRoZSBydW5hd2F5LWNhc2NhZGUgY2FwIHdpdGggJHtyZW1haW5pbmd9IGAgK1xuICAgICAgICAgICAgJ2V2ZW50KHMpIHN0aWxsIHF1ZXVlZCDigJQgYSBsaXN0ZW5lciBrZXB0IGVucXVldWVpbmcgZHVyaW5nIHRoZSBmbHVzaC4gVGhlIHN0cmFuZGVkIGNvdW50IGlzICcgK1xuICAgICAgICAgICAgJ3N1cmZhY2VkIG9uIHNuYXBzaG90Lm9ic2VydmVyU3RhdHMudGVybWluYWxTdHJhbmRlZC4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCB0aGUgYmFja2xvZywgdGhlbiBzZXR0bGUgYXN5bmMgbGlzdGVuZXIgY29udGludWF0aW9ucyB1bmRlciBhXG4gICAqIGRlYWRsaW5lIOKAlCB0aGUgc2VydmVybGVzcyAvIGdyYWNlZnVsLXNodXRkb3duIHBhdHRlcm4gKFJGQy0wMDEgwqcxMSkuXG4gICAqL1xuICBkcmFpbihvcHRzPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IFByb21pc2U8T2JzZXJ2ZXJEcmFpblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXIuZHJhaW4ob3B0cyk7XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMgKEJsb2NrIDkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUaGUgYHNuYXBzaG90Lm9ic2VydmVyU3RhdHNgIHBheWxvYWQg4oCUIEE0IHN0YXRzICsgQmxvY2sgOCBzdHJhbmRpbmcuICovXG4gIGdldFN0YXRzKCk6IE9ic2VydmVyU3RhdHMge1xuICAgIHJldHVybiB7IC4uLnRoaXMuZGlzcGF0Y2hlci5nZXRTdGF0cygpLCB0ZXJtaW5hbFN0cmFuZGVkOiB0aGlzLnRlcm1pbmFsU3RyYW5kZWQgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbnRlcm5hbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBieUNoYW5uZWwoY2hhbm5lbDogQ2FwdHVyZUNoYW5uZWwpOiBBcnJheTxTY29wZVJlY29yZGVyIHwgRmxvd1JlY29yZGVyPiB7XG4gICAgY29uc3Qgb3V0OiBBcnJheTxTY29wZVJlY29yZGVyIHwgRmxvd1JlY29yZGVyPiA9IFtdO1xuICAgIGZvciAoY29uc3QgeyByZWNvcmRlciwgY2hhbm5lbHMgfSBvZiB0aGlzLnJlZ2lzdHJhdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChjaGFubmVscy5oYXMoY2hhbm5lbCkpIG91dC5wdXNoKHJlY29yZGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKiBOb3JtYWwgcHJvcGVydHkgbG9va3VwIOKAlCBpbnZvY2F0aW9uIHBhcml0eSB3aXRoIHRoZSBpbmxpbmUgdGllci4gKi9cbiAgcHJpdmF0ZSBhbnlJbXBsZW1lbnRzKHJlY29yZGVyczogQXJyYXk8U2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlcj4sIG1ldGhvZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlY29yZGVycy5zb21lKChyKSA9PiB0eXBlb2YgKHIgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJyk7XG4gIH1cblxuICAvKiogU2NvcGUvZW1pdCBldmVudHMgY2FycnkgdGhlaXIgb3duIGlkcyAoYHJ1bnRpbWVTdGFnZUlkYCArIGBwaXBlbGluZUlkYCkuICovXG4gIHByaXZhdGUgY2FwdHVyZVNjb3BlRXZlbnQoY2hhbm5lbDogQ2FwdHVyZUNoYW5uZWwsIG1ldGhvZDogc3RyaW5nLCBldmVudDogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGUgPSBldmVudCBhcyB7IHJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nOyBwaXBlbGluZUlkPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgdGhpcy5kaXNwYXRjaGVyLmNhcHR1cmUoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBlPy5ydW50aW1lU3RhZ2VJZCA/PyAnJyxcbiAgICAgIHJ1bklkOiBlPy5waXBlbGluZUlkID8/ICcnLFxuICAgICAgcGF5bG9hZDogZXZlbnQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogRmxvdyBldmVudHMgY2FycnkgaWRzIG9uIGB0cmF2ZXJzYWxDb250ZXh0YCAoYWJzZW50IG9uIGEgZmV3IGV2ZW50cykuICovXG4gIHByaXZhdGUgY2FwdHVyZUZsb3dFdmVudChtZXRob2Q6IHN0cmluZywgZXZlbnQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSAoZXZlbnQgYXMgeyB0cmF2ZXJzYWxDb250ZXh0PzogeyBydW50aW1lU3RhZ2VJZD86IHN0cmluZzsgcnVuSWQ/OiBzdHJpbmcgfSB9IHwgdW5kZWZpbmVkKVxuICAgICAgPy50cmF2ZXJzYWxDb250ZXh0O1xuICAgIHRoaXMuZGlzcGF0Y2hlci5jYXB0dXJlKHtcbiAgICAgIGNoYW5uZWw6ICdmbG93JyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBjdHg/LnJ1bnRpbWVTdGFnZUlkID8/ICcnLFxuICAgICAgcnVuSWQ6IGN0eD8ucnVuSWQgPz8gJycsXG4gICAgICBwYXlsb2FkOiBldmVudCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZSBhIGRlZmVycmVkIGxpc3RlbmVyIGZhaWx1cmUgaW50byB0aGUgZXhpc3RpbmcgcmVjb3JkZXIgZXJyb3JcbiAgICogY2hhbm5lbDogZXZlcnkgT1RIRVIgcmVnaXN0ZXJlZCBvYnNlcnZlciAoZGVmZXJyZWQgc2libGluZ3MgZmlyc3QsIGluXG4gICAqIHJlZ2lzdHJhdGlvbiBvcmRlcikgcmVjZWl2ZXMgYSBzY29wZS1zaGFwZWQgYG9uRXJyb3JgIGV2ZW50IOKAlCB0aGUgc2FtZVxuICAgKiBjb250cmFjdCB0aGUgaW5saW5lIHRpZXIgaG9ub3JzIHdoZW4gYSByZWNvcmRlciB0aHJvd3MgbWlkLWRpc3BhdGNoLlxuICAgKiBUaGUgZXJyb3Igc2luayBtdXN0IG5ldmVyIGJlY29tZSBhbiBlcnJvciBzb3VyY2U6IHNpbmsgdGhyb3dzIGFyZVxuICAgKiBzd2FsbG93ZWQgKGlzb2xhdGlvbiBpcyBhYnNvbHV0ZSkuXG4gICAqL1xuICBwcml2YXRlIHJvdXRlTGlzdGVuZXJFcnJvcihcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICBsaXN0ZW5lcklkOiBzdHJpbmcsXG4gICAgZW52ZWxvcGU6IENhcHR1cmVFbnZlbG9wZSxcbiAgICBwaGFzZTogJ3N5bmMnIHwgJ2FzeW5jJyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaGFzaElkeCA9IGVudmVsb3BlLnJ1bnRpbWVTdGFnZUlkLmxhc3RJbmRleE9mKCcjJyk7XG4gICAgY29uc3QgZXJyb3JFdmVudCA9IHtcbiAgICAgIHN0YWdlTmFtZTogJycsXG4gICAgICBzdGFnZUlkOiBoYXNoSWR4ID49IDAgPyBlbnZlbG9wZS5ydW50aW1lU3RhZ2VJZC5zbGljZSgwLCBoYXNoSWR4KSA6IGVudmVsb3BlLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGVudmVsb3BlLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogZW52ZWxvcGUucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKGRlc2NyaWJlVGhyb3duKGVycm9yKSksXG4gICAgICBvcGVyYXRpb246IG9wZXJhdGlvbkZvcihlbnZlbG9wZS5tZXRob2QpLFxuICAgICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICB9O1xuICAgIGZvciAoY29uc3QgW2lkLCB7IHJlY29yZGVyLCBjaGFubmVscyB9XSBvZiB0aGlzLnJlZ2lzdHJhdGlvbnMpIHtcbiAgICAgIGlmIChpZCA9PT0gbGlzdGVuZXJJZCkgY29udGludWU7XG4gICAgICAvLyBJbmxpbmUtdGllciBwYXJpdHkgKHJldmlldyBDUklUSUNBTC0xKTogdGhlIHN5bnRoZXNpemVkIGV2ZW50IGlzXG4gICAgICAvLyBzY29wZS10eXBlZCwgc28gaXQgcmVhY2hlcyBPTkxZIHJlY29yZGVycyByZWdpc3RlcmVkIG9uIHRoZSBzY29wZVxuICAgICAgLy8gbGlzdHMg4oCUIGEgZmxvdy1vbmx5IHJlY29yZGVyIG5ldmVyIHJlY2VpdmVzIHNjb3BlLWNoYW5uZWwgZXJyb3JzXG4gICAgICAvLyBpbmxpbmUgYW5kIG11c3Qgbm90IGhlcmUgZWl0aGVyLlxuICAgICAgaWYgKCFjaGFubmVscy5oYXMoJ3Njb3BlJykpIGNvbnRpbnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW52b2tlUmVjb3JkZXJIb29rKHJlY29yZGVyLCAnb25FcnJvcicsIGVycm9yRXZlbnQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFN3YWxsb3cg4oCUIHNhbWUgcnVsZSBhcyBEZWZlcnJlZERpc3BhdGNoZXIuc2FmZU9uRXJyb3IuXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtmb290cHJpbnRqc10gZGVmZXJyZWQgb2JzZXJ2ZXIgJyR7bGlzdGVuZXJJZH0nIGZhaWxlZCAoJHtwaGFzZX0pIGhhbmRsaW5nIGAgK1xuICAgICAgICAgIGAke2VudmVsb3BlLmNoYW5uZWx9LiR7ZW52ZWxvcGUubWV0aG9kfSAoc2VxICR7ZW52ZWxvcGUuc2VxfSk6ICR7ZGVzY3JpYmVUaHJvd24oZXJyb3IpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEaXNwYXRjaGVyLWxldmVsIG9wdGlvbnMgYXJlIGZpcnN0LWF0dGFjaC13aW5zOyBkaWZmZXJpbmcgbGF0ZXIgdmFsdWVzIGRldi13YXJuLiAqL1xuICBwcml2YXRlIHdhcm5PbkNvbmZpZ0NvbmZsaWN0KHJlY29yZGVySWQ6IHN0cmluZywgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuO1xuICAgIGNvbnN0IGNvbmZsaWN0czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZXF1ZXN0ZWQ6IEFwcGxpZWREaXNwYXRjaGVyQ29uZmlnID0ge1xuICAgICAgY2FwdHVyZTogb3B0aW9ucy5jYXB0dXJlLFxuICAgICAgbWF4UXVldWU6IG9wdGlvbnMubWF4UXVldWUsXG4gICAgICBvdmVyZmxvdzogb3B0aW9ucy5vdmVyZmxvdyxcbiAgICAgIHNhbXBsZUV2ZXJ5OiBvcHRpb25zLnNhbXBsZUV2ZXJ5LFxuICAgICAgZmx1c2hCdWRnZXRNczogb3B0aW9ucy5mbHVzaEJ1ZGdldE1zLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVxdWVzdGVkKSBhcyBBcnJheTxrZXlvZiBBcHBsaWVkRGlzcGF0Y2hlckNvbmZpZz4pIHtcbiAgICAgIGlmIChyZXF1ZXN0ZWRba2V5XSAhPT0gdW5kZWZpbmVkICYmIHJlcXVlc3RlZFtrZXldICE9PSB0aGlzLmFwcGxpZWRDb25maWdba2V5XSkge1xuICAgICAgICBjb25mbGljdHMucHVzaChTdHJpbmcoa2V5KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb25mbGljdHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kZXZXYXJuRGVkdXBlZChcbiAgICAgICAgYFtmb290cHJpbnRqc10gYXR0YWNoICcke3JlY29yZGVySWR9JzogdGhlIGV4ZWN1dG9yJ3MgZGVmZXJyZWQtb2JzZXJ2ZXIgcXVldWUgd2FzIGFscmVhZHkgYCArXG4gICAgICAgICAgYGNvbmZpZ3VyZWQgYnkgdGhlIGZpcnN0IGRlZmVycmVkIGF0dGFjaCDigJQgaWdub3JpbmcgZGlmZmVyaW5nIG9wdGlvbihzKTogJHtjb25mbGljdHMuam9pbignLCAnKX0uIGAgK1xuICAgICAgICAgICdPbmUgZXhlY3V0b3IgaGFzIE9ORSBtZXJnZWQgcXVldWU7IGNvbmZpZ3VyZSBpdCBvbiB0aGUgZmlyc3QgZGVmZXJyZWQgYXR0YWNoLicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBgaXNEZXZNb2RlKClgLWdhdGVkLCBkZWR1cGxpY2F0ZWQgd2FybmVyIOKAlCB0aGUgYm91bmQgd2FybiBzZWFtLiAqL1xuICBwcml2YXRlIGRldldhcm5EZWR1cGVkKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghaXNEZXZNb2RlKCkpIHJldHVybjtcbiAgICBpZiAodGhpcy53YXJuZWRNZXNzYWdlcy5oYXMobWVzc2FnZSkpIHJldHVybjtcbiAgICB0aGlzLndhcm5lZE1lc3NhZ2VzLmFkZChtZXNzYWdlKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgfVxufVxuIl19
@@ -10,11 +10,10 @@
10
10
  * After execution, consumers query it for the full execution state.
11
11
  */
12
12
  import { EventLog } from '../memory/EventLog.js';
13
- import type { RedactionRule } from '../memory/redaction.js';
14
13
  import type { RunPolicy } from '../memory/runPolicy.js';
15
14
  import { SharedMemory } from '../memory/SharedMemory.js';
16
15
  import { StageContext } from '../memory/StageContext.js';
17
- import type { CommitBundle, CommitValuesMode, ReadTrackingMode, StageSnapshot, WriteProvenanceMode, WriteTrackingMode } from '../memory/types.js';
16
+ import type { CommitBundle, CommitValuesMode, StageSnapshot, WriteProvenanceMode } from '../memory/types.js';
18
17
  import type { ObserverStats } from './DeferredObserverTier.js';
19
18
  /** Snapshot of a single recorder's collected data. */
20
19
  export interface RecorderSnapshot {
@@ -167,22 +166,6 @@ export declare class ExecutionRuntime {
167
166
  * descendant takes the reference from there.
168
167
  */
169
168
  usePolicy(policy: RunPolicy): void;
170
- private derive;
171
- /** @deprecated since 9.35.0 — construct with `runPolicy({ readTracking })`, or `usePolicy`. */
172
- useReadTracking(mode: ReadTrackingMode): void;
173
- /** @deprecated since 9.35.0 — construct with `runPolicy({ writeTracking })`, or `usePolicy`. */
174
- useWriteTracking(mode: WriteTrackingMode): void;
175
- /** @deprecated since 9.35.0 — construct with `runPolicy({ commitValues })`, or `usePolicy`. */
176
- useCommitValues(mode: CommitValuesMode): void;
177
- /** @deprecated since 9.35.0 — construct with `runPolicy({ writeProvenance })`, or `usePolicy`. */
178
- useWriteProvenance(mode: WriteProvenanceMode): void;
179
- /** @deprecated since 9.35.0 — construct with `runPolicy(dials, rule)`, or `usePolicy`. */
180
- useRedaction(rule: RedactionRule): void;
181
- /**
182
- * @deprecated since 9.35.0 — construct with `runPolicy(dials, rule, true)`.
183
- * Idempotent, as before: a runtime that already keeps a mirror is untouched.
184
- */
185
- enableRedactedMirror(): void;
186
169
  /**
187
170
  * The policy on `root`, and the mirror store when the policy keeps one.
188
171
  * The mirror is a SERVED surface, so its seed must already be the policy's
@@ -12,7 +12,7 @@
12
12
  import { deepFreeze } from '../capture/freeze.js';
13
13
  import { EventLog } from '../memory/EventLog.js';
14
14
  import { LOG_PLACEHOLDER } from '../memory/placeholders.js';
15
- import { DEFAULT_RUN_POLICY, derivePolicy } from '../memory/runPolicy.js';
15
+ import { DEFAULT_RUN_POLICY } from '../memory/runPolicy.js';
16
16
  import { SharedMemory } from '../memory/SharedMemory.js';
17
17
  import { StageContext } from '../memory/StageContext.js';
18
18
  export class ExecutionRuntime {
@@ -79,41 +79,6 @@ export class ExecutionRuntime {
79
79
  this.policy = policy;
80
80
  this.installPolicy(this.rootStageContext);
81
81
  }
82
- // ── Deprecated setters (9.35.0) — forwarders over the run policy ──────────
83
- // Each derives a new frozen policy from the ROOT frame's (what the old
84
- // setters wrote to) and installs it with `usePolicy`.
85
- derive(patch) {
86
- this.usePolicy(derivePolicy(this.rootStageContext.getPolicy(), patch));
87
- }
88
- /** @deprecated since 9.35.0 — construct with `runPolicy({ readTracking })`, or `usePolicy`. */
89
- useReadTracking(mode) {
90
- this.derive({ readTracking: mode });
91
- }
92
- /** @deprecated since 9.35.0 — construct with `runPolicy({ writeTracking })`, or `usePolicy`. */
93
- useWriteTracking(mode) {
94
- this.derive({ writeTracking: mode });
95
- }
96
- /** @deprecated since 9.35.0 — construct with `runPolicy({ commitValues })`, or `usePolicy`. */
97
- useCommitValues(mode) {
98
- this.derive({ commitValues: mode });
99
- }
100
- /** @deprecated since 9.35.0 — construct with `runPolicy({ writeProvenance })`, or `usePolicy`. */
101
- useWriteProvenance(mode) {
102
- this.derive({ writeProvenance: mode });
103
- }
104
- /** @deprecated since 9.35.0 — construct with `runPolicy(dials, rule)`, or `usePolicy`. */
105
- useRedaction(rule) {
106
- this.derive({ redaction: rule });
107
- }
108
- /**
109
- * @deprecated since 9.35.0 — construct with `runPolicy(dials, rule, true)`.
110
- * Idempotent, as before: a runtime that already keeps a mirror is untouched.
111
- */
112
- enableRedactedMirror() {
113
- if (this.redactedStore)
114
- return;
115
- this.derive({ mirror: true });
116
- }
117
82
  /**
118
83
  * The policy on `root`, and the mirror store when the policy keeps one.
119
84
  * The mirror is a SERVED surface, so its seed must already be the policy's
@@ -217,4 +182,4 @@ export class ExecutionRuntime {
217
182
  };
218
183
  }
219
184
  }
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBd0h6RCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ3BCLFdBQVcsQ0FBZTtJQUNqQzs7Ozs7Ozs7T0FRRztJQUNJLGFBQWEsQ0FBZ0I7SUFDN0IsZ0JBQWdCLENBQWU7SUFDL0IsZ0JBQWdCLENBQVc7SUFDbEMsb0ZBQW9GO0lBQzVFLGFBQWEsQ0FBZ0I7SUFDN0IsYUFBYSxDQUFVO0lBQ3ZCLGNBQWMsQ0FBVTtJQUNoQzttRkFDK0U7SUFDdkUsTUFBTSxDQUFZO0lBRTFCLDRFQUE0RTtJQUNwRSxTQUFTLENBQTJCO0lBRTVDOzs7Ozs7T0FNRztJQUNILFlBQ0UsUUFBZ0IsRUFDaEIsTUFBYyxFQUNkLGFBQXVCLEVBQ3ZCLFlBQXNCLEVBQ3RCLFNBQW9CLGtCQUFrQjtRQUV0QyxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztRQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztRQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksWUFBWSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRSx5RUFBeUU7UUFD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IHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIG9uZSBmbG93Y2hhcnQgZXhlY3V0aW9uLlxuICpcbiAqIFdpcmVzIHVwIHRoZSB0aHJlZSBtZW1vcnkgcHJpbWl0aXZlcyBpbnRvIGEgc2luZ2xlIGNvbnRhaW5lcjpcbiAqICAgLSBTaGFyZWRNZW1vcnkgKHRoZSBoZWFwIOKAlCBzaGFyZWQgc3RhdGUgYWNyb3NzIGFsbCBzdGFnZXMpXG4gKiAgIC0gU3RhZ2VDb250ZXh0ICAodGhlIGNhbGwgc3RhY2sg4oCUIHBlci1zdGFnZSBleGVjdXRpb24gdHJlZSlcbiAqICAgLSBFdmVudExvZyAgICAgICh0aGUgdHJhbnNhY3Rpb24gbG9nIOKAlCBjb21taXQgaGlzdG9yeSBmb3IgcmVwbGF5KVxuICpcbiAqIFRoZSBlbmdpbmUgKEZsb3djaGFydFRyYXZlcnNlcikgcmVjZWl2ZXMgdGhpcyBhcyBpdHMgcnVudGltZSBwYXJhbWV0ZXIuXG4gKiBBZnRlciBleGVjdXRpb24sIGNvbnN1bWVycyBxdWVyeSBpdCBmb3IgdGhlIGZ1bGwgZXhlY3V0aW9uIHN0YXRlLlxuICovXG5cbmltcG9ydCB7IGRlZXBGcmVlemUgfSBmcm9tICcuLi9jYXB0dXJlL2ZyZWV6ZS5qcyc7XG5pbXBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4uL21lbW9yeS9FdmVudExvZy5qcyc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIgfSBmcm9tICcuLi9tZW1vcnkvcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB7IERFRkFVTFRfUlVOX1BPTElDWSwgZGVyaXZlUG9saWN5IH0gZnJvbSAnLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBTaGFyZWRNZW1vcnkgfSBmcm9tICcuLi9tZW1vcnkvU2hhcmVkTWVtb3J5LmpzJztcbmltcG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1xuICBDb21taXRCdW5kbGUsXG4gIENvbW1pdFZhbHVlc01vZGUsXG4gIFJlYWRUcmFja2luZ01vZGUsXG4gIFN0YWdlU25hcHNob3QsXG4gIFdyaXRlUHJvdmVuYW5jZU1vZGUsXG4gIFdyaXRlVHJhY2tpbmdNb2RlLFxufSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBPYnNlcnZlclN0YXRzIH0gZnJvbSAnLi9EZWZlcnJlZE9ic2VydmVyVGllci5qcyc7XG5cbi8qKiBTbmFwc2hvdCBvZiBhIHNpbmdsZSByZWNvcmRlcidzIGNvbGxlY3RlZCBkYXRhLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRlclNuYXBzaG90IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU2NvcGVSZWNvcmRlciB0eXBlIGFuZCBwYXR0ZXJuIGRlc2NyaXB0aW9uIChlLmcuLCBcIlRyYW5zbGF0b3IgKEtleWVkU3RvcmUpIOKAlCBwZXItc3RlcCB0b2tlbiB1c2FnZVwiKS4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBQcmVmZXJyZWQgcmVhZC10aW1lIG9wZXJhdGlvbiDigJQgaGludHMgdGhlIFVJIGFib3V0IHdoaWNoIHZpZXcgdG8gc2hvdyBwcm9taW5lbnRseS4gKi9cbiAgcHJlZmVycmVkT3BlcmF0aW9uPzogJ3RyYW5zbGF0ZScgfCAnYWNjdW11bGF0ZScgfCAnYWdncmVnYXRlJztcbiAgZGF0YTogdW5rbm93bjtcbiAgLyoqXG4gICAqIFNtYWxsIG1hY2hpbmUtcmVhZGFibGUgZmFjdHMgYWJvdXQgdGhlIEJVTkRMRSDigJQgaG93IGl0IHdhcyBwcm9kdWNlZCxcbiAgICogd2hpY2ggcHJvamVjdGlvbiBvZiB0aGUgcmVjb3JkZXIncyBkYXRhIGl0IGlzLCB3aGF0IGl0IGRlbGliZXJhdGVseVxuICAgKiBsZWZ0IG91dC4gV2hhdGV2ZXIgdGhlIHJlY29yZGVyJ3MgYHRvU25hcHNob3QoKWAgcHV0IGhlcmUsIGNvcGllZFxuICAgKiB0aHJvdWdoIHVuY2hhbmdlZC5cbiAgICpcbiAgICogVGhlIHNwbGl0IHdpdGggYGRlc2NyaXB0aW9uYDogYGRlc2NyaXB0aW9uYCBpcyB0aGUgc2VudGVuY2UgYSBodW1hblxuICAgKiByZWFkczsgYG1ldGFgIGlzIHdoYXQgYW4gb2ZmbGluZSBjb25zdW1lciBCUkFOQ0hFUyBvbi4gQSByZWNvcmRlciB3aXRoXG4gICAqIGEgXCJmdWxsXCIgYW5kIGEgXCJsZWFuXCIgYnVuZGxlIHNoYXBlIHRoYXQgc2F5cyBzbyBvbmx5IGluIGl0c1xuICAgKiBkZXNjcmlwdGlvbiBmb3JjZXMgZXZlcnkgcmVhZGVyIHRvIHN0cmluZy1tYXRjaCBwcm9zZSDigJQgYW5kIGEgcmVhZGVyXG4gICAqIHRoYXQgZG9lc24ndCByZW5kZXJzIGFuIGVtcHR5IHBhbmVsIGluc3RlYWQgb2Ygc2F5aW5nIFwidGhpcyByZWNvcmRpbmdcbiAgICogY2FycmllcyBzdHJ1Y3R1cmUgb25seVwiLlxuICAgKlxuICAgKiBOb3QgaW50ZXJwcmV0ZWQgYnkgdGhlIGVuZ2luZSwgc28ga2V5cyBhcmUgdGhlIHJlY29yZGVyJ3MgdG8gY2hvb3NlO1xuICAgKiBrZWVwIHRoZSB2YWx1ZXMgSlNPTi1zYWZlLCBzaW5jZSB0aGlzIHJpZGVzIHRoZSBzbmFwc2hvdCBvdXQgdG8gZGlzay5cbiAgICovXG4gIG1ldGE/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG59XG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVTbmFwc2hvdCA9IHtcbiAgLyoqXG4gICAqIFRoZSBydW4gdGhpcyBzbmFwc2hvdCBiZWxvbmdzIHRvIOKAlCB0aGUgc2FtZSBgcnVuSWRgIHN0YW1wZWQgb24gZXZlcnlcbiAgICogYFRyYXZlcnNhbENvbnRleHRgIChhbmQgdGh1cyBldmVyeSByZWNvcmRlciBldmVudCkgb2YgdGhlIHJ1biwgc28gYVxuICAgKiBzbmFwc2hvdCBjYW4gYmUgam9pbmVkIGFnYWluc3QgYW4gZXZlbnQgc3RyZWFtIG9yIGFuIGV4dGVybmFsXG4gICAqIGNvcnJlbGF0aW9uIHRhYmxlLiBSZWFkLW9ubHkgYnkgY29udHJhY3Q6IGdlbmVyYXRlZCBieSB0aGUgZXhlY3V0b3JcbiAgICogKGBydW5uZXIvcnVuSWQudHNgKSwgbmV2ZXIgZGVyaXZlZCBmcm9tIHNuYXBzaG90IGNvbnRlbnRzLlxuICAgKlxuICAgKiBMaWZlY3ljbGUgKG1hdGNoZXMgdGhlIGV2ZW50IG1vZGVsKTogZnJlc2ggcGVyIGBydW4oKWAgQU5EIHBlclxuICAgKiBgcmVzdW1lKClgIOKAlCByZXN1bWUgaXMgbG9naWNhbGx5IGEgZGlzdGluY3QgcnVuLCBzbyBhIHBvc3QtcmVzdW1lXG4gICAqIHNuYXBzaG90IGNhcnJpZXMgYSBESUZGRVJFTlQgcnVuSWQgdGhhbiB0aGUgcGF1c2VkIHJ1bidzIHNuYXBzaG90LlxuICAgKi9cbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgc2hhcmVkU3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBleGVjdXRpb25UcmVlOiBTdGFnZVNuYXBzaG90O1xuICAvKipcbiAgICogVGhlIGNvbW1pdCBsb2cncyBmb2xkIEJBU0Ug4oCUIHRoZSBydW4ncyBzdGF0ZSBiZWZvcmUgaXRzIGZpcnN0IGNvbW1pdFxuICAgKiAoYGluaXRpYWxDb250ZXh0YCBtZXJnZWQgd2l0aCBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgOyBvbiBhIHJlc3VtZSwgdGhlXG4gICAqIGNoZWNrcG9pbnQncyBzdGF0ZSkuIERlZXBseSBmcm96ZW4gYW5kIGZ1bGx5IGRldGFjaGVkIGZyb20gdGhlIGVuZ2luZS5cbiAgICpcbiAgICogQ29tbWl0IGJ1bmRsZXMgYXJlIERJRkZTLCBzbyB0aGUgbG9nIGFsb25lIGNhbm5vdCByZWJ1aWxkIGEgdmFsdWUgdGhhdFxuICAgKiB3YXMgc2VlZGVkIGJlZm9yZSB0aGUgcnVuIGFuZCBvbmx5IGV2ZXIgbWVyZ2VkIGFmdGVyd2FyZHMuIFNoaXBwaW5nIHRoZVxuICAgKiBiYXNlIFdJVEggdGhlIGxvZyBpcyB3aGF0IG1ha2VzIGFuIG9mZmxpbmUgZm9sZCDigJQgYHN0YXRlQXQoc25hcHNob3QsIGkpYFxuICAgKiBmcm9tIGBmb290cHJpbnRqcy90cmFjZWAg4oCUIHJlcHJvZHVjZSB0aGUgc3RhdGUgYSBzdGFnZSBhY3R1YWxseSBzYXcuXG4gICAqXG4gICAqIE9QVElPTkFMIEJZIFRZUEUsIGFuZCBhYnNlbnQgaW4gZXhhY3RseSB0d28gY2FzZXMuIEEgcGxhaW4gYGdldFNuYXBzaG90KClgXG4gICAqIGFsd2F5cyBjYXJyaWVzIGl0LCBzbyBhIGxpdmUgZm9sZCByZXBvcnRzIGBiYXNpczogJ2luaXRpYWwrbG9nJ2AuIFVuZGVyXG4gICAqIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgaXQgaXMgT01JVFRFRCDigJQgdGhlIGJhc2UgaXMgdGhlIHJhdyBwcmUtcnVuXG4gICAqIHNlZWQgYW5kIHRoZSByZWRhY3Rpb24gcG9saWN5IGlzIG5vdCBwbHVtYmVkIGludG8gdGhlIGZvbGQg4oCUIHNvIGEgZm9sZCBvZlxuICAgKiBhIHJlZGFjdGVkIHNuYXBzaG90IGRlZ3JhZGVzIGhvbmVzdGx5IHRvIGBiYXNpczogJ2xvZy1vbmx5J2AuIEFuZCBpdCBpc1xuICAgKiBkZWNsYXJlZCBvcHRpb25hbCBzbyB0aGF0IGNvZGUgd3JpdHRlbiBhZ2FpbnN0IDkuMTYueCDigJQgYSB0ZXN0IGZpeHR1cmUgb3JcbiAgICogYSBVSSBtb2NrIHRoYXQgQ09OU1RSVUNUUyBhIGBSdW50aW1lU25hcHNob3RgIGxpdGVyYWwg4oCUIHN0aWxsIGNvbXBpbGVzLlxuICAgKiBgc3RhdGVBdGAgaGFuZGxlcyBhYnNlbmNlIGJ5IHNheWluZyBzbywgbmV2ZXIgYnkgZm9sZGluZyBhIGxpZS5cbiAgICovXG4gIHJlYWRvbmx5IGluaXRpYWxTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogVGhlIHJ1bidzIGNvbW1pdCBidW5kbGVzLCBvbmUgcGVyIGV4ZWN1dGVkIHN0YWdlLCBpbiBleGVjdXRpb24gb3JkZXIg4oCUXG4gICAqIGEgREVUQUNIRUQsIGZyb3plbiBjb3B5IG9mIHRoZSBlbmdpbmUncyBsaXZlIGxvZyAoYSBzbmFwc2hvdCBpcyBhIGZvbGRcbiAgICogcmVzdWx0OiBpdCBtdXN0IG5vdCBrZWVwIGNoYW5naW5nIHVuZGVyIHRoZSBjb25zdW1lciB0aGF0IGhvbGRzIGl0KS5cbiAgICogVGhlIGJ1bmRsZXMgaW5zaWRlIGFyZSB0aGUgZW5naW5lJ3Mgb3duIG9iamVjdHMsIGltbXV0YWJsZSBhZnRlciByZWNvcmQuXG4gICAqL1xuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdO1xuICAvKipcbiAgICogRW5jb2RpbmcgZGlzY3JpbWluYW50IGZvciBgY29tbWl0TG9nYCAoIzEzYy1CKTogYCdmdWxsJ2Ag4oCUIGV2ZXJ5IGBzZXRgXG4gICAqIGJ1bmRsZSBzdG9yZXMgdGhlIGZ1bGwgZmluYWwgdmFsdWUgKGhpc3RvcmljYWwpOyBgJ2RlbHRhJ2Ag4oCUIGJ1bmRsZXMgbWF5XG4gICAqIGNhcnJ5IGBhcHBlbmRgL2BkZWxldGVgIHRyYWNlIHZlcmJzIHdpdGggdmVyYi1xdWFsaWZpZWQgYG92ZXJ3cml0ZWBcbiAgICogcGF5bG9hZHMgKHRhaWxzKS4gT2ZmbGluZSB0b29saW5nIGtleXMgb24gdGhpcyBmaWVsZDsgYSBidW5kbGUgc3RyZWFtXG4gICAqIHdpdGhvdXQgY29udGV4dCByZW1haW5zIHNlbGYtZGVzY3JpYmluZyB2aWEgdGhlIHZlcmJzIHRoZW1zZWx2ZXMuXG4gICAqL1xuICBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG4gIC8qKiBQZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIGRpYWwgKCNQMSkgdGhlIHJ1biBleGVjdXRlZCB1bmRlciDigJQgdGhlXG4gICAqICBvZmZsaW5lLXRvb2xpbmcgZGlzY3JpbWluYW50IGZvciBgVHJhY2VFbnRyeS5yZWFkS2V5c2AgYXZhaWxhYmlsaXR5LiAqL1xuICB3cml0ZVByb3ZlbmFuY2U6IFdyaXRlUHJvdmVuYW5jZU1vZGU7XG4gIC8qKlxuICAgKiBQZXItc3ViZmxvdyBleGVjdXRpb24gcmVzdWx0cywgRFVBTC1LRVlFRCAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKTpcbiAgICogICAtIGJ5IHN1YmZsb3cgUEFUSCAoYHN1YmZsb3dJZGAsIGUuZy4gYCdzZi1wYXknYCkg4oaSIHRoZSBMQVNUIGl0ZXJhdGlvbiAoYmFjay1jb21wYXQpOyB0aGlzXG4gICAqICAgICBpcyB3aGF0IGBnZXRTdWJ0cmVlU25hcHNob3QocGF0aClgIGFuZCBgbGlzdFN1YmZsb3dQYXRocygpYCByZXNvbHZlLlxuICAgKiAgIC0gYnkgcGVyLWV4ZWN1dGlvbiBtb3VudCBgcnVudGltZVN0YWdlSWRgIChlLmcuIGAnc2YtcGF5IzUnYCkg4oaSIFRIQVQgaXRlcmF0aW9uJ3MgcmVzdWx0LCBzb1xuICAgKiAgICAgYSBMT09QSU5HIHN1YmZsb3cgcmV0YWlucyBFVkVSWSBpdGVyYXRpb24gKG5vdCBqdXN0IHRoZSBsYXN0KS4gTG9vayB1cCBhIHNwZWNpZmljXG4gICAqICAgICBpdGVyYXRpb24gYXMgYHN1YmZsb3dSZXN1bHRzW25vZGUucnVudGltZVN0YWdlSWRdID8/IHN1YmZsb3dSZXN1bHRzW25vZGUuc3ViZmxvd0lkXWAuXG4gICAqIEJvdGgga2V5cyBwb2ludCBhdCB0aGUgc2FtZSBvYmplY3QgZm9yIGEgc2luZ2xlIG1vdW50OyBpdGVyYXRlIHdpdGggY2FyZSAoY291bnQgdmlhIHRoZVxuICAgKiBwYXRoIGtleXMg4oCUIHRob3NlIHdpdGhvdXQgYCcjJ2ApLiBUaGUgcGF1c2UgY2hlY2twb2ludCBjYXJyaWVzIG9ubHkgdGhlIHBhdGgga2V5cywgbGVhbi5cbiAgICpcbiAgICogVW5kZXIgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBlYWNoIGVudHJ5J3MgYHRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIGlzIHRoYXRcbiAgICogc3ViZmxvdydzIE9XTiByZWRhY3RlZCBtaXJyb3IgKDkuMjAuMCkg4oCUIHRoZSBmb2xkIG9mIGl0cyBzY3J1YmJlZCBgaGlzdG9yeWAg4oCUIHNlcnZlZCBhc1xuICAgKiBvbmUgc3Vic3RpdHV0ZWQgb2JqZWN0IHBlciBtb3VudCAoYm90aCBrZXlzIHN0aWxsIGFncmVlKSDigJQgdGhlIHdyYXBwZXIgaXMgZnJlc2ggcGVyXG4gICAqIGBnZXRTbmFwc2hvdGAgY2FsbCwgdGhlIGBnbG9iYWxDb250ZXh0YCBpbnNpZGUgaXQgaXMgdGhlIHN0YWJsZSBtaXJyb3I7IHBsYWluLCBpdCBpcyB0aGUgc3ViZmxvdydzXG4gICAqIGxpdmUgaGVhcC4gV2l0aG91dCBhIHBvbGljeSB0aGVyZSBpcyBubyBtaXJyb3IgYW5kIHRoZSB0d28gdmlld3MgYXJlIHRoZSBzYW1lIG9iamVjdHMuXG4gICAqL1xuICBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogU25hcHNob3QgZGF0YSBmcm9tIHJlY29yZGVycyB0aGF0IGltcGxlbWVudCB0b1NuYXBzaG90KCkuICovXG4gIHJlY29yZGVycz86IFJlY29yZGVyU25hcHNob3RbXTtcbiAgLyoqXG4gICAqIERlZmVycmVkLW9ic2VydmVyIGFjY291bnRpbmcgKFJGQy0wMDEgQmxvY2sgOSkg4oCUIHF1ZXVlIGRlcHRoLCBkcm9wcyxcbiAgICogZmx1c2gvYnVkZ2V0IGNvdW50ZXJzLCBwZXItbGlzdGVuZXIgdGltZSBhdHRyaWJ1dGlvbiwgYW5kIHRoZVxuICAgKiB0ZXJtaW5hbC1mbHVzaCBzdHJhbmRpbmcgY291bnQuIEFCU0VOVCB1bmxlc3MgYSByZWNvcmRlciB3YXMgYXR0YWNoZWRcbiAgICogd2l0aCBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCBvbiB0aGlzIGV4ZWN1dG9yICh6ZXJvLWNvc3QgZGlzY2lwbGluZSkuXG4gICAqL1xuICBvYnNlcnZlclN0YXRzPzogT2JzZXJ2ZXJTdGF0cztcbn07XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25SdW50aW1lIHtcbiAgcHVibGljIGdsb2JhbFN0b3JlOiBTaGFyZWRNZW1vcnk7XG4gIC8qKlxuICAgKiBQYXJhbGxlbCByZWRhY3RlZCBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYC4gUG9wdWxhdGVkIGR1cmluZyB0cmF2ZXJzYWwgdmlhXG4gICAqIGBTdGFnZUNvbnRleHQuY29tbWl0KClgIHVzaW5nIHRoZSBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMuXG4gICAqIE9ubHkgZXhpc3RzIHdoZW4gdGhlIHJ1bidzIHBvbGljeSBrZWVwcyBhIG1pcnJvciAoYFJ1blBvbGljeS5taXJyb3JgIOKAlFxuICAgKiBgRmxvd0NoYXJ0RXhlY3V0b3JgIHNldHMgaXQgd2hlbiBhIGBSZWRhY3Rpb25Qb2xpY3lgIGlzIGNvbmZpZ3VyZWQpLlxuICAgKiBPdGhlcndpc2UgdW5kZWZpbmVkIGFuZCB6ZXJvIGNvc3QuXG4gICAqXG4gICAqIFJlYWQgdmlhIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAuXG4gICAqL1xuICBwdWJsaWMgcmVkYWN0ZWRTdG9yZT86IFNoYXJlZE1lbW9yeTtcbiAgcHVibGljIHJvb3RTdGFnZUNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIGV4ZWN1dGlvbkhpc3Rvcnk6IEV2ZW50TG9nO1xuICAvKiogT3JpZ2luYWwgcm9vdCBmb3IgZ2V0U25hcHNob3QoKSDigJQgc2V0IGJlZm9yZSByZXN1bWUgY2hhbmdlcyByb290U3RhZ2VDb250ZXh0LiAqL1xuICBwcml2YXRlIF9zbmFwc2hvdFJvb3Q/OiBTdGFnZUNvbnRleHQ7XG4gIHByaXZhdGUgX2luaXRpYWxTdGF0ZTogdW5rbm93bjtcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlczogdW5rbm93bjtcbiAgLyoqIFRoZSBydW4ncyBwb2xpY3kgKGBtZW1vcnkvcnVuUG9saWN5LnRzYCkg4oCUIGluc3RhbGxlZCBvbiB0aGUgcm9vdCBmcmFtZTtcbiAgICogIGl0cyBgY29tbWl0VmFsdWVzYCBhbmQgYHdyaXRlUHJvdmVuYW5jZWAgYXJlIHRoZSBzbmFwc2hvdCBkaXNjcmltaW5hbnRzLiAqL1xuICBwcml2YXRlIHBvbGljeTogUnVuUG9saWN5O1xuXG4gIC8qKiBNZW1vaXplZCBmcm96ZW4gZm9sZCBiYXNlIOKAlCBzZWUge0BsaW5rIFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGV9LiAqL1xuICBwcml2YXRlIF9mb2xkQmFzZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gcG9saWN5IFRoZSBydW4ncyBwb2xpY3kgKGBydW5Qb2xpY3kudHNgLCBGNSkg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGVcbiAgICogICByZWRhY3Rpb24gcnVsZSwgdGhlIG1pcnJvciBmbGFnLiBJbnN0YWxsZWQgb24gdGhlIHJvb3QgZnJhbWUgaGVyZSwgc29cbiAgICogICB0aGUgRklSU1QgY29tbWl0IChhIHN1YmZsb3cncyBzZWVkLCBgaGlzdG9yeVswXWApIGFscmVhZHkgcnVucyB1bmRlciBpdDtcbiAgICogICBldmVyeSBmcmFtZSBhZnRlciBpbmhlcml0cyB0aGUgc2FtZSByZWZlcmVuY2UuIERlZmF1bHQ6IGV2ZXJ5IGRpYWwgYXRcbiAgICogICBpdHMgZGVmYXVsdCwgbm8gcnVsZSwgbm8gbWlycm9yLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcm9vdE5hbWU6IHN0cmluZyxcbiAgICByb290SWQ6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbiAgICBpbml0aWFsU3RhdGU/OiB1bmtub3duLFxuICAgIHBvbGljeTogUnVuUG9saWN5ID0gREVGQVVMVF9SVU5fUE9MSUNZLFxuICApIHtcbiAgICB0aGlzLl9pbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRWYWx1ZXM7XG4gICAgdGhpcy5nbG9iYWxTdG9yZSA9IG5ldyBTaGFyZWRNZW1vcnkoZGVmYXVsdFZhbHVlcywgaW5pdGlhbFN0YXRlKTtcbiAgICAvLyBUaGUgZXZlbnQgbG9nJ3MgZm9sZCBiYXNlIG11c3QgYmUgdGhlIFNBTUUgc3RhdGUgdGhlIHN0b3JlIHN0YXJ0cyBmcm9tXG4gICAgLy8g4oCUIGBpbml0aWFsQ29udGV4dGAgbWVyZ2VkIHdpdGggYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCwgd2hpY2ggaXMgd2hhdFxuICAgIC8vIGBTaGFyZWRNZW1vcnlgIGNvbXB1dGVkIGFib3ZlLiBTZWVkaW5nIHRoZSBsb2cgZnJvbSBgaW5pdGlhbFN0YXRlYCBhbG9uZVxuICAgIC8vIGxlZnQgYGRlZmF1bHRWYWx1ZXNgIG91dCBvZiBldmVyeSByZXBsYXksIHNvIGEgZm9sZCBjb3VsZCBub3QgcmVwcm9kdWNlXG4gICAgLy8gdGhlIHN0YXRlIGEgc3RhZ2UgYWN0dWFsbHkgc2F3LiBgZ2V0U3RhdGUoKWAgaXMgdGhlIGxpdmUgY29udGV4dDsgdGhlXG4gICAgLy8gRXZlbnRMb2cgY29uc3RydWN0b3IgY2xvbmVzIGl0LCBzbyB0aGUgYmFzZSBzdGF5cyBkZXRhY2hlZC5cbiAgICB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkgPSBuZXcgRXZlbnRMb2codGhpcy5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQgPSB0aGlzLm5ld1Jvb3Qocm9vdE5hbWUsIHJvb3RJZCk7XG4gIH1cblxuICAvKipcbiAgICogQSBmcmVzaCByb290IGZyYW1lIGZvciB0aGlzIHJ1bnRpbWUg4oCUIGBnbG9iYWxTdG9yZWAsIGBleGVjdXRpb25IaXN0b3J5YCxcbiAgICogdGhlIHJ1bidzIHBvbGljeSBhbmQgKHdoZW4ga2VwdCkgdGhlIG1pcnJvci4gQWxzbyBob3cgYFN1YmZsb3dFeGVjdXRvcmBcbiAgICogcmVwbGFjZXMgYSBzdWJmbG93J3Mgc2VlZCBmcmFtZSB3aXRoIHRoZSBmcmFtZSBpdHMgZmlyc3Qgc3RhZ2UgcnVucyBvbi5cbiAgICovXG4gIG5ld1Jvb3QobmFtZTogc3RyaW5nLCBpZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0IHtcbiAgICBjb25zdCByb290ID0gbmV3IFN0YWdlQ29udGV4dCgnJywgbmFtZSwgaWQsIHRoaXMuZ2xvYmFsU3RvcmUsICcnLCB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkpO1xuICAgIHRoaXMuaW5zdGFsbFBvbGljeShyb290KTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyBwb2xpY3kgb24gdGhlIENVUlJFTlQgcm9vdCBmcmFtZSDigJQgYSBzYW1lLWV4ZWN1dG9yXG4gICAqIHJlc3VtZSwgd2hvc2UgY29udGludWF0aW9uIHJvb3QgKGBsZWFmLmNyZWF0ZU5leHRgKSBpcyBhZHZhbmNlZCBiZWZvcmVcbiAgICogdGhlIGV4ZWN1dG9yIGJ1aWxkcyB0aGlzIGxlZydzIHBvbGljeSAoYSBmcmVzaCBydWxlIHBlciBsZWcpLiBFdmVyeVxuICAgKiBkZXNjZW5kYW50IHRha2VzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGVyZS5cbiAgICovXG4gIHVzZVBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMuaW5zdGFsbFBvbGljeSh0aGlzLnJvb3RTdGFnZUNvbnRleHQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIERlcHJlY2F0ZWQgc2V0dGVycyAoOS4zNS4wKSDigJQgZm9yd2FyZGVycyBvdmVyIHRoZSBydW4gcG9saWN5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBFYWNoIGRlcml2ZXMgYSBuZXcgZnJvemVuIHBvbGljeSBmcm9tIHRoZSBST09UIGZyYW1lJ3MgKHdoYXQgdGhlIG9sZFxuICAvLyBzZXR0ZXJzIHdyb3RlIHRvKSBhbmQgaW5zdGFsbHMgaXQgd2l0aCBgdXNlUG9saWN5YC5cblxuICBwcml2YXRlIGRlcml2ZShwYXRjaDogUGFydGlhbDxSdW5Qb2xpY3k+KTogdm9pZCB7XG4gICAgdGhpcy51c2VQb2xpY3koZGVyaXZlUG9saWN5KHRoaXMucm9vdFN0YWdlQ29udGV4dC5nZXRQb2xpY3koKSwgcGF0Y2gpKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBzaW5jZSA5LjM1LjAg4oCUIGNvbnN0cnVjdCB3aXRoIGBydW5Qb2xpY3koeyByZWFkVHJhY2tpbmcgfSlgLCBvciBgdXNlUG9saWN5YC4gKi9cbiAgdXNlUmVhZFRyYWNraW5nKG1vZGU6IFJlYWRUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmRlcml2ZSh7IHJlYWRUcmFja2luZzogbW9kZSB9KTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBzaW5jZSA5LjM1LjAg4oCUIGNvbnN0cnVjdCB3aXRoIGBydW5Qb2xpY3koeyB3cml0ZVRyYWNraW5nIH0pYCwgb3IgYHVzZVBvbGljeWAuICovXG4gIHVzZVdyaXRlVHJhY2tpbmcobW9kZTogV3JpdGVUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmRlcml2ZSh7IHdyaXRlVHJhY2tpbmc6IG1vZGUgfSk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgc2luY2UgOS4zNS4wIOKAlCBjb25zdHJ1Y3Qgd2l0aCBgcnVuUG9saWN5KHsgY29tbWl0VmFsdWVzIH0pYCwgb3IgYHVzZVBvbGljeWAuICovXG4gIHVzZUNvbW1pdFZhbHVlcyhtb2RlOiBDb21taXRWYWx1ZXNNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5kZXJpdmUoeyBjb21taXRWYWx1ZXM6IG1vZGUgfSk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgc2luY2UgOS4zNS4wIOKAlCBjb25zdHJ1Y3Qgd2l0aCBgcnVuUG9saWN5KHsgd3JpdGVQcm92ZW5hbmNlIH0pYCwgb3IgYHVzZVBvbGljeWAuICovXG4gIHVzZVdyaXRlUHJvdmVuYW5jZShtb2RlOiBXcml0ZVByb3ZlbmFuY2VNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5kZXJpdmUoeyB3cml0ZVByb3ZlbmFuY2U6IG1vZGUgfSk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgc2luY2UgOS4zNS4wIOKAlCBjb25zdHJ1Y3Qgd2l0aCBgcnVuUG9saWN5KGRpYWxzLCBydWxlKWAsIG9yIGB1c2VQb2xpY3lgLiAqL1xuICB1c2VSZWRhY3Rpb24ocnVsZTogUmVkYWN0aW9uUnVsZSk6IHZvaWQge1xuICAgIHRoaXMuZGVyaXZlKHsgcmVkYWN0aW9uOiBydWxlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHNpbmNlIDkuMzUuMCDigJQgY29uc3RydWN0IHdpdGggYHJ1blBvbGljeShkaWFscywgcnVsZSwgdHJ1ZSlgLlxuICAgKiBJZGVtcG90ZW50LCBhcyBiZWZvcmU6IGEgcnVudGltZSB0aGF0IGFscmVhZHkga2VlcHMgYSBtaXJyb3IgaXMgdW50b3VjaGVkLlxuICAgKi9cbiAgZW5hYmxlUmVkYWN0ZWRNaXJyb3IoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVkYWN0ZWRTdG9yZSkgcmV0dXJuO1xuICAgIHRoaXMuZGVyaXZlKHsgbWlycm9yOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwb2xpY3kgb24gYHJvb3RgLCBhbmQgdGhlIG1pcnJvciBzdG9yZSB3aGVuIHRoZSBwb2xpY3kga2VlcHMgb25lLlxuICAgKiBUaGUgbWlycm9yIGlzIGEgU0VSVkVEIHN1cmZhY2UsIHNvIGl0cyBzZWVkIG11c3QgYWxyZWFkeSBiZSB0aGUgcG9saWN5J3NcbiAgICogdmlldyBvZiB0aGUgc3RhcnRpbmcgc3RhdGU6IGEgcG9saWN5IGtleSB0aGF0IGFycml2ZXMgYnkgYGluaXRpYWxDb250ZXh0YFxuICAgKiAvIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAgKG9yLCBvbiBhIGNyb3NzLWV4ZWN1dG9yIHJlc3VtZSwgYnkgdGhlXG4gICAqIGNoZWNrcG9pbnQncyBgc2hhcmVkU3RhdGVgKSBhbmQgaXMgbmV2ZXIgcmUtd3JpdHRlbiB3b3VsZCBvdGhlcndpc2Ugc2l0XG4gICAqIGluIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgaW4gcGxhaW50ZXh0IOKAlCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgKiB3aXRoIHRoZSBMT0cncyBwbGFjZWhvbGRlciwgdGhlIHNhbWUgc3RyaW5nIHRoZSByZWRhY3RlZCBwYXRjaGVzIGNhcnJ5LlxuICAgKiBDcmVhdGVkIG9uY2UgcGVyIHJ1bnRpbWUgKGEgc3ViZmxvdydzIHJ1bnRpbWUga2VlcHMgaXRzIG93bjsgaXRzIHNlZWQgaXNcbiAgICogZW1wdHkg4oCUIHRoZSBpbnB1dCBhcnJpdmVzIGFzIGEgY29tbWl0KS5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFBvbGljeShyb290OiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICByb290LnVzZVBvbGljeSh0aGlzLnBvbGljeSk7XG4gICAgaWYgKCF0aGlzLnBvbGljeS5taXJyb3IpIHJldHVybjtcbiAgICBpZiAoIXRoaXMucmVkYWN0ZWRTdG9yZSkge1xuICAgICAgY29uc3QgcnVsZSA9IHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgICAgIHRoaXMucmVkYWN0ZWRTdG9yZSA9IG5ldyBTaGFyZWRNZW1vcnkoXG4gICAgICAgIHJ1bGUgPyBydWxlLnJldGFpblN0YXRlKHRoaXMuX2RlZmF1bHRWYWx1ZXMsIExPR19QTEFDRUhPTERFUikgOiB0aGlzLl9kZWZhdWx0VmFsdWVzLFxuICAgICAgICBydWxlID8gcnVsZS5yZXRhaW5TdGF0ZSh0aGlzLl9pbml0aWFsU3RhdGUsIExPR19QTEFDRUhPTERFUikgOiB0aGlzLl9pbml0aWFsU3RhdGUsXG4gICAgICApO1xuICAgIH1cbiAgICByb290LnVzZVJlZGFjdGVkTWlycm9yKHRoaXMucmVkYWN0ZWRTdG9yZSk7XG4gIH1cblxuICAvKiogUHJlc2VydmUgdGhlIGN1cnJlbnQgcm9vdFN0YWdlQ29udGV4dCBmb3Igc25hcHNob3RzIGJlZm9yZSBjaGFuZ2luZyBpdCBmb3IgcmVzdW1lLiAqL1xuICBwcmVzZXJ2ZVNuYXBzaG90Um9vdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3NuYXBzaG90Um9vdCkge1xuICAgICAgdGhpcy5fc25hcHNob3RSb290ID0gdGhpcy5yb290U3RhZ2VDb250ZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnJvemVuLCBkZXRhY2hlZCBmb2xkIGJhc2Ugc2VydmVkIGFzIHtAbGluayBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlfS5cbiAgICogQ29tcHV0ZWQgb25jZSAodGhlIGJhc2UgbmV2ZXIgY2hhbmdlcyBhZnRlciBjb25zdHJ1Y3Rpb24pIGFuZCBzaGFyZWQg4oCUXG4gICAqIHNhZmUgYmVjYXVzZSBpdCBpcyBkZWVwbHkgZnJvemVuLCBzbyBubyBob2xkZXIgY2FuIG11dGF0ZSBpdCBvciByZWFjaCB0aGVcbiAgICogZW5naW5lIHRocm91Z2ggaXQuXG4gICAqL1xuICBwcml2YXRlIGdldEZvbGRCYXNlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBpZiAoIXRoaXMuX2ZvbGRCYXNlKSB7XG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5leGVjdXRpb25IaXN0b3J5LmdldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgdGhpcy5fZm9sZEJhc2UgPSBkZWVwRnJlZXplKGJhc2UgJiYgdHlwZW9mIGJhc2UgPT09ICdvYmplY3QnID8gYmFzZSA6IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZvbGRCYXNlO1xuICB9XG5cbiAgZ2V0UGlwZWxpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICByZXR1cm4gc3RhdGUucGlwZWxpbmVzID8gT2JqZWN0LmtleXMoc3RhdGUucGlwZWxpbmVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA6IFtdO1xuICB9XG5cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yb290U3RhZ2VDb250ZXh0LnNldE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHJ1bnRpbWUgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZGFjdCAgV2hlbiBgdHJ1ZWAsIHJldHVybnMgYHNoYXJlZFN0YXRlYCBmcm9tIHRoZVxuICAgKiAgIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciAoaWYgb25lIHdhcyBlbmFibGVkKS4gVGhpcyBpcyB0aGUgc2FmZSB2aWV3XG4gICAqICAgZm9yIHNoYXJpbmcgdHJhY2VzIGV4dGVybmFsbHkg4oCUIHBhc3RlIGludG8gYSB2aWV3ZXIsIHNoaXAgdG8gc3VwcG9ydCxcbiAgICogICBldGMuIFdoZW4gdGhlIG1pcnJvciB3YXMgbmV2ZXIgZW5hYmxlZCwgZmFsbHMgYmFjayB0byByYXcgYGdsb2JhbFN0b3JlYFxuICAgKiAgIGFuZCBhIGRldi1tb2RlIHdhcm5pbmcgaXMgZW1pdHRlZCAoc2lsZW50IGluIHByb2R1Y3Rpb24pLlxuICAgKlxuICAgKiAgIERlZmF1bHQgYGZhbHNlYCBwcmVzZXJ2ZXMgdGhlIHJ1bnRpbWUgdmlldyDigJQgbmVjZXNzYXJ5IGZvciBwYXVzZSAvXG4gICAqICAgcmVzdW1lIChyZXN1bXB0aW9uIG11c3QgcmVwbGF5IGFnYWluc3QgdGhlIHJlYWwgdmFsdWVzLCBub3RcbiAgICogICAnW1JFREFDVEVEXScpLlxuICAgKlxuICAgKiBPdGhlciBmaWVsZHMgKGBleGVjdXRpb25UcmVlYCwgYGNvbW1pdExvZ2ApIGFyZSB0aGUgc2FtZSBlaXRoZXIgd2F5IOKAlFxuICAgKiB0aGUgY29tbWl0IGxvZyBpcyBhbHJlYWR5IHJlZGFjdGVkIGF0IHdyaXRlLXRpbWUsIGFuZCB0aGUgZXhlY3V0aW9uXG4gICAqIHRyZWUgb25seSBjYXJyaWVzIHN0cnVjdHVyYWwgbWV0YWRhdGEuXG4gICAqXG4gICAqIGBpbml0aWFsU3RhdGVgICh0aGUgZm9sZCBiYXNlKSBpcyBPTUlUVEVEIHVuZGVyIGByZWRhY3Q6IHRydWVgLiBJdCBpcyB0aGVcbiAgICogcnVuJ3MgcmF3IHByZS1ydW4gc2VlZCDigJQgYGluaXRpYWxDb250ZXh0YCBtZXJnZWQgd2l0aFxuICAgKiBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgIOKAlCBhbmQgaXQgbmV2ZXIgcGFzc2VkIHRocm91Z2ggYSByZWRhY3Rpb25cbiAgICogcG9saWN5OiB0aGUgcG9saWN5IHNjcnVicyBXUklURVMgYXQgdGhlIHNjb3BlIGZhY2FkZSwgYW5kIHRoZSBiYXNlIHdhc1xuICAgKiBuZXZlciB3cml0dGVuIGJ5IGEgc3RhZ2UuIFNlcnZpbmcgaXQgb24gdGhlIHJlZGFjdGVkIHN1cmZhY2Ugd291bGQgaGFuZFxuICAgKiBiYWNrIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBhIHNlZWRlZCBzZWNyZXQgdGhhdCBhIGxhdGVyIGNvbW1pdCBoYWRcbiAgICogc2NydWJiZWQuIEEgY29uc3VtZXIgZm9sZGluZyB3aXRob3V0IGl0IGdldHMgYGJhc2lzOiAnbG9nLW9ubHknYCBmcm9tXG4gICAqIGBzdGF0ZUF0YCwgd2hpY2ggaXMgdGhlIGhvbmVzdCBzaWduYWwgdGhhdCB0aGUgYmFzZSBkaWQgbm90IHRyYXZlbCB3aXRoXG4gICAqIHRoaXMgbG9nIOKAlCBhIHBhcnRpYWwgYW5zd2VyIHRoYXQgc2F5cyBpdCBpcyBwYXJ0aWFsLCBuZXZlciBhIHNpbGVudCBvbmUuXG4gICAqXG4gICAqIFJldHVybnMgYE9taXQ8UnVudGltZVNuYXBzaG90LCAncnVuSWQnPmA6IHRoZSBydW50aW1lIGlzIHRoZSBtZW1vcnlcbiAgICogY29udGFpbmVyIGFuZCBkb2Vzbid0IGtub3cgd2hpY2ggcnVuIGl0IHNlcnZlcyDigJQgYHJ1bklkYCBpcyBwZXItcnVuXG4gICAqIGV4ZWN1dG9yIHN0YXRlLCBzdGFtcGVkIGJ5IGBGbG93Y2hhcnRUcmF2ZXJzZXIuZ2V0U25hcHNob3QoKWAgKHdoaWNoXG4gICAqIG93bnMgdGhlIHJ1bidzIGlkIGFuZCBhbHJlYWR5IHN0YW1wcyBpdCBvbiBldmVyeSBldmVudCkuIFN1YmZsb3dzJ1xuICAgKiBuZXN0ZWQgcnVudGltZXMgZGVsaWJlcmF0ZWx5IGhhdmUgTk8gcnVuSWQgb2YgdGhlaXIgb3duIChhIHN1YmZsb3cgaXNcbiAgICogcGFydCBvZiB0aGUgcGFyZW50J3MgbG9naWNhbCBydW4pLlxuICAgKi9cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KTogT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCc+IHtcbiAgICBjb25zdCBzbmFwc2hvdFJvb3QgPSB0aGlzLl9zbmFwc2hvdFJvb3QgPz8gdGhpcy5yb290U3RhZ2VDb250ZXh0O1xuICAgIGNvbnN0IHVzZVJlZGFjdGVkID0gb3B0aW9ucz8ucmVkYWN0ID09PSB0cnVlICYmIHRoaXMucmVkYWN0ZWRTdG9yZSAhPT0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBzaGFyZWRTdGF0ZTogdXNlUmVkYWN0ZWQgPyB0aGlzLnJlZGFjdGVkU3RvcmUhLmdldFN0YXRlKCkgOiB0aGlzLmdsb2JhbFN0b3JlLmdldFN0YXRlKCksXG4gICAgICBleGVjdXRpb25UcmVlOiBzbmFwc2hvdFJvb3QuZ2V0U25hcHNob3QoKSxcbiAgICAgIC8vIFJFREFDVElPTjogdGhlIGZvbGQgYmFzZSBpcyB0aGUgcmF3IHByZS1ydW4gc2VlZCBhbmQgbm8gcG9saWN5IGV2ZXJcbiAgICAgIC8vIHRvdWNoZWQgaXQgKHBvbGljaWVzIHNjcnViIHdyaXRlczsgbm90aGluZyB3cm90ZSB0aGUgYmFzZSkuIE9taXQgaXRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGxlYWsgaXQg4oCUIGBzdGF0ZUF0YCBkZWdyYWRlcyB0byBgYmFzaXM6ICdsb2ctb25seSdgLlxuICAgICAgLi4uKHVzZVJlZGFjdGVkID8ge30gOiB7IGluaXRpYWxTdGF0ZTogdGhpcy5nZXRGb2xkQmFzZSgpIH0pLFxuICAgICAgLy8gREVUQUNIRUQ6IHRoZSBlbmdpbmUga2VlcHMgaXRzIGxpdmUgRXZlbnRMb2c7IHRoZSBzbmFwc2hvdCBnZXRzIGFcbiAgICAgIC8vIGZyb3plbiBjb3B5IG9mIHRoZSBhcnJheS4gU2VydmluZyBgbGlzdCgpYCBkaXJlY3RseSBhbGlhc2VkIHRoZVxuICAgICAgLy8gaW50ZXJuYWwgYXJyYXksIHNvIGEgc25hcHNob3QgdGFrZW4gbWlkLXJ1biBrZXB0IGdyb3dpbmcgdW5kZXIgaXRzXG4gICAgICAvLyBob2xkZXIgYW5kIGEgY29uc3VtZXIgY291bGQgc3BsaWNlIHRoZSBlbmdpbmUncyBvd24gaGlzdG9yeS4gVGhlXG4gICAgICAvLyBidW5kbGVzIGluIGl0IGFyZSB0aGUgbG9nJ3Mgb3duLCBmcm96ZW4gYXQgYEV2ZW50TG9nIMK3IHJlY29yZGAgKEYzKS5cbiAgICAgIC8vIFRoZSBjb3B5IHN0YXlzOiBpdCBpcyB3aGF0IGtlZXBzIGEgaG9sZGVyJ3MgYXJyYXkgZnJvbSBncm93aW5nLlxuICAgICAgY29tbWl0TG9nOiBPYmplY3QuZnJlZXplKHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5saXN0KCkuc2xpY2UoKSkgYXMgQ29tbWl0QnVuZGxlW10sXG4gICAgICBjb21taXRWYWx1ZXM6IHRoaXMucG9saWN5LmNvbW1pdFZhbHVlcyxcbiAgICAgIHdyaXRlUHJvdmVuYW5jZTogdGhpcy5wb2xpY3kud3JpdGVQcm92ZW5hbmNlLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFpSHpELE1BQU0sT0FBTyxnQkFBZ0I7SUFDcEIsV0FBVyxDQUFlO0lBQ2pDOzs7Ozs7OztPQVFHO0lBQ0ksYUFBYSxDQUFnQjtJQUM3QixnQkFBZ0IsQ0FBZTtJQUMvQixnQkFBZ0IsQ0FBVztJQUNsQyxvRkFBb0Y7SUFDNUUsYUFBYSxDQUFnQjtJQUM3QixhQUFhLENBQVU7SUFDdkIsY0FBYyxDQUFVO0lBQ2hDO21GQUMrRTtJQUN2RSxNQUFNLENBQVk7SUFFMUIsNEVBQTRFO0lBQ3BFLFNBQVMsQ0FBMkI7SUFFNUM7Ozs7OztPQU1HO0lBQ0gsWUFDRSxRQUFnQixFQUNoQixNQUFjLEVBQ2QsYUFBdUIsRUFDdkIsWUFBc0IsRUFDdEIsU0FBb0Isa0JBQWtCO1FBRXRDLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLHlFQUF5RTtRQUN6RSwwRUFBMEU7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QUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhlY3V0aW9uUnVudGltZSDigJQgVGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIG9uZSBmbG93Y2hhcnQgZXhlY3V0aW9uLlxuICpcbiAqIFdpcmVzIHVwIHRoZSB0aHJlZSBtZW1vcnkgcHJpbWl0aXZlcyBpbnRvIGEgc2luZ2xlIGNvbnRhaW5lcjpcbiAqICAgLSBTaGFyZWRNZW1vcnkgKHRoZSBoZWFwIOKAlCBzaGFyZWQgc3RhdGUgYWNyb3NzIGFsbCBzdGFnZXMpXG4gKiAgIC0gU3RhZ2VDb250ZXh0ICAodGhlIGNhbGwgc3RhY2sg4oCUIHBlci1zdGFnZSBleGVjdXRpb24gdHJlZSlcbiAqICAgLSBFdmVudExvZyAgICAgICh0aGUgdHJhbnNhY3Rpb24gbG9nIOKAlCBjb21taXQgaGlzdG9yeSBmb3IgcmVwbGF5KVxuICpcbiAqIFRoZSBlbmdpbmUgKEZsb3djaGFydFRyYXZlcnNlcikgcmVjZWl2ZXMgdGhpcyBhcyBpdHMgcnVudGltZSBwYXJhbWV0ZXIuXG4gKiBBZnRlciBleGVjdXRpb24sIGNvbnN1bWVycyBxdWVyeSBpdCBmb3IgdGhlIGZ1bGwgZXhlY3V0aW9uIHN0YXRlLlxuICovXG5cbmltcG9ydCB7IGRlZXBGcmVlemUgfSBmcm9tICcuLi9jYXB0dXJlL2ZyZWV6ZS5qcyc7XG5pbXBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4uL21lbW9yeS9FdmVudExvZy5qcyc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIgfSBmcm9tICcuLi9tZW1vcnkvcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1JVTl9QT0xJQ1kgfSBmcm9tICcuLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4uL21lbW9yeS9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgQ29tbWl0VmFsdWVzTW9kZSwgU3RhZ2VTbmFwc2hvdCwgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmVyU3RhdHMgfSBmcm9tICcuL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLmpzJztcblxuLyoqIFNuYXBzaG90IG9mIGEgc2luZ2xlIHJlY29yZGVyJ3MgY29sbGVjdGVkIGRhdGEuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVyU25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBTY29wZVJlY29yZGVyIHR5cGUgYW5kIHBhdHRlcm4gZGVzY3JpcHRpb24gKGUuZy4sIFwiVHJhbnNsYXRvciAoS2V5ZWRTdG9yZSkg4oCUIHBlci1zdGVwIHRva2VuIHVzYWdlXCIpLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFByZWZlcnJlZCByZWFkLXRpbWUgb3BlcmF0aW9uIOKAlCBoaW50cyB0aGUgVUkgYWJvdXQgd2hpY2ggdmlldyB0byBzaG93IHByb21pbmVudGx5LiAqL1xuICBwcmVmZXJyZWRPcGVyYXRpb24/OiAndHJhbnNsYXRlJyB8ICdhY2N1bXVsYXRlJyB8ICdhZ2dyZWdhdGUnO1xuICBkYXRhOiB1bmtub3duO1xuICAvKipcbiAgICogU21hbGwgbWFjaGluZS1yZWFkYWJsZSBmYWN0cyBhYm91dCB0aGUgQlVORExFIOKAlCBob3cgaXQgd2FzIHByb2R1Y2VkLFxuICAgKiB3aGljaCBwcm9qZWN0aW9uIG9mIHRoZSByZWNvcmRlcidzIGRhdGEgaXQgaXMsIHdoYXQgaXQgZGVsaWJlcmF0ZWx5XG4gICAqIGxlZnQgb3V0LiBXaGF0ZXZlciB0aGUgcmVjb3JkZXIncyBgdG9TbmFwc2hvdCgpYCBwdXQgaGVyZSwgY29waWVkXG4gICAqIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUaGUgc3BsaXQgd2l0aCBgZGVzY3JpcHRpb25gOiBgZGVzY3JpcHRpb25gIGlzIHRoZSBzZW50ZW5jZSBhIGh1bWFuXG4gICAqIHJlYWRzOyBgbWV0YWAgaXMgd2hhdCBhbiBvZmZsaW5lIGNvbnN1bWVyIEJSQU5DSEVTIG9uLiBBIHJlY29yZGVyIHdpdGhcbiAgICogYSBcImZ1bGxcIiBhbmQgYSBcImxlYW5cIiBidW5kbGUgc2hhcGUgdGhhdCBzYXlzIHNvIG9ubHkgaW4gaXRzXG4gICAqIGRlc2NyaXB0aW9uIGZvcmNlcyBldmVyeSByZWFkZXIgdG8gc3RyaW5nLW1hdGNoIHByb3NlIOKAlCBhbmQgYSByZWFkZXJcbiAgICogdGhhdCBkb2Vzbid0IHJlbmRlcnMgYW4gZW1wdHkgcGFuZWwgaW5zdGVhZCBvZiBzYXlpbmcgXCJ0aGlzIHJlY29yZGluZ1xuICAgKiBjYXJyaWVzIHN0cnVjdHVyZSBvbmx5XCIuXG4gICAqXG4gICAqIE5vdCBpbnRlcnByZXRlZCBieSB0aGUgZW5naW5lLCBzbyBrZXlzIGFyZSB0aGUgcmVjb3JkZXIncyB0byBjaG9vc2U7XG4gICAqIGtlZXAgdGhlIHZhbHVlcyBKU09OLXNhZmUsIHNpbmNlIHRoaXMgcmlkZXMgdGhlIHNuYXBzaG90IG91dCB0byBkaXNrLlxuICAgKi9cbiAgbWV0YT86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuZXhwb3J0IHR5cGUgUnVudGltZVNuYXBzaG90ID0ge1xuICAvKipcbiAgICogVGhlIHJ1biB0aGlzIHNuYXBzaG90IGJlbG9uZ3MgdG8g4oCUIHRoZSBzYW1lIGBydW5JZGAgc3RhbXBlZCBvbiBldmVyeVxuICAgKiBgVHJhdmVyc2FsQ29udGV4dGAgKGFuZCB0aHVzIGV2ZXJ5IHJlY29yZGVyIGV2ZW50KSBvZiB0aGUgcnVuLCBzbyBhXG4gICAqIHNuYXBzaG90IGNhbiBiZSBqb2luZWQgYWdhaW5zdCBhbiBldmVudCBzdHJlYW0gb3IgYW4gZXh0ZXJuYWxcbiAgICogY29ycmVsYXRpb24gdGFibGUuIFJlYWQtb25seSBieSBjb250cmFjdDogZ2VuZXJhdGVkIGJ5IHRoZSBleGVjdXRvclxuICAgKiAoYHJ1bm5lci9ydW5JZC50c2ApLCBuZXZlciBkZXJpdmVkIGZyb20gc25hcHNob3QgY29udGVudHMuXG4gICAqXG4gICAqIExpZmVjeWNsZSAobWF0Y2hlcyB0aGUgZXZlbnQgbW9kZWwpOiBmcmVzaCBwZXIgYHJ1bigpYCBBTkQgcGVyXG4gICAqIGByZXN1bWUoKWAg4oCUIHJlc3VtZSBpcyBsb2dpY2FsbHkgYSBkaXN0aW5jdCBydW4sIHNvIGEgcG9zdC1yZXN1bWVcbiAgICogc25hcHNob3QgY2FycmllcyBhIERJRkZFUkVOVCBydW5JZCB0aGFuIHRoZSBwYXVzZWQgcnVuJ3Mgc25hcHNob3QuXG4gICAqL1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICBzaGFyZWRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV4ZWN1dGlvblRyZWU6IFN0YWdlU25hcHNob3Q7XG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IGxvZydzIGZvbGQgQkFTRSDigJQgdGhlIHJ1bidzIHN0YXRlIGJlZm9yZSBpdHMgZmlyc3QgY29tbWl0XG4gICAqIChgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGA7IG9uIGEgcmVzdW1lLCB0aGVcbiAgICogY2hlY2twb2ludCdzIHN0YXRlKS4gRGVlcGx5IGZyb3plbiBhbmQgZnVsbHkgZGV0YWNoZWQgZnJvbSB0aGUgZW5naW5lLlxuICAgKlxuICAgKiBDb21taXQgYnVuZGxlcyBhcmUgRElGRlMsIHNvIHRoZSBsb2cgYWxvbmUgY2Fubm90IHJlYnVpbGQgYSB2YWx1ZSB0aGF0XG4gICAqIHdhcyBzZWVkZWQgYmVmb3JlIHRoZSBydW4gYW5kIG9ubHkgZXZlciBtZXJnZWQgYWZ0ZXJ3YXJkcy4gU2hpcHBpbmcgdGhlXG4gICAqIGJhc2UgV0lUSCB0aGUgbG9nIGlzIHdoYXQgbWFrZXMgYW4gb2ZmbGluZSBmb2xkIOKAlCBgc3RhdGVBdChzbmFwc2hvdCwgaSlgXG4gICAqIGZyb20gYGZvb3RwcmludGpzL3RyYWNlYCDigJQgcmVwcm9kdWNlIHRoZSBzdGF0ZSBhIHN0YWdlIGFjdHVhbGx5IHNhdy5cbiAgICpcbiAgICogT1BUSU9OQUwgQlkgVFlQRSwgYW5kIGFic2VudCBpbiBleGFjdGx5IHR3byBjYXNlcy4gQSBwbGFpbiBgZ2V0U25hcHNob3QoKWBcbiAgICogYWx3YXlzIGNhcnJpZXMgaXQsIHNvIGEgbGl2ZSBmb2xkIHJlcG9ydHMgYGJhc2lzOiAnaW5pdGlhbCtsb2cnYC4gVW5kZXJcbiAgICogYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBpdCBpcyBPTUlUVEVEIOKAlCB0aGUgYmFzZSBpcyB0aGUgcmF3IHByZS1ydW5cbiAgICogc2VlZCBhbmQgdGhlIHJlZGFjdGlvbiBwb2xpY3kgaXMgbm90IHBsdW1iZWQgaW50byB0aGUgZm9sZCDigJQgc28gYSBmb2xkIG9mXG4gICAqIGEgcmVkYWN0ZWQgc25hcHNob3QgZGVncmFkZXMgaG9uZXN0bHkgdG8gYGJhc2lzOiAnbG9nLW9ubHknYC4gQW5kIGl0IGlzXG4gICAqIGRlY2xhcmVkIG9wdGlvbmFsIHNvIHRoYXQgY29kZSB3cml0dGVuIGFnYWluc3QgOS4xNi54IOKAlCBhIHRlc3QgZml4dHVyZSBvclxuICAgKiBhIFVJIG1vY2sgdGhhdCBDT05TVFJVQ1RTIGEgYFJ1bnRpbWVTbmFwc2hvdGAgbGl0ZXJhbCDigJQgc3RpbGwgY29tcGlsZXMuXG4gICAqIGBzdGF0ZUF0YCBoYW5kbGVzIGFic2VuY2UgYnkgc2F5aW5nIHNvLCBuZXZlciBieSBmb2xkaW5nIGEgbGllLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgY29tbWl0IGJ1bmRsZXMsIG9uZSBwZXIgZXhlY3V0ZWQgc3RhZ2UsIGluIGV4ZWN1dGlvbiBvcmRlciDigJRcbiAgICogYSBERVRBQ0hFRCwgZnJvemVuIGNvcHkgb2YgdGhlIGVuZ2luZSdzIGxpdmUgbG9nIChhIHNuYXBzaG90IGlzIGEgZm9sZFxuICAgKiByZXN1bHQ6IGl0IG11c3Qgbm90IGtlZXAgY2hhbmdpbmcgdW5kZXIgdGhlIGNvbnN1bWVyIHRoYXQgaG9sZHMgaXQpLlxuICAgKiBUaGUgYnVuZGxlcyBpbnNpZGUgYXJlIHRoZSBlbmdpbmUncyBvd24gb2JqZWN0cywgaW1tdXRhYmxlIGFmdGVyIHJlY29yZC5cbiAgICovXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW107XG4gIC8qKlxuICAgKiBFbmNvZGluZyBkaXNjcmltaW5hbnQgZm9yIGBjb21taXRMb2dgICgjMTNjLUIpOiBgJ2Z1bGwnYCDigJQgZXZlcnkgYHNldGBcbiAgICogYnVuZGxlIHN0b3JlcyB0aGUgZnVsbCBmaW5hbCB2YWx1ZSAoaGlzdG9yaWNhbCk7IGAnZGVsdGEnYCDigJQgYnVuZGxlcyBtYXlcbiAgICogY2FycnkgYGFwcGVuZGAvYGRlbGV0ZWAgdHJhY2UgdmVyYnMgd2l0aCB2ZXJiLXF1YWxpZmllZCBgb3ZlcndyaXRlYFxuICAgKiBwYXlsb2FkcyAodGFpbHMpLiBPZmZsaW5lIHRvb2xpbmcga2V5cyBvbiB0aGlzIGZpZWxkOyBhIGJ1bmRsZSBzdHJlYW1cbiAgICogd2l0aG91dCBjb250ZXh0IHJlbWFpbnMgc2VsZi1kZXNjcmliaW5nIHZpYSB0aGUgdmVyYnMgdGhlbXNlbHZlcy5cbiAgICovXG4gIGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZTtcbiAgLyoqIFBlci13cml0ZSByZWFkLXByb3ZlbmFuY2UgZGlhbCAoI1AxKSB0aGUgcnVuIGV4ZWN1dGVkIHVuZGVyIOKAlCB0aGVcbiAgICogIG9mZmxpbmUtdG9vbGluZyBkaXNjcmltaW5hbnQgZm9yIGBUcmFjZUVudHJ5LnJlYWRLZXlzYCBhdmFpbGFiaWxpdHkuICovXG4gIHdyaXRlUHJvdmVuYW5jZTogV3JpdGVQcm92ZW5hbmNlTW9kZTtcbiAgLyoqXG4gICAqIFBlci1zdWJmbG93IGV4ZWN1dGlvbiByZXN1bHRzLCBEVUFMLUtFWUVEIChkZXNpZ246IGRvY3MvZGVzaWduL3N1YmZsb3ctY29tbWl0LXZpc2liaWxpdHkubWQpOlxuICAgKiAgIC0gYnkgc3ViZmxvdyBQQVRIIChgc3ViZmxvd0lkYCwgZS5nLiBgJ3NmLXBheSdgKSDihpIgdGhlIExBU1QgaXRlcmF0aW9uIChiYWNrLWNvbXBhdCk7IHRoaXNcbiAgICogICAgIGlzIHdoYXQgYGdldFN1YnRyZWVTbmFwc2hvdChwYXRoKWAgYW5kIGBsaXN0U3ViZmxvd1BhdGhzKClgIHJlc29sdmUuXG4gICAqICAgLSBieSBwZXItZXhlY3V0aW9uIG1vdW50IGBydW50aW1lU3RhZ2VJZGAgKGUuZy4gYCdzZi1wYXkjNSdgKSDihpIgVEhBVCBpdGVyYXRpb24ncyByZXN1bHQsIHNvXG4gICAqICAgICBhIExPT1BJTkcgc3ViZmxvdyByZXRhaW5zIEVWRVJZIGl0ZXJhdGlvbiAobm90IGp1c3QgdGhlIGxhc3QpLiBMb29rIHVwIGEgc3BlY2lmaWNcbiAgICogICAgIGl0ZXJhdGlvbiBhcyBgc3ViZmxvd1Jlc3VsdHNbbm9kZS5ydW50aW1lU3RhZ2VJZF0gPz8gc3ViZmxvd1Jlc3VsdHNbbm9kZS5zdWJmbG93SWRdYC5cbiAgICogQm90aCBrZXlzIHBvaW50IGF0IHRoZSBzYW1lIG9iamVjdCBmb3IgYSBzaW5nbGUgbW91bnQ7IGl0ZXJhdGUgd2l0aCBjYXJlIChjb3VudCB2aWEgdGhlXG4gICAqIHBhdGgga2V5cyDigJQgdGhvc2Ugd2l0aG91dCBgJyMnYCkuIFRoZSBwYXVzZSBjaGVja3BvaW50IGNhcnJpZXMgb25seSB0aGUgcGF0aCBrZXlzLCBsZWFuLlxuICAgKlxuICAgKiBVbmRlciBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIGVhY2ggZW50cnkncyBgdHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dGAgaXMgdGhhdFxuICAgKiBzdWJmbG93J3MgT1dOIHJlZGFjdGVkIG1pcnJvciAoOS4yMC4wKSDigJQgdGhlIGZvbGQgb2YgaXRzIHNjcnViYmVkIGBoaXN0b3J5YCDigJQgc2VydmVkIGFzXG4gICAqIG9uZSBzdWJzdGl0dXRlZCBvYmplY3QgcGVyIG1vdW50IChib3RoIGtleXMgc3RpbGwgYWdyZWUpIOKAlCB0aGUgd3JhcHBlciBpcyBmcmVzaCBwZXJcbiAgICogYGdldFNuYXBzaG90YCBjYWxsLCB0aGUgYGdsb2JhbENvbnRleHRgIGluc2lkZSBpdCBpcyB0aGUgc3RhYmxlIG1pcnJvcjsgcGxhaW4sIGl0IGlzIHRoZSBzdWJmbG93J3NcbiAgICogbGl2ZSBoZWFwLiBXaXRob3V0IGEgcG9saWN5IHRoZXJlIGlzIG5vIG1pcnJvciBhbmQgdGhlIHR3byB2aWV3cyBhcmUgdGhlIHNhbWUgb2JqZWN0cy5cbiAgICovXG4gIHN1YmZsb3dSZXN1bHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBTbmFwc2hvdCBkYXRhIGZyb20gcmVjb3JkZXJzIHRoYXQgaW1wbGVtZW50IHRvU25hcHNob3QoKS4gKi9cbiAgcmVjb3JkZXJzPzogUmVjb3JkZXJTbmFwc2hvdFtdO1xuICAvKipcbiAgICogRGVmZXJyZWQtb2JzZXJ2ZXIgYWNjb3VudGluZyAoUkZDLTAwMSBCbG9jayA5KSDigJQgcXVldWUgZGVwdGgsIGRyb3BzLFxuICAgKiBmbHVzaC9idWRnZXQgY291bnRlcnMsIHBlci1saXN0ZW5lciB0aW1lIGF0dHJpYnV0aW9uLCBhbmQgdGhlXG4gICAqIHRlcm1pbmFsLWZsdXNoIHN0cmFuZGluZyBjb3VudC4gQUJTRU5UIHVubGVzcyBhIHJlY29yZGVyIHdhcyBhdHRhY2hlZFxuICAgKiB3aXRoIGB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH1gIG9uIHRoaXMgZXhlY3V0b3IgKHplcm8tY29zdCBkaXNjaXBsaW5lKS5cbiAgICovXG4gIG9ic2VydmVyU3RhdHM/OiBPYnNlcnZlclN0YXRzO1xufTtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGlvblJ1bnRpbWUge1xuICBwdWJsaWMgZ2xvYmFsU3RvcmU6IFNoYXJlZE1lbW9yeTtcbiAgLyoqXG4gICAqIFBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciBvZiBgZ2xvYmFsU3RvcmVgLiBQb3B1bGF0ZWQgZHVyaW5nIHRyYXZlcnNhbCB2aWFcbiAgICogYFN0YWdlQ29udGV4dC5jb21taXQoKWAgdXNpbmcgdGhlIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcy5cbiAgICogT25seSBleGlzdHMgd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGEgbWlycm9yIChgUnVuUG9saWN5Lm1pcnJvcmAg4oCUXG4gICAqIGBGbG93Q2hhcnRFeGVjdXRvcmAgc2V0cyBpdCB3aGVuIGEgYFJlZGFjdGlvblBvbGljeWAgaXMgY29uZmlndXJlZCkuXG4gICAqIE90aGVyd2lzZSB1bmRlZmluZWQgYW5kIHplcm8gY29zdC5cbiAgICpcbiAgICogUmVhZCB2aWEgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYC5cbiAgICovXG4gIHB1YmxpYyByZWRhY3RlZFN0b3JlPzogU2hhcmVkTWVtb3J5O1xuICBwdWJsaWMgcm9vdFN0YWdlQ29udGV4dDogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgZXhlY3V0aW9uSGlzdG9yeTogRXZlbnRMb2c7XG4gIC8qKiBPcmlnaW5hbCByb290IGZvciBnZXRTbmFwc2hvdCgpIOKAlCBzZXQgYmVmb3JlIHJlc3VtZSBjaGFuZ2VzIHJvb3RTdGFnZUNvbnRleHQuICovXG4gIHByaXZhdGUgX3NuYXBzaG90Um9vdD86IFN0YWdlQ29udGV4dDtcbiAgcHJpdmF0ZSBfaW5pdGlhbFN0YXRlOiB1bmtub3duO1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWVzOiB1bmtub3duO1xuICAvKiogVGhlIHJ1bidzIHBvbGljeSAoYG1lbW9yeS9ydW5Qb2xpY3kudHNgKSDigJQgaW5zdGFsbGVkIG9uIHRoZSByb290IGZyYW1lO1xuICAgKiAgaXRzIGBjb21taXRWYWx1ZXNgIGFuZCBgd3JpdGVQcm92ZW5hbmNlYCBhcmUgdGhlIHNuYXBzaG90IGRpc2NyaW1pbmFudHMuICovXG4gIHByaXZhdGUgcG9saWN5OiBSdW5Qb2xpY3k7XG5cbiAgLyoqIE1lbW9pemVkIGZyb3plbiBmb2xkIGJhc2Ug4oCUIHNlZSB7QGxpbmsgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZX0uICovXG4gIHByaXZhdGUgX2ZvbGRCYXNlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwb2xpY3kgVGhlIHJ1bidzIHBvbGljeSAoYHJ1blBvbGljeS50c2AsIEY1KSDigJQgdGhlIGZvdXIgZGlhbHMsIHRoZVxuICAgKiAgIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yIGZsYWcuIEluc3RhbGxlZCBvbiB0aGUgcm9vdCBmcmFtZSBoZXJlLCBzb1xuICAgKiAgIHRoZSBGSVJTVCBjb21taXQgKGEgc3ViZmxvdydzIHNlZWQsIGBoaXN0b3J5WzBdYCkgYWxyZWFkeSBydW5zIHVuZGVyIGl0O1xuICAgKiAgIGV2ZXJ5IGZyYW1lIGFmdGVyIGluaGVyaXRzIHRoZSBzYW1lIHJlZmVyZW5jZS4gRGVmYXVsdDogZXZlcnkgZGlhbCBhdFxuICAgKiAgIGl0cyBkZWZhdWx0LCBubyBydWxlLCBubyBtaXJyb3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICByb290TmFtZTogc3RyaW5nLFxuICAgIHJvb3RJZDogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuICAgIGluaXRpYWxTdGF0ZT86IHVua25vd24sXG4gICAgcG9saWN5OiBSdW5Qb2xpY3kgPSBERUZBVUxUX1JVTl9QT0xJQ1ksXG4gICkge1xuICAgIHRoaXMuX2luaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWVzID0gZGVmYXVsdFZhbHVlcztcbiAgICB0aGlzLmdsb2JhbFN0b3JlID0gbmV3IFNoYXJlZE1lbW9yeShkZWZhdWx0VmFsdWVzLCBpbml0aWFsU3RhdGUpO1xuICAgIC8vIFRoZSBldmVudCBsb2cncyBmb2xkIGJhc2UgbXVzdCBiZSB0aGUgU0FNRSBzdGF0ZSB0aGUgc3RvcmUgc3RhcnRzIGZyb21cbiAgICAvLyDigJQgYGluaXRpYWxDb250ZXh0YCBtZXJnZWQgd2l0aCBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgLCB3aGljaCBpcyB3aGF0XG4gICAgLy8gYFNoYXJlZE1lbW9yeWAgY29tcHV0ZWQgYWJvdmUuIFNlZWRpbmcgdGhlIGxvZyBmcm9tIGBpbml0aWFsU3RhdGVgIGFsb25lXG4gICAgLy8gbGVmdCBgZGVmYXVsdFZhbHVlc2Agb3V0IG9mIGV2ZXJ5IHJlcGxheSwgc28gYSBmb2xkIGNvdWxkIG5vdCByZXByb2R1Y2VcbiAgICAvLyB0aGUgc3RhdGUgYSBzdGFnZSBhY3R1YWxseSBzYXcuIGBnZXRTdGF0ZSgpYCBpcyB0aGUgbGl2ZSBjb250ZXh0OyB0aGVcbiAgICAvLyBFdmVudExvZyBjb25zdHJ1Y3RvciBjbG9uZXMgaXQsIHNvIHRoZSBiYXNlIHN0YXlzIGRldGFjaGVkLlxuICAgIHRoaXMuZXhlY3V0aW9uSGlzdG9yeSA9IG5ldyBFdmVudExvZyh0aGlzLmdsb2JhbFN0b3JlLmdldFN0YXRlKCkpO1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMucm9vdFN0YWdlQ29udGV4dCA9IHRoaXMubmV3Um9vdChyb290TmFtZSwgcm9vdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZyZXNoIHJvb3QgZnJhbWUgZm9yIHRoaXMgcnVudGltZSDigJQgYGdsb2JhbFN0b3JlYCwgYGV4ZWN1dGlvbkhpc3RvcnlgLFxuICAgKiB0aGUgcnVuJ3MgcG9saWN5IGFuZCAod2hlbiBrZXB0KSB0aGUgbWlycm9yLiBBbHNvIGhvdyBgU3ViZmxvd0V4ZWN1dG9yYFxuICAgKiByZXBsYWNlcyBhIHN1YmZsb3cncyBzZWVkIGZyYW1lIHdpdGggdGhlIGZyYW1lIGl0cyBmaXJzdCBzdGFnZSBydW5zIG9uLlxuICAgKi9cbiAgbmV3Um9vdChuYW1lOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBTdGFnZUNvbnRleHQge1xuICAgIGNvbnN0IHJvb3QgPSBuZXcgU3RhZ2VDb250ZXh0KCcnLCBuYW1lLCBpZCwgdGhpcy5nbG9iYWxTdG9yZSwgJycsIHRoaXMuZXhlY3V0aW9uSGlzdG9yeSk7XG4gICAgdGhpcy5pbnN0YWxsUG9saWN5KHJvb3QpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgdGhlIHJ1bidzIHBvbGljeSBvbiB0aGUgQ1VSUkVOVCByb290IGZyYW1lIOKAlCBhIHNhbWUtZXhlY3V0b3JcbiAgICogcmVzdW1lLCB3aG9zZSBjb250aW51YXRpb24gcm9vdCAoYGxlYWYuY3JlYXRlTmV4dGApIGlzIGFkdmFuY2VkIGJlZm9yZVxuICAgKiB0aGUgZXhlY3V0b3IgYnVpbGRzIHRoaXMgbGVnJ3MgcG9saWN5IChhIGZyZXNoIHJ1bGUgcGVyIGxlZykuIEV2ZXJ5XG4gICAqIGRlc2NlbmRhbnQgdGFrZXMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZXJlLlxuICAgKi9cbiAgdXNlUG9saWN5KHBvbGljeTogUnVuUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgdGhpcy5pbnN0YWxsUG9saWN5KHRoaXMucm9vdFN0YWdlQ29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBvbGljeSBvbiBgcm9vdGAsIGFuZCB0aGUgbWlycm9yIHN0b3JlIHdoZW4gdGhlIHBvbGljeSBrZWVwcyBvbmUuXG4gICAqIFRoZSBtaXJyb3IgaXMgYSBTRVJWRUQgc3VyZmFjZSwgc28gaXRzIHNlZWQgbXVzdCBhbHJlYWR5IGJlIHRoZSBwb2xpY3knc1xuICAgKiB2aWV3IG9mIHRoZSBzdGFydGluZyBzdGF0ZTogYSBwb2xpY3kga2V5IHRoYXQgYXJyaXZlcyBieSBgaW5pdGlhbENvbnRleHRgXG4gICAqIC8gYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCAob3IsIG9uIGEgY3Jvc3MtZXhlY3V0b3IgcmVzdW1lLCBieSB0aGVcbiAgICogY2hlY2twb2ludCdzIGBzaGFyZWRTdGF0ZWApIGFuZCBpcyBuZXZlciByZS13cml0dGVuIHdvdWxkIG90aGVyd2lzZSBzaXRcbiAgICogaW4gYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBpbiBwbGFpbnRleHQg4oCUIHNvIHRoZSBzZWVkIGlzIHNjcnViYmVkXG4gICAqIHdpdGggdGhlIExPRydzIHBsYWNlaG9sZGVyLCB0aGUgc2FtZSBzdHJpbmcgdGhlIHJlZGFjdGVkIHBhdGNoZXMgY2FycnkuXG4gICAqIENyZWF0ZWQgb25jZSBwZXIgcnVudGltZSAoYSBzdWJmbG93J3MgcnVudGltZSBrZWVwcyBpdHMgb3duOyBpdHMgc2VlZCBpc1xuICAgKiBlbXB0eSDigJQgdGhlIGlucHV0IGFycml2ZXMgYXMgYSBjb21taXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsUG9saWN5KHJvb3Q6IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIHJvb3QudXNlUG9saWN5KHRoaXMucG9saWN5KTtcbiAgICBpZiAoIXRoaXMucG9saWN5Lm1pcnJvcikgcmV0dXJuO1xuICAgIGlmICghdGhpcy5yZWRhY3RlZFN0b3JlKSB7XG4gICAgICBjb25zdCBydWxlID0gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICAgICAgdGhpcy5yZWRhY3RlZFN0b3JlID0gbmV3IFNoYXJlZE1lbW9yeShcbiAgICAgICAgcnVsZSA/IHJ1bGUucmV0YWluU3RhdGUodGhpcy5fZGVmYXVsdFZhbHVlcywgTE9HX1BMQUNFSE9MREVSKSA6IHRoaXMuX2RlZmF1bHRWYWx1ZXMsXG4gICAgICAgIHJ1bGUgPyBydWxlLnJldGFpblN0YXRlKHRoaXMuX2luaXRpYWxTdGF0ZSwgTE9HX1BMQUNFSE9MREVSKSA6IHRoaXMuX2luaXRpYWxTdGF0ZSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJvb3QudXNlUmVkYWN0ZWRNaXJyb3IodGhpcy5yZWRhY3RlZFN0b3JlKTtcbiAgfVxuXG4gIC8qKiBQcmVzZXJ2ZSB0aGUgY3VycmVudCByb290U3RhZ2VDb250ZXh0IGZvciBzbmFwc2hvdHMgYmVmb3JlIGNoYW5naW5nIGl0IGZvciByZXN1bWUuICovXG4gIHByZXNlcnZlU25hcHNob3RSb290KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc25hcHNob3RSb290KSB7XG4gICAgICB0aGlzLl9zbmFwc2hvdFJvb3QgPSB0aGlzLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmcm96ZW4sIGRldGFjaGVkIGZvbGQgYmFzZSBzZXJ2ZWQgYXMge0BsaW5rIFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGV9LlxuICAgKiBDb21wdXRlZCBvbmNlICh0aGUgYmFzZSBuZXZlciBjaGFuZ2VzIGFmdGVyIGNvbnN0cnVjdGlvbikgYW5kIHNoYXJlZCDigJRcbiAgICogc2FmZSBiZWNhdXNlIGl0IGlzIGRlZXBseSBmcm96ZW4sIHNvIG5vIGhvbGRlciBjYW4gbXV0YXRlIGl0IG9yIHJlYWNoIHRoZVxuICAgKiBlbmdpbmUgdGhyb3VnaCBpdC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Rm9sZEJhc2UoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5fZm9sZEJhc2UpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgICB0aGlzLl9mb2xkQmFzZSA9IGRlZXBGcmVlemUoYmFzZSAmJiB0eXBlb2YgYmFzZSA9PT0gJ29iamVjdCcgPyBiYXNlIDoge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZm9sZEJhc2U7XG4gIH1cblxuICBnZXRQaXBlbGluZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiBzdGF0ZS5waXBlbGluZXMgPyBPYmplY3Qua2V5cyhzdGF0ZS5waXBlbGluZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDogW107XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQuc2V0T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcnVudGltZSBzbmFwc2hvdC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMucmVkYWN0ICBXaGVuIGB0cnVlYCwgcmV0dXJucyBgc2hhcmVkU3RhdGVgIGZyb20gdGhlXG4gICAqICAgcGFyYWxsZWwgcmVkYWN0ZWQgbWlycm9yIChpZiBvbmUgd2FzIGVuYWJsZWQpLiBUaGlzIGlzIHRoZSBzYWZlIHZpZXdcbiAgICogICBmb3Igc2hhcmluZyB0cmFjZXMgZXh0ZXJuYWxseSDigJQgcGFzdGUgaW50byBhIHZpZXdlciwgc2hpcCB0byBzdXBwb3J0LFxuICAgKiAgIGV0Yy4gV2hlbiB0aGUgbWlycm9yIHdhcyBuZXZlciBlbmFibGVkLCBmYWxscyBiYWNrIHRvIHJhdyBgZ2xvYmFsU3RvcmVgXG4gICAqICAgYW5kIGEgZGV2LW1vZGUgd2FybmluZyBpcyBlbWl0dGVkIChzaWxlbnQgaW4gcHJvZHVjdGlvbikuXG4gICAqXG4gICAqICAgRGVmYXVsdCBgZmFsc2VgIHByZXNlcnZlcyB0aGUgcnVudGltZSB2aWV3IOKAlCBuZWNlc3NhcnkgZm9yIHBhdXNlIC9cbiAgICogICByZXN1bWUgKHJlc3VtcHRpb24gbXVzdCByZXBsYXkgYWdhaW5zdCB0aGUgcmVhbCB2YWx1ZXMsIG5vdFxuICAgKiAgICdbUkVEQUNURURdJykuXG4gICAqXG4gICAqIE90aGVyIGZpZWxkcyAoYGV4ZWN1dGlvblRyZWVgLCBgY29tbWl0TG9nYCkgYXJlIHRoZSBzYW1lIGVpdGhlciB3YXkg4oCUXG4gICAqIHRoZSBjb21taXQgbG9nIGlzIGFscmVhZHkgcmVkYWN0ZWQgYXQgd3JpdGUtdGltZSwgYW5kIHRoZSBleGVjdXRpb25cbiAgICogdHJlZSBvbmx5IGNhcnJpZXMgc3RydWN0dXJhbCBtZXRhZGF0YS5cbiAgICpcbiAgICogYGluaXRpYWxTdGF0ZWAgKHRoZSBmb2xkIGJhc2UpIGlzIE9NSVRURUQgdW5kZXIgYHJlZGFjdDogdHJ1ZWAuIEl0IGlzIHRoZVxuICAgKiBydW4ncyByYXcgcHJlLXJ1biBzZWVkIOKAlCBgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoXG4gICAqIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAg4oCUIGFuZCBpdCBuZXZlciBwYXNzZWQgdGhyb3VnaCBhIHJlZGFjdGlvblxuICAgKiBwb2xpY3k6IHRoZSBwb2xpY3kgc2NydWJzIFdSSVRFUyBhdCB0aGUgc2NvcGUgZmFjYWRlLCBhbmQgdGhlIGJhc2Ugd2FzXG4gICAqIG5ldmVyIHdyaXR0ZW4gYnkgYSBzdGFnZS4gU2VydmluZyBpdCBvbiB0aGUgcmVkYWN0ZWQgc3VyZmFjZSB3b3VsZCBoYW5kXG4gICAqIGJhY2sgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIGEgc2VlZGVkIHNlY3JldCB0aGF0IGEgbGF0ZXIgY29tbWl0IGhhZFxuICAgKiBzY3J1YmJlZC4gQSBjb25zdW1lciBmb2xkaW5nIHdpdGhvdXQgaXQgZ2V0cyBgYmFzaXM6ICdsb2ctb25seSdgIGZyb21cbiAgICogYHN0YXRlQXRgLCB3aGljaCBpcyB0aGUgaG9uZXN0IHNpZ25hbCB0aGF0IHRoZSBiYXNlIGRpZCBub3QgdHJhdmVsIHdpdGhcbiAgICogdGhpcyBsb2cg4oCUIGEgcGFydGlhbCBhbnN3ZXIgdGhhdCBzYXlzIGl0IGlzIHBhcnRpYWwsIG5ldmVyIGEgc2lsZW50IG9uZS5cbiAgICpcbiAgICogUmV0dXJucyBgT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCc+YDogdGhlIHJ1bnRpbWUgaXMgdGhlIG1lbW9yeVxuICAgKiBjb250YWluZXIgYW5kIGRvZXNuJ3Qga25vdyB3aGljaCBydW4gaXQgc2VydmVzIOKAlCBgcnVuSWRgIGlzIHBlci1ydW5cbiAgICogZXhlY3V0b3Igc3RhdGUsIHN0YW1wZWQgYnkgYEZsb3djaGFydFRyYXZlcnNlci5nZXRTbmFwc2hvdCgpYCAod2hpY2hcbiAgICogb3ducyB0aGUgcnVuJ3MgaWQgYW5kIGFscmVhZHkgc3RhbXBzIGl0IG9uIGV2ZXJ5IGV2ZW50KS4gU3ViZmxvd3MnXG4gICAqIG5lc3RlZCBydW50aW1lcyBkZWxpYmVyYXRlbHkgaGF2ZSBOTyBydW5JZCBvZiB0aGVpciBvd24gKGEgc3ViZmxvdyBpc1xuICAgKiBwYXJ0IG9mIHRoZSBwYXJlbnQncyBsb2dpY2FsIHJ1bikuXG4gICAqL1xuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pOiBPbWl0PFJ1bnRpbWVTbmFwc2hvdCwgJ3J1bklkJz4ge1xuICAgIGNvbnN0IHNuYXBzaG90Um9vdCA9IHRoaXMuX3NuYXBzaG90Um9vdCA/PyB0aGlzLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgY29uc3QgdXNlUmVkYWN0ZWQgPSBvcHRpb25zPy5yZWRhY3QgPT09IHRydWUgJiYgdGhpcy5yZWRhY3RlZFN0b3JlICE9PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNoYXJlZFN0YXRlOiB1c2VSZWRhY3RlZCA/IHRoaXMucmVkYWN0ZWRTdG9yZSEuZ2V0U3RhdGUoKSA6IHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKSxcbiAgICAgIGV4ZWN1dGlvblRyZWU6IHNuYXBzaG90Um9vdC5nZXRTbmFwc2hvdCgpLFxuICAgICAgLy8gUkVEQUNUSU9OOiB0aGUgZm9sZCBiYXNlIGlzIHRoZSByYXcgcHJlLXJ1biBzZWVkIGFuZCBubyBwb2xpY3kgZXZlclxuICAgICAgLy8gdG91Y2hlZCBpdCAocG9saWNpZXMgc2NydWIgd3JpdGVzOyBub3RoaW5nIHdyb3RlIHRoZSBiYXNlKS4gT21pdCBpdFxuICAgICAgLy8gcmF0aGVyIHRoYW4gbGVhayBpdCDigJQgYHN0YXRlQXRgIGRlZ3JhZGVzIHRvIGBiYXNpczogJ2xvZy1vbmx5J2AuXG4gICAgICAuLi4odXNlUmVkYWN0ZWQgPyB7fSA6IHsgaW5pdGlhbFN0YXRlOiB0aGlzLmdldEZvbGRCYXNlKCkgfSksXG4gICAgICAvLyBERVRBQ0hFRDogdGhlIGVuZ2luZSBrZWVwcyBpdHMgbGl2ZSBFdmVudExvZzsgdGhlIHNuYXBzaG90IGdldHMgYVxuICAgICAgLy8gZnJvemVuIGNvcHkgb2YgdGhlIGFycmF5LiBTZXJ2aW5nIGBsaXN0KClgIGRpcmVjdGx5IGFsaWFzZWQgdGhlXG4gICAgICAvLyBpbnRlcm5hbCBhcnJheSwgc28gYSBzbmFwc2hvdCB0YWtlbiBtaWQtcnVuIGtlcHQgZ3Jvd2luZyB1bmRlciBpdHNcbiAgICAgIC8vIGhvbGRlciBhbmQgYSBjb25zdW1lciBjb3VsZCBzcGxpY2UgdGhlIGVuZ2luZSdzIG93biBoaXN0b3J5LiBUaGVcbiAgICAgIC8vIGJ1bmRsZXMgaW4gaXQgYXJlIHRoZSBsb2cncyBvd24sIGZyb3plbiBhdCBgRXZlbnRMb2cgwrcgcmVjb3JkYCAoRjMpLlxuICAgICAgLy8gVGhlIGNvcHkgc3RheXM6IGl0IGlzIHdoYXQga2VlcHMgYSBob2xkZXIncyBhcnJheSBmcm9tIGdyb3dpbmcuXG4gICAgICBjb21taXRMb2c6IE9iamVjdC5mcmVlemUodGhpcy5leGVjdXRpb25IaXN0b3J5Lmxpc3QoKS5zbGljZSgpKSBhcyBDb21taXRCdW5kbGVbXSxcbiAgICAgIGNvbW1pdFZhbHVlczogdGhpcy5wb2xpY3kuY29tbWl0VmFsdWVzLFxuICAgICAgd3JpdGVQcm92ZW5hbmNlOiB0aGlzLnBvbGljeS53cml0ZVByb3ZlbmFuY2UsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -577,14 +577,10 @@ export declare class FlowChartExecutor<TOut = any, TScope = any> {
577
577
  * for an id wins. A recorder with no `toSnapshot` never claims an id, so it
578
578
  * cannot shadow a same-id recorder that does have one.
579
579
  *
580
- * The row is REBUILT field by field rather than spread, so that a recorder
581
- * cannot smuggle an `id` of its own choosing into the snapshot (the id is
582
- * the executor's, and consumers index by it). The cost of that is real:
583
- * anything the recorder returns and this list forgets is dropped in
584
- * silence. `meta` is on the list for exactly that reason — a recorder that
585
- * ships more than one bundle shape needs one field an offline reader can
586
- * branch on, and until it was copied here the only place to say which
587
- * shape you were holding was the prose in `description`.
580
+ * The row is REBUILT field by field by the one copier (`recorder/snapshot.ts
581
+ * · copyBundle`, shared with `CompositeRecorder`) rather than spread, so a
582
+ * recorder cannot smuggle an `id` of its own choosing into the snapshot (the
583
+ * id is the executor's, and consumers index by it).
588
584
  */
589
585
  private collectRecorderSnapshots;
590
586
  /** @internal */