footprintjs 9.33.0 → 9.35.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.
- package/dist/advanced.js +41 -38
- package/dist/esm/advanced.d.ts +3 -0
- package/dist/esm/advanced.js +2 -1
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +0 -12
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +70 -88
- package/dist/esm/lib/engine/handlers/SubflowInputMapper.d.ts +4 -1
- package/dist/esm/lib/engine/handlers/SubflowInputMapper.js +15 -2
- package/dist/esm/lib/engine/types.d.ts +7 -6
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.d.ts +69 -99
- package/dist/esm/lib/memory/StageContext.js +115 -141
- package/dist/esm/lib/memory/index.d.ts +2 -0
- package/dist/esm/lib/memory/index.js +2 -1
- package/dist/esm/lib/memory/runPolicy.d.ts +151 -0
- package/dist/esm/lib/memory/runPolicy.js +70 -0
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +45 -59
- package/dist/esm/lib/runner/ExecutionRuntime.js +80 -85
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +6 -90
- package/dist/esm/lib/runner/FlowChartExecutor.js +22 -65
- package/dist/esm/lib/time-travel/commitStops.js +46 -8
- package/dist/esm/lib/time-travel/timeTravel.js +2 -2
- package/dist/esm/lib/time-travel/types.d.ts +4 -3
- package/dist/esm/lib/time-travel/types.js +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/engine/handlers/SubflowExecutor.js +71 -89
- package/dist/lib/engine/handlers/SubflowInputMapper.js +15 -2
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/memory/StageContext.js +115 -141
- package/dist/lib/memory/index.js +5 -2
- package/dist/lib/memory/runPolicy.js +77 -0
- package/dist/lib/runner/ExecutionRuntime.js +80 -85
- package/dist/lib/runner/FlowChartExecutor.js +22 -65
- package/dist/lib/time-travel/commitStops.js +46 -8
- package/dist/lib/time-travel/timeTravel.js +2 -2
- package/dist/lib/time-travel/types.js +1 -1
- package/dist/types/advanced.d.ts +3 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +0 -12
- package/dist/types/lib/engine/handlers/SubflowInputMapper.d.ts +4 -1
- package/dist/types/lib/engine/types.d.ts +7 -6
- package/dist/types/lib/memory/StageContext.d.ts +69 -99
- package/dist/types/lib/memory/index.d.ts +2 -0
- package/dist/types/lib/memory/runPolicy.d.ts +151 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +45 -59
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +6 -90
- package/dist/types/lib/time-travel/types.d.ts +4 -3
- package/package.json +1 -1
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* (via SubflowTraverserFactory), so deciders, selectors, loops, lazy subflows,
|
|
13
13
|
* and abort signals all work inside subflows automatically.
|
|
14
14
|
*/
|
|
15
|
+
import { DEFAULT_RUN_POLICY } from '../../memory/runPolicy.js';
|
|
15
16
|
import { isPauseSignal } from '../../pause/types.js';
|
|
16
17
|
import { ResumeEntry } from './ResumeEntry.js';
|
|
17
18
|
import { rememberRedactedSubflowState } from './servedSubflowResults.js';
|
|
@@ -124,20 +125,17 @@ export class SubflowExecutor {
|
|
|
124
125
|
throw error;
|
|
125
126
|
}
|
|
126
127
|
}
|
|
127
|
-
// The run's
|
|
128
|
-
//
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
|
|
133
|
-
//
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
// scrubbed log — and never a second scrub. No policy: no mirror, no
|
|
139
|
-
// allocation, and the served state is the raw heap it always was.
|
|
140
|
-
const keepsMirror = parentContext.getRedactedSharedMemory?.() !== undefined;
|
|
128
|
+
// The run's policy (F5) — the four dials, the redaction rule, the mirror
|
|
129
|
+
// flag — read off the parent-mount frame, which holds it by reference.
|
|
130
|
+
// The nested runtime is constructed WITH it, so the seed commit below
|
|
131
|
+
// (`history[0]`) and every later commit of the subflow run under the same
|
|
132
|
+
// object, and the nested runtime keeps a mirror of its own exactly when
|
|
133
|
+
// the run does (its SERVED state is then the fold of its own scrubbed
|
|
134
|
+
// log, never a second scrub).
|
|
135
|
+
// Tolerant of a hand-built frame or runtime without the policy door (9.34.0 shape): the
|
|
136
|
+
// runtime root's policy, else the defaults.
|
|
137
|
+
const policy = parentContext.getPolicy?.() ?? this.deps.executionRuntime.rootStageContext?.getPolicy?.() ?? DEFAULT_RUN_POLICY;
|
|
138
|
+
const redactionRule = policy.redaction;
|
|
141
139
|
// Narrative receives the RETAINED form of the mapped input — an
|
|
142
140
|
// inputMapper may inject values from anywhere, so the seed is scrubbed
|
|
143
141
|
// under the policy before any recorder sees it. Same object when nothing
|
|
@@ -161,8 +159,8 @@ export class SubflowExecutor {
|
|
|
161
159
|
// resume hop's entry on a re-entry, the subflow's root otherwise.
|
|
162
160
|
const ExecutionRuntimeClass = this.deps.executionRuntime.constructor;
|
|
163
161
|
const firstNode = resumeHop?.entry ?? node;
|
|
164
|
-
const nestedRuntime = new ExecutionRuntimeClass(firstNode.name, firstNode.id);
|
|
165
|
-
|
|
162
|
+
const nestedRuntime = new ExecutionRuntimeClass(firstNode.name, firstNode.id, undefined, undefined, policy);
|
|
163
|
+
adoptPolicy(nestedRuntime, nestedRuntime.rootStageContext, policy);
|
|
166
164
|
// Seed GlobalStore with the right shape for the path:
|
|
167
165
|
// • Resume into THIS subflow → seed from the captured pre-pause
|
|
168
166
|
// scope so resume handlers see history, pausedToolCallId, etc.
|
|
@@ -171,56 +169,23 @@ export class SubflowExecutor {
|
|
|
171
169
|
const seedValues = isResumeForThisSubflow ? resumeCapture : mappedInput;
|
|
172
170
|
if (Object.keys(seedValues).length > 0) {
|
|
173
171
|
// The seed is committed as the subflow's `history[0]` by its root
|
|
174
|
-
// context, not by a facade —
|
|
175
|
-
//
|
|
176
|
-
//
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
//
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
// circular import) — and skipped at the default 'full', where the fresh
|
|
192
|
-
// nested context is already correct, so the default path does zero work.
|
|
193
|
-
const parentReadTracking = parentContext.getReadTracking?.();
|
|
194
|
-
if (parentReadTracking !== undefined && parentReadTracking !== 'full') {
|
|
195
|
-
nestedRootContext.useReadTracking(parentReadTracking);
|
|
196
|
-
}
|
|
197
|
-
// Redaction rule (9.19.0) and mirror (9.20.0): same hop as the dials,
|
|
198
|
-
// applied to the FINAL nested root (the seeding block above may have
|
|
199
|
-
// replaced it) so every stage context the subflow creates inherits both.
|
|
200
|
-
this.inheritRedaction(nestedRuntime, nestedRootContext, redactionRule, keepsMirror);
|
|
201
|
-
// Write-tracking policy (#13c-A): same inheritance hop as readTracking
|
|
202
|
-
// above — subflow runtimes are isolated, so the parent-mount context's
|
|
203
|
-
// mode is pushed into the FINAL nested root with the same duck-type
|
|
204
|
-
// guard and the same skip-at-default fast path.
|
|
205
|
-
const parentWriteTracking = parentContext.getWriteTracking?.();
|
|
206
|
-
if (parentWriteTracking !== undefined && parentWriteTracking !== 'full') {
|
|
207
|
-
nestedRootContext.useWriteTracking(parentWriteTracking);
|
|
208
|
-
}
|
|
209
|
-
// Commit-values encoding (#13c-B): same inheritance hop as the two
|
|
210
|
-
// tracking dials above — subflow runtimes are isolated, so the
|
|
211
|
-
// parent-mount context's mode is pushed into the FINAL nested root with
|
|
212
|
-
// the same duck-type guard and the same skip-at-default fast path, so
|
|
213
|
-
// nested charts commit in the same encoding as the parent.
|
|
214
|
-
const parentCommitValues = parentContext.getCommitValues?.();
|
|
215
|
-
if (parentCommitValues !== undefined && parentCommitValues !== 'full') {
|
|
216
|
-
nestedRootContext.useCommitValues(parentCommitValues);
|
|
217
|
-
}
|
|
218
|
-
// Per-write read provenance (#P1): fourth dial, same inheritance hop —
|
|
219
|
-
// duck-type guard, skip-at-default ('off') fast path, so nested charts
|
|
220
|
-
// stamp TraceEntry.readKeys exactly when the parent does.
|
|
221
|
-
const parentWriteProvenance = parentContext.getWriteProvenance?.();
|
|
222
|
-
if (parentWriteProvenance !== undefined && parentWriteProvenance !== 'off') {
|
|
223
|
-
nestedRootContext.useWriteProvenance(parentWriteProvenance);
|
|
172
|
+
// context, not by a facade — that frame already holds the run's policy
|
|
173
|
+
// (the runtime was constructed with it), so the seed retains under the
|
|
174
|
+
// rule, lands in the mirror as the placeholder, and commits under the
|
|
175
|
+
// run's dials like every other write (C-F5: under `writeProvenance:
|
|
176
|
+
// 'reads-prefix'` its rows carry `readKeys: []`).
|
|
177
|
+
// The seed is the mount's act too: its bundle — `history[0]` of the
|
|
178
|
+
// subflow's own log — carries the mount's stage, stageId and
|
|
179
|
+
// runtimeStageId (R13; through 9.33.0 it carried runtimeStageId '' and
|
|
180
|
+
// the first stage's names, which on a resume was the re-entry point).
|
|
181
|
+
seedSubflowGlobalStore(nestedRuntime, seedValues, parentContext);
|
|
182
|
+
// Refresh rootStageContext so WriteBuffer sees committed data. Named
|
|
183
|
+
// after the first node again — the seed context now carries the mount's
|
|
184
|
+
// names (R13), which belong to the seed bundle only. `newRoot` gives it
|
|
185
|
+
// the same policy and mirror.
|
|
186
|
+
nestedRuntime.rootStageContext = nestedRuntime.newRoot
|
|
187
|
+
? nestedRuntime.newRoot(firstNode.name, firstNode.id)
|
|
188
|
+
: freshRoot(nestedRuntime, nestedRuntime.rootStageContext, firstNode, policy);
|
|
224
189
|
}
|
|
225
190
|
// Prepare subflow root node — strip isSubflowRoot to prevent re-delegation.
|
|
226
191
|
//
|
|
@@ -334,9 +299,15 @@ export class SubflowExecutor {
|
|
|
334
299
|
// ─── Output Mapping ───
|
|
335
300
|
if (!subflowError && mountOptions?.outputMapper) {
|
|
336
301
|
try {
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
302
|
+
// The merge-back is the MOUNT's act, so the mount's frame stages and
|
|
303
|
+
// commits it — its bundle carries the mount's runtimeStageId (R13).
|
|
304
|
+
// A branch or fork-child mount still lands its values where its
|
|
305
|
+
// parent writes (the parent's run namespace), as before; until 9.33.0
|
|
306
|
+
// it committed ON the parent's frame, so the bundle named the stage
|
|
307
|
+
// before the mount, or the branching decider.
|
|
308
|
+
const outputContext = parentContext;
|
|
309
|
+
if (parentContext.branchId && parentContext.parent) {
|
|
310
|
+
outputContext.useAddressOf(parentContext.parent);
|
|
340
311
|
}
|
|
341
312
|
const parentScope = outputContext.getScope();
|
|
342
313
|
// For TypedScope subflows, stage functions return void — fall back to a shallow clone
|
|
@@ -355,6 +326,14 @@ export class SubflowExecutor {
|
|
|
355
326
|
outputContext.commit();
|
|
356
327
|
}
|
|
357
328
|
catch (error) {
|
|
329
|
+
// A merge-back that failed to commit (an uncloneable value) leaves its
|
|
330
|
+
// writes staged on the mount's frame; the mount's exit commit below
|
|
331
|
+
// would throw them again, outside this catch. Through 9.33.0 they
|
|
332
|
+
// were staged on the parent's frame, which was not committed again,
|
|
333
|
+
// so the run went on — drop them, as it did. A linear mount's frame
|
|
334
|
+
// is left as it always was.
|
|
335
|
+
if (parentContext.branchId && parentContext.parent)
|
|
336
|
+
parentContext.discardStaged();
|
|
358
337
|
parentContext.addError('outputMapperError', error.toString());
|
|
359
338
|
this.deps.logger.error(`Error in outputMapper for subflow (${subflowId}):`, { error });
|
|
360
339
|
}
|
|
@@ -411,25 +390,28 @@ export class SubflowExecutor {
|
|
|
411
390
|
}
|
|
412
391
|
return subflowOutput;
|
|
413
392
|
}
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
if (rule)
|
|
427
|
-
root.useRedactionRule(rule);
|
|
428
|
-
if (!keepsMirror)
|
|
429
|
-
return;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* A custom runtime class (9.34.0 shape) may ignore the constructor's policy argument: hand its
|
|
396
|
+
* root the policy — and its mirror, when the policy keeps one — as the old per-dial push did.
|
|
397
|
+
* A no-op for `ExecutionRuntime`, whose root already holds it.
|
|
398
|
+
*/
|
|
399
|
+
function adoptPolicy(runtime, root, policy) {
|
|
400
|
+
if (root.getPolicy?.() !== policy)
|
|
401
|
+
root.usePolicy?.(policy);
|
|
402
|
+
if (!policy.mirror)
|
|
403
|
+
return;
|
|
404
|
+
if (!runtime.redactedStore)
|
|
430
405
|
runtime.enableRedactedMirror?.();
|
|
431
|
-
|
|
432
|
-
|
|
406
|
+
if (runtime.redactedStore && root.getRedactedSharedMemory?.() !== runtime.redactedStore) {
|
|
407
|
+
root.useRedactedMirror?.(runtime.redactedStore);
|
|
433
408
|
}
|
|
434
409
|
}
|
|
435
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFJSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFVckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzVHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBOEI7SUFDdkQsSUFBSSxHQUF3QyxDQUFDO0lBQzdDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFBRSxTQUFTO1FBQ25DLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDO0FBQ3RCLENBQUM7QUFFRCx5R0FBeUc7QUFDekcsU0FBUyxZQUFZLENBQUMsS0FBYztJQUNsQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxJ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QUFJLG1CQUFtQixJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzdELGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRUQsYUFBYSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxXQUFXLFdBQVcsVUFBVSxFQUFFO1lBQzdFLFdBQVcsRUFBRSxTQUFTO1NBQ3ZCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFdEcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRXZCLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsTUFBTSxZQUFZLENBQUM7UUFDckIsQ0FBQztRQUVELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ssZ0JBQWdCLENBQ3RCLE9BQTBCLEVBQzFCLElBQWtCLEVBQ2xCLElBQStCLEVBQy9CLFdBQW9CO1FBRXBCLElBQUksSUFBSTtZQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU87UUFDekIsT0FBTyxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQztRQUNqQyxJQUFJLE9BQU8sQ0FBQyxhQUFhO1lBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMzRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN1YmZsb3dFeGVjdXRvciDigJQgSXNvbGF0aW9uIGJvdW5kYXJ5IGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBDcmVhdGUgaXNvbGF0ZWQgRXhlY3V0aW9uUnVudGltZSBmb3IgZWFjaCBzdWJmbG93XG4gKiAtIEFwcGx5IGlucHV0L291dHB1dCBtYXBwaW5nIHZpYSBTdWJmbG93SW5wdXRNYXBwZXJcbiAqIC0gRGVsZWdhdGUgdHJhdmVyc2FsIHRvIGEgZmFjdG9yeS1jcmVhdGVkIEZsb3djaGFydFRyYXZlcnNlclxuICogLSBUcmFjayBzdWJmbG93IHJlc3VsdHMgZm9yIGRlYnVnZ2luZy92aXN1YWxpemF0aW9uXG4gKlxuICogRWFjaCBzdWJmbG93IGdldHMgaXRzIG93biBHbG9iYWxTdG9yZSBmb3IgaXNvbGF0aW9uLlxuICogVHJhdmVyc2FsIHVzZXMgdGhlIFNBTUUgNy1waGFzZSBhbGdvcml0aG0gYXMgdGhlIHRvcC1sZXZlbCB0cmF2ZXJzZXJcbiAqICh2aWEgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkpLCBzbyBkZWNpZGVycywgc2VsZWN0b3JzLCBsb29wcywgbGF6eSBzdWJmbG93cyxcbiAqIGFuZCBhYm9ydCBzaWduYWxzIGFsbCB3b3JrIGluc2lkZSBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4uLy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIFN1YmZsb3dSZXN1bHQsXG4gIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LFxuICBTdWJmbG93VHJhdmVyc2VySGFuZGxlLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBSZXN1bWVFbnRyeSB9IGZyb20gJy4vUmVzdW1lRW50cnkuanMnO1xuaW1wb3J0IHsgcmVtZW1iZXJSZWRhY3RlZFN1YmZsb3dTdGF0ZSB9IGZyb20gJy4vc2VydmVkU3ViZmxvd1Jlc3VsdHMuanMnO1xuaW1wb3J0IHsgYXBwbHlPdXRwdXRNYXBwaW5nLCBnZXRJbml0aWFsU2NvcGVWYWx1ZXMsIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUgfSBmcm9tICcuL1N1YmZsb3dJbnB1dE1hcHBlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSBtYXBwZWQgaW5wdXQsIGRldGFjaGVkIGZyb20gdGhlIHBhcmVudCdzIHN0YXRlIE9OQ0UgcGVyIG1vdW50IChEMSxcbiAqIDkuMjkuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1jb3B5LW9uLXdyaXRlLWNvbW1pdC5tZCkuXG4gKlxuICogVGhlIGlucHV0TWFwcGVyIHJlYWRzIHRoZSBwYXJlbnQncyBMSVZFIHN0YXRlIChgZ2V0U2NvcGUoKWApLCBzbyBhIHZhbHVlIGl0XG4gKiBwYXNzZXMgdGhyb3VnaCAoYChwKSA9PiAoeyBjZmc6IHAuY2ZnIH0pYCkgaXMgdGhlIHBhcmVudCdzIGNvbW1pdHRlZFxuICogb2JqZWN0IOKAlCBhbmQgdGhlIHN1YmZsb3cncyBhcmdzIGFyZSBkZWVwLUZST1pFTiBpbiBwbGFjZVxuICogKGByZWFkb25seUlucHV0IMK3IGNyZWF0ZUZyb3plbkFyZ3NgKS4gVGhlIHR5cGVkIHNjb3BlIGRvZXMgbm90IHByb3h5IGFcbiAqIGZyb3plbiB2YWx1ZSAoYGFsbG93bGlzdCDCtyBzaG91bGRXcmFwV2l0aFByb3h5YCksIHNvIGEgbGF0ZXJcbiAqIGBzY29wZS5jZmcueCA9IDFgIGluIHRoZSBwYXJlbnQgbWV0IHRoZSByYXcgZnJvemVuIG9iamVjdDogYSBUeXBlRXJyb3IgaW5cbiAqIHN0cmljdCBjb2RlLiBCZWZvcmUgOS4yOS4wIHRoZSBwYXJlbnQncyBuZXh0IHdob2xlLXN0YXRlIGNsb25lIHJlcGxhY2VkIHRoZVxuICogZnJvemVuIG9iamVjdCAoYSBtb3VudCB0aGF0IGNvbW1pdHRlZCBub3RoaW5nIGxlZnQgaXQgaW4gcGxhY2Ug4oCUIHRoZSBidWdcbiAqIGV4aXN0ZWQsIGl0IHdhcyBvbmx5IHNob3J0LWxpdmVkKTsgdW5kZXIgY29weS1vbi13cml0ZSBub3RoaW5nIHJlLWNsb25lcyxcbiAqIHNvIHRoZSBmcmVlemUgd291bGQgbGFzdCB1bnRpbCB0aGUga2V5IGlzIHJld3JpdHRlbi4gQSBtb3VudCBtdXN0IG5ldmVyXG4gKiBlZGl0IOKAlCBvciBmcmVlemUg4oCUIHRoZSBwYXJlbnQncyBjb21taXR0ZWQgb2JqZWN0czogZXZlcnkgcGxhaW4gb2JqZWN0LFxuICogYXJyYXksIGBEYXRlYCwgYE1hcGAgYW5kIGBTZXRgIHRoZSBtYXBwZXIgcmV0dXJucyBpcyBjbG9uZWQgaGVyZSwgYmVmb3JlIGl0XG4gKiBiZWNvbWVzIHRoZSBhcmdzLiBBIGNsYXNzIGluc3RhbmNlIHBhc3NlcyBieSByZWZlcmVuY2UsIGFzIGJlZm9yZSAoaXRcbiAqIGNhbm5vdCBjb21lIGZyb20gY29tbWl0dGVkIHN0YXRlLCBhbmQgYSBjbG9uZSB3b3VsZCBkcm9wIGl0cyBwcm90b3R5cGUpLlxuICogVGhlIHNlZWQgaXMgY2xvbmVkIGFnYWluIGF0IGl0cyBjb21taXQsIHNvIHRoZSBzdWJmbG93J3Mgc3RhdGUgaXNcbiAqIHVuY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gZGV0YWNoTWFwcGVkSW5wdXQoaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG4gICAgaWYgKCFpc0RldGFjaGFibGUodmFsdWUpKSBjb250aW51ZTtcbiAgICAob3V0ID8/PSB7IC4uLmlucHV0IH0pW2tleV0gPSBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9XG4gIHJldHVybiBvdXQgPz8gaW5wdXQ7XG59XG5cbi8qKiBBIHZhbHVlIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJlcHJvZHVjZXMgd2l0aCBpdHMgb3duIHR5cGU6IHBsYWluIG9iamVjdCwgYXJyYXksIGBEYXRlYCwgYE1hcGAsIGBTZXRgLiAqL1xuZnVuY3Rpb24gaXNEZXRhY2hhYmxlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXAgfHwgdmFsdWUgaW5zdGFuY2VvZiBTZXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIFN1YmZsb3dFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSAoYGRlcHMucmVzdW1lYCksIG9yIGEgc2VlZC1vbmx5IG9uZSBidWlsdFxuICAgKiBmcm9tIHRoZSBkZXByZWNhdGVkIGBkZXBzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWVgLiBVbmRlZmluZWQgb24gYSBub3JtYWxcbiAgICogcnVuLiBBc2tlZCBvbmNlIHBlciBzdWJmbG93IGVudHJ5IOKAlCBzZWUge0BsaW5rIFJlc3VtZUVudHJ5fS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzdW1lOiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGVwczogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPixcbiAgICBwcml2YXRlIHRyYXZlcnNlckZhY3Rvcnk6IFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5PFRPdXQsIFRTY29wZT4sXG4gICkge1xuICAgIHRoaXMucmVzdW1lID1cbiAgICAgIGRlcHMucmVzdW1lID8/XG4gICAgICAoZGVwcy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lID8gUmVzdW1lRW50cnkuZnJvbUNhcHR1cmVzPFRPdXQsIFRTY29wZT4oZGVwcy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lKSA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHN1YmZsb3cgd2l0aCBpc29sYXRlZCBjb250ZXh0LlxuICAgKlxuICAgKiAxLiBDcmVhdGVzIGEgZnJlc2ggRXhlY3V0aW9uUnVudGltZSBmb3IgdGhlIHN1YmZsb3dcbiAgICogMi4gQXBwbGllcyBpbnB1dCBtYXBwaW5nIHRvIHNlZWQgdGhlIHN1YmZsb3cncyBHbG9iYWxTdG9yZVxuICAgKiAzLiBEZWxlZ2F0ZXMgdHJhdmVyc2FsIHRvIGEgZmFjdG9yeS1jcmVhdGVkIEZsb3djaGFydFRyYXZlcnNlclxuICAgKiA0LiBBcHBsaWVzIG91dHB1dCBtYXBwaW5nIHRvIHdyaXRlIHJlc3VsdHMgYmFjayB0byBwYXJlbnQgc2NvcGVcbiAgICogNS4gU3RvcmVzIGV4ZWN1dGlvbiBkYXRhIGZvciBkZWJ1Z2dpbmcvdmlzdWFsaXphdGlvblxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVN1YmZsb3coXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgcGFyZW50Q29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdWJmbG93UmVzdWx0c01hcDogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4sXG4gICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgc3ViZmxvd0lkID0gbm9kZS5zdWJmbG93SWQhO1xuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbm9kZS5zdWJmbG93TmFtZSA/PyBub2RlLm5hbWU7XG5cbiAgICBwYXJlbnRDb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ3N1YmZsb3cnLCBgRW50ZXJpbmcgJHtzdWJmbG93TmFtZX0gc3ViZmxvd2AsIHtcbiAgICAgIHRhcmdldFN0YWdlOiBzdWJmbG93SWQsXG4gICAgfSk7XG5cbiAgICAvLyDilIDilIDilIAgUmVzdW1lIHJlLWVudHJ5IChvbmUtc2hvdCkg4pSA4pSA4pSAXG4gICAgLy9cbiAgICAvLyBXaGVuIHRoaXMgZW50cnkgaXMgdGhlIHJlc3VtZSdzIHdheSBiYWNrIGludG8gYSBwYXVzZWQgc3ViZmxvdywgdGhlXG4gICAgLy8gaG9wIG5hbWVzIHdoZXJlIHRoZSBzdWJmbG93J3MgdHJhdmVyc2FsIHN0YXJ0cyAodGhlIG5leHQgbW91bnQgb24gdGhlXG4gICAgLy8gcGF1c2UgcGF0aCwgb3IgdGhlIHBhdXNlZCBzdGFnZSdzIHN0YW5kLWluKSwgY2FycmllcyB0aGUgc3ViZmxvdydzXG4gICAgLy8gY2FwdHVyZWQgcHJlLXBhdXNlIHN0YXRlLCBhbmQgYW55IHNpYmxpbmcgcGF1c2VzIHdhaXRpbmcgaW4gaXQuIFRha2VuXG4gICAgLy8gT05DRTogYW55IGxhdGVyIGVudHJ5IGludG8gdGhpcyBzdWJmbG93IOKAlCBhIGxvb3AgcGFzc2luZyBpdHMgbW91bnRcbiAgICAvLyBhZ2FpbiDigJQgZ2V0cyBgdW5kZWZpbmVkYCBhbmQgcnVucyB0aGUgcmVhbCBzdWJmbG93IGZyb20gaXRzIHJlYWwgcm9vdCxcbiAgICAvLyBpbnB1dE1hcHBlciBhbmQgYWxsLlxuICAgIGNvbnN0IHJlc3VtZUhvcCA9IHRoaXMucmVzdW1lPy5lbnRlclN1YmZsb3coc3ViZmxvd0lkKTtcblxuICAgIC8vIOKUgOKUgOKUgCBJbnB1dCBNYXBwaW5nIOKUgOKUgOKUgFxuICAgIC8vXG4gICAgLy8gVGhlIG1hcHBlciBydW5zIG9uIEVWRVJZIGVudHJ5OiBpdHMgcmVzdWx0IGlzIHRoZSBzdGFnZXMnIHJlYWQtb25seVxuICAgIC8vIGFyZ3MgKGAkZ2V0QXJncygpYCksIGFuZCBhIHJlLWVudGVyZWQgc3ViZmxvdydzIHN0YWdlcyByZWFkIHRoZSBzYW1lXG4gICAgLy8gYXJncyB0aGV5IHJlYWQgYmVmb3JlIHRoZSBwYXVzZSAodGhlIHBhcmVudCdzIHZpZXcgaXMgdGhlIHNhbWUgb25lIOKAlFxuICAgIC8vIGl0IHdhcyBibG9ja2VkIGluIHRoaXMgbW91bnQpLiBXaGF0IGEgcmVzdW1lIGNoYW5nZXMgaXMgb25seSB0aGUgU0VFRDpcbiAgICAvLyB3aGVuIHRoZSBob3AgY2FycmllcyBhIGNhcHR1cmUsIHRoZSBuZXN0ZWQgbWVtb3J5IGlzIHNlZWRlZCBmcm9tIHRoZVxuICAgIC8vIGNhcHR1cmUsIG5vdCBmcm9tIHRoZSBtYXBwZXIg4oCUIHRoZSBjYXB0dXJlIGlzIHRoZSBwb3N0LWlucHV0IHByZS1wYXVzZVxuICAgIC8vIG1lbW9yeSwgYW5kIHNlZWRpbmcgdGhlIG1hcHBlcidzIHZhbHVlcyB3b3VsZCBjbG9iYmVyIHBvc3QtaW5wdXRcbiAgICAvLyB3cml0ZXMgKGhpc3RvcnksIHBhdXNlZFRvb2xDYWxsSWQsIGV0Yy4pIHdpdGggdGhlIHN0YXJ0LW9mLXN1YmZsb3cgdmlldy5cbiAgICBjb25zdCBtb3VudE9wdGlvbnMgPSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnM7XG4gICAgbGV0IG1hcHBlZElucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGNvbnN0IHJlc3VtZUNhcHR1cmUgPSByZXN1bWVIb3A/LnNlZWQ7XG4gICAgY29uc3QgaXNSZXN1bWVGb3JUaGlzU3ViZmxvdyA9IHJlc3VtZUNhcHR1cmUgIT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChtb3VudE9wdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gcGFyZW50Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICBtYXBwZWRJbnB1dCA9IGRldGFjaE1hcHBlZElucHV0KGdldEluaXRpYWxTY29wZVZhbHVlcyhwYXJlbnRTY29wZSwgbW91bnRPcHRpb25zKSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhtYXBwZWRJbnB1dCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIG1hcHBlZElucHV0IGlzIGNhcHR1cmVkIGluIFN1YmZsb3dSZXN1bHQudHJlZUNvbnRleHQgZm9yIGRlYnVnZ2luZ1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ2lucHV0TWFwcGVyRXJyb3InLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gaW5wdXRNYXBwZXIgZm9yIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwgeyBlcnJvciB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIHJ1bidzIHJlZGFjdGlvbiBydWxlICg5LjE5LjApLCByZWFkIG9mZiB0aGUgcGFyZW50LW1vdW50IGNvbnRleHRcbiAgICAvLyB0aGUgd2F5IHRoZSBkaWFscyBhcmUgKGR1Y2stdHlwZWQ6IHRoaXMgc2VjdGlvbiBjb25zdHJ1Y3RzIGl0cyBydW50aW1lXG4gICAgLy8gZHluYW1pY2FsbHkgdG8gYXZvaWQgdGhlIGNpcmN1bGFyIGltcG9ydCkuIFRoZSBzZWVkIG5hcnJhdGVkIGJlbG93IGFuZFxuICAgIC8vIHRoZSBzZWVkIENPTU1JVFRFRCBiZWxvdyBib3RoIHJldGFpbiB1bmRlciBpdDsgdGhlIHN1YmZsb3cncyBzdGFnZXNcbiAgICAvLyBzdGlsbCBjb21wdXRlIG9uIHRoZSByZWFsIGBtYXBwZWRJbnB1dGAgKHRoZWlyIGZyb3plbiBhcmdzKS5cbiAgICBjb25zdCByZWRhY3Rpb25SdWxlID0gcGFyZW50Q29udGV4dC5nZXRSZWRhY3Rpb25SdWxlPy4oKTtcbiAgICAvLyBUaGUgcnVuJ3MgcmVkYWN0ZWQgbWlycm9yICg5LjIwLjApOiB0aGUgcGFyZW50LW1vdW50IGNvbnRleHQgY2FycmllcyBpdFxuICAgIC8vIGV4YWN0bHkgd2hlbiB0aGUgcm9vdCBlbmFibGVkIG9uZSAoYEV4ZWN1dGlvblJ1bnRpbWUuZW5hYmxlUmVkYWN0ZWRNaXJyb3JgXG4gICAgLy8gdW5kZXIgYSBwb2xpY3ksIGluaGVyaXRlZCBieSBjcmVhdGVOZXh0L2NyZWF0ZUNoaWxkKSDigJQgcmVhZCB0aGUgd2F5IHRoZVxuICAgIC8vIGRpYWxzIGFyZS4gV2hlbiBpdCBkb2VzLCB0aGUgbmVzdGVkIHJ1bnRpbWUga2VlcHMgYSBtaXJyb3Igb2YgaXRzIG93bixcbiAgICAvLyBzbyB0aGUgc3ViZmxvdydzIFNFUlZFRCBzdGF0ZSBpcyBhIG1pcnJvciB0b28g4oCUIHRoZSBmb2xkIG9mIGl0cyBvd25cbiAgICAvLyBzY3J1YmJlZCBsb2cg4oCUIGFuZCBuZXZlciBhIHNlY29uZCBzY3J1Yi4gTm8gcG9saWN5OiBubyBtaXJyb3IsIG5vXG4gICAgLy8gYWxsb2NhdGlvbiwgYW5kIHRoZSBzZXJ2ZWQgc3RhdGUgaXMgdGhlIHJhdyBoZWFwIGl0IGFsd2F5cyB3YXMuXG4gICAgY29uc3Qga2VlcHNNaXJyb3IgPSBwYXJlbnRDb250ZXh0LmdldFJlZGFjdGVkU2hhcmVkTWVtb3J5Py4oKSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIE5hcnJhdGl2ZSByZWNlaXZlcyB0aGUgUkVUQUlORUQgZm9ybSBvZiB0aGUgbWFwcGVkIGlucHV0IOKAlCBhblxuICAgIC8vIGlucHV0TWFwcGVyIG1heSBpbmplY3QgdmFsdWVzIGZyb20gYW55d2hlcmUsIHNvIHRoZSBzZWVkIGlzIHNjcnViYmVkXG4gICAgLy8gdW5kZXIgdGhlIHBvbGljeSBiZWZvcmUgYW55IHJlY29yZGVyIHNlZXMgaXQuIFNhbWUgb2JqZWN0IHdoZW4gbm90aGluZ1xuICAgIC8vIGluIGl0IGlzIHJlZGFjdGVkICh0aGUgbm8tcG9saWN5IHBhdGggYWxsb2NhdGVzIG5vdGhpbmcpLlxuICAgIGNvbnN0IG5hcnJhdGl2ZUlucHV0ID0gcmVkYWN0aW9uUnVsZSA/IHJlZGFjdGlvblJ1bGUucmV0YWluUmVjb3JkKG1hcHBlZElucHV0KSA6IG1hcHBlZElucHV0O1xuICAgIC8vIGBGbG93U3ViZmxvd0V2ZW50LmRlc2NyaXB0aW9uYCBpcyBzZW1hbnRpY2FsbHkgXCJ3aGF0IHRoaXMgc3ViZmxvdyBkb2VzXCIg4oCUIHNvdXJjZWQgZnJvbVxuICAgIC8vIHRoZSBzdWJmbG93J3Mgb3duIHJvb3Qgc3RhZ2UsIG5vdCB0aGUgcGFyZW50IG1vdW50IHBvaW50LiBUaGUgbW91bnQgbm9kZSBuZXZlciBjYXJyaWVzXG4gICAgLy8gYSBkZXNjcmlwdGlvbiAoYnVpbGRlcnMgZG9uJ3QgY29weSBpdCksIHNvIHJlYWRpbmcgYG5vZGUuZGVzY3JpcHRpb25gIGhlcmUgcmV0dXJuc1xuICAgIC8vIGB1bmRlZmluZWRgIGFuZCB0YXhvbm9teSBtYXJrZXJzIHNldCBvbiB0aGUgc3ViZmxvdyByb290IChlLmcuIGFnZW50Zm9vdHByaW50J3NcbiAgICAvLyBgJ0FnZW50OiBSZUFjdCBsb29wJ2AgLyBgJ0xMTUNhbGw6IG9uZS1zaG90J2ApIG5ldmVyIHJlYWNoIGRvd25zdHJlYW0gY29uc3VtZXJzLlxuICAgIGNvbnN0IHJvb3REZXNjcmlwdGlvbiA9IHRoaXMuZGVwcy5zdWJmbG93cz8uW3N1YmZsb3dJZF0/LnJvb3Q/LmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93RW50cnkoXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgIG5hcnJhdGl2ZUlucHV0LFxuICAgICk7XG4gICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgZm9yIHRoZSBtb3VudCBub2RlIEFGVEVSXG4gICAgLy8gb25TdWJmbG93RW50cnkgc28gY29uc3VtZXJzIHRyYWNraW5nIFwiZGlkIHRoaXMgc3RhZ2UgcnVuXCIgd29ya1xuICAgIC8vIHVuaWZvcm1seSBhY3Jvc3MgbGluZWFyIC8gZGVjaWRlciAvIGZvcmsgLyBzZWxlY3RvciAvIHN1YmZsb3ctbW91bnQuXG4gICAgLy8gRmlyZXMgb24gRU5UUlkgKG5vdCBleGl0KSDigJQgZW50cnkgPSBcInRoaXMgbW91bnQgcmFuXCI7IHRoZVxuICAgIC8vIHN1YmZsb3cncyBjaGlsZHJlbiBleGVjdXRlIGFmdGVyIGFzIHNlcGFyYXRlIHN0YWdlcy5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChcbiAgICAgIG5vZGUubmFtZSxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICdzdWJmbG93LW1vdW50JyxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGlzb2xhdGVkIHJ1bnRpbWUgdmlhIGR5bmFtaWMgY29uc3RydWN0aW9uIChhdm9pZHMgY2lyY3VsYXIgaW1wb3J0KS5cbiAgICAvLyBJdHMgcm9vdCBjb250ZXh0IGlzIHRoZSBmaXJzdCBzdGFnZSB0aGUgc3ViZmxvdyB0cmF2ZXJzYWwgcnVucyDigJQgdGhlXG4gICAgLy8gcmVzdW1lIGhvcCdzIGVudHJ5IG9uIGEgcmUtZW50cnksIHRoZSBzdWJmbG93J3Mgcm9vdCBvdGhlcndpc2UuXG4gICAgY29uc3QgRXhlY3V0aW9uUnVudGltZUNsYXNzID0gdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUuY29uc3RydWN0b3IgYXMgbmV3IChcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgKSA9PiBJRXhlY3V0aW9uUnVudGltZTtcbiAgICBjb25zdCBmaXJzdE5vZGUgPSByZXN1bWVIb3A/LmVudHJ5ID8/IG5vZGU7XG4gICAgY29uc3QgbmVzdGVkUnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lQ2xhc3MoZmlyc3ROb2RlLm5hbWUsIGZpcnN0Tm9kZS5pZCk7XG4gICAgbGV0IG5lc3RlZFJvb3RDb250ZXh0ID0gbmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0O1xuXG4gICAgLy8gU2VlZCBHbG9iYWxTdG9yZSB3aXRoIHRoZSByaWdodCBzaGFwZSBmb3IgdGhlIHBhdGg6XG4gICAgLy8gICDigKIgUmVzdW1lIGludG8gVEhJUyBzdWJmbG93IOKGkiBzZWVkIGZyb20gdGhlIGNhcHR1cmVkIHByZS1wYXVzZVxuICAgIC8vICAgICBzY29wZSBzbyByZXN1bWUgaGFuZGxlcnMgc2VlIGhpc3RvcnksIHBhdXNlZFRvb2xDYWxsSWQsIGV0Yy5cbiAgICAvLyAgICAgKGBtYXBwZWRJbnB1dGAgc3RpbGwgcmVhY2hlcyB0aGUgc3RhZ2VzLCBhcyB0aGVpciByZWFkLW9ubHkgYXJncy4pXG4gICAgLy8gICDigKIgTm9ybWFsIGVudHJ5IOKGkiBzZWVkIGZyb20gdGhlIGlucHV0TWFwcGVyJ3MgbWFwcGVkSW5wdXQuXG4gICAgY29uc3Qgc2VlZFZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBpc1Jlc3VtZUZvclRoaXNTdWJmbG93ID8gcmVzdW1lQ2FwdHVyZSEgOiBtYXBwZWRJbnB1dDtcbiAgICBpZiAoT2JqZWN0LmtleXMoc2VlZFZhbHVlcykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVGhlIHNlZWQgaXMgY29tbWl0dGVkIGFzIHRoZSBzdWJmbG93J3MgYGhpc3RvcnlbMF1gIGJ5IGl0cyByb290XG4gICAgICAvLyBjb250ZXh0LCBub3QgYnkgYSBmYWNhZGUg4oCUIGluc3RhbGwgdGhlIHJ1bGUgKGFuZCB0aGUgbWlycm9yKSBvbiBUSEFUXG4gICAgICAvLyBjb250ZXh0IGZpcnN0IHNvIHRoZSBzZWVkIGNvbW1pdCByZXRhaW5zIHVuZGVyIHRoZSBwb2xpY3kgbGlrZSBldmVyeVxuICAgICAgLy8gb3RoZXIgd3JpdGUsIGFuZCBsYW5kcyBpbiB0aGUgbWlycm9yIGFzIHRoZSBwbGFjZWhvbGRlci5cbiAgICAgIHRoaXMuaW5oZXJpdFJlZGFjdGlvbihuZXN0ZWRSdW50aW1lLCBuZXN0ZWRSb290Q29udGV4dCwgcmVkYWN0aW9uUnVsZSwga2VlcHNNaXJyb3IpO1xuICAgICAgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZShuZXN0ZWRSdW50aW1lLCBzZWVkVmFsdWVzKTtcbiAgICAgIC8vIFJlZnJlc2ggcm9vdFN0YWdlQ29udGV4dCBzbyBXcml0ZUJ1ZmZlciBzZWVzIGNvbW1pdHRlZCBkYXRhXG4gICAgICBjb25zdCBTdGFnZUNvbnRleHRDbGFzcyA9IG5lc3RlZFJvb3RDb250ZXh0LmNvbnN0cnVjdG9yIGFzIG5ldyAoLi4uYXJnczogYW55W10pID0+IFN0YWdlQ29udGV4dDtcbiAgICAgIG5lc3RlZFJvb3RDb250ZXh0ID0gbmV3IFN0YWdlQ29udGV4dENsYXNzKFxuICAgICAgICAnJyxcbiAgICAgICAgbmVzdGVkUm9vdENvbnRleHQuc3RhZ2VOYW1lLFxuICAgICAgICBuZXN0ZWRSb290Q29udGV4dC5zdGFnZUlkLFxuICAgICAgICBuZXN0ZWRSdW50aW1lLmdsb2JhbFN0b3JlLFxuICAgICAgICAnJyxcbiAgICAgICAgbmVzdGVkUnVudGltZS5leGVjdXRpb25IaXN0b3J5LFxuICAgICAgKTtcbiAgICAgIG5lc3RlZFJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dCA9IG5lc3RlZFJvb3RDb250ZXh0O1xuICAgIH1cblxuICAgIC8vIFJlYWQtdHJhY2tpbmcgcG9saWN5ICgjMTQpOiBzdWJmbG93cyBnZXQgYW4gSVNPTEFURUQgcnVudGltZSwgc28gdGhlXG4gICAgLy8gZXhlY3V0b3ItbGV2ZWwgcG9saWN5IGRvZXNuJ3QgcmVhY2ggdGhlbSB2aWEgdGhlIHJvb3QgY29udGV4dCBjaGFpbi5cbiAgICAvLyBJbmhlcml0IGl0IGZyb20gdGhlIHBhcmVudC1tb3VudCBjb250ZXh0ICh3aGljaCBpbmhlcml0ZWQgaXQgZnJvbSBJVFNcbiAgICAvLyByb290IHZpYSBjcmVhdGVOZXh0L2NyZWF0ZUNoaWxkKSDigJQgYXBwbGllZCB0byB0aGUgRklOQUwgbmVzdGVkIHJvb3QsXG4gICAgLy8gYWZ0ZXIgdGhlIHNlZWRpbmcgYmxvY2sgYWJvdmUgbWF5IGhhdmUgcmVwbGFjZWQgaXQuIE5lc3RlZCBzdWJmbG93c1xuICAgIC8vIGNoYWluIHRoZSBzYW1lIHdheSwgb25lIGhvcCBwZXIgbW91bnQuIE9wdGlvbmFsLWNoYWluZWQgYmVjYXVzZSB0aGlzXG4gICAgLy8gc2VjdGlvbiBpcyBkdWNrLXR5cGVkIGJ5IGRlc2lnbiAoZHluYW1pYyBjb25zdHJ1Y3Rpb24gdG8gYXZvaWQgdGhlXG4gICAgLy8gY2lyY3VsYXIgaW1wb3J0KSDigJQgYW5kIHNraXBwZWQgYXQgdGhlIGRlZmF1bHQgJ2Z1bGwnLCB3aGVyZSB0aGUgZnJlc2hcbiAgICAvLyBuZXN0ZWQgY29udGV4dCBpcyBhbHJlYWR5IGNvcnJlY3QsIHNvIHRoZSBkZWZhdWx0IHBhdGggZG9lcyB6ZXJvIHdvcmsuXG4gICAgY29uc3QgcGFyZW50UmVhZFRyYWNraW5nID0gcGFyZW50Q29udGV4dC5nZXRSZWFkVHJhY2tpbmc/LigpO1xuICAgIGlmIChwYXJlbnRSZWFkVHJhY2tpbmcgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRSZWFkVHJhY2tpbmcgIT09ICdmdWxsJykge1xuICAgICAgbmVzdGVkUm9vdENvbnRleHQudXNlUmVhZFRyYWNraW5nKHBhcmVudFJlYWRUcmFja2luZyk7XG4gICAgfVxuXG4gICAgLy8gUmVkYWN0aW9uIHJ1bGUgKDkuMTkuMCkgYW5kIG1pcnJvciAoOS4yMC4wKTogc2FtZSBob3AgYXMgdGhlIGRpYWxzLFxuICAgIC8vIGFwcGxpZWQgdG8gdGhlIEZJTkFMIG5lc3RlZCByb290ICh0aGUgc2VlZGluZyBibG9jayBhYm92ZSBtYXkgaGF2ZVxuICAgIC8vIHJlcGxhY2VkIGl0KSBzbyBldmVyeSBzdGFnZSBjb250ZXh0IHRoZSBzdWJmbG93IGNyZWF0ZXMgaW5oZXJpdHMgYm90aC5cbiAgICB0aGlzLmluaGVyaXRSZWRhY3Rpb24obmVzdGVkUnVudGltZSwgbmVzdGVkUm9vdENvbnRleHQsIHJlZGFjdGlvblJ1bGUsIGtlZXBzTWlycm9yKTtcblxuICAgIC8vIFdyaXRlLXRyYWNraW5nIHBvbGljeSAoIzEzYy1BKTogc2FtZSBpbmhlcml0YW5jZSBob3AgYXMgcmVhZFRyYWNraW5nXG4gICAgLy8gYWJvdmUg4oCUIHN1YmZsb3cgcnVudGltZXMgYXJlIGlzb2xhdGVkLCBzbyB0aGUgcGFyZW50LW1vdW50IGNvbnRleHQnc1xuICAgIC8vIG1vZGUgaXMgcHVzaGVkIGludG8gdGhlIEZJTkFMIG5lc3RlZCByb290IHdpdGggdGhlIHNhbWUgZHVjay10eXBlXG4gICAgLy8gZ3VhcmQgYW5kIHRoZSBzYW1lIHNraXAtYXQtZGVmYXVsdCBmYXN0IHBhdGguXG4gICAgY29uc3QgcGFyZW50V3JpdGVUcmFja2luZyA9IHBhcmVudENvbnRleHQuZ2V0V3JpdGVUcmFja2luZz8uKCk7XG4gICAgaWYgKHBhcmVudFdyaXRlVHJhY2tpbmcgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRXcml0ZVRyYWNraW5nICE9PSAnZnVsbCcpIHtcbiAgICAgIG5lc3RlZFJvb3RDb250ZXh0LnVzZVdyaXRlVHJhY2tpbmcocGFyZW50V3JpdGVUcmFja2luZyk7XG4gICAgfVxuXG4gICAgLy8gQ29tbWl0LXZhbHVlcyBlbmNvZGluZyAoIzEzYy1CKTogc2FtZSBpbmhlcml0YW5jZSBob3AgYXMgdGhlIHR3b1xuICAgIC8vIHRyYWNraW5nIGRpYWxzIGFib3ZlIOKAlCBzdWJmbG93IHJ1bnRpbWVzIGFyZSBpc29sYXRlZCwgc28gdGhlXG4gICAgLy8gcGFyZW50LW1vdW50IGNvbnRleHQncyBtb2RlIGlzIHB1c2hlZCBpbnRvIHRoZSBGSU5BTCBuZXN0ZWQgcm9vdCB3aXRoXG4gICAgLy8gdGhlIHNhbWUgZHVjay10eXBlIGd1YXJkIGFuZCB0aGUgc2FtZSBza2lwLWF0LWRlZmF1bHQgZmFzdCBwYXRoLCBzb1xuICAgIC8vIG5lc3RlZCBjaGFydHMgY29tbWl0IGluIHRoZSBzYW1lIGVuY29kaW5nIGFzIHRoZSBwYXJlbnQuXG4gICAgY29uc3QgcGFyZW50Q29tbWl0VmFsdWVzID0gcGFyZW50Q29udGV4dC5nZXRDb21taXRWYWx1ZXM/LigpO1xuICAgIGlmIChwYXJlbnRDb21taXRWYWx1ZXMgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRDb21taXRWYWx1ZXMgIT09ICdmdWxsJykge1xuICAgICAgbmVzdGVkUm9vdENvbnRleHQudXNlQ29tbWl0VmFsdWVzKHBhcmVudENvbW1pdFZhbHVlcyk7XG4gICAgfVxuXG4gICAgLy8gUGVyLXdyaXRlIHJlYWQgcHJvdmVuYW5jZSAoI1AxKTogZm91cnRoIGRpYWwsIHNhbWUgaW5oZXJpdGFuY2UgaG9wIOKAlFxuICAgIC8vIGR1Y2stdHlwZSBndWFyZCwgc2tpcC1hdC1kZWZhdWx0ICgnb2ZmJykgZmFzdCBwYXRoLCBzbyBuZXN0ZWQgY2hhcnRzXG4gICAgLy8gc3RhbXAgVHJhY2VFbnRyeS5yZWFkS2V5cyBleGFjdGx5IHdoZW4gdGhlIHBhcmVudCBkb2VzLlxuICAgIGNvbnN0IHBhcmVudFdyaXRlUHJvdmVuYW5jZSA9IHBhcmVudENvbnRleHQuZ2V0V3JpdGVQcm92ZW5hbmNlPy4oKTtcbiAgICBpZiAocGFyZW50V3JpdGVQcm92ZW5hbmNlICE9PSB1bmRlZmluZWQgJiYgcGFyZW50V3JpdGVQcm92ZW5hbmNlICE9PSAnb2ZmJykge1xuICAgICAgbmVzdGVkUm9vdENvbnRleHQudXNlV3JpdGVQcm92ZW5hbmNlKHBhcmVudFdyaXRlUHJvdmVuYW5jZSk7XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBzdWJmbG93IHJvb3Qgbm9kZSDigJQgc3RyaXAgaXNTdWJmbG93Um9vdCB0byBwcmV2ZW50IHJlLWRlbGVnYXRpb24uXG4gICAgLy9cbiAgICAvLyBQUkVTRVJWRSBgbmV4dGAuIEVhcmxpZXIgcmV2aXNpb25zIHN0cmlwcGVkIGBuZXh0YCB3aGVuZXZlciB0aGVcbiAgICAvLyBzdWJmbG93IHJvb3QgaGFkIGNoaWxkcmVuLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGBuZXh0YCB3YXNcbiAgICAvLyBhbHdheXMgdGhlIE9VVEVSIG1vdW50J3MgY29udGludWF0aW9uIGxlYWtpbmcgaW50byB0aGUgaW5uZXJcbiAgICAvLyB0cmVlLiBUaGF0IGFzc3VtcHRpb24gd2FzIHdyb25nOiB0aGUgcmVzb2x2ZWQgc3ViZmxvdyByb290J3NcbiAgICAvLyBgbmV4dGAgaXMgdGhlIElOTkVSIGpvaW4gc3RhZ2UgKGUuZy4sIFBhcmFsbGVsJ3MgTWVyZ2UgYWZ0ZXIgYVxuICAgIC8vIGZhbi1vdXQsIFRvVCdzIFBydW5lcikuIFN0cmlwcGluZyBpdCBicm9rZSBjb21wb3NpdGUgc3ViZmxvd3Mg4oCUXG4gICAgLy8gdGhlIGpvaW4gc3RhZ2UgbmV2ZXIgcmFuLCBzbyB0aGUgc3ViZmxvdyByZXR1cm5lZCBwYXJ0aWFsIHN0YXRlLlxuICAgIC8vXG4gICAgLy8gVGhlIG91dGVyIG1vdW50J3MgcG9zdC1zdWJmbG93IGNvbnRpbnVhdGlvbiBpcyBoYW5kbGVkIHNlcGFyYXRlbHlcbiAgICAvLyBieSB0aGUgcGFyZW50IHRyYXZlcnNlciB2aWEgYHBhcmVudENvbnRleHQubmV4dE5vZGVgIGFuZCBpcyBuZXZlclxuICAgIC8vIGNvbmZsYXRlZCB3aXRoIHRoZSBpbm5lciBzdWJmbG93J3MgYG5leHRgIGNoYWluLlxuICAgIGNvbnN0IHN1YmZsb3dOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIC4uLm5vZGUsXG4gICAgICBpc1N1YmZsb3dSb290OiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8g4pSA4pSA4pSAIEV4ZWN1dGUgdmlhIGZhY3RvcnkgdHJhdmVyc2VyIOKUgOKUgOKUgFxuICAgIC8vIFRoZSBmYWN0b3J5IGNyZWF0ZXMgYSBmdWxsIEZsb3djaGFydFRyYXZlcnNlciB3aXRoIHRoZSBzYW1lIDctcGhhc2UgYWxnb3JpdGhtLFxuICAgIC8vIHNoYXJpbmcgdGhlIHBhcmVudCdzIHN0YWdlTWFwLCBzdWJmbG93cyBkaWN0LCBhbmQgbmFycmF0aXZlIGdlbmVyYXRvci5cbiAgICBsZXQgc3ViZmxvd091dHB1dDogYW55O1xuICAgIGxldCBzdWJmbG93RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGxldCB0cmF2ZXJzZXJIYW5kbGU6IFN1YmZsb3dUcmF2ZXJzZXJIYW5kbGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICB0cmF2ZXJzZXJIYW5kbGUgPSB0aGlzLnRyYXZlcnNlckZhY3Rvcnkoe1xuICAgICAgICAvLyBUaGUgUkVBTCBzdWJmbG93IGdyYXBoIOKAlCBldmVyeSBpZCBpbnNpZGUgdGhlIHN1YmZsb3cgKGxvb3AgdGFyZ2V0cyxcbiAgICAgICAgLy8gYSByZS12aXNpdCBvZiB0aGUgcGF1c2VkIHN0YWdlKSByZXNvbHZlcyBhZ2FpbnN0IGl0LCByZS1lbnRyeSBvciBub3QuXG4gICAgICAgIHJvb3Q6IHN1YmZsb3dOb2RlLFxuICAgICAgICAvLyBXaGVyZSB0aGlzIHRyYXZlcnNhbCBzdGFydHMgb24gYSByZXN1bWUgcmUtZW50cnk7IHZpc2l0ZWQgb25jZSDigJRcbiAgICAgICAgLy8gYW5kIHRoZSBzaWJsaW5nIHBhdXNlcyBpdCByYWlzZXMgb25jZSB0aGF0IGVudHJ5J3MgY2hhaW4gZW5kcy5cbiAgICAgICAgLi4uKHJlc3VtZUhvcD8uZW50cnkgJiYgeyBlbnRyeTogcmVzdW1lSG9wLmVudHJ5IH0pLFxuICAgICAgICAuLi4ocmVzdW1lSG9wPy5wZW5kaW5nUGF1c2VzICYmIHsgcGVuZGluZ1BhdXNlczogcmVzdW1lSG9wLnBlbmRpbmdQYXVzZXMgfSksXG4gICAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IG5lc3RlZFJ1bnRpbWUsXG4gICAgICAgIHJlYWRPbmx5Q29udGV4dDogbWFwcGVkSW5wdXQsXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgLy8gUkZDLTAwMyBEMTogdGhlIG1vdW50IHN0YWdlJ3MgcnVudGltZVN0YWdlSWQg4oCUIHRoZSBzdWJmbG93IHJvb3RcbiAgICAgICAgLy8gc3RhZ2UncyBgcGFyZW50UnVudGltZVN0YWdlSWRgIHNvIGFuY2VzdG9yIGNoYWlucyBjcm9zcyB0aGUgbW91bnQuXG4gICAgICAgIHBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ6IHBhcmVudFRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgfSk7XG5cbiAgICAgIHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0cmF2ZXJzZXJIYW5kbGUuZXhlY3V0ZSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIG5vdCBhbiBlcnJvciDigJQgcHJlcGVuZCBzdWJmbG93IElEIGFuZCByZS10aHJvd1xuICAgICAgLy8gaW1tZWRpYXRlbHkuIE5vIGVycm9yIGxvZ2dpbmcsIG5vIHN1YmZsb3dSZXN1bHQgcmVjb3JkaW5nIOKAlFxuICAgICAgLy8gdGhlIHBhdXNlIGlzIGNvbnRyb2wgZmxvdy5cbiAgICAgIC8vXG4gICAgICAvLyBCRUZPUkUgcmUtdGhyb3csIHNuYXBzaG90IHRoZSBuZXN0ZWQgcnVudGltZSdzIGBzaGFyZWRTdGF0ZWBcbiAgICAgIC8vIG9udG8gdGhlIHNpZ25hbC4gVGhpcyBpcyB0aGUgb25seSBjaGFuY2Ug4oCUIG9uY2Ugd2UgcmUtdGhyb3csXG4gICAgICAvLyB0aGUgb3V0ZXIgdHJhdmVyc2VyIHVud2luZHMgYW5kIHRoZSBuZXN0ZWQgcnVudGltZSBpcyBHQydkLiBPblxuICAgICAgLy8gcmVzdW1lLCB3ZSdsbCByZS1zZWVkIGEgZnJlc2ggbmVzdGVkIHJ1bnRpbWUgZnJvbSB0aGlzIGNhcHR1cmVcbiAgICAgIC8vIHNvIHJlc3VtZSBoYW5kbGVycyBjYW4gcmVhZCB0aGUgcHJlLXBhdXNlIHN1YmZsb3cgc2NvcGUuXG4gICAgICAvL1xuICAgICAgLy8gQ2FwdHVyZSBpcyBrZXllZCBieSB0aGUgU0FNRSBwYXRoLXByZWZpeGVkIGBzdWJmbG93SWRgIHVzZWQgaW5cbiAgICAgIC8vIGBzdWJmbG93UGF0aGAsIHNvIHJlc3VtZSBjYW4gbG9vayB1cCBcInNjb3BlIGZvciBzZi1mb29cIiBieSBpZC5cbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNuYXAgPSBuZXN0ZWRSdW50aW1lLmdldFNuYXBzaG90KCk7XG4gICAgICAgICAgLy8gYHNoYXJlZFN0YXRlYCBpcyB0aGUgc3ViZmxvdydzIHdvcmtpbmcgbWVtb3J5IGF0IHBhdXNlXG4gICAgICAgICAgLy8gdGltZSAoYWZ0ZXIgZXZlcnkgY29tbWl0dGVkIHdyaXRlIHVwIHRvIHRoZSBwYXVzZSkuIENhc3RcbiAgICAgICAgICAvLyBpcyBzYWZlIOKAlCBTaGFyZWRNZW1vcnkgc25hcHNob3QgcmV0dXJucyBhIHBsYWluIG9iamVjdC5cbiAgICAgICAgICBlcnJvci5jYXB0dXJlU3ViZmxvd1Njb3BlKHN1YmZsb3dJZCwgc25hcC5zaGFyZWRTdGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIFNuYXBzaG90IGZhaWx1cmUgc2hvdWxkbid0IG1hc2sgdGhlIHBhdXNlIOKAlCBsZXQgdGhlIHBhdXNlXG4gICAgICAgICAgLy8gYnViYmxlIHVwOyByZXN1bWUgd2lsbCBmYWxsIGJhY2sgdG8gY2hlY2twb2ludC5zaGFyZWRTdGF0ZVxuICAgICAgICAgIC8vICh0aGUgcGFyZW50IHNjb3BlKSBmb3IgdGhpcyBzdWJmbG93J3Mga2V5cy5cbiAgICAgICAgfVxuICAgICAgICBlcnJvci5wcmVwZW5kU3ViZmxvdyhzdWJmbG93SWQpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHN1YmZsb3dFcnJvciA9IGVycm9yO1xuICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignc3ViZmxvd0Vycm9yJywgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIG1lcmdlIG5lc3RlZCBzdWJmbG93IHJlc3VsdHMgKGV2ZW4gb24gZXJyb3Ig4oCUIHBhcnRpYWwgcmVzdWx0cyBhaWQgZGVidWdnaW5nKVxuICAgIGlmICh0cmF2ZXJzZXJIYW5kbGUpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYXZlcnNlckhhbmRsZS5nZXRTdWJmbG93UmVzdWx0cygpKSB7XG4gICAgICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgQnJlYWsgcHJvcGFnYXRpb24gKG9wdC1pbiB2aWEgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVhaykg4pSA4pSAXG4gICAgLy9cbiAgICAvLyBJZiB0aGUgc3ViZmxvdydzIGlubmVyIHRyYXZlcnNhbCBicm9rZSAoYmVjYXVzZSBhIHN0YWdlIGNhbGxlZFxuICAgIC8vIGBzY29wZS4kYnJlYWsocmVhc29uKWApIEFORCB0aGUgbW91bnQgZGVjbGFyZWQgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCxcbiAgICAvLyBmb3J3YXJkIHRoZSBicmVhayBzdGF0ZSB0byB0aGUgUEFSRU5UJ3MgYnJlYWtGbGFnLiBUaGUgcGFyZW50XG4gICAgLy8gdHJhdmVyc2VyIHdpbGwgc2VlIGBzaG91bGRCcmVha2Agb24gaXRzIG5leHQgc3RlcCBhbmQgc3RvcC5cbiAgICAvL1xuICAgIC8vIFdpdGhvdXQgdGhpcywgaW5uZXIgYnJlYWtzIGFyZSBsb2NhbGx5IHNjb3BlZCB0byB0aGUgc3ViZmxvdyDigJQgdGhlXG4gICAgLy8gcGFyZW50IGNvbnRpbnVlcyBhcyBpZiB0aGUgc3ViZmxvdyByZXR1cm5lZCBub3JtYWxseS5cbiAgICAvL1xuICAgIC8vIElNUE9SVEFOVDogdGhpcyBydW5zIEJFRk9SRSBgb3V0cHV0TWFwcGluZ2AgYmVsb3csIGludGVudGlvbmFsbHkuIFRoZVxuICAgIC8vIG91dHB1dE1hcHBlciBzdGlsbCBleGVjdXRlcywgc28gdGhlIHN1YmZsb3cncyBwYXJ0aWFsIHJlc3VsdCBzdGlsbFxuICAgIC8vIGxhbmRzIGluIHRoZSBwYXJlbnQgc2NvcGUuIENvbnN1bWVycyB3aG8gbmVlZCB0byBzdXBwcmVzcyBvdXRwdXQgb25cbiAgICAvLyBicmVhayBjaGVjayB0aGUgYnJlYWsgc3RhdGUgaW5zaWRlIHRoZWlyIG91dHB1dE1hcHBlciBhbmQgZWFybHktcmV0dXJuLlxuICAgIC8vIFNlZSBgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVha2AgSlNEb2MgZm9yIHJhdGlvbmFsZS5cbiAgICBpZiAodHJhdmVyc2VySGFuZGxlICYmIG1vdW50T3B0aW9ucz8ucHJvcGFnYXRlQnJlYWsgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGlubmVyQnJlYWsgPSB0cmF2ZXJzZXJIYW5kbGUuZ2V0QnJlYWtTdGF0ZSgpO1xuICAgICAgaWYgKGlubmVyQnJlYWsuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgYnJlYWtGbGFnLnNob3VsZEJyZWFrID0gdHJ1ZTtcbiAgICAgICAgaWYgKGlubmVyQnJlYWsucmVhc29uICE9PSB1bmRlZmluZWQgJiYgYnJlYWtGbGFnLnJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWtGbGFnLnJlYXNvbiA9IGlubmVyQnJlYWsucmVhc29uO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJhaXNlIGEgcGFyZW50LWxldmVsIG9uQnJlYWsgZXZlbnQgc28gcmVjb3JkZXJzIGNhbiBkaXN0aW5ndWlzaFxuICAgICAgICAvLyB0aGUgaW5uZXIgb3JpZ2luYXRpbmcgYnJlYWsgKGZpcmVkIGluc2lkZSB0aGUgc3ViZmxvdykgZnJvbSB0aGlzXG4gICAgICAgIC8vIHByb3BhZ2F0ZWQgb25lIChmaXJlZCBhdCB0aGUgbW91bnQgbGV2ZWwgb24gdGhlIHBhcmVudCkuXG4gICAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhzdWJmbG93TmFtZSwgcGFyZW50VHJhdmVyc2FsQ29udGV4dCwgaW5uZXJCcmVhay5yZWFzb24sIHN1YmZsb3dJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd1RyZWVDb250ZXh0ID0gbmVzdGVkUnVudGltZS5nZXRTbmFwc2hvdCgpO1xuXG4gICAgLy8g4pSA4pSA4pSAIE91dHB1dCBNYXBwaW5nIOKUgOKUgOKUgFxuICAgIGlmICghc3ViZmxvd0Vycm9yICYmIG1vdW50T3B0aW9ucz8ub3V0cHV0TWFwcGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgb3V0cHV0Q29udGV4dCA9IHBhcmVudENvbnRleHQ7XG4gICAgICAgIGlmIChwYXJlbnRDb250ZXh0LmJyYW5jaElkICYmIHBhcmVudENvbnRleHQuYnJhbmNoSWQgIT09ICcnICYmIHBhcmVudENvbnRleHQucGFyZW50KSB7XG4gICAgICAgICAgb3V0cHV0Q29udGV4dCA9IHBhcmVudENvbnRleHQucGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50U2NvcGUgPSBvdXRwdXRDb250ZXh0LmdldFNjb3BlKCk7XG4gICAgICAgIC8vIEZvciBUeXBlZFNjb3BlIHN1YmZsb3dzLCBzdGFnZSBmdW5jdGlvbnMgcmV0dXJuIHZvaWQg4oCUIGZhbGwgYmFjayB0byBhIHNoYWxsb3cgY2xvbmVcbiAgICAgICAgLy8gb2YgdGhlIHN1YmZsb3cncyBzaGFyZWQgc3RhdGUgc28gb3V0cHV0TWFwcGVyIGNhbiBhY2Nlc3MgYWxsIHNjb3BlIHZhbHVlcyB3cml0dGVuXG4gICAgICAgIC8vIGR1cmluZyB0aGUgc3ViZmxvdy4gV2Ugc2hhbGxvdy1jbG9uZSB0byBhdm9pZCBhbGlhc2luZyB0aGUgbGl2ZSBTaGFyZWRNZW1vcnkgY29udGV4dC5cbiAgICAgICAgLy8gTk9URTogdGhlIGZ1bGwgc2NvcGUgaXMgcGFzc2VkIChub3QganVzdCBkZWNsYXJlZCBvdXRwdXRzKSDigJQgb3V0cHV0TWFwcGVyIG11c3RcbiAgICAgICAgLy8gZXhwbGljaXRseSBzZWxlY3Qgd2hhdCB0byBwcm9wYWdhdGUgdG8gdGhlIHBhcmVudC5cbiAgICAgICAgLy8gUmVkYWN0aW9uOiBgYXBwbHlPdXRwdXRNYXBwaW5nYCB3cml0ZXMgdGhyb3VnaCBgb3V0cHV0Q29udGV4dGAgKGFcbiAgICAgICAgLy8gU3RhZ2VDb250ZXh0LCBub3QgYSBmYWNhZGUpLiBUaGUgY29udGV4dCdzIHdyaXRlIGZ1bm5lbCBhc2tzIHRoZVxuICAgICAgICAvLyBydW4ncyByZWRhY3Rpb24gcnVsZSDigJQgc2hhcmVkIHdpdGggdGhlIHN1YmZsb3cncyBjb250ZXh0cywgc28gYSBrZXlcbiAgICAgICAgLy8gdGhlIHBvbGljeSBuYW1lcyBPUiBhIGtleSBtYXJrZWQgcGVyLWNhbGwgaW5zaWRlIHRoZSBzdWJmbG93IGlzXG4gICAgICAgIC8vIHNjcnViYmVkIGluIHRoZSBQQVJFTlQncyBsb2cgYW5kIG1pcnJvciB0b28gKDkuMTkuMDsgYmVmb3JlLCB0aGlzXG4gICAgICAgIC8vIG1lcmdlLWJhY2sgcmV0YWluZWQgcGxhaW50ZXh0KS5cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlT3V0cHV0ID0gc3ViZmxvd091dHB1dCA/PyB7IC4uLnN1YmZsb3dUcmVlQ29udGV4dC5zaGFyZWRTdGF0ZSB9O1xuICAgICAgICBjb25zdCBtYXBwZWRPdXRwdXQgPSBhcHBseU91dHB1dE1hcHBpbmcoZWZmZWN0aXZlT3V0cHV0LCBwYXJlbnRTY29wZSwgb3V0cHV0Q29udGV4dCwgbW91bnRPcHRpb25zKTtcblxuICAgICAgICBvdXRwdXRDb250ZXh0LmNvbW1pdCgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdvdXRwdXRNYXBwZXJFcnJvcicsIGVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBvdXRwdXRNYXBwZXIgZm9yIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwgeyBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93UmVzdWx0OiBTdWJmbG93UmVzdWx0ID0ge1xuICAgICAgc3ViZmxvd0lkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICB0cmVlQ29udGV4dDoge1xuICAgICAgICBnbG9iYWxDb250ZXh0OiBzdWJmbG93VHJlZUNvbnRleHQuc2hhcmVkU3RhdGUsXG4gICAgICAgIHN0YWdlQ29udGV4dHM6IHN1YmZsb3dUcmVlQ29udGV4dC5leGVjdXRpb25UcmVlIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGhpc3Rvcnk6IHN1YmZsb3dUcmVlQ29udGV4dC5jb21taXRMb2csXG4gICAgICAgIC8vIFRoZSBzdWJmbG93J3Mgb3duIGZvbGQgYmFzZSB0cmF2ZWxzIHdpdGggaXRzIG93biBsb2cg4oCUIHNhbWVcbiAgICAgICAgLy8gY29udHJhY3QgYXMgdGhlIHJ1bi1sZXZlbCBgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZWAuXG4gICAgICAgIGluaXRpYWxTdGF0ZTogc3ViZmxvd1RyZWVDb250ZXh0LmluaXRpYWxTdGF0ZSxcbiAgICAgIH0sXG4gICAgICBwYXJlbnRTdGFnZUlkOiBwYXJlbnRDb250ZXh0LmdldFN0YWdlSWQoKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc3ViZmxvd0RlZiA9IHRoaXMuZGVwcy5zdWJmbG93cz8uW3N1YmZsb3dJZF07XG4gICAgaWYgKHN1YmZsb3dEZWYgJiYgKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmUpIHtcbiAgICAgIHN1YmZsb3dSZXN1bHQucGlwZWxpbmVTdHJ1Y3R1cmUgPSAoc3ViZmxvd0RlZiBhcyBhbnkpLmJ1aWxkVGltZVN0cnVjdHVyZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2VydmVkIHN0YXRlICg5LjIwLjApOiB0aGUgbmVzdGVkIG1pcnJvcidzIGZpbmFsIHN0YXRlLCByZW1lbWJlcmVkXG4gICAgLy8gQkVTSURFIHRoZSByZXN1bHQg4oCUIGB0cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0YCBzdGF5cyB0aGUgbGl2ZSBoZWFwIGZvclxuICAgIC8vIHRoZSBwbGFpbiBzbmFwc2hvdCBhbmQgdGhlIGNoZWNrcG9pbnQ7IGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWBcbiAgICAvLyBzdWJzdGl0dXRlcyB0aGUgbWlycm9yIHRocm91Z2ggYHNlcnZlZFN1YmZsb3dSZXN1bHRzYC4gQWJzZW50IHdpdGhvdXRcbiAgICAvLyBhIHBvbGljeS4gVGhlIGV4aXQgZXZlbnQgYmVsb3cgY2FycmllcyB0aGUgc2FtZSBzZXJ2ZWQgdmlldzsgd2l0aG91dCBhXG4gICAgLy8gbWlycm9yIGl0IGNhcnJpZXMgdGhlIGhlYXAgcmV0YWluZWQgdW5kZXIgdGhlIHJ1bGUgKHBlci1jYWxsIG1hcmtzXG4gICAgLy8gYWxvbmUga2VlcCBubyBtaXJyb3IpIOKAlCB0aGUgc2FtZSBvYmplY3Qgd2hlbiBub3RoaW5nIGlzIHJlZGFjdGVkLlxuICAgIGNvbnN0IHJhd1N0YXRlID0gc3ViZmxvd1Jlc3VsdC50cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0O1xuICAgIGNvbnN0IG1pcnJvclN0YXRlID0gbmVzdGVkUnVudGltZS5yZWRhY3RlZFN0b3JlPy5nZXRTdGF0ZSgpO1xuICAgIGlmIChtaXJyb3JTdGF0ZSAhPT0gdW5kZWZpbmVkKSByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlKHN1YmZsb3dSZXN1bHQsIG1pcnJvclN0YXRlKTtcbiAgICBjb25zdCBleGl0U3RhdGUgPSBtaXJyb3JTdGF0ZSA/PyAocmVkYWN0aW9uUnVsZSA/IHJlZGFjdGlvblJ1bGUucmV0YWluUmVjb3JkKHJhd1N0YXRlKSA6IHJhd1N0YXRlKTtcblxuICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChzdWJmbG93SWQsIHN1YmZsb3dSZXN1bHQpO1xuICAgIC8vIEFkZGl0aXZlIHBlci1leGVjdXRpb24ga2V5IChkZXNpZ246IGRvY3MvZGVzaWduL3N1YmZsb3ctY29tbWl0LXZpc2liaWxpdHkubWQpLiBBIExPT1BJTkdcbiAgICAvLyBzdWJmbG93IHJlLWVudGVycyB3aXRoIHRoZSBTQU1FIHN1YmZsb3dJZCwgc28gdGhlIHBhdGgga2V5IGFib3ZlIGlzIE9WRVJXUklUVEVOIGVhY2hcbiAgICAvLyBpdGVyYXRpb24gKGJhY2stY29tcGF0OiBpdCBob2xkcyB0aGUgTEFTVCBpdGVyYXRpb24g4oCUIHdoYXQgZ2V0U3VidHJlZVNuYXBzaG90L2xpc3RTdWJmbG93UGF0aHNcbiAgICAvLyBhbmQgdGhlIGV1aSBmYWxsYmFjayBzZWUsIHVuY2hhbmdlZCkuIEFMU08ga2V5IGJ5IHRoZSBtb3VudCdzIFVOSVFVRSBydW50aW1lU3RhZ2VJZCBzbyBFVkVSWVxuICAgIC8vIGl0ZXJhdGlvbidzIHJlc3VsdCBpcyByZXRhaW5lZCBhbmQgYWRkcmVzc2FibGUgKGV1aSBwZXItbG9vcCBkcmlsbC1kb3duLCBwZXItc2NvcGUgbG9jYWxpemF0aW9uKS5cbiAgICAvLyBydW50aW1lU3RhZ2VJZCBhbHdheXMgY29udGFpbnMgJyMnOyBzdWJmbG93SWQgbmV2ZXIgZG9lcyDigJQgc28gdGhleSBuZXZlciBjb2xsaWRlLCBhbmRcbiAgICAvLyBsaXN0U3ViZmxvd1BhdGhzIGZpbHRlcnMgJyMnIGtleXMgdG8ga2VlcCBpdHMgcGF0aC1vbmx5IGNvbnRyYWN0LiBUaGUgcGF1c2UgY2hlY2twb2ludCBmaWx0ZXJzXG4gICAgLy8gdGhlc2Ugb3V0IChidWlsZFBhdXNlQ2hlY2twb2ludCkgc28gaXQgc3RheXMgbGVhbi5cbiAgICBjb25zdCBtb3VudFJ1bnRpbWVTdGFnZUlkID0gcGFyZW50VHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQ7XG4gICAgaWYgKG1vdW50UnVudGltZVN0YWdlSWQgJiYgbW91bnRSdW50aW1lU3RhZ2VJZCAhPT0gc3ViZmxvd0lkKSB7XG4gICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQobW91bnRSdW50aW1lU3RhZ2VJZCwgc3ViZmxvd1Jlc3VsdCk7XG4gICAgfVxuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEV4aXRpbmcgJHtzdWJmbG93TmFtZX0gc3ViZmxvd2AsIHtcbiAgICAgIHRhcmdldFN0YWdlOiBzdWJmbG93SWQsXG4gICAgfSk7XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dFeGl0KHN1YmZsb3dOYW1lLCBzdWJmbG93SWQsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGV4aXRTdGF0ZSk7XG5cbiAgICBwYXJlbnRDb250ZXh0LmNvbW1pdCgpO1xuXG4gICAgaWYgKHN1YmZsb3dFcnJvcikge1xuICAgICAgdGhyb3cgc3ViZmxvd0Vycm9yO1xuICAgIH1cblxuICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2ggdGhlIHJ1bidzIHJlZGFjdGlvbiBpbnRvIGEgbmVzdGVkIHJvb3QgdGhlIHdheSB0aGUgZGlhbHMgYXJlIHB1c2hlZFxuICAgKiDigJQgdGhlIHRyaXBsaWNhdGVkIHByb3BhZ2F0aW9uIChyb290IGluc3RhbGwgwrcgY3JlYXRlTmV4dC9jcmVhdGVDaGlsZCDCt1xuICAgKiB0aGlzIGhvcCkuIENhbGxlZCBUV0lDRSBvbiBwdXJwb3NlOiBvbiB0aGUgcnVudGltZSdzIGZpcnN0IHJvb3QsIHNvIHRoZVxuICAgKiBTRUVEIGNvbW1pdCAoYGhpc3RvcnlbMF1gKSByZXRhaW5zIGFuZCBtaXJyb3JzIHVuZGVyIHRoZSBwb2xpY3ksIGFuZCBvblxuICAgKiB0aGUgRklOQUwgcm9vdCBhZnRlciB0aGUgc2VlZGluZyBibG9jayByZXBsYWNlcyBpdC4gUnVsZSBiZWZvcmUgbWlycm9yLFxuICAgKiBhcyB0aGUgZXhlY3V0b3Igb3JkZXJzIHRoZW0gKHRoZSBtaXJyb3IncyBzZWVkIGlzIHNjcnViYmVkIHdpdGggdGhlIHJ1bGU7XG4gICAqIGZvciBhIG5lc3RlZCBydW50aW1lIHRoYXQgc2VlZCBpcyBlbXB0eSDigJQgaXRzIGlucHV0IGFycml2ZXMgYXMgYSBjb21taXQpLlxuICAgKiBgZW5hYmxlUmVkYWN0ZWRNaXJyb3JgIGlzIGlkZW1wb3RlbnQsIHNvIHRoZSBzZWNvbmQgY2FsbCBvbmx5IHJlLWluc3RhbGxzXG4gICAqIHRoZSBPTkUgbWlycm9yIG9uIHRoZSBmcmVzaCByb290LlxuICAgKi9cbiAgcHJpdmF0ZSBpbmhlcml0UmVkYWN0aW9uKFxuICAgIHJ1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lLFxuICAgIHJvb3Q6IFN0YWdlQ29udGV4dCxcbiAgICBydWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkLFxuICAgIGtlZXBzTWlycm9yOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBpZiAocnVsZSkgcm9vdC51c2VSZWRhY3Rpb25SdWxlKHJ1bGUpO1xuICAgIGlmICgha2VlcHNNaXJyb3IpIHJldHVybjtcbiAgICBydW50aW1lLmVuYWJsZVJlZGFjdGVkTWlycm9yPy4oKTtcbiAgICBpZiAocnVudGltZS5yZWRhY3RlZFN0b3JlKSByb290LnVzZVJlZGFjdGVkTWlycm9yKHJ1bnRpbWUucmVkYWN0ZWRTdG9yZSk7XG4gIH1cbn1cbiJdfQ==
|
|
410
|
+
/** The 9.34.0 path for a runtime without `newRoot`: a fresh frame of the root's class, then the policy. */
|
|
411
|
+
function freshRoot(runtime, seedRoot, firstNode, policy) {
|
|
412
|
+
const StageContextClass = seedRoot.constructor;
|
|
413
|
+
const root = new StageContextClass('', firstNode.name, firstNode.id, runtime.globalStore, '', runtime.executionHistory);
|
|
414
|
+
adoptPolicy(runtime, root, policy);
|
|
415
|
+
return root;
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFVckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzVHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBOEI7SUFDdkQsSUFBSSxHQUF3QyxDQUFDO0lBQzdDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFBRSxTQUFTO1FBQ25DLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDO0FBQ3RCLENBQUM7QUFFRCx5R0FBeUc7QUFDekcsU0FBUyxZQUFZLENBQUMsS0FBYztJQUNsQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlELElBQUksS0FBSyxD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QUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEtBQUssT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hGLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNsRCxDQUFDO0FBQ0gsQ0FBQztBQUVELDJHQUEyRztBQUMzRyxTQUFTLFNBQVMsQ0FDaEIsT0FBMEIsRUFDMUIsUUFBc0IsRUFDdEIsU0FBdUMsRUFDdkMsTUFBaUI7SUFFakIsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsV0FBbUQsQ0FBQztJQUN2RixNQUFNLElBQUksR0FBRyxJQUFJLGlCQUFpQixDQUNoQyxFQUFFLEVBQ0YsU0FBUyxDQUFDLElBQUksRUFDZCxTQUFTLENBQUMsRUFBRSxFQUNaLE9BQU8sQ0FBQyxXQUFXLEVBQ25CLEVBQUUsRUFDRixPQUFPLENBQUMsZ0JBQWdCLENBQ3pCLENBQUM7SUFDRixXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNuQyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN1YmZsb3dFeGVjdXRvciDigJQgSXNvbGF0aW9uIGJvdW5kYXJ5IGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBDcmVhdGUgaXNvbGF0ZWQgRXhlY3V0aW9uUnVudGltZSBmb3IgZWFjaCBzdWJmbG93XG4gKiAtIEFwcGx5IGlucHV0L291dHB1dCBtYXBwaW5nIHZpYSBTdWJmbG93SW5wdXRNYXBwZXJcbiAqIC0gRGVsZWdhdGUgdHJhdmVyc2FsIHRvIGEgZmFjdG9yeS1jcmVhdGVkIEZsb3djaGFydFRyYXZlcnNlclxuICogLSBUcmFjayBzdWJmbG93IHJlc3VsdHMgZm9yIGRlYnVnZ2luZy92aXN1YWxpemF0aW9uXG4gKlxuICogRWFjaCBzdWJmbG93IGdldHMgaXRzIG93biBHbG9iYWxTdG9yZSBmb3IgaXNvbGF0aW9uLlxuICogVHJhdmVyc2FsIHVzZXMgdGhlIFNBTUUgNy1waGFzZSBhbGdvcml0aG0gYXMgdGhlIHRvcC1sZXZlbCB0cmF2ZXJzZXJcbiAqICh2aWEgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkpLCBzbyBkZWNpZGVycywgc2VsZWN0b3JzLCBsb29wcywgbGF6eSBzdWJmbG93cyxcbiAqIGFuZCBhYm9ydCBzaWduYWxzIGFsbCB3b3JrIGluc2lkZSBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LlxuICovXG5cbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi4vLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1JVTl9QT0xJQ1kgfSBmcm9tICcuLi8uLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgU3ViZmxvd1RyYXZlcnNlckhhbmRsZSxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgUmVzdW1lRW50cnkgfSBmcm9tICcuL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IHJlbWVtYmVyUmVkYWN0ZWRTdWJmbG93U3RhdGUgfSBmcm9tICcuL3NlcnZlZFN1YmZsb3dSZXN1bHRzLmpzJztcbmltcG9ydCB7IGFwcGx5T3V0cHV0TWFwcGluZywgZ2V0SW5pdGlhbFNjb3BlVmFsdWVzLCBzZWVkU3ViZmxvd0dsb2JhbFN0b3JlIH0gZnJvbSAnLi9TdWJmbG93SW5wdXRNYXBwZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCcmVha0ZsYWcgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBUaGUgbWFwcGVkIGlucHV0LCBkZXRhY2hlZCBmcm9tIHRoZSBwYXJlbnQncyBzdGF0ZSBPTkNFIHBlciBtb3VudCAoRDEsXG4gKiA5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpLlxuICpcbiAqIFRoZSBpbnB1dE1hcHBlciByZWFkcyB0aGUgcGFyZW50J3MgTElWRSBzdGF0ZSAoYGdldFNjb3BlKClgKSwgc28gYSB2YWx1ZSBpdFxuICogcGFzc2VzIHRocm91Z2ggKGAocCkgPT4gKHsgY2ZnOiBwLmNmZyB9KWApIGlzIHRoZSBwYXJlbnQncyBjb21taXR0ZWRcbiAqIG9iamVjdCDigJQgYW5kIHRoZSBzdWJmbG93J3MgYXJncyBhcmUgZGVlcC1GUk9aRU4gaW4gcGxhY2VcbiAqIChgcmVhZG9ubHlJbnB1dCDCtyBjcmVhdGVGcm96ZW5BcmdzYCkuIFRoZSB0eXBlZCBzY29wZSBkb2VzIG5vdCBwcm94eSBhXG4gKiBmcm96ZW4gdmFsdWUgKGBhbGxvd2xpc3Qgwrcgc2hvdWxkV3JhcFdpdGhQcm94eWApLCBzbyBhIGxhdGVyXG4gKiBgc2NvcGUuY2ZnLnggPSAxYCBpbiB0aGUgcGFyZW50IG1ldCB0aGUgcmF3IGZyb3plbiBvYmplY3Q6IGEgVHlwZUVycm9yIGluXG4gKiBzdHJpY3QgY29kZS4gQmVmb3JlIDkuMjkuMCB0aGUgcGFyZW50J3MgbmV4dCB3aG9sZS1zdGF0ZSBjbG9uZSByZXBsYWNlZCB0aGVcbiAqIGZyb3plbiBvYmplY3QgKGEgbW91bnQgdGhhdCBjb21taXR0ZWQgbm90aGluZyBsZWZ0IGl0IGluIHBsYWNlIOKAlCB0aGUgYnVnXG4gKiBleGlzdGVkLCBpdCB3YXMgb25seSBzaG9ydC1saXZlZCk7IHVuZGVyIGNvcHktb24td3JpdGUgbm90aGluZyByZS1jbG9uZXMsXG4gKiBzbyB0aGUgZnJlZXplIHdvdWxkIGxhc3QgdW50aWwgdGhlIGtleSBpcyByZXdyaXR0ZW4uIEEgbW91bnQgbXVzdCBuZXZlclxuICogZWRpdCDigJQgb3IgZnJlZXplIOKAlCB0aGUgcGFyZW50J3MgY29tbWl0dGVkIG9iamVjdHM6IGV2ZXJ5IHBsYWluIG9iamVjdCxcbiAqIGFycmF5LCBgRGF0ZWAsIGBNYXBgIGFuZCBgU2V0YCB0aGUgbWFwcGVyIHJldHVybnMgaXMgY2xvbmVkIGhlcmUsIGJlZm9yZSBpdFxuICogYmVjb21lcyB0aGUgYXJncy4gQSBjbGFzcyBpbnN0YW5jZSBwYXNzZXMgYnkgcmVmZXJlbmNlLCBhcyBiZWZvcmUgKGl0XG4gKiBjYW5ub3QgY29tZSBmcm9tIGNvbW1pdHRlZCBzdGF0ZSwgYW5kIGEgY2xvbmUgd291bGQgZHJvcCBpdHMgcHJvdG90eXBlKS5cbiAqIFRoZSBzZWVkIGlzIGNsb25lZCBhZ2FpbiBhdCBpdHMgY29tbWl0LCBzbyB0aGUgc3ViZmxvdydzIHN0YXRlIGlzXG4gKiB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGRldGFjaE1hcHBlZElucHV0KGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgbGV0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0KSkge1xuICAgIGlmICghaXNEZXRhY2hhYmxlKHZhbHVlKSkgY29udGludWU7XG4gICAgKG91dCA/Pz0geyAuLi5pbnB1dCB9KVtrZXldID0gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gb3V0ID8/IGlucHV0O1xufVxuXG4vKiogQSB2YWx1ZSBgc3RydWN0dXJlZENsb25lYCByZXByb2R1Y2VzIHdpdGggaXRzIG93biB0eXBlOiBwbGFpbiBvYmplY3QsIGFycmF5LCBgRGF0ZWAsIGBNYXBgLCBgU2V0YC4gKi9cbmZ1bmN0aW9uIGlzRGV0YWNoYWJsZSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHZhbHVlIGluc3RhbmNlb2YgTWFwIHx8IHZhbHVlIGluc3RhbmNlb2YgU2V0KSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBTdWJmbG93RXhlY3V0b3I8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKlxuICAgKiBUaGUgcmVzdW1lJ3Mgb25lLXNob3QgcmUtZW50cnkgKGBkZXBzLnJlc3VtZWApLCBvciBhIHNlZWQtb25seSBvbmUgYnVpbHRcbiAgICogZnJvbSB0aGUgZGVwcmVjYXRlZCBgZGVwcy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lYC4gVW5kZWZpbmVkIG9uIGEgbm9ybWFsXG4gICAqIHJ1bi4gQXNrZWQgb25jZSBwZXIgc3ViZmxvdyBlbnRyeSDigJQgc2VlIHtAbGluayBSZXN1bWVFbnRyeX0uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3VtZTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSB0cmF2ZXJzZXJGYWN0b3J5OiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+LFxuICApIHtcbiAgICB0aGlzLnJlc3VtZSA9XG4gICAgICBkZXBzLnJlc3VtZSA/P1xuICAgICAgKGRlcHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSA/IFJlc3VtZUVudHJ5LmZyb21DYXB0dXJlczxUT3V0LCBUU2NvcGU+KGRlcHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSkgOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWJmbG93IHdpdGggaXNvbGF0ZWQgY29udGV4dC5cbiAgICpcbiAgICogMS4gQ3JlYXRlcyBhIGZyZXNoIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIHRoZSBzdWJmbG93XG4gICAqIDIuIEFwcGxpZXMgaW5wdXQgbWFwcGluZyB0byBzZWVkIHRoZSBzdWJmbG93J3MgR2xvYmFsU3RvcmVcbiAgICogMy4gRGVsZWdhdGVzIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAgICogNC4gQXBwbGllcyBvdXRwdXQgbWFwcGluZyB0byB3cml0ZSByZXN1bHRzIGJhY2sgdG8gcGFyZW50IHNjb3BlXG4gICAqIDUuIFN0b3JlcyBleGVjdXRpb24gZGF0YSBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJmbG93KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHBhcmVudENvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXA6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+LFxuICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHN1YmZsb3dJZCA9IG5vZGUuc3ViZmxvd0lkITtcbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG5vZGUuc3ViZmxvd05hbWUgPz8gbm9kZS5uYW1lO1xuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEVudGVyaW5nICR7c3ViZmxvd05hbWV9IHN1YmZsb3dgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogc3ViZmxvd0lkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFJlc3VtZSByZS1lbnRyeSAob25lLXNob3QpIOKUgOKUgOKUgFxuICAgIC8vXG4gICAgLy8gV2hlbiB0aGlzIGVudHJ5IGlzIHRoZSByZXN1bWUncyB3YXkgYmFjayBpbnRvIGEgcGF1c2VkIHN1YmZsb3csIHRoZVxuICAgIC8vIGhvcCBuYW1lcyB3aGVyZSB0aGUgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgKHRoZSBuZXh0IG1vdW50IG9uIHRoZVxuICAgIC8vIHBhdXNlIHBhdGgsIG9yIHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiksIGNhcnJpZXMgdGhlIHN1YmZsb3cnc1xuICAgIC8vIGNhcHR1cmVkIHByZS1wYXVzZSBzdGF0ZSwgYW5kIGFueSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGluIGl0LiBUYWtlblxuICAgIC8vIE9OQ0U6IGFueSBsYXRlciBlbnRyeSBpbnRvIHRoaXMgc3ViZmxvdyDigJQgYSBsb29wIHBhc3NpbmcgaXRzIG1vdW50XG4gICAgLy8gYWdhaW4g4oCUIGdldHMgYHVuZGVmaW5lZGAgYW5kIHJ1bnMgdGhlIHJlYWwgc3ViZmxvdyBmcm9tIGl0cyByZWFsIHJvb3QsXG4gICAgLy8gaW5wdXRNYXBwZXIgYW5kIGFsbC5cbiAgICBjb25zdCByZXN1bWVIb3AgPSB0aGlzLnJlc3VtZT8uZW50ZXJTdWJmbG93KHN1YmZsb3dJZCk7XG5cbiAgICAvLyDilIDilIDilIAgSW5wdXQgTWFwcGluZyDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFRoZSBtYXBwZXIgcnVucyBvbiBFVkVSWSBlbnRyeTogaXRzIHJlc3VsdCBpcyB0aGUgc3RhZ2VzJyByZWFkLW9ubHlcbiAgICAvLyBhcmdzIChgJGdldEFyZ3MoKWApLCBhbmQgYSByZS1lbnRlcmVkIHN1YmZsb3cncyBzdGFnZXMgcmVhZCB0aGUgc2FtZVxuICAgIC8vIGFyZ3MgdGhleSByZWFkIGJlZm9yZSB0aGUgcGF1c2UgKHRoZSBwYXJlbnQncyB2aWV3IGlzIHRoZSBzYW1lIG9uZSDigJRcbiAgICAvLyBpdCB3YXMgYmxvY2tlZCBpbiB0aGlzIG1vdW50KS4gV2hhdCBhIHJlc3VtZSBjaGFuZ2VzIGlzIG9ubHkgdGhlIFNFRUQ6XG4gICAgLy8gd2hlbiB0aGUgaG9wIGNhcnJpZXMgYSBjYXB0dXJlLCB0aGUgbmVzdGVkIG1lbW9yeSBpcyBzZWVkZWQgZnJvbSB0aGVcbiAgICAvLyBjYXB0dXJlLCBub3QgZnJvbSB0aGUgbWFwcGVyIOKAlCB0aGUgY2FwdHVyZSBpcyB0aGUgcG9zdC1pbnB1dCBwcmUtcGF1c2VcbiAgICAvLyBtZW1vcnksIGFuZCBzZWVkaW5nIHRoZSBtYXBwZXIncyB2YWx1ZXMgd291bGQgY2xvYmJlciBwb3N0LWlucHV0XG4gICAgLy8gd3JpdGVzIChoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuKSB3aXRoIHRoZSBzdGFydC1vZi1zdWJmbG93IHZpZXcuXG4gICAgY29uc3QgbW91bnRPcHRpb25zID0gbm9kZS5zdWJmbG93TW91bnRPcHRpb25zO1xuICAgIGxldCBtYXBwZWRJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCByZXN1bWVDYXB0dXJlID0gcmVzdW1lSG9wPy5zZWVkO1xuICAgIGNvbnN0IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPSByZXN1bWVDYXB0dXJlICE9PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAobW91bnRPcHRpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJlbnRTY29wZSA9IHBhcmVudENvbnRleHQuZ2V0U2NvcGUoKTtcbiAgICAgICAgbWFwcGVkSW5wdXQgPSBkZXRhY2hNYXBwZWRJbnB1dChnZXRJbml0aWFsU2NvcGVWYWx1ZXMocGFyZW50U2NvcGUsIG1vdW50T3B0aW9ucykpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFwcGVkSW5wdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBtYXBwZWRJbnB1dCBpcyBjYXB0dXJlZCBpbiBTdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0IGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdpbnB1dE1hcHBlckVycm9yJywgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIGlucHV0TWFwcGVyIGZvciBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3IgfSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBydW4ncyBwb2xpY3kgKEY1KSDigJQgdGhlIGZvdXIgZGlhbHMsIHRoZSByZWRhY3Rpb24gcnVsZSwgdGhlIG1pcnJvclxuICAgIC8vIGZsYWcg4oCUIHJlYWQgb2ZmIHRoZSBwYXJlbnQtbW91bnQgZnJhbWUsIHdoaWNoIGhvbGRzIGl0IGJ5IHJlZmVyZW5jZS5cbiAgICAvLyBUaGUgbmVzdGVkIHJ1bnRpbWUgaXMgY29uc3RydWN0ZWQgV0lUSCBpdCwgc28gdGhlIHNlZWQgY29tbWl0IGJlbG93XG4gICAgLy8gKGBoaXN0b3J5WzBdYCkgYW5kIGV2ZXJ5IGxhdGVyIGNvbW1pdCBvZiB0aGUgc3ViZmxvdyBydW4gdW5kZXIgdGhlIHNhbWVcbiAgICAvLyBvYmplY3QsIGFuZCB0aGUgbmVzdGVkIHJ1bnRpbWUga2VlcHMgYSBtaXJyb3Igb2YgaXRzIG93biBleGFjdGx5IHdoZW5cbiAgICAvLyB0aGUgcnVuIGRvZXMgKGl0cyBTRVJWRUQgc3RhdGUgaXMgdGhlbiB0aGUgZm9sZCBvZiBpdHMgb3duIHNjcnViYmVkXG4gICAgLy8gbG9nLCBuZXZlciBhIHNlY29uZCBzY3J1YikuXG4gICAgLy8gVG9sZXJhbnQgb2YgYSBoYW5kLWJ1aWx0IGZyYW1lIG9yIHJ1bnRpbWUgd2l0aG91dCB0aGUgcG9saWN5IGRvb3IgKDkuMzQuMCBzaGFwZSk6IHRoZVxuICAgIC8vIHJ1bnRpbWUgcm9vdCdzIHBvbGljeSwgZWxzZSB0aGUgZGVmYXVsdHMuXG4gICAgY29uc3QgcG9saWN5OiBSdW5Qb2xpY3kgPVxuICAgICAgcGFyZW50Q29udGV4dC5nZXRQb2xpY3k/LigpID8/IHRoaXMuZGVwcy5leGVjdXRpb25SdW50aW1lLnJvb3RTdGFnZUNvbnRleHQ/LmdldFBvbGljeT8uKCkgPz8gREVGQVVMVF9SVU5fUE9MSUNZO1xuICAgIGNvbnN0IHJlZGFjdGlvblJ1bGUgPSBwb2xpY3kucmVkYWN0aW9uO1xuICAgIC8vIE5hcnJhdGl2ZSByZWNlaXZlcyB0aGUgUkVUQUlORUQgZm9ybSBvZiB0aGUgbWFwcGVkIGlucHV0IOKAlCBhblxuICAgIC8vIGlucHV0TWFwcGVyIG1heSBpbmplY3QgdmFsdWVzIGZyb20gYW55d2hlcmUsIHNvIHRoZSBzZWVkIGlzIHNjcnViYmVkXG4gICAgLy8gdW5kZXIgdGhlIHBvbGljeSBiZWZvcmUgYW55IHJlY29yZGVyIHNlZXMgaXQuIFNhbWUgb2JqZWN0IHdoZW4gbm90aGluZ1xuICAgIC8vIGluIGl0IGlzIHJlZGFjdGVkICh0aGUgbm8tcG9saWN5IHBhdGggYWxsb2NhdGVzIG5vdGhpbmcpLlxuICAgIGNvbnN0IG5hcnJhdGl2ZUlucHV0ID0gcmVkYWN0aW9uUnVsZSA/IHJlZGFjdGlvblJ1bGUucmV0YWluUmVjb3JkKG1hcHBlZElucHV0KSA6IG1hcHBlZElucHV0O1xuICAgIC8vIGBGbG93U3ViZmxvd0V2ZW50LmRlc2NyaXB0aW9uYCBpcyBzZW1hbnRpY2FsbHkgXCJ3aGF0IHRoaXMgc3ViZmxvdyBkb2VzXCIg4oCUIHNvdXJjZWQgZnJvbVxuICAgIC8vIHRoZSBzdWJmbG93J3Mgb3duIHJvb3Qgc3RhZ2UsIG5vdCB0aGUgcGFyZW50IG1vdW50IHBvaW50LiBUaGUgbW91bnQgbm9kZSBuZXZlciBjYXJyaWVzXG4gICAgLy8gYSBkZXNjcmlwdGlvbiAoYnVpbGRlcnMgZG9uJ3QgY29weSBpdCksIHNvIHJlYWRpbmcgYG5vZGUuZGVzY3JpcHRpb25gIGhlcmUgcmV0dXJuc1xuICAgIC8vIGB1bmRlZmluZWRgIGFuZCB0YXhvbm9teSBtYXJrZXJzIHNldCBvbiB0aGUgc3ViZmxvdyByb290IChlLmcuIGFnZW50Zm9vdHByaW50J3NcbiAgICAvLyBgJ0FnZW50OiBSZUFjdCBsb29wJ2AgLyBgJ0xMTUNhbGw6IG9uZS1zaG90J2ApIG5ldmVyIHJlYWNoIGRvd25zdHJlYW0gY29uc3VtZXJzLlxuICAgIGNvbnN0IHJvb3REZXNjcmlwdGlvbiA9IHRoaXMuZGVwcy5zdWJmbG93cz8uW3N1YmZsb3dJZF0/LnJvb3Q/LmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93RW50cnkoXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgIG5hcnJhdGl2ZUlucHV0LFxuICAgICk7XG4gICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgZm9yIHRoZSBtb3VudCBub2RlIEFGVEVSXG4gICAgLy8gb25TdWJmbG93RW50cnkgc28gY29uc3VtZXJzIHRyYWNraW5nIFwiZGlkIHRoaXMgc3RhZ2UgcnVuXCIgd29ya1xuICAgIC8vIHVuaWZvcm1seSBhY3Jvc3MgbGluZWFyIC8gZGVjaWRlciAvIGZvcmsgLyBzZWxlY3RvciAvIHN1YmZsb3ctbW91bnQuXG4gICAgLy8gRmlyZXMgb24gRU5UUlkgKG5vdCBleGl0KSDigJQgZW50cnkgPSBcInRoaXMgbW91bnQgcmFuXCI7IHRoZVxuICAgIC8vIHN1YmZsb3cncyBjaGlsZHJlbiBleGVjdXRlIGFmdGVyIGFzIHNlcGFyYXRlIHN0YWdlcy5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChcbiAgICAgIG5vZGUubmFtZSxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICdzdWJmbG93LW1vdW50JyxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGlzb2xhdGVkIHJ1bnRpbWUgdmlhIGR5bmFtaWMgY29uc3RydWN0aW9uIChhdm9pZHMgY2lyY3VsYXIgaW1wb3J0KS5cbiAgICAvLyBJdHMgcm9vdCBjb250ZXh0IGlzIHRoZSBmaXJzdCBzdGFnZSB0aGUgc3ViZmxvdyB0cmF2ZXJzYWwgcnVucyDigJQgdGhlXG4gICAgLy8gcmVzdW1lIGhvcCdzIGVudHJ5IG9uIGEgcmUtZW50cnksIHRoZSBzdWJmbG93J3Mgcm9vdCBvdGhlcndpc2UuXG4gICAgY29uc3QgRXhlY3V0aW9uUnVudGltZUNsYXNzID0gdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUuY29uc3RydWN0b3IgYXMgbmV3IChcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBkZWZhdWx0VmFsdWVzOiB1bmRlZmluZWQsXG4gICAgICBpbml0aWFsU3RhdGU6IHVuZGVmaW5lZCxcbiAgICAgIHBvbGljeTogUnVuUG9saWN5LFxuICAgICkgPT4gSUV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgY29uc3QgZmlyc3ROb2RlID0gcmVzdW1lSG9wPy5lbnRyeSA/PyBub2RlO1xuICAgIGNvbnN0IG5lc3RlZFJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZUNsYXNzKGZpcnN0Tm9kZS5uYW1lLCBmaXJzdE5vZGUuaWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBwb2xpY3kpO1xuICAgIGFkb3B0UG9saWN5KG5lc3RlZFJ1bnRpbWUsIG5lc3RlZFJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dCwgcG9saWN5KTtcblxuICAgIC8vIFNlZWQgR2xvYmFsU3RvcmUgd2l0aCB0aGUgcmlnaHQgc2hhcGUgZm9yIHRoZSBwYXRoOlxuICAgIC8vICAg4oCiIFJlc3VtZSBpbnRvIFRISVMgc3ViZmxvdyDihpIgc2VlZCBmcm9tIHRoZSBjYXB0dXJlZCBwcmUtcGF1c2VcbiAgICAvLyAgICAgc2NvcGUgc28gcmVzdW1lIGhhbmRsZXJzIHNlZSBoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuXG4gICAgLy8gICAgIChgbWFwcGVkSW5wdXRgIHN0aWxsIHJlYWNoZXMgdGhlIHN0YWdlcywgYXMgdGhlaXIgcmVhZC1vbmx5IGFyZ3MuKVxuICAgIC8vICAg4oCiIE5vcm1hbCBlbnRyeSDihpIgc2VlZCBmcm9tIHRoZSBpbnB1dE1hcHBlcidzIG1hcHBlZElucHV0LlxuICAgIGNvbnN0IHNlZWRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gaXNSZXN1bWVGb3JUaGlzU3ViZmxvdyA/IHJlc3VtZUNhcHR1cmUhIDogbWFwcGVkSW5wdXQ7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNlZWRWYWx1ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBzZWVkIGlzIGNvbW1pdHRlZCBhcyB0aGUgc3ViZmxvdydzIGBoaXN0b3J5WzBdYCBieSBpdHMgcm9vdFxuICAgICAgLy8gY29udGV4dCwgbm90IGJ5IGEgZmFjYWRlIOKAlCB0aGF0IGZyYW1lIGFscmVhZHkgaG9sZHMgdGhlIHJ1bidzIHBvbGljeVxuICAgICAgLy8gKHRoZSBydW50aW1lIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGl0KSwgc28gdGhlIHNlZWQgcmV0YWlucyB1bmRlciB0aGVcbiAgICAgIC8vIHJ1bGUsIGxhbmRzIGluIHRoZSBtaXJyb3IgYXMgdGhlIHBsYWNlaG9sZGVyLCBhbmQgY29tbWl0cyB1bmRlciB0aGVcbiAgICAgIC8vIHJ1bidzIGRpYWxzIGxpa2UgZXZlcnkgb3RoZXIgd3JpdGUgKEMtRjU6IHVuZGVyIGB3cml0ZVByb3ZlbmFuY2U6XG4gICAgICAvLyAncmVhZHMtcHJlZml4J2AgaXRzIHJvd3MgY2FycnkgYHJlYWRLZXlzOiBbXWApLlxuICAgICAgLy8gVGhlIHNlZWQgaXMgdGhlIG1vdW50J3MgYWN0IHRvbzogaXRzIGJ1bmRsZSDigJQgYGhpc3RvcnlbMF1gIG9mIHRoZVxuICAgICAgLy8gc3ViZmxvdydzIG93biBsb2cg4oCUIGNhcnJpZXMgdGhlIG1vdW50J3Mgc3RhZ2UsIHN0YWdlSWQgYW5kXG4gICAgICAvLyBydW50aW1lU3RhZ2VJZCAoUjEzOyB0aHJvdWdoIDkuMzMuMCBpdCBjYXJyaWVkIHJ1bnRpbWVTdGFnZUlkICcnIGFuZFxuICAgICAgLy8gdGhlIGZpcnN0IHN0YWdlJ3MgbmFtZXMsIHdoaWNoIG9uIGEgcmVzdW1lIHdhcyB0aGUgcmUtZW50cnkgcG9pbnQpLlxuICAgICAgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZShuZXN0ZWRSdW50aW1lLCBzZWVkVmFsdWVzLCBwYXJlbnRDb250ZXh0KTtcbiAgICAgIC8vIFJlZnJlc2ggcm9vdFN0YWdlQ29udGV4dCBzbyBXcml0ZUJ1ZmZlciBzZWVzIGNvbW1pdHRlZCBkYXRhLiBOYW1lZFxuICAgICAgLy8gYWZ0ZXIgdGhlIGZpcnN0IG5vZGUgYWdhaW4g4oCUIHRoZSBzZWVkIGNvbnRleHQgbm93IGNhcnJpZXMgdGhlIG1vdW50J3NcbiAgICAgIC8vIG5hbWVzIChSMTMpLCB3aGljaCBiZWxvbmcgdG8gdGhlIHNlZWQgYnVuZGxlIG9ubHkuIGBuZXdSb290YCBnaXZlcyBpdFxuICAgICAgLy8gdGhlIHNhbWUgcG9saWN5IGFuZCBtaXJyb3IuXG4gICAgICBuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQgPSBuZXN0ZWRSdW50aW1lLm5ld1Jvb3RcbiAgICAgICAgPyBuZXN0ZWRSdW50aW1lLm5ld1Jvb3QoZmlyc3ROb2RlLm5hbWUsIGZpcnN0Tm9kZS5pZClcbiAgICAgICAgOiBmcmVzaFJvb3QobmVzdGVkUnVudGltZSwgbmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0LCBmaXJzdE5vZGUsIHBvbGljeSk7XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBzdWJmbG93IHJvb3Qgbm9kZSDigJQgc3RyaXAgaXNTdWJmbG93Um9vdCB0byBwcmV2ZW50IHJlLWRlbGVnYXRpb24uXG4gICAgLy9cbiAgICAvLyBQUkVTRVJWRSBgbmV4dGAuIEVhcmxpZXIgcmV2aXNpb25zIHN0cmlwcGVkIGBuZXh0YCB3aGVuZXZlciB0aGVcbiAgICAvLyBzdWJmbG93IHJvb3QgaGFkIGNoaWxkcmVuLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGBuZXh0YCB3YXNcbiAgICAvLyBhbHdheXMgdGhlIE9VVEVSIG1vdW50J3MgY29udGludWF0aW9uIGxlYWtpbmcgaW50byB0aGUgaW5uZXJcbiAgICAvLyB0cmVlLiBUaGF0IGFzc3VtcHRpb24gd2FzIHdyb25nOiB0aGUgcmVzb2x2ZWQgc3ViZmxvdyByb290J3NcbiAgICAvLyBgbmV4dGAgaXMgdGhlIElOTkVSIGpvaW4gc3RhZ2UgKGUuZy4sIFBhcmFsbGVsJ3MgTWVyZ2UgYWZ0ZXIgYVxuICAgIC8vIGZhbi1vdXQsIFRvVCdzIFBydW5lcikuIFN0cmlwcGluZyBpdCBicm9rZSBjb21wb3NpdGUgc3ViZmxvd3Mg4oCUXG4gICAgLy8gdGhlIGpvaW4gc3RhZ2UgbmV2ZXIgcmFuLCBzbyB0aGUgc3ViZmxvdyByZXR1cm5lZCBwYXJ0aWFsIHN0YXRlLlxuICAgIC8vXG4gICAgLy8gVGhlIG91dGVyIG1vdW50J3MgcG9zdC1zdWJmbG93IGNvbnRpbnVhdGlvbiBpcyBoYW5kbGVkIHNlcGFyYXRlbHlcbiAgICAvLyBieSB0aGUgcGFyZW50IHRyYXZlcnNlciB2aWEgYHBhcmVudENvbnRleHQubmV4dE5vZGVgIGFuZCBpcyBuZXZlclxuICAgIC8vIGNvbmZsYXRlZCB3aXRoIHRoZSBpbm5lciBzdWJmbG93J3MgYG5leHRgIGNoYWluLlxuICAgIGNvbnN0IHN1YmZsb3dOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIC4uLm5vZGUsXG4gICAgICBpc1N1YmZsb3dSb290OiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8g4pSA4pSA4pSAIEV4ZWN1dGUgdmlhIGZhY3RvcnkgdHJhdmVyc2VyIOKUgOKUgOKUgFxuICAgIC8vIFRoZSBmYWN0b3J5IGNyZWF0ZXMgYSBmdWxsIEZsb3djaGFydFRyYXZlcnNlciB3aXRoIHRoZSBzYW1lIDctcGhhc2UgYWxnb3JpdGhtLFxuICAgIC8vIHNoYXJpbmcgdGhlIHBhcmVudCdzIHN0YWdlTWFwLCBzdWJmbG93cyBkaWN0LCBhbmQgbmFycmF0aXZlIGdlbmVyYXRvci5cbiAgICBsZXQgc3ViZmxvd091dHB1dDogYW55O1xuICAgIGxldCBzdWJmbG93RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGxldCB0cmF2ZXJzZXJIYW5kbGU6IFN1YmZsb3dUcmF2ZXJzZXJIYW5kbGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICB0cmF2ZXJzZXJIYW5kbGUgPSB0aGlzLnRyYXZlcnNlckZhY3Rvcnkoe1xuICAgICAgICAvLyBUaGUgUkVBTCBzdWJmbG93IGdyYXBoIOKAlCBldmVyeSBpZCBpbnNpZGUgdGhlIHN1YmZsb3cgKGxvb3AgdGFyZ2V0cyxcbiAgICAgICAgLy8gYSByZS12aXNpdCBvZiB0aGUgcGF1c2VkIHN0YWdlKSByZXNvbHZlcyBhZ2FpbnN0IGl0LCByZS1lbnRyeSBvciBub3QuXG4gICAgICAgIHJvb3Q6IHN1YmZsb3dOb2RlLFxuICAgICAgICAvLyBXaGVyZSB0aGlzIHRyYXZlcnNhbCBzdGFydHMgb24gYSByZXN1bWUgcmUtZW50cnk7IHZpc2l0ZWQgb25jZSDigJRcbiAgICAgICAgLy8gYW5kIHRoZSBzaWJsaW5nIHBhdXNlcyBpdCByYWlzZXMgb25jZSB0aGF0IGVudHJ5J3MgY2hhaW4gZW5kcy5cbiAgICAgICAgLi4uKHJlc3VtZUhvcD8uZW50cnkgJiYgeyBlbnRyeTogcmVzdW1lSG9wLmVudHJ5IH0pLFxuICAgICAgICAuLi4ocmVzdW1lSG9wPy5wZW5kaW5nUGF1c2VzICYmIHsgcGVuZGluZ1BhdXNlczogcmVzdW1lSG9wLnBlbmRpbmdQYXVzZXMgfSksXG4gICAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IG5lc3RlZFJ1bnRpbWUsXG4gICAgICAgIHJlYWRPbmx5Q29udGV4dDogbWFwcGVkSW5wdXQsXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgLy8gUkZDLTAwMyBEMTogdGhlIG1vdW50IHN0YWdlJ3MgcnVudGltZVN0YWdlSWQg4oCUIHRoZSBzdWJmbG93IHJvb3RcbiAgICAgICAgLy8gc3RhZ2UncyBgcGFyZW50UnVudGltZVN0YWdlSWRgIHNvIGFuY2VzdG9yIGNoYWlucyBjcm9zcyB0aGUgbW91bnQuXG4gICAgICAgIHBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ6IHBhcmVudFRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgfSk7XG5cbiAgICAgIHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0cmF2ZXJzZXJIYW5kbGUuZXhlY3V0ZSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIG5vdCBhbiBlcnJvciDigJQgcHJlcGVuZCBzdWJmbG93IElEIGFuZCByZS10aHJvd1xuICAgICAgLy8gaW1tZWRpYXRlbHkuIE5vIGVycm9yIGxvZ2dpbmcsIG5vIHN1YmZsb3dSZXN1bHQgcmVjb3JkaW5nIOKAlFxuICAgICAgLy8gdGhlIHBhdXNlIGlzIGNvbnRyb2wgZmxvdy5cbiAgICAgIC8vXG4gICAgICAvLyBCRUZPUkUgcmUtdGhyb3csIHNuYXBzaG90IHRoZSBuZXN0ZWQgcnVudGltZSdzIGBzaGFyZWRTdGF0ZWBcbiAgICAgIC8vIG9udG8gdGhlIHNpZ25hbC4gVGhpcyBpcyB0aGUgb25seSBjaGFuY2Ug4oCUIG9uY2Ugd2UgcmUtdGhyb3csXG4gICAgICAvLyB0aGUgb3V0ZXIgdHJhdmVyc2VyIHVud2luZHMgYW5kIHRoZSBuZXN0ZWQgcnVudGltZSBpcyBHQydkLiBPblxuICAgICAgLy8gcmVzdW1lLCB3ZSdsbCByZS1zZWVkIGEgZnJlc2ggbmVzdGVkIHJ1bnRpbWUgZnJvbSB0aGlzIGNhcHR1cmVcbiAgICAgIC8vIHNvIHJlc3VtZSBoYW5kbGVycyBjYW4gcmVhZCB0aGUgcHJlLXBhdXNlIHN1YmZsb3cgc2NvcGUuXG4gICAgICAvL1xuICAgICAgLy8gQ2FwdHVyZSBpcyBrZXllZCBieSB0aGUgU0FNRSBwYXRoLXByZWZpeGVkIGBzdWJmbG93SWRgIHVzZWQgaW5cbiAgICAgIC8vIGBzdWJmbG93UGF0aGAsIHNvIHJlc3VtZSBjYW4gbG9vayB1cCBcInNjb3BlIGZvciBzZi1mb29cIiBieSBpZC5cbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNuYXAgPSBuZXN0ZWRSdW50aW1lLmdldFNuYXBzaG90KCk7XG4gICAgICAgICAgLy8gYHNoYXJlZFN0YXRlYCBpcyB0aGUgc3ViZmxvdydzIHdvcmtpbmcgbWVtb3J5IGF0IHBhdXNlXG4gICAgICAgICAgLy8gdGltZSAoYWZ0ZXIgZXZlcnkgY29tbWl0dGVkIHdyaXRlIHVwIHRvIHRoZSBwYXVzZSkuIENhc3RcbiAgICAgICAgICAvLyBpcyBzYWZlIOKAlCBTaGFyZWRNZW1vcnkgc25hcHNob3QgcmV0dXJucyBhIHBsYWluIG9iamVjdC5cbiAgICAgICAgICBlcnJvci5jYXB0dXJlU3ViZmxvd1Njb3BlKHN1YmZsb3dJZCwgc25hcC5zaGFyZWRTdGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIFNuYXBzaG90IGZhaWx1cmUgc2hvdWxkbid0IG1hc2sgdGhlIHBhdXNlIOKAlCBsZXQgdGhlIHBhdXNlXG4gICAgICAgICAgLy8gYnViYmxlIHVwOyByZXN1bWUgd2lsbCBmYWxsIGJhY2sgdG8gY2hlY2twb2ludC5zaGFyZWRTdGF0ZVxuICAgICAgICAgIC8vICh0aGUgcGFyZW50IHNjb3BlKSBmb3IgdGhpcyBzdWJmbG93J3Mga2V5cy5cbiAgICAgICAgfVxuICAgICAgICBlcnJvci5wcmVwZW5kU3ViZmxvdyhzdWJmbG93SWQpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHN1YmZsb3dFcnJvciA9IGVycm9yO1xuICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignc3ViZmxvd0Vycm9yJywgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIG1lcmdlIG5lc3RlZCBzdWJmbG93IHJlc3VsdHMgKGV2ZW4gb24gZXJyb3Ig4oCUIHBhcnRpYWwgcmVzdWx0cyBhaWQgZGVidWdnaW5nKVxuICAgIGlmICh0cmF2ZXJzZXJIYW5kbGUpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYXZlcnNlckhhbmRsZS5nZXRTdWJmbG93UmVzdWx0cygpKSB7XG4gICAgICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgQnJlYWsgcHJvcGFnYXRpb24gKG9wdC1pbiB2aWEgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVhaykg4pSA4pSAXG4gICAgLy9cbiAgICAvLyBJZiB0aGUgc3ViZmxvdydzIGlubmVyIHRyYXZlcnNhbCBicm9rZSAoYmVjYXVzZSBhIHN0YWdlIGNhbGxlZFxuICAgIC8vIGBzY29wZS4kYnJlYWsocmVhc29uKWApIEFORCB0aGUgbW91bnQgZGVjbGFyZWQgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCxcbiAgICAvLyBmb3J3YXJkIHRoZSBicmVhayBzdGF0ZSB0byB0aGUgUEFSRU5UJ3MgYnJlYWtGbGFnLiBUaGUgcGFyZW50XG4gICAgLy8gdHJhdmVyc2VyIHdpbGwgc2VlIGBzaG91bGRCcmVha2Agb24gaXRzIG5leHQgc3RlcCBhbmQgc3RvcC5cbiAgICAvL1xuICAgIC8vIFdpdGhvdXQgdGhpcywgaW5uZXIgYnJlYWtzIGFyZSBsb2NhbGx5IHNjb3BlZCB0byB0aGUgc3ViZmxvdyDigJQgdGhlXG4gICAgLy8gcGFyZW50IGNvbnRpbnVlcyBhcyBpZiB0aGUgc3ViZmxvdyByZXR1cm5lZCBub3JtYWxseS5cbiAgICAvL1xuICAgIC8vIElNUE9SVEFOVDogdGhpcyBydW5zIEJFRk9SRSBgb3V0cHV0TWFwcGluZ2AgYmVsb3csIGludGVudGlvbmFsbHkuIFRoZVxuICAgIC8vIG91dHB1dE1hcHBlciBzdGlsbCBleGVjdXRlcywgc28gdGhlIHN1YmZsb3cncyBwYXJ0aWFsIHJlc3VsdCBzdGlsbFxuICAgIC8vIGxhbmRzIGluIHRoZSBwYXJlbnQgc2NvcGUuIENvbnN1bWVycyB3aG8gbmVlZCB0byBzdXBwcmVzcyBvdXRwdXQgb25cbiAgICAvLyBicmVhayBjaGVjayB0aGUgYnJlYWsgc3RhdGUgaW5zaWRlIHRoZWlyIG91dHB1dE1hcHBlciBhbmQgZWFybHktcmV0dXJuLlxuICAgIC8vIFNlZSBgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVha2AgSlNEb2MgZm9yIHJhdGlvbmFsZS5cbiAgICBpZiAodHJhdmVyc2VySGFuZGxlICYmIG1vdW50T3B0aW9ucz8ucHJvcGFnYXRlQnJlYWsgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGlubmVyQnJlYWsgPSB0cmF2ZXJzZXJIYW5kbGUuZ2V0QnJlYWtTdGF0ZSgpO1xuICAgICAgaWYgKGlubmVyQnJlYWsuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgYnJlYWtGbGFnLnNob3VsZEJyZWFrID0gdHJ1ZTtcbiAgICAgICAgaWYgKGlubmVyQnJlYWsucmVhc29uICE9PSB1bmRlZmluZWQgJiYgYnJlYWtGbGFnLnJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWtGbGFnLnJlYXNvbiA9IGlubmVyQnJlYWsucmVhc29uO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJhaXNlIGEgcGFyZW50LWxldmVsIG9uQnJlYWsgZXZlbnQgc28gcmVjb3JkZXJzIGNhbiBkaXN0aW5ndWlzaFxuICAgICAgICAvLyB0aGUgaW5uZXIgb3JpZ2luYXRpbmcgYnJlYWsgKGZpcmVkIGluc2lkZSB0aGUgc3ViZmxvdykgZnJvbSB0aGlzXG4gICAgICAgIC8vIHByb3BhZ2F0ZWQgb25lIChmaXJlZCBhdCB0aGUgbW91bnQgbGV2ZWwgb24gdGhlIHBhcmVudCkuXG4gICAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhzdWJmbG93TmFtZSwgcGFyZW50VHJhdmVyc2FsQ29udGV4dCwgaW5uZXJCcmVhay5yZWFzb24sIHN1YmZsb3dJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd1RyZWVDb250ZXh0ID0gbmVzdGVkUnVudGltZS5nZXRTbmFwc2hvdCgpO1xuXG4gICAgLy8g4pSA4pSA4pSAIE91dHB1dCBNYXBwaW5nIOKUgOKUgOKUgFxuICAgIGlmICghc3ViZmxvd0Vycm9yICYmIG1vdW50T3B0aW9ucz8ub3V0cHV0TWFwcGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGUgbWVyZ2UtYmFjayBpcyB0aGUgTU9VTlQncyBhY3QsIHNvIHRoZSBtb3VudCdzIGZyYW1lIHN0YWdlcyBhbmRcbiAgICAgICAgLy8gY29tbWl0cyBpdCDigJQgaXRzIGJ1bmRsZSBjYXJyaWVzIHRoZSBtb3VudCdzIHJ1bnRpbWVTdGFnZUlkIChSMTMpLlxuICAgICAgICAvLyBBIGJyYW5jaCBvciBmb3JrLWNoaWxkIG1vdW50IHN0aWxsIGxhbmRzIGl0cyB2YWx1ZXMgd2hlcmUgaXRzXG4gICAgICAgIC8vIHBhcmVudCB3cml0ZXMgKHRoZSBwYXJlbnQncyBydW4gbmFtZXNwYWNlKSwgYXMgYmVmb3JlOyB1bnRpbCA5LjMzLjBcbiAgICAgICAgLy8gaXQgY29tbWl0dGVkIE9OIHRoZSBwYXJlbnQncyBmcmFtZSwgc28gdGhlIGJ1bmRsZSBuYW1lZCB0aGUgc3RhZ2VcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBtb3VudCwgb3IgdGhlIGJyYW5jaGluZyBkZWNpZGVyLlxuICAgICAgICBjb25zdCBvdXRwdXRDb250ZXh0ID0gcGFyZW50Q29udGV4dDtcbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQuYnJhbmNoSWQgJiYgcGFyZW50Q29udGV4dC5wYXJlbnQpIHtcbiAgICAgICAgICBvdXRwdXRDb250ZXh0LnVzZUFkZHJlc3NPZihwYXJlbnRDb250ZXh0LnBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJlbnRTY29wZSA9IG91dHB1dENvbnRleHQuZ2V0U2NvcGUoKTtcbiAgICAgICAgLy8gRm9yIFR5cGVkU2NvcGUgc3ViZmxvd3MsIHN0YWdlIGZ1bmN0aW9ucyByZXR1cm4gdm9pZCDigJQgZmFsbCBiYWNrIHRvIGEgc2hhbGxvdyBjbG9uZVxuICAgICAgICAvLyBvZiB0aGUgc3ViZmxvdydzIHNoYXJlZCBzdGF0ZSBzbyBvdXRwdXRNYXBwZXIgY2FuIGFjY2VzcyBhbGwgc2NvcGUgdmFsdWVzIHdyaXR0ZW5cbiAgICAgICAgLy8gZHVyaW5nIHRoZSBzdWJmbG93LiBXZSBzaGFsbG93LWNsb25lIHRvIGF2b2lkIGFsaWFzaW5nIHRoZSBsaXZlIFNoYXJlZE1lbW9yeSBjb250ZXh0LlxuICAgICAgICAvLyBOT1RFOiB0aGUgZnVsbCBzY29wZSBpcyBwYXNzZWQgKG5vdCBqdXN0IGRlY2xhcmVkIG91dHB1dHMpIOKAlCBvdXRwdXRNYXBwZXIgbXVzdFxuICAgICAgICAvLyBleHBsaWNpdGx5IHNlbGVjdCB3aGF0IHRvIHByb3BhZ2F0ZSB0byB0aGUgcGFyZW50LlxuICAgICAgICAvLyBSZWRhY3Rpb246IGBhcHBseU91dHB1dE1hcHBpbmdgIHdyaXRlcyB0aHJvdWdoIGBvdXRwdXRDb250ZXh0YCAoYVxuICAgICAgICAvLyBTdGFnZUNvbnRleHQsIG5vdCBhIGZhY2FkZSkuIFRoZSBjb250ZXh0J3Mgd3JpdGUgZnVubmVsIGFza3MgdGhlXG4gICAgICAgIC8vIHJ1bidzIHJlZGFjdGlvbiBydWxlIOKAlCBzaGFyZWQgd2l0aCB0aGUgc3ViZmxvdydzIGNvbnRleHRzLCBzbyBhIGtleVxuICAgICAgICAvLyB0aGUgcG9saWN5IG5hbWVzIE9SIGEga2V5IG1hcmtlZCBwZXItY2FsbCBpbnNpZGUgdGhlIHN1YmZsb3cgaXNcbiAgICAgICAgLy8gc2NydWJiZWQgaW4gdGhlIFBBUkVOVCdzIGxvZyBhbmQgbWlycm9yIHRvbyAoOS4xOS4wOyBiZWZvcmUsIHRoaXNcbiAgICAgICAgLy8gbWVyZ2UtYmFjayByZXRhaW5lZCBwbGFpbnRleHQpLlxuICAgICAgICBjb25zdCBlZmZlY3RpdmVPdXRwdXQgPSBzdWJmbG93T3V0cHV0ID8/IHsgLi4uc3ViZmxvd1RyZWVDb250ZXh0LnNoYXJlZFN0YXRlIH07XG4gICAgICAgIGNvbnN0IG1hcHBlZE91dHB1dCA9IGFwcGx5T3V0cHV0TWFwcGluZyhlZmZlY3RpdmVPdXRwdXQsIHBhcmVudFNjb3BlLCBvdXRwdXRDb250ZXh0LCBtb3VudE9wdGlvbnMpO1xuXG4gICAgICAgIG91dHB1dENvbnRleHQuY29tbWl0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIC8vIEEgbWVyZ2UtYmFjayB0aGF0IGZhaWxlZCB0byBjb21taXQgKGFuIHVuY2xvbmVhYmxlIHZhbHVlKSBsZWF2ZXMgaXRzXG4gICAgICAgIC8vIHdyaXRlcyBzdGFnZWQgb24gdGhlIG1vdW50J3MgZnJhbWU7IHRoZSBtb3VudCdzIGV4aXQgY29tbWl0IGJlbG93XG4gICAgICAgIC8vIHdvdWxkIHRocm93IHRoZW0gYWdhaW4sIG91dHNpZGUgdGhpcyBjYXRjaC4gVGhyb3VnaCA5LjMzLjAgdGhleVxuICAgICAgICAvLyB3ZXJlIHN0YWdlZCBvbiB0aGUgcGFyZW50J3MgZnJhbWUsIHdoaWNoIHdhcyBub3QgY29tbWl0dGVkIGFnYWluLFxuICAgICAgICAvLyBzbyB0aGUgcnVuIHdlbnQgb24g4oCUIGRyb3AgdGhlbSwgYXMgaXQgZGlkLiBBIGxpbmVhciBtb3VudCdzIGZyYW1lXG4gICAgICAgIC8vIGlzIGxlZnQgYXMgaXQgYWx3YXlzIHdhcy5cbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQuYnJhbmNoSWQgJiYgcGFyZW50Q29udGV4dC5wYXJlbnQpIHBhcmVudENvbnRleHQuZGlzY2FyZFN0YWdlZCgpO1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdvdXRwdXRNYXBwZXJFcnJvcicsIGVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBvdXRwdXRNYXBwZXIgZm9yIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwgeyBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93UmVzdWx0OiBTdWJmbG93UmVzdWx0ID0ge1xuICAgICAgc3ViZmxvd0lkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICB0cmVlQ29udGV4dDoge1xuICAgICAgICBnbG9iYWxDb250ZXh0OiBzdWJmbG93VHJlZUNvbnRleHQuc2hhcmVkU3RhdGUsXG4gICAgICAgIHN0YWdlQ29udGV4dHM6IHN1YmZsb3dUcmVlQ29udGV4dC5leGVjdXRpb25UcmVlIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGhpc3Rvcnk6IHN1YmZsb3dUcmVlQ29udGV4dC5jb21taXRMb2csXG4gICAgICAgIC8vIFRoZSBzdWJmbG93J3Mgb3duIGZvbGQgYmFzZSB0cmF2ZWxzIHdpdGggaXRzIG93biBsb2cg4oCUIHNhbWVcbiAgICAgICAgLy8gY29udHJhY3QgYXMgdGhlIHJ1bi1sZXZlbCBgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZWAuXG4gICAgICAgIGluaXRpYWxTdGF0ZTogc3ViZmxvd1RyZWVDb250ZXh0LmluaXRpYWxTdGF0ZSxcbiAgICAgIH0sXG4gICAgICBwYXJlbnRTdGFnZUlkOiBwYXJlbnRDb250ZXh0LmdldFN0YWdlSWQoKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc3ViZmxvd0RlZiA9IHRoaXMuZGVwcy5zdWJmbG93cz8uW3N1YmZsb3dJZF07XG4gICAgaWYgKHN1YmZsb3dEZWYgJiYgKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmUpIHtcbiAgICAgIHN1YmZsb3dSZXN1bHQucGlwZWxpbmVTdHJ1Y3R1cmUgPSAoc3ViZmxvd0RlZiBhcyBhbnkpLmJ1aWxkVGltZVN0cnVjdHVyZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2VydmVkIHN0YXRlICg5LjIwLjApOiB0aGUgbmVzdGVkIG1pcnJvcidzIGZpbmFsIHN0YXRlLCByZW1lbWJlcmVkXG4gICAgLy8gQkVTSURFIHRoZSByZXN1bHQg4oCUIGB0cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0YCBzdGF5cyB0aGUgbGl2ZSBoZWFwIGZvclxuICAgIC8vIHRoZSBwbGFpbiBzbmFwc2hvdCBhbmQgdGhlIGNoZWNrcG9pbnQ7IGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWBcbiAgICAvLyBzdWJzdGl0dXRlcyB0aGUgbWlycm9yIHRocm91Z2ggYHNlcnZlZFN1YmZsb3dSZXN1bHRzYC4gQWJzZW50IHdpdGhvdXRcbiAgICAvLyBhIHBvbGljeS4gVGhlIGV4aXQgZXZlbnQgYmVsb3cgY2FycmllcyB0aGUgc2FtZSBzZXJ2ZWQgdmlldzsgd2l0aG91dCBhXG4gICAgLy8gbWlycm9yIGl0IGNhcnJpZXMgdGhlIGhlYXAgcmV0YWluZWQgdW5kZXIgdGhlIHJ1bGUgKHBlci1jYWxsIG1hcmtzXG4gICAgLy8gYWxvbmUga2VlcCBubyBtaXJyb3IpIOKAlCB0aGUgc2FtZSBvYmplY3Qgd2hlbiBub3RoaW5nIGlzIHJlZGFjdGVkLlxuICAgIGNvbnN0IHJhd1N0YXRlID0gc3ViZmxvd1Jlc3VsdC50cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0O1xuICAgIGNvbnN0IG1pcnJvclN0YXRlID0gbmVzdGVkUnVudGltZS5yZWRhY3RlZFN0b3JlPy5nZXRTdGF0ZSgpO1xuICAgIGlmIChtaXJyb3JTdGF0ZSAhPT0gdW5kZWZpbmVkKSByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlKHN1YmZsb3dSZXN1bHQsIG1pcnJvclN0YXRlKTtcbiAgICBjb25zdCBleGl0U3RhdGUgPSBtaXJyb3JTdGF0ZSA/PyAocmVkYWN0aW9uUnVsZSA/IHJlZGFjdGlvblJ1bGUucmV0YWluUmVjb3JkKHJhd1N0YXRlKSA6IHJhd1N0YXRlKTtcblxuICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChzdWJmbG93SWQsIHN1YmZsb3dSZXN1bHQpO1xuICAgIC8vIEFkZGl0aXZlIHBlci1leGVjdXRpb24ga2V5IChkZXNpZ246IGRvY3MvZGVzaWduL3N1YmZsb3ctY29tbWl0LXZpc2liaWxpdHkubWQpLiBBIExPT1BJTkdcbiAgICAvLyBzdWJmbG93IHJlLWVudGVycyB3aXRoIHRoZSBTQU1FIHN1YmZsb3dJZCwgc28gdGhlIHBhdGgga2V5IGFib3ZlIGlzIE9WRVJXUklUVEVOIGVhY2hcbiAgICAvLyBpdGVyYXRpb24gKGJhY2stY29tcGF0OiBpdCBob2xkcyB0aGUgTEFTVCBpdGVyYXRpb24g4oCUIHdoYXQgZ2V0U3VidHJlZVNuYXBzaG90L2xpc3RTdWJmbG93UGF0aHNcbiAgICAvLyBhbmQgdGhlIGV1aSBmYWxsYmFjayBzZWUsIHVuY2hhbmdlZCkuIEFMU08ga2V5IGJ5IHRoZSBtb3VudCdzIFVOSVFVRSBydW50aW1lU3RhZ2VJZCBzbyBFVkVSWVxuICAgIC8vIGl0ZXJhdGlvbidzIHJlc3VsdCBpcyByZXRhaW5lZCBhbmQgYWRkcmVzc2FibGUgKGV1aSBwZXItbG9vcCBkcmlsbC1kb3duLCBwZXItc2NvcGUgbG9jYWxpemF0aW9uKS5cbiAgICAvLyBydW50aW1lU3RhZ2VJZCBhbHdheXMgY29udGFpbnMgJyMnOyBzdWJmbG93SWQgbmV2ZXIgZG9lcyDigJQgc28gdGhleSBuZXZlciBjb2xsaWRlLCBhbmRcbiAgICAvLyBsaXN0U3ViZmxvd1BhdGhzIGZpbHRlcnMgJyMnIGtleXMgdG8ga2VlcCBpdHMgcGF0aC1vbmx5IGNvbnRyYWN0LiBUaGUgcGF1c2UgY2hlY2twb2ludCBmaWx0ZXJzXG4gICAgLy8gdGhlc2Ugb3V0IChidWlsZFBhdXNlQ2hlY2twb2ludCkgc28gaXQgc3RheXMgbGVhbi5cbiAgICBjb25zdCBtb3VudFJ1bnRpbWVTdGFnZUlkID0gcGFyZW50VHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQ7XG4gICAgaWYgKG1vdW50UnVudGltZVN0YWdlSWQgJiYgbW91bnRSdW50aW1lU3RhZ2VJZCAhPT0gc3ViZmxvd0lkKSB7XG4gICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQobW91bnRSdW50aW1lU3RhZ2VJZCwgc3ViZmxvd1Jlc3VsdCk7XG4gICAgfVxuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEV4aXRpbmcgJHtzdWJmbG93TmFtZX0gc3ViZmxvd2AsIHtcbiAgICAgIHRhcmdldFN0YWdlOiBzdWJmbG93SWQsXG4gICAgfSk7XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dFeGl0KHN1YmZsb3dOYW1lLCBzdWJmbG93SWQsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGV4aXRTdGF0ZSk7XG5cbiAgICBwYXJlbnRDb250ZXh0LmNvbW1pdCgpO1xuXG4gICAgaWYgKHN1YmZsb3dFcnJvcikge1xuICAgICAgdGhyb3cgc3ViZmxvd0Vycm9yO1xuICAgIH1cblxuICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICB9XG59XG5cbi8qKlxuICogQSBjdXN0b20gcnVudGltZSBjbGFzcyAoOS4zNC4wIHNoYXBlKSBtYXkgaWdub3JlIHRoZSBjb25zdHJ1Y3RvcidzIHBvbGljeSBhcmd1bWVudDogaGFuZCBpdHNcbiAqIHJvb3QgdGhlIHBvbGljeSDigJQgYW5kIGl0cyBtaXJyb3IsIHdoZW4gdGhlIHBvbGljeSBrZWVwcyBvbmUg4oCUIGFzIHRoZSBvbGQgcGVyLWRpYWwgcHVzaCBkaWQuXG4gKiBBIG5vLW9wIGZvciBgRXhlY3V0aW9uUnVudGltZWAsIHdob3NlIHJvb3QgYWxyZWFkeSBob2xkcyBpdC5cbiAqL1xuZnVuY3Rpb24gYWRvcHRQb2xpY3kocnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWUsIHJvb3Q6IFN0YWdlQ29udGV4dCwgcG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgaWYgKHJvb3QuZ2V0UG9saWN5Py4oKSAhPT0gcG9saWN5KSByb290LnVzZVBvbGljeT8uKHBvbGljeSk7XG4gIGlmICghcG9saWN5Lm1pcnJvcikgcmV0dXJuO1xuICBpZiAoIXJ1bnRpbWUucmVkYWN0ZWRTdG9yZSkgcnVudGltZS5lbmFibGVSZWRhY3RlZE1pcnJvcj8uKCk7XG4gIGlmIChydW50aW1lLnJlZGFjdGVkU3RvcmUgJiYgcm9vdC5nZXRSZWRhY3RlZFNoYXJlZE1lbW9yeT8uKCkgIT09IHJ1bnRpbWUucmVkYWN0ZWRTdG9yZSkge1xuICAgIHJvb3QudXNlUmVkYWN0ZWRNaXJyb3I/LihydW50aW1lLnJlZGFjdGVkU3RvcmUpO1xuICB9XG59XG5cbi8qKiBUaGUgOS4zNC4wIHBhdGggZm9yIGEgcnVudGltZSB3aXRob3V0IGBuZXdSb290YDogYSBmcmVzaCBmcmFtZSBvZiB0aGUgcm9vdCdzIGNsYXNzLCB0aGVuIHRoZSBwb2xpY3kuICovXG5mdW5jdGlvbiBmcmVzaFJvb3QoXG4gIHJ1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lLFxuICBzZWVkUm9vdDogU3RhZ2VDb250ZXh0LFxuICBmaXJzdE5vZGU6IHsgbmFtZTogc3RyaW5nOyBpZDogc3RyaW5nIH0sXG4gIHBvbGljeTogUnVuUG9saWN5LFxuKTogU3RhZ2VDb250ZXh0IHtcbiAgY29uc3QgU3RhZ2VDb250ZXh0Q2xhc3MgPSBzZWVkUm9vdC5jb25zdHJ1Y3RvciBhcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBTdGFnZUNvbnRleHQ7XG4gIGNvbnN0IHJvb3QgPSBuZXcgU3RhZ2VDb250ZXh0Q2xhc3MoXG4gICAgJycsXG4gICAgZmlyc3ROb2RlLm5hbWUsXG4gICAgZmlyc3ROb2RlLmlkLFxuICAgIHJ1bnRpbWUuZ2xvYmFsU3RvcmUsXG4gICAgJycsXG4gICAgcnVudGltZS5leGVjdXRpb25IaXN0b3J5LFxuICApO1xuICBhZG9wdFBvbGljeShydW50aW1lLCByb290LCBwb2xpY3kpO1xuICByZXR1cm4gcm9vdDtcbn1cbiJdfQ==
|
|
@@ -43,8 +43,11 @@ export declare function createSubflowHandlerDeps<TOut = any, TScope = any>(paren
|
|
|
43
43
|
* Redaction: the seed is committed as the subflow's `history[0]` by its root
|
|
44
44
|
* context. `SubflowExecutor` installs the run's redaction rule on that context
|
|
45
45
|
* before calling this, so the commit retains under the policy (9.19.0).
|
|
46
|
+
*
|
|
47
|
+
* `mount` names the seed bundle: the engine passes the MOUNT's frame, because
|
|
48
|
+
* the mount is the stage whose inputMapper produced the seed (R13).
|
|
46
49
|
*/
|
|
47
|
-
export declare function seedSubflowGlobalStore(subflowRuntime: IExecutionRuntime, initialValues: Record<string, unknown>): void;
|
|
50
|
+
export declare function seedSubflowGlobalStore(subflowRuntime: IExecutionRuntime, initialValues: Record<string, unknown>, mount?: Pick<StageContext, 'stageName' | 'stageId' | 'runtimeStageId'>): void;
|
|
48
51
|
/**
|
|
49
52
|
* Apply output mapping after subflow completion.
|
|
50
53
|
* Writes mapped values back to parent scope using merge semantics:
|
|
@@ -81,9 +81,22 @@ export function createSubflowHandlerDeps(parentDeps, subflowRuntime, mappedInput
|
|
|
81
81
|
* Redaction: the seed is committed as the subflow's `history[0]` by its root
|
|
82
82
|
* context. `SubflowExecutor` installs the run's redaction rule on that context
|
|
83
83
|
* before calling this, so the commit retains under the policy (9.19.0).
|
|
84
|
+
*
|
|
85
|
+
* `mount` names the seed bundle: the engine passes the MOUNT's frame, because
|
|
86
|
+
* the mount is the stage whose inputMapper produced the seed (R13).
|
|
84
87
|
*/
|
|
85
|
-
export function seedSubflowGlobalStore(subflowRuntime, initialValues) {
|
|
88
|
+
export function seedSubflowGlobalStore(subflowRuntime, initialValues, mount) {
|
|
86
89
|
const rootContext = subflowRuntime.rootStageContext;
|
|
90
|
+
// The mount that seeds the subflow names the seed bundle (R13) — all three
|
|
91
|
+
// fields, so its `stageId` is the stage its `runtimeStageId` names. Safe:
|
|
92
|
+
// the engine replaces this root context once the seed is committed.
|
|
93
|
+
// Omitted → the root context's own names and an empty runtimeStageId, the
|
|
94
|
+
// shape every seed had through 9.33.0.
|
|
95
|
+
if (mount) {
|
|
96
|
+
rootContext.stageName = mount.stageName;
|
|
97
|
+
rootContext.stageId = mount.stageId;
|
|
98
|
+
rootContext.runtimeStageId = mount.runtimeStageId;
|
|
99
|
+
}
|
|
87
100
|
for (const [key, value] of Object.entries(initialValues)) {
|
|
88
101
|
// An EMPTY plain object lands whole too: spread into zero writes it
|
|
89
102
|
// seeded nothing, and the child read `undefined` for an `{}` input
|
|
@@ -154,4 +167,4 @@ export function applyOutputMapping(subflowOutput, parentScope, parentContext, op
|
|
|
154
167
|
}
|
|
155
168
|
return mappedOutput;
|
|
156
169
|
}
|
|
157
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0lucHV0TWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0lucHV0TWFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBR0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzFEOzs7Ozs7R0FNRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQWM7SUFDbkMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLFdBQXlCLEVBQ3pCLE9BQTBEO0lBRTFELElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDMUIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNoRCxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzVDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLFdBQXlCLEVBQ3pCLE9BQTBEO0lBRTFELE9BQU8sd0JBQXdCLENB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O0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN1YmZsb3dJbnB1dE1hcHBlciDigJQgUHVyZSBmdW5jdGlvbnMgZm9yIHN1YmZsb3cgZGF0YSBjb250cmFjdHMuXG4gKlxuICogTWVudGFsIG1vZGVsOiBTdWJmbG93ID0gUHVyZSBGdW5jdGlvblxuICogLSBJc29sYXRlZCBzY29wZSAob3duIEdsb2JhbFN0b3JlKVxuICogLSBFeHBsaWNpdCBpbnB1dHMgdmlhIGlucHV0TWFwcGVyXG4gKiAtIEV4cGxpY2l0IG91dHB1dHMgdmlhIG91dHB1dE1hcHBlclxuICpcbiAqIHwgU2NlbmFyaW8gICAgICAgIHwgQmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IE5vIGlucHV0TWFwcGVyICB8IFN1YmZsb3cgc3RhcnRzIHdpdGggZW1wdHkgc2NvcGUgICAgICAgICAgIHxcbiAqIHwgTm8gb3V0cHV0TWFwcGVyIHwgU3ViZmxvdyBzY29wZSBjaGFuZ2VzIGRpc2NhcmRlZCAgICAgICAgICAgfFxuICogfCBCb3RoIHByZXNlbnQgICAgfCBGdWxsIGRhdGEgY29udHJhY3QgKGFyZ3MgaW4sIHJlc3VsdHMgb3V0KSB8XG4gKiB8IE5laXRoZXIgcHJlc2VudCB8IENvbXBsZXRlIGlzb2xhdGlvbiAoc2lkZSBlZmZlY3RzIG9ubHkpICAgIHxcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgdW53cmFwSGFuZGxlcyB9IGZyb20gJy4uLy4uL3JlYWN0aXZlL2hhbmRsZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyRGVwcywgSUV4ZWN1dGlvblJ1bnRpbWUsIFN1YmZsb3dNb3VudE9wdGlvbnMgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8qKlxuICogQSBwbGFpbiBvYmplY3Qg4oCUIHRoZSBvbmx5IHNoYXBlIHRoYXQgaXMgc3ByZWFkIGludG8gcGVyLWZpZWxkIHdyaXRlc1xuICogKGBzZXRPYmplY3QoW2tleV0sIGZpZWxkLCDigKYpYCwgYSByb3cgYW5kIGEgcmVkYWN0aW9uIHZlcmRpY3QgcGVyIGZpZWxkKS4gQVxuICogYERhdGVgLCBgTWFwYCwgYFNldGAgb3IgY2xhc3MgaW5zdGFuY2UgaGFzIG5vIGZpZWxkcyB0byBzcHJlYWQgYW5kIGlzIGFcbiAqIHZhbHVlIGluIGl0cyBvd24gcmlnaHQ6IGl0IGxhbmRzIFdIT0xFICh1bnRpbCA5LjI0LjAgaXQgd2FzIHNwcmVhZCBpbnRvXG4gKiB6ZXJvIHdyaXRlcyBhbmQgc2lsZW50bHkgdmFuaXNoZWQgYXQgYm90aCBib3VuZGFyaWVzKS5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG59XG5cbi8qKlxuICogRXh0cmFjdCB2YWx1ZXMgZnJvbSBwYXJlbnQgc2NvcGUgdXNpbmcgaW5wdXRNYXBwZXIuXG4gKlxuICogV2hhdCBhIG1hcHBlciByZXR1cm5zIGlzIGEgVkFMVUUsIG5vdCBhIGhhbmRsZTogdGhlIG1hcHBlciByZWFkIHRoZSBwYXJlbnQnc1xuICogdHlwZWQgc2NvcGUsIHNvIGl0cyByZXN1bHQgbWF5IGJlIOKAlCBvciBob2xkIOKAlCBhIFByb3h5IGJvdW5kIHRvIHRoZSBwYXJlbnRcbiAqIHN0YWdlLCBhbmQgdGhlIHNlZWQgY29tbWl0IGJlbG93IGNsb25lcyBpdCAoYHN0cnVjdHVyZWRDbG9uZWAsIHdoaWNoIGNhbm5vdFxuICogY2xvbmUgYSBQcm94eSkuIGB1bndyYXBIYW5kbGVzYCAocmVhY3RpdmUvaGFuZGxlcy50cykgc3dhcHMgZWFjaCBmb3IgdGhlXG4gKiB2YWx1ZSBiZWhpbmQgaXQsIE8oMSksIERhdGVzIGFuZCBNYXBzIGludGFjdDsgYSBoYW5kbGUtZnJlZSByZXN1bHQgcGFzc2VzXG4gKiB0aHJvdWdoIGJ5IHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQYXJlbnRTY29wZVZhbHVlczxUUGFyZW50U2NvcGUsIFRTdWJmbG93SW5wdXQ+KFxuICBwYXJlbnRTY29wZTogVFBhcmVudFNjb3BlLFxuICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9uczxUUGFyZW50U2NvcGUsIFRTdWJmbG93SW5wdXQ+LFxuKTogVFN1YmZsb3dJbnB1dCB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKCFvcHRpb25zPy5pbnB1dE1hcHBlcikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IG9wdGlvbnMuaW5wdXRNYXBwZXIocGFyZW50U2NvcGUpO1xuICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIHVud3JhcEhhbmRsZXMocmVzdWx0KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGluaXRpYWwgc2NvcGUgdmFsdWVzIGZvciBhIHN1YmZsb3cuXG4gKiBBbHdheXMgaXNvbGF0ZWQg4oCUIG9ubHkgaW5wdXRNYXBwZXIgdmFsdWVzIGFyZSBpbmNsdWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluaXRpYWxTY29wZVZhbHVlczxUUGFyZW50U2NvcGUsIFRTdWJmbG93SW5wdXQ+KFxuICBwYXJlbnRTY29wZTogVFBhcmVudFNjb3BlLFxuICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9uczxUUGFyZW50U2NvcGUsIFRTdWJmbG93SW5wdXQ+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gZXh0cmFjdFBhcmVudFNjb3BlVmFsdWVzKHBhcmVudFNjb3BlLCBvcHRpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgSGFuZGxlckRlcHMgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICogS2V5OiBzZXRzIHJlYWRPbmx5Q29udGV4dCB0byBtYXBwZWQgaW5wdXQgc28gU3RhZ2VSdW5uZXIgcGFzc2VzIGl0IHRvIFNjb3BlRmFjdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1YmZsb3dIYW5kbGVyRGVwczxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+KFxuICBwYXJlbnREZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICBzdWJmbG93UnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIG1hcHBlZElucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4ge1xuICByZXR1cm4ge1xuICAgIHN0YWdlTWFwOiBwYXJlbnREZXBzLnN0YWdlTWFwLFxuICAgIHJvb3Q6IHBhcmVudERlcHMucm9vdCxcbiAgICBzY29wZUZhY3Rvcnk6IHBhcmVudERlcHMuc2NvcGVGYWN0b3J5LFxuICAgIHN1YmZsb3dzOiBwYXJlbnREZXBzLnN1YmZsb3dzLFxuICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IHBhcmVudERlcHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICBzdHJlYW1IYW5kbGVyczogcGFyZW50RGVwcy5zdHJlYW1IYW5kbGVycyxcbiAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBwYXJlbnREZXBzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgZXhlY3V0aW9uUnVudGltZTogc3ViZmxvd1J1bnRpbWUsXG4gICAgcmVhZE9ubHlDb250ZXh0OiBtYXBwZWRJbnB1dCxcbiAgICBleGVjdXRpb25FbnY6IHBhcmVudERlcHMuZXhlY3V0aW9uRW52LCAvLyBpbmhlcml0ZWQg4oCUIGxpa2UgcHJvY2Vzcy5lbnZcbiAgICBuYXJyYXRpdmVHZW5lcmF0b3I6IHBhcmVudERlcHMubmFycmF0aXZlR2VuZXJhdG9yLFxuICAgIGxvZ2dlcjogcGFyZW50RGVwcy5sb2dnZXIsXG4gIH07XG59XG5cbi8qKlxuICogU2VlZCB0aGUgc3ViZmxvdydzIEdsb2JhbFN0b3JlIHdpdGggaW5pdGlhbCB2YWx1ZXMuXG4gKiBDYWxsZWQgYmVmb3JlIHN1YmZsb3cgZXhlY3V0aW9uIHRvIG1ha2UgaW5wdXRNYXBwZXIgdmFsdWVzIGF2YWlsYWJsZS5cbiAqXG4gKiBSZWRhY3Rpb246IHRoZSBzZWVkIGlzIGNvbW1pdHRlZCBhcyB0aGUgc3ViZmxvdydzIGBoaXN0b3J5WzBdYCBieSBpdHMgcm9vdFxuICogY29udGV4dC4gYFN1YmZsb3dFeGVjdXRvcmAgaW5zdGFsbHMgdGhlIHJ1bidzIHJlZGFjdGlvbiBydWxlIG9uIHRoYXQgY29udGV4dFxuICogYmVmb3JlIGNhbGxpbmcgdGhpcywgc28gdGhlIGNvbW1pdCByZXRhaW5zIHVuZGVyIHRoZSBwb2xpY3kgKDkuMTkuMCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWVkU3ViZmxvd0dsb2JhbFN0b3JlKFxuICBzdWJmbG93UnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIGluaXRpYWxWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogdm9pZCB7XG4gIGNvbnN0IHJvb3RDb250ZXh0ID0gc3ViZmxvd1J1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsVmFsdWVzKSkge1xuICAgIC8vIEFuIEVNUFRZIHBsYWluIG9iamVjdCBsYW5kcyB3aG9sZSB0b286IHNwcmVhZCBpbnRvIHplcm8gd3JpdGVzIGl0XG4gICAgLy8gc2VlZGVkIG5vdGhpbmcsIGFuZCB0aGUgY2hpbGQgcmVhZCBgdW5kZWZpbmVkYCBmb3IgYW4gYHt9YCBpbnB1dFxuICAgIC8vICg5LjE0LjAgdG8gOS4yMy4zKS5cbiAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgW25lc3RlZEtleSwgbmVzdGVkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICByb290Q29udGV4dC5zZXRPYmplY3QoW2tleV0sIG5lc3RlZEtleSwgbmVzdGVkVmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByb290Q29udGV4dC5zZXRHbG9iYWwoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcm9vdENvbnRleHQuY29tbWl0KCk7XG59XG5cbi8qKlxuICogQXBwbHkgb3V0cHV0IG1hcHBpbmcgYWZ0ZXIgc3ViZmxvdyBjb21wbGV0aW9uLlxuICogV3JpdGVzIG1hcHBlZCB2YWx1ZXMgYmFjayB0byBwYXJlbnQgc2NvcGUgdXNpbmcgbWVyZ2Ugc2VtYW50aWNzOlxuICogYXJyYXlzIGFyZSBhcHBlbmRlZCwgb2JqZWN0cyBhcmUgc2hhbGxvdy1tZXJnZWQsIHNjYWxhcnMgYXJlIHJlcGxhY2VkLlxuICpcbiAqIFJlZGFjdGlvbjogZXZlcnkgd3JpdGUgaGVyZSBnb2VzIHRocm91Z2ggYHBhcmVudENvbnRleHRgJ3Mgd3JpdGUgZnVubmVsLFxuICogd2hpY2ggYXNrcyB0aGUgcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHNvIGEgcG9saWN5LXJlZGFjdGVkIG9yIHBlci1jYWxsXG4gKiBtYXJrZWQga2V5IGxhbmRzIGluIHRoZSBQQVJFTlQncyBsb2cgYW5kIG1pcnJvciBhcyB0aGUgcGxhY2Vob2xkZXIgKDkuMTkuMCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU91dHB1dE1hcHBpbmc8VFBhcmVudFNjb3BlLCBUU3ViZmxvd091dHB1dD4oXG4gIHN1YmZsb3dPdXRwdXQ6IFRTdWJmbG93T3V0cHV0LFxuICBwYXJlbnRTY29wZTogVFBhcmVudFNjb3BlLFxuICBwYXJlbnRDb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zPFRQYXJlbnRTY29wZSwgYW55LCBUU3ViZmxvd091dHB1dD4sXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gIGlmICghb3B0aW9ucz8ub3V0cHV0TWFwcGVyKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFRoZSBzYW1lIGJvdW5kYXJ5IGluIHRoZSBvdGhlciBkaXJlY3Rpb246IHRoZSBtYXBwZXIgaXMgaGFuZGVkIHRoZVxuICAvLyBwYXJlbnQncyB0eXBlZCBzY29wZSB0b28sIHNvIHdoYXQgaXQgcmV0dXJucyBpcyB0YWtlbiBhcyBhIHZhbHVlLlxuICBjb25zdCBtYXBwZWRPdXRwdXQgPSB1bndyYXBIYW5kbGVzKG9wdGlvbnMub3V0cHV0TWFwcGVyKHN1YmZsb3dPdXRwdXQsIHBhcmVudFNjb3BlKSk7XG5cbiAgaWYgKG1hcHBlZE91dHB1dCA9PT0gbnVsbCB8fCBtYXBwZWRPdXRwdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtYXBwZWRPdXRwdXQpKSB7XG4gICAgLy8gQSBwbGFpbiBvYmplY3QgaXMgTUVSR0VEIGZpZWxkIGJ5IGZpZWxkIChhbiBlbXB0eSBvbmUgbWVyZ2VzIG5vdGhpbmcg4oCUXG4gICAgLy8gdGhlIHBhcmVudCdzIHZhbHVlIHN0YW5kcyk7IGFueXRoaW5nIGVsc2UgbGFuZHMgd2hvbGUuXG4gICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtuZXN0ZWRLZXksIG5lc3RlZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmVzdGVkVmFsdWUpKSB7XG4gICAgICAgICAgcGFyZW50Q29udGV4dC5hcHBlbmRUb0FycmF5KFtrZXldLCBuZXN0ZWRLZXksIG5lc3RlZFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmVzdGVkVmFsdWUgPT09ICdvYmplY3QnICYmIG5lc3RlZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgcGFyZW50Q29udGV4dC5tZXJnZU9iamVjdChba2V5XSwgbmVzdGVkS2V5LCBuZXN0ZWRWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyZW50Q29udGV4dC5zZXRPYmplY3QoW2tleV0sIG5lc3RlZEtleSwgbmVzdGVkVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKG9wdGlvbnM/LmFycmF5TWVyZ2UgPT09ICdyZXBsYWNlJykge1xuICAgICAgICBwYXJlbnRDb250ZXh0LnNldEdsb2JhbChrZXksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gcGFyZW50Q29udGV4dC5nZXRHbG9iYWwoa2V5KTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgcGFyZW50Q29udGV4dC5zZXRHbG9iYWwoa2V5LCBbLi4uZXhpc3RpbmcsIC4uLnZhbHVlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyZW50Q29udGV4dC5zZXRHbG9iYWwoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50Q29udGV4dC5zZXRHbG9iYWwoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hcHBlZE91dHB1dDtcbn1cbiJdfQ==
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0lucHV0TWFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0lucHV0TWFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBR0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzFEOzs7Ozs7R0FNRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQWM7SUFDbkMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLFdBQXlCLEVBQ3pCLE9BQTBEO0lBRTFELElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDMUIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNoRCxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzVDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLFdBQXlCLEVBQ3pCLE9BQTBEO0lBRTFELE9BQU8sd0JBQXdCLENB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RSxDQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDeEQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN0QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdWJmbG93SW5wdXRNYXBwZXIg4oCUIFB1cmUgZnVuY3Rpb25zIGZvciBzdWJmbG93IGRhdGEgY29udHJhY3RzLlxuICpcbiAqIE1lbnRhbCBtb2RlbDogU3ViZmxvdyA9IFB1cmUgRnVuY3Rpb25cbiAqIC0gSXNvbGF0ZWQgc2NvcGUgKG93biBHbG9iYWxTdG9yZSlcbiAqIC0gRXhwbGljaXQgaW5wdXRzIHZpYSBpbnB1dE1hcHBlclxuICogLSBFeHBsaWNpdCBvdXRwdXRzIHZpYSBvdXRwdXRNYXBwZXJcbiAqXG4gKiB8IFNjZW5hcmlvICAgICAgICB8IEJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCBObyBpbnB1dE1hcHBlciAgfCBTdWJmbG93IHN0YXJ0cyB3aXRoIGVtcHR5IHNjb3BlICAgICAgICAgICB8XG4gKiB8IE5vIG91dHB1dE1hcHBlciB8IFN1YmZsb3cgc2NvcGUgY2hhbmdlcyBkaXNjYXJkZWQgICAgICAgICAgIHxcbiAqIHwgQm90aCBwcmVzZW50ICAgIHwgRnVsbCBkYXRhIGNvbnRyYWN0IChhcmdzIGluLCByZXN1bHRzIG91dCkgfFxuICogfCBOZWl0aGVyIHByZXNlbnQgfCBDb21wbGV0ZSBpc29sYXRpb24gKHNpZGUgZWZmZWN0cyBvbmx5KSAgICB8XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IHVud3JhcEhhbmRsZXMgfSBmcm9tICcuLi8uLi9yZWFjdGl2ZS9oYW5kbGVzLmpzJztcbmltcG9ydCB0eXBlIHsgSGFuZGxlckRlcHMsIElFeGVjdXRpb25SdW50aW1lLCBTdWJmbG93TW91bnRPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vKipcbiAqIEEgcGxhaW4gb2JqZWN0IOKAlCB0aGUgb25seSBzaGFwZSB0aGF0IGlzIHNwcmVhZCBpbnRvIHBlci1maWVsZCB3cml0ZXNcbiAqIChgc2V0T2JqZWN0KFtrZXldLCBmaWVsZCwg4oCmKWAsIGEgcm93IGFuZCBhIHJlZGFjdGlvbiB2ZXJkaWN0IHBlciBmaWVsZCkuIEFcbiAqIGBEYXRlYCwgYE1hcGAsIGBTZXRgIG9yIGNsYXNzIGluc3RhbmNlIGhhcyBubyBmaWVsZHMgdG8gc3ByZWFkIGFuZCBpcyBhXG4gKiB2YWx1ZSBpbiBpdHMgb3duIHJpZ2h0OiBpdCBsYW5kcyBXSE9MRSAodW50aWwgOS4yNC4wIGl0IHdhcyBzcHJlYWQgaW50b1xuICogemVybyB3cml0ZXMgYW5kIHNpbGVudGx5IHZhbmlzaGVkIGF0IGJvdGggYm91bmRhcmllcykuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdmFsdWVzIGZyb20gcGFyZW50IHNjb3BlIHVzaW5nIGlucHV0TWFwcGVyLlxuICpcbiAqIFdoYXQgYSBtYXBwZXIgcmV0dXJucyBpcyBhIFZBTFVFLCBub3QgYSBoYW5kbGU6IHRoZSBtYXBwZXIgcmVhZCB0aGUgcGFyZW50J3NcbiAqIHR5cGVkIHNjb3BlLCBzbyBpdHMgcmVzdWx0IG1heSBiZSDigJQgb3IgaG9sZCDigJQgYSBQcm94eSBib3VuZCB0byB0aGUgcGFyZW50XG4gKiBzdGFnZSwgYW5kIHRoZSBzZWVkIGNvbW1pdCBiZWxvdyBjbG9uZXMgaXQgKGBzdHJ1Y3R1cmVkQ2xvbmVgLCB3aGljaCBjYW5ub3RcbiAqIGNsb25lIGEgUHJveHkpLiBgdW53cmFwSGFuZGxlc2AgKHJlYWN0aXZlL2hhbmRsZXMudHMpIHN3YXBzIGVhY2ggZm9yIHRoZVxuICogdmFsdWUgYmVoaW5kIGl0LCBPKDEpLCBEYXRlcyBhbmQgTWFwcyBpbnRhY3Q7IGEgaGFuZGxlLWZyZWUgcmVzdWx0IHBhc3Nlc1xuICogdGhyb3VnaCBieSByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGFyZW50U2NvcGVWYWx1ZXM8VFBhcmVudFNjb3BlLCBUU3ViZmxvd0lucHV0PihcbiAgcGFyZW50U2NvcGU6IFRQYXJlbnRTY29wZSxcbiAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnM8VFBhcmVudFNjb3BlLCBUU3ViZmxvd0lucHV0Pixcbik6IFRTdWJmbG93SW5wdXQgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICghb3B0aW9ucz8uaW5wdXRNYXBwZXIpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBvcHRpb25zLmlucHV0TWFwcGVyKHBhcmVudFNjb3BlKTtcbiAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiB1bndyYXBIYW5kbGVzKHJlc3VsdCk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBpbml0aWFsIHNjb3BlIHZhbHVlcyBmb3IgYSBzdWJmbG93LlxuICogQWx3YXlzIGlzb2xhdGVkIOKAlCBvbmx5IGlucHV0TWFwcGVyIHZhbHVlcyBhcmUgaW5jbHVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbml0aWFsU2NvcGVWYWx1ZXM8VFBhcmVudFNjb3BlLCBUU3ViZmxvd0lucHV0PihcbiAgcGFyZW50U2NvcGU6IFRQYXJlbnRTY29wZSxcbiAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnM8VFBhcmVudFNjb3BlLCBUU3ViZmxvd0lucHV0Pixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIGV4dHJhY3RQYXJlbnRTY29wZVZhbHVlcyhwYXJlbnRTY29wZSwgb3B0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IEhhbmRsZXJEZXBzIGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAqIEtleTogc2V0cyByZWFkT25seUNvbnRleHQgdG8gbWFwcGVkIGlucHV0IHNvIFN0YWdlUnVubmVyIHBhc3NlcyBpdCB0byBTY29wZUZhY3RvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdWJmbG93SGFuZGxlckRlcHM8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PihcbiAgcGFyZW50RGVwczogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPixcbiAgc3ViZmxvd1J1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lLFxuICBtYXBwZWRJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+IHtcbiAgcmV0dXJuIHtcbiAgICBzdGFnZU1hcDogcGFyZW50RGVwcy5zdGFnZU1hcCxcbiAgICByb290OiBwYXJlbnREZXBzLnJvb3QsXG4gICAgc2NvcGVGYWN0b3J5OiBwYXJlbnREZXBzLnNjb3BlRmFjdG9yeSxcbiAgICBzdWJmbG93czogcGFyZW50RGVwcy5zdWJmbG93cyxcbiAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBwYXJlbnREZXBzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgc3RyZWFtSGFuZGxlcnM6IHBhcmVudERlcHMuc3RyZWFtSGFuZGxlcnMsXG4gICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogcGFyZW50RGVwcy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHN1YmZsb3dSdW50aW1lLFxuICAgIHJlYWRPbmx5Q29udGV4dDogbWFwcGVkSW5wdXQsXG4gICAgZXhlY3V0aW9uRW52OiBwYXJlbnREZXBzLmV4ZWN1dGlvbkVudiwgLy8gaW5oZXJpdGVkIOKAlCBsaWtlIHByb2Nlc3MuZW52XG4gICAgbmFycmF0aXZlR2VuZXJhdG9yOiBwYXJlbnREZXBzLm5hcnJhdGl2ZUdlbmVyYXRvcixcbiAgICBsb2dnZXI6IHBhcmVudERlcHMubG9nZ2VyLFxuICB9O1xufVxuXG4vKipcbiAqIFNlZWQgdGhlIHN1YmZsb3cncyBHbG9iYWxTdG9yZSB3aXRoIGluaXRpYWwgdmFsdWVzLlxuICogQ2FsbGVkIGJlZm9yZSBzdWJmbG93IGV4ZWN1dGlvbiB0byBtYWtlIGlucHV0TWFwcGVyIHZhbHVlcyBhdmFpbGFibGUuXG4gKlxuICogUmVkYWN0aW9uOiB0aGUgc2VlZCBpcyBjb21taXR0ZWQgYXMgdGhlIHN1YmZsb3cncyBgaGlzdG9yeVswXWAgYnkgaXRzIHJvb3RcbiAqIGNvbnRleHQuIGBTdWJmbG93RXhlY3V0b3JgIGluc3RhbGxzIHRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSBvbiB0aGF0IGNvbnRleHRcbiAqIGJlZm9yZSBjYWxsaW5nIHRoaXMsIHNvIHRoZSBjb21taXQgcmV0YWlucyB1bmRlciB0aGUgcG9saWN5ICg5LjE5LjApLlxuICpcbiAqIGBtb3VudGAgbmFtZXMgdGhlIHNlZWQgYnVuZGxlOiB0aGUgZW5naW5lIHBhc3NlcyB0aGUgTU9VTlQncyBmcmFtZSwgYmVjYXVzZVxuICogdGhlIG1vdW50IGlzIHRoZSBzdGFnZSB3aG9zZSBpbnB1dE1hcHBlciBwcm9kdWNlZCB0aGUgc2VlZCAoUjEzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUoXG4gIHN1YmZsb3dSdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZSxcbiAgaW5pdGlhbFZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG1vdW50PzogUGljazxTdGFnZUNvbnRleHQsICdzdGFnZU5hbWUnIHwgJ3N0YWdlSWQnIHwgJ3J1bnRpbWVTdGFnZUlkJz4sXG4pOiB2b2lkIHtcbiAgY29uc3Qgcm9vdENvbnRleHQgPSBzdWJmbG93UnVudGltZS5yb290U3RhZ2VDb250ZXh0O1xuICAvLyBUaGUgbW91bnQgdGhhdCBzZWVkcyB0aGUgc3ViZmxvdyBuYW1lcyB0aGUgc2VlZCBidW5kbGUgKFIxMykg4oCUIGFsbCB0aHJlZVxuICAvLyBmaWVsZHMsIHNvIGl0cyBgc3RhZ2VJZGAgaXMgdGhlIHN0YWdlIGl0cyBgcnVudGltZVN0YWdlSWRgIG5hbWVzLiBTYWZlOlxuICAvLyB0aGUgZW5naW5lIHJlcGxhY2VzIHRoaXMgcm9vdCBjb250ZXh0IG9uY2UgdGhlIHNlZWQgaXMgY29tbWl0dGVkLlxuICAvLyBPbWl0dGVkIOKGkiB0aGUgcm9vdCBjb250ZXh0J3Mgb3duIG5hbWVzIGFuZCBhbiBlbXB0eSBydW50aW1lU3RhZ2VJZCwgdGhlXG4gIC8vIHNoYXBlIGV2ZXJ5IHNlZWQgaGFkIHRocm91Z2ggOS4zMy4wLlxuICBpZiAobW91bnQpIHtcbiAgICByb290Q29udGV4dC5zdGFnZU5hbWUgPSBtb3VudC5zdGFnZU5hbWU7XG4gICAgcm9vdENvbnRleHQuc3RhZ2VJZCA9IG1vdW50LnN0YWdlSWQ7XG4gICAgcm9vdENvbnRleHQucnVudGltZVN0YWdlSWQgPSBtb3VudC5ydW50aW1lU3RhZ2VJZDtcbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRpYWxWYWx1ZXMpKSB7XG4gICAgLy8gQW4gRU1QVFkgcGxhaW4gb2JqZWN0IGxhbmRzIHdob2xlIHRvbzogc3ByZWFkIGludG8gemVybyB3cml0ZXMgaXRcbiAgICAvLyBzZWVkZWQgbm90aGluZywgYW5kIHRoZSBjaGlsZCByZWFkIGB1bmRlZmluZWRgIGZvciBhbiBge31gIGlucHV0XG4gICAgLy8gKDkuMTQuMCB0byA5LjIzLjMpLlxuICAgIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBbbmVzdGVkS2V5LCBuZXN0ZWRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgIHJvb3RDb250ZXh0LnNldE9iamVjdChba2V5XSwgbmVzdGVkS2V5LCBuZXN0ZWRWYWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3RDb250ZXh0LnNldEdsb2JhbChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByb290Q29udGV4dC5jb21taXQoKTtcbn1cblxuLyoqXG4gKiBBcHBseSBvdXRwdXQgbWFwcGluZyBhZnRlciBzdWJmbG93IGNvbXBsZXRpb24uXG4gKiBXcml0ZXMgbWFwcGVkIHZhbHVlcyBiYWNrIHRvIHBhcmVudCBzY29wZSB1c2luZyBtZXJnZSBzZW1hbnRpY3M6XG4gKiBhcnJheXMgYXJlIGFwcGVuZGVkLCBvYmplY3RzIGFyZSBzaGFsbG93LW1lcmdlZCwgc2NhbGFycyBhcmUgcmVwbGFjZWQuXG4gKlxuICogUmVkYWN0aW9uOiBldmVyeSB3cml0ZSBoZXJlIGdvZXMgdGhyb3VnaCBgcGFyZW50Q29udGV4dGAncyB3cml0ZSBmdW5uZWwsXG4gKiB3aGljaCBhc2tzIHRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSDigJQgc28gYSBwb2xpY3ktcmVkYWN0ZWQgb3IgcGVyLWNhbGxcbiAqIG1hcmtlZCBrZXkgbGFuZHMgaW4gdGhlIFBBUkVOVCdzIGxvZyBhbmQgbWlycm9yIGFzIHRoZSBwbGFjZWhvbGRlciAoOS4xOS4wKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5T3V0cHV0TWFwcGluZzxUUGFyZW50U2NvcGUsIFRTdWJmbG93T3V0cHV0PihcbiAgc3ViZmxvd091dHB1dDogVFN1YmZsb3dPdXRwdXQsXG4gIHBhcmVudFNjb3BlOiBUUGFyZW50U2NvcGUsXG4gIHBhcmVudENvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnM8VFBhcmVudFNjb3BlLCBhbnksIFRTdWJmbG93T3V0cHV0Pixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvcHRpb25zPy5vdXRwdXRNYXBwZXIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gVGhlIHNhbWUgYm91bmRhcnkgaW4gdGhlIG90aGVyIGRpcmVjdGlvbjogdGhlIG1hcHBlciBpcyBoYW5kZWQgdGhlXG4gIC8vIHBhcmVudCdzIHR5cGVkIHNjb3BlIHRvbywgc28gd2hhdCBpdCByZXR1cm5zIGlzIHRha2VuIGFzIGEgdmFsdWUuXG4gIGNvbnN0IG1hcHBlZE91dHB1dCA9IHVud3JhcEhhbmRsZXMob3B0aW9ucy5vdXRwdXRNYXBwZXIoc3ViZmxvd091dHB1dCwgcGFyZW50U2NvcGUpKTtcblxuICBpZiAobWFwcGVkT3V0cHV0ID09PSBudWxsIHx8IG1hcHBlZE91dHB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1hcHBlZE91dHB1dCkpIHtcbiAgICAvLyBBIHBsYWluIG9iamVjdCBpcyBNRVJHRUQgZmllbGQgYnkgZmllbGQgKGFuIGVtcHR5IG9uZSBtZXJnZXMgbm90aGluZyDigJRcbiAgICAvLyB0aGUgcGFyZW50J3MgdmFsdWUgc3RhbmRzKTsgYW55dGhpbmcgZWxzZSBsYW5kcyB3aG9sZS5cbiAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgIGZvciAoY29uc3QgW25lc3RlZEtleSwgbmVzdGVkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXN0ZWRWYWx1ZSkpIHtcbiAgICAgICAgICBwYXJlbnRDb250ZXh0LmFwcGVuZFRvQXJyYXkoW2tleV0sIG5lc3RlZEtleSwgbmVzdGVkVmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXN0ZWRWYWx1ZSA9PT0gJ29iamVjdCcgJiYgbmVzdGVkVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBwYXJlbnRDb250ZXh0Lm1lcmdlT2JqZWN0KFtrZXldLCBuZXN0ZWRLZXksIG5lc3RlZFZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJlbnRDb250ZXh0LnNldE9iamVjdChba2V5XSwgbmVzdGVkS2V5LCBuZXN0ZWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAob3B0aW9ucz8uYXJyYXlNZXJnZSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHBhcmVudENvbnRleHQuc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBwYXJlbnRDb250ZXh0LmdldEdsb2JhbChrZXkpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgICAgICBwYXJlbnRDb250ZXh0LnNldEdsb2JhbChrZXksIFsuLi5leGlzdGluZywgLi4udmFsdWVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJlbnRDb250ZXh0LnNldEdsb2JhbChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRDb250ZXh0LnNldEdsb2JhbChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWFwcGVkT3V0cHV0O1xufVxuIl19
|
|
@@ -400,8 +400,8 @@ export interface IExecutionRuntime {
|
|
|
400
400
|
getState(): Record<string, unknown>;
|
|
401
401
|
};
|
|
402
402
|
/**
|
|
403
|
-
* The redacted mirror of `globalStore` — present
|
|
404
|
-
*
|
|
403
|
+
* The redacted mirror of `globalStore` — present when the run's policy
|
|
404
|
+
* keeps one (`RunPolicy.mirror`: a run with a redaction policy), else absent.
|
|
405
405
|
* `SubflowExecutor` reads it to serve a subflow's state (9.20.0).
|
|
406
406
|
*/
|
|
407
407
|
redactedStore?: SharedMemory;
|
|
@@ -410,11 +410,12 @@ export interface IExecutionRuntime {
|
|
|
410
410
|
list(): unknown[];
|
|
411
411
|
};
|
|
412
412
|
/**
|
|
413
|
-
*
|
|
414
|
-
*
|
|
415
|
-
*
|
|
416
|
-
* parent-mount context carries the run's mirror.
|
|
413
|
+
* A fresh root frame on this runtime — its store, its log, the run's policy
|
|
414
|
+
* and mirror (`ExecutionRuntime.newRoot`). `SubflowExecutor` swaps a
|
|
415
|
+
* subflow's seed frame for the frame its first stage runs on with it.
|
|
417
416
|
*/
|
|
417
|
+
newRoot?(name: string, id: string): StageContext;
|
|
418
|
+
/** @deprecated since 9.35.0 — the mirror follows `RunPolicy.mirror`; `ExecutionRuntime.enableRedactedMirror`. */
|
|
418
419
|
enableRedactedMirror?(): void;
|
|
419
420
|
getSnapshot(options?: {
|
|
420
421
|
redact?: boolean;
|