footprintjs 4.7.0 → 4.9.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 (33) hide show
  1. package/CLAUDE.md +38 -14
  2. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +97 -90
  3. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  4. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +8 -6
  5. package/dist/esm/lib/memory/StageContext.js +2 -1
  6. package/dist/esm/lib/memory/types.js +1 -1
  7. package/dist/esm/lib/recorder/KeyedRecorder.js +56 -7
  8. package/dist/esm/lib/recorder/SequenceRecorder.js +194 -0
  9. package/dist/esm/lib/recorder/index.js +2 -1
  10. package/dist/esm/lib/scope/recorders/MetricRecorder.js +85 -82
  11. package/dist/esm/lib/scope/recorders/index.js +1 -1
  12. package/dist/esm/trace.js +10 -5
  13. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +97 -90
  14. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  15. package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -6
  16. package/dist/lib/memory/StageContext.js +2 -1
  17. package/dist/lib/memory/types.js +1 -1
  18. package/dist/lib/recorder/KeyedRecorder.js +56 -7
  19. package/dist/lib/recorder/SequenceRecorder.js +198 -0
  20. package/dist/lib/recorder/index.js +4 -2
  21. package/dist/lib/scope/recorders/MetricRecorder.js +85 -82
  22. package/dist/lib/scope/recorders/index.js +1 -1
  23. package/dist/trace.js +12 -6
  24. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +8 -18
  25. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +7 -0
  26. package/dist/types/lib/memory/types.d.ts +2 -0
  27. package/dist/types/lib/recorder/KeyedRecorder.d.ts +29 -6
  28. package/dist/types/lib/recorder/SequenceRecorder.d.ts +112 -0
  29. package/dist/types/lib/recorder/index.d.ts +1 -0
  30. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +47 -40
  31. package/dist/types/lib/scope/recorders/index.d.ts +1 -1
  32. package/dist/types/trace.d.ts +7 -3
  33. package/package.json +1 -1
@@ -236,6 +236,7 @@ class StageContext {
236
236
  getSnapshot() {
237
237
  const snapshot = {
238
238
  id: this.stageId,
239
+ runtimeStageId: this.runtimeStageId || undefined,
239
240
  name: this.stageName,
240
241
  isDecider: this.isDecider,
241
242
  isFork: this.isFork,
@@ -274,4 +275,4 @@ class StageContext {
274
275
  }
275
276
  }
276
277
  exports.StageContext = StageContext;
277
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRzs7O0FBRUgscUVBQStEO0FBRy9ELGlFQUEyRDtBQUUzRCx5Q0FBeUM7QUFFekMsTUFBYSxZQUFZO0lBb0N2QixZQUNFLEtBQWEsRUFDYixJQUFZLEVBQ1osT0FBZSxFQUNmLFlBQTBCLEVBQzFCLFFBQWlCLEVBQ2pCLFFBQW1CLEVBQ25CLFNBQW1CO1FBdENkLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFHdEIscUZBQXFGO1FBQzlFLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBY3BCLFVBQUssR0FBd0IsSUFBSSw0Q0FBbUIsRUFBRSxDQUFDO1FBRTlELGlGQUFpRjtRQUN6RSxpQkFBWSxHQUErRSxFQUFFLENBQUM7UUFFdEcsbUVBQW1FO1FBQzNELGdCQUFXLEdBQTRCLEVBQUUsQ0FBQztRQWdCaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsbUZBQW1GO0lBQ25GLG9CQUFvQjtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSx3Q0FBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsd0VBQXdFO0lBQ2hFLGFBQWEsQ0FBQyxJQUFjLEVBQUUsR0FBVztRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCwwRUFBMEU7SUFFMUUsS0FBSyxDQUFDLElBQWMsRUFBRSxHQUFXLEVBQUUsS0FBYyxFQUFFLFlBQVksR0FBRyxLQUFLO1FBQ3JFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWM7UUFDN0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQy9DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsU0FBUyxDQUNQLElBQWMsRUFDZCxHQUFXLEVBQ1gsS0FBYyxFQUNkLFlBQXNCLEVBQ3RCLFdBQW9CLEVBQ3BCLGlCQUFvQztRQUVwQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFlBQVksYUFBWixZQUFZLGNBQVosWUFBWSxHQUFJLEtBQUssQ0FBQyxDQUFDO1FBQ3BELG9FQUFvRTtRQUNwRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHO1lBQzNCLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztZQUMzRCxTQUFTLEVBQUUsaUJBQWlCLGFBQWpCLGlCQUFpQixjQUFqQixpQkFBaUIsR0FBSSxLQUFLO1NBQ3RDLENBQUM7UUFDRixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxXQUFXLEVBQUUsQ0FBQztZQUNwRixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjLEVBQUUsV0FBb0IsRUFBRSxZQUFzQjtRQUNwRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0Isb0VBQW9FO1FBQ3BFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUc7WUFDM0IsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQzNELFNBQVMsRUFBRSxRQUFRO1NBQ3BCLENBQUM7UUFDRixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM1QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFXLEVBQUUsS0FBYztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFXLEVBQUUsS0FBYyxFQUFFLFdBQW9CO1FBQ3pELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsR0FBVyxFQUFFLEtBQWM7UUFDN0MsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWdCLEVBQUUsV0FBb0I7UUFDL0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFjLEVBQUUsR0FBVyxFQUFFLEdBQTRCLEVBQUUsV0FBb0I7UUFDekYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQ1YsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ2xFLENBQUMsQ0FBQyxFQUFFLEdBQUksUUFBb0MsRUFBRSxHQUFHLEdBQUcsRUFBRTtZQUN0RCxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCwwRUFBMEU7SUFFMUUsUUFBUSxDQUFDLElBQWMsRUFBRSxHQUFZLEVBQUUsV0FBb0I7UUFDekQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDeEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxHQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sS0FBSyxHQUFHLE9BQU8sU0FBUyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvRyx3REFBd0Q7UUFDeEQsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDakUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN2RixDQUFDO1FBQ0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDtvRkFDZ0Y7SUFDaEYsY0FBYyxDQUFDLElBQWMsRUFBRSxHQUFZO1FBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBYSxDQUFDLENBQUMsQ0FBQztRQUNuRSxPQUFPLE9BQU8sU0FBUyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxRyxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQVc7UUFDakIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQVc7UUFDbkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCwwRUFBMEU7SUFFMUU7b0VBQ2dFO0lBQ2hFLGlCQUFpQixDQUNmLFFBQXlHO1FBRXpHLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNOztRQUNKLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLFlBQVksR0FBRztZQUNuQixHQUFHLE1BQU07WUFDVCxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztTQUNwQyxDQUFDO1FBRUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvRixNQUFNLGlCQUFpQixHQUFHLElBQUEsc0JBQVcsRUFBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRixNQUFNLGVBQWUsR0FBRyxJQUFBLHNCQUFXLEVBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEYsTUFBQSxJQUFJLENBQUMsUUFBUSwwQ0FBRSxNQUFNLENBQUM7WUFDcEIsR0FBRyxZQUFZO1lBQ2YsYUFBYSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM5RCxTQUFTLEVBQUUsaUJBQWlCO1lBQzVCLE9BQU8sRUFBRSxlQUFlO1NBQ3pCLENBQUMsQ0FBQztRQUVILHVEQUF1RDtRQUN2RCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVELDBFQUEwRTtJQUUxRSxVQUFVLENBQUMsSUFBWSxFQUFFLFNBQWlCLEVBQUUsT0FBZSxFQUFFLFNBQVMsR0FBRyxLQUFLO1FBQzVFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDeEcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQzFCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhLEVBQUUsUUFBZ0IsRUFBRSxTQUFpQixFQUFFLE9BQWUsRUFBRSxTQUFTLEdBQUcsS0FBSztRQUNoRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2pILEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFZLEVBQUUsU0FBaUIsRUFBRSxPQUFlO1FBQzVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCwwRUFBMEU7SUFFMUUsTUFBTSxDQUFDLEdBQVcsRUFBRSxLQUFjLEVBQUUsSUFBZTtRQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBVyxFQUFFLEtBQWMsRUFBRSxJQUFlO1FBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFXLEVBQUUsS0FBYyxFQUFFLElBQWU7UUFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQVcsRUFBRSxLQUFjLEVBQUUsSUFBZTtRQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBVyxFQUFFLEtBQWMsRUFBRSxJQUFlO1FBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFXLEVBQUUsS0FBYyxFQUFFLElBQWU7UUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQVcsRUFBRSxLQUFjLEVBQUUsSUFBZTtRQUNuRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxtQkFBbUIsQ0FDakIsSUFBcUIsRUFDckIsV0FBbUIsRUFDbkIsT0FBcUc7UUFFckcsTUFBTSxXQUFXLEdBQWdCLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7UUFDMUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELDBFQUEwRTtJQUUxRSxVQUFVO1FBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzVELE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsV0FBVztRQUNULE1BQU0sUUFBUSxHQUFrQjtZQUM5QixFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDaEIsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3BCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtZQUMzQixNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZO1lBQy9CLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7WUFDakMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztTQUM5QixDQUFDO1FBQ0YsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUMsa0VBQWtFO1lBQ2xFLE1BQU0sTUFBTSxHQUE0QixFQUFFLENBQUM7WUFDM0MsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQzNELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzFCLENBQUM7WUFDRCxRQUFRLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZCxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0Y7QUEvVkQsb0NBK1ZDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFnZUNvbnRleHQg4oCUIEV4ZWN1dGlvbiBjb250ZXh0IGZvciBhIHNpbmdsZSBzdGFnZSBpbiBhIGZsb3djaGFydCBydW5cbiAqXG4gKiBMaWtlIGEgc3RhY2sgZnJhbWUgaW4gYSBjb21waWxlci9ydW50aW1lOlxuICogLSBSZWZlcmVuY2UgdG8gU2hhcmVkTWVtb3J5IChhY2Nlc3NpbmcgaGVhcCBtZW1vcnkpXG4gKiAtIFRyYW5zYWN0aW9uQnVmZmVyIGZvciBzdGFnaW5nIG11dGF0aW9ucyAodHJhbnNhY3Rpb24gYnVmZmVyKVxuICogLSBMaW5rcyB0byBwYXJlbnQvY2hpbGQvbmV4dCBjb250ZXh0cyAoY2FsbCBzdGFjayBmcmFtZXMpXG4gKiAtIERpYWdub3N0aWNDb2xsZWN0b3IgZm9yIGxvZ3MsIGVycm9ycywgbWV0cmljc1xuICovXG5cbmltcG9ydCB7IERpYWdub3N0aWNDb2xsZWN0b3IgfSBmcm9tICcuL0RpYWdub3N0aWNDb2xsZWN0b3IuanMnO1xuaW1wb3J0IHsgRXZlbnRMb2cgfSBmcm9tICcuL0V2ZW50TG9nLmpzJztcbmltcG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4vU2hhcmVkTWVtb3J5LmpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVmZmVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkJ1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dDb250cm9sVHlwZSwgRmxvd01lc3NhZ2UsIFN0YWdlU25hcHNob3QgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHJlZGFjdFBhdGNoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBTdGFnZUNvbnRleHQge1xuICBwcml2YXRlIHNoYXJlZE1lbW9yeTogU2hhcmVkTWVtb3J5O1xuICBwcml2YXRlIGJ1ZmZlcj86IFRyYW5zYWN0aW9uQnVmZmVyO1xuICBwcml2YXRlIGV2ZW50TG9nPzogRXZlbnRMb2c7XG5cbiAgcHVibGljIHN0YWdlTmFtZSA9ICcnO1xuICAvKiogVW5pcXVlIHN0YWdlIGlkZW50aWZpZXIgZnJvbSB0aGUgYnVpbGRlciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBwdWJsaWMgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBTZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBzdGFnZSBleGVjdXRpb24uICovXG4gIHB1YmxpYyBydW50aW1lU3RhZ2VJZCA9ICcnO1xuICBwdWJsaWMgcnVuSWQ6IHN0cmluZztcbiAgcHVibGljIGJyYW5jaElkPzogc3RyaW5nO1xuICBwdWJsaWMgaXNEZWNpZGVyOiBib29sZWFuO1xuICBwdWJsaWMgaXNGb3JrOiBib29sZWFuO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZnJvbSBidWlsZGVyIChzZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBleGVjdXRpb24pLiAqL1xuICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIgKHNldCBieSB0cmF2ZXJzZXIgd2hlbiB0aGlzIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludCkuICovXG4gIHB1YmxpYyBzdWJmbG93SWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHBhcmVudD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIG5leHQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBjaGlsZHJlbj86IFN0YWdlQ29udGV4dFtdO1xuXG4gIHB1YmxpYyBkZWJ1ZzogRGlhZ25vc3RpY0NvbGxlY3RvciA9IG5ldyBEaWFnbm9zdGljQ29sbGVjdG9yKCk7XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHdyaXRlcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldyBhbmQgb25Db21taXQuICovXG4gIHByaXZhdGUgX3N0YWdlV3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiA9IHt9O1xuXG4gIC8qKiBUcmFja3MgdXNlci1sZXZlbCByZWFkcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VSZWFkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKiogT2JzZXJ2ZXIgY2FsbGVkIGFmdGVyIGNvbW1pdCgpIOKAlCB1c2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGZpcmUgUmVjb3JkZXIub25Db21taXQuICovXG4gIHByaXZhdGUgX2NvbW1pdE9ic2VydmVyPzogKFxuICAgIG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4sXG4gICkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdGFnZUlkOiBzdHJpbmcsXG4gICAgc2hhcmVkTWVtb3J5OiBTaGFyZWRNZW1vcnksXG4gICAgYnJhbmNoSWQ/OiBzdHJpbmcsXG4gICAgZXZlbnRMb2c/OiBFdmVudExvZyxcbiAgICBpc0RlY2lkZXI/OiBib29sZWFuLFxuICApIHtcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gICAgdGhpcy5zdGFnZU5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc3RhZ2VJZCA9IHN0YWdlSWQ7XG4gICAgdGhpcy5zaGFyZWRNZW1vcnkgPSBzaGFyZWRNZW1vcnk7XG4gICAgdGhpcy5icmFuY2hJZCA9IGJyYW5jaElkO1xuICAgIHRoaXMuZXZlbnRMb2cgPSBldmVudExvZztcbiAgICB0aGlzLmlzRGVjaWRlciA9ICEhaXNEZWNpZGVyO1xuICAgIHRoaXMuaXNGb3JrID0gZmFsc2U7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgU2hhcmVkTWVtb3J5IGluc3RhbmNlIChuZWVkZWQgYnkgc2NvcGUgbGF5ZXIpLiAqL1xuICBnZXRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnk7XG4gIH1cblxuICAvKiogTGF6aWx5IGNyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciAocGF5IGNsb25lIGNvc3Qgb25seSBpZiBzdGFnZSB3cml0ZXMpLiAqL1xuICBnZXRUcmFuc2FjdGlvbkJ1ZmZlcigpOiBUcmFuc2FjdGlvbkJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLmJ1ZmZlcikge1xuICAgICAgdGhpcy5idWZmZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWZmZXIodGhpcy5zaGFyZWRNZW1vcnkuZ2V0U3RhdGUoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJ1ZmZlcjtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgYW4gYWJzb2x1dGUgcGF0aCBpbnNpZGUgdGhlIHNoYXJlZCBtZW1vcnkgKHJ1biBuYW1lc3BhY2UpLiAqL1xuICBwcml2YXRlIHdpdGhOYW1lc3BhY2UocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5ydW5JZCB8fCB0aGlzLnJ1bklkID09PSAnJykge1xuICAgICAgcmV0dXJuIFsuLi5wYXRoLCBrZXldO1xuICAgIH1cbiAgICByZXR1cm4gWydydW5zJywgdGhpcy5ydW5JZCwgLi4ucGF0aCwga2V5XTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXcml0ZSBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBhdGNoKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdCA9IGZhbHNlKSB7XG4gICAgdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpLnNldCh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5KSwgdmFsdWUsIHNob3VsZFJlZGFjdCk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2gocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBtZXJnZShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpLm1lcmdlKHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkpLCB2YWx1ZSk7XG4gIH1cblxuICBzZXRPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcGVyYXRpb25PdmVycmlkZT86ICdzZXQnIHwgJ2RlbGV0ZScsXG4gICkge1xuICAgIHRoaXMucGF0Y2gocGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0ID8/IGZhbHNlKTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdFxuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG4gICAgdGhpcy5fc3RhZ2VXcml0ZXNbdXNlcktleV0gPSB7XG4gICAgICB2YWx1ZTogc2hvdWxkUmVkYWN0ID8gJ1tSRURBQ1RFRF0nIDogc3RydWN0dXJlZENsb25lKHZhbHVlKSxcbiAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uT3ZlcnJpZGUgPz8gJ3NldCcsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IHRhZ2dlZCA9IGRlc2NyaXB0aW9uLnN0YXJ0c1dpdGgoJ1snKSA/IGRlc2NyaXB0aW9uIDogYFtXUklURV0gJHtkZXNjcmlwdGlvbn1gO1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCB0YWdnZWQpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZU9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZywgc2hvdWxkUmVkYWN0PzogYm9vbGVhbikge1xuICAgIHRoaXMubWVyZ2UocGF0aCwga2V5LCB2YWx1ZSk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXRcbiAgICBjb25zdCB1c2VyS2V5ID0gcGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5O1xuICAgIHRoaXMuX3N0YWdlV3JpdGVzW3VzZXJLZXldID0ge1xuICAgICAgdmFsdWU6IHNob3VsZFJlZGFjdCA/ICdbUkVEQUNURURdJyA6IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSksXG4gICAgICBvcGVyYXRpb246ICd1cGRhdGUnLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICBzZXRSb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2goW10sIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCkuc2V0KFtrZXldLCB2YWx1ZSk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVHbG9iYWxDb250ZXh0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKS5zZXQoW2tleV0sIHZhbHVlKTtcbiAgfVxuXG4gIGFwcGVuZFRvQXJyYXkocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCBpdGVtczogdW5rbm93bltdLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5nZXRWYWx1ZShwYXRoLCBrZXkpO1xuICAgIGNvbnN0IG1lcmdlZCA9IEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpID8gWy4uLmV4aXN0aW5nLCAuLi5pdGVtc10gOiBbLi4uaXRlbXNdO1xuICAgIHRoaXMuc2V0T2JqZWN0KHBhdGgsIGtleSwgbWVyZ2VkLCBmYWxzZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgbWVyZ2VPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5nZXRWYWx1ZShwYXRoLCBrZXkpO1xuICAgIGNvbnN0IG1lcmdlZCA9XG4gICAgICBleGlzdGluZyAmJiB0eXBlb2YgZXhpc3RpbmcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGV4aXN0aW5nKVxuICAgICAgICA/IHsgLi4uKGV4aXN0aW5nIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSwgLi4ub2JqIH1cbiAgICAgICAgOiB7IC4uLm9iaiB9O1xuICAgIHRoaXMuc2V0T2JqZWN0KHBhdGgsIGtleSwgbWVyZ2VkLCBmYWxzZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlYWQgb3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXRWYWx1ZShwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTtcbiAgICBjb25zdCBmcm9tUGF0Y2ggPSBidWYuZ2V0KHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkgYXMgc3RyaW5nKSk7XG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgZnJvbVBhdGNoICE9PSAndW5kZWZpbmVkJyA/IGZyb21QYXRjaCA6IHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKHRoaXMucnVuSWQsIHBhdGgsIGtleSk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCByZWFkIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXdcbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHVzZXJLZXkgPSBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG4gICAgICB0aGlzLl9zdGFnZVJlYWRzW3VzZXJLZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBgW1JFQURdICR7ZGVzY3JpcHRpb259YCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgdHJhY2tpbmcgaW4gX3N0YWdlUmVhZHMgb3IgcGF5aW5nIHN0cnVjdHVyZWRDbG9uZSBjb3N0LlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZS5nZXRWYWx1ZVNpbGVudCgpIGZvciBhcnJheSBwcm94eSBpbnRlcm5hbCBvcGVyYXRpb25zLiAqL1xuICBnZXRWYWx1ZURpcmVjdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgYnVmID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpO1xuICAgIGNvbnN0IGZyb21QYXRjaCA9IGJ1Zi5nZXQodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSBhcyBzdHJpbmcpKTtcbiAgICByZXR1cm4gdHlwZW9mIGZyb21QYXRjaCAhPT0gJ3VuZGVmaW5lZCcgPyBmcm9tUGF0Y2ggOiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRWYWx1ZSh0aGlzLnJ1bklkLCBwYXRoLCBrZXkpO1xuICB9XG5cbiAgZ2V0Um9vdChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRWYWx1ZSh0aGlzLnJ1bklkLCBbXSwga2V5KTtcbiAgfVxuXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRWYWx1ZSgnJywgW10sIGtleSk7XG4gIH1cblxuICBnZXRTY29wZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFN0YXRlKCk7XG4gIH1cblxuICBnZXRSdW5JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIENvbW1pdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgdGhhdCBmaXJlcyBhZnRlciBjb21taXQoKSBhcHBsaWVzIHBhdGNoZXMuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGRpc3BhdGNoIFJlY29yZGVyLm9uQ29tbWl0IGV2ZW50cy4gKi9cbiAgc2V0Q29tbWl0T2JzZXJ2ZXIoXG4gICAgb2JzZXJ2ZXI6IChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9jb21taXRPYnNlcnZlciA9IG9ic2VydmVyO1xuICB9XG5cbiAgY29tbWl0KCk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTtcbiAgICBjb25zdCBidW5kbGUgPSBidWYuY29tbWl0KCk7XG4gICAgY29uc3QgY29tbWl0QnVuZGxlID0ge1xuICAgICAgLi4uYnVuZGxlLFxuICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgfTtcblxuICAgIHRoaXMuc2hhcmVkTWVtb3J5LmFwcGx5UGF0Y2goY29tbWl0QnVuZGxlLm92ZXJ3cml0ZSwgY29tbWl0QnVuZGxlLnVwZGF0ZXMsIGNvbW1pdEJ1bmRsZS50cmFjZSk7XG5cbiAgICBjb25zdCByZWRhY3RlZE92ZXJ3cml0ZSA9IHJlZGFjdFBhdGNoKGNvbW1pdEJ1bmRsZS5vdmVyd3JpdGUsIGNvbW1pdEJ1bmRsZS5yZWRhY3RlZFBhdGhzKTtcbiAgICBjb25zdCByZWRhY3RlZFVwZGF0ZXMgPSByZWRhY3RQYXRjaChjb21taXRCdW5kbGUudXBkYXRlcywgY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMpO1xuICAgIHRoaXMuZXZlbnRMb2c/LnJlY29yZCh7XG4gICAgICAuLi5jb21taXRCdW5kbGUsXG4gICAgICByZWRhY3RlZFBhdGhzOiBBcnJheS5mcm9tKGNvbW1pdEJ1bmRsZS5yZWRhY3RlZFBhdGhzLnZhbHVlcygpKSxcbiAgICAgIG92ZXJ3cml0ZTogcmVkYWN0ZWRPdmVyd3JpdGUsXG4gICAgICB1cGRhdGVzOiByZWRhY3RlZFVwZGF0ZXMsXG4gICAgfSk7XG5cbiAgICAvLyBOb3RpZnkgb2JzZXJ2ZXIgKFNjb3BlRmFjYWRlKSB3aXRoIHRyYWNrZWQgbXV0YXRpb25zXG4gICAgaWYgKHRoaXMuX2NvbW1pdE9ic2VydmVyKSB7XG4gICAgICB0aGlzLl9jb21taXRPYnNlcnZlcih7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBUcmVlIG5hdmlnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgY3JlYXRlTmV4dChwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMubmV4dCkge1xuICAgICAgdGhpcy5uZXh0ID0gbmV3IFN0YWdlQ29udGV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMuc2hhcmVkTWVtb3J5LCAnJywgdGhpcy5ldmVudExvZywgaXNEZWNpZGVyKTtcbiAgICAgIHRoaXMubmV4dC5wYXJlbnQgPSB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZXh0O1xuICB9XG5cbiAgY3JlYXRlQ2hpbGQocnVuSWQ6IHN0cmluZywgYnJhbmNoSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5jaGlsZHJlbikge1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IG5ldyBTdGFnZUNvbnRleHQocnVuSWQsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5zaGFyZWRNZW1vcnksIGJyYW5jaElkLCB0aGlzLmV2ZW50TG9nLCBpc0RlY2lkZXIpO1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICBjcmVhdGVEZWNpZGVyKHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRydWUpO1xuICB9XG5cbiAgc2V0QXNEZWNpZGVyKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QXNGb3JrKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0ZvcmsgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERpYWdub3N0aWNzIGRlbGVnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYWRkTG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0RXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0RXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEVycm9yKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFcnJvcihrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgdHlwZTogRmxvd0NvbnRyb2xUeXBlLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgdGFyZ2V0U3RhZ2U/OiBzdHJpbmcgfCBzdHJpbmdbXTsgcmF0aW9uYWxlPzogc3RyaW5nOyBjb3VudD86IG51bWJlcjsgaXRlcmF0aW9uPzogbnVtYmVyIH0sXG4gICkge1xuICAgIGNvbnN0IGZsb3dNZXNzYWdlOiBGbG93TWVzc2FnZSA9IHsgdHlwZSwgZGVzY3JpcHRpb24sIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgLi4ub3B0aW9ucyB9O1xuICAgIHRoaXMuZGVidWcuYWRkRmxvd01lc3NhZ2UoZmxvd01lc3NhZ2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNuYXBzaG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldFN0YWdlSWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucnVuSWQgfHwgdGhpcy5ydW5JZCA9PT0gJycpIHJldHVybiB0aGlzLnN0YWdlTmFtZTtcbiAgICByZXR1cm4gYCR7dGhpcy5ydW5JZH0uJHt0aGlzLnN0YWdlTmFtZX1gO1xuICB9XG5cbiAgZ2V0U25hcHNob3QoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3Q6IFN0YWdlU25hcHNob3QgPSB7XG4gICAgICBpZDogdGhpcy5zdGFnZUlkLFxuICAgICAgbmFtZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBpc0RlY2lkZXI6IHRoaXMuaXNEZWNpZGVyLFxuICAgICAgaXNGb3JrOiB0aGlzLmlzRm9yayxcbiAgICAgIGxvZ3M6IHRoaXMuZGVidWcubG9nQ29udGV4dCxcbiAgICAgIGVycm9yczogdGhpcy5kZWJ1Zy5lcnJvckNvbnRleHQsXG4gICAgICBtZXRyaWNzOiB0aGlzLmRlYnVnLm1ldHJpY0NvbnRleHQsXG4gICAgICBldmFsczogdGhpcy5kZWJ1Zy5ldmFsQ29udGV4dCxcbiAgICB9O1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVdyaXRlcykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gRXh0cmFjdCB2YWx1ZXMgb25seSBmb3IgdGhlIHNuYXBzaG90IChzdHJpcCBvcGVyYXRpb24gbWV0YWRhdGEpXG4gICAgICBjb25zdCB3cml0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fc3RhZ2VXcml0ZXMpKSB7XG4gICAgICAgIHdyaXRlc1trXSA9IGVudHJ5LnZhbHVlO1xuICAgICAgfVxuICAgICAgc25hcHNob3Quc3RhZ2VXcml0ZXMgPSB3cml0ZXM7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVJlYWRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5zdGFnZVJlYWRzID0gdGhpcy5fc3RhZ2VSZWFkcztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgIHNuYXBzaG90LmRlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3ViZmxvd0lkKSB7XG4gICAgICBzbmFwc2hvdC5zdWJmbG93SWQgPSB0aGlzLnN1YmZsb3dJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LmZsb3dNZXNzYWdlcyA9IHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzO1xuICAgIH1cbiAgICBpZiAodGhpcy5uZXh0KSB7XG4gICAgICBzbmFwc2hvdC5uZXh0ID0gdGhpcy5uZXh0LmdldFNuYXBzaG90KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBzbmFwc2hvdC5jaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4ubWFwKChjKSA9PiBjLmdldFNuYXBzaG90KCkpO1xuICAgIH1cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cbn1cbiJdfQ==
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRzs7O0FBRUgscUVBQStEO0FBRy9ELGlFQUEyRDtBQUUzRCx5Q0FBeUM7QUFFekMsTUFBYSxZQUFZO0lBb0N2QixZQUNFLEtBQWEsRUFDYixJQUFZLEVBQ1osT0FBZSxFQUNmLFlBQTBCLEVBQzFCLFFBQWlCLEVBQ2pCLFFBQW1CLEVBQ25CLFNBQW1CO1FBdENkLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFHdEIscUZBQXFGO1FBQzlFLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBY3BCLFVBQUssR0FBd0IsSUFBSSw0Q0FBbUIsRUFBRSxDQUFDO1FBRTlELGlGQUFpRjtRQUN6RSxpQkFBWSxHQUErRSxFQUFFLENBQUM7UUFFdEcsbUVBQW1FO1FBQzNELGdCQUFXLEdBQTRCLEVBQUUsQ0FBQztRQWdCaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsbUZBQW1GO0lBQ25GLG9CQUFvQjtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSx3Q0FBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsd0VBQXdFO0lBQ2hFLGFBQWEsQ0FBQyxJQUFjLEVBQUUsR0FBVztRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCwwRUFBMEU7SUFFMUUsS0FBSyxDQUFDLElBQWMsRUFBRSxHQUFXLEVBQUUsS0FBYyxFQUFFLFlBQVksR0FBRyxLQUFLO1FBQ3JFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWM7UUFDN0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQy9DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsU0FBUyxDQUNQLElBQWMsRUFDZCxHQUFXLEVBQ1gsS0FBYyxFQUNkLFlBQXNCLEVBQ3RCLFdBQW9CLEVBQ3BCLGlCQUFvQztRQUVwQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFlBQVksYUFBWixZQUFZLGNBQVosWUFBWSxHQUFJLEtBQUssQ0FBQyxDQUFDO1FBQ3BELG9FQUFvRTtRQUNwRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHO1lBQzNCLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztZQUMzRCxTQUFTLEVBQUUsaUJBQWlCLGFBQWpCLGlCQUFpQixjQUFqQixpQkFBaUIsR0FBSSxLQUFLO1NBQ3RDLENBQUM7UUFDRixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxXQUFXLEVBQUUsQ0FBQztZQUNwRixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjLEVBQUUsV0FBb0IsRUFBRSxZQUFzQjtRQUNwRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0Isb0VBQW9FO1FBQ3BFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUc7WUFDM0IsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQzNELFNBQVMsRUFBRSxRQUFRO1NBQ3BCLENBQUM7UUFDRixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM1QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFXLEVBQUUsS0FBYztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFXLEVBQUUsS0FBYyxFQUFFLFdBQW9CO1FBQ3pELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsR0FBVyxFQUFFLEtBQWM7UUFDN0MsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWdCLEVBQUUsV0FBb0I7UUFDL0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFjLEVBQUUsR0FBVyxFQUFFLEdBQTRCLEVBQUUsV0FBb0I7UUFDekYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQ1YsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ2xFLENBQUMsQ0FBQyxFQUFFLEdBQUksUUFBb0MsRUFBRSxHQUFHLEdBQUcsRUFBRTtZQUN0RCxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCwwRUFBMEU7SUFFMUUsUUFBUSxDQUFDLElBQWMsRUFBRSxHQUFZLEVBQUUsV0FBb0I7UUFDekQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDeEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxHQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sS0FBSyxHQUFHLE9BQU8sU0FBUyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvRyx3REFBd0Q7UUFDeEQsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDakUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN2RixDQUFDO1FBQ0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDtvRkFDZ0Y7SUFDaEYsY0FBYyxDQUFDLElBQWMsRUFBRSxHQUFZO1FBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBYSxDQUFDLENBQUMsQ0FBQztRQUNuRSxPQUFPLE9BQU8sU0FBUyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxRyxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQVc7UUFDakIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQVc7UUFDbkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCwwRUFBMEU7SUFFMUU7b0VBQ2dFO0lBQ2hFLGlCQUFpQixDQUNmLFFBQXlHO1FBRXpHLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNOztRQUNKLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixNQUFNLFlBQVksR0FBRztZQUNuQixHQUFHLE1BQU07WUFDVCxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztTQUNwQyxDQUFDO1FBRUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvRixNQUFNLGlCQUFpQixHQUFHLElBQUEsc0JBQVcsRUFBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRixNQUFNLGVBQWUsR0FBRyxJQUFBLHNCQUFXLEVBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEYsTUFBQSxJQUFJLENBQUMsUUFBUSwwQ0FBRSxNQUFNLENBQUM7WUFDcEIsR0FBRyxZQUFZO1lBQ2YsYUFBYSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM5RCxTQUFTLEVBQUUsaUJBQWlCO1lBQzVCLE9BQU8sRUFBRSxlQUFlO1NBQ3pCLENBQUMsQ0FBQztRQUVILHVEQUF1RDtRQUN2RCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVELDBFQUEwRTtJQUUxRSxVQUFVLENBQUMsSUFBWSxFQUFFLFNBQWlCLEVBQUUsT0FBZSxFQUFFLFNBQVMsR0FBRyxLQUFLO1FBQzVFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDeEcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQzFCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhLEVBQUUsUUFBZ0IsRUFBRSxTQUFpQixFQUFFLE9BQWUsRUFBRSxTQUFTLEdBQUcsS0FBSztRQUNoRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2pILEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFZLEVBQUUsU0FBaUIsRUFBRSxPQUFlO1FBQzVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCwwRUFBMEU7SUFFMUUsTUFBTSxDQUFDLEdBQVcsRUFBRSxLQUFjLEVBQUUsSUFBZTtRQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBVyxFQUFFLEtBQWMsRUFBRSxJQUFlO1FBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFXLEVBQUUsS0FBYyxFQUFFLElBQWU7UUFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQVcsRUFBRSxLQUFjLEVBQUUsSUFBZTtRQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBVyxFQUFFLEtBQWMsRUFBRSxJQUFlO1FBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFXLEVBQUUsS0FBYyxFQUFFLElBQWU7UUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQVcsRUFBRSxLQUFjLEVBQUUsSUFBZTtRQUNuRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxtQkFBbUIsQ0FDakIsSUFBcUIsRUFDckIsV0FBbUIsRUFDbkIsT0FBcUc7UUFFckcsTUFBTSxXQUFXLEdBQWdCLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7UUFDMUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELDBFQUEwRTtJQUUxRSxVQUFVO1FBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzVELE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsV0FBVztRQUNULE1BQU0sUUFBUSxHQUFrQjtZQUM5QixFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDaEIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLElBQUksU0FBUztZQUNoRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVk7WUFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtZQUNqQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO1NBQzlCLENBQUM7UUFDRixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxrRUFBa0U7WUFDbEUsTUFBTSxNQUFNLEdBQTRCLEVBQUUsQ0FBQztZQUMzQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDMUIsQ0FBQztZQUNELFFBQVEsQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxRQUFRLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ2xELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNkLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRjtBQWhXRCxvQ0FnV0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWdlQ29udGV4dCDigJQgRXhlY3V0aW9uIGNvbnRleHQgZm9yIGEgc2luZ2xlIHN0YWdlIGluIGEgZmxvd2NoYXJ0IHJ1blxuICpcbiAqIExpa2UgYSBzdGFjayBmcmFtZSBpbiBhIGNvbXBpbGVyL3J1bnRpbWU6XG4gKiAtIFJlZmVyZW5jZSB0byBTaGFyZWRNZW1vcnkgKGFjY2Vzc2luZyBoZWFwIG1lbW9yeSlcbiAqIC0gVHJhbnNhY3Rpb25CdWZmZXIgZm9yIHN0YWdpbmcgbXV0YXRpb25zICh0cmFuc2FjdGlvbiBidWZmZXIpXG4gKiAtIExpbmtzIHRvIHBhcmVudC9jaGlsZC9uZXh0IGNvbnRleHRzIChjYWxsIHN0YWNrIGZyYW1lcylcbiAqIC0gRGlhZ25vc3RpY0NvbGxlY3RvciBmb3IgbG9ncywgZXJyb3JzLCBtZXRyaWNzXG4gKi9cblxuaW1wb3J0IHsgRGlhZ25vc3RpY0NvbGxlY3RvciB9IGZyb20gJy4vRGlhZ25vc3RpY0NvbGxlY3Rvci5qcyc7XG5pbXBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWZmZXIgfSBmcm9tICcuL1RyYW5zYWN0aW9uQnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd0NvbnRyb2xUeXBlLCBGbG93TWVzc2FnZSwgU3RhZ2VTbmFwc2hvdCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgcmVkYWN0UGF0Y2ggfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNsYXNzIFN0YWdlQ29udGV4dCB7XG4gIHByaXZhdGUgc2hhcmVkTWVtb3J5OiBTaGFyZWRNZW1vcnk7XG4gIHByaXZhdGUgYnVmZmVyPzogVHJhbnNhY3Rpb25CdWZmZXI7XG4gIHByaXZhdGUgZXZlbnRMb2c/OiBFdmVudExvZztcblxuICBwdWJsaWMgc3RhZ2VOYW1lID0gJyc7XG4gIC8qKiBVbmlxdWUgc3RhZ2UgaWRlbnRpZmllciBmcm9tIHRoZSBidWlsZGVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHB1YmxpYyBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIFNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIHN0YWdlIGV4ZWN1dGlvbi4gKi9cbiAgcHVibGljIHJ1bnRpbWVTdGFnZUlkID0gJyc7XG4gIHB1YmxpYyBydW5JZDogc3RyaW5nO1xuICBwdWJsaWMgYnJhbmNoSWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBpc0RlY2lkZXI6IGJvb2xlYW47XG4gIHB1YmxpYyBpc0Zvcms6IGJvb2xlYW47XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBmcm9tIGJ1aWxkZXIgKHNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIGV4ZWN1dGlvbikuICovXG4gIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN1YmZsb3cgaWRlbnRpZmllciAoc2V0IGJ5IHRyYXZlcnNlciB3aGVuIHRoaXMgaXMgYSBzdWJmbG93IGVudHJ5IHBvaW50KS4gKi9cbiAgcHVibGljIHN1YmZsb3dJZD86IHN0cmluZztcblxuICBwdWJsaWMgcGFyZW50PzogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgbmV4dD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIGNoaWxkcmVuPzogU3RhZ2VDb250ZXh0W107XG5cbiAgcHVibGljIGRlYnVnOiBEaWFnbm9zdGljQ29sbGVjdG9yID0gbmV3IERpYWdub3N0aWNDb2xsZWN0b3IoKTtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgd3JpdGVzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3IGFuZCBvbkNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VXcml0ZXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+ID0ge307XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHJlYWRzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3LiAqL1xuICBwcml2YXRlIF9zdGFnZVJlYWRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIC8qKiBPYnNlcnZlciBjYWxsZWQgYWZ0ZXIgY29tbWl0KCkg4oCUIHVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZmlyZSBSZWNvcmRlci5vbkNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfY29tbWl0T2JzZXJ2ZXI/OiAoXG4gICAgbXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PixcbiAgKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgICBzaGFyZWRNZW1vcnk6IFNoYXJlZE1lbW9yeSxcbiAgICBicmFuY2hJZD86IHN0cmluZyxcbiAgICBldmVudExvZz86IEV2ZW50TG9nLFxuICAgIGlzRGVjaWRlcj86IGJvb2xlYW4sXG4gICkge1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgICB0aGlzLnN0YWdlTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdGFnZUlkID0gc3RhZ2VJZDtcbiAgICB0aGlzLnNoYXJlZE1lbW9yeSA9IHNoYXJlZE1lbW9yeTtcbiAgICB0aGlzLmJyYW5jaElkID0gYnJhbmNoSWQ7XG4gICAgdGhpcy5ldmVudExvZyA9IGV2ZW50TG9nO1xuICAgIHRoaXMuaXNEZWNpZGVyID0gISFpc0RlY2lkZXI7XG4gICAgdGhpcy5pc0ZvcmsgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBTaGFyZWRNZW1vcnkgaW5zdGFuY2UgKG5lZWRlZCBieSBzY29wZSBsYXllcikuICovXG4gIGdldFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeTtcbiAgfVxuXG4gIC8qKiBMYXppbHkgY3JlYXRlcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyIChwYXkgY2xvbmUgY29zdCBvbmx5IGlmIHN0YWdlIHdyaXRlcykuICovXG4gIGdldFRyYW5zYWN0aW9uQnVmZmVyKCk6IFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuYnVmZmVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBUcmFuc2FjdGlvbkJ1ZmZlcih0aGlzLnNoYXJlZE1lbW9yeS5nZXRTdGF0ZSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9XG5cbiAgLyoqIEJ1aWxkcyBhbiBhYnNvbHV0ZSBwYXRoIGluc2lkZSB0aGUgc2hhcmVkIG1lbW9yeSAocnVuIG5hbWVzcGFjZSkuICovXG4gIHByaXZhdGUgd2l0aE5hbWVzcGFjZShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLnJ1bklkIHx8IHRoaXMucnVuSWQgPT09ICcnKSB7XG4gICAgICByZXR1cm4gWy4uLnBhdGgsIGtleV07XG4gICAgfVxuICAgIHJldHVybiBbJ3J1bnMnLCB0aGlzLnJ1bklkLCAuLi5wYXRoLCBrZXldO1xuICB9XG5cbiAgLy8g4pSA4pSAIFdyaXRlIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcGF0Y2gocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpIHtcbiAgICB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCkuc2V0KHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkpLCB2YWx1ZSwgc2hvdWxkUmVkYWN0KTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIG1lcmdlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCkubWVyZ2UodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSksIHZhbHVlKTtcbiAgfVxuXG4gIHNldE9iamVjdChcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBzaG91bGRSZWRhY3Q/OiBib29sZWFuLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wZXJhdGlvbk92ZXJyaWRlPzogJ3NldCcgfCAnZGVsZXRlJyxcbiAgKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QgPz8gZmFsc2UpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0XG4gICAgY29uc3QgdXNlcktleSA9IHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleTtcbiAgICB0aGlzLl9zdGFnZVdyaXRlc1t1c2VyS2V5XSA9IHtcbiAgICAgIHZhbHVlOiBzaG91bGRSZWRhY3QgPyAnW1JFREFDVEVEXScgOiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpLFxuICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25PdmVycmlkZSA/PyAnc2V0JyxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdGFnZ2VkID0gZGVzY3JpcHRpb24uc3RhcnRzV2l0aCgnWycpID8gZGVzY3JpcHRpb24gOiBgW1dSSVRFXSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIHRhZ2dlZCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlT2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuKSB7XG4gICAgdGhpcy5tZXJnZShwYXRoLCBrZXksIHZhbHVlKTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdFxuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG4gICAgdGhpcy5fc3RhZ2VXcml0ZXNbdXNlcktleV0gPSB7XG4gICAgICB2YWx1ZTogc2hvdWxkUmVkYWN0ID8gJ1tSRURBQ1RFRF0nIDogc3RydWN0dXJlZENsb25lKHZhbHVlKSxcbiAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHNldFJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChbXSwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBzZXRHbG9iYWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKS5zZXQoW2tleV0sIHZhbHVlKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUdsb2JhbENvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpLnNldChba2V5XSwgdmFsdWUpO1xuICB9XG5cbiAgYXBwZW5kVG9BcnJheShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIGl0ZW1zOiB1bmtub3duW10sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID0gQXJyYXkuaXNBcnJheShleGlzdGluZykgPyBbLi4uZXhpc3RpbmcsIC4uLml0ZW1zXSA6IFsuLi5pdGVtc107XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBtZXJnZU9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID1cbiAgICAgIGV4aXN0aW5nICYmIHR5cGVvZiBleGlzdGluZyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZXhpc3RpbmcpXG4gICAgICAgID8geyAuLi4oZXhpc3RpbmcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLCAuLi5vYmogfVxuICAgICAgICA6IHsgLi4ub2JqIH07XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZCBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldFZhbHVlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVmID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpO1xuICAgIGNvbnN0IGZyb21QYXRjaCA9IGJ1Zi5nZXQodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSBhcyBzdHJpbmcpKTtcbiAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBmcm9tUGF0Y2ggIT09ICd1bmRlZmluZWQnID8gZnJvbVBhdGNoIDogdGhpcy5zaGFyZWRNZW1vcnkuZ2V0VmFsdWUodGhpcy5ydW5JZCwgcGF0aCwga2V5KTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHJlYWQgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlld1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdXNlcktleSA9IHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleTtcbiAgICAgIHRoaXMuX3N0YWdlUmVhZHNbdXNlcktleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gc3RydWN0dXJlZENsb25lKHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGBbUkVBRF0gJHtkZXNjcmlwdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCB0cmFja2luZyBpbiBfc3RhZ2VSZWFkcyBvciBwYXlpbmcgc3RydWN0dXJlZENsb25lIGNvc3QuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlLmdldFZhbHVlU2lsZW50KCkgZm9yIGFycmF5IHByb3h5IGludGVybmFsIG9wZXJhdGlvbnMuICovXG4gIGdldFZhbHVlRGlyZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBjb25zdCBidWYgPSB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCk7XG4gICAgY29uc3QgZnJvbVBhdGNoID0gYnVmLmdldCh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5IGFzIHN0cmluZykpO1xuICAgIHJldHVybiB0eXBlb2YgZnJvbVBhdGNoICE9PSAndW5kZWZpbmVkJyA/IGZyb21QYXRjaCA6IHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKHRoaXMucnVuSWQsIHBhdGgsIGtleSk7XG4gIH1cblxuICBnZXRSb290KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKHRoaXMucnVuSWQsIFtdLCBrZXkpO1xuICB9XG5cbiAgZ2V0R2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKCcnLCBbXSwga2V5KTtcbiAgfVxuXG4gIGdldFNjb3BlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0U3RhdGUoKTtcbiAgfVxuXG4gIGdldFJ1bklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgQ29tbWl0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZWdpc3RlciBhbiBvYnNlcnZlciB0aGF0IGZpcmVzIGFmdGVyIGNvbW1pdCgpIGFwcGxpZXMgcGF0Y2hlcy5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZGlzcGF0Y2ggUmVjb3JkZXIub25Db21taXQgZXZlbnRzLiAqL1xuICBzZXRDb21taXRPYnNlcnZlcihcbiAgICBvYnNlcnZlcjogKG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4pID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyID0gb2JzZXJ2ZXI7XG4gIH1cblxuICBjb21taXQoKTogdm9pZCB7XG4gICAgY29uc3QgYnVmID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpO1xuICAgIGNvbnN0IGJ1bmRsZSA9IGJ1Zi5jb21taXQoKTtcbiAgICBjb25zdCBjb21taXRCdW5kbGUgPSB7XG4gICAgICAuLi5idW5kbGUsXG4gICAgICBzdGFnZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCxcbiAgICB9O1xuXG4gICAgdGhpcy5zaGFyZWRNZW1vcnkuYXBwbHlQYXRjaChjb21taXRCdW5kbGUub3ZlcndyaXRlLCBjb21taXRCdW5kbGUudXBkYXRlcywgY29tbWl0QnVuZGxlLnRyYWNlKTtcblxuICAgIGNvbnN0IHJlZGFjdGVkT3ZlcndyaXRlID0gcmVkYWN0UGF0Y2goY29tbWl0QnVuZGxlLm92ZXJ3cml0ZSwgY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMpO1xuICAgIGNvbnN0IHJlZGFjdGVkVXBkYXRlcyA9IHJlZGFjdFBhdGNoKGNvbW1pdEJ1bmRsZS51cGRhdGVzLCBjb21taXRCdW5kbGUucmVkYWN0ZWRQYXRocyk7XG4gICAgdGhpcy5ldmVudExvZz8ucmVjb3JkKHtcbiAgICAgIC4uLmNvbW1pdEJ1bmRsZSxcbiAgICAgIHJlZGFjdGVkUGF0aHM6IEFycmF5LmZyb20oY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMudmFsdWVzKCkpLFxuICAgICAgb3ZlcndyaXRlOiByZWRhY3RlZE92ZXJ3cml0ZSxcbiAgICAgIHVwZGF0ZXM6IHJlZGFjdGVkVXBkYXRlcyxcbiAgICB9KTtcblxuICAgIC8vIE5vdGlmeSBvYnNlcnZlciAoU2NvcGVGYWNhZGUpIHdpdGggdHJhY2tlZCBtdXRhdGlvbnNcbiAgICBpZiAodGhpcy5fY29tbWl0T2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyKHsgLi4udGhpcy5fc3RhZ2VXcml0ZXMgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFRyZWUgbmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBjcmVhdGVOZXh0KHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5uZXh0KSB7XG4gICAgICB0aGlzLm5leHQgPSBuZXcgU3RhZ2VDb250ZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5zaGFyZWRNZW1vcnksICcnLCB0aGlzLmV2ZW50TG9nLCBpc0RlY2lkZXIpO1xuICAgICAgdGhpcy5uZXh0LnBhcmVudCA9IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5leHQ7XG4gIH1cblxuICBjcmVhdGVDaGlsZChydW5JZDogc3RyaW5nLCBicmFuY2hJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkID0gbmV3IFN0YWdlQ29udGV4dChydW5JZCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnNoYXJlZE1lbW9yeSwgYnJhbmNoSWQsIHRoaXMuZXZlbnRMb2csIGlzRGVjaWRlcik7XG4gICAgY2hpbGQucGFyZW50ID0gdGhpcztcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIGNyZWF0ZURlY2lkZXIocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdHJ1ZSk7XG4gIH1cblxuICBzZXRBc0RlY2lkZXIoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRGVjaWRlciA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBc0ZvcmsoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRm9yayA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgRGlhZ25vc3RpY3MgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhZGRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkTWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXJyb3Ioa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEVycm9yKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRmxvd0RlYnVnTWVzc2FnZShcbiAgICB0eXBlOiBGbG93Q29udHJvbFR5cGUsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyB0YXJnZXRTdGFnZT86IHN0cmluZyB8IHN0cmluZ1tdOyByYXRpb25hbGU/OiBzdHJpbmc7IGNvdW50PzogbnVtYmVyOyBpdGVyYXRpb24/OiBudW1iZXIgfSxcbiAgKSB7XG4gICAgY29uc3QgZmxvd01lc3NhZ2U6IEZsb3dNZXNzYWdlID0geyB0eXBlLCBkZXNjcmlwdGlvbiwgdGltZXN0YW1wOiBEYXRlLm5vdygpLCAuLi5vcHRpb25zIH07XG4gICAgdGhpcy5kZWJ1Zy5hZGRGbG93TWVzc2FnZShmbG93TWVzc2FnZSk7XG4gIH1cblxuICAvLyDilIDilIAgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0U3RhZ2VJZCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5ydW5JZCB8fCB0aGlzLnJ1bklkID09PSAnJykgcmV0dXJuIHRoaXMuc3RhZ2VOYW1lO1xuICAgIHJldHVybiBgJHt0aGlzLnJ1bklkfS4ke3RoaXMuc3RhZ2VOYW1lfWA7XG4gIH1cblxuICBnZXRTbmFwc2hvdCgpOiBTdGFnZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdDogU3RhZ2VTbmFwc2hvdCA9IHtcbiAgICAgIGlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCB8fCB1bmRlZmluZWQsXG4gICAgICBuYW1lOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIGlzRGVjaWRlcjogdGhpcy5pc0RlY2lkZXIsXG4gICAgICBpc0Zvcms6IHRoaXMuaXNGb3JrLFxuICAgICAgbG9nczogdGhpcy5kZWJ1Zy5sb2dDb250ZXh0LFxuICAgICAgZXJyb3JzOiB0aGlzLmRlYnVnLmVycm9yQ29udGV4dCxcbiAgICAgIG1ldHJpY3M6IHRoaXMuZGVidWcubWV0cmljQ29udGV4dCxcbiAgICAgIGV2YWxzOiB0aGlzLmRlYnVnLmV2YWxDb250ZXh0LFxuICAgIH07XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlV3JpdGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBFeHRyYWN0IHZhbHVlcyBvbmx5IGZvciB0aGUgc25hcHNob3QgKHN0cmlwIG9wZXJhdGlvbiBtZXRhZGF0YSlcbiAgICAgIGNvbnN0IHdyaXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2ssIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl9zdGFnZVdyaXRlcykpIHtcbiAgICAgICAgd3JpdGVzW2tdID0gZW50cnkudmFsdWU7XG4gICAgICB9XG4gICAgICBzbmFwc2hvdC5zdGFnZVdyaXRlcyA9IHdyaXRlcztcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN0YWdlUmVhZHMgPSB0aGlzLl9zdGFnZVJlYWRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgc25hcHNob3QuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdWJmbG93SWQpIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dJZCA9IHRoaXMuc3ViZmxvd0lkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QuZmxvd01lc3NhZ2VzID0gdGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXM7XG4gICAgfVxuICAgIGlmICh0aGlzLm5leHQpIHtcbiAgICAgIHNuYXBzaG90Lm5leHQgPSB0aGlzLm5leHQuZ2V0U25hcHNob3QoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIHNuYXBzaG90LmNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbi5tYXAoKGMpID0+IGMuZ2V0U25hcHNob3QoKSk7XG4gICAgfVxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxufVxuIl19
@@ -5,4 +5,4 @@
5
5
  * Zero dependencies on old code or other libraries in this package.
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdHlwZXMudHMg4oCUIENvcmUgdHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIG1lbW9yeSBsaWJyYXJ5XG4gKlxuICogWmVybyBkZXBlbmRlbmNpZXMgb24gb2xkIGNvZGUgb3Igb3RoZXIgbGlicmFyaWVzIGluIHRoaXMgcGFja2FnZS5cbiAqL1xuXG4vLyDilIDilIAgUGF0Y2ggJiBUcmFjZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIEEgZmxhdCBrZXktdmFsdWUgYmFnIHJlcHJlc2VudGluZyBhIHN0YXRlIHBhdGNoIChvdmVyd3JpdGUgb3IgbWVyZ2UpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlQYXRjaCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqIEEgc2luZ2xlIGVudHJ5IGluIHRoZSBjaHJvbm9sb2dpY2FsIG9wZXJhdGlvbiB0cmFjZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2VFbnRyeSB7XG4gIC8qKiBDYW5vbmljYWwgcGF0aCBzdHJpbmcgKHNlZ21lbnRzIGpvaW5lZCBieSBERUxJTSkuICovXG4gIHBhdGg6IHN0cmluZztcbiAgLyoqICdzZXQnID0gaGFyZCBvdmVyd3JpdGUsICdtZXJnZScgPSBkZWVwIHVuaW9uIG1lcmdlLiAqL1xuICB2ZXJiOiAnc2V0JyB8ICdtZXJnZSc7XG59XG5cbi8qKiBUaGUgYXRvbWljIGJ1bmRsZSBwcm9kdWNlZCBieSBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXQoKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0QnVuZGxlIHtcbiAgLyoqIEF1dG8tYXNzaWduZWQgc3RlcCBpbmRleCAoc2V0IGJ5IEV2ZW50TG9nLnJlY29yZCkuICovXG4gIGlkeD86IG51bWJlcjtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlOiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWRlbnRpZmllciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIEZvcm1hdDogW3N1YmZsb3dQYXRoL11zdGFnZUlkI2V4ZWN1dGlvbkluZGV4ICovXG4gIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBDaHJvbm9sb2dpY2FsIHdyaXRlIGxvZyBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuICovXG4gIHRyYWNlOiBUcmFjZUVudHJ5W107XG4gIC8qKiBQYXRocyB0aGF0IHNob3VsZCBiZSByZWRhY3RlZCBpbiBVSSAoc2Vuc2l0aXZlIGRhdGEpLiAqL1xuICByZWRhY3RlZFBhdGhzOiBzdHJpbmdbXTtcbiAgLyoqIEhhcmQgb3ZlcndyaXRlIHBhdGNoZXMuICovXG4gIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2g7XG4gIC8qKiBEZWVwIG1lcmdlIHBhdGNoZXMuICovXG4gIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xufVxuXG4vLyDilIDilIAgRmxvdyBDb250cm9sIE5hcnJhdGl2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFR5cGVzIG9mIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMgY2FwdHVyZWQgYnkgdGhlIGV4ZWN1dGlvbiBlbmdpbmUuICovXG5leHBvcnQgdHlwZSBGbG93Q29udHJvbFR5cGUgPSAnbmV4dCcgfCAnYnJhbmNoJyB8ICdjaGlsZHJlbicgfCAnc2VsZWN0ZWQnIHwgJ3N1YmZsb3cnIHwgJ2xvb3AnO1xuXG4vKiogQSBzaW5nbGUgZmxvdyBjb250cm9sIG5hcnJhdGl2ZSBlbnRyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd01lc3NhZ2Uge1xuICB0eXBlOiBGbG93Q29udHJvbFR5cGU7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHRhcmdldFN0YWdlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIHJhdGlvbmFsZT86IHN0cmluZztcbiAgY291bnQ/OiBudW1iZXI7XG4gIGl0ZXJhdGlvbj86IG51bWJlcjtcbiAgdGltZXN0YW1wPzogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgU3RhZ2UgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBTZXJpYWxpc2FibGUgcmVwcmVzZW50YXRpb24gb2YgYSBzdGFnZSdzIHN0YXRlIChmb3IgZGVidWdnaW5nIC8gdmlzdWFsaXNhdGlvbikuICovXG5leHBvcnQgdHlwZSBTdGFnZVNuYXBzaG90ID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGlzIHN0YWdlIGRvZXMgKGZyb20gYnVpbGRlcikuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3ViZmxvdyBpZGVudGlmaWVyIOKAlCBwcmVzZW50IHdoZW4gdGhpcyBzdGFnZSBpcyBhIHN1YmZsb3cgZW50cnkgcG9pbnQuICovXG4gIHN1YmZsb3dJZD86IHN0cmluZztcbiAgaXNEZWNpZGVyPzogYm9vbGVhbjtcbiAgaXNGb3JrPzogYm9vbGVhbjtcbiAgLyoqIFVzZXItbGV2ZWwgd3JpdGVzIG1hZGUgYnkgdGhpcyBzdGFnZSAocHJlLW5hbWVzcGFjZSBrZXlzIOKGkiB2YWx1ZXMpLiAqL1xuICBzdGFnZVdyaXRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogVXNlci1sZXZlbCByZWFkcyBtYWRlIGJ5IHRoaXMgc3RhZ2UgKHByZS1uYW1lc3BhY2Uga2V5cyDihpIgdmFsdWVzIGF0IHJlYWQgdGltZSkuICovXG4gIHN0YWdlUmVhZHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbG9nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGVycm9yczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIG1ldHJpY3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBldmFsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZsb3dNZXNzYWdlcz86IEZsb3dNZXNzYWdlW107XG4gIG5leHQ/OiBTdGFnZVNuYXBzaG90O1xuICBjaGlsZHJlbj86IFN0YWdlU25hcHNob3RbXTtcbn07XG5cbi8vIOKUgOKUgCBTY29wZSBGYWN0b3J5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogRm9yd2FyZC1kZWNsYXJlZCBzbyBTdGFnZUNvbnRleHQgY2FuIGFjY2VwdCBpdCB3aXRob3V0IGltcG9ydGluZyBzY29wZS8uICovXG5leHBvcnQgdHlwZSBTY29wZUZhY3Rvcnk8VFNjb3BlPiA9IChjb3JlOiBTdGFnZUNvbnRleHQsIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seUNvbnRleHQ/OiB1bmtub3duKSA9PiBUU2NvcGU7XG5cbi8vIOKUgOKUgCBTdGFnZUNvbnRleHQgKGZvcndhcmQgcmVmZXJlbmNlIGZvciBTY29wZUZhY3RvcnkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vLyBUaGUgYWN0dWFsIGNsYXNzIGxpdmVzIGluIFN0YWdlQ29udGV4dC50czsgd2UganVzdCBuZWVkIHRoZSB0eXBlIGhlcmUgZm9yXG4vLyB0aGUgU2NvcGVGYWN0b3J5IGdlbmVyaWMuIFR5cGVTY3JpcHQncyBpbXBvcnQtdHlwZSBoYW5kbGVzIHRoaXM6XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4vU3RhZ2VDb250ZXh0LmpzJztcbiJdfQ==
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdHlwZXMudHMg4oCUIENvcmUgdHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIG1lbW9yeSBsaWJyYXJ5XG4gKlxuICogWmVybyBkZXBlbmRlbmNpZXMgb24gb2xkIGNvZGUgb3Igb3RoZXIgbGlicmFyaWVzIGluIHRoaXMgcGFja2FnZS5cbiAqL1xuXG4vLyDilIDilIAgUGF0Y2ggJiBUcmFjZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIEEgZmxhdCBrZXktdmFsdWUgYmFnIHJlcHJlc2VudGluZyBhIHN0YXRlIHBhdGNoIChvdmVyd3JpdGUgb3IgbWVyZ2UpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlQYXRjaCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqIEEgc2luZ2xlIGVudHJ5IGluIHRoZSBjaHJvbm9sb2dpY2FsIG9wZXJhdGlvbiB0cmFjZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2VFbnRyeSB7XG4gIC8qKiBDYW5vbmljYWwgcGF0aCBzdHJpbmcgKHNlZ21lbnRzIGpvaW5lZCBieSBERUxJTSkuICovXG4gIHBhdGg6IHN0cmluZztcbiAgLyoqICdzZXQnID0gaGFyZCBvdmVyd3JpdGUsICdtZXJnZScgPSBkZWVwIHVuaW9uIG1lcmdlLiAqL1xuICB2ZXJiOiAnc2V0JyB8ICdtZXJnZSc7XG59XG5cbi8qKiBUaGUgYXRvbWljIGJ1bmRsZSBwcm9kdWNlZCBieSBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXQoKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0QnVuZGxlIHtcbiAgLyoqIEF1dG8tYXNzaWduZWQgc3RlcCBpbmRleCAoc2V0IGJ5IEV2ZW50TG9nLnJlY29yZCkuICovXG4gIGlkeD86IG51bWJlcjtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlOiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWRlbnRpZmllciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIEZvcm1hdDogW3N1YmZsb3dQYXRoL11zdGFnZUlkI2V4ZWN1dGlvbkluZGV4ICovXG4gIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBDaHJvbm9sb2dpY2FsIHdyaXRlIGxvZyBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuICovXG4gIHRyYWNlOiBUcmFjZUVudHJ5W107XG4gIC8qKiBQYXRocyB0aGF0IHNob3VsZCBiZSByZWRhY3RlZCBpbiBVSSAoc2Vuc2l0aXZlIGRhdGEpLiAqL1xuICByZWRhY3RlZFBhdGhzOiBzdHJpbmdbXTtcbiAgLyoqIEhhcmQgb3ZlcndyaXRlIHBhdGNoZXMuICovXG4gIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2g7XG4gIC8qKiBEZWVwIG1lcmdlIHBhdGNoZXMuICovXG4gIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xufVxuXG4vLyDilIDilIAgRmxvdyBDb250cm9sIE5hcnJhdGl2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFR5cGVzIG9mIGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMgY2FwdHVyZWQgYnkgdGhlIGV4ZWN1dGlvbiBlbmdpbmUuICovXG5leHBvcnQgdHlwZSBGbG93Q29udHJvbFR5cGUgPSAnbmV4dCcgfCAnYnJhbmNoJyB8ICdjaGlsZHJlbicgfCAnc2VsZWN0ZWQnIHwgJ3N1YmZsb3cnIHwgJ2xvb3AnO1xuXG4vKiogQSBzaW5nbGUgZmxvdyBjb250cm9sIG5hcnJhdGl2ZSBlbnRyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd01lc3NhZ2Uge1xuICB0eXBlOiBGbG93Q29udHJvbFR5cGU7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHRhcmdldFN0YWdlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIHJhdGlvbmFsZT86IHN0cmluZztcbiAgY291bnQ/OiBudW1iZXI7XG4gIGl0ZXJhdGlvbj86IG51bWJlcjtcbiAgdGltZXN0YW1wPzogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgU3RhZ2UgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBTZXJpYWxpc2FibGUgcmVwcmVzZW50YXRpb24gb2YgYSBzdGFnZSdzIHN0YXRlIChmb3IgZGVidWdnaW5nIC8gdmlzdWFsaXNhdGlvbikuICovXG5leHBvcnQgdHlwZSBTdGFnZVNuYXBzaG90ID0ge1xuICBpZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBGb3JtYXQ6IFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleCAqL1xuICBydW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhpcyBzdGFnZSBkb2VzIChmcm9tIGJ1aWxkZXIpLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN1YmZsb3cgaWRlbnRpZmllciDigJQgcHJlc2VudCB3aGVuIHRoaXMgc3RhZ2UgaXMgYSBzdWJmbG93IGVudHJ5IHBvaW50LiAqL1xuICBzdWJmbG93SWQ/OiBzdHJpbmc7XG4gIGlzRGVjaWRlcj86IGJvb2xlYW47XG4gIGlzRm9yaz86IGJvb2xlYW47XG4gIC8qKiBVc2VyLWxldmVsIHdyaXRlcyBtYWRlIGJ5IHRoaXMgc3RhZ2UgKHByZS1uYW1lc3BhY2Uga2V5cyDihpIgdmFsdWVzKS4gKi9cbiAgc3RhZ2VXcml0ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFVzZXItbGV2ZWwgcmVhZHMgbWFkZSBieSB0aGlzIHN0YWdlIChwcmUtbmFtZXNwYWNlIGtleXMg4oaSIHZhbHVlcyBhdCByZWFkIHRpbWUpLiAqL1xuICBzdGFnZVJlYWRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxvZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBtZXRyaWNzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZXZhbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBmbG93TWVzc2FnZXM/OiBGbG93TWVzc2FnZVtdO1xuICBuZXh0PzogU3RhZ2VTbmFwc2hvdDtcbiAgY2hpbGRyZW4/OiBTdGFnZVNuYXBzaG90W107XG59O1xuXG4vLyDilIDilIAgU2NvcGUgRmFjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIEZvcndhcmQtZGVjbGFyZWQgc28gU3RhZ2VDb250ZXh0IGNhbiBhY2NlcHQgaXQgd2l0aG91dCBpbXBvcnRpbmcgc2NvcGUvLiAqL1xuZXhwb3J0IHR5cGUgU2NvcGVGYWN0b3J5PFRTY29wZT4gPSAoY29yZTogU3RhZ2VDb250ZXh0LCBzdGFnZU5hbWU6IHN0cmluZywgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bikgPT4gVFNjb3BlO1xuXG4vLyDilIDilIAgU3RhZ2VDb250ZXh0IChmb3J3YXJkIHJlZmVyZW5jZSBmb3IgU2NvcGVGYWN0b3J5KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gVGhlIGFjdHVhbCBjbGFzcyBsaXZlcyBpbiBTdGFnZUNvbnRleHQudHM7IHdlIGp1c3QgbmVlZCB0aGUgdHlwZSBoZXJlIGZvclxuLy8gdGhlIFNjb3BlRmFjdG9yeSBnZW5lcmljLiBUeXBlU2NyaXB0J3MgaW1wb3J0LXR5cGUgaGFuZGxlcyB0aGlzOlxuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuL1N0YWdlQ29udGV4dC5qcyc7XG4iXX0=
@@ -5,16 +5,29 @@ exports.KeyedRecorder = void 0;
5
5
  * KeyedRecorder<T> — base class for Map-based recorders keyed by runtimeStageId.
6
6
  *
7
7
  * Provides typed key-value storage with O(1) lookup, insertion-ordered iteration,
8
- * and common accessors. Recorder implementations extend this and call store()
9
- * from their event hooks.
8
+ * and three standard operations on auto-collected traversal data:
9
+ *
10
+ * - **Translate** (raw): `getByKey(id)` — per-step value
11
+ * - **Accumulate** (progressive): `accumulate(fn, initial, keys?)` — running total up to a point
12
+ * - **Aggregate** (summary): `aggregate(fn, initial)` — reduce all entries
13
+ *
14
+ * Data is automatically collected during the single DFS traversal.
15
+ * The consumer chooses the operation at read time.
10
16
  *
11
17
  * @example
12
18
  * ```typescript
13
19
  * class TokenRecorder extends KeyedRecorder<LLMCallEntry> {
14
- * onLLMCall(event: LLMCallEvent) {
15
- * this.store(event.runtimeStageId, { model: event.model, ... });
16
- * }
17
- * getStats() { return aggregate(this.values()); }
20
+ * readonly id = 'tokens';
21
+ * onLLMCall(event) { this.store(event.runtimeStageId, { tokens: event.usage }); }
22
+ *
23
+ * // Translate: per-step
24
+ * getForStep(id: string) { return this.getByKey(id); }
25
+ *
26
+ * // Aggregate: total
27
+ * getTotalTokens() { return this.aggregate((sum, e) => sum + e.tokens, 0); }
28
+ *
29
+ * // Accumulate: progressive up to slider position
30
+ * getTokensUpTo(keys: Set<string>) { return this.accumulate((sum, e) => sum + e.tokens, 0, keys); }
18
31
  * }
19
32
  * ```
20
33
  */
@@ -26,6 +39,7 @@ class KeyedRecorder {
26
39
  store(runtimeStageId, entry) {
27
40
  this.data.set(runtimeStageId, entry);
28
41
  }
42
+ // ── Translate (raw per-step) ──────────────────────────────
29
43
  /** O(1) lookup by runtimeStageId. */
30
44
  getByKey(runtimeStageId) {
31
45
  return this.data.get(runtimeStageId);
@@ -42,10 +56,45 @@ class KeyedRecorder {
42
56
  get size() {
43
57
  return this.data.size;
44
58
  }
59
+ // ── Aggregate (reduce all entries) ────────────────────────
60
+ /** Reduce ALL entries to a single value. For dashboards, totals, summaries. */
61
+ aggregate(fn, initial) {
62
+ let acc = initial;
63
+ for (const [key, entry] of this.data) {
64
+ acc = fn(acc, entry, key);
65
+ }
66
+ return acc;
67
+ }
68
+ // ── Accumulate (progressive reduce) ───────────────────────
69
+ /**
70
+ * Reduce entries, optionally filtered by a set of keys.
71
+ * For time-travel progressive view: pass the runtimeStageIds visible at the current slider position.
72
+ * Without keys, reduces all entries (same as aggregate).
73
+ */
74
+ accumulate(fn, initial, keys) {
75
+ let acc = initial;
76
+ for (const [key, entry] of this.data) {
77
+ if (keys && !keys.has(key))
78
+ continue;
79
+ acc = fn(acc, entry, key);
80
+ }
81
+ return acc;
82
+ }
83
+ // ── Filter (subset by keys) ───────────────────────────────
84
+ /** Return entries whose keys are in the set, preserving insertion order. */
85
+ filterByKeys(keys) {
86
+ const result = [];
87
+ for (const [key, entry] of this.data) {
88
+ if (keys.has(key))
89
+ result.push(entry);
90
+ }
91
+ return result;
92
+ }
93
+ // ── Lifecycle ─────────────────────────────────────────────
45
94
  /** Clear all stored data. Called by executor before each run(). */
46
95
  clear() {
47
96
  this.data.clear();
48
97
  }
49
98
  }
50
99
  exports.KeyedRecorder = KeyedRecorder;
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2V5ZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvS2V5ZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQXNCLGFBQWE7SUFBbkM7UUFHbUIsU0FBSSxHQUFHLElBQUksR0FBRyxFQUFhLENBQUM7SUErQi9DLENBQUM7SUE3QkMsOENBQThDO0lBQ3BDLEtBQUssQ0FBQyxjQUFzQixFQUFFLEtBQVE7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsUUFBUSxDQUFDLGNBQXNCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsTUFBTTtRQUNKLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSxLQUFLO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUFsQ0Qsc0NBa0NDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBLZXllZFJlY29yZGVyPFQ+IOKAlCBiYXNlIGNsYXNzIGZvciBNYXAtYmFzZWQgcmVjb3JkZXJzIGtleWVkIGJ5IHJ1bnRpbWVTdGFnZUlkLlxuICpcbiAqIFByb3ZpZGVzIHR5cGVkIGtleS12YWx1ZSBzdG9yYWdlIHdpdGggTygxKSBsb29rdXAsIGluc2VydGlvbi1vcmRlcmVkIGl0ZXJhdGlvbixcbiAqIGFuZCBjb21tb24gYWNjZXNzb3JzLiBSZWNvcmRlciBpbXBsZW1lbnRhdGlvbnMgZXh0ZW5kIHRoaXMgYW5kIGNhbGwgc3RvcmUoKVxuICogZnJvbSB0aGVpciBldmVudCBob29rcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVG9rZW5SZWNvcmRlciBleHRlbmRzIEtleWVkUmVjb3JkZXI8TExNQ2FsbEVudHJ5PiB7XG4gKiAgIG9uTExNQ2FsbChldmVudDogTExNQ2FsbEV2ZW50KSB7XG4gKiAgICAgdGhpcy5zdG9yZShldmVudC5ydW50aW1lU3RhZ2VJZCwgeyBtb2RlbDogZXZlbnQubW9kZWwsIC4uLiB9KTtcbiAqICAgfVxuICogICBnZXRTdGF0cygpIHsgcmV0dXJuIGFnZ3JlZ2F0ZSh0aGlzLnZhbHVlcygpKTsgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBLZXllZFJlY29yZGVyPFQ+IHtcbiAgYWJzdHJhY3QgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGEgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcblxuICAvKiogU3RvcmUgYW4gZW50cnkga2V5ZWQgYnkgcnVudGltZVN0YWdlSWQuICovXG4gIHByb3RlY3RlZCBzdG9yZShydW50aW1lU3RhZ2VJZDogc3RyaW5nLCBlbnRyeTogVCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YS5zZXQocnVudGltZVN0YWdlSWQsIGVudHJ5KTtcbiAgfVxuXG4gIC8qKiBPKDEpIGxvb2t1cCBieSBydW50aW1lU3RhZ2VJZC4gKi9cbiAgZ2V0QnlLZXkocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKiBBbGwgZW50cmllcyBhcyBhIHJlYWQtb25seSBNYXAgKGluc2VydGlvbi1vcmRlcmVkKS4gKi9cbiAgZ2V0TWFwKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgVD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cblxuICAvKiogQWxsIGVudHJpZXMgYXMgYW4gYXJyYXkgKGluc2VydGlvbi1vcmRlcmVkKS4gKi9cbiAgdmFsdWVzKCk6IFRbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmRhdGEudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqIE51bWJlciBvZiBlbnRyaWVzIHN0b3JlZC4gKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLnNpemU7XG4gIH1cblxuICAvKiogQ2xlYXIgYWxsIHN0b3JlZCBkYXRhLiBDYWxsZWQgYnkgZXhlY3V0b3IgYmVmb3JlIGVhY2ggcnVuKCkuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YS5jbGVhcigpO1xuICB9XG59XG4iXX0=
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2V5ZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvS2V5ZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFzQixhQUFhO0lBQW5DO1FBR21CLFNBQUksR0FBRyxJQUFJLEdBQUcsRUFBYSxDQUFDO0lBeUUvQyxDQUFDO0lBdkVDLDhDQUE4QztJQUNwQyxLQUFLLENBQUMsY0FBc0IsRUFBRSxLQUFRO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsNkRBQTZEO0lBRTdELHFDQUFxQztJQUNyQyxRQUFRLENBQUMsY0FBc0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsMERBQTBEO0lBQzFELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxNQUFNO1FBQ0osT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxnQ0FBZ0M7SUFDaEMsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsNkRBQTZEO0lBRTdELCtFQUErRTtJQUMvRSxTQUFTLENBQUksRUFBd0MsRUFBRSxPQUFVO1FBQy9ELElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQztRQUNsQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsNkRBQTZEO0lBRTdEOzs7O09BSUc7SUFDSCxVQUFVLENBQUksRUFBd0MsRUFBRSxPQUFVLEVBQUUsSUFBMEI7UUFDNUYsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDO1FBQ2xCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxTQUFTO1lBQ3JDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsNkRBQTZEO0lBRTdELDRFQUE0RTtJQUM1RSxZQUFZLENBQUMsSUFBeUI7UUFDcEMsTUFBTSxNQUFNLEdBQVEsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsNkRBQTZEO0lBRTdELG1FQUFtRTtJQUNuRSxLQUFLO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUE1RUQsc0NBNEVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBLZXllZFJlY29yZGVyPFQ+IOKAlCBiYXNlIGNsYXNzIGZvciBNYXAtYmFzZWQgcmVjb3JkZXJzIGtleWVkIGJ5IHJ1bnRpbWVTdGFnZUlkLlxuICpcbiAqIFByb3ZpZGVzIHR5cGVkIGtleS12YWx1ZSBzdG9yYWdlIHdpdGggTygxKSBsb29rdXAsIGluc2VydGlvbi1vcmRlcmVkIGl0ZXJhdGlvbixcbiAqIGFuZCB0aHJlZSBzdGFuZGFyZCBvcGVyYXRpb25zIG9uIGF1dG8tY29sbGVjdGVkIHRyYXZlcnNhbCBkYXRhOlxuICpcbiAqICAgLSAqKlRyYW5zbGF0ZSoqIChyYXcpOiBgZ2V0QnlLZXkoaWQpYCDigJQgcGVyLXN0ZXAgdmFsdWVcbiAqICAgLSAqKkFjY3VtdWxhdGUqKiAocHJvZ3Jlc3NpdmUpOiBgYWNjdW11bGF0ZShmbiwgaW5pdGlhbCwga2V5cz8pYCDigJQgcnVubmluZyB0b3RhbCB1cCB0byBhIHBvaW50XG4gKiAgIC0gKipBZ2dyZWdhdGUqKiAoc3VtbWFyeSk6IGBhZ2dyZWdhdGUoZm4sIGluaXRpYWwpYCDigJQgcmVkdWNlIGFsbCBlbnRyaWVzXG4gKlxuICogRGF0YSBpcyBhdXRvbWF0aWNhbGx5IGNvbGxlY3RlZCBkdXJpbmcgdGhlIHNpbmdsZSBERlMgdHJhdmVyc2FsLlxuICogVGhlIGNvbnN1bWVyIGNob29zZXMgdGhlIG9wZXJhdGlvbiBhdCByZWFkIHRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFRva2VuUmVjb3JkZXIgZXh0ZW5kcyBLZXllZFJlY29yZGVyPExMTUNhbGxFbnRyeT4ge1xuICogICByZWFkb25seSBpZCA9ICd0b2tlbnMnO1xuICogICBvbkxMTUNhbGwoZXZlbnQpIHsgdGhpcy5zdG9yZShldmVudC5ydW50aW1lU3RhZ2VJZCwgeyB0b2tlbnM6IGV2ZW50LnVzYWdlIH0pOyB9XG4gKlxuICogICAvLyBUcmFuc2xhdGU6IHBlci1zdGVwXG4gKiAgIGdldEZvclN0ZXAoaWQ6IHN0cmluZykgeyByZXR1cm4gdGhpcy5nZXRCeUtleShpZCk7IH1cbiAqXG4gKiAgIC8vIEFnZ3JlZ2F0ZTogdG90YWxcbiAqICAgZ2V0VG90YWxUb2tlbnMoKSB7IHJldHVybiB0aGlzLmFnZ3JlZ2F0ZSgoc3VtLCBlKSA9PiBzdW0gKyBlLnRva2VucywgMCk7IH1cbiAqXG4gKiAgIC8vIEFjY3VtdWxhdGU6IHByb2dyZXNzaXZlIHVwIHRvIHNsaWRlciBwb3NpdGlvblxuICogICBnZXRUb2tlbnNVcFRvKGtleXM6IFNldDxzdHJpbmc+KSB7IHJldHVybiB0aGlzLmFjY3VtdWxhdGUoKHN1bSwgZSkgPT4gc3VtICsgZS50b2tlbnMsIDAsIGtleXMpOyB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEtleWVkUmVjb3JkZXI8VD4ge1xuICBhYnN0cmFjdCByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuXG4gIC8qKiBTdG9yZSBhbiBlbnRyeSBrZXllZCBieSBydW50aW1lU3RhZ2VJZC4gKi9cbiAgcHJvdGVjdGVkIHN0b3JlKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIGVudHJ5OiBUKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhLnNldChydW50aW1lU3RhZ2VJZCwgZW50cnkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRyYW5zbGF0ZSAocmF3IHBlci1zdGVwKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogTygxKSBsb29rdXAgYnkgcnVudGltZVN0YWdlSWQuICovXG4gIGdldEJ5S2V5KHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdldChydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKiogQWxsIGVudHJpZXMgYXMgYSByZWFkLW9ubHkgTWFwIChpbnNlcnRpb24tb3JkZXJlZCkuICovXG4gIGdldE1hcCgpOiBSZWFkb25seU1hcDxzdHJpbmcsIFQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xuICB9XG5cbiAgLyoqIEFsbCBlbnRyaWVzIGFzIGFuIGFycmF5IChpbnNlcnRpb24tb3JkZXJlZCkuICovXG4gIHZhbHVlcygpOiBUW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5kYXRhLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2YgZW50cmllcyBzdG9yZWQuICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zaXplO1xuICB9XG5cbiAgLy8g4pSA4pSAIEFnZ3JlZ2F0ZSAocmVkdWNlIGFsbCBlbnRyaWVzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmVkdWNlIEFMTCBlbnRyaWVzIHRvIGEgc2luZ2xlIHZhbHVlLiBGb3IgZGFzaGJvYXJkcywgdG90YWxzLCBzdW1tYXJpZXMuICovXG4gIGFnZ3JlZ2F0ZTxSPihmbjogKGFjYzogUiwgZW50cnk6IFQsIGtleTogc3RyaW5nKSA9PiBSLCBpbml0aWFsOiBSKTogUiB7XG4gICAgbGV0IGFjYyA9IGluaXRpYWw7XG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgdGhpcy5kYXRhKSB7XG4gICAgICBhY2MgPSBmbihhY2MsIGVudHJ5LCBrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9XG5cbiAgLy8g4pSA4pSAIEFjY3VtdWxhdGUgKHByb2dyZXNzaXZlIHJlZHVjZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlZHVjZSBlbnRyaWVzLCBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IGEgc2V0IG9mIGtleXMuXG4gICAqIEZvciB0aW1lLXRyYXZlbCBwcm9ncmVzc2l2ZSB2aWV3OiBwYXNzIHRoZSBydW50aW1lU3RhZ2VJZHMgdmlzaWJsZSBhdCB0aGUgY3VycmVudCBzbGlkZXIgcG9zaXRpb24uXG4gICAqIFdpdGhvdXQga2V5cywgcmVkdWNlcyBhbGwgZW50cmllcyAoc2FtZSBhcyBhZ2dyZWdhdGUpLlxuICAgKi9cbiAgYWNjdW11bGF0ZTxSPihmbjogKGFjYzogUiwgZW50cnk6IFQsIGtleTogc3RyaW5nKSA9PiBSLCBpbml0aWFsOiBSLCBrZXlzPzogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IFIge1xuICAgIGxldCBhY2MgPSBpbml0aWFsO1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMuZGF0YSkge1xuICAgICAgaWYgKGtleXMgJiYgIWtleXMuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgYWNjID0gZm4oYWNjLCBlbnRyeSwga2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfVxuXG4gIC8vIOKUgOKUgCBGaWx0ZXIgKHN1YnNldCBieSBrZXlzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmV0dXJuIGVudHJpZXMgd2hvc2Uga2V5cyBhcmUgaW4gdGhlIHNldCwgcHJlc2VydmluZyBpbnNlcnRpb24gb3JkZXIuICovXG4gIGZpbHRlckJ5S2V5cyhrZXlzOiBSZWFkb25seVNldDxzdHJpbmc+KTogVFtdIHtcbiAgICBjb25zdCByZXN1bHQ6IFRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMuZGF0YSkge1xuICAgICAgaWYgKGtleXMuaGFzKGtleSkpIHJlc3VsdC5wdXNoKGVudHJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIENsZWFyIGFsbCBzdG9yZWQgZGF0YS4gQ2FsbGVkIGJ5IGV4ZWN1dG9yIGJlZm9yZSBlYWNoIHJ1bigpLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEuY2xlYXIoKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SequenceRecorder = void 0;
4
+ /**
5
+ * SequenceRecorder<T> — base class for ordered sequence recorders with keyed index.
6
+ *
7
+ * Provides dual-indexed storage: a flat array preserving insertion order plus a
8
+ * Map<runtimeStageId, T[]> for O(1) per-step lookup. One entry type, multiple entries
9
+ * per step. Designed for recorders that implement BOTH Recorder and FlowRecorder
10
+ * (merging data ops and control flow into a single interleaved sequence).
11
+ *
12
+ * **Contrast with KeyedRecorder<T>:**
13
+ * - `KeyedRecorder<T>` — 1:1 Map. One entry per runtimeStageId. For single-value recorders
14
+ * like MetricRecorder (one StepMetrics per stage execution).
15
+ * - `SequenceRecorder<T>` — 1:N sequence + Map. Multiple entries per runtimeStageId,
16
+ * plus ordering matters. For recorders that produce a prose narrative or event log
17
+ * where a single step generates stage + data + decision entries.
18
+ *
19
+ * **How to choose:**
20
+ * - If each step produces exactly one record → extend `KeyedRecorder<T>`
21
+ * - If each step produces multiple records or ordering matters → extend `SequenceRecorder<T>`
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * import { SequenceRecorder } from 'footprintjs/trace';
26
+ *
27
+ * interface AuditEntry {
28
+ * runtimeStageId?: string;
29
+ * type: 'read' | 'write' | 'decision';
30
+ * detail: string;
31
+ * }
32
+ *
33
+ * class AuditRecorder extends SequenceRecorder<AuditEntry> {
34
+ * readonly id = 'audit';
35
+ *
36
+ * // Scope hooks (fires during stage execution)
37
+ * onRead(event: ReadEvent) {
38
+ * this.emit({ runtimeStageId: event.runtimeStageId, type: 'read', detail: event.key });
39
+ * }
40
+ * onWrite(event: WriteEvent) {
41
+ * this.emit({ runtimeStageId: event.runtimeStageId, type: 'write', detail: event.key });
42
+ * }
43
+ *
44
+ * // Flow hooks (fires after stage execution)
45
+ * onDecision(event: FlowDecisionEvent) {
46
+ * this.emit({
47
+ * runtimeStageId: event.traversalContext?.runtimeStageId,
48
+ * type: 'decision',
49
+ * detail: `${event.decider} chose ${event.chosen}`,
50
+ * });
51
+ * }
52
+ *
53
+ * // Time-travel: entries up to slider position
54
+ * getAuditUpTo(visibleIds: ReadonlySet<string>) {
55
+ * return this.getEntriesUpTo(visibleIds);
56
+ * }
57
+ * }
58
+ * ```
59
+ */
60
+ class SequenceRecorder {
61
+ constructor() {
62
+ /** Ordered sequence of all entries (insertion order). */
63
+ this.entries = [];
64
+ /** Per-step index: runtimeStageId → entries for that step. Same objects as entries[]. */
65
+ this.byRuntimeStageId = new Map();
66
+ /** Per-step range index: runtimeStageId → [firstIdx, endIdx) in entries array.
67
+ * endIdx includes trailing keyless entries (structural markers). Maintained during emit(). */
68
+ this.entryRanges = new Map();
69
+ }
70
+ // ── Write ─────────────────────────────────────────────────────────────
71
+ /**
72
+ * Append an entry to both the ordered sequence, keyed index, and range index.
73
+ * All reference the same entry object — no duplication.
74
+ */
75
+ emit(entry) {
76
+ const idx = this.entries.length;
77
+ this.entries.push(entry);
78
+ const id = entry.runtimeStageId;
79
+ if (id) {
80
+ let arr = this.byRuntimeStageId.get(id);
81
+ if (!arr) {
82
+ arr = [];
83
+ this.byRuntimeStageId.set(id, arr);
84
+ this.entryRanges.set(id, { firstIdx: idx, endIdx: idx + 1 });
85
+ }
86
+ else {
87
+ this.entryRanges.get(id).endIdx = idx + 1;
88
+ }
89
+ arr.push(entry);
90
+ this.lastEmittedId = id;
91
+ }
92
+ else if (this.lastEmittedId) {
93
+ // Structural marker (no runtimeStageId) — extend the preceding step's range
94
+ this.entryRanges.get(this.lastEmittedId).endIdx = idx + 1;
95
+ }
96
+ }
97
+ // ── Ordered access ────────────────────────────────────────────────────
98
+ /** All entries in insertion order (returns a shallow copy — entry objects are shared). */
99
+ getEntries() {
100
+ return [...this.entries];
101
+ }
102
+ /** Number of entries in the sequence. */
103
+ get entryCount() {
104
+ return this.entries.length;
105
+ }
106
+ /** Zero-copy iteration for subclass rendering methods (avoids getEntries() spread). */
107
+ forEachEntry(fn) {
108
+ for (const entry of this.entries) {
109
+ fn(entry);
110
+ }
111
+ }
112
+ // ── Keyed access ──────────────────────────────────────────────────────
113
+ /** O(1) lookup: all entries for a specific execution step (returns a copy). */
114
+ getEntriesForStep(runtimeStageId) {
115
+ var _a;
116
+ return [...((_a = this.byRuntimeStageId.get(runtimeStageId)) !== null && _a !== void 0 ? _a : [])];
117
+ }
118
+ /** Number of unique execution steps that have entries. */
119
+ get stepCount() {
120
+ return this.byRuntimeStageId.size;
121
+ }
122
+ /**
123
+ * Pre-built range index: runtimeStageId → half-open range [firstIdx, endIdx) in entries array.
124
+ * Maintained during emit() — no rebuild needed. Use for O(1) per-step lookups during time-travel.
125
+ * endIdx includes trailing keyless entries (structural markers following a step).
126
+ */
127
+ getEntryRanges() {
128
+ return this.entryRanges;
129
+ }
130
+ // ── Aggregate (reduce all entries) ────────────────────────────────────
131
+ /** Reduce ALL entries to a single value. For dashboards, totals, summaries. */
132
+ aggregate(fn, initial) {
133
+ let acc = initial;
134
+ for (const entry of this.entries) {
135
+ acc = fn(acc, entry);
136
+ }
137
+ return acc;
138
+ }
139
+ // ── Accumulate (progressive reduce) ─────────────────────────────────
140
+ /**
141
+ * Reduce entries, optionally filtered by a set of runtimeStageIds.
142
+ * For time-travel progressive view: pass the runtimeStageIds visible at the current slider position.
143
+ * Entries without runtimeStageId (structural markers) are excluded when keys are provided.
144
+ * Without keys, reduces all entries (same as aggregate).
145
+ */
146
+ accumulate(fn, initial, keys) {
147
+ let acc = initial;
148
+ for (const entry of this.entries) {
149
+ if (keys) {
150
+ if (!entry.runtimeStageId || !keys.has(entry.runtimeStageId))
151
+ continue;
152
+ }
153
+ acc = fn(acc, entry);
154
+ }
155
+ return acc;
156
+ }
157
+ // ── Time-travel queries ───────────────────────────────────────────────
158
+ /**
159
+ * Progressive reveal: entries whose runtimeStageId is in the visible set.
160
+ * Preserves insertion order. Entries without runtimeStageId (structural markers)
161
+ * are buffered and included only when surrounded by visible steps on both sides —
162
+ * trailing markers after the last visible step are discarded.
163
+ */
164
+ getEntriesUpTo(visibleIds) {
165
+ const result = [];
166
+ let pendingMarkers = [];
167
+ for (const entry of this.entries) {
168
+ const id = entry.runtimeStageId;
169
+ if (!id) {
170
+ // Structural marker — buffer until next visible keyed entry confirms it's between visible steps.
171
+ if (result.length > 0)
172
+ pendingMarkers.push(entry);
173
+ }
174
+ else if (visibleIds.has(id)) {
175
+ // Flush buffered markers — they sit between a previous visible step and this one.
176
+ if (pendingMarkers.length > 0) {
177
+ result.push(...pendingMarkers);
178
+ pendingMarkers = [];
179
+ }
180
+ result.push(entry);
181
+ }
182
+ // Non-visible keyed entries: don't discard pending markers — a later visible entry
183
+ // may still flush them. Markers are only discarded at the end (trailing).
184
+ }
185
+ // Discard remaining pendingMarkers — they trail the last visible step.
186
+ return result;
187
+ }
188
+ // ── Lifecycle ─────────────────────────────────────────────────────────
189
+ /** Clear all stored data. Called by executor before each run(). */
190
+ clear() {
191
+ this.entries.length = 0;
192
+ this.byRuntimeStageId.clear();
193
+ this.entryRanges.clear();
194
+ this.lastEmittedId = undefined;
195
+ }
196
+ }
197
+ exports.SequenceRecorder = SequenceRecorder;
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VxdWVuY2VSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvU2VxdWVuY2VSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVERztBQUNILE1BQXNCLGdCQUFnQjtJQUF0QztRQUdFLHlEQUF5RDtRQUN4QyxZQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ25DLHlGQUF5RjtRQUN4RSxxQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO1FBQzNEO3VHQUMrRjtRQUM5RSxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFnRCxDQUFDO0lBNkl6RixDQUFDO0lBeklDLHlFQUF5RTtJQUV6RTs7O09BR0c7SUFDTyxJQUFJLENBQUMsS0FBUTtRQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQ2hDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDUCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDVCxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZ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RSxDQUFDO2dCQUNSLGlHQUFpRztnQkFDakcsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRCxDQUFDO2lCQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUM5QixrRkFBa0Y7Z0JBQ2xGLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO29CQUMvQixjQUFjLEdBQUcsRUFBRSxDQUFDO2dCQUN0QixDQUFDO2dCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsQ0FBQztZQUNELG1GQUFtRjtZQUNuRiwwRUFBMEU7UUFDNUUsQ0FBQztRQUNELHVFQUF1RTtRQUN2RSxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQseUVBQXlFO0lBRXpFLG1FQUFtRTtJQUNuRSxLQUFLO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQXRKRCw0Q0FzSkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlcXVlbmNlUmVjb3JkZXI8VD4g4oCUIGJhc2UgY2xhc3MgZm9yIG9yZGVyZWQgc2VxdWVuY2UgcmVjb3JkZXJzIHdpdGgga2V5ZWQgaW5kZXguXG4gKlxuICogUHJvdmlkZXMgZHVhbC1pbmRleGVkIHN0b3JhZ2U6IGEgZmxhdCBhcnJheSBwcmVzZXJ2aW5nIGluc2VydGlvbiBvcmRlciBwbHVzIGFcbiAqIE1hcDxydW50aW1lU3RhZ2VJZCwgVFtdPiBmb3IgTygxKSBwZXItc3RlcCBsb29rdXAuIE9uZSBlbnRyeSB0eXBlLCBtdWx0aXBsZSBlbnRyaWVzXG4gKiBwZXIgc3RlcC4gRGVzaWduZWQgZm9yIHJlY29yZGVycyB0aGF0IGltcGxlbWVudCBCT1RIIFJlY29yZGVyIGFuZCBGbG93UmVjb3JkZXJcbiAqIChtZXJnaW5nIGRhdGEgb3BzIGFuZCBjb250cm9sIGZsb3cgaW50byBhIHNpbmdsZSBpbnRlcmxlYXZlZCBzZXF1ZW5jZSkuXG4gKlxuICogKipDb250cmFzdCB3aXRoIEtleWVkUmVjb3JkZXI8VD46KipcbiAqIC0gYEtleWVkUmVjb3JkZXI8VD5gIOKAlCAxOjEgTWFwLiBPbmUgZW50cnkgcGVyIHJ1bnRpbWVTdGFnZUlkLiBGb3Igc2luZ2xlLXZhbHVlIHJlY29yZGVyc1xuICogICBsaWtlIE1ldHJpY1JlY29yZGVyIChvbmUgU3RlcE1ldHJpY3MgcGVyIHN0YWdlIGV4ZWN1dGlvbikuXG4gKiAtIGBTZXF1ZW5jZVJlY29yZGVyPFQ+YCDigJQgMTpOIHNlcXVlbmNlICsgTWFwLiBNdWx0aXBsZSBlbnRyaWVzIHBlciBydW50aW1lU3RhZ2VJZCxcbiAqICAgcGx1cyBvcmRlcmluZyBtYXR0ZXJzLiBGb3IgcmVjb3JkZXJzIHRoYXQgcHJvZHVjZSBhIHByb3NlIG5hcnJhdGl2ZSBvciBldmVudCBsb2dcbiAqICAgd2hlcmUgYSBzaW5nbGUgc3RlcCBnZW5lcmF0ZXMgc3RhZ2UgKyBkYXRhICsgZGVjaXNpb24gZW50cmllcy5cbiAqXG4gKiAqKkhvdyB0byBjaG9vc2U6KipcbiAqIC0gSWYgZWFjaCBzdGVwIHByb2R1Y2VzIGV4YWN0bHkgb25lIHJlY29yZCDihpIgZXh0ZW5kIGBLZXllZFJlY29yZGVyPFQ+YFxuICogLSBJZiBlYWNoIHN0ZXAgcHJvZHVjZXMgbXVsdGlwbGUgcmVjb3JkcyBvciBvcmRlcmluZyBtYXR0ZXJzIOKGkiBleHRlbmQgYFNlcXVlbmNlUmVjb3JkZXI8VD5gXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFNlcXVlbmNlUmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogaW50ZXJmYWNlIEF1ZGl0RW50cnkge1xuICogICBydW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAqICAgdHlwZTogJ3JlYWQnIHwgJ3dyaXRlJyB8ICdkZWNpc2lvbic7XG4gKiAgIGRldGFpbDogc3RyaW5nO1xuICogfVxuICpcbiAqIGNsYXNzIEF1ZGl0UmVjb3JkZXIgZXh0ZW5kcyBTZXF1ZW5jZVJlY29yZGVyPEF1ZGl0RW50cnk+IHtcbiAqICAgcmVhZG9ubHkgaWQgPSAnYXVkaXQnO1xuICpcbiAqICAgLy8gU2NvcGUgaG9va3MgKGZpcmVzIGR1cmluZyBzdGFnZSBleGVjdXRpb24pXG4gKiAgIG9uUmVhZChldmVudDogUmVhZEV2ZW50KSB7XG4gKiAgICAgdGhpcy5lbWl0KHsgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCB0eXBlOiAncmVhZCcsIGRldGFpbDogZXZlbnQua2V5IH0pO1xuICogICB9XG4gKiAgIG9uV3JpdGUoZXZlbnQ6IFdyaXRlRXZlbnQpIHtcbiAqICAgICB0aGlzLmVtaXQoeyBydW50aW1lU3RhZ2VJZDogZXZlbnQucnVudGltZVN0YWdlSWQsIHR5cGU6ICd3cml0ZScsIGRldGFpbDogZXZlbnQua2V5IH0pO1xuICogICB9XG4gKlxuICogICAvLyBGbG93IGhvb2tzIChmaXJlcyBhZnRlciBzdGFnZSBleGVjdXRpb24pXG4gKiAgIG9uRGVjaXNpb24oZXZlbnQ6IEZsb3dEZWNpc2lvbkV2ZW50KSB7XG4gKiAgICAgdGhpcy5lbWl0KHtcbiAqICAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAqICAgICAgIHR5cGU6ICdkZWNpc2lvbicsXG4gKiAgICAgICBkZXRhaWw6IGAke2V2ZW50LmRlY2lkZXJ9IGNob3NlICR7ZXZlbnQuY2hvc2VufWAsXG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIFRpbWUtdHJhdmVsOiBlbnRyaWVzIHVwIHRvIHNsaWRlciBwb3NpdGlvblxuICogICBnZXRBdWRpdFVwVG8odmlzaWJsZUlkczogUmVhZG9ubHlTZXQ8c3RyaW5nPikge1xuICogICAgIHJldHVybiB0aGlzLmdldEVudHJpZXNVcFRvKHZpc2libGVJZHMpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlcXVlbmNlUmVjb3JkZXI8VCBleHRlbmRzIHsgcnVudGltZVN0YWdlSWQ/OiBzdHJpbmcgfT4ge1xuICBhYnN0cmFjdCByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKiBPcmRlcmVkIHNlcXVlbmNlIG9mIGFsbCBlbnRyaWVzIChpbnNlcnRpb24gb3JkZXIpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVudHJpZXM6IFRbXSA9IFtdO1xuICAvKiogUGVyLXN0ZXAgaW5kZXg6IHJ1bnRpbWVTdGFnZUlkIOKGkiBlbnRyaWVzIGZvciB0aGF0IHN0ZXAuIFNhbWUgb2JqZWN0cyBhcyBlbnRyaWVzW10uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYnlSdW50aW1lU3RhZ2VJZCA9IG5ldyBNYXA8c3RyaW5nLCBUW10+KCk7XG4gIC8qKiBQZXItc3RlcCByYW5nZSBpbmRleDogcnVudGltZVN0YWdlSWQg4oaSIFtmaXJzdElkeCwgZW5kSWR4KSBpbiBlbnRyaWVzIGFycmF5LlxuICAgKiAgZW5kSWR4IGluY2x1ZGVzIHRyYWlsaW5nIGtleWxlc3MgZW50cmllcyAoc3RydWN0dXJhbCBtYXJrZXJzKS4gTWFpbnRhaW5lZCBkdXJpbmcgZW1pdCgpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVudHJ5UmFuZ2VzID0gbmV3IE1hcDxzdHJpbmcsIHsgZmlyc3RJZHg6IG51bWJlcjsgZW5kSWR4OiBudW1iZXIgfT4oKTtcbiAgLyoqIFRoZSBydW50aW1lU3RhZ2VJZCBvZiB0aGUgbW9zdCByZWNlbnRseSBlbWl0dGVkIGtleWVkIGVudHJ5LiBVc2VkIHRvIGV4dGVuZCByYW5nZXMgZm9yIHRyYWlsaW5nIG1hcmtlcnMuICovXG4gIHByaXZhdGUgbGFzdEVtaXR0ZWRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIOKUgOKUgCBXcml0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQXBwZW5kIGFuIGVudHJ5IHRvIGJvdGggdGhlIG9yZGVyZWQgc2VxdWVuY2UsIGtleWVkIGluZGV4LCBhbmQgcmFuZ2UgaW5kZXguXG4gICAqIEFsbCByZWZlcmVuY2UgdGhlIHNhbWUgZW50cnkgb2JqZWN0IOKAlCBubyBkdXBsaWNhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBlbWl0KGVudHJ5OiBUKTogdm9pZCB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5lbnRyaWVzLmxlbmd0aDtcbiAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgY29uc3QgaWQgPSBlbnRyeS5ydW50aW1lU3RhZ2VJZDtcbiAgICBpZiAoaWQpIHtcbiAgICAgIGxldCBhcnIgPSB0aGlzLmJ5UnVudGltZVN0YWdlSWQuZ2V0KGlkKTtcbiAgICAgIGlmICghYXJyKSB7XG4gICAgICAgIGFyciA9IFtdO1xuICAgICAgICB0aGlzLmJ5UnVudGltZVN0YWdlSWQuc2V0KGlkLCBhcnIpO1xuICAgICAgICB0aGlzLmVudHJ5UmFuZ2VzLnNldChpZCwgeyBmaXJzdElkeDogaWR4LCBlbmRJZHg6IGlkeCArIDEgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVudHJ5UmFuZ2VzLmdldChpZCkhLmVuZElkeCA9IGlkeCArIDE7XG4gICAgICB9XG4gICAgICBhcnIucHVzaChlbnRyeSk7XG4gICAgICB0aGlzLmxhc3RFbWl0dGVkSWQgPSBpZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGFzdEVtaXR0ZWRJZCkge1xuICAgICAgLy8gU3RydWN0dXJhbCBtYXJrZXIgKG5vIHJ1bnRpbWVTdGFnZUlkKSDigJQgZXh0ZW5kIHRoZSBwcmVjZWRpbmcgc3RlcCdzIHJhbmdlXG4gICAgICB0aGlzLmVudHJ5UmFuZ2VzLmdldCh0aGlzLmxhc3RFbWl0dGVkSWQpIS5lbmRJZHggPSBpZHggKyAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBPcmRlcmVkIGFjY2VzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQWxsIGVudHJpZXMgaW4gaW5zZXJ0aW9uIG9yZGVyIChyZXR1cm5zIGEgc2hhbGxvdyBjb3B5IOKAlCBlbnRyeSBvYmplY3RzIGFyZSBzaGFyZWQpLiAqL1xuICBnZXRFbnRyaWVzKCk6IFRbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmVudHJpZXNdO1xuICB9XG5cbiAgLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzZXF1ZW5jZS4gKi9cbiAgZ2V0IGVudHJ5Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBaZXJvLWNvcHkgaXRlcmF0aW9uIGZvciBzdWJjbGFzcyByZW5kZXJpbmcgbWV0aG9kcyAoYXZvaWRzIGdldEVudHJpZXMoKSBzcHJlYWQpLiAqL1xuICBwcm90ZWN0ZWQgZm9yRWFjaEVudHJ5KGZuOiAoZW50cnk6IFQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcykge1xuICAgICAgZm4oZW50cnkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBLZXllZCBhY2Nlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIE8oMSkgbG9va3VwOiBhbGwgZW50cmllcyBmb3IgYSBzcGVjaWZpYyBleGVjdXRpb24gc3RlcCAocmV0dXJucyBhIGNvcHkpLiAqL1xuICBnZXRFbnRyaWVzRm9yU3RlcChydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogVFtdIHtcbiAgICByZXR1cm4gWy4uLih0aGlzLmJ5UnVudGltZVN0YWdlSWQuZ2V0KHJ1bnRpbWVTdGFnZUlkKSA/PyBbXSldO1xuICB9XG5cbiAgLyoqIE51bWJlciBvZiB1bmlxdWUgZXhlY3V0aW9uIHN0ZXBzIHRoYXQgaGF2ZSBlbnRyaWVzLiAqL1xuICBnZXQgc3RlcENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYnlSdW50aW1lU3RhZ2VJZC5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZS1idWlsdCByYW5nZSBpbmRleDogcnVudGltZVN0YWdlSWQg4oaSIGhhbGYtb3BlbiByYW5nZSBbZmlyc3RJZHgsIGVuZElkeCkgaW4gZW50cmllcyBhcnJheS5cbiAgICogTWFpbnRhaW5lZCBkdXJpbmcgZW1pdCgpIOKAlCBubyByZWJ1aWxkIG5lZWRlZC4gVXNlIGZvciBPKDEpIHBlci1zdGVwIGxvb2t1cHMgZHVyaW5nIHRpbWUtdHJhdmVsLlxuICAgKiBlbmRJZHggaW5jbHVkZXMgdHJhaWxpbmcga2V5bGVzcyBlbnRyaWVzIChzdHJ1Y3R1cmFsIG1hcmtlcnMgZm9sbG93aW5nIGEgc3RlcCkuXG4gICAqL1xuICBnZXRFbnRyeVJhbmdlcygpOiBSZWFkb25seU1hcDxzdHJpbmcsIHsgcmVhZG9ubHkgZmlyc3RJZHg6IG51bWJlcjsgcmVhZG9ubHkgZW5kSWR4OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLmVudHJ5UmFuZ2VzO1xuICB9XG5cbiAgLy8g4pSA4pSAIEFnZ3JlZ2F0ZSAocmVkdWNlIGFsbCBlbnRyaWVzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmVkdWNlIEFMTCBlbnRyaWVzIHRvIGEgc2luZ2xlIHZhbHVlLiBGb3IgZGFzaGJvYXJkcywgdG90YWxzLCBzdW1tYXJpZXMuICovXG4gIGFnZ3JlZ2F0ZTxSPihmbjogKGFjYzogUiwgZW50cnk6IFQpID0+IFIsIGluaXRpYWw6IFIpOiBSIHtcbiAgICBsZXQgYWNjID0gaW5pdGlhbDtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcykge1xuICAgICAgYWNjID0gZm4oYWNjLCBlbnRyeSk7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH1cblxuICAvLyDilIDilIAgQWNjdW11bGF0ZSAocHJvZ3Jlc3NpdmUgcmVkdWNlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmVkdWNlIGVudHJpZXMsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgYSBzZXQgb2YgcnVudGltZVN0YWdlSWRzLlxuICAgKiBGb3IgdGltZS10cmF2ZWwgcHJvZ3Jlc3NpdmUgdmlldzogcGFzcyB0aGUgcnVudGltZVN0YWdlSWRzIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgc2xpZGVyIHBvc2l0aW9uLlxuICAgKiBFbnRyaWVzIHdpdGhvdXQgcnVudGltZVN0YWdlSWQgKHN0cnVjdHVyYWwgbWFya2VycykgYXJlIGV4Y2x1ZGVkIHdoZW4ga2V5cyBhcmUgcHJvdmlkZWQuXG4gICAqIFdpdGhvdXQga2V5cywgcmVkdWNlcyBhbGwgZW50cmllcyAoc2FtZSBhcyBhZ2dyZWdhdGUpLlxuICAgKi9cbiAgYWNjdW11bGF0ZTxSPihmbjogKGFjYzogUiwgZW50cnk6IFQpID0+IFIsIGluaXRpYWw6IFIsIGtleXM/OiBSZWFkb25seVNldDxzdHJpbmc+KTogUiB7XG4gICAgbGV0IGFjYyA9IGluaXRpYWw7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMpIHtcbiAgICAgIGlmIChrZXlzKSB7XG4gICAgICAgIGlmICghZW50cnkucnVudGltZVN0YWdlSWQgfHwgIWtleXMuaGFzKGVudHJ5LnJ1bnRpbWVTdGFnZUlkKSkgY29udGludWU7XG4gICAgICB9XG4gICAgICBhY2MgPSBmbihhY2MsIGVudHJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaW1lLXRyYXZlbCBxdWVyaWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBQcm9ncmVzc2l2ZSByZXZlYWw6IGVudHJpZXMgd2hvc2UgcnVudGltZVN0YWdlSWQgaXMgaW4gdGhlIHZpc2libGUgc2V0LlxuICAgKiBQcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyLiBFbnRyaWVzIHdpdGhvdXQgcnVudGltZVN0YWdlSWQgKHN0cnVjdHVyYWwgbWFya2VycylcbiAgICogYXJlIGJ1ZmZlcmVkIGFuZCBpbmNsdWRlZCBvbmx5IHdoZW4gc3Vycm91bmRlZCBieSB2aXNpYmxlIHN0ZXBzIG9uIGJvdGggc2lkZXMg4oCUXG4gICAqIHRyYWlsaW5nIG1hcmtlcnMgYWZ0ZXIgdGhlIGxhc3QgdmlzaWJsZSBzdGVwIGFyZSBkaXNjYXJkZWQuXG4gICAqL1xuICBnZXRFbnRyaWVzVXBUbyh2aXNpYmxlSWRzOiBSZWFkb25seVNldDxzdHJpbmc+KTogVFtdIHtcbiAgICBjb25zdCByZXN1bHQ6IFRbXSA9IFtdO1xuICAgIGxldCBwZW5kaW5nTWFya2VyczogVFtdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGlkID0gZW50cnkucnVudGltZVN0YWdlSWQ7XG4gICAgICBpZiAoIWlkKSB7XG4gICAgICAgIC8vIFN0cnVjdHVyYWwgbWFya2VyIOKAlCBidWZmZXIgdW50aWwgbmV4dCB2aXNpYmxlIGtleWVkIGVudHJ5IGNvbmZpcm1zIGl0J3MgYmV0d2VlbiB2aXNpYmxlIHN0ZXBzLlxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHBlbmRpbmdNYXJrZXJzLnB1c2goZW50cnkpO1xuICAgICAgfSBlbHNlIGlmICh2aXNpYmxlSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgLy8gRmx1c2ggYnVmZmVyZWQgbWFya2VycyDigJQgdGhleSBzaXQgYmV0d2VlbiBhIHByZXZpb3VzIHZpc2libGUgc3RlcCBhbmQgdGhpcyBvbmUuXG4gICAgICAgIGlmIChwZW5kaW5nTWFya2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goLi4ucGVuZGluZ01hcmtlcnMpO1xuICAgICAgICAgIHBlbmRpbmdNYXJrZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2goZW50cnkpO1xuICAgICAgfVxuICAgICAgLy8gTm9uLXZpc2libGUga2V5ZWQgZW50cmllczogZG9uJ3QgZGlzY2FyZCBwZW5kaW5nIG1hcmtlcnMg4oCUIGEgbGF0ZXIgdmlzaWJsZSBlbnRyeVxuICAgICAgLy8gbWF5IHN0aWxsIGZsdXNoIHRoZW0uIE1hcmtlcnMgYXJlIG9ubHkgZGlzY2FyZGVkIGF0IHRoZSBlbmQgKHRyYWlsaW5nKS5cbiAgICB9XG4gICAgLy8gRGlzY2FyZCByZW1haW5pbmcgcGVuZGluZ01hcmtlcnMg4oCUIHRoZXkgdHJhaWwgdGhlIGxhc3QgdmlzaWJsZSBzdGVwLlxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDbGVhciBhbGwgc3RvcmVkIGRhdGEuIENhbGxlZCBieSBleGVjdXRvciBiZWZvcmUgZWFjaCBydW4oKS4gKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5lbnRyaWVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5ieVJ1bnRpbWVTdGFnZUlkLmNsZWFyKCk7XG4gICAgdGhpcy5lbnRyeVJhbmdlcy5jbGVhcigpO1xuICAgIHRoaXMubGFzdEVtaXR0ZWRJZCA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.KeyedRecorder = exports.CompositeRecorder = void 0;
3
+ exports.SequenceRecorder = exports.KeyedRecorder = exports.CompositeRecorder = void 0;
4
4
  var CompositeRecorder_js_1 = require("./CompositeRecorder.js");
5
5
  Object.defineProperty(exports, "CompositeRecorder", { enumerable: true, get: function () { return CompositeRecorder_js_1.CompositeRecorder; } });
6
6
  var KeyedRecorder_js_1 = require("./KeyedRecorder.js");
7
7
  Object.defineProperty(exports, "KeyedRecorder", { enumerable: true, get: function () { return KeyedRecorder_js_1.KeyedRecorder; } });
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtEQUEyRDtBQUFsRCx5SEFBQSxpQkFBaUIsT0FBQTtBQUMxQix1REFBbUQ7QUFBMUMsaUhBQUEsYUFBYSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgeyBDb21wb3NpdGVTbmFwc2hvdCB9IGZyb20gJy4vQ29tcG9zaXRlUmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgQ29tcG9zaXRlUmVjb3JkZXIgfSBmcm9tICcuL0NvbXBvc2l0ZVJlY29yZGVyLmpzJztcbmV4cG9ydCB7IEtleWVkUmVjb3JkZXIgfSBmcm9tICcuL0tleWVkUmVjb3JkZXIuanMnO1xuIl19
8
+ var SequenceRecorder_js_1 = require("./SequenceRecorder.js");
9
+ Object.defineProperty(exports, "SequenceRecorder", { enumerable: true, get: function () { return SequenceRecorder_js_1.SequenceRecorder; } });
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtEQUEyRDtBQUFsRCx5SEFBQSxpQkFBaUIsT0FBQTtBQUMxQix1REFBbUQ7QUFBMUMsaUhBQUEsYUFBYSxPQUFBO0FBQ3RCLDZEQUF5RDtBQUFoRCx1SEFBQSxnQkFBZ0IsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgQ29tcG9zaXRlU25hcHNob3QgfSBmcm9tICcuL0NvbXBvc2l0ZVJlY29yZGVyLmpzJztcbmV4cG9ydCB7IENvbXBvc2l0ZVJlY29yZGVyIH0gZnJvbSAnLi9Db21wb3NpdGVSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBLZXllZFJlY29yZGVyIH0gZnJvbSAnLi9LZXllZFJlY29yZGVyLmpzJztcbmV4cG9ydCB7IFNlcXVlbmNlUmVjb3JkZXIgfSBmcm9tICcuL1NlcXVlbmNlUmVjb3JkZXIuanMnO1xuIl19