footprintjs 10.6.0 → 10.7.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 (54) hide show
  1. package/CLAUDE.md +2 -1
  2. package/dist/esm/index.d.ts +12 -2
  3. package/dist/esm/index.js +5 -3
  4. package/dist/esm/lib/attempt/backoff.d.ts +96 -0
  5. package/dist/esm/lib/attempt/backoff.js +173 -0
  6. package/dist/esm/lib/attempt/deadline.d.ts +0 -5
  7. package/dist/esm/lib/attempt/deadline.js +2 -27
  8. package/dist/esm/lib/attempt/index.d.ts +6 -4
  9. package/dist/esm/lib/attempt/index.js +6 -5
  10. package/dist/esm/lib/attempt/runner.js +3 -2
  11. package/dist/esm/lib/detach/drivers/setTimeout.d.ts +4 -2
  12. package/dist/esm/lib/detach/drivers/setTimeout.js +12 -2
  13. package/dist/esm/lib/detach/flush.d.ts +6 -1
  14. package/dist/esm/lib/detach/flush.js +8 -6
  15. package/dist/esm/lib/observer-queue/deferredDispatcher.d.ts +8 -1
  16. package/dist/esm/lib/observer-queue/deferredDispatcher.js +13 -6
  17. package/dist/esm/lib/recorder/AttemptRecorder.js +8 -9
  18. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +7 -2
  19. package/dist/esm/lib/runner/FlowChartExecutor.js +8 -3
  20. package/dist/esm/lib/runner/captureHistory.js +6 -4
  21. package/dist/esm/lib/runner/deadline.js +3 -2
  22. package/dist/esm/lib/runner/recordSink.d.ts +2 -1
  23. package/dist/esm/lib/runner/recordSink.js +12 -7
  24. package/dist/esm/lib/sinks/fileSink.js +7 -6
  25. package/dist/esm/lib/sinks/indexedIO.js +5 -3
  26. package/dist/esm/lib/timers/longTimeout.d.ts +37 -0
  27. package/dist/esm/lib/timers/longTimeout.js +56 -0
  28. package/dist/index.js +8 -3
  29. package/dist/lib/attempt/backoff.js +178 -0
  30. package/dist/lib/attempt/deadline.js +4 -30
  31. package/dist/lib/attempt/index.js +9 -6
  32. package/dist/lib/attempt/runner.js +4 -3
  33. package/dist/lib/detach/drivers/setTimeout.js +12 -2
  34. package/dist/lib/detach/flush.js +8 -6
  35. package/dist/lib/observer-queue/deferredDispatcher.js +13 -6
  36. package/dist/lib/recorder/AttemptRecorder.js +8 -9
  37. package/dist/lib/runner/FlowChartExecutor.js +8 -3
  38. package/dist/lib/runner/captureHistory.js +6 -4
  39. package/dist/lib/runner/deadline.js +3 -2
  40. package/dist/lib/runner/recordSink.js +12 -7
  41. package/dist/lib/sinks/fileSink.js +7 -6
  42. package/dist/lib/sinks/indexedIO.js +5 -3
  43. package/dist/lib/timers/longTimeout.js +60 -0
  44. package/dist/types/index.d.ts +12 -2
  45. package/dist/types/lib/attempt/backoff.d.ts +96 -0
  46. package/dist/types/lib/attempt/deadline.d.ts +0 -5
  47. package/dist/types/lib/attempt/index.d.ts +6 -4
  48. package/dist/types/lib/detach/drivers/setTimeout.d.ts +4 -2
  49. package/dist/types/lib/detach/flush.d.ts +6 -1
  50. package/dist/types/lib/observer-queue/deferredDispatcher.d.ts +8 -1
  51. package/dist/types/lib/runner/FlowChartExecutor.d.ts +7 -2
  52. package/dist/types/lib/runner/recordSink.d.ts +2 -1
  53. package/dist/types/lib/timers/longTimeout.d.ts +37 -0
  54. package/package.json +2 -2
@@ -9,7 +9,9 @@
9
9
  * Role: The pipeline held by `runner/DeferredObserverTier.ts · DeferredObserverTier`.
10
10
  * Producers call `capture()`; listeners
11
11
  * receive envelopes at the next checkpoint, "one beat behind".
12
- * Pure module — zero engine imports.
12
+ * Pure module — zero engine imports. Beside the capture
13
+ * envelope's types, it imports only the L0 long-timer leaf
14
+ * (`timers/longTimeout.ts`), which arms `drain`'s deadline.
13
15
  *
14
16
  * Delivery semantics (normative, RFC-001 §5 + amendments A2/A4):
15
17
  * - Per-listener FIFO: every listener sees envelopes in seq order
@@ -45,6 +47,7 @@
45
47
  */
46
48
  Object.defineProperty(exports, "__esModule", { value: true });
47
49
  exports.DeferredDispatcher = void 0;
50
+ const longTimeout_js_1 = require("../timers/longTimeout.js");
48
51
  const flushDriver_js_1 = require("./flushDriver.js");
49
52
  const mergedQueue_js_1 = require("./mergedQueue.js");
50
53
  const defaultNow = () => (typeof performance !== 'undefined' ? performance.now() : Date.now());
@@ -125,6 +128,11 @@ class DeferredDispatcher {
125
128
  * `Promise.allSettled` under a deadline, shaped like `flushAllDetached`.
126
129
  * Loops while continuations spawn new captures, until quiescent or the
127
130
  * deadline expires.
131
+ *
132
+ * `timeoutMs` (default 30 000) is armed by the one long-timer law
133
+ * (`timers/longTimeout.ts · setLongTimeout`): `Infinity` arms no timer
134
+ * and waits for every continuation; a limit past 2^31 − 1 ms is waited in
135
+ * full, never cut to 1 ms; `0` or less gives up at once.
128
136
  */
129
137
  async drain(opts) {
130
138
  const timeoutMs = opts?.timeoutMs ?? 30_000;
@@ -137,13 +145,12 @@ class DeferredDispatcher {
137
145
  if (remainingMs <= 0)
138
146
  return { done, failed, pending: this.inflight.size + this.queue.depth };
139
147
  const batch = [...this.inflight];
140
- let timerId;
148
+ let cancelTimer = () => undefined;
141
149
  const timeoutPromise = new Promise((resolve) => {
142
- timerId = setTimeout(() => resolve('__drain_timeout__'), remainingMs);
150
+ cancelTimer = (0, longTimeout_js_1.setLongTimeout)(() => resolve('__drain_timeout__'), remainingMs);
143
151
  });
144
152
  const settled = await Promise.race([Promise.allSettled(batch), timeoutPromise]);
145
- if (timerId !== undefined)
146
- clearTimeout(timerId);
153
+ cancelTimer();
147
154
  if (settled === '__drain_timeout__') {
148
155
  return { done, failed, pending: this.inflight.size + this.queue.depth };
149
156
  }
@@ -227,4 +234,4 @@ class DeferredDispatcher {
227
234
  }
228
235
  }
229
236
  exports.DeferredDispatcher = DeferredDispatcher;
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmZXJyZWREaXNwYXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9vYnNlcnZlci1xdWV1ZS9kZWZlcnJlZERpc3BhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkNHOzs7QUFHSCxxREFBcUU7QUFDckUscURBQWtFO0FBd0ZsRSxNQUFNLFVBQVUsR0FBRyxHQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sV0FBVyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUV2RyxTQUFTLFVBQVUsQ0FBQyxLQUEyQjtJQUM3QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQVEsS0FBdUIsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0FBQzVHLENBQUM7QUFFRCxNQUFhLGtCQUFrQjtJQUNaLEtBQUssQ0FBYztJQUNuQixNQUFNLENBQWM7SUFDcEIsU0FBUyxHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDO0lBQ2hELGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUN6RSw0RUFBNEU7SUFDM0QsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQ3ZDLE9BQU8sQ0FBd0I7SUFDL0IsR0FBRyxDQUFlO0lBQzNCLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUU3QixZQUFZLElBQWdDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSw0QkFBVyxDQUFDO1lB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QUFJLENBQzVDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFDVixDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUNGLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQix3RUFBd0U7UUFDeEUsdUJBQXVCO1FBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsd0RBQXdEO0lBQ2hELFdBQVcsQ0FBQyxLQUFjLEVBQUUsT0FBNkI7UUFDL0QsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsbUNBQW1DO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFwTEQsZ0RBb0xDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBvYnNlcnZlci1xdWV1ZS9kZWZlcnJlZERpc3BhdGNoZXIudHMg4oCUIFJGQy0wMDEgQmxvY2sgNTogZGVmZXJyZWQgZGVsaXZlcnkgZmHDp2FkZS5cbiAqXG4gKiBQYXR0ZXJuOiAgY2FwdHVyZSDihpIgZW5xdWV1ZSDihpIgKG1pY3JvdGFzaykgZmx1c2gg4oaSIGludm9rZSwgd2l0aCBwZXItbGlzdGVuZXJcbiAqICAgICAgICAgICBlcnJvciBpc29sYXRpb24uIENvbXBvc2VzIHRoZSB3aG9sZSBwdXJlIHBpcGVsaW5lOiBNZXJnZWRRdWV1ZVxuICogICAgICAgICAgIChCbG9jayAzLCB3aGljaCBjYXB0dXJlcyB2aWEgQmxvY2sgMSkgKyBGbHVzaERyaXZlciAoQmxvY2sgNCkgK1xuICogICAgICAgICAgIGEgbGlzdGVuZXIgcmVnaXN0cnkgd2l0aCB0aW1pbmcvaW5mbGlnaHQgYWNjb3VudGluZy5cbiAqIFJvbGU6ICAgICBUaGUgcGlwZWxpbmUgaGVsZCBieSBgcnVubmVyL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLnRzIMK3IERlZmVycmVkT2JzZXJ2ZXJUaWVyYC5cbiAqICAgICAgICAgICBQcm9kdWNlcnMgY2FsbCBgY2FwdHVyZSgpYDsgbGlzdGVuZXJzXG4gKiAgICAgICAgICAgcmVjZWl2ZSBlbnZlbG9wZXMgYXQgdGhlIG5leHQgY2hlY2twb2ludCwgXCJvbmUgYmVhdCBiZWhpbmRcIi5cbiAqICAgICAgICAgICBQdXJlIG1vZHVsZSDigJQgemVybyBlbmdpbmUgaW1wb3J0cy5cbiAqXG4gKiBEZWxpdmVyeSBzZW1hbnRpY3MgKG5vcm1hdGl2ZSwgUkZDLTAwMSDCpzUgKyBhbWVuZG1lbnRzIEEyL0E0KTpcbiAqICAgLSBQZXItbGlzdGVuZXIgRklGTzogZXZlcnkgbGlzdGVuZXIgc2VlcyBlbnZlbG9wZXMgaW4gc2VxIG9yZGVyXG4gKiAgICAgKGludm9jYXRpb24gb3JkZXI7IGFuIGFzeW5jIGxpc3RlbmVyJ3MgQ09NUExFVElPTiBvcmRlciBpcyBpdHMgb3duXG4gKiAgICAgY29uY2Vybikg4oCUIEVYQ0VQVCB1bmRlciBgJ2Jsb2NrJ2Agb3ZlcmZsb3csIHdoZXJlIGEgcmVmdXNlZCBlbnF1ZXVlXG4gKiAgICAgaXMgZGVsaXZlcmVkIGlubGluZSBhbmQgb3ZlcnRha2VzIHRoZSBxdWV1ZWQgYmFja2xvZy4gYHNlcWAgYWx3YXlzXG4gKiAgICAgcmVjb3JkcyB0cnVlIGFycml2YWwgb3JkZXIsIHNvIG9yZGVyLXNlbnNpdGl2ZSBjb25zdW1lcnMgcmUtc29ydDtcbiAqICAgICBzZWUgdGhlIGAnYmxvY2snYCBjYXZlYXQgYmVsb3cuXG4gKiAgIC0gRXJyb3IgaXNvbGF0aW9uOiBhIHRocm93aW5nIGxpc3RlbmVyIChzeW5jKSBvciByZWplY3RpbmcgbGlzdGVuZXJcbiAqICAgICAoYXN5bmMpIG5ldmVyIGFmZmVjdHMgc2libGluZ3Mgb3IgdGhlIHByb2R1Y2VyLiBCb3RoIGZhaWx1cmUgbW9kZXNcbiAqICAgICByb3V0ZSB0byB0aGUgaW5qZWN0ZWQgYG9uRXJyb3JgOyBhIHRocm93aW5nIGBvbkVycm9yYCBpcyBpdHNlbGZcbiAqICAgICBzd2FsbG93ZWQuXG4gKiAgIC0gVGhlIGZsdXNoIE5FVkVSIGF3YWl0cyBhIGxpc3RlbmVyLiBBc3luYyBjb250aW51YXRpb25zIGFyZSB0cmFja2VkIGluXG4gKiAgICAgYW4gaW5mbGlnaHQgc2V0OyBgZHJhaW4oeyB0aW1lb3V0TXMgfSlgIHNldHRsZXMgdGhlbVxuICogICAgIChgUHJvbWlzZS5hbGxTZXR0bGVkYCArIGRlYWRsaW5lLCBzaGFwZWQgbGlrZSBgZmx1c2hBbGxEZXRhY2hlZGApLlxuICogICAtIGAnYmxvY2snYCBvdmVyZmxvdzogYSByZWZ1c2VkIGVucXVldWUgaXMgZGVsaXZlcmVkIHN5bmNocm9ub3VzbHlcbiAqICAgICBJTkxJTkUgZnJvbSBgY2FwdHVyZSgpYCDigJQgcmUtaW50cm9kdWNpbmcgYmxvY2tpbmcgZGVsaXZlcnkgYnkgdGhlXG4gKiAgICAgY29uc3VtZXIncyBleHBsaWNpdCBjaG9pY2UuIE9yZGVyaW5nIGNhdmVhdCAoZG9jdW1lbnRlZCArIHRlc3RlZCk6IGFuXG4gKiAgICAgaW5saW5lIGV2ZW50IG92ZXJ0YWtlcyB0aGUgcXVldWVkIGJhY2tsb2cg4oCUIGAnYmxvY2snYCB0cmFkZXMgZ2xvYmFsXG4gKiAgICAgb3JkZXJpbmcgZm9yIHplcm8gbG9zcyBhbmQgYm91bmRlZCBtZW1vcnkuIGBzZXFgIHN0aWxsIHRlbGxzIHRoZVxuICogICAgIHRydWUgYXJyaXZhbCBvcmRlci5cbiAqICAgLSBMaXN0ZW5lciByZWdpc3RyeSBpcyBpZGVtcG90ZW50IGJ5IGlkIChzYW1lIGlkIHJlcGxhY2VzLCBkaWZmZXJlbnRcbiAqICAgICBpZHMgY29leGlzdCkg4oCUIG1pcnJvcnMgdGhlIHJlcG8td2lkZSByZWNvcmRlciBJRCBjb250cmFjdC4gU3RhdHNcbiAqICAgICBhY2N1bXVsYXRlIHBlciBpZCBhY3Jvc3MgcmVwbGFjZW1lbnQ7IGByZW1vdmVMaXN0ZW5lcmAga2VlcHMgdGhlXG4gKiAgICAgaWQncyBhY2N1bXVsYXRlZCBzdGF0cyBmb3IgcG9zdC1ydW4gcmVwb3J0cy5cbiAqICAgLSBFdmVudHMgY2FwdHVyZWQgQkVGT1JFIGFueSBsaXN0ZW5lciBhdHRhY2hlcyBzdGF5IHF1ZXVlZCDigJQgYSBsaXN0ZW5lclxuICogICAgIGF0dGFjaGVkIGJlZm9yZSB0aGUgbmV4dCBjaGVja3BvaW50IHN0aWxsIHJlY2VpdmVzIHRoZSBiYWNrbG9nLlxuICpcbiAqIFBlci1saXN0ZW5lciB0aW1lIGFjY291bnRpbmcgKGFtZW5kbWVudCBBMiDigJQgXCJuYW1lIHRoZSBob2dcIik6IGN1bXVsYXRpdmVcbiAqIGB0b3RhbE1zYCBhbmQgcGVyLWNoZWNrcG9pbnQgYGxhc3RGbHVzaE1zYCBvZiBTWU5DIHRpbWUgcGVyIGxpc3RlbmVyIGlkIOKAlFxuICogdGhlIHRpbWUgdGhhdCBhY3R1YWxseSBibG9ja3MgdGhlIGZsdXNoLiBBbiBhc3luYyBsaXN0ZW5lcidzIGNvbnRpbnVhdGlvblxuICogdGltZSBpcyBpbnRlbnRpb25hbGx5IG5vdCBhdHRyaWJ1dGVkIChpdCBkb2VzIG5vdCBibG9jayBkZWxpdmVyeSkuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBDYXB0dXJlRW52ZWxvcGUsIHR5cGUgQ2FwdHVyZUhvb2tzLCB0eXBlIENhcHR1cmVQb2xpY3kgfSBmcm9tICcuLi9jYXB0dXJlL2VudmVsb3BlLmpzJztcbmltcG9ydCB7IHR5cGUgRmx1c2hTeW5jUmVzdWx0LCBGbHVzaERyaXZlciB9IGZyb20gJy4vZmx1c2hEcml2ZXIuanMnO1xuaW1wb3J0IHsgdHlwZSBFbnF1ZXVlSW5wdXQsIE1lcmdlZFF1ZXVlIH0gZnJvbSAnLi9tZXJnZWRRdWV1ZS5qcyc7XG5pbXBvcnQgeyB0eXBlIE92ZXJmbG93UG9saWN5IH0gZnJvbSAnLi9yaW5nLmpzJztcblxuLyoqXG4gKiBPbmUgZGVmZXJyZWQgb2JzZXJ2ZXIuIE1heSByZXR1cm4gYSBQcm9taXNlIOKAlCB0aGUgZGlzcGF0Y2hlciB0cmFja3MgaXQgaW5cbiAqIHRoZSBpbmZsaWdodCBzZXQgYnV0IE5FVkVSIGF3YWl0cyBpdCBkdXJpbmcgYSBmbHVzaC5cbiAqL1xuZXhwb3J0IHR5cGUgRGVmZXJyZWRMaXN0ZW5lciA9IChlbnZlbG9wZTogQ2FwdHVyZUVudmVsb3BlKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGludGVyZmFjZSBEaXNwYXRjaEVycm9yQ29udGV4dCB7XG4gIHJlYWRvbmx5IGxpc3RlbmVySWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZW52ZWxvcGU6IENhcHR1cmVFbnZlbG9wZTtcbiAgLyoqIGAnc3luYydgID0gbGlzdGVuZXIgdGhyZXc7IGAnYXN5bmMnYCA9IHJldHVybmVkIHByb21pc2UgcmVqZWN0ZWQuICovXG4gIHJlYWRvbmx5IHBoYXNlOiAnc3luYycgfCAnYXN5bmMnO1xufVxuXG4vKiogSW5qZWN0ZWQgZXJyb3Igc2luayDigJQgdGhlIHdpcmluZyBsYXllciByb3V0ZXMgdGhlc2UgKEJsb2NrIDYpLiAqL1xuZXhwb3J0IHR5cGUgRGlzcGF0Y2hFcnJvckhhbmRsZXIgPSAoZXJyb3I6IHVua25vd24sIGNvbnRleHQ6IERpc3BhdGNoRXJyb3JDb250ZXh0KSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlZmVycmVkRGlzcGF0Y2hlck9wdGlvbnMge1xuICAvKiogUXVldWUgYm91bmQg4oCUIGRlZmF1bHQgMTAgMDAwIChzZWUgYE1lcmdlZFF1ZXVlYCkuICovXG4gIHJlYWRvbmx5IG1heFF1ZXVlPzogbnVtYmVyO1xuICAvKiogT3ZlcmZsb3cgcG9saWN5IOKAlCBkZWZhdWx0IGAnZHJvcC1vbGRlc3QnYC4gKi9cbiAgcmVhZG9ubHkgb3ZlcmZsb3c/OiBPdmVyZmxvd1BvbGljeTtcbiAgLyoqIGAnc2FtcGxlJ2Agb3ZlcmZsb3cgb25seSDigJQgYWRtaXQgMSBpbiB0aGlzIG1hbnkgc2F0dXJhdGVkIGFycml2YWxzLiAqL1xuICByZWFkb25seSBzYW1wbGVFdmVyeT86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgY2FwdHVyZSBwb2xpY3kg4oCUIGRlZmF1bHQgYCdzdW1tYXJ5J2AuICovXG4gIHJlYWRvbmx5IGNhcHR1cmVQb2xpY3k/OiBDYXB0dXJlUG9saWN5O1xuICAvKiogUGVyLWZsdXNoIHRpbWUgYnVkZ2V0LCBtcyAoQTEpIOKAlCBkZWZhdWx0IDI7IGBJbmZpbml0eWAgPSBmdWxsIGRyYWluLiAqL1xuICByZWFkb25seSBmbHVzaEJ1ZGdldE1zPzogbnVtYmVyO1xuICAvKiogTGlzdGVuZXItZmFpbHVyZSBzaW5rLiBObyBkZWZhdWx0IOKAlCB3aXRob3V0IGl0LCBmYWlsdXJlcyBhcmUgc2lsZW50LiAqL1xuICByZWFkb25seSBvbkVycm9yPzogRGlzcGF0Y2hFcnJvckhhbmRsZXI7XG4gIC8qKiBDYXB0dXJlIHNlYW1zIChkZXYtd2FybiwgY2FwdHVyZWRBdCBjbG9jaykg4oCUIHNlZSBgQ2FwdHVyZUhvb2tzYC4gKi9cbiAgcmVhZG9ubHkgaG9va3M/OiBDYXB0dXJlSG9va3M7XG4gIC8qKiBUaW1pbmcgY2xvY2sgZm9yIGJ1ZGdldCArIHBlci1saXN0ZW5lciBhY2NvdW50aW5nLiBJbmplY3RhYmxlLiAqL1xuICByZWFkb25seSBub3c/OiAoKSA9PiBudW1iZXI7XG4gIC8qKiBDaGVja3BvaW50IHByaW1pdGl2ZSDigJQgZGVmYXVsdCBgcXVldWVNaWNyb3Rhc2tgLiBJbmplY3RhYmxlLiAqL1xuICByZWFkb25seSBzY2hlZHVsZT86IChjYjogKCkgPT4gdm9pZCkgPT4gdm9pZDtcbn1cblxuLyoqIFBlci1saXN0ZW5lciBhY2NvdW50aW5nIChBMi9BNCkuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlbmVyU3RhdHMge1xuICAvKiogRW52ZWxvcGVzIGRlbGl2ZXJlZCAoaW52b2NhdGlvbnMsIGluY2x1ZGluZyBvbmVzIHRoYXQgdGhyZXcpLiAqL1xuICByZWFkb25seSBldmVudHM6IG51bWJlcjtcbiAgLyoqIEN1bXVsYXRpdmUgc3luYyBkZWxpdmVyeSB0aW1lLCBtcy4gKi9cbiAgcmVhZG9ubHkgdG90YWxNczogbnVtYmVyO1xuICAvKiogU3luYyBkZWxpdmVyeSB0aW1lIHNpbmNlIHRoZSBsYXN0IGZsdXNoIHN0YXJ0ZWQsIG1zLiAqL1xuICByZWFkb25seSBsYXN0Rmx1c2hNczogbnVtYmVyO1xufVxuXG4vKiogVGhlIEJsb2NrIDkgb2JzZXJ2YWJpbGl0eSBzdXJmYWNlIChhbWVuZG1lbnQgQTQpIOKAlCBwdXJlIGdldHRlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGF0Y2hlclN0YXRzIHtcbiAgLyoqIEN1cnJlbnQgYmFja2xvZy4gKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcbiAgLyoqIEV2ZW50cyBMT1NUIChvdmVyZmxvdykg4oCUIG5ldmVyIHNpbGVudDsgYWxzbyB2aXNpYmxlIGFzIHNlcSBnYXBzLiAqL1xuICByZWFkb25seSBkcm9wczogbnVtYmVyO1xuICAvKiogQ29tcGxldGVkIGNoZWNrcG9pbnQgZmx1c2hlcy4gKi9cbiAgcmVhZG9ubHkgZmx1c2hlczogbnVtYmVyO1xuICAvKiogRmx1c2hlcyBjdXQgc2hvcnQgYnkgYGZsdXNoQnVkZ2V0TXNgIChBMSkuICovXG4gIHJlYWRvbmx5IGJ1ZGdldEV4aGF1c3RlZDogbnVtYmVyO1xuICAvKiogcDk1IGZsdXNoIGR1cmF0aW9uLCBtcyAocm9sbGluZyB3aW5kb3cpLiAqL1xuICByZWFkb25seSBwOTVGbHVzaE1zOiBudW1iZXI7XG4gIC8qKiBgJ2Jsb2NrJ2AtcG9saWN5IHJlZnVzYWxzIGRlbGl2ZXJlZCBzeW5jaHJvbm91c2x5IGlubGluZS4gKi9cbiAgcmVhZG9ubHkgaW5saW5lRGVsaXZlcmllczogbnVtYmVyO1xuICAvKiogQXN5bmMgbGlzdGVuZXIgY29udGludWF0aW9ucyBub3QgeWV0IHNldHRsZWQuICovXG4gIHJlYWRvbmx5IGluZmxpZ2h0OiBudW1iZXI7XG4gIC8qKiBQZXItbGlzdGVuZXIgdGltZSBhY2NvdW50aW5nIOKAlCBcIm5hbWUgdGhlIGhvZ1wiIChBMikuICovXG4gIHJlYWRvbmx5IHBlckxpc3RlbmVyOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBMaXN0ZW5lclN0YXRzPj47XG59XG5cbi8qKiBSZXN1bHQgb2Yge0BsaW5rIERlZmVycmVkRGlzcGF0Y2hlci5kcmFpbn0g4oCUIGBmbHVzaEFsbERldGFjaGVkYCBzaGFwZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHJhaW5SZXN1bHQge1xuICAvKiogQXN5bmMgY29udGludWF0aW9ucyBzZWVuIHNldHRsaW5nIGZ1bGZpbGxlZC4gQmVzdC1lZmZvcnQgY291bnQg4oCUIGFcbiAgICogIGNvbnRpbnVhdGlvbiB0aGF0IHNldHRsZXMgYmV0d2VlbiBjaGVja3MgaXMgZHJhaW5lZCBidXQgbWF5IG5vdCBiZVxuICAgKiAgY291bnRlZCAoc2FtZSBzZW1hbnRpY3MgYXMgYGZsdXNoQWxsRGV0YWNoZWRgKS4gKi9cbiAgcmVhZG9ubHkgZG9uZTogbnVtYmVyO1xuICAvKiogQ29udGludWF0aW9ucyB3aG9zZSBsaXN0ZW5lciBwcm9taXNlIHJlamVjdGVkIChyb3V0ZWQgdG8gb25FcnJvcikuICovXG4gIHJlYWRvbmx5IGZhaWxlZDogbnVtYmVyO1xuICAvKiogU3RpbGwgaW4gZmxpZ2h0IChvciBxdWV1ZWQpIHdoZW4gdGhlIGRlYWRsaW5lIGV4cGlyZWQuIGAwYCA9IGRyYWluZWQuICovXG4gIHJlYWRvbmx5IHBlbmRpbmc6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIE11dGFibGVMaXN0ZW5lclN0YXRzIHtcbiAgZXZlbnRzOiBudW1iZXI7XG4gIHRvdGFsTXM6IG51bWJlcjtcbiAgbGFzdEZsdXNoTXM6IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE5vdyA9ICgpOiBudW1iZXIgPT4gKHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBwZXJmb3JtYW5jZS5ub3coKSA6IERhdGUubm93KCkpO1xuXG5mdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlOiB2b2lkIHwgUHJvbWlzZTx2b2lkPik6IHZhbHVlIGlzIFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgKHZhbHVlIGFzIFByb21pc2U8dm9pZD4pLnRoZW4gPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZERpc3BhdGNoZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXVlOiBNZXJnZWRRdWV1ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBkcml2ZXI6IEZsdXNoRHJpdmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBEZWZlcnJlZExpc3RlbmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyU3RhdHMgPSBuZXcgTWFwPHN0cmluZywgTXV0YWJsZUxpc3RlbmVyU3RhdHM+KCk7XG4gIC8qKiBUcmFja2VkIGFzeW5jIGNvbnRpbnVhdGlvbnMg4oCUIHJlc29sdmUgYHRydWVgIChvaykgLyBgZmFsc2VgIChmYWlsZWQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGluZmxpZ2h0ID0gbmV3IFNldDxQcm9taXNlPGJvb2xlYW4+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRXJyb3I/OiBEaXNwYXRjaEVycm9ySGFuZGxlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBub3c6ICgpID0+IG51bWJlcjtcbiAgcHJpdmF0ZSBpbmxpbmVEZWxpdmVyaWVzID0gMDtcblxuICBjb25zdHJ1Y3RvcihvcHRzPzogRGVmZXJyZWREaXNwYXRjaGVyT3B0aW9ucykge1xuICAgIHRoaXMub25FcnJvciA9IG9wdHM/Lm9uRXJyb3I7XG4gICAgdGhpcy5ub3cgPSBvcHRzPy5ub3cgPz8gZGVmYXVsdE5vdztcbiAgICB0aGlzLnF1ZXVlID0gbmV3IE1lcmdlZFF1ZXVlKHtcbiAgICAgIG1heFF1ZXVlOiBvcHRzPy5tYXhRdWV1ZSxcbiAgICAgIG92ZXJmbG93OiBvcHRzPy5vdmVyZmxvdyxcbiAgICAgIHNhbXBsZUV2ZXJ5OiBvcHRzPy5zYW1wbGVFdmVyeSxcbiAgICAgIGNhcHR1cmVQb2xpY3k6IG9wdHM/LmNhcHR1cmVQb2xpY3ksXG4gICAgICBob29rczogb3B0cz8uaG9va3MsXG4gICAgfSk7XG4gICAgdGhpcy5kcml2ZXIgPSBuZXcgRmx1c2hEcml2ZXIoe1xuICAgICAgZGVwdGg6ICgpID0+IHRoaXMucXVldWUuZGVwdGgsXG4gICAgICBwcm9jZXNzTmV4dDogKCkgPT4gdGhpcy5kZWxpdmVyTmV4dCgpLFxuICAgICAgZmx1c2hCdWRnZXRNczogb3B0cz8uZmx1c2hCdWRnZXRNcyxcbiAgICAgIG5vdzogb3B0cz8ubm93LFxuICAgICAgc2NoZWR1bGU6IG9wdHM/LnNjaGVkdWxlLFxuICAgICAgb25GbHVzaFN0YXJ0OiAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgc3RhdHMgb2YgdGhpcy5saXN0ZW5lclN0YXRzLnZhbHVlcygpKSBzdGF0cy5sYXN0Rmx1c2hNcyA9IDA7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIElkZW1wb3RlbnQgYnkgaWQg4oCUIHNhbWUgaWQgcmVwbGFjZXMgKHN0YXRzIGNvbnRpbnVlKSwgaWRzIGNvZXhpc3QuICovXG4gIGFkZExpc3RlbmVyKGlkOiBzdHJpbmcsIGxpc3RlbmVyOiBEZWZlcnJlZExpc3RlbmVyKTogdm9pZCB7XG4gICAgdGhpcy5saXN0ZW5lcnMuc2V0KGlkLCBsaXN0ZW5lcik7XG4gICAgaWYgKCF0aGlzLmxpc3RlbmVyU3RhdHMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5saXN0ZW5lclN0YXRzLnNldChpZCwgeyBldmVudHM6IDAsIHRvdGFsTXM6IDAsIGxhc3RGbHVzaE1zOiAwIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdG9wIGRlbGl2ZXJpbmcgdG8gYGlkYC4gQWNjdW11bGF0ZWQgc3RhdHMgYXJlIGtlcHQgZm9yIHJlcG9ydHMuICovXG4gIHJlbW92ZUxpc3RlbmVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlbmVycy5kZWxldGUoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2R1Y2VyIGVudHJ5IHBvaW50OiBjYXB0dXJlIHRoZSBldmVudCAoc2VxLXN0YW1wZWQsIHBheWxvYWQgcGVyXG4gICAqIHBvbGljeSkgYW5kIHN0YWdlIGl0IGZvciB0aGUgbmV4dCBjaGVja3BvaW50LiBDaGVhcDsgTkVWRVIgdGhyb3dzO1xuICAgKiBuZXZlciBibG9ja3Mg4oCUIGV4Y2VwdCB1bmRlciBgJ2Jsb2NrJ2Agb3ZlcmZsb3csIHdoZXJlIGEgcmVmdXNlZFxuICAgKiBlbnF1ZXVlIGlzIGRlbGl2ZXJlZCBzeW5jaHJvbm91c2x5IGlubGluZSAoZXhwbGljaXQgY29uc3VtZXIgY2hvaWNlKS5cbiAgICovXG4gIGNhcHR1cmUoaW5wdXQ6IEVucXVldWVJbnB1dCwgcG9saWN5PzogQ2FwdHVyZVBvbGljeSk6IHZvaWQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucXVldWUuZW5xdWV1ZShpbnB1dCwgcG9saWN5KTtcbiAgICBpZiAocmVzdWx0Lm91dGNvbWUgPT09ICdxdWV1ZWQnKSB7XG4gICAgICB0aGlzLmRyaXZlci5hcm0oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5vdXRjb21lID09PSAnaW5saW5lJykge1xuICAgICAgdGhpcy5pbmxpbmVEZWxpdmVyaWVzICs9IDE7XG4gICAgICB0aGlzLmRlbGl2ZXIocmVzdWx0LmVudmVsb3BlKTtcbiAgICB9XG4gICAgLy8gJ2Ryb3BwZWQnOiBjb3VudGVkIGJ5IHRoZSBxdWV1ZTsgbG9zcyBzdXJmYWNlcyBpbiBzdGF0cyArIHNlcSBnYXBzLlxuICB9XG5cbiAgLyoqXG4gICAqIFRlcm1pbmFsIGZsdXNoIOKAlCBzeW5jaHJvbm91c2x5IGRlbGl2ZXIgZXZlcnl0aGluZyBxdWV1ZWQgKGVuZCBvZiBydW4gL1xuICAgKiBzaHV0ZG93bikuIEFzeW5jIGxpc3RlbmVyIGNvbnRpbnVhdGlvbnMgYXJlIE5PVCBhd2FpdGVkOyBmb2xsb3cgd2l0aFxuICAgKiBgZHJhaW4oKWAgZm9yIHRoYXQuXG4gICAqL1xuICBmbHVzaE5vdyhvcHRzPzogeyBtYXhSb3VuZHM/OiBudW1iZXIgfSk6IEZsdXNoU3luY1Jlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuZHJpdmVyLmZsdXNoU3luYyhvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCB0aGUgYmFja2xvZywgdGhlbiBzZXR0bGUgYWxsIGluZmxpZ2h0IGFzeW5jIGNvbnRpbnVhdGlvbnMg4oCUXG4gICAqIGBQcm9taXNlLmFsbFNldHRsZWRgIHVuZGVyIGEgZGVhZGxpbmUsIHNoYXBlZCBsaWtlIGBmbHVzaEFsbERldGFjaGVkYC5cbiAgICogTG9vcHMgd2hpbGUgY29udGludWF0aW9ucyBzcGF3biBuZXcgY2FwdHVyZXMsIHVudGlsIHF1aWVzY2VudCBvciB0aGVcbiAgICogZGVhZGxpbmUgZXhwaXJlcy5cbiAgICovXG4gIGFzeW5jIGRyYWluKG9wdHM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogUHJvbWlzZTxEcmFpblJlc3VsdD4ge1xuICAgIGNvbnN0IHRpbWVvdXRNcyA9IG9wdHM/LnRpbWVvdXRNcyA/PyAzMF8wMDA7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZG9uZSA9IDA7XG4gICAgbGV0IGZhaWxlZCA9IDA7XG5cbiAgICB0aGlzLmZsdXNoTm93KCk7XG4gICAgd2hpbGUgKHRoaXMuaW5mbGlnaHQuc2l6ZSA+IDApIHtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ01zID0gdGltZW91dE1zIC0gKERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgICAgaWYgKHJlbWFpbmluZ01zIDw9IDApIHJldHVybiB7IGRvbmUsIGZhaWxlZCwgcGVuZGluZzogdGhpcy5pbmZsaWdodC5zaXplICsgdGhpcy5xdWV1ZS5kZXB0aCB9O1xuXG4gICAgICBjb25zdCBiYXRjaCA9IFsuLi50aGlzLmluZmxpZ2h0XTtcbiAgICAgIGxldCB0aW1lcklkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8J19fZHJhaW5fdGltZW91dF9fJz4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgnX19kcmFpbl90aW1lb3V0X18nKSwgcmVtYWluaW5nTXMpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtQcm9taXNlLmFsbFNldHRsZWQoYmF0Y2gpLCB0aW1lb3V0UHJvbWlzZV0pO1xuICAgICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgaWYgKHNldHRsZWQgPT09ICdfX2RyYWluX3RpbWVvdXRfXycpIHtcbiAgICAgICAgcmV0dXJuIHsgZG9uZSwgZmFpbGVkLCBwZW5kaW5nOiB0aGlzLmluZmxpZ2h0LnNpemUgKyB0aGlzLnF1ZXVlLmRlcHRoIH07XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHIgb2Ygc2V0dGxlZCkge1xuICAgICAgICAvLyBUcmFja2VkIHByb21pc2VzIG5ldmVyIHJlamVjdCDigJQgdGhleSByZXNvbHZlIHRydWUgKG9rKSAvIGZhbHNlLlxuICAgICAgICBpZiAoci5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHIudmFsdWUgPT09IGZhbHNlKSBmYWlsZWQgKz0gMTtcbiAgICAgICAgZWxzZSBkb25lICs9IDE7XG4gICAgICB9XG4gICAgICAvLyBDb250aW51YXRpb25zIG1heSBoYXZlIGNhcHR1cmVkIG1vcmUgZXZlbnRzIOKAlCBmbHVzaCBhbmQgcmUtY2hlY2suXG4gICAgICB0aGlzLmZsdXNoTm93KCk7XG4gICAgfVxuICAgIHJldHVybiB7IGRvbmUsIGZhaWxlZCwgcGVuZGluZzogdGhpcy5xdWV1ZS5kZXB0aCB9O1xuICB9XG5cbiAgLyoqIEE0IOKAlCB0aGUgc3RhdHMgb2JqZWN0IEJsb2NrIDkgY29uc3VtZXMuIFB1cmUgZ2V0dGVyLCBmcmVzaCBzbmFwc2hvdC4gKi9cbiAgZ2V0U3RhdHMoKTogRGlzcGF0Y2hlclN0YXRzIHtcbiAgICBjb25zdCBjb3VudGVycyA9IHRoaXMucXVldWUuZ2V0Q291bnRlcnMoKTtcbiAgICBjb25zdCBkcml2ZXJTdGF0cyA9IHRoaXMuZHJpdmVyLmdldFN0YXRzKCk7XG4gICAgY29uc3QgcGVyTGlzdGVuZXI6IFJlY29yZDxzdHJpbmcsIExpc3RlbmVyU3RhdHM+ID0ge307XG4gICAgZm9yIChjb25zdCBbaWQsIHN0YXRzXSBvZiB0aGlzLmxpc3RlbmVyU3RhdHMpIHtcbiAgICAgIHBlckxpc3RlbmVyW2lkXSA9IHsgZXZlbnRzOiBzdGF0cy5ldmVudHMsIHRvdGFsTXM6IHN0YXRzLnRvdGFsTXMsIGxhc3RGbHVzaE1zOiBzdGF0cy5sYXN0Rmx1c2hNcyB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGVwdGg6IHRoaXMucXVldWUuZGVwdGgsXG4gICAgICBkcm9wczogY291bnRlcnMuZHJvcHMsXG4gICAgICBmbHVzaGVzOiBkcml2ZXJTdGF0cy5mbHVzaGVzLFxuICAgICAgYnVkZ2V0RXhoYXVzdGVkOiBkcml2ZXJTdGF0cy5idWRnZXRFeGhhdXN0ZWQsXG4gICAgICBwOTVGbHVzaE1zOiBkcml2ZXJTdGF0cy5wOTVGbHVzaE1zLFxuICAgICAgaW5saW5lRGVsaXZlcmllczogdGhpcy5pbmxpbmVEZWxpdmVyaWVzLFxuICAgICAgaW5mbGlnaHQ6IHRoaXMuaW5mbGlnaHQuc2l6ZSxcbiAgICAgIHBlckxpc3RlbmVyLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGRlbGl2ZXJOZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVudmVsb3BlID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgIGlmIChlbnZlbG9wZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5kZWxpdmVyKGVudmVsb3BlKTtcbiAgfVxuXG4gIC8qKiBJbnZva2UgZXZlcnkgbGlzdGVuZXIgd2l0aCBmdWxsIGVycm9yIGlzb2xhdGlvbiArIHRpbWUgYWNjb3VudGluZy4gKi9cbiAgcHJpdmF0ZSBkZWxpdmVyKGVudmVsb3BlOiBDYXB0dXJlRW52ZWxvcGUpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgbGlzdGVuZXJdIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICBjb25zdCBzdGF0cyA9IHRoaXMubGlzdGVuZXJTdGF0cy5nZXQoaWQpIGFzIE11dGFibGVMaXN0ZW5lclN0YXRzO1xuICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLm5vdygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbGlzdGVuZXIoZW52ZWxvcGUpO1xuICAgICAgICBpZiAoaXNUaGVuYWJsZShyZXN1bHQpKSB0aGlzLnRyYWNrKHJlc3VsdCwgaWQsIGVudmVsb3BlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuc2FmZU9uRXJyb3IoZXJyb3IsIHsgbGlzdGVuZXJJZDogaWQsIGVudmVsb3BlLCBwaGFzZTogJ3N5bmMnIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29uc3QgZWxhcHNlZCA9IHRoaXMubm93KCkgLSBzdGFydDtcbiAgICAgICAgc3RhdHMuZXZlbnRzICs9IDE7XG4gICAgICAgIHN0YXRzLnRvdGFsTXMgKz0gZWxhcHNlZDtcbiAgICAgICAgc3RhdHMubGFzdEZsdXNoTXMgKz0gZWxhcHNlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogVHJhY2sgYW4gYXN5bmMgY29udGludWF0aW9uOyByb3V0ZSBpdHMgcmVqZWN0aW9uOyBuZXZlciByZWplY3QuICovXG4gIHByaXZhdGUgdHJhY2socHJvbWlzZTogUHJvbWlzZTx2b2lkPiwgbGlzdGVuZXJJZDogc3RyaW5nLCBlbnZlbG9wZTogQ2FwdHVyZUVudmVsb3BlKTogdm9pZCB7XG4gICAgY29uc3QgdHJhY2tlZDogUHJvbWlzZTxib29sZWFuPiA9IHByb21pc2UudGhlbihcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5zYWZlT25FcnJvcihlcnJvciwgeyBsaXN0ZW5lcklkLCBlbnZlbG9wZSwgcGhhc2U6ICdhc3luYycgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmluZmxpZ2h0LmFkZCh0cmFja2VkKTtcbiAgICAvLyBTZWxmLWNsZWFudXAg4oCUIGB0cmFja2VkYCBuZXZlciByZWplY3RzLCBzbyB0aGlzIGNoYWluIGNhbm5vdCBmbG9hdCBhblxuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gICAgdHJhY2tlZC50aGVuKCgpID0+IHRoaXMuaW5mbGlnaHQuZGVsZXRlKHRyYWNrZWQpKTtcbiAgfVxuXG4gIC8qKiBUaGUgZXJyb3Igc2luayBtdXN0IG5ldmVyIGJlY29tZSBhbiBlcnJvciBzb3VyY2UuICovXG4gIHByaXZhdGUgc2FmZU9uRXJyb3IoZXJyb3I6IHVua25vd24sIGNvbnRleHQ6IERpc3BhdGNoRXJyb3JDb250ZXh0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25FcnJvcj8uKGVycm9yLCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFN3YWxsb3cg4oCUIGlzb2xhdGlvbiBpcyBhYnNvbHV0ZS5cbiAgICB9XG4gIH1cbn1cbiJdfQ==
237
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmZXJyZWREaXNwYXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9vYnNlcnZlci1xdWV1ZS9kZWZlcnJlZERpc3BhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q0c7OztBQUdILDZEQUEwRDtBQUMxRCxxREFBcUU7QUFDckUscURBQWtFO0FBd0ZsRSxNQUFNLFVBQVUsR0FBRyxHQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sV0FBVyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUV2RyxTQUFTLFVBQVUsQ0FBQyxLQUEyQjtJQUM3QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQVEsS0FBdUIsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0FBQzVHLENBQUM7QUFFRCxNQUFhLGtCQUFrQjtJQUNaLEtBQUssQ0FBYztJQUNuQixNQUFNLENBQWM7SUFDcEIsU0FBUyxHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDO0lBQ2hELGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUN6RSw0RUFBNEU7SUFDM0QsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQ3ZDLE9BQU8sQ0FBd0I7SUFDL0IsR0FBRyxDQUFlO0lBQzNCLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUU3QixZQUFZLElBQWdDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFB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QixPQUFPLENBQUMsSUFBSSxDQUM1QyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQ1YsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNSLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNsRSxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0Isd0VBQXdFO1FBQ3hFLHVCQUF1QjtRQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELHdEQUF3RDtJQUNoRCxXQUFXLENBQUMsS0FBYyxFQUFFLE9BQTZCO1FBQy9ELElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLG1DQUFtQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBekxELGdEQXlMQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogb2JzZXJ2ZXItcXVldWUvZGVmZXJyZWREaXNwYXRjaGVyLnRzIOKAlCBSRkMtMDAxIEJsb2NrIDU6IGRlZmVycmVkIGRlbGl2ZXJ5IGZhw6dhZGUuXG4gKlxuICogUGF0dGVybjogIGNhcHR1cmUg4oaSIGVucXVldWUg4oaSIChtaWNyb3Rhc2spIGZsdXNoIOKGkiBpbnZva2UsIHdpdGggcGVyLWxpc3RlbmVyXG4gKiAgICAgICAgICAgZXJyb3IgaXNvbGF0aW9uLiBDb21wb3NlcyB0aGUgd2hvbGUgcHVyZSBwaXBlbGluZTogTWVyZ2VkUXVldWVcbiAqICAgICAgICAgICAoQmxvY2sgMywgd2hpY2ggY2FwdHVyZXMgdmlhIEJsb2NrIDEpICsgRmx1c2hEcml2ZXIgKEJsb2NrIDQpICtcbiAqICAgICAgICAgICBhIGxpc3RlbmVyIHJlZ2lzdHJ5IHdpdGggdGltaW5nL2luZmxpZ2h0IGFjY291bnRpbmcuXG4gKiBSb2xlOiAgICAgVGhlIHBpcGVsaW5lIGhlbGQgYnkgYHJ1bm5lci9EZWZlcnJlZE9ic2VydmVyVGllci50cyDCtyBEZWZlcnJlZE9ic2VydmVyVGllcmAuXG4gKiAgICAgICAgICAgUHJvZHVjZXJzIGNhbGwgYGNhcHR1cmUoKWA7IGxpc3RlbmVyc1xuICogICAgICAgICAgIHJlY2VpdmUgZW52ZWxvcGVzIGF0IHRoZSBuZXh0IGNoZWNrcG9pbnQsIFwib25lIGJlYXQgYmVoaW5kXCIuXG4gKiAgICAgICAgICAgUHVyZSBtb2R1bGUg4oCUIHplcm8gZW5naW5lIGltcG9ydHMuIEJlc2lkZSB0aGUgY2FwdHVyZVxuICogICAgICAgICAgIGVudmVsb3BlJ3MgdHlwZXMsIGl0IGltcG9ydHMgb25seSB0aGUgTDAgbG9uZy10aW1lciBsZWFmXG4gKiAgICAgICAgICAgKGB0aW1lcnMvbG9uZ1RpbWVvdXQudHNgKSwgd2hpY2ggYXJtcyBgZHJhaW5gJ3MgZGVhZGxpbmUuXG4gKlxuICogRGVsaXZlcnkgc2VtYW50aWNzIChub3JtYXRpdmUsIFJGQy0wMDEgwqc1ICsgYW1lbmRtZW50cyBBMi9BNCk6XG4gKiAgIC0gUGVyLWxpc3RlbmVyIEZJRk86IGV2ZXJ5IGxpc3RlbmVyIHNlZXMgZW52ZWxvcGVzIGluIHNlcSBvcmRlclxuICogICAgIChpbnZvY2F0aW9uIG9yZGVyOyBhbiBhc3luYyBsaXN0ZW5lcidzIENPTVBMRVRJT04gb3JkZXIgaXMgaXRzIG93blxuICogICAgIGNvbmNlcm4pIOKAlCBFWENFUFQgdW5kZXIgYCdibG9jaydgIG92ZXJmbG93LCB3aGVyZSBhIHJlZnVzZWQgZW5xdWV1ZVxuICogICAgIGlzIGRlbGl2ZXJlZCBpbmxpbmUgYW5kIG92ZXJ0YWtlcyB0aGUgcXVldWVkIGJhY2tsb2cuIGBzZXFgIGFsd2F5c1xuICogICAgIHJlY29yZHMgdHJ1ZSBhcnJpdmFsIG9yZGVyLCBzbyBvcmRlci1zZW5zaXRpdmUgY29uc3VtZXJzIHJlLXNvcnQ7XG4gKiAgICAgc2VlIHRoZSBgJ2Jsb2NrJ2AgY2F2ZWF0IGJlbG93LlxuICogICAtIEVycm9yIGlzb2xhdGlvbjogYSB0aHJvd2luZyBsaXN0ZW5lciAoc3luYykgb3IgcmVqZWN0aW5nIGxpc3RlbmVyXG4gKiAgICAgKGFzeW5jKSBuZXZlciBhZmZlY3RzIHNpYmxpbmdzIG9yIHRoZSBwcm9kdWNlci4gQm90aCBmYWlsdXJlIG1vZGVzXG4gKiAgICAgcm91dGUgdG8gdGhlIGluamVjdGVkIGBvbkVycm9yYDsgYSB0aHJvd2luZyBgb25FcnJvcmAgaXMgaXRzZWxmXG4gKiAgICAgc3dhbGxvd2VkLlxuICogICAtIFRoZSBmbHVzaCBORVZFUiBhd2FpdHMgYSBsaXN0ZW5lci4gQXN5bmMgY29udGludWF0aW9ucyBhcmUgdHJhY2tlZCBpblxuICogICAgIGFuIGluZmxpZ2h0IHNldDsgYGRyYWluKHsgdGltZW91dE1zIH0pYCBzZXR0bGVzIHRoZW1cbiAqICAgICAoYFByb21pc2UuYWxsU2V0dGxlZGAgKyBkZWFkbGluZSwgc2hhcGVkIGxpa2UgYGZsdXNoQWxsRGV0YWNoZWRgKS5cbiAqICAgLSBgJ2Jsb2NrJ2Agb3ZlcmZsb3c6IGEgcmVmdXNlZCBlbnF1ZXVlIGlzIGRlbGl2ZXJlZCBzeW5jaHJvbm91c2x5XG4gKiAgICAgSU5MSU5FIGZyb20gYGNhcHR1cmUoKWAg4oCUIHJlLWludHJvZHVjaW5nIGJsb2NraW5nIGRlbGl2ZXJ5IGJ5IHRoZVxuICogICAgIGNvbnN1bWVyJ3MgZXhwbGljaXQgY2hvaWNlLiBPcmRlcmluZyBjYXZlYXQgKGRvY3VtZW50ZWQgKyB0ZXN0ZWQpOiBhblxuICogICAgIGlubGluZSBldmVudCBvdmVydGFrZXMgdGhlIHF1ZXVlZCBiYWNrbG9nIOKAlCBgJ2Jsb2NrJ2AgdHJhZGVzIGdsb2JhbFxuICogICAgIG9yZGVyaW5nIGZvciB6ZXJvIGxvc3MgYW5kIGJvdW5kZWQgbWVtb3J5LiBgc2VxYCBzdGlsbCB0ZWxscyB0aGVcbiAqICAgICB0cnVlIGFycml2YWwgb3JkZXIuXG4gKiAgIC0gTGlzdGVuZXIgcmVnaXN0cnkgaXMgaWRlbXBvdGVudCBieSBpZCAoc2FtZSBpZCByZXBsYWNlcywgZGlmZmVyZW50XG4gKiAgICAgaWRzIGNvZXhpc3QpIOKAlCBtaXJyb3JzIHRoZSByZXBvLXdpZGUgcmVjb3JkZXIgSUQgY29udHJhY3QuIFN0YXRzXG4gKiAgICAgYWNjdW11bGF0ZSBwZXIgaWQgYWNyb3NzIHJlcGxhY2VtZW50OyBgcmVtb3ZlTGlzdGVuZXJgIGtlZXBzIHRoZVxuICogICAgIGlkJ3MgYWNjdW11bGF0ZWQgc3RhdHMgZm9yIHBvc3QtcnVuIHJlcG9ydHMuXG4gKiAgIC0gRXZlbnRzIGNhcHR1cmVkIEJFRk9SRSBhbnkgbGlzdGVuZXIgYXR0YWNoZXMgc3RheSBxdWV1ZWQg4oCUIGEgbGlzdGVuZXJcbiAqICAgICBhdHRhY2hlZCBiZWZvcmUgdGhlIG5leHQgY2hlY2twb2ludCBzdGlsbCByZWNlaXZlcyB0aGUgYmFja2xvZy5cbiAqXG4gKiBQZXItbGlzdGVuZXIgdGltZSBhY2NvdW50aW5nIChhbWVuZG1lbnQgQTIg4oCUIFwibmFtZSB0aGUgaG9nXCIpOiBjdW11bGF0aXZlXG4gKiBgdG90YWxNc2AgYW5kIHBlci1jaGVja3BvaW50IGBsYXN0Rmx1c2hNc2Agb2YgU1lOQyB0aW1lIHBlciBsaXN0ZW5lciBpZCDigJRcbiAqIHRoZSB0aW1lIHRoYXQgYWN0dWFsbHkgYmxvY2tzIHRoZSBmbHVzaC4gQW4gYXN5bmMgbGlzdGVuZXIncyBjb250aW51YXRpb25cbiAqIHRpbWUgaXMgaW50ZW50aW9uYWxseSBub3QgYXR0cmlidXRlZCAoaXQgZG9lcyBub3QgYmxvY2sgZGVsaXZlcnkpLlxuICovXG5cbmltcG9ydCB7IHR5cGUgQ2FwdHVyZUVudmVsb3BlLCB0eXBlIENhcHR1cmVIb29rcywgdHlwZSBDYXB0dXJlUG9saWN5IH0gZnJvbSAnLi4vY2FwdHVyZS9lbnZlbG9wZS5qcyc7XG5pbXBvcnQgeyBzZXRMb25nVGltZW91dCB9IGZyb20gJy4uL3RpbWVycy9sb25nVGltZW91dC5qcyc7XG5pbXBvcnQgeyB0eXBlIEZsdXNoU3luY1Jlc3VsdCwgRmx1c2hEcml2ZXIgfSBmcm9tICcuL2ZsdXNoRHJpdmVyLmpzJztcbmltcG9ydCB7IHR5cGUgRW5xdWV1ZUlucHV0LCBNZXJnZWRRdWV1ZSB9IGZyb20gJy4vbWVyZ2VkUXVldWUuanMnO1xuaW1wb3J0IHsgdHlwZSBPdmVyZmxvd1BvbGljeSB9IGZyb20gJy4vcmluZy5qcyc7XG5cbi8qKlxuICogT25lIGRlZmVycmVkIG9ic2VydmVyLiBNYXkgcmV0dXJuIGEgUHJvbWlzZSDigJQgdGhlIGRpc3BhdGNoZXIgdHJhY2tzIGl0IGluXG4gKiB0aGUgaW5mbGlnaHQgc2V0IGJ1dCBORVZFUiBhd2FpdHMgaXQgZHVyaW5nIGEgZmx1c2guXG4gKi9cbmV4cG9ydCB0eXBlIERlZmVycmVkTGlzdGVuZXIgPSAoZW52ZWxvcGU6IENhcHR1cmVFbnZlbG9wZSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGF0Y2hFcnJvckNvbnRleHQge1xuICByZWFkb25seSBsaXN0ZW5lcklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudmVsb3BlOiBDYXB0dXJlRW52ZWxvcGU7XG4gIC8qKiBgJ3N5bmMnYCA9IGxpc3RlbmVyIHRocmV3OyBgJ2FzeW5jJ2AgPSByZXR1cm5lZCBwcm9taXNlIHJlamVjdGVkLiAqL1xuICByZWFkb25seSBwaGFzZTogJ3N5bmMnIHwgJ2FzeW5jJztcbn1cblxuLyoqIEluamVjdGVkIGVycm9yIHNpbmsg4oCUIHRoZSB3aXJpbmcgbGF5ZXIgcm91dGVzIHRoZXNlIChCbG9jayA2KS4gKi9cbmV4cG9ydCB0eXBlIERpc3BhdGNoRXJyb3JIYW5kbGVyID0gKGVycm9yOiB1bmtub3duLCBjb250ZXh0OiBEaXNwYXRjaEVycm9yQ29udGV4dCkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBEZWZlcnJlZERpc3BhdGNoZXJPcHRpb25zIHtcbiAgLyoqIFF1ZXVlIGJvdW5kIOKAlCBkZWZhdWx0IDEwIDAwMCAoc2VlIGBNZXJnZWRRdWV1ZWApLiAqL1xuICByZWFkb25seSBtYXhRdWV1ZT86IG51bWJlcjtcbiAgLyoqIE92ZXJmbG93IHBvbGljeSDigJQgZGVmYXVsdCBgJ2Ryb3Atb2xkZXN0J2AuICovXG4gIHJlYWRvbmx5IG92ZXJmbG93PzogT3ZlcmZsb3dQb2xpY3k7XG4gIC8qKiBgJ3NhbXBsZSdgIG92ZXJmbG93IG9ubHkg4oCUIGFkbWl0IDEgaW4gdGhpcyBtYW55IHNhdHVyYXRlZCBhcnJpdmFscy4gKi9cbiAgcmVhZG9ubHkgc2FtcGxlRXZlcnk/OiBudW1iZXI7XG4gIC8qKiBEZWZhdWx0IGNhcHR1cmUgcG9saWN5IOKAlCBkZWZhdWx0IGAnc3VtbWFyeSdgLiAqL1xuICByZWFkb25seSBjYXB0dXJlUG9saWN5PzogQ2FwdHVyZVBvbGljeTtcbiAgLyoqIFBlci1mbHVzaCB0aW1lIGJ1ZGdldCwgbXMgKEExKSDigJQgZGVmYXVsdCAyOyBgSW5maW5pdHlgID0gZnVsbCBkcmFpbi4gKi9cbiAgcmVhZG9ubHkgZmx1c2hCdWRnZXRNcz86IG51bWJlcjtcbiAgLyoqIExpc3RlbmVyLWZhaWx1cmUgc2luay4gTm8gZGVmYXVsdCDigJQgd2l0aG91dCBpdCwgZmFpbHVyZXMgYXJlIHNpbGVudC4gKi9cbiAgcmVhZG9ubHkgb25FcnJvcj86IERpc3BhdGNoRXJyb3JIYW5kbGVyO1xuICAvKiogQ2FwdHVyZSBzZWFtcyAoZGV2LXdhcm4sIGNhcHR1cmVkQXQgY2xvY2spIOKAlCBzZWUgYENhcHR1cmVIb29rc2AuICovXG4gIHJlYWRvbmx5IGhvb2tzPzogQ2FwdHVyZUhvb2tzO1xuICAvKiogVGltaW5nIGNsb2NrIGZvciBidWRnZXQgKyBwZXItbGlzdGVuZXIgYWNjb3VudGluZy4gSW5qZWN0YWJsZS4gKi9cbiAgcmVhZG9ubHkgbm93PzogKCkgPT4gbnVtYmVyO1xuICAvKiogQ2hlY2twb2ludCBwcmltaXRpdmUg4oCUIGRlZmF1bHQgYHF1ZXVlTWljcm90YXNrYC4gSW5qZWN0YWJsZS4gKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU/OiAoY2I6ICgpID0+IHZvaWQpID0+IHZvaWQ7XG59XG5cbi8qKiBQZXItbGlzdGVuZXIgYWNjb3VudGluZyAoQTIvQTQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0ZW5lclN0YXRzIHtcbiAgLyoqIEVudmVsb3BlcyBkZWxpdmVyZWQgKGludm9jYXRpb25zLCBpbmNsdWRpbmcgb25lcyB0aGF0IHRocmV3KS4gKi9cbiAgcmVhZG9ubHkgZXZlbnRzOiBudW1iZXI7XG4gIC8qKiBDdW11bGF0aXZlIHN5bmMgZGVsaXZlcnkgdGltZSwgbXMuICovXG4gIHJlYWRvbmx5IHRvdGFsTXM6IG51bWJlcjtcbiAgLyoqIFN5bmMgZGVsaXZlcnkgdGltZSBzaW5jZSB0aGUgbGFzdCBmbHVzaCBzdGFydGVkLCBtcy4gKi9cbiAgcmVhZG9ubHkgbGFzdEZsdXNoTXM6IG51bWJlcjtcbn1cblxuLyoqIFRoZSBCbG9jayA5IG9ic2VydmFiaWxpdHkgc3VyZmFjZSAoYW1lbmRtZW50IEE0KSDigJQgcHVyZSBnZXR0ZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3BhdGNoZXJTdGF0cyB7XG4gIC8qKiBDdXJyZW50IGJhY2tsb2cuICovXG4gIHJlYWRvbmx5IGRlcHRoOiBudW1iZXI7XG4gIC8qKiBFdmVudHMgTE9TVCAob3ZlcmZsb3cpIOKAlCBuZXZlciBzaWxlbnQ7IGFsc28gdmlzaWJsZSBhcyBzZXEgZ2Fwcy4gKi9cbiAgcmVhZG9ubHkgZHJvcHM6IG51bWJlcjtcbiAgLyoqIENvbXBsZXRlZCBjaGVja3BvaW50IGZsdXNoZXMuICovXG4gIHJlYWRvbmx5IGZsdXNoZXM6IG51bWJlcjtcbiAgLyoqIEZsdXNoZXMgY3V0IHNob3J0IGJ5IGBmbHVzaEJ1ZGdldE1zYCAoQTEpLiAqL1xuICByZWFkb25seSBidWRnZXRFeGhhdXN0ZWQ6IG51bWJlcjtcbiAgLyoqIHA5NSBmbHVzaCBkdXJhdGlvbiwgbXMgKHJvbGxpbmcgd2luZG93KS4gKi9cbiAgcmVhZG9ubHkgcDk1Rmx1c2hNczogbnVtYmVyO1xuICAvKiogYCdibG9jaydgLXBvbGljeSByZWZ1c2FscyBkZWxpdmVyZWQgc3luY2hyb25vdXNseSBpbmxpbmUuICovXG4gIHJlYWRvbmx5IGlubGluZURlbGl2ZXJpZXM6IG51bWJlcjtcbiAgLyoqIEFzeW5jIGxpc3RlbmVyIGNvbnRpbnVhdGlvbnMgbm90IHlldCBzZXR0bGVkLiAqL1xuICByZWFkb25seSBpbmZsaWdodDogbnVtYmVyO1xuICAvKiogUGVyLWxpc3RlbmVyIHRpbWUgYWNjb3VudGluZyDigJQgXCJuYW1lIHRoZSBob2dcIiAoQTIpLiAqL1xuICByZWFkb25seSBwZXJMaXN0ZW5lcjogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgTGlzdGVuZXJTdGF0cz4+O1xufVxuXG4vKiogUmVzdWx0IG9mIHtAbGluayBEZWZlcnJlZERpc3BhdGNoZXIuZHJhaW59IOKAlCBgZmx1c2hBbGxEZXRhY2hlZGAgc2hhcGUuICovXG5leHBvcnQgaW50ZXJmYWNlIERyYWluUmVzdWx0IHtcbiAgLyoqIEFzeW5jIGNvbnRpbnVhdGlvbnMgc2VlbiBzZXR0bGluZyBmdWxmaWxsZWQuIEJlc3QtZWZmb3J0IGNvdW50IOKAlCBhXG4gICAqICBjb250aW51YXRpb24gdGhhdCBzZXR0bGVzIGJldHdlZW4gY2hlY2tzIGlzIGRyYWluZWQgYnV0IG1heSBub3QgYmVcbiAgICogIGNvdW50ZWQgKHNhbWUgc2VtYW50aWNzIGFzIGBmbHVzaEFsbERldGFjaGVkYCkuICovXG4gIHJlYWRvbmx5IGRvbmU6IG51bWJlcjtcbiAgLyoqIENvbnRpbnVhdGlvbnMgd2hvc2UgbGlzdGVuZXIgcHJvbWlzZSByZWplY3RlZCAocm91dGVkIHRvIG9uRXJyb3IpLiAqL1xuICByZWFkb25seSBmYWlsZWQ6IG51bWJlcjtcbiAgLyoqIFN0aWxsIGluIGZsaWdodCAob3IgcXVldWVkKSB3aGVuIHRoZSBkZWFkbGluZSBleHBpcmVkLiBgMGAgPSBkcmFpbmVkLiAqL1xuICByZWFkb25seSBwZW5kaW5nOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBNdXRhYmxlTGlzdGVuZXJTdGF0cyB7XG4gIGV2ZW50czogbnVtYmVyO1xuICB0b3RhbE1zOiBudW1iZXI7XG4gIGxhc3RGbHVzaE1zOiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHROb3cgPSAoKTogbnVtYmVyID0+ICh0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnID8gcGVyZm9ybWFuY2Uubm93KCkgOiBEYXRlLm5vdygpKTtcblxuZnVuY3Rpb24gaXNUaGVuYWJsZSh2YWx1ZTogdm9pZCB8IFByb21pc2U8dm9pZD4pOiB2YWx1ZSBpcyBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mICh2YWx1ZSBhcyBQcm9taXNlPHZvaWQ+KS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgY2xhc3MgRGVmZXJyZWREaXNwYXRjaGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWV1ZTogTWVyZ2VkUXVldWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHJpdmVyOiBGbHVzaERyaXZlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgRGVmZXJyZWRMaXN0ZW5lcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lclN0YXRzID0gbmV3IE1hcDxzdHJpbmcsIE11dGFibGVMaXN0ZW5lclN0YXRzPigpO1xuICAvKiogVHJhY2tlZCBhc3luYyBjb250aW51YXRpb25zIOKAlCByZXNvbHZlIGB0cnVlYCAob2spIC8gYGZhbHNlYCAoZmFpbGVkKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbmZsaWdodCA9IG5ldyBTZXQ8UHJvbWlzZTxib29sZWFuPj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkVycm9yPzogRGlzcGF0Y2hFcnJvckhhbmRsZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbm93OiAoKSA9PiBudW1iZXI7XG4gIHByaXZhdGUgaW5saW5lRGVsaXZlcmllcyA9IDA7XG5cbiAgY29uc3RydWN0b3Iob3B0cz86IERlZmVycmVkRGlzcGF0Y2hlck9wdGlvbnMpIHtcbiAgICB0aGlzLm9uRXJyb3IgPSBvcHRzPy5vbkVycm9yO1xuICAgIHRoaXMubm93ID0gb3B0cz8ubm93ID8/IGRlZmF1bHROb3c7XG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBNZXJnZWRRdWV1ZSh7XG4gICAgICBtYXhRdWV1ZTogb3B0cz8ubWF4UXVldWUsXG4gICAgICBvdmVyZmxvdzogb3B0cz8ub3ZlcmZsb3csXG4gICAgICBzYW1wbGVFdmVyeTogb3B0cz8uc2FtcGxlRXZlcnksXG4gICAgICBjYXB0dXJlUG9saWN5OiBvcHRzPy5jYXB0dXJlUG9saWN5LFxuICAgICAgaG9va3M6IG9wdHM/Lmhvb2tzLFxuICAgIH0pO1xuICAgIHRoaXMuZHJpdmVyID0gbmV3IEZsdXNoRHJpdmVyKHtcbiAgICAgIGRlcHRoOiAoKSA9PiB0aGlzLnF1ZXVlLmRlcHRoLFxuICAgICAgcHJvY2Vzc05leHQ6ICgpID0+IHRoaXMuZGVsaXZlck5leHQoKSxcbiAgICAgIGZsdXNoQnVkZ2V0TXM6IG9wdHM/LmZsdXNoQnVkZ2V0TXMsXG4gICAgICBub3c6IG9wdHM/Lm5vdyxcbiAgICAgIHNjaGVkdWxlOiBvcHRzPy5zY2hlZHVsZSxcbiAgICAgIG9uRmx1c2hTdGFydDogKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHN0YXRzIG9mIHRoaXMubGlzdGVuZXJTdGF0cy52YWx1ZXMoKSkgc3RhdHMubGFzdEZsdXNoTXMgPSAwO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBJZGVtcG90ZW50IGJ5IGlkIOKAlCBzYW1lIGlkIHJlcGxhY2VzIChzdGF0cyBjb250aW51ZSksIGlkcyBjb2V4aXN0LiAqL1xuICBhZGRMaXN0ZW5lcihpZDogc3RyaW5nLCBsaXN0ZW5lcjogRGVmZXJyZWRMaXN0ZW5lcik6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuZXJzLnNldChpZCwgbGlzdGVuZXIpO1xuICAgIGlmICghdGhpcy5saXN0ZW5lclN0YXRzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJTdGF0cy5zZXQoaWQsIHsgZXZlbnRzOiAwLCB0b3RhbE1zOiAwLCBsYXN0Rmx1c2hNczogMCB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogU3RvcCBkZWxpdmVyaW5nIHRvIGBpZGAuIEFjY3VtdWxhdGVkIHN0YXRzIGFyZSBrZXB0IGZvciByZXBvcnRzLiAqL1xuICByZW1vdmVMaXN0ZW5lcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9kdWNlciBlbnRyeSBwb2ludDogY2FwdHVyZSB0aGUgZXZlbnQgKHNlcS1zdGFtcGVkLCBwYXlsb2FkIHBlclxuICAgKiBwb2xpY3kpIGFuZCBzdGFnZSBpdCBmb3IgdGhlIG5leHQgY2hlY2twb2ludC4gQ2hlYXA7IE5FVkVSIHRocm93cztcbiAgICogbmV2ZXIgYmxvY2tzIOKAlCBleGNlcHQgdW5kZXIgYCdibG9jaydgIG92ZXJmbG93LCB3aGVyZSBhIHJlZnVzZWRcbiAgICogZW5xdWV1ZSBpcyBkZWxpdmVyZWQgc3luY2hyb25vdXNseSBpbmxpbmUgKGV4cGxpY2l0IGNvbnN1bWVyIGNob2ljZSkuXG4gICAqL1xuICBjYXB0dXJlKGlucHV0OiBFbnF1ZXVlSW5wdXQsIHBvbGljeT86IENhcHR1cmVQb2xpY3kpOiB2b2lkIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnF1ZXVlLmVucXVldWUoaW5wdXQsIHBvbGljeSk7XG4gICAgaWYgKHJlc3VsdC5vdXRjb21lID09PSAncXVldWVkJykge1xuICAgICAgdGhpcy5kcml2ZXIuYXJtKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyZXN1bHQub3V0Y29tZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHRoaXMuaW5saW5lRGVsaXZlcmllcyArPSAxO1xuICAgICAgdGhpcy5kZWxpdmVyKHJlc3VsdC5lbnZlbG9wZSk7XG4gICAgfVxuICAgIC8vICdkcm9wcGVkJzogY291bnRlZCBieSB0aGUgcXVldWU7IGxvc3Mgc3VyZmFjZXMgaW4gc3RhdHMgKyBzZXEgZ2Fwcy5cbiAgfVxuXG4gIC8qKlxuICAgKiBUZXJtaW5hbCBmbHVzaCDigJQgc3luY2hyb25vdXNseSBkZWxpdmVyIGV2ZXJ5dGhpbmcgcXVldWVkIChlbmQgb2YgcnVuIC9cbiAgICogc2h1dGRvd24pLiBBc3luYyBsaXN0ZW5lciBjb250aW51YXRpb25zIGFyZSBOT1QgYXdhaXRlZDsgZm9sbG93IHdpdGhcbiAgICogYGRyYWluKClgIGZvciB0aGF0LlxuICAgKi9cbiAgZmx1c2hOb3cob3B0cz86IHsgbWF4Um91bmRzPzogbnVtYmVyIH0pOiBGbHVzaFN5bmNSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmRyaXZlci5mbHVzaFN5bmMob3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggdGhlIGJhY2tsb2csIHRoZW4gc2V0dGxlIGFsbCBpbmZsaWdodCBhc3luYyBjb250aW51YXRpb25zIOKAlFxuICAgKiBgUHJvbWlzZS5hbGxTZXR0bGVkYCB1bmRlciBhIGRlYWRsaW5lLCBzaGFwZWQgbGlrZSBgZmx1c2hBbGxEZXRhY2hlZGAuXG4gICAqIExvb3BzIHdoaWxlIGNvbnRpbnVhdGlvbnMgc3Bhd24gbmV3IGNhcHR1cmVzLCB1bnRpbCBxdWllc2NlbnQgb3IgdGhlXG4gICAqIGRlYWRsaW5lIGV4cGlyZXMuXG4gICAqXG4gICAqIGB0aW1lb3V0TXNgIChkZWZhdWx0IDMwIDAwMCkgaXMgYXJtZWQgYnkgdGhlIG9uZSBsb25nLXRpbWVyIGxhd1xuICAgKiAoYHRpbWVycy9sb25nVGltZW91dC50cyDCtyBzZXRMb25nVGltZW91dGApOiBgSW5maW5pdHlgIGFybXMgbm8gdGltZXJcbiAgICogYW5kIHdhaXRzIGZvciBldmVyeSBjb250aW51YXRpb247IGEgbGltaXQgcGFzdCAyXjMxIOKIkiAxIG1zIGlzIHdhaXRlZCBpblxuICAgKiBmdWxsLCBuZXZlciBjdXQgdG8gMSBtczsgYDBgIG9yIGxlc3MgZ2l2ZXMgdXAgYXQgb25jZS5cbiAgICovXG4gIGFzeW5jIGRyYWluKG9wdHM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogUHJvbWlzZTxEcmFpblJlc3VsdD4ge1xuICAgIGNvbnN0IHRpbWVvdXRNcyA9IG9wdHM/LnRpbWVvdXRNcyA/PyAzMF8wMDA7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZG9uZSA9IDA7XG4gICAgbGV0IGZhaWxlZCA9IDA7XG5cbiAgICB0aGlzLmZsdXNoTm93KCk7XG4gICAgd2hpbGUgKHRoaXMuaW5mbGlnaHQuc2l6ZSA+IDApIHtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ01zID0gdGltZW91dE1zIC0gKERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgICAgaWYgKHJlbWFpbmluZ01zIDw9IDApIHJldHVybiB7IGRvbmUsIGZhaWxlZCwgcGVuZGluZzogdGhpcy5pbmZsaWdodC5zaXplICsgdGhpcy5xdWV1ZS5kZXB0aCB9O1xuXG4gICAgICBjb25zdCBiYXRjaCA9IFsuLi50aGlzLmluZmxpZ2h0XTtcbiAgICAgIGxldCBjYW5jZWxUaW1lcjogKCkgPT4gdm9pZCA9ICgpID0+IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8J19fZHJhaW5fdGltZW91dF9fJz4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY2FuY2VsVGltZXIgPSBzZXRMb25nVGltZW91dCgoKSA9PiByZXNvbHZlKCdfX2RyYWluX3RpbWVvdXRfXycpLCByZW1haW5pbmdNcyk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1Byb21pc2UuYWxsU2V0dGxlZChiYXRjaCksIHRpbWVvdXRQcm9taXNlXSk7XG4gICAgICBjYW5jZWxUaW1lcigpO1xuICAgICAgaWYgKHNldHRsZWQgPT09ICdfX2RyYWluX3RpbWVvdXRfXycpIHtcbiAgICAgICAgcmV0dXJuIHsgZG9uZSwgZmFpbGVkLCBwZW5kaW5nOiB0aGlzLmluZmxpZ2h0LnNpemUgKyB0aGlzLnF1ZXVlLmRlcHRoIH07XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHIgb2Ygc2V0dGxlZCkge1xuICAgICAgICAvLyBUcmFja2VkIHByb21pc2VzIG5ldmVyIHJlamVjdCDigJQgdGhleSByZXNvbHZlIHRydWUgKG9rKSAvIGZhbHNlLlxuICAgICAgICBpZiAoci5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHIudmFsdWUgPT09IGZhbHNlKSBmYWlsZWQgKz0gMTtcbiAgICAgICAgZWxzZSBkb25lICs9IDE7XG4gICAgICB9XG4gICAgICAvLyBDb250aW51YXRpb25zIG1heSBoYXZlIGNhcHR1cmVkIG1vcmUgZXZlbnRzIOKAlCBmbHVzaCBhbmQgcmUtY2hlY2suXG4gICAgICB0aGlzLmZsdXNoTm93KCk7XG4gICAgfVxuICAgIHJldHVybiB7IGRvbmUsIGZhaWxlZCwgcGVuZGluZzogdGhpcy5xdWV1ZS5kZXB0aCB9O1xuICB9XG5cbiAgLyoqIEE0IOKAlCB0aGUgc3RhdHMgb2JqZWN0IEJsb2NrIDkgY29uc3VtZXMuIFB1cmUgZ2V0dGVyLCBmcmVzaCBzbmFwc2hvdC4gKi9cbiAgZ2V0U3RhdHMoKTogRGlzcGF0Y2hlclN0YXRzIHtcbiAgICBjb25zdCBjb3VudGVycyA9IHRoaXMucXVldWUuZ2V0Q291bnRlcnMoKTtcbiAgICBjb25zdCBkcml2ZXJTdGF0cyA9IHRoaXMuZHJpdmVyLmdldFN0YXRzKCk7XG4gICAgY29uc3QgcGVyTGlzdGVuZXI6IFJlY29yZDxzdHJpbmcsIExpc3RlbmVyU3RhdHM+ID0ge307XG4gICAgZm9yIChjb25zdCBbaWQsIHN0YXRzXSBvZiB0aGlzLmxpc3RlbmVyU3RhdHMpIHtcbiAgICAgIHBlckxpc3RlbmVyW2lkXSA9IHsgZXZlbnRzOiBzdGF0cy5ldmVudHMsIHRvdGFsTXM6IHN0YXRzLnRvdGFsTXMsIGxhc3RGbHVzaE1zOiBzdGF0cy5sYXN0Rmx1c2hNcyB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGVwdGg6IHRoaXMucXVldWUuZGVwdGgsXG4gICAgICBkcm9wczogY291bnRlcnMuZHJvcHMsXG4gICAgICBmbHVzaGVzOiBkcml2ZXJTdGF0cy5mbHVzaGVzLFxuICAgICAgYnVkZ2V0RXhoYXVzdGVkOiBkcml2ZXJTdGF0cy5idWRnZXRFeGhhdXN0ZWQsXG4gICAgICBwOTVGbHVzaE1zOiBkcml2ZXJTdGF0cy5wOTVGbHVzaE1zLFxuICAgICAgaW5saW5lRGVsaXZlcmllczogdGhpcy5pbmxpbmVEZWxpdmVyaWVzLFxuICAgICAgaW5mbGlnaHQ6IHRoaXMuaW5mbGlnaHQuc2l6ZSxcbiAgICAgIHBlckxpc3RlbmVyLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGRlbGl2ZXJOZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVudmVsb3BlID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgIGlmIChlbnZlbG9wZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5kZWxpdmVyKGVudmVsb3BlKTtcbiAgfVxuXG4gIC8qKiBJbnZva2UgZXZlcnkgbGlzdGVuZXIgd2l0aCBmdWxsIGVycm9yIGlzb2xhdGlvbiArIHRpbWUgYWNjb3VudGluZy4gKi9cbiAgcHJpdmF0ZSBkZWxpdmVyKGVudmVsb3BlOiBDYXB0dXJlRW52ZWxvcGUpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgbGlzdGVuZXJdIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICBjb25zdCBzdGF0cyA9IHRoaXMubGlzdGVuZXJTdGF0cy5nZXQoaWQpIGFzIE11dGFibGVMaXN0ZW5lclN0YXRzO1xuICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLm5vdygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbGlzdGVuZXIoZW52ZWxvcGUpO1xuICAgICAgICBpZiAoaXNUaGVuYWJsZShyZXN1bHQpKSB0aGlzLnRyYWNrKHJlc3VsdCwgaWQsIGVudmVsb3BlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuc2FmZU9uRXJyb3IoZXJyb3IsIHsgbGlzdGVuZXJJZDogaWQsIGVudmVsb3BlLCBwaGFzZTogJ3N5bmMnIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29uc3QgZWxhcHNlZCA9IHRoaXMubm93KCkgLSBzdGFydDtcbiAgICAgICAgc3RhdHMuZXZlbnRzICs9IDE7XG4gICAgICAgIHN0YXRzLnRvdGFsTXMgKz0gZWxhcHNlZDtcbiAgICAgICAgc3RhdHMubGFzdEZsdXNoTXMgKz0gZWxhcHNlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogVHJhY2sgYW4gYXN5bmMgY29udGludWF0aW9uOyByb3V0ZSBpdHMgcmVqZWN0aW9uOyBuZXZlciByZWplY3QuICovXG4gIHByaXZhdGUgdHJhY2socHJvbWlzZTogUHJvbWlzZTx2b2lkPiwgbGlzdGVuZXJJZDogc3RyaW5nLCBlbnZlbG9wZTogQ2FwdHVyZUVudmVsb3BlKTogdm9pZCB7XG4gICAgY29uc3QgdHJhY2tlZDogUHJvbWlzZTxib29sZWFuPiA9IHByb21pc2UudGhlbihcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5zYWZlT25FcnJvcihlcnJvciwgeyBsaXN0ZW5lcklkLCBlbnZlbG9wZSwgcGhhc2U6ICdhc3luYycgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLmluZmxpZ2h0LmFkZCh0cmFja2VkKTtcbiAgICAvLyBTZWxmLWNsZWFudXAg4oCUIGB0cmFja2VkYCBuZXZlciByZWplY3RzLCBzbyB0aGlzIGNoYWluIGNhbm5vdCBmbG9hdCBhblxuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gICAgdHJhY2tlZC50aGVuKCgpID0+IHRoaXMuaW5mbGlnaHQuZGVsZXRlKHRyYWNrZWQpKTtcbiAgfVxuXG4gIC8qKiBUaGUgZXJyb3Igc2luayBtdXN0IG5ldmVyIGJlY29tZSBhbiBlcnJvciBzb3VyY2UuICovXG4gIHByaXZhdGUgc2FmZU9uRXJyb3IoZXJyb3I6IHVua25vd24sIGNvbnRleHQ6IERpc3BhdGNoRXJyb3JDb250ZXh0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25FcnJvcj8uKGVycm9yLCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFN3YWxsb3cg4oCUIGlzb2xhdGlvbiBpcyBhYnNvbHV0ZS5cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.memoryStore = exports.AttemptRecorder = void 0;
4
4
  /** P7: one bounded, payload-free metric projection collected from traversal hooks. */
5
5
  const foottrace_1 = require("foottrace");
6
+ const longTimeout_js_1 = require("../timers/longTimeout.js");
6
7
  const attemptMetricRows_js_1 = require("./attemptMetricRows.js");
7
8
  const attemptMetrics_js_1 = require("./attemptMetrics.js");
8
9
  const attemptOTel_js_1 = require("./attemptOTel.js");
@@ -220,18 +221,17 @@ class AttemptRecorder {
220
221
  async flush() {
221
222
  if (this.pending.size === 0)
222
223
  return this.storage();
223
- let timer;
224
+ let cancelTimer = () => undefined;
224
225
  try {
225
226
  await Promise.race([
226
227
  Promise.all([...this.pending]),
227
228
  new Promise((resolve) => {
228
- timer = setTimeout(resolve, this.timeoutMs);
229
+ cancelTimer = (0, longTimeout_js_1.setLongTimeout)(resolve, this.timeoutMs);
229
230
  }),
230
231
  ]);
231
232
  }
232
233
  finally {
233
- if (timer !== undefined)
234
- clearTimeout(timer);
234
+ cancelTimer();
235
235
  }
236
236
  return this.storage();
237
237
  }
@@ -315,7 +315,7 @@ class AttemptRecorder {
315
315
  if (store === undefined)
316
316
  return this.rows.values();
317
317
  this.reads++;
318
- let timer;
318
+ let cancelTimer = () => undefined;
319
319
  let released = false;
320
320
  const release = () => {
321
321
  if (!released) {
@@ -339,13 +339,12 @@ class AttemptRecorder {
339
339
  return await Promise.race([
340
340
  work,
341
341
  new Promise((_resolve, reject) => {
342
- timer = setTimeout(() => reject(new Error('attempts: store read timed out')), this.timeoutMs);
342
+ cancelTimer = (0, longTimeout_js_1.setLongTimeout)(() => reject(new Error('attempts: store read timed out')), this.timeoutMs);
343
343
  }),
344
344
  ]);
345
345
  }
346
346
  finally {
347
- if (timer !== undefined)
348
- clearTimeout(timer);
347
+ cancelTimer();
349
348
  }
350
349
  }
351
350
  toSnapshot() {
@@ -414,4 +413,4 @@ function memoryStore(options = {}) {
414
413
  };
415
414
  }
416
415
  exports.memoryStore = memoryStore;
417
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0ZW1wdFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9BdHRlbXB0UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0ZBQXNGO0FBQ3RGLHlDQUEyQztBQVUzQyxpRUFBOEY7QUFDOUYsMkRBQTBGO0FBVzFGLHFEQUErQztBQUMvQyxtREFBNkM7QUFFN0MsU0FBUyxNQUFNLENBQUMsS0FBeUIsRUFBRSxRQUFnQixFQUFFLEdBQVcsRUFBRSxJQUFZLEVBQUUsSUFBSSxHQUFHLEtBQUs7SUFDbEcsTUFBTSxDQUFDLEdBQUcsS0FBSyxJQUFJLFFBQVEsQ0FBQztJQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHFCQUFxQixJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hILE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUNELElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUNyQixNQUFhLGVBQWU7SUFDakIsRUFBRSxHQUFHLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQztJQUMxQixJQUFJLEdBQUcsSUFBSSwwQkFBVSxFQUFjLENBQUM7SUFDcEMsT0FBTyxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO0lBQ2hELE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0YsQ0FBQztJQUM1RyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ0QsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO0lBQ25DLFNBQVMsQ0FBUztJQUNsQixPQUFPLENBQVM7SUFDaEIsVUFBVSxDQUFTO0lBQ25CLFNBQVMsQ0FBUztJQUNsQixLQUFLLENBQWdCO0lB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QztnQkFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ3JCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQ3hDLElBQUksTUFBTSxLQUFLLFNBQVM7d0JBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDOUMsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztnQkFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ2QsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFBLG1DQUFZLEVBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6RyxDQUFDO1FBQ0QsS0FBSztZQUNILE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDbkQsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBaENELGtDQWdDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBQNzogb25lIGJvdW5kZWQsIHBheWxvYWQtZnJlZSBtZXRyaWMgcHJvamVjdGlvbiBjb2xsZWN0ZWQgZnJvbSB0cmF2ZXJzYWwgaG9va3MuICovXG5pbXBvcnQgeyBwYXJzZUF0dGVtcHRJZCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB0eXBlIHtcbiAgRmxvd0F0dGVtcHRFdmVudCxcbiAgRmxvd0RlY2lzaW9uRXZlbnQsXG4gIEZsb3dQYXVzZUV2ZW50LFxuICBGbG93UmVjb3JkZXIsXG4gIEZsb3dSdW5FdmVudCxcbiAgRmxvd1J1bkZhaWxlZEV2ZW50LFxufSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IG1hdGNoZXNRdWVyeSwgbWV0cmljUm93LCBtZXRyaWNXaW5kb3csIG93bkRhdGFSZWNvcmQgfSBmcm9tICcuL2F0dGVtcHRNZXRyaWNSb3dzLmpzJztcbmltcG9ydCB7IGFnZ3JlZ2F0ZUF0dGVtcHRzLCBhdHRlbXB0Um93S2V5LCBsb2dpY2FsS2V5LCB3b3JzdCB9IGZyb20gJy4vYXR0ZW1wdE1ldHJpY3MuanMnO1xuaW1wb3J0IHR5cGUge1xuICBBdHRlbXB0QWdncmVnYXRlLFxuICBBdHRlbXB0RGVjaXNpb25Sb3csXG4gIEF0dGVtcHRRdWVyeSxcbiAgQXR0ZW1wdFJlY29yZGVyT3B0aW9ucyxcbiAgQXR0ZW1wdFJvdyxcbiAgQXR0ZW1wdFN0b3JhZ2VTdGF0cyxcbiAgQXR0ZW1wdFN0b3JlLFxuICBQaHlzaWNhbEF0dGVtcHRSb3csXG59IGZyb20gJy4vYXR0ZW1wdE1ldHJpY3NUeXBlcy5qcyc7XG5pbXBvcnQgeyBhdHRlbXB0T1RlbCB9IGZyb20gJy4vYXR0ZW1wdE9UZWwuanMnO1xuaW1wb3J0IHsgS2V5ZWRTdG9yZSB9IGZyb20gJy4vS2V5ZWRTdG9yZS5qcyc7XG5cbmZ1bmN0aW9uIG9wdGlvbih2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyLCBtYXg6IG51bWJlciwgbmFtZTogc3RyaW5nLCB6ZXJvID0gZmFsc2UpOiBudW1iZXIge1xuICBjb25zdCBuID0gdmFsdWUgPz8gZmFsbGJhY2s7XG4gIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIobikgfHwgbiA8ICh6ZXJvID8gMCA6IDEpIHx8IG4gPiBtYXgpIHRocm93IG5ldyBUeXBlRXJyb3IoYGF0dGVtcHRzOiBpbnZhbGlkICR7bmFtZX1gKTtcbiAgcmV0dXJuIG47XG59XG5sZXQgbmV4dFJlY29yZGVyID0gMDtcbmV4cG9ydCBjbGFzcyBBdHRlbXB0UmVjb3JkZXIgaW1wbGVtZW50cyBGbG93UmVjb3JkZXIge1xuICByZWFkb25seSBpZCA9IGBhdHRlbXB0cy0keysrbmV4dFJlY29yZGVyfWA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm93cyA9IG5ldyBLZXllZFN0b3JlPEF0dGVtcHRSb3c+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9naWNhbCA9IG5ldyBNYXA8c3RyaW5nLCBQaHlzaWNhbEF0dGVtcHRSb3c+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhcnRzID0gbmV3IE1hcDxzdHJpbmcsIHsgcmVhZG9ubHkgc3RhcnRlZEF0OiBudW1iZXI7IHJlYWRvbmx5IG91dGNvbWU6ICdydW5uaW5nJyB8ICdwYXVzZWQnIH0+KCk7XG4gIHByaXZhdGUgcmVhZHMgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmcgPSBuZXcgU2V0PFByb21pc2U8dm9pZD4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlbXBsYXJzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4Um93czogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFBlbmRpbmc6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB0aW1lb3V0TXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZT86IEF0dGVtcHRTdG9yZTtcbiAgcHJpdmF0ZSBmYWlsZWQgPSAwO1xuICBwcml2YXRlIGRyb3BwZWQgPSAwO1xuICBwcml2YXRlIG9taXR0ZWRSb3dzID0gMDtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogQXR0ZW1wdFJlY29yZGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5leGVtcGxhcnMgPSBvcHRpb24ob3B0aW9ucy5leGVtcGxhcnMsIDEwLCAxMDAsICdleGVtcGxhcnMnKTtcbiAgICB0aGlzLm1heFJvd3MgPSBvcHRpb24ob3B0aW9ucy5tYXhSb3dzLCAxMDAwMCwgMTAwMDAwLCAnbWF4Um93cycpO1xuICAgIHRoaXMubWF4UGVuZGluZyA9IG9wdGlvbihvcHRpb25zLm1heFBlbmRpbmcsIDgsIDY0LCAnbWF4UGVuZGluZycpO1xuICAgIHRoaXMudGltZW91dE1zID0gb3B0aW9uKG9wdGlvbnMuc3RvcmVUaW1lb3V0TXMsIDEwMDAsIDYwMDAwLCAnc3RvcmVUaW1lb3V0TXMnKTtcbiAgICB0aGlzLnN0b3JlID0gb3B0aW9ucy5zdG9yZTtcbiAgfVxuXG4gIG9uUnVuU3RhcnQoZXZlbnQ6IEZsb3dSdW5FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHJ1bklkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVuSWQ7XG4gICAgaWYgKHJ1bklkKSB7XG4gICAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKHRoaXMuc3RhcnRzLnNpemUgPj0gdGhpcy5tYXhSb3dzICYmICF0aGlzLnN0YXJ0cy5oYXMocnVuSWQpKSB7XG4gICAgICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMuc3RhcnRzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIGlmIChvbGRlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0aGlzLnN0YXJ0cy5nZXQob2xkZXN0KT8ub3V0Y29tZSA9PT0gJ3J1bm5pbmcnKSB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICAgICAgdGhpcy5zdGFydHMuZGVsZXRlKG9sZGVzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhcnRzLnNldChydW5JZCwgeyBzdGFydGVkQXQsIG91dGNvbWU6ICdydW5uaW5nJyB9KTtcbiAgICAgIHRoaXMuY29sbGVjdCh7IGtpbmQ6ICdydW4nLCBydW5JZCwgc3RhcnRlZEF0LCBvdXRjb21lOiAncnVubmluZycgfSk7XG4gICAgfVxuICB9XG5cbiAgb25SdW5FbmQoZXZlbnQ6IEZsb3dSdW5FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZW5kKGV2ZW50LCAnb2snKTtcbiAgfVxuXG4gIG9uUGF1c2UoZXZlbnQ6IEZsb3dQYXVzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5lbmQoZXZlbnQsICdwYXVzZWQnKTtcbiAgfVxuXG4gIG9uUnVuRmFpbGVkKGV2ZW50OiBGbG93UnVuRmFpbGVkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmVuZChldmVudCwgJ2ZhaWxlZCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmQoZXZlbnQ6IEZsb3dSdW5FdmVudCB8IEZsb3dSdW5GYWlsZWRFdmVudCB8IEZsb3dQYXVzZUV2ZW50LCBvdXRjb21lOiAnb2snIHwgJ2ZhaWxlZCcgfCAncGF1c2VkJyk6IHZvaWQge1xuICAgIGNvbnN0IHJ1bklkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVuSWQ7XG4gICAgaWYgKCFydW5JZCkgcmV0dXJuO1xuICAgIGNvbnN0IHByaW9yID0gdGhpcy5yb3dzLmdldChhdHRlbXB0Um93S2V5KHsga2luZDogJ3J1bicsIHJ1bklkLCBzdGFydGVkQXQ6IDAsIG91dGNvbWU6ICdydW5uaW5nJyB9KSk7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5zdGFydHMuZ2V0KHJ1bklkKSA/PyAocHJpb3I/LmtpbmQgPT09ICdydW4nID8gcHJpb3IgOiB1bmRlZmluZWQpO1xuICAgIGlmIChhY3RpdmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBQYXJhbGxlbCBjaGlsZHJlbiBjYW4gZWFjaCByZXBvcnQgYSBwYXVzZSBpbiBvbmUgbGVnLiBJdCBpcyBvbmUgbGlmZWN5Y2xlIGZhY3QsIG5vdCBhIGxvc3Qgcm93LlxuICAgIC8vIEtlZXAgdGhlIHN0YXJ0IHVudGlsIGEgcmVhbCB0ZXJtaW5hbCBldmVudCwgc28gYSBsYXRlciBmYWlsdXJlIGNhbiBzdXBlcnNlZGUgYSBjaGlsZCdzIHBhdXNlLlxuICAgIGlmIChvdXRjb21lID09PSAncGF1c2VkJyAmJiBhY3RpdmUub3V0Y29tZSAhPT0gJ3J1bm5pbmcnKSByZXR1cm47XG4gICAgaWYgKG91dGNvbWUgIT09ICdwYXVzZWQnICYmIChhY3RpdmUub3V0Y29tZSA9PT0gJ29rJyB8fCBhY3RpdmUub3V0Y29tZSA9PT0gJ2ZhaWxlZCcpKSByZXR1cm47XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gYWN0aXZlLnN0YXJ0ZWRBdDtcbiAgICBpZiAob3V0Y29tZSA9PT0gJ3BhdXNlZCcpIHRoaXMuc3RhcnRzLnNldChydW5JZCwgeyBzdGFydGVkQXQsIG91dGNvbWUgfSk7XG4gICAgZWxzZSB0aGlzLnN0YXJ0cy5kZWxldGUocnVuSWQpO1xuICAgIHRoaXMuY29sbGVjdCh7XG4gICAgICBraW5kOiAncnVuJyxcbiAgICAgIHJ1bklkLFxuICAgICAgc3RhcnRlZEF0LFxuICAgICAgZW5kZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgIG91dGNvbWUsXG4gICAgfSk7XG4gICAgLy8gT3RoZXIgcGFyYWxsZWwgY2hpbGRyZW4gbWF5IHN0aWxsIGZpbmlzaCBhZnRlciBvbmUgY2hpbGQgcGF1c2VzLiBLZWVwIHRoZWlyIGJvdW5kZWQgaWRlbnRpdHkgbGlua3NcbiAgICAvLyB1bnRpbCBhIHJlYWwgdGVybWluYWwgZXZlbnQsIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZWlyIGxhdGVyIG5hdGl2ZSBkZWNpc2lvbnMuXG4gICAgaWYgKG91dGNvbWUgIT09ICdwYXVzZWQnKSBmb3IgKGNvbnN0IFtrZXksIHJvd10gb2YgdGhpcy5sb2dpY2FsKSBpZiAocm93LnJ1bklkID09PSBydW5JZCkgdGhpcy5sb2dpY2FsLmRlbGV0ZShrZXkpO1xuICB9XG5cbiAgb25BdHRlbXB0KGV2ZW50OiBGbG93QXR0ZW1wdEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dDtcbiAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgaWYgKCFjdHg/LnJ1bklkKSB7XG4gICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlkID0gYCR7cmVjb3JkLnNlcmllc31AJHtyZWNvcmQuYXR0ZW1wdH1gO1xuICAgIGlmIChpZC5sZW5ndGggPiA0MDk2KSB7XG4gICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQXR0ZW1wdElkKGlkKTtcbiAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb3cgPSBtZXRyaWNSb3coe1xuICAgICAga2luZDogJ2F0dGVtcHQnLFxuICAgICAgaWQsXG4gICAgICBzZXJpZXM6IHJlY29yZC5zZXJpZXMsXG4gICAgICBydW5JZDogY3R4LnJ1bklkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGN0eC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHRhcmdldDogcmVjb3JkLnRhcmdldCA/PyBldmVudC5zdGFnZUlkLFxuICAgICAgdHJhY2VJZDogY3R4LmNvcnJlbGF0aW9uPy50cmFjZUlkLFxuICAgICAgc3RhcnRlZEF0OiByZWNvcmQuc3RhcnRlZEF0LFxuICAgICAgZHVyYXRpb25NczogcmVjb3JkLmR1cmF0aW9uTXMsXG4gICAgICBvdXRjb21lOiByZWNvcmQub3V0Y29tZSxcbiAgICAgIGNhdGVnb3J5OiByZWNvcmQuY2F0ZWdvcnksXG4gICAgICBuZXh0OiByZWNvcmQubmV4dCxcbiAgICAgIHJlYXNvbjogcmVjb3JkLnJlYXNvbixcbiAgICAgIGF0dGVtcHRLaW5kOiByZWNvcmQua2luZCxcbiAgICAgIGF0dGVtcHQ6IHJlY29yZC5hdHRlbXB0LFxuICAgICAgb2Y6IHJlY29yZC5vZixcbiAgICAgIGVmZmVjdDogcmVjb3JkLmVmZmVjdCxcbiAgICAgIHJldHJ5TG9vcDogcmVjb3JkLnJldHJ5TG9vcCxcbiAgICB9KTtcbiAgICBpZiAocm93Py5raW5kICE9PSAnYXR0ZW1wdCcpIHtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb2xsZWN0KHJvdyk7XG4gICAgaWYgKHJvdy5yZXRyeUxvb3A/LnBoYXNlID09PSAnYXR0ZW1wdCcpIHtcbiAgICAgIGNvbnN0IGtleSA9IGxvZ2ljYWxLZXkocm93LnJ1bklkLCByb3cucmV0cnlMb29wLnNlcmllcywgcm93LnJldHJ5TG9vcC5hdHRlbXB0KTtcbiAgICAgIGlmICghdGhpcy5sb2dpY2FsLmhhcyhrZXkpICYmIHRoaXMubG9naWNhbC5zaXplID49IHRoaXMubWF4Um93cykge1xuICAgICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLmxvZ2ljYWwua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgaWYgKG9sZGVzdCAhPT0gdW5kZWZpbmVkKSB0aGlzLmxvZ2ljYWwuZGVsZXRlKG9sZGVzdCk7XG4gICAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgIH1cbiAgICAgIHRoaXMubG9naWNhbC5zZXQoa2V5LCByb3cpO1xuICAgIH1cbiAgfVxuXG4gIG9uRGVjaXNpb24oZXZlbnQ6IEZsb3dEZWNpc2lvbkV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgbG9naWNhbCA9IGV2ZW50LmV2aWRlbmNlPy5yZXRyeUxvb3A7XG4gICAgY29uc3QgcnVuSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW5JZDtcbiAgICBpZiAoIWxvZ2ljYWwgfHwgIXJ1bklkKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gbG9naWNhbEtleShydW5JZCwgbG9naWNhbC5zZXJpZXMsIGxvZ2ljYWwuYXR0ZW1wdCk7XG4gICAgY29uc3QgcGh5c2ljYWwgPSB0aGlzLmxvZ2ljYWwuZ2V0KGtleSk7XG4gICAgdGhpcy5sb2dpY2FsLmRlbGV0ZShrZXkpO1xuICAgIGlmICghcGh5c2ljYWwpIHtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm93ID0gbWV0cmljUm93KHtcbiAgICAgIC4uLmxvZ2ljYWwsXG4gICAgICBraW5kOiAnZGVjaXNpb24nLFxuICAgICAgcnVuSWQsXG4gICAgICB0YXJnZXQ6IHBoeXNpY2FsLnRhcmdldCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIGF0dGVtcHRJZDogcGh5c2ljYWwuaWQsXG4gICAgICBzdGFydGVkQXQ6IHBoeXNpY2FsLnN0YXJ0ZWRBdCxcbiAgICB9KTtcbiAgICBpZiAocm93Py5raW5kID09PSAnZGVjaXNpb24nKSB0aGlzLmNvbGxlY3Qocm93KTtcbiAgICBlbHNlIHRoaXMub21pdHRlZFJvd3MrKztcbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdChyb3c6IEF0dGVtcHRSb3cpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBhdHRlbXB0Um93S2V5KHJvdyk7XG4gICAgaWYgKCF0aGlzLnJvd3MuaGFzKGtleSkgJiYgdGhpcy5yb3dzLnNpemUgPj0gdGhpcy5tYXhSb3dzKSB7XG4gICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLnJvd3MuZ2V0TWFwKCkua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChvbGRlc3QgIT09IHVuZGVmaW5lZCkgdGhpcy5yb3dzLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgIH1cbiAgICB0aGlzLnJvd3Muc2V0KGtleSwgcm93KTtcbiAgICBpZiAoIXRoaXMuc3RvcmUpIHJldHVybjtcbiAgICBpZiAodGhpcy5wZW5kaW5nLnNpemUgKyB0aGlzLnJlYWRzID49IHRoaXMubWF4UGVuZGluZykge1xuICAgICAgdGhpcy5kcm9wcGVkKys7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEhvb2tzIGNhbm5vdCBhd2FpdC4gT3duIGV2ZXJ5IHJlamVjdGlvbiBpbW1lZGlhdGVseSwgd2l0aCBhIGJvdW5kZWQgcG9vbCBhbmQgbm8gaGlkZGVuIHJldHJ5IHF1ZXVlLlxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnN0b3JlLmFwcGVuZChbc3RydWN0dXJlZENsb25lKHJvdyldKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB0YXNrOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5mYWlsZWQrKztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZy5kZWxldGUodGFzayk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucGVuZGluZy5hZGQodGFzayk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmZhaWxlZCsrO1xuICAgIH1cbiAgfVxuXG4gIHN0b3JhZ2UoKTogQXR0ZW1wdFN0b3JhZ2VTdGF0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlbmRpbmc6IHRoaXMucGVuZGluZy5zaXplICsgdGhpcy5yZWFkcyxcbiAgICAgIGZhaWxlZDogdGhpcy5mYWlsZWQsXG4gICAgICBkcm9wcGVkOiB0aGlzLmRyb3BwZWQsXG4gICAgICBvbWl0dGVkUm93czogdGhpcy5vbWl0dGVkUm93cyxcbiAgICAgIGluY29tcGxldGU6IHRoaXMucGVuZGluZy5zaXplICsgdGhpcy5yZWFkcyArIHRoaXMuZmFpbGVkICsgdGhpcy5kcm9wcGVkICsgdGhpcy5vbWl0dGVkUm93cyA+IDAsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8QXR0ZW1wdFN0b3JhZ2VTdGF0cz4ge1xuICAgIGlmICh0aGlzLnBlbmRpbmcuc2l6ZSA9PT0gMCkgcmV0dXJuIHRoaXMuc3RvcmFnZSgpO1xuICAgIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgIFByb21pc2UuYWxsKFsuLi50aGlzLnBlbmRpbmddKSxcbiAgICAgICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQocmVzb2x2ZSwgdGhpcy50aW1lb3V0TXMpO1xuICAgICAgICB9KSxcbiAgICAgIF0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZSgpO1xuICB9XG5cbiAgYnlUYXJnZXQoKTogQXR0ZW1wdEFnZ3JlZ2F0ZVsnYnlUYXJnZXQnXSB7XG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZUF0dGVtcHRzKHRoaXMucm93cy52YWx1ZXMoKSwgdGhpcy5leGVtcGxhcnMsIHRoaXMuc3RvcmFnZSgpKS5ieVRhcmdldDtcbiAgfVxuXG4gIGJ5UnVuKCk6IEF0dGVtcHRBZ2dyZWdhdGVbJ2J5UnVuJ10ge1xuICAgIHJldHVybiBhZ2dyZWdhdGVBdHRlbXB0cyh0aGlzLnJvd3MudmFsdWVzKCksIHRoaXMuZXhlbXBsYXJzLCB0aGlzLnN0b3JhZ2UoKSkuYnlSdW47XG4gIH1cblxuICBzbG93ZXN0KHRhcmdldDogc3RyaW5nLCBsaW1pdCA9IHRoaXMuZXhlbXBsYXJzKSB7XG4gICAgY29uc3QgY2FwID0gb3B0aW9uKGxpbWl0LCB0aGlzLmV4ZW1wbGFycywgMTAwLCAnbGltaXQnLCB0cnVlKTtcbiAgICByZXR1cm4gd29yc3QoXG4gICAgICB0aGlzLnJvd3MudmFsdWVzKCkuZmlsdGVyKChyb3cpOiByb3cgaXMgUGh5c2ljYWxBdHRlbXB0Um93ID0+IHJvdy5raW5kID09PSAnYXR0ZW1wdCcgJiYgcm93LnRhcmdldCA9PT0gdGFyZ2V0KSxcbiAgICAgIGNhcCxcbiAgICApO1xuICB9XG5cbiAgc2VyaWVzKHNlcmllczogc3RyaW5nLCBydW5JZD86IHN0cmluZyk6IHsgYXR0ZW1wdHM6IFBoeXNpY2FsQXR0ZW1wdFJvd1tdOyBkZWNpc2lvbnM6IEF0dGVtcHREZWNpc2lvblJvd1tdIH0ge1xuICAgIGNvbnN0IGhlbGQgPSB0aGlzLnJvd3MudmFsdWVzKCkuZmlsdGVyKChyb3cpID0+IHJ1bklkID09PSB1bmRlZmluZWQgfHwgcm93LnJ1bklkID09PSBydW5JZCk7XG4gICAgY29uc3QgbGlua2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByb3cgb2YgaGVsZClcbiAgICAgIGlmIChyb3cua2luZCA9PT0gJ2F0dGVtcHQnICYmIHJvdy5zZXJpZXMgPT09IHNlcmllcyAmJiByb3cucmV0cnlMb29wICE9PSB1bmRlZmluZWQpXG4gICAgICAgIGxpbmtlZC5hZGQoSlNPTi5zdHJpbmdpZnkoW3Jvdy5ydW5JZCwgcm93LnJldHJ5TG9vcC5zZXJpZXNdKSk7XG4gICAgY29uc3Qgcm93cyA9IGhlbGQuZmlsdGVyKFxuICAgICAgKHJvdykgPT5cbiAgICAgICAgcm93LmtpbmQgIT09ICdydW4nICYmXG4gICAgICAgIChyb3cuc2VyaWVzID09PSBzZXJpZXMgfHxcbiAgICAgICAgICAocm93LmtpbmQgPT09ICdhdHRlbXB0JyAmJiByb3cucmV0cnlMb29wPy5zZXJpZXMgPT09IHNlcmllcykgfHxcbiAgICAgICAgICBsaW5rZWQuaGFzKEpTT04uc3RyaW5naWZ5KFtyb3cucnVuSWQsIHJvdy5raW5kID09PSAnYXR0ZW1wdCcgPyByb3cucmV0cnlMb29wPy5zZXJpZXMgOiByb3cuc2VyaWVzXSkpKSxcbiAgICApO1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoe1xuICAgICAgYXR0ZW1wdHM6IHJvd3MuZmlsdGVyKChyb3cpOiByb3cgaXMgUGh5c2ljYWxBdHRlbXB0Um93ID0+IHJvdy5raW5kID09PSAnYXR0ZW1wdCcpLFxuICAgICAgZGVjaXNpb25zOiByb3dzLmZpbHRlcigocm93KTogcm93IGlzIEF0dGVtcHREZWNpc2lvblJvdyA9PiByb3cua2luZCA9PT0gJ2RlY2lzaW9uJyksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBhZ2dyZWdhdGUoc3VwcGxpZWQ6IEF0dGVtcHRRdWVyeSA9IHt9KTogUHJvbWlzZTxBdHRlbXB0QWdncmVnYXRlPiB7XG4gICAgY29uc3QgYWRtaXR0ZWQgPSBvd25EYXRhUmVjb3JkKHN1cHBsaWVkKTtcbiAgICBpZiAoYWRtaXR0ZWQgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignYXR0ZW1wdHM6IGludmFsaWQgcXVlcnknKTtcbiAgICBjb25zdCB7IHNpbmNlLCB1bnRpbCwgdGFyZ2V0LCBydW5JZCB9ID0gYWRtaXR0ZWQgYXMgQXR0ZW1wdFF1ZXJ5O1xuICAgIGlmIChcbiAgICAgIChzaW5jZSAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzRmluaXRlKHNpbmNlKSB8fCBzaW5jZSA8IDApKSB8fFxuICAgICAgKHVudGlsICE9PSB1bmRlZmluZWQgJiYgKCFOdW1iZXIuaXNGaW5pdGUodW50aWwpIHx8IHVudGlsIDwgMCkpIHx8XG4gICAgICAoc2luY2UgIT09IHVuZGVmaW5lZCAmJiB1bnRpbCAhPT0gdW5kZWZpbmVkICYmIHNpbmNlID4gdW50aWwpIHx8XG4gICAgICAodGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiB0YXJnZXQgIT09ICdzdHJpbmcnIHx8IHRhcmdldC5sZW5ndGggPT09IDApKSB8fFxuICAgICAgKHJ1bklkICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBydW5JZCAhPT0gJ3N0cmluZycgfHwgcnVuSWQubGVuZ3RoID09PSAwKSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhdHRlbXB0czogaW52YWxpZCBxdWVyeScpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gT2JqZWN0LmZyZWV6ZSh7IHNpbmNlLCB1bnRpbCwgdGFyZ2V0LCBydW5JZCB9KTtcbiAgICBhd2FpdCB0aGlzLmZsdXNoKCk7XG4gICAgY29uc3QgcmF3ID0gdGhpcy5zdG9yZSA9PT0gdW5kZWZpbmVkID8gdGhpcy5yb3dzLnZhbHVlcygpIDogYXdhaXQgdGhpcy5yZWFkU3RvcmVkKHF1ZXJ5KTtcbiAgICBjb25zdCByb3dzOiBBdHRlbXB0Um93W10gPSBbXTtcbiAgICBjb25zdCB3aW5kb3cgPSBtZXRyaWNXaW5kb3cocmF3LCB0aGlzLm1heFJvd3MpO1xuICAgIGxldCBpbnZhbGlkID0gd2luZG93Lm9taXR0ZWQ7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB3aW5kb3cudmFsdWVzKSB7XG4gICAgICBjb25zdCByb3cgPSBtZXRyaWNSb3codmFsdWUpO1xuICAgICAgaWYgKHJvdyAmJiBtYXRjaGVzUXVlcnkocm93LCBxdWVyeSkpIHJvd3MucHVzaChyb3cpO1xuICAgICAgZWxzZSBpZiAocm93ID09PSB1bmRlZmluZWQpIGludmFsaWQrKztcbiAgICB9XG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuc3RvcmFnZSgpO1xuICAgIGxldCBzdG9yZU9taXR0ZWQgPSAwO1xuICAgIGxldCBhY2NvdW50aW5nVW5rbm93biA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnN0b3JlPy5zdGF0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGF0cyA9IG93bkRhdGFSZWNvcmQodGhpcy5zdG9yZS5zdGF0cygpKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHN0YXRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICB0eXBlb2Ygc3RhdHMub21pdHRlZFJvd3MgIT09ICdudW1iZXInIHx8XG4gICAgICAgICAgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHN0YXRzLm9taXR0ZWRSb3dzKSB8fFxuICAgICAgICAgIHN0YXRzLm9taXR0ZWRSb3dzIDwgMFxuICAgICAgICApXG4gICAgICAgICAgYWNjb3VudGluZ1Vua25vd24gPSB0cnVlO1xuICAgICAgICBlbHNlIHN0b3JlT21pdHRlZCA9IHN0YXRzLm9taXR0ZWRSb3dzO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGFjY291bnRpbmdVbmtub3duID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZUF0dGVtcHRzKHJvd3MsIHRoaXMuZXhlbXBsYXJzLCB7XG4gICAgICAuLi5zdG9yYWdlLFxuICAgICAgb21pdHRlZFJvd3M6IHN0b3JhZ2Uub21pdHRlZFJvd3MgKyBpbnZhbGlkICsgc3RvcmVPbWl0dGVkLFxuICAgICAgaW5jb21wbGV0ZTogc3RvcmFnZS5pbmNvbXBsZXRlIHx8IGludmFsaWQgKyBzdG9yZU9taXR0ZWQgPiAwIHx8IGFjY291bnRpbmdVbmtub3duLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkU3RvcmVkKHF1ZXJ5OiBBdHRlbXB0UXVlcnkpOiBQcm9taXNlPHJlYWRvbmx5IEF0dGVtcHRSb3dbXT4ge1xuICAgIGlmICh0aGlzLnJlYWRzICsgdGhpcy5wZW5kaW5nLnNpemUgPj0gdGhpcy5tYXhQZW5kaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2F0dGVtcHRzOiBzdG9yZSByZWFkIGNhcGFjaXR5IHJlYWNoZWQnKTtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmU7XG4gICAgaWYgKHN0b3JlID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnJvd3MudmFsdWVzKCk7XG4gICAgdGhpcy5yZWFkcysrO1xuICAgIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlbGVhc2VkID0gZmFsc2U7XG4gICAgY29uc3QgcmVsZWFzZSA9ICgpID0+IHtcbiAgICAgIGlmICghcmVsZWFzZWQpIHtcbiAgICAgICAgcmVsZWFzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlYWRzLS07XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyBBIHRpbWVkLW91dCBJL08gc3RpbGwgb3ducyBpdHMgc2xvdCB1bnRpbCBpdCBzZXR0bGVzOiBhIGNhbGxlciBjYW5ub3QgY3JlYXRlIGFuIHVuYm91bmRlZCBwb29sIG9mIHN0dWNrIHJlYWRzLlxuICAgIGNvbnN0IHdvcmsgPSBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgLnRoZW4oKCkgPT4gc3RvcmUucmVhZChxdWVyeSkpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJvd3MpID0+IHtcbiAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJvd3MpKSB0aHJvdyBuZXcgRXJyb3IoJ2F0dGVtcHRzOiBpbnZhbGlkIHN0b3JlIHJvd3MnKTtcbiAgICAgICAgICByZXR1cm4gcm93cztcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2F0dGVtcHRzOiBzdG9yZSByZWFkIGZhaWxlZCcpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgIHdvcmssXG4gICAgICAgIG5ldyBQcm9taXNlPG5ldmVyPigoX3Jlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKCdhdHRlbXB0czogc3RvcmUgcmVhZCB0aW1lZCBvdXQnKSksIHRoaXMudGltZW91dE1zKTtcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRpbWVyICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfVxuICB9XG5cbiAgdG9TbmFwc2hvdCgpIHtcbiAgICBjb25zdCBzdGF0cyA9IGFnZ3JlZ2F0ZUF0dGVtcHRzKHRoaXMucm93cy52YWx1ZXMoKSwgdGhpcy5leGVtcGxhcnMsIHRoaXMuc3RvcmFnZSgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJ0F0dGVtcHRzJyxcbiAgICAgIGRhdGE6IHsgYnlUYXJnZXQ6IHN0YXRzLmJ5VGFyZ2V0LCBieVJ1bjogc3RhdHMuYnlSdW4gfSxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgcHJvamVjdGlvbjogJ3Blci10YXJnZXQnLFxuICAgICAgICBleGVtcGxhcnM6IHRoaXMuZXhlbXBsYXJzLFxuICAgICAgICByb3dzOiB0aGlzLnJvd3Muc2l6ZSxcbiAgICAgICAgbWF4Um93czogdGhpcy5tYXhSb3dzLFxuICAgICAgICBzdG9yYWdlOiBzdGF0cy5zdG9yYWdlLFxuICAgICAgICB3b3JrVGltZTogJ3N1bS1vZi1hdHRlbXB0LWR1cmF0aW9ucycsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICB0b09UZWwoKSB7XG4gICAgcmV0dXJuIGF0dGVtcHRPVGVsKFxuICAgICAgdGhpcy5yb3dzLnZhbHVlcygpLmZpbHRlcigocm93KTogcm93IGlzIFBoeXNpY2FsQXR0ZW1wdFJvdyA9PiByb3cua2luZCA9PT0gJ2F0dGVtcHQnKSxcbiAgICAgIHRoaXMuYnlUYXJnZXQoKSxcbiAgICAgIHRoaXMuZXhlbXBsYXJzLFxuICAgICk7XG4gIH1cblxuICAvKiogQ2xlYXIgY29tcGxldGVkIGxvY2FsIHByb2plY3Rpb25zOyBhY3RpdmUvcGF1c2VkIGV2aWRlbmNlIGFuZCBib3VuZGVkIG93bmVyc2hpcCBzdXJ2aXZlIGV4ZWN1dG9yIGF1dG8tY2xlYXIuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLnJvd3MudmFsdWVzKCkuZmlsdGVyKChyb3cpID0+IHRoaXMuc3RhcnRzLmhhcyhyb3cucnVuSWQpKTtcbiAgICB0aGlzLnJvd3MuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBrZXB0KSB0aGlzLnJvd3Muc2V0KGF0dGVtcHRSb3dLZXkocm93KSwgcm93KTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHJvd10gb2YgdGhpcy5sb2dpY2FsKSBpZiAoIXRoaXMuc3RhcnRzLmhhcyhyb3cucnVuSWQpKSB0aGlzLmxvZ2ljYWwuZGVsZXRlKGtleSk7XG4gICAgaWYgKHRoaXMuc3RhcnRzLnNpemUgPT09IDApIHRoaXMub21pdHRlZFJvd3MgPSAwO1xuICB9XG59XG5cbi8qKiBCb3VuZGVkIHJlZmVyZW5jZSBhZGFwdGVyIGZvciB0ZXN0cy9sb2NhbCB1c2U7IGFwcHMgc3VwcGx5IHRoZWlyIG93biBkYXRhYmFzZSBhZGFwdGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9yeVN0b3JlKFxuICBvcHRpb25zOiB7IHJlYWRvbmx5IG1heFJvd3M/OiBudW1iZXIgfSA9IHt9LFxuKTogQXR0ZW1wdFN0b3JlICYgeyBzdGF0cygpOiB7IHJvd3M6IG51bWJlcjsgb21pdHRlZFJvd3M6IG51bWJlciB9IH0ge1xuICBjb25zdCBtYXggPSBvcHRpb24ob3B0aW9ucy5tYXhSb3dzLCAxMDAwMCwgMTAwMDAwLCAnbWF4Um93cycpO1xuICBjb25zdCByb3dzID0gbmV3IE1hcDxudW1iZXIsIEF0dGVtcHRSb3c+KCk7XG4gIGxldCBvbWl0dGVkID0gMDtcbiAgbGV0IG9yZGluYWwgPSAwO1xuICByZXR1cm4ge1xuICAgIGFwcGVuZChpbmNvbWluZykge1xuICAgICAgY29uc3Qgd2luZG93ID0gbWV0cmljV2luZG93KGluY29taW5nLCBtYXgpO1xuICAgICAgb21pdHRlZCArPSB3aW5kb3cub21pdHRlZDtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygd2luZG93LnZhbHVlcykge1xuICAgICAgICBjb25zdCByb3cgPSBtZXRyaWNSb3codmFsdWUpO1xuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgIG9taXR0ZWQrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm93cy5zaXplID49IG1heCkge1xuICAgICAgICAgIGNvbnN0IG9sZGVzdCA9IHJvd3Mua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHJvd3MuZGVsZXRlKG9sZGVzdCk7XG4gICAgICAgICAgb21pdHRlZCsrO1xuICAgICAgICB9XG4gICAgICAgIHJvd3Muc2V0KCsrb3JkaW5hbCwgcm93KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIHJlYWQocXVlcnkpIHtcbiAgICAgIHJldHVybiBbLi4ucm93cy52YWx1ZXMoKV0uZmlsdGVyKChyb3cpID0+IG1hdGNoZXNRdWVyeShyb3csIHF1ZXJ5KSkubWFwKChyb3cpID0+IHN0cnVjdHVyZWRDbG9uZShyb3cpKTtcbiAgICB9LFxuICAgIHN0YXRzKCkge1xuICAgICAgcmV0dXJuIHsgcm93czogcm93cy5zaXplLCBvbWl0dGVkUm93czogb21pdHRlZCB9O1xuICAgIH0sXG4gIH07XG59XG4iXX0=
416
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0ZW1wdFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9BdHRlbXB0UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0ZBQXNGO0FBQ3RGLHlDQUEyQztBQVUzQyw2REFBMEQ7QUFDMUQsaUVBQThGO0FBQzlGLDJEQUEwRjtBQVcxRixxREFBK0M7QUFDL0MsbURBQTZDO0FBRTdDLFNBQVMsTUFBTSxDQUFDLEtBQXlCLEVBQUUsUUFBZ0IsRUFBRSxHQUFXLEVBQUUsSUFBWSxFQUFFLElBQUksR0FBRyxLQUFLO0lBQ2xHLE1BQU0sQ0FBQyxHQUFHLEtBQUssSUFBSSxRQUFRLENBQUM7SUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHO1FBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNoSCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFDRCxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDckIsTUFBYSxlQUFlO0lBQ2pCLEVBQUUsR0FBRyxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDMUIsSUFBSSxHQUFHLElBQUksMEJBQVUsRUFBYyxDQUFDO0lBQ3BDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztJQUNoRCxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWtGLENBQUM7SUFDNUcsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztJQUNuQyxTQUFTLENBQVM7SUFDbEIsT0FBTyxDQUFTO0lBQ2hCLFVBQVUsQ0FBUztJQUNuQixTQUFTLENBQVM7SUFDbEIs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QUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNyQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO29CQUN4QyxJQUFJLE1BQU0sS0FBSyxTQUFTO3dCQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzlDLE9BQU8sRUFBRSxDQUFDO2dCQUNaLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSztZQUNkLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBQSxtQ0FBWSxFQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUNELEtBQUs7WUFDSCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ25ELENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQWhDRCxrQ0FnQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogUDc6IG9uZSBib3VuZGVkLCBwYXlsb2FkLWZyZWUgbWV0cmljIHByb2plY3Rpb24gY29sbGVjdGVkIGZyb20gdHJhdmVyc2FsIGhvb2tzLiAqL1xuaW1wb3J0IHsgcGFyc2VBdHRlbXB0SWQgfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dBdHRlbXB0RXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93UGF1c2VFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93UnVuRXZlbnQsXG4gIEZsb3dSdW5GYWlsZWRFdmVudCxcbn0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBzZXRMb25nVGltZW91dCB9IGZyb20gJy4uL3RpbWVycy9sb25nVGltZW91dC5qcyc7XG5pbXBvcnQgeyBtYXRjaGVzUXVlcnksIG1ldHJpY1JvdywgbWV0cmljV2luZG93LCBvd25EYXRhUmVjb3JkIH0gZnJvbSAnLi9hdHRlbXB0TWV0cmljUm93cy5qcyc7XG5pbXBvcnQgeyBhZ2dyZWdhdGVBdHRlbXB0cywgYXR0ZW1wdFJvd0tleSwgbG9naWNhbEtleSwgd29yc3QgfSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0ZW1wdEFnZ3JlZ2F0ZSxcbiAgQXR0ZW1wdERlY2lzaW9uUm93LFxuICBBdHRlbXB0UXVlcnksXG4gIEF0dGVtcHRSZWNvcmRlck9wdGlvbnMsXG4gIEF0dGVtcHRSb3csXG4gIEF0dGVtcHRTdG9yYWdlU3RhdHMsXG4gIEF0dGVtcHRTdG9yZSxcbiAgUGh5c2ljYWxBdHRlbXB0Um93LFxufSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzVHlwZXMuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdE9UZWwgfSBmcm9tICcuL2F0dGVtcHRPVGVsLmpzJztcbmltcG9ydCB7IEtleWVkU3RvcmUgfSBmcm9tICcuL0tleWVkU3RvcmUuanMnO1xuXG5mdW5jdGlvbiBvcHRpb24odmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlciwgbWF4OiBudW1iZXIsIG5hbWU6IHN0cmluZywgemVybyA9IGZhbHNlKTogbnVtYmVyIHtcbiAgY29uc3QgbiA9IHZhbHVlID8/IGZhbGxiYWNrO1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKG4pIHx8IG4gPCAoemVybyA/IDAgOiAxKSB8fCBuID4gbWF4KSB0aHJvdyBuZXcgVHlwZUVycm9yKGBhdHRlbXB0czogaW52YWxpZCAke25hbWV9YCk7XG4gIHJldHVybiBuO1xufVxubGV0IG5leHRSZWNvcmRlciA9IDA7XG5leHBvcnQgY2xhc3MgQXR0ZW1wdFJlY29yZGVyIGltcGxlbWVudHMgRmxvd1JlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQgPSBgYXR0ZW1wdHMtJHsrK25leHRSZWNvcmRlcn1gO1xuICBwcml2YXRlIHJlYWRvbmx5IHJvd3MgPSBuZXcgS2V5ZWRTdG9yZTxBdHRlbXB0Um93PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2ljYWwgPSBuZXcgTWFwPHN0cmluZywgUGh5c2ljYWxBdHRlbXB0Um93PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0cyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJlYWRvbmx5IHN0YXJ0ZWRBdDogbnVtYmVyOyByZWFkb25seSBvdXRjb21lOiAncnVubmluZycgfCAncGF1c2VkJyB9PigpO1xuICBwcml2YXRlIHJlYWRzID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nID0gbmV3IFNldDxQcm9taXNlPHZvaWQ+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZW1wbGFyczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFJvd3M6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhQZW5kaW5nOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGltZW91dE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmU/OiBBdHRlbXB0U3RvcmU7XG4gIHByaXZhdGUgZmFpbGVkID0gMDtcbiAgcHJpdmF0ZSBkcm9wcGVkID0gMDtcbiAgcHJpdmF0ZSBvbWl0dGVkUm93cyA9IDA7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEF0dGVtcHRSZWNvcmRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZXhlbXBsYXJzID0gb3B0aW9uKG9wdGlvbnMuZXhlbXBsYXJzLCAxMCwgMTAwLCAnZXhlbXBsYXJzJyk7XG4gICAgdGhpcy5tYXhSb3dzID0gb3B0aW9uKG9wdGlvbnMubWF4Um93cywgMTAwMDAsIDEwMDAwMCwgJ21heFJvd3MnKTtcbiAgICB0aGlzLm1heFBlbmRpbmcgPSBvcHRpb24ob3B0aW9ucy5tYXhQZW5kaW5nLCA4LCA2NCwgJ21heFBlbmRpbmcnKTtcbiAgICB0aGlzLnRpbWVvdXRNcyA9IG9wdGlvbihvcHRpb25zLnN0b3JlVGltZW91dE1zLCAxMDAwLCA2MDAwMCwgJ3N0b3JlVGltZW91dE1zJyk7XG4gICAgdGhpcy5zdG9yZSA9IG9wdGlvbnMuc3RvcmU7XG4gIH1cblxuICBvblJ1blN0YXJ0KGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBydW5JZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bklkO1xuICAgIGlmIChydW5JZCkge1xuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmICh0aGlzLnN0YXJ0cy5zaXplID49IHRoaXMubWF4Um93cyAmJiAhdGhpcy5zdGFydHMuaGFzKHJ1bklkKSkge1xuICAgICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLnN0YXJ0cy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGFydHMuZ2V0KG9sZGVzdCk/Lm91dGNvbWUgPT09ICdydW5uaW5nJykgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgICAgIHRoaXMuc3RhcnRzLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXJ0cy5zZXQocnVuSWQsIHsgc3RhcnRlZEF0LCBvdXRjb21lOiAncnVubmluZycgfSk7XG4gICAgICB0aGlzLmNvbGxlY3QoeyBraW5kOiAncnVuJywgcnVuSWQsIHN0YXJ0ZWRBdCwgb3V0Y29tZTogJ3J1bm5pbmcnIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUnVuRW5kKGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmVuZChldmVudCwgJ29rJyk7XG4gIH1cblxuICBvblBhdXNlKGV2ZW50OiBGbG93UGF1c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZW5kKGV2ZW50LCAncGF1c2VkJyk7XG4gIH1cblxuICBvblJ1bkZhaWxlZChldmVudDogRmxvd1J1bkZhaWxlZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5lbmQoZXZlbnQsICdmYWlsZWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5kKGV2ZW50OiBGbG93UnVuRXZlbnQgfCBGbG93UnVuRmFpbGVkRXZlbnQgfCBGbG93UGF1c2VFdmVudCwgb3V0Y29tZTogJ29rJyB8ICdmYWlsZWQnIHwgJ3BhdXNlZCcpOiB2b2lkIHtcbiAgICBjb25zdCBydW5JZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bklkO1xuICAgIGlmICghcnVuSWQpIHJldHVybjtcbiAgICBjb25zdCBwcmlvciA9IHRoaXMucm93cy5nZXQoYXR0ZW1wdFJvd0tleSh7IGtpbmQ6ICdydW4nLCBydW5JZCwgc3RhcnRlZEF0OiAwLCBvdXRjb21lOiAncnVubmluZycgfSkpO1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuc3RhcnRzLmdldChydW5JZCkgPz8gKHByaW9yPy5raW5kID09PSAncnVuJyA/IHByaW9yIDogdW5kZWZpbmVkKTtcbiAgICBpZiAoYWN0aXZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUGFyYWxsZWwgY2hpbGRyZW4gY2FuIGVhY2ggcmVwb3J0IGEgcGF1c2UgaW4gb25lIGxlZy4gSXQgaXMgb25lIGxpZmVjeWNsZSBmYWN0LCBub3QgYSBsb3N0IHJvdy5cbiAgICAvLyBLZWVwIHRoZSBzdGFydCB1bnRpbCBhIHJlYWwgdGVybWluYWwgZXZlbnQsIHNvIGEgbGF0ZXIgZmFpbHVyZSBjYW4gc3VwZXJzZWRlIGEgY2hpbGQncyBwYXVzZS5cbiAgICBpZiAob3V0Y29tZSA9PT0gJ3BhdXNlZCcgJiYgYWN0aXZlLm91dGNvbWUgIT09ICdydW5uaW5nJykgcmV0dXJuO1xuICAgIGlmIChvdXRjb21lICE9PSAncGF1c2VkJyAmJiAoYWN0aXZlLm91dGNvbWUgPT09ICdvaycgfHwgYWN0aXZlLm91dGNvbWUgPT09ICdmYWlsZWQnKSkgcmV0dXJuO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IGFjdGl2ZS5zdGFydGVkQXQ7XG4gICAgaWYgKG91dGNvbWUgPT09ICdwYXVzZWQnKSB0aGlzLnN0YXJ0cy5zZXQocnVuSWQsIHsgc3RhcnRlZEF0LCBvdXRjb21lIH0pO1xuICAgIGVsc2UgdGhpcy5zdGFydHMuZGVsZXRlKHJ1bklkKTtcbiAgICB0aGlzLmNvbGxlY3Qoe1xuICAgICAga2luZDogJ3J1bicsXG4gICAgICBydW5JZCxcbiAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgIGVuZGVkQXQ6IERhdGUubm93KCksXG4gICAgICBvdXRjb21lLFxuICAgIH0pO1xuICAgIC8vIE90aGVyIHBhcmFsbGVsIGNoaWxkcmVuIG1heSBzdGlsbCBmaW5pc2ggYWZ0ZXIgb25lIGNoaWxkIHBhdXNlcy4gS2VlcCB0aGVpciBib3VuZGVkIGlkZW50aXR5IGxpbmtzXG4gICAgLy8gdW50aWwgYSByZWFsIHRlcm1pbmFsIGV2ZW50LCByYXRoZXIgdGhhbiBkcm9wcGluZyB0aGVpciBsYXRlciBuYXRpdmUgZGVjaXNpb25zLlxuICAgIGlmIChvdXRjb21lICE9PSAncGF1c2VkJykgZm9yIChjb25zdCBba2V5LCByb3ddIG9mIHRoaXMubG9naWNhbCkgaWYgKHJvdy5ydW5JZCA9PT0gcnVuSWQpIHRoaXMubG9naWNhbC5kZWxldGUoa2V5KTtcbiAgfVxuXG4gIG9uQXR0ZW1wdChldmVudDogRmxvd0F0dGVtcHRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xuICAgIGlmICghY3R4Py5ydW5JZCkge1xuICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGAke3JlY29yZC5zZXJpZXN9QCR7cmVjb3JkLmF0dGVtcHR9YDtcbiAgICBpZiAoaWQubGVuZ3RoID4gNDA5Nikge1xuICAgICAgdGhpcy5vbWl0dGVkUm93cysrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUF0dGVtcHRJZChpZCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm93ID0gbWV0cmljUm93KHtcbiAgICAgIGtpbmQ6ICdhdHRlbXB0JyxcbiAgICAgIGlkLFxuICAgICAgc2VyaWVzOiByZWNvcmQuc2VyaWVzLFxuICAgICAgcnVuSWQ6IGN0eC5ydW5JZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBjdHgucnVudGltZVN0YWdlSWQsXG4gICAgICB0YXJnZXQ6IHJlY29yZC50YXJnZXQgPz8gZXZlbnQuc3RhZ2VJZCxcbiAgICAgIHRyYWNlSWQ6IGN0eC5jb3JyZWxhdGlvbj8udHJhY2VJZCxcbiAgICAgIHN0YXJ0ZWRBdDogcmVjb3JkLnN0YXJ0ZWRBdCxcbiAgICAgIGR1cmF0aW9uTXM6IHJlY29yZC5kdXJhdGlvbk1zLFxuICAgICAgb3V0Y29tZTogcmVjb3JkLm91dGNvbWUsXG4gICAgICBjYXRlZ29yeTogcmVjb3JkLmNhdGVnb3J5LFxuICAgICAgbmV4dDogcmVjb3JkLm5leHQsXG4gICAgICByZWFzb246IHJlY29yZC5yZWFzb24sXG4gICAgICBhdHRlbXB0S2luZDogcmVjb3JkLmtpbmQsXG4gICAgICBhdHRlbXB0OiByZWNvcmQuYXR0ZW1wdCxcbiAgICAgIG9mOiByZWNvcmQub2YsXG4gICAgICBlZmZlY3Q6IHJlY29yZC5lZmZlY3QsXG4gICAgICByZXRyeUxvb3A6IHJlY29yZC5yZXRyeUxvb3AsXG4gICAgfSk7XG4gICAgaWYgKHJvdz8ua2luZCAhPT0gJ2F0dGVtcHQnKSB7XG4gICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29sbGVjdChyb3cpO1xuICAgIGlmIChyb3cucmV0cnlMb29wPy5waGFzZSA9PT0gJ2F0dGVtcHQnKSB7XG4gICAgICBjb25zdCBrZXkgPSBsb2dpY2FsS2V5KHJvdy5ydW5JZCwgcm93LnJldHJ5TG9vcC5zZXJpZXMsIHJvdy5yZXRyeUxvb3AuYXR0ZW1wdCk7XG4gICAgICBpZiAoIXRoaXMubG9naWNhbC5oYXMoa2V5KSAmJiB0aGlzLmxvZ2ljYWwuc2l6ZSA+PSB0aGlzLm1heFJvd3MpIHtcbiAgICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5sb2dpY2FsLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIGlmIChvbGRlc3QgIT09IHVuZGVmaW5lZCkgdGhpcy5sb2dpY2FsLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2ljYWwuc2V0KGtleSwgcm93KTtcbiAgICB9XG4gIH1cblxuICBvbkRlY2lzaW9uKGV2ZW50OiBGbG93RGVjaXNpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGxvZ2ljYWwgPSBldmVudC5ldmlkZW5jZT8ucmV0cnlMb29wO1xuICAgIGNvbnN0IHJ1bklkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVuSWQ7XG4gICAgaWYgKCFsb2dpY2FsIHx8ICFydW5JZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IGxvZ2ljYWxLZXkocnVuSWQsIGxvZ2ljYWwuc2VyaWVzLCBsb2dpY2FsLmF0dGVtcHQpO1xuICAgIGNvbnN0IHBoeXNpY2FsID0gdGhpcy5sb2dpY2FsLmdldChrZXkpO1xuICAgIHRoaXMubG9naWNhbC5kZWxldGUoa2V5KTtcbiAgICBpZiAoIXBoeXNpY2FsKSB7XG4gICAgICB0aGlzLm9taXR0ZWRSb3dzKys7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvdyA9IG1ldHJpY1Jvdyh7XG4gICAgICAuLi5sb2dpY2FsLFxuICAgICAga2luZDogJ2RlY2lzaW9uJyxcbiAgICAgIHJ1bklkLFxuICAgICAgdGFyZ2V0OiBwaHlzaWNhbC50YXJnZXQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBhdHRlbXB0SWQ6IHBoeXNpY2FsLmlkLFxuICAgICAgc3RhcnRlZEF0OiBwaHlzaWNhbC5zdGFydGVkQXQsXG4gICAgfSk7XG4gICAgaWYgKHJvdz8ua2luZCA9PT0gJ2RlY2lzaW9uJykgdGhpcy5jb2xsZWN0KHJvdyk7XG4gICAgZWxzZSB0aGlzLm9taXR0ZWRSb3dzKys7XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3Qocm93OiBBdHRlbXB0Um93KTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gYXR0ZW1wdFJvd0tleShyb3cpO1xuICAgIGlmICghdGhpcy5yb3dzLmhhcyhrZXkpICYmIHRoaXMucm93cy5zaXplID49IHRoaXMubWF4Um93cykge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5yb3dzLmdldE1hcCgpLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHRoaXMucm93cy5kZWxldGUob2xkZXN0KTtcbiAgICAgIHRoaXMub21pdHRlZFJvd3MrKztcbiAgICB9XG4gICAgdGhpcy5yb3dzLnNldChrZXksIHJvdyk7XG4gICAgaWYgKCF0aGlzLnN0b3JlKSByZXR1cm47XG4gICAgaWYgKHRoaXMucGVuZGluZy5zaXplICsgdGhpcy5yZWFkcyA+PSB0aGlzLm1heFBlbmRpbmcpIHtcbiAgICAgIHRoaXMuZHJvcHBlZCsrO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBIb29rcyBjYW5ub3QgYXdhaXQuIE93biBldmVyeSByZWplY3Rpb24gaW1tZWRpYXRlbHksIHdpdGggYSBib3VuZGVkIHBvb2wgYW5kIG5vIGhpZGRlbiByZXRyeSBxdWV1ZS5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdG9yZS5hcHBlbmQoW3N0cnVjdHVyZWRDbG9uZShyb3cpXSk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdGFzazogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZmFpbGVkKys7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHRhc2spO1xuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBlbmRpbmcuYWRkKHRhc2spO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5mYWlsZWQrKztcbiAgICB9XG4gIH1cblxuICBzdG9yYWdlKCk6IEF0dGVtcHRTdG9yYWdlU3RhdHMge1xuICAgIHJldHVybiB7XG4gICAgICBwZW5kaW5nOiB0aGlzLnBlbmRpbmcuc2l6ZSArIHRoaXMucmVhZHMsXG4gICAgICBmYWlsZWQ6IHRoaXMuZmFpbGVkLFxuICAgICAgZHJvcHBlZDogdGhpcy5kcm9wcGVkLFxuICAgICAgb21pdHRlZFJvd3M6IHRoaXMub21pdHRlZFJvd3MsXG4gICAgICBpbmNvbXBsZXRlOiB0aGlzLnBlbmRpbmcuc2l6ZSArIHRoaXMucmVhZHMgKyB0aGlzLmZhaWxlZCArIHRoaXMuZHJvcHBlZCArIHRoaXMub21pdHRlZFJvd3MgPiAwLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPEF0dGVtcHRTdG9yYWdlU3RhdHM+IHtcbiAgICBpZiAodGhpcy5wZW5kaW5nLnNpemUgPT09IDApIHJldHVybiB0aGlzLnN0b3JhZ2UoKTtcbiAgICBsZXQgY2FuY2VsVGltZXI6ICgpID0+IHZvaWQgPSAoKSA9PiB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgIFByb21pc2UuYWxsKFsuLi50aGlzLnBlbmRpbmddKSxcbiAgICAgICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjYW5jZWxUaW1lciA9IHNldExvbmdUaW1lb3V0KHJlc29sdmUsIHRoaXMudGltZW91dE1zKTtcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2FuY2VsVGltZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZSgpO1xuICB9XG5cbiAgYnlUYXJnZXQoKTogQXR0ZW1wdEFnZ3JlZ2F0ZVsnYnlUYXJnZXQnXSB7XG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZUF0dGVtcHRzKHRoaXMucm93cy52YWx1ZXMoKSwgdGhpcy5leGVtcGxhcnMsIHRoaXMuc3RvcmFnZSgpKS5ieVRhcmdldDtcbiAgfVxuXG4gIGJ5UnVuKCk6IEF0dGVtcHRBZ2dyZWdhdGVbJ2J5UnVuJ10ge1xuICAgIHJldHVybiBhZ2dyZWdhdGVBdHRlbXB0cyh0aGlzLnJvd3MudmFsdWVzKCksIHRoaXMuZXhlbXBsYXJzLCB0aGlzLnN0b3JhZ2UoKSkuYnlSdW47XG4gIH1cblxuICBzbG93ZXN0KHRhcmdldDogc3RyaW5nLCBsaW1pdCA9IHRoaXMuZXhlbXBsYXJzKSB7XG4gICAgY29uc3QgY2FwID0gb3B0aW9uKGxpbWl0LCB0aGlzLmV4ZW1wbGFycywgMTAwLCAnbGltaXQnLCB0cnVlKTtcbiAgICByZXR1cm4gd29yc3QoXG4gICAgICB0aGlzLnJvd3MudmFsdWVzKCkuZmlsdGVyKChyb3cpOiByb3cgaXMgUGh5c2ljYWxBdHRlbXB0Um93ID0+IHJvdy5raW5kID09PSAnYXR0ZW1wdCcgJiYgcm93LnRhcmdldCA9PT0gdGFyZ2V0KSxcbiAgICAgIGNhcCxcbiAgICApO1xuICB9XG5cbiAgc2VyaWVzKHNlcmllczogc3RyaW5nLCBydW5JZD86IHN0cmluZyk6IHsgYXR0ZW1wdHM6IFBoeXNpY2FsQXR0ZW1wdFJvd1tdOyBkZWNpc2lvbnM6IEF0dGVtcHREZWNpc2lvblJvd1tdIH0ge1xuICAgIGNvbnN0IGhlbGQgPSB0aGlzLnJvd3MudmFsdWVzKCkuZmlsdGVyKChyb3cpID0+IHJ1bklkID09PSB1bmRlZmluZWQgfHwgcm93LnJ1bklkID09PSBydW5JZCk7XG4gICAgY29uc3QgbGlua2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByb3cgb2YgaGVsZClcbiAgICAgIGlmIChyb3cua2luZCA9PT0gJ2F0dGVtcHQnICYmIHJvdy5zZXJpZXMgPT09IHNlcmllcyAmJiByb3cucmV0cnlMb29wICE9PSB1bmRlZmluZWQpXG4gICAgICAgIGxpbmtlZC5hZGQoSlNPTi5zdHJpbmdpZnkoW3Jvdy5ydW5JZCwgcm93LnJldHJ5TG9vcC5zZXJpZXNdKSk7XG4gICAgY29uc3Qgcm93cyA9IGhlbGQuZmlsdGVyKFxuICAgICAgKHJvdykgPT5cbiAgICAgICAgcm93LmtpbmQgIT09ICdydW4nICYmXG4gICAgICAgIChyb3cuc2VyaWVzID09PSBzZXJpZXMgfHxcbiAgICAgICAgICAocm93LmtpbmQgPT09ICdhdHRlbXB0JyAmJiByb3cucmV0cnlMb29wPy5zZXJpZXMgPT09IHNlcmllcykgfHxcbiAgICAgICAgICBsaW5rZWQuaGFzKEpTT04uc3RyaW5naWZ5KFtyb3cucnVuSWQsIHJvdy5raW5kID09PSAnYXR0ZW1wdCcgPyByb3cucmV0cnlMb29wPy5zZXJpZXMgOiByb3cuc2VyaWVzXSkpKSxcbiAgICApO1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoe1xuICAgICAgYXR0ZW1wdHM6IHJvd3MuZmlsdGVyKChyb3cpOiByb3cgaXMgUGh5c2ljYWxBdHRlbXB0Um93ID0+IHJvdy5raW5kID09PSAnYXR0ZW1wdCcpLFxuICAgICAgZGVjaXNpb25zOiByb3dzLmZpbHRlcigocm93KTogcm93IGlzIEF0dGVtcHREZWNpc2lvblJvdyA9PiByb3cua2luZCA9PT0gJ2RlY2lzaW9uJyksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBhZ2dyZWdhdGUoc3VwcGxpZWQ6IEF0dGVtcHRRdWVyeSA9IHt9KTogUHJvbWlzZTxBdHRlbXB0QWdncmVnYXRlPiB7XG4gICAgY29uc3QgYWRtaXR0ZWQgPSBvd25EYXRhUmVjb3JkKHN1cHBsaWVkKTtcbiAgICBpZiAoYWRtaXR0ZWQgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignYXR0ZW1wdHM6IGludmFsaWQgcXVlcnknKTtcbiAgICBjb25zdCB7IHNpbmNlLCB1bnRpbCwgdGFyZ2V0LCBydW5JZCB9ID0gYWRtaXR0ZWQgYXMgQXR0ZW1wdFF1ZXJ5O1xuICAgIGlmIChcbiAgICAgIChzaW5jZSAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzRmluaXRlKHNpbmNlKSB8fCBzaW5jZSA8IDApKSB8fFxuICAgICAgKHVudGlsICE9PSB1bmRlZmluZWQgJiYgKCFOdW1iZXIuaXNGaW5pdGUodW50aWwpIHx8IHVudGlsIDwgMCkpIHx8XG4gICAgICAoc2luY2UgIT09IHVuZGVmaW5lZCAmJiB1bnRpbCAhPT0gdW5kZWZpbmVkICYmIHNpbmNlID4gdW50aWwpIHx8XG4gICAgICAodGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiB0YXJnZXQgIT09ICdzdHJpbmcnIHx8IHRhcmdldC5sZW5ndGggPT09IDApKSB8fFxuICAgICAgKHJ1bklkICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBydW5JZCAhPT0gJ3N0cmluZycgfHwgcnVuSWQubGVuZ3RoID09PSAwKSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhdHRlbXB0czogaW52YWxpZCBxdWVyeScpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gT2JqZWN0LmZyZWV6ZSh7IHNpbmNlLCB1bnRpbCwgdGFyZ2V0LCBydW5JZCB9KTtcbiAgICBhd2FpdCB0aGlzLmZsdXNoKCk7XG4gICAgY29uc3QgcmF3ID0gdGhpcy5zdG9yZSA9PT0gdW5kZWZpbmVkID8gdGhpcy5yb3dzLnZhbHVlcygpIDogYXdhaXQgdGhpcy5yZWFkU3RvcmVkKHF1ZXJ5KTtcbiAgICBjb25zdCByb3dzOiBBdHRlbXB0Um93W10gPSBbXTtcbiAgICBjb25zdCB3aW5kb3cgPSBtZXRyaWNXaW5kb3cocmF3LCB0aGlzLm1heFJvd3MpO1xuICAgIGxldCBpbnZhbGlkID0gd2luZG93Lm9taXR0ZWQ7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB3aW5kb3cudmFsdWVzKSB7XG4gICAgICBjb25zdCByb3cgPSBtZXRyaWNSb3codmFsdWUpO1xuICAgICAgaWYgKHJvdyAmJiBtYXRjaGVzUXVlcnkocm93LCBxdWVyeSkpIHJvd3MucHVzaChyb3cpO1xuICAgICAgZWxzZSBpZiAocm93ID09PSB1bmRlZmluZWQpIGludmFsaWQrKztcbiAgICB9XG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuc3RvcmFnZSgpO1xuICAgIGxldCBzdG9yZU9taXR0ZWQgPSAwO1xuICAgIGxldCBhY2NvdW50aW5nVW5rbm93biA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnN0b3JlPy5zdGF0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGF0cyA9IG93bkRhdGFSZWNvcmQodGhpcy5zdG9yZS5zdGF0cygpKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHN0YXRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICB0eXBlb2Ygc3RhdHMub21pdHRlZFJvd3MgIT09ICdudW1iZXInIHx8XG4gICAgICAgICAgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHN0YXRzLm9taXR0ZWRSb3dzKSB8fFxuICAgICAgICAgIHN0YXRzLm9taXR0ZWRSb3dzIDwgMFxuICAgICAgICApXG4gICAgICAgICAgYWNjb3VudGluZ1Vua25vd24gPSB0cnVlO1xuICAgICAgICBlbHNlIHN0b3JlT21pdHRlZCA9IHN0YXRzLm9taXR0ZWRSb3dzO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGFjY291bnRpbmdVbmtub3duID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZUF0dGVtcHRzKHJvd3MsIHRoaXMuZXhlbXBsYXJzLCB7XG4gICAgICAuLi5zdG9yYWdlLFxuICAgICAgb21pdHRlZFJvd3M6IHN0b3JhZ2Uub21pdHRlZFJvd3MgKyBpbnZhbGlkICsgc3RvcmVPbWl0dGVkLFxuICAgICAgaW5jb21wbGV0ZTogc3RvcmFnZS5pbmNvbXBsZXRlIHx8IGludmFsaWQgKyBzdG9yZU9taXR0ZWQgPiAwIHx8IGFjY291bnRpbmdVbmtub3duLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkU3RvcmVkKHF1ZXJ5OiBBdHRlbXB0UXVlcnkpOiBQcm9taXNlPHJlYWRvbmx5IEF0dGVtcHRSb3dbXT4ge1xuICAgIGlmICh0aGlzLnJlYWRzICsgdGhpcy5wZW5kaW5nLnNpemUgPj0gdGhpcy5tYXhQZW5kaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2F0dGVtcHRzOiBzdG9yZSByZWFkIGNhcGFjaXR5IHJlYWNoZWQnKTtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmU7XG4gICAgaWYgKHN0b3JlID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnJvd3MudmFsdWVzKCk7XG4gICAgdGhpcy5yZWFkcysrO1xuICAgIGxldCBjYW5jZWxUaW1lcjogKCkgPT4gdm9pZCA9ICgpID0+IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVsZWFzZWQgPSBmYWxzZTtcbiAgICBjb25zdCByZWxlYXNlID0gKCkgPT4ge1xuICAgICAgaWYgKCFyZWxlYXNlZCkge1xuICAgICAgICByZWxlYXNlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVhZHMtLTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIEEgdGltZWQtb3V0IEkvTyBzdGlsbCBvd25zIGl0cyBzbG90IHVudGlsIGl0IHNldHRsZXM6IGEgY2FsbGVyIGNhbm5vdCBjcmVhdGUgYW4gdW5ib3VuZGVkIHBvb2wgb2Ygc3R1Y2sgcmVhZHMuXG4gICAgY29uc3Qgd29yayA9IFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAudGhlbigoKSA9PiBzdG9yZS5yZWFkKHF1ZXJ5KSlcbiAgICAgIC50aGVuKFxuICAgICAgICAocm93cykgPT4ge1xuICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocm93cykpIHRocm93IG5ldyBFcnJvcignYXR0ZW1wdHM6IGludmFsaWQgc3RvcmUgcm93cycpO1xuICAgICAgICAgIHJldHVybiByb3dzO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYXR0ZW1wdHM6IHN0b3JlIHJlYWQgZmFpbGVkJyk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgd29yayxcbiAgICAgICAgbmV3IFByb21pc2U8bmV2ZXI+KChfcmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY2FuY2VsVGltZXIgPSBzZXRMb25nVGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKCdhdHRlbXB0czogc3RvcmUgcmVhZCB0aW1lZCBvdXQnKSksIHRoaXMudGltZW91dE1zKTtcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2FuY2VsVGltZXIoKTtcbiAgICB9XG4gIH1cblxuICB0b1NuYXBzaG90KCkge1xuICAgIGNvbnN0IHN0YXRzID0gYWdncmVnYXRlQXR0ZW1wdHModGhpcy5yb3dzLnZhbHVlcygpLCB0aGlzLmV4ZW1wbGFycywgdGhpcy5zdG9yYWdlKCkpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnQXR0ZW1wdHMnLFxuICAgICAgZGF0YTogeyBieVRhcmdldDogc3RhdHMuYnlUYXJnZXQsIGJ5UnVuOiBzdGF0cy5ieVJ1biB9LFxuICAgICAgbWV0YToge1xuICAgICAgICBwcm9qZWN0aW9uOiAncGVyLXRhcmdldCcsXG4gICAgICAgIGV4ZW1wbGFyczogdGhpcy5leGVtcGxhcnMsXG4gICAgICAgIHJvd3M6IHRoaXMucm93cy5zaXplLFxuICAgICAgICBtYXhSb3dzOiB0aGlzLm1heFJvd3MsXG4gICAgICAgIHN0b3JhZ2U6IHN0YXRzLnN0b3JhZ2UsXG4gICAgICAgIHdvcmtUaW1lOiAnc3VtLW9mLWF0dGVtcHQtZHVyYXRpb25zJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHRvT1RlbCgpIHtcbiAgICByZXR1cm4gYXR0ZW1wdE9UZWwoXG4gICAgICB0aGlzLnJvd3MudmFsdWVzKCkuZmlsdGVyKChyb3cpOiByb3cgaXMgUGh5c2ljYWxBdHRlbXB0Um93ID0+IHJvdy5raW5kID09PSAnYXR0ZW1wdCcpLFxuICAgICAgdGhpcy5ieVRhcmdldCgpLFxuICAgICAgdGhpcy5leGVtcGxhcnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBDbGVhciBjb21wbGV0ZWQgbG9jYWwgcHJvamVjdGlvbnM7IGFjdGl2ZS9wYXVzZWQgZXZpZGVuY2UgYW5kIGJvdW5kZWQgb3duZXJzaGlwIHN1cnZpdmUgZXhlY3V0b3IgYXV0by1jbGVhci4gKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMucm93cy52YWx1ZXMoKS5maWx0ZXIoKHJvdykgPT4gdGhpcy5zdGFydHMuaGFzKHJvdy5ydW5JZCkpO1xuICAgIHRoaXMucm93cy5jbGVhcigpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGtlcHQpIHRoaXMucm93cy5zZXQoYXR0ZW1wdFJvd0tleShyb3cpLCByb3cpO1xuICAgIGZvciAoY29uc3QgW2tleSwgcm93XSBvZiB0aGlzLmxvZ2ljYWwpIGlmICghdGhpcy5zdGFydHMuaGFzKHJvdy5ydW5JZCkpIHRoaXMubG9naWNhbC5kZWxldGUoa2V5KTtcbiAgICBpZiAodGhpcy5zdGFydHMuc2l6ZSA9PT0gMCkgdGhpcy5vbWl0dGVkUm93cyA9IDA7XG4gIH1cbn1cblxuLyoqIEJvdW5kZWQgcmVmZXJlbmNlIGFkYXB0ZXIgZm9yIHRlc3RzL2xvY2FsIHVzZTsgYXBwcyBzdXBwbHkgdGhlaXIgb3duIGRhdGFiYXNlIGFkYXB0ZXIuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtb3J5U3RvcmUoXG4gIG9wdGlvbnM6IHsgcmVhZG9ubHkgbWF4Um93cz86IG51bWJlciB9ID0ge30sXG4pOiBBdHRlbXB0U3RvcmUgJiB7IHN0YXRzKCk6IHsgcm93czogbnVtYmVyOyBvbWl0dGVkUm93czogbnVtYmVyIH0gfSB7XG4gIGNvbnN0IG1heCA9IG9wdGlvbihvcHRpb25zLm1heFJvd3MsIDEwMDAwLCAxMDAwMDAsICdtYXhSb3dzJyk7XG4gIGNvbnN0IHJvd3MgPSBuZXcgTWFwPG51bWJlciwgQXR0ZW1wdFJvdz4oKTtcbiAgbGV0IG9taXR0ZWQgPSAwO1xuICBsZXQgb3JkaW5hbCA9IDA7XG4gIHJldHVybiB7XG4gICAgYXBwZW5kKGluY29taW5nKSB7XG4gICAgICBjb25zdCB3aW5kb3cgPSBtZXRyaWNXaW5kb3coaW5jb21pbmcsIG1heCk7XG4gICAgICBvbWl0dGVkICs9IHdpbmRvdy5vbWl0dGVkO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB3aW5kb3cudmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IG1ldHJpY1Jvdyh2YWx1ZSk7XG4gICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgb21pdHRlZCsrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3dzLnNpemUgPj0gbWF4KSB7XG4gICAgICAgICAgY29uc3Qgb2xkZXN0ID0gcm93cy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICAgIGlmIChvbGRlc3QgIT09IHVuZGVmaW5lZCkgcm93cy5kZWxldGUob2xkZXN0KTtcbiAgICAgICAgICBvbWl0dGVkKys7XG4gICAgICAgIH1cbiAgICAgICAgcm93cy5zZXQoKytvcmRpbmFsLCByb3cpO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgcmVhZChxdWVyeSkge1xuICAgICAgcmV0dXJuIFsuLi5yb3dzLnZhbHVlcygpXS5maWx0ZXIoKHJvdykgPT4gbWF0Y2hlc1F1ZXJ5KHJvdywgcXVlcnkpKS5tYXAoKHJvdykgPT4gc3RydWN0dXJlZENsb25lKHJvdykpO1xuICAgIH0sXG4gICAgc3RhdHMoKSB7XG4gICAgICByZXR1cm4geyByb3dzOiByb3dzLnNpemUsIG9taXR0ZWRSb3dzOiBvbWl0dGVkIH07XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==