footprintjs 10.1.0 → 10.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CLAUDE.md +18 -0
  2. package/dist/esm/index.d.ts +2 -0
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/attempt/category.d.ts +6 -0
  5. package/dist/esm/lib/attempt/category.js +26 -2
  6. package/dist/esm/lib/attempt/runner.d.ts +3 -1
  7. package/dist/esm/lib/attempt/runner.js +26 -6
  8. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
  9. package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
  10. package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
  11. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +5 -2
  12. package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
  13. package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
  14. package/dist/esm/lib/engine/handlers/stageError.d.ts +2 -0
  15. package/dist/esm/lib/engine/handlers/stageError.js +13 -1
  16. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -1
  17. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +6 -2
  18. package/dist/esm/lib/engine/narrative/types.d.ts +4 -1
  19. package/dist/esm/lib/engine/narrative/types.js +1 -1
  20. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +14 -6
  21. package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
  22. package/dist/esm/lib/errors/terminalFailure.js +60 -0
  23. package/dist/esm/lib/memory/StageContext.d.ts +14 -0
  24. package/dist/esm/lib/memory/StageContext.js +32 -1
  25. package/dist/esm/lib/memory/attention.d.ts +26 -0
  26. package/dist/esm/lib/memory/attention.js +171 -0
  27. package/dist/esm/lib/memory/frameTypes.d.ts +8 -0
  28. package/dist/esm/lib/memory/frameTypes.js +1 -1
  29. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +14 -0
  30. package/dist/esm/lib/recorder/ControlDepRecorder.js +18 -1
  31. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +4 -0
  32. package/dist/esm/lib/runner/FlowChartExecutor.js +163 -127
  33. package/dist/index.js +1 -1
  34. package/dist/lib/attempt/category.js +27 -2
  35. package/dist/lib/attempt/runner.js +25 -5
  36. package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
  37. package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
  38. package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
  39. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -2
  40. package/dist/lib/engine/handlers/commitStage.js +24 -5
  41. package/dist/lib/engine/handlers/stageError.js +15 -2
  42. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +6 -2
  43. package/dist/lib/engine/narrative/types.js +1 -1
  44. package/dist/lib/engine/traversal/FlowchartTraverser.js +12 -4
  45. package/dist/lib/errors/terminalFailure.js +64 -0
  46. package/dist/lib/memory/StageContext.js +32 -1
  47. package/dist/lib/memory/attention.js +175 -0
  48. package/dist/lib/memory/frameTypes.js +1 -1
  49. package/dist/lib/recorder/ControlDepRecorder.js +18 -1
  50. package/dist/lib/runner/FlowChartExecutor.js +163 -127
  51. package/dist/types/index.d.ts +2 -0
  52. package/dist/types/lib/attempt/category.d.ts +6 -0
  53. package/dist/types/lib/attempt/runner.d.ts +3 -1
  54. package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
  55. package/dist/types/lib/engine/handlers/stageError.d.ts +2 -0
  56. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -1
  57. package/dist/types/lib/engine/narrative/types.d.ts +4 -1
  58. package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
  59. package/dist/types/lib/memory/StageContext.d.ts +14 -0
  60. package/dist/types/lib/memory/attention.d.ts +26 -0
  61. package/dist/types/lib/memory/frameTypes.d.ts +8 -0
  62. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +14 -0
  63. package/dist/types/lib/runner/FlowChartExecutor.d.ts +4 -0
  64. package/package.json +6 -6
@@ -16,8 +16,8 @@
16
16
  */
17
17
  import { DECISION_RESULT } from '../../decide/types.js';
18
18
  import { isPauseSignal } from '../../pause/types.js';
19
- import { commitStage } from './commitStage.js';
20
- import { loggableStageError, recordStageError } from './stageError.js';
19
+ import { commitStage, commitStageWrites } from './commitStage.js';
20
+ import { captureStageFailure, loggableStageError, recordStageError } from './stageError.js';
21
21
  export class DeciderHandler {
22
22
  deps;
23
23
  constructor(deps) {
@@ -70,10 +70,11 @@ export class DeciderHandler {
70
70
  catch (error) {
71
71
  // PauseSignal is expected control flow — commit and re-throw without error logging.
72
72
  if (isPauseSignal(error)) {
73
- context.commit();
73
+ commitStageWrites(context);
74
74
  throw error;
75
75
  }
76
- context.commit();
76
+ captureStageFailure(context, error);
77
+ commitStageWrites(context);
77
78
  const served = recordStageError(context, error);
78
79
  this.deps.logger.error(`Error in pipeline (${branchPath}) stage [${node.name}]:`, {
79
80
  error: loggableStageError(context, error),
@@ -123,7 +124,10 @@ export class DeciderHandler {
123
124
  // so consumers tracking "did this stage run" work uniformly.
124
125
  this.deps.narrativeGenerator.onStageExecuted(node.name, node.description, traversalContext, 'decider');
125
126
  const branchContext = context.createChild(branchPath, chosen.id, chosen.name, chosen.id);
127
+ // An exclusive branch is the same escaping chain, including trampoline hops.
128
+ // Parallel fan-out children keep their own slots instead.
129
+ branchContext.failureState = context.failureState;
126
130
  return { kind: 'dispatch', chosen, branchContext };
127
131
  }
128
132
  }
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjaWRlckhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9EZWNpZGVySGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXJELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWN2RSxNQUFNLE9BQU8sY0FBYztJQUNJO0lBQTdCLFlBQTZCLElBQStCO1FBQS9CLFNBQUksR0FBSixJQUFJLENBQTJCO0lBQUcsQ0FBQztJQUVoRTs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUNwQixJQUE2QixFQUM3QixTQUFzQyxFQUN0QyxPQUFxQixFQUNyQixTQUFtQyxFQUNuQyxVQUE4QixFQUM5QixRQUFrQyxFQUNsQyxXQUF3QyxFQUN4QyxnQkFBbUM7UUFFbkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUN6QyxJQUFJLEVBQ0osU0FBUyxFQUNULE9BQU8sRUFDUCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFFBQVEsRUFDUixnQkFBZ0IsQ0FDakIsQ0FBQztRQUVGLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM5QixPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzRixDQUFD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TUFBTSxDQUFDLElBQUk7WUFDeEIsU0FBUyxFQUFFLFNBQVMsSUFBSSxzQkFBc0IsUUFBUSxFQUFFO1NBQ3pELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUNyQyxJQUFJLENBQUMsSUFBSSxFQUNULE1BQU0sQ0FBQyxJQUFJLEVBQ1gsU0FBUyxFQUNULElBQUksQ0FBQyxXQUFXLEVBQ2hCLGdCQUFnQixFQUNoQixnQkFBZ0IsQ0FDakIsQ0FBQztRQUNGLGtFQUFrRTtRQUNsRSw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXZHLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBb0IsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5HLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlY2lkZXJIYW5kbGVyIOKAlCBTaW5nbGUtY2hvaWNlIGNvbmRpdGlvbmFsIGJyYW5jaGluZy5cbiAqXG4gKiBIYW5kbGVzIHNjb3BlLWJhc2VkIGRlY2lkZXJzIChzdGFnZSBJUyB0aGUgZGVjaWRlciwgcmV0dXJucyBicmFuY2ggSUQpLlxuICogTG9ncyBmbG93IGNvbnRyb2wgZGVjaXNpb25zIGFuZCBuYXJyYXRpdmUgc2VudGVuY2VzLlxuICpcbiAqIFR3byBlbnRyeSBwb2ludHM6XG4gKiAtIGBwcmVwYXJlRGlzcGF0Y2hgIOKAlCBydW5zIHRoZSBkZWNpZGVyIHN0YWdlLCBjb21taXRzLCByZXNvbHZlcyB0aGUgY2hvc2VuXG4gKiAgIGJyYW5jaCwgZmlyZXMgbmFycmF0aXZlLCBhbmQgcmV0dXJucyB0aGUgY2hvc2VuIG5vZGUgKyBicmFuY2ggY29udGV4dFxuICogICBXSVRIT1VUIGV4ZWN1dGluZyBpdC4gVGhlIHRyYXZlcnNlcidzIHRyYW1wb2xpbmUgZHJpdmVyIHVzZXMgdGhpcyBzbyBhXG4gKiAgIGRlY2lkZXIgd2l0aCBubyBjb250aW51YXRpb24gb2YgaXRzIG93biBjYW4gaGFuZCB0aGUgYnJhbmNoIHRvIHRoZVxuICogICBkcml2ZXIgYXMgYSBmbGF0IGhvcCAobG9vcC1oZWF2eSBkZWNpZGVyIGNoYXJ0cyBzdGF5IGZsYXQtc3RhY2tlZCkuXG4gKiAtIGBoYW5kbGVTY29wZUJhc2VkYCDigJQgcHJlcGFyZURpc3BhdGNoICsgaW1tZWRpYXRlIGJyYW5jaCBleGVjdXRpb24gdmlhXG4gKiAgIHRoZSBwcm92aWRlZCBgZXhlY3V0ZU5vZGVgIGNhbGxiYWNrLiBLZXB0IGZvciBkaXJlY3QvYWR2YW5jZWQgY2FsbGVyc1xuICogICBhbmQgZm9yIGRlY2lkZXJzIHdob3NlIG93biBgLm5leHRgIG11c3QgcnVuIGFmdGVyIHRoZSBicmFuY2ggY29tcGxldGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGVjaXNpb25FdmlkZW5jZSB9IGZyb20gJy4uLy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBERUNJU0lPTl9SRVNVTFQgfSBmcm9tICcuLi8uLi9kZWNpZGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyRGVwcywgU3RhZ2VGdW5jdGlvbiB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGNvbW1pdFN0YWdlIH0gZnJvbSAnLi9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgeyBsb2dnYWJsZVN0YWdlRXJyb3IsIHJlY29yZFN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRlTm9kZUZuLCBSdW5TdGFnZUZuIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgRXhlY3V0ZU5vZGVGbiwgUnVuU3RhZ2VGbiB9O1xuXG4vKipcbiAqIFJlc3VsdCBvZiBgcHJlcGFyZURpc3BhdGNoYCDigJQgZWl0aGVyIHRoZSBkZWNpZGVyIHN0YWdlIGJyb2tlIChubyBicmFuY2hcbiAqIHJ1bnM7IGBicmFuY2hJZGAgaXMgdGhlIGRlY2lkZXIncyByZXR1cm4gdmFsdWUpLCBvciBhIGJyYW5jaCB3YXMgY2hvc2VuXG4gKiBhbmQgaXMgcmVhZHkgdG8gZXhlY3V0ZSBpbiBgYnJhbmNoQ29udGV4dGAuXG4gKi9cbmV4cG9ydCB0eXBlIERlY2lkZXJEaXNwYXRjaDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+ID1cbiAgfCB7IGtpbmQ6ICdicmVhayc7IGJyYW5jaElkOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2Rpc3BhdGNoJzsgY2hvc2VuOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjsgYnJhbmNoQ29udGV4dDogU3RhZ2VDb250ZXh0IH07XG5cbmV4cG9ydCBjbGFzcyBEZWNpZGVySGFuZGxlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+KSB7fVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBzY29wZS1iYXNlZCBkZWNpZGVyIChjcmVhdGVkIHZpYSBhZGREZWNpZGVyRnVuY3Rpb24pLlxuICAgKiBUaGUgc3RhZ2UgZnVuY3Rpb24gSVMgdGhlIGRlY2lkZXIg4oCUIGl0cyByZXR1cm4gdmFsdWUgaXMgdGhlIGJyYW5jaCBJRC5cbiAgICogRXhlY3V0aW9uIG9yZGVyOiBydW5TdGFnZShmbikg4oaSIGNvbW1pdCDihpIgcmVzb2x2ZSBjaGlsZCDihpIgbG9nIOKGkiBleGVjdXRlTm9kZShjaGlsZCkuXG4gICAqL1xuICBhc3luYyBoYW5kbGVTY29wZUJhc2VkKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0YWdlRnVuYzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW4gfSxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcnVuU3RhZ2U6IFJ1blN0YWdlRm48VE91dCwgVFNjb3BlPixcbiAgICBleGVjdXRlTm9kZTogRXhlY3V0ZU5vZGVGbjxUT3V0LCBUU2NvcGU+LFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGRpc3BhdGNoID0gYXdhaXQgdGhpcy5wcmVwYXJlRGlzcGF0Y2goXG4gICAgICBub2RlLFxuICAgICAgc3RhZ2VGdW5jLFxuICAgICAgY29udGV4dCxcbiAgICAgIGJyZWFrRmxhZyxcbiAgICAgIGJyYW5jaFBhdGgsXG4gICAgICBydW5TdGFnZSxcbiAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgKTtcblxuICAgIGlmIChkaXNwYXRjaC5raW5kID09PSAnYnJlYWsnKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2guYnJhbmNoSWQ7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlTm9kZShkaXNwYXRjaC5jaG9zZW4sIGRpc3BhdGNoLmJyYW5jaENvbnRleHQsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIFN0YW1wIGludm9rZXIgY29udGV4dCBvbiBQYXVzZVNpZ25hbCBkdXJpbmcgYnViYmxlLXVwLlxuICAgICAgLy8gVGhlIGRlY2lkZXIgKG5vZGUpIGlzIHRoZSBpbnZva2VyOyBpdHMgLm5leHQgaXMgdGhlIGNvbnRpbnVhdGlvbiB0YXJnZXQuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihub2RlLmlkISk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgZGVjaWRlciBzdGFnZSBhbmQgcmVzb2x2ZSB0aGUgY2hvc2VuIGJyYW5jaCBXSVRIT1VUIGV4ZWN1dGluZyBpdC5cbiAgICogRXZlcnl0aGluZyB1cCB0byAoYW5kIGluY2x1ZGluZykgdGhlIGBvbkRlY2lzaW9uYC9gb25TdGFnZUV4ZWN1dGVkYFxuICAgKiBuYXJyYXRpdmUgYW5kIHRoZSBicmFuY2ggY29udGV4dCBjcmVhdGlvbiBoYXBwZW5zIGhlcmUg4oCUIG9ubHkgdGhlXG4gICAqIGJyYW5jaCBleGVjdXRpb24gaXRzZWxmIGlzIGxlZnQgdG8gdGhlIGNhbGxlci5cbiAgICovXG4gIGFzeW5jIHByZXBhcmVEaXNwYXRjaChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuIH0sXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHJ1blN0YWdlOiBSdW5TdGFnZUZuPFRPdXQsIFRTY29wZT4sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8RGVjaWRlckRpc3BhdGNoPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBicmVha0ZuID0gKCkgPT4gKGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWUpO1xuXG4gICAgbGV0IGJyYW5jaElkOiBzdHJpbmc7XG4gICAgbGV0IGRlY2lzaW9uRXZpZGVuY2U6IERlY2lzaW9uRXZpZGVuY2UgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YWdlT3V0cHV0ID0gYXdhaXQgcnVuU3RhZ2Uobm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIC8vIERldGVjdCBEZWNpc2lvblJlc3VsdCBmcm9tIGRlY2lkZSgpIGhlbHBlciB2aWEgU3ltYm9sIGJyYW5kXG4gICAgICBpZiAoc3RhZ2VPdXRwdXQgJiYgdHlwZW9mIHN0YWdlT3V0cHV0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmhhcyhzdGFnZU91dHB1dCBhcyBvYmplY3QsIERFQ0lTSU9OX1JFU1VMVCkpIHtcbiAgICAgICAgYnJhbmNoSWQgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5icmFuY2g7XG4gICAgICAgIGRlY2lzaW9uRXZpZGVuY2UgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5ldmlkZW5jZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyYW5jaElkID0gU3RyaW5nKHN0YWdlT3V0cHV0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3cg4oCUIGNvbW1pdCBhbmQgcmUtdGhyb3cgd2l0aG91dCBlcnJvciBsb2dnaW5nLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgIGNvbnN0IHNlcnZlZCA9IHJlY29yZFN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHtcbiAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25FcnJvcihub2RlLm5hbWUsIHNlcnZlZC5tZXNzYWdlLCBzZXJ2ZWQuc3RydWN0dXJlZEVycm9yLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGNvbW1pdFN0YWdlKGNvbnRleHQsIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3IsIG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICByZXR1cm4geyBraW5kOiAnYnJlYWsnLCBicmFuY2hJZCB9O1xuICAgIH1cblxuICAgIC8vIFJlc29sdmUgY2hpbGQgYnkgbWF0Y2hpbmcgYnJhbmNoIElEIGFnYWluc3Qgbm9kZS5jaGlsZHJlbi5cbiAgICAvLyBNYXRjaCBicmFuY2hJZCBmaXJzdCAob3JpZ2luYWwgdW5wcmVmaXhlZCBJRCksIGZhbGwgYmFjayB0byBpZCBmb3IgYmFja3dhcmQgY29tcGF0LlxuICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAgIGxldCBjaG9zZW4gPSBjaGlsZHJlbi5maW5kKChjaGlsZCkgPT4gKGNoaWxkLmJyYW5jaElkID8/IGNoaWxkLmlkKSA9PT0gYnJhbmNoSWQpO1xuXG4gICAgLy8gRmFsbCBiYWNrIHRvIGRlZmF1bHQgYnJhbmNoXG4gICAgaWYgKCFjaG9zZW4pIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRDaGlsZCA9IGNoaWxkcmVuLmZpbmQoKGNoaWxkKSA9PiAoY2hpbGQuYnJhbmNoSWQgPz8gY2hpbGQuaWQpID09PSAnZGVmYXVsdCcpO1xuICAgICAgaWYgKGRlZmF1bHRDaGlsZCkge1xuICAgICAgICBjaG9zZW4gPSBkZWZhdWx0Q2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU2NvcGUtYmFzZWQgZGVjaWRlciAnJHtub2RlLm5hbWV9JyByZXR1cm5lZCBicmFuY2ggSUQgJyR7YnJhbmNoSWR9JyB3aGljaCBkb2Vzbid0IG1hdGNoIGFueSBjaGlsZCBhbmQgbm8gZGVmYXVsdCBicmFuY2ggaXMgc2V0YDtcbiAgICAgICAgY29udGV4dC5hZGRFcnJvcignZGVjaWRlckVycm9yJywgZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2hvc2VuTmFtZSA9IGNob3Nlbi5uYW1lO1xuICAgIGNvbnN0IHdhc0RlZmF1bHQgPSAoY2hvc2VuLmJyYW5jaElkID8/IGNob3Nlbi5pZCkgIT09IGJyYW5jaElkO1xuICAgIGNvbnN0IHJhdGlvbmFsZSA9IGNvbnRleHQuZGVidWc/LmxvZ0NvbnRleHQ/LmRlY2lkZXJSYXRpb25hbGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBicmFuY2hSZWFzb246IHN0cmluZztcbiAgICBpZiAod2FzRGVmYXVsdCkge1xuICAgICAgYnJhbmNoUmVhc29uID0gYFJldHVybmVkICcke2JyYW5jaElkfScgKG5vIG1hdGNoKSwgZmVsbCBiYWNrIHRvIGRlZmF1bHQg4oaSICR7Y2hvc2VuTmFtZX0gcGF0aC5gO1xuICAgIH0gZWxzZSBpZiAocmF0aW9uYWxlKSB7XG4gICAgICBicmFuY2hSZWFzb24gPSBgQmFzZWQgb246ICR7cmF0aW9uYWxlfSDihpIgY2hvc2UgJHtjaG9zZW5OYW1lfSBwYXRoLmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyYW5jaFJlYXNvbiA9IGBFdmFsdWF0ZWQgc2NvcGUgYW5kIHJldHVybmVkICcke2JyYW5jaElkfScg4oaSIGNob3NlICR7Y2hvc2VuTmFtZX0gcGF0aC5gO1xuICAgIH1cbiAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ2JyYW5jaCcsIGJyYW5jaFJlYXNvbiwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IGNob3Nlbi5uYW1lLFxuICAgICAgcmF0aW9uYWxlOiByYXRpb25hbGUgfHwgYHJldHVybmVkIGJyYW5jaElkOiAke2JyYW5jaElkfWAsXG4gICAgfSk7XG5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uRGVjaXNpb24oXG4gICAgICBub2RlLm5hbWUsXG4gICAgICBjaG9zZW4ubmFtZSxcbiAgICAgIHJhdGlvbmFsZSxcbiAgICAgIG5vZGUuZGVzY3JpcHRpb24sXG4gICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgZGVjaXNpb25FdmlkZW5jZSxcbiAgICApO1xuICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIEFGVEVSIHRoZSBzcGVjaWFsaXplZCBldmVudFxuICAgIC8vIHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiIHdvcmsgdW5pZm9ybWx5LlxuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKG5vZGUubmFtZSwgbm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgJ2RlY2lkZXInKTtcblxuICAgIGNvbnN0IGJyYW5jaENvbnRleHQgPSBjb250ZXh0LmNyZWF0ZUNoaWxkKGJyYW5jaFBhdGggYXMgc3RyaW5nLCBjaG9zZW4uaWQsIGNob3Nlbi5uYW1lLCBjaG9zZW4uaWQpO1xuXG4gICAgcmV0dXJuIHsga2luZDogJ2Rpc3BhdGNoJywgY2hvc2VuLCBicmFuY2hDb250ZXh0IH07XG4gIH1cbn1cbiJdfQ==
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjaWRlckhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9EZWNpZGVySGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXJELE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWM1RixNQUFNLE9BQU8sY0FBYztJQUNJO0lBQTdCLFlBQTZCLElBQStCO1FBQS9CLFNBQUksR0FBSixJQUFJLENBQTJCO0lBQUcsQ0FBQztJQUVoRTs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUNwQixJQUE2QixFQUM3QixTQUFzQyxFQUN0QyxPQUFxQixFQUNyQixTQUFtQyxFQUNuQyxVQUE4QixFQUM5QixRQUFrQyxFQUNsQyxXQUF3QyxFQUN4QyxnQkFBbUM7UUFFbkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUN6QyxJQUFJLEVBQ0osU0FBUyxFQUNULE9BQU8sRUFDUCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFFBQVEsRUFDUixnQkFBZ0IsQ0FDakIsQ0FBQztRQUVGLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM5QixPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxV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MUYsQ0FBQztRQUNELE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFO1lBQ2xELFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSTtZQUN4QixTQUFTLEVBQUUsU0FBUyxJQUFJLHNCQUFzQixRQUFRLEVBQUU7U0FDekQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQ3JDLElBQUksQ0FBQyxJQUFJLEVBQ1QsTUFBTSxDQUFDLElBQUksRUFDWCxTQUFTLEVBQ1QsSUFBSSxDQUFDLFdBQVcsRUFDaEIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixDQUNqQixDQUFDO1FBQ0Ysa0VBQWtFO1FBQ2xFLDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFdkcsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFvQixFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkcsNkVBQTZFO1FBQzdFLDBEQUEwRDtRQUMxRCxhQUFhLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFFbEQsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ3JELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVjaWRlckhhbmRsZXIg4oCUIFNpbmdsZS1jaG9pY2UgY29uZGl0aW9uYWwgYnJhbmNoaW5nLlxuICpcbiAqIEhhbmRsZXMgc2NvcGUtYmFzZWQgZGVjaWRlcnMgKHN0YWdlIElTIHRoZSBkZWNpZGVyLCByZXR1cm5zIGJyYW5jaCBJRCkuXG4gKiBMb2dzIGZsb3cgY29udHJvbCBkZWNpc2lvbnMgYW5kIG5hcnJhdGl2ZSBzZW50ZW5jZXMuXG4gKlxuICogVHdvIGVudHJ5IHBvaW50czpcbiAqIC0gYHByZXBhcmVEaXNwYXRjaGAg4oCUIHJ1bnMgdGhlIGRlY2lkZXIgc3RhZ2UsIGNvbW1pdHMsIHJlc29sdmVzIHRoZSBjaG9zZW5cbiAqICAgYnJhbmNoLCBmaXJlcyBuYXJyYXRpdmUsIGFuZCByZXR1cm5zIHRoZSBjaG9zZW4gbm9kZSArIGJyYW5jaCBjb250ZXh0XG4gKiAgIFdJVEhPVVQgZXhlY3V0aW5nIGl0LiBUaGUgdHJhdmVyc2VyJ3MgdHJhbXBvbGluZSBkcml2ZXIgdXNlcyB0aGlzIHNvIGFcbiAqICAgZGVjaWRlciB3aXRoIG5vIGNvbnRpbnVhdGlvbiBvZiBpdHMgb3duIGNhbiBoYW5kIHRoZSBicmFuY2ggdG8gdGhlXG4gKiAgIGRyaXZlciBhcyBhIGZsYXQgaG9wIChsb29wLWhlYXZ5IGRlY2lkZXIgY2hhcnRzIHN0YXkgZmxhdC1zdGFja2VkKS5cbiAqIC0gYGhhbmRsZVNjb3BlQmFzZWRgIOKAlCBwcmVwYXJlRGlzcGF0Y2ggKyBpbW1lZGlhdGUgYnJhbmNoIGV4ZWN1dGlvbiB2aWFcbiAqICAgdGhlIHByb3ZpZGVkIGBleGVjdXRlTm9kZWAgY2FsbGJhY2suIEtlcHQgZm9yIGRpcmVjdC9hZHZhbmNlZCBjYWxsZXJzXG4gKiAgIGFuZCBmb3IgZGVjaWRlcnMgd2hvc2Ugb3duIGAubmV4dGAgbXVzdCBydW4gYWZ0ZXIgdGhlIGJyYW5jaCBjb21wbGV0ZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEZWNpc2lvbkV2aWRlbmNlIH0gZnJvbSAnLi4vLi4vZGVjaWRlL3R5cGVzLmpzJztcbmltcG9ydCB7IERFQ0lTSU9OX1JFU1VMVCB9IGZyb20gJy4uLy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJEZXBzLCBTdGFnZUZ1bmN0aW9uIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgY29tbWl0U3RhZ2UsIGNvbW1pdFN0YWdlV3JpdGVzIH0gZnJvbSAnLi9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgeyBjYXB0dXJlU3RhZ2VGYWlsdXJlLCBsb2dnYWJsZVN0YWdlRXJyb3IsIHJlY29yZFN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRlTm9kZUZuLCBSdW5TdGFnZUZuIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgRXhlY3V0ZU5vZGVGbiwgUnVuU3RhZ2VGbiB9O1xuXG4vKipcbiAqIFJlc3VsdCBvZiBgcHJlcGFyZURpc3BhdGNoYCDigJQgZWl0aGVyIHRoZSBkZWNpZGVyIHN0YWdlIGJyb2tlIChubyBicmFuY2hcbiAqIHJ1bnM7IGBicmFuY2hJZGAgaXMgdGhlIGRlY2lkZXIncyByZXR1cm4gdmFsdWUpLCBvciBhIGJyYW5jaCB3YXMgY2hvc2VuXG4gKiBhbmQgaXMgcmVhZHkgdG8gZXhlY3V0ZSBpbiBgYnJhbmNoQ29udGV4dGAuXG4gKi9cbmV4cG9ydCB0eXBlIERlY2lkZXJEaXNwYXRjaDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+ID1cbiAgfCB7IGtpbmQ6ICdicmVhayc7IGJyYW5jaElkOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2Rpc3BhdGNoJzsgY2hvc2VuOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjsgYnJhbmNoQ29udGV4dDogU3RhZ2VDb250ZXh0IH07XG5cbmV4cG9ydCBjbGFzcyBEZWNpZGVySGFuZGxlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+KSB7fVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBzY29wZS1iYXNlZCBkZWNpZGVyIChjcmVhdGVkIHZpYSBhZGREZWNpZGVyRnVuY3Rpb24pLlxuICAgKiBUaGUgc3RhZ2UgZnVuY3Rpb24gSVMgdGhlIGRlY2lkZXIg4oCUIGl0cyByZXR1cm4gdmFsdWUgaXMgdGhlIGJyYW5jaCBJRC5cbiAgICogRXhlY3V0aW9uIG9yZGVyOiBydW5TdGFnZShmbikg4oaSIGNvbW1pdCDihpIgcmVzb2x2ZSBjaGlsZCDihpIgbG9nIOKGkiBleGVjdXRlTm9kZShjaGlsZCkuXG4gICAqL1xuICBhc3luYyBoYW5kbGVTY29wZUJhc2VkKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0YWdlRnVuYzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW4gfSxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcnVuU3RhZ2U6IFJ1blN0YWdlRm48VE91dCwgVFNjb3BlPixcbiAgICBleGVjdXRlTm9kZTogRXhlY3V0ZU5vZGVGbjxUT3V0LCBUU2NvcGU+LFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGRpc3BhdGNoID0gYXdhaXQgdGhpcy5wcmVwYXJlRGlzcGF0Y2goXG4gICAgICBub2RlLFxuICAgICAgc3RhZ2VGdW5jLFxuICAgICAgY29udGV4dCxcbiAgICAgIGJyZWFrRmxhZyxcbiAgICAgIGJyYW5jaFBhdGgsXG4gICAgICBydW5TdGFnZSxcbiAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgKTtcblxuICAgIGlmIChkaXNwYXRjaC5raW5kID09PSAnYnJlYWsnKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2guYnJhbmNoSWQ7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlTm9kZShkaXNwYXRjaC5jaG9zZW4sIGRpc3BhdGNoLmJyYW5jaENvbnRleHQsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIFN0YW1wIGludm9rZXIgY29udGV4dCBvbiBQYXVzZVNpZ25hbCBkdXJpbmcgYnViYmxlLXVwLlxuICAgICAgLy8gVGhlIGRlY2lkZXIgKG5vZGUpIGlzIHRoZSBpbnZva2VyOyBpdHMgLm5leHQgaXMgdGhlIGNvbnRpbnVhdGlvbiB0YXJnZXQuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihub2RlLmlkISk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgZGVjaWRlciBzdGFnZSBhbmQgcmVzb2x2ZSB0aGUgY2hvc2VuIGJyYW5jaCBXSVRIT1VUIGV4ZWN1dGluZyBpdC5cbiAgICogRXZlcnl0aGluZyB1cCB0byAoYW5kIGluY2x1ZGluZykgdGhlIGBvbkRlY2lzaW9uYC9gb25TdGFnZUV4ZWN1dGVkYFxuICAgKiBuYXJyYXRpdmUgYW5kIHRoZSBicmFuY2ggY29udGV4dCBjcmVhdGlvbiBoYXBwZW5zIGhlcmUg4oCUIG9ubHkgdGhlXG4gICAqIGJyYW5jaCBleGVjdXRpb24gaXRzZWxmIGlzIGxlZnQgdG8gdGhlIGNhbGxlci5cbiAgICovXG4gIGFzeW5jIHByZXBhcmVEaXNwYXRjaChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuIH0sXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHJ1blN0YWdlOiBSdW5TdGFnZUZuPFRPdXQsIFRTY29wZT4sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8RGVjaWRlckRpc3BhdGNoPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBicmVha0ZuID0gKCkgPT4gKGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWUpO1xuXG4gICAgbGV0IGJyYW5jaElkOiBzdHJpbmc7XG4gICAgbGV0IGRlY2lzaW9uRXZpZGVuY2U6IERlY2lzaW9uRXZpZGVuY2UgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YWdlT3V0cHV0ID0gYXdhaXQgcnVuU3RhZ2Uobm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIC8vIERldGVjdCBEZWNpc2lvblJlc3VsdCBmcm9tIGRlY2lkZSgpIGhlbHBlciB2aWEgU3ltYm9sIGJyYW5kXG4gICAgICBpZiAoc3RhZ2VPdXRwdXQgJiYgdHlwZW9mIHN0YWdlT3V0cHV0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmhhcyhzdGFnZU91dHB1dCBhcyBvYmplY3QsIERFQ0lTSU9OX1JFU1VMVCkpIHtcbiAgICAgICAgYnJhbmNoSWQgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5icmFuY2g7XG4gICAgICAgIGRlY2lzaW9uRXZpZGVuY2UgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5ldmlkZW5jZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyYW5jaElkID0gU3RyaW5nKHN0YWdlT3V0cHV0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3cg4oCUIGNvbW1pdCBhbmQgcmUtdGhyb3cgd2l0aG91dCBlcnJvciBsb2dnaW5nLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGNvbW1pdFN0YWdlV3JpdGVzKGNvbnRleHQpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVTdGFnZUZhaWx1cmUoY29udGV4dCwgZXJyb3IpO1xuICAgICAgY29tbWl0U3RhZ2VXcml0ZXMoY29udGV4dCk7XG4gICAgICBjb25zdCBzZXJ2ZWQgPSByZWNvcmRTdGFnZUVycm9yKGNvbnRleHQsIGVycm9yKTtcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7XG4gICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uRXJyb3Iobm9kZS5uYW1lLCBzZXJ2ZWQubWVzc2FnZSwgc2VydmVkLnN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBjb21taXRTdGFnZShjb250ZXh0LCB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLCBub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQpO1xuXG4gICAgaWYgKGJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgcmV0dXJuIHsga2luZDogJ2JyZWFrJywgYnJhbmNoSWQgfTtcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGNoaWxkIGJ5IG1hdGNoaW5nIGJyYW5jaCBJRCBhZ2FpbnN0IG5vZGUuY2hpbGRyZW4uXG4gICAgLy8gTWF0Y2ggYnJhbmNoSWQgZmlyc3QgKG9yaWdpbmFsIHVucHJlZml4ZWQgSUQpLCBmYWxsIGJhY2sgdG8gaWQgZm9yIGJhY2t3YXJkIGNvbXBhdC5cbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4gYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXTtcbiAgICBsZXQgY2hvc2VuID0gY2hpbGRyZW4uZmluZCgoY2hpbGQpID0+IChjaGlsZC5icmFuY2hJZCA/PyBjaGlsZC5pZCkgPT09IGJyYW5jaElkKTtcblxuICAgIC8vIEZhbGwgYmFjayB0byBkZWZhdWx0IGJyYW5jaFxuICAgIGlmICghY2hvc2VuKSB7XG4gICAgICBjb25zdCBkZWZhdWx0Q2hpbGQgPSBjaGlsZHJlbi5maW5kKChjaGlsZCkgPT4gKGNoaWxkLmJyYW5jaElkID8/IGNoaWxkLmlkKSA9PT0gJ2RlZmF1bHQnKTtcbiAgICAgIGlmIChkZWZhdWx0Q2hpbGQpIHtcbiAgICAgICAgY2hvc2VuID0gZGVmYXVsdENoaWxkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFNjb3BlLWJhc2VkIGRlY2lkZXIgJyR7bm9kZS5uYW1lfScgcmV0dXJuZWQgYnJhbmNoIElEICcke2JyYW5jaElkfScgd2hpY2ggZG9lc24ndCBtYXRjaCBhbnkgY2hpbGQgYW5kIG5vIGRlZmF1bHQgYnJhbmNoIGlzIHNldGA7XG4gICAgICAgIGNvbnRleHQuYWRkRXJyb3IoJ2RlY2lkZXJFcnJvcicsIGVycm9yTWVzc2FnZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNob3Nlbk5hbWUgPSBjaG9zZW4ubmFtZTtcbiAgICBjb25zdCB3YXNEZWZhdWx0ID0gKGNob3Nlbi5icmFuY2hJZCA/PyBjaG9zZW4uaWQpICE9PSBicmFuY2hJZDtcbiAgICBjb25zdCByYXRpb25hbGUgPSBjb250ZXh0LmRlYnVnPy5sb2dDb250ZXh0Py5kZWNpZGVyUmF0aW9uYWxlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYnJhbmNoUmVhc29uOiBzdHJpbmc7XG4gICAgaWYgKHdhc0RlZmF1bHQpIHtcbiAgICAgIGJyYW5jaFJlYXNvbiA9IGBSZXR1cm5lZCAnJHticmFuY2hJZH0nIChubyBtYXRjaCksIGZlbGwgYmFjayB0byBkZWZhdWx0IOKGkiAke2Nob3Nlbk5hbWV9IHBhdGguYDtcbiAgICB9IGVsc2UgaWYgKHJhdGlvbmFsZSkge1xuICAgICAgYnJhbmNoUmVhc29uID0gYEJhc2VkIG9uOiAke3JhdGlvbmFsZX0g4oaSIGNob3NlICR7Y2hvc2VuTmFtZX0gcGF0aC5gO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmFuY2hSZWFzb24gPSBgRXZhbHVhdGVkIHNjb3BlIGFuZCByZXR1cm5lZCAnJHticmFuY2hJZH0nIOKGkiBjaG9zZSAke2Nob3Nlbk5hbWV9IHBhdGguYDtcbiAgICB9XG4gICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdicmFuY2gnLCBicmFuY2hSZWFzb24sIHtcbiAgICAgIHRhcmdldFN0YWdlOiBjaG9zZW4ubmFtZSxcbiAgICAgIHJhdGlvbmFsZTogcmF0aW9uYWxlIHx8IGByZXR1cm5lZCBicmFuY2hJZDogJHticmFuY2hJZH1gLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkRlY2lzaW9uKFxuICAgICAgbm9kZS5uYW1lLFxuICAgICAgY2hvc2VuLm5hbWUsXG4gICAgICByYXRpb25hbGUsXG4gICAgICBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgIGRlY2lzaW9uRXZpZGVuY2UsXG4gICAgKTtcbiAgICAvLyBQcm9wb3NhbCAjMDAzOiBmaXJlIG9uU3RhZ2VFeGVjdXRlZCBBRlRFUiB0aGUgc3BlY2lhbGl6ZWQgZXZlbnRcbiAgICAvLyBzbyBjb25zdW1lcnMgdHJhY2tpbmcgXCJkaWQgdGhpcyBzdGFnZSBydW5cIiB3b3JrIHVuaWZvcm1seS5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdkZWNpZGVyJyk7XG5cbiAgICBjb25zdCBicmFuY2hDb250ZXh0ID0gY29udGV4dC5jcmVhdGVDaGlsZChicmFuY2hQYXRoIGFzIHN0cmluZywgY2hvc2VuLmlkLCBjaG9zZW4ubmFtZSwgY2hvc2VuLmlkKTtcbiAgICAvLyBBbiBleGNsdXNpdmUgYnJhbmNoIGlzIHRoZSBzYW1lIGVzY2FwaW5nIGNoYWluLCBpbmNsdWRpbmcgdHJhbXBvbGluZSBob3BzLlxuICAgIC8vIFBhcmFsbGVsIGZhbi1vdXQgY2hpbGRyZW4ga2VlcCB0aGVpciBvd24gc2xvdHMgaW5zdGVhZC5cbiAgICBicmFuY2hDb250ZXh0LmZhaWx1cmVTdGF0ZSA9IGNvbnRleHQuZmFpbHVyZVN0YXRlO1xuXG4gICAgcmV0dXJuIHsga2luZDogJ2Rpc3BhdGNoJywgY2hvc2VuLCBicmFuY2hDb250ZXh0IH07XG4gIH1cbn1cbiJdfQ==
@@ -9,8 +9,8 @@
9
9
  import { DECISION_RESULT } from '../../decide/types.js';
10
10
  import { isPauseSignal } from '../../pause/types.js';
11
11
  import { createBreakHandler } from './breakFlag.js';
12
- import { commitStage } from './commitStage.js';
13
- import { loggableStageError, recordStageError } from './stageError.js';
12
+ import { commitStage, commitStageWrites } from './commitStage.js';
13
+ import { captureStageFailure, loggableStageError, recordStageError } from './stageError.js';
14
14
  export class SelectorHandler {
15
15
  deps;
16
16
  childrenExecutor;
@@ -44,10 +44,11 @@ export class SelectorHandler {
44
44
  catch (error) {
45
45
  // PauseSignal is expected control flow — commit and re-throw without error logging.
46
46
  if (isPauseSignal(error)) {
47
- context.commit();
47
+ commitStageWrites(context);
48
48
  throw error;
49
49
  }
50
- context.commit();
50
+ captureStageFailure(context, error);
51
+ commitStageWrites(context);
51
52
  const served = recordStageError(context, error);
52
53
  this.deps.logger.error(`Error in pipeline (${branchPath}) stage [${node.name}]:`, {
53
54
  error: loggableStageError(context, error),
@@ -127,4 +128,4 @@ export class SelectorHandler {
127
128
  }
128
129
  }
129
130
  }
130
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0b3JIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXJELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd2RSxNQUFNLE9BQU8sZUFBZTtJQUVQO0lBQ0E7SUFGbkIsWUFDbUIsSUFBK0IsRUFDL0IsZ0JBQWdEO1FBRGhELFNBQUksR0FBSixJQUFJLENBQTJCO1FBQy9CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBZ0M7SUFDaEUsQ0FBQztJQUVKOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQ3BCLElBQTZCLEVBQzdCLFNBQXNDLEVBQ3RDLE9BQXFCLEVBQ3JCLFNBQW9CLEVBQ3BCLFVBQThCLEVBQzlCLFFBQWtDLEVBQ2xDLFdBQXdDLEVBQ3hDLGdCQUFtQztRQUVuQyxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU5QyxJQUFJLFdBQXFCLENBQUM7UUFDMUIsSUFBSSxpQkFBZ0QsQ0FBQztRQUNyRCxJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUN4RiwrREFBK0Q7WUFDL0QsSUFDRSxXQUFXO2dCQUNYLE9B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akUsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQ3JDLElBQUksQ0FBQyxJQUFJLEVBQ1Qsb0JBQW9CLEVBQ3BCLFFBQVEsQ0FBQyxNQUFNLEVBQ2YsZ0JBQWdCLEVBQ2hCLGlCQUFpQixDQUNsQixDQUFDO1FBQ0Ysa0VBQWtFO1FBQ2xFLDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFeEcsTUFBTSxRQUFRLEdBQTRCO1lBQ3hDLElBQUksRUFBRSxlQUFlO1lBQ3JCLEVBQUUsRUFBRSxlQUFlO1lBQ25CLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsOEVBQThFO1lBQzlFLDZFQUE2RTtZQUM3RSxnRkFBZ0Y7WUFDaEYsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3hCLENBQUM7UUFDRixJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUNwRCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFNBQVMsRUFDVCxVQUFVLEVBQ1YsZ0JBQWdCLENBQ2pCLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4Qix5REFBeUQ7WUFDekQsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRyxDQUFDLENBQUM7Z0JBQzNCLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VsZWN0b3JIYW5kbGVyIOKAlCBNdWx0aS1jaG9pY2UgZmlsdGVyZWQgZmFuLW91dC5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBFeGVjdXRlIHNjb3BlLWJhc2VkIHNlbGVjdG9yIG5vZGVzIChzdGFnZSDihpIgY29tbWl0IOKGkiByZXNvbHZlIGNoaWxkcmVuIOKGkiBwYXJhbGxlbCBleGVjdXRpb24pXG4gKiAtIFRoZSBzZWxlY3RvciBmdW5jdGlvbiBJUyBhIHN0YWdlOiByZWFkcyBzY29wZSwgcmV0dXJucyBzdHJpbmdbXSBvZiBicmFuY2ggSURzXG4gKiAtIERlbGVnYXRlcyBwYXJhbGxlbCBleGVjdXRpb24gb2Ygc2VsZWN0ZWQgY2hpbGRyZW4gdG8gQ2hpbGRyZW5FeGVjdXRvclxuICovXG5cbmltcG9ydCB0eXBlIHsgU2VsZWN0aW9uRXZpZGVuY2UgfSBmcm9tICcuLi8uLi9kZWNpZGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgREVDSVNJT05fUkVTVUxUIH0gZnJvbSAnLi4vLi4vZGVjaWRlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgSGFuZGxlckRlcHMsIE5vZGVSZXN1bHRUeXBlLCBTdGFnZUZ1bmN0aW9uIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlQnJlYWtIYW5kbGVyIH0gZnJvbSAnLi9icmVha0ZsYWcuanMnO1xuaW1wb3J0IHR5cGUgeyBDaGlsZHJlbkV4ZWN1dG9yIH0gZnJvbSAnLi9DaGlsZHJlbkV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGNvbW1pdFN0YWdlIH0gZnJvbSAnLi9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgeyBsb2dnYWJsZVN0YWdlRXJyb3IsIHJlY29yZFN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHR5cGUgeyBCcmVha0ZsYWcsIEV4ZWN1dGVOb2RlRm4sIFJ1blN0YWdlRm4gfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFNlbGVjdG9ySGFuZGxlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW5FeGVjdXRvcjogQ2hpbGRyZW5FeGVjdXRvcjxUT3V0LCBUU2NvcGU+LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIHNjb3BlLWJhc2VkIHNlbGVjdG9yIG5vZGUgKGNyZWF0ZWQgdmlhIGFkZFNlbGVjdG9yRnVuY3Rpb24pLlxuICAgKiBUaGUgc3RhZ2UgZnVuY3Rpb24gSVMgdGhlIHNlbGVjdG9yIOKAlCBpdHMgcmV0dXJuIHZhbHVlIGNvbnRhaW5zIGJyYW5jaCBJRHMuXG4gICAqIEV4ZWN1dGlvbiBvcmRlcjogcnVuU3RhZ2UoZm4pIOKGkiBjb21taXQg4oaSIHJlc29sdmUgY2hpbGRyZW4g4oaSIHBhcmFsbGVsIGV4ZWN1dGUuXG4gICAqL1xuICBhc3luYyBoYW5kbGVTY29wZUJhc2VkKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0YWdlRnVuYzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcnVuU3RhZ2U6IFJ1blN0YWdlRm48VE91dCwgVFNjb3BlPixcbiAgICBleGVjdXRlTm9kZTogRXhlY3V0ZU5vZGVGbjxUT3V0LCBUU2NvcGU+LFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIE5vZGVSZXN1bHRUeXBlPiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGJyZWFrRm4gPSBjcmVhdGVCcmVha0hhbmRsZXIoYnJlYWtGbGFnKTtcblxuICAgIGxldCBzZWxlY3RlZElkczogc3RyaW5nW107XG4gICAgbGV0IHNlbGVjdGlvbkV2aWRlbmNlOiBTZWxlY3Rpb25FdmlkZW5jZSB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhZ2VPdXRwdXQgPSBhd2FpdCBydW5TdGFnZShub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgLy8gRGV0ZWN0IFNlbGVjdGlvblJlc3VsdCBmcm9tIHNlbGVjdCgpIGhlbHBlciB2aWEgU3ltYm9sIGJyYW5kXG4gICAgICBpZiAoXG4gICAgICAgIHN0YWdlT3V0cHV0ICYmXG4gICAgICAgIHR5cGVvZiBzdGFnZU91dHB1dCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgUmVmbGVjdC5oYXMoc3RhZ2VPdXRwdXQgYXMgb2JqZWN0LCBERUNJU0lPTl9SRVNVTFQpICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoKHN0YWdlT3V0cHV0IGFzIGFueSkuYnJhbmNoZXMpXG4gICAgICApIHtcbiAgICAgICAgc2VsZWN0ZWRJZHMgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5icmFuY2hlcztcbiAgICAgICAgc2VsZWN0aW9uRXZpZGVuY2UgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5ldmlkZW5jZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkSWRzID0gQXJyYXkuaXNBcnJheShzdGFnZU91dHB1dCkgPyBzdGFnZU91dHB1dC5tYXAoU3RyaW5nKSA6IFtTdHJpbmcoc3RhZ2VPdXRwdXQpXTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3cg4oCUIGNvbW1pdCBhbmQgcmUtdGhyb3cgd2l0aG91dCBlcnJvciBsb2dnaW5nLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgIGNvbnN0IHNlcnZlZCA9IHJlY29yZFN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHtcbiAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25FcnJvcihub2RlLm5hbWUsIHNlcnZlZC5tZXNzYWdlLCBzZXJ2ZWQuc3RydWN0dXJlZEVycm9yLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGNvbW1pdFN0YWdlKGNvbnRleHQsIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3IsIG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAvLyBUaGUgc2VsZWN0b3IgY29tcGxldGVkLCBidXQgaXQgZGlkIG5vdCBzZWxlY3Qgb3IgZGlzcGF0Y2ggYnJhbmNoZXMuXG4gICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdzZWxlY3RvcicpO1xuICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCwgYnJlYWtGbGFnLnJlYXNvbik7XG4gICAgICAvLyBObyBicmFuY2hlcyByYW46IGRvIG5vdCBtYW51ZmFjdHVyZSBhIHJlc3VsdCBtYXAuIEluIGEgc3ViZmxvdyxcbiAgICAgIC8vIHVuZGVmaW5lZCBsZXRzIFN1YmZsb3dFeGVjdXRvciB1c2UgdGhlIHN0YWdlJ3MgY29tbWl0dGVkIHN0YXRlLlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb250ZXh0LmFkZExvZygnc2VsZWN0ZWRDaGlsZElkcycsIHNlbGVjdGVkSWRzKTtcbiAgICBjb250ZXh0LmFkZExvZygnc2VsZWN0b3JQYXR0ZXJuJywgJ3Njb3BlLWJhc2VkLW11bHRpLWNob2ljZScpO1xuXG4gICAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGV4dC5hZGRMb2coJ3NraXBwZWRBbGxDaGlsZHJlbicsIHRydWUpO1xuICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzZWxlY3RlZCcsICdObyBjaGlsZHJlbiBzZWxlY3RlZCDigJQgc2tpcHBpbmcgYWxsIGJyYW5jaGVzLicsIHtcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHRhcmdldFN0YWdlOiBbXSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblNlbGVjdGVkKG5vZGUubmFtZSwgW10sIChub2RlLmNoaWxkcmVuID8/IFtdKS5sZW5ndGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgZXZlbiBvbiB6ZXJvLXNlbGVjdCBwYXRoIOKAlFxuICAgICAgLy8gdGhlIHNlbGVjdG9yIERJRCBjb21wbGV0ZSAoaXQgcGlja2VkIG5vbmUpOyBjb25zdW1lcnMgdHJhY2tpbmdcbiAgICAgIC8vIHZpc2l0ZWQgbmVlZCB0aGUgc2lnbmFsLlxuICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQobm9kZS5uYW1lLCBub2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0LCAnc2VsZWN0b3InKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGNoaWxkcmVuIGJ5IG1hdGNoaW5nIHNlbGVjdGVkIElEcyBhZ2FpbnN0IG5vZGUuY2hpbGRyZW4uXG4gICAgLy8gTWF0Y2ggYnJhbmNoSWQgZmlyc3QgKG9yaWdpbmFsIHVucHJlZml4ZWQgSUQpLCBmYWxsIGJhY2sgdG8gaWQgZm9yIGJhY2t3YXJkIGNvbXBhdC5cbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4gYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXTtcbiAgICBjb25zdCBzZWxlY3RlZENoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKChjKSA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyhjLmJyYW5jaElkID8/IGMuaWQhKSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBhbGwgSURzIGV4aXN0IChmYWlsIGZhc3QpXG4gICAgaWYgKHNlbGVjdGVkQ2hpbGRyZW4ubGVuZ3RoICE9PSBzZWxlY3RlZElkcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNoaWxkSWRzID0gY2hpbGRyZW4ubWFwKChjKSA9PiBjLmJyYW5jaElkID8/IGMuaWQpO1xuICAgICAgY29uc3QgbWlzc2luZyA9IHNlbGVjdGVkSWRzLmZpbHRlcigoaWQpID0+ICFjaGlsZElkcy5pbmNsdWRlcyhpZCkpO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFNjb3BlLWJhc2VkIHNlbGVjdG9yICcke25vZGUubmFtZX0nIHJldHVybmVkIHVua25vd24gY2hpbGQgSURzOiAke21pc3Npbmcuam9pbihcbiAgICAgICAgJywgJyxcbiAgICAgICl9LiBBdmFpbGFibGU6ICR7Y2hpbGRJZHMuam9pbignLCAnKX1gO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIGNvbnRleHQuYWRkRXJyb3IoJ3NlbGVjdG9yRXJyb3InLCBlcnJvck1lc3NhZ2UpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2tpcHBlZElkcyA9IGNoaWxkcmVuXG4gICAgICAuZmlsdGVyKChjKSA9PiAhc2VsZWN0ZWRJZHMuaW5jbHVkZXMoYy5icmFuY2hJZCA/PyBjLmlkISkpXG4gICAgICAubWFwKChjKSA9PiBjLmJyYW5jaElkID8/IGMuaWQpO1xuICAgIGlmIChza2lwcGVkSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdza2lwcGVkQ2hpbGRJZHMnLCBza2lwcGVkSWRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZE5hbWVzID0gc2VsZWN0ZWRDaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSkuam9pbignLCAnKTtcbiAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgICAnc2VsZWN0ZWQnLFxuICAgICAgYFJ1bm5pbmcgJHtzZWxlY3RlZE5hbWVzfSAoJHtzZWxlY3RlZENoaWxkcmVuLmxlbmd0aH0gb2YgJHtjaGlsZHJlbi5sZW5ndGh9IG1hdGNoZWQpYCxcbiAgICAgIHsgY291bnQ6IHNlbGVjdGVkQ2hpbGRyZW4ubGVuZ3RoLCB0YXJnZXRTdGFnZTogc2VsZWN0ZWRDaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSkgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWREaXNwbGF5TmFtZXMgPSBzZWxlY3RlZENoaWxkcmVuLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU2VsZWN0ZWQoXG4gICAgICBub2RlLm5hbWUsXG4gICAgICBzZWxlY3RlZERpc3BsYXlOYW1lcyxcbiAgICAgIGNoaWxkcmVuLmxlbmd0aCxcbiAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICBzZWxlY3Rpb25FdmlkZW5jZSxcbiAgICApO1xuICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIEFGVEVSIHRoZSBzcGVjaWFsaXplZCBldmVudFxuICAgIC8vIHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiIHdvcmsgdW5pZm9ybWx5LlxuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKG5vZGUubmFtZSwgbm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgJ3NlbGVjdG9yJyk7XG5cbiAgICBjb25zdCB0ZW1wTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiAnc2VsZWN0b3ItdGVtcCcsXG4gICAgICBpZDogJ3NlbGVjdG9yLXRlbXAnLFxuICAgICAgY2hpbGRyZW46IHNlbGVjdGVkQ2hpbGRyZW4sXG4gICAgICAvLyBQcm9wYWdhdGUgdGhlIHNlbGVjdG9yJ3MgZmFuLW91dCBlcnJvciBtb2RlLiBXaXRob3V0IHRoaXMsIENoaWxkcmVuRXhlY3V0b3JcbiAgICAgIC8vIHJlYWRzIGB0ZW1wTm9kZS5mYWlsRmFzdGAgKHVuZGVmaW5lZCkgYW5kIGFsd2F5cyB1c2VzIFByb21pc2UuYWxsU2V0dGxlZCDigJRcbiAgICAgIC8vIHNpbGVudGx5IHN3YWxsb3dpbmcgYSByZXF1aXJlZCBicmFuY2gncyBlcnJvci4gU2VlIGJ1aWxkZXIgYGZhaWxGYXN0YCBvcHRpb24uXG4gICAgICBmYWlsRmFzdDogbm9kZS5mYWlsRmFzdCxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgIHRlbXBOb2RlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBTdGFtcCBpbnZva2VyIGNvbnRleHQgb24gUGF1c2VTaWduYWwgZHVyaW5nIGJ1YmJsZS11cC5cbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBlcnJvci5zZXRJbnZva2VyKG5vZGUuaWQhKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0b3JIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXJELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBELE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUc1RixNQUFNLE9BQU8sZUFBZTtJQUVQO0lBQ0E7SUFGbkIsWUFDbUIsSUFBK0IsRUFDL0IsZ0JBQWdEO1FBRGhELFNBQUksR0FBSixJQUFJLENBQTJCO1FBQy9CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBZ0M7SUFDaEUsQ0FBQztJQUVKOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQ3BCLElBQTZCLEVBQzdCLFNBQXNDLEVBQ3RDLE9BQXFCLEVBQ3JCLFNBQW9CLEVBQ3BCLFVBQThCLEVBQzlCLFFBQWtDLEVBQ2xDLFdBQXdDLEVBQ3hDLGdCQUFtQztRQUVuQyxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU5QyxJQUFJLFdBQXFCLENBQUM7UUFDMUIsSUFBSSxpQkFBZ0QsQ0FBQztRQUNyRCxJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUN4RiwrREFBK0Q7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bHRpLWNob2ljZSBmaWx0ZXJlZCBmYW4tb3V0LlxuICpcbiAqIFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIEV4ZWN1dGUgc2NvcGUtYmFzZWQgc2VsZWN0b3Igbm9kZXMgKHN0YWdlIOKGkiBjb21taXQg4oaSIHJlc29sdmUgY2hpbGRyZW4g4oaSIHBhcmFsbGVsIGV4ZWN1dGlvbilcbiAqIC0gVGhlIHNlbGVjdG9yIGZ1bmN0aW9uIElTIGEgc3RhZ2U6IHJlYWRzIHNjb3BlLCByZXR1cm5zIHN0cmluZ1tdIG9mIGJyYW5jaCBJRHNcbiAqIC0gRGVsZWdhdGVzIHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiBzZWxlY3RlZCBjaGlsZHJlbiB0byBDaGlsZHJlbkV4ZWN1dG9yXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTZWxlY3Rpb25FdmlkZW5jZSB9IGZyb20gJy4uLy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBERUNJU0lPTl9SRVNVTFQgfSBmcm9tICcuLi8uLi9kZWNpZGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyRGVwcywgTm9kZVJlc3VsdFR5cGUsIFN0YWdlRnVuY3Rpb24gfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVCcmVha0hhbmRsZXIgfSBmcm9tICcuL2JyZWFrRmxhZy5qcyc7XG5pbXBvcnQgdHlwZSB7IENoaWxkcmVuRXhlY3V0b3IgfSBmcm9tICcuL0NoaWxkcmVuRXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgY29tbWl0U3RhZ2UsIGNvbW1pdFN0YWdlV3JpdGVzIH0gZnJvbSAnLi9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgeyBjYXB0dXJlU3RhZ2VGYWlsdXJlLCBsb2dnYWJsZVN0YWdlRXJyb3IsIHJlY29yZFN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHR5cGUgeyBCcmVha0ZsYWcsIEV4ZWN1dGVOb2RlRm4sIFJ1blN0YWdlRm4gfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFNlbGVjdG9ySGFuZGxlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW5FeGVjdXRvcjogQ2hpbGRyZW5FeGVjdXRvcjxUT3V0LCBUU2NvcGU+LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIHNjb3BlLWJhc2VkIHNlbGVjdG9yIG5vZGUgKGNyZWF0ZWQgdmlhIGFkZFNlbGVjdG9yRnVuY3Rpb24pLlxuICAgKiBUaGUgc3RhZ2UgZnVuY3Rpb24gSVMgdGhlIHNlbGVjdG9yIOKAlCBpdHMgcmV0dXJuIHZhbHVlIGNvbnRhaW5zIGJyYW5jaCBJRHMuXG4gICAqIEV4ZWN1dGlvbiBvcmRlcjogcnVuU3RhZ2UoZm4pIOKGkiBjb21taXQg4oaSIHJlc29sdmUgY2hpbGRyZW4g4oaSIHBhcmFsbGVsIGV4ZWN1dGUuXG4gICAqL1xuICBhc3luYyBoYW5kbGVTY29wZUJhc2VkKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0YWdlRnVuYzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcnVuU3RhZ2U6IFJ1blN0YWdlRm48VE91dCwgVFNjb3BlPixcbiAgICBleGVjdXRlTm9kZTogRXhlY3V0ZU5vZGVGbjxUT3V0LCBUU2NvcGU+LFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIE5vZGVSZXN1bHRUeXBlPiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGJyZWFrRm4gPSBjcmVhdGVCcmVha0hhbmRsZXIoYnJlYWtGbGFnKTtcblxuICAgIGxldCBzZWxlY3RlZElkczogc3RyaW5nW107XG4gICAgbGV0IHNlbGVjdGlvbkV2aWRlbmNlOiBTZWxlY3Rpb25FdmlkZW5jZSB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhZ2VPdXRwdXQgPSBhd2FpdCBydW5TdGFnZShub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgLy8gRGV0ZWN0IFNlbGVjdGlvblJlc3VsdCBmcm9tIHNlbGVjdCgpIGhlbHBlciB2aWEgU3ltYm9sIGJyYW5kXG4gICAgICBpZiAoXG4gICAgICAgIHN0YWdlT3V0cHV0ICYmXG4gICAgICAgIHR5cGVvZiBzdGFnZU91dHB1dCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgUmVmbGVjdC5oYXMoc3RhZ2VPdXRwdXQgYXMgb2JqZWN0LCBERUNJU0lPTl9SRVNVTFQpICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoKHN0YWdlT3V0cHV0IGFzIGFueSkuYnJhbmNoZXMpXG4gICAgICApIHtcbiAgICAgICAgc2VsZWN0ZWRJZHMgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5icmFuY2hlcztcbiAgICAgICAgc2VsZWN0aW9uRXZpZGVuY2UgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5ldmlkZW5jZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkSWRzID0gQXJyYXkuaXNBcnJheShzdGFnZU91dHB1dCkgPyBzdGFnZU91dHB1dC5tYXAoU3RyaW5nKSA6IFtTdHJpbmcoc3RhZ2VPdXRwdXQpXTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3cg4oCUIGNvbW1pdCBhbmQgcmUtdGhyb3cgd2l0aG91dCBlcnJvciBsb2dnaW5nLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGNvbW1pdFN0YWdlV3JpdGVzKGNvbnRleHQpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVTdGFnZUZhaWx1cmUoY29udGV4dCwgZXJyb3IpO1xuICAgICAgY29tbWl0U3RhZ2VXcml0ZXMoY29udGV4dCk7XG4gICAgICBjb25zdCBzZXJ2ZWQgPSByZWNvcmRTdGFnZUVycm9yKGNvbnRleHQsIGVycm9yKTtcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7XG4gICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uRXJyb3Iobm9kZS5uYW1lLCBzZXJ2ZWQubWVzc2FnZSwgc2VydmVkLnN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBjb21taXRTdGFnZShjb250ZXh0LCB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLCBub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQpO1xuXG4gICAgaWYgKGJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgLy8gVGhlIHNlbGVjdG9yIGNvbXBsZXRlZCwgYnV0IGl0IGRpZCBub3Qgc2VsZWN0IG9yIGRpc3BhdGNoIGJyYW5jaGVzLlxuICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQobm9kZS5uYW1lLCBub2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0LCAnc2VsZWN0b3InKTtcbiAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQsIGJyZWFrRmxhZy5yZWFzb24pO1xuICAgICAgLy8gTm8gYnJhbmNoZXMgcmFuOiBkbyBub3QgbWFudWZhY3R1cmUgYSByZXN1bHQgbWFwLiBJbiBhIHN1YmZsb3csXG4gICAgICAvLyB1bmRlZmluZWQgbGV0cyBTdWJmbG93RXhlY3V0b3IgdXNlIHRoZSBzdGFnZSdzIGNvbW1pdHRlZCBzdGF0ZS5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29udGV4dC5hZGRMb2coJ3NlbGVjdGVkQ2hpbGRJZHMnLCBzZWxlY3RlZElkcyk7XG4gICAgY29udGV4dC5hZGRMb2coJ3NlbGVjdG9yUGF0dGVybicsICdzY29wZS1iYXNlZC1tdWx0aS1jaG9pY2UnKTtcblxuICAgIGlmIChzZWxlY3RlZElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdza2lwcGVkQWxsQ2hpbGRyZW4nLCB0cnVlKTtcbiAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnc2VsZWN0ZWQnLCAnTm8gY2hpbGRyZW4gc2VsZWN0ZWQg4oCUIHNraXBwaW5nIGFsbCBicmFuY2hlcy4nLCB7XG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB0YXJnZXRTdGFnZTogW10sXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TZWxlY3RlZChub2RlLm5hbWUsIFtdLCAobm9kZS5jaGlsZHJlbiA/PyBbXSkubGVuZ3RoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIGV2ZW4gb24gemVyby1zZWxlY3QgcGF0aCDigJRcbiAgICAgIC8vIHRoZSBzZWxlY3RvciBESUQgY29tcGxldGUgKGl0IHBpY2tlZCBub25lKTsgY29uc3VtZXJzIHRyYWNraW5nXG4gICAgICAvLyB2aXNpdGVkIG5lZWQgdGhlIHNpZ25hbC5cbiAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKG5vZGUubmFtZSwgbm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgJ3NlbGVjdG9yJyk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSBjaGlsZHJlbiBieSBtYXRjaGluZyBzZWxlY3RlZCBJRHMgYWdhaW5zdCBub2RlLmNoaWxkcmVuLlxuICAgIC8vIE1hdGNoIGJyYW5jaElkIGZpcnN0IChvcmlnaW5hbCB1bnByZWZpeGVkIElEKSwgZmFsbCBiYWNrIHRvIGlkIGZvciBiYWNrd2FyZCBjb21wYXQuXG4gICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuIGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W107XG4gICAgY29uc3Qgc2VsZWN0ZWRDaGlsZHJlbiA9IGNoaWxkcmVuLmZpbHRlcigoYykgPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMoYy5icmFuY2hJZCA/PyBjLmlkISkpO1xuXG4gICAgLy8gVmFsaWRhdGUgYWxsIElEcyBleGlzdCAoZmFpbCBmYXN0KVxuICAgIGlmIChzZWxlY3RlZENoaWxkcmVuLmxlbmd0aCAhPT0gc2VsZWN0ZWRJZHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjaGlsZElkcyA9IGNoaWxkcmVuLm1hcCgoYykgPT4gYy5icmFuY2hJZCA/PyBjLmlkKTtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSBzZWxlY3RlZElkcy5maWx0ZXIoKGlkKSA9PiAhY2hpbGRJZHMuaW5jbHVkZXMoaWQpKTtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTY29wZS1iYXNlZCBzZWxlY3RvciAnJHtub2RlLm5hbWV9JyByZXR1cm5lZCB1bmtub3duIGNoaWxkIElEczogJHttaXNzaW5nLmpvaW4oXG4gICAgICAgICcsICcsXG4gICAgICApfS4gQXZhaWxhYmxlOiAke2NoaWxkSWRzLmpvaW4oJywgJyl9YDtcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICBjb250ZXh0LmFkZEVycm9yKCdzZWxlY3RvckVycm9yJywgZXJyb3JNZXNzYWdlKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHNraXBwZWRJZHMgPSBjaGlsZHJlblxuICAgICAgLmZpbHRlcigoYykgPT4gIXNlbGVjdGVkSWRzLmluY2x1ZGVzKGMuYnJhbmNoSWQgPz8gYy5pZCEpKVxuICAgICAgLm1hcCgoYykgPT4gYy5icmFuY2hJZCA/PyBjLmlkKTtcbiAgICBpZiAoc2tpcHBlZElkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb250ZXh0LmFkZExvZygnc2tpcHBlZENoaWxkSWRzJywgc2tpcHBlZElkcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWROYW1lcyA9IHNlbGVjdGVkQ2hpbGRyZW4ubWFwKChjKSA9PiBjLm5hbWUpLmpvaW4oJywgJyk7XG4gICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKFxuICAgICAgJ3NlbGVjdGVkJyxcbiAgICAgIGBSdW5uaW5nICR7c2VsZWN0ZWROYW1lc30gKCR7c2VsZWN0ZWRDaGlsZHJlbi5sZW5ndGh9IG9mICR7Y2hpbGRyZW4ubGVuZ3RofSBtYXRjaGVkKWAsXG4gICAgICB7IGNvdW50OiBzZWxlY3RlZENoaWxkcmVuLmxlbmd0aCwgdGFyZ2V0U3RhZ2U6IHNlbGVjdGVkQ2hpbGRyZW4ubWFwKChjKSA9PiBjLm5hbWUpIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkRGlzcGxheU5hbWVzID0gc2VsZWN0ZWRDaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSk7XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblNlbGVjdGVkKFxuICAgICAgbm9kZS5uYW1lLFxuICAgICAgc2VsZWN0ZWREaXNwbGF5TmFtZXMsXG4gICAgICBjaGlsZHJlbi5sZW5ndGgsXG4gICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgc2VsZWN0aW9uRXZpZGVuY2UsXG4gICAgKTtcbiAgICAvLyBQcm9wb3NhbCAjMDAzOiBmaXJlIG9uU3RhZ2VFeGVjdXRlZCBBRlRFUiB0aGUgc3BlY2lhbGl6ZWQgZXZlbnRcbiAgICAvLyBzbyBjb25zdW1lcnMgdHJhY2tpbmcgXCJkaWQgdGhpcyBzdGFnZSBydW5cIiB3b3JrIHVuaWZvcm1seS5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdzZWxlY3RvcicpO1xuXG4gICAgY29uc3QgdGVtcE5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogJ3NlbGVjdG9yLXRlbXAnLFxuICAgICAgaWQ6ICdzZWxlY3Rvci10ZW1wJyxcbiAgICAgIGNoaWxkcmVuOiBzZWxlY3RlZENoaWxkcmVuLFxuICAgICAgLy8gUHJvcGFnYXRlIHRoZSBzZWxlY3RvcidzIGZhbi1vdXQgZXJyb3IgbW9kZS4gV2l0aG91dCB0aGlzLCBDaGlsZHJlbkV4ZWN1dG9yXG4gICAgICAvLyByZWFkcyBgdGVtcE5vZGUuZmFpbEZhc3RgICh1bmRlZmluZWQpIGFuZCBhbHdheXMgdXNlcyBQcm9taXNlLmFsbFNldHRsZWQg4oCUXG4gICAgICAvLyBzaWxlbnRseSBzd2FsbG93aW5nIGEgcmVxdWlyZWQgYnJhbmNoJ3MgZXJyb3IuIFNlZSBidWlsZGVyIGBmYWlsRmFzdGAgb3B0aW9uLlxuICAgICAgZmFpbEZhc3Q6IG5vZGUuZmFpbEZhc3QsXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlTm9kZUNoaWxkcmVuKFxuICAgICAgICB0ZW1wTm9kZSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gU3RhbXAgaW52b2tlciBjb250ZXh0IG9uIFBhdXNlU2lnbmFsIGR1cmluZyBidWJibGUtdXAuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihub2RlLmlkISk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -15,6 +15,7 @@
15
15
  import { LOG_PLACEHOLDER } from 'foottrace/write';
16
16
  import { thrownText } from '../../errors/errorInfo.js';
17
17
  import { isPauseSignal } from '../../pause/types.js';
18
+ import { commitStageWrites } from './commitStage.js';
18
19
  import { rememberRedactedSubflowState } from './servedSubflowResults.js';
19
20
  import { loggableStageError } from './stageError.js';
20
21
  import { applyOutputMapping, getInitialScopeValues, seedSubflowGlobalStore } from './SubflowInputMapper.js';
@@ -406,11 +407,13 @@ export class SubflowExecutor {
406
407
  this.deps.narrativeGenerator.onSubflowExit(subflowName, subflowId, parentTraversalContext, exitState);
407
408
  // The mount's EXIT — a continuation of the mount's execution, named as one
408
409
  // on the record (9.39.0) so no reader infers it from the log's shape.
409
- parentContext.commit('exit');
410
+ commitStageWrites(parentContext, 'exit');
410
411
  if (subflowError) {
412
+ parentContext.failureState.adopt(nestedRuntime.rootStageContext.failureState, subflowError.error);
411
413
  throw subflowError.error;
412
414
  }
415
+ nestedRuntime.rootStageContext.failureState.complete();
413
416
  return subflowOutput;
414
417
  }
415
418
  }
416
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVdyRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUc1Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQThCO0lBQ3ZELElBQUksR0FBd0MsQ0FBQztJQUM3QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUztRQUNuQyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQztBQUN0QixDQUFDO0FBRUQseUdBQXlHO0FBQ3pHLFNBQVMsWUFBWSxDQUFDLEtBQWM7SUFDbEMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFL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LENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXRHLDJFQUEyRTtRQUMzRSxzRUFBc0U7UUFDdEUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QixJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQztRQUMzQixDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdWJmbG93RXhlY3V0b3Ig4oCUIElzb2xhdGlvbiBib3VuZGFyeSBmb3Igc3ViZmxvdyBleGVjdXRpb24uXG4gKlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ3JlYXRlIGlzb2xhdGVkIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIGVhY2ggc3ViZmxvd1xuICogLSBBcHBseSBpbnB1dC9vdXRwdXQgbWFwcGluZyB2aWEgU3ViZmxvd0lucHV0TWFwcGVyXG4gKiAtIERlbGVnYXRlIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAqIC0gVHJhY2sgc3ViZmxvdyByZXN1bHRzIGZvciBkZWJ1Z2dpbmcvdmlzdWFsaXphdGlvblxuICpcbiAqIEVhY2ggc3ViZmxvdyBnZXRzIGl0cyBvd24gR2xvYmFsU3RvcmUgZm9yIGlzb2xhdGlvbi5cbiAqIFRyYXZlcnNhbCB1c2VzIHRoZSBTQU1FIDctcGhhc2UgYWxnb3JpdGhtIGFzIHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2VyXG4gKiAodmlhIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KSwgc28gZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGxhenkgc3ViZmxvd3MsXG4gKiBhbmQgYWJvcnQgc2lnbmFscyBhbGwgd29yayBpbnNpZGUgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAqL1xuXG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgeyB0aHJvd25UZXh0IH0gZnJvbSAnLi4vLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgdHlwZSB7IFJ1blBvbGljeSB9IGZyb20gJy4uLy4uL21lbW9yeS9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIFN1YmZsb3dSZXN1bHQsXG4gIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LFxuICBTdWJmbG93VHJhdmVyc2VySGFuZGxlLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc3VtZUVudHJ5IH0gZnJvbSAnLi9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlIH0gZnJvbSAnLi9zZXJ2ZWRTdWJmbG93UmVzdWx0cy5qcyc7XG5pbXBvcnQgeyBsb2dnYWJsZVN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHsgYXBwbHlPdXRwdXRNYXBwaW5nLCBnZXRJbml0aWFsU2NvcGVWYWx1ZXMsIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUgfSBmcm9tICcuL1N1YmZsb3dJbnB1dE1hcHBlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSBtYXBwZWQgaW5wdXQsIGRldGFjaGVkIGZyb20gdGhlIHBhcmVudCdzIHN0YXRlIE9OQ0UgcGVyIG1vdW50IChEMSxcbiAqIDkuMjkuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1jb3B5LW9uLXdyaXRlLWNvbW1pdC5tZCkuXG4gKlxuICogVGhlIGlucHV0TWFwcGVyIHJlYWRzIHRoZSBwYXJlbnQncyBMSVZFIHN0YXRlIChgZ2V0U2NvcGUoKWApLCBzbyBhIHZhbHVlIGl0XG4gKiBwYXNzZXMgdGhyb3VnaCAoYChwKSA9PiAoeyBjZmc6IHAuY2ZnIH0pYCkgaXMgdGhlIHBhcmVudCdzIGNvbW1pdHRlZFxuICogb2JqZWN0IOKAlCBhbmQgdGhlIHN1YmZsb3cncyBhcmdzIGFyZSBkZWVwLUZST1pFTiBpbiBwbGFjZVxuICogKGByZWFkb25seUlucHV0IMK3IGNyZWF0ZUZyb3plbkFyZ3NgKS4gVGhlIHR5cGVkIHNjb3BlIGRvZXMgbm90IHByb3h5IGFcbiAqIGZyb3plbiB2YWx1ZSAoYGFsbG93bGlzdCDCtyBzaG91bGRXcmFwV2l0aFByb3h5YCksIHNvIGEgbGF0ZXJcbiAqIGBzY29wZS5jZmcueCA9IDFgIGluIHRoZSBwYXJlbnQgbWV0IHRoZSByYXcgZnJvemVuIG9iamVjdDogYSBUeXBlRXJyb3IgaW5cbiAqIHN0cmljdCBjb2RlLiBCZWZvcmUgOS4yOS4wIHRoZSBwYXJlbnQncyBuZXh0IHdob2xlLXN0YXRlIGNsb25lIHJlcGxhY2VkIHRoZVxuICogZnJvemVuIG9iamVjdCAoYSBtb3VudCB0aGF0IGNvbW1pdHRlZCBub3RoaW5nIGxlZnQgaXQgaW4gcGxhY2Ug4oCUIHRoZSBidWdcbiAqIGV4aXN0ZWQsIGl0IHdhcyBvbmx5IHNob3J0LWxpdmVkKTsgdW5kZXIgY29weS1vbi13cml0ZSBub3RoaW5nIHJlLWNsb25lcyxcbiAqIHNvIHRoZSBmcmVlemUgd291bGQgbGFzdCB1bnRpbCB0aGUga2V5IGlzIHJld3JpdHRlbi4gQSBtb3VudCBtdXN0IG5ldmVyXG4gKiBlZGl0IOKAlCBvciBmcmVlemUg4oCUIHRoZSBwYXJlbnQncyBjb21taXR0ZWQgb2JqZWN0czogZXZlcnkgcGxhaW4gb2JqZWN0LFxuICogYXJyYXksIGBEYXRlYCwgYE1hcGAgYW5kIGBTZXRgIHRoZSBtYXBwZXIgcmV0dXJucyBpcyBjbG9uZWQgaGVyZSwgYmVmb3JlIGl0XG4gKiBiZWNvbWVzIHRoZSBhcmdzLiBBIGNsYXNzIGluc3RhbmNlIHBhc3NlcyBieSByZWZlcmVuY2UsIGFzIGJlZm9yZSAoaXRcbiAqIGNhbm5vdCBjb21lIGZyb20gY29tbWl0dGVkIHN0YXRlLCBhbmQgYSBjbG9uZSB3b3VsZCBkcm9wIGl0cyBwcm90b3R5cGUpLlxuICogVGhlIHNlZWQgaXMgY2xvbmVkIGFnYWluIGF0IGl0cyBjb21taXQsIHNvIHRoZSBzdWJmbG93J3Mgc3RhdGUgaXNcbiAqIHVuY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gZGV0YWNoTWFwcGVkSW5wdXQoaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG4gICAgaWYgKCFpc0RldGFjaGFibGUodmFsdWUpKSBjb250aW51ZTtcbiAgICAob3V0ID8/PSB7IC4uLmlucHV0IH0pW2tleV0gPSBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9XG4gIHJldHVybiBvdXQgPz8gaW5wdXQ7XG59XG5cbi8qKiBBIHZhbHVlIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJlcHJvZHVjZXMgd2l0aCBpdHMgb3duIHR5cGU6IHBsYWluIG9iamVjdCwgYXJyYXksIGBEYXRlYCwgYE1hcGAsIGBTZXRgLiAqL1xuZnVuY3Rpb24gaXNEZXRhY2hhYmxlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXAgfHwgdmFsdWUgaW5zdGFuY2VvZiBTZXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIFN1YmZsb3dFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSAoYGRlcHMucmVzdW1lYCkuIFVuZGVmaW5lZCBvbiBhIG5vcm1hbFxuICAgKiBydW4uIEFza2VkIG9uY2UgcGVyIHN1YmZsb3cgZW50cnkg4oCUIHNlZSB7QGxpbmsgUmVzdW1lRW50cnl9LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXN1bWU6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgdHJhdmVyc2VyRmFjdG9yeTogU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnk8VE91dCwgVFNjb3BlPixcbiAgKSB7XG4gICAgdGhpcy5yZXN1bWUgPSBkZXBzLnJlc3VtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgc3ViZmxvdyB3aXRoIGlzb2xhdGVkIGNvbnRleHQuXG4gICAqXG4gICAqIDEuIENyZWF0ZXMgYSBmcmVzaCBFeGVjdXRpb25SdW50aW1lIGZvciB0aGUgc3ViZmxvd1xuICAgKiAyLiBBcHBsaWVzIGlucHV0IG1hcHBpbmcgdG8gc2VlZCB0aGUgc3ViZmxvdydzIEdsb2JhbFN0b3JlXG4gICAqIDMuIERlbGVnYXRlcyB0cmF2ZXJzYWwgdG8gYSBmYWN0b3J5LWNyZWF0ZWQgRmxvd2NoYXJ0VHJhdmVyc2VyXG4gICAqIDQuIEFwcGxpZXMgb3V0cHV0IG1hcHBpbmcgdG8gd3JpdGUgcmVzdWx0cyBiYWNrIHRvIHBhcmVudCBzY29wZVxuICAgKiA1LiBTdG9yZXMgZXhlY3V0aW9uIGRhdGEgZm9yIGRlYnVnZ2luZy92aXN1YWxpemF0aW9uXG4gICAqL1xuICBhc3luYyBleGVjdXRlU3ViZmxvdyhcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBwYXJlbnRDb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiBCcmVha0ZsYWcsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHN1YmZsb3dSZXN1bHRzTWFwOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PixcbiAgICBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzdWJmbG93SWQgPSBub2RlLnN1YmZsb3dJZCE7XG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBub2RlLnN1YmZsb3dOYW1lID8/IG5vZGUubmFtZTtcblxuICAgIHBhcmVudENvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnc3ViZmxvdycsIGBFbnRlcmluZyAke3N1YmZsb3dOYW1lfSBzdWJmbG93YCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHN1YmZsb3dJZCxcbiAgICB9KTtcblxuICAgIC8vIOKUgOKUgOKUgCBSZXN1bWUgcmUtZW50cnkgKG9uZS1zaG90KSDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFdoZW4gdGhpcyBlbnRyeSBpcyB0aGUgcmVzdW1lJ3Mgd2F5IGJhY2sgaW50byBhIHBhdXNlZCBzdWJmbG93LCB0aGVcbiAgICAvLyBob3AgbmFtZXMgd2hlcmUgdGhlIHN1YmZsb3cncyB0cmF2ZXJzYWwgc3RhcnRzICh0aGUgbmV4dCBtb3VudCBvbiB0aGVcbiAgICAvLyBwYXVzZSBwYXRoLCBvciB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4pLCBjYXJyaWVzIHRoZSBzdWJmbG93J3NcbiAgICAvLyBjYXB0dXJlZCBwcmUtcGF1c2Ugc3RhdGUsIGFuZCBhbnkgc2libGluZyBwYXVzZXMgd2FpdGluZyBpbiBpdC4gVGFrZW5cbiAgICAvLyBPTkNFOiBhbnkgbGF0ZXIgZW50cnkgaW50byB0aGlzIHN1YmZsb3cg4oCUIGEgbG9vcCBwYXNzaW5nIGl0cyBtb3VudFxuICAgIC8vIGFnYWluIOKAlCBnZXRzIGB1bmRlZmluZWRgIGFuZCBydW5zIHRoZSByZWFsIHN1YmZsb3cgZnJvbSBpdHMgcmVhbCByb290LFxuICAgIC8vIGlucHV0TWFwcGVyIGFuZCBhbGwuXG4gICAgY29uc3QgcmVzdW1lSG9wID0gdGhpcy5yZXN1bWU/LmVudGVyU3ViZmxvdyhzdWJmbG93SWQpO1xuXG4gICAgLy8g4pSA4pSA4pSAIElucHV0IE1hcHBpbmcg4pSA4pSA4pSAXG4gICAgLy9cbiAgICAvLyBUaGUgbWFwcGVyIHJ1bnMgb24gRVZFUlkgZW50cnk6IGl0cyByZXN1bHQgaXMgdGhlIHN0YWdlcycgcmVhZC1vbmx5XG4gICAgLy8gYXJncyAoYCRnZXRBcmdzKClgKSwgYW5kIGEgcmUtZW50ZXJlZCBzdWJmbG93J3Mgc3RhZ2VzIHJlYWQgdGhlIHNhbWVcbiAgICAvLyBhcmdzIHRoZXkgcmVhZCBiZWZvcmUgdGhlIHBhdXNlICh0aGUgcGFyZW50J3MgdmlldyBpcyB0aGUgc2FtZSBvbmUg4oCUXG4gICAgLy8gaXQgd2FzIGJsb2NrZWQgaW4gdGhpcyBtb3VudCkuIFdoYXQgYSByZXN1bWUgY2hhbmdlcyBpcyBvbmx5IHRoZSBTRUVEOlxuICAgIC8vIHdoZW4gdGhlIGhvcCBjYXJyaWVzIGEgY2FwdHVyZSwgdGhlIG5lc3RlZCBtZW1vcnkgaXMgc2VlZGVkIGZyb20gdGhlXG4gICAgLy8gY2FwdHVyZSwgbm90IGZyb20gdGhlIG1hcHBlciDigJQgdGhlIGNhcHR1cmUgaXMgdGhlIHBvc3QtaW5wdXQgcHJlLXBhdXNlXG4gICAgLy8gbWVtb3J5LCBhbmQgc2VlZGluZyB0aGUgbWFwcGVyJ3MgdmFsdWVzIHdvdWxkIGNsb2JiZXIgcG9zdC1pbnB1dFxuICAgIC8vIHdyaXRlcyAoaGlzdG9yeSwgcGF1c2VkVG9vbENhbGxJZCwgZXRjLikgd2l0aCB0aGUgc3RhcnQtb2Ytc3ViZmxvdyB2aWV3LlxuICAgIGNvbnN0IG1vdW50T3B0aW9ucyA9IG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucztcbiAgICBsZXQgbWFwcGVkSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgY29uc3QgcmVzdW1lQ2FwdHVyZSA9IHJlc3VtZUhvcD8uc2VlZDtcbiAgICBjb25zdCBpc1Jlc3VtZUZvclRoaXNTdWJmbG93ID0gcmVzdW1lQ2FwdHVyZSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgLy8gVGhlIHJ1bidzIHBvbGljeSAoRjUpIOKAlCB0aGUgZm91ciBkaWFscywgdGhlIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yXG4gICAgLy8gZmxhZyDigJQgcmVhZCBvZmYgdGhlIHBhcmVudC1tb3VudCBmcmFtZSwgd2hpY2ggaG9sZHMgaXQgYnkgcmVmZXJlbmNlLlxuICAgIC8vIFRoZSBuZXN0ZWQgcnVudGltZSBpcyBjb25zdHJ1Y3RlZCBXSVRIIGl0LCBzbyB0aGUgc2VlZCBjb21taXQgYmVsb3dcbiAgICAvLyAoYGhpc3RvcnlbMF1gKSBhbmQgZXZlcnkgbGF0ZXIgY29tbWl0IG9mIHRoZSBzdWJmbG93IHJ1biB1bmRlciB0aGUgc2FtZVxuICAgIC8vIG9iamVjdCwgYW5kIHRoZSBuZXN0ZWQgcnVudGltZSBrZWVwcyBhIG1pcnJvciBvZiBpdHMgb3duIGV4YWN0bHkgd2hlblxuICAgIC8vIHRoZSBydW4gZG9lcyAoaXRzIFNFUlZFRCBzdGF0ZSBpcyB0aGVuIHRoZSBmb2xkIG9mIGl0cyBvd24gc2NydWJiZWRcbiAgICAvLyBsb2csIG5ldmVyIGEgc2Vjb25kIHNjcnViKS5cbiAgICBjb25zdCBwb2xpY3k6IFJ1blBvbGljeSA9IHBhcmVudENvbnRleHQuZ2V0UG9saWN5KCk7XG4gICAgY29uc3QgcmVkYWN0aW9uUnVsZSA9IHBvbGljeS5yZWRhY3Rpb247XG5cbiAgICBpZiAobW91bnRPcHRpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJlbnRTY29wZSA9IHBhcmVudENvbnRleHQuZ2V0U2NvcGUoKTtcbiAgICAgICAgLy8gVGhlIHJ1bGUgcmlkZXMgYWxvbmc6IGEga2V5IHRoZSBtYXBwZXIgY29waWVzIGEgc2VsZWN0ZWQgdmFsdWUgaW50b1xuICAgICAgICAvLyBpbmhlcml0cyBpdHMgcmVkYWN0aW9uIGJlZm9yZSB0aGUgc2VlZCBpcyB3cml0dGVuICh0aGUgdGFpbnQgcnVsZSkuXG4gICAgICAgIG1hcHBlZElucHV0ID0gZGV0YWNoTWFwcGVkSW5wdXQoZ2V0SW5pdGlhbFNjb3BlVmFsdWVzKHBhcmVudFNjb3BlLCBtb3VudE9wdGlvbnMsIHJlZGFjdGlvblJ1bGUpKTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcHBlZElucHV0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gbWFwcGVkSW5wdXQgaXMgY2FwdHVyZWQgaW4gU3ViZmxvd1Jlc3VsdC50cmVlQ29udGV4dCBmb3IgZGVidWdnaW5nXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignaW5wdXRNYXBwZXJFcnJvcicsIHRocm93blRleHQoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gaW5wdXRNYXBwZXIgZm9yIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwge1xuICAgICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IocGFyZW50Q29udGV4dCwgZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTmFycmF0aXZlIHJlY2VpdmVzIHRoZSBSRVRBSU5FRCBmb3JtIG9mIHRoZSBtYXBwZWQgaW5wdXQg4oCUIGFuXG4gICAgLy8gaW5wdXRNYXBwZXIgbWF5IGluamVjdCB2YWx1ZXMgZnJvbSBhbnl3aGVyZSwgc28gdGhlIHNlZWQgaXMgc2NydWJiZWRcbiAgICAvLyB1bmRlciB0aGUgcG9saWN5IGJlZm9yZSBhbnkgcmVjb3JkZXIgc2VlcyBpdC4gU2FtZSBvYmplY3Qgd2hlbiBub3RoaW5nXG4gICAgLy8gaW4gaXQgaXMgcmVkYWN0ZWQgKHRoZSBuby1wb2xpY3kgcGF0aCBhbGxvY2F0ZXMgbm90aGluZykuXG4gICAgY29uc3QgbmFycmF0aXZlSW5wdXQgPSByZWRhY3Rpb25SdWxlID8gcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShtYXBwZWRJbnB1dCkgOiBtYXBwZWRJbnB1dDtcbiAgICAvLyBgRmxvd1N1YmZsb3dFdmVudC5kZXNjcmlwdGlvbmAgaXMgc2VtYW50aWNhbGx5IFwid2hhdCB0aGlzIHN1YmZsb3cgZG9lc1wiIOKAlCBzb3VyY2VkIGZyb21cbiAgICAvLyB0aGUgc3ViZmxvdydzIG93biByb290IHN0YWdlLCBub3QgdGhlIHBhcmVudCBtb3VudCBwb2ludC4gVGhlIG1vdW50IG5vZGUgbmV2ZXIgY2Fycmllc1xuICAgIC8vIGEgZGVzY3JpcHRpb24gKGJ1aWxkZXJzIGRvbid0IGNvcHkgaXQpLCBzbyByZWFkaW5nIGBub2RlLmRlc2NyaXB0aW9uYCBoZXJlIHJldHVybnNcbiAgICAvLyBgdW5kZWZpbmVkYCBhbmQgdGF4b25vbXkgbWFya2VycyBzZXQgb24gdGhlIHN1YmZsb3cgcm9vdCAoZS5nLiBhZ2VudGZvb3RwcmludCdzXG4gICAgLy8gYCdBZ2VudDogUmVBY3QgbG9vcCdgIC8gYCdMTE1DYWxsOiBvbmUtc2hvdCdgKSBuZXZlciByZWFjaCBkb3duc3RyZWFtIGNvbnN1bWVycy5cbiAgICBjb25zdCByb290RGVzY3JpcHRpb24gPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdPy5yb290Py5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0VudHJ5KFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93SWQsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICBuYXJyYXRpdmVJbnB1dCxcbiAgICApO1xuICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIGZvciB0aGUgbW91bnQgbm9kZSBBRlRFUlxuICAgIC8vIG9uU3ViZmxvd0VudHJ5IHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiIHdvcmtcbiAgICAvLyB1bmlmb3JtbHkgYWNyb3NzIGxpbmVhciAvIGRlY2lkZXIgLyBmb3JrIC8gc2VsZWN0b3IgLyBzdWJmbG93LW1vdW50LlxuICAgIC8vIEZpcmVzIG9uIEVOVFJZIChub3QgZXhpdCkg4oCUIGVudHJ5ID0gXCJ0aGlzIG1vdW50IHJhblwiOyB0aGVcbiAgICAvLyBzdWJmbG93J3MgY2hpbGRyZW4gZXhlY3V0ZSBhZnRlciBhcyBzZXBhcmF0ZSBzdGFnZXMuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQoXG4gICAgICBub2RlLm5hbWUsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICAnc3ViZmxvdy1tb3VudCcsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBpc29sYXRlZCBydW50aW1lIHZpYSBkeW5hbWljIGNvbnN0cnVjdGlvbiAoYXZvaWRzIGNpcmN1bGFyIGltcG9ydCkuXG4gICAgLy8gSXRzIHJvb3QgY29udGV4dCBpcyB0aGUgZmlyc3Qgc3RhZ2UgdGhlIHN1YmZsb3cgdHJhdmVyc2FsIHJ1bnMg4oCUIHRoZVxuICAgIC8vIHJlc3VtZSBob3AncyBlbnRyeSBvbiBhIHJlLWVudHJ5LCB0aGUgc3ViZmxvdydzIHJvb3Qgb3RoZXJ3aXNlLlxuICAgIGNvbnN0IEV4ZWN1dGlvblJ1bnRpbWVDbGFzcyA9IHRoaXMuZGVwcy5leGVjdXRpb25SdW50aW1lLmNvbnN0cnVjdG9yIGFzIG5ldyAoXG4gICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICBpZDogc3RyaW5nLFxuICAgICAgZGVmYXVsdFZhbHVlczogdW5kZWZpbmVkLFxuICAgICAgaW5pdGlhbFN0YXRlOiB1bmRlZmluZWQsXG4gICAgICBwb2xpY3k6IFJ1blBvbGljeSxcbiAgICAgIHJlY29yZD86IHVua25vd24sXG4gICAgKSA9PiBJRXhlY3V0aW9uUnVudGltZTtcbiAgICBjb25zdCBmaXJzdE5vZGUgPSByZXN1bWVIb3A/LmVudHJ5ID8/IG5vZGU7XG4gICAgLy8gVGhlIGNyYXNoLXNhZmUgcmVjb3JkICgxMC4xLCBQNik6IHdoZW4gdGhlIHJ1biB3cml0ZXMgdG8gYSBzaW5rLCB0aGUgbW91bnQncyBvd24gbG9nIGRvZXMgdG9vLCBhdCB0aGVcbiAgICAvLyBwYXJlbnQgbG9nJ3MgYWRkcmVzcyBwbHVzIHRoaXMgbW91bnQncyBydW50aW1lU3RhZ2VJZCDigJQgb3BlbmVkIGhlcmUsIGl0cyBzZWVkIGFuZCBldmVyeSBjb21taXQgYXMgdGhleSBsYW5kLFxuICAgIC8vIGNsb3NlZCBhdCB0aGUgbW91bnQncyBleGl0IChvciBpdHMgcGF1c2UsIG9yIGl0cyBmYWlsdXJlKS4gV2l0aG91dCBhIHNpbms6IHVuZGVmaW5lZCwgdGhlIHBsYWluIGxvZy5cbiAgICBjb25zdCBtb3VudFJ1bnRpbWVTdGFnZUlkID0gcGFyZW50VHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQ7XG4gICAgY29uc3QgcmVjb3JkID1cbiAgICAgIG1vdW50UnVudGltZVN0YWdlSWQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IHRoaXMuZGVwcy5leGVjdXRpb25SdW50aW1lLnJlY29yZEZvcj8uKG1vdW50UnVudGltZVN0YWdlSWQsIHsgc3ViZmxvd0lkIH0pO1xuICAgIGNvbnN0IG5lc3RlZFJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZUNsYXNzKGZpcnN0Tm9kZS5uYW1lLCBmaXJzdE5vZGUuaWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBwb2xpY3ksIHJlY29yZCk7XG5cbiAgICAvLyBTZWVkIEdsb2JhbFN0b3JlIHdpdGggdGhlIHJpZ2h0IHNoYXBlIGZvciB0aGUgcGF0aDpcbiAgICAvLyAgIOKAoiBSZXN1bWUgaW50byBUSElTIHN1YmZsb3cg4oaSIHNlZWQgZnJvbSB0aGUgY2FwdHVyZWQgcHJlLXBhdXNlXG4gICAgLy8gICAgIHNjb3BlIHNvIHJlc3VtZSBoYW5kbGVycyBzZWUgaGlzdG9yeSwgcGF1c2VkVG9vbENhbGxJZCwgZXRjLlxuICAgIC8vICAgICAoYG1hcHBlZElucHV0YCBzdGlsbCByZWFjaGVzIHRoZSBzdGFnZXMsIGFzIHRoZWlyIHJlYWQtb25seSBhcmdzLilcbiAgICAvLyAgIOKAoiBOb3JtYWwgZW50cnkg4oaSIHNlZWQgZnJvbSB0aGUgaW5wdXRNYXBwZXIncyBtYXBwZWRJbnB1dC5cbiAgICBjb25zdCBzZWVkVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPyByZXN1bWVDYXB0dXJlISA6IG1hcHBlZElucHV0O1xuICAgIGlmIChPYmplY3Qua2V5cyhzZWVkVmFsdWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgc2VlZCBpcyBjb21taXR0ZWQgYXMgdGhlIHN1YmZsb3cncyBgaGlzdG9yeVswXWAgYnkgaXRzIHJvb3RcbiAgICAgIC8vIGNvbnRleHQsIG5vdCBieSBhIGZhY2FkZSDigJQgdGhhdCBmcmFtZSBhbHJlYWR5IGhvbGRzIHRoZSBydW4ncyBwb2xpY3lcbiAgICAgIC8vICh0aGUgcnVudGltZSB3YXMgY29uc3RydWN0ZWQgd2l0aCBpdCksIHNvIHRoZSBzZWVkIHJldGFpbnMgdW5kZXIgdGhlXG4gICAgICAvLyBydWxlLCBsYW5kcyBpbiB0aGUgbWlycm9yIGFzIHRoZSBwbGFjZWhvbGRlciwgYW5kIGNvbW1pdHMgdW5kZXIgdGhlXG4gICAgICAvLyBydW4ncyBkaWFscyBsaWtlIGV2ZXJ5IG90aGVyIHdyaXRlIChDLUY1OiB1bmRlciBgd3JpdGVQcm92ZW5hbmNlOlxuICAgICAgLy8gJ3JlYWRzLXByZWZpeCdgIGl0cyByb3dzIGNhcnJ5IGByZWFkS2V5czogW11gKS5cbiAgICAgIC8vIFRoZSBzZWVkIGlzIHRoZSBtb3VudCdzIGFjdCB0b286IGl0cyBidW5kbGUg4oCUIGBoaXN0b3J5WzBdYCBvZiB0aGVcbiAgICAgIC8vIHN1YmZsb3cncyBvd24gbG9nIOKAlCBjYXJyaWVzIHRoZSBtb3VudCdzIHN0YWdlLCBzdGFnZUlkIGFuZFxuICAgICAgLy8gcnVudGltZVN0YWdlSWQgKFIxMzsgdGhyb3VnaCA5LjMzLjAgaXQgY2FycmllZCBydW50aW1lU3RhZ2VJZCAnJyBhbmRcbiAgICAgIC8vIHRoZSBmaXJzdCBzdGFnZSdzIG5hbWVzLCB3aGljaCBvbiBhIHJlc3VtZSB3YXMgdGhlIHJlLWVudHJ5IHBvaW50KS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUobmVzdGVkUnVudGltZSwgc2VlZFZhbHVlcywgcGFyZW50Q29udGV4dCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBUaGUgbW91bnQncyBvd24gbG9nIG9wZW5lZCBhYm92ZTogYSBzZWVkIHRoYXQgZmFpbHMgY2xvc2VzIGl0LCBuZXZlciBsZWF2ZXMgaXQgbG9va2luZyBjcmFzaGVkLlxuICAgICAgICBuZXN0ZWRSdW50aW1lLmNsb3NlUmVjb3JkPy4oJ2ZhaWxlZCcpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIFJlZnJlc2ggcm9vdFN0YWdlQ29udGV4dCBzbyBXcml0ZUJ1ZmZlciBzZWVzIGNvbW1pdHRlZCBkYXRhLiBOYW1lZFxuICAgICAgLy8gYWZ0ZXIgdGhlIGZpcnN0IG5vZGUgYWdhaW4g4oCUIHRoZSBzZWVkIGNvbnRleHQgbm93IGNhcnJpZXMgdGhlIG1vdW50J3NcbiAgICAgIC8vIG5hbWVzIChSMTMpLCB3aGljaCBiZWxvbmcgdG8gdGhlIHNlZWQgYnVuZGxlIG9ubHkuIGBuZXdSb290YCBnaXZlcyBpdFxuICAgICAgLy8gdGhlIHNhbWUgcG9saWN5IGFuZCBtaXJyb3IuXG4gICAgICBuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQgPSBuZXN0ZWRSdW50aW1lLm5ld1Jvb3QoZmlyc3ROb2RlLm5hbWUsIGZpcnN0Tm9kZS5pZCk7XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBzdWJmbG93IHJvb3Qgbm9kZSDigJQgc3RyaXAgaXNTdWJmbG93Um9vdCB0byBwcmV2ZW50IHJlLWRlbGVnYXRpb24uXG4gICAgLy9cbiAgICAvLyBQUkVTRVJWRSBgbmV4dGAuIEVhcmxpZXIgcmV2aXNpb25zIHN0cmlwcGVkIGBuZXh0YCB3aGVuZXZlciB0aGVcbiAgICAvLyBzdWJmbG93IHJvb3QgaGFkIGNoaWxkcmVuLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGBuZXh0YCB3YXNcbiAgICAvLyBhbHdheXMgdGhlIE9VVEVSIG1vdW50J3MgY29udGludWF0aW9uIGxlYWtpbmcgaW50byB0aGUgaW5uZXJcbiAgICAvLyB0cmVlLiBUaGF0IGFzc3VtcHRpb24gd2FzIHdyb25nOiB0aGUgcmVzb2x2ZWQgc3ViZmxvdyByb290J3NcbiAgICAvLyBgbmV4dGAgaXMgdGhlIElOTkVSIGpvaW4gc3RhZ2UgKGUuZy4sIFBhcmFsbGVsJ3MgTWVyZ2UgYWZ0ZXIgYVxuICAgIC8vIGZhbi1vdXQsIFRvVCdzIFBydW5lcikuIFN0cmlwcGluZyBpdCBicm9rZSBjb21wb3NpdGUgc3ViZmxvd3Mg4oCUXG4gICAgLy8gdGhlIGpvaW4gc3RhZ2UgbmV2ZXIgcmFuLCBzbyB0aGUgc3ViZmxvdyByZXR1cm5lZCBwYXJ0aWFsIHN0YXRlLlxuICAgIC8vXG4gICAgLy8gVGhlIG91dGVyIG1vdW50J3MgcG9zdC1zdWJmbG93IGNvbnRpbnVhdGlvbiBpcyBoYW5kbGVkIHNlcGFyYXRlbHlcbiAgICAvLyBieSB0aGUgcGFyZW50IHRyYXZlcnNlciB2aWEgYHBhcmVudENvbnRleHQubmV4dE5vZGVgIGFuZCBpcyBuZXZlclxuICAgIC8vIGNvbmZsYXRlZCB3aXRoIHRoZSBpbm5lciBzdWJmbG93J3MgYG5leHRgIGNoYWluLlxuICAgIGNvbnN0IHN1YmZsb3dOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIC4uLm5vZGUsXG4gICAgICBpc1N1YmZsb3dSb290OiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8g4pSA4pSA4pSAIEV4ZWN1dGUgdmlhIGZhY3RvcnkgdHJhdmVyc2VyIOKUgOKUgOKUgFxuICAgIC8vIFRoZSBmYWN0b3J5IGNyZWF0ZXMgYSBmdWxsIEZsb3djaGFydFRyYXZlcnNlciB3aXRoIHRoZSBzYW1lIDctcGhhc2UgYWxnb3JpdGhtLFxuICAgIC8vIHNoYXJpbmcgdGhlIHBhcmVudCdzIHN0YWdlTWFwLCBzdWJmbG93cyBkaWN0LCBhbmQgbmFycmF0aXZlIGdlbmVyYXRvci5cbiAgICBsZXQgc3ViZmxvd091dHB1dDogYW55O1xuICAgIC8vIEJveGVkOiBhIHN0YWdlIG1heSB0aHJvdyBBTlkgdmFsdWUsIGBudWxsYCBhbmQgYHVuZGVmaW5lZGAgaW5jbHVkZWQg4oCUXG4gICAgLy8gYSBmYWxzeSB0aHJvd24gdmFsdWUgbXVzdCBzdGlsbCBmYWlsIHRoZSBtb3VudC5cbiAgICBsZXQgc3ViZmxvd0Vycm9yOiB7IGVycm9yOiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRyYXZlcnNlckhhbmRsZTogU3ViZmxvd1RyYXZlcnNlckhhbmRsZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRyYXZlcnNlckhhbmRsZSA9IHRoaXMudHJhdmVyc2VyRmFjdG9yeSh7XG4gICAgICAgIC8vIFRoZSBSRUFMIHN1YmZsb3cgZ3JhcGgg4oCUIGV2ZXJ5IGlkIGluc2lkZSB0aGUgc3ViZmxvdyAobG9vcCB0YXJnZXRzLFxuICAgICAgICAvLyBhIHJlLXZpc2l0IG9mIHRoZSBwYXVzZWQgc3RhZ2UpIHJlc29sdmVzIGFnYWluc3QgaXQsIHJlLWVudHJ5IG9yIG5vdC5cbiAgICAgICAgcm9vdDogc3ViZmxvd05vZGUsXG4gICAgICAgIC8vIFdoZXJlIHRoaXMgdHJhdmVyc2FsIHN0YXJ0cyBvbiBhIHJlc3VtZSByZS1lbnRyeTsgdmlzaXRlZCBvbmNlIOKAlFxuICAgICAgICAvLyBhbmQgdGhlIHNpYmxpbmcgcGF1c2VzIGl0IHJhaXNlcyBvbmNlIHRoYXQgZW50cnkncyBjaGFpbiBlbmRzLlxuICAgICAgICAuLi4ocmVzdW1lSG9wPy5lbnRyeSAmJiB7IGVudHJ5OiByZXN1bWVIb3AuZW50cnkgfSksXG4gICAgICAgIC4uLihyZXN1bWVIb3A/LnBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiByZXN1bWVIb3AucGVuZGluZ1BhdXNlcyB9KSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogbmVzdGVkUnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiBtYXBwZWRJbnB1dCxcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICAvLyBSRkMtMDAzIEQxOiB0aGUgbW91bnQgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCDigJQgdGhlIHN1YmZsb3cgcm9vdFxuICAgICAgICAvLyBzdGFnZSdzIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgc28gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHRoZSBtb3VudC5cbiAgICAgICAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDogcGFyZW50VHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICB9KTtcblxuICAgICAgc3ViZmxvd091dHB1dCA9IGF3YWl0IHRyYXZlcnNlckhhbmRsZS5leGVjdXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gUGF1c2VTaWduYWwgaXMgbm90IGFuIGVycm9yIOKAlCBwcmVwZW5kIHN1YmZsb3cgSUQgYW5kIHJlLXRocm93XG4gICAgICAvLyBpbW1lZGlhdGVseS4gTm8gZXJyb3IgbG9nZ2luZywgbm8gc3ViZmxvd1Jlc3VsdCByZWNvcmRpbmcg4oCUXG4gICAgICAvLyB0aGUgcGF1c2UgaXMgY29udHJvbCBmbG93LlxuICAgICAgLy9cbiAgICAgIC8vIEJFRk9SRSByZS10aHJvdywgY2FwdHVyZSB0aGUgbmVzdGVkIHJ1bnRpbWUncyBzdGF0ZSBvbnRvIHRoZVxuICAgICAgLy8gc2lnbmFsLiBUaGlzIGlzIHRoZSBvbmx5IGNoYW5jZSDigJQgb25jZSB3ZSByZS10aHJvdywgdGhlIG91dGVyXG4gICAgICAvLyB0cmF2ZXJzZXIgdW53aW5kcyBhbmQgdGhlIG5lc3RlZCBydW50aW1lIGlzIEdDJ2QuIE9uIHJlc3VtZSwgd2UnbGxcbiAgICAgIC8vIHJlLXNlZWQgYSBmcmVzaCBuZXN0ZWQgcnVudGltZSBmcm9tIHRoaXMgY2FwdHVyZSBzbyByZXN1bWUgaGFuZGxlcnNcbiAgICAgIC8vIGNhbiByZWFkIHRoZSBwcmUtcGF1c2Ugc3ViZmxvdyBzY29wZS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgU1RBVEUgb25seSDigJQgdGhlIHN1YmZsb3cncyB3b3JraW5nIG1lbW9yeSBhdCBwYXVzZSB0aW1lIChldmVyeVxuICAgICAgLy8gY29tbWl0dGVkIHdyaXRlIHVwIHRvIHRoZSBwYXVzZSksIHJlYWQgc3RyYWlnaHQgb2ZmIGl0cyBzdG9yZS4gTm9cbiAgICAgIC8vIHNuYXBzaG90IGlzIGJ1aWx0OiBhIHNuYXBzaG90IHdvdWxkIGFsc28gYnVpbGQgdGhlIHN1YmZsb3cnc1xuICAgICAgLy8gZXhlY3V0aW9uIHRyZWUgYW5kIGNvcHkgaXRzIGNvbW1pdCBsb2cg4oCUIHdvcmsgcHJvcG9ydGlvbmFsIHRvIGhvd1xuICAgICAgLy8gbG9uZyB0aGUgc3ViZmxvdyByYW4g4oCUIHRoYXQgdGhlIGxlYW4gY2hlY2twb2ludCBuZXZlciBjYXJyaWVzXG4gICAgICAvLyAoYHJ1bm5lci9jaGVja3BvaW50LnRzYCkuXG4gICAgICAvL1xuICAgICAgLy8gQ2FwdHVyZSBpcyBrZXllZCBieSB0aGUgU0FNRSBwYXRoLXByZWZpeGVkIGBzdWJmbG93SWRgIHVzZWQgaW5cbiAgICAgIC8vIGBzdWJmbG93UGF0aGAsIHNvIHJlc3VtZSBjYW4gbG9vayB1cCBcInNjb3BlIGZvciBzZi1mb29cIiBieSBpZC5cbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBlcnJvci5jYXB0dXJlU3ViZmxvd1Njb3BlKHN1YmZsb3dJZCwgbmVzdGVkUnVudGltZS5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgZXJyb3IucHJlcGVuZFN1YmZsb3coc3ViZmxvd0lkKTtcbiAgICAgICAgbmVzdGVkUnVudGltZS5jbG9zZVJlY29yZD8uKCdwYXVzZWQnKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBzdWJmbG93RXJyb3IgPSB7IGVycm9yIH07XG4gICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdzdWJmbG93RXJyb3InLCB0aHJvd25UZXh0KGVycm9yKSk7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihwYXJlbnRDb250ZXh0LCBlcnJvcikgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIG1vdW50J3Mgb3duIGxvZyBlbmRlZCDigJQgYmVmb3JlIHRoZSBtZXJnZS1iYWNrLCB3aGljaCBjb21taXRzIG9uIHRoZSBQQVJFTlQncyBsb2cuXG4gICAgbmVzdGVkUnVudGltZS5jbG9zZVJlY29yZD8uKHN1YmZsb3dFcnJvciA/ICdmYWlsZWQnIDogJ29rJyk7XG5cbiAgICAvLyBBbHdheXMgbWVyZ2UgbmVzdGVkIHN1YmZsb3cgcmVzdWx0cyAoZXZlbiBvbiBlcnJvciDigJQgcGFydGlhbCByZXN1bHRzIGFpZCBkZWJ1Z2dpbmcpXG4gICAgaWYgKHRyYXZlcnNlckhhbmRsZSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhdmVyc2VySGFuZGxlLmdldFN1YmZsb3dSZXN1bHRzKCkpIHtcbiAgICAgICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBCcmVhayBwcm9wYWdhdGlvbiAob3B0LWluIHZpYSBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrKSDilIDilIBcbiAgICAvL1xuICAgIC8vIElmIHRoZSBzdWJmbG93J3MgaW5uZXIgdHJhdmVyc2FsIGJyb2tlIChiZWNhdXNlIGEgc3RhZ2UgY2FsbGVkXG4gICAgLy8gYHNjb3BlLiRicmVhayhyZWFzb24pYCkgQU5EIHRoZSBtb3VudCBkZWNsYXJlZCBgcHJvcGFnYXRlQnJlYWs6IHRydWVgLFxuICAgIC8vIGZvcndhcmQgdGhlIGJyZWFrIHN0YXRlIHRvIHRoZSBQQVJFTlQncyBicmVha0ZsYWcuIFRoZSBwYXJlbnRcbiAgICAvLyB0cmF2ZXJzZXIgd2lsbCBzZWUgYHNob3VsZEJyZWFrYCBvbiBpdHMgbmV4dCBzdGVwIGFuZCBzdG9wLlxuICAgIC8vXG4gICAgLy8gV2l0aG91dCB0aGlzLCBpbm5lciBicmVha3MgYXJlIGxvY2FsbHkgc2NvcGVkIHRvIHRoZSBzdWJmbG93IOKAlCB0aGVcbiAgICAvLyBwYXJlbnQgY29udGludWVzIGFzIGlmIHRoZSBzdWJmbG93IHJldHVybmVkIG5vcm1hbGx5LlxuICAgIC8vXG4gICAgLy8gSU1QT1JUQU5UOiB0aGlzIHJ1bnMgQkVGT1JFIGBvdXRwdXRNYXBwaW5nYCBiZWxvdywgaW50ZW50aW9uYWxseS4gVGhlXG4gICAgLy8gb3V0cHV0TWFwcGVyIHN0aWxsIGV4ZWN1dGVzLCBzbyB0aGUgc3ViZmxvdydzIHBhcnRpYWwgcmVzdWx0IHN0aWxsXG4gICAgLy8gbGFuZHMgaW4gdGhlIHBhcmVudCBzY29wZS4gQ29uc3VtZXJzIHdobyBuZWVkIHRvIHN1cHByZXNzIG91dHB1dCBvblxuICAgIC8vIGJyZWFrIGNoZWNrIHRoZSBicmVhayBzdGF0ZSBpbnNpZGUgdGhlaXIgb3V0cHV0TWFwcGVyIGFuZCBlYXJseS1yZXR1cm4uXG4gICAgLy8gU2VlIGBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrYCBKU0RvYyBmb3IgcmF0aW9uYWxlLlxuICAgIGlmICh0cmF2ZXJzZXJIYW5kbGUgJiYgbW91bnRPcHRpb25zPy5wcm9wYWdhdGVCcmVhayA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaW5uZXJCcmVhayA9IHRyYXZlcnNlckhhbmRsZS5nZXRCcmVha1N0YXRlKCk7XG4gICAgICBpZiAoaW5uZXJCcmVhay5zaG91bGRCcmVhaykge1xuICAgICAgICBicmVha0ZsYWcuc2hvdWxkQnJlYWsgPSB0cnVlO1xuICAgICAgICBpZiAoaW5uZXJCcmVhay5yZWFzb24gIT09IHVuZGVmaW5lZCAmJiBicmVha0ZsYWcucmVhc29uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBicmVha0ZsYWcucmVhc29uID0gaW5uZXJCcmVhay5yZWFzb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmFpc2UgYSBwYXJlbnQtbGV2ZWwgb25CcmVhayBldmVudCBzbyByZWNvcmRlcnMgY2FuIGRpc3Rpbmd1aXNoXG4gICAgICAgIC8vIHRoZSBpbm5lciBvcmlnaW5hdGluZyBicmVhayAoZmlyZWQgaW5zaWRlIHRoZSBzdWJmbG93KSBmcm9tIHRoaXNcbiAgICAgICAgLy8gcHJvcGFnYXRlZCBvbmUgKGZpcmVkIGF0IHRoZSBtb3VudCBsZXZlbCBvbiB0aGUgcGFyZW50KS5cbiAgICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKHN1YmZsb3dOYW1lLCBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LCBpbm5lckJyZWFrLnJlYXNvbiwgc3ViZmxvd0lkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93VHJlZUNvbnRleHQgPSBuZXN0ZWRSdW50aW1lLmdldFNuYXBzaG90KCk7XG5cbiAgICAvLyDilIDilIDilIAgT3V0cHV0IE1hcHBpbmcg4pSA4pSA4pSAXG4gICAgaWYgKCFzdWJmbG93RXJyb3IgJiYgbW91bnRPcHRpb25zPy5vdXRwdXRNYXBwZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoZSBtZXJnZS1iYWNrIGlzIHRoZSBNT1VOVCdzIGFjdCwgc28gdGhlIG1vdW50J3MgZnJhbWUgc3RhZ2VzIGFuZFxuICAgICAgICAvLyBjb21taXRzIGl0IOKAlCBpdHMgYnVuZGxlIGNhcnJpZXMgdGhlIG1vdW50J3MgcnVudGltZVN0YWdlSWQgKFIxMykuXG4gICAgICAgIC8vIEEgYnJhbmNoIG9yIGZvcmstY2hpbGQgbW91bnQgc3RpbGwgbGFuZHMgaXRzIHZhbHVlcyB3aGVyZSBpdHNcbiAgICAgICAgLy8gcGFyZW50IHdyaXRlcyAodGhlIHBhcmVudCdzIHJ1biBuYW1lc3BhY2UpLCBhcyBiZWZvcmU7IHVudGlsIDkuMzMuMFxuICAgICAgICAvLyBpdCBjb21taXR0ZWQgT04gdGhlIHBhcmVudCdzIGZyYW1lLCBzbyB0aGUgYnVuZGxlIG5hbWVkIHRoZSBzdGFnZVxuICAgICAgICAvLyBiZWZvcmUgdGhlIG1vdW50LCBvciB0aGUgYnJhbmNoaW5nIGRlY2lkZXIuXG4gICAgICAgIGNvbnN0IG91dHB1dENvbnRleHQgPSBwYXJlbnRDb250ZXh0O1xuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkge1xuICAgICAgICAgIG91dHB1dENvbnRleHQudXNlQWRkcmVzc09mKHBhcmVudENvbnRleHQucGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gb3V0cHV0Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBGb3IgVHlwZWRTY29wZSBzdWJmbG93cywgc3RhZ2UgZnVuY3Rpb25zIHJldHVybiB2b2lkIOKAlCBmYWxsIGJhY2sgdG8gYSBzaGFsbG93IGNsb25lXG4gICAgICAgIC8vIG9mIHRoZSBzdWJmbG93J3Mgc2hhcmVkIHN0YXRlIHNvIG91dHB1dE1hcHBlciBjYW4gYWNjZXNzIGFsbCBzY29wZSB2YWx1ZXMgd3JpdHRlblxuICAgICAgICAvLyBkdXJpbmcgdGhlIHN1YmZsb3cuIFdlIHNoYWxsb3ctY2xvbmUgdG8gYXZvaWQgYWxpYXNpbmcgdGhlIGxpdmUgU2hhcmVkTWVtb3J5IGNvbnRleHQuXG4gICAgICAgIC8vIE5PVEU6IHRoZSBmdWxsIHNjb3BlIGlzIHBhc3NlZCAobm90IGp1c3QgZGVjbGFyZWQgb3V0cHV0cykg4oCUIG91dHB1dE1hcHBlciBtdXN0XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgc2VsZWN0IHdoYXQgdG8gcHJvcGFnYXRlIHRvIHRoZSBwYXJlbnQuXG4gICAgICAgIC8vIFJlZGFjdGlvbjogYGFwcGx5T3V0cHV0TWFwcGluZ2Agd3JpdGVzIHRocm91Z2ggYG91dHB1dENvbnRleHRgIChhXG4gICAgICAgIC8vIFN0YWdlQ29udGV4dCwgbm90IGEgZmFjYWRlKS4gVGhlIGNvbnRleHQncyB3cml0ZSBmdW5uZWwgYXNrcyB0aGVcbiAgICAgICAgLy8gcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHNoYXJlZCB3aXRoIHRoZSBzdWJmbG93J3MgY29udGV4dHMsIHNvIGEga2V5XG4gICAgICAgIC8vIHRoZSBwb2xpY3kgbmFtZXMgT1IgYSBrZXkgbWFya2VkIHBlci1jYWxsIGluc2lkZSB0aGUgc3ViZmxvdyBpc1xuICAgICAgICAvLyBzY3J1YmJlZCBpbiB0aGUgUEFSRU5UJ3MgbG9nIGFuZCBtaXJyb3IgdG9vICg5LjE5LjA7IGJlZm9yZSwgdGhpc1xuICAgICAgICAvLyBtZXJnZS1iYWNrIHJldGFpbmVkIHBsYWludGV4dCkuXG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZU91dHB1dCA9IHN1YmZsb3dPdXRwdXQgPz8geyAuLi5zdWJmbG93VHJlZUNvbnRleHQuc2hhcmVkU3RhdGUgfTtcbiAgICAgICAgY29uc3QgbWFwcGVkT3V0cHV0ID0gYXBwbHlPdXRwdXRNYXBwaW5nKFxuICAgICAgICAgIGVmZmVjdGl2ZU91dHB1dCxcbiAgICAgICAgICBwYXJlbnRTY29wZSxcbiAgICAgICAgICBvdXRwdXRDb250ZXh0LFxuICAgICAgICAgIG1vdW50T3B0aW9ucyxcbiAgICAgICAgICByZWRhY3Rpb25SdWxlLFxuICAgICAgICApO1xuXG4gICAgICAgIG91dHB1dENvbnRleHQuY29tbWl0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIC8vIEEgbWVyZ2UtYmFjayB0aGF0IGZhaWxlZCB0byBjb21taXQgKGFuIHVuY2xvbmVhYmxlIHZhbHVlKSBsZWF2ZXMgaXRzXG4gICAgICAgIC8vIHdyaXRlcyBzdGFnZWQgb24gdGhlIG1vdW50J3MgZnJhbWU7IHRoZSBtb3VudCdzIGV4aXQgY29tbWl0IGJlbG93XG4gICAgICAgIC8vIHdvdWxkIHRocm93IHRoZW0gYWdhaW4sIG91dHNpZGUgdGhpcyBjYXRjaC4gVGhyb3VnaCA5LjMzLjAgdGhleVxuICAgICAgICAvLyB3ZXJlIHN0YWdlZCBvbiB0aGUgcGFyZW50J3MgZnJhbWUsIHdoaWNoIHdhcyBub3QgY29tbWl0dGVkIGFnYWluLFxuICAgICAgICAvLyBzbyB0aGUgcnVuIHdlbnQgb24g4oCUIGRyb3AgdGhlbSwgYXMgaXQgZGlkLiBBIGxpbmVhciBtb3VudCdzIGZyYW1lXG4gICAgICAgIC8vIGlzIGxlZnQgYXMgaXQgYWx3YXlzIHdhcy5cbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQuYnJhbmNoSWQgJiYgcGFyZW50Q29udGV4dC5wYXJlbnQpIHBhcmVudENvbnRleHQuZGlzY2FyZFN0YWdlZCgpO1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdvdXRwdXRNYXBwZXJFcnJvcicsIHRocm93blRleHQoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gb3V0cHV0TWFwcGVyIGZvciBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHtcbiAgICAgICAgICBlcnJvcjogbG9nZ2FibGVTdGFnZUVycm9yKHBhcmVudENvbnRleHQsIGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd1Jlc3VsdDogU3ViZmxvd1Jlc3VsdCA9IHtcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDogc3ViZmxvd1RyZWVDb250ZXh0LnNoYXJlZFN0YXRlLFxuICAgICAgICBzdGFnZUNvbnRleHRzOiBzdWJmbG93VHJlZUNvbnRleHQuZXhlY3V0aW9uVHJlZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBoaXN0b3J5OiBzdWJmbG93VHJlZUNvbnRleHQuY29tbWl0TG9nLFxuICAgICAgICAuLi4oc3ViZmxvd1RyZWVDb250ZXh0LmxvZ0FkZHJlc3MgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBsb2dBZGRyZXNzOiBzdWJmbG93VHJlZUNvbnRleHQubG9nQWRkcmVzcyB9KSxcbiAgICAgICAgLy8gVGhlIHN1YmZsb3cncyBvd24gZm9sZCBiYXNlIHRyYXZlbHMgd2l0aCBpdHMgb3duIGxvZyDigJQgc2FtZVxuICAgICAgICAvLyBjb250cmFjdCBhcyB0aGUgcnVuLWxldmVsIGBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlYC5cbiAgICAgICAgaW5pdGlhbFN0YXRlOiBzdWJmbG93VHJlZUNvbnRleHQuaW5pdGlhbFN0YXRlLFxuICAgICAgfSxcbiAgICAgIHBhcmVudFN0YWdlSWQ6IHBhcmVudENvbnRleHQuZ2V0U3RhZ2VJZCgpLFxuICAgIH07XG5cbiAgICBjb25zdCBzdWJmbG93RGVmID0gdGhpcy5kZXBzLnN1YmZsb3dzPy5bc3ViZmxvd0lkXTtcbiAgICBpZiAoc3ViZmxvd0RlZiAmJiAoc3ViZmxvd0RlZiBhcyBhbnkpLmJ1aWxkVGltZVN0cnVjdHVyZSkge1xuICAgICAgc3ViZmxvd1Jlc3VsdC5waXBlbGluZVN0cnVjdHVyZSA9IChzdWJmbG93RGVmIGFzIGFueSkuYnVpbGRUaW1lU3RydWN0dXJlO1xuICAgIH1cblxuICAgIC8vIFRoZSBzZXJ2ZWQgc3RhdGUgKDkuMjAuMCk6IHRoZSBuZXN0ZWQgbWlycm9yJ3MgZmluYWwgc3RhdGUsIHJlbWVtYmVyZWRcbiAgICAvLyBCRVNJREUgdGhlIHJlc3VsdCDigJQgYHRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIHN0YXlzIHRoZSBsaXZlIGhlYXAgZm9yXG4gICAgLy8gdGhlIHBsYWluIHNuYXBzaG90IGFuZCB0aGUgY2hlY2twb2ludDsgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYFxuICAgIC8vIHN1YnN0aXR1dGVzIHRoZSBtaXJyb3IgdGhyb3VnaCBgc2VydmVkU3ViZmxvd1Jlc3VsdHNgLiBBYnNlbnQgd2l0aG91dFxuICAgIC8vIGEgcG9saWN5LiBUaGUgZXhpdCBldmVudCBiZWxvdyBjYXJyaWVzIHRoZSBzYW1lIHNlcnZlZCB2aWV3OyB3aXRob3V0IGFcbiAgICAvLyBtaXJyb3IgaXQgY2FycmllcyB0aGUgaGVhcCByZXRhaW5lZCB1bmRlciB0aGUgcnVsZSAocGVyLWNhbGwgbWFya3NcbiAgICAvLyBhbG9uZSBrZWVwIG5vIG1pcnJvcikg4oCUIHRoZSBzYW1lIG9iamVjdCB3aGVuIG5vdGhpbmcgaXMgcmVkYWN0ZWQuXG4gICAgY29uc3QgcmF3U3RhdGUgPSBzdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHQ7XG4gICAgY29uc3QgbWlycm9yU3RhdGUgPSBuZXN0ZWRSdW50aW1lLnJlZGFjdGVkU3RvcmU/LmdldFN0YXRlKCk7XG4gICAgaWYgKG1pcnJvclN0YXRlICE9PSB1bmRlZmluZWQpIHJlbWVtYmVyUmVkYWN0ZWRTdWJmbG93U3RhdGUoc3ViZmxvd1Jlc3VsdCwgbWlycm9yU3RhdGUpO1xuICAgIC8vIEhhbmRlZCBvdXQgd2hvbGUsIHNvIGl0IGlzIGEgYm91bmRhcnkgcmVjb3JkOiBuZXN0ZWQgcG9saWN5IGtleXMgYXJlIHNjcnViYmVkIHRvb1xuICAgIC8vICh0aGUgbWlycm9yJ3Mgb3duIHBsYWNlaG9sZGVyLCBzbyBpdHMgdG9wIGtleXMga2VlcCB0aGVpciBieXRlcykuXG4gICAgY29uc3QgZXhpdFN0YXRlID0gIXJlZGFjdGlvblJ1bGVcbiAgICAgID8gbWlycm9yU3RhdGUgPz8gcmF3U3RhdGVcbiAgICAgIDogbWlycm9yU3RhdGUgIT09IHVuZGVmaW5lZFxuICAgICAgPyByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KG1pcnJvclN0YXRlLCBMT0dfUExBQ0VIT0xERVIpXG4gICAgICA6IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkocmF3U3RhdGUpO1xuXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KHN1YmZsb3dJZCwgc3ViZmxvd1Jlc3VsdCk7XG4gICAgLy8gQWRkaXRpdmUgcGVyLWV4ZWN1dGlvbiBrZXkgKGRlc2lnbjogZG9jcy9kZXNpZ24vc3ViZmxvdy1jb21taXQtdmlzaWJpbGl0eS5tZCkuIEEgTE9PUElOR1xuICAgIC8vIHN1YmZsb3cgcmUtZW50ZXJzIHdpdGggdGhlIFNBTUUgc3ViZmxvd0lkLCBzbyB0aGUgcGF0aCBrZXkgYWJvdmUgaXMgT1ZFUldSSVRURU4gZWFjaFxuICAgIC8vIGl0ZXJhdGlvbiAoYmFjay1jb21wYXQ6IGl0IGhvbGRzIHRoZSBMQVNUIGl0ZXJhdGlvbiDigJQgd2hhdCBnZXRTdWJ0cmVlU25hcHNob3QvbGlzdFN1YmZsb3dQYXRoc1xuICAgIC8vIGFuZCB0aGUgZXVpIGZhbGxiYWNrIHNlZSwgdW5jaGFuZ2VkKS4gQUxTTyBrZXkgYnkgdGhlIG1vdW50J3MgVU5JUVVFIHJ1bnRpbWVTdGFnZUlkIHNvIEVWRVJZXG4gICAgLy8gaXRlcmF0aW9uJ3MgcmVzdWx0IGlzIHJldGFpbmVkIGFuZCBhZGRyZXNzYWJsZSAoZXVpIHBlci1sb29wIGRyaWxsLWRvd24sIHBlci1zY29wZSBsb2NhbGl6YXRpb24pLlxuICAgIC8vIHJ1bnRpbWVTdGFnZUlkIGFsd2F5cyBjb250YWlucyAnIyc7IHN1YmZsb3dJZCBuZXZlciBkb2VzIOKAlCBzbyB0aGV5IG5ldmVyIGNvbGxpZGUsIGFuZFxuICAgIC8vIGxpc3RTdWJmbG93UGF0aHMgZmlsdGVycyAnIycga2V5cyB0byBrZWVwIGl0cyBwYXRoLW9ubHkgY29udHJhY3QuIFRoZSBwYXVzZSBjaGVja3BvaW50IGZpbHRlcnNcbiAgICAvLyB0aGVzZSBvdXQgKGJ1aWxkUGF1c2VDaGVja3BvaW50KSBzbyBpdCBzdGF5cyBsZWFuLlxuICAgIGlmIChtb3VudFJ1bnRpbWVTdGFnZUlkICYmIG1vdW50UnVudGltZVN0YWdlSWQgIT09IHN1YmZsb3dJZCkge1xuICAgICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KG1vdW50UnVudGltZVN0YWdlSWQsIHN1YmZsb3dSZXN1bHQpO1xuICAgIH1cblxuICAgIHBhcmVudENvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnc3ViZmxvdycsIGBFeGl0aW5nICR7c3ViZmxvd05hbWV9IHN1YmZsb3dgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogc3ViZmxvd0lkLFxuICAgIH0pO1xuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93RXhpdChzdWJmbG93TmFtZSwgc3ViZmxvd0lkLCBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LCBleGl0U3RhdGUpO1xuXG4gICAgLy8gVGhlIG1vdW50J3MgRVhJVCDigJQgYSBjb250aW51YXRpb24gb2YgdGhlIG1vdW50J3MgZXhlY3V0aW9uLCBuYW1lZCBhcyBvbmVcbiAgICAvLyBvbiB0aGUgcmVjb3JkICg5LjM5LjApIHNvIG5vIHJlYWRlciBpbmZlcnMgaXQgZnJvbSB0aGUgbG9nJ3Mgc2hhcGUuXG4gICAgcGFyZW50Q29udGV4dC5jb21taXQoJ2V4aXQnKTtcblxuICAgIGlmIChzdWJmbG93RXJyb3IpIHtcbiAgICAgIHRocm93IHN1YmZsb3dFcnJvci5lcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgfVxufVxuIl19
419
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVVyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUc1Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQThCO0lBQ3ZELElBQUksR0FBd0MsQ0FBQztJQUM3QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUztRQUNuQyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQztBQUN0QixDQUFDO0FBRUQseUdBQXlHO0FBQ3pHLFNBQVMsWUFBWSxDQUFDLEtBQWM7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QUM3RSxXQUFXLEVBQUUsU0FBUztTQUN2QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXRHLDJFQUEyRTtRQUMzRSxzRUFBc0U7UUFDdEUsaUJBQWlCLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXpDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsYUFBYSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEcsTUFBTSxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQzNCLENBQUM7UUFFRCxhQUFhLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXZELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3ViZmxvd0V4ZWN1dG9yIOKAlCBJc29sYXRpb24gYm91bmRhcnkgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICpcbiAqIFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIENyZWF0ZSBpc29sYXRlZCBFeGVjdXRpb25SdW50aW1lIGZvciBlYWNoIHN1YmZsb3dcbiAqIC0gQXBwbHkgaW5wdXQvb3V0cHV0IG1hcHBpbmcgdmlhIFN1YmZsb3dJbnB1dE1hcHBlclxuICogLSBEZWxlZ2F0ZSB0cmF2ZXJzYWwgdG8gYSBmYWN0b3J5LWNyZWF0ZWQgRmxvd2NoYXJ0VHJhdmVyc2VyXG4gKiAtIFRyYWNrIHN1YmZsb3cgcmVzdWx0cyBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAqXG4gKiBFYWNoIHN1YmZsb3cgZ2V0cyBpdHMgb3duIEdsb2JhbFN0b3JlIGZvciBpc29sYXRpb24uXG4gKiBUcmF2ZXJzYWwgdXNlcyB0aGUgU0FNRSA3LXBoYXNlIGFsZ29yaXRobSBhcyB0aGUgdG9wLWxldmVsIHRyYXZlcnNlclxuICogKHZpYSBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSksIHNvIGRlY2lkZXJzLCBzZWxlY3RvcnMsIGxvb3BzLCBsYXp5IHN1YmZsb3dzLFxuICogYW5kIGFib3J0IHNpZ25hbHMgYWxsIHdvcmsgaW5zaWRlIHN1YmZsb3dzIGF1dG9tYXRpY2FsbHkuXG4gKi9cblxuaW1wb3J0IHsgTE9HX1BMQUNFSE9MREVSIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHsgdGhyb3duVGV4dCB9IGZyb20gJy4uLy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuLi8uLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgU3ViZmxvd1RyYXZlcnNlckhhbmRsZSxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgY29tbWl0U3RhZ2VXcml0ZXMgfSBmcm9tICcuL2NvbW1pdFN0YWdlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzdW1lRW50cnkgfSBmcm9tICcuL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IHJlbWVtYmVyUmVkYWN0ZWRTdWJmbG93U3RhdGUgfSBmcm9tICcuL3NlcnZlZFN1YmZsb3dSZXN1bHRzLmpzJztcbmltcG9ydCB7IGxvZ2dhYmxlU3RhZ2VFcnJvciB9IGZyb20gJy4vc3RhZ2VFcnJvci5qcyc7XG5pbXBvcnQgeyBhcHBseU91dHB1dE1hcHBpbmcsIGdldEluaXRpYWxTY29wZVZhbHVlcywgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZSB9IGZyb20gJy4vU3ViZmxvd0lucHV0TWFwcGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQnJlYWtGbGFnIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogVGhlIG1hcHBlZCBpbnB1dCwgZGV0YWNoZWQgZnJvbSB0aGUgcGFyZW50J3Mgc3RhdGUgT05DRSBwZXIgbW91bnQgKEQxLFxuICogOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKS5cbiAqXG4gKiBUaGUgaW5wdXRNYXBwZXIgcmVhZHMgdGhlIHBhcmVudCdzIExJVkUgc3RhdGUgKGBnZXRTY29wZSgpYCksIHNvIGEgdmFsdWUgaXRcbiAqIHBhc3NlcyB0aHJvdWdoIChgKHApID0+ICh7IGNmZzogcC5jZmcgfSlgKSBpcyB0aGUgcGFyZW50J3MgY29tbWl0dGVkXG4gKiBvYmplY3Qg4oCUIGFuZCB0aGUgc3ViZmxvdydzIGFyZ3MgYXJlIGRlZXAtRlJPWkVOIGluIHBsYWNlXG4gKiAoYHJlYWRvbmx5SW5wdXQgwrcgY3JlYXRlRnJvemVuQXJnc2ApLiBUaGUgdHlwZWQgc2NvcGUgZG9lcyBub3QgcHJveHkgYVxuICogZnJvemVuIHZhbHVlIChgYWxsb3dsaXN0IMK3IHNob3VsZFdyYXBXaXRoUHJveHlgKSwgc28gYSBsYXRlclxuICogYHNjb3BlLmNmZy54ID0gMWAgaW4gdGhlIHBhcmVudCBtZXQgdGhlIHJhdyBmcm96ZW4gb2JqZWN0OiBhIFR5cGVFcnJvciBpblxuICogc3RyaWN0IGNvZGUuIEJlZm9yZSA5LjI5LjAgdGhlIHBhcmVudCdzIG5leHQgd2hvbGUtc3RhdGUgY2xvbmUgcmVwbGFjZWQgdGhlXG4gKiBmcm96ZW4gb2JqZWN0IChhIG1vdW50IHRoYXQgY29tbWl0dGVkIG5vdGhpbmcgbGVmdCBpdCBpbiBwbGFjZSDigJQgdGhlIGJ1Z1xuICogZXhpc3RlZCwgaXQgd2FzIG9ubHkgc2hvcnQtbGl2ZWQpOyB1bmRlciBjb3B5LW9uLXdyaXRlIG5vdGhpbmcgcmUtY2xvbmVzLFxuICogc28gdGhlIGZyZWV6ZSB3b3VsZCBsYXN0IHVudGlsIHRoZSBrZXkgaXMgcmV3cml0dGVuLiBBIG1vdW50IG11c3QgbmV2ZXJcbiAqIGVkaXQg4oCUIG9yIGZyZWV6ZSDigJQgdGhlIHBhcmVudCdzIGNvbW1pdHRlZCBvYmplY3RzOiBldmVyeSBwbGFpbiBvYmplY3QsXG4gKiBhcnJheSwgYERhdGVgLCBgTWFwYCBhbmQgYFNldGAgdGhlIG1hcHBlciByZXR1cm5zIGlzIGNsb25lZCBoZXJlLCBiZWZvcmUgaXRcbiAqIGJlY29tZXMgdGhlIGFyZ3MuIEEgY2xhc3MgaW5zdGFuY2UgcGFzc2VzIGJ5IHJlZmVyZW5jZSwgYXMgYmVmb3JlIChpdFxuICogY2Fubm90IGNvbWUgZnJvbSBjb21taXR0ZWQgc3RhdGUsIGFuZCBhIGNsb25lIHdvdWxkIGRyb3AgaXRzIHByb3RvdHlwZSkuXG4gKiBUaGUgc2VlZCBpcyBjbG9uZWQgYWdhaW4gYXQgaXRzIGNvbW1pdCwgc28gdGhlIHN1YmZsb3cncyBzdGF0ZSBpc1xuICogdW5jaGFuZ2VkLlxuICovXG5mdW5jdGlvbiBkZXRhY2hNYXBwZWRJbnB1dChpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICBpZiAoIWlzRGV0YWNoYWJsZSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgIChvdXQgPz89IHsgLi4uaW5wdXQgfSlba2V5XSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIG91dCA/PyBpbnB1dDtcbn1cblxuLyoqIEEgdmFsdWUgYHN0cnVjdHVyZWRDbG9uZWAgcmVwcm9kdWNlcyB3aXRoIGl0cyBvd24gdHlwZTogcGxhaW4gb2JqZWN0LCBhcnJheSwgYERhdGVgLCBgTWFwYCwgYFNldGAuICovXG5mdW5jdGlvbiBpc0RldGFjaGFibGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgU3ViZmxvd0V4ZWN1dG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChgZGVwcy5yZXN1bWVgKS4gVW5kZWZpbmVkIG9uIGEgbm9ybWFsXG4gICAqIHJ1bi4gQXNrZWQgb25jZSBwZXIgc3ViZmxvdyBlbnRyeSDigJQgc2VlIHtAbGluayBSZXN1bWVFbnRyeX0uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3VtZTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSB0cmF2ZXJzZXJGYWN0b3J5OiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+LFxuICApIHtcbiAgICB0aGlzLnJlc3VtZSA9IGRlcHMucmVzdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWJmbG93IHdpdGggaXNvbGF0ZWQgY29udGV4dC5cbiAgICpcbiAgICogMS4gQ3JlYXRlcyBhIGZyZXNoIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIHRoZSBzdWJmbG93XG4gICAqIDIuIEFwcGxpZXMgaW5wdXQgbWFwcGluZyB0byBzZWVkIHRoZSBzdWJmbG93J3MgR2xvYmFsU3RvcmVcbiAgICogMy4gRGVsZWdhdGVzIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAgICogNC4gQXBwbGllcyBvdXRwdXQgbWFwcGluZyB0byB3cml0ZSByZXN1bHRzIGJhY2sgdG8gcGFyZW50IHNjb3BlXG4gICAqIDUuIFN0b3JlcyBleGVjdXRpb24gZGF0YSBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJmbG93KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHBhcmVudENvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXA6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+LFxuICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHN1YmZsb3dJZCA9IG5vZGUuc3ViZmxvd0lkITtcbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG5vZGUuc3ViZmxvd05hbWUgPz8gbm9kZS5uYW1lO1xuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEVudGVyaW5nICR7c3ViZmxvd05hbWV9IHN1YmZsb3dgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogc3ViZmxvd0lkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFJlc3VtZSByZS1lbnRyeSAob25lLXNob3QpIOKUgOKUgOKUgFxuICAgIC8vXG4gICAgLy8gV2hlbiB0aGlzIGVudHJ5IGlzIHRoZSByZXN1bWUncyB3YXkgYmFjayBpbnRvIGEgcGF1c2VkIHN1YmZsb3csIHRoZVxuICAgIC8vIGhvcCBuYW1lcyB3aGVyZSB0aGUgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgKHRoZSBuZXh0IG1vdW50IG9uIHRoZVxuICAgIC8vIHBhdXNlIHBhdGgsIG9yIHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiksIGNhcnJpZXMgdGhlIHN1YmZsb3cnc1xuICAgIC8vIGNhcHR1cmVkIHByZS1wYXVzZSBzdGF0ZSwgYW5kIGFueSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGluIGl0LiBUYWtlblxuICAgIC8vIE9OQ0U6IGFueSBsYXRlciBlbnRyeSBpbnRvIHRoaXMgc3ViZmxvdyDigJQgYSBsb29wIHBhc3NpbmcgaXRzIG1vdW50XG4gICAgLy8gYWdhaW4g4oCUIGdldHMgYHVuZGVmaW5lZGAgYW5kIHJ1bnMgdGhlIHJlYWwgc3ViZmxvdyBmcm9tIGl0cyByZWFsIHJvb3QsXG4gICAgLy8gaW5wdXRNYXBwZXIgYW5kIGFsbC5cbiAgICBjb25zdCByZXN1bWVIb3AgPSB0aGlzLnJlc3VtZT8uZW50ZXJTdWJmbG93KHN1YmZsb3dJZCk7XG5cbiAgICAvLyDilIDilIDilIAgSW5wdXQgTWFwcGluZyDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFRoZSBtYXBwZXIgcnVucyBvbiBFVkVSWSBlbnRyeTogaXRzIHJlc3VsdCBpcyB0aGUgc3RhZ2VzJyByZWFkLW9ubHlcbiAgICAvLyBhcmdzIChgJGdldEFyZ3MoKWApLCBhbmQgYSByZS1lbnRlcmVkIHN1YmZsb3cncyBzdGFnZXMgcmVhZCB0aGUgc2FtZVxuICAgIC8vIGFyZ3MgdGhleSByZWFkIGJlZm9yZSB0aGUgcGF1c2UgKHRoZSBwYXJlbnQncyB2aWV3IGlzIHRoZSBzYW1lIG9uZSDigJRcbiAgICAvLyBpdCB3YXMgYmxvY2tlZCBpbiB0aGlzIG1vdW50KS4gV2hhdCBhIHJlc3VtZSBjaGFuZ2VzIGlzIG9ubHkgdGhlIFNFRUQ6XG4gICAgLy8gd2hlbiB0aGUgaG9wIGNhcnJpZXMgYSBjYXB0dXJlLCB0aGUgbmVzdGVkIG1lbW9yeSBpcyBzZWVkZWQgZnJvbSB0aGVcbiAgICAvLyBjYXB0dXJlLCBub3QgZnJvbSB0aGUgbWFwcGVyIOKAlCB0aGUgY2FwdHVyZSBpcyB0aGUgcG9zdC1pbnB1dCBwcmUtcGF1c2VcbiAgICAvLyBtZW1vcnksIGFuZCBzZWVkaW5nIHRoZSBtYXBwZXIncyB2YWx1ZXMgd291bGQgY2xvYmJlciBwb3N0LWlucHV0XG4gICAgLy8gd3JpdGVzIChoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuKSB3aXRoIHRoZSBzdGFydC1vZi1zdWJmbG93IHZpZXcuXG4gICAgY29uc3QgbW91bnRPcHRpb25zID0gbm9kZS5zdWJmbG93TW91bnRPcHRpb25zO1xuICAgIGxldCBtYXBwZWRJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCByZXN1bWVDYXB0dXJlID0gcmVzdW1lSG9wPy5zZWVkO1xuICAgIGNvbnN0IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPSByZXN1bWVDYXB0dXJlICE9PSB1bmRlZmluZWQ7XG5cbiAgICAvLyBUaGUgcnVuJ3MgcG9saWN5IChGNSkg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGUgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3JcbiAgICAvLyBmbGFnIOKAlCByZWFkIG9mZiB0aGUgcGFyZW50LW1vdW50IGZyYW1lLCB3aGljaCBob2xkcyBpdCBieSByZWZlcmVuY2UuXG4gICAgLy8gVGhlIG5lc3RlZCBydW50aW1lIGlzIGNvbnN0cnVjdGVkIFdJVEggaXQsIHNvIHRoZSBzZWVkIGNvbW1pdCBiZWxvd1xuICAgIC8vIChgaGlzdG9yeVswXWApIGFuZCBldmVyeSBsYXRlciBjb21taXQgb2YgdGhlIHN1YmZsb3cgcnVuIHVuZGVyIHRoZSBzYW1lXG4gICAgLy8gb2JqZWN0LCBhbmQgdGhlIG5lc3RlZCBydW50aW1lIGtlZXBzIGEgbWlycm9yIG9mIGl0cyBvd24gZXhhY3RseSB3aGVuXG4gICAgLy8gdGhlIHJ1biBkb2VzIChpdHMgU0VSVkVEIHN0YXRlIGlzIHRoZW4gdGhlIGZvbGQgb2YgaXRzIG93biBzY3J1YmJlZFxuICAgIC8vIGxvZywgbmV2ZXIgYSBzZWNvbmQgc2NydWIpLlxuICAgIGNvbnN0IHBvbGljeTogUnVuUG9saWN5ID0gcGFyZW50Q29udGV4dC5nZXRQb2xpY3koKTtcbiAgICBjb25zdCByZWRhY3Rpb25SdWxlID0gcG9saWN5LnJlZGFjdGlvbjtcblxuICAgIGlmIChtb3VudE9wdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gcGFyZW50Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBUaGUgcnVsZSByaWRlcyBhbG9uZzogYSBrZXkgdGhlIG1hcHBlciBjb3BpZXMgYSBzZWxlY3RlZCB2YWx1ZSBpbnRvXG4gICAgICAgIC8vIGluaGVyaXRzIGl0cyByZWRhY3Rpb24gYmVmb3JlIHRoZSBzZWVkIGlzIHdyaXR0ZW4gKHRoZSB0YWludCBydWxlKS5cbiAgICAgICAgbWFwcGVkSW5wdXQgPSBkZXRhY2hNYXBwZWRJbnB1dChnZXRJbml0aWFsU2NvcGVWYWx1ZXMocGFyZW50U2NvcGUsIG1vdW50T3B0aW9ucywgcmVkYWN0aW9uUnVsZSkpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFwcGVkSW5wdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBtYXBwZWRJbnB1dCBpcyBjYXB0dXJlZCBpbiBTdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0IGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdpbnB1dE1hcHBlckVycm9yJywgdGhyb3duVGV4dChlcnJvcikpO1xuICAgICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBpbnB1dE1hcHBlciBmb3Igc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7XG4gICAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihwYXJlbnRDb250ZXh0LCBlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOYXJyYXRpdmUgcmVjZWl2ZXMgdGhlIFJFVEFJTkVEIGZvcm0gb2YgdGhlIG1hcHBlZCBpbnB1dCDigJQgYW5cbiAgICAvLyBpbnB1dE1hcHBlciBtYXkgaW5qZWN0IHZhbHVlcyBmcm9tIGFueXdoZXJlLCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgIC8vIHVuZGVyIHRoZSBwb2xpY3kgYmVmb3JlIGFueSByZWNvcmRlciBzZWVzIGl0LiBTYW1lIG9iamVjdCB3aGVuIG5vdGhpbmdcbiAgICAvLyBpbiBpdCBpcyByZWRhY3RlZCAodGhlIG5vLXBvbGljeSBwYXRoIGFsbG9jYXRlcyBub3RoaW5nKS5cbiAgICBjb25zdCBuYXJyYXRpdmVJbnB1dCA9IHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KG1hcHBlZElucHV0KSA6IG1hcHBlZElucHV0O1xuICAgIC8vIGBGbG93U3ViZmxvd0V2ZW50LmRlc2NyaXB0aW9uYCBpcyBzZW1hbnRpY2FsbHkgXCJ3aGF0IHRoaXMgc3ViZmxvdyBkb2VzXCIg4oCUIHNvdXJjZWQgZnJvbVxuICAgIC8vIHRoZSBzdWJmbG93J3Mgb3duIHJvb3Qgc3RhZ2UsIG5vdCB0aGUgcGFyZW50IG1vdW50IHBvaW50LiBUaGUgbW91bnQgbm9kZSBuZXZlciBjYXJyaWVzXG4gICAgLy8gYSBkZXNjcmlwdGlvbiAoYnVpbGRlcnMgZG9uJ3QgY29weSBpdCksIHNvIHJlYWRpbmcgYG5vZGUuZGVzY3JpcHRpb25gIGhlcmUgcmV0dXJuc1xuICAgIC8vIGB1bmRlZmluZWRgIGFuZCB0YXhvbm9teSBtYXJrZXJzIHNldCBvbiB0aGUgc3ViZmxvdyByb290IChlLmcuIGFnZW50Zm9vdHByaW50J3NcbiAgICAvLyBgJ0FnZW50OiBSZUFjdCBsb29wJ2AgLyBgJ0xMTUNhbGw6IG9uZS1zaG90J2ApIG5ldmVyIHJlYWNoIGRvd25zdHJlYW0gY29uc3VtZXJzLlxuICAgIGNvbnN0IHJvb3REZXNjcmlwdGlvbiA9IHRoaXMuZGVwcy5zdWJmbG93cz8uW3N1YmZsb3dJZF0/LnJvb3Q/LmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93RW50cnkoXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgIG5hcnJhdGl2ZUlucHV0LFxuICAgICk7XG4gICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgZm9yIHRoZSBtb3VudCBub2RlIEFGVEVSXG4gICAgLy8gb25TdWJmbG93RW50cnkgc28gY29uc3VtZXJzIHRyYWNraW5nIFwiZGlkIHRoaXMgc3RhZ2UgcnVuXCIgd29ya1xuICAgIC8vIHVuaWZvcm1seSBhY3Jvc3MgbGluZWFyIC8gZGVjaWRlciAvIGZvcmsgLyBzZWxlY3RvciAvIHN1YmZsb3ctbW91bnQuXG4gICAgLy8gRmlyZXMgb24gRU5UUlkgKG5vdCBleGl0KSDigJQgZW50cnkgPSBcInRoaXMgbW91bnQgcmFuXCI7IHRoZVxuICAgIC8vIHN1YmZsb3cncyBjaGlsZHJlbiBleGVjdXRlIGFmdGVyIGFzIHNlcGFyYXRlIHN0YWdlcy5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChcbiAgICAgIG5vZGUubmFtZSxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICdzdWJmbG93LW1vdW50JyxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGlzb2xhdGVkIHJ1bnRpbWUgdmlhIGR5bmFtaWMgY29uc3RydWN0aW9uIChhdm9pZHMgY2lyY3VsYXIgaW1wb3J0KS5cbiAgICAvLyBJdHMgcm9vdCBjb250ZXh0IGlzIHRoZSBmaXJzdCBzdGFnZSB0aGUgc3ViZmxvdyB0cmF2ZXJzYWwgcnVucyDigJQgdGhlXG4gICAgLy8gcmVzdW1lIGhvcCdzIGVudHJ5IG9uIGEgcmUtZW50cnksIHRoZSBzdWJmbG93J3Mgcm9vdCBvdGhlcndpc2UuXG4gICAgY29uc3QgRXhlY3V0aW9uUnVudGltZUNsYXNzID0gdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUuY29uc3RydWN0b3IgYXMgbmV3IChcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBkZWZhdWx0VmFsdWVzOiB1bmRlZmluZWQsXG4gICAgICBpbml0aWFsU3RhdGU6IHVuZGVmaW5lZCxcbiAgICAgIHBvbGljeTogUnVuUG9saWN5LFxuICAgICAgcmVjb3JkPzogdW5rbm93bixcbiAgICApID0+IElFeGVjdXRpb25SdW50aW1lO1xuICAgIGNvbnN0IGZpcnN0Tm9kZSA9IHJlc3VtZUhvcD8uZW50cnkgPz8gbm9kZTtcbiAgICAvLyBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgKDEwLjEsIFA2KTogd2hlbiB0aGUgcnVuIHdyaXRlcyB0byBhIHNpbmssIHRoZSBtb3VudCdzIG93biBsb2cgZG9lcyB0b28sIGF0IHRoZVxuICAgIC8vIHBhcmVudCBsb2cncyBhZGRyZXNzIHBsdXMgdGhpcyBtb3VudCdzIHJ1bnRpbWVTdGFnZUlkIOKAlCBvcGVuZWQgaGVyZSwgaXRzIHNlZWQgYW5kIGV2ZXJ5IGNvbW1pdCBhcyB0aGV5IGxhbmQsXG4gICAgLy8gY2xvc2VkIGF0IHRoZSBtb3VudCdzIGV4aXQgKG9yIGl0cyBwYXVzZSwgb3IgaXRzIGZhaWx1cmUpLiBXaXRob3V0IGEgc2luazogdW5kZWZpbmVkLCB0aGUgcGxhaW4gbG9nLlxuICAgIGNvbnN0IG1vdW50UnVudGltZVN0YWdlSWQgPSBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCByZWNvcmQgPVxuICAgICAgbW91bnRSdW50aW1lU3RhZ2VJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUucmVjb3JkRm9yPy4obW91bnRSdW50aW1lU3RhZ2VJZCwgeyBzdWJmbG93SWQgfSk7XG4gICAgY29uc3QgbmVzdGVkUnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lQ2xhc3MoZmlyc3ROb2RlLm5hbWUsIGZpcnN0Tm9kZS5pZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHBvbGljeSwgcmVjb3JkKTtcblxuICAgIC8vIFNlZWQgR2xvYmFsU3RvcmUgd2l0aCB0aGUgcmlnaHQgc2hhcGUgZm9yIHRoZSBwYXRoOlxuICAgIC8vICAg4oCiIFJlc3VtZSBpbnRvIFRISVMgc3ViZmxvdyDihpIgc2VlZCBmcm9tIHRoZSBjYXB0dXJlZCBwcmUtcGF1c2VcbiAgICAvLyAgICAgc2NvcGUgc28gcmVzdW1lIGhhbmRsZXJzIHNlZSBoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuXG4gICAgLy8gICAgIChgbWFwcGVkSW5wdXRgIHN0aWxsIHJlYWNoZXMgdGhlIHN0YWdlcywgYXMgdGhlaXIgcmVhZC1vbmx5IGFyZ3MuKVxuICAgIC8vICAg4oCiIE5vcm1hbCBlbnRyeSDihpIgc2VlZCBmcm9tIHRoZSBpbnB1dE1hcHBlcidzIG1hcHBlZElucHV0LlxuICAgIGNvbnN0IHNlZWRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gaXNSZXN1bWVGb3JUaGlzU3ViZmxvdyA/IHJlc3VtZUNhcHR1cmUhIDogbWFwcGVkSW5wdXQ7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNlZWRWYWx1ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBzZWVkIGlzIGNvbW1pdHRlZCBhcyB0aGUgc3ViZmxvdydzIGBoaXN0b3J5WzBdYCBieSBpdHMgcm9vdFxuICAgICAgLy8gY29udGV4dCwgbm90IGJ5IGEgZmFjYWRlIOKAlCB0aGF0IGZyYW1lIGFscmVhZHkgaG9sZHMgdGhlIHJ1bidzIHBvbGljeVxuICAgICAgLy8gKHRoZSBydW50aW1lIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGl0KSwgc28gdGhlIHNlZWQgcmV0YWlucyB1bmRlciB0aGVcbiAgICAgIC8vIHJ1bGUsIGxhbmRzIGluIHRoZSBtaXJyb3IgYXMgdGhlIHBsYWNlaG9sZGVyLCBhbmQgY29tbWl0cyB1bmRlciB0aGVcbiAgICAgIC8vIHJ1bidzIGRpYWxzIGxpa2UgZXZlcnkgb3RoZXIgd3JpdGUgKEMtRjU6IHVuZGVyIGB3cml0ZVByb3ZlbmFuY2U6XG4gICAgICAvLyAncmVhZHMtcHJlZml4J2AgaXRzIHJvd3MgY2FycnkgYHJlYWRLZXlzOiBbXWApLlxuICAgICAgLy8gVGhlIHNlZWQgaXMgdGhlIG1vdW50J3MgYWN0IHRvbzogaXRzIGJ1bmRsZSDigJQgYGhpc3RvcnlbMF1gIG9mIHRoZVxuICAgICAgLy8gc3ViZmxvdydzIG93biBsb2cg4oCUIGNhcnJpZXMgdGhlIG1vdW50J3Mgc3RhZ2UsIHN0YWdlSWQgYW5kXG4gICAgICAvLyBydW50aW1lU3RhZ2VJZCAoUjEzOyB0aHJvdWdoIDkuMzMuMCBpdCBjYXJyaWVkIHJ1bnRpbWVTdGFnZUlkICcnIGFuZFxuICAgICAgLy8gdGhlIGZpcnN0IHN0YWdlJ3MgbmFtZXMsIHdoaWNoIG9uIGEgcmVzdW1lIHdhcyB0aGUgcmUtZW50cnkgcG9pbnQpLlxuICAgICAgdHJ5IHtcbiAgICAgICAgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZShuZXN0ZWRSdW50aW1lLCBzZWVkVmFsdWVzLCBwYXJlbnRDb250ZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFRoZSBtb3VudCdzIG93biBsb2cgb3BlbmVkIGFib3ZlOiBhIHNlZWQgdGhhdCBmYWlscyBjbG9zZXMgaXQsIG5ldmVyIGxlYXZlcyBpdCBsb29raW5nIGNyYXNoZWQuXG4gICAgICAgIG5lc3RlZFJ1bnRpbWUuY2xvc2VSZWNvcmQ/LignZmFpbGVkJyk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgLy8gUmVmcmVzaCByb290U3RhZ2VDb250ZXh0IHNvIFdyaXRlQnVmZmVyIHNlZXMgY29tbWl0dGVkIGRhdGEuIE5hbWVkXG4gICAgICAvLyBhZnRlciB0aGUgZmlyc3Qgbm9kZSBhZ2FpbiDigJQgdGhlIHNlZWQgY29udGV4dCBub3cgY2FycmllcyB0aGUgbW91bnQnc1xuICAgICAgLy8gbmFtZXMgKFIxMyksIHdoaWNoIGJlbG9uZyB0byB0aGUgc2VlZCBidW5kbGUgb25seS4gYG5ld1Jvb3RgIGdpdmVzIGl0XG4gICAgICAvLyB0aGUgc2FtZSBwb2xpY3kgYW5kIG1pcnJvci5cbiAgICAgIG5lc3RlZFJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dCA9IG5lc3RlZFJ1bnRpbWUubmV3Um9vdChmaXJzdE5vZGUubmFtZSwgZmlyc3ROb2RlLmlkKTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIHN1YmZsb3cgcm9vdCBub2RlIOKAlCBzdHJpcCBpc1N1YmZsb3dSb290IHRvIHByZXZlbnQgcmUtZGVsZWdhdGlvbi5cbiAgICAvL1xuICAgIC8vIFBSRVNFUlZFIGBuZXh0YC4gRWFybGllciByZXZpc2lvbnMgc3RyaXBwZWQgYG5leHRgIHdoZW5ldmVyIHRoZVxuICAgIC8vIHN1YmZsb3cgcm9vdCBoYWQgY2hpbGRyZW4sIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYG5leHRgIHdhc1xuICAgIC8vIGFsd2F5cyB0aGUgT1VURVIgbW91bnQncyBjb250aW51YXRpb24gbGVha2luZyBpbnRvIHRoZSBpbm5lclxuICAgIC8vIHRyZWUuIFRoYXQgYXNzdW1wdGlvbiB3YXMgd3Jvbmc6IHRoZSByZXNvbHZlZCBzdWJmbG93IHJvb3Qnc1xuICAgIC8vIGBuZXh0YCBpcyB0aGUgSU5ORVIgam9pbiBzdGFnZSAoZS5nLiwgUGFyYWxsZWwncyBNZXJnZSBhZnRlciBhXG4gICAgLy8gZmFuLW91dCwgVG9UJ3MgUHJ1bmVyKS4gU3RyaXBwaW5nIGl0IGJyb2tlIGNvbXBvc2l0ZSBzdWJmbG93cyDigJRcbiAgICAvLyB0aGUgam9pbiBzdGFnZSBuZXZlciByYW4sIHNvIHRoZSBzdWJmbG93IHJldHVybmVkIHBhcnRpYWwgc3RhdGUuXG4gICAgLy9cbiAgICAvLyBUaGUgb3V0ZXIgbW91bnQncyBwb3N0LXN1YmZsb3cgY29udGludWF0aW9uIGlzIGhhbmRsZWQgc2VwYXJhdGVseVxuICAgIC8vIGJ5IHRoZSBwYXJlbnQgdHJhdmVyc2VyIHZpYSBgcGFyZW50Q29udGV4dC5uZXh0Tm9kZWAgYW5kIGlzIG5ldmVyXG4gICAgLy8gY29uZmxhdGVkIHdpdGggdGhlIGlubmVyIHN1YmZsb3cncyBgbmV4dGAgY2hhaW4uXG4gICAgY29uc3Qgc3ViZmxvd05vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgLi4ubm9kZSxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyDilIDilIDilIAgRXhlY3V0ZSB2aWEgZmFjdG9yeSB0cmF2ZXJzZXIg4pSA4pSA4pSAXG4gICAgLy8gVGhlIGZhY3RvcnkgY3JlYXRlcyBhIGZ1bGwgRmxvd2NoYXJ0VHJhdmVyc2VyIHdpdGggdGhlIHNhbWUgNy1waGFzZSBhbGdvcml0aG0sXG4gICAgLy8gc2hhcmluZyB0aGUgcGFyZW50J3Mgc3RhZ2VNYXAsIHN1YmZsb3dzIGRpY3QsIGFuZCBuYXJyYXRpdmUgZ2VuZXJhdG9yLlxuICAgIGxldCBzdWJmbG93T3V0cHV0OiBhbnk7XG4gICAgLy8gQm94ZWQ6IGEgc3RhZ2UgbWF5IHRocm93IEFOWSB2YWx1ZSwgYG51bGxgIGFuZCBgdW5kZWZpbmVkYCBpbmNsdWRlZCDigJRcbiAgICAvLyBhIGZhbHN5IHRocm93biB2YWx1ZSBtdXN0IHN0aWxsIGZhaWwgdGhlIG1vdW50LlxuICAgIGxldCBzdWJmbG93RXJyb3I6IHsgZXJyb3I6IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdHJhdmVyc2VySGFuZGxlOiBTdWJmbG93VHJhdmVyc2VySGFuZGxlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgdHJhdmVyc2VySGFuZGxlID0gdGhpcy50cmF2ZXJzZXJGYWN0b3J5KHtcbiAgICAgICAgLy8gVGhlIFJFQUwgc3ViZmxvdyBncmFwaCDigJQgZXZlcnkgaWQgaW5zaWRlIHRoZSBzdWJmbG93IChsb29wIHRhcmdldHMsXG4gICAgICAgIC8vIGEgcmUtdmlzaXQgb2YgdGhlIHBhdXNlZCBzdGFnZSkgcmVzb2x2ZXMgYWdhaW5zdCBpdCwgcmUtZW50cnkgb3Igbm90LlxuICAgICAgICByb290OiBzdWJmbG93Tm9kZSxcbiAgICAgICAgLy8gV2hlcmUgdGhpcyB0cmF2ZXJzYWwgc3RhcnRzIG9uIGEgcmVzdW1lIHJlLWVudHJ5OyB2aXNpdGVkIG9uY2Ug4oCUXG4gICAgICAgIC8vIGFuZCB0aGUgc2libGluZyBwYXVzZXMgaXQgcmFpc2VzIG9uY2UgdGhhdCBlbnRyeSdzIGNoYWluIGVuZHMuXG4gICAgICAgIC4uLihyZXN1bWVIb3A/LmVudHJ5ICYmIHsgZW50cnk6IHJlc3VtZUhvcC5lbnRyeSB9KSxcbiAgICAgICAgLi4uKHJlc3VtZUhvcD8ucGVuZGluZ1BhdXNlcyAmJiB7IHBlbmRpbmdQYXVzZXM6IHJlc3VtZUhvcC5wZW5kaW5nUGF1c2VzIH0pLFxuICAgICAgICBleGVjdXRpb25SdW50aW1lOiBuZXN0ZWRSdW50aW1lLFxuICAgICAgICByZWFkT25seUNvbnRleHQ6IG1hcHBlZElucHV0LFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIC8vIFJGQy0wMDMgRDE6IHRoZSBtb3VudCBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIOKAlCB0aGUgc3ViZmxvdyByb290XG4gICAgICAgIC8vIHN0YWdlJ3MgYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBzbyBhbmNlc3RvciBjaGFpbnMgY3Jvc3MgdGhlIG1vdW50LlxuICAgICAgICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkOiBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIH0pO1xuXG4gICAgICBzdWJmbG93T3V0cHV0ID0gYXdhaXQgdHJhdmVyc2VySGFuZGxlLmV4ZWN1dGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBub3QgYW4gZXJyb3Ig4oCUIHByZXBlbmQgc3ViZmxvdyBJRCBhbmQgcmUtdGhyb3dcbiAgICAgIC8vIGltbWVkaWF0ZWx5LiBObyBlcnJvciBsb2dnaW5nLCBubyBzdWJmbG93UmVzdWx0IHJlY29yZGluZyDigJRcbiAgICAgIC8vIHRoZSBwYXVzZSBpcyBjb250cm9sIGZsb3cuXG4gICAgICAvL1xuICAgICAgLy8gQkVGT1JFIHJlLXRocm93LCBjYXB0dXJlIHRoZSBuZXN0ZWQgcnVudGltZSdzIHN0YXRlIG9udG8gdGhlXG4gICAgICAvLyBzaWduYWwuIFRoaXMgaXMgdGhlIG9ubHkgY2hhbmNlIOKAlCBvbmNlIHdlIHJlLXRocm93LCB0aGUgb3V0ZXJcbiAgICAgIC8vIHRyYXZlcnNlciB1bndpbmRzIGFuZCB0aGUgbmVzdGVkIHJ1bnRpbWUgaXMgR0MnZC4gT24gcmVzdW1lLCB3ZSdsbFxuICAgICAgLy8gcmUtc2VlZCBhIGZyZXNoIG5lc3RlZCBydW50aW1lIGZyb20gdGhpcyBjYXB0dXJlIHNvIHJlc3VtZSBoYW5kbGVyc1xuICAgICAgLy8gY2FuIHJlYWQgdGhlIHByZS1wYXVzZSBzdWJmbG93IHNjb3BlLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBTVEFURSBvbmx5IOKAlCB0aGUgc3ViZmxvdydzIHdvcmtpbmcgbWVtb3J5IGF0IHBhdXNlIHRpbWUgKGV2ZXJ5XG4gICAgICAvLyBjb21taXR0ZWQgd3JpdGUgdXAgdG8gdGhlIHBhdXNlKSwgcmVhZCBzdHJhaWdodCBvZmYgaXRzIHN0b3JlLiBOb1xuICAgICAgLy8gc25hcHNob3QgaXMgYnVpbHQ6IGEgc25hcHNob3Qgd291bGQgYWxzbyBidWlsZCB0aGUgc3ViZmxvdydzXG4gICAgICAvLyBleGVjdXRpb24gdHJlZSBhbmQgY29weSBpdHMgY29tbWl0IGxvZyDigJQgd29yayBwcm9wb3J0aW9uYWwgdG8gaG93XG4gICAgICAvLyBsb25nIHRoZSBzdWJmbG93IHJhbiDigJQgdGhhdCB0aGUgbGVhbiBjaGVja3BvaW50IG5ldmVyIGNhcnJpZXNcbiAgICAgIC8vIChgcnVubmVyL2NoZWNrcG9pbnQudHNgKS5cbiAgICAgIC8vXG4gICAgICAvLyBDYXB0dXJlIGlzIGtleWVkIGJ5IHRoZSBTQU1FIHBhdGgtcHJlZml4ZWQgYHN1YmZsb3dJZGAgdXNlZCBpblxuICAgICAgLy8gYHN1YmZsb3dQYXRoYCwgc28gcmVzdW1lIGNhbiBsb29rIHVwIFwic2NvcGUgZm9yIHNmLWZvb1wiIGJ5IGlkLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGVycm9yLmNhcHR1cmVTdWJmbG93U2NvcGUoc3ViZmxvd0lkLCBuZXN0ZWRSdW50aW1lLmdsb2JhbFN0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICBlcnJvci5wcmVwZW5kU3ViZmxvdyhzdWJmbG93SWQpO1xuICAgICAgICBuZXN0ZWRSdW50aW1lLmNsb3NlUmVjb3JkPy4oJ3BhdXNlZCcpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHN1YmZsb3dFcnJvciA9IHsgZXJyb3IgfTtcbiAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ3N1YmZsb3dFcnJvcicsIHRocm93blRleHQoZXJyb3IpKTtcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwgeyBlcnJvcjogbG9nZ2FibGVTdGFnZUVycm9yKHBhcmVudENvbnRleHQsIGVycm9yKSB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgbW91bnQncyBvd24gbG9nIGVuZGVkIOKAlCBiZWZvcmUgdGhlIG1lcmdlLWJhY2ssIHdoaWNoIGNvbW1pdHMgb24gdGhlIFBBUkVOVCdzIGxvZy5cbiAgICBuZXN0ZWRSdW50aW1lLmNsb3NlUmVjb3JkPy4oc3ViZmxvd0Vycm9yID8gJ2ZhaWxlZCcgOiAnb2snKTtcblxuICAgIC8vIEFsd2F5cyBtZXJnZSBuZXN0ZWQgc3ViZmxvdyByZXN1bHRzIChldmVuIG9uIGVycm9yIOKAlCBwYXJ0aWFsIHJlc3VsdHMgYWlkIGRlYnVnZ2luZylcbiAgICBpZiAodHJhdmVyc2VySGFuZGxlKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmF2ZXJzZXJIYW5kbGUuZ2V0U3ViZmxvd1Jlc3VsdHMoKSkge1xuICAgICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEJyZWFrIHByb3BhZ2F0aW9uIChvcHQtaW4gdmlhIFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWspIOKUgOKUgFxuICAgIC8vXG4gICAgLy8gSWYgdGhlIHN1YmZsb3cncyBpbm5lciB0cmF2ZXJzYWwgYnJva2UgKGJlY2F1c2UgYSBzdGFnZSBjYWxsZWRcbiAgICAvLyBgc2NvcGUuJGJyZWFrKHJlYXNvbilgKSBBTkQgdGhlIG1vdW50IGRlY2xhcmVkIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAsXG4gICAgLy8gZm9yd2FyZCB0aGUgYnJlYWsgc3RhdGUgdG8gdGhlIFBBUkVOVCdzIGJyZWFrRmxhZy4gVGhlIHBhcmVudFxuICAgIC8vIHRyYXZlcnNlciB3aWxsIHNlZSBgc2hvdWxkQnJlYWtgIG9uIGl0cyBuZXh0IHN0ZXAgYW5kIHN0b3AuXG4gICAgLy9cbiAgICAvLyBXaXRob3V0IHRoaXMsIGlubmVyIGJyZWFrcyBhcmUgbG9jYWxseSBzY29wZWQgdG8gdGhlIHN1YmZsb3cg4oCUIHRoZVxuICAgIC8vIHBhcmVudCBjb250aW51ZXMgYXMgaWYgdGhlIHN1YmZsb3cgcmV0dXJuZWQgbm9ybWFsbHkuXG4gICAgLy9cbiAgICAvLyBJTVBPUlRBTlQ6IHRoaXMgcnVucyBCRUZPUkUgYG91dHB1dE1hcHBpbmdgIGJlbG93LCBpbnRlbnRpb25hbGx5LiBUaGVcbiAgICAvLyBvdXRwdXRNYXBwZXIgc3RpbGwgZXhlY3V0ZXMsIHNvIHRoZSBzdWJmbG93J3MgcGFydGlhbCByZXN1bHQgc3RpbGxcbiAgICAvLyBsYW5kcyBpbiB0aGUgcGFyZW50IHNjb3BlLiBDb25zdW1lcnMgd2hvIG5lZWQgdG8gc3VwcHJlc3Mgb3V0cHV0IG9uXG4gICAgLy8gYnJlYWsgY2hlY2sgdGhlIGJyZWFrIHN0YXRlIGluc2lkZSB0aGVpciBvdXRwdXRNYXBwZXIgYW5kIGVhcmx5LXJldHVybi5cbiAgICAvLyBTZWUgYFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWtgIEpTRG9jIGZvciByYXRpb25hbGUuXG4gICAgaWYgKHRyYXZlcnNlckhhbmRsZSAmJiBtb3VudE9wdGlvbnM/LnByb3BhZ2F0ZUJyZWFrID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBpbm5lckJyZWFrID0gdHJhdmVyc2VySGFuZGxlLmdldEJyZWFrU3RhdGUoKTtcbiAgICAgIGlmIChpbm5lckJyZWFrLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWU7XG4gICAgICAgIGlmIChpbm5lckJyZWFrLnJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIGJyZWFrRmxhZy5yZWFzb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrRmxhZy5yZWFzb24gPSBpbm5lckJyZWFrLnJlYXNvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBSYWlzZSBhIHBhcmVudC1sZXZlbCBvbkJyZWFrIGV2ZW50IHNvIHJlY29yZGVycyBjYW4gZGlzdGluZ3Vpc2hcbiAgICAgICAgLy8gdGhlIGlubmVyIG9yaWdpbmF0aW5nIGJyZWFrIChmaXJlZCBpbnNpZGUgdGhlIHN1YmZsb3cpIGZyb20gdGhpc1xuICAgICAgICAvLyBwcm9wYWdhdGVkIG9uZSAoZmlyZWQgYXQgdGhlIG1vdW50IGxldmVsIG9uIHRoZSBwYXJlbnQpLlxuICAgICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uQnJlYWsoc3ViZmxvd05hbWUsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGlubmVyQnJlYWsucmVhc29uLCBzdWJmbG93SWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dUcmVlQ29udGV4dCA9IG5lc3RlZFJ1bnRpbWUuZ2V0U25hcHNob3QoKTtcblxuICAgIC8vIOKUgOKUgOKUgCBPdXRwdXQgTWFwcGluZyDilIDilIDilIBcbiAgICBpZiAoIXN1YmZsb3dFcnJvciAmJiBtb3VudE9wdGlvbnM/Lm91dHB1dE1hcHBlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhlIG1lcmdlLWJhY2sgaXMgdGhlIE1PVU5UJ3MgYWN0LCBzbyB0aGUgbW91bnQncyBmcmFtZSBzdGFnZXMgYW5kXG4gICAgICAgIC8vIGNvbW1pdHMgaXQg4oCUIGl0cyBidW5kbGUgY2FycmllcyB0aGUgbW91bnQncyBydW50aW1lU3RhZ2VJZCAoUjEzKS5cbiAgICAgICAgLy8gQSBicmFuY2ggb3IgZm9yay1jaGlsZCBtb3VudCBzdGlsbCBsYW5kcyBpdHMgdmFsdWVzIHdoZXJlIGl0c1xuICAgICAgICAvLyBwYXJlbnQgd3JpdGVzICh0aGUgcGFyZW50J3MgcnVuIG5hbWVzcGFjZSksIGFzIGJlZm9yZTsgdW50aWwgOS4zMy4wXG4gICAgICAgIC8vIGl0IGNvbW1pdHRlZCBPTiB0aGUgcGFyZW50J3MgZnJhbWUsIHNvIHRoZSBidW5kbGUgbmFtZWQgdGhlIHN0YWdlXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgbW91bnQsIG9yIHRoZSBicmFuY2hpbmcgZGVjaWRlci5cbiAgICAgICAgY29uc3Qgb3V0cHV0Q29udGV4dCA9IHBhcmVudENvbnRleHQ7XG4gICAgICAgIGlmIChwYXJlbnRDb250ZXh0LmJyYW5jaElkICYmIHBhcmVudENvbnRleHQucGFyZW50KSB7XG4gICAgICAgICAgb3V0cHV0Q29udGV4dC51c2VBZGRyZXNzT2YocGFyZW50Q29udGV4dC5wYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50U2NvcGUgPSBvdXRwdXRDb250ZXh0LmdldFNjb3BlKCk7XG4gICAgICAgIC8vIEZvciBUeXBlZFNjb3BlIHN1YmZsb3dzLCBzdGFnZSBmdW5jdGlvbnMgcmV0dXJuIHZvaWQg4oCUIGZhbGwgYmFjayB0byBhIHNoYWxsb3cgY2xvbmVcbiAgICAgICAgLy8gb2YgdGhlIHN1YmZsb3cncyBzaGFyZWQgc3RhdGUgc28gb3V0cHV0TWFwcGVyIGNhbiBhY2Nlc3MgYWxsIHNjb3BlIHZhbHVlcyB3cml0dGVuXG4gICAgICAgIC8vIGR1cmluZyB0aGUgc3ViZmxvdy4gV2Ugc2hhbGxvdy1jbG9uZSB0byBhdm9pZCBhbGlhc2luZyB0aGUgbGl2ZSBTaGFyZWRNZW1vcnkgY29udGV4dC5cbiAgICAgICAgLy8gTk9URTogdGhlIGZ1bGwgc2NvcGUgaXMgcGFzc2VkIChub3QganVzdCBkZWNsYXJlZCBvdXRwdXRzKSDigJQgb3V0cHV0TWFwcGVyIG11c3RcbiAgICAgICAgLy8gZXhwbGljaXRseSBzZWxlY3Qgd2hhdCB0byBwcm9wYWdhdGUgdG8gdGhlIHBhcmVudC5cbiAgICAgICAgLy8gUmVkYWN0aW9uOiBgYXBwbHlPdXRwdXRNYXBwaW5nYCB3cml0ZXMgdGhyb3VnaCBgb3V0cHV0Q29udGV4dGAgKGFcbiAgICAgICAgLy8gU3RhZ2VDb250ZXh0LCBub3QgYSBmYWNhZGUpLiBUaGUgY29udGV4dCdzIHdyaXRlIGZ1bm5lbCBhc2tzIHRoZVxuICAgICAgICAvLyBydW4ncyByZWRhY3Rpb24gcnVsZSDigJQgc2hhcmVkIHdpdGggdGhlIHN1YmZsb3cncyBjb250ZXh0cywgc28gYSBrZXlcbiAgICAgICAgLy8gdGhlIHBvbGljeSBuYW1lcyBPUiBhIGtleSBtYXJrZWQgcGVyLWNhbGwgaW5zaWRlIHRoZSBzdWJmbG93IGlzXG4gICAgICAgIC8vIHNjcnViYmVkIGluIHRoZSBQQVJFTlQncyBsb2cgYW5kIG1pcnJvciB0b28gKDkuMTkuMDsgYmVmb3JlLCB0aGlzXG4gICAgICAgIC8vIG1lcmdlLWJhY2sgcmV0YWluZWQgcGxhaW50ZXh0KS5cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlT3V0cHV0ID0gc3ViZmxvd091dHB1dCA/PyB7IC4uLnN1YmZsb3dUcmVlQ29udGV4dC5zaGFyZWRTdGF0ZSB9O1xuICAgICAgICBjb25zdCBtYXBwZWRPdXRwdXQgPSBhcHBseU91dHB1dE1hcHBpbmcoXG4gICAgICAgICAgZWZmZWN0aXZlT3V0cHV0LFxuICAgICAgICAgIHBhcmVudFNjb3BlLFxuICAgICAgICAgIG91dHB1dENvbnRleHQsXG4gICAgICAgICAgbW91bnRPcHRpb25zLFxuICAgICAgICAgIHJlZGFjdGlvblJ1bGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgb3V0cHV0Q29udGV4dC5jb21taXQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gQSBtZXJnZS1iYWNrIHRoYXQgZmFpbGVkIHRvIGNvbW1pdCAoYW4gdW5jbG9uZWFibGUgdmFsdWUpIGxlYXZlcyBpdHNcbiAgICAgICAgLy8gd3JpdGVzIHN0YWdlZCBvbiB0aGUgbW91bnQncyBmcmFtZTsgdGhlIG1vdW50J3MgZXhpdCBjb21taXQgYmVsb3dcbiAgICAgICAgLy8gd291bGQgdGhyb3cgdGhlbSBhZ2Fpbiwgb3V0c2lkZSB0aGlzIGNhdGNoLiBUaHJvdWdoIDkuMzMuMCB0aGV5XG4gICAgICAgIC8vIHdlcmUgc3RhZ2VkIG9uIHRoZSBwYXJlbnQncyBmcmFtZSwgd2hpY2ggd2FzIG5vdCBjb21taXR0ZWQgYWdhaW4sXG4gICAgICAgIC8vIHNvIHRoZSBydW4gd2VudCBvbiDigJQgZHJvcCB0aGVtLCBhcyBpdCBkaWQuIEEgbGluZWFyIG1vdW50J3MgZnJhbWVcbiAgICAgICAgLy8gaXMgbGVmdCBhcyBpdCBhbHdheXMgd2FzLlxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkgcGFyZW50Q29udGV4dC5kaXNjYXJkU3RhZ2VkKCk7XG4gICAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ291dHB1dE1hcHBlckVycm9yJywgdGhyb3duVGV4dChlcnJvcikpO1xuICAgICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBvdXRwdXRNYXBwZXIgZm9yIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwge1xuICAgICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IocGFyZW50Q29udGV4dCwgZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93UmVzdWx0OiBTdWJmbG93UmVzdWx0ID0ge1xuICAgICAgc3ViZmxvd0lkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICB0cmVlQ29udGV4dDoge1xuICAgICAgICBnbG9iYWxDb250ZXh0OiBzdWJmbG93VHJlZUNvbnRleHQuc2hhcmVkU3RhdGUsXG4gICAgICAgIHN0YWdlQ29udGV4dHM6IHN1YmZsb3dUcmVlQ29udGV4dC5leGVjdXRpb25UcmVlIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGhpc3Rvcnk6IHN1YmZsb3dUcmVlQ29udGV4dC5jb21taXRMb2csXG4gICAgICAgIC4uLihzdWJmbG93VHJlZUNvbnRleHQubG9nQWRkcmVzcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxvZ0FkZHJlc3M6IHN1YmZsb3dUcmVlQ29udGV4dC5sb2dBZGRyZXNzIH0pLFxuICAgICAgICAvLyBUaGUgc3ViZmxvdydzIG93biBmb2xkIGJhc2UgdHJhdmVscyB3aXRoIGl0cyBvd24gbG9nIOKAlCBzYW1lXG4gICAgICAgIC8vIGNvbnRyYWN0IGFzIHRoZSBydW4tbGV2ZWwgYFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGVgLlxuICAgICAgICBpbml0aWFsU3RhdGU6IHN1YmZsb3dUcmVlQ29udGV4dC5pbml0aWFsU3RhdGUsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZDogcGFyZW50Q29udGV4dC5nZXRTdGFnZUlkKCksXG4gICAgfTtcblxuICAgIGNvbnN0IHN1YmZsb3dEZWYgPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdO1xuICAgIGlmIChzdWJmbG93RGVmICYmIChzdWJmbG93RGVmIGFzIGFueSkuYnVpbGRUaW1lU3RydWN0dXJlKSB7XG4gICAgICBzdWJmbG93UmVzdWx0LnBpcGVsaW5lU3RydWN0dXJlID0gKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmU7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNlcnZlZCBzdGF0ZSAoOS4yMC4wKTogdGhlIG5lc3RlZCBtaXJyb3IncyBmaW5hbCBzdGF0ZSwgcmVtZW1iZXJlZFxuICAgIC8vIEJFU0lERSB0aGUgcmVzdWx0IOKAlCBgdHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dGAgc3RheXMgdGhlIGxpdmUgaGVhcCBmb3JcbiAgICAvLyB0aGUgcGxhaW4gc25hcHNob3QgYW5kIHRoZSBjaGVja3BvaW50OyBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgXG4gICAgLy8gc3Vic3RpdHV0ZXMgdGhlIG1pcnJvciB0aHJvdWdoIGBzZXJ2ZWRTdWJmbG93UmVzdWx0c2AuIEFic2VudCB3aXRob3V0XG4gICAgLy8gYSBwb2xpY3kuIFRoZSBleGl0IGV2ZW50IGJlbG93IGNhcnJpZXMgdGhlIHNhbWUgc2VydmVkIHZpZXc7IHdpdGhvdXQgYVxuICAgIC8vIG1pcnJvciBpdCBjYXJyaWVzIHRoZSBoZWFwIHJldGFpbmVkIHVuZGVyIHRoZSBydWxlIChwZXItY2FsbCBtYXJrc1xuICAgIC8vIGFsb25lIGtlZXAgbm8gbWlycm9yKSDigJQgdGhlIHNhbWUgb2JqZWN0IHdoZW4gbm90aGluZyBpcyByZWRhY3RlZC5cbiAgICBjb25zdCByYXdTdGF0ZSA9IHN1YmZsb3dSZXN1bHQudHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dDtcbiAgICBjb25zdCBtaXJyb3JTdGF0ZSA9IG5lc3RlZFJ1bnRpbWUucmVkYWN0ZWRTdG9yZT8uZ2V0U3RhdGUoKTtcbiAgICBpZiAobWlycm9yU3RhdGUgIT09IHVuZGVmaW5lZCkgcmVtZW1iZXJSZWRhY3RlZFN1YmZsb3dTdGF0ZShzdWJmbG93UmVzdWx0LCBtaXJyb3JTdGF0ZSk7XG4gICAgLy8gSGFuZGVkIG91dCB3aG9sZSwgc28gaXQgaXMgYSBib3VuZGFyeSByZWNvcmQ6IG5lc3RlZCBwb2xpY3kga2V5cyBhcmUgc2NydWJiZWQgdG9vXG4gICAgLy8gKHRoZSBtaXJyb3IncyBvd24gcGxhY2Vob2xkZXIsIHNvIGl0cyB0b3Aga2V5cyBrZWVwIHRoZWlyIGJ5dGVzKS5cbiAgICBjb25zdCBleGl0U3RhdGUgPSAhcmVkYWN0aW9uUnVsZVxuICAgICAgPyBtaXJyb3JTdGF0ZSA/PyByYXdTdGF0ZVxuICAgICAgOiBtaXJyb3JTdGF0ZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkobWlycm9yU3RhdGUsIExPR19QTEFDRUhPTERFUilcbiAgICAgIDogcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShyYXdTdGF0ZSk7XG5cbiAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoc3ViZmxvd0lkLCBzdWJmbG93UmVzdWx0KTtcbiAgICAvLyBBZGRpdGl2ZSBwZXItZXhlY3V0aW9uIGtleSAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKS4gQSBMT09QSU5HXG4gICAgLy8gc3ViZmxvdyByZS1lbnRlcnMgd2l0aCB0aGUgU0FNRSBzdWJmbG93SWQsIHNvIHRoZSBwYXRoIGtleSBhYm92ZSBpcyBPVkVSV1JJVFRFTiBlYWNoXG4gICAgLy8gaXRlcmF0aW9uIChiYWNrLWNvbXBhdDogaXQgaG9sZHMgdGhlIExBU1QgaXRlcmF0aW9uIOKAlCB3aGF0IGdldFN1YnRyZWVTbmFwc2hvdC9saXN0U3ViZmxvd1BhdGhzXG4gICAgLy8gYW5kIHRoZSBldWkgZmFsbGJhY2sgc2VlLCB1bmNoYW5nZWQpLiBBTFNPIGtleSBieSB0aGUgbW91bnQncyBVTklRVUUgcnVudGltZVN0YWdlSWQgc28gRVZFUllcbiAgICAvLyBpdGVyYXRpb24ncyByZXN1bHQgaXMgcmV0YWluZWQgYW5kIGFkZHJlc3NhYmxlIChldWkgcGVyLWxvb3AgZHJpbGwtZG93biwgcGVyLXNjb3BlIGxvY2FsaXphdGlvbikuXG4gICAgLy8gcnVudGltZVN0YWdlSWQgYWx3YXlzIGNvbnRhaW5zICcjJzsgc3ViZmxvd0lkIG5ldmVyIGRvZXMg4oCUIHNvIHRoZXkgbmV2ZXIgY29sbGlkZSwgYW5kXG4gICAgLy8gbGlzdFN1YmZsb3dQYXRocyBmaWx0ZXJzICcjJyBrZXlzIHRvIGtlZXAgaXRzIHBhdGgtb25seSBjb250cmFjdC4gVGhlIHBhdXNlIGNoZWNrcG9pbnQgZmlsdGVyc1xuICAgIC8vIHRoZXNlIG91dCAoYnVpbGRQYXVzZUNoZWNrcG9pbnQpIHNvIGl0IHN0YXlzIGxlYW4uXG4gICAgaWYgKG1vdW50UnVudGltZVN0YWdlSWQgJiYgbW91bnRSdW50aW1lU3RhZ2VJZCAhPT0gc3ViZmxvd0lkKSB7XG4gICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQobW91bnRSdW50aW1lU3RhZ2VJZCwgc3ViZmxvd1Jlc3VsdCk7XG4gICAgfVxuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEV4aXRpbmcgJHtzdWJmbG93TmFtZX0gc3ViZmxvd2AsIHtcbiAgICAgIHRhcmdldFN0YWdlOiBzdWJmbG93SWQsXG4gICAgfSk7XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dFeGl0KHN1YmZsb3dOYW1lLCBzdWJmbG93SWQsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGV4aXRTdGF0ZSk7XG5cbiAgICAvLyBUaGUgbW91bnQncyBFWElUIOKAlCBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgbW91bnQncyBleGVjdXRpb24sIG5hbWVkIGFzIG9uZVxuICAgIC8vIG9uIHRoZSByZWNvcmQgKDkuMzkuMCkgc28gbm8gcmVhZGVyIGluZmVycyBpdCBmcm9tIHRoZSBsb2cncyBzaGFwZS5cbiAgICBjb21taXRTdGFnZVdyaXRlcyhwYXJlbnRDb250ZXh0LCAnZXhpdCcpO1xuXG4gICAgaWYgKHN1YmZsb3dFcnJvcikge1xuICAgICAgcGFyZW50Q29udGV4dC5mYWlsdXJlU3RhdGUuYWRvcHQobmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0LmZhaWx1cmVTdGF0ZSwgc3ViZmxvd0Vycm9yLmVycm9yKTtcbiAgICAgIHRocm93IHN1YmZsb3dFcnJvci5lcnJvcjtcbiAgICB9XG5cbiAgICBuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQuZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG5cbiAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgfVxufVxuIl19
@@ -8,6 +8,13 @@
8
8
  * outright); it is a stage failure like any other, so `onError` fires for the
9
9
  * stage before the error propagates.
10
10
  */
11
+ import type { CommitPhase } from 'foottrace';
11
12
  import type { StageContext } from '../../memory/StageContext.js';
12
13
  import type { IControlFlowNarrative, TraversalContext } from '../narrative/types.js';
14
+ /**
15
+ * All native stage commits own their exact escaping commit error, including
16
+ * commits while another error or pause was bubbling. Capture safe ownership
17
+ * only; existing diagnostic/event behavior stays with the caller.
18
+ */
19
+ export declare function commitStageWrites(context: StageContext, phase?: CommitPhase): void;
13
20
  export declare function commitStage(context: StageContext, narrative: IControlFlowNarrative, stageName: string, traversalContext?: TraversalContext): void;
@@ -8,14 +8,32 @@
8
8
  * outright); it is a stage failure like any other, so `onError` fires for the
9
9
  * stage before the error propagates.
10
10
  */
11
- import { extractErrorInfo, thrownText } from '../../errors/errorInfo.js';
11
+ import { captureStageFailure, recordStageError } from './stageError.js';
12
+ /**
13
+ * All native stage commits own their exact escaping commit error, including
14
+ * commits while another error or pause was bubbling. Capture safe ownership
15
+ * only; existing diagnostic/event behavior stays with the caller.
16
+ */
17
+ export function commitStageWrites(context, phase) {
18
+ try {
19
+ if (phase === undefined)
20
+ context.commit();
21
+ else
22
+ context.commit(phase);
23
+ }
24
+ catch (error) {
25
+ captureStageFailure(context, error);
26
+ throw error;
27
+ }
28
+ }
12
29
  export function commitStage(context, narrative, stageName, traversalContext) {
13
30
  try {
14
- context.commit();
31
+ commitStageWrites(context);
15
32
  }
16
33
  catch (error) {
17
- narrative.onError(stageName, thrownText(error), extractErrorInfo(error), traversalContext);
34
+ const served = recordStageError(context, error);
35
+ narrative.onError(stageName, served.message, served.structuredError, traversalContext);
18
36
  throw error;
19
37
  }
20
38
  }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0U3RhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9jb21taXRTdGFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJekUsTUFBTSxVQUFVLFdBQVcsQ0FDekIsT0FBcUIsRUFDckIsU0FBZ0MsRUFDaEMsU0FBaUIsRUFDakIsZ0JBQW1DO0lBRW5DLElBQUksQ0FBQztRQUNILE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUMzRixNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjb21taXRTdGFnZSDigJQgYSBzdGFnZSdzIFNVQ0NFU1MgY29tbWl0LCBmYWlsaW5nIGxvdWRseS5cbiAqXG4gKiBUaGUgY29tbWl0IGlzIHdoZXJlIGEgc3RhZ2UncyB3cml0ZXMgYXJlIGRldGFjaGVkIChgc3RydWN0dXJlZENsb25lYCksIHNvIGFcbiAqIHZhbHVlIG5vdGhpbmcgY2FuIGNsb25lIOKAlCBhIGZ1bmN0aW9uLCBhIGZvcmVpZ24gUHJveHkg4oCUIGZhaWxzIEhFUkUsIGFmdGVyXG4gKiB0aGUgc3RhZ2UgZnVuY3Rpb24gcmV0dXJuZWQgYW5kIG91dHNpZGUgaXRzIGNhdGNoLiBUaHJvdWdoIDkuMzkuMCBzdWNoIGFcbiAqIGZhaWx1cmUgcmVqZWN0ZWQgYHJ1bigpYCB3aXRoIG5vIGBvbkVycm9yYCAoYW5kIGEgZm9yayBjaGlsZCdzIHdhcyBkcm9wcGVkXG4gKiBvdXRyaWdodCk7IGl0IGlzIGEgc3RhZ2UgZmFpbHVyZSBsaWtlIGFueSBvdGhlciwgc28gYG9uRXJyb3JgIGZpcmVzIGZvciB0aGVcbiAqIHN0YWdlIGJlZm9yZSB0aGUgZXJyb3IgcHJvcGFnYXRlcy5cbiAqL1xuXG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCB0aHJvd25UZXh0IH0gZnJvbSAnLi4vLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBJQ29udHJvbEZsb3dOYXJyYXRpdmUsIFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29tbWl0U3RhZ2UoXG4gIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgbmFycmF0aXZlOiBJQ29udHJvbEZsb3dOYXJyYXRpdmUsXG4gIHN0YWdlTmFtZTogc3RyaW5nLFxuICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbik6IHZvaWQge1xuICB0cnkge1xuICAgIGNvbnRleHQuY29tbWl0KCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbmFycmF0aXZlLm9uRXJyb3Ioc3RhZ2VOYW1lLCB0aHJvd25UZXh0KGVycm9yKSwgZXh0cmFjdEVycm9ySW5mbyhlcnJvciksIHRyYXZlcnNhbENvbnRleHQpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG4iXX0=
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0U3RhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9jb21taXRTdGFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFNSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV4RTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE9BQXFCLEVBQUUsS0FBbUI7SUFDMUUsSUFBSSxDQUFDO1FBQ0gsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7WUFDckMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEMsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQ3pCLE9BQXFCLEVBQ3JCLFNBQWdDLEVBQ2hDLFNBQWlCLEVBQ2pCLGdCQUFtQztJQUVuQyxJQUFJLENBQUM7UUFDSCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsZUFBZSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDdkYsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogY29tbWl0U3RhZ2Ug4oCUIGEgc3RhZ2UncyBTVUNDRVNTIGNvbW1pdCwgZmFpbGluZyBsb3VkbHkuXG4gKlxuICogVGhlIGNvbW1pdCBpcyB3aGVyZSBhIHN0YWdlJ3Mgd3JpdGVzIGFyZSBkZXRhY2hlZCAoYHN0cnVjdHVyZWRDbG9uZWApLCBzbyBhXG4gKiB2YWx1ZSBub3RoaW5nIGNhbiBjbG9uZSDigJQgYSBmdW5jdGlvbiwgYSBmb3JlaWduIFByb3h5IOKAlCBmYWlscyBIRVJFLCBhZnRlclxuICogdGhlIHN0YWdlIGZ1bmN0aW9uIHJldHVybmVkIGFuZCBvdXRzaWRlIGl0cyBjYXRjaC4gVGhyb3VnaCA5LjM5LjAgc3VjaCBhXG4gKiBmYWlsdXJlIHJlamVjdGVkIGBydW4oKWAgd2l0aCBubyBgb25FcnJvcmAgKGFuZCBhIGZvcmsgY2hpbGQncyB3YXMgZHJvcHBlZFxuICogb3V0cmlnaHQpOyBpdCBpcyBhIHN0YWdlIGZhaWx1cmUgbGlrZSBhbnkgb3RoZXIsIHNvIGBvbkVycm9yYCBmaXJlcyBmb3IgdGhlXG4gKiBzdGFnZSBiZWZvcmUgdGhlIGVycm9yIHByb3BhZ2F0ZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRQaGFzZSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IElDb250cm9sRmxvd05hcnJhdGl2ZSwgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBjYXB0dXJlU3RhZ2VGYWlsdXJlLCByZWNvcmRTdGFnZUVycm9yIH0gZnJvbSAnLi9zdGFnZUVycm9yLmpzJztcblxuLyoqXG4gKiBBbGwgbmF0aXZlIHN0YWdlIGNvbW1pdHMgb3duIHRoZWlyIGV4YWN0IGVzY2FwaW5nIGNvbW1pdCBlcnJvciwgaW5jbHVkaW5nXG4gKiBjb21taXRzIHdoaWxlIGFub3RoZXIgZXJyb3Igb3IgcGF1c2Ugd2FzIGJ1YmJsaW5nLiBDYXB0dXJlIHNhZmUgb3duZXJzaGlwXG4gKiBvbmx5OyBleGlzdGluZyBkaWFnbm9zdGljL2V2ZW50IGJlaGF2aW9yIHN0YXlzIHdpdGggdGhlIGNhbGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdFN0YWdlV3JpdGVzKGNvbnRleHQ6IFN0YWdlQ29udGV4dCwgcGhhc2U/OiBDb21taXRQaGFzZSk6IHZvaWQge1xuICB0cnkge1xuICAgIGlmIChwaGFzZSA9PT0gdW5kZWZpbmVkKSBjb250ZXh0LmNvbW1pdCgpO1xuICAgIGVsc2UgY29udGV4dC5jb21taXQocGhhc2UpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGNhcHR1cmVTdGFnZUZhaWx1cmUoY29udGV4dCwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21taXRTdGFnZShcbiAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICBuYXJyYXRpdmU6IElDb250cm9sRmxvd05hcnJhdGl2ZSxcbiAgc3RhZ2VOYW1lOiBzdHJpbmcsXG4gIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgY29tbWl0U3RhZ2VXcml0ZXMoY29udGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgY29uc3Qgc2VydmVkID0gcmVjb3JkU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvcik7XG4gICAgbmFycmF0aXZlLm9uRXJyb3Ioc3RhZ2VOYW1lLCBzZXJ2ZWQubWVzc2FnZSwgc2VydmVkLnN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdfQ==
@@ -14,6 +14,8 @@ export declare function recordStageError(context: StageContext, error: unknown):
14
14
  message: string;
15
15
  structuredError: StructuredErrorInfo;
16
16
  };
17
+ /** Capture before commit observers or diagnostic serving can change the raw value. */
18
+ export declare function captureStageFailure(context: StageContext, error: unknown): void;
17
19
  /** The served form of a thrown value at any other report of a stage failure (retry, throttle). */
18
20
  export declare function servedStageError(context: StageContext, error: unknown): StructuredErrorInfo;
19
21
  /** What the logger is handed: the thrown value, or its masked form when the policy masked its text. */
@@ -8,13 +8,25 @@
8
8
  * selector error paths all call it; retries, throttle events and the logger
9
9
  * ask `servedStageError` / `loggableStageError` for the same decision.
10
10
  */
11
+ import { terminalCategory } from '../../attempt/category.js';
11
12
  import { extractErrorInfo, thrownText } from '../../errors/errorInfo.js';
12
13
  export function recordStageError(context, error) {
14
+ captureStageFailure(context, error);
13
15
  const text = thrownText(error);
14
16
  const kept = context.addDiagnostic('errors', 'stageExecutionError', text);
17
+ context.markStageFailure();
15
18
  const rule = context.getRedactionRule();
16
19
  return rule ? rule.retainStageError(error, text, kept) : { message: text, structuredError: extractErrorInfo(error) };
17
20
  }
21
+ /** Capture before commit observers or diagnostic serving can change the raw value. */
22
+ export function captureStageFailure(context, error) {
23
+ // The native runner may already own the exact final category; never recover
24
+ // it from a served error or an unrelated call/observed/recovered attempt.
25
+ const identity = context.failureIdentity;
26
+ if (identity && !context.failureState.owns(error)) {
27
+ context.failureState.capture(error, terminalCategory(error), identity);
28
+ }
29
+ }
18
30
  /** The served form of a thrown value at any other report of a stage failure (retry, throttle). */
19
31
  export function servedStageError(context, error) {
20
32
  const rule = context.getRedactionRule();
@@ -35,4 +47,4 @@ export function servedIdempotencyKey(context, key, input, readSelected = false)
35
47
  const rule = context.getRedactionRule();
36
48
  return rule ? rule.retainIdempotencyKey(key, { input, selectedReads: readSelected ? 1 : 0 }) : key;
37
49
  }
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhZ2VFcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL2hhbmRsZXJzL3N0YWdlRXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBR0gsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3pFLE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsT0FBcUIsRUFDckIsS0FBYztJQUVkLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUN4QyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUN2SCxDQUFDO0FBRUQsa0dBQWtHO0FBQ2xHLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxPQUFxQixFQUFFLEtBQWM7SUFDcEUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDeEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCx1R0FBdUc7QUFDdkcsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQXFCLEVBQUUsS0FBYztJQUN0RSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUN4QyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxPQUFxQixFQUFFLEdBQVcsRUFBRSxLQUFjLEVBQUUsWUFBWSxHQUFHLEtBQUs7SUFDM0csTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDeEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDckcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc3RhZ2VFcnJvciDigJQgdGhlIE9ORSBwbGFjZSBhIGZhaWxlZCBzdGFnZSdzIGVycm9yIGlzIHJlY29yZGVkIGFuZCBzZXJ2ZWQuXG4gKlxuICogV3JpdGVzIGBlcnJvcnMuc3RhZ2VFeGVjdXRpb25FcnJvcmAgdGhyb3VnaCB0aGUgZGlhZ25vc3RpYyBjb2xsZWN0b3IgKHdoaWNoXG4gKiBhcHBsaWVzIHRoZSBydW4ncyBkaWFnbm9zdGljIHBvbGljeSkgYW5kIGhhbmRzIGJhY2sgdGhlIGZvcm0gYG9uRXJyb3JgIGlzXG4gKiBzZXJ2ZWQ6IHRoZSBzYW1lIHJldGFpbmVkIHRleHQsIGRlY2lkZWQgb25jZSwgc28gdGhlIG5hcnJhdGl2ZSwgZmxvdyBldmVudHNcbiAqIGFuZCByZWNvcmRlciByb3dzIG5ldmVyIHNlZSB3aGF0IHRoZSBwb2xpY3kgbWFza2VkLiBUaGUgbGluZWFyLCBkZWNpZGVyIGFuZFxuICogc2VsZWN0b3IgZXJyb3IgcGF0aHMgYWxsIGNhbGwgaXQ7IHJldHJpZXMsIHRocm90dGxlIGV2ZW50cyBhbmQgdGhlIGxvZ2dlclxuICogYXNrIGBzZXJ2ZWRTdGFnZUVycm9yYCAvIGBsb2dnYWJsZVN0YWdlRXJyb3JgIGZvciB0aGUgc2FtZSBkZWNpc2lvbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi8uLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8sIHRocm93blRleHQgfSBmcm9tICcuLi8uLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRTdGFnZUVycm9yKFxuICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gIGVycm9yOiB1bmtub3duLFxuKTogeyBtZXNzYWdlOiBzdHJpbmc7IHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB9IHtcbiAgY29uc3QgdGV4dCA9IHRocm93blRleHQoZXJyb3IpO1xuICBjb25zdCBrZXB0ID0gY29udGV4dC5hZGREaWFnbm9zdGljKCdlcnJvcnMnLCAnc3RhZ2VFeGVjdXRpb25FcnJvcicsIHRleHQpO1xuICBjb25zdCBydWxlID0gY29udGV4dC5nZXRSZWRhY3Rpb25SdWxlKCk7XG4gIHJldHVybiBydWxlID8gcnVsZS5yZXRhaW5TdGFnZUVycm9yKGVycm9yLCB0ZXh0LCBrZXB0KSA6IHsgbWVzc2FnZTogdGV4dCwgc3RydWN0dXJlZEVycm9yOiBleHRyYWN0RXJyb3JJbmZvKGVycm9yKSB9O1xufVxuXG4vKiogVGhlIHNlcnZlZCBmb3JtIG9mIGEgdGhyb3duIHZhbHVlIGF0IGFueSBvdGhlciByZXBvcnQgb2YgYSBzdGFnZSBmYWlsdXJlIChyZXRyeSwgdGhyb3R0bGUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZlZFN0YWdlRXJyb3IoY29udGV4dDogU3RhZ2VDb250ZXh0LCBlcnJvcjogdW5rbm93bik6IFN0cnVjdHVyZWRFcnJvckluZm8ge1xuICBjb25zdCBydWxlID0gY29udGV4dC5nZXRSZWRhY3Rpb25SdWxlKCk7XG4gIHJldHVybiBydWxlID8gcnVsZS5zZXJ2ZWRFcnJvcihlcnJvcikgOiBleHRyYWN0RXJyb3JJbmZvKGVycm9yKTtcbn1cblxuLyoqIFdoYXQgdGhlIGxvZ2dlciBpcyBoYW5kZWQ6IHRoZSB0aHJvd24gdmFsdWUsIG9yIGl0cyBtYXNrZWQgZm9ybSB3aGVuIHRoZSBwb2xpY3kgbWFza2VkIGl0cyB0ZXh0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ2dhYmxlU3RhZ2VFcnJvcihjb250ZXh0OiBTdGFnZUNvbnRleHQsIGVycm9yOiB1bmtub3duKTogdW5rbm93biB7XG4gIGNvbnN0IHJ1bGUgPSBjb250ZXh0LmdldFJlZGFjdGlvblJ1bGUoKTtcbiAgcmV0dXJuIHJ1bGUgPyBydWxlLmxvZ2dhYmxlRXJyb3IoZXJyb3IpIDogZXJyb3I7XG59XG5cbi8qKlxuICogQSB0b3VjaGluZyBzdGFnZSdzIGlkZW1wb3RlbmN5IGtleSBhcyByZWNvcmRzIGNhcnJ5IGl0IChQMywgZGVzaWduIMKnNikg4oCUIGBSZWRhY3Rpb25SdWxlIMK3IHJldGFpbklkZW1wb3RlbmN5S2V5YDpcbiAqIHNlbGVjdGVkIGJ5IGl0cyBuYW1lLCBhbmQgc2VydmVkIHdob2xlIHdoZW4gdGhlIGlucHV0IGl0cyBydWxlIHdhcyBoYW5kZWQgaG9sZHMgYSBzZWxlY3RlZCBrZXkgb3IgdGhlIHJ1bGUgcmVhZFxuICogYSBzZWxlY3RlZCBzdGF0ZSB2YWx1ZS4gVGhlIHN0YWdlIGl0c2VsZlxuICoga2VlcHMgdGhlIHJlYWwga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmVkSWRlbXBvdGVuY3lLZXkoY29udGV4dDogU3RhZ2VDb250ZXh0LCBrZXk6IHN0cmluZywgaW5wdXQ6IHVua25vd24sIHJlYWRTZWxlY3RlZCA9IGZhbHNlKTogc3RyaW5nIHtcbiAgY29uc3QgcnVsZSA9IGNvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZSgpO1xuICByZXR1cm4gcnVsZSA/IHJ1bGUucmV0YWluSWRlbXBvdGVuY3lLZXkoa2V5LCB7IGlucHV0LCBzZWxlY3RlZFJlYWRzOiByZWFkU2VsZWN0ZWQgPyAxIDogMCB9KSA6IGtleTtcbn1cbiJdfQ==
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhZ2VFcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL2hhbmRsZXJzL3N0YWdlRXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3pFLE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsT0FBcUIsRUFDckIsS0FBYztJQUVkLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUUsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDM0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDeEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDdkgsQ0FBQztBQUVELHNGQUFzRjtBQUN0RixNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBcUIsRUFBRSxLQUFjO0lBQ3ZFLDRFQUE0RTtJQUM1RSwwRUFBMEU7SUFDMUUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQztJQUN6QyxJQUFJLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEQsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7QUFDSCxDQUFDO0FBRUQsa0dBQWtHO0FBQ2xHLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxPQUFxQixFQUFFLEtBQWM7SUFDcEUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDeEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCx1R0FBdUc7QUFDdkcsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQXFCLEVBQUUsS0FBYztJQUN0RSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUN4QyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxPQUFxQixFQUFFLEdBQVcsRUFBRSxLQUFjLEVBQUUsWUFBWSxHQUFHLEtBQUs7SUFDM0csTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDeEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDckcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc3RhZ2VFcnJvciDigJQgdGhlIE9ORSBwbGFjZSBhIGZhaWxlZCBzdGFnZSdzIGVycm9yIGlzIHJlY29yZGVkIGFuZCBzZXJ2ZWQuXG4gKlxuICogV3JpdGVzIGBlcnJvcnMuc3RhZ2VFeGVjdXRpb25FcnJvcmAgdGhyb3VnaCB0aGUgZGlhZ25vc3RpYyBjb2xsZWN0b3IgKHdoaWNoXG4gKiBhcHBsaWVzIHRoZSBydW4ncyBkaWFnbm9zdGljIHBvbGljeSkgYW5kIGhhbmRzIGJhY2sgdGhlIGZvcm0gYG9uRXJyb3JgIGlzXG4gKiBzZXJ2ZWQ6IHRoZSBzYW1lIHJldGFpbmVkIHRleHQsIGRlY2lkZWQgb25jZSwgc28gdGhlIG5hcnJhdGl2ZSwgZmxvdyBldmVudHNcbiAqIGFuZCByZWNvcmRlciByb3dzIG5ldmVyIHNlZSB3aGF0IHRoZSBwb2xpY3kgbWFza2VkLiBUaGUgbGluZWFyLCBkZWNpZGVyIGFuZFxuICogc2VsZWN0b3IgZXJyb3IgcGF0aHMgYWxsIGNhbGwgaXQ7IHJldHJpZXMsIHRocm90dGxlIGV2ZW50cyBhbmQgdGhlIGxvZ2dlclxuICogYXNrIGBzZXJ2ZWRTdGFnZUVycm9yYCAvIGBsb2dnYWJsZVN0YWdlRXJyb3JgIGZvciB0aGUgc2FtZSBkZWNpc2lvbi5cbiAqL1xuXG5pbXBvcnQgeyB0ZXJtaW5hbENhdGVnb3J5IH0gZnJvbSAnLi4vLi4vYXR0ZW1wdC9jYXRlZ29yeS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi8uLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8sIHRocm93blRleHQgfSBmcm9tICcuLi8uLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRTdGFnZUVycm9yKFxuICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gIGVycm9yOiB1bmtub3duLFxuKTogeyBtZXNzYWdlOiBzdHJpbmc7IHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB9IHtcbiAgY2FwdHVyZVN0YWdlRmFpbHVyZShjb250ZXh0LCBlcnJvcik7XG4gIGNvbnN0IHRleHQgPSB0aHJvd25UZXh0KGVycm9yKTtcbiAgY29uc3Qga2VwdCA9IGNvbnRleHQuYWRkRGlhZ25vc3RpYygnZXJyb3JzJywgJ3N0YWdlRXhlY3V0aW9uRXJyb3InLCB0ZXh0KTtcbiAgY29udGV4dC5tYXJrU3RhZ2VGYWlsdXJlKCk7XG4gIGNvbnN0IHJ1bGUgPSBjb250ZXh0LmdldFJlZGFjdGlvblJ1bGUoKTtcbiAgcmV0dXJuIHJ1bGUgPyBydWxlLnJldGFpblN0YWdlRXJyb3IoZXJyb3IsIHRleHQsIGtlcHQpIDogeyBtZXNzYWdlOiB0ZXh0LCBzdHJ1Y3R1cmVkRXJyb3I6IGV4dHJhY3RFcnJvckluZm8oZXJyb3IpIH07XG59XG5cbi8qKiBDYXB0dXJlIGJlZm9yZSBjb21taXQgb2JzZXJ2ZXJzIG9yIGRpYWdub3N0aWMgc2VydmluZyBjYW4gY2hhbmdlIHRoZSByYXcgdmFsdWUuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZVN0YWdlRmFpbHVyZShjb250ZXh0OiBTdGFnZUNvbnRleHQsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gIC8vIFRoZSBuYXRpdmUgcnVubmVyIG1heSBhbHJlYWR5IG93biB0aGUgZXhhY3QgZmluYWwgY2F0ZWdvcnk7IG5ldmVyIHJlY292ZXJcbiAgLy8gaXQgZnJvbSBhIHNlcnZlZCBlcnJvciBvciBhbiB1bnJlbGF0ZWQgY2FsbC9vYnNlcnZlZC9yZWNvdmVyZWQgYXR0ZW1wdC5cbiAgY29uc3QgaWRlbnRpdHkgPSBjb250ZXh0LmZhaWx1cmVJZGVudGl0eTtcbiAgaWYgKGlkZW50aXR5ICYmICFjb250ZXh0LmZhaWx1cmVTdGF0ZS5vd25zKGVycm9yKSkge1xuICAgIGNvbnRleHQuZmFpbHVyZVN0YXRlLmNhcHR1cmUoZXJyb3IsIHRlcm1pbmFsQ2F0ZWdvcnkoZXJyb3IpLCBpZGVudGl0eSk7XG4gIH1cbn1cblxuLyoqIFRoZSBzZXJ2ZWQgZm9ybSBvZiBhIHRocm93biB2YWx1ZSBhdCBhbnkgb3RoZXIgcmVwb3J0IG9mIGEgc3RhZ2UgZmFpbHVyZSAocmV0cnksIHRocm90dGxlKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZWRTdGFnZUVycm9yKGNvbnRleHQ6IFN0YWdlQ29udGV4dCwgZXJyb3I6IHVua25vd24pOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHtcbiAgY29uc3QgcnVsZSA9IGNvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZSgpO1xuICByZXR1cm4gcnVsZSA/IHJ1bGUuc2VydmVkRXJyb3IoZXJyb3IpIDogZXh0cmFjdEVycm9ySW5mbyhlcnJvcik7XG59XG5cbi8qKiBXaGF0IHRoZSBsb2dnZXIgaXMgaGFuZGVkOiB0aGUgdGhyb3duIHZhbHVlLCBvciBpdHMgbWFza2VkIGZvcm0gd2hlbiB0aGUgcG9saWN5IG1hc2tlZCBpdHMgdGV4dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dDogU3RhZ2VDb250ZXh0LCBlcnJvcjogdW5rbm93bik6IHVua25vd24ge1xuICBjb25zdCBydWxlID0gY29udGV4dC5nZXRSZWRhY3Rpb25SdWxlKCk7XG4gIHJldHVybiBydWxlID8gcnVsZS5sb2dnYWJsZUVycm9yKGVycm9yKSA6IGVycm9yO1xufVxuXG4vKipcbiAqIEEgdG91Y2hpbmcgc3RhZ2UncyBpZGVtcG90ZW5jeSBrZXkgYXMgcmVjb3JkcyBjYXJyeSBpdCAoUDMsIGRlc2lnbiDCpzYpIOKAlCBgUmVkYWN0aW9uUnVsZSDCtyByZXRhaW5JZGVtcG90ZW5jeUtleWA6XG4gKiBzZWxlY3RlZCBieSBpdHMgbmFtZSwgYW5kIHNlcnZlZCB3aG9sZSB3aGVuIHRoZSBpbnB1dCBpdHMgcnVsZSB3YXMgaGFuZGVkIGhvbGRzIGEgc2VsZWN0ZWQga2V5IG9yIHRoZSBydWxlIHJlYWRcbiAqIGEgc2VsZWN0ZWQgc3RhdGUgdmFsdWUuIFRoZSBzdGFnZSBpdHNlbGZcbiAqIGtlZXBzIHRoZSByZWFsIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZlZElkZW1wb3RlbmN5S2V5KGNvbnRleHQ6IFN0YWdlQ29udGV4dCwga2V5OiBzdHJpbmcsIGlucHV0OiB1bmtub3duLCByZWFkU2VsZWN0ZWQgPSBmYWxzZSk6IHN0cmluZyB7XG4gIGNvbnN0IHJ1bGUgPSBjb250ZXh0LmdldFJlZGFjdGlvblJ1bGUoKTtcbiAgcmV0dXJuIHJ1bGUgPyBydWxlLnJldGFpbklkZW1wb3RlbmN5S2V5KGtleSwgeyBpbnB1dCwgc2VsZWN0ZWRSZWFkczogcmVhZFNlbGVjdGVkID8gMSA6IDAgfSkgOiBrZXk7XG59XG4iXX0=