footprintjs 10.3.0 → 10.4.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 (109) hide show
  1. package/dist/esm/index.d.ts +2 -0
  2. package/dist/esm/index.js +1 -1
  3. package/dist/esm/lib/capture/absentEntries.d.ts +7 -0
  4. package/dist/esm/lib/capture/absentEntries.js +81 -0
  5. package/dist/esm/lib/capture/checkpointCapture.d.ts +11 -0
  6. package/dist/esm/lib/capture/checkpointCapture.js +104 -0
  7. package/dist/esm/lib/capture/historyData.d.ts +9 -0
  8. package/dist/esm/lib/capture/historyData.js +79 -0
  9. package/dist/esm/lib/capture/historyNote.d.ts +4 -0
  10. package/dist/esm/lib/capture/historyNote.js +52 -0
  11. package/dist/esm/lib/capture/historyTarget.d.ts +5 -0
  12. package/dist/esm/lib/capture/historyTarget.js +35 -0
  13. package/dist/esm/lib/capture/historyTypes.d.ts +39 -0
  14. package/dist/esm/lib/capture/historyTypes.js +4 -0
  15. package/dist/esm/lib/capture/nativeCoverage.d.ts +20 -7
  16. package/dist/esm/lib/capture/nativeCoverage.js +50 -12
  17. package/dist/esm/lib/capture/noteShape.d.ts +10 -0
  18. package/dist/esm/lib/capture/noteShape.js +93 -0
  19. package/dist/esm/lib/capture/readSources.d.ts +43 -0
  20. package/dist/esm/lib/capture/readSources.js +78 -0
  21. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +5 -2
  22. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  23. package/dist/esm/lib/engine/types.d.ts +3 -0
  24. package/dist/esm/lib/engine/types.js +1 -1
  25. package/dist/esm/lib/memory/StageContext.d.ts +8 -0
  26. package/dist/esm/lib/memory/StageContext.js +84 -9
  27. package/dist/esm/lib/memory/runPolicy.d.ts +5 -1
  28. package/dist/esm/lib/memory/runPolicy.js +2 -1
  29. package/dist/esm/lib/pause/record.js +8 -2
  30. package/dist/esm/lib/pause/types.d.ts +2 -0
  31. package/dist/esm/lib/pause/types.js +1 -1
  32. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +17 -3
  33. package/dist/esm/lib/runner/ExecutionRuntime.js +33 -4
  34. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +3 -0
  35. package/dist/esm/lib/runner/FlowChartExecutor.js +48 -10
  36. package/dist/esm/lib/runner/attach.js +3 -1
  37. package/dist/esm/lib/runner/captureHistory.d.ts +8 -0
  38. package/dist/esm/lib/runner/captureHistory.js +106 -0
  39. package/dist/esm/lib/runner/checkpoint.d.ts +2 -0
  40. package/dist/esm/lib/runner/checkpoint.js +3 -1
  41. package/dist/esm/lib/runner/index.d.ts +1 -0
  42. package/dist/esm/lib/runner/index.js +1 -1
  43. package/dist/esm/lib/runner/options.js +42 -3
  44. package/dist/esm/lib/runner/readStoredCapture.d.ts +39 -0
  45. package/dist/esm/lib/runner/readStoredCapture.js +36 -0
  46. package/dist/esm/lib/runner/recordSink.d.ts +11 -0
  47. package/dist/esm/lib/runner/recordSink.js +47 -4
  48. package/dist/esm/lib/runner/snapshot.js +2 -2
  49. package/dist/esm/lib/runner/storedCaptureAdmission.d.ts +4 -0
  50. package/dist/esm/lib/runner/storedCaptureAdmission.js +97 -0
  51. package/dist/esm/lib/sinks/fileSink.d.ts +2 -1
  52. package/dist/esm/lib/sinks/fileSink.js +8 -2
  53. package/dist/esm/trace.d.ts +2 -0
  54. package/dist/esm/trace.js +2 -1
  55. package/dist/index.js +1 -1
  56. package/dist/lib/capture/absentEntries.js +86 -0
  57. package/dist/lib/capture/checkpointCapture.js +110 -0
  58. package/dist/lib/capture/historyData.js +85 -0
  59. package/dist/lib/capture/historyNote.js +56 -0
  60. package/dist/lib/capture/historyTarget.js +40 -0
  61. package/dist/lib/capture/historyTypes.js +7 -0
  62. package/dist/lib/capture/nativeCoverage.js +52 -13
  63. package/dist/lib/capture/noteShape.js +103 -0
  64. package/dist/lib/capture/readSources.js +83 -0
  65. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -2
  66. package/dist/lib/engine/types.js +1 -1
  67. package/dist/lib/memory/StageContext.js +84 -9
  68. package/dist/lib/memory/runPolicy.js +2 -1
  69. package/dist/lib/pause/record.js +8 -2
  70. package/dist/lib/pause/types.js +1 -1
  71. package/dist/lib/runner/ExecutionRuntime.js +32 -3
  72. package/dist/lib/runner/FlowChartExecutor.js +48 -10
  73. package/dist/lib/runner/attach.js +3 -1
  74. package/dist/lib/runner/captureHistory.js +110 -0
  75. package/dist/lib/runner/checkpoint.js +3 -1
  76. package/dist/lib/runner/index.js +1 -1
  77. package/dist/lib/runner/options.js +42 -3
  78. package/dist/lib/runner/readStoredCapture.js +40 -0
  79. package/dist/lib/runner/recordSink.js +47 -4
  80. package/dist/lib/runner/snapshot.js +2 -2
  81. package/dist/lib/runner/storedCaptureAdmission.js +101 -0
  82. package/dist/lib/sinks/fileSink.js +8 -2
  83. package/dist/trace.js +4 -2
  84. package/dist/types/index.d.ts +2 -0
  85. package/dist/types/lib/capture/absentEntries.d.ts +7 -0
  86. package/dist/types/lib/capture/checkpointCapture.d.ts +11 -0
  87. package/dist/types/lib/capture/historyData.d.ts +9 -0
  88. package/dist/types/lib/capture/historyNote.d.ts +4 -0
  89. package/dist/types/lib/capture/historyTarget.d.ts +5 -0
  90. package/dist/types/lib/capture/historyTypes.d.ts +39 -0
  91. package/dist/types/lib/capture/nativeCoverage.d.ts +20 -7
  92. package/dist/types/lib/capture/noteShape.d.ts +10 -0
  93. package/dist/types/lib/capture/readSources.d.ts +43 -0
  94. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  95. package/dist/types/lib/engine/types.d.ts +3 -0
  96. package/dist/types/lib/memory/StageContext.d.ts +8 -0
  97. package/dist/types/lib/memory/runPolicy.d.ts +5 -1
  98. package/dist/types/lib/pause/types.d.ts +2 -0
  99. package/dist/types/lib/runner/ExecutionRuntime.d.ts +17 -3
  100. package/dist/types/lib/runner/FlowChartExecutor.d.ts +3 -0
  101. package/dist/types/lib/runner/captureHistory.d.ts +8 -0
  102. package/dist/types/lib/runner/checkpoint.d.ts +2 -0
  103. package/dist/types/lib/runner/index.d.ts +1 -0
  104. package/dist/types/lib/runner/readStoredCapture.d.ts +39 -0
  105. package/dist/types/lib/runner/recordSink.d.ts +11 -0
  106. package/dist/types/lib/runner/storedCaptureAdmission.d.ts +4 -0
  107. package/dist/types/lib/sinks/fileSink.d.ts +2 -1
  108. package/dist/types/trace.d.ts +2 -0
  109. package/package.json +2 -2
@@ -23,6 +23,7 @@
23
23
  */
24
24
  import type { Meta } from 'foottrace';
25
25
  import type { RecordSink } from 'foottrace/write';
26
+ import type { CaptureHistoryOptions, CaptureHistoryStatus } from '../capture/historyTypes.js';
26
27
  import type { RedactionRule } from '../memory/redaction.js';
27
28
  import type { RecordSinkStats } from './ExecutionRuntime.js';
28
29
  /** What a lost entry does to the run: `'report'` counts it and goes on; `'fail'` fails the run. */
@@ -44,6 +45,8 @@ export interface RecordSinkOptions {
44
45
  readonly onFailure?: RecordSinkFailureMode;
45
46
  /** `'auto'` (default): `run()` awaits the adapter's `flush()` after the closing entry. `'manual'`: `flushRecord()`. */
46
47
  readonly flush?: RecordSinkFlushMode;
48
+ /** Opt-in capture evidence and explicit host acknowledgement; ordinary flush never implies durability. */
49
+ readonly capture?: CaptureHistoryOptions;
47
50
  }
48
51
  /** The executor's `sink` option: an adapter, or {@link RecordSinkOptions}. */
49
52
  export type RecordSinkOption = RecordSink | RecordSinkOptions;
@@ -70,6 +73,7 @@ export interface ResolvedRecordSink {
70
73
  readonly adapter: RecordSink;
71
74
  readonly onFailure: RecordSinkFailureMode;
72
75
  readonly flush: RecordSinkFlushMode;
76
+ readonly capture?: CaptureHistoryOptions;
73
77
  }
74
78
  /**
75
79
  * Resolve the executor's `sink` option, or refuse it with a `TypeError` naming what is wrong — a wiring mistake
@@ -92,6 +96,8 @@ export declare class RunRecord {
92
96
  /** Aborted at the first loss under `'fail'` — composed into the leg's signal; fresh per leg ({@link beginLeg}). */
93
97
  private stopper?;
94
98
  private failure?;
99
+ private capturePending;
100
+ private captureStatus?;
95
101
  /** Opaque error identities only: no raw entry or adapter error is enumerable on the transport error. */
96
102
  private readonly invocationFailures;
97
103
  constructor(resolved: ResolvedRecordSink);
@@ -113,6 +119,11 @@ export declare class RunRecord {
113
119
  /** The loss that fails the run under `'fail'`; absent while nothing was lost (and always under `'report'`). */
114
120
  get fatal(): RecordSinkError | undefined;
115
121
  stats(): RecordSinkStats;
122
+ get captureOptions(): CaptureHistoryOptions | undefined;
123
+ get pendingCaptureDeliveries(): number;
124
+ captureResult(result: CaptureHistoryStatus): void;
125
+ /** Same served seed as opened; a history digest never sees a seeded policy secret. */
126
+ captureInitialState(state: Record<string, unknown>): Record<string, unknown>;
116
127
  /**
117
128
  * Await the adapter's `flush()`, at most `timeoutMs` when given. A flush that throws or rejects is a loss
118
129
  * (counted, and fatal under `'fail'`); one still running at the deadline is `pending` and keeps running — and,
@@ -53,7 +53,7 @@ export function resolveRecordSink(option) {
53
53
  if (isAdapter(option))
54
54
  return { adapter: option, onFailure: 'report', flush: 'auto' };
55
55
  if (option !== null && typeof option === 'object' && Object.hasOwn(option, 'adapter')) {
56
- const { adapter, onFailure = 'report', flush = 'auto' } = option;
56
+ const { adapter, onFailure = 'report', flush = 'auto', capture } = option;
57
57
  if (!isAdapter(adapter)) {
58
58
  throw new TypeError('FlowChartExecutor: sink.adapter must be a RecordSink (opened, commit, note, closed)');
59
59
  }
@@ -63,7 +63,25 @@ export function resolveRecordSink(option) {
63
63
  if (flush !== 'auto' && flush !== 'manual') {
64
64
  throw new TypeError("FlowChartExecutor: sink.flush must be 'auto' or 'manual'");
65
65
  }
66
- return { adapter, onFailure, flush };
66
+ if (capture !== undefined) {
67
+ if (!capture || typeof capture.acknowledge !== 'function')
68
+ throw new TypeError('sink.capture requires acknowledge');
69
+ for (const [key, max] of [
70
+ ['maxBytes', 8 * 1024 * 1024],
71
+ ['timeoutMs', 30_000],
72
+ ]) {
73
+ const value = capture[key];
74
+ if (value !== undefined && (!Number.isSafeInteger(value) || value < 1 || value > max))
75
+ throw new RangeError(`sink.capture.${key} must be a positive whole number at most ${max}`);
76
+ }
77
+ }
78
+ const fixedCapture = capture &&
79
+ Object.freeze({
80
+ acknowledge: capture.acknowledge.bind(capture),
81
+ ...(capture.maxBytes !== undefined && { maxBytes: capture.maxBytes }),
82
+ ...(capture.timeoutMs !== undefined && { timeoutMs: capture.timeoutMs }),
83
+ });
84
+ return { adapter, onFailure, flush, ...(fixedCapture && { capture: fixedCapture }) };
67
85
  }
68
86
  throw new TypeError('FlowChartExecutor: sink must be a RecordSink (opened, commit, note, closed) or { adapter, onFailure?, flush? }');
69
87
  }
@@ -83,6 +101,8 @@ export class RunRecord {
83
101
  /** Aborted at the first loss under `'fail'` — composed into the leg's signal; fresh per leg ({@link beginLeg}). */
84
102
  stopper;
85
103
  failure;
104
+ capturePending = 0;
105
+ captureStatus;
86
106
  /** Opaque error identities only: no raw entry or adapter error is enumerable on the transport error. */
87
107
  invocationFailures = new WeakMap();
88
108
  constructor(resolved) {
@@ -143,7 +163,15 @@ export class RunRecord {
143
163
  // observes native promises through Promise.prototype.then and guards hostile thenables too.
144
164
  if (returned === null || (typeof returned !== 'object' && typeof returned !== 'function'))
145
165
  return returned;
146
- return settleOnce(returned, () => undefined, failed);
166
+ if (!this.resolved.capture)
167
+ return settleOnce(returned, () => undefined, failed);
168
+ this.capturePending++;
169
+ return settleOnce(returned, () => {
170
+ this.capturePending--;
171
+ }, (cause) => {
172
+ this.capturePending--;
173
+ return failed(cause);
174
+ });
147
175
  }
148
176
  catch (cause) {
149
177
  return failed(cause);
@@ -174,6 +202,7 @@ export class RunRecord {
174
202
  this.stopper = new AbortController();
175
203
  this.failure = undefined;
176
204
  this.warned = false;
205
+ this.captureStatus = undefined;
177
206
  }
178
207
  /** The leg's redaction rule — a resume builds a new one; the next `opened` / `closed` is served under it. */
179
208
  useRule(rule) {
@@ -195,8 +224,22 @@ export class RunRecord {
195
224
  entries: this.entries,
196
225
  failed: this.failed,
197
226
  ...(this.lastError === undefined ? {} : { lastError: this.lastError }),
227
+ ...(this.captureStatus && { capture: this.captureStatus }),
198
228
  };
199
229
  }
230
+ get captureOptions() {
231
+ return this.resolved.capture;
232
+ }
233
+ get pendingCaptureDeliveries() {
234
+ return this.capturePending;
235
+ }
236
+ captureResult(result) {
237
+ this.captureStatus = Object.freeze(result);
238
+ }
239
+ /** Same served seed as opened; a history digest never sees a seeded policy secret. */
240
+ captureInitialState(state) {
241
+ return this.rule ? this.rule.retainState(state, LOG_PLACEHOLDER) : state;
242
+ }
200
243
  /**
201
244
  * Await the adapter's `flush()`, at most `timeoutMs` when given. A flush that throws or rejects is a loss
202
245
  * (counted, and fatal under `'fail'`); one still running at the deadline is `pending` and keeps running — and,
@@ -293,4 +336,4 @@ function settleOnce(value, onValue, onError) {
293
336
  const adopted = value instanceof Promise ? value : new Promise((resolve) => resolve(value));
294
337
  return Promise.prototype.then.call(adopted, onValue, onError);
295
338
  }
296
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkU2luay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL3JlY29yZFNpbmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFJSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUF1QzNEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLEtBQUs7SUFFRjtJQURwQixJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDM0MsWUFBWSxPQUFlLEVBQVcsS0FBYztRQUNsRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFEcUIsVUFBSyxHQUFMLEtBQUssQ0FBUztJQUVwRCxDQUFDO0NBQ0Y7QUFTRCxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBVSxDQUFDO0FBZWhFLFNBQVMsU0FBUyxDQUFDLEtBQWM7SUFDL0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQVEsS0FBaUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQztBQUMzRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQWU7SUFDL0MsSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzNDLElB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QUFDO0FBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJ1bm5lci9yZWNvcmRTaW5rLnRzIOKAlCB0aGUgcnVuJ3Mgc2lkZSBvZiB0aGUgY3Jhc2gtc2FmZSByZWNvcmQgKGRlc2lnbiDCpzMuNSwgcGFja2V0IFA2KS5cbiAqXG4gKiBmb290dHJhY2Ugb3ducyB0aGUgcG9ydCAoYFJlY29yZFNpbmtgLCBgZm9vdHRyYWNlL3dyaXRlYCk6IGEgbG9nIGJ1aWx0IHdpdGggYSBzaW5rIGhhbmRzIGl0IGV2ZXJ5IGVudHJ5IEFTIElUXG4gKiBMQU5EUyDigJQgYG9wZW5lZGAsIGBjb21taXRgLCBgbm90ZWAsIGBjbG9zZWRgIOKAlCBhbmQgY291bnRzIHdoYXQgdGhlIHNpbmsgZGlkIG5vdCB0YWtlLiBUaGlzIGZpbGUgaXMgd2hhdCB0aGVcbiAqIEVYRUNVVE9SIGFkZHMgYXJvdW5kIGFuIGFwcCdzIGFkYXB0ZXIsIG9uZSB7QGxpbmsgUnVuUmVjb3JkfSBwZXIgcnVuOlxuICpcbiAqICAgLSBUSEUgT05FIExBVywgYmVmb3JlIGFueSBieXRlIGxlYXZlczogdGhlIGBvcGVuZWRgIGJhc2UgaXMgdGhlIHJ1bidzIHNlcnZlZCBmb3JtIG9mIGl0ICh0aGUgcmVkYWN0aW9uIHJ1bGUnc1xuICogICAgIGByZXRhaW5TdGF0ZWAsIHRoZSBtaXJyb3IncyBzZWVkIOKAlCBzbyBhIHBvbGljeSBrZXkgc2VlZGVkIGJ5IGBpbml0aWFsQ29udGV4dGAgb3IgYSBjaGVja3BvaW50IG5ldmVyIHJlYWNoZXNcbiAqICAgICB0aGUgc2luayksIGFuZCB0aGUgYG9wZW5lZGAgLyBgY2xvc2VkYCBtZXRhIGFyZSBib3VuZGFyeSByZWNvcmRzIChgcmV0YWluQm91bmRhcnlgKS4gQSBjb21taXQgaXMgdGhlIGxvZydzIG93blxuICogICAgIGJ1bmRsZSwgYWxyZWFkeSBzY3J1YmJlZCBhdCBjb21taXQ7IGFuIGF0dGVtcHQgbm90ZSBjYXJyaWVzIHRoZSBzZXJ2ZWQgYEF0dGVtcHRSZWNvcmRgIChubyBgcmF3YCkuXG4gKiAgIC0gQUNDT1VOVElORzogZXZlcnkgZW50cnkgaGFuZGVkIHRvIHRoZSBhZGFwdGVyIGlzIGNvdW50ZWQsIGV2ZXJ5IGxvc3MgdG9vIChgZ2V0U25hcHNob3QoKS5zaW5rYCksIHdpdGggYVxuICogICAgIGRldi1tb2RlIHdhcm5pbmcgb24gdGhlIGZpcnN0IGxvc3Mgb2YgYSBydW4uIFRoZSBhZGFwdGVyJ3Mgb3duIGBvbkZhaWx1cmVgIGhlYXJzIGEgZGlzcGF0Y2hlZCBlbnRyeSdzIGxvc3NcbiAqICAgICB3aXRoIHRoYXQgc2FtZSBzZXJ2ZWQgZW50cnkgYW5kIGEgc2VydmVkIGVycm9yLCBpc29sYXRlZC4gQSByZWZ1c2FsIGJlZm9yZSBkaXNwYXRjaCBpcyBjb3VudGVkIHdpdGhvdXRcbiAqICAgICBmb3J3YXJkaW5nIEZvb3R0cmFjZSdzIHVuc2VydmVkIGVudHJ5LlxuICogICAtIFRIRSBGQUlMVVJFIE1PREUgKG93bmVyIHJ1bGluZyBRMyk6IGAncmVwb3J0J2AgKGRlZmF1bHQpIOKAlCB0aGUgcnVuIGdvZXMgb247IGAnZmFpbCdgIOKAlCB0aGUgZmlyc3QgbG9zdCBlbnRyeVxuICogICAgIGFib3J0cyB0aGUgcnVuJ3Mgc2lnbmFsIHdpdGggYSB7QGxpbmsgUmVjb3JkU2lua0Vycm9yfSwgYW5kIGEgcnVuIHRoYXQgZmluaXNoZWQgd2l0aCBhIGxvc3MgcmVqZWN0cyB3aXRoIGl0LlxuICogICAtIEZMVVNIOiBgJ2F1dG8nYCAoZGVmYXVsdCkg4oCUIGBydW4oKWAgLyBgcmVzdW1lKClgIGF3YWl0IHRoZSBhZGFwdGVyJ3MgYGZsdXNoKClgIGFmdGVyIHRoZSBjbG9zaW5nIGVudHJ5O1xuICogICAgIGAnbWFudWFsJ2Ag4oCUIHRoZSBhcHAgY2FsbHMgYGV4ZWN1dG9yLmZsdXNoUmVjb3JkKClgLlxuICpcbiAqIEV2ZXJ5IGFkYXB0ZXIgbWV0aG9kIGlzIGNhbGxlZCBzeW5jaHJvbm91c2x5IGZyb20gdGhlIGxvZzsgd2hhdGV2ZXIgdGhlIGFkYXB0ZXIgdGhyb3dzIG9yIHJlamVjdHMgd2l0aCBpcyB0aGVcbiAqIGxvZydzIHRvIGNvdW50IChgRXZlbnRMb2cgwrcgc2lua0ZhaWx1cmVzYCksIG5ldmVyIHRoZSBydW4ncyDigJQgc28gbm90aGluZyBoZXJlIHRocm93cyB0byB0aGUgZW5naW5lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgTWV0YSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgdHlwZSB7IFJlY29yZEVudHJ5LCBSZWNvcmRTaW5rIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcbmltcG9ydCB7IExPR19QTEFDRUhPTERFUiB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgdGhyb3duVGV4dCB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi4vbWVtb3J5L3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBTQ09QRV9QTEFDRUhPTERFUiB9IGZyb20gJy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBSZWNvcmRTaW5rU3RhdHMgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuXG4vKiogV2hhdCBhIGxvc3QgZW50cnkgZG9lcyB0byB0aGUgcnVuOiBgJ3JlcG9ydCdgIGNvdW50cyBpdCBhbmQgZ29lcyBvbjsgYCdmYWlsJ2AgZmFpbHMgdGhlIHJ1bi4gKi9cbmV4cG9ydCB0eXBlIFJlY29yZFNpbmtGYWlsdXJlTW9kZSA9ICdyZXBvcnQnIHwgJ2ZhaWwnO1xuXG4vKiogV2hlbiB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCBydW5zOiBhZnRlciBlYWNoIHJ1bidzIGNsb3NpbmcgZW50cnkgKGAnYXV0bydgKSwgb3Igd2hlbiB0aGUgYXBwIGFza3MuICovXG5leHBvcnQgdHlwZSBSZWNvcmRTaW5rRmx1c2hNb2RlID0gJ2F1dG8nIHwgJ21hbnVhbCc7XG5cbi8qKlxuICogVGhlIGV4ZWN1dG9yJ3MgYHNpbmtgIG9wdGlvbiBpbiBpdHMgbG9uZyBmb3JtLiBUaGUgc2hvcnQgZm9ybSBpcyB0aGUgYWRhcHRlciBpdHNlbGYuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzaW5rOiB7IGFkYXB0ZXI6IGZpbGVTaW5rKCcvdmFyL2Zvb3RwcmludC9ydW4uanNvbmwnKSwgb25GYWlsdXJlOiAnZmFpbCcgfSB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZFNpbmtPcHRpb25zIHtcbiAgLyoqIFdoZXJlIHRoZSBlbnRyaWVzIGdvIOKAlCBgZmlsZVNpbmsocGF0aClgIChgZm9vdHByaW50anMvc2lua3NgKSwgYG1lbW9yeVNpbmsoKWAgKGBmb290dHJhY2Uvd3JpdGVgKSwgb3IgeW91cnMuICovXG4gIHJlYWRvbmx5IGFkYXB0ZXI6IFJlY29yZFNpbms7XG4gIC8qKiBgJ3JlcG9ydCdgIChkZWZhdWx0KTogYSBsb3N0IGVudHJ5IGlzIGNvdW50ZWQgYW5kIHRoZSBydW4gZ29lcyBvbi4gYCdmYWlsJ2A6IHRoZSBmaXJzdCBvbmUgZmFpbHMgdGhlIHJ1bi4gKi9cbiAgcmVhZG9ubHkgb25GYWlsdXJlPzogUmVjb3JkU2lua0ZhaWx1cmVNb2RlO1xuICAvKiogYCdhdXRvJ2AgKGRlZmF1bHQpOiBgcnVuKClgIGF3YWl0cyB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCBhZnRlciB0aGUgY2xvc2luZyBlbnRyeS4gYCdtYW51YWwnYDogYGZsdXNoUmVjb3JkKClgLiAqL1xuICByZWFkb25seSBmbHVzaD86IFJlY29yZFNpbmtGbHVzaE1vZGU7XG59XG5cbi8qKiBUaGUgZXhlY3V0b3IncyBgc2lua2Agb3B0aW9uOiBhbiBhZGFwdGVyLCBvciB7QGxpbmsgUmVjb3JkU2lua09wdGlvbnN9LiAqL1xuZXhwb3J0IHR5cGUgUmVjb3JkU2lua09wdGlvbiA9IFJlY29yZFNpbmsgfCBSZWNvcmRTaW5rT3B0aW9ucztcblxuLyoqIFdoYXQgYGV4ZWN1dG9yLmZsdXNoUmVjb3JkKClgIHJlc29sdmVzIHdpdGgg4oCUIHRoZSBgZHJhaW5PYnNlcnZlcnNgIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRGbHVzaFJlc3VsdCB7XG4gIC8qKiBUaGUgYWRhcHRlcidzIGZsdXNoIGZpbmlzaGVkIChvciB0aGVyZSB3YXMgbm90aGluZyB0byBmbHVzaCkuICovXG4gIHJlYWRvbmx5IGRvbmU6IGJvb2xlYW47XG4gIC8qKiBUaGUgYWRhcHRlcidzIGZsdXNoIHRocmV3IG9yIHJlamVjdGVkIOKAlCBjb3VudGVkIG9uIGBnZXRTbmFwc2hvdCgpLnNpbmtgLiAqL1xuICByZWFkb25seSBmYWlsZWQ6IGJvb2xlYW47XG4gIC8qKiBUaGUgZmx1c2ggaGFkIG5vdCBzZXR0bGVkIHdoZW4gYHRpbWVvdXRNc2AgcmFuIG91dC4gKi9cbiAgcmVhZG9ubHkgcGVuZGluZzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIHJ1biB3aXRoIGBzaW5rOiB7IG9uRmFpbHVyZTogJ2ZhaWwnIH1gIGxvc3QgYW4gZW50cnk6IHRoZSByZWNvcmQgdGhlIGFwcCBhc2tlZCB0byBiZSBrZXB0IGlzIG5vdCB3aG9sZS5cbiAqIGBjYXVzZWAgaXMgdGhlIGFkYXB0ZXIncyBvd24gZXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWNvcmRTaW5rRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IG5hbWUgPSAnUmVjb3JkU2lua0Vycm9yJztcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCByZWFkb25seSBjYXVzZTogdW5rbm93bikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKiBUaGUgb3B0aW9uIHJlc29sdmVkIG9uY2UsIGF0IGNvbnN0cnVjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRSZWNvcmRTaW5rIHtcbiAgcmVhZG9ubHkgYWRhcHRlcjogUmVjb3JkU2luaztcbiAgcmVhZG9ubHkgb25GYWlsdXJlOiBSZWNvcmRTaW5rRmFpbHVyZU1vZGU7XG4gIHJlYWRvbmx5IGZsdXNoOiBSZWNvcmRTaW5rRmx1c2hNb2RlO1xufVxuXG5jb25zdCBNRVRIT0RTID0gWydvcGVuZWQnLCAnY29tbWl0JywgJ25vdGUnLCAnY2xvc2VkJ10gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBTaW5rRXJyb3JWaWV3IHtcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xuICByZWFkb25seSBlcnJvcjogdW5rbm93bjtcbiAgcmVhZG9ubHkgbWFza2VkOiBib29sZWFuO1xuICByZWFkb25seSBydWxlPzogUmVkYWN0aW9uUnVsZTtcbn1cblxuaW50ZXJmYWNlIEludm9jYXRpb25GYWlsdXJlIHtcbiAgcmVhZG9ubHkgZW50cnk6IFJlY29yZEVudHJ5O1xuICByZWFkb25seSBjYXVzZTogdW5rbm93bjtcbiAgcmVhZG9ubHkgdmlldzogU2lua0Vycm9yVmlldztcbn1cblxuZnVuY3Rpb24gaXNBZGFwdGVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkU2luayB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBNRVRIT0RTLmV2ZXJ5KChtKSA9PiB0eXBlb2YgKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVttXSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZXhlY3V0b3IncyBgc2lua2Agb3B0aW9uLCBvciByZWZ1c2UgaXQgd2l0aCBhIGBUeXBlRXJyb3JgIG5hbWluZyB3aGF0IGlzIHdyb25nIOKAlCBhIHdpcmluZyBtaXN0YWtlXG4gKiB0aGUgYXBwIG1ha2VzIG9uY2UsIHNvIGl0IGZhaWxzIGF0IGNvbnN0cnVjdGlvbiwgbmV2ZXIgbWlkLXJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWNvcmRTaW5rKG9wdGlvbjogdW5rbm93bik6IFJlc29sdmVkUmVjb3JkU2luayB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGlzQWRhcHRlcihvcHRpb24pKSByZXR1cm4geyBhZGFwdGVyOiBvcHRpb24sIG9uRmFpbHVyZTogJ3JlcG9ydCcsIGZsdXNoOiAnYXV0bycgfTtcbiAgaWYgKG9wdGlvbiAhPT0gbnVsbCAmJiB0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0JyAmJiBPYmplY3QuaGFzT3duKG9wdGlvbiwgJ2FkYXB0ZXInKSkge1xuICAgIGNvbnN0IHsgYWRhcHRlciwgb25GYWlsdXJlID0gJ3JlcG9ydCcsIGZsdXNoID0gJ2F1dG8nIH0gPSBvcHRpb24gYXMgUGFydGlhbDxSZWNvcmRTaW5rT3B0aW9ucz47XG4gICAgaWYgKCFpc0FkYXB0ZXIoYWRhcHRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Zsb3dDaGFydEV4ZWN1dG9yOiBzaW5rLmFkYXB0ZXIgbXVzdCBiZSBhIFJlY29yZFNpbmsgKG9wZW5lZCwgY29tbWl0LCBub3RlLCBjbG9zZWQpJyk7XG4gICAgfVxuICAgIGlmIChvbkZhaWx1cmUgIT09ICdyZXBvcnQnICYmIG9uRmFpbHVyZSAhPT0gJ2ZhaWwnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmxvd0NoYXJ0RXhlY3V0b3I6IHNpbmsub25GYWlsdXJlIG11c3QgYmUgJ3JlcG9ydCcgb3IgJ2ZhaWwnXCIpO1xuICAgIH1cbiAgICBpZiAoZmx1c2ggIT09ICdhdXRvJyAmJiBmbHVzaCAhPT0gJ21hbnVhbCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGbG93Q2hhcnRFeGVjdXRvcjogc2luay5mbHVzaCBtdXN0IGJlICdhdXRvJyBvciAnbWFudWFsJ1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYWRhcHRlciwgb25GYWlsdXJlLCBmbHVzaCB9O1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ0Zsb3dDaGFydEV4ZWN1dG9yOiBzaW5rIG11c3QgYmUgYSBSZWNvcmRTaW5rIChvcGVuZWQsIGNvbW1pdCwgbm90ZSwgY2xvc2VkKSBvciB7IGFkYXB0ZXIsIG9uRmFpbHVyZT8sIGZsdXNoPyB9JyxcbiAgKTtcbn1cblxuLyoqXG4gKiBPbmUgcnVuJ3MgcmVjb3JkIHNpbms6IHRoZSBzaW5rIGV2ZXJ5IGxvZyBvZiB0aGUgcnVuIHdyaXRlcyB0byAocm9vdCBhbmQgbW91bnRzKSwgaXRzIGFjY291bnRpbmcgYW5kIGl0c1xuICogZmFpbHVyZSBtb2RlLiBBIHNhbWUtZXhlY3V0b3IgcmVzdW1lIGtlZXBzIGl0ICh0aGUgcm9vdCBsb2cgZ29lcyBvbik7IGEgZnJlc2ggcnVuIG1ha2VzIGEgbmV3IG9uZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1blJlY29yZCB7XG4gIC8qKiBIYW5kIHRoaXMgdG8gZXZlcnkgYEV2ZW50TG9nYCBvZiB0aGUgcnVuLiAqL1xuICByZWFkb25seSBzaW5rOiBSZWNvcmRTaW5rO1xuICBwcml2YXRlIGVudHJpZXMgPSAwO1xuICBwcml2YXRlIGZhaWxlZCA9IDA7XG4gIHByaXZhdGUgbGFzdEVycm9yPzogc3RyaW5nO1xuICBwcml2YXRlIHdhcm5lZCA9IGZhbHNlO1xuICBwcml2YXRlIHJ1bGU/OiBSZWRhY3Rpb25SdWxlO1xuICAvKiogQWJvcnRlZCBhdCB0aGUgZmlyc3QgbG9zcyB1bmRlciBgJ2ZhaWwnYCDigJQgY29tcG9zZWQgaW50byB0aGUgbGVnJ3Mgc2lnbmFsOyBmcmVzaCBwZXIgbGVnICh7QGxpbmsgYmVnaW5MZWd9KS4gKi9cbiAgcHJpdmF0ZSBzdG9wcGVyPzogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIGZhaWx1cmU/OiBSZWNvcmRTaW5rRXJyb3I7XG4gIC8qKiBPcGFxdWUgZXJyb3IgaWRlbnRpdGllcyBvbmx5OiBubyByYXcgZW50cnkgb3IgYWRhcHRlciBlcnJvciBpcyBlbnVtZXJhYmxlIG9uIHRoZSB0cmFuc3BvcnQgZXJyb3IuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW52b2NhdGlvbkZhaWx1cmVzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBJbnZvY2F0aW9uRmFpbHVyZT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkOiBSZXNvbHZlZFJlY29yZFNpbmspIHtcbiAgICBpZiAocmVzb2x2ZWQub25GYWlsdXJlID09PSAnZmFpbCcpIHRoaXMuc3RvcHBlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBhZGFwdGVyID0gcmVzb2x2ZWQuYWRhcHRlcjtcbiAgICBjb25zdCBoYW5kZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLmVudHJpZXMgKz0gMTtcbiAgICB9O1xuICAgIHRoaXMuc2luayA9IHtcbiAgICAgIG9wZW5lZDogKGVudHJ5KSA9PiB7XG4gICAgICAgIGhhbmRlZCgpO1xuICAgICAgICBjb25zdCBydWxlID0gdGhpcy5ydWxlO1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPSB7XG4gICAgICAgICAgLi4uZW50cnksXG4gICAgICAgICAgaW5pdGlhbFN0YXRlOiBydWxlID8gcnVsZS5yZXRhaW5TdGF0ZShlbnRyeS5pbml0aWFsU3RhdGUsIExPR19QTEFDRUhPTERFUikgOiBlbnRyeS5pbml0aWFsU3RhdGUsXG4gICAgICAgICAgLi4uKGVudHJ5Lm1ldGEgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBtZXRhOiB0aGlzLnNlcnZlKGVudHJ5Lm1ldGEpIH0pLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2UoeyAuLi5zZXJ2ZWQsIGtpbmQ6ICdvcGVuZWQnIH0sICgpID0+IGFkYXB0ZXIub3BlbmVkKHNlcnZlZCksIHJ1bGUpO1xuICAgICAgfSxcbiAgICAgIGNvbW1pdDogKGVudHJ5KSA9PiB7XG4gICAgICAgIGhhbmRlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2UoeyAuLi5lbnRyeSwga2luZDogJ2NvbW1pdCcgfSwgKCkgPT4gYWRhcHRlci5jb21taXQoZW50cnkpLCB0aGlzLnJ1bGUpO1xuICAgICAgfSxcbiAgICAgIG5vdGU6IChlbnRyeSkgPT4ge1xuICAgICAgICBoYW5kZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW52b2tlKFxuICAgICAgICAgIHsgYWRkcmVzczogZW50cnkuYWRkcmVzcywgYXQ6IGVudHJ5LmF0LCBraW5kOiAnbm90ZScsIG5vdGU6IGVudHJ5LmtpbmQsIGRhdGE6IGVudHJ5LmRhdGEgfSxcbiAgICAgICAgICAoKSA9PiBhZGFwdGVyLm5vdGUoZW50cnkpLFxuICAgICAgICAgIHRoaXMucnVsZSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBjbG9zZWQ6IChlbnRyeSkgPT4ge1xuICAgICAgICBoYW5kZWQoKTtcbiAgICAgICAgY29uc3Qgc2VydmVkID0geyAuLi5lbnRyeSwgLi4uKGVudHJ5Lm1ldGEgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBtZXRhOiB0aGlzLnNlcnZlKGVudHJ5Lm1ldGEpIH0pIH07XG4gICAgICAgIHJldHVybiB0aGlzLmludm9rZSh7IC4uLnNlcnZlZCwga2luZDogJ2Nsb3NlZCcgfSwgKCkgPT4gYWRhcHRlci5jbG9zZWQoc2VydmVkKSwgdGhpcy5ydWxlKTtcbiAgICAgIH0sXG4gICAgICBvbkZhaWx1cmU6IChmYWlsdXJlKSA9PiB7XG4gICAgICAgIGNvbnN0IGludm9jYXRpb24gPVxuICAgICAgICAgIGZhaWx1cmUuZXJyb3IgIT09IG51bGwgJiYgKHR5cGVvZiBmYWlsdXJlLmVycm9yID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgZmFpbHVyZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgID8gdGhpcy5pbnZvY2F0aW9uRmFpbHVyZXMuZ2V0KGZhaWx1cmUuZXJyb3IpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gQmVmb3JlIGFkbWlzc2lvbiAoZS5nLiBhIG1ldGEtY29weSByZWZ1c2FsKSwgbm8gZGlzcGF0Y2hlZCBzZXJ2ZWQgZW50cnkgZXhpc3RzLiBDb3VudCB0aGUgbG9zcyBhbmRcbiAgICAgICAgLy8gYXBwbHkgdGhlIGZhaWx1cmUgbW9kZSwgYnV0IG5ldmVyIGhhbmQgdGhlIGFkYXB0ZXIgRm9vdHRyYWNlJ3Mgb3JpZ2luYWwsIHVuc2VydmVkIGVudHJ5LlxuICAgICAgICBpZiAoaW52b2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLmxvc3QoZmFpbHVyZS5lcnJvciwgdW5kZWZpbmVkLCB0aGlzLmVycm9yVmlldyhmYWlsdXJlLmVycm9yLCB0aGlzLnJ1bGUpKTtcbiAgICAgICAgZWxzZSB0aGlzLmxvc3QoaW52b2NhdGlvbi5jYXVzZSwgaW52b2NhdGlvbi5lbnRyeSwgaW52b2NhdGlvbi52aWV3KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDYXB0dXJlIHRoZSBzZXJ2ZWQgZW50cnkgbm93OyBhbiBhc3luY2hyb25vdXMgZmFpbHVyZSBrZWVwcyB0aGlzIGxlZydzIHJ1bGUsIG5vdCBhIGxhdGVyIHJlc3VtZSdzIHJ1bGUuICovXG4gIHByaXZhdGUgaW52b2tlKGVudHJ5OiBSZWNvcmRFbnRyeSwgY2FsbDogKCkgPT4gdW5rbm93biwgcnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICAgIGNvbnN0IGZhaWxlZCA9IChjYXVzZTogdW5rbm93bik6IG5ldmVyID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gbmV3IEVycm9yKCdyZWNvcmQgc2luazogYWRhcHRlciBpbnZvY2F0aW9uIGZhaWxlZCcpO1xuICAgICAgdGhpcy5pbnZvY2F0aW9uRmFpbHVyZXMuc2V0KGVudmVsb3BlLCB7IGVudHJ5LCBjYXVzZSwgdmlldzogdGhpcy5lcnJvclZpZXcoY2F1c2UsIHJ1bGUpIH0pO1xuICAgICAgdGhyb3cgZW52ZWxvcGU7XG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0dXJuZWQgPSBjYWxsKCk7XG4gICAgICAvLyBWb2lkIGFkYXB0ZXJzIGtlZXAgdGhlaXIgc3luY2hyb25vdXMgcGF0aDsgb25seSBhbiBvYmplY3QvZnVuY3Rpb24gY2FuIGJlIGEgdGhlbmFibGUuIHNldHRsZU9uY2VcbiAgICAgIC8vIG9ic2VydmVzIG5hdGl2ZSBwcm9taXNlcyB0aHJvdWdoIFByb21pc2UucHJvdG90eXBlLnRoZW4gYW5kIGd1YXJkcyBob3N0aWxlIHRoZW5hYmxlcyB0b28uXG4gICAgICBpZiAocmV0dXJuZWQgPT09IG51bGwgfHwgKHR5cGVvZiByZXR1cm5lZCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHJldHVybmVkICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIHJldHVybmVkO1xuICAgICAgcmV0dXJuIHNldHRsZU9uY2UocmV0dXJuZWQsICgpID0+IHVuZGVmaW5lZCwgZmFpbGVkKTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgcmV0dXJuIGZhaWxlZChjYXVzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgc2luayBlcnJvciBpcyB0aGUgZGlhZ25vc3RpYyBlcnJvcnMucmVjb3JkU2lua0Vycm9yOyByYXcgY2F1c2VzIGJlbG9uZyBvbmx5IHRvIHRoZSBjYWxsZXIncyBleGNlcHRpb24uICovXG4gIHByaXZhdGUgZXJyb3JWaWV3KGVycm9yOiB1bmtub3duLCBydWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkKTogU2lua0Vycm9yVmlldyB7XG4gICAgY29uc3QgdGV4dCA9IHRocm93blRleHQoZXJyb3IpO1xuICAgIGNvbnN0IHJldGFpbmVkID0gcnVsZVxuICAgICAgPyBydWxlLnJldGFpblN0YWdlRXJyb3IoZXJyb3IsIHRleHQsIHJ1bGUucmV0YWluRGlhZ25vc3RpYyhbJ2Vycm9ycycsICdyZWNvcmRTaW5rRXJyb3InXSwgdGV4dCkpXG4gICAgICA6IHsgbWVzc2FnZTogdGV4dCwgc3RydWN0dXJlZEVycm9yOiBleHRyYWN0RXJyb3JJbmZvKGVycm9yKSB9O1xuICAgIGNvbnN0IHNlcnZlZCA9IHsgLi4ucmV0YWluZWQuc3RydWN0dXJlZEVycm9yIH07XG4gICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZXJ2ZWQsICdyYXcnKTtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogcmV0YWluZWQubWVzc2FnZSxcbiAgICAgIGVycm9yOiBzZXJ2ZWQsXG4gICAgICBtYXNrZWQ6IHJldGFpbmVkLm1lc3NhZ2UgIT09IHRleHQgfHwgcmV0YWluZWQuc3RydWN0dXJlZEVycm9yLnJhdyAhPT0gZXJyb3IsXG4gICAgICBydWxlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSBzdGFydHMgYSBuZXcgbGVnIG9uIHRoZSBzYW1lIHJlY29yZDogdGhlIGNvdW50cyBnbyBvbiAob25lIGxvZywgb25lIHJlY29yZCksIGJ1dCB0aGVcbiAgICogZmFpbHVyZSBtb2RlIGlzIHRoZSBMRUcncyDigJQgYSBsb3NzIGluIGFuIGVhcmxpZXIgbGVnICh3aGljaCBhbHJlYWR5IGZhaWxlZCB0aGF0IGxlZykgZG9lcyBub3Qgc3RvcCB0aGlzIG9uZSDigJRcbiAgICogYW5kIHRoZSBkZXYtbW9kZSB3YXJuaW5nIG1heSBmaXJlIGFnYWluLlxuICAgKi9cbiAgYmVnaW5MZWcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzb2x2ZWQub25GYWlsdXJlID09PSAnZmFpbCcpIHRoaXMuc3RvcHBlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLmZhaWx1cmUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy53YXJuZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBUaGUgbGVnJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIGEgcmVzdW1lIGJ1aWxkcyBhIG5ldyBvbmU7IHRoZSBuZXh0IGBvcGVuZWRgIC8gYGNsb3NlZGAgaXMgc2VydmVkIHVuZGVyIGl0LiAqL1xuICB1c2VSdWxlKHJ1bGU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnJ1bGUgPSBydWxlO1xuICB9XG5cbiAgLyoqIEFib3J0cyBhdCB0aGUgZmlyc3QgbG9zcyB1bmRlciBgb25GYWlsdXJlOiAnZmFpbCdgOyBhYnNlbnQgb3RoZXJ3aXNlLiAqL1xuICBnZXQgc3RvcFNpZ25hbCgpOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcHBlcj8uc2lnbmFsO1xuICB9XG5cbiAgZ2V0IGZsdXNoTW9kZSgpOiBSZWNvcmRTaW5rRmx1c2hNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZC5mbHVzaDtcbiAgfVxuXG4gIC8qKiBUaGUgbG9zcyB0aGF0IGZhaWxzIHRoZSBydW4gdW5kZXIgYCdmYWlsJ2A7IGFic2VudCB3aGlsZSBub3RoaW5nIHdhcyBsb3N0IChhbmQgYWx3YXlzIHVuZGVyIGAncmVwb3J0J2ApLiAqL1xuICBnZXQgZmF0YWwoKTogUmVjb3JkU2lua0Vycm9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlO1xuICB9XG5cbiAgc3RhdHMoKTogUmVjb3JkU2lua1N0YXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50cmllczogdGhpcy5lbnRyaWVzLFxuICAgICAgZmFpbGVkOiB0aGlzLmZhaWxlZCxcbiAgICAgIC4uLih0aGlzLmxhc3RFcnJvciA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxhc3RFcnJvcjogdGhpcy5sYXN0RXJyb3IgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdCB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCwgYXQgbW9zdCBgdGltZW91dE1zYCB3aGVuIGdpdmVuLiBBIGZsdXNoIHRoYXQgdGhyb3dzIG9yIHJlamVjdHMgaXMgYSBsb3NzXG4gICAqIChjb3VudGVkLCBhbmQgZmF0YWwgdW5kZXIgYCdmYWlsJ2ApOyBvbmUgc3RpbGwgcnVubmluZyBhdCB0aGUgZGVhZGxpbmUgaXMgYHBlbmRpbmdgIGFuZCBrZWVwcyBydW5uaW5nIOKAlCBhbmQsXG4gICAqIHdpdGggYHBlbmRpbmdJc0xvc3NgICh0aGUgcnVuJ3Mgb3duIGZsdXNoKSwgY291bnRlZCBhcyBhIGxvc3MgdG9vLCBzbyBhIGZsdXNoIHRoYXQgbmV2ZXIgc2V0dGxlcyBjYW5ub3QgaG9sZCBhXG4gICAqIHJ1biBvcGVuLCBhbmQgY2Fubm90IHBhc3MgZm9yIG9uZSB0aGF0IGxhbmRlZC4gTm90aGluZyBoZXJlIHRocm93czogYSBob3N0aWxlIGFkYXB0ZXIgKGEgdGhyb3dpbmcgYGZsdXNoYFxuICAgKiBnZXR0ZXIsIGEgcHJvbWlzZSB3aXRoIGl0cyBvd24gYHRoZW5gKSBpcyBhIGxvc3MsIG5ldmVyIHRoZSBydW4ncyBlcnJvci5cbiAgICovXG4gIGFzeW5jIGZsdXNoKHRpbWVvdXRNcz86IG51bWJlciwgcGVuZGluZ0lzTG9zcyA9IGZhbHNlKTogUHJvbWlzZTxSZWNvcmRGbHVzaFJlc3VsdD4ge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLnJlc29sdmVkLmFkYXB0ZXI7XG4gICAgY29uc3QgcnVsZSA9IHRoaXMucnVsZTtcbiAgICBsZXQgc2V0dGxlZDogUHJvbWlzZTxSZWNvcmRGbHVzaFJlc3VsdD47XG4gICAgbGV0IGdpdmVuVXAgPSBmYWxzZTsgLy8gYSBmbHVzaCBhbHJlYWR5IGNvdW50ZWQgYXMgYSBsb3NzIGF0IHRoZSBkZWFkbGluZSBpcyBub3QgY291bnRlZCBhZ2FpbiB3aGVuIGl0IHJlamVjdHNcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmx1c2g6IHVua25vd24gPSBhZGFwdGVyLmZsdXNoOyAvLyByZWFkIG9uY2U6IGEgZ2V0dGVyIHJ1bnMgb25jZSwgaW5zaWRlIHRoZSBndWFyZFxuICAgICAgaWYgKHR5cGVvZiBmbHVzaCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgZmFpbGVkOiBmYWxzZSwgcGVuZGluZzogZmFsc2UgfTtcbiAgICAgIHNldHRsZWQgPSBzZXR0bGVPbmNlKFxuICAgICAgICBmbHVzaC5jYWxsKGFkYXB0ZXIpLFxuICAgICAgICAoKTogUmVjb3JkRmx1c2hSZXN1bHQgPT4gKHsgZG9uZTogdHJ1ZSwgZmFpbGVkOiBmYWxzZSwgcGVuZGluZzogZmFsc2UgfSksXG4gICAgICAgIChlcnJvcik6IFJlY29yZEZsdXNoUmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAoIWdpdmVuVXApIHRoaXMubG9zdChlcnJvciwgdW5kZWZpbmVkLCB0aGlzLmVycm9yVmlldyhlcnJvciwgcnVsZSkpO1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCBmYWlsZWQ6IHRydWUsIHBlbmRpbmc6IGZhbHNlIH07XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvc3QoZXJyb3IsIHVuZGVmaW5lZCwgdGhpcy5lcnJvclZpZXcoZXJyb3IsIHJ1bGUpKTtcbiAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCBmYWlsZWQ6IHRydWUsIHBlbmRpbmc6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh0aW1lb3V0TXMgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRNcykpIHJldHVybiBzZXR0bGVkO1xuICAgIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGVuZGluZyA9IG5ldyBQcm9taXNlPFJlY29yZEZsdXNoUmVzdWx0PigocmVzb2x2ZSkgPT4ge1xuICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoeyBkb25lOiBmYWxzZSwgZmFpbGVkOiBmYWxzZSwgcGVuZGluZzogdHJ1ZSB9KSwgTWF0aC5tYXgoMCwgdGltZW91dE1zKSk7XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbc2V0dGxlZCwgcGVuZGluZ10pO1xuICAgICAgaWYgKHJlc3VsdC5wZW5kaW5nICYmIHBlbmRpbmdJc0xvc3MpIHtcbiAgICAgICAgZ2l2ZW5VcCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGByZWNvcmQgc2luazogZmx1c2goKSBkaWQgbm90IHNldHRsZSB3aXRoaW4gJHtNYXRoLm1heCgwLCB0aW1lb3V0TXMpfW1zYCk7XG4gICAgICAgIHRoaXMubG9zdChlcnJvciwgdW5kZWZpbmVkLCB0aGlzLmVycm9yVmlldyhlcnJvciwgcnVsZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIG1ldGEgYXMgc2VydmVkOiBhIGJvdW5kYXJ5IHJlY29yZCwgc2NydWJiZWQgYnkga2V5IG5hbWUgYXQgZXZlcnkgZGVwdGggKGFuIGluZXJ0IHJ1bGUgY29waWVzIG5vdGhpbmcpLiAqL1xuICBzZXJ2ZShtZXRhOiBNZXRhKTogTWV0YSB7XG4gICAgcmV0dXJuIHRoaXMucnVsZSA/IHRoaXMucnVsZS5yZXRhaW5Cb3VuZGFyeShtZXRhLCBMT0dfUExBQ0VIT0xERVIpIDogbWV0YTtcbiAgfVxuXG4gIC8qKiBPbmUgbG9zczogY291bnRlZCwgd2FybmVkIG9uY2UgcGVyIHJ1biwgdG9sZCB3aXRoIGEgc2FmZSBkaXNwYXRjaGVkIGVudHJ5IHdoZW4gYXZhaWxhYmxlLCBmYXRhbCB1bmRlciAnZmFpbCcuICovXG4gIHByaXZhdGUgbG9zdChlcnJvcjogdW5rbm93biwgZW50cnk6IFJlY29yZEVudHJ5IHwgdW5kZWZpbmVkLCB2aWV3OiBTaW5rRXJyb3JWaWV3KTogdm9pZCB7XG4gICAgdGhpcy5mYWlsZWQgKz0gMTtcbiAgICBjb25zdCB0ZXh0ID0gdmlldy50ZXh0O1xuICAgIHRoaXMubGFzdEVycm9yID0gdGV4dDtcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgIXRoaXMud2FybmVkKSB7XG4gICAgICB0aGlzLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gcmVjb3JkIHNpbms6IGFuIGVudHJ5IHdhcyBub3Qgc3RvcmVkICgke3RleHR9KS4gVGhlIHJ1biBnb2VzIG9uOyBgICtcbiAgICAgICAgICAnZ2V0U25hcHNob3QoKS5zaW5rIGNvdW50cyBldmVyeSBsb3NzLicsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBUaGUgZmFpbHVyZSBtb2RlIGZpcnN0OiBub3RoaW5nIHRoZSBhZGFwdGVyJ3Mgb3duIGxpc3RlbmVyIGRvZXMgY2FuIHNraXAgaXQuXG4gICAgaWYgKHRoaXMuc3RvcHBlciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZmFpbHVyZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZhaWx1cmUgPSBuZXcgUmVjb3JkU2lua0Vycm9yKGByZWNvcmQgc2luazogYW4gZW50cnkgd2FzIG5vdCBzdG9yZWQg4oCUICR7dGV4dH1gLCBlcnJvcik7XG4gICAgICBpZiAodmlldy5tYXNrZWQpIHtcbiAgICAgICAgLy8gVGhlIGNhbGxlciBrZWVwcyB0aGUgcmVhbCBjYXVzZSwgYnV0IG9ic2VydmVycyBvZiB0aGlzIG5ldyB3cmFwcGVyIG11c3QgaW5oZXJpdCBpdHMgcmVtZW1iZXJlZCBtYXNrLlxuICAgICAgICB2aWV3LnJ1bGU/LnJldGFpblN0YWdlRXJyb3IodGhpcy5mYWlsdXJlLCB0aGlzLmZhaWx1cmUubWVzc2FnZSwgU0NPUEVfUExBQ0VIT0xERVIpO1xuICAgICAgICBpZiAodGhpcy5ydWxlICE9PSB2aWV3LnJ1bGUpIHRoaXMucnVsZT8ucmV0YWluU3RhZ2VFcnJvcih0aGlzLmZhaWx1cmUsIHRoaXMuZmFpbHVyZS5tZXNzYWdlLCBTQ09QRV9QTEFDRUhPTERFUik7XG4gICAgICB9XG4gICAgICB0aGlzLnN0b3BwZXIuYWJvcnQodGhpcy5mYWlsdXJlKTtcbiAgICB9XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHRlbGxBZGFwdGVyKHRoaXMucmVzb2x2ZWQuYWRhcHRlciwgeyBlbnRyeSwgZXJyb3I6IHZpZXcuZXJyb3IgfSk7XG4gIH1cbn1cblxuLyoqIFRoZSBhZGFwdGVyJ3Mgb3duIGBvbkZhaWx1cmVgLCBpc29sYXRlZDogYSB0aHJvd2luZyBnZXR0ZXIsIGEgdGhyb3cgb3IgYSByZWplY3Rpb24gdGhlcmUgY2hhbmdlcyBub3RoaW5nLiAqL1xuZnVuY3Rpb24gdGVsbEFkYXB0ZXIoYWRhcHRlcjogUmVjb3JkU2luaywgZmFpbHVyZTogeyByZWFkb25seSBlbnRyeTogUmVjb3JkRW50cnk7IHJlYWRvbmx5IGVycm9yOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBsaXN0ZW5lcjogdW5rbm93biA9IGFkYXB0ZXIub25GYWlsdXJlO1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHJldHVybjtcbiAgICBzZXR0bGVPbmNlKFxuICAgICAgbGlzdGVuZXIuY2FsbChhZGFwdGVyLCBmYWlsdXJlKSxcbiAgICAgICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICgpID0+IHVuZGVmaW5lZCxcbiAgICApO1xuICB9IGNhdGNoIHtcbiAgICAvLyBBIGxpc3RlbmVyIHRoYXQgZmFpbHMgaXMgdGhlIGFkYXB0ZXIncyBvd24gYnVzaW5lc3M6IHRoZSBsb3NzIGlzIGFscmVhZHkgY291bnRlZC5cbiAgfVxufVxuXG4vKipcbiAqIGB2YWx1ZWAsIHNldHRsZWQgT05DRSBpbnRvIGBvblZhbHVlYCAvIGBvbkVycm9yYCDigJQgbmV2ZXIgdGhyb3VnaCB0aGUgdmFsdWUncyBvd24gYHRoZW5gOiBhIG5hdGl2ZSBwcm9taXNlIGlzXG4gKiB3YXRjaGVkIHRocm91Z2ggdGhlIHJlYWwgYFByb21pc2UucHJvdG90eXBlLnRoZW5gIChhbiBvd24gYHRoZW5gIG9uIGl0IGlzIG5vdCB0cnVzdGVkLCBzbyBpdHMgcmVqZWN0aW9uIGlzIGFsd2F5c1xuICogaGFuZGxlZCksIGFueSBvdGhlciB0aGVuYWJsZSBhZG9wdGVkIGludG8gYSBmcmVzaCBwcm9taXNlLiBBIHBsYWluIHZhbHVlIGlzIGEgZnVsZmlsbWVudC5cbiAqL1xuZnVuY3Rpb24gc2V0dGxlT25jZTxUPih2YWx1ZTogdW5rbm93biwgb25WYWx1ZTogKCkgPT4gVCwgb25FcnJvcjogKGVycm9yOiB1bmtub3duKSA9PiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGFkb3B0ZWQ6IFByb21pc2U8dW5rbm93bj4gPSB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UgPyB2YWx1ZSA6IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXNvbHZlKHZhbHVlKSk7XG4gIHJldHVybiBQcm9taXNlLnByb3RvdHlwZS50aGVuLmNhbGwoYWRvcHRlZCwgb25WYWx1ZSwgb25FcnJvcikgYXMgUHJvbWlzZTxUPjtcbn1cbiJdfQ==
339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkU2luay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL3JlY29yZFNpbmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFJSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUF5QzNEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLEtBQUs7SUFFRjtJQURwQixJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDM0MsWUFBWSxPQUFlLEVBQVcsS0FBYztRQUNsRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFEcUIsVUFBSyxHQUFMLEtBQUssQ0FBUztJQUVwRCxDQUFDO0NBQ0Y7QUFVRCxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBVSxDQUFDO0FBZWhFLFNBQVMsU0FBUyxDQUFDLEtBQWM7SUFDL0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQVEsS0FBaUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQztBQUMzRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQWU7SUFDL0MsSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzNDLElB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Q0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM1RixDQUFDO0NBQ0Y7QUFFRCxnSEFBZ0g7QUFDaEgsU0FBUyxXQUFXLENBQUMsT0FBbUIsRUFBRSxPQUFpRTtJQUN6RyxJQUFJLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBWSxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQzVDLElBQUksT0FBTyxRQUFRLEtBQUssVUFBVTtZQUFFLE9BQU87UUFDM0MsVUFBVSxDQUNSLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUMvQixHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQ2YsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUNoQixDQUFDO0lBQ0osQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLG9GQUFvRjtJQUN0RixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFVBQVUsQ0FBSSxLQUFjLEVBQUUsT0FBZ0IsRUFBRSxPQUE4QjtJQUNyRixNQUFNLE9BQU8sR0FBcUIsS0FBSyxZQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDOUcsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQWUsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBydW5uZXIvcmVjb3JkU2luay50cyDigJQgdGhlIHJ1bidzIHNpZGUgb2YgdGhlIGNyYXNoLXNhZmUgcmVjb3JkIChkZXNpZ24gwqczLjUsIHBhY2tldCBQNikuXG4gKlxuICogZm9vdHRyYWNlIG93bnMgdGhlIHBvcnQgKGBSZWNvcmRTaW5rYCwgYGZvb3R0cmFjZS93cml0ZWApOiBhIGxvZyBidWlsdCB3aXRoIGEgc2luayBoYW5kcyBpdCBldmVyeSBlbnRyeSBBUyBJVFxuICogTEFORFMg4oCUIGBvcGVuZWRgLCBgY29tbWl0YCwgYG5vdGVgLCBgY2xvc2VkYCDigJQgYW5kIGNvdW50cyB3aGF0IHRoZSBzaW5rIGRpZCBub3QgdGFrZS4gVGhpcyBmaWxlIGlzIHdoYXQgdGhlXG4gKiBFWEVDVVRPUiBhZGRzIGFyb3VuZCBhbiBhcHAncyBhZGFwdGVyLCBvbmUge0BsaW5rIFJ1blJlY29yZH0gcGVyIHJ1bjpcbiAqXG4gKiAgIC0gVEhFIE9ORSBMQVcsIGJlZm9yZSBhbnkgYnl0ZSBsZWF2ZXM6IHRoZSBgb3BlbmVkYCBiYXNlIGlzIHRoZSBydW4ncyBzZXJ2ZWQgZm9ybSBvZiBpdCAodGhlIHJlZGFjdGlvbiBydWxlJ3NcbiAqICAgICBgcmV0YWluU3RhdGVgLCB0aGUgbWlycm9yJ3Mgc2VlZCDigJQgc28gYSBwb2xpY3kga2V5IHNlZWRlZCBieSBgaW5pdGlhbENvbnRleHRgIG9yIGEgY2hlY2twb2ludCBuZXZlciByZWFjaGVzXG4gKiAgICAgdGhlIHNpbmspLCBhbmQgdGhlIGBvcGVuZWRgIC8gYGNsb3NlZGAgbWV0YSBhcmUgYm91bmRhcnkgcmVjb3JkcyAoYHJldGFpbkJvdW5kYXJ5YCkuIEEgY29tbWl0IGlzIHRoZSBsb2cncyBvd25cbiAqICAgICBidW5kbGUsIGFscmVhZHkgc2NydWJiZWQgYXQgY29tbWl0OyBhbiBhdHRlbXB0IG5vdGUgY2FycmllcyB0aGUgc2VydmVkIGBBdHRlbXB0UmVjb3JkYCAobm8gYHJhd2ApLlxuICogICAtIEFDQ09VTlRJTkc6IGV2ZXJ5IGVudHJ5IGhhbmRlZCB0byB0aGUgYWRhcHRlciBpcyBjb3VudGVkLCBldmVyeSBsb3NzIHRvbyAoYGdldFNuYXBzaG90KCkuc2lua2ApLCB3aXRoIGFcbiAqICAgICBkZXYtbW9kZSB3YXJuaW5nIG9uIHRoZSBmaXJzdCBsb3NzIG9mIGEgcnVuLiBUaGUgYWRhcHRlcidzIG93biBgb25GYWlsdXJlYCBoZWFycyBhIGRpc3BhdGNoZWQgZW50cnkncyBsb3NzXG4gKiAgICAgd2l0aCB0aGF0IHNhbWUgc2VydmVkIGVudHJ5IGFuZCBhIHNlcnZlZCBlcnJvciwgaXNvbGF0ZWQuIEEgcmVmdXNhbCBiZWZvcmUgZGlzcGF0Y2ggaXMgY291bnRlZCB3aXRob3V0XG4gKiAgICAgZm9yd2FyZGluZyBGb290dHJhY2UncyB1bnNlcnZlZCBlbnRyeS5cbiAqICAgLSBUSEUgRkFJTFVSRSBNT0RFIChvd25lciBydWxpbmcgUTMpOiBgJ3JlcG9ydCdgIChkZWZhdWx0KSDigJQgdGhlIHJ1biBnb2VzIG9uOyBgJ2ZhaWwnYCDigJQgdGhlIGZpcnN0IGxvc3QgZW50cnlcbiAqICAgICBhYm9ydHMgdGhlIHJ1bidzIHNpZ25hbCB3aXRoIGEge0BsaW5rIFJlY29yZFNpbmtFcnJvcn0sIGFuZCBhIHJ1biB0aGF0IGZpbmlzaGVkIHdpdGggYSBsb3NzIHJlamVjdHMgd2l0aCBpdC5cbiAqICAgLSBGTFVTSDogYCdhdXRvJ2AgKGRlZmF1bHQpIOKAlCBgcnVuKClgIC8gYHJlc3VtZSgpYCBhd2FpdCB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCBhZnRlciB0aGUgY2xvc2luZyBlbnRyeTtcbiAqICAgICBgJ21hbnVhbCdgIOKAlCB0aGUgYXBwIGNhbGxzIGBleGVjdXRvci5mbHVzaFJlY29yZCgpYC5cbiAqXG4gKiBFdmVyeSBhZGFwdGVyIG1ldGhvZCBpcyBjYWxsZWQgc3luY2hyb25vdXNseSBmcm9tIHRoZSBsb2c7IHdoYXRldmVyIHRoZSBhZGFwdGVyIHRocm93cyBvciByZWplY3RzIHdpdGggaXMgdGhlXG4gKiBsb2cncyB0byBjb3VudCAoYEV2ZW50TG9nIMK3IHNpbmtGYWlsdXJlc2ApLCBuZXZlciB0aGUgcnVuJ3Mg4oCUIHNvIG5vdGhpbmcgaGVyZSB0aHJvd3MgdG8gdGhlIGVuZ2luZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1ldGEgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWNvcmRFbnRyeSwgUmVjb3JkU2luayB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IENhcHR1cmVIaXN0b3J5T3B0aW9ucywgQ2FwdHVyZUhpc3RvcnlTdGF0dXMgfSBmcm9tICcuLi9jYXB0dXJlL2hpc3RvcnlUeXBlcy5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8sIHRocm93blRleHQgfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHsgU0NPUEVfUExBQ0VIT0xERVIgfSBmcm9tICcuLi9tZW1vcnkvcmVkYWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkU2lua1N0YXRzIH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lLmpzJztcblxuLyoqIFdoYXQgYSBsb3N0IGVudHJ5IGRvZXMgdG8gdGhlIHJ1bjogYCdyZXBvcnQnYCBjb3VudHMgaXQgYW5kIGdvZXMgb247IGAnZmFpbCdgIGZhaWxzIHRoZSBydW4uICovXG5leHBvcnQgdHlwZSBSZWNvcmRTaW5rRmFpbHVyZU1vZGUgPSAncmVwb3J0JyB8ICdmYWlsJztcblxuLyoqIFdoZW4gdGhlIGFkYXB0ZXIncyBgZmx1c2goKWAgcnVuczogYWZ0ZXIgZWFjaCBydW4ncyBjbG9zaW5nIGVudHJ5IChgJ2F1dG8nYCksIG9yIHdoZW4gdGhlIGFwcCBhc2tzLiAqL1xuZXhwb3J0IHR5cGUgUmVjb3JkU2lua0ZsdXNoTW9kZSA9ICdhdXRvJyB8ICdtYW51YWwnO1xuXG4vKipcbiAqIFRoZSBleGVjdXRvcidzIGBzaW5rYCBvcHRpb24gaW4gaXRzIGxvbmcgZm9ybS4gVGhlIHNob3J0IGZvcm0gaXMgdGhlIGFkYXB0ZXIgaXRzZWxmLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2luazogeyBhZGFwdGVyOiBmaWxlU2luaygnL3Zhci9mb290cHJpbnQvcnVuLmpzb25sJyksIG9uRmFpbHVyZTogJ2ZhaWwnIH0gfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRTaW5rT3B0aW9ucyB7XG4gIC8qKiBXaGVyZSB0aGUgZW50cmllcyBnbyDigJQgYGZpbGVTaW5rKHBhdGgpYCAoYGZvb3RwcmludGpzL3NpbmtzYCksIGBtZW1vcnlTaW5rKClgIChgZm9vdHRyYWNlL3dyaXRlYCksIG9yIHlvdXJzLiAqL1xuICByZWFkb25seSBhZGFwdGVyOiBSZWNvcmRTaW5rO1xuICAvKiogYCdyZXBvcnQnYCAoZGVmYXVsdCk6IGEgbG9zdCBlbnRyeSBpcyBjb3VudGVkIGFuZCB0aGUgcnVuIGdvZXMgb24uIGAnZmFpbCdgOiB0aGUgZmlyc3Qgb25lIGZhaWxzIHRoZSBydW4uICovXG4gIHJlYWRvbmx5IG9uRmFpbHVyZT86IFJlY29yZFNpbmtGYWlsdXJlTW9kZTtcbiAgLyoqIGAnYXV0bydgIChkZWZhdWx0KTogYHJ1bigpYCBhd2FpdHMgdGhlIGFkYXB0ZXIncyBgZmx1c2goKWAgYWZ0ZXIgdGhlIGNsb3NpbmcgZW50cnkuIGAnbWFudWFsJ2A6IGBmbHVzaFJlY29yZCgpYC4gKi9cbiAgcmVhZG9ubHkgZmx1c2g/OiBSZWNvcmRTaW5rRmx1c2hNb2RlO1xuICAvKiogT3B0LWluIGNhcHR1cmUgZXZpZGVuY2UgYW5kIGV4cGxpY2l0IGhvc3QgYWNrbm93bGVkZ2VtZW50OyBvcmRpbmFyeSBmbHVzaCBuZXZlciBpbXBsaWVzIGR1cmFiaWxpdHkuICovXG4gIHJlYWRvbmx5IGNhcHR1cmU/OiBDYXB0dXJlSGlzdG9yeU9wdGlvbnM7XG59XG5cbi8qKiBUaGUgZXhlY3V0b3IncyBgc2lua2Agb3B0aW9uOiBhbiBhZGFwdGVyLCBvciB7QGxpbmsgUmVjb3JkU2lua09wdGlvbnN9LiAqL1xuZXhwb3J0IHR5cGUgUmVjb3JkU2lua09wdGlvbiA9IFJlY29yZFNpbmsgfCBSZWNvcmRTaW5rT3B0aW9ucztcblxuLyoqIFdoYXQgYGV4ZWN1dG9yLmZsdXNoUmVjb3JkKClgIHJlc29sdmVzIHdpdGgg4oCUIHRoZSBgZHJhaW5PYnNlcnZlcnNgIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRGbHVzaFJlc3VsdCB7XG4gIC8qKiBUaGUgYWRhcHRlcidzIGZsdXNoIGZpbmlzaGVkIChvciB0aGVyZSB3YXMgbm90aGluZyB0byBmbHVzaCkuICovXG4gIHJlYWRvbmx5IGRvbmU6IGJvb2xlYW47XG4gIC8qKiBUaGUgYWRhcHRlcidzIGZsdXNoIHRocmV3IG9yIHJlamVjdGVkIOKAlCBjb3VudGVkIG9uIGBnZXRTbmFwc2hvdCgpLnNpbmtgLiAqL1xuICByZWFkb25seSBmYWlsZWQ6IGJvb2xlYW47XG4gIC8qKiBUaGUgZmx1c2ggaGFkIG5vdCBzZXR0bGVkIHdoZW4gYHRpbWVvdXRNc2AgcmFuIG91dC4gKi9cbiAgcmVhZG9ubHkgcGVuZGluZzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIHJ1biB3aXRoIGBzaW5rOiB7IG9uRmFpbHVyZTogJ2ZhaWwnIH1gIGxvc3QgYW4gZW50cnk6IHRoZSByZWNvcmQgdGhlIGFwcCBhc2tlZCB0byBiZSBrZXB0IGlzIG5vdCB3aG9sZS5cbiAqIGBjYXVzZWAgaXMgdGhlIGFkYXB0ZXIncyBvd24gZXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWNvcmRTaW5rRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IG5hbWUgPSAnUmVjb3JkU2lua0Vycm9yJztcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCByZWFkb25seSBjYXVzZTogdW5rbm93bikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKiBUaGUgb3B0aW9uIHJlc29sdmVkIG9uY2UsIGF0IGNvbnN0cnVjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRSZWNvcmRTaW5rIHtcbiAgcmVhZG9ubHkgYWRhcHRlcjogUmVjb3JkU2luaztcbiAgcmVhZG9ubHkgb25GYWlsdXJlOiBSZWNvcmRTaW5rRmFpbHVyZU1vZGU7XG4gIHJlYWRvbmx5IGZsdXNoOiBSZWNvcmRTaW5rRmx1c2hNb2RlO1xuICByZWFkb25seSBjYXB0dXJlPzogQ2FwdHVyZUhpc3RvcnlPcHRpb25zO1xufVxuXG5jb25zdCBNRVRIT0RTID0gWydvcGVuZWQnLCAnY29tbWl0JywgJ25vdGUnLCAnY2xvc2VkJ10gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBTaW5rRXJyb3JWaWV3IHtcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xuICByZWFkb25seSBlcnJvcjogdW5rbm93bjtcbiAgcmVhZG9ubHkgbWFza2VkOiBib29sZWFuO1xuICByZWFkb25seSBydWxlPzogUmVkYWN0aW9uUnVsZTtcbn1cblxuaW50ZXJmYWNlIEludm9jYXRpb25GYWlsdXJlIHtcbiAgcmVhZG9ubHkgZW50cnk6IFJlY29yZEVudHJ5O1xuICByZWFkb25seSBjYXVzZTogdW5rbm93bjtcbiAgcmVhZG9ubHkgdmlldzogU2lua0Vycm9yVmlldztcbn1cblxuZnVuY3Rpb24gaXNBZGFwdGVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkU2luayB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBNRVRIT0RTLmV2ZXJ5KChtKSA9PiB0eXBlb2YgKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVttXSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZXhlY3V0b3IncyBgc2lua2Agb3B0aW9uLCBvciByZWZ1c2UgaXQgd2l0aCBhIGBUeXBlRXJyb3JgIG5hbWluZyB3aGF0IGlzIHdyb25nIOKAlCBhIHdpcmluZyBtaXN0YWtlXG4gKiB0aGUgYXBwIG1ha2VzIG9uY2UsIHNvIGl0IGZhaWxzIGF0IGNvbnN0cnVjdGlvbiwgbmV2ZXIgbWlkLXJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWNvcmRTaW5rKG9wdGlvbjogdW5rbm93bik6IFJlc29sdmVkUmVjb3JkU2luayB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGlzQWRhcHRlcihvcHRpb24pKSByZXR1cm4geyBhZGFwdGVyOiBvcHRpb24sIG9uRmFpbHVyZTogJ3JlcG9ydCcsIGZsdXNoOiAnYXV0bycgfTtcbiAgaWYgKG9wdGlvbiAhPT0gbnVsbCAmJiB0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0JyAmJiBPYmplY3QuaGFzT3duKG9wdGlvbiwgJ2FkYXB0ZXInKSkge1xuICAgIGNvbnN0IHsgYWRhcHRlciwgb25GYWlsdXJlID0gJ3JlcG9ydCcsIGZsdXNoID0gJ2F1dG8nLCBjYXB0dXJlIH0gPSBvcHRpb24gYXMgUGFydGlhbDxSZWNvcmRTaW5rT3B0aW9ucz47XG4gICAgaWYgKCFpc0FkYXB0ZXIoYWRhcHRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Zsb3dDaGFydEV4ZWN1dG9yOiBzaW5rLmFkYXB0ZXIgbXVzdCBiZSBhIFJlY29yZFNpbmsgKG9wZW5lZCwgY29tbWl0LCBub3RlLCBjbG9zZWQpJyk7XG4gICAgfVxuICAgIGlmIChvbkZhaWx1cmUgIT09ICdyZXBvcnQnICYmIG9uRmFpbHVyZSAhPT0gJ2ZhaWwnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmxvd0NoYXJ0RXhlY3V0b3I6IHNpbmsub25GYWlsdXJlIG11c3QgYmUgJ3JlcG9ydCcgb3IgJ2ZhaWwnXCIpO1xuICAgIH1cbiAgICBpZiAoZmx1c2ggIT09ICdhdXRvJyAmJiBmbHVzaCAhPT0gJ21hbnVhbCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGbG93Q2hhcnRFeGVjdXRvcjogc2luay5mbHVzaCBtdXN0IGJlICdhdXRvJyBvciAnbWFudWFsJ1wiKTtcbiAgICB9XG4gICAgaWYgKGNhcHR1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFjYXB0dXJlIHx8IHR5cGVvZiBjYXB0dXJlLmFja25vd2xlZGdlICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaW5rLmNhcHR1cmUgcmVxdWlyZXMgYWNrbm93bGVkZ2UnKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgbWF4XSBvZiBbXG4gICAgICAgIFsnbWF4Qnl0ZXMnLCA4ICogMTAyNCAqIDEwMjRdLFxuICAgICAgICBbJ3RpbWVvdXRNcycsIDMwXzAwMF0sXG4gICAgICBdIGFzIGNvbnN0KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY2FwdHVyZVtrZXldO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8IDEgfHwgdmFsdWUgPiBtYXgpKVxuICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBzaW5rLmNhcHR1cmUuJHtrZXl9IG11c3QgYmUgYSBwb3NpdGl2ZSB3aG9sZSBudW1iZXIgYXQgbW9zdCAke21heH1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZml4ZWRDYXB0dXJlID1cbiAgICAgIGNhcHR1cmUgJiZcbiAgICAgIE9iamVjdC5mcmVlemUoe1xuICAgICAgICBhY2tub3dsZWRnZTogY2FwdHVyZS5hY2tub3dsZWRnZS5iaW5kKGNhcHR1cmUpLFxuICAgICAgICAuLi4oY2FwdHVyZS5tYXhCeXRlcyAhPT0gdW5kZWZpbmVkICYmIHsgbWF4Qnl0ZXM6IGNhcHR1cmUubWF4Qnl0ZXMgfSksXG4gICAgICAgIC4uLihjYXB0dXJlLnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dE1zOiBjYXB0dXJlLnRpbWVvdXRNcyB9KSxcbiAgICAgIH0pO1xuICAgIHJldHVybiB7IGFkYXB0ZXIsIG9uRmFpbHVyZSwgZmx1c2gsIC4uLihmaXhlZENhcHR1cmUgJiYgeyBjYXB0dXJlOiBmaXhlZENhcHR1cmUgfSkgfTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICdGbG93Q2hhcnRFeGVjdXRvcjogc2luayBtdXN0IGJlIGEgUmVjb3JkU2luayAob3BlbmVkLCBjb21taXQsIG5vdGUsIGNsb3NlZCkgb3IgeyBhZGFwdGVyLCBvbkZhaWx1cmU/LCBmbHVzaD8gfScsXG4gICk7XG59XG5cbi8qKlxuICogT25lIHJ1bidzIHJlY29yZCBzaW5rOiB0aGUgc2luayBldmVyeSBsb2cgb2YgdGhlIHJ1biB3cml0ZXMgdG8gKHJvb3QgYW5kIG1vdW50cyksIGl0cyBhY2NvdW50aW5nIGFuZCBpdHNcbiAqIGZhaWx1cmUgbW9kZS4gQSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSBrZWVwcyBpdCAodGhlIHJvb3QgbG9nIGdvZXMgb24pOyBhIGZyZXNoIHJ1biBtYWtlcyBhIG5ldyBvbmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW5SZWNvcmQge1xuICAvKiogSGFuZCB0aGlzIHRvIGV2ZXJ5IGBFdmVudExvZ2Agb2YgdGhlIHJ1bi4gKi9cbiAgcmVhZG9ubHkgc2luazogUmVjb3JkU2luaztcbiAgcHJpdmF0ZSBlbnRyaWVzID0gMDtcbiAgcHJpdmF0ZSBmYWlsZWQgPSAwO1xuICBwcml2YXRlIGxhc3RFcnJvcj86IHN0cmluZztcbiAgcHJpdmF0ZSB3YXJuZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBydWxlPzogUmVkYWN0aW9uUnVsZTtcbiAgLyoqIEFib3J0ZWQgYXQgdGhlIGZpcnN0IGxvc3MgdW5kZXIgYCdmYWlsJ2Ag4oCUIGNvbXBvc2VkIGludG8gdGhlIGxlZydzIHNpZ25hbDsgZnJlc2ggcGVyIGxlZyAoe0BsaW5rIGJlZ2luTGVnfSkuICovXG4gIHByaXZhdGUgc3RvcHBlcj86IEFib3J0Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSBmYWlsdXJlPzogUmVjb3JkU2lua0Vycm9yO1xuICBwcml2YXRlIGNhcHR1cmVQZW5kaW5nID0gMDtcbiAgcHJpdmF0ZSBjYXB0dXJlU3RhdHVzPzogQ2FwdHVyZUhpc3RvcnlTdGF0dXM7XG4gIC8qKiBPcGFxdWUgZXJyb3IgaWRlbnRpdGllcyBvbmx5OiBubyByYXcgZW50cnkgb3IgYWRhcHRlciBlcnJvciBpcyBlbnVtZXJhYmxlIG9uIHRoZSB0cmFuc3BvcnQgZXJyb3IuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW52b2NhdGlvbkZhaWx1cmVzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBJbnZvY2F0aW9uRmFpbHVyZT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkOiBSZXNvbHZlZFJlY29yZFNpbmspIHtcbiAgICBpZiAocmVzb2x2ZWQub25GYWlsdXJlID09PSAnZmFpbCcpIHRoaXMuc3RvcHBlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBhZGFwdGVyID0gcmVzb2x2ZWQuYWRhcHRlcjtcbiAgICBjb25zdCBoYW5kZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLmVudHJpZXMgKz0gMTtcbiAgICB9O1xuICAgIHRoaXMuc2luayA9IHtcbiAgICAgIG9wZW5lZDogKGVudHJ5KSA9PiB7XG4gICAgICAgIGhhbmRlZCgpO1xuICAgICAgICBjb25zdCBydWxlID0gdGhpcy5ydWxlO1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPSB7XG4gICAgICAgICAgLi4uZW50cnksXG4gICAgICAgICAgaW5pdGlhbFN0YXRlOiBydWxlID8gcnVsZS5yZXRhaW5TdGF0ZShlbnRyeS5pbml0aWFsU3RhdGUsIExPR19QTEFDRUhPTERFUikgOiBlbnRyeS5pbml0aWFsU3RhdGUsXG4gICAgICAgICAgLi4uKGVudHJ5Lm1ldGEgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBtZXRhOiB0aGlzLnNlcnZlKGVudHJ5Lm1ldGEpIH0pLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2UoeyAuLi5zZXJ2ZWQsIGtpbmQ6ICdvcGVuZWQnIH0sICgpID0+IGFkYXB0ZXIub3BlbmVkKHNlcnZlZCksIHJ1bGUpO1xuICAgICAgfSxcbiAgICAgIGNvbW1pdDogKGVudHJ5KSA9PiB7XG4gICAgICAgIGhhbmRlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2UoeyAuLi5lbnRyeSwga2luZDogJ2NvbW1pdCcgfSwgKCkgPT4gYWRhcHRlci5jb21taXQoZW50cnkpLCB0aGlzLnJ1bGUpO1xuICAgICAgfSxcbiAgICAgIG5vdGU6IChlbnRyeSkgPT4ge1xuICAgICAgICBoYW5kZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW52b2tlKFxuICAgICAgICAgIHsgYWRkcmVzczogZW50cnkuYWRkcmVzcywgYXQ6IGVudHJ5LmF0LCBraW5kOiAnbm90ZScsIG5vdGU6IGVudHJ5LmtpbmQsIGRhdGE6IGVudHJ5LmRhdGEgfSxcbiAgICAgICAgICAoKSA9PiBhZGFwdGVyLm5vdGUoZW50cnkpLFxuICAgICAgICAgIHRoaXMucnVsZSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBjbG9zZWQ6IChlbnRyeSkgPT4ge1xuICAgICAgICBoYW5kZWQoKTtcbiAgICAgICAgY29uc3Qgc2VydmVkID0geyAuLi5lbnRyeSwgLi4uKGVudHJ5Lm1ldGEgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBtZXRhOiB0aGlzLnNlcnZlKGVudHJ5Lm1ldGEpIH0pIH07XG4gICAgICAgIHJldHVybiB0aGlzLmludm9rZSh7IC4uLnNlcnZlZCwga2luZDogJ2Nsb3NlZCcgfSwgKCkgPT4gYWRhcHRlci5jbG9zZWQoc2VydmVkKSwgdGhpcy5ydWxlKTtcbiAgICAgIH0sXG4gICAgICBvbkZhaWx1cmU6IChmYWlsdXJlKSA9PiB7XG4gICAgICAgIGNvbnN0IGludm9jYXRpb24gPVxuICAgICAgICAgIGZhaWx1cmUuZXJyb3IgIT09IG51bGwgJiYgKHR5cGVvZiBmYWlsdXJlLmVycm9yID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgZmFpbHVyZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgID8gdGhpcy5pbnZvY2F0aW9uRmFpbHVyZXMuZ2V0KGZhaWx1cmUuZXJyb3IpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gQmVmb3JlIGFkbWlzc2lvbiAoZS5nLiBhIG1ldGEtY29weSByZWZ1c2FsKSwgbm8gZGlzcGF0Y2hlZCBzZXJ2ZWQgZW50cnkgZXhpc3RzLiBDb3VudCB0aGUgbG9zcyBhbmRcbiAgICAgICAgLy8gYXBwbHkgdGhlIGZhaWx1cmUgbW9kZSwgYnV0IG5ldmVyIGhhbmQgdGhlIGFkYXB0ZXIgRm9vdHRyYWNlJ3Mgb3JpZ2luYWwsIHVuc2VydmVkIGVudHJ5LlxuICAgICAgICBpZiAoaW52b2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLmxvc3QoZmFpbHVyZS5lcnJvciwgdW5kZWZpbmVkLCB0aGlzLmVycm9yVmlldyhmYWlsdXJlLmVycm9yLCB0aGlzLnJ1bGUpKTtcbiAgICAgICAgZWxzZSB0aGlzLmxvc3QoaW52b2NhdGlvbi5jYXVzZSwgaW52b2NhdGlvbi5lbnRyeSwgaW52b2NhdGlvbi52aWV3KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDYXB0dXJlIHRoZSBzZXJ2ZWQgZW50cnkgbm93OyBhbiBhc3luY2hyb25vdXMgZmFpbHVyZSBrZWVwcyB0aGlzIGxlZydzIHJ1bGUsIG5vdCBhIGxhdGVyIHJlc3VtZSdzIHJ1bGUuICovXG4gIHByaXZhdGUgaW52b2tlKGVudHJ5OiBSZWNvcmRFbnRyeSwgY2FsbDogKCkgPT4gdW5rbm93biwgcnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICAgIGNvbnN0IGZhaWxlZCA9IChjYXVzZTogdW5rbm93bik6IG5ldmVyID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gbmV3IEVycm9yKCdyZWNvcmQgc2luazogYWRhcHRlciBpbnZvY2F0aW9uIGZhaWxlZCcpO1xuICAgICAgdGhpcy5pbnZvY2F0aW9uRmFpbHVyZXMuc2V0KGVudmVsb3BlLCB7IGVudHJ5LCBjYXVzZSwgdmlldzogdGhpcy5lcnJvclZpZXcoY2F1c2UsIHJ1bGUpIH0pO1xuICAgICAgdGhyb3cgZW52ZWxvcGU7XG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0dXJuZWQgPSBjYWxsKCk7XG4gICAgICAvLyBWb2lkIGFkYXB0ZXJzIGtlZXAgdGhlaXIgc3luY2hyb25vdXMgcGF0aDsgb25seSBhbiBvYmplY3QvZnVuY3Rpb24gY2FuIGJlIGEgdGhlbmFibGUuIHNldHRsZU9uY2VcbiAgICAgIC8vIG9ic2VydmVzIG5hdGl2ZSBwcm9taXNlcyB0aHJvdWdoIFByb21pc2UucHJvdG90eXBlLnRoZW4gYW5kIGd1YXJkcyBob3N0aWxlIHRoZW5hYmxlcyB0b28uXG4gICAgICBpZiAocmV0dXJuZWQgPT09IG51bGwgfHwgKHR5cGVvZiByZXR1cm5lZCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHJldHVybmVkICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIHJldHVybmVkO1xuICAgICAgaWYgKCF0aGlzLnJlc29sdmVkLmNhcHR1cmUpIHJldHVybiBzZXR0bGVPbmNlKHJldHVybmVkLCAoKSA9PiB1bmRlZmluZWQsIGZhaWxlZCk7XG4gICAgICB0aGlzLmNhcHR1cmVQZW5kaW5nKys7XG4gICAgICByZXR1cm4gc2V0dGxlT25jZShcbiAgICAgICAgcmV0dXJuZWQsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhcHR1cmVQZW5kaW5nLS07XG4gICAgICAgIH0sXG4gICAgICAgIChjYXVzZSkgPT4ge1xuICAgICAgICAgIHRoaXMuY2FwdHVyZVBlbmRpbmctLTtcbiAgICAgICAgICByZXR1cm4gZmFpbGVkKGNhdXNlKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHJldHVybiBmYWlsZWQoY2F1c2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBIHNpbmsgZXJyb3IgaXMgdGhlIGRpYWdub3N0aWMgZXJyb3JzLnJlY29yZFNpbmtFcnJvcjsgcmF3IGNhdXNlcyBiZWxvbmcgb25seSB0byB0aGUgY2FsbGVyJ3MgZXhjZXB0aW9uLiAqL1xuICBwcml2YXRlIGVycm9yVmlldyhlcnJvcjogdW5rbm93biwgcnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCk6IFNpbmtFcnJvclZpZXcge1xuICAgIGNvbnN0IHRleHQgPSB0aHJvd25UZXh0KGVycm9yKTtcbiAgICBjb25zdCByZXRhaW5lZCA9IHJ1bGVcbiAgICAgID8gcnVsZS5yZXRhaW5TdGFnZUVycm9yKGVycm9yLCB0ZXh0LCBydWxlLnJldGFpbkRpYWdub3N0aWMoWydlcnJvcnMnLCAncmVjb3JkU2lua0Vycm9yJ10sIHRleHQpKVxuICAgICAgOiB7IG1lc3NhZ2U6IHRleHQsIHN0cnVjdHVyZWRFcnJvcjogZXh0cmFjdEVycm9ySW5mbyhlcnJvcikgfTtcbiAgICBjb25zdCBzZXJ2ZWQgPSB7IC4uLnJldGFpbmVkLnN0cnVjdHVyZWRFcnJvciB9O1xuICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VydmVkLCAncmF3Jyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IHJldGFpbmVkLm1lc3NhZ2UsXG4gICAgICBlcnJvcjogc2VydmVkLFxuICAgICAgbWFza2VkOiByZXRhaW5lZC5tZXNzYWdlICE9PSB0ZXh0IHx8IHJldGFpbmVkLnN0cnVjdHVyZWRFcnJvci5yYXcgIT09IGVycm9yLFxuICAgICAgcnVsZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2FtZS1leGVjdXRvciByZXN1bWUgc3RhcnRzIGEgbmV3IGxlZyBvbiB0aGUgc2FtZSByZWNvcmQ6IHRoZSBjb3VudHMgZ28gb24gKG9uZSBsb2csIG9uZSByZWNvcmQpLCBidXQgdGhlXG4gICAqIGZhaWx1cmUgbW9kZSBpcyB0aGUgTEVHJ3Mg4oCUIGEgbG9zcyBpbiBhbiBlYXJsaWVyIGxlZyAod2hpY2ggYWxyZWFkeSBmYWlsZWQgdGhhdCBsZWcpIGRvZXMgbm90IHN0b3AgdGhpcyBvbmUg4oCUXG4gICAqIGFuZCB0aGUgZGV2LW1vZGUgd2FybmluZyBtYXkgZmlyZSBhZ2Fpbi5cbiAgICovXG4gIGJlZ2luTGVnKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc29sdmVkLm9uRmFpbHVyZSA9PT0gJ2ZhaWwnKSB0aGlzLnN0b3BwZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGhpcy5mYWlsdXJlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMud2FybmVkID0gZmFsc2U7XG4gICAgdGhpcy5jYXB0dXJlU3RhdHVzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRoZSBsZWcncyByZWRhY3Rpb24gcnVsZSDigJQgYSByZXN1bWUgYnVpbGRzIGEgbmV3IG9uZTsgdGhlIG5leHQgYG9wZW5lZGAgLyBgY2xvc2VkYCBpcyBzZXJ2ZWQgdW5kZXIgaXQuICovXG4gIHVzZVJ1bGUocnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMucnVsZSA9IHJ1bGU7XG4gIH1cblxuICAvKiogQWJvcnRzIGF0IHRoZSBmaXJzdCBsb3NzIHVuZGVyIGBvbkZhaWx1cmU6ICdmYWlsJ2A7IGFic2VudCBvdGhlcndpc2UuICovXG4gIGdldCBzdG9wU2lnbmFsKCk6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdG9wcGVyPy5zaWduYWw7XG4gIH1cblxuICBnZXQgZmx1c2hNb2RlKCk6IFJlY29yZFNpbmtGbHVzaE1vZGUge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkLmZsdXNoO1xuICB9XG5cbiAgLyoqIFRoZSBsb3NzIHRoYXQgZmFpbHMgdGhlIHJ1biB1bmRlciBgJ2ZhaWwnYDsgYWJzZW50IHdoaWxlIG5vdGhpbmcgd2FzIGxvc3QgKGFuZCBhbHdheXMgdW5kZXIgYCdyZXBvcnQnYCkuICovXG4gIGdldCBmYXRhbCgpOiBSZWNvcmRTaW5rRXJyb3IgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZhaWx1cmU7XG4gIH1cblxuICBzdGF0cygpOiBSZWNvcmRTaW5rU3RhdHMge1xuICAgIHJldHVybiB7XG4gICAgICBlbnRyaWVzOiB0aGlzLmVudHJpZXMsXG4gICAgICBmYWlsZWQ6IHRoaXMuZmFpbGVkLFxuICAgICAgLi4uKHRoaXMubGFzdEVycm9yID09PSB1bmRlZmluZWQgPyB7fSA6IHsgbGFzdEVycm9yOiB0aGlzLmxhc3RFcnJvciB9KSxcbiAgICAgIC4uLih0aGlzLmNhcHR1cmVTdGF0dXMgJiYgeyBjYXB0dXJlOiB0aGlzLmNhcHR1cmVTdGF0dXMgfSksXG4gICAgfTtcbiAgfVxuXG4gIGdldCBjYXB0dXJlT3B0aW9ucygpOiBDYXB0dXJlSGlzdG9yeU9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkLmNhcHR1cmU7XG4gIH1cblxuICBnZXQgcGVuZGluZ0NhcHR1cmVEZWxpdmVyaWVzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2FwdHVyZVBlbmRpbmc7XG4gIH1cblxuICBjYXB0dXJlUmVzdWx0KHJlc3VsdDogQ2FwdHVyZUhpc3RvcnlTdGF0dXMpOiB2b2lkIHtcbiAgICB0aGlzLmNhcHR1cmVTdGF0dXMgPSBPYmplY3QuZnJlZXplKHJlc3VsdCk7XG4gIH1cblxuICAvKiogU2FtZSBzZXJ2ZWQgc2VlZCBhcyBvcGVuZWQ7IGEgaGlzdG9yeSBkaWdlc3QgbmV2ZXIgc2VlcyBhIHNlZWRlZCBwb2xpY3kgc2VjcmV0LiAqL1xuICBjYXB0dXJlSW5pdGlhbFN0YXRlKHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5ydWxlID8gKHRoaXMucnVsZS5yZXRhaW5TdGF0ZShzdGF0ZSwgTE9HX1BMQUNFSE9MREVSKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdCB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCwgYXQgbW9zdCBgdGltZW91dE1zYCB3aGVuIGdpdmVuLiBBIGZsdXNoIHRoYXQgdGhyb3dzIG9yIHJlamVjdHMgaXMgYSBsb3NzXG4gICAqIChjb3VudGVkLCBhbmQgZmF0YWwgdW5kZXIgYCdmYWlsJ2ApOyBvbmUgc3RpbGwgcnVubmluZyBhdCB0aGUgZGVhZGxpbmUgaXMgYHBlbmRpbmdgIGFuZCBrZWVwcyBydW5uaW5nIOKAlCBhbmQsXG4gICAqIHdpdGggYHBlbmRpbmdJc0xvc3NgICh0aGUgcnVuJ3Mgb3duIGZsdXNoKSwgY291bnRlZCBhcyBhIGxvc3MgdG9vLCBzbyBhIGZsdXNoIHRoYXQgbmV2ZXIgc2V0dGxlcyBjYW5ub3QgaG9sZCBhXG4gICAqIHJ1biBvcGVuLCBhbmQgY2Fubm90IHBhc3MgZm9yIG9uZSB0aGF0IGxhbmRlZC4gTm90aGluZyBoZXJlIHRocm93czogYSBob3N0aWxlIGFkYXB0ZXIgKGEgdGhyb3dpbmcgYGZsdXNoYFxuICAgKiBnZXR0ZXIsIGEgcHJvbWlzZSB3aXRoIGl0cyBvd24gYHRoZW5gKSBpcyBhIGxvc3MsIG5ldmVyIHRoZSBydW4ncyBlcnJvci5cbiAgICovXG4gIGFzeW5jIGZsdXNoKHRpbWVvdXRNcz86IG51bWJlciwgcGVuZGluZ0lzTG9zcyA9IGZhbHNlKTogUHJvbWlzZTxSZWNvcmRGbHVzaFJlc3VsdD4ge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLnJlc29sdmVkLmFkYXB0ZXI7XG4gICAgY29uc3QgcnVsZSA9IHRoaXMucnVsZTtcbiAgICBsZXQgc2V0dGxlZDogUHJvbWlzZTxSZWNvcmRGbHVzaFJlc3VsdD47XG4gICAgbGV0IGdpdmVuVXAgPSBmYWxzZTsgLy8gYSBmbHVzaCBhbHJlYWR5IGNvdW50ZWQgYXMgYSBsb3NzIGF0IHRoZSBkZWFkbGluZSBpcyBub3QgY291bnRlZCBhZ2FpbiB3aGVuIGl0IHJlamVjdHNcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmx1c2g6IHVua25vd24gPSBhZGFwdGVyLmZsdXNoOyAvLyByZWFkIG9uY2U6IGEgZ2V0dGVyIHJ1bnMgb25jZSwgaW5zaWRlIHRoZSBndWFyZFxuICAgICAgaWYgKHR5cGVvZiBmbHVzaCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgZmFpbGVkOiBmYWxzZSwgcGVuZGluZzogZmFsc2UgfTtcbiAgICAgIHNldHRsZWQgPSBzZXR0bGVPbmNlKFxuICAgICAgICBmbHVzaC5jYWxsKGFkYXB0ZXIpLFxuICAgICAgICAoKTogUmVjb3JkRmx1c2hSZXN1bHQgPT4gKHsgZG9uZTogdHJ1ZSwgZmFpbGVkOiBmYWxzZSwgcGVuZGluZzogZmFsc2UgfSksXG4gICAgICAgIChlcnJvcik6IFJlY29yZEZsdXNoUmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAoIWdpdmVuVXApIHRoaXMubG9zdChlcnJvciwgdW5kZWZpbmVkLCB0aGlzLmVycm9yVmlldyhlcnJvciwgcnVsZSkpO1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCBmYWlsZWQ6IHRydWUsIHBlbmRpbmc6IGZhbHNlIH07XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvc3QoZXJyb3IsIHVuZGVmaW5lZCwgdGhpcy5lcnJvclZpZXcoZXJyb3IsIHJ1bGUpKTtcbiAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCBmYWlsZWQ6IHRydWUsIHBlbmRpbmc6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh0aW1lb3V0TXMgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRNcykpIHJldHVybiBzZXR0bGVkO1xuICAgIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGVuZGluZyA9IG5ldyBQcm9taXNlPFJlY29yZEZsdXNoUmVzdWx0PigocmVzb2x2ZSkgPT4ge1xuICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoeyBkb25lOiBmYWxzZSwgZmFpbGVkOiBmYWxzZSwgcGVuZGluZzogdHJ1ZSB9KSwgTWF0aC5tYXgoMCwgdGltZW91dE1zKSk7XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbc2V0dGxlZCwgcGVuZGluZ10pO1xuICAgICAgaWYgKHJlc3VsdC5wZW5kaW5nICYmIHBlbmRpbmdJc0xvc3MpIHtcbiAgICAgICAgZ2l2ZW5VcCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGByZWNvcmQgc2luazogZmx1c2goKSBkaWQgbm90IHNldHRsZSB3aXRoaW4gJHtNYXRoLm1heCgwLCB0aW1lb3V0TXMpfW1zYCk7XG4gICAgICAgIHRoaXMubG9zdChlcnJvciwgdW5kZWZpbmVkLCB0aGlzLmVycm9yVmlldyhlcnJvciwgcnVsZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIG1ldGEgYXMgc2VydmVkOiBhIGJvdW5kYXJ5IHJlY29yZCwgc2NydWJiZWQgYnkga2V5IG5hbWUgYXQgZXZlcnkgZGVwdGggKGFuIGluZXJ0IHJ1bGUgY29waWVzIG5vdGhpbmcpLiAqL1xuICBzZXJ2ZShtZXRhOiBNZXRhKTogTWV0YSB7XG4gICAgcmV0dXJuIHRoaXMucnVsZSA/IHRoaXMucnVsZS5yZXRhaW5Cb3VuZGFyeShtZXRhLCBMT0dfUExBQ0VIT0xERVIpIDogbWV0YTtcbiAgfVxuXG4gIC8qKiBPbmUgbG9zczogY291bnRlZCwgd2FybmVkIG9uY2UgcGVyIHJ1biwgdG9sZCB3aXRoIGEgc2FmZSBkaXNwYXRjaGVkIGVudHJ5IHdoZW4gYXZhaWxhYmxlLCBmYXRhbCB1bmRlciAnZmFpbCcuICovXG4gIHByaXZhdGUgbG9zdChlcnJvcjogdW5rbm93biwgZW50cnk6IFJlY29yZEVudHJ5IHwgdW5kZWZpbmVkLCB2aWV3OiBTaW5rRXJyb3JWaWV3KTogdm9pZCB7XG4gICAgdGhpcy5mYWlsZWQgKz0gMTtcbiAgICBjb25zdCB0ZXh0ID0gdmlldy50ZXh0O1xuICAgIHRoaXMubGFzdEVycm9yID0gdGV4dDtcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgIXRoaXMud2FybmVkKSB7XG4gICAgICB0aGlzLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gcmVjb3JkIHNpbms6IGFuIGVudHJ5IHdhcyBub3Qgc3RvcmVkICgke3RleHR9KS4gVGhlIHJ1biBnb2VzIG9uOyBgICtcbiAgICAgICAgICAnZ2V0U25hcHNob3QoKS5zaW5rIGNvdW50cyBldmVyeSBsb3NzLicsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBUaGUgZmFpbHVyZSBtb2RlIGZpcnN0OiBub3RoaW5nIHRoZSBhZGFwdGVyJ3Mgb3duIGxpc3RlbmVyIGRvZXMgY2FuIHNraXAgaXQuXG4gICAgaWYgKHRoaXMuc3RvcHBlciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZmFpbHVyZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZhaWx1cmUgPSBuZXcgUmVjb3JkU2lua0Vycm9yKGByZWNvcmQgc2luazogYW4gZW50cnkgd2FzIG5vdCBzdG9yZWQg4oCUICR7dGV4dH1gLCBlcnJvcik7XG4gICAgICBpZiAodmlldy5tYXNrZWQpIHtcbiAgICAgICAgLy8gVGhlIGNhbGxlciBrZWVwcyB0aGUgcmVhbCBjYXVzZSwgYnV0IG9ic2VydmVycyBvZiB0aGlzIG5ldyB3cmFwcGVyIG11c3QgaW5oZXJpdCBpdHMgcmVtZW1iZXJlZCBtYXNrLlxuICAgICAgICB2aWV3LnJ1bGU/LnJldGFpblN0YWdlRXJyb3IodGhpcy5mYWlsdXJlLCB0aGlzLmZhaWx1cmUubWVzc2FnZSwgU0NPUEVfUExBQ0VIT0xERVIpO1xuICAgICAgICBpZiAodGhpcy5ydWxlICE9PSB2aWV3LnJ1bGUpIHRoaXMucnVsZT8ucmV0YWluU3RhZ2VFcnJvcih0aGlzLmZhaWx1cmUsIHRoaXMuZmFpbHVyZS5tZXNzYWdlLCBTQ09QRV9QTEFDRUhPTERFUik7XG4gICAgICB9XG4gICAgICB0aGlzLnN0b3BwZXIuYWJvcnQodGhpcy5mYWlsdXJlKTtcbiAgICB9XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHRlbGxBZGFwdGVyKHRoaXMucmVzb2x2ZWQuYWRhcHRlciwgeyBlbnRyeSwgZXJyb3I6IHZpZXcuZXJyb3IgfSk7XG4gIH1cbn1cblxuLyoqIFRoZSBhZGFwdGVyJ3Mgb3duIGBvbkZhaWx1cmVgLCBpc29sYXRlZDogYSB0aHJvd2luZyBnZXR0ZXIsIGEgdGhyb3cgb3IgYSByZWplY3Rpb24gdGhlcmUgY2hhbmdlcyBub3RoaW5nLiAqL1xuZnVuY3Rpb24gdGVsbEFkYXB0ZXIoYWRhcHRlcjogUmVjb3JkU2luaywgZmFpbHVyZTogeyByZWFkb25seSBlbnRyeTogUmVjb3JkRW50cnk7IHJlYWRvbmx5IGVycm9yOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBsaXN0ZW5lcjogdW5rbm93biA9IGFkYXB0ZXIub25GYWlsdXJlO1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHJldHVybjtcbiAgICBzZXR0bGVPbmNlKFxuICAgICAgbGlzdGVuZXIuY2FsbChhZGFwdGVyLCBmYWlsdXJlKSxcbiAgICAgICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICgpID0+IHVuZGVmaW5lZCxcbiAgICApO1xuICB9IGNhdGNoIHtcbiAgICAvLyBBIGxpc3RlbmVyIHRoYXQgZmFpbHMgaXMgdGhlIGFkYXB0ZXIncyBvd24gYnVzaW5lc3M6IHRoZSBsb3NzIGlzIGFscmVhZHkgY291bnRlZC5cbiAgfVxufVxuXG4vKipcbiAqIGB2YWx1ZWAsIHNldHRsZWQgT05DRSBpbnRvIGBvblZhbHVlYCAvIGBvbkVycm9yYCDigJQgbmV2ZXIgdGhyb3VnaCB0aGUgdmFsdWUncyBvd24gYHRoZW5gOiBhIG5hdGl2ZSBwcm9taXNlIGlzXG4gKiB3YXRjaGVkIHRocm91Z2ggdGhlIHJlYWwgYFByb21pc2UucHJvdG90eXBlLnRoZW5gIChhbiBvd24gYHRoZW5gIG9uIGl0IGlzIG5vdCB0cnVzdGVkLCBzbyBpdHMgcmVqZWN0aW9uIGlzIGFsd2F5c1xuICogaGFuZGxlZCksIGFueSBvdGhlciB0aGVuYWJsZSBhZG9wdGVkIGludG8gYSBmcmVzaCBwcm9taXNlLiBBIHBsYWluIHZhbHVlIGlzIGEgZnVsZmlsbWVudC5cbiAqL1xuZnVuY3Rpb24gc2V0dGxlT25jZTxUPih2YWx1ZTogdW5rbm93biwgb25WYWx1ZTogKCkgPT4gVCwgb25FcnJvcjogKGVycm9yOiB1bmtub3duKSA9PiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGFkb3B0ZWQ6IFByb21pc2U8dW5rbm93bj4gPSB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UgPyB2YWx1ZSA6IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXNvbHZlKHZhbHVlKSk7XG4gIHJldHVybiBQcm9taXNlLnByb3RvdHlwZS50aGVuLmNhbGwoYWRvcHRlZCwgb25WYWx1ZSwgb25FcnJvcikgYXMgUHJvbWlzZTxUPjtcbn1cbiJdfQ==
@@ -76,7 +76,7 @@ export function servedSnapshot(traverser, observers, options, sink) {
76
76
  runtime.capture.limit('redaction-active');
77
77
  return {
78
78
  ...snapshot,
79
- capture: runtime.capture.snapshot(snapshot.commitLog.length, control, options?.redact === true),
79
+ capture: runtime.captureSnapshot(snapshot.commitLog.length, control, options?.redact === true),
80
80
  };
81
81
  }
82
82
  return snapshot;
@@ -140,4 +140,4 @@ export function collectRecorderSnapshots(observers, collected, includeCapture =
140
140
  }
141
141
  return out;
142
142
  }
143
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9zbmFwc2hvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFHSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUc3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBR2xGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUtyRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsU0FBdUMsRUFDdkMsU0FBdUIsRUFDdkIsT0FBOEIsRUFDOUIsSUFBc0I7SUFFdEIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFvQixDQUFDLENBQUM7SUFDOUUsSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDO1FBQ2hCLGlFQUFpRTtRQUNqRSx1RUFBdUU7UUFDdkUseURBQXlEO1FBQ3pELDJCQUEyQjtRQUMzQixrRUFBa0U7UUFDbEUsOERBQThEO1FBQzlELG1FQUFtRTtRQUNuRSxzRUFBc0U7UUFDdEUsMkRBQTJEO1FBQzNELFFBQVEsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDaEQsSUFBSSxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLHdFQUF3RTtRQUN4RSx3REFBd0Q7UUFDeEQsNEVBQTRFO1FBQzVFLFFBQVEsQ0FBQyxjQUFjLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELElBQUksaUJBQXFDLENBQUM7SUFDMUMsTUFBTSxZQUFZLEdBQXFDLEVBQUUsQ0FBQztJQUMxRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFzRCxDQUFDO0lBQzNGLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2xGLElBQUksQ0FBQztRQUNILGlCQUFpQixHQUFHLHdCQUF3QixDQUMxQyxTQUFTLEVBQ1QsVUFBVTtZQUNSLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUF3QixDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLEtBQUssUUFBUSxDQUFDLEtBQUs7b0JBQ25GLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxFQUNKLE9BQU8sQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUM5QixDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUNELElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUM7SUFDekMsQ0FBQztJQUVELHFFQUFxRTtJQUNyRSxnRUFBZ0U7SUFDaEUsMENBQTBDO0lBQzFDLElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNCLFFBQVEsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBRUQsOEdBQThHO0lBQzlHLFdBQVc7SUFDWCxJQUFJLElBQUksS0FBSyxTQUFTO1FBQUUsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFFN0MsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsTUFBTSxPQUFPLEdBQ1gsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFDO2dCQUN6RCxDQUFDLENBQUMsVUFBVTtnQkFDWixDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUM7b0JBQ3ZELENBQUMsQ0FBQyxTQUFTO29CQUNYLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEIsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEtBQUs7WUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ25ILE9BQU87WUFDTCxHQUFHLFFBQVE7WUFDWCxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDO1NBQ2hHLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxTQUFTLENBQUMsUUFBeUI7SUFDMUMsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLFFBQVEsQ0FBQztJQUNsQyxPQUFPO1FBQ0wsR0FBRyxRQUFRO1FBQ1gsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQW1CO1FBQy9FLEdBQUcsQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO0tBQ25GLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsU0FBdUIsRUFDdkIsU0FBbUYsRUFDbkYsY0FBYyxHQUFHLEtBQUs7SUFFdEIsTUFBTSxHQUFHLEdBQXVCLEVBQUUsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBK0IsRUFBUSxFQUFFO1FBQ3hELElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUFFLE9BQU87UUFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZixNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDN0QsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN0QixDQUFDLENBQUM7SUFDRixLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxjQUFjO1FBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELEtBQUssTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLGFBQWE7UUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0IsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLGtCQUFrQixFQUFFO1lBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLEtBQUssTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRTtZQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzbmFwc2hvdCDigJQgd2hhdCBgRmxvd0NoYXJ0RXhlY3V0b3IuZ2V0U25hcHNob3QoKWAgc2VydmVzIChGOSkuXG4gKlxuICogVGhlIHRyYXZlcnNlcidzIHJ1bnRpbWUgc25hcHNob3QsIHBsdXMgd2hhdCBvbmx5IHRoZSBleGVjdXRvciBrbm93czogdGhlXG4gKiBzZXJ2ZWQgc3ViZmxvdyByZXN1bHRzIChlYWNoIHN1YmZsb3cncyBvd24gbWlycm9yIHVuZGVyIGByZWRhY3Q6IHRydWVgKSwgb25lXG4gKiByZWNvcmRlciByb3cgcGVyIHJlY29yZGVyIGlkLCBhbmQgdGhlIGRlZmVycmVkIHRpZXIncyBhY2NvdW50aW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB7IHNlcnZlUmVjb3JkIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB7IGRlZXBGcmVlemUgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IFJlY29yZGVyQ2FwdHVyZUFja25vd2xlZGdlbWVudCB9IGZyb20gJy4uL2NhcHR1cmUvbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgeyBzZXJ2ZWRTdWJmbG93UmVzdWx0cyB9IGZyb20gJy4uL2VuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Y2hhcnRUcmF2ZXJzZXIgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci5qcyc7XG5pbXBvcnQgeyBjb3B5QnVuZGxlIH0gZnJvbSAnLi4vcmVjb3JkZXIvc25hcHNob3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5PYnNlcnZlcnMgfSBmcm9tICcuL2F0dGFjaC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlY29yZGVyU25hcHNob3QsIFJlY29yZFNpbmtTdGF0cywgUnVudGltZVNuYXBzaG90IH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lLmpzJztcblxuLyoqXG4gKiBUaGUgc2VydmVkIHNuYXBzaG90LiBgc2hhcmVkU3RhdGVgIGlzIHRoZSBMSVZFIHZpZXcgaW4gcHJvZHVjdGlvbiAoemVyb1xuICogY29weSk7IGluIGRldiBtb2RlIGl0IGlzIGEgZGVlcC1mcm96ZW4gQ0xPTkUsIHNvIGEgY29uc3VtZXIgbXV0YXRpb24gdGhyb3dzXG4gKiBpbnN0ZWFkIG9mIGNvcnJ1cHRpbmcgZW5naW5lIHN0YXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmVkU25hcHNob3QoXG4gIHRyYXZlcnNlcjogRmxvd2NoYXJ0VHJhdmVyc2VyPGFueSwgYW55PixcbiAgb2JzZXJ2ZXJzOiBSdW5PYnNlcnZlcnMsXG4gIG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSxcbiAgc2luaz86IFJlY29yZFNpbmtTdGF0cyxcbik6IFJ1bnRpbWVTbmFwc2hvdCB7XG4gIGNvbnN0IHNuYXBzaG90ID0gc2VydmVkTG9nKHRyYXZlcnNlci5nZXRTbmFwc2hvdChvcHRpb25zKSBhcyBSdW50aW1lU25hcHNob3QpO1xuICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAvLyBEZXYtbW9kZSBtdXRhdGlvbiBndWFyZDogZnJlZXplIGEgQ0xPTkUsIG5ldmVyIHRoZSBsaXZlIGVuZ2luZVxuICAgIC8vIHN0YXRlIOKAlCBgc25hcHNob3Quc2hhcmVkU3RhdGVgIElTIFNoYXJlZE1lbW9yeSdzIGN1cnJlbnQgZ2VuZXJhdGlvbixcbiAgICAvLyB3aG9zZSB1bmNoYW5nZWQgc3VidHJlZXMgZXZlcnkgbGF0ZXIgZ2VuZXJhdGlvbiBzaGFyZXNcbiAgICAvLyAoY29weS1vbi13cml0ZSwgOS4yOS4wKS5cbiAgICAvLyBQcm9kdWN0aW9uIHN0YXlzIHplcm8tY29weTsgY2xvbmUtYWx3YXlzIGlzIGEgbWVhc3VyZWQgZGVjaXNpb25cbiAgICAvLyBkZWZlcnJlZCB1bnRpbCB0aGUgYmVuY2ggc2F5cyBpdCdzIGFmZm9yZGFibGUgKEJBQ0tMT0cgIzgpLlxuICAgIC8vIE5PVEU6IGRlZXBGcmVlemUgKGNhcHR1cmUvZnJlZXplLnRzIOKAlCB0aGUgb25lIHdhbGspIGNhbm5vdCByZWFjaFxuICAgIC8vIE1hcC9TZXQgSU5URVJOQUxTIChgbWFwLnNldCgpYCBvbiB0aGUgZnJvemVuIGNsb25lIHdvbid0IHRocm93KSBhbmRcbiAgICAvLyBza2lwcyB0eXBlZCBhcnJheXMuIFRoZSBDTE9ORSBzdGlsbCBpc29sYXRlcyB0aGUgZW5naW5lLlxuICAgIHNuYXBzaG90LnNoYXJlZFN0YXRlID0gZGVlcEZyZWV6ZShzdHJ1Y3R1cmVkQ2xvbmUoc25hcHNob3Quc2hhcmVkU3RhdGUpKTtcbiAgfVxuICBjb25zdCBzZlJlc3VsdHMgPSB0cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKTtcbiAgaWYgKHNmUmVzdWx0cy5zaXplID4gMCkge1xuICAgIC8vIFVuZGVyIGByZWRhY3Q6IHRydWVgIGVhY2ggc3ViZmxvdydzIGBnbG9iYWxDb250ZXh0YCBpcyBpdHMgb3duIG1pcnJvclxuICAgIC8vICg5LjIwLjApIOKAlCBzZXJ2ZWQsIG5ldmVyIHdyaXR0ZW4gaW50byB0aGUgcmVjb3JkIChzZWVcbiAgICAvLyBlbmdpbmUvaGFuZGxlcnMvc2VydmVkU3ViZmxvd1Jlc3VsdHMudHMpLiBQbGFpbjogdGhlIHJlY29yZHMgYXMgdGhleSBhcmUuXG4gICAgc25hcHNob3Quc3ViZmxvd1Jlc3VsdHMgPSBzZXJ2ZWRTdWJmbG93UmVzdWx0cyhzZlJlc3VsdHMsIG9wdGlvbnM/LnJlZGFjdCA9PT0gdHJ1ZSk7XG4gIH1cblxuICBsZXQgcmVjb3JkZXJTbmFwc2hvdHM6IFJlY29yZGVyU25hcHNob3RbXTtcbiAgY29uc3QgYWNrbm93bGVkZ2VkOiBSZWNvcmRlckNhcHR1cmVBY2tub3dsZWRnZW1lbnRbXSA9IFtdO1xuICBjb25zdCBydW50aW1lID0gdHJhdmVyc2VyLmdldFJ1bnRpbWUoKSBhcyBpbXBvcnQoJy4vRXhlY3V0aW9uUnVudGltZS5qcycpLkV4ZWN1dGlvblJ1bnRpbWU7XG4gIGNvbnN0IGlubGluZUZsb3cgPSBydW50aW1lLmNhcHR1cmUgPyBuZXcgU2V0KG9ic2VydmVycy5mbG93UmVjb3JkZXJzKSA6IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICByZWNvcmRlclNuYXBzaG90cyA9IGNvbGxlY3RSZWNvcmRlclNuYXBzaG90cyhcbiAgICAgIG9ic2VydmVycyxcbiAgICAgIGlubGluZUZsb3cgJiZcbiAgICAgICAgKChyZWNvcmRlciwgcm93KSA9PiB7XG4gICAgICAgICAgaWYgKGlubGluZUZsb3cuaGFzKHJlY29yZGVyIGFzIEZsb3dSZWNvcmRlcikgJiYgcm93LmNhcHR1cmU/LnJ1bklkID09PSBzbmFwc2hvdC5ydW5JZClcbiAgICAgICAgICAgIGFja25vd2xlZGdlZC5wdXNoKHJvdy5jYXB0dXJlKTtcbiAgICAgICAgfSksXG4gICAgICBydW50aW1lLmNhcHR1cmUgIT09IHVuZGVmaW5lZCxcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJ1bnRpbWUuY2FwdHVyZT8ubGltaXQoJ3JlY29yZGVyLXNuYXBzaG90LWZhaWxlZCcpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIGlmIChyZWNvcmRlclNuYXBzaG90cy5sZW5ndGggPiAwKSB7XG4gICAgc25hcHNob3QucmVjb3JkZXJzID0gcmVjb3JkZXJTbmFwc2hvdHM7XG4gIH1cblxuICAvLyBSRkMtMDAxIEJsb2NrIDk6IHRoZSBkZWZlcnJlZC1vYnNlcnZlciBhY2NvdW50aW5nIHN1cmZhY2UuIFByZXNlbnRcbiAgLy8gT05MWSB3aGVuIGEgZGVmZXJyZWQgb2JzZXJ2ZXIgd2FzIGF0dGFjaGVkIG9uIHRoaXMgZXhlY3V0b3Ig4oCUXG4gIC8vIHplcm8tY29zdCBkaXNjaXBsaW5lIGZvciBldmVyeW9uZSBlbHNlLlxuICBpZiAob2JzZXJ2ZXJzLmRlZmVycmVkVGllcikge1xuICAgIHNuYXBzaG90Lm9ic2VydmVyU3RhdHMgPSBvYnNlcnZlcnMuZGVmZXJyZWRUaWVyLmdldFN0YXRzKCk7XG4gIH1cblxuICAvLyBUaGUgY3Jhc2gtc2FmZSByZWNvcmQncyBhY2NvdW50aW5nICgxMC4xLCBQNik6IHByZXNlbnQgT05MWSBmb3IgYW4gZXhlY3V0b3IgYnVpbHQgd2l0aCBhIGBzaW5rYCwgb25jZSBhIHJ1blxuICAvLyBzdGFydGVkLlxuICBpZiAoc2luayAhPT0gdW5kZWZpbmVkKSBzbmFwc2hvdC5zaW5rID0gc2luaztcblxuICBpZiAocnVudGltZS5jYXB0dXJlKSB7XG4gICAgY29uc3QgY29udHJvbCA9XG4gICAgICBhY2tub3dsZWRnZWQubGVuZ3RoID09PSAwXG4gICAgICAgID8gJ3Vua25vd24nXG4gICAgICAgIDogYWNrbm93bGVkZ2VkLmV2ZXJ5KChhY2spID0+IGFjay5jb250cm9sID09PSAnY2FwdHVyZWQnKVxuICAgICAgICA/ICdjYXB0dXJlZCdcbiAgICAgICAgOiBhY2tub3dsZWRnZWQuc29tZSgoYWNrKSA9PiBhY2suY29udHJvbCA9PT0gJ3BhcnRpYWwnKVxuICAgICAgICA/ICdwYXJ0aWFsJ1xuICAgICAgICA6ICd1bmtub3duJztcbiAgICBpZiAocnVudGltZS5yb290U3RhZ2VDb250ZXh0LmdldFBvbGljeSgpLnJlZGFjdGlvbj8uaXNJbmVydCgpID09PSBmYWxzZSkgcnVudGltZS5jYXB0dXJlLmxpbWl0KCdyZWRhY3Rpb24tYWN0aXZlJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNuYXBzaG90LFxuICAgICAgY2FwdHVyZTogcnVudGltZS5jYXB0dXJlLnNuYXBzaG90KHNuYXBzaG90LmNvbW1pdExvZy5sZW5ndGgsIGNvbnRyb2wsIG9wdGlvbnM/LnJlZGFjdCA9PT0gdHJ1ZSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gc25hcHNob3Q7XG59XG5cbi8qKlxuICogVGhlIGNvbW1pdCBsb2cgYW5kIHRoZSBmb2xkIGJhc2UgYXMgYSByZWFkZXIgbWF5IGhvbGQgdGhlbSAoOS40NC4yKTogYSByZWNvcmQgZnJlZXppbmcgc2VhbGVkIHdob2xlXG4gKiBpcyBzZXJ2ZWQgYXMgaXRzZWxmOyBvbmUgaG9sZGluZyB3aGF0IGZyZWV6aW5nIGNhbm5vdCBzZWFsIOKAlCBhIERhdGUsIGEgTWFwLCBhIGJ1ZmZlciDigKYg4oCUIGFzIGEgY29weVxuICogb2YgaXRzIG9wZW4gcGF0aHMsIHRoZSByZWFkZXIncyBvd24gKGBjYXB0dXJlL2ZyZWV6ZS50cyDCtyBzZXJ2ZVJlY29yZGApLiBIZXJlLCBhdCB0aGUgcHVibGljIGRvb3I6XG4gKiB0aGUgZW5naW5lJ3Mgb3duIHNuYXBzaG90IG9mIGEgbG9nIChhIHN1YmZsb3cgbW91bnQncykgaXMgbm90IHNlcnZlZCwgc28gdGhlIHJ1biBwYXlzIG5vdGhpbmcuXG4gKi9cbmZ1bmN0aW9uIHNlcnZlZExvZyhzbmFwc2hvdDogUnVudGltZVNuYXBzaG90KTogUnVudGltZVNuYXBzaG90IHtcbiAgY29uc3QgeyBpbml0aWFsU3RhdGUgfSA9IHNuYXBzaG90O1xuICByZXR1cm4ge1xuICAgIC4uLnNuYXBzaG90LFxuICAgIGNvbW1pdExvZzogT2JqZWN0LmZyZWV6ZShzbmFwc2hvdC5jb21taXRMb2cubWFwKHNlcnZlUmVjb3JkKSkgYXMgQ29tbWl0QnVuZGxlW10sXG4gICAgLi4uKGluaXRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGluaXRpYWxTdGF0ZTogc2VydmVSZWNvcmQoaW5pdGlhbFN0YXRlKSB9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGB0b1NuYXBzaG90KClgIGJ1bmRsZXMgZnJvbSBldmVyeSBhdHRhY2hlZCByZWNvcmRlciDigJQgT05FIGVudHJ5XG4gKiBwZXIgcmVjb3JkZXIgaWQsIGFjcm9zcyBhbGwgY2hhbm5lbHMgYW5kIGJvdGggZGVsaXZlcnkgdGllcnMuXG4gKlxuICogVGhlIGRlZHVwZSBpcyBsb2FkLWJlYXJpbmcsIG5vdCB0aWRpbmVzcy4gQSByZWNvcmRlciB0aGF0IGltcGxlbWVudHMgYVxuICogc2hhcmVkLW5hbWUgaG9vayAoYG9uRXJyb3JgIC8gYG9uUGF1c2VgIC8gYG9uUmVzdW1lYCDigJQgZGVjbGFyZWQgb24gQk9USFxuICogdGhlIHNjb3BlIGFuZCBmbG93IGludGVyZmFjZXMpIGlzIGxlZ2l0aW1hdGVseSByZWdpc3RlcmVkIG9uIEJPVEggaW5saW5lXG4gKiBsaXN0cyBieSBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAsIGFuZCB0aGF0IGlzIGJ5IGRlc2lnbjogZWFjaCBjaGFubmVsXG4gKiBjYWxscyB0aGUgaG9vayB3aXRoIGl0cyBvd24gcGF5bG9hZCB2YXJpYW50LiBgTWV0cmljUmVjb3JkZXIub25QYXVzZWAgaXNcbiAqIHRoZSBldmVyeWRheSBjYXNlLiBXYWxraW5nIHRoZSBsaXN0cyB3aXRob3V0IGEgc2hhcmVkIGBzZWVuYCBzZXQgdHVybmVkXG4gKiB0aGF0IGludG8gYSBEVVBMSUNBVEVEIHNuYXBzaG90IGVudHJ5IChzYW1lIGlkIHR3aWNlKSwgd2hpY2ggYnJlYWtzIGV2ZXJ5XG4gKiBjb25zdW1lciB0aGF0IGluZGV4ZXMgYHNuYXBzaG90LnJlY29yZGVyc2AgYnkgaWQuXG4gKlxuICogT3JkZXJpbmcgaXMgc2NvcGUgbGlzdCDihpIgZmxvdyBsaXN0IOKGkiBkZWZlcnJlZCB0aWVyLCBhbmQgdGhlIEZJUlNUIGJ1bmRsZVxuICogZm9yIGFuIGlkIHdpbnMuIEEgcmVjb3JkZXIgd2l0aCBubyBgdG9TbmFwc2hvdGAgbmV2ZXIgY2xhaW1zIGFuIGlkLCBzbyBpdFxuICogY2Fubm90IHNoYWRvdyBhIHNhbWUtaWQgcmVjb3JkZXIgdGhhdCBkb2VzIGhhdmUgb25lLlxuICpcbiAqIFRoZSByb3cgaXMgUkVCVUlMVCBmaWVsZCBieSBmaWVsZCBieSB0aGUgb25lIGNvcGllciAoYHJlY29yZGVyL3NuYXBzaG90LnRzXG4gKiDCtyBjb3B5QnVuZGxlYCwgc2hhcmVkIHdpdGggYENvbXBvc2l0ZVJlY29yZGVyYCkgcmF0aGVyIHRoYW4gc3ByZWFkLCBzbyBhXG4gKiByZWNvcmRlciBjYW5ub3Qgc211Z2dsZSBhbiBgaWRgIG9mIGl0cyBvd24gY2hvb3NpbmcgaW50byB0aGUgc25hcHNob3QgKHRoZVxuICogaWQgaXMgdGhlIGV4ZWN1dG9yJ3MsIGFuZCBjb25zdW1lcnMgaW5kZXggYnkgaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlY29yZGVyU25hcHNob3RzKFxuICBvYnNlcnZlcnM6IFJ1bk9ic2VydmVycyxcbiAgY29sbGVjdGVkPzogKHJlY29yZGVyOiBTY29wZVJlY29yZGVyIHwgRmxvd1JlY29yZGVyLCByb3c6IFJlY29yZGVyU25hcHNob3QpID0+IHZvaWQsXG4gIGluY2x1ZGVDYXB0dXJlID0gZmFsc2UsXG4pOiBSZWNvcmRlclNuYXBzaG90W10ge1xuICBjb25zdCBvdXQ6IFJlY29yZGVyU25hcHNob3RbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGNvbGxlY3QgPSAocjogU2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlcik6IHZvaWQgPT4ge1xuICAgIGlmICghci50b1NuYXBzaG90IHx8IHNlZW4uaGFzKHIuaWQpKSByZXR1cm47XG4gICAgc2Vlbi5hZGQoci5pZCk7XG4gICAgY29uc3Qgcm93ID0gY29weUJ1bmRsZShyLmlkLCByLnRvU25hcHNob3QoKSwgaW5jbHVkZUNhcHR1cmUpO1xuICAgIG91dC5wdXNoKHJvdyk7XG4gICAgY29sbGVjdGVkPy4ociwgcm93KTtcbiAgfTtcbiAgZm9yIChjb25zdCByIG9mIG9ic2VydmVycy5zY29wZVJlY29yZGVycykgY29sbGVjdChyKTtcbiAgZm9yIChjb25zdCByIG9mIG9ic2VydmVycy5mbG93UmVjb3JkZXJzKSBjb2xsZWN0KHIpO1xuICBpZiAob2JzZXJ2ZXJzLmRlZmVycmVkVGllcikge1xuICAgIGZvciAoY29uc3QgciBvZiBvYnNlcnZlcnMuZGVmZXJyZWRUaWVyLnNjb3BlTGlzdFJlY29yZGVycygpKSBjb2xsZWN0KHIpO1xuICAgIGZvciAoY29uc3QgciBvZiBvYnNlcnZlcnMuZGVmZXJyZWRUaWVyLmZsb3dMaXN0UmVjb3JkZXJzKCkpIGNvbGxlY3Qocik7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9zbmFwc2hvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFHSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUc3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBR2xGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUtyRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsU0FBdUMsRUFDdkMsU0FBdUIsRUFDdkIsT0FBOEIsRUFDOUIsSUFBc0I7SUFFdEIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFvQixDQUFDLENBQUM7SUFDOUUsSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDO1FBQ2hCLGlFQUFpRTtRQUNqRSx1RUFBdUU7UUFDdkUseURBQXlEO1FBQ3pELDJCQUEyQjtRQUMzQixrRUFBa0U7UUFDbEUsOERBQThEO1FBQzlELG1FQUFtRTtRQUNuRSxzRUFBc0U7UUFDdEUsMkRBQTJEO1FBQzNELFFBQVEsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDaEQsSUFBSSxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLHdFQUF3RTtRQUN4RSx3REFBd0Q7UUFDeEQsNEVBQTRFO1FBQzVFLFFBQVEsQ0FBQyxjQUFjLEdBQUcs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RCxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQixLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUU7WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFO1lBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNuYXBzaG90IOKAlCB3aGF0IGBGbG93Q2hhcnRFeGVjdXRvci5nZXRTbmFwc2hvdCgpYCBzZXJ2ZXMgKEY5KS5cbiAqXG4gKiBUaGUgdHJhdmVyc2VyJ3MgcnVudGltZSBzbmFwc2hvdCwgcGx1cyB3aGF0IG9ubHkgdGhlIGV4ZWN1dG9yIGtub3dzOiB0aGVcbiAqIHNlcnZlZCBzdWJmbG93IHJlc3VsdHMgKGVhY2ggc3ViZmxvdydzIG93biBtaXJyb3IgdW5kZXIgYHJlZGFjdDogdHJ1ZWApLCBvbmVcbiAqIHJlY29yZGVyIHJvdyBwZXIgcmVjb3JkZXIgaWQsIGFuZCB0aGUgZGVmZXJyZWQgdGllcidzIGFjY291bnRpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgc2VydmVSZWNvcmQgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgZGVlcEZyZWV6ZSB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgUmVjb3JkZXJDYXB0dXJlQWNrbm93bGVkZ2VtZW50IH0gZnJvbSAnLi4vY2FwdHVyZS9uYXRpdmVDb3ZlcmFnZS5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB7IHNlcnZlZFN1YmZsb3dSZXN1bHRzIH0gZnJvbSAnLi4vZW5naW5lL2hhbmRsZXJzL3NlcnZlZFN1YmZsb3dSZXN1bHRzLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydFRyYXZlcnNlciB9IGZyb20gJy4uL2VuZ2luZS90cmF2ZXJzYWwvRmxvd2NoYXJ0VHJhdmVyc2VyLmpzJztcbmltcG9ydCB7IGNvcHlCdW5kbGUgfSBmcm9tICcuLi9yZWNvcmRlci9zbmFwc2hvdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJ1bk9ic2VydmVycyB9IGZyb20gJy4vYXR0YWNoLmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkZXJTbmFwc2hvdCwgUmVjb3JkU2lua1N0YXRzLCBSdW50aW1lU25hcHNob3QgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgc25hcHNob3QuIGBzaGFyZWRTdGF0ZWAgaXMgdGhlIExJVkUgdmlldyBpbiBwcm9kdWN0aW9uICh6ZXJvXG4gKiBjb3B5KTsgaW4gZGV2IG1vZGUgaXQgaXMgYSBkZWVwLWZyb3plbiBDTE9ORSwgc28gYSBjb25zdW1lciBtdXRhdGlvbiB0aHJvd3NcbiAqIGluc3RlYWQgb2YgY29ycnVwdGluZyBlbmdpbmUgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZWRTbmFwc2hvdChcbiAgdHJhdmVyc2VyOiBGbG93Y2hhcnRUcmF2ZXJzZXI8YW55LCBhbnk+LFxuICBvYnNlcnZlcnM6IFJ1bk9ic2VydmVycyxcbiAgb3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9LFxuICBzaW5rPzogUmVjb3JkU2lua1N0YXRzLFxuKTogUnVudGltZVNuYXBzaG90IHtcbiAgY29uc3Qgc25hcHNob3QgPSBzZXJ2ZWRMb2codHJhdmVyc2VyLmdldFNuYXBzaG90KG9wdGlvbnMpIGFzIFJ1bnRpbWVTbmFwc2hvdCk7XG4gIGlmIChpc0Rldk1vZGUoKSkge1xuICAgIC8vIERldi1tb2RlIG11dGF0aW9uIGd1YXJkOiBmcmVlemUgYSBDTE9ORSwgbmV2ZXIgdGhlIGxpdmUgZW5naW5lXG4gICAgLy8gc3RhdGUg4oCUIGBzbmFwc2hvdC5zaGFyZWRTdGF0ZWAgSVMgU2hhcmVkTWVtb3J5J3MgY3VycmVudCBnZW5lcmF0aW9uLFxuICAgIC8vIHdob3NlIHVuY2hhbmdlZCBzdWJ0cmVlcyBldmVyeSBsYXRlciBnZW5lcmF0aW9uIHNoYXJlc1xuICAgIC8vIChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLlxuICAgIC8vIFByb2R1Y3Rpb24gc3RheXMgemVyby1jb3B5OyBjbG9uZS1hbHdheXMgaXMgYSBtZWFzdXJlZCBkZWNpc2lvblxuICAgIC8vIGRlZmVycmVkIHVudGlsIHRoZSBiZW5jaCBzYXlzIGl0J3MgYWZmb3JkYWJsZSAoQkFDS0xPRyAjOCkuXG4gICAgLy8gTk9URTogZGVlcEZyZWV6ZSAoY2FwdHVyZS9mcmVlemUudHMg4oCUIHRoZSBvbmUgd2FsaykgY2Fubm90IHJlYWNoXG4gICAgLy8gTWFwL1NldCBJTlRFUk5BTFMgKGBtYXAuc2V0KClgIG9uIHRoZSBmcm96ZW4gY2xvbmUgd29uJ3QgdGhyb3cpIGFuZFxuICAgIC8vIHNraXBzIHR5cGVkIGFycmF5cy4gVGhlIENMT05FIHN0aWxsIGlzb2xhdGVzIHRoZSBlbmdpbmUuXG4gICAgc25hcHNob3Quc2hhcmVkU3RhdGUgPSBkZWVwRnJlZXplKHN0cnVjdHVyZWRDbG9uZShzbmFwc2hvdC5zaGFyZWRTdGF0ZSkpO1xuICB9XG4gIGNvbnN0IHNmUmVzdWx0cyA9IHRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICBpZiAoc2ZSZXN1bHRzLnNpemUgPiAwKSB7XG4gICAgLy8gVW5kZXIgYHJlZGFjdDogdHJ1ZWAgZWFjaCBzdWJmbG93J3MgYGdsb2JhbENvbnRleHRgIGlzIGl0cyBvd24gbWlycm9yXG4gICAgLy8gKDkuMjAuMCkg4oCUIHNlcnZlZCwgbmV2ZXIgd3JpdHRlbiBpbnRvIHRoZSByZWNvcmQgKHNlZVxuICAgIC8vIGVuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy50cykuIFBsYWluOiB0aGUgcmVjb3JkcyBhcyB0aGV5IGFyZS5cbiAgICBzbmFwc2hvdC5zdWJmbG93UmVzdWx0cyA9IHNlcnZlZFN1YmZsb3dSZXN1bHRzKHNmUmVzdWx0cywgb3B0aW9ucz8ucmVkYWN0ID09PSB0cnVlKTtcbiAgfVxuXG4gIGxldCByZWNvcmRlclNuYXBzaG90czogUmVjb3JkZXJTbmFwc2hvdFtdO1xuICBjb25zdCBhY2tub3dsZWRnZWQ6IFJlY29yZGVyQ2FwdHVyZUFja25vd2xlZGdlbWVudFtdID0gW107XG4gIGNvbnN0IHJ1bnRpbWUgPSB0cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIGltcG9ydCgnLi9FeGVjdXRpb25SdW50aW1lLmpzJykuRXhlY3V0aW9uUnVudGltZTtcbiAgY29uc3QgaW5saW5lRmxvdyA9IHJ1bnRpbWUuY2FwdHVyZSA/IG5ldyBTZXQob2JzZXJ2ZXJzLmZsb3dSZWNvcmRlcnMpIDogdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIHJlY29yZGVyU25hcHNob3RzID0gY29sbGVjdFJlY29yZGVyU25hcHNob3RzKFxuICAgICAgb2JzZXJ2ZXJzLFxuICAgICAgaW5saW5lRmxvdyAmJlxuICAgICAgICAoKHJlY29yZGVyLCByb3cpID0+IHtcbiAgICAgICAgICBpZiAoaW5saW5lRmxvdy5oYXMocmVjb3JkZXIgYXMgRmxvd1JlY29yZGVyKSAmJiByb3cuY2FwdHVyZT8ucnVuSWQgPT09IHNuYXBzaG90LnJ1bklkKVxuICAgICAgICAgICAgYWNrbm93bGVkZ2VkLnB1c2gocm93LmNhcHR1cmUpO1xuICAgICAgICB9KSxcbiAgICAgIHJ1bnRpbWUuY2FwdHVyZSAhPT0gdW5kZWZpbmVkLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcnVudGltZS5jYXB0dXJlPy5saW1pdCgncmVjb3JkZXItc25hcHNob3QtZmFpbGVkJyk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgaWYgKHJlY29yZGVyU25hcHNob3RzLmxlbmd0aCA+IDApIHtcbiAgICBzbmFwc2hvdC5yZWNvcmRlcnMgPSByZWNvcmRlclNuYXBzaG90cztcbiAgfVxuXG4gIC8vIFJGQy0wMDEgQmxvY2sgOTogdGhlIGRlZmVycmVkLW9ic2VydmVyIGFjY291bnRpbmcgc3VyZmFjZS4gUHJlc2VudFxuICAvLyBPTkxZIHdoZW4gYSBkZWZlcnJlZCBvYnNlcnZlciB3YXMgYXR0YWNoZWQgb24gdGhpcyBleGVjdXRvciDigJRcbiAgLy8gemVyby1jb3N0IGRpc2NpcGxpbmUgZm9yIGV2ZXJ5b25lIGVsc2UuXG4gIGlmIChvYnNlcnZlcnMuZGVmZXJyZWRUaWVyKSB7XG4gICAgc25hcHNob3Qub2JzZXJ2ZXJTdGF0cyA9IG9ic2VydmVycy5kZWZlcnJlZFRpZXIuZ2V0U3RhdHMoKTtcbiAgfVxuXG4gIC8vIFRoZSBjcmFzaC1zYWZlIHJlY29yZCdzIGFjY291bnRpbmcgKDEwLjEsIFA2KTogcHJlc2VudCBPTkxZIGZvciBhbiBleGVjdXRvciBidWlsdCB3aXRoIGEgYHNpbmtgLCBvbmNlIGEgcnVuXG4gIC8vIHN0YXJ0ZWQuXG4gIGlmIChzaW5rICE9PSB1bmRlZmluZWQpIHNuYXBzaG90LnNpbmsgPSBzaW5rO1xuXG4gIGlmIChydW50aW1lLmNhcHR1cmUpIHtcbiAgICBjb25zdCBjb250cm9sID1cbiAgICAgIGFja25vd2xlZGdlZC5sZW5ndGggPT09IDBcbiAgICAgICAgPyAndW5rbm93bidcbiAgICAgICAgOiBhY2tub3dsZWRnZWQuZXZlcnkoKGFjaykgPT4gYWNrLmNvbnRyb2wgPT09ICdjYXB0dXJlZCcpXG4gICAgICAgID8gJ2NhcHR1cmVkJ1xuICAgICAgICA6IGFja25vd2xlZGdlZC5zb21lKChhY2spID0+IGFjay5jb250cm9sID09PSAncGFydGlhbCcpXG4gICAgICAgID8gJ3BhcnRpYWwnXG4gICAgICAgIDogJ3Vua25vd24nO1xuICAgIGlmIChydW50aW1lLnJvb3RTdGFnZUNvbnRleHQuZ2V0UG9saWN5KCkucmVkYWN0aW9uPy5pc0luZXJ0KCkgPT09IGZhbHNlKSBydW50aW1lLmNhcHR1cmUubGltaXQoJ3JlZGFjdGlvbi1hY3RpdmUnKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc25hcHNob3QsXG4gICAgICBjYXB0dXJlOiBydW50aW1lLmNhcHR1cmVTbmFwc2hvdChzbmFwc2hvdC5jb21taXRMb2cubGVuZ3RoLCBjb250cm9sLCBvcHRpb25zPy5yZWRhY3QgPT09IHRydWUpLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHNuYXBzaG90O1xufVxuXG4vKipcbiAqIFRoZSBjb21taXQgbG9nIGFuZCB0aGUgZm9sZCBiYXNlIGFzIGEgcmVhZGVyIG1heSBob2xkIHRoZW0gKDkuNDQuMik6IGEgcmVjb3JkIGZyZWV6aW5nIHNlYWxlZCB3aG9sZVxuICogaXMgc2VydmVkIGFzIGl0c2VsZjsgb25lIGhvbGRpbmcgd2hhdCBmcmVlemluZyBjYW5ub3Qgc2VhbCDigJQgYSBEYXRlLCBhIE1hcCwgYSBidWZmZXIg4oCmIOKAlCBhcyBhIGNvcHlcbiAqIG9mIGl0cyBvcGVuIHBhdGhzLCB0aGUgcmVhZGVyJ3Mgb3duIChgY2FwdHVyZS9mcmVlemUudHMgwrcgc2VydmVSZWNvcmRgKS4gSGVyZSwgYXQgdGhlIHB1YmxpYyBkb29yOlxuICogdGhlIGVuZ2luZSdzIG93biBzbmFwc2hvdCBvZiBhIGxvZyAoYSBzdWJmbG93IG1vdW50J3MpIGlzIG5vdCBzZXJ2ZWQsIHNvIHRoZSBydW4gcGF5cyBub3RoaW5nLlxuICovXG5mdW5jdGlvbiBzZXJ2ZWRMb2coc25hcHNob3Q6IFJ1bnRpbWVTbmFwc2hvdCk6IFJ1bnRpbWVTbmFwc2hvdCB7XG4gIGNvbnN0IHsgaW5pdGlhbFN0YXRlIH0gPSBzbmFwc2hvdDtcbiAgcmV0dXJuIHtcbiAgICAuLi5zbmFwc2hvdCxcbiAgICBjb21taXRMb2c6IE9iamVjdC5mcmVlemUoc25hcHNob3QuY29tbWl0TG9nLm1hcChzZXJ2ZVJlY29yZCkpIGFzIENvbW1pdEJ1bmRsZVtdLFxuICAgIC4uLihpbml0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBpbml0aWFsU3RhdGU6IHNlcnZlUmVjb3JkKGluaXRpYWxTdGF0ZSkgfSksXG4gIH07XG59XG5cbi8qKlxuICogQ29sbGVjdCBgdG9TbmFwc2hvdCgpYCBidW5kbGVzIGZyb20gZXZlcnkgYXR0YWNoZWQgcmVjb3JkZXIg4oCUIE9ORSBlbnRyeVxuICogcGVyIHJlY29yZGVyIGlkLCBhY3Jvc3MgYWxsIGNoYW5uZWxzIGFuZCBib3RoIGRlbGl2ZXJ5IHRpZXJzLlxuICpcbiAqIFRoZSBkZWR1cGUgaXMgbG9hZC1iZWFyaW5nLCBub3QgdGlkaW5lc3MuIEEgcmVjb3JkZXIgdGhhdCBpbXBsZW1lbnRzIGFcbiAqIHNoYXJlZC1uYW1lIGhvb2sgKGBvbkVycm9yYCAvIGBvblBhdXNlYCAvIGBvblJlc3VtZWAg4oCUIGRlY2xhcmVkIG9uIEJPVEhcbiAqIHRoZSBzY29wZSBhbmQgZmxvdyBpbnRlcmZhY2VzKSBpcyBsZWdpdGltYXRlbHkgcmVnaXN0ZXJlZCBvbiBCT1RIIGlubGluZVxuICogbGlzdHMgYnkgYGF0dGFjaENvbWJpbmVkUmVjb3JkZXJgLCBhbmQgdGhhdCBpcyBieSBkZXNpZ246IGVhY2ggY2hhbm5lbFxuICogY2FsbHMgdGhlIGhvb2sgd2l0aCBpdHMgb3duIHBheWxvYWQgdmFyaWFudC4gYE1ldHJpY1JlY29yZGVyLm9uUGF1c2VgIGlzXG4gKiB0aGUgZXZlcnlkYXkgY2FzZS4gV2Fsa2luZyB0aGUgbGlzdHMgd2l0aG91dCBhIHNoYXJlZCBgc2VlbmAgc2V0IHR1cm5lZFxuICogdGhhdCBpbnRvIGEgRFVQTElDQVRFRCBzbmFwc2hvdCBlbnRyeSAoc2FtZSBpZCB0d2ljZSksIHdoaWNoIGJyZWFrcyBldmVyeVxuICogY29uc3VtZXIgdGhhdCBpbmRleGVzIGBzbmFwc2hvdC5yZWNvcmRlcnNgIGJ5IGlkLlxuICpcbiAqIE9yZGVyaW5nIGlzIHNjb3BlIGxpc3Qg4oaSIGZsb3cgbGlzdCDihpIgZGVmZXJyZWQgdGllciwgYW5kIHRoZSBGSVJTVCBidW5kbGVcbiAqIGZvciBhbiBpZCB3aW5zLiBBIHJlY29yZGVyIHdpdGggbm8gYHRvU25hcHNob3RgIG5ldmVyIGNsYWltcyBhbiBpZCwgc28gaXRcbiAqIGNhbm5vdCBzaGFkb3cgYSBzYW1lLWlkIHJlY29yZGVyIHRoYXQgZG9lcyBoYXZlIG9uZS5cbiAqXG4gKiBUaGUgcm93IGlzIFJFQlVJTFQgZmllbGQgYnkgZmllbGQgYnkgdGhlIG9uZSBjb3BpZXIgKGByZWNvcmRlci9zbmFwc2hvdC50c1xuICogwrcgY29weUJ1bmRsZWAsIHNoYXJlZCB3aXRoIGBDb21wb3NpdGVSZWNvcmRlcmApIHJhdGhlciB0aGFuIHNwcmVhZCwgc28gYVxuICogcmVjb3JkZXIgY2Fubm90IHNtdWdnbGUgYW4gYGlkYCBvZiBpdHMgb3duIGNob29zaW5nIGludG8gdGhlIHNuYXBzaG90ICh0aGVcbiAqIGlkIGlzIHRoZSBleGVjdXRvcidzLCBhbmQgY29uc3VtZXJzIGluZGV4IGJ5IGl0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RSZWNvcmRlclNuYXBzaG90cyhcbiAgb2JzZXJ2ZXJzOiBSdW5PYnNlcnZlcnMsXG4gIGNvbGxlY3RlZD86IChyZWNvcmRlcjogU2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlciwgcm93OiBSZWNvcmRlclNuYXBzaG90KSA9PiB2b2lkLFxuICBpbmNsdWRlQ2FwdHVyZSA9IGZhbHNlLFxuKTogUmVjb3JkZXJTbmFwc2hvdFtdIHtcbiAgY29uc3Qgb3V0OiBSZWNvcmRlclNuYXBzaG90W10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBjb2xsZWN0ID0gKHI6IFNjb3BlUmVjb3JkZXIgfCBGbG93UmVjb3JkZXIpOiB2b2lkID0+IHtcbiAgICBpZiAoIXIudG9TbmFwc2hvdCB8fCBzZWVuLmhhcyhyLmlkKSkgcmV0dXJuO1xuICAgIHNlZW4uYWRkKHIuaWQpO1xuICAgIGNvbnN0IHJvdyA9IGNvcHlCdW5kbGUoci5pZCwgci50b1NuYXBzaG90KCksIGluY2x1ZGVDYXB0dXJlKTtcbiAgICBvdXQucHVzaChyb3cpO1xuICAgIGNvbGxlY3RlZD8uKHIsIHJvdyk7XG4gIH07XG4gIGZvciAoY29uc3QgciBvZiBvYnNlcnZlcnMuc2NvcGVSZWNvcmRlcnMpIGNvbGxlY3Qocik7XG4gIGZvciAoY29uc3QgciBvZiBvYnNlcnZlcnMuZmxvd1JlY29yZGVycykgY29sbGVjdChyKTtcbiAgaWYgKG9ic2VydmVycy5kZWZlcnJlZFRpZXIpIHtcbiAgICBmb3IgKGNvbnN0IHIgb2Ygb2JzZXJ2ZXJzLmRlZmVycmVkVGllci5zY29wZUxpc3RSZWNvcmRlcnMoKSkgY29sbGVjdChyKTtcbiAgICBmb3IgKGNvbnN0IHIgb2Ygb2JzZXJ2ZXJzLmRlZmVycmVkVGllci5mbG93TGlzdFJlY29yZGVycygpKSBjb2xsZWN0KHIpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ import type { StoredLog } from 'foottrace';
2
+ import type { StoredCaptureResult } from './readStoredCapture.js';
3
+ /** @internal Engine-metadata admission after Foottrace's generic record validation. */
4
+ export declare function admitStoredCapture(log: StoredLog, runId: string, maxBytes: number): Promise<StoredCaptureResult>;
@@ -0,0 +1,97 @@
1
+ import { validateAbsentEntries } from '../capture/absentEntries.js';
2
+ import { copyHistoryData, historyDigest } from '../capture/historyData.js';
3
+ import { historyNote } from '../capture/historyNote.js';
4
+ import { copyHistoryReceipt, copyHistoryTarget } from '../capture/historyTarget.js';
5
+ import { CAPTURE_HISTORY_NOTE, CAPTURE_RECEIPT_NOTE } from '../capture/historyTypes.js';
6
+ import { ownData } from '../capture/noteShape.js';
7
+ /** One exact pair only; nothing here interprets commits, causal links or business values. */
8
+ function capturePair(log, runId, maxBytes) {
9
+ const evidence = log.notes.filter((n) => n.kind === CAPTURE_HISTORY_NOTE);
10
+ const receipts = log.notes.filter((n) => n.kind === CAPTURE_RECEIPT_NOTE);
11
+ if (!receipts.length)
12
+ return 'receipt-missing';
13
+ if (evidence.length !== 1 || receipts.length !== 1)
14
+ return 'history-ambiguous';
15
+ const payload = copyHistoryData(evidence[0].data, maxBytes);
16
+ const target = copyHistoryTarget(payload.target);
17
+ if (!target ||
18
+ target.runId !== runId ||
19
+ target.logAddress.logRunId !== runId ||
20
+ target.commits.from !== 0 ||
21
+ target.commits.to !== log.commitLog.length)
22
+ return 'scope-mismatch';
23
+ const receipt = copyHistoryReceipt(receipts[0].data, target);
24
+ if (!receipt)
25
+ return 'receipt-refused';
26
+ const basis = copyHistoryData({ commitLog: log.commitLog, ...(log.initialState !== undefined && { initialState: log.initialState }) }, maxBytes);
27
+ return { payload, target, receipt, basis };
28
+ }
29
+ function captureEnding(log, capture, target) {
30
+ const expected = capture.boundary.status === 'completed' ? 'ok' : capture.boundary.status === 'paused' ? 'paused' : 'failed';
31
+ if (expected !== log.outcome)
32
+ return 'boundary-mismatch';
33
+ let close = -1;
34
+ let closes = 0;
35
+ log.entries.forEach((e, index) => {
36
+ if (e.kind === 'closed') {
37
+ close = index;
38
+ closes++;
39
+ }
40
+ });
41
+ const observation = log.entries.findIndex((e) => e.kind === 'note' && e.note === CAPTURE_HISTORY_NOTE);
42
+ const acknowledgement = log.entries.findIndex((e) => e.kind === 'note' && e.note === CAPTURE_RECEIPT_NOTE);
43
+ if (close < 0 || observation <= close || acknowledgement <= observation)
44
+ return 'sequence-mismatch';
45
+ if (closes !== 1 ||
46
+ ownData(log.meta.closed, 'runId') !== target.runId ||
47
+ ownData(log.meta.opened, 'runId') !== target.runId)
48
+ return 'boundary-mismatch';
49
+ return undefined;
50
+ }
51
+ function captureEvidence(payload, capture) {
52
+ if (!payload.executionTree || typeof payload.executionTree !== 'object' || Array.isArray(payload.executionTree))
53
+ return 'evidence-missing';
54
+ if (capture.channels.control === 'captured' &&
55
+ (!Array.isArray(payload.recorders) ||
56
+ !payload.recorders.some((r) => r?.capture?.runId === capture.runId && r.capture.control === 'captured')))
57
+ return 'recorder-evidence-missing';
58
+ return undefined;
59
+ }
60
+ /** @internal Engine-metadata admission after Foottrace's generic record validation. */
61
+ export async function admitStoredCapture(log, runId, maxBytes) {
62
+ const unknown = (reason) => ({ status: 'unknown', reason });
63
+ const pair = capturePair(log, runId, maxBytes);
64
+ if (typeof pair === 'string')
65
+ return unknown(pair);
66
+ const { payload, target, receipt, basis } = pair;
67
+ const body = {
68
+ capture: payload.capture,
69
+ executionTree: payload.executionTree,
70
+ ...(payload.recorders !== undefined && { recorders: payload.recorders }),
71
+ ...(payload.absent !== undefined && { absent: payload.absent }),
72
+ };
73
+ if ((await historyDigest({ evidence: body, record: basis })) !== target.digest)
74
+ return unknown('evidence-mismatch');
75
+ if (!validateAbsentEntries(payload))
76
+ return unknown('absent-evidence-refused');
77
+ const capture = historyNote(payload.capture, target);
78
+ if (!capture || capture.limitations.includes('resumed-segment'))
79
+ return unknown('capture-refused');
80
+ const refusal = captureEnding(log, capture, target) ?? captureEvidence(payload, capture);
81
+ if (refusal)
82
+ return unknown(refusal);
83
+ return Object.freeze({
84
+ status: 'acknowledged',
85
+ history: Object.freeze({
86
+ runId,
87
+ capture,
88
+ executionTree: payload.executionTree,
89
+ ...(payload.absent !== undefined ? { absent: payload.absent } : {}),
90
+ ...(payload.recorders !== undefined ? { recorders: payload.recorders } : {}),
91
+ commitLog: basis.commitLog,
92
+ ...(basis.initialState && { initialState: basis.initialState }),
93
+ receipt,
94
+ }),
95
+ });
96
+ }
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVkQ2FwdHVyZUFkbWlzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL3N0b3JlZENhcHR1cmVBZG1pc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFcEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFeEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBWWxELDZGQUE2RjtBQUM3RixTQUFTLFdBQVcsQ0FBQyxHQUFjLEVBQUUsS0FBYSxFQUFFLFFBQWdCO0lBQ2xFLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLG9CQUFvQixDQUFDLENBQUM7SUFDMUUsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssb0JBQW9CLENBQUMsQ0FBQztJQUMxRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07UUFBRSxPQUFPLGlCQUFpQixDQUFDO0lBQy9DLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxtQkFBbUIsQ0FBQztJQUMvRSxNQUFNLE9BQU8sR0FBRyxl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QUNyQixLQUFLO1lBQ0wsT0FBTztZQUNQLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBOEI7WUFDckQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBd0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBK0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEcsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQzFCLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMvRCxPQUFPO1NBQ1IsQ0FBQztLQUNILENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgU3RvcmVkTG9nIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHsgdmFsaWRhdGVBYnNlbnRFbnRyaWVzIH0gZnJvbSAnLi4vY2FwdHVyZS9hYnNlbnRFbnRyaWVzLmpzJztcbmltcG9ydCB7IGNvcHlIaXN0b3J5RGF0YSwgaGlzdG9yeURpZ2VzdCB9IGZyb20gJy4uL2NhcHR1cmUvaGlzdG9yeURhdGEuanMnO1xuaW1wb3J0IHsgaGlzdG9yeU5vdGUgfSBmcm9tICcuLi9jYXB0dXJlL2hpc3RvcnlOb3RlLmpzJztcbmltcG9ydCB7IGNvcHlIaXN0b3J5UmVjZWlwdCwgY29weUhpc3RvcnlUYXJnZXQgfSBmcm9tICcuLi9jYXB0dXJlL2hpc3RvcnlUYXJnZXQuanMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlSGlzdG9yeVJlY2VpcHQsIENhcHR1cmVIaXN0b3J5VGFyZ2V0IH0gZnJvbSAnLi4vY2FwdHVyZS9oaXN0b3J5VHlwZXMuanMnO1xuaW1wb3J0IHsgQ0FQVFVSRV9ISVNUT1JZX05PVEUsIENBUFRVUkVfUkVDRUlQVF9OT1RFIH0gZnJvbSAnLi4vY2FwdHVyZS9oaXN0b3J5VHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBOYXRpdmVDYXB0dXJlTm90ZSB9IGZyb20gJy4uL2NhcHR1cmUvbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHsgb3duRGF0YSB9IGZyb20gJy4uL2NhcHR1cmUvbm90ZVNoYXBlLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VTbmFwc2hvdCB9IGZyb20gJy4uL21lbW9yeS9mcmFtZVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkZXJTbmFwc2hvdCB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0b3JlZENhcHR1cmVSZXN1bHQgfSBmcm9tICcuL3JlYWRTdG9yZWRDYXB0dXJlLmpzJztcblxudHlwZSBQYWlyID0ge1xuICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgdGFyZ2V0OiBDYXB0dXJlSGlzdG9yeVRhcmdldDtcbiAgcmVjZWlwdDogQ2FwdHVyZUhpc3RvcnlSZWNlaXB0O1xuICBiYXNpczogeyBjb21taXRMb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdOyBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xufTtcblxuLyoqIE9uZSBleGFjdCBwYWlyIG9ubHk7IG5vdGhpbmcgaGVyZSBpbnRlcnByZXRzIGNvbW1pdHMsIGNhdXNhbCBsaW5rcyBvciBidXNpbmVzcyB2YWx1ZXMuICovXG5mdW5jdGlvbiBjYXB0dXJlUGFpcihsb2c6IFN0b3JlZExvZywgcnVuSWQ6IHN0cmluZywgbWF4Qnl0ZXM6IG51bWJlcik6IFBhaXIgfCBzdHJpbmcge1xuICBjb25zdCBldmlkZW5jZSA9IGxvZy5ub3Rlcy5maWx0ZXIoKG4pID0+IG4ua2luZCA9PT0gQ0FQVFVSRV9ISVNUT1JZX05PVEUpO1xuICBjb25zdCByZWNlaXB0cyA9IGxvZy5ub3Rlcy5maWx0ZXIoKG4pID0+IG4ua2luZCA9PT0gQ0FQVFVSRV9SRUNFSVBUX05PVEUpO1xuICBpZiAoIXJlY2VpcHRzLmxlbmd0aCkgcmV0dXJuICdyZWNlaXB0LW1pc3NpbmcnO1xuICBpZiAoZXZpZGVuY2UubGVuZ3RoICE9PSAxIHx8IHJlY2VpcHRzLmxlbmd0aCAhPT0gMSkgcmV0dXJuICdoaXN0b3J5LWFtYmlndW91cyc7XG4gIGNvbnN0IHBheWxvYWQgPSBjb3B5SGlzdG9yeURhdGEoZXZpZGVuY2VbMF0hLmRhdGEsIG1heEJ5dGVzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgdGFyZ2V0ID0gY29weUhpc3RvcnlUYXJnZXQocGF5bG9hZC50YXJnZXQpO1xuICBpZiAoXG4gICAgIXRhcmdldCB8fFxuICAgIHRhcmdldC5ydW5JZCAhPT0gcnVuSWQgfHxcbiAgICB0YXJnZXQubG9nQWRkcmVzcy5sb2dSdW5JZCAhPT0gcnVuSWQgfHxcbiAgICB0YXJnZXQuY29tbWl0cy5mcm9tICE9PSAwIHx8XG4gICAgdGFyZ2V0LmNvbW1pdHMudG8gIT09IGxvZy5jb21taXRMb2cubGVuZ3RoXG4gIClcbiAgICByZXR1cm4gJ3Njb3BlLW1pc21hdGNoJztcbiAgY29uc3QgcmVjZWlwdCA9IGNvcHlIaXN0b3J5UmVjZWlwdChyZWNlaXB0c1swXSEuZGF0YSwgdGFyZ2V0KTtcbiAgaWYgKCFyZWNlaXB0KSByZXR1cm4gJ3JlY2VpcHQtcmVmdXNlZCc7XG4gIGNvbnN0IGJhc2lzID0gY29weUhpc3RvcnlEYXRhKFxuICAgIHsgY29tbWl0TG9nOiBsb2cuY29tbWl0TG9nLCAuLi4obG9nLmluaXRpYWxTdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHsgaW5pdGlhbFN0YXRlOiBsb2cuaW5pdGlhbFN0YXRlIH0pIH0sXG4gICAgbWF4Qnl0ZXMsXG4gICkgYXMgUGFpclsnYmFzaXMnXTtcbiAgcmV0dXJuIHsgcGF5bG9hZCwgdGFyZ2V0LCByZWNlaXB0LCBiYXNpcyB9O1xufVxuXG5mdW5jdGlvbiBjYXB0dXJlRW5kaW5nKGxvZzogU3RvcmVkTG9nLCBjYXB0dXJlOiBOYXRpdmVDYXB0dXJlTm90ZSwgdGFyZ2V0OiBDYXB0dXJlSGlzdG9yeVRhcmdldCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGV4cGVjdGVkID1cbiAgICBjYXB0dXJlLmJvdW5kYXJ5LnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcgPyAnb2snIDogY2FwdHVyZS5ib3VuZGFyeS5zdGF0dXMgPT09ICdwYXVzZWQnID8gJ3BhdXNlZCcgOiAnZmFpbGVkJztcbiAgaWYgKGV4cGVjdGVkICE9PSBsb2cub3V0Y29tZSkgcmV0dXJuICdib3VuZGFyeS1taXNtYXRjaCc7XG4gIGxldCBjbG9zZSA9IC0xO1xuICBsZXQgY2xvc2VzID0gMDtcbiAgbG9nLmVudHJpZXMuZm9yRWFjaCgoZSwgaW5kZXgpID0+IHtcbiAgICBpZiAoZS5raW5kID09PSAnY2xvc2VkJykge1xuICAgICAgY2xvc2UgPSBpbmRleDtcbiAgICAgIGNsb3NlcysrO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IG9ic2VydmF0aW9uID0gbG9nLmVudHJpZXMuZmluZEluZGV4KChlKSA9PiBlLmtpbmQgPT09ICdub3RlJyAmJiBlLm5vdGUgPT09IENBUFRVUkVfSElTVE9SWV9OT1RFKTtcbiAgY29uc3QgYWNrbm93bGVkZ2VtZW50ID0gbG9nLmVudHJpZXMuZmluZEluZGV4KChlKSA9PiBlLmtpbmQgPT09ICdub3RlJyAmJiBlLm5vdGUgPT09IENBUFRVUkVfUkVDRUlQVF9OT1RFKTtcbiAgaWYgKGNsb3NlIDwgMCB8fCBvYnNlcnZhdGlvbiA8PSBjbG9zZSB8fCBhY2tub3dsZWRnZW1lbnQgPD0gb2JzZXJ2YXRpb24pIHJldHVybiAnc2VxdWVuY2UtbWlzbWF0Y2gnO1xuICBpZiAoXG4gICAgY2xvc2VzICE9PSAxIHx8XG4gICAgb3duRGF0YShsb2cubWV0YS5jbG9zZWQsICdydW5JZCcpICE9PSB0YXJnZXQucnVuSWQgfHxcbiAgICBvd25EYXRhKGxvZy5tZXRhLm9wZW5lZCwgJ3J1bklkJykgIT09IHRhcmdldC5ydW5JZFxuICApXG4gICAgcmV0dXJuICdib3VuZGFyeS1taXNtYXRjaCc7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVFdmlkZW5jZShwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgY2FwdHVyZTogTmF0aXZlQ2FwdHVyZU5vdGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXBheWxvYWQuZXhlY3V0aW9uVHJlZSB8fCB0eXBlb2YgcGF5bG9hZC5leGVjdXRpb25UcmVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHBheWxvYWQuZXhlY3V0aW9uVHJlZSkpXG4gICAgcmV0dXJuICdldmlkZW5jZS1taXNzaW5nJztcbiAgaWYgKFxuICAgIGNhcHR1cmUuY2hhbm5lbHMuY29udHJvbCA9PT0gJ2NhcHR1cmVkJyAmJlxuICAgICghQXJyYXkuaXNBcnJheShwYXlsb2FkLnJlY29yZGVycykgfHxcbiAgICAgICFwYXlsb2FkLnJlY29yZGVycy5zb21lKChyKSA9PiByPy5jYXB0dXJlPy5ydW5JZCA9PT0gY2FwdHVyZS5ydW5JZCAmJiByLmNhcHR1cmUuY29udHJvbCA9PT0gJ2NhcHR1cmVkJykpXG4gIClcbiAgICByZXR1cm4gJ3JlY29yZGVyLWV2aWRlbmNlLW1pc3NpbmcnO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogQGludGVybmFsIEVuZ2luZS1tZXRhZGF0YSBhZG1pc3Npb24gYWZ0ZXIgRm9vdHRyYWNlJ3MgZ2VuZXJpYyByZWNvcmQgdmFsaWRhdGlvbi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZG1pdFN0b3JlZENhcHR1cmUoXG4gIGxvZzogU3RvcmVkTG9nLFxuICBydW5JZDogc3RyaW5nLFxuICBtYXhCeXRlczogbnVtYmVyLFxuKTogUHJvbWlzZTxTdG9yZWRDYXB0dXJlUmVzdWx0PiB7XG4gIGNvbnN0IHVua25vd24gPSAocmVhc29uOiBzdHJpbmcpOiBTdG9yZWRDYXB0dXJlUmVzdWx0ID0+ICh7IHN0YXR1czogJ3Vua25vd24nLCByZWFzb24gfSk7XG4gIGNvbnN0IHBhaXIgPSBjYXB0dXJlUGFpcihsb2csIHJ1bklkLCBtYXhCeXRlcyk7XG4gIGlmICh0eXBlb2YgcGFpciA9PT0gJ3N0cmluZycpIHJldHVybiB1bmtub3duKHBhaXIpO1xuICBjb25zdCB7IHBheWxvYWQsIHRhcmdldCwgcmVjZWlwdCwgYmFzaXMgfSA9IHBhaXI7XG4gIGNvbnN0IGJvZHkgPSB7XG4gICAgY2FwdHVyZTogcGF5bG9hZC5jYXB0dXJlLFxuICAgIGV4ZWN1dGlvblRyZWU6IHBheWxvYWQuZXhlY3V0aW9uVHJlZSxcbiAgICAuLi4ocGF5bG9hZC5yZWNvcmRlcnMgIT09IHVuZGVmaW5lZCAmJiB7IHJlY29yZGVyczogcGF5bG9hZC5yZWNvcmRlcnMgfSksXG4gICAgLi4uKHBheWxvYWQuYWJzZW50ICE9PSB1bmRlZmluZWQgJiYgeyBhYnNlbnQ6IHBheWxvYWQuYWJzZW50IH0pLFxuICB9O1xuICBpZiAoKGF3YWl0IGhpc3RvcnlEaWdlc3QoeyBldmlkZW5jZTogYm9keSwgcmVjb3JkOiBiYXNpcyB9KSkgIT09IHRhcmdldC5kaWdlc3QpIHJldHVybiB1bmtub3duKCdldmlkZW5jZS1taXNtYXRjaCcpO1xuICBpZiAoIXZhbGlkYXRlQWJzZW50RW50cmllcyhwYXlsb2FkKSkgcmV0dXJuIHVua25vd24oJ2Fic2VudC1ldmlkZW5jZS1yZWZ1c2VkJyk7XG4gIGNvbnN0IGNhcHR1cmUgPSBoaXN0b3J5Tm90ZShwYXlsb2FkLmNhcHR1cmUsIHRhcmdldCk7XG4gIGlmICghY2FwdHVyZSB8fCBjYXB0dXJlLmxpbWl0YXRpb25zLmluY2x1ZGVzKCdyZXN1bWVkLXNlZ21lbnQnKSkgcmV0dXJuIHVua25vd24oJ2NhcHR1cmUtcmVmdXNlZCcpO1xuICBjb25zdCByZWZ1c2FsID0gY2FwdHVyZUVuZGluZyhsb2csIGNhcHR1cmUsIHRhcmdldCkgPz8gY2FwdHVyZUV2aWRlbmNlKHBheWxvYWQsIGNhcHR1cmUpO1xuICBpZiAocmVmdXNhbCkgcmV0dXJuIHVua25vd24ocmVmdXNhbCk7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBzdGF0dXM6ICdhY2tub3dsZWRnZWQnLFxuICAgIGhpc3Rvcnk6IE9iamVjdC5mcmVlemUoe1xuICAgICAgcnVuSWQsXG4gICAgICBjYXB0dXJlLFxuICAgICAgZXhlY3V0aW9uVHJlZTogcGF5bG9hZC5leGVjdXRpb25UcmVlIGFzIFN0YWdlU25hcHNob3QsXG4gICAgICAuLi4ocGF5bG9hZC5hYnNlbnQgIT09IHVuZGVmaW5lZCA/IHsgYWJzZW50OiBwYXlsb2FkLmFic2VudCBhcyByZWFkb25seSAocmVhZG9ubHkgc3RyaW5nW10pW10gfSA6IHt9KSxcbiAgICAgIC4uLihwYXlsb2FkLnJlY29yZGVycyAhPT0gdW5kZWZpbmVkID8geyByZWNvcmRlcnM6IHBheWxvYWQucmVjb3JkZXJzIGFzIFJlY29yZGVyU25hcHNob3RbXSB9IDoge30pLFxuICAgICAgY29tbWl0TG9nOiBiYXNpcy5jb21taXRMb2csXG4gICAgICAuLi4oYmFzaXMuaW5pdGlhbFN0YXRlICYmIHsgaW5pdGlhbFN0YXRlOiBiYXNpcy5pbml0aWFsU3RhdGUgfSksXG4gICAgICByZWNlaXB0LFxuICAgIH0pLFxuICB9KTtcbn1cbiJdfQ==
@@ -42,6 +42,7 @@
42
42
  * `readStoredRecord`); for richer values, bring an adapter with a richer encoding.
43
43
  */
44
44
  import type { RecordSink } from 'foottrace/write';
45
+ import type { CaptureHistoryOptions } from '../capture/historyTypes.js';
45
46
  /** The default cap on a record file: 64 MiB. */
46
47
  export declare const DEFAULT_FILE_SINK_MAX_BYTES: number;
47
48
  /** The default cap on ONE entry's line: 8 MiB. */
@@ -69,7 +70,7 @@ export interface FileSinkOptions {
69
70
  readonly flushTimeoutMs?: number;
70
71
  }
71
72
  /** A record sink that appends to one file — `RecordSink` plus what the app needs to manage the file. */
72
- export interface FileSink extends RecordSink {
73
+ export interface FileSink extends RecordSink, Pick<CaptureHistoryOptions, 'acknowledge'> {
73
74
  /** The absolute path the sink writes to — resolved once, when it was made. */
74
75
  readonly path: string;
75
76
  /**