footprintjs 9.33.0 → 9.34.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.
@@ -175,10 +175,16 @@ export class SubflowExecutor {
175
175
  // context first so the seed commit retains under the policy like every
176
176
  // other write, and lands in the mirror as the placeholder.
177
177
  this.inheritRedaction(nestedRuntime, nestedRootContext, redactionRule, keepsMirror);
178
- seedSubflowGlobalStore(nestedRuntime, seedValues);
179
- // Refresh rootStageContext so WriteBuffer sees committed data
178
+ // The seed is the mount's act too: its bundle — `history[0]` of the
179
+ // subflow's own log — carries the mount's stage, stageId and
180
+ // runtimeStageId (R13; through 9.33.0 it carried runtimeStageId '' and
181
+ // the first stage's names, which on a resume was the re-entry point).
182
+ seedSubflowGlobalStore(nestedRuntime, seedValues, parentContext);
183
+ // Refresh rootStageContext so WriteBuffer sees committed data. Named
184
+ // after the first node again — the seed context now carries the mount's
185
+ // names (R13), which belong to the seed bundle only.
180
186
  const StageContextClass = nestedRootContext.constructor;
181
- nestedRootContext = new StageContextClass('', nestedRootContext.stageName, nestedRootContext.stageId, nestedRuntime.globalStore, '', nestedRuntime.executionHistory);
187
+ nestedRootContext = new StageContextClass('', firstNode.name, firstNode.id, nestedRuntime.globalStore, '', nestedRuntime.executionHistory);
182
188
  nestedRuntime.rootStageContext = nestedRootContext;
183
189
  }
184
190
  // Read-tracking policy (#14): subflows get an ISOLATED runtime, so the
@@ -334,9 +340,15 @@ export class SubflowExecutor {
334
340
  // ─── Output Mapping ───
335
341
  if (!subflowError && mountOptions?.outputMapper) {
336
342
  try {
337
- let outputContext = parentContext;
338
- if (parentContext.branchId && parentContext.branchId !== '' && parentContext.parent) {
339
- outputContext = parentContext.parent;
343
+ // The merge-back is the MOUNT's act, so the mount's frame stages and
344
+ // commits it — its bundle carries the mount's runtimeStageId (R13).
345
+ // A branch or fork-child mount still lands its values where its
346
+ // parent writes (the parent's run namespace), as before; until 9.33.0
347
+ // it committed ON the parent's frame, so the bundle named the stage
348
+ // before the mount, or the branching decider.
349
+ const outputContext = parentContext;
350
+ if (parentContext.branchId && parentContext.parent) {
351
+ outputContext.useAddressOf(parentContext.parent);
340
352
  }
341
353
  const parentScope = outputContext.getScope();
342
354
  // For TypedScope subflows, stage functions return void — fall back to a shallow clone
@@ -355,6 +367,14 @@ export class SubflowExecutor {
355
367
  outputContext.commit();
356
368
  }
357
369
  catch (error) {
370
+ // A merge-back that failed to commit (an uncloneable value) leaves its
371
+ // writes staged on the mount's frame; the mount's exit commit below
372
+ // would throw them again, outside this catch. Through 9.33.0 they
373
+ // were staged on the parent's frame, which was not committed again,
374
+ // so the run went on — drop them, as it did. A linear mount's frame
375
+ // is left as it always was.
376
+ if (parentContext.branchId && parentContext.parent)
377
+ parentContext.discardStaged();
358
378
  parentContext.addError('outputMapperError', error.toString());
359
379
  this.deps.logger.error(`Error in outputMapper for subflow (${subflowId}):`, { error });
360
380
  }
@@ -432,4 +452,4 @@ export class SubflowExecutor {
432
452
  root.useRedactedMirror(runtime.redactedStore);
433
453
  }
434
454
  }
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==
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFJSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFVckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzVHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBOEI7SUFDdkQsSUFBSSxHQUF3QyxDQUFDO0lBQzdDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFBRSxTQUFTO1FBQ25DLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDO0FBQ3RCLENBQUM7QUFFRCx5R0FBeUc7QUFDekcsU0FBUyxZQUFZLENBQUMsS0FBYztJQUNsQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxJ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Q3pCLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7UUFDakMsSUFBSSxPQUFPLENBQUMsYUFBYTtZQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDM0UsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdWJmbG93RXhlY3V0b3Ig4oCUIElzb2xhdGlvbiBib3VuZGFyeSBmb3Igc3ViZmxvdyBleGVjdXRpb24uXG4gKlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ3JlYXRlIGlzb2xhdGVkIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIGVhY2ggc3ViZmxvd1xuICogLSBBcHBseSBpbnB1dC9vdXRwdXQgbWFwcGluZyB2aWEgU3ViZmxvd0lucHV0TWFwcGVyXG4gKiAtIERlbGVnYXRlIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAqIC0gVHJhY2sgc3ViZmxvdyByZXN1bHRzIGZvciBkZWJ1Z2dpbmcvdmlzdWFsaXphdGlvblxuICpcbiAqIEVhY2ggc3ViZmxvdyBnZXRzIGl0cyBvd24gR2xvYmFsU3RvcmUgZm9yIGlzb2xhdGlvbi5cbiAqIFRyYXZlcnNhbCB1c2VzIHRoZSBTQU1FIDctcGhhc2UgYWxnb3JpdGhtIGFzIHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2VyXG4gKiAodmlhIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KSwgc28gZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGxhenkgc3ViZmxvd3MsXG4gKiBhbmQgYWJvcnQgc2lnbmFscyBhbGwgd29yayBpbnNpZGUgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblJ1bGUgfSBmcm9tICcuLi8uLi9tZW1vcnkvcmVkYWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgU3ViZmxvd1RyYXZlcnNlckhhbmRsZSxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgUmVzdW1lRW50cnkgfSBmcm9tICcuL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IHJlbWVtYmVyUmVkYWN0ZWRTdWJmbG93U3RhdGUgfSBmcm9tICcuL3NlcnZlZFN1YmZsb3dSZXN1bHRzLmpzJztcbmltcG9ydCB7IGFwcGx5T3V0cHV0TWFwcGluZywgZ2V0SW5pdGlhbFNjb3BlVmFsdWVzLCBzZWVkU3ViZmxvd0dsb2JhbFN0b3JlIH0gZnJvbSAnLi9TdWJmbG93SW5wdXRNYXBwZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCcmVha0ZsYWcgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBUaGUgbWFwcGVkIGlucHV0LCBkZXRhY2hlZCBmcm9tIHRoZSBwYXJlbnQncyBzdGF0ZSBPTkNFIHBlciBtb3VudCAoRDEsXG4gKiA5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpLlxuICpcbiAqIFRoZSBpbnB1dE1hcHBlciByZWFkcyB0aGUgcGFyZW50J3MgTElWRSBzdGF0ZSAoYGdldFNjb3BlKClgKSwgc28gYSB2YWx1ZSBpdFxuICogcGFzc2VzIHRocm91Z2ggKGAocCkgPT4gKHsgY2ZnOiBwLmNmZyB9KWApIGlzIHRoZSBwYXJlbnQncyBjb21taXR0ZWRcbiAqIG9iamVjdCDigJQgYW5kIHRoZSBzdWJmbG93J3MgYXJncyBhcmUgZGVlcC1GUk9aRU4gaW4gcGxhY2VcbiAqIChgcmVhZG9ubHlJbnB1dCDCtyBjcmVhdGVGcm96ZW5BcmdzYCkuIFRoZSB0eXBlZCBzY29wZSBkb2VzIG5vdCBwcm94eSBhXG4gKiBmcm96ZW4gdmFsdWUgKGBhbGxvd2xpc3Qgwrcgc2hvdWxkV3JhcFdpdGhQcm94eWApLCBzbyBhIGxhdGVyXG4gKiBgc2NvcGUuY2ZnLnggPSAxYCBpbiB0aGUgcGFyZW50IG1ldCB0aGUgcmF3IGZyb3plbiBvYmplY3Q6IGEgVHlwZUVycm9yIGluXG4gKiBzdHJpY3QgY29kZS4gQmVmb3JlIDkuMjkuMCB0aGUgcGFyZW50J3MgbmV4dCB3aG9sZS1zdGF0ZSBjbG9uZSByZXBsYWNlZCB0aGVcbiAqIGZyb3plbiBvYmplY3QgKGEgbW91bnQgdGhhdCBjb21taXR0ZWQgbm90aGluZyBsZWZ0IGl0IGluIHBsYWNlIOKAlCB0aGUgYnVnXG4gKiBleGlzdGVkLCBpdCB3YXMgb25seSBzaG9ydC1saXZlZCk7IHVuZGVyIGNvcHktb24td3JpdGUgbm90aGluZyByZS1jbG9uZXMsXG4gKiBzbyB0aGUgZnJlZXplIHdvdWxkIGxhc3QgdW50aWwgdGhlIGtleSBpcyByZXdyaXR0ZW4uIEEgbW91bnQgbXVzdCBuZXZlclxuICogZWRpdCDigJQgb3IgZnJlZXplIOKAlCB0aGUgcGFyZW50J3MgY29tbWl0dGVkIG9iamVjdHM6IGV2ZXJ5IHBsYWluIG9iamVjdCxcbiAqIGFycmF5LCBgRGF0ZWAsIGBNYXBgIGFuZCBgU2V0YCB0aGUgbWFwcGVyIHJldHVybnMgaXMgY2xvbmVkIGhlcmUsIGJlZm9yZSBpdFxuICogYmVjb21lcyB0aGUgYXJncy4gQSBjbGFzcyBpbnN0YW5jZSBwYXNzZXMgYnkgcmVmZXJlbmNlLCBhcyBiZWZvcmUgKGl0XG4gKiBjYW5ub3QgY29tZSBmcm9tIGNvbW1pdHRlZCBzdGF0ZSwgYW5kIGEgY2xvbmUgd291bGQgZHJvcCBpdHMgcHJvdG90eXBlKS5cbiAqIFRoZSBzZWVkIGlzIGNsb25lZCBhZ2FpbiBhdCBpdHMgY29tbWl0LCBzbyB0aGUgc3ViZmxvdydzIHN0YXRlIGlzXG4gKiB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGRldGFjaE1hcHBlZElucHV0KGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgbGV0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0KSkge1xuICAgIGlmICghaXNEZXRhY2hhYmxlKHZhbHVlKSkgY29udGludWU7XG4gICAgKG91dCA/Pz0geyAuLi5pbnB1dCB9KVtrZXldID0gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gb3V0ID8/IGlucHV0O1xufVxuXG4vKiogQSB2YWx1ZSBgc3RydWN0dXJlZENsb25lYCByZXByb2R1Y2VzIHdpdGggaXRzIG93biB0eXBlOiBwbGFpbiBvYmplY3QsIGFycmF5LCBgRGF0ZWAsIGBNYXBgLCBgU2V0YC4gKi9cbmZ1bmN0aW9uIGlzRGV0YWNoYWJsZSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHZhbHVlIGluc3RhbmNlb2YgTWFwIHx8IHZhbHVlIGluc3RhbmNlb2YgU2V0KSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBTdWJmbG93RXhlY3V0b3I8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKlxuICAgKiBUaGUgcmVzdW1lJ3Mgb25lLXNob3QgcmUtZW50cnkgKGBkZXBzLnJlc3VtZWApLCBvciBhIHNlZWQtb25seSBvbmUgYnVpbHRcbiAgICogZnJvbSB0aGUgZGVwcmVjYXRlZCBgZGVwcy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lYC4gVW5kZWZpbmVkIG9uIGEgbm9ybWFsXG4gICAqIHJ1bi4gQXNrZWQgb25jZSBwZXIgc3ViZmxvdyBlbnRyeSDigJQgc2VlIHtAbGluayBSZXN1bWVFbnRyeX0uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3VtZTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSB0cmF2ZXJzZXJGYWN0b3J5OiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+LFxuICApIHtcbiAgICB0aGlzLnJlc3VtZSA9XG4gICAgICBkZXBzLnJlc3VtZSA/P1xuICAgICAgKGRlcHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSA/IFJlc3VtZUVudHJ5LmZyb21DYXB0dXJlczxUT3V0LCBUU2NvcGU+KGRlcHMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSkgOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWJmbG93IHdpdGggaXNvbGF0ZWQgY29udGV4dC5cbiAgICpcbiAgICogMS4gQ3JlYXRlcyBhIGZyZXNoIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIHRoZSBzdWJmbG93XG4gICAqIDIuIEFwcGxpZXMgaW5wdXQgbWFwcGluZyB0byBzZWVkIHRoZSBzdWJmbG93J3MgR2xvYmFsU3RvcmVcbiAgICogMy4gRGVsZWdhdGVzIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAgICogNC4gQXBwbGllcyBvdXRwdXQgbWFwcGluZyB0byB3cml0ZSByZXN1bHRzIGJhY2sgdG8gcGFyZW50IHNjb3BlXG4gICAqIDUuIFN0b3JlcyBleGVjdXRpb24gZGF0YSBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJmbG93KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHBhcmVudENvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXA6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+LFxuICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHN1YmZsb3dJZCA9IG5vZGUuc3ViZmxvd0lkITtcbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG5vZGUuc3ViZmxvd05hbWUgPz8gbm9kZS5uYW1lO1xuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEVudGVyaW5nICR7c3ViZmxvd05hbWV9IHN1YmZsb3dgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogc3ViZmxvd0lkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFJlc3VtZSByZS1lbnRyeSAob25lLXNob3QpIOKUgOKUgOKUgFxuICAgIC8vXG4gICAgLy8gV2hlbiB0aGlzIGVudHJ5IGlzIHRoZSByZXN1bWUncyB3YXkgYmFjayBpbnRvIGEgcGF1c2VkIHN1YmZsb3csIHRoZVxuICAgIC8vIGhvcCBuYW1lcyB3aGVyZSB0aGUgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgKHRoZSBuZXh0IG1vdW50IG9uIHRoZVxuICAgIC8vIHBhdXNlIHBhdGgsIG9yIHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiksIGNhcnJpZXMgdGhlIHN1YmZsb3cnc1xuICAgIC8vIGNhcHR1cmVkIHByZS1wYXVzZSBzdGF0ZSwgYW5kIGFueSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGluIGl0LiBUYWtlblxuICAgIC8vIE9OQ0U6IGFueSBsYXRlciBlbnRyeSBpbnRvIHRoaXMgc3ViZmxvdyDigJQgYSBsb29wIHBhc3NpbmcgaXRzIG1vdW50XG4gICAgLy8gYWdhaW4g4oCUIGdldHMgYHVuZGVmaW5lZGAgYW5kIHJ1bnMgdGhlIHJlYWwgc3ViZmxvdyBmcm9tIGl0cyByZWFsIHJvb3QsXG4gICAgLy8gaW5wdXRNYXBwZXIgYW5kIGFsbC5cbiAgICBjb25zdCByZXN1bWVIb3AgPSB0aGlzLnJlc3VtZT8uZW50ZXJTdWJmbG93KHN1YmZsb3dJZCk7XG5cbiAgICAvLyDilIDilIDilIAgSW5wdXQgTWFwcGluZyDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFRoZSBtYXBwZXIgcnVucyBvbiBFVkVSWSBlbnRyeTogaXRzIHJlc3VsdCBpcyB0aGUgc3RhZ2VzJyByZWFkLW9ubHlcbiAgICAvLyBhcmdzIChgJGdldEFyZ3MoKWApLCBhbmQgYSByZS1lbnRlcmVkIHN1YmZsb3cncyBzdGFnZXMgcmVhZCB0aGUgc2FtZVxuICAgIC8vIGFyZ3MgdGhleSByZWFkIGJlZm9yZSB0aGUgcGF1c2UgKHRoZSBwYXJlbnQncyB2aWV3IGlzIHRoZSBzYW1lIG9uZSDigJRcbiAgICAvLyBpdCB3YXMgYmxvY2tlZCBpbiB0aGlzIG1vdW50KS4gV2hhdCBhIHJlc3VtZSBjaGFuZ2VzIGlzIG9ubHkgdGhlIFNFRUQ6XG4gICAgLy8gd2hlbiB0aGUgaG9wIGNhcnJpZXMgYSBjYXB0dXJlLCB0aGUgbmVzdGVkIG1lbW9yeSBpcyBzZWVkZWQgZnJvbSB0aGVcbiAgICAvLyBjYXB0dXJlLCBub3QgZnJvbSB0aGUgbWFwcGVyIOKAlCB0aGUgY2FwdHVyZSBpcyB0aGUgcG9zdC1pbnB1dCBwcmUtcGF1c2VcbiAgICAvLyBtZW1vcnksIGFuZCBzZWVkaW5nIHRoZSBtYXBwZXIncyB2YWx1ZXMgd291bGQgY2xvYmJlciBwb3N0LWlucHV0XG4gICAgLy8gd3JpdGVzIChoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuKSB3aXRoIHRoZSBzdGFydC1vZi1zdWJmbG93IHZpZXcuXG4gICAgY29uc3QgbW91bnRPcHRpb25zID0gbm9kZS5zdWJmbG93TW91bnRPcHRpb25zO1xuICAgIGxldCBtYXBwZWRJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCByZXN1bWVDYXB0dXJlID0gcmVzdW1lSG9wPy5zZWVkO1xuICAgIGNvbnN0IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPSByZXN1bWVDYXB0dXJlICE9PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAobW91bnRPcHRpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJlbnRTY29wZSA9IHBhcmVudENvbnRleHQuZ2V0U2NvcGUoKTtcbiAgICAgICAgbWFwcGVkSW5wdXQgPSBkZXRhY2hNYXBwZWRJbnB1dChnZXRJbml0aWFsU2NvcGVWYWx1ZXMocGFyZW50U2NvcGUsIG1vdW50T3B0aW9ucykpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFwcGVkSW5wdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBtYXBwZWRJbnB1dCBpcyBjYXB0dXJlZCBpbiBTdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0IGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdpbnB1dE1hcHBlckVycm9yJywgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIGlucHV0TWFwcGVyIGZvciBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3IgfSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSAoOS4xOS4wKSwgcmVhZCBvZmYgdGhlIHBhcmVudC1tb3VudCBjb250ZXh0XG4gICAgLy8gdGhlIHdheSB0aGUgZGlhbHMgYXJlIChkdWNrLXR5cGVkOiB0aGlzIHNlY3Rpb24gY29uc3RydWN0cyBpdHMgcnVudGltZVxuICAgIC8vIGR5bmFtaWNhbGx5IHRvIGF2b2lkIHRoZSBjaXJjdWxhciBpbXBvcnQpLiBUaGUgc2VlZCBuYXJyYXRlZCBiZWxvdyBhbmRcbiAgICAvLyB0aGUgc2VlZCBDT01NSVRURUQgYmVsb3cgYm90aCByZXRhaW4gdW5kZXIgaXQ7IHRoZSBzdWJmbG93J3Mgc3RhZ2VzXG4gICAgLy8gc3RpbGwgY29tcHV0ZSBvbiB0aGUgcmVhbCBgbWFwcGVkSW5wdXRgICh0aGVpciBmcm96ZW4gYXJncykuXG4gICAgY29uc3QgcmVkYWN0aW9uUnVsZSA9IHBhcmVudENvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZT8uKCk7XG4gICAgLy8gVGhlIHJ1bidzIHJlZGFjdGVkIG1pcnJvciAoOS4yMC4wKTogdGhlIHBhcmVudC1tb3VudCBjb250ZXh0IGNhcnJpZXMgaXRcbiAgICAvLyBleGFjdGx5IHdoZW4gdGhlIHJvb3QgZW5hYmxlZCBvbmUgKGBFeGVjdXRpb25SdW50aW1lLmVuYWJsZVJlZGFjdGVkTWlycm9yYFxuICAgIC8vIHVuZGVyIGEgcG9saWN5LCBpbmhlcml0ZWQgYnkgY3JlYXRlTmV4dC9jcmVhdGVDaGlsZCkg4oCUIHJlYWQgdGhlIHdheSB0aGVcbiAgICAvLyBkaWFscyBhcmUuIFdoZW4gaXQgZG9lcywgdGhlIG5lc3RlZCBydW50aW1lIGtlZXBzIGEgbWlycm9yIG9mIGl0cyBvd24sXG4gICAgLy8gc28gdGhlIHN1YmZsb3cncyBTRVJWRUQgc3RhdGUgaXMgYSBtaXJyb3IgdG9vIOKAlCB0aGUgZm9sZCBvZiBpdHMgb3duXG4gICAgLy8gc2NydWJiZWQgbG9nIOKAlCBhbmQgbmV2ZXIgYSBzZWNvbmQgc2NydWIuIE5vIHBvbGljeTogbm8gbWlycm9yLCBub1xuICAgIC8vIGFsbG9jYXRpb24sIGFuZCB0aGUgc2VydmVkIHN0YXRlIGlzIHRoZSByYXcgaGVhcCBpdCBhbHdheXMgd2FzLlxuICAgIGNvbnN0IGtlZXBzTWlycm9yID0gcGFyZW50Q29udGV4dC5nZXRSZWRhY3RlZFNoYXJlZE1lbW9yeT8uKCkgIT09IHVuZGVmaW5lZDtcbiAgICAvLyBOYXJyYXRpdmUgcmVjZWl2ZXMgdGhlIFJFVEFJTkVEIGZvcm0gb2YgdGhlIG1hcHBlZCBpbnB1dCDigJQgYW5cbiAgICAvLyBpbnB1dE1hcHBlciBtYXkgaW5qZWN0IHZhbHVlcyBmcm9tIGFueXdoZXJlLCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgIC8vIHVuZGVyIHRoZSBwb2xpY3kgYmVmb3JlIGFueSByZWNvcmRlciBzZWVzIGl0LiBTYW1lIG9iamVjdCB3aGVuIG5vdGhpbmdcbiAgICAvLyBpbiBpdCBpcyByZWRhY3RlZCAodGhlIG5vLXBvbGljeSBwYXRoIGFsbG9jYXRlcyBub3RoaW5nKS5cbiAgICBjb25zdCBuYXJyYXRpdmVJbnB1dCA9IHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpblJlY29yZChtYXBwZWRJbnB1dCkgOiBtYXBwZWRJbnB1dDtcbiAgICAvLyBgRmxvd1N1YmZsb3dFdmVudC5kZXNjcmlwdGlvbmAgaXMgc2VtYW50aWNhbGx5IFwid2hhdCB0aGlzIHN1YmZsb3cgZG9lc1wiIOKAlCBzb3VyY2VkIGZyb21cbiAgICAvLyB0aGUgc3ViZmxvdydzIG93biByb290IHN0YWdlLCBub3QgdGhlIHBhcmVudCBtb3VudCBwb2ludC4gVGhlIG1vdW50IG5vZGUgbmV2ZXIgY2Fycmllc1xuICAgIC8vIGEgZGVzY3JpcHRpb24gKGJ1aWxkZXJzIGRvbid0IGNvcHkgaXQpLCBzbyByZWFkaW5nIGBub2RlLmRlc2NyaXB0aW9uYCBoZXJlIHJldHVybnNcbiAgICAvLyBgdW5kZWZpbmVkYCBhbmQgdGF4b25vbXkgbWFya2VycyBzZXQgb24gdGhlIHN1YmZsb3cgcm9vdCAoZS5nLiBhZ2VudGZvb3RwcmludCdzXG4gICAgLy8gYCdBZ2VudDogUmVBY3QgbG9vcCdgIC8gYCdMTE1DYWxsOiBvbmUtc2hvdCdgKSBuZXZlciByZWFjaCBkb3duc3RyZWFtIGNvbnN1bWVycy5cbiAgICBjb25zdCByb290RGVzY3JpcHRpb24gPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdPy5yb290Py5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0VudHJ5KFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93SWQsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICBuYXJyYXRpdmVJbnB1dCxcbiAgICApO1xuICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIGZvciB0aGUgbW91bnQgbm9kZSBBRlRFUlxuICAgIC8vIG9uU3ViZmxvd0VudHJ5IHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiIHdvcmtcbiAgICAvLyB1bmlmb3JtbHkgYWNyb3NzIGxpbmVhciAvIGRlY2lkZXIgLyBmb3JrIC8gc2VsZWN0b3IgLyBzdWJmbG93LW1vdW50LlxuICAgIC8vIEZpcmVzIG9uIEVOVFJZIChub3QgZXhpdCkg4oCUIGVudHJ5ID0gXCJ0aGlzIG1vdW50IHJhblwiOyB0aGVcbiAgICAvLyBzdWJmbG93J3MgY2hpbGRyZW4gZXhlY3V0ZSBhZnRlciBhcyBzZXBhcmF0ZSBzdGFnZXMuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQoXG4gICAgICBub2RlLm5hbWUsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICAnc3ViZmxvdy1tb3VudCcsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBpc29sYXRlZCBydW50aW1lIHZpYSBkeW5hbWljIGNvbnN0cnVjdGlvbiAoYXZvaWRzIGNpcmN1bGFyIGltcG9ydCkuXG4gICAgLy8gSXRzIHJvb3QgY29udGV4dCBpcyB0aGUgZmlyc3Qgc3RhZ2UgdGhlIHN1YmZsb3cgdHJhdmVyc2FsIHJ1bnMg4oCUIHRoZVxuICAgIC8vIHJlc3VtZSBob3AncyBlbnRyeSBvbiBhIHJlLWVudHJ5LCB0aGUgc3ViZmxvdydzIHJvb3Qgb3RoZXJ3aXNlLlxuICAgIGNvbnN0IEV4ZWN1dGlvblJ1bnRpbWVDbGFzcyA9IHRoaXMuZGVwcy5leGVjdXRpb25SdW50aW1lLmNvbnN0cnVjdG9yIGFzIG5ldyAoXG4gICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICBpZDogc3RyaW5nLFxuICAgICkgPT4gSUV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgY29uc3QgZmlyc3ROb2RlID0gcmVzdW1lSG9wPy5lbnRyeSA/PyBub2RlO1xuICAgIGNvbnN0IG5lc3RlZFJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZUNsYXNzKGZpcnN0Tm9kZS5uYW1lLCBmaXJzdE5vZGUuaWQpO1xuICAgIGxldCBuZXN0ZWRSb290Q29udGV4dCA9IG5lc3RlZFJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcblxuICAgIC8vIFNlZWQgR2xvYmFsU3RvcmUgd2l0aCB0aGUgcmlnaHQgc2hhcGUgZm9yIHRoZSBwYXRoOlxuICAgIC8vICAg4oCiIFJlc3VtZSBpbnRvIFRISVMgc3ViZmxvdyDihpIgc2VlZCBmcm9tIHRoZSBjYXB0dXJlZCBwcmUtcGF1c2VcbiAgICAvLyAgICAgc2NvcGUgc28gcmVzdW1lIGhhbmRsZXJzIHNlZSBoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuXG4gICAgLy8gICAgIChgbWFwcGVkSW5wdXRgIHN0aWxsIHJlYWNoZXMgdGhlIHN0YWdlcywgYXMgdGhlaXIgcmVhZC1vbmx5IGFyZ3MuKVxuICAgIC8vICAg4oCiIE5vcm1hbCBlbnRyeSDihpIgc2VlZCBmcm9tIHRoZSBpbnB1dE1hcHBlcidzIG1hcHBlZElucHV0LlxuICAgIGNvbnN0IHNlZWRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gaXNSZXN1bWVGb3JUaGlzU3ViZmxvdyA/IHJlc3VtZUNhcHR1cmUhIDogbWFwcGVkSW5wdXQ7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNlZWRWYWx1ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBzZWVkIGlzIGNvbW1pdHRlZCBhcyB0aGUgc3ViZmxvdydzIGBoaXN0b3J5WzBdYCBieSBpdHMgcm9vdFxuICAgICAgLy8gY29udGV4dCwgbm90IGJ5IGEgZmFjYWRlIOKAlCBpbnN0YWxsIHRoZSBydWxlIChhbmQgdGhlIG1pcnJvcikgb24gVEhBVFxuICAgICAgLy8gY29udGV4dCBmaXJzdCBzbyB0aGUgc2VlZCBjb21taXQgcmV0YWlucyB1bmRlciB0aGUgcG9saWN5IGxpa2UgZXZlcnlcbiAgICAgIC8vIG90aGVyIHdyaXRlLCBhbmQgbGFuZHMgaW4gdGhlIG1pcnJvciBhcyB0aGUgcGxhY2Vob2xkZXIuXG4gICAgICB0aGlzLmluaGVyaXRSZWRhY3Rpb24obmVzdGVkUnVudGltZSwgbmVzdGVkUm9vdENvbnRleHQsIHJlZGFjdGlvblJ1bGUsIGtlZXBzTWlycm9yKTtcbiAgICAgIC8vIFRoZSBzZWVkIGlzIHRoZSBtb3VudCdzIGFjdCB0b286IGl0cyBidW5kbGUg4oCUIGBoaXN0b3J5WzBdYCBvZiB0aGVcbiAgICAgIC8vIHN1YmZsb3cncyBvd24gbG9nIOKAlCBjYXJyaWVzIHRoZSBtb3VudCdzIHN0YWdlLCBzdGFnZUlkIGFuZFxuICAgICAgLy8gcnVudGltZVN0YWdlSWQgKFIxMzsgdGhyb3VnaCA5LjMzLjAgaXQgY2FycmllZCBydW50aW1lU3RhZ2VJZCAnJyBhbmRcbiAgICAgIC8vIHRoZSBmaXJzdCBzdGFnZSdzIG5hbWVzLCB3aGljaCBvbiBhIHJlc3VtZSB3YXMgdGhlIHJlLWVudHJ5IHBvaW50KS5cbiAgICAgIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUobmVzdGVkUnVudGltZSwgc2VlZFZhbHVlcywgcGFyZW50Q29udGV4dCk7XG4gICAgICAvLyBSZWZyZXNoIHJvb3RTdGFnZUNvbnRleHQgc28gV3JpdGVCdWZmZXIgc2VlcyBjb21taXR0ZWQgZGF0YS4gTmFtZWRcbiAgICAgIC8vIGFmdGVyIHRoZSBmaXJzdCBub2RlIGFnYWluIOKAlCB0aGUgc2VlZCBjb250ZXh0IG5vdyBjYXJyaWVzIHRoZSBtb3VudCdzXG4gICAgICAvLyBuYW1lcyAoUjEzKSwgd2hpY2ggYmVsb25nIHRvIHRoZSBzZWVkIGJ1bmRsZSBvbmx5LlxuICAgICAgY29uc3QgU3RhZ2VDb250ZXh0Q2xhc3MgPSBuZXN0ZWRSb290Q29udGV4dC5jb25zdHJ1Y3RvciBhcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBTdGFnZUNvbnRleHQ7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dCA9IG5ldyBTdGFnZUNvbnRleHRDbGFzcyhcbiAgICAgICAgJycsXG4gICAgICAgIGZpcnN0Tm9kZS5uYW1lLFxuICAgICAgICBmaXJzdE5vZGUuaWQsXG4gICAgICAgIG5lc3RlZFJ1bnRpbWUuZ2xvYmFsU3RvcmUsXG4gICAgICAgICcnLFxuICAgICAgICBuZXN0ZWRSdW50aW1lLmV4ZWN1dGlvbkhpc3RvcnksXG4gICAgICApO1xuICAgICAgbmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0ID0gbmVzdGVkUm9vdENvbnRleHQ7XG4gICAgfVxuXG4gICAgLy8gUmVhZC10cmFja2luZyBwb2xpY3kgKCMxNCk6IHN1YmZsb3dzIGdldCBhbiBJU09MQVRFRCBydW50aW1lLCBzbyB0aGVcbiAgICAvLyBleGVjdXRvci1sZXZlbCBwb2xpY3kgZG9lc24ndCByZWFjaCB0aGVtIHZpYSB0aGUgcm9vdCBjb250ZXh0IGNoYWluLlxuICAgIC8vIEluaGVyaXQgaXQgZnJvbSB0aGUgcGFyZW50LW1vdW50IGNvbnRleHQgKHdoaWNoIGluaGVyaXRlZCBpdCBmcm9tIElUU1xuICAgIC8vIHJvb3QgdmlhIGNyZWF0ZU5leHQvY3JlYXRlQ2hpbGQpIOKAlCBhcHBsaWVkIHRvIHRoZSBGSU5BTCBuZXN0ZWQgcm9vdCxcbiAgICAvLyBhZnRlciB0aGUgc2VlZGluZyBibG9jayBhYm92ZSBtYXkgaGF2ZSByZXBsYWNlZCBpdC4gTmVzdGVkIHN1YmZsb3dzXG4gICAgLy8gY2hhaW4gdGhlIHNhbWUgd2F5LCBvbmUgaG9wIHBlciBtb3VudC4gT3B0aW9uYWwtY2hhaW5lZCBiZWNhdXNlIHRoaXNcbiAgICAvLyBzZWN0aW9uIGlzIGR1Y2stdHlwZWQgYnkgZGVzaWduIChkeW5hbWljIGNvbnN0cnVjdGlvbiB0byBhdm9pZCB0aGVcbiAgICAvLyBjaXJjdWxhciBpbXBvcnQpIOKAlCBhbmQgc2tpcHBlZCBhdCB0aGUgZGVmYXVsdCAnZnVsbCcsIHdoZXJlIHRoZSBmcmVzaFxuICAgIC8vIG5lc3RlZCBjb250ZXh0IGlzIGFscmVhZHkgY29ycmVjdCwgc28gdGhlIGRlZmF1bHQgcGF0aCBkb2VzIHplcm8gd29yay5cbiAgICBjb25zdCBwYXJlbnRSZWFkVHJhY2tpbmcgPSBwYXJlbnRDb250ZXh0LmdldFJlYWRUcmFja2luZz8uKCk7XG4gICAgaWYgKHBhcmVudFJlYWRUcmFja2luZyAhPT0gdW5kZWZpbmVkICYmIHBhcmVudFJlYWRUcmFja2luZyAhPT0gJ2Z1bGwnKSB7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dC51c2VSZWFkVHJhY2tpbmcocGFyZW50UmVhZFRyYWNraW5nKTtcbiAgICB9XG5cbiAgICAvLyBSZWRhY3Rpb24gcnVsZSAoOS4xOS4wKSBhbmQgbWlycm9yICg5LjIwLjApOiBzYW1lIGhvcCBhcyB0aGUgZGlhbHMsXG4gICAgLy8gYXBwbGllZCB0byB0aGUgRklOQUwgbmVzdGVkIHJvb3QgKHRoZSBzZWVkaW5nIGJsb2NrIGFib3ZlIG1heSBoYXZlXG4gICAgLy8gcmVwbGFjZWQgaXQpIHNvIGV2ZXJ5IHN0YWdlIGNvbnRleHQgdGhlIHN1YmZsb3cgY3JlYXRlcyBpbmhlcml0cyBib3RoLlxuICAgIHRoaXMuaW5oZXJpdFJlZGFjdGlvbihuZXN0ZWRSdW50aW1lLCBuZXN0ZWRSb290Q29udGV4dCwgcmVkYWN0aW9uUnVsZSwga2VlcHNNaXJyb3IpO1xuXG4gICAgLy8gV3JpdGUtdHJhY2tpbmcgcG9saWN5ICgjMTNjLUEpOiBzYW1lIGluaGVyaXRhbmNlIGhvcCBhcyByZWFkVHJhY2tpbmdcbiAgICAvLyBhYm92ZSDigJQgc3ViZmxvdyBydW50aW1lcyBhcmUgaXNvbGF0ZWQsIHNvIHRoZSBwYXJlbnQtbW91bnQgY29udGV4dCdzXG4gICAgLy8gbW9kZSBpcyBwdXNoZWQgaW50byB0aGUgRklOQUwgbmVzdGVkIHJvb3Qgd2l0aCB0aGUgc2FtZSBkdWNrLXR5cGVcbiAgICAvLyBndWFyZCBhbmQgdGhlIHNhbWUgc2tpcC1hdC1kZWZhdWx0IGZhc3QgcGF0aC5cbiAgICBjb25zdCBwYXJlbnRXcml0ZVRyYWNraW5nID0gcGFyZW50Q29udGV4dC5nZXRXcml0ZVRyYWNraW5nPy4oKTtcbiAgICBpZiAocGFyZW50V3JpdGVUcmFja2luZyAhPT0gdW5kZWZpbmVkICYmIHBhcmVudFdyaXRlVHJhY2tpbmcgIT09ICdmdWxsJykge1xuICAgICAgbmVzdGVkUm9vdENvbnRleHQudXNlV3JpdGVUcmFja2luZyhwYXJlbnRXcml0ZVRyYWNraW5nKTtcbiAgICB9XG5cbiAgICAvLyBDb21taXQtdmFsdWVzIGVuY29kaW5nICgjMTNjLUIpOiBzYW1lIGluaGVyaXRhbmNlIGhvcCBhcyB0aGUgdHdvXG4gICAgLy8gdHJhY2tpbmcgZGlhbHMgYWJvdmUg4oCUIHN1YmZsb3cgcnVudGltZXMgYXJlIGlzb2xhdGVkLCBzbyB0aGVcbiAgICAvLyBwYXJlbnQtbW91bnQgY29udGV4dCdzIG1vZGUgaXMgcHVzaGVkIGludG8gdGhlIEZJTkFMIG5lc3RlZCByb290IHdpdGhcbiAgICAvLyB0aGUgc2FtZSBkdWNrLXR5cGUgZ3VhcmQgYW5kIHRoZSBzYW1lIHNraXAtYXQtZGVmYXVsdCBmYXN0IHBhdGgsIHNvXG4gICAgLy8gbmVzdGVkIGNoYXJ0cyBjb21taXQgaW4gdGhlIHNhbWUgZW5jb2RpbmcgYXMgdGhlIHBhcmVudC5cbiAgICBjb25zdCBwYXJlbnRDb21taXRWYWx1ZXMgPSBwYXJlbnRDb250ZXh0LmdldENvbW1pdFZhbHVlcz8uKCk7XG4gICAgaWYgKHBhcmVudENvbW1pdFZhbHVlcyAhPT0gdW5kZWZpbmVkICYmIHBhcmVudENvbW1pdFZhbHVlcyAhPT0gJ2Z1bGwnKSB7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dC51c2VDb21taXRWYWx1ZXMocGFyZW50Q29tbWl0VmFsdWVzKTtcbiAgICB9XG5cbiAgICAvLyBQZXItd3JpdGUgcmVhZCBwcm92ZW5hbmNlICgjUDEpOiBmb3VydGggZGlhbCwgc2FtZSBpbmhlcml0YW5jZSBob3Ag4oCUXG4gICAgLy8gZHVjay10eXBlIGd1YXJkLCBza2lwLWF0LWRlZmF1bHQgKCdvZmYnKSBmYXN0IHBhdGgsIHNvIG5lc3RlZCBjaGFydHNcbiAgICAvLyBzdGFtcCBUcmFjZUVudHJ5LnJlYWRLZXlzIGV4YWN0bHkgd2hlbiB0aGUgcGFyZW50IGRvZXMuXG4gICAgY29uc3QgcGFyZW50V3JpdGVQcm92ZW5hbmNlID0gcGFyZW50Q29udGV4dC5nZXRXcml0ZVByb3ZlbmFuY2U/LigpO1xuICAgIGlmIChwYXJlbnRXcml0ZVByb3ZlbmFuY2UgIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRXcml0ZVByb3ZlbmFuY2UgIT09ICdvZmYnKSB7XG4gICAgICBuZXN0ZWRSb290Q29udGV4dC51c2VXcml0ZVByb3ZlbmFuY2UocGFyZW50V3JpdGVQcm92ZW5hbmNlKTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIHN1YmZsb3cgcm9vdCBub2RlIOKAlCBzdHJpcCBpc1N1YmZsb3dSb290IHRvIHByZXZlbnQgcmUtZGVsZWdhdGlvbi5cbiAgICAvL1xuICAgIC8vIFBSRVNFUlZFIGBuZXh0YC4gRWFybGllciByZXZpc2lvbnMgc3RyaXBwZWQgYG5leHRgIHdoZW5ldmVyIHRoZVxuICAgIC8vIHN1YmZsb3cgcm9vdCBoYWQgY2hpbGRyZW4sIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYG5leHRgIHdhc1xuICAgIC8vIGFsd2F5cyB0aGUgT1VURVIgbW91bnQncyBjb250aW51YXRpb24gbGVha2luZyBpbnRvIHRoZSBpbm5lclxuICAgIC8vIHRyZWUuIFRoYXQgYXNzdW1wdGlvbiB3YXMgd3Jvbmc6IHRoZSByZXNvbHZlZCBzdWJmbG93IHJvb3Qnc1xuICAgIC8vIGBuZXh0YCBpcyB0aGUgSU5ORVIgam9pbiBzdGFnZSAoZS5nLiwgUGFyYWxsZWwncyBNZXJnZSBhZnRlciBhXG4gICAgLy8gZmFuLW91dCwgVG9UJ3MgUHJ1bmVyKS4gU3RyaXBwaW5nIGl0IGJyb2tlIGNvbXBvc2l0ZSBzdWJmbG93cyDigJRcbiAgICAvLyB0aGUgam9pbiBzdGFnZSBuZXZlciByYW4sIHNvIHRoZSBzdWJmbG93IHJldHVybmVkIHBhcnRpYWwgc3RhdGUuXG4gICAgLy9cbiAgICAvLyBUaGUgb3V0ZXIgbW91bnQncyBwb3N0LXN1YmZsb3cgY29udGludWF0aW9uIGlzIGhhbmRsZWQgc2VwYXJhdGVseVxuICAgIC8vIGJ5IHRoZSBwYXJlbnQgdHJhdmVyc2VyIHZpYSBgcGFyZW50Q29udGV4dC5uZXh0Tm9kZWAgYW5kIGlzIG5ldmVyXG4gICAgLy8gY29uZmxhdGVkIHdpdGggdGhlIGlubmVyIHN1YmZsb3cncyBgbmV4dGAgY2hhaW4uXG4gICAgY29uc3Qgc3ViZmxvd05vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgLi4ubm9kZSxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyDilIDilIDilIAgRXhlY3V0ZSB2aWEgZmFjdG9yeSB0cmF2ZXJzZXIg4pSA4pSA4pSAXG4gICAgLy8gVGhlIGZhY3RvcnkgY3JlYXRlcyBhIGZ1bGwgRmxvd2NoYXJ0VHJhdmVyc2VyIHdpdGggdGhlIHNhbWUgNy1waGFzZSBhbGdvcml0aG0sXG4gICAgLy8gc2hhcmluZyB0aGUgcGFyZW50J3Mgc3RhZ2VNYXAsIHN1YmZsb3dzIGRpY3QsIGFuZCBuYXJyYXRpdmUgZ2VuZXJhdG9yLlxuICAgIGxldCBzdWJmbG93T3V0cHV0OiBhbnk7XG4gICAgbGV0IHN1YmZsb3dFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRyYXZlcnNlckhhbmRsZTogU3ViZmxvd1RyYXZlcnNlckhhbmRsZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRyYXZlcnNlckhhbmRsZSA9IHRoaXMudHJhdmVyc2VyRmFjdG9yeSh7XG4gICAgICAgIC8vIFRoZSBSRUFMIHN1YmZsb3cgZ3JhcGgg4oCUIGV2ZXJ5IGlkIGluc2lkZSB0aGUgc3ViZmxvdyAobG9vcCB0YXJnZXRzLFxuICAgICAgICAvLyBhIHJlLXZpc2l0IG9mIHRoZSBwYXVzZWQgc3RhZ2UpIHJlc29sdmVzIGFnYWluc3QgaXQsIHJlLWVudHJ5IG9yIG5vdC5cbiAgICAgICAgcm9vdDogc3ViZmxvd05vZGUsXG4gICAgICAgIC8vIFdoZXJlIHRoaXMgdHJhdmVyc2FsIHN0YXJ0cyBvbiBhIHJlc3VtZSByZS1lbnRyeTsgdmlzaXRlZCBvbmNlIOKAlFxuICAgICAgICAvLyBhbmQgdGhlIHNpYmxpbmcgcGF1c2VzIGl0IHJhaXNlcyBvbmNlIHRoYXQgZW50cnkncyBjaGFpbiBlbmRzLlxuICAgICAgICAuLi4ocmVzdW1lSG9wPy5lbnRyeSAmJiB7IGVudHJ5OiByZXN1bWVIb3AuZW50cnkgfSksXG4gICAgICAgIC4uLihyZXN1bWVIb3A/LnBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiByZXN1bWVIb3AucGVuZGluZ1BhdXNlcyB9KSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogbmVzdGVkUnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiBtYXBwZWRJbnB1dCxcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICAvLyBSRkMtMDAzIEQxOiB0aGUgbW91bnQgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCDigJQgdGhlIHN1YmZsb3cgcm9vdFxuICAgICAgICAvLyBzdGFnZSdzIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgc28gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHRoZSBtb3VudC5cbiAgICAgICAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDogcGFyZW50VHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICB9KTtcblxuICAgICAgc3ViZmxvd091dHB1dCA9IGF3YWl0IHRyYXZlcnNlckhhbmRsZS5leGVjdXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gUGF1c2VTaWduYWwgaXMgbm90IGFuIGVycm9yIOKAlCBwcmVwZW5kIHN1YmZsb3cgSUQgYW5kIHJlLXRocm93XG4gICAgICAvLyBpbW1lZGlhdGVseS4gTm8gZXJyb3IgbG9nZ2luZywgbm8gc3ViZmxvd1Jlc3VsdCByZWNvcmRpbmcg4oCUXG4gICAgICAvLyB0aGUgcGF1c2UgaXMgY29udHJvbCBmbG93LlxuICAgICAgLy9cbiAgICAgIC8vIEJFRk9SRSByZS10aHJvdywgc25hcHNob3QgdGhlIG5lc3RlZCBydW50aW1lJ3MgYHNoYXJlZFN0YXRlYFxuICAgICAgLy8gb250byB0aGUgc2lnbmFsLiBUaGlzIGlzIHRoZSBvbmx5IGNoYW5jZSDigJQgb25jZSB3ZSByZS10aHJvdyxcbiAgICAgIC8vIHRoZSBvdXRlciB0cmF2ZXJzZXIgdW53aW5kcyBhbmQgdGhlIG5lc3RlZCBydW50aW1lIGlzIEdDJ2QuIE9uXG4gICAgICAvLyByZXN1bWUsIHdlJ2xsIHJlLXNlZWQgYSBmcmVzaCBuZXN0ZWQgcnVudGltZSBmcm9tIHRoaXMgY2FwdHVyZVxuICAgICAgLy8gc28gcmVzdW1lIGhhbmRsZXJzIGNhbiByZWFkIHRoZSBwcmUtcGF1c2Ugc3ViZmxvdyBzY29wZS5cbiAgICAgIC8vXG4gICAgICAvLyBDYXB0dXJlIGlzIGtleWVkIGJ5IHRoZSBTQU1FIHBhdGgtcHJlZml4ZWQgYHN1YmZsb3dJZGAgdXNlZCBpblxuICAgICAgLy8gYHN1YmZsb3dQYXRoYCwgc28gcmVzdW1lIGNhbiBsb29rIHVwIFwic2NvcGUgZm9yIHNmLWZvb1wiIGJ5IGlkLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc25hcCA9IG5lc3RlZFJ1bnRpbWUuZ2V0U25hcHNob3QoKTtcbiAgICAgICAgICAvLyBgc2hhcmVkU3RhdGVgIGlzIHRoZSBzdWJmbG93J3Mgd29ya2luZyBtZW1vcnkgYXQgcGF1c2VcbiAgICAgICAgICAvLyB0aW1lIChhZnRlciBldmVyeSBjb21taXR0ZWQgd3JpdGUgdXAgdG8gdGhlIHBhdXNlKS4gQ2FzdFxuICAgICAgICAgIC8vIGlzIHNhZmUg4oCUIFNoYXJlZE1lbW9yeSBzbmFwc2hvdCByZXR1cm5zIGEgcGxhaW4gb2JqZWN0LlxuICAgICAgICAgIGVycm9yLmNhcHR1cmVTdWJmbG93U2NvcGUoc3ViZmxvd0lkLCBzbmFwLnNoYXJlZFN0YXRlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gU25hcHNob3QgZmFpbHVyZSBzaG91bGRuJ3QgbWFzayB0aGUgcGF1c2Ug4oCUIGxldCB0aGUgcGF1c2VcbiAgICAgICAgICAvLyBidWJibGUgdXA7IHJlc3VtZSB3aWxsIGZhbGwgYmFjayB0byBjaGVja3BvaW50LnNoYXJlZFN0YXRlXG4gICAgICAgICAgLy8gKHRoZSBwYXJlbnQgc2NvcGUpIGZvciB0aGlzIHN1YmZsb3cncyBrZXlzLlxuICAgICAgICB9XG4gICAgICAgIGVycm9yLnByZXBlbmRTdWJmbG93KHN1YmZsb3dJZCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgc3ViZmxvd0Vycm9yID0gZXJyb3I7XG4gICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdzdWJmbG93RXJyb3InLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwgeyBlcnJvciB9KTtcbiAgICB9XG5cbiAgICAvLyBBbHdheXMgbWVyZ2UgbmVzdGVkIHN1YmZsb3cgcmVzdWx0cyAoZXZlbiBvbiBlcnJvciDigJQgcGFydGlhbCByZXN1bHRzIGFpZCBkZWJ1Z2dpbmcpXG4gICAgaWYgKHRyYXZlcnNlckhhbmRsZSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhdmVyc2VySGFuZGxlLmdldFN1YmZsb3dSZXN1bHRzKCkpIHtcbiAgICAgICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBCcmVhayBwcm9wYWdhdGlvbiAob3B0LWluIHZpYSBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrKSDilIDilIBcbiAgICAvL1xuICAgIC8vIElmIHRoZSBzdWJmbG93J3MgaW5uZXIgdHJhdmVyc2FsIGJyb2tlIChiZWNhdXNlIGEgc3RhZ2UgY2FsbGVkXG4gICAgLy8gYHNjb3BlLiRicmVhayhyZWFzb24pYCkgQU5EIHRoZSBtb3VudCBkZWNsYXJlZCBgcHJvcGFnYXRlQnJlYWs6IHRydWVgLFxuICAgIC8vIGZvcndhcmQgdGhlIGJyZWFrIHN0YXRlIHRvIHRoZSBQQVJFTlQncyBicmVha0ZsYWcuIFRoZSBwYXJlbnRcbiAgICAvLyB0cmF2ZXJzZXIgd2lsbCBzZWUgYHNob3VsZEJyZWFrYCBvbiBpdHMgbmV4dCBzdGVwIGFuZCBzdG9wLlxuICAgIC8vXG4gICAgLy8gV2l0aG91dCB0aGlzLCBpbm5lciBicmVha3MgYXJlIGxvY2FsbHkgc2NvcGVkIHRvIHRoZSBzdWJmbG93IOKAlCB0aGVcbiAgICAvLyBwYXJlbnQgY29udGludWVzIGFzIGlmIHRoZSBzdWJmbG93IHJldHVybmVkIG5vcm1hbGx5LlxuICAgIC8vXG4gICAgLy8gSU1QT1JUQU5UOiB0aGlzIHJ1bnMgQkVGT1JFIGBvdXRwdXRNYXBwaW5nYCBiZWxvdywgaW50ZW50aW9uYWxseS4gVGhlXG4gICAgLy8gb3V0cHV0TWFwcGVyIHN0aWxsIGV4ZWN1dGVzLCBzbyB0aGUgc3ViZmxvdydzIHBhcnRpYWwgcmVzdWx0IHN0aWxsXG4gICAgLy8gbGFuZHMgaW4gdGhlIHBhcmVudCBzY29wZS4gQ29uc3VtZXJzIHdobyBuZWVkIHRvIHN1cHByZXNzIG91dHB1dCBvblxuICAgIC8vIGJyZWFrIGNoZWNrIHRoZSBicmVhayBzdGF0ZSBpbnNpZGUgdGhlaXIgb3V0cHV0TWFwcGVyIGFuZCBlYXJseS1yZXR1cm4uXG4gICAgLy8gU2VlIGBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrYCBKU0RvYyBmb3IgcmF0aW9uYWxlLlxuICAgIGlmICh0cmF2ZXJzZXJIYW5kbGUgJiYgbW91bnRPcHRpb25zPy5wcm9wYWdhdGVCcmVhayA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaW5uZXJCcmVhayA9IHRyYXZlcnNlckhhbmRsZS5nZXRCcmVha1N0YXRlKCk7XG4gICAgICBpZiAoaW5uZXJCcmVhay5zaG91bGRCcmVhaykge1xuICAgICAgICBicmVha0ZsYWcuc2hvdWxkQnJlYWsgPSB0cnVlO1xuICAgICAgICBpZiAoaW5uZXJCcmVhay5yZWFzb24gIT09IHVuZGVmaW5lZCAmJiBicmVha0ZsYWcucmVhc29uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBicmVha0ZsYWcucmVhc29uID0gaW5uZXJCcmVhay5yZWFzb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmFpc2UgYSBwYXJlbnQtbGV2ZWwgb25CcmVhayBldmVudCBzbyByZWNvcmRlcnMgY2FuIGRpc3Rpbmd1aXNoXG4gICAgICAgIC8vIHRoZSBpbm5lciBvcmlnaW5hdGluZyBicmVhayAoZmlyZWQgaW5zaWRlIHRoZSBzdWJmbG93KSBmcm9tIHRoaXNcbiAgICAgICAgLy8gcHJvcGFnYXRlZCBvbmUgKGZpcmVkIGF0IHRoZSBtb3VudCBsZXZlbCBvbiB0aGUgcGFyZW50KS5cbiAgICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKHN1YmZsb3dOYW1lLCBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LCBpbm5lckJyZWFrLnJlYXNvbiwgc3ViZmxvd0lkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93VHJlZUNvbnRleHQgPSBuZXN0ZWRSdW50aW1lLmdldFNuYXBzaG90KCk7XG5cbiAgICAvLyDilIDilIDilIAgT3V0cHV0IE1hcHBpbmcg4pSA4pSA4pSAXG4gICAgaWYgKCFzdWJmbG93RXJyb3IgJiYgbW91bnRPcHRpb25zPy5vdXRwdXRNYXBwZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoZSBtZXJnZS1iYWNrIGlzIHRoZSBNT1VOVCdzIGFjdCwgc28gdGhlIG1vdW50J3MgZnJhbWUgc3RhZ2VzIGFuZFxuICAgICAgICAvLyBjb21taXRzIGl0IOKAlCBpdHMgYnVuZGxlIGNhcnJpZXMgdGhlIG1vdW50J3MgcnVudGltZVN0YWdlSWQgKFIxMykuXG4gICAgICAgIC8vIEEgYnJhbmNoIG9yIGZvcmstY2hpbGQgbW91bnQgc3RpbGwgbGFuZHMgaXRzIHZhbHVlcyB3aGVyZSBpdHNcbiAgICAgICAgLy8gcGFyZW50IHdyaXRlcyAodGhlIHBhcmVudCdzIHJ1biBuYW1lc3BhY2UpLCBhcyBiZWZvcmU7IHVudGlsIDkuMzMuMFxuICAgICAgICAvLyBpdCBjb21taXR0ZWQgT04gdGhlIHBhcmVudCdzIGZyYW1lLCBzbyB0aGUgYnVuZGxlIG5hbWVkIHRoZSBzdGFnZVxuICAgICAgICAvLyBiZWZvcmUgdGhlIG1vdW50LCBvciB0aGUgYnJhbmNoaW5nIGRlY2lkZXIuXG4gICAgICAgIGNvbnN0IG91dHB1dENvbnRleHQgPSBwYXJlbnRDb250ZXh0O1xuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkge1xuICAgICAgICAgIG91dHB1dENvbnRleHQudXNlQWRkcmVzc09mKHBhcmVudENvbnRleHQucGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gb3V0cHV0Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBGb3IgVHlwZWRTY29wZSBzdWJmbG93cywgc3RhZ2UgZnVuY3Rpb25zIHJldHVybiB2b2lkIOKAlCBmYWxsIGJhY2sgdG8gYSBzaGFsbG93IGNsb25lXG4gICAgICAgIC8vIG9mIHRoZSBzdWJmbG93J3Mgc2hhcmVkIHN0YXRlIHNvIG91dHB1dE1hcHBlciBjYW4gYWNjZXNzIGFsbCBzY29wZSB2YWx1ZXMgd3JpdHRlblxuICAgICAgICAvLyBkdXJpbmcgdGhlIHN1YmZsb3cuIFdlIHNoYWxsb3ctY2xvbmUgdG8gYXZvaWQgYWxpYXNpbmcgdGhlIGxpdmUgU2hhcmVkTWVtb3J5IGNvbnRleHQuXG4gICAgICAgIC8vIE5PVEU6IHRoZSBmdWxsIHNjb3BlIGlzIHBhc3NlZCAobm90IGp1c3QgZGVjbGFyZWQgb3V0cHV0cykg4oCUIG91dHB1dE1hcHBlciBtdXN0XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgc2VsZWN0IHdoYXQgdG8gcHJvcGFnYXRlIHRvIHRoZSBwYXJlbnQuXG4gICAgICAgIC8vIFJlZGFjdGlvbjogYGFwcGx5T3V0cHV0TWFwcGluZ2Agd3JpdGVzIHRocm91Z2ggYG91dHB1dENvbnRleHRgIChhXG4gICAgICAgIC8vIFN0YWdlQ29udGV4dCwgbm90IGEgZmFjYWRlKS4gVGhlIGNvbnRleHQncyB3cml0ZSBmdW5uZWwgYXNrcyB0aGVcbiAgICAgICAgLy8gcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHNoYXJlZCB3aXRoIHRoZSBzdWJmbG93J3MgY29udGV4dHMsIHNvIGEga2V5XG4gICAgICAgIC8vIHRoZSBwb2xpY3kgbmFtZXMgT1IgYSBrZXkgbWFya2VkIHBlci1jYWxsIGluc2lkZSB0aGUgc3ViZmxvdyBpc1xuICAgICAgICAvLyBzY3J1YmJlZCBpbiB0aGUgUEFSRU5UJ3MgbG9nIGFuZCBtaXJyb3IgdG9vICg5LjE5LjA7IGJlZm9yZSwgdGhpc1xuICAgICAgICAvLyBtZXJnZS1iYWNrIHJldGFpbmVkIHBsYWludGV4dCkuXG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZU91dHB1dCA9IHN1YmZsb3dPdXRwdXQgPz8geyAuLi5zdWJmbG93VHJlZUNvbnRleHQuc2hhcmVkU3RhdGUgfTtcbiAgICAgICAgY29uc3QgbWFwcGVkT3V0cHV0ID0gYXBwbHlPdXRwdXRNYXBwaW5nKGVmZmVjdGl2ZU91dHB1dCwgcGFyZW50U2NvcGUsIG91dHB1dENvbnRleHQsIG1vdW50T3B0aW9ucyk7XG5cbiAgICAgICAgb3V0cHV0Q29udGV4dC5jb21taXQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gQSBtZXJnZS1iYWNrIHRoYXQgZmFpbGVkIHRvIGNvbW1pdCAoYW4gdW5jbG9uZWFibGUgdmFsdWUpIGxlYXZlcyBpdHNcbiAgICAgICAgLy8gd3JpdGVzIHN0YWdlZCBvbiB0aGUgbW91bnQncyBmcmFtZTsgdGhlIG1vdW50J3MgZXhpdCBjb21taXQgYmVsb3dcbiAgICAgICAgLy8gd291bGQgdGhyb3cgdGhlbSBhZ2Fpbiwgb3V0c2lkZSB0aGlzIGNhdGNoLiBUaHJvdWdoIDkuMzMuMCB0aGV5XG4gICAgICAgIC8vIHdlcmUgc3RhZ2VkIG9uIHRoZSBwYXJlbnQncyBmcmFtZSwgd2hpY2ggd2FzIG5vdCBjb21taXR0ZWQgYWdhaW4sXG4gICAgICAgIC8vIHNvIHRoZSBydW4gd2VudCBvbiDigJQgZHJvcCB0aGVtLCBhcyBpdCBkaWQuIEEgbGluZWFyIG1vdW50J3MgZnJhbWVcbiAgICAgICAgLy8gaXMgbGVmdCBhcyBpdCBhbHdheXMgd2FzLlxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkgcGFyZW50Q29udGV4dC5kaXNjYXJkU3RhZ2VkKCk7XG4gICAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ291dHB1dE1hcHBlckVycm9yJywgZXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIG91dHB1dE1hcHBlciBmb3Igc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dSZXN1bHQ6IFN1YmZsb3dSZXN1bHQgPSB7XG4gICAgICBzdWJmbG93SWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHRyZWVDb250ZXh0OiB7XG4gICAgICAgIGdsb2JhbENvbnRleHQ6IHN1YmZsb3dUcmVlQ29udGV4dC5zaGFyZWRTdGF0ZSxcbiAgICAgICAgc3RhZ2VDb250ZXh0czogc3ViZmxvd1RyZWVDb250ZXh0LmV4ZWN1dGlvblRyZWUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgaGlzdG9yeTogc3ViZmxvd1RyZWVDb250ZXh0LmNvbW1pdExvZyxcbiAgICAgICAgLy8gVGhlIHN1YmZsb3cncyBvd24gZm9sZCBiYXNlIHRyYXZlbHMgd2l0aCBpdHMgb3duIGxvZyDigJQgc2FtZVxuICAgICAgICAvLyBjb250cmFjdCBhcyB0aGUgcnVuLWxldmVsIGBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlYC5cbiAgICAgICAgaW5pdGlhbFN0YXRlOiBzdWJmbG93VHJlZUNvbnRleHQuaW5pdGlhbFN0YXRlLFxuICAgICAgfSxcbiAgICAgIHBhcmVudFN0YWdlSWQ6IHBhcmVudENvbnRleHQuZ2V0U3RhZ2VJZCgpLFxuICAgIH07XG5cbiAgICBjb25zdCBzdWJmbG93RGVmID0gdGhpcy5kZXBzLnN1YmZsb3dzPy5bc3ViZmxvd0lkXTtcbiAgICBpZiAoc3ViZmxvd0RlZiAmJiAoc3ViZmxvd0RlZiBhcyBhbnkpLmJ1aWxkVGltZVN0cnVjdHVyZSkge1xuICAgICAgc3ViZmxvd1Jlc3VsdC5waXBlbGluZVN0cnVjdHVyZSA9IChzdWJmbG93RGVmIGFzIGFueSkuYnVpbGRUaW1lU3RydWN0dXJlO1xuICAgIH1cblxuICAgIC8vIFRoZSBzZXJ2ZWQgc3RhdGUgKDkuMjAuMCk6IHRoZSBuZXN0ZWQgbWlycm9yJ3MgZmluYWwgc3RhdGUsIHJlbWVtYmVyZWRcbiAgICAvLyBCRVNJREUgdGhlIHJlc3VsdCDigJQgYHRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIHN0YXlzIHRoZSBsaXZlIGhlYXAgZm9yXG4gICAgLy8gdGhlIHBsYWluIHNuYXBzaG90IGFuZCB0aGUgY2hlY2twb2ludDsgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYFxuICAgIC8vIHN1YnN0aXR1dGVzIHRoZSBtaXJyb3IgdGhyb3VnaCBgc2VydmVkU3ViZmxvd1Jlc3VsdHNgLiBBYnNlbnQgd2l0aG91dFxuICAgIC8vIGEgcG9saWN5LiBUaGUgZXhpdCBldmVudCBiZWxvdyBjYXJyaWVzIHRoZSBzYW1lIHNlcnZlZCB2aWV3OyB3aXRob3V0IGFcbiAgICAvLyBtaXJyb3IgaXQgY2FycmllcyB0aGUgaGVhcCByZXRhaW5lZCB1bmRlciB0aGUgcnVsZSAocGVyLWNhbGwgbWFya3NcbiAgICAvLyBhbG9uZSBrZWVwIG5vIG1pcnJvcikg4oCUIHRoZSBzYW1lIG9iamVjdCB3aGVuIG5vdGhpbmcgaXMgcmVkYWN0ZWQuXG4gICAgY29uc3QgcmF3U3RhdGUgPSBzdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHQ7XG4gICAgY29uc3QgbWlycm9yU3RhdGUgPSBuZXN0ZWRSdW50aW1lLnJlZGFjdGVkU3RvcmU/LmdldFN0YXRlKCk7XG4gICAgaWYgKG1pcnJvclN0YXRlICE9PSB1bmRlZmluZWQpIHJlbWVtYmVyUmVkYWN0ZWRTdWJmbG93U3RhdGUoc3ViZmxvd1Jlc3VsdCwgbWlycm9yU3RhdGUpO1xuICAgIGNvbnN0IGV4aXRTdGF0ZSA9IG1pcnJvclN0YXRlID8/IChyZWRhY3Rpb25SdWxlID8gcmVkYWN0aW9uUnVsZS5yZXRhaW5SZWNvcmQocmF3U3RhdGUpIDogcmF3U3RhdGUpO1xuXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KHN1YmZsb3dJZCwgc3ViZmxvd1Jlc3VsdCk7XG4gICAgLy8gQWRkaXRpdmUgcGVyLWV4ZWN1dGlvbiBrZXkgKGRlc2lnbjogZG9jcy9kZXNpZ24vc3ViZmxvdy1jb21taXQtdmlzaWJpbGl0eS5tZCkuIEEgTE9PUElOR1xuICAgIC8vIHN1YmZsb3cgcmUtZW50ZXJzIHdpdGggdGhlIFNBTUUgc3ViZmxvd0lkLCBzbyB0aGUgcGF0aCBrZXkgYWJvdmUgaXMgT1ZFUldSSVRURU4gZWFjaFxuICAgIC8vIGl0ZXJhdGlvbiAoYmFjay1jb21wYXQ6IGl0IGhvbGRzIHRoZSBMQVNUIGl0ZXJhdGlvbiDigJQgd2hhdCBnZXRTdWJ0cmVlU25hcHNob3QvbGlzdFN1YmZsb3dQYXRoc1xuICAgIC8vIGFuZCB0aGUgZXVpIGZhbGxiYWNrIHNlZSwgdW5jaGFuZ2VkKS4gQUxTTyBrZXkgYnkgdGhlIG1vdW50J3MgVU5JUVVFIHJ1bnRpbWVTdGFnZUlkIHNvIEVWRVJZXG4gICAgLy8gaXRlcmF0aW9uJ3MgcmVzdWx0IGlzIHJldGFpbmVkIGFuZCBhZGRyZXNzYWJsZSAoZXVpIHBlci1sb29wIGRyaWxsLWRvd24sIHBlci1zY29wZSBsb2NhbGl6YXRpb24pLlxuICAgIC8vIHJ1bnRpbWVTdGFnZUlkIGFsd2F5cyBjb250YWlucyAnIyc7IHN1YmZsb3dJZCBuZXZlciBkb2VzIOKAlCBzbyB0aGV5IG5ldmVyIGNvbGxpZGUsIGFuZFxuICAgIC8vIGxpc3RTdWJmbG93UGF0aHMgZmlsdGVycyAnIycga2V5cyB0byBrZWVwIGl0cyBwYXRoLW9ubHkgY29udHJhY3QuIFRoZSBwYXVzZSBjaGVja3BvaW50IGZpbHRlcnNcbiAgICAvLyB0aGVzZSBvdXQgKGJ1aWxkUGF1c2VDaGVja3BvaW50KSBzbyBpdCBzdGF5cyBsZWFuLlxuICAgIGNvbnN0IG1vdW50UnVudGltZVN0YWdlSWQgPSBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBpZiAobW91bnRSdW50aW1lU3RhZ2VJZCAmJiBtb3VudFJ1bnRpbWVTdGFnZUlkICE9PSBzdWJmbG93SWQpIHtcbiAgICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChtb3VudFJ1bnRpbWVTdGFnZUlkLCBzdWJmbG93UmVzdWx0KTtcbiAgICB9XG5cbiAgICBwYXJlbnRDb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ3N1YmZsb3cnLCBgRXhpdGluZyAke3N1YmZsb3dOYW1lfSBzdWJmbG93YCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHN1YmZsb3dJZCxcbiAgICB9KTtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0V4aXQoc3ViZmxvd05hbWUsIHN1YmZsb3dJZCwgcGFyZW50VHJhdmVyc2FsQ29udGV4dCwgZXhpdFN0YXRlKTtcblxuICAgIHBhcmVudENvbnRleHQuY29tbWl0KCk7XG5cbiAgICBpZiAoc3ViZmxvd0Vycm9yKSB7XG4gICAgICB0aHJvdyBzdWJmbG93RXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1YmZsb3dPdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogUHVzaCB0aGUgcnVuJ3MgcmVkYWN0aW9uIGludG8gYSBuZXN0ZWQgcm9vdCB0aGUgd2F5IHRoZSBkaWFscyBhcmUgcHVzaGVkXG4gICAqIOKAlCB0aGUgdHJpcGxpY2F0ZWQgcHJvcGFnYXRpb24gKHJvb3QgaW5zdGFsbCDCtyBjcmVhdGVOZXh0L2NyZWF0ZUNoaWxkIMK3XG4gICAqIHRoaXMgaG9wKS4gQ2FsbGVkIFRXSUNFIG9uIHB1cnBvc2U6IG9uIHRoZSBydW50aW1lJ3MgZmlyc3Qgcm9vdCwgc28gdGhlXG4gICAqIFNFRUQgY29tbWl0IChgaGlzdG9yeVswXWApIHJldGFpbnMgYW5kIG1pcnJvcnMgdW5kZXIgdGhlIHBvbGljeSwgYW5kIG9uXG4gICAqIHRoZSBGSU5BTCByb290IGFmdGVyIHRoZSBzZWVkaW5nIGJsb2NrIHJlcGxhY2VzIGl0LiBSdWxlIGJlZm9yZSBtaXJyb3IsXG4gICAqIGFzIHRoZSBleGVjdXRvciBvcmRlcnMgdGhlbSAodGhlIG1pcnJvcidzIHNlZWQgaXMgc2NydWJiZWQgd2l0aCB0aGUgcnVsZTtcbiAgICogZm9yIGEgbmVzdGVkIHJ1bnRpbWUgdGhhdCBzZWVkIGlzIGVtcHR5IOKAlCBpdHMgaW5wdXQgYXJyaXZlcyBhcyBhIGNvbW1pdCkuXG4gICAqIGBlbmFibGVSZWRhY3RlZE1pcnJvcmAgaXMgaWRlbXBvdGVudCwgc28gdGhlIHNlY29uZCBjYWxsIG9ubHkgcmUtaW5zdGFsbHNcbiAgICogdGhlIE9ORSBtaXJyb3Igb24gdGhlIGZyZXNoIHJvb3QuXG4gICAqL1xuICBwcml2YXRlIGluaGVyaXRSZWRhY3Rpb24oXG4gICAgcnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWUsXG4gICAgcm9vdDogU3RhZ2VDb250ZXh0LFxuICAgIHJ1bGU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQsXG4gICAga2VlcHNNaXJyb3I6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGlmIChydWxlKSByb290LnVzZVJlZGFjdGlvblJ1bGUocnVsZSk7XG4gICAgaWYgKCFrZWVwc01pcnJvcikgcmV0dXJuO1xuICAgIHJ1bnRpbWUuZW5hYmxlUmVkYWN0ZWRNaXJyb3I/LigpO1xuICAgIGlmIChydW50aW1lLnJlZGFjdGVkU3RvcmUpIHJvb3QudXNlUmVkYWN0ZWRNaXJyb3IocnVudGltZS5yZWRhY3RlZFN0b3JlKTtcbiAgfVxufVxuIl19
@@ -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
@@ -55,6 +55,14 @@ export declare class StageContext {
55
55
  */
56
56
  tags?: readonly string[];
57
57
  runId: string;
58
+ /**
59
+ * The run namespace this frame writes and reads in when that is not its own
60
+ * `runId` — set once, before the frame's first write, by
61
+ * {@link useAddressOf}. Its one user is a subflow mount's merge-back (R13):
62
+ * the record names the mount, the values land where the mount's parent
63
+ * writes. Absent → `runId`, so every other frame is untouched.
64
+ */
65
+ private addressRunId?;
58
66
  branchId?: string;
59
67
  isDecider: boolean;
60
68
  isFork: boolean;
@@ -360,6 +368,18 @@ export declare class StageContext {
360
368
  getTransactionBuffer(): TransactionBuffer;
361
369
  /** Builds an absolute path inside the shared memory (run namespace). */
362
370
  private withNamespace;
371
+ /** The run namespace writes and reads go to: {@link addressRunId}, else `runId`. */
372
+ private get namespaceId();
373
+ /**
374
+ * Write and read at ANOTHER frame's address (its run namespace) while this
375
+ * frame keeps its own identity on the record — `stage`, `stageId`,
376
+ * `runtimeStageId`, tags. A subflow mount's merge-back is the one caller
377
+ * (`SubflowExecutor · executeSubflow`, R13): the mount frame of a branch or
378
+ * fork child lands its values where its parent writes, as before, and its
379
+ * bundle now names the mount instead of the stage before it. Refused once
380
+ * the frame has staged anything — its buffer's address is fixed then.
381
+ */
382
+ useAddressOf(frame: StageContext): void;
363
383
  patch(path: string[], key: string, value: unknown, shouldRedact?: boolean): RedactionVerdict;
364
384
  set(path: string[], key: string, value: unknown): void;
365
385
  merge(path: string[], key: string, value: unknown, shouldRedact?: boolean): RedactionVerdict;