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.
- package/CLAUDE.md +2 -1
- package/dist/esm/index.d.ts +12 -2
- package/dist/esm/index.js +5 -3
- package/dist/esm/lib/attempt/backoff.d.ts +96 -0
- package/dist/esm/lib/attempt/backoff.js +173 -0
- package/dist/esm/lib/attempt/deadline.d.ts +0 -5
- package/dist/esm/lib/attempt/deadline.js +2 -27
- package/dist/esm/lib/attempt/index.d.ts +6 -4
- package/dist/esm/lib/attempt/index.js +6 -5
- package/dist/esm/lib/attempt/runner.js +3 -2
- package/dist/esm/lib/detach/drivers/setTimeout.d.ts +4 -2
- package/dist/esm/lib/detach/drivers/setTimeout.js +12 -2
- package/dist/esm/lib/detach/flush.d.ts +6 -1
- package/dist/esm/lib/detach/flush.js +8 -6
- package/dist/esm/lib/observer-queue/deferredDispatcher.d.ts +8 -1
- package/dist/esm/lib/observer-queue/deferredDispatcher.js +13 -6
- package/dist/esm/lib/recorder/AttemptRecorder.js +8 -9
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +7 -2
- package/dist/esm/lib/runner/FlowChartExecutor.js +8 -3
- package/dist/esm/lib/runner/captureHistory.js +6 -4
- package/dist/esm/lib/runner/deadline.js +3 -2
- package/dist/esm/lib/runner/recordSink.d.ts +2 -1
- package/dist/esm/lib/runner/recordSink.js +12 -7
- package/dist/esm/lib/sinks/fileSink.js +7 -6
- package/dist/esm/lib/sinks/indexedIO.js +5 -3
- package/dist/esm/lib/timers/longTimeout.d.ts +37 -0
- package/dist/esm/lib/timers/longTimeout.js +56 -0
- package/dist/index.js +8 -3
- package/dist/lib/attempt/backoff.js +178 -0
- package/dist/lib/attempt/deadline.js +4 -30
- package/dist/lib/attempt/index.js +9 -6
- package/dist/lib/attempt/runner.js +4 -3
- package/dist/lib/detach/drivers/setTimeout.js +12 -2
- package/dist/lib/detach/flush.js +8 -6
- package/dist/lib/observer-queue/deferredDispatcher.js +13 -6
- package/dist/lib/recorder/AttemptRecorder.js +8 -9
- package/dist/lib/runner/FlowChartExecutor.js +8 -3
- package/dist/lib/runner/captureHistory.js +6 -4
- package/dist/lib/runner/deadline.js +3 -2
- package/dist/lib/runner/recordSink.js +12 -7
- package/dist/lib/sinks/fileSink.js +7 -6
- package/dist/lib/sinks/indexedIO.js +5 -3
- package/dist/lib/timers/longTimeout.js +60 -0
- package/dist/types/index.d.ts +12 -2
- package/dist/types/lib/attempt/backoff.d.ts +96 -0
- package/dist/types/lib/attempt/deadline.d.ts +0 -5
- package/dist/types/lib/attempt/index.d.ts +6 -4
- package/dist/types/lib/detach/drivers/setTimeout.d.ts +4 -2
- package/dist/types/lib/detach/flush.d.ts +6 -1
- package/dist/types/lib/observer-queue/deferredDispatcher.d.ts +8 -1
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +7 -2
- package/dist/types/lib/runner/recordSink.d.ts +2 -1
- package/dist/types/lib/timers/longTimeout.d.ts +37 -0
- package/package.json +2 -2
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
* never as a cancellation.
|
|
18
18
|
*/
|
|
19
19
|
import { anySignal } from '../attempt/anySignal.js';
|
|
20
|
-
import { deadlineReason, isAbortSignal, readDeadline
|
|
20
|
+
import { deadlineReason, isAbortSignal, readDeadline } from '../attempt/deadline.js';
|
|
21
|
+
import { setLongTimeout } from '../timers/longTimeout.js';
|
|
21
22
|
/** Compose the run's signal and deadline from its options; `now` is the clock (epoch ms). */
|
|
22
23
|
export function armRun(timing, now = Date.now) {
|
|
23
24
|
const startedAt = now();
|
|
@@ -87,4 +88,4 @@ function stampedEnv(env, envSignal, signal, deadline) {
|
|
|
87
88
|
...(deadline !== undefined && { deadline }),
|
|
88
89
|
};
|
|
89
90
|
}
|
|
90
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVhZGxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9kZWFkbGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBMEJyRyw2RkFBNkY7QUFDN0YsTUFBTSxVQUFVLE1BQU0sQ0FBQyxNQUFpQixFQUFFLE1BQW9CLElBQUksQ0FBQyxHQUFHO0lBQ3BFLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLDBGQUEwRjtJQUMxRixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ3ZCLE1BQU0sV0FBVyxHQUFHLEdBQUcsRUFBRSxRQUFRLENBQUM7SUFDbEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFLE1BQU0sQ0FBQztJQUM5QixNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRWxFLE1BQU0sVUFBVSxHQUFHLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM5RSxnSEFBZ0g7SUFDaEgsTUFBTSxPQUFPLEdBQUc7UUFDZCxNQUFNLENBQUMsTUFBTTtRQUNiLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ2hELE1BQU0sQ0FBQyxJQUFJO1FBQ1gsVUFBVSxFQUFFLE1BQU07S0FDbkIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQW9CLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENB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QUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNoRSxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxNQUFNLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUNwRyxPQUFPO1FBQ0wsR0FBRyxHQUFHO1FBQ04sR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN2QyxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO0tBQzVDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBydW5uZXIvZGVhZGxpbmUudHMg4oCUIGBhcm1SdW5gOiB0aGUgcnVuJ3MgT05FIGVmZmVjdGl2ZSBzaWduYWwgYW5kIGl0cyBkZWFkbGluZSAoZGVzaWduIMKnMy4xLCBQMWIpLlxuICpcbiAqIEEgcnVuIGhhcyB0aHJlZSB3YXlzIHRvIGJlIHRvbGQgdG8gc3RvcCDigJQgYFJ1bk9wdGlvbnMuc2lnbmFsYCwgYGVudi5zaWduYWxgLCBhbmQgYSBkZWFkbGluZSAoYFJ1bk9wdGlvbnMuZGVhZGxpbmVgLFxuICogYG5vdyArIFJ1bk9wdGlvbnMudGltZW91dE1zYCwgb3IgYGVudi5kZWFkbGluZWA7IHRoZSBlYXJsaWVzdCB3aW5zKS4gQmVmb3JlIDEwLjEgdGhleSBkaWQgbm90IGNvbXBvc2U6IGB0aW1lb3V0TXNgXG4gKiB3YXMgaWdub3JlZCBiZXNpZGUgYSBgc2lnbmFsYCwgYW5kIGBlbnYuc2lnbmFsYCB3YXMgcmVhZGFibGUgYnV0IG5ldmVyIHJhY2VkLiBgYXJtUnVuYCBjb21wb3NlcyBhbGwgb2YgdGhlbSBpbnRvXG4gKiBvbmUgc2lnbmFsIHRoZSB0cmF2ZXJzZXIgcmFjZXMgKGFuZCBoYW5kcyBldmVyeSBzdWJmbG93KSwgYW5kIHN0YW1wcyB0aGUgZW52IGEgc3RhZ2UgcmVhZHM6XG4gKlxuICogICBlbnYuZGVhZGxpbmUgPSB0aGUgZGVhZGxpbmUgKGVwb2NoIG1zKSAgICAgIGVudi5zaWduYWwgPSB0aGUgb25lIGNvbXBvc2VkIHNpZ25hbFxuICpcbiAqIOKAlCBidXQgb25seSB3aGVuIHRoZXJlIGlzIHNvbWV0aGluZyB0byBzdGFtcCBBTkQgc29tZXdoZXJlIGl0IHdhcyBhbHJlYWR5IGdvaW5nOiBhIGRlYWRsaW5lIGFsd2F5cyBnaXZlcyB0aGUgcnVuXG4gKiBhbiBlbnY7IGEgc2lnbmFsIGlzIHN0YW1wZWQgb250byBhbiBlbnYgdGhlIGNhbGxlciBnYXZlLiBBIHJ1biB3aXRoIG5vIGRlYWRsaW5lIGFuZCBubyBlbnYga2VlcHMgbm8gZW52LCBzbyBhXG4gKiBzdGFnZSdzIGAkZ2V0RW52KClgIHN0YXlzIGB7fWAgYW5kIGl0cyBjb21taXQgY2FycmllcyBubyBgJ2VudidgIG1hcmsg4oCUIGJ5dGUtaWRlbnRpY2FsIHRvIDEwLjAuXG4gKlxuICogQXQgdGhlIGRlYWRsaW5lIHRoZSBzaWduYWwgYWJvcnRzIHdpdGggYSBCUkFOREVEIHJlYXNvbiAoYGF0dGVtcHQvZGVhZGxpbmUudHNgKSBjYXJyeWluZyB0aGUgbWVzc2FnZSBhIHJ1biB3aXRoXG4gKiBgdGltZW91dE1zYCBhbHdheXMgcmVqZWN0ZWQgd2l0aCwgc28gdGhlIGF0dGVtcHQgcnVubmVyIHJlYWRzIGl0IGFzIFwib3V0IG9mIHRpbWVcIiAoYHRpbWVvdXRgIC8gYG5vLXRpbWUtbGVmdGApLFxuICogbmV2ZXIgYXMgYSBjYW5jZWxsYXRpb24uXG4gKi9cblxuaW1wb3J0IHsgYW55U2lnbmFsIH0gZnJvbSAnLi4vYXR0ZW1wdC9hbnlTaWduYWwuanMnO1xuaW1wb3J0IHsgZGVhZGxpbmVSZWFzb24sIGlzQWJvcnRTaWduYWwsIHJlYWREZWFkbGluZSwgc2V0TG9uZ1RpbWVvdXQgfSBmcm9tICcuLi9hdHRlbXB0L2RlYWRsaW5lLmpzJztcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uRW52IH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcblxuLyoqIFdoYXQgYGFybVJ1bmAgcmVhZHMg4oCUIHRoZSBydW4ncyBvd24gb3B0aW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuVGltaW5nIHtcbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgZGVhZGxpbmU/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGVudj86IEV4ZWN1dGlvbkVudjtcbiAgLyoqXG4gICAqIFRoZSBleGVjdXRvcidzIG93biBzdG9wICgxMC4xLCBQNik6IGEgcmVjb3JkIHNpbmsgd2l0aCBgb25GYWlsdXJlOiAnZmFpbCdgIGFib3J0cyBpdCBhdCB0aGUgZmlyc3QgbG9zdCBlbnRyeSxcbiAgICogd2l0aCB0aGUgYFJlY29yZFNpbmtFcnJvcmAgYXMgaXRzIHJlYXNvbi4gQ29tcG9zZWQgbGlrZSB0aGUgb3RoZXJzOyBhYnNlbnQgZm9yIGV2ZXJ5IG90aGVyIHJ1bi5cbiAgICovXG4gIHJlYWRvbmx5IHN0b3A/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIFRoZSBhcm1lZCBydW46IHRoZSBzaWduYWwgdGhlIHRyYXZlcnNlciByYWNlcywgdGhlIGVudiBzdGFnZXMgcmVhZCwgYW5kIHRoZSBvbmUgY2FsbCB0aGF0IHJlbGVhc2VzIGJvdGguICovXG5leHBvcnQgaW50ZXJmYWNlIEFybWVkUnVuIHtcbiAgcmVhZG9ubHkgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZW52OiBFeGVjdXRpb25FbnYgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgcnVuJ3MgZGVhZGxpbmUsIGVwb2NoIG1zIOKAlCBhYnNlbnQgd2l0aG91dCBvbmUuICovXG4gIHJlYWRvbmx5IGRlYWRsaW5lOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBDbGVhciB0aGUgZGVhZGxpbmUgdGltZXIgYW5kIHJlbW92ZSBldmVyeSBsaXN0ZW5lciBjb21wb3NpdGlvbiBhZGRlZC4gSWRlbXBvdGVudC4gKi9cbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG4vKiogQ29tcG9zZSB0aGUgcnVuJ3Mgc2lnbmFsIGFuZCBkZWFkbGluZSBmcm9tIGl0cyBvcHRpb25zOyBgbm93YCBpcyB0aGUgY2xvY2sgKGVwb2NoIG1zKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcm1SdW4odGltaW5nOiBSdW5UaW1pbmcsIG5vdzogKCkgPT4gbnVtYmVyID0gRGF0ZS5ub3cpOiBBcm1lZFJ1biB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IG5vdygpO1xuICAvLyBFYWNoIGlucHV0IHJlYWQgT05DRTogYSBnZXR0ZXIgb24gdGhlIGVudiBjYW5ub3Qgc3RhbXAgYSBkZWFkbGluZSB0aGF0IHdhcyBuZXZlciBhcm1lZC5cbiAgY29uc3QgZW52ID0gdGltaW5nLmVudjtcbiAgY29uc3QgZW52RGVhZGxpbmUgPSBlbnY/LmRlYWRsaW5lO1xuICBjb25zdCBlbnZTaWduYWwgPSBlbnY/LnNpZ25hbDtcbiAgY29uc3QgZGVhZGxpbmUgPSBlYXJsaWVzdERlYWRsaW5lKHRpbWluZywgZW52RGVhZGxpbmUsIHN0YXJ0ZWRBdCk7XG5cbiAgY29uc3QgY29udHJvbGxlciA9IGRlYWRsaW5lICE9PSB1bmRlZmluZWQgPyBuZXcgQWJvcnRDb250cm9sbGVyKCkgOiB1bmRlZmluZWQ7XG4gIC8vIGBlbnYuc2lnbmFsYCB3YXMgcmVhZGFibGUtb25seSBiZWZvcmUgMTAuMTogYSB2YWx1ZSB0aGF0IGlzIG5vdCBhIHNpZ25hbCBpcyBzdGlsbCBvbmx5IHJlYWRhYmxlLCBuZXZlciByYWNlZC5cbiAgY29uc3Qgc291cmNlcyA9IFtcbiAgICB0aW1pbmcuc2lnbmFsLFxuICAgIGlzQWJvcnRTaWduYWwoZW52U2lnbmFsKSA/IGVudlNpZ25hbCA6IHVuZGVmaW5lZCxcbiAgICB0aW1pbmcuc3RvcCxcbiAgICBjb250cm9sbGVyPy5zaWduYWwsXG4gIF0uZmlsdGVyKChzKTogcyBpcyBBYm9ydFNpZ25hbCA9PiBzICE9PSB1bmRlZmluZWQpO1xuICAvLyBPbmUgc291cmNlIGlzIHVzZWQgYXMgaXQgaXMgKHRoZSBjYWxsZXIncyBvd24gc2lnbmFsLCB1bnRvdWNoZWQpOyB0d28gb3IgbW9yZSBhcmUgY29tcG9zZWQuIENvbXBvc2VkIEJFRk9SRVxuICAvLyB0aGUgdGltZXIgaXMgYXJtZWQsIHNvIGEgY29tcG9zaXRpb24gdGhhdCB0aHJvd3MgbGVhdmVzIG5vIHRpbWVyIGJlaGluZC5cbiAgY29uc3QgY29tcG9zZWQgPSBzb3VyY2VzLmxlbmd0aCA+IDEgPyBhbnlTaWduYWwoc291cmNlcykgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNpZ25hbCA9IGNvbXBvc2VkPy5zaWduYWwgPz8gc291cmNlc1swXTtcblxuICBsZXQgY2FuY2VsVGltZXI6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgaWYgKGNvbnRyb2xsZXIgIT09IHVuZGVmaW5lZCAmJiBkZWFkbGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmVhc29uID0gZGVhZGxpbmVSZWFzb24oZGVhZGxpbmVNZXNzYWdlKHRpbWluZywgZGVhZGxpbmUsIHN0YXJ0ZWRBdCkpO1xuICAgIGNvbnN0IGxlZnQgPSBkZWFkbGluZSAtIHN0YXJ0ZWRBdDtcbiAgICBpZiAobGVmdCA8PSAwKSBjb250cm9sbGVyLmFib3J0KHJlYXNvbik7XG4gICAgZWxzZSBjYW5jZWxUaW1lciA9IHNldExvbmdUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQocmVhc29uKSwgbGVmdCk7XG4gIH1cblxuICBsZXQgZGlzcG9zZWQgPSBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBzaWduYWwsXG4gICAgZW52OiBzdGFtcGVkRW52KGVudiwgZW52U2lnbmFsLCBzaWduYWwsIGRlYWRsaW5lKSxcbiAgICBkZWFkbGluZSxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICBpZiAoZGlzcG9zZWQpIHJldHVybjtcbiAgICAgIGRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIGNhbmNlbFRpbWVyPy4oKTtcbiAgICAgIGNvbXBvc2VkPy5kaXNwb3NlKCk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIFRoZSBlYXJsaWVzdCB2YWxpZCBkZWFkbGluZSBvZiB0aGUgdGhyZWUgaW5wdXRzLiBgdGltZW91dE1zYCAwIChvciBub3QgZmluaXRlKSBhcm1zIG5vdGhpbmcsIGFzIGl0IG5ldmVyIGRpZC4gKi9cbmZ1bmN0aW9uIGVhcmxpZXN0RGVhZGxpbmUodGltaW5nOiBSdW5UaW1pbmcsIGVudkRlYWRsaW5lOiB1bmtub3duLCBzdGFydGVkQXQ6IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZyb21UaW1lb3V0ID1cbiAgICB0eXBlb2YgdGltaW5nLnRpbWVvdXRNcyA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHRpbWluZy50aW1lb3V0TXMpICYmIHRpbWluZy50aW1lb3V0TXMgIT09IDBcbiAgICAgID8gc3RhcnRlZEF0ICsgdGltaW5nLnRpbWVvdXRNc1xuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbcmVhZERlYWRsaW5lKHRpbWluZy5kZWFkbGluZSksIGZyb21UaW1lb3V0LCByZWFkRGVhZGxpbmUoZW52RGVhZGxpbmUpXS5maWx0ZXIoXG4gICAgKGQpOiBkIGlzIG51bWJlciA9PiBkICE9PSB1bmRlZmluZWQsXG4gICk7XG4gIHJldHVybiBjYW5kaWRhdGVzLmxlbmd0aCA+IDAgPyBNYXRoLm1pbiguLi5jYW5kaWRhdGVzKSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRoZSBkZWFkbGluZSdzIG1lc3NhZ2U6IGB0aW1lb3V0TXNgJ3MgaGlzdG9yaWNhbCBvbmUgd2hlbiBpdCBzZXQgdGhlIGRlYWRsaW5lLCBlbHNlIHRoZSBkZWFkbGluZSdzIG93bi4gKi9cbmZ1bmN0aW9uIGRlYWRsaW5lTWVzc2FnZSh0aW1pbmc6IFJ1blRpbWluZywgZGVhZGxpbmU6IG51bWJlciwgc3RhcnRlZEF0OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHRpbWluZy50aW1lb3V0TXMgPT09ICdudW1iZXInICYmIHN0YXJ0ZWRBdCArIHRpbWluZy50aW1lb3V0TXMgPT09IGRlYWRsaW5lKSB7XG4gICAgcmV0dXJuIGBFeGVjdXRpb24gdGltZWQgb3V0IGFmdGVyICR7dGltaW5nLnRpbWVvdXRNc31tc2A7XG4gIH1cbiAgcmV0dXJuIGBFeGVjdXRpb24gcGFzc2VkIGl0cyBkZWFkbGluZSAoJHtkZWFkbGluZX0gZXBvY2ggbXMpYDtcbn1cblxuLyoqIFRoZSBlbnYgc3RhZ2VzIHJlYWQ6IHRoZSBjYWxsZXIncywgcGx1cyB0aGUgZGVhZGxpbmUgYW5kIHRoZSBvbmUgc2lnbmFsIOKAlCBvbmx5IHdoZXJlIHRoZXJlIGlzIG9uZSB0byBzdGFtcC4gKi9cbmZ1bmN0aW9uIHN0YW1wZWRFbnYoXG4gIGVudjogRXhlY3V0aW9uRW52IHwgdW5kZWZpbmVkLFxuICBlbnZTaWduYWw6IHVua25vd24sXG4gIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gIGRlYWRsaW5lOiBudW1iZXIgfCB1bmRlZmluZWQsXG4pOiBFeGVjdXRpb25FbnYgfCB1bmRlZmluZWQge1xuICBjb25zdCBoYXNFbnYgPSBlbnYgIT09IHVuZGVmaW5lZCAmJiBPYmplY3Qua2V5cyhlbnYpLmxlbmd0aCA+IDA7XG4gIGlmIChkZWFkbGluZSA9PT0gdW5kZWZpbmVkICYmICghaGFzRW52IHx8IHNpZ25hbCA9PT0gdW5kZWZpbmVkIHx8IGVudlNpZ25hbCA9PT0gc2lnbmFsKSkgcmV0dXJuIGVudjtcbiAgcmV0dXJuIHtcbiAgICAuLi5lbnYsXG4gICAgLi4uKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmIHsgc2lnbmFsIH0pLFxuICAgIC4uLihkZWFkbGluZSAhPT0gdW5kZWZpbmVkICYmIHsgZGVhZGxpbmUgfSksXG4gIH07XG59XG4iXX0=
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVhZGxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9kZWFkbGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFckYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBeUIxRCw2RkFBNkY7QUFDN0YsTUFBTSxVQUFVLE1BQU0sQ0FBQyxNQUFpQixFQUFFLE1BQW9CLElBQUksQ0FBQyxHQUFHO0lBQ3BFLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLDBGQUEwRjtJQUMxRixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ3ZCLE1BQU0sV0FBVyxHQUFHLEdBQUcsRUFBRSxRQUFRLENBQUM7SUFDbEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFLE1BQU0sQ0FBQztJQUM5QixNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRWxFLE1BQU0sVUFBVSxHQUFHLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM5RSxnSEFBZ0g7SUFDaEgsTUFBTSxPQUFPLEdBQUc7UUFDZCxNQUFNLENBQUMsTUFBTTtRQUNiLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ2hELE1BQU0sQ0FBQyxJQUFJO1FBQ1gsVUFBVSxFQUFFLE1BQU07S0FDbkIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQW9CLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDbkQsOEdBQThHO0lBQzlHLDJFQUEyRTtJQUMzRSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckUsTUFBTSxNQUFNLEdBQUcsUUFBUSxFQUFFLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFOUMsSUFBSSxXQUFxQyxDQUFDO0lBQzFDLElBQUksVUFBVSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdkQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsTUFBTSxJQUFJLEdBQUcsUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUNsQyxJQUFJLElBQUksSUFBSSxDQUFDO1lBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzs7WUFDbkMsV0FBVyxHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDckIsT0FBTztRQUNMLE1BQU07UUFDTixHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQztRQUNqRCxRQUFRO1FBQ1IsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNaLElBQUksUUFBUTtnQkFBRSxPQUFPO1lBQ3JCLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDaEIsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUNoQixRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDdEIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsb0hBQW9IO0FBQ3BILFNBQVMsZ0JBQWdCLENBQUMsTUFBaUIsRUFBRSxXQUFvQixFQUFFLFNBQWlCO0lBQ2xGLE1BQU0sV0FBVyxHQUNmLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxDQUFDO1FBQ2pHLENBQUMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVM7UUFDOUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQixNQUFNLFVBQVUsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDL0YsQ0FBQyxDQUFDLEVBQWUsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQ3BDLENBQUM7SUFDRixPQUFPLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNyRSxDQUFDO0FBRUQsOEdBQThHO0FBQzlHLFNBQVMsZUFBZSxDQUFDLE1BQWlCLEVBQUUsUUFBZ0IsRUFBRSxTQUFpQjtJQUM3RSxJQUFJLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxRQUFRLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEYsT0FBTyw2QkFBNkIsTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDO0lBQzNELENBQUM7SUFDRCxPQUFPLGtDQUFrQyxRQUFRLFlBQVksQ0FBQztBQUNoRSxDQUFDO0FBRUQsa0hBQWtIO0FBQ2xILFNBQVMsVUFBVSxDQUNqQixHQUE2QixFQUM3QixTQUFrQixFQUNsQixNQUErQixFQUMvQixRQUE0QjtJQUU1QixNQUFNLE1BQU0sR0FBRyxHQUFHLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNoRSxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxNQUFNLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUNwRyxPQUFPO1FBQ0wsR0FBRyxHQUFHO1FBQ04sR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN2QyxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO0tBQzVDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBydW5uZXIvZGVhZGxpbmUudHMg4oCUIGBhcm1SdW5gOiB0aGUgcnVuJ3MgT05FIGVmZmVjdGl2ZSBzaWduYWwgYW5kIGl0cyBkZWFkbGluZSAoZGVzaWduIMKnMy4xLCBQMWIpLlxuICpcbiAqIEEgcnVuIGhhcyB0aHJlZSB3YXlzIHRvIGJlIHRvbGQgdG8gc3RvcCDigJQgYFJ1bk9wdGlvbnMuc2lnbmFsYCwgYGVudi5zaWduYWxgLCBhbmQgYSBkZWFkbGluZSAoYFJ1bk9wdGlvbnMuZGVhZGxpbmVgLFxuICogYG5vdyArIFJ1bk9wdGlvbnMudGltZW91dE1zYCwgb3IgYGVudi5kZWFkbGluZWA7IHRoZSBlYXJsaWVzdCB3aW5zKS4gQmVmb3JlIDEwLjEgdGhleSBkaWQgbm90IGNvbXBvc2U6IGB0aW1lb3V0TXNgXG4gKiB3YXMgaWdub3JlZCBiZXNpZGUgYSBgc2lnbmFsYCwgYW5kIGBlbnYuc2lnbmFsYCB3YXMgcmVhZGFibGUgYnV0IG5ldmVyIHJhY2VkLiBgYXJtUnVuYCBjb21wb3NlcyBhbGwgb2YgdGhlbSBpbnRvXG4gKiBvbmUgc2lnbmFsIHRoZSB0cmF2ZXJzZXIgcmFjZXMgKGFuZCBoYW5kcyBldmVyeSBzdWJmbG93KSwgYW5kIHN0YW1wcyB0aGUgZW52IGEgc3RhZ2UgcmVhZHM6XG4gKlxuICogICBlbnYuZGVhZGxpbmUgPSB0aGUgZGVhZGxpbmUgKGVwb2NoIG1zKSAgICAgIGVudi5zaWduYWwgPSB0aGUgb25lIGNvbXBvc2VkIHNpZ25hbFxuICpcbiAqIOKAlCBidXQgb25seSB3aGVuIHRoZXJlIGlzIHNvbWV0aGluZyB0byBzdGFtcCBBTkQgc29tZXdoZXJlIGl0IHdhcyBhbHJlYWR5IGdvaW5nOiBhIGRlYWRsaW5lIGFsd2F5cyBnaXZlcyB0aGUgcnVuXG4gKiBhbiBlbnY7IGEgc2lnbmFsIGlzIHN0YW1wZWQgb250byBhbiBlbnYgdGhlIGNhbGxlciBnYXZlLiBBIHJ1biB3aXRoIG5vIGRlYWRsaW5lIGFuZCBubyBlbnYga2VlcHMgbm8gZW52LCBzbyBhXG4gKiBzdGFnZSdzIGAkZ2V0RW52KClgIHN0YXlzIGB7fWAgYW5kIGl0cyBjb21taXQgY2FycmllcyBubyBgJ2VudidgIG1hcmsg4oCUIGJ5dGUtaWRlbnRpY2FsIHRvIDEwLjAuXG4gKlxuICogQXQgdGhlIGRlYWRsaW5lIHRoZSBzaWduYWwgYWJvcnRzIHdpdGggYSBCUkFOREVEIHJlYXNvbiAoYGF0dGVtcHQvZGVhZGxpbmUudHNgKSBjYXJyeWluZyB0aGUgbWVzc2FnZSBhIHJ1biB3aXRoXG4gKiBgdGltZW91dE1zYCBhbHdheXMgcmVqZWN0ZWQgd2l0aCwgc28gdGhlIGF0dGVtcHQgcnVubmVyIHJlYWRzIGl0IGFzIFwib3V0IG9mIHRpbWVcIiAoYHRpbWVvdXRgIC8gYG5vLXRpbWUtbGVmdGApLFxuICogbmV2ZXIgYXMgYSBjYW5jZWxsYXRpb24uXG4gKi9cblxuaW1wb3J0IHsgYW55U2lnbmFsIH0gZnJvbSAnLi4vYXR0ZW1wdC9hbnlTaWduYWwuanMnO1xuaW1wb3J0IHsgZGVhZGxpbmVSZWFzb24sIGlzQWJvcnRTaWduYWwsIHJlYWREZWFkbGluZSB9IGZyb20gJy4uL2F0dGVtcHQvZGVhZGxpbmUuanMnO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgc2V0TG9uZ1RpbWVvdXQgfSBmcm9tICcuLi90aW1lcnMvbG9uZ1RpbWVvdXQuanMnO1xuXG4vKiogV2hhdCBgYXJtUnVuYCByZWFkcyDigJQgdGhlIHJ1bidzIG93biBvcHRpb25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5UaW1pbmcge1xuICByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyO1xuICByZWFkb25seSBkZWFkbGluZT86IG51bWJlcjtcbiAgcmVhZG9ubHkgZW52PzogRXhlY3V0aW9uRW52O1xuICAvKipcbiAgICogVGhlIGV4ZWN1dG9yJ3Mgb3duIHN0b3AgKDEwLjEsIFA2KTogYSByZWNvcmQgc2luayB3aXRoIGBvbkZhaWx1cmU6ICdmYWlsJ2AgYWJvcnRzIGl0IGF0IHRoZSBmaXJzdCBsb3N0IGVudHJ5LFxuICAgKiB3aXRoIHRoZSBgUmVjb3JkU2lua0Vycm9yYCBhcyBpdHMgcmVhc29uLiBDb21wb3NlZCBsaWtlIHRoZSBvdGhlcnM7IGFic2VudCBmb3IgZXZlcnkgb3RoZXIgcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogVGhlIGFybWVkIHJ1bjogdGhlIHNpZ25hbCB0aGUgdHJhdmVyc2VyIHJhY2VzLCB0aGUgZW52IHN0YWdlcyByZWFkLCBhbmQgdGhlIG9uZSBjYWxsIHRoYXQgcmVsZWFzZXMgYm90aC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXJtZWRSdW4ge1xuICByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBlbnY6IEV4ZWN1dGlvbkVudiB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBydW4ncyBkZWFkbGluZSwgZXBvY2ggbXMg4oCUIGFic2VudCB3aXRob3V0IG9uZS4gKi9cbiAgcmVhZG9ubHkgZGVhZGxpbmU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqIENsZWFyIHRoZSBkZWFkbGluZSB0aW1lciBhbmQgcmVtb3ZlIGV2ZXJ5IGxpc3RlbmVyIGNvbXBvc2l0aW9uIGFkZGVkLiBJZGVtcG90ZW50LiAqL1xuICBkaXNwb3NlKCk6IHZvaWQ7XG59XG5cbi8qKiBDb21wb3NlIHRoZSBydW4ncyBzaWduYWwgYW5kIGRlYWRsaW5lIGZyb20gaXRzIG9wdGlvbnM7IGBub3dgIGlzIHRoZSBjbG9jayAoZXBvY2ggbXMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFybVJ1bih0aW1pbmc6IFJ1blRpbWluZywgbm93OiAoKSA9PiBudW1iZXIgPSBEYXRlLm5vdyk6IEFybWVkUnVuIHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gbm93KCk7XG4gIC8vIEVhY2ggaW5wdXQgcmVhZCBPTkNFOiBhIGdldHRlciBvbiB0aGUgZW52IGNhbm5vdCBzdGFtcCBhIGRlYWRsaW5lIHRoYXQgd2FzIG5ldmVyIGFybWVkLlxuICBjb25zdCBlbnYgPSB0aW1pbmcuZW52O1xuICBjb25zdCBlbnZEZWFkbGluZSA9IGVudj8uZGVhZGxpbmU7XG4gIGNvbnN0IGVudlNpZ25hbCA9IGVudj8uc2lnbmFsO1xuICBjb25zdCBkZWFkbGluZSA9IGVhcmxpZXN0RGVhZGxpbmUodGltaW5nLCBlbnZEZWFkbGluZSwgc3RhcnRlZEF0KTtcblxuICBjb25zdCBjb250cm9sbGVyID0gZGVhZGxpbmUgIT09IHVuZGVmaW5lZCA/IG5ldyBBYm9ydENvbnRyb2xsZXIoKSA6IHVuZGVmaW5lZDtcbiAgLy8gYGVudi5zaWduYWxgIHdhcyByZWFkYWJsZS1vbmx5IGJlZm9yZSAxMC4xOiBhIHZhbHVlIHRoYXQgaXMgbm90IGEgc2lnbmFsIGlzIHN0aWxsIG9ubHkgcmVhZGFibGUsIG5ldmVyIHJhY2VkLlxuICBjb25zdCBzb3VyY2VzID0gW1xuICAgIHRpbWluZy5zaWduYWwsXG4gICAgaXNBYm9ydFNpZ25hbChlbnZTaWduYWwpID8gZW52U2lnbmFsIDogdW5kZWZpbmVkLFxuICAgIHRpbWluZy5zdG9wLFxuICAgIGNvbnRyb2xsZXI/LnNpZ25hbCxcbiAgXS5maWx0ZXIoKHMpOiBzIGlzIEFib3J0U2lnbmFsID0+IHMgIT09IHVuZGVmaW5lZCk7XG4gIC8vIE9uZSBzb3VyY2UgaXMgdXNlZCBhcyBpdCBpcyAodGhlIGNhbGxlcidzIG93biBzaWduYWwsIHVudG91Y2hlZCk7IHR3byBvciBtb3JlIGFyZSBjb21wb3NlZC4gQ29tcG9zZWQgQkVGT1JFXG4gIC8vIHRoZSB0aW1lciBpcyBhcm1lZCwgc28gYSBjb21wb3NpdGlvbiB0aGF0IHRocm93cyBsZWF2ZXMgbm8gdGltZXIgYmVoaW5kLlxuICBjb25zdCBjb21wb3NlZCA9IHNvdXJjZXMubGVuZ3RoID4gMSA/IGFueVNpZ25hbChzb3VyY2VzKSA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2lnbmFsID0gY29tcG9zZWQ/LnNpZ25hbCA/PyBzb3VyY2VzWzBdO1xuXG4gIGxldCBjYW5jZWxUaW1lcjogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICBpZiAoY29udHJvbGxlciAhPT0gdW5kZWZpbmVkICYmIGRlYWRsaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZWFzb24gPSBkZWFkbGluZVJlYXNvbihkZWFkbGluZU1lc3NhZ2UodGltaW5nLCBkZWFkbGluZSwgc3RhcnRlZEF0KSk7XG4gICAgY29uc3QgbGVmdCA9IGRlYWRsaW5lIC0gc3RhcnRlZEF0O1xuICAgIGlmIChsZWZ0IDw9IDApIGNvbnRyb2xsZXIuYWJvcnQocmVhc29uKTtcbiAgICBlbHNlIGNhbmNlbFRpbWVyID0gc2V0TG9uZ1RpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChyZWFzb24pLCBsZWZ0KTtcbiAgfVxuXG4gIGxldCBkaXNwb3NlZCA9IGZhbHNlO1xuICByZXR1cm4ge1xuICAgIHNpZ25hbCxcbiAgICBlbnY6IHN0YW1wZWRFbnYoZW52LCBlbnZTaWduYWwsIHNpZ25hbCwgZGVhZGxpbmUpLFxuICAgIGRlYWRsaW5lLFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGlmIChkaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgY2FuY2VsVGltZXI/LigpO1xuICAgICAgY29tcG9zZWQ/LmRpc3Bvc2UoKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKiogVGhlIGVhcmxpZXN0IHZhbGlkIGRlYWRsaW5lIG9mIHRoZSB0aHJlZSBpbnB1dHMuIGB0aW1lb3V0TXNgIDAgKG9yIG5vdCBmaW5pdGUpIGFybXMgbm90aGluZywgYXMgaXQgbmV2ZXIgZGlkLiAqL1xuZnVuY3Rpb24gZWFybGllc3REZWFkbGluZSh0aW1pbmc6IFJ1blRpbWluZywgZW52RGVhZGxpbmU6IHVua25vd24sIHN0YXJ0ZWRBdDogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZnJvbVRpbWVvdXQgPVxuICAgIHR5cGVvZiB0aW1pbmcudGltZW91dE1zID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodGltaW5nLnRpbWVvdXRNcykgJiYgdGltaW5nLnRpbWVvdXRNcyAhPT0gMFxuICAgICAgPyBzdGFydGVkQXQgKyB0aW1pbmcudGltZW91dE1zXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtyZWFkRGVhZGxpbmUodGltaW5nLmRlYWRsaW5lKSwgZnJvbVRpbWVvdXQsIHJlYWREZWFkbGluZShlbnZEZWFkbGluZSldLmZpbHRlcihcbiAgICAoZCk6IGQgaXMgbnVtYmVyID0+IGQgIT09IHVuZGVmaW5lZCxcbiAgKTtcbiAgcmV0dXJuIGNhbmRpZGF0ZXMubGVuZ3RoID4gMCA/IE1hdGgubWluKC4uLmNhbmRpZGF0ZXMpIDogdW5kZWZpbmVkO1xufVxuXG4vKiogVGhlIGRlYWRsaW5lJ3MgbWVzc2FnZTogYHRpbWVvdXRNc2AncyBoaXN0b3JpY2FsIG9uZSB3aGVuIGl0IHNldCB0aGUgZGVhZGxpbmUsIGVsc2UgdGhlIGRlYWRsaW5lJ3Mgb3duLiAqL1xuZnVuY3Rpb24gZGVhZGxpbmVNZXNzYWdlKHRpbWluZzogUnVuVGltaW5nLCBkZWFkbGluZTogbnVtYmVyLCBzdGFydGVkQXQ6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdGltaW5nLnRpbWVvdXRNcyA9PT0gJ251bWJlcicgJiYgc3RhcnRlZEF0ICsgdGltaW5nLnRpbWVvdXRNcyA9PT0gZGVhZGxpbmUpIHtcbiAgICByZXR1cm4gYEV4ZWN1dGlvbiB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1pbmcudGltZW91dE1zfW1zYDtcbiAgfVxuICByZXR1cm4gYEV4ZWN1dGlvbiBwYXNzZWQgaXRzIGRlYWRsaW5lICgke2RlYWRsaW5lfSBlcG9jaCBtcylgO1xufVxuXG4vKiogVGhlIGVudiBzdGFnZXMgcmVhZDogdGhlIGNhbGxlcidzLCBwbHVzIHRoZSBkZWFkbGluZSBhbmQgdGhlIG9uZSBzaWduYWwg4oCUIG9ubHkgd2hlcmUgdGhlcmUgaXMgb25lIHRvIHN0YW1wLiAqL1xuZnVuY3Rpb24gc3RhbXBlZEVudihcbiAgZW52OiBFeGVjdXRpb25FbnYgfCB1bmRlZmluZWQsXG4gIGVudlNpZ25hbDogdW5rbm93bixcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCxcbiAgZGVhZGxpbmU6IG51bWJlciB8IHVuZGVmaW5lZCxcbik6IEV4ZWN1dGlvbkVudiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhhc0VudiA9IGVudiAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5rZXlzKGVudikubGVuZ3RoID4gMDtcbiAgaWYgKGRlYWRsaW5lID09PSB1bmRlZmluZWQgJiYgKCFoYXNFbnYgfHwgc2lnbmFsID09PSB1bmRlZmluZWQgfHwgZW52U2lnbmFsID09PSBzaWduYWwpKSByZXR1cm4gZW52O1xuICByZXR1cm4ge1xuICAgIC4uLmVudixcbiAgICAuLi4oc2lnbmFsICE9PSB1bmRlZmluZWQgJiYgeyBzaWduYWwgfSksXG4gICAgLi4uKGRlYWRsaW5lICE9PSB1bmRlZmluZWQgJiYgeyBkZWFkbGluZSB9KSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -125,7 +125,8 @@ export declare class RunRecord {
|
|
|
125
125
|
/** Same served seed as opened; a history digest never sees a seeded policy secret. */
|
|
126
126
|
captureInitialState(state: Record<string, unknown>): Record<string, unknown>;
|
|
127
127
|
/**
|
|
128
|
-
* Await the adapter's `flush()`, at most `timeoutMs` when given
|
|
128
|
+
* Await the adapter's `flush()`, at most `timeoutMs` when given — by the one long-timer law (`Infinity` waits for
|
|
129
|
+
* the flush, a value that is not a number > 0 gives up at once). A flush that throws or rejects is a loss
|
|
129
130
|
* (counted, and fatal under `'fail'`); one still running at the deadline is `pending` and keeps running — and,
|
|
130
131
|
* with `pendingIsLoss` (the run's own flush), counted as a loss too, so a flush that never settles cannot hold a
|
|
131
132
|
* run open, and cannot pass for one that landed. Nothing here throws: a hostile adapter (a throwing `flush`
|
|
@@ -26,6 +26,7 @@ import { settleOnce } from '../capture/sinkSettlement.js';
|
|
|
26
26
|
import { isDevMode } from '../devMode.js';
|
|
27
27
|
import { extractErrorInfo, thrownText } from '../errors/errorInfo.js';
|
|
28
28
|
import { SCOPE_PLACEHOLDER } from '../memory/redaction.js';
|
|
29
|
+
import { setLongTimeout } from '../timers/longTimeout.js';
|
|
29
30
|
/**
|
|
30
31
|
* A run with `sink: { onFailure: 'fail' }` lost an entry: the record the app asked to be kept is not whole.
|
|
31
32
|
* `cause` is the adapter's own error.
|
|
@@ -242,7 +243,8 @@ export class RunRecord {
|
|
|
242
243
|
return this.rule ? this.rule.retainState(state, LOG_PLACEHOLDER) : state;
|
|
243
244
|
}
|
|
244
245
|
/**
|
|
245
|
-
* Await the adapter's `flush()`, at most `timeoutMs` when given
|
|
246
|
+
* Await the adapter's `flush()`, at most `timeoutMs` when given — by the one long-timer law (`Infinity` waits for
|
|
247
|
+
* the flush, a value that is not a number > 0 gives up at once). A flush that throws or rejects is a loss
|
|
246
248
|
* (counted, and fatal under `'fail'`); one still running at the deadline is `pending` and keeps running — and,
|
|
247
249
|
* with `pendingIsLoss` (the run's own flush), counted as a loss too, so a flush that never settles cannot hold a
|
|
248
250
|
* run open, and cannot pass for one that landed. Nothing here throws: a hostile adapter (a throwing `flush`
|
|
@@ -267,23 +269,26 @@ export class RunRecord {
|
|
|
267
269
|
this.lost(error, undefined, this.errorView(error, rule));
|
|
268
270
|
return { done: false, failed: true, pending: false };
|
|
269
271
|
}
|
|
270
|
-
if (timeoutMs === undefined
|
|
272
|
+
if (timeoutMs === undefined)
|
|
271
273
|
return settled;
|
|
272
|
-
|
|
274
|
+
// The one long-timer law (`timers/longTimeout.ts`) decides every limit, as it does for `drainObservers`:
|
|
275
|
+
// `Infinity` arms no timer and waits for the flush, a limit past 2^31 − 1 ms is waited in full, and anything that
|
|
276
|
+
// is not a number > 0 (`0`, a negative, `-Infinity`, `NaN`) gives up at once.
|
|
277
|
+
let cancelTimer = () => undefined;
|
|
273
278
|
const pending = new Promise((resolve) => {
|
|
274
|
-
|
|
279
|
+
cancelTimer = setLongTimeout(() => resolve({ done: false, failed: false, pending: true }), timeoutMs);
|
|
275
280
|
});
|
|
276
281
|
try {
|
|
277
282
|
const result = await Promise.race([settled, pending]);
|
|
278
283
|
if (result.pending && pendingIsLoss) {
|
|
279
284
|
givenUp = true;
|
|
280
|
-
const error = new Error(`record sink: flush() did not settle within ${
|
|
285
|
+
const error = new Error(`record sink: flush() did not settle within ${timeoutMs > 0 ? timeoutMs : 0}ms`);
|
|
281
286
|
this.lost(error, undefined, this.errorView(error, rule));
|
|
282
287
|
}
|
|
283
288
|
return result;
|
|
284
289
|
}
|
|
285
290
|
finally {
|
|
286
|
-
|
|
291
|
+
cancelTimer();
|
|
287
292
|
}
|
|
288
293
|
}
|
|
289
294
|
/** The meta as served: a boundary record, scrubbed by key name at every depth (an inert rule copies nothing). */
|
|
@@ -328,4 +333,4 @@ function tellAdapter(adapter, failure) {
|
|
|
328
333
|
// A listener that fails is the adapter's own business: the loss is already counted.
|
|
329
334
|
}
|
|
330
335
|
}
|
|
331
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkU2luay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL3JlY29yZFNpbmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFJSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBeUMzRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxLQUFLO0lBRUY7SUFEcEIsSUFBSSxHQUFHLGlCQUFpQixDQUFDO0lBQzNDLFlBQVksT0FBZSxFQUFXLEtBQWM7UUFDbEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRHFCLFVBQUssR0FBTCxLQUFLLENBQVM7SUFFcEQsQ0FBQztDQUNGO0FBVUQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQVUsQ0FBQztBQWVoRSxTQUFTLFNBQVMsQ0FBQyxLQUFjO0lBQy9CLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUQsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFRLEtBQWlDLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDLENBQUM7QUFDM0YsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxNQUFlO0lBQy9DLElBQUks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QixDQUFDLENBQUM7WUFDbEgsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUYsQ0FBQztDQUNGO0FBRUQsZ0hBQWdIO0FBQ2hILFNBQVMsV0FBVyxDQUFDLE9BQW1CLEVBQUUsT0FBaUU7SUFDekcsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQVksT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUM1QyxJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVU7WUFBRSxPQUFPO1FBQzNDLFVBQVUsQ0FDUixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFDL0IsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUNmLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FDaEIsQ0FBQztJQUNKLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxvRkFBb0Y7SUFDdEYsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJ1bm5lci9yZWNvcmRTaW5rLnRzIOKAlCB0aGUgcnVuJ3Mgc2lkZSBvZiB0aGUgY3Jhc2gtc2FmZSByZWNvcmQgKGRlc2lnbiDCpzMuNSwgcGFja2V0IFA2KS5cbiAqXG4gKiBmb290dHJhY2Ugb3ducyB0aGUgcG9ydCAoYFJlY29yZFNpbmtgLCBgZm9vdHRyYWNlL3dyaXRlYCk6IGEgbG9nIGJ1aWx0IHdpdGggYSBzaW5rIGhhbmRzIGl0IGV2ZXJ5IGVudHJ5IEFTIElUXG4gKiBMQU5EUyDigJQgYG9wZW5lZGAsIGBjb21taXRgLCBgbm90ZWAsIGBjbG9zZWRgIOKAlCBhbmQgY291bnRzIHdoYXQgdGhlIHNpbmsgZGlkIG5vdCB0YWtlLiBUaGlzIGZpbGUgaXMgd2hhdCB0aGVcbiAqIEVYRUNVVE9SIGFkZHMgYXJvdW5kIGFuIGFwcCdzIGFkYXB0ZXIsIG9uZSB7QGxpbmsgUnVuUmVjb3JkfSBwZXIgcnVuOlxuICpcbiAqICAgLSBUSEUgT05FIExBVywgYmVmb3JlIGFueSBieXRlIGxlYXZlczogdGhlIGBvcGVuZWRgIGJhc2UgaXMgdGhlIHJ1bidzIHNlcnZlZCBmb3JtIG9mIGl0ICh0aGUgcmVkYWN0aW9uIHJ1bGUnc1xuICogICAgIGByZXRhaW5TdGF0ZWAsIHRoZSBtaXJyb3IncyBzZWVkIOKAlCBzbyBhIHBvbGljeSBrZXkgc2VlZGVkIGJ5IGBpbml0aWFsQ29udGV4dGAgb3IgYSBjaGVja3BvaW50IG5ldmVyIHJlYWNoZXNcbiAqICAgICB0aGUgc2luayksIGFuZCB0aGUgYG9wZW5lZGAgLyBgY2xvc2VkYCBtZXRhIGFyZSBib3VuZGFyeSByZWNvcmRzIChgcmV0YWluQm91bmRhcnlgKS4gQSBjb21taXQgaXMgdGhlIGxvZydzIG93blxuICogICAgIGJ1bmRsZSwgYWxyZWFkeSBzY3J1YmJlZCBhdCBjb21taXQ7IGFuIGF0dGVtcHQgbm90ZSBjYXJyaWVzIHRoZSBzZXJ2ZWQgYEF0dGVtcHRSZWNvcmRgIChubyBgcmF3YCkuXG4gKiAgIC0gQUNDT1VOVElORzogZXZlcnkgZW50cnkgaGFuZGVkIHRvIHRoZSBhZGFwdGVyIGlzIGNvdW50ZWQsIGV2ZXJ5IGxvc3MgdG9vIChgZ2V0U25hcHNob3QoKS5zaW5rYCksIHdpdGggYVxuICogICAgIGRldi1tb2RlIHdhcm5pbmcgb24gdGhlIGZpcnN0IGxvc3Mgb2YgYSBydW4uIFRoZSBhZGFwdGVyJ3Mgb3duIGBvbkZhaWx1cmVgIGhlYXJzIGEgZGlzcGF0Y2hlZCBlbnRyeSdzIGxvc3NcbiAqICAgICB3aXRoIHRoYXQgc2FtZSBzZXJ2ZWQgZW50cnkgYW5kIGEgc2VydmVkIGVycm9yLCBpc29sYXRlZC4gQSByZWZ1c2FsIGJlZm9yZSBkaXNwYXRjaCBpcyBjb3VudGVkIHdpdGhvdXRcbiAqICAgICBmb3J3YXJkaW5nIEZvb3R0cmFjZSdzIHVuc2VydmVkIGVudHJ5LlxuICogICAtIFRIRSBGQUlMVVJFIE1PREUgKG93bmVyIHJ1bGluZyBRMyk6IGAncmVwb3J0J2AgKGRlZmF1bHQpIOKAlCB0aGUgcnVuIGdvZXMgb247IGAnZmFpbCdgIOKAlCB0aGUgZmlyc3QgbG9zdCBlbnRyeVxuICogICAgIGFib3J0cyB0aGUgcnVuJ3Mgc2lnbmFsIHdpdGggYSB7QGxpbmsgUmVjb3JkU2lua0Vycm9yfSwgYW5kIGEgcnVuIHRoYXQgZmluaXNoZWQgd2l0aCBhIGxvc3MgcmVqZWN0cyB3aXRoIGl0LlxuICogICAtIEZMVVNIOiBgJ2F1dG8nYCAoZGVmYXVsdCkg4oCUIGBydW4oKWAgLyBgcmVzdW1lKClgIGF3YWl0IHRoZSBhZGFwdGVyJ3MgYGZsdXNoKClgIGFmdGVyIHRoZSBjbG9zaW5nIGVudHJ5O1xuICogICAgIGAnbWFudWFsJ2Ag4oCUIHRoZSBhcHAgY2FsbHMgYGV4ZWN1dG9yLmZsdXNoUmVjb3JkKClgLlxuICpcbiAqIEV2ZXJ5IGFkYXB0ZXIgbWV0aG9kIGlzIGNhbGxlZCBzeW5jaHJvbm91c2x5IGZyb20gdGhlIGxvZzsgd2hhdGV2ZXIgdGhlIGFkYXB0ZXIgdGhyb3dzIG9yIHJlamVjdHMgd2l0aCBpcyB0aGVcbiAqIGxvZydzIHRvIGNvdW50IChgRXZlbnRMb2cgwrcgc2lua0ZhaWx1cmVzYCksIG5ldmVyIHRoZSBydW4ncyDigJQgc28gbm90aGluZyBoZXJlIHRocm93cyB0byB0aGUgZW5naW5lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgTWV0YSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgdHlwZSB7IFJlY29yZEVudHJ5LCBSZWNvcmRTaW5rIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcbmltcG9ydCB7IExPR19QTEFDRUhPTERFUiB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgQ2FwdHVyZUhpc3RvcnlPcHRpb25zLCBDYXB0dXJlSGlzdG9yeVN0YXR1cyB9IGZyb20gJy4uL2NhcHR1cmUvaGlzdG9yeVR5cGVzLmpzJztcbmltcG9ydCB7IHNldHRsZU9uY2UgfSBmcm9tICcuLi9jYXB0dXJlL3NpbmtTZXR0bGVtZW50LmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgdGhyb3duVGV4dCB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi4vbWVtb3J5L3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBTQ09QRV9QTEFDRUhPTERFUiB9IGZyb20gJy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBSZWNvcmRTaW5rU3RhdHMgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuXG4vKiogV2hhdCBhIGxvc3QgZW50cnkgZG9lcyB0byB0aGUgcnVuOiBgJ3JlcG9ydCdgIGNvdW50cyBpdCBhbmQgZ29lcyBvbjsgYCdmYWlsJ2AgZmFpbHMgdGhlIHJ1bi4gKi9cbmV4cG9ydCB0eXBlIFJlY29yZFNpbmtGYWlsdXJlTW9kZSA9ICdyZXBvcnQnIHwgJ2ZhaWwnO1xuXG4vKiogV2hlbiB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCBydW5zOiBhZnRlciBlYWNoIHJ1bidzIGNsb3NpbmcgZW50cnkgKGAnYXV0bydgKSwgb3Igd2hlbiB0aGUgYXBwIGFza3MuICovXG5leHBvcnQgdHlwZSBSZWNvcmRTaW5rRmx1c2hNb2RlID0gJ2F1dG8nIHwgJ21hbnVhbCc7XG5cbi8qKlxuICogVGhlIGV4ZWN1dG9yJ3MgYHNpbmtgIG9wdGlvbiBpbiBpdHMgbG9uZyBmb3JtLiBUaGUgc2hvcnQgZm9ybSBpcyB0aGUgYWRhcHRlciBpdHNlbGYuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzaW5rOiB7IGFkYXB0ZXI6IGZpbGVTaW5rKCcvdmFyL2Zvb3RwcmludC9ydW4uanNvbmwnKSwgb25GYWlsdXJlOiAnZmFpbCcgfSB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZFNpbmtPcHRpb25zIHtcbiAgLyoqIFdoZXJlIHRoZSBlbnRyaWVzIGdvIOKAlCBgZmlsZVNpbmsocGF0aClgIChgZm9vdHByaW50anMvc2lua3NgKSwgYG1lbW9yeVNpbmsoKWAgKGBmb290dHJhY2Uvd3JpdGVgKSwgb3IgeW91cnMuICovXG4gIHJlYWRvbmx5IGFkYXB0ZXI6IFJlY29yZFNpbms7XG4gIC8qKiBgJ3JlcG9ydCdgIChkZWZhdWx0KTogYSBsb3N0IGVudHJ5IGlzIGNvdW50ZWQgYW5kIHRoZSBydW4gZ29lcyBvbi4gYCdmYWlsJ2A6IHRoZSBmaXJzdCBvbmUgZmFpbHMgdGhlIHJ1bi4gKi9cbiAgcmVhZG9ubHkgb25GYWlsdXJlPzogUmVjb3JkU2lua0ZhaWx1cmVNb2RlO1xuICAvKiogYCdhdXRvJ2AgKGRlZmF1bHQpOiBgcnVuKClgIGF3YWl0cyB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCBhZnRlciB0aGUgY2xvc2luZyBlbnRyeS4gYCdtYW51YWwnYDogYGZsdXNoUmVjb3JkKClgLiAqL1xuICByZWFkb25seSBmbHVzaD86IFJlY29yZFNpbmtGbHVzaE1vZGU7XG4gIC8qKiBPcHQtaW4gY2FwdHVyZSBldmlkZW5jZSBhbmQgZXhwbGljaXQgaG9zdCBhY2tub3dsZWRnZW1lbnQ7IG9yZGluYXJ5IGZsdXNoIG5ldmVyIGltcGxpZXMgZHVyYWJpbGl0eS4gKi9cbiAgcmVhZG9ubHkgY2FwdHVyZT86IENhcHR1cmVIaXN0b3J5T3B0aW9ucztcbn1cblxuLyoqIFRoZSBleGVjdXRvcidzIGBzaW5rYCBvcHRpb246IGFuIGFkYXB0ZXIsIG9yIHtAbGluayBSZWNvcmRTaW5rT3B0aW9uc30uICovXG5leHBvcnQgdHlwZSBSZWNvcmRTaW5rT3B0aW9uID0gUmVjb3JkU2luayB8IFJlY29yZFNpbmtPcHRpb25zO1xuXG4vKiogV2hhdCBgZXhlY3V0b3IuZmx1c2hSZWNvcmQoKWAgcmVzb2x2ZXMgd2l0aCDigJQgdGhlIGBkcmFpbk9ic2VydmVyc2Agc2hhcGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZEZsdXNoUmVzdWx0IHtcbiAgLyoqIFRoZSBhZGFwdGVyJ3MgZmx1c2ggZmluaXNoZWQgKG9yIHRoZXJlIHdhcyBub3RoaW5nIHRvIGZsdXNoKS4gKi9cbiAgcmVhZG9ubHkgZG9uZTogYm9vbGVhbjtcbiAgLyoqIFRoZSBhZGFwdGVyJ3MgZmx1c2ggdGhyZXcgb3IgcmVqZWN0ZWQg4oCUIGNvdW50ZWQgb24gYGdldFNuYXBzaG90KCkuc2lua2AuICovXG4gIHJlYWRvbmx5IGZhaWxlZDogYm9vbGVhbjtcbiAgLyoqIFRoZSBmbHVzaCBoYWQgbm90IHNldHRsZWQgd2hlbiBgdGltZW91dE1zYCByYW4gb3V0LiAqL1xuICByZWFkb25seSBwZW5kaW5nOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgcnVuIHdpdGggYHNpbms6IHsgb25GYWlsdXJlOiAnZmFpbCcgfWAgbG9zdCBhbiBlbnRyeTogdGhlIHJlY29yZCB0aGUgYXBwIGFza2VkIHRvIGJlIGtlcHQgaXMgbm90IHdob2xlLlxuICogYGNhdXNlYCBpcyB0aGUgYWRhcHRlcidzIG93biBlcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlY29yZFNpbmtFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgbmFtZSA9ICdSZWNvcmRTaW5rRXJyb3InO1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHJlYWRvbmx5IGNhdXNlOiB1bmtub3duKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqIFRoZSBvcHRpb24gcmVzb2x2ZWQgb25jZSwgYXQgY29uc3RydWN0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFJlY29yZFNpbmsge1xuICByZWFkb25seSBhZGFwdGVyOiBSZWNvcmRTaW5rO1xuICByZWFkb25seSBvbkZhaWx1cmU6IFJlY29yZFNpbmtGYWlsdXJlTW9kZTtcbiAgcmVhZG9ubHkgZmx1c2g6IFJlY29yZFNpbmtGbHVzaE1vZGU7XG4gIHJlYWRvbmx5IGNhcHR1cmU/OiBDYXB0dXJlSGlzdG9yeU9wdGlvbnM7XG59XG5cbmNvbnN0IE1FVEhPRFMgPSBbJ29wZW5lZCcsICdjb21taXQnLCAnbm90ZScsICdjbG9zZWQnXSBhcyBjb25zdDtcblxuaW50ZXJmYWNlIFNpbmtFcnJvclZpZXcge1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVycm9yOiB1bmtub3duO1xuICByZWFkb25seSBtYXNrZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJ1bGU/OiBSZWRhY3Rpb25SdWxlO1xufVxuXG5pbnRlcmZhY2UgSW52b2NhdGlvbkZhaWx1cmUge1xuICByZWFkb25seSBlbnRyeTogUmVjb3JkRW50cnk7XG4gIHJlYWRvbmx5IGNhdXNlOiB1bmtub3duO1xuICByZWFkb25seSB2aWV3OiBTaW5rRXJyb3JWaWV3O1xufVxuXG5mdW5jdGlvbiBpc0FkYXB0ZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmRTaW5rIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIE1FVEhPRFMuZXZlcnkoKG0pID0+IHR5cGVvZiAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW21dID09PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBleGVjdXRvcidzIGBzaW5rYCBvcHRpb24sIG9yIHJlZnVzZSBpdCB3aXRoIGEgYFR5cGVFcnJvcmAgbmFtaW5nIHdoYXQgaXMgd3Jvbmcg4oCUIGEgd2lyaW5nIG1pc3Rha2VcbiAqIHRoZSBhcHAgbWFrZXMgb25jZSwgc28gaXQgZmFpbHMgYXQgY29uc3RydWN0aW9uLCBuZXZlciBtaWQtcnVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlY29yZFNpbmsob3B0aW9uOiB1bmtub3duKTogUmVzb2x2ZWRSZWNvcmRTaW5rIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9wdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoaXNBZGFwdGVyKG9wdGlvbikpIHJldHVybiB7IGFkYXB0ZXI6IG9wdGlvbiwgb25GYWlsdXJlOiAncmVwb3J0JywgZmx1c2g6ICdhdXRvJyB9O1xuICBpZiAob3B0aW9uICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnICYmIE9iamVjdC5oYXNPd24ob3B0aW9uLCAnYWRhcHRlcicpKSB7XG4gICAgY29uc3QgeyBhZGFwdGVyLCBvbkZhaWx1cmUgPSAncmVwb3J0JywgZmx1c2ggPSAnYXV0bycsIGNhcHR1cmUgfSA9IG9wdGlvbiBhcyBQYXJ0aWFsPFJlY29yZFNpbmtPcHRpb25zPjtcbiAgICBpZiAoIWlzQWRhcHRlcihhZGFwdGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmxvd0NoYXJ0RXhlY3V0b3I6IHNpbmsuYWRhcHRlciBtdXN0IGJlIGEgUmVjb3JkU2luayAob3BlbmVkLCBjb21taXQsIG5vdGUsIGNsb3NlZCknKTtcbiAgICB9XG4gICAgaWYgKG9uRmFpbHVyZSAhPT0gJ3JlcG9ydCcgJiYgb25GYWlsdXJlICE9PSAnZmFpbCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGbG93Q2hhcnRFeGVjdXRvcjogc2luay5vbkZhaWx1cmUgbXVzdCBiZSAncmVwb3J0JyBvciAnZmFpbCdcIik7XG4gICAgfVxuICAgIGlmIChmbHVzaCAhPT0gJ2F1dG8nICYmIGZsdXNoICE9PSAnbWFudWFsJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZsb3dDaGFydEV4ZWN1dG9yOiBzaW5rLmZsdXNoIG11c3QgYmUgJ2F1dG8nIG9yICdtYW51YWwnXCIpO1xuICAgIH1cbiAgICBpZiAoY2FwdHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIWNhcHR1cmUgfHwgdHlwZW9mIGNhcHR1cmUuYWNrbm93bGVkZ2UgIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpbmsuY2FwdHVyZSByZXF1aXJlcyBhY2tub3dsZWRnZScpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCBtYXhdIG9mIFtcbiAgICAgICAgWydtYXhCeXRlcycsIDggKiAxMDI0ICogMTAyNF0sXG4gICAgICAgIFsndGltZW91dE1zJywgMzBfMDAwXSxcbiAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjYXB0dXJlW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpIHx8IHZhbHVlIDwgMSB8fCB2YWx1ZSA+IG1heCkpXG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYHNpbmsuY2FwdHVyZS4ke2tleX0gbXVzdCBiZSBhIHBvc2l0aXZlIHdob2xlIG51bWJlciBhdCBtb3N0ICR7bWF4fWApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBmaXhlZENhcHR1cmUgPVxuICAgICAgY2FwdHVyZSAmJlxuICAgICAgT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGFja25vd2xlZGdlOiBjYXB0dXJlLmFja25vd2xlZGdlLmJpbmQoY2FwdHVyZSksXG4gICAgICAgIC4uLihjYXB0dXJlLm1heEJ5dGVzICE9PSB1bmRlZmluZWQgJiYgeyBtYXhCeXRlczogY2FwdHVyZS5tYXhCeXRlcyB9KSxcbiAgICAgICAgLi4uKGNhcHR1cmUudGltZW91dE1zICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0TXM6IGNhcHR1cmUudGltZW91dE1zIH0pLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHsgYWRhcHRlciwgb25GYWlsdXJlLCBmbHVzaCwgLi4uKGZpeGVkQ2FwdHVyZSAmJiB7IGNhcHR1cmU6IGZpeGVkQ2FwdHVyZSB9KSB9O1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ0Zsb3dDaGFydEV4ZWN1dG9yOiBzaW5rIG11c3QgYmUgYSBSZWNvcmRTaW5rIChvcGVuZWQsIGNvbW1pdCwgbm90ZSwgY2xvc2VkKSBvciB7IGFkYXB0ZXIsIG9uRmFpbHVyZT8sIGZsdXNoPyB9JyxcbiAgKTtcbn1cblxuLyoqXG4gKiBPbmUgcnVuJ3MgcmVjb3JkIHNpbms6IHRoZSBzaW5rIGV2ZXJ5IGxvZyBvZiB0aGUgcnVuIHdyaXRlcyB0byAocm9vdCBhbmQgbW91bnRzKSwgaXRzIGFjY291bnRpbmcgYW5kIGl0c1xuICogZmFpbHVyZSBtb2RlLiBBIHNhbWUtZXhlY3V0b3IgcmVzdW1lIGtlZXBzIGl0ICh0aGUgcm9vdCBsb2cgZ29lcyBvbik7IGEgZnJlc2ggcnVuIG1ha2VzIGEgbmV3IG9uZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1blJlY29yZCB7XG4gIC8qKiBIYW5kIHRoaXMgdG8gZXZlcnkgYEV2ZW50TG9nYCBvZiB0aGUgcnVuLiAqL1xuICByZWFkb25seSBzaW5rOiBSZWNvcmRTaW5rO1xuICBwcml2YXRlIGVudHJpZXMgPSAwO1xuICBwcml2YXRlIGZhaWxlZCA9IDA7XG4gIHByaXZhdGUgbGFzdEVycm9yPzogc3RyaW5nO1xuICBwcml2YXRlIHdhcm5lZCA9IGZhbHNlO1xuICBwcml2YXRlIHJ1bGU/OiBSZWRhY3Rpb25SdWxlO1xuICAvKiogQWJvcnRlZCBhdCB0aGUgZmlyc3QgbG9zcyB1bmRlciBgJ2ZhaWwnYCDigJQgY29tcG9zZWQgaW50byB0aGUgbGVnJ3Mgc2lnbmFsOyBmcmVzaCBwZXIgbGVnICh7QGxpbmsgYmVnaW5MZWd9KS4gKi9cbiAgcHJpdmF0ZSBzdG9wcGVyPzogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIGZhaWx1cmU/OiBSZWNvcmRTaW5rRXJyb3I7XG4gIHByaXZhdGUgY2FwdHVyZVBlbmRpbmcgPSAwO1xuICBwcml2YXRlIGNhcHR1cmVTdGF0dXM/OiBDYXB0dXJlSGlzdG9yeVN0YXR1cztcbiAgLyoqIE9wYXF1ZSBlcnJvciBpZGVudGl0aWVzIG9ubHk6IG5vIHJhdyBlbnRyeSBvciBhZGFwdGVyIGVycm9yIGlzIGVudW1lcmFibGUgb24gdGhlIHRyYW5zcG9ydCBlcnJvci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbnZvY2F0aW9uRmFpbHVyZXMgPSBuZXcgV2Vha01hcDxvYmplY3QsIEludm9jYXRpb25GYWlsdXJlPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWQ6IFJlc29sdmVkUmVjb3JkU2luaykge1xuICAgIGlmIChyZXNvbHZlZC5vbkZhaWx1cmUgPT09ICdmYWlsJykgdGhpcy5zdG9wcGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IGFkYXB0ZXIgPSByZXNvbHZlZC5hZGFwdGVyO1xuICAgIGNvbnN0IGhhbmRlZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuZW50cmllcyArPSAxO1xuICAgIH07XG4gICAgdGhpcy5zaW5rID0ge1xuICAgICAgb3BlbmVkOiAoZW50cnkpID0+IHtcbiAgICAgICAgaGFuZGVkKCk7XG4gICAgICAgIGNvbnN0IHJ1bGUgPSB0aGlzLnJ1bGU7XG4gICAgICAgIGNvbnN0IHNlcnZlZCA9IHtcbiAgICAgICAgICAuLi5lbnRyeSxcbiAgICAgICAgICBpbml0aWFsU3RhdGU6IHJ1bGUgPyBydWxlLnJldGFpblN0YXRlKGVudHJ5LmluaXRpYWxTdGF0ZSwgTE9HX1BMQUNFSE9MREVSKSA6IGVudHJ5LmluaXRpYWxTdGF0ZSxcbiAgICAgICAgICAuLi4oZW50cnkubWV0YSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG1ldGE6IHRoaXMuc2VydmUoZW50cnkubWV0YSkgfSksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmludm9rZSh7IC4uLnNlcnZlZCwga2luZDogJ29wZW5lZCcgfSwgKCkgPT4gYWRhcHRlci5vcGVuZWQoc2VydmVkKSwgcnVsZSk7XG4gICAgICB9LFxuICAgICAgY29tbWl0OiAoZW50cnkpID0+IHtcbiAgICAgICAgaGFuZGVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmludm9rZSh7IC4uLmVudHJ5LCBraW5kOiAnY29tbWl0JyB9LCAoKSA9PiBhZGFwdGVyLmNvbW1pdChlbnRyeSksIHRoaXMucnVsZSk7XG4gICAgICB9LFxuICAgICAgbm90ZTogKGVudHJ5KSA9PiB7XG4gICAgICAgIGhhbmRlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2UoXG4gICAgICAgICAgeyBhZGRyZXNzOiBlbnRyeS5hZGRyZXNzLCBhdDogZW50cnkuYXQsIGtpbmQ6ICdub3RlJywgbm90ZTogZW50cnkua2luZCwgZGF0YTogZW50cnkuZGF0YSB9LFxuICAgICAgICAgICgpID0+IGFkYXB0ZXIubm90ZShlbnRyeSksXG4gICAgICAgICAgdGhpcy5ydWxlLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGNsb3NlZDogKGVudHJ5KSA9PiB7XG4gICAgICAgIGhhbmRlZCgpO1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPSB7IC4uLmVudHJ5LCAuLi4oZW50cnkubWV0YSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG1ldGE6IHRoaXMuc2VydmUoZW50cnkubWV0YSkgfSkgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW52b2tlKHsgLi4uc2VydmVkLCBraW5kOiAnY2xvc2VkJyB9LCAoKSA9PiBhZGFwdGVyLmNsb3NlZChzZXJ2ZWQpLCB0aGlzLnJ1bGUpO1xuICAgICAgfSxcbiAgICAgIG9uRmFpbHVyZTogKGZhaWx1cmUpID0+IHtcbiAgICAgICAgY29uc3QgaW52b2NhdGlvbiA9XG4gICAgICAgICAgZmFpbHVyZS5lcnJvciAhPT0gbnVsbCAmJiAodHlwZW9mIGZhaWx1cmUuZXJyb3IgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBmYWlsdXJlLmVycm9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgPyB0aGlzLmludm9jYXRpb25GYWlsdXJlcy5nZXQoZmFpbHVyZS5lcnJvcilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBCZWZvcmUgYWRtaXNzaW9uIChlLmcuIGEgbWV0YS1jb3B5IHJlZnVzYWwpLCBubyBkaXNwYXRjaGVkIHNlcnZlZCBlbnRyeSBleGlzdHMuIENvdW50IHRoZSBsb3NzIGFuZFxuICAgICAgICAvLyBhcHBseSB0aGUgZmFpbHVyZSBtb2RlLCBidXQgbmV2ZXIgaGFuZCB0aGUgYWRhcHRlciBGb290dHJhY2UncyBvcmlnaW5hbCwgdW5zZXJ2ZWQgZW50cnkuXG4gICAgICAgIGlmIChpbnZvY2F0aW9uID09PSB1bmRlZmluZWQpIHRoaXMubG9zdChmYWlsdXJlLmVycm9yLCB1bmRlZmluZWQsIHRoaXMuZXJyb3JWaWV3KGZhaWx1cmUuZXJyb3IsIHRoaXMucnVsZSkpO1xuICAgICAgICBlbHNlIHRoaXMubG9zdChpbnZvY2F0aW9uLmNhdXNlLCBpbnZvY2F0aW9uLmVudHJ5LCBpbnZvY2F0aW9uLnZpZXcpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIENhcHR1cmUgdGhlIHNlcnZlZCBlbnRyeSBub3c7IGFuIGFzeW5jaHJvbm91cyBmYWlsdXJlIGtlZXBzIHRoaXMgbGVnJ3MgcnVsZSwgbm90IGEgbGF0ZXIgcmVzdW1lJ3MgcnVsZS4gKi9cbiAgcHJpdmF0ZSBpbnZva2UoZW50cnk6IFJlY29yZEVudHJ5LCBjYWxsOiAoKSA9PiB1bmtub3duLCBydWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkKTogdW5rbm93biB7XG4gICAgY29uc3QgZmFpbGVkID0gKGNhdXNlOiB1bmtub3duKTogbmV2ZXIgPT4ge1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSBuZXcgRXJyb3IoJ3JlY29yZCBzaW5rOiBhZGFwdGVyIGludm9jYXRpb24gZmFpbGVkJyk7XG4gICAgICB0aGlzLmludm9jYXRpb25GYWlsdXJlcy5zZXQoZW52ZWxvcGUsIHsgZW50cnksIGNhdXNlLCB2aWV3OiB0aGlzLmVycm9yVmlldyhjYXVzZSwgcnVsZSkgfSk7XG4gICAgICB0aHJvdyBlbnZlbG9wZTtcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXR1cm5lZCA9IGNhbGwoKTtcbiAgICAgIC8vIFZvaWQgYWRhcHRlcnMga2VlcCB0aGVpciBzeW5jaHJvbm91cyBwYXRoOyBvbmx5IGFuIG9iamVjdC9mdW5jdGlvbiBjYW4gYmUgYSB0aGVuYWJsZS4gc2V0dGxlT25jZVxuICAgICAgLy8gb2JzZXJ2ZXMgbmF0aXZlIHByb21pc2VzIHRocm91Z2ggUHJvbWlzZS5wcm90b3R5cGUudGhlbiBhbmQgZ3VhcmRzIGhvc3RpbGUgdGhlbmFibGVzIHRvby5cbiAgICAgIGlmIChyZXR1cm5lZCA9PT0gbnVsbCB8fCAodHlwZW9mIHJldHVybmVkICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgcmV0dXJuZWQgIT09ICdmdW5jdGlvbicpKSByZXR1cm4gcmV0dXJuZWQ7XG4gICAgICBpZiAoIXRoaXMucmVzb2x2ZWQuY2FwdHVyZSkgcmV0dXJuIHNldHRsZU9uY2UocmV0dXJuZWQsICgpID0+IHVuZGVmaW5lZCwgZmFpbGVkKTtcbiAgICAgIHRoaXMuY2FwdHVyZVBlbmRpbmcrKztcbiAgICAgIHJldHVybiBzZXR0bGVPbmNlKFxuICAgICAgICByZXR1cm5lZCxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2FwdHVyZVBlbmRpbmctLTtcbiAgICAgICAgfSxcbiAgICAgICAgKGNhdXNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5jYXB0dXJlUGVuZGluZy0tO1xuICAgICAgICAgIHJldHVybiBmYWlsZWQoY2F1c2UpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgcmV0dXJuIGZhaWxlZChjYXVzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgc2luayBlcnJvciBpcyB0aGUgZGlhZ25vc3RpYyBlcnJvcnMucmVjb3JkU2lua0Vycm9yOyByYXcgY2F1c2VzIGJlbG9uZyBvbmx5IHRvIHRoZSBjYWxsZXIncyBleGNlcHRpb24uICovXG4gIHByaXZhdGUgZXJyb3JWaWV3KGVycm9yOiB1bmtub3duLCBydWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkKTogU2lua0Vycm9yVmlldyB7XG4gICAgY29uc3QgdGV4dCA9IHRocm93blRleHQoZXJyb3IpO1xuICAgIGNvbnN0IHJldGFpbmVkID0gcnVsZVxuICAgICAgPyBydWxlLnJldGFpblN0YWdlRXJyb3IoZXJyb3IsIHRleHQsIHJ1bGUucmV0YWluRGlhZ25vc3RpYyhbJ2Vycm9ycycsICdyZWNvcmRTaW5rRXJyb3InXSwgdGV4dCkpXG4gICAgICA6IHsgbWVzc2FnZTogdGV4dCwgc3RydWN0dXJlZEVycm9yOiBleHRyYWN0RXJyb3JJbmZvKGVycm9yKSB9O1xuICAgIGNvbnN0IHNlcnZlZCA9IHsgLi4ucmV0YWluZWQuc3RydWN0dXJlZEVycm9yIH07XG4gICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZXJ2ZWQsICdyYXcnKTtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogcmV0YWluZWQubWVzc2FnZSxcbiAgICAgIGVycm9yOiBzZXJ2ZWQsXG4gICAgICBtYXNrZWQ6IHJldGFpbmVkLm1lc3NhZ2UgIT09IHRleHQgfHwgcmV0YWluZWQuc3RydWN0dXJlZEVycm9yLnJhdyAhPT0gZXJyb3IsXG4gICAgICBydWxlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSBzdGFydHMgYSBuZXcgbGVnIG9uIHRoZSBzYW1lIHJlY29yZDogdGhlIGNvdW50cyBnbyBvbiAob25lIGxvZywgb25lIHJlY29yZCksIGJ1dCB0aGVcbiAgICogZmFpbHVyZSBtb2RlIGlzIHRoZSBMRUcncyDigJQgYSBsb3NzIGluIGFuIGVhcmxpZXIgbGVnICh3aGljaCBhbHJlYWR5IGZhaWxlZCB0aGF0IGxlZykgZG9lcyBub3Qgc3RvcCB0aGlzIG9uZSDigJRcbiAgICogYW5kIHRoZSBkZXYtbW9kZSB3YXJuaW5nIG1heSBmaXJlIGFnYWluLlxuICAgKi9cbiAgYmVnaW5MZWcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzb2x2ZWQub25GYWlsdXJlID09PSAnZmFpbCcpIHRoaXMuc3RvcHBlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLmZhaWx1cmUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy53YXJuZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNhcHR1cmVTdGF0dXMgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVGhlIGxlZydzIHJlZGFjdGlvbiBydWxlIOKAlCBhIHJlc3VtZSBidWlsZHMgYSBuZXcgb25lOyB0aGUgbmV4dCBgb3BlbmVkYCAvIGBjbG9zZWRgIGlzIHNlcnZlZCB1bmRlciBpdC4gKi9cbiAgdXNlUnVsZShydWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5ydWxlID0gcnVsZTtcbiAgfVxuXG4gIC8qKiBBYm9ydHMgYXQgdGhlIGZpcnN0IGxvc3MgdW5kZXIgYG9uRmFpbHVyZTogJ2ZhaWwnYDsgYWJzZW50IG90aGVyd2lzZS4gKi9cbiAgZ2V0IHN0b3BTaWduYWwoKTogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0b3BwZXI/LnNpZ25hbDtcbiAgfVxuXG4gIGdldCBmbHVzaE1vZGUoKTogUmVjb3JkU2lua0ZsdXNoTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWQuZmx1c2g7XG4gIH1cblxuICAvKiogVGhlIGxvc3MgdGhhdCBmYWlscyB0aGUgcnVuIHVuZGVyIGAnZmFpbCdgOyBhYnNlbnQgd2hpbGUgbm90aGluZyB3YXMgbG9zdCAoYW5kIGFsd2F5cyB1bmRlciBgJ3JlcG9ydCdgKS4gKi9cbiAgZ2V0IGZhdGFsKCk6IFJlY29yZFNpbmtFcnJvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZTtcbiAgfVxuXG4gIHN0YXRzKCk6IFJlY29yZFNpbmtTdGF0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudHJpZXM6IHRoaXMuZW50cmllcyxcbiAgICAgIGZhaWxlZDogdGhpcy5mYWlsZWQsXG4gICAgICAuLi4odGhpcy5sYXN0RXJyb3IgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBsYXN0RXJyb3I6IHRoaXMubGFzdEVycm9yIH0pLFxuICAgICAgLi4uKHRoaXMuY2FwdHVyZVN0YXR1cyAmJiB7IGNhcHR1cmU6IHRoaXMuY2FwdHVyZVN0YXR1cyB9KSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0IGNhcHR1cmVPcHRpb25zKCk6IENhcHR1cmVIaXN0b3J5T3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWQuY2FwdHVyZTtcbiAgfVxuXG4gIGdldCBwZW5kaW5nQ2FwdHVyZURlbGl2ZXJpZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jYXB0dXJlUGVuZGluZztcbiAgfVxuXG4gIGNhcHR1cmVSZXN1bHQocmVzdWx0OiBDYXB0dXJlSGlzdG9yeVN0YXR1cyk6IHZvaWQge1xuICAgIHRoaXMuY2FwdHVyZVN0YXR1cyA9IE9iamVjdC5mcmVlemUocmVzdWx0KTtcbiAgfVxuXG4gIC8qKiBTYW1lIHNlcnZlZCBzZWVkIGFzIG9wZW5lZDsgYSBoaXN0b3J5IGRpZ2VzdCBuZXZlciBzZWVzIGEgc2VlZGVkIHBvbGljeSBzZWNyZXQuICovXG4gIGNhcHR1cmVJbml0aWFsU3RhdGUoc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLnJ1bGUgPyAodGhpcy5ydWxlLnJldGFpblN0YXRlKHN0YXRlLCBMT0dfUExBQ0VIT0xERVIpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA6IHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEF3YWl0IHRoZSBhZGFwdGVyJ3MgYGZsdXNoKClgLCBhdCBtb3N0IGB0aW1lb3V0TXNgIHdoZW4gZ2l2ZW4uIEEgZmx1c2ggdGhhdCB0aHJvd3Mgb3IgcmVqZWN0cyBpcyBhIGxvc3NcbiAgICogKGNvdW50ZWQsIGFuZCBmYXRhbCB1bmRlciBgJ2ZhaWwnYCk7IG9uZSBzdGlsbCBydW5uaW5nIGF0IHRoZSBkZWFkbGluZSBpcyBgcGVuZGluZ2AgYW5kIGtlZXBzIHJ1bm5pbmcg4oCUIGFuZCxcbiAgICogd2l0aCBgcGVuZGluZ0lzTG9zc2AgKHRoZSBydW4ncyBvd24gZmx1c2gpLCBjb3VudGVkIGFzIGEgbG9zcyB0b28sIHNvIGEgZmx1c2ggdGhhdCBuZXZlciBzZXR0bGVzIGNhbm5vdCBob2xkIGFcbiAgICogcnVuIG9wZW4sIGFuZCBjYW5ub3QgcGFzcyBmb3Igb25lIHRoYXQgbGFuZGVkLiBOb3RoaW5nIGhlcmUgdGhyb3dzOiBhIGhvc3RpbGUgYWRhcHRlciAoYSB0aHJvd2luZyBgZmx1c2hgXG4gICAqIGdldHRlciwgYSBwcm9taXNlIHdpdGggaXRzIG93biBgdGhlbmApIGlzIGEgbG9zcywgbmV2ZXIgdGhlIHJ1bidzIGVycm9yLlxuICAgKi9cbiAgYXN5bmMgZmx1c2godGltZW91dE1zPzogbnVtYmVyLCBwZW5kaW5nSXNMb3NzID0gZmFsc2UpOiBQcm9taXNlPFJlY29yZEZsdXNoUmVzdWx0PiB7XG4gICAgY29uc3QgYWRhcHRlciA9IHRoaXMucmVzb2x2ZWQuYWRhcHRlcjtcbiAgICBjb25zdCBydWxlID0gdGhpcy5ydWxlO1xuICAgIGxldCBzZXR0bGVkOiBQcm9taXNlPFJlY29yZEZsdXNoUmVzdWx0PjtcbiAgICBsZXQgZ2l2ZW5VcCA9IGZhbHNlOyAvLyBhIGZsdXNoIGFscmVhZHkgY291bnRlZCBhcyBhIGxvc3MgYXQgdGhlIGRlYWRsaW5lIGlzIG5vdCBjb3VudGVkIGFnYWluIHdoZW4gaXQgcmVqZWN0c1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmbHVzaDogdW5rbm93biA9IGFkYXB0ZXIuZmx1c2g7IC8vIHJlYWQgb25jZTogYSBnZXR0ZXIgcnVucyBvbmNlLCBpbnNpZGUgdGhlIGd1YXJkXG4gICAgICBpZiAodHlwZW9mIGZsdXNoICE9PSAnZnVuY3Rpb24nKSByZXR1cm4geyBkb25lOiB0cnVlLCBmYWlsZWQ6IGZhbHNlLCBwZW5kaW5nOiBmYWxzZSB9O1xuICAgICAgc2V0dGxlZCA9IHNldHRsZU9uY2UoXG4gICAgICAgIGZsdXNoLmNhbGwoYWRhcHRlciksXG4gICAgICAgICgpOiBSZWNvcmRGbHVzaFJlc3VsdCA9PiAoeyBkb25lOiB0cnVlLCBmYWlsZWQ6IGZhbHNlLCBwZW5kaW5nOiBmYWxzZSB9KSxcbiAgICAgICAgKGVycm9yKTogUmVjb3JkRmx1c2hSZXN1bHQgPT4ge1xuICAgICAgICAgIGlmICghZ2l2ZW5VcCkgdGhpcy5sb3N0KGVycm9yLCB1bmRlZmluZWQsIHRoaXMuZXJyb3JWaWV3KGVycm9yLCBydWxlKSk7XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIGZhaWxlZDogdHJ1ZSwgcGVuZGluZzogZmFsc2UgfTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9zdChlcnJvciwgdW5kZWZpbmVkLCB0aGlzLmVycm9yVmlldyhlcnJvciwgcnVsZSkpO1xuICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIGZhaWxlZDogdHJ1ZSwgcGVuZGluZzogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUodGltZW91dE1zKSkgcmV0dXJuIHNldHRsZWQ7XG4gICAgbGV0IHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwZW5kaW5nID0gbmV3IFByb21pc2U8UmVjb3JkRmx1c2hSZXN1bHQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCBmYWlsZWQ6IGZhbHNlLCBwZW5kaW5nOiB0cnVlIH0pLCBNYXRoLm1heCgwLCB0aW1lb3V0TXMpKTtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtzZXR0bGVkLCBwZW5kaW5nXSk7XG4gICAgICBpZiAocmVzdWx0LnBlbmRpbmcgJiYgcGVuZGluZ0lzTG9zcykge1xuICAgICAgICBnaXZlblVwID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYHJlY29yZCBzaW5rOiBmbHVzaCgpIGRpZCBub3Qgc2V0dGxlIHdpdGhpbiAke01hdGgubWF4KDAsIHRpbWVvdXRNcyl9bXNgKTtcbiAgICAgICAgdGhpcy5sb3N0KGVycm9yLCB1bmRlZmluZWQsIHRoaXMuZXJyb3JWaWV3KGVycm9yLCBydWxlKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgbWV0YSBhcyBzZXJ2ZWQ6IGEgYm91bmRhcnkgcmVjb3JkLCBzY3J1YmJlZCBieSBrZXkgbmFtZSBhdCBldmVyeSBkZXB0aCAoYW4gaW5lcnQgcnVsZSBjb3BpZXMgbm90aGluZykuICovXG4gIHNlcnZlKG1ldGE6IE1ldGEpOiBNZXRhIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlID8gdGhpcy5ydWxlLnJldGFpbkJvdW5kYXJ5KG1ldGEsIExPR19QTEFDRUhPTERFUikgOiBtZXRhO1xuICB9XG5cbiAgLyoqIE9uZSBsb3NzOiBjb3VudGVkLCB3YXJuZWQgb25jZSBwZXIgcnVuLCB0b2xkIHdpdGggYSBzYWZlIGRpc3BhdGNoZWQgZW50cnkgd2hlbiBhdmFpbGFibGUsIGZhdGFsIHVuZGVyICdmYWlsJy4gKi9cbiAgcHJpdmF0ZSBsb3N0KGVycm9yOiB1bmtub3duLCBlbnRyeTogUmVjb3JkRW50cnkgfCB1bmRlZmluZWQsIHZpZXc6IFNpbmtFcnJvclZpZXcpOiB2b2lkIHtcbiAgICB0aGlzLmZhaWxlZCArPSAxO1xuICAgIGNvbnN0IHRleHQgPSB2aWV3LnRleHQ7XG4gICAgdGhpcy5sYXN0RXJyb3IgPSB0ZXh0O1xuICAgIGlmIChpc0Rldk1vZGUoKSAmJiAhdGhpcy53YXJuZWQpIHtcbiAgICAgIHRoaXMud2FybmVkID0gdHJ1ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50XSByZWNvcmQgc2luazogYW4gZW50cnkgd2FzIG5vdCBzdG9yZWQgKCR7dGV4dH0pLiBUaGUgcnVuIGdvZXMgb247IGAgK1xuICAgICAgICAgICdnZXRTbmFwc2hvdCgpLnNpbmsgY291bnRzIGV2ZXJ5IGxvc3MuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFRoZSBmYWlsdXJlIG1vZGUgZmlyc3Q6IG5vdGhpbmcgdGhlIGFkYXB0ZXIncyBvd24gbGlzdGVuZXIgZG9lcyBjYW4gc2tpcCBpdC5cbiAgICBpZiAodGhpcy5zdG9wcGVyICE9PSB1bmRlZmluZWQgJiYgdGhpcy5mYWlsdXJlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZmFpbHVyZSA9IG5ldyBSZWNvcmRTaW5rRXJyb3IoYHJlY29yZCBzaW5rOiBhbiBlbnRyeSB3YXMgbm90IHN0b3JlZCDigJQgJHt0ZXh0fWAsIGVycm9yKTtcbiAgICAgIGlmICh2aWV3Lm1hc2tlZCkge1xuICAgICAgICAvLyBUaGUgY2FsbGVyIGtlZXBzIHRoZSByZWFsIGNhdXNlLCBidXQgb2JzZXJ2ZXJzIG9mIHRoaXMgbmV3IHdyYXBwZXIgbXVzdCBpbmhlcml0IGl0cyByZW1lbWJlcmVkIG1hc2suXG4gICAgICAgIHZpZXcucnVsZT8ucmV0YWluU3RhZ2VFcnJvcih0aGlzLmZhaWx1cmUsIHRoaXMuZmFpbHVyZS5tZXNzYWdlLCBTQ09QRV9QTEFDRUhPTERFUik7XG4gICAgICAgIGlmICh0aGlzLnJ1bGUgIT09IHZpZXcucnVsZSkgdGhpcy5ydWxlPy5yZXRhaW5TdGFnZUVycm9yKHRoaXMuZmFpbHVyZSwgdGhpcy5mYWlsdXJlLm1lc3NhZ2UsIFNDT1BFX1BMQUNFSE9MREVSKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RvcHBlci5hYm9ydCh0aGlzLmZhaWx1cmUpO1xuICAgIH1cbiAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkgdGVsbEFkYXB0ZXIodGhpcy5yZXNvbHZlZC5hZGFwdGVyLCB7IGVudHJ5LCBlcnJvcjogdmlldy5lcnJvciB9KTtcbiAgfVxufVxuXG4vKiogVGhlIGFkYXB0ZXIncyBvd24gYG9uRmFpbHVyZWAsIGlzb2xhdGVkOiBhIHRocm93aW5nIGdldHRlciwgYSB0aHJvdyBvciBhIHJlamVjdGlvbiB0aGVyZSBjaGFuZ2VzIG5vdGhpbmcuICovXG5mdW5jdGlvbiB0ZWxsQWRhcHRlcihhZGFwdGVyOiBSZWNvcmRTaW5rLCBmYWlsdXJlOiB7IHJlYWRvbmx5IGVudHJ5OiBSZWNvcmRFbnRyeTsgcmVhZG9ubHkgZXJyb3I6IHVua25vd24gfSk6IHZvaWQge1xuICB0cnkge1xuICAgIGNvbnN0IGxpc3RlbmVyOiB1bmtub3duID0gYWRhcHRlci5vbkZhaWx1cmU7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuICAgIHNldHRsZU9uY2UoXG4gICAgICBsaXN0ZW5lci5jYWxsKGFkYXB0ZXIsIGZhaWx1cmUpLFxuICAgICAgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgKCkgPT4gdW5kZWZpbmVkLFxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEEgbGlzdGVuZXIgdGhhdCBmYWlscyBpcyB0aGUgYWRhcHRlcidzIG93biBidXNpbmVzczogdGhlIGxvc3MgaXMgYWxyZWFkeSBjb3VudGVkLlxuICB9XG59XG4iXX0=
|
|
336
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkU2luay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL3JlY29yZFNpbmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFJSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQXlDMUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGVBQWdCLFNBQVEsS0FBSztJQUVGO0lBRHBCLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUMzQyxZQUFZLE9BQWUsRUFBVyxLQUFjO1FBQ2xELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQURxQixVQUFLLEdBQUwsS0FBSyxDQUFTO0lBRXBELENBQUM7Q0FDRjtBQVVELE1BQU0sT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFlaEUsU0FBUyxTQUFTLENBQUMsS0FBYztJQUMvQixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBUSxLQUFpQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxDQUFDO0FBQzNGLENBQUM7QUFFRDs7O0dBR0c7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RSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2xILENBQUM7WUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLENBQUM7Q0FDRjtBQUVELGdIQUFnSDtBQUNoSCxTQUFTLFdBQVcsQ0FBQyxPQUFtQixFQUFFLE9BQWlFO0lBQ3pHLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFZLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDNUMsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVO1lBQUUsT0FBTztRQUMzQyxVQUFVLENBQ1IsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQy9CLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFDZixHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQ2hCLENBQUM7SUFDSixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1Asb0ZBQW9GO0lBQ3RGLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBydW5uZXIvcmVjb3JkU2luay50cyDigJQgdGhlIHJ1bidzIHNpZGUgb2YgdGhlIGNyYXNoLXNhZmUgcmVjb3JkIChkZXNpZ24gwqczLjUsIHBhY2tldCBQNikuXG4gKlxuICogZm9vdHRyYWNlIG93bnMgdGhlIHBvcnQgKGBSZWNvcmRTaW5rYCwgYGZvb3R0cmFjZS93cml0ZWApOiBhIGxvZyBidWlsdCB3aXRoIGEgc2luayBoYW5kcyBpdCBldmVyeSBlbnRyeSBBUyBJVFxuICogTEFORFMg4oCUIGBvcGVuZWRgLCBgY29tbWl0YCwgYG5vdGVgLCBgY2xvc2VkYCDigJQgYW5kIGNvdW50cyB3aGF0IHRoZSBzaW5rIGRpZCBub3QgdGFrZS4gVGhpcyBmaWxlIGlzIHdoYXQgdGhlXG4gKiBFWEVDVVRPUiBhZGRzIGFyb3VuZCBhbiBhcHAncyBhZGFwdGVyLCBvbmUge0BsaW5rIFJ1blJlY29yZH0gcGVyIHJ1bjpcbiAqXG4gKiAgIC0gVEhFIE9ORSBMQVcsIGJlZm9yZSBhbnkgYnl0ZSBsZWF2ZXM6IHRoZSBgb3BlbmVkYCBiYXNlIGlzIHRoZSBydW4ncyBzZXJ2ZWQgZm9ybSBvZiBpdCAodGhlIHJlZGFjdGlvbiBydWxlJ3NcbiAqICAgICBgcmV0YWluU3RhdGVgLCB0aGUgbWlycm9yJ3Mgc2VlZCDigJQgc28gYSBwb2xpY3kga2V5IHNlZWRlZCBieSBgaW5pdGlhbENvbnRleHRgIG9yIGEgY2hlY2twb2ludCBuZXZlciByZWFjaGVzXG4gKiAgICAgdGhlIHNpbmspLCBhbmQgdGhlIGBvcGVuZWRgIC8gYGNsb3NlZGAgbWV0YSBhcmUgYm91bmRhcnkgcmVjb3JkcyAoYHJldGFpbkJvdW5kYXJ5YCkuIEEgY29tbWl0IGlzIHRoZSBsb2cncyBvd25cbiAqICAgICBidW5kbGUsIGFscmVhZHkgc2NydWJiZWQgYXQgY29tbWl0OyBhbiBhdHRlbXB0IG5vdGUgY2FycmllcyB0aGUgc2VydmVkIGBBdHRlbXB0UmVjb3JkYCAobm8gYHJhd2ApLlxuICogICAtIEFDQ09VTlRJTkc6IGV2ZXJ5IGVudHJ5IGhhbmRlZCB0byB0aGUgYWRhcHRlciBpcyBjb3VudGVkLCBldmVyeSBsb3NzIHRvbyAoYGdldFNuYXBzaG90KCkuc2lua2ApLCB3aXRoIGFcbiAqICAgICBkZXYtbW9kZSB3YXJuaW5nIG9uIHRoZSBmaXJzdCBsb3NzIG9mIGEgcnVuLiBUaGUgYWRhcHRlcidzIG93biBgb25GYWlsdXJlYCBoZWFycyBhIGRpc3BhdGNoZWQgZW50cnkncyBsb3NzXG4gKiAgICAgd2l0aCB0aGF0IHNhbWUgc2VydmVkIGVudHJ5IGFuZCBhIHNlcnZlZCBlcnJvciwgaXNvbGF0ZWQuIEEgcmVmdXNhbCBiZWZvcmUgZGlzcGF0Y2ggaXMgY291bnRlZCB3aXRob3V0XG4gKiAgICAgZm9yd2FyZGluZyBGb290dHJhY2UncyB1bnNlcnZlZCBlbnRyeS5cbiAqICAgLSBUSEUgRkFJTFVSRSBNT0RFIChvd25lciBydWxpbmcgUTMpOiBgJ3JlcG9ydCdgIChkZWZhdWx0KSDigJQgdGhlIHJ1biBnb2VzIG9uOyBgJ2ZhaWwnYCDigJQgdGhlIGZpcnN0IGxvc3QgZW50cnlcbiAqICAgICBhYm9ydHMgdGhlIHJ1bidzIHNpZ25hbCB3aXRoIGEge0BsaW5rIFJlY29yZFNpbmtFcnJvcn0sIGFuZCBhIHJ1biB0aGF0IGZpbmlzaGVkIHdpdGggYSBsb3NzIHJlamVjdHMgd2l0aCBpdC5cbiAqICAgLSBGTFVTSDogYCdhdXRvJ2AgKGRlZmF1bHQpIOKAlCBgcnVuKClgIC8gYHJlc3VtZSgpYCBhd2FpdCB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCBhZnRlciB0aGUgY2xvc2luZyBlbnRyeTtcbiAqICAgICBgJ21hbnVhbCdgIOKAlCB0aGUgYXBwIGNhbGxzIGBleGVjdXRvci5mbHVzaFJlY29yZCgpYC5cbiAqXG4gKiBFdmVyeSBhZGFwdGVyIG1ldGhvZCBpcyBjYWxsZWQgc3luY2hyb25vdXNseSBmcm9tIHRoZSBsb2c7IHdoYXRldmVyIHRoZSBhZGFwdGVyIHRocm93cyBvciByZWplY3RzIHdpdGggaXMgdGhlXG4gKiBsb2cncyB0byBjb3VudCAoYEV2ZW50TG9nIMK3IHNpbmtGYWlsdXJlc2ApLCBuZXZlciB0aGUgcnVuJ3Mg4oCUIHNvIG5vdGhpbmcgaGVyZSB0aHJvd3MgdG8gdGhlIGVuZ2luZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1ldGEgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWNvcmRFbnRyeSwgUmVjb3JkU2luayB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IENhcHR1cmVIaXN0b3J5T3B0aW9ucywgQ2FwdHVyZUhpc3RvcnlTdGF0dXMgfSBmcm9tICcuLi9jYXB0dXJlL2hpc3RvcnlUeXBlcy5qcyc7XG5pbXBvcnQgeyBzZXR0bGVPbmNlIH0gZnJvbSAnLi4vY2FwdHVyZS9zaW5rU2V0dGxlbWVudC5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8sIHRocm93blRleHQgfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHsgU0NPUEVfUExBQ0VIT0xERVIgfSBmcm9tICcuLi9tZW1vcnkvcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IHNldExvbmdUaW1lb3V0IH0gZnJvbSAnLi4vdGltZXJzL2xvbmdUaW1lb3V0LmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkU2lua1N0YXRzIH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lLmpzJztcblxuLyoqIFdoYXQgYSBsb3N0IGVudHJ5IGRvZXMgdG8gdGhlIHJ1bjogYCdyZXBvcnQnYCBjb3VudHMgaXQgYW5kIGdvZXMgb247IGAnZmFpbCdgIGZhaWxzIHRoZSBydW4uICovXG5leHBvcnQgdHlwZSBSZWNvcmRTaW5rRmFpbHVyZU1vZGUgPSAncmVwb3J0JyB8ICdmYWlsJztcblxuLyoqIFdoZW4gdGhlIGFkYXB0ZXIncyBgZmx1c2goKWAgcnVuczogYWZ0ZXIgZWFjaCBydW4ncyBjbG9zaW5nIGVudHJ5IChgJ2F1dG8nYCksIG9yIHdoZW4gdGhlIGFwcCBhc2tzLiAqL1xuZXhwb3J0IHR5cGUgUmVjb3JkU2lua0ZsdXNoTW9kZSA9ICdhdXRvJyB8ICdtYW51YWwnO1xuXG4vKipcbiAqIFRoZSBleGVjdXRvcidzIGBzaW5rYCBvcHRpb24gaW4gaXRzIGxvbmcgZm9ybS4gVGhlIHNob3J0IGZvcm0gaXMgdGhlIGFkYXB0ZXIgaXRzZWxmLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2luazogeyBhZGFwdGVyOiBmaWxlU2luaygnL3Zhci9mb290cHJpbnQvcnVuLmpzb25sJyksIG9uRmFpbHVyZTogJ2ZhaWwnIH0gfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRTaW5rT3B0aW9ucyB7XG4gIC8qKiBXaGVyZSB0aGUgZW50cmllcyBnbyDigJQgYGZpbGVTaW5rKHBhdGgpYCAoYGZvb3RwcmludGpzL3NpbmtzYCksIGBtZW1vcnlTaW5rKClgIChgZm9vdHRyYWNlL3dyaXRlYCksIG9yIHlvdXJzLiAqL1xuICByZWFkb25seSBhZGFwdGVyOiBSZWNvcmRTaW5rO1xuICAvKiogYCdyZXBvcnQnYCAoZGVmYXVsdCk6IGEgbG9zdCBlbnRyeSBpcyBjb3VudGVkIGFuZCB0aGUgcnVuIGdvZXMgb24uIGAnZmFpbCdgOiB0aGUgZmlyc3Qgb25lIGZhaWxzIHRoZSBydW4uICovXG4gIHJlYWRvbmx5IG9uRmFpbHVyZT86IFJlY29yZFNpbmtGYWlsdXJlTW9kZTtcbiAgLyoqIGAnYXV0bydgIChkZWZhdWx0KTogYHJ1bigpYCBhd2FpdHMgdGhlIGFkYXB0ZXIncyBgZmx1c2goKWAgYWZ0ZXIgdGhlIGNsb3NpbmcgZW50cnkuIGAnbWFudWFsJ2A6IGBmbHVzaFJlY29yZCgpYC4gKi9cbiAgcmVhZG9ubHkgZmx1c2g/OiBSZWNvcmRTaW5rRmx1c2hNb2RlO1xuICAvKiogT3B0LWluIGNhcHR1cmUgZXZpZGVuY2UgYW5kIGV4cGxpY2l0IGhvc3QgYWNrbm93bGVkZ2VtZW50OyBvcmRpbmFyeSBmbHVzaCBuZXZlciBpbXBsaWVzIGR1cmFiaWxpdHkuICovXG4gIHJlYWRvbmx5IGNhcHR1cmU/OiBDYXB0dXJlSGlzdG9yeU9wdGlvbnM7XG59XG5cbi8qKiBUaGUgZXhlY3V0b3IncyBgc2lua2Agb3B0aW9uOiBhbiBhZGFwdGVyLCBvciB7QGxpbmsgUmVjb3JkU2lua09wdGlvbnN9LiAqL1xuZXhwb3J0IHR5cGUgUmVjb3JkU2lua09wdGlvbiA9IFJlY29yZFNpbmsgfCBSZWNvcmRTaW5rT3B0aW9ucztcblxuLyoqIFdoYXQgYGV4ZWN1dG9yLmZsdXNoUmVjb3JkKClgIHJlc29sdmVzIHdpdGgg4oCUIHRoZSBgZHJhaW5PYnNlcnZlcnNgIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRGbHVzaFJlc3VsdCB7XG4gIC8qKiBUaGUgYWRhcHRlcidzIGZsdXNoIGZpbmlzaGVkIChvciB0aGVyZSB3YXMgbm90aGluZyB0byBmbHVzaCkuICovXG4gIHJlYWRvbmx5IGRvbmU6IGJvb2xlYW47XG4gIC8qKiBUaGUgYWRhcHRlcidzIGZsdXNoIHRocmV3IG9yIHJlamVjdGVkIOKAlCBjb3VudGVkIG9uIGBnZXRTbmFwc2hvdCgpLnNpbmtgLiAqL1xuICByZWFkb25seSBmYWlsZWQ6IGJvb2xlYW47XG4gIC8qKiBUaGUgZmx1c2ggaGFkIG5vdCBzZXR0bGVkIHdoZW4gYHRpbWVvdXRNc2AgcmFuIG91dC4gKi9cbiAgcmVhZG9ubHkgcGVuZGluZzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIHJ1biB3aXRoIGBzaW5rOiB7IG9uRmFpbHVyZTogJ2ZhaWwnIH1gIGxvc3QgYW4gZW50cnk6IHRoZSByZWNvcmQgdGhlIGFwcCBhc2tlZCB0byBiZSBrZXB0IGlzIG5vdCB3aG9sZS5cbiAqIGBjYXVzZWAgaXMgdGhlIGFkYXB0ZXIncyBvd24gZXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWNvcmRTaW5rRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IG5hbWUgPSAnUmVjb3JkU2lua0Vycm9yJztcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCByZWFkb25seSBjYXVzZTogdW5rbm93bikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKiBUaGUgb3B0aW9uIHJlc29sdmVkIG9uY2UsIGF0IGNvbnN0cnVjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRSZWNvcmRTaW5rIHtcbiAgcmVhZG9ubHkgYWRhcHRlcjogUmVjb3JkU2luaztcbiAgcmVhZG9ubHkgb25GYWlsdXJlOiBSZWNvcmRTaW5rRmFpbHVyZU1vZGU7XG4gIHJlYWRvbmx5IGZsdXNoOiBSZWNvcmRTaW5rRmx1c2hNb2RlO1xuICByZWFkb25seSBjYXB0dXJlPzogQ2FwdHVyZUhpc3RvcnlPcHRpb25zO1xufVxuXG5jb25zdCBNRVRIT0RTID0gWydvcGVuZWQnLCAnY29tbWl0JywgJ25vdGUnLCAnY2xvc2VkJ10gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBTaW5rRXJyb3JWaWV3IHtcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xuICByZWFkb25seSBlcnJvcjogdW5rbm93bjtcbiAgcmVhZG9ubHkgbWFza2VkOiBib29sZWFuO1xuICByZWFkb25seSBydWxlPzogUmVkYWN0aW9uUnVsZTtcbn1cblxuaW50ZXJmYWNlIEludm9jYXRpb25GYWlsdXJlIHtcbiAgcmVhZG9ubHkgZW50cnk6IFJlY29yZEVudHJ5O1xuICByZWFkb25seSBjYXVzZTogdW5rbm93bjtcbiAgcmVhZG9ubHkgdmlldzogU2lua0Vycm9yVmlldztcbn1cblxuZnVuY3Rpb24gaXNBZGFwdGVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkU2luayB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBNRVRIT0RTLmV2ZXJ5KChtKSA9PiB0eXBlb2YgKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVttXSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZXhlY3V0b3IncyBgc2lua2Agb3B0aW9uLCBvciByZWZ1c2UgaXQgd2l0aCBhIGBUeXBlRXJyb3JgIG5hbWluZyB3aGF0IGlzIHdyb25nIOKAlCBhIHdpcmluZyBtaXN0YWtlXG4gKiB0aGUgYXBwIG1ha2VzIG9uY2UsIHNvIGl0IGZhaWxzIGF0IGNvbnN0cnVjdGlvbiwgbmV2ZXIgbWlkLXJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWNvcmRTaW5rKG9wdGlvbjogdW5rbm93bik6IFJlc29sdmVkUmVjb3JkU2luayB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGlzQWRhcHRlcihvcHRpb24pKSByZXR1cm4geyBhZGFwdGVyOiBvcHRpb24sIG9uRmFpbHVyZTogJ3JlcG9ydCcsIGZsdXNoOiAnYXV0bycgfTtcbiAgaWYgKG9wdGlvbiAhPT0gbnVsbCAmJiB0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0JyAmJiBPYmplY3QuaGFzT3duKG9wdGlvbiwgJ2FkYXB0ZXInKSkge1xuICAgIGNvbnN0IHsgYWRhcHRlciwgb25GYWlsdXJlID0gJ3JlcG9ydCcsIGZsdXNoID0gJ2F1dG8nLCBjYXB0dXJlIH0gPSBvcHRpb24gYXMgUGFydGlhbDxSZWNvcmRTaW5rT3B0aW9ucz47XG4gICAgaWYgKCFpc0FkYXB0ZXIoYWRhcHRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Zsb3dDaGFydEV4ZWN1dG9yOiBzaW5rLmFkYXB0ZXIgbXVzdCBiZSBhIFJlY29yZFNpbmsgKG9wZW5lZCwgY29tbWl0LCBub3RlLCBjbG9zZWQpJyk7XG4gICAgfVxuICAgIGlmIChvbkZhaWx1cmUgIT09ICdyZXBvcnQnICYmIG9uRmFpbHVyZSAhPT0gJ2ZhaWwnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmxvd0NoYXJ0RXhlY3V0b3I6IHNpbmsub25GYWlsdXJlIG11c3QgYmUgJ3JlcG9ydCcgb3IgJ2ZhaWwnXCIpO1xuICAgIH1cbiAgICBpZiAoZmx1c2ggIT09ICdhdXRvJyAmJiBmbHVzaCAhPT0gJ21hbnVhbCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGbG93Q2hhcnRFeGVjdXRvcjogc2luay5mbHVzaCBtdXN0IGJlICdhdXRvJyBvciAnbWFudWFsJ1wiKTtcbiAgICB9XG4gICAgaWYgKGNhcHR1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFjYXB0dXJlIHx8IHR5cGVvZiBjYXB0dXJlLmFja25vd2xlZGdlICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaW5rLmNhcHR1cmUgcmVxdWlyZXMgYWNrbm93bGVkZ2UnKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgbWF4XSBvZiBbXG4gICAgICAgIFsnbWF4Qnl0ZXMnLCA4ICogMTAyNCAqIDEwMjRdLFxuICAgICAgICBbJ3RpbWVvdXRNcycsIDMwXzAwMF0sXG4gICAgICBdIGFzIGNvbnN0KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY2FwdHVyZVtrZXldO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8IDEgfHwgdmFsdWUgPiBtYXgpKVxuICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBzaW5rLmNhcHR1cmUuJHtrZXl9IG11c3QgYmUgYSBwb3NpdGl2ZSB3aG9sZSBudW1iZXIgYXQgbW9zdCAke21heH1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZml4ZWRDYXB0dXJlID1cbiAgICAgIGNhcHR1cmUgJiZcbiAgICAgIE9iamVjdC5mcmVlemUoe1xuICAgICAgICBhY2tub3dsZWRnZTogY2FwdHVyZS5hY2tub3dsZWRnZS5iaW5kKGNhcHR1cmUpLFxuICAgICAgICAuLi4oY2FwdHVyZS5tYXhCeXRlcyAhPT0gdW5kZWZpbmVkICYmIHsgbWF4Qnl0ZXM6IGNhcHR1cmUubWF4Qnl0ZXMgfSksXG4gICAgICAgIC4uLihjYXB0dXJlLnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dE1zOiBjYXB0dXJlLnRpbWVvdXRNcyB9KSxcbiAgICAgIH0pO1xuICAgIHJldHVybiB7IGFkYXB0ZXIsIG9uRmFpbHVyZSwgZmx1c2gsIC4uLihmaXhlZENhcHR1cmUgJiYgeyBjYXB0dXJlOiBmaXhlZENhcHR1cmUgfSkgfTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICdGbG93Q2hhcnRFeGVjdXRvcjogc2luayBtdXN0IGJlIGEgUmVjb3JkU2luayAob3BlbmVkLCBjb21taXQsIG5vdGUsIGNsb3NlZCkgb3IgeyBhZGFwdGVyLCBvbkZhaWx1cmU/LCBmbHVzaD8gfScsXG4gICk7XG59XG5cbi8qKlxuICogT25lIHJ1bidzIHJlY29yZCBzaW5rOiB0aGUgc2luayBldmVyeSBsb2cgb2YgdGhlIHJ1biB3cml0ZXMgdG8gKHJvb3QgYW5kIG1vdW50cyksIGl0cyBhY2NvdW50aW5nIGFuZCBpdHNcbiAqIGZhaWx1cmUgbW9kZS4gQSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSBrZWVwcyBpdCAodGhlIHJvb3QgbG9nIGdvZXMgb24pOyBhIGZyZXNoIHJ1biBtYWtlcyBhIG5ldyBvbmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW5SZWNvcmQge1xuICAvKiogSGFuZCB0aGlzIHRvIGV2ZXJ5IGBFdmVudExvZ2Agb2YgdGhlIHJ1bi4gKi9cbiAgcmVhZG9ubHkgc2luazogUmVjb3JkU2luaztcbiAgcHJpdmF0ZSBlbnRyaWVzID0gMDtcbiAgcHJpdmF0ZSBmYWlsZWQgPSAwO1xuICBwcml2YXRlIGxhc3RFcnJvcj86IHN0cmluZztcbiAgcHJpdmF0ZSB3YXJuZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBydWxlPzogUmVkYWN0aW9uUnVsZTtcbiAgLyoqIEFib3J0ZWQgYXQgdGhlIGZpcnN0IGxvc3MgdW5kZXIgYCdmYWlsJ2Ag4oCUIGNvbXBvc2VkIGludG8gdGhlIGxlZydzIHNpZ25hbDsgZnJlc2ggcGVyIGxlZyAoe0BsaW5rIGJlZ2luTGVnfSkuICovXG4gIHByaXZhdGUgc3RvcHBlcj86IEFib3J0Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSBmYWlsdXJlPzogUmVjb3JkU2lua0Vycm9yO1xuICBwcml2YXRlIGNhcHR1cmVQZW5kaW5nID0gMDtcbiAgcHJpdmF0ZSBjYXB0dXJlU3RhdHVzPzogQ2FwdHVyZUhpc3RvcnlTdGF0dXM7XG4gIC8qKiBPcGFxdWUgZXJyb3IgaWRlbnRpdGllcyBvbmx5OiBubyByYXcgZW50cnkgb3IgYWRhcHRlciBlcnJvciBpcyBlbnVtZXJhYmxlIG9uIHRoZSB0cmFuc3BvcnQgZXJyb3IuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW52b2NhdGlvbkZhaWx1cmVzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBJbnZvY2F0aW9uRmFpbHVyZT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkOiBSZXNvbHZlZFJlY29yZFNpbmspIHtcbiAgICBpZiAocmVzb2x2ZWQub25GYWlsdXJlID09PSAnZmFpbCcpIHRoaXMuc3RvcHBlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBhZGFwdGVyID0gcmVzb2x2ZWQuYWRhcHRlcjtcbiAgICBjb25zdCBoYW5kZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLmVudHJpZXMgKz0gMTtcbiAgICB9O1xuICAgIHRoaXMuc2luayA9IHtcbiAgICAgIG9wZW5lZDogKGVudHJ5KSA9PiB7XG4gICAgICAgIGhhbmRlZCgpO1xuICAgICAgICBjb25zdCBydWxlID0gdGhpcy5ydWxlO1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPSB7XG4gICAgICAgICAgLi4uZW50cnksXG4gICAgICAgICAgaW5pdGlhbFN0YXRlOiBydWxlID8gcnVsZS5yZXRhaW5TdGF0ZShlbnRyeS5pbml0aWFsU3RhdGUsIExPR19QTEFDRUhPTERFUikgOiBlbnRyeS5pbml0aWFsU3RhdGUsXG4gICAgICAgICAgLi4uKGVudHJ5Lm1ldGEgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBtZXRhOiB0aGlzLnNlcnZlKGVudHJ5Lm1ldGEpIH0pLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2UoeyAuLi5zZXJ2ZWQsIGtpbmQ6ICdvcGVuZWQnIH0sICgpID0+IGFkYXB0ZXIub3BlbmVkKHNlcnZlZCksIHJ1bGUpO1xuICAgICAgfSxcbiAgICAgIGNvbW1pdDogKGVudHJ5KSA9PiB7XG4gICAgICAgIGhhbmRlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2UoeyAuLi5lbnRyeSwga2luZDogJ2NvbW1pdCcgfSwgKCkgPT4gYWRhcHRlci5jb21taXQoZW50cnkpLCB0aGlzLnJ1bGUpO1xuICAgICAgfSxcbiAgICAgIG5vdGU6IChlbnRyeSkgPT4ge1xuICAgICAgICBoYW5kZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW52b2tlKFxuICAgICAgICAgIHsgYWRkcmVzczogZW50cnkuYWRkcmVzcywgYXQ6IGVudHJ5LmF0LCBraW5kOiAnbm90ZScsIG5vdGU6IGVudHJ5LmtpbmQsIGRhdGE6IGVudHJ5LmRhdGEgfSxcbiAgICAgICAgICAoKSA9PiBhZGFwdGVyLm5vdGUoZW50cnkpLFxuICAgICAgICAgIHRoaXMucnVsZSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBjbG9zZWQ6IChlbnRyeSkgPT4ge1xuICAgICAgICBoYW5kZWQoKTtcbiAgICAgICAgY29uc3Qgc2VydmVkID0geyAuLi5lbnRyeSwgLi4uKGVudHJ5Lm1ldGEgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBtZXRhOiB0aGlzLnNlcnZlKGVudHJ5Lm1ldGEpIH0pIH07XG4gICAgICAgIHJldHVybiB0aGlzLmludm9rZSh7IC4uLnNlcnZlZCwga2luZDogJ2Nsb3NlZCcgfSwgKCkgPT4gYWRhcHRlci5jbG9zZWQoc2VydmVkKSwgdGhpcy5ydWxlKTtcbiAgICAgIH0sXG4gICAgICBvbkZhaWx1cmU6IChmYWlsdXJlKSA9PiB7XG4gICAgICAgIGNvbnN0IGludm9jYXRpb24gPVxuICAgICAgICAgIGZhaWx1cmUuZXJyb3IgIT09IG51bGwgJiYgKHR5cGVvZiBmYWlsdXJlLmVycm9yID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgZmFpbHVyZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgID8gdGhpcy5pbnZvY2F0aW9uRmFpbHVyZXMuZ2V0KGZhaWx1cmUuZXJyb3IpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gQmVmb3JlIGFkbWlzc2lvbiAoZS5nLiBhIG1ldGEtY29weSByZWZ1c2FsKSwgbm8gZGlzcGF0Y2hlZCBzZXJ2ZWQgZW50cnkgZXhpc3RzLiBDb3VudCB0aGUgbG9zcyBhbmRcbiAgICAgICAgLy8gYXBwbHkgdGhlIGZhaWx1cmUgbW9kZSwgYnV0IG5ldmVyIGhhbmQgdGhlIGFkYXB0ZXIgRm9vdHRyYWNlJ3Mgb3JpZ2luYWwsIHVuc2VydmVkIGVudHJ5LlxuICAgICAgICBpZiAoaW52b2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLmxvc3QoZmFpbHVyZS5lcnJvciwgdW5kZWZpbmVkLCB0aGlzLmVycm9yVmlldyhmYWlsdXJlLmVycm9yLCB0aGlzLnJ1bGUpKTtcbiAgICAgICAgZWxzZSB0aGlzLmxvc3QoaW52b2NhdGlvbi5jYXVzZSwgaW52b2NhdGlvbi5lbnRyeSwgaW52b2NhdGlvbi52aWV3KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDYXB0dXJlIHRoZSBzZXJ2ZWQgZW50cnkgbm93OyBhbiBhc3luY2hyb25vdXMgZmFpbHVyZSBrZWVwcyB0aGlzIGxlZydzIHJ1bGUsIG5vdCBhIGxhdGVyIHJlc3VtZSdzIHJ1bGUuICovXG4gIHByaXZhdGUgaW52b2tlKGVudHJ5OiBSZWNvcmRFbnRyeSwgY2FsbDogKCkgPT4gdW5rbm93biwgcnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICAgIGNvbnN0IGZhaWxlZCA9IChjYXVzZTogdW5rbm93bik6IG5ldmVyID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gbmV3IEVycm9yKCdyZWNvcmQgc2luazogYWRhcHRlciBpbnZvY2F0aW9uIGZhaWxlZCcpO1xuICAgICAgdGhpcy5pbnZvY2F0aW9uRmFpbHVyZXMuc2V0KGVudmVsb3BlLCB7IGVudHJ5LCBjYXVzZSwgdmlldzogdGhpcy5lcnJvclZpZXcoY2F1c2UsIHJ1bGUpIH0pO1xuICAgICAgdGhyb3cgZW52ZWxvcGU7XG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0dXJuZWQgPSBjYWxsKCk7XG4gICAgICAvLyBWb2lkIGFkYXB0ZXJzIGtlZXAgdGhlaXIgc3luY2hyb25vdXMgcGF0aDsgb25seSBhbiBvYmplY3QvZnVuY3Rpb24gY2FuIGJlIGEgdGhlbmFibGUuIHNldHRsZU9uY2VcbiAgICAgIC8vIG9ic2VydmVzIG5hdGl2ZSBwcm9taXNlcyB0aHJvdWdoIFByb21pc2UucHJvdG90eXBlLnRoZW4gYW5kIGd1YXJkcyBob3N0aWxlIHRoZW5hYmxlcyB0b28uXG4gICAgICBpZiAocmV0dXJuZWQgPT09IG51bGwgfHwgKHR5cGVvZiByZXR1cm5lZCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHJldHVybmVkICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIHJldHVybmVkO1xuICAgICAgaWYgKCF0aGlzLnJlc29sdmVkLmNhcHR1cmUpIHJldHVybiBzZXR0bGVPbmNlKHJldHVybmVkLCAoKSA9PiB1bmRlZmluZWQsIGZhaWxlZCk7XG4gICAgICB0aGlzLmNhcHR1cmVQZW5kaW5nKys7XG4gICAgICByZXR1cm4gc2V0dGxlT25jZShcbiAgICAgICAgcmV0dXJuZWQsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhcHR1cmVQZW5kaW5nLS07XG4gICAgICAgIH0sXG4gICAgICAgIChjYXVzZSkgPT4ge1xuICAgICAgICAgIHRoaXMuY2FwdHVyZVBlbmRpbmctLTtcbiAgICAgICAgICByZXR1cm4gZmFpbGVkKGNhdXNlKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHJldHVybiBmYWlsZWQoY2F1c2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBIHNpbmsgZXJyb3IgaXMgdGhlIGRpYWdub3N0aWMgZXJyb3JzLnJlY29yZFNpbmtFcnJvcjsgcmF3IGNhdXNlcyBiZWxvbmcgb25seSB0byB0aGUgY2FsbGVyJ3MgZXhjZXB0aW9uLiAqL1xuICBwcml2YXRlIGVycm9yVmlldyhlcnJvcjogdW5rbm93biwgcnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCk6IFNpbmtFcnJvclZpZXcge1xuICAgIGNvbnN0IHRleHQgPSB0aHJvd25UZXh0KGVycm9yKTtcbiAgICBjb25zdCByZXRhaW5lZCA9IHJ1bGVcbiAgICAgID8gcnVsZS5yZXRhaW5TdGFnZUVycm9yKGVycm9yLCB0ZXh0LCBydWxlLnJldGFpbkRpYWdub3N0aWMoWydlcnJvcnMnLCAncmVjb3JkU2lua0Vycm9yJ10sIHRleHQpKVxuICAgICAgOiB7IG1lc3NhZ2U6IHRleHQsIHN0cnVjdHVyZWRFcnJvcjogZXh0cmFjdEVycm9ySW5mbyhlcnJvcikgfTtcbiAgICBjb25zdCBzZXJ2ZWQgPSB7IC4uLnJldGFpbmVkLnN0cnVjdHVyZWRFcnJvciB9O1xuICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VydmVkLCAncmF3Jyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IHJldGFpbmVkLm1lc3NhZ2UsXG4gICAgICBlcnJvcjogc2VydmVkLFxuICAgICAgbWFza2VkOiByZXRhaW5lZC5tZXNzYWdlICE9PSB0ZXh0IHx8IHJldGFpbmVkLnN0cnVjdHVyZWRFcnJvci5yYXcgIT09IGVycm9yLFxuICAgICAgcnVsZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2FtZS1leGVjdXRvciByZXN1bWUgc3RhcnRzIGEgbmV3IGxlZyBvbiB0aGUgc2FtZSByZWNvcmQ6IHRoZSBjb3VudHMgZ28gb24gKG9uZSBsb2csIG9uZSByZWNvcmQpLCBidXQgdGhlXG4gICAqIGZhaWx1cmUgbW9kZSBpcyB0aGUgTEVHJ3Mg4oCUIGEgbG9zcyBpbiBhbiBlYXJsaWVyIGxlZyAod2hpY2ggYWxyZWFkeSBmYWlsZWQgdGhhdCBsZWcpIGRvZXMgbm90IHN0b3AgdGhpcyBvbmUg4oCUXG4gICAqIGFuZCB0aGUgZGV2LW1vZGUgd2FybmluZyBtYXkgZmlyZSBhZ2Fpbi5cbiAgICovXG4gIGJlZ2luTGVnKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc29sdmVkLm9uRmFpbHVyZSA9PT0gJ2ZhaWwnKSB0aGlzLnN0b3BwZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGhpcy5mYWlsdXJlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMud2FybmVkID0gZmFsc2U7XG4gICAgdGhpcy5jYXB0dXJlU3RhdHVzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRoZSBsZWcncyByZWRhY3Rpb24gcnVsZSDigJQgYSByZXN1bWUgYnVpbGRzIGEgbmV3IG9uZTsgdGhlIG5leHQgYG9wZW5lZGAgLyBgY2xvc2VkYCBpcyBzZXJ2ZWQgdW5kZXIgaXQuICovXG4gIHVzZVJ1bGUocnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMucnVsZSA9IHJ1bGU7XG4gIH1cblxuICAvKiogQWJvcnRzIGF0IHRoZSBmaXJzdCBsb3NzIHVuZGVyIGBvbkZhaWx1cmU6ICdmYWlsJ2A7IGFic2VudCBvdGhlcndpc2UuICovXG4gIGdldCBzdG9wU2lnbmFsKCk6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdG9wcGVyPy5zaWduYWw7XG4gIH1cblxuICBnZXQgZmx1c2hNb2RlKCk6IFJlY29yZFNpbmtGbHVzaE1vZGUge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkLmZsdXNoO1xuICB9XG5cbiAgLyoqIFRoZSBsb3NzIHRoYXQgZmFpbHMgdGhlIHJ1biB1bmRlciBgJ2ZhaWwnYDsgYWJzZW50IHdoaWxlIG5vdGhpbmcgd2FzIGxvc3QgKGFuZCBhbHdheXMgdW5kZXIgYCdyZXBvcnQnYCkuICovXG4gIGdldCBmYXRhbCgpOiBSZWNvcmRTaW5rRXJyb3IgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZhaWx1cmU7XG4gIH1cblxuICBzdGF0cygpOiBSZWNvcmRTaW5rU3RhdHMge1xuICAgIHJldHVybiB7XG4gICAgICBlbnRyaWVzOiB0aGlzLmVudHJpZXMsXG4gICAgICBmYWlsZWQ6IHRoaXMuZmFpbGVkLFxuICAgICAgLi4uKHRoaXMubGFzdEVycm9yID09PSB1bmRlZmluZWQgPyB7fSA6IHsgbGFzdEVycm9yOiB0aGlzLmxhc3RFcnJvciB9KSxcbiAgICAgIC4uLih0aGlzLmNhcHR1cmVTdGF0dXMgJiYgeyBjYXB0dXJlOiB0aGlzLmNhcHR1cmVTdGF0dXMgfSksXG4gICAgfTtcbiAgfVxuXG4gIGdldCBjYXB0dXJlT3B0aW9ucygpOiBDYXB0dXJlSGlzdG9yeU9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkLmNhcHR1cmU7XG4gIH1cblxuICBnZXQgcGVuZGluZ0NhcHR1cmVEZWxpdmVyaWVzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2FwdHVyZVBlbmRpbmc7XG4gIH1cblxuICBjYXB0dXJlUmVzdWx0KHJlc3VsdDogQ2FwdHVyZUhpc3RvcnlTdGF0dXMpOiB2b2lkIHtcbiAgICB0aGlzLmNhcHR1cmVTdGF0dXMgPSBPYmplY3QuZnJlZXplKHJlc3VsdCk7XG4gIH1cblxuICAvKiogU2FtZSBzZXJ2ZWQgc2VlZCBhcyBvcGVuZWQ7IGEgaGlzdG9yeSBkaWdlc3QgbmV2ZXIgc2VlcyBhIHNlZWRlZCBwb2xpY3kgc2VjcmV0LiAqL1xuICBjYXB0dXJlSW5pdGlhbFN0YXRlKHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5ydWxlID8gKHRoaXMucnVsZS5yZXRhaW5TdGF0ZShzdGF0ZSwgTE9HX1BMQUNFSE9MREVSKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdCB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCwgYXQgbW9zdCBgdGltZW91dE1zYCB3aGVuIGdpdmVuIOKAlCBieSB0aGUgb25lIGxvbmctdGltZXIgbGF3IChgSW5maW5pdHlgIHdhaXRzIGZvclxuICAgKiB0aGUgZmx1c2gsIGEgdmFsdWUgdGhhdCBpcyBub3QgYSBudW1iZXIgPiAwIGdpdmVzIHVwIGF0IG9uY2UpLiBBIGZsdXNoIHRoYXQgdGhyb3dzIG9yIHJlamVjdHMgaXMgYSBsb3NzXG4gICAqIChjb3VudGVkLCBhbmQgZmF0YWwgdW5kZXIgYCdmYWlsJ2ApOyBvbmUgc3RpbGwgcnVubmluZyBhdCB0aGUgZGVhZGxpbmUgaXMgYHBlbmRpbmdgIGFuZCBrZWVwcyBydW5uaW5nIOKAlCBhbmQsXG4gICAqIHdpdGggYHBlbmRpbmdJc0xvc3NgICh0aGUgcnVuJ3Mgb3duIGZsdXNoKSwgY291bnRlZCBhcyBhIGxvc3MgdG9vLCBzbyBhIGZsdXNoIHRoYXQgbmV2ZXIgc2V0dGxlcyBjYW5ub3QgaG9sZCBhXG4gICAqIHJ1biBvcGVuLCBhbmQgY2Fubm90IHBhc3MgZm9yIG9uZSB0aGF0IGxhbmRlZC4gTm90aGluZyBoZXJlIHRocm93czogYSBob3N0aWxlIGFkYXB0ZXIgKGEgdGhyb3dpbmcgYGZsdXNoYFxuICAgKiBnZXR0ZXIsIGEgcHJvbWlzZSB3aXRoIGl0cyBvd24gYHRoZW5gKSBpcyBhIGxvc3MsIG5ldmVyIHRoZSBydW4ncyBlcnJvci5cbiAgICovXG4gIGFzeW5jIGZsdXNoKHRpbWVvdXRNcz86IG51bWJlciwgcGVuZGluZ0lzTG9zcyA9IGZhbHNlKTogUHJvbWlzZTxSZWNvcmRGbHVzaFJlc3VsdD4ge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLnJlc29sdmVkLmFkYXB0ZXI7XG4gICAgY29uc3QgcnVsZSA9IHRoaXMucnVsZTtcbiAgICBsZXQgc2V0dGxlZDogUHJvbWlzZTxSZWNvcmRGbHVzaFJlc3VsdD47XG4gICAgbGV0IGdpdmVuVXAgPSBmYWxzZTsgLy8gYSBmbHVzaCBhbHJlYWR5IGNvdW50ZWQgYXMgYSBsb3NzIGF0IHRoZSBkZWFkbGluZSBpcyBub3QgY291bnRlZCBhZ2FpbiB3aGVuIGl0IHJlamVjdHNcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmx1c2g6IHVua25vd24gPSBhZGFwdGVyLmZsdXNoOyAvLyByZWFkIG9uY2U6IGEgZ2V0dGVyIHJ1bnMgb25jZSwgaW5zaWRlIHRoZSBndWFyZFxuICAgICAgaWYgKHR5cGVvZiBmbHVzaCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgZmFpbGVkOiBmYWxzZSwgcGVuZGluZzogZmFsc2UgfTtcbiAgICAgIHNldHRsZWQgPSBzZXR0bGVPbmNlKFxuICAgICAgICBmbHVzaC5jYWxsKGFkYXB0ZXIpLFxuICAgICAgICAoKTogUmVjb3JkRmx1c2hSZXN1bHQgPT4gKHsgZG9uZTogdHJ1ZSwgZmFpbGVkOiBmYWxzZSwgcGVuZGluZzogZmFsc2UgfSksXG4gICAgICAgIChlcnJvcik6IFJlY29yZEZsdXNoUmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAoIWdpdmVuVXApIHRoaXMubG9zdChlcnJvciwgdW5kZWZpbmVkLCB0aGlzLmVycm9yVmlldyhlcnJvciwgcnVsZSkpO1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCBmYWlsZWQ6IHRydWUsIHBlbmRpbmc6IGZhbHNlIH07XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvc3QoZXJyb3IsIHVuZGVmaW5lZCwgdGhpcy5lcnJvclZpZXcoZXJyb3IsIHJ1bGUpKTtcbiAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCBmYWlsZWQ6IHRydWUsIHBlbmRpbmc6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh0aW1lb3V0TXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHNldHRsZWQ7XG4gICAgLy8gVGhlIG9uZSBsb25nLXRpbWVyIGxhdyAoYHRpbWVycy9sb25nVGltZW91dC50c2ApIGRlY2lkZXMgZXZlcnkgbGltaXQsIGFzIGl0IGRvZXMgZm9yIGBkcmFpbk9ic2VydmVyc2A6XG4gICAgLy8gYEluZmluaXR5YCBhcm1zIG5vIHRpbWVyIGFuZCB3YWl0cyBmb3IgdGhlIGZsdXNoLCBhIGxpbWl0IHBhc3QgMl4zMSDiiJIgMSBtcyBpcyB3YWl0ZWQgaW4gZnVsbCwgYW5kIGFueXRoaW5nIHRoYXRcbiAgICAvLyBpcyBub3QgYSBudW1iZXIgPiAwIChgMGAsIGEgbmVnYXRpdmUsIGAtSW5maW5pdHlgLCBgTmFOYCkgZ2l2ZXMgdXAgYXQgb25jZS5cbiAgICBsZXQgY2FuY2VsVGltZXI6ICgpID0+IHZvaWQgPSAoKSA9PiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGVuZGluZyA9IG5ldyBQcm9taXNlPFJlY29yZEZsdXNoUmVzdWx0PigocmVzb2x2ZSkgPT4ge1xuICAgICAgY2FuY2VsVGltZXIgPSBzZXRMb25nVGltZW91dCgoKSA9PiByZXNvbHZlKHsgZG9uZTogZmFsc2UsIGZhaWxlZDogZmFsc2UsIHBlbmRpbmc6IHRydWUgfSksIHRpbWVvdXRNcyk7XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbc2V0dGxlZCwgcGVuZGluZ10pO1xuICAgICAgaWYgKHJlc3VsdC5wZW5kaW5nICYmIHBlbmRpbmdJc0xvc3MpIHtcbiAgICAgICAgZ2l2ZW5VcCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGByZWNvcmQgc2luazogZmx1c2goKSBkaWQgbm90IHNldHRsZSB3aXRoaW4gJHt0aW1lb3V0TXMgPiAwID8gdGltZW91dE1zIDogMH1tc2ApO1xuICAgICAgICB0aGlzLmxvc3QoZXJyb3IsIHVuZGVmaW5lZCwgdGhpcy5lcnJvclZpZXcoZXJyb3IsIHJ1bGUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNhbmNlbFRpbWVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBtZXRhIGFzIHNlcnZlZDogYSBib3VuZGFyeSByZWNvcmQsIHNjcnViYmVkIGJ5IGtleSBuYW1lIGF0IGV2ZXJ5IGRlcHRoIChhbiBpbmVydCBydWxlIGNvcGllcyBub3RoaW5nKS4gKi9cbiAgc2VydmUobWV0YTogTWV0YSk6IE1ldGEge1xuICAgIHJldHVybiB0aGlzLnJ1bGUgPyB0aGlzLnJ1bGUucmV0YWluQm91bmRhcnkobWV0YSwgTE9HX1BMQUNFSE9MREVSKSA6IG1ldGE7XG4gIH1cblxuICAvKiogT25lIGxvc3M6IGNvdW50ZWQsIHdhcm5lZCBvbmNlIHBlciBydW4sIHRvbGQgd2l0aCBhIHNhZmUgZGlzcGF0Y2hlZCBlbnRyeSB3aGVuIGF2YWlsYWJsZSwgZmF0YWwgdW5kZXIgJ2ZhaWwnLiAqL1xuICBwcml2YXRlIGxvc3QoZXJyb3I6IHVua25vd24sIGVudHJ5OiBSZWNvcmRFbnRyeSB8IHVuZGVmaW5lZCwgdmlldzogU2lua0Vycm9yVmlldyk6IHZvaWQge1xuICAgIHRoaXMuZmFpbGVkICs9IDE7XG4gICAgY29uc3QgdGV4dCA9IHZpZXcudGV4dDtcbiAgICB0aGlzLmxhc3RFcnJvciA9IHRleHQ7XG4gICAgaWYgKGlzRGV2TW9kZSgpICYmICF0aGlzLndhcm5lZCkge1xuICAgICAgdGhpcy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtmb290cHJpbnRdIHJlY29yZCBzaW5rOiBhbiBlbnRyeSB3YXMgbm90IHN0b3JlZCAoJHt0ZXh0fSkuIFRoZSBydW4gZ29lcyBvbjsgYCArXG4gICAgICAgICAgJ2dldFNuYXBzaG90KCkuc2luayBjb3VudHMgZXZlcnkgbG9zcy4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVGhlIGZhaWx1cmUgbW9kZSBmaXJzdDogbm90aGluZyB0aGUgYWRhcHRlcidzIG93biBsaXN0ZW5lciBkb2VzIGNhbiBza2lwIGl0LlxuICAgIGlmICh0aGlzLnN0b3BwZXIgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZhaWx1cmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5mYWlsdXJlID0gbmV3IFJlY29yZFNpbmtFcnJvcihgcmVjb3JkIHNpbms6IGFuIGVudHJ5IHdhcyBub3Qgc3RvcmVkIOKAlCAke3RleHR9YCwgZXJyb3IpO1xuICAgICAgaWYgKHZpZXcubWFza2VkKSB7XG4gICAgICAgIC8vIFRoZSBjYWxsZXIga2VlcHMgdGhlIHJlYWwgY2F1c2UsIGJ1dCBvYnNlcnZlcnMgb2YgdGhpcyBuZXcgd3JhcHBlciBtdXN0IGluaGVyaXQgaXRzIHJlbWVtYmVyZWQgbWFzay5cbiAgICAgICAgdmlldy5ydWxlPy5yZXRhaW5TdGFnZUVycm9yKHRoaXMuZmFpbHVyZSwgdGhpcy5mYWlsdXJlLm1lc3NhZ2UsIFNDT1BFX1BMQUNFSE9MREVSKTtcbiAgICAgICAgaWYgKHRoaXMucnVsZSAhPT0gdmlldy5ydWxlKSB0aGlzLnJ1bGU/LnJldGFpblN0YWdlRXJyb3IodGhpcy5mYWlsdXJlLCB0aGlzLmZhaWx1cmUubWVzc2FnZSwgU0NPUEVfUExBQ0VIT0xERVIpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdG9wcGVyLmFib3J0KHRoaXMuZmFpbHVyZSk7XG4gICAgfVxuICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB0ZWxsQWRhcHRlcih0aGlzLnJlc29sdmVkLmFkYXB0ZXIsIHsgZW50cnksIGVycm9yOiB2aWV3LmVycm9yIH0pO1xuICB9XG59XG5cbi8qKiBUaGUgYWRhcHRlcidzIG93biBgb25GYWlsdXJlYCwgaXNvbGF0ZWQ6IGEgdGhyb3dpbmcgZ2V0dGVyLCBhIHRocm93IG9yIGEgcmVqZWN0aW9uIHRoZXJlIGNoYW5nZXMgbm90aGluZy4gKi9cbmZ1bmN0aW9uIHRlbGxBZGFwdGVyKGFkYXB0ZXI6IFJlY29yZFNpbmssIGZhaWx1cmU6IHsgcmVhZG9ubHkgZW50cnk6IFJlY29yZEVudHJ5OyByZWFkb25seSBlcnJvcjogdW5rbm93biB9KTogdm9pZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgbGlzdGVuZXI6IHVua25vd24gPSBhZGFwdGVyLm9uRmFpbHVyZTtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm47XG4gICAgc2V0dGxlT25jZShcbiAgICAgIGxpc3RlbmVyLmNhbGwoYWRhcHRlciwgZmFpbHVyZSksXG4gICAgICAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAoKSA9PiB1bmRlZmluZWQsXG4gICAgKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQSBsaXN0ZW5lciB0aGF0IGZhaWxzIGlzIHRoZSBhZGFwdGVyJ3Mgb3duIGJ1c2luZXNzOiB0aGUgbG9zcyBpcyBhbHJlYWR5IGNvdW50ZWQuXG4gIH1cbn1cbiJdfQ==
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
import { close, closeSync, constants, fstat, fstatSync, fsync, openSync, readSync, write } from 'node:fs';
|
|
45
45
|
import { resolve as resolvePath } from 'node:path';
|
|
46
46
|
import { getuid } from 'node:process';
|
|
47
|
+
import { setLongTimeout } from '../timers/longTimeout.js';
|
|
47
48
|
/** The default cap on a record file: 64 MiB. */
|
|
48
49
|
export const DEFAULT_FILE_SINK_MAX_BYTES = 64 * 1024 * 1024;
|
|
49
50
|
/** The default cap on ONE entry's line: 8 MiB. */
|
|
@@ -294,14 +295,14 @@ function writeAt(fd, buffer, position, done) {
|
|
|
294
295
|
/** `work`, or a rejection naming the bound once `ms` passed — the work goes on, nobody waits for it. */
|
|
295
296
|
function withTimeout(work, ms, message) {
|
|
296
297
|
return new Promise((resolve, reject) => {
|
|
297
|
-
|
|
298
|
-
// A timer that only bounds a wait never keeps the process alive on its own.
|
|
299
|
-
|
|
298
|
+
// The one long-timer law (`timers/longTimeout.ts`): a bound past 2^31 − 1 ms is waited in full, never 1 ms.
|
|
299
|
+
// A timer that only bounds a wait never keeps the process alive on its own (`unref`).
|
|
300
|
+
const cancel = setLongTimeout(() => reject(new Error(message)), ms, { unref: true });
|
|
300
301
|
Promise.prototype.then.call(work, () => {
|
|
301
|
-
|
|
302
|
+
cancel();
|
|
302
303
|
resolve();
|
|
303
304
|
}, (error) => {
|
|
304
|
-
|
|
305
|
+
cancel();
|
|
305
306
|
reject(error);
|
|
306
307
|
});
|
|
307
308
|
});
|
|
@@ -390,4 +391,4 @@ export function readRecordFile(path, options) {
|
|
|
390
391
|
}
|
|
391
392
|
return { entries, unreadable };
|
|
392
393
|
}
|
|
393
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZVNpbmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NpbmtzL2ZpbGVTaW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ0c7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUcsT0FBTyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQU10QyxnREFBZ0Q7QUFDaEQsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDNUQsa0RBQWtEO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pFLHFFQUFxRTtBQUNyRSxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNuRSw0Q0FBNEM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQUcsTUFBTSxDQUFDO0FBQ3pELDhHQUE4RztBQUM5RyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDdEMsdURBQXVEO0FBQ3ZELE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUEwQ2pEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBWSxFQUFFLE9BQXlCO0lBQzlELElBQUksT0FBTyxJQUFJLEtBQUssUUFB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QUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsMkdBQTJHO1FBQzNHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLDRDQUE0QyxFQUFFLENBQUMsQ0FBQztRQUNoSCxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO2dCQUFFLFNBQVM7WUFDbEMsSUFBSSxDQUFDO2dCQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxtQ0FBbUMsRUFBRSxDQUFDLENBQUM7WUFDaEYsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzaW5rcy9maWxlU2luay50cyDigJQgdGhlIHJlY29yZCwgb25lIEpTT04gbGluZSBwZXIgZW50cnksIGluIGEgZmlsZSAoZGVzaWduIMKnMy41LCDCpzQsIHBhY2tldCBQNikuIE5PREUgT05MWTogdGhlXG4gKiBvbmUgZmlsZSBpbiBgc3JjL2AgdGhhdCBpbXBvcnRzIGEgTm9kZSBidWlsdC1pbiwgcmVhY2hhYmxlIG9ubHkgdGhyb3VnaCB0aGUgYGZvb3RwcmludGpzL3NpbmtzYCBkb29yLlxuICpcbiAqIFdIWSBBIEZJTEUsIFdIWSBUSElTIFNIQVBFLiBBIHJ1bidzIHJlY29yZCBtdXN0IG91dGxpdmUgdGhlIHByb2Nlc3MgdGhhdCBtYWRlIGl0IOKAlCBhIGtpbGxlZCBwcm9jZXNzLCBhIGNyYXNoZWRcbiAqIGhvc3QsIGEgc2VydmVybGVzcyBmcmVlemUuIEVhY2ggZW50cnkgdGhlIGxvZyBoYW5kcyBvdmVyIGlzIGVuY29kZWQsIGNoZWNrZWQgYW5kIGdpdmVuIGl0cyBvd24gb2Zmc2V0IGluIHRoZSBmaWxlLFxuICogYW5kIGl0cyB3cml0ZSBpcyBoYW5kZWQgdG8gdGhlIEkvTyBwb29sIEFUIE9OQ0UgKGEgcG9zaXRpb25hbCB3cml0ZSDigJQgbm8gZW50cnkgd2FpdHMgZm9yIHRoZSBldmVudCBsb29wIHRvIHR1cm4pO1xuICogdGhlIHBvb2wncyB0aHJlYWRzIHBlcmZvcm0gdGhlbSB3aGlsZSB0aGUgbWFpbiB0aHJlYWQgcnVucyBvbi4gQSBwcm9jZXNzIGtpbGxlZCBhZnRlciBhIHBvb2wgdGhyZWFkIHdyb3RlIGFuIGVudHJ5XG4gKiBrZWVwcyBpdC4gVW50aWwgdGhlbiBpdCBpcyBub3Qgb24gZGlzazogbWljcm9zZWNvbmRzIG9uIGEgZnJlZSBwb29sLCBidXQgdGhlIHBvb2wgKDQgdGhyZWFkcyBieSBkZWZhdWx0KSBpcyBzaGFyZWRcbiAqIHdpdGggRE5TIGxvb2t1cHMsIHpsaWIsIGNyeXB0byBhbmQgb3RoZXIgZnMgd29yaywgc28gd2hpbGUgaXQgaXMgYnVzeSB0aGUgd2luZG93IGlzIGFzIGxvbmcgYXMgdGhhdCB3b3JrIOKAlCBhbmQgc2luY2VcbiAqIHdyaXRlcyBjb21wbGV0ZSBvdXQgb2Ygb3JkZXIsIGEga2lsbCBjYW4gbG9zZSBhbiBlbnRyeSBpbiB0aGUgbWlkZGxlICh0aGUgcmVhZGVyIHJlcG9ydHMgdGhlIGhvbGUpLiBgZmx1c2goKWAgd2FpdHMgZm9yIGV2ZXJ5IHdyaXRlIGFuZFxuICogYGZzeW5jYHMg4oCUIHRoZSBzdGVwIHRoYXQgYWxzbyBzdXJ2aXZlcyB0aGUgbWFjaGluZSBsb3NpbmcgcG93ZXIsIGFuZCB0aGUgb25lIHRoZSBleGVjdXRvciBhd2FpdHMgYWZ0ZXIgZWFjaCBydW4nc1xuICogY2xvc2luZyBlbnRyeS5cbiAqXG4gKiBUSEUgVEhSRUFUIE1PREVMLCBhcyBjb2RlIOKAlCBldmVyeSByZXNvdXJjZSBib3VuZGVkLCBub3RoaW5nIHRoYXQgY2FuIHN0YWxsIHRoZSBydW46XG4gKiAgIC0gT05MWSBUSEUgUEFUSCBUSEUgQVBQIEdJVkVTLiBSZXNvbHZlZCBvbmNlIGFuZCBvcGVuZWQgb25jZSwgYXQgYGZpbGVTaW5rKHBhdGgpYDsgZXZlcnkgZW50cnkgZ29lcyB0byB0aGF0IG9wZW5cbiAqICAgICBmaWxlLiBBIHN5bWJvbGljIGxpbmsgYXQgdGhlIHBhdGggaXMgcmVmdXNlZCAoYE9fTk9GT0xMT1dgLCB3aGVyZSB0aGUgcGxhdGZvcm0gaGFzIGl0KSwgYW5kIHNvIGlzIGFueXRoaW5nXG4gKiAgICAgdGhhdCBpcyBub3QgYSByZWd1bGFyIGZpbGUsIGEgZmlsZSB3aXRoIGFub3RoZXIgaGFyZCBsaW5rLCBhbm90aGVyIG93bmVyLCBvciBncm91cC93b3JsZCB3cml0ZS4gQSBmaWxlIHRoZVxuICogICAgIHNpbmsgY3JlYXRlcyBpcyBgMG82MDBgLlxuICogICAtIEFUT01JQyBQRVIgRU5UUlkuIEEgbGluZSBpcyBlbmNvZGVkIGluIGZ1bGwgZmlyc3Qg4oCUIGFuIGVudHJ5IEpTT04gY2Fubm90IHdyaXRlIChhIGBCaWdJbnRgLCBhIGN5Y2xlKSBpc1xuICogICAgIHJlZnVzZWQgd2hvbGUg4oCUIHRoZW4gd3JpdHRlbiBhdCBpdHMgb3duIG9mZnNldC4gQSB3cml0ZSB0aGF0IGZhaWxzIHBhcnQtd2F5IGxlYXZlcyBhIGhvbGUgdXAgdG8gdGhlIG5leHRcbiAqICAgICBlbnRyeSdzIG9mZnNldDsgdGhlIHJlYWRlciBzcGxpdHMgYXQgaXQgKE5VTCksIHNvIGEgdG9ybiBsaW5lIG5ldmVyIHN3YWxsb3dzIHRoZSBvbmUgYWZ0ZXIgaXQgKGFuIGV4aXN0aW5nXG4gKiAgICAgZmlsZSB3aXRoIGEgdG9ybiB0YWlsIGdldHMgYSBuZXdsaW5lIGZpcnN0KS5cbiAqICAgLSBCT1VOREVEOiBgbWF4RW50cnlCeXRlc2AgKG9uZSBsaW5lLCA4IE1pQiDigJQgcmVmdXNlZCBieSBuYW1lLCBiZWZvcmUgaXQgaXMgZW5jb2RlZCB3aGVuIGl0cyBsZW5ndGggYWxyZWFkeVxuICogICAgIHNheXMgc28pLCBgbWF4UXVldWVkQnl0ZXNgIChhY2NlcHRlZCwgbm90IHlldCB3cml0dGVuLCAxNiBNaUIg4oCUIHBhc3QgaXQgYW4gZW50cnkgaXMgRFJPUFBFRCBhbmQgY291bnRlZCwgbmV2ZXJcbiAqICAgICBidWZmZXJlZCB3aXRob3V0IGxpbWl0KSwgYG1heEJ5dGVzYCAodGhlIGZpbGUsIDY0IE1pQiDigJQgb25jZSBmdWxsLCBldmVyeSBmdXJ0aGVyIGVudHJ5IGlzIHJlZnVzZWQgYW5kIGNvdW50ZWQ7XG4gKiAgICAgYSBjbG9zaW5nIGVudHJ5IG1heSB1c2UgYSA2NCBLaUIgcmVzZXJ2ZSBzbyBhIGZ1bGwgZmlsZSBjYW4gc3RpbGwgc2F5IGhvdyB0aGUgcnVuIGVuZGVkKSwgYGZsdXNoVGltZW91dE1zYFxuICogICAgICgxMCBzIOKAlCB0aGVuIGBmbHVzaCgpYCByZWplY3RzKS4gRXZlcnkgcmVmdXNhbCB0aHJvd3MgZnJvbSB0aGUgc2luayBtZXRob2QsIHdoaWNoIHRoZSBsb2cgY291bnRzXG4gKiAgICAgKGBnZXRTbmFwc2hvdCgpLnNpbmtgKTsgYSB3cml0ZSB0aGF0IGZhaWxzIGxhdGVyIHJlamVjdHMgdGhhdCBlbnRyeSdzIHByb21pc2UsIGNvdW50ZWQgdGhlIHNhbWUgd2F5LlxuICogICAtIEFTWU5DSFJPTk9VUyBXUklURVMgT05MWS4gTm8gbWV0aG9kIGJsb2NrcyBvbiB0aGUgZGlzazsgdGhlIGZpbGUgaXMgcmVsZWFzZWQgYXN5bmNocm9ub3VzbHksIGFmdGVyIGV2ZXJ5XG4gKiAgICAgd3JpdGUgYW5kIGV2ZXJ5IHN0YXJ0ZWQgZnN5bmMuXG4gKiAgIC0gTk8gU0VDUkVUIE9OIERJU0sgaXMgdGhlIEVYRUNVVE9SJ3MgbGF3LCBhcHBsaWVkIGJlZm9yZSBhbnkgZW50cnkgcmVhY2hlcyBhbiBhZGFwdGVyIChgcnVubmVyL3JlY29yZFNpbmsudHNgKTpcbiAqICAgICB0aGlzIGZpbGUgd3JpdGVzIHdoYXQgaXQgaXMgaGFuZGVkIGFuZCByZWFkcyBub3RoaW5nIGVsc2UuXG4gKiAgIC0gT05FIFdSSVRFUiBQRVIgRklMRS4gQSBzZWNvbmQgc2luayBvbiBhIGZpbGUgdGhpcyBwcm9jZXNzIGhhcyBvcGVuIGlzIHJlZnVzZWQgKGJ5IGRldmljZSBhbmQgaW5vZGUsIGFjcm9zcyB0aGVcbiAqICAgICBDb21tb25KUyBhbmQgRVNNIGJ1aWxkcykuIEFOT1RIRVIgUFJPQ0VTUyB3cml0aW5nIHRoZSBzYW1lIHBhdGggaXMgbm90IHNlZW4gYXQgb3BlbjogZWFjaCB3cml0ZXMgYXQgaXRzIG93blxuICogICAgIG9mZnNldHMgYW5kIHdvdWxkIG92ZXJ3cml0ZSB0aGUgb3RoZXIuIGBmbHVzaCgpYCBjaGVja3MgdGhlIGZpbGUncyBzaXplIGFnYWluc3Qgd2hhdCB0aGlzIHNpbmsgcGxhY2VkIGFuZCByZWplY3RzXG4gKiAgICAgKGEgbG9zcyB0aGUgcnVuIGNvdW50cykgd2hlbiBhbm90aGVyIHdyaXRlcidzIGJ5dGVzIHJlYWNoIHBhc3QgaXQg4oCUIGJlc3QgZWZmb3J0OiBhbiBvdmVyd3JpdGUgdGhpcyBzaW5rJ3Mgb3duXG4gKiAgICAgbGF0ZXIgd3JpdGVzIGNvdmVyIGlzIG5vdCBzZWVuLiBHaXZlIGVhY2ggcHJvY2VzcyBpdHMgb3duIGZpbGUuXG4gKlxuICogV0hBVCBKU09OIEtFRVBTLiBBIGxpbmUgaG9sZHMgd2hhdCBgSlNPTi5zdHJpbmdpZnlgIGtlZXBzOiBhIGBEYXRlYCBiZWNvbWVzIGl0cyBJU08gc3RyaW5nLCBhIGBNYXBgIC8gYFNldGAgYW5cbiAqIGVtcHR5IG9iamVjdCwgYHVuZGVmaW5lZGAgZGlzYXBwZWFycy4gQSByZWNvcmQgb2YgcGxhaW4gSlNPTiB2YWx1ZXMgcmVhZHMgYmFjayBleGFjdGx5IChgcmVhZFJlY29yZEZpbGVgIOKGklxuICogYHJlYWRTdG9yZWRSZWNvcmRgKTsgZm9yIHJpY2hlciB2YWx1ZXMsIGJyaW5nIGFuIGFkYXB0ZXIgd2l0aCBhIHJpY2hlciBlbmNvZGluZy5cbiAqL1xuXG5pbXBvcnQgeyBjbG9zZSwgY2xvc2VTeW5jLCBjb25zdGFudHMsIGZzdGF0LCBmc3RhdFN5bmMsIGZzeW5jLCBvcGVuU3luYywgcmVhZFN5bmMsIHdyaXRlIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyByZXNvbHZlIGFzIHJlc29sdmVQYXRoIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGdldHVpZCB9IGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgUmVjb3JkRW50cnksIFJlY29yZFNpbmsgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IENhcHR1cmVIaXN0b3J5T3B0aW9ucyB9IGZyb20gJy4uL2NhcHR1cmUvaGlzdG9yeVR5cGVzLmpzJztcblxuLyoqIFRoZSBkZWZhdWx0IGNhcCBvbiBhIHJlY29yZCBmaWxlOiA2NCBNaUIuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9GSUxFX1NJTktfTUFYX0JZVEVTID0gNjQgKiAxMDI0ICogMTAyNDtcbi8qKiBUaGUgZGVmYXVsdCBjYXAgb24gT05FIGVudHJ5J3MgbGluZTogOCBNaUIuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9GSUxFX1NJTktfTUFYX0VOVFJZX0JZVEVTID0gOCAqIDEwMjQgKiAxMDI0O1xuLyoqIFRoZSBkZWZhdWx0IGNhcCBvbiBieXRlcyBhY2NlcHRlZCBidXQgbm90IHlldCB3cml0dGVuOiAxNiBNaUIuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9GSUxFX1NJTktfTUFYX1FVRVVFRF9CWVRFUyA9IDE2ICogMTAyNCAqIDEwMjQ7XG4vKiogVGhlIGRlZmF1bHQgYm91bmQgb24gYGZsdXNoKClgOiAxMCBzLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRklMRV9TSU5LX0ZMVVNIX1RJTUVPVVRfTVMgPSAxMF8wMDA7XG4vKiogSG93IGZhciBwYXN0IGBtYXhCeXRlc2AgYSBDTE9TSU5HIGVudHJ5IG1heSBzdGlsbCBnbywgc28gYSBmdWxsIGZpbGUgY2FuIHNheSBob3cgdGhlIHJ1biBlbmRlZDogNjQgS2lCLiAqL1xuY29uc3QgQ0xPU0VfUkVTRVJWRV9CWVRFUyA9IDY0ICogMTAyNDtcbi8qKiBUaGUgZGVmYXVsdCBjYXAgYHJlYWRSZWNvcmRGaWxlYCByZWFkczogMjU2IE1pQi4gKi9cbmNvbnN0IERFRkFVTFRfUkVBRF9NQVhfQllURVMgPSAyNTYgKiAxMDI0ICogMTAyNDtcblxuLyoqIGBmaWxlU2lua2AncyBvcHRpb25zIOKAlCBldmVyeSByZXNvdXJjZSB0aGUgc2luayBjYW4gc3BlbmQsIGJvdW5kZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbW9zdCBieXRlcyB0aGUgZmlsZSBtYXkgaG9sZCAodGhlIGJ5dGVzIGFscmVhZHkgaW4gaXQgY291bnQpLiBPbmNlIGFuIGVudHJ5IHdvdWxkIHBhc3MgaXQsIHRoZSBmaWxlIGlzIEZVTEw6XG4gICAqIHRoYXQgZW50cnkgYW5kIGV2ZXJ5IGxhdGVyIG9uZSBpcyByZWZ1c2VkIGFuZCBjb3VudGVkIGJ5IHRoZSBydW4sIG5ldmVyIHdyaXR0ZW4g4oCUIGV4Y2VwdCBhIGNsb3NpbmcgZW50cnksIHdoaWNoXG4gICAqIG1heSB1c2UgNjQgS2lCIG1vcmUgc28gYSBmdWxsIGZpbGUgY2FuIHN0aWxsIHNheSBob3cgdGhlIHJ1biBlbmRlZC4gRGVmYXVsdCA2NCBNaUIuXG4gICAqL1xuICByZWFkb25seSBtYXhCeXRlcz86IG51bWJlcjtcbiAgLyoqIFRoZSBsYXJnZXN0IE9ORSBlbnRyeSdzIGxpbmUgbWF5IGJlOyBhIGxhcmdlciBlbnRyeSBpcyByZWZ1c2VkIHdob2xlIChgbWF4RW50cnlCeXRlc2AgbmFtZWQpLiBEZWZhdWx0IDggTWlCLiAqL1xuICByZWFkb25seSBtYXhFbnRyeUJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG1vc3QgYnl0ZXMgYWNjZXB0ZWQgYW5kIG5vdCB5ZXQgb24gZGlzay4gV3JpdGVzIGFyZSBhc3luY2hyb25vdXMsIHNvIGEgc2luayBzbG93ZXIgdGhhbiB0aGUgcnVuIHF1ZXVlczsgcGFzdFxuICAgKiB0aGlzIGJvdW5kIGFuIGVudHJ5IGlzIERST1BQRUQgYW5kIGNvdW50ZWQgKG5ldmVyIGJ1ZmZlcmVkIHdpdGhvdXQgbGltaXQsIG5ldmVyIGEgc3RhbGwpLiBEZWZhdWx0IDE2IE1pQi5cbiAgICovXG4gIHJlYWRvbmx5IG1heFF1ZXVlZEJ5dGVzPzogbnVtYmVyO1xuICAvKiogSG93IGxvbmcgYGZsdXNoKClgIChkcmFpbiB0aGUgcXVldWUsIHRoZW4gYGZzeW5jYCkgbWF5IHRha2UgYmVmb3JlIGl0IHJlamVjdHMuIERlZmF1bHQgMTAgcy4gKi9cbiAgcmVhZG9ubHkgZmx1c2hUaW1lb3V0TXM/OiBudW1iZXI7XG59XG5cbi8qKiBBIHJlY29yZCBzaW5rIHRoYXQgYXBwZW5kcyB0byBvbmUgZmlsZSDigJQgYFJlY29yZFNpbmtgIHBsdXMgd2hhdCB0aGUgYXBwIG5lZWRzIHRvIG1hbmFnZSB0aGUgZmlsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVNpbmsgZXh0ZW5kcyBSZWNvcmRTaW5rLCBQaWNrPENhcHR1cmVIaXN0b3J5T3B0aW9ucywgJ2Fja25vd2xlZGdlJz4ge1xuICAvKiogVGhlIGFic29sdXRlIHBhdGggdGhlIHNpbmsgd3JpdGVzIHRvIOKAlCByZXNvbHZlZCBvbmNlLCB3aGVuIGl0IHdhcyBtYWRlLiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBCeXRlcyB0aGlzIHNpbmsga25vd3MgYXJlIG9uIGRpc2s6IHRoZSBmaWxlJ3Mgc2l6ZSB3aGVuIGl0IG9wZW5lZCBwbHVzIGV2ZXJ5IGJ5dGUgaXRzIHdyaXRlcyBjb21wbGV0ZWQg4oCUIGFcbiAgICogcnVubmluZyBzdW0sIG5vdCB0aGUgZmlsZSdzIGVuZCAod3JpdGVzIGNvbXBsZXRlIG91dCBvZiBvcmRlcjsgYSBmYWlsZWQgb25lIGxlYXZlcyBhIGhvbGUpLlxuICAgKi9cbiAgcmVhZG9ubHkgYnl0ZXM6IG51bWJlcjtcbiAgLyoqIEJ5dGVzIGFjY2VwdGVkIGFuZCBub3QgeWV0IHdyaXR0ZW4uICovXG4gIHJlYWRvbmx5IHF1ZXVlZEJ5dGVzOiBudW1iZXI7XG4gIC8qKiBgdHJ1ZWAgb25jZSBhbiBlbnRyeSB3YXMgcmVmdXNlZCBmb3IgYG1heEJ5dGVzYDogdGhlIGZpbGUgaXMgZnVsbCwgYW5kIG9ubHkgYSBjbG9zaW5nIGVudHJ5IG1heSBzdGlsbCBnby4gKi9cbiAgcmVhZG9ubHkgZnVsbDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJlbGVhc2UgdGhlIGZpbGUuIElkZW1wb3RlbnQuIEV2ZXJ5IGVudHJ5IGFmdGVyIGl0IGlzIHJlZnVzZWQgKHRoZSBydW4gY291bnRzIGl0KSwgYW5kIGBmbHVzaCgpYCByZWplY3RzO1xuICAgKiBlbnRyaWVzIGFscmVhZHkgYWNjZXB0ZWQgYXJlIHN0aWxsIHdyaXR0ZW4gKGFuZCBhIGZsdXNoIGFscmVhZHkgc3RhcnRlZCBmaW5pc2hlcyksIHRoZW4gdGhlIGZpbGUgaXMgY2xvc2VkIOKAlFxuICAgKiB0aGUgcHJvbWlzZSBzZXR0bGVzIHRoZW4uXG4gICAqL1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEEgcmVjb3JkIHNpbmsgdGhhdCBhcHBlbmRzIGVhY2ggZW50cnkgdG8gYHBhdGhgIGFzIG9uZSBKU09OIGxpbmUg4oCUIHRoZSBjcmFzaC1zYWZlIHJlY29yZCBvbiBhIE5vZGUgaG9zdC5cbiAqXG4gKiBFdmVyeSBtZXRob2QgcmV0dXJucyBhdCBvbmNlOiB0aGUgbGluZSBpcyBlbmNvZGVkLCBjaGVja2VkIGFnYWluc3QgZXZlcnkgYm91bmQsIGdpdmVuIGl0cyBvZmZzZXQgYW5kIGhhbmRlZCB0b1xuICogdGhlIEkvTyBwb29sLiBUaGUgbWV0aG9kJ3MgcHJvbWlzZSBzZXR0bGVzIHdoZW4gdGhhdCBsaW5lIGlzIHdyaXR0ZW47IGEgd3JpdGUgdGhhdCBmYWlscyByZWplY3RzIGl0LCBhbmQgdGhlIHJ1blxuICogY291bnRzIHRoZSBsb3NzLlxuICpcbiAqIEB0aHJvd3MgVHlwZUVycm9yIHdoZW4gYHBhdGhgIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgZG9lcyBub3QgbmFtZSBhIHJlZ3VsYXIgZmlsZSB0aGUgd3JpdGVyIG93bnMgYWxvbmU7XG4gKiAgIFJhbmdlRXJyb3IgZm9yIGEgYm91bmQgdGhhdCBpcyBub3QgYSB3aG9sZSBudW1iZXIg4omlIDE7IHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgZXJyb3Igd2hlblxuICogICB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkIChhIHN5bWJvbGljIGxpbmsgYXQgYHBhdGhgIGluY2x1ZGVkKS4gTWFkZSBvbmNlLCBhdCBzZXR1cCDigJQgbmV2ZXIgZHVyaW5nIGEgcnVuLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBmaWxlU2luaywgcmVhZFJlY29yZEZpbGUgfSBmcm9tICdmb290cHJpbnRqcy9zaW5rcyc7XG4gKiBpbXBvcnQgeyByZWFkU3RvcmVkUmVjb3JkIH0gZnJvbSAnZm9vdHRyYWNlJztcbiAqXG4gKiBjb25zdCBzaW5rID0gZmlsZVNpbmsoJy92YXIvZm9vdHByaW50L29yZGVycy5qc29ubCcpO1xuICogY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2luayB9KTtcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0IH0pO1xuICogLy8g4oCmbGF0ZXIsIG9yIGFmdGVyIGEgY3Jhc2g6XG4gKiBjb25zdCByZWNvcmQgPSByZWFkU3RvcmVkUmVjb3JkKHJlYWRSZWNvcmRGaWxlKCcvdmFyL2Zvb3RwcmludC9vcmRlcnMuanNvbmwnKS5lbnRyaWVzKTtcbiAqIHJlY29yZC5yb290KHJ1bklkKT8uY29tcGxldGU7IC8vIGZhbHNlIGZvciBhIHJ1biB0aGF0IG5ldmVyIGVuZGVkXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGVTaW5rKHBhdGg6IHN0cmluZywgb3B0aW9ucz86IEZpbGVTaW5rT3B0aW9ucyk6IEZpbGVTaW5rIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJyB8fCBwYXRoID09PSAnJykgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlsZVNpbms6IHBhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgY29uc3QgbWF4Qnl0ZXMgPSBib3VuZCgnbWF4Qnl0ZXMnLCBvcHRpb25zPy5tYXhCeXRlcywgREVGQVVMVF9GSUxFX1NJTktfTUFYX0JZVEVTLCAxKTtcbiAgY29uc3QgbWF4RW50cnlCeXRlcyA9IGJvdW5kKCdtYXhFbnRyeUJ5dGVzJywgb3B0aW9ucz8ubWF4RW50cnlCeXRlcywgREVGQVVMVF9GSUxFX1NJTktfTUFYX0VOVFJZX0JZVEVTLCAxKTtcbiAgY29uc3QgbWF4UXVldWVkQnl0ZXMgPSBib3VuZCgnbWF4UXVldWVkQnl0ZXMnLCBvcHRpb25zPy5tYXhRdWV1ZWRCeXRlcywgREVGQVVMVF9GSUxFX1NJTktfTUFYX1FVRVVFRF9CWVRFUywgMSk7XG4gIGNvbnN0IGZsdXNoVGltZW91dE1zID0gYm91bmQoJ2ZsdXNoVGltZW91dE1zJywgb3B0aW9ucz8uZmx1c2hUaW1lb3V0TXMsIERFRkFVTFRfRklMRV9TSU5LX0ZMVVNIX1RJTUVPVVRfTVMsIDEpO1xuICBjb25zdCBhYnNvbHV0ZSA9IHJlc29sdmVQYXRoKHBhdGgpO1xuICAvLyBOT1QgYE9fQVBQRU5EYDogZWFjaCBlbnRyeSBpcyB3cml0dGVuIGF0IHRoZSBvZmZzZXQgaXQgd2FzIGdpdmVuIHdoZW4gaXQgd2FzIHF1ZXVlZCAoYSBwb3NpdGlvbmFsIHdyaXRlKSwgc29cbiAgLy8gZXZlcnkgZW50cnkgaXMgaGFuZGVkIHRvIHRoZSBJL08gcG9vbCB0aGUgbW9tZW50IGl0IGlzIGFjY2VwdGVkIOKAlCBub25lIHdhaXRzIGZvciB0aGUgZXZlbnQgbG9vcCB0byB0dXJuLlxuICBjb25zdCBmZCA9IG9wZW5TeW5jKGFic29sdXRlLCBjb25zdGFudHMuT19SRFdSIHwgY29uc3RhbnRzLk9fQ1JFQVQgfCAoY29uc3RhbnRzLk9fTk9GT0xMT1cgPz8gMCksIDBvNjAwKTtcbiAgbGV0IGlkZW50aXR5OiBzdHJpbmc7XG4gIGxldCBzaXplOiBudW1iZXI7XG4gIGxldCBuZWVkc05ld2xpbmU6IGJvb2xlYW47IC8vIHRoZSBmaWxlIGVuZHMgd2l0aCBhIHRvcm4gbGluZTogdGhlIGZpcnN0IGVudHJ5IHN0YXJ0cyBhIG5ldyBvbmVcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gZnN0YXRTeW5jKGZkKTtcbiAgICBpZiAoIXN0YXQuaXNGaWxlKCkpIHRocm93IG5ldyBUeXBlRXJyb3IoYGZpbGVTaW5rOiAke2Fic29sdXRlfSBpcyBub3QgYSByZWd1bGFyIGZpbGVgKTtcbiAgICByZWZ1c2VGb3JlaWduKGFic29sdXRlLCBzdGF0KTtcbiAgICBpZGVudGl0eSA9IGAke3N0YXQuZGV2fToke3N0YXQuaW5vfWA7XG4gICAgLy8gT25lIHdyaXRlciBwZXIgZmlsZSwgaW4gdGhpcyBwcm9jZXNzOiBhIHNlY29uZCBzaW5rIHdvdWxkIHBsYWNlIGl0cyBlbnRyaWVzIG92ZXIgdGhlIGZpcnN0J3MuXG4gICAgaWYgKE9QRU5fRklMRVMuaGFzKGlkZW50aXR5KSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgZmlsZVNpbms6ICR7YWJzb2x1dGV9IGFscmVhZHkgaGFzIGFuIG9wZW4gc2luayBpbiB0aGlzIHByb2Nlc3NgKTtcbiAgICBzaXplID0gc3RhdC5zaXplO1xuICAgIG5lZWRzTmV3bGluZSA9IHNpemUgPiAwICYmICFlbmRzV2l0aE5ld2xpbmUoZmQsIHNpemUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNsb3NlU3luYyhmZCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgT1BFTl9GSUxFUy5hZGQoaWRlbnRpdHkpO1xuXG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgbGV0IG5leHQgPSBzaXplOyAvLyB0aGUgb2Zmc2V0IHRoZSBuZXh0IGFjY2VwdGVkIGVudHJ5IGlzIHdyaXR0ZW4gYXQg4oCUIHdoYXQgYG1heEJ5dGVzYCBib3VuZHNcbiAgbGV0IHdyaXR0ZW4gPSBzaXplOyAvLyBieXRlcyBrbm93biBvbiBkaXNrXG4gIGxldCBxdWV1ZWRCeXRlcyA9IDA7IC8vIGFjY2VwdGVkLCBub3QgeWV0IHdyaXR0ZW4gKGluIHRoZSBJL08gcG9vbCdzIGhhbmRzKVxuICBsZXQgaW5GbGlnaHQgPSAwO1xuICBsZXQgc3luY2luZyA9IDA7XG4gIGxldCBmdWxsID0gZmFsc2U7XG4gIGxldCBjbG9zaW5nID0gZmFsc2U7XG4gIGxldCByZWxlYXNlZCA9IGZhbHNlO1xuICBsZXQgZHJhaW5lZDogKCgpID0+IHZvaWQpW10gPSBbXTtcbiAgbGV0IGNsb3NlZFNpZ25hbDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICBjb25zdCB3aGVuUmVsZWFzZWQgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gKGNsb3NlZFNpZ25hbCA9IHJlc29sdmUpKTtcblxuICAvKiogUmVsZWFzZSB0aGUgZmlsZSBvbmNlIG5vdGhpbmcgaXMgaW4gZmxpZ2h0IGFuZCBubyBmc3luYyBpcyBwZW5kaW5nIOKAlCBhc3luY2hyb25vdXNseTsgYW4gZXJyb3IgaXMgaWdub3JlZC4gKi9cbiAgY29uc3QgcmVsZWFzZUlmSWRsZSA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIWNsb3NpbmcgfHwgcmVsZWFzZWQgfHwgaW5GbGlnaHQgPiAwIHx8IHN5bmNpbmcgPiAwKSByZXR1cm47XG4gICAgcmVsZWFzZWQgPSB0cnVlO1xuICAgIE9QRU5fRklMRVMuZGVsZXRlKGlkZW50aXR5KTtcbiAgICBjbG9zZShmZCwgKCkgPT4gY2xvc2VkU2lnbmFsPy4oKSk7XG4gIH07XG5cbiAgLyoqIEV2ZXJ5dGhpbmcgYWNjZXB0ZWQgaXMgd3JpdHRlbjogc3RhcnQgZWFjaCB3YWl0aW5nIGZsdXNoJ3MgZnN5bmMsIHRoZW4gcmVsZWFzZSBpZiBjbG9zaW5nLiAqL1xuICBjb25zdCBzZXR0bGVEcmFpbmVkID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChpbkZsaWdodCA+IDApIHJldHVybjtcbiAgICBjb25zdCB3YWl0aW5nID0gZHJhaW5lZDtcbiAgICBkcmFpbmVkID0gW107XG4gICAgZm9yIChjb25zdCBzdGFydCBvZiB3YWl0aW5nKSBzdGFydCgpO1xuICAgIHJlbGVhc2VJZklkbGUoKTtcbiAgfTtcblxuICAvKiogT25lIGVudHJ5OiByZWZ1c2VkIHdob2xlIHdpdGggYSBuYW1lZCBib3VuZCAodGhlIGxvZyBjb3VudHMgaXQpLCBvciBzdWJtaXR0ZWQg4oCUIG5ldmVyIGluIHBhcnQsIG5ldmVyIGJsb2NraW5nLiAqL1xuICBjb25zdCBlbnF1ZXVlID0gKGVudHJ5OiBSZWNvcmRFbnRyeSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChjbG9zaW5nKSB0aHJvdyBuZXcgRXJyb3IoYGZpbGVTaW5rOiAke2Fic29sdXRlfSBpcyBjbG9zZWRgKTtcbiAgICAvLyBUaGUgY2hlYXAgcmVmdXNhbHMgZmlyc3Q6IGEgZnVsbCBmaWxlIG9yIGEgZnVsbCBxdWV1ZSBjb3N0cyBubyBlbmNvZGluZy5cbiAgICBpZiAoZnVsbCAmJiBlbnRyeS5raW5kICE9PSAnY2xvc2VkJykgdGhyb3cgZmlsZUZ1bGwoYWJzb2x1dGUsIG1heEJ5dGVzLCBlbnRyeS5raW5kKTtcbiAgICAvLyBBIGNsb3NpbmcgZW50cnkgaXMgZXhlbXB0IGZyb20gdGhlIHF1ZXVlIGJvdW5kIChhcyBmcm9tIGBtYXhCeXRlc2AsIHdpdGhpbiBpdHMgcmVzZXJ2ZSk6IGhvdyBhIGxvZyBlbmRlZCBpc1xuICAgIC8vIHRoZSBvbmUgZW50cnkgYSBmdWxsIHF1ZXVlIG11c3Qgbm90IGRyb3AuXG4gICAgY29uc3QgaXNDbG9zaW5nRW50cnkgPSBlbnRyeS5raW5kID09PSAnY2xvc2VkJztcbiAgICBpZiAoIWlzQ2xvc2luZ0VudHJ5ICYmIHF1ZXVlZEJ5dGVzID49IG1heFF1ZXVlZEJ5dGVzKVxuICAgICAgdGhyb3cgcXVldWVGdWxsKGFic29sdXRlLCBxdWV1ZWRCeXRlcywgbWF4UXVldWVkQnl0ZXMsIGVudHJ5LmtpbmQpO1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShlbnRyeSk7IC8vIGFuIGVudHJ5IEpTT04gY2Fubm90IHdyaXRlIChhIEJpZ0ludCwgYSBjeWNsZSkgdGhyb3dzIGhlcmUsIHdob2xlXG4gICAgLy8gQSBzdHJpbmcncyBsZW5ndGggbmV2ZXIgZXhjZWVkcyBpdHMgVVRGLTggc2l6ZTogYW4gZW50cnkgYWxyZWFkeSB0b28gbG9uZyBpcyByZWZ1c2VkIGJlZm9yZSBpdCBpcyBlbmNvZGVkLlxuICAgIGlmIChqc29uLmxlbmd0aCArIDEgPiBtYXhFbnRyeUJ5dGVzKSB0aHJvdyB0b29MYXJnZShhYnNvbHV0ZSwgZW50cnkua2luZCwgbWF4RW50cnlCeXRlcyk7XG4gICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZXIuZW5jb2RlKGAke25lZWRzTmV3bGluZSA/ICdcXG4nIDogJyd9JHtqc29ufVxcbmApO1xuICAgIGlmIChlbmNvZGVkLmxlbmd0aCA+IG1heEVudHJ5Qnl0ZXMgKyAxKSB0aHJvdyB0b29MYXJnZShhYnNvbHV0ZSwgZW50cnkua2luZCwgbWF4RW50cnlCeXRlcyk7XG4gICAgY29uc3QgbGltaXQgPSBlbnRyeS5raW5kID09PSAnY2xvc2VkJyA/IG1heEJ5dGVzICsgQ0xPU0VfUkVTRVJWRV9CWVRFUyA6IG1heEJ5dGVzO1xuICAgIGlmIChuZXh0ICsgZW5jb2RlZC5sZW5ndGggPiBsaW1pdCkge1xuICAgICAgaWYgKGVudHJ5LmtpbmQgIT09ICdjbG9zZWQnKSBmdWxsID0gdHJ1ZTtcbiAgICAgIHRocm93IGZpbGVGdWxsKGFic29sdXRlLCBtYXhCeXRlcywgZW50cnkua2luZCk7XG4gICAgfVxuICAgIGlmICghaXNDbG9zaW5nRW50cnkgJiYgcXVldWVkQnl0ZXMgKyBlbmNvZGVkLmxlbmd0aCA+IG1heFF1ZXVlZEJ5dGVzKSB7XG4gICAgICB0aHJvdyBxdWV1ZUZ1bGwoYWJzb2x1dGUsIHF1ZXVlZEJ5dGVzLCBtYXhRdWV1ZWRCeXRlcywgZW50cnkua2luZCk7XG4gICAgfVxuICAgIG5lZWRzTmV3bGluZSA9IGZhbHNlO1xuICAgIGNvbnN0IGF0ID0gbmV4dDtcbiAgICBuZXh0ICs9IGVuY29kZWQubGVuZ3RoO1xuICAgIHF1ZXVlZEJ5dGVzICs9IGVuY29kZWQubGVuZ3RoO1xuICAgIGluRmxpZ2h0ICs9IDE7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHdyaXRlQXQoZmQsIGVuY29kZWQsIGF0LCAoZXJyb3IsIHdyb3RlKSA9PiB7XG4gICAgICAgIGluRmxpZ2h0IC09IDE7XG4gICAgICAgIHF1ZXVlZEJ5dGVzIC09IGVuY29kZWQubGVuZ3RoO1xuICAgICAgICB3cml0dGVuICs9IHdyb3RlO1xuICAgICAgICAvLyBBIGxpbmUgY3V0IHNob3J0IGxlYXZlcyBhIGhvbGUgdXAgdG8gdGhlIG5leHQgZW50cnkncyBvZmZzZXQ6IHRoZSByZWFkZXIgc3BsaXRzIGF0IGl0IChOVUwpLCBzbyBhIHRvcm5cbiAgICAgICAgLy8gbGluZSBuZXZlciBzd2FsbG93cyB0aGUgZW50cnkgYWZ0ZXIgaXQuXG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgZWxzZSByZXNvbHZlKCk7XG4gICAgICAgIHNldHRsZURyYWluZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGFkYXB0ZXI6IEZpbGVTaW5rID0ge1xuICAgIHBhdGg6IGFic29sdXRlLFxuICAgIGdldCBieXRlcygpIHtcbiAgICAgIHJldHVybiB3cml0dGVuO1xuICAgIH0sXG4gICAgZ2V0IHF1ZXVlZEJ5dGVzKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlZEJ5dGVzO1xuICAgIH0sXG4gICAgZ2V0IGZ1bGwoKSB7XG4gICAgICByZXR1cm4gZnVsbDtcbiAgICB9LFxuICAgIG9wZW5lZDogKHsgYWRkcmVzcywgYXQsIGluaXRpYWxTdGF0ZSwgbWV0YSB9KSA9PlxuICAgICAgZW5xdWV1ZSh7IGtpbmQ6ICdvcGVuZWQnLCBhZGRyZXNzLCBhdCwgaW5pdGlhbFN0YXRlLCAuLi4obWV0YSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG1ldGEgfSkgfSksXG4gICAgY29tbWl0OiAoeyBhZGRyZXNzLCBhdCwgYnVuZGxlIH0pID0+IGVucXVldWUoeyBraW5kOiAnY29tbWl0JywgYWRkcmVzcywgYXQsIGJ1bmRsZSB9KSxcbiAgICBub3RlOiAoeyBhZGRyZXNzLCBhdCwga2luZCwgZGF0YSB9KSA9PiBlbnF1ZXVlKHsga2luZDogJ25vdGUnLCBhZGRyZXNzLCBhdCwgbm90ZToga2luZCwgZGF0YSB9KSxcbiAgICBjbG9zZWQ6ICh7IGFkZHJlc3MsIGF0LCBvdXRjb21lLCBjb21taXRzLCBtZXRhIH0pID0+XG4gICAgICBlbnF1ZXVlKHsga2luZDogJ2Nsb3NlZCcsIGFkZHJlc3MsIGF0LCBvdXRjb21lLCBjb21taXRzLCAuLi4obWV0YSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG1ldGEgfSkgfSksXG4gICAgLy8gRXhwbGljaXQgZmlsZSBjYXBhYmlsaXR5OiBmc3luYyBvZiBhbGwgcHJlY2VkaW5nIGVudHJpZXMuIFRoaXMgaXMgbm90IGFzc3VtZWQgZm9yIG90aGVyIGFkYXB0ZXJzLlxuICAgIGFja25vd2xlZGdlOiBhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICBhd2FpdCBhZGFwdGVyLmZsdXNoISgpO1xuICAgICAgcmV0dXJuIE9iamVjdC5mcmVlemUoeyAuLi50YXJnZXQsIGR1cmFiaWxpdHk6ICdkdXJhYmxlJyB9KTtcbiAgICB9LFxuICAgIGZsdXNoOiAoKSA9PiB7XG4gICAgICBpZiAoY2xvc2luZykgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZmlsZVNpbms6ICR7YWJzb2x1dGV9IGlzIGNsb3NlZGApKTtcbiAgICAgIGNvbnN0IHdvcmsgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGRyYWluZWQucHVzaCgoKSA9PiB7XG4gICAgICAgICAgc3luY2luZyArPSAxO1xuICAgICAgICAgIGZzeW5jKGZkLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICBzeW5jaW5nIC09IDE7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgIHJlbGVhc2VJZklkbGUoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQW5vdGhlciB3cml0ZXIgKGFub3RoZXIgcHJvY2VzcyBvbiB0aGUgc2FtZSBwYXRoKSBncmV3IHRoZSBmaWxlIHBhc3Qgd2hhdCB0aGlzIHNpbmsgcGxhY2VkOiBpdHNcbiAgICAgICAgICAgIC8vIGVudHJpZXMgYW5kIG91cnMgb3ZlcmxhcC4gU2FpZCwgbmV2ZXIgc2lsZW50LlxuICAgICAgICAgICAgZnN0YXQoZmQsIChzdGF0RXJyb3IsIHN0YXQpID0+IHtcbiAgICAgICAgICAgICAgc3luY2luZyAtPSAxO1xuICAgICAgICAgICAgICBpZiAoc3RhdEVycm9yKSByZWplY3Qoc3RhdEVycm9yKTtcbiAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdC5zaXplID4gbmV4dCkge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYGZpbGVTaW5rOiAke2Fic29sdXRlfSB3YXMgd3JpdHRlbiBieSBhbm90aGVyIHdyaXRlciAob25lIHNpbmsgcGVyIGZpbGUpYCkpO1xuICAgICAgICAgICAgICB9IGVsc2UgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICByZWxlYXNlSWZJZGxlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNldHRsZURyYWluZWQoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHdpdGhUaW1lb3V0KFxuICAgICAgICB3b3JrLFxuICAgICAgICBmbHVzaFRpbWVvdXRNcyxcbiAgICAgICAgYGZpbGVTaW5rOiBmbHVzaCgpIG9mICR7YWJzb2x1dGV9IGRpZCBub3QgZmluaXNoIGluICR7Zmx1c2hUaW1lb3V0TXN9bXNgLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGNsb3NlOiAoKSA9PiB7XG4gICAgICBpZiAoIWNsb3NpbmcpIHtcbiAgICAgICAgY2xvc2luZyA9IHRydWU7XG4gICAgICAgIHJlbGVhc2VJZklkbGUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aGVuUmVsZWFzZWQ7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIGFkYXB0ZXI7XG59XG5cbi8qKlxuICogRmlsZXMgYSBzaW5rIG9mIHRoaXMgcHJvY2VzcyBoYXMgb3BlbiwgYnkgZGV2aWNlIGFuZCBpbm9kZSDigJQgb25lIHdyaXRlciBwZXIgZmlsZS4gS2VwdCBvbiB0aGUgZ2xvYmFsIG9iamVjdCwgc29cbiAqIHRoZSBwYWNrYWdlJ3MgQ29tbW9uSlMgYW5kIEVTTSBidWlsZHMgKHR3byBtb2R1bGUgaW5zdGFuY2VzIGluIG9uZSBwcm9jZXNzKSBzaGFyZSBpdC5cbiAqL1xuY29uc3QgT1BFTl9GSUxFUzogU2V0PHN0cmluZz4gPSAoKGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1N5bWJvbC5mb3IoJ2Zvb3RwcmludGpzLmZpbGVTaW5rLm9wZW4nKV0gPz89XG4gIG5ldyBTZXQ8c3RyaW5nPigpKSBhcyBTZXQ8c3RyaW5nPjtcblxuZnVuY3Rpb24gZmlsZUZ1bGwocGF0aDogc3RyaW5nLCBtYXhCeXRlczogbnVtYmVyLCBraW5kOiBzdHJpbmcpOiBSYW5nZUVycm9yIHtcbiAgcmV0dXJuIG5ldyBSYW5nZUVycm9yKGBmaWxlU2luazogJHtwYXRofSBpcyBmdWxsIChtYXhCeXRlcyAke21heEJ5dGVzfSk7IHRoaXMgJHtraW5kfSBlbnRyeSB3YXMgbm90IHdyaXR0ZW5gKTtcbn1cblxuZnVuY3Rpb24gcXVldWVGdWxsKHBhdGg6IHN0cmluZywgcXVldWVkOiBudW1iZXIsIG1heFF1ZXVlZEJ5dGVzOiBudW1iZXIsIGtpbmQ6IHN0cmluZyk6IFJhbmdlRXJyb3Ige1xuICByZXR1cm4gbmV3IFJhbmdlRXJyb3IoXG4gICAgYGZpbGVTaW5rOiAke3BhdGh9IGhhcyAke3F1ZXVlZH0gYnl0ZXMgd2FpdGluZyAobWF4UXVldWVkQnl0ZXMgJHttYXhRdWV1ZWRCeXRlc30pOyB0aGlzICR7a2luZH0gZW50cnkgd2FzIGRyb3BwZWRgLFxuICApO1xufVxuXG4vKiogQSBib3VuZCByZWFkIG9mZiB0aGUgb3B0aW9uczogYWJzZW50IOKGkiB0aGUgZGVmYXVsdDsgZWxzZSBhIHdob2xlIG51bWJlciDiiaUgYG1pbmAsIG9yIGEgUmFuZ2VFcnJvciBuYW1pbmcgaXQuICovXG5mdW5jdGlvbiBib3VuZChuYW1lOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIsIG1pbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxsYmFjaztcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgfHwgdmFsdWUgPCBtaW4pIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgZmlsZVNpbms6ICR7bmFtZX0gbXVzdCBiZSBhIHdob2xlIG51bWJlciwgYXQgbGVhc3QgJHttaW59YCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB0b29MYXJnZShwYXRoOiBzdHJpbmcsIGtpbmQ6IHN0cmluZywgbWF4RW50cnlCeXRlczogbnVtYmVyKTogUmFuZ2VFcnJvciB7XG4gIHJldHVybiBuZXcgUmFuZ2VFcnJvcihcbiAgICBgZmlsZVNpbms6IGEgJHtraW5kfSBlbnRyeSBsYXJnZXIgdGhhbiBtYXhFbnRyeUJ5dGVzICgke21heEVudHJ5Qnl0ZXN9KSB3YXMgbm90IHdyaXR0ZW4gdG8gJHtwYXRofWAsXG4gICk7XG59XG5cbi8qKiBXcml0ZSBhbGwgb2YgYGJ1ZmZlcmAgYXQgYHBvc2l0aW9uYCAoYXN5bmNocm9ub3VzbHksIGFzIG1hbnkgd3JpdGVzIGFzIGl0IHRha2VzKTsgYHdyb3RlYCBpcyBob3cgbXVjaCB3ZW50IG91dC4gKi9cbmZ1bmN0aW9uIHdyaXRlQXQoXG4gIGZkOiBudW1iZXIsXG4gIGJ1ZmZlcjogVWludDhBcnJheSxcbiAgcG9zaXRpb246IG51bWJlcixcbiAgZG9uZTogKGVycm9yOiBFcnJvciB8IG51bGwsIHdyb3RlOiBudW1iZXIpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgY29uc3Qgc3RlcCA9IChvZmZzZXQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIHdyaXRlKGZkLCBidWZmZXIsIG9mZnNldCwgYnVmZmVyLmxlbmd0aCAtIG9mZnNldCwgcG9zaXRpb24gKyBvZmZzZXQsIChlcnJvciwgbikgPT4ge1xuICAgICAgaWYgKGVycm9yKSBkb25lKGVycm9yLCBvZmZzZXQpO1xuICAgICAgZWxzZSBpZiAobiA9PT0gMCkgZG9uZShuZXcgRXJyb3IoJ2ZpbGVTaW5rOiB0aGUgZGlzayB0b29rIG5vIGJ5dGVzJyksIG9mZnNldCk7XG4gICAgICBlbHNlIGlmIChvZmZzZXQgKyBuIDwgYnVmZmVyLmxlbmd0aCkgc3RlcChvZmZzZXQgKyBuKTtcbiAgICAgIGVsc2UgZG9uZShudWxsLCBidWZmZXIubGVuZ3RoKTtcbiAgICB9KTtcbiAgfTtcbiAgc3RlcCgwKTtcbn1cblxuLyoqIGB3b3JrYCwgb3IgYSByZWplY3Rpb24gbmFtaW5nIHRoZSBib3VuZCBvbmNlIGBtc2AgcGFzc2VkIOKAlCB0aGUgd29yayBnb2VzIG9uLCBub2JvZHkgd2FpdHMgZm9yIGl0LiAqL1xuZnVuY3Rpb24gd2l0aFRpbWVvdXQod29yazogUHJvbWlzZTx2b2lkPiwgbXM6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChuZXcgRXJyb3IobWVzc2FnZSkpLCBtcyk7XG4gICAgLy8gQSB0aW1lciB0aGF0IG9ubHkgYm91bmRzIGEgd2FpdCBuZXZlciBrZWVwcyB0aGUgcHJvY2VzcyBhbGl2ZSBvbiBpdHMgb3duLlxuICAgICh0aW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgUHJvbWlzZS5wcm90b3R5cGUudGhlbi5jYWxsKFxuICAgICAgd29yayxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSxcbiAgICAgIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSxcbiAgICApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZWZ1c2UgYSBmaWxlIHNvbWVvbmUgZWxzZSBjb3VsZCByZWFkIG9yIHJld3JpdGUgYmVoaW5kIHRoZSBzaW5rOiBhIGhhcmQgbGluayAoYW5vdGhlciBuYW1lIGZvciB0aGUgc2FtZSBieXRlcyDigJRcbiAqIHRoZSBzaW5rIHdvdWxkIGFwcGVuZCBpbnRvIGl0KSwgYSBmaWxlIG93bmVkIGJ5IGFub3RoZXIgdXNlciwgb3Igb25lIG90aGVycyBtYXkgd3JpdGUuIEEgZmlsZSB0aGUgc2luayBjcmVhdGVzIGlzXG4gKiBgMG82MDBgIGFuZCBwYXNzZXM7IGEgcHJlLWV4aXN0aW5nIG9uZSBtdXN0IGFscmVhZHkgYmUgcHJpdmF0ZSB0byB0aGUgd3JpdGVyLiAoTm90IG9uIFdpbmRvd3MsIHdob3NlIG1vZGVzIGFuZFxuICogb3duZXJzIGRvIG5vdCBtYXA6IHRoZXJlIGBPX05PRk9MTE9XYCBpcyBhYnNlbnQgdG9vIOKAlCB0aGUgZ3VpZGUgbmFtZXMgYm90aC4pXG4gKi9cbmZ1bmN0aW9uIHJlZnVzZUZvcmVpZ24ocGF0aDogc3RyaW5nLCBzdGF0OiB7IHJlYWRvbmx5IG5saW5rOiBudW1iZXI7IHJlYWRvbmx5IHVpZDogbnVtYmVyOyByZWFkb25seSBtb2RlOiBudW1iZXIgfSkge1xuICBpZiAoc3RhdC5ubGluayA+IDEpIHRocm93IG5ldyBUeXBlRXJyb3IoYGZpbGVTaW5rOiAke3BhdGh9IGhhcyBvdGhlciBoYXJkIGxpbmtzIOKAlCByZWZ1c2luZyB0byB3cml0ZSB0aHJvdWdoIG9uZWApO1xuICBjb25zdCB1aWQgPSB0eXBlb2YgZ2V0dWlkID09PSAnZnVuY3Rpb24nID8gZ2V0dWlkKCkgOiB1bmRlZmluZWQ7XG4gIGlmICh1aWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0LnVpZCAhPT0gdWlkKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBmaWxlU2luazogJHtwYXRofSBiZWxvbmdzIHRvIGFub3RoZXIgdXNlcmApO1xuICBpZiAodWlkICE9PSB1bmRlZmluZWQgJiYgKHN0YXQubW9kZSAmIDBvMDIyKSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGZpbGVTaW5rOiAke3BhdGh9IGlzIHdyaXRhYmxlIGJ5IG90aGVycyDigJQgbWFrZSBpdCAwbzYwMCAob3IgcmVtb3ZlIGl0KSBmaXJzdGApO1xuICB9XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBmaWxlJ3MgbGFzdCBieXRlIGlzIGEgbmV3bGluZSDigJQgcmVhZCBvbmNlLCB3aGVuIHRoZSBzaW5rIG9wZW5zIGFuIGV4aXN0aW5nIGZpbGUuICovXG5mdW5jdGlvbiBlbmRzV2l0aE5ld2xpbmUoZmQ6IG51bWJlciwgc2l6ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxhc3QgPSBuZXcgVWludDhBcnJheSgxKTtcbiAgcmV0dXJuIHJlYWRTeW5jKGZkLCBsYXN0LCAwLCAxLCBzaXplIC0gMSkgPT09IDEgJiYgbGFzdFswXSA9PT0gMHgwYTtcbn1cblxuLyoqIEEgcmVjb3JkIGZpbGUgcmVhZCBiYWNrOiBldmVyeSBwYXJzZWQgbGluZSwgYW5kIGV2ZXJ5IGxpbmUgdGhhdCBjb3VsZCBub3QgYmUuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZEZpbGUge1xuICAvKiogVGhlIHBhcnNlZCBlbnRyaWVzLCBpbiBmaWxlIG9yZGVyIOKAlCB1bnRydXN0ZWQgaW5wdXQgZm9yIGByZWFkU3RvcmVkUmVjb3JkYCAoYGZvb3R0cmFjZWApLiAqL1xuICByZWFkb25seSBlbnRyaWVzOiByZWFkb25seSB1bmtub3duW107XG4gIC8qKiBFYWNoIGxpbmUgdGhhdCBpcyBub3QgSlNPTiAoYSB0b3JuIGxhc3QgbGluZSwgYSBjb3JydXB0IG9uZSksIGJ5IGl0cyAxLWJhc2VkIG51bWJlci4gQmxhbmsgbGluZXMgYXJlIHNraXBwZWQuICovXG4gIHJlYWRvbmx5IHVucmVhZGFibGU6IHJlYWRvbmx5IHsgcmVhZG9ubHkgbGluZTogbnVtYmVyOyByZWFkb25seSByZWFzb246IHN0cmluZyB9W107XG59XG5cbi8qKlxuICogUmVhZCBhIHJlY29yZCBmaWxlIGJhY2ssIGxpbmUgYnkgbGluZSDigJQgdGhlIGVudHJpZXMgZm9yIGByZWFkU3RvcmVkUmVjb3JkYCwgYW5kIGV2ZXJ5IGxpbmUgdGhhdCBjb3VsZCBub3QgYmVcbiAqIHJlYWQsIGJ5IG51bWJlciwgbmV2ZXIgYSBmYWlsZWQgcmVhZC4gQSBzdG9yZWQga2V5IG5hbWVkIGBfX3Byb3RvX19gIHN0YXlzIGRhdGEgKGBKU09OLnBhcnNlYCBtYWtlcyBpdCBhbiBvd25cbiAqIHByb3BlcnR5KS4gVGhlIGZpbGUgaXMgdW50cnVzdGVkOiBhIGZpbGUgbGFyZ2VyIHRoYW4gYG1heEJ5dGVzYCAoZGVmYXVsdCAyNTYgTWlCKSBpcyByZWZ1c2VkIGJlZm9yZSBpdCBpcyByZWFkLlxuICpcbiAqIEB0aHJvd3MgUmFuZ2VFcnJvciB3aGVuIHRoZSBmaWxlIGlzIGxhcmdlciB0aGFuIGBtYXhCeXRlc2A7IHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgZXJyb3Igd2hlbiBpdCBjYW5ub3QgYmUgcmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRSZWNvcmRGaWxlKHBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgcmVhZG9ubHkgbWF4Qnl0ZXM/OiBudW1iZXIgfSk6IFJlY29yZEZpbGUge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnIHx8IHBhdGggPT09ICcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWFkUmVjb3JkRmlsZTogcGF0aCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICBjb25zdCBtYXhCeXRlcyA9IGJvdW5kKCdtYXhCeXRlcycsIG9wdGlvbnM/Lm1heEJ5dGVzLCBERUZBVUxUX1JFQURfTUFYX0JZVEVTLCAxKTtcbiAgLy8gT25lIGRlc2NyaXB0b3IgZm9yIHRoZSBjaGVjayBBTkQgdGhlIHJlYWQgKGEgZmlsZSB0aGF0IGdyb3dzIGJldHdlZW4gdGhlbSBpcyBzdGlsbCBib3VuZGVkKTsgYSByZWd1bGFyIGZpbGVcbiAgLy8gb25seSAoYSBGSUZPIHdvdWxkIGJsb2NrLCBhIGRldmljZSBuZXZlciBlbmQpOyBhdCBtb3N0IGBtYXhCeXRlc2AgcmVhZC5cbiAgLy8gT19OT05CTE9DSzogYSBGSUZPIGF0IHRoZSBwYXRoIG11c3Qgbm90IGJsb2NrIHRoZSBvcGVuIGJlZm9yZSB0aGUgcmVndWxhci1maWxlIGNoZWNrIHJlZnVzZXMgaXQuXG4gIGNvbnN0IGZkID0gb3BlblN5bmMocGF0aCwgY29uc3RhbnRzLk9fUkRPTkxZIHwgKGNvbnN0YW50cy5PX05PRk9MTE9XID8/IDApIHwgKGNvbnN0YW50cy5PX05PTkJMT0NLID8/IDApKTtcbiAgbGV0IHJhdzogVWludDhBcnJheTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gZnN0YXRTeW5jKGZkKTtcbiAgICBpZiAoIXN0YXQuaXNGaWxlKCkpIHRocm93IG5ldyBUeXBlRXJyb3IoYHJlYWRSZWNvcmRGaWxlOiAke3BhdGh9IGlzIG5vdCBhIHJlZ3VsYXIgZmlsZWApO1xuICAgIGlmIChzdGF0LnNpemUgPiBtYXhCeXRlcykge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYHJlYWRSZWNvcmRGaWxlOiAke3BhdGh9IGhvbGRzICR7c3RhdC5zaXplfSBieXRlcywgcGFzdCB0aGUgbGltaXQgb2YgJHttYXhCeXRlc31gKTtcbiAgICB9XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5taW4oc3RhdC5zaXplLCBtYXhCeXRlcykgKyAxKTtcbiAgICBsZXQgcmVhZCA9IDA7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgbiA9IHJlYWRTeW5jKGZkLCBidWZmZXIsIHJlYWQsIGJ1ZmZlci5sZW5ndGggLSByZWFkLCByZWFkKTtcbiAgICAgIGlmIChuID09PSAwKSBicmVhaztcbiAgICAgIHJlYWQgKz0gbjtcbiAgICAgIGlmIChyZWFkID09PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGByZWFkUmVjb3JkRmlsZTogJHtwYXRofSBncmV3IHBhc3QgdGhlIGxpbWl0IG9mICR7bWF4Qnl0ZXN9IGJ5dGVzIHdoaWxlIGJlaW5nIHJlYWRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmF3ID0gYnVmZmVyLnN1YmFycmF5KDAsIHJlYWQpO1xuICB9IGZpbmFsbHkge1xuICAgIGNsb3NlU3luYyhmZCk7XG4gIH1cbiAgY29uc3QgdGV4dCA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnKS5kZWNvZGUocmF3KTtcbiAgY29uc3QgZW50cmllczogdW5rbm93bltdID0gW107XG4gIGNvbnN0IHVucmVhZGFibGU6IHsgbGluZTogbnVtYmVyOyByZWFzb246IHN0cmluZyB9W10gPSBbXTtcbiAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIC8vIEEgcnVuIG9mIE5VTCBieXRlcyBpcyBhIGhvbGUgYSBjdXQtc2hvcnQgd3JpdGUgbGVmdCBiZWZvcmUgdGhlIG5leHQgZW50cnkncyBvZmZzZXQ6IGl0IGVuZHMgdGhlIHRvcm4gcGFydCxcbiAgICAvLyBzbyB0aGUgZW50cnkgYWZ0ZXIgaXQgcmVhZHMgb24gaXRzIG93biAodGhlIHNhbWUgbGluZSBudW1iZXIgbmFtZXMgYm90aCBwaWVjZXMpLlxuICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAvLyBBIGhvbGUgaXMgcmVwb3J0ZWQsIG5ldmVyIHNraXBwZWQ6IGJ5dGVzIHRoYXQgbmV2ZXIgcmVhY2hlZCB0aGUgZGlzayBtYXkgYmUgYSB3aG9sZSBlbnRyeSBsb3N0IG1pZC1maWxlLlxuICAgIGlmIChsaW5lLmluY2x1ZGVzKCdcXDAnKSkgdW5yZWFkYWJsZS5wdXNoKHsgbGluZTogaSArIDEsIHJlYXNvbjogJ2EgaG9sZSDigJQgYnl0ZXMgdGhhdCBuZXZlciByZWFjaGVkIHRoZSBkaXNrJyB9KTtcbiAgICBmb3IgKGNvbnN0IHBpZWNlIG9mIGxpbmUuc3BsaXQoL1xcMCsvKSkge1xuICAgICAgaWYgKHBpZWNlLnRyaW0oKSA9PT0gJycpIGNvbnRpbnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW50cmllcy5wdXNoKEpTT04ucGFyc2UocGllY2UpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB1bnJlYWRhYmxlLnB1c2goeyBsaW5lOiBpICsgMSwgcmVhc29uOiAnbm90IEpTT04g4oCUIGEgdG9ybiBvciBjb3JydXB0IGxpbmUnIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBlbnRyaWVzLCB1bnJlYWRhYmxlIH07XG59XG4iXX0=
|
|
394
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZVNpbmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NpbmtzL2ZpbGVTaW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ0c7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUcsT0FBTyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUt0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFMUQsZ0RBQWdEO0FBQ2hELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQzVELGtEQUFrRDtBQUNsRCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqRSxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDbkUsNENBQTRDO0FBQzVDLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLE1BQU0sQ0FBQztBQUN6RCw4R0FBOEc7QUFDOUcsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLHVEQUF1RDtBQUN2RCxNQUFNLHNCQUFzQixHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBMENqRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLElB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QUNuRixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsMkdBQTJHO1FBQzNHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLDRDQUE0QyxFQUFFLENBQUMsQ0FBQztRQUNoSCxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO2dCQUFFLFNBQVM7WUFDbEMsSUFBSSxDQUFDO2dCQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxtQ0FBbUMsRUFBRSxDQUFDLENBQUM7WUFDaEYsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzaW5rcy9maWxlU2luay50cyDigJQgdGhlIHJlY29yZCwgb25lIEpTT04gbGluZSBwZXIgZW50cnksIGluIGEgZmlsZSAoZGVzaWduIMKnMy41LCDCpzQsIHBhY2tldCBQNikuIE5PREUgT05MWTogdGhlXG4gKiBvbmUgZmlsZSBpbiBgc3JjL2AgdGhhdCBpbXBvcnRzIGEgTm9kZSBidWlsdC1pbiwgcmVhY2hhYmxlIG9ubHkgdGhyb3VnaCB0aGUgYGZvb3RwcmludGpzL3NpbmtzYCBkb29yLlxuICpcbiAqIFdIWSBBIEZJTEUsIFdIWSBUSElTIFNIQVBFLiBBIHJ1bidzIHJlY29yZCBtdXN0IG91dGxpdmUgdGhlIHByb2Nlc3MgdGhhdCBtYWRlIGl0IOKAlCBhIGtpbGxlZCBwcm9jZXNzLCBhIGNyYXNoZWRcbiAqIGhvc3QsIGEgc2VydmVybGVzcyBmcmVlemUuIEVhY2ggZW50cnkgdGhlIGxvZyBoYW5kcyBvdmVyIGlzIGVuY29kZWQsIGNoZWNrZWQgYW5kIGdpdmVuIGl0cyBvd24gb2Zmc2V0IGluIHRoZSBmaWxlLFxuICogYW5kIGl0cyB3cml0ZSBpcyBoYW5kZWQgdG8gdGhlIEkvTyBwb29sIEFUIE9OQ0UgKGEgcG9zaXRpb25hbCB3cml0ZSDigJQgbm8gZW50cnkgd2FpdHMgZm9yIHRoZSBldmVudCBsb29wIHRvIHR1cm4pO1xuICogdGhlIHBvb2wncyB0aHJlYWRzIHBlcmZvcm0gdGhlbSB3aGlsZSB0aGUgbWFpbiB0aHJlYWQgcnVucyBvbi4gQSBwcm9jZXNzIGtpbGxlZCBhZnRlciBhIHBvb2wgdGhyZWFkIHdyb3RlIGFuIGVudHJ5XG4gKiBrZWVwcyBpdC4gVW50aWwgdGhlbiBpdCBpcyBub3Qgb24gZGlzazogbWljcm9zZWNvbmRzIG9uIGEgZnJlZSBwb29sLCBidXQgdGhlIHBvb2wgKDQgdGhyZWFkcyBieSBkZWZhdWx0KSBpcyBzaGFyZWRcbiAqIHdpdGggRE5TIGxvb2t1cHMsIHpsaWIsIGNyeXB0byBhbmQgb3RoZXIgZnMgd29yaywgc28gd2hpbGUgaXQgaXMgYnVzeSB0aGUgd2luZG93IGlzIGFzIGxvbmcgYXMgdGhhdCB3b3JrIOKAlCBhbmQgc2luY2VcbiAqIHdyaXRlcyBjb21wbGV0ZSBvdXQgb2Ygb3JkZXIsIGEga2lsbCBjYW4gbG9zZSBhbiBlbnRyeSBpbiB0aGUgbWlkZGxlICh0aGUgcmVhZGVyIHJlcG9ydHMgdGhlIGhvbGUpLiBgZmx1c2goKWAgd2FpdHMgZm9yIGV2ZXJ5IHdyaXRlIGFuZFxuICogYGZzeW5jYHMg4oCUIHRoZSBzdGVwIHRoYXQgYWxzbyBzdXJ2aXZlcyB0aGUgbWFjaGluZSBsb3NpbmcgcG93ZXIsIGFuZCB0aGUgb25lIHRoZSBleGVjdXRvciBhd2FpdHMgYWZ0ZXIgZWFjaCBydW4nc1xuICogY2xvc2luZyBlbnRyeS5cbiAqXG4gKiBUSEUgVEhSRUFUIE1PREVMLCBhcyBjb2RlIOKAlCBldmVyeSByZXNvdXJjZSBib3VuZGVkLCBub3RoaW5nIHRoYXQgY2FuIHN0YWxsIHRoZSBydW46XG4gKiAgIC0gT05MWSBUSEUgUEFUSCBUSEUgQVBQIEdJVkVTLiBSZXNvbHZlZCBvbmNlIGFuZCBvcGVuZWQgb25jZSwgYXQgYGZpbGVTaW5rKHBhdGgpYDsgZXZlcnkgZW50cnkgZ29lcyB0byB0aGF0IG9wZW5cbiAqICAgICBmaWxlLiBBIHN5bWJvbGljIGxpbmsgYXQgdGhlIHBhdGggaXMgcmVmdXNlZCAoYE9fTk9GT0xMT1dgLCB3aGVyZSB0aGUgcGxhdGZvcm0gaGFzIGl0KSwgYW5kIHNvIGlzIGFueXRoaW5nXG4gKiAgICAgdGhhdCBpcyBub3QgYSByZWd1bGFyIGZpbGUsIGEgZmlsZSB3aXRoIGFub3RoZXIgaGFyZCBsaW5rLCBhbm90aGVyIG93bmVyLCBvciBncm91cC93b3JsZCB3cml0ZS4gQSBmaWxlIHRoZVxuICogICAgIHNpbmsgY3JlYXRlcyBpcyBgMG82MDBgLlxuICogICAtIEFUT01JQyBQRVIgRU5UUlkuIEEgbGluZSBpcyBlbmNvZGVkIGluIGZ1bGwgZmlyc3Qg4oCUIGFuIGVudHJ5IEpTT04gY2Fubm90IHdyaXRlIChhIGBCaWdJbnRgLCBhIGN5Y2xlKSBpc1xuICogICAgIHJlZnVzZWQgd2hvbGUg4oCUIHRoZW4gd3JpdHRlbiBhdCBpdHMgb3duIG9mZnNldC4gQSB3cml0ZSB0aGF0IGZhaWxzIHBhcnQtd2F5IGxlYXZlcyBhIGhvbGUgdXAgdG8gdGhlIG5leHRcbiAqICAgICBlbnRyeSdzIG9mZnNldDsgdGhlIHJlYWRlciBzcGxpdHMgYXQgaXQgKE5VTCksIHNvIGEgdG9ybiBsaW5lIG5ldmVyIHN3YWxsb3dzIHRoZSBvbmUgYWZ0ZXIgaXQgKGFuIGV4aXN0aW5nXG4gKiAgICAgZmlsZSB3aXRoIGEgdG9ybiB0YWlsIGdldHMgYSBuZXdsaW5lIGZpcnN0KS5cbiAqICAgLSBCT1VOREVEOiBgbWF4RW50cnlCeXRlc2AgKG9uZSBsaW5lLCA4IE1pQiDigJQgcmVmdXNlZCBieSBuYW1lLCBiZWZvcmUgaXQgaXMgZW5jb2RlZCB3aGVuIGl0cyBsZW5ndGggYWxyZWFkeVxuICogICAgIHNheXMgc28pLCBgbWF4UXVldWVkQnl0ZXNgIChhY2NlcHRlZCwgbm90IHlldCB3cml0dGVuLCAxNiBNaUIg4oCUIHBhc3QgaXQgYW4gZW50cnkgaXMgRFJPUFBFRCBhbmQgY291bnRlZCwgbmV2ZXJcbiAqICAgICBidWZmZXJlZCB3aXRob3V0IGxpbWl0KSwgYG1heEJ5dGVzYCAodGhlIGZpbGUsIDY0IE1pQiDigJQgb25jZSBmdWxsLCBldmVyeSBmdXJ0aGVyIGVudHJ5IGlzIHJlZnVzZWQgYW5kIGNvdW50ZWQ7XG4gKiAgICAgYSBjbG9zaW5nIGVudHJ5IG1heSB1c2UgYSA2NCBLaUIgcmVzZXJ2ZSBzbyBhIGZ1bGwgZmlsZSBjYW4gc3RpbGwgc2F5IGhvdyB0aGUgcnVuIGVuZGVkKSwgYGZsdXNoVGltZW91dE1zYFxuICogICAgICgxMCBzIOKAlCB0aGVuIGBmbHVzaCgpYCByZWplY3RzKS4gRXZlcnkgcmVmdXNhbCB0aHJvd3MgZnJvbSB0aGUgc2luayBtZXRob2QsIHdoaWNoIHRoZSBsb2cgY291bnRzXG4gKiAgICAgKGBnZXRTbmFwc2hvdCgpLnNpbmtgKTsgYSB3cml0ZSB0aGF0IGZhaWxzIGxhdGVyIHJlamVjdHMgdGhhdCBlbnRyeSdzIHByb21pc2UsIGNvdW50ZWQgdGhlIHNhbWUgd2F5LlxuICogICAtIEFTWU5DSFJPTk9VUyBXUklURVMgT05MWS4gTm8gbWV0aG9kIGJsb2NrcyBvbiB0aGUgZGlzazsgdGhlIGZpbGUgaXMgcmVsZWFzZWQgYXN5bmNocm9ub3VzbHksIGFmdGVyIGV2ZXJ5XG4gKiAgICAgd3JpdGUgYW5kIGV2ZXJ5IHN0YXJ0ZWQgZnN5bmMuXG4gKiAgIC0gTk8gU0VDUkVUIE9OIERJU0sgaXMgdGhlIEVYRUNVVE9SJ3MgbGF3LCBhcHBsaWVkIGJlZm9yZSBhbnkgZW50cnkgcmVhY2hlcyBhbiBhZGFwdGVyIChgcnVubmVyL3JlY29yZFNpbmsudHNgKTpcbiAqICAgICB0aGlzIGZpbGUgd3JpdGVzIHdoYXQgaXQgaXMgaGFuZGVkIGFuZCByZWFkcyBub3RoaW5nIGVsc2UuXG4gKiAgIC0gT05FIFdSSVRFUiBQRVIgRklMRS4gQSBzZWNvbmQgc2luayBvbiBhIGZpbGUgdGhpcyBwcm9jZXNzIGhhcyBvcGVuIGlzIHJlZnVzZWQgKGJ5IGRldmljZSBhbmQgaW5vZGUsIGFjcm9zcyB0aGVcbiAqICAgICBDb21tb25KUyBhbmQgRVNNIGJ1aWxkcykuIEFOT1RIRVIgUFJPQ0VTUyB3cml0aW5nIHRoZSBzYW1lIHBhdGggaXMgbm90IHNlZW4gYXQgb3BlbjogZWFjaCB3cml0ZXMgYXQgaXRzIG93blxuICogICAgIG9mZnNldHMgYW5kIHdvdWxkIG92ZXJ3cml0ZSB0aGUgb3RoZXIuIGBmbHVzaCgpYCBjaGVja3MgdGhlIGZpbGUncyBzaXplIGFnYWluc3Qgd2hhdCB0aGlzIHNpbmsgcGxhY2VkIGFuZCByZWplY3RzXG4gKiAgICAgKGEgbG9zcyB0aGUgcnVuIGNvdW50cykgd2hlbiBhbm90aGVyIHdyaXRlcidzIGJ5dGVzIHJlYWNoIHBhc3QgaXQg4oCUIGJlc3QgZWZmb3J0OiBhbiBvdmVyd3JpdGUgdGhpcyBzaW5rJ3Mgb3duXG4gKiAgICAgbGF0ZXIgd3JpdGVzIGNvdmVyIGlzIG5vdCBzZWVuLiBHaXZlIGVhY2ggcHJvY2VzcyBpdHMgb3duIGZpbGUuXG4gKlxuICogV0hBVCBKU09OIEtFRVBTLiBBIGxpbmUgaG9sZHMgd2hhdCBgSlNPTi5zdHJpbmdpZnlgIGtlZXBzOiBhIGBEYXRlYCBiZWNvbWVzIGl0cyBJU08gc3RyaW5nLCBhIGBNYXBgIC8gYFNldGAgYW5cbiAqIGVtcHR5IG9iamVjdCwgYHVuZGVmaW5lZGAgZGlzYXBwZWFycy4gQSByZWNvcmQgb2YgcGxhaW4gSlNPTiB2YWx1ZXMgcmVhZHMgYmFjayBleGFjdGx5IChgcmVhZFJlY29yZEZpbGVgIOKGklxuICogYHJlYWRTdG9yZWRSZWNvcmRgKTsgZm9yIHJpY2hlciB2YWx1ZXMsIGJyaW5nIGFuIGFkYXB0ZXIgd2l0aCBhIHJpY2hlciBlbmNvZGluZy5cbiAqL1xuXG5pbXBvcnQgeyBjbG9zZSwgY2xvc2VTeW5jLCBjb25zdGFudHMsIGZzdGF0LCBmc3RhdFN5bmMsIGZzeW5jLCBvcGVuU3luYywgcmVhZFN5bmMsIHdyaXRlIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyByZXNvbHZlIGFzIHJlc29sdmVQYXRoIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGdldHVpZCB9IGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgUmVjb3JkRW50cnksIFJlY29yZFNpbmsgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IENhcHR1cmVIaXN0b3J5T3B0aW9ucyB9IGZyb20gJy4uL2NhcHR1cmUvaGlzdG9yeVR5cGVzLmpzJztcbmltcG9ydCB7IHNldExvbmdUaW1lb3V0IH0gZnJvbSAnLi4vdGltZXJzL2xvbmdUaW1lb3V0LmpzJztcblxuLyoqIFRoZSBkZWZhdWx0IGNhcCBvbiBhIHJlY29yZCBmaWxlOiA2NCBNaUIuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9GSUxFX1NJTktfTUFYX0JZVEVTID0gNjQgKiAxMDI0ICogMTAyNDtcbi8qKiBUaGUgZGVmYXVsdCBjYXAgb24gT05FIGVudHJ5J3MgbGluZTogOCBNaUIuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9GSUxFX1NJTktfTUFYX0VOVFJZX0JZVEVTID0gOCAqIDEwMjQgKiAxMDI0O1xuLyoqIFRoZSBkZWZhdWx0IGNhcCBvbiBieXRlcyBhY2NlcHRlZCBidXQgbm90IHlldCB3cml0dGVuOiAxNiBNaUIuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9GSUxFX1NJTktfTUFYX1FVRVVFRF9CWVRFUyA9IDE2ICogMTAyNCAqIDEwMjQ7XG4vKiogVGhlIGRlZmF1bHQgYm91bmQgb24gYGZsdXNoKClgOiAxMCBzLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRklMRV9TSU5LX0ZMVVNIX1RJTUVPVVRfTVMgPSAxMF8wMDA7XG4vKiogSG93IGZhciBwYXN0IGBtYXhCeXRlc2AgYSBDTE9TSU5HIGVudHJ5IG1heSBzdGlsbCBnbywgc28gYSBmdWxsIGZpbGUgY2FuIHNheSBob3cgdGhlIHJ1biBlbmRlZDogNjQgS2lCLiAqL1xuY29uc3QgQ0xPU0VfUkVTRVJWRV9CWVRFUyA9IDY0ICogMTAyNDtcbi8qKiBUaGUgZGVmYXVsdCBjYXAgYHJlYWRSZWNvcmRGaWxlYCByZWFkczogMjU2IE1pQi4gKi9cbmNvbnN0IERFRkFVTFRfUkVBRF9NQVhfQllURVMgPSAyNTYgKiAxMDI0ICogMTAyNDtcblxuLyoqIGBmaWxlU2lua2AncyBvcHRpb25zIOKAlCBldmVyeSByZXNvdXJjZSB0aGUgc2luayBjYW4gc3BlbmQsIGJvdW5kZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbW9zdCBieXRlcyB0aGUgZmlsZSBtYXkgaG9sZCAodGhlIGJ5dGVzIGFscmVhZHkgaW4gaXQgY291bnQpLiBPbmNlIGFuIGVudHJ5IHdvdWxkIHBhc3MgaXQsIHRoZSBmaWxlIGlzIEZVTEw6XG4gICAqIHRoYXQgZW50cnkgYW5kIGV2ZXJ5IGxhdGVyIG9uZSBpcyByZWZ1c2VkIGFuZCBjb3VudGVkIGJ5IHRoZSBydW4sIG5ldmVyIHdyaXR0ZW4g4oCUIGV4Y2VwdCBhIGNsb3NpbmcgZW50cnksIHdoaWNoXG4gICAqIG1heSB1c2UgNjQgS2lCIG1vcmUgc28gYSBmdWxsIGZpbGUgY2FuIHN0aWxsIHNheSBob3cgdGhlIHJ1biBlbmRlZC4gRGVmYXVsdCA2NCBNaUIuXG4gICAqL1xuICByZWFkb25seSBtYXhCeXRlcz86IG51bWJlcjtcbiAgLyoqIFRoZSBsYXJnZXN0IE9ORSBlbnRyeSdzIGxpbmUgbWF5IGJlOyBhIGxhcmdlciBlbnRyeSBpcyByZWZ1c2VkIHdob2xlIChgbWF4RW50cnlCeXRlc2AgbmFtZWQpLiBEZWZhdWx0IDggTWlCLiAqL1xuICByZWFkb25seSBtYXhFbnRyeUJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG1vc3QgYnl0ZXMgYWNjZXB0ZWQgYW5kIG5vdCB5ZXQgb24gZGlzay4gV3JpdGVzIGFyZSBhc3luY2hyb25vdXMsIHNvIGEgc2luayBzbG93ZXIgdGhhbiB0aGUgcnVuIHF1ZXVlczsgcGFzdFxuICAgKiB0aGlzIGJvdW5kIGFuIGVudHJ5IGlzIERST1BQRUQgYW5kIGNvdW50ZWQgKG5ldmVyIGJ1ZmZlcmVkIHdpdGhvdXQgbGltaXQsIG5ldmVyIGEgc3RhbGwpLiBEZWZhdWx0IDE2IE1pQi5cbiAgICovXG4gIHJlYWRvbmx5IG1heFF1ZXVlZEJ5dGVzPzogbnVtYmVyO1xuICAvKiogSG93IGxvbmcgYGZsdXNoKClgIChkcmFpbiB0aGUgcXVldWUsIHRoZW4gYGZzeW5jYCkgbWF5IHRha2UgYmVmb3JlIGl0IHJlamVjdHMuIERlZmF1bHQgMTAgcy4gKi9cbiAgcmVhZG9ubHkgZmx1c2hUaW1lb3V0TXM/OiBudW1iZXI7XG59XG5cbi8qKiBBIHJlY29yZCBzaW5rIHRoYXQgYXBwZW5kcyB0byBvbmUgZmlsZSDigJQgYFJlY29yZFNpbmtgIHBsdXMgd2hhdCB0aGUgYXBwIG5lZWRzIHRvIG1hbmFnZSB0aGUgZmlsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVNpbmsgZXh0ZW5kcyBSZWNvcmRTaW5rLCBQaWNrPENhcHR1cmVIaXN0b3J5T3B0aW9ucywgJ2Fja25vd2xlZGdlJz4ge1xuICAvKiogVGhlIGFic29sdXRlIHBhdGggdGhlIHNpbmsgd3JpdGVzIHRvIOKAlCByZXNvbHZlZCBvbmNlLCB3aGVuIGl0IHdhcyBtYWRlLiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBCeXRlcyB0aGlzIHNpbmsga25vd3MgYXJlIG9uIGRpc2s6IHRoZSBmaWxlJ3Mgc2l6ZSB3aGVuIGl0IG9wZW5lZCBwbHVzIGV2ZXJ5IGJ5dGUgaXRzIHdyaXRlcyBjb21wbGV0ZWQg4oCUIGFcbiAgICogcnVubmluZyBzdW0sIG5vdCB0aGUgZmlsZSdzIGVuZCAod3JpdGVzIGNvbXBsZXRlIG91dCBvZiBvcmRlcjsgYSBmYWlsZWQgb25lIGxlYXZlcyBhIGhvbGUpLlxuICAgKi9cbiAgcmVhZG9ubHkgYnl0ZXM6IG51bWJlcjtcbiAgLyoqIEJ5dGVzIGFjY2VwdGVkIGFuZCBub3QgeWV0IHdyaXR0ZW4uICovXG4gIHJlYWRvbmx5IHF1ZXVlZEJ5dGVzOiBudW1iZXI7XG4gIC8qKiBgdHJ1ZWAgb25jZSBhbiBlbnRyeSB3YXMgcmVmdXNlZCBmb3IgYG1heEJ5dGVzYDogdGhlIGZpbGUgaXMgZnVsbCwgYW5kIG9ubHkgYSBjbG9zaW5nIGVudHJ5IG1heSBzdGlsbCBnby4gKi9cbiAgcmVhZG9ubHkgZnVsbDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJlbGVhc2UgdGhlIGZpbGUuIElkZW1wb3RlbnQuIEV2ZXJ5IGVudHJ5IGFmdGVyIGl0IGlzIHJlZnVzZWQgKHRoZSBydW4gY291bnRzIGl0KSwgYW5kIGBmbHVzaCgpYCByZWplY3RzO1xuICAgKiBlbnRyaWVzIGFscmVhZHkgYWNjZXB0ZWQgYXJlIHN0aWxsIHdyaXR0ZW4gKGFuZCBhIGZsdXNoIGFscmVhZHkgc3RhcnRlZCBmaW5pc2hlcyksIHRoZW4gdGhlIGZpbGUgaXMgY2xvc2VkIOKAlFxuICAgKiB0aGUgcHJvbWlzZSBzZXR0bGVzIHRoZW4uXG4gICAqL1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEEgcmVjb3JkIHNpbmsgdGhhdCBhcHBlbmRzIGVhY2ggZW50cnkgdG8gYHBhdGhgIGFzIG9uZSBKU09OIGxpbmUg4oCUIHRoZSBjcmFzaC1zYWZlIHJlY29yZCBvbiBhIE5vZGUgaG9zdC5cbiAqXG4gKiBFdmVyeSBtZXRob2QgcmV0dXJucyBhdCBvbmNlOiB0aGUgbGluZSBpcyBlbmNvZGVkLCBjaGVja2VkIGFnYWluc3QgZXZlcnkgYm91bmQsIGdpdmVuIGl0cyBvZmZzZXQgYW5kIGhhbmRlZCB0b1xuICogdGhlIEkvTyBwb29sLiBUaGUgbWV0aG9kJ3MgcHJvbWlzZSBzZXR0bGVzIHdoZW4gdGhhdCBsaW5lIGlzIHdyaXR0ZW47IGEgd3JpdGUgdGhhdCBmYWlscyByZWplY3RzIGl0LCBhbmQgdGhlIHJ1blxuICogY291bnRzIHRoZSBsb3NzLlxuICpcbiAqIEB0aHJvd3MgVHlwZUVycm9yIHdoZW4gYHBhdGhgIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgZG9lcyBub3QgbmFtZSBhIHJlZ3VsYXIgZmlsZSB0aGUgd3JpdGVyIG93bnMgYWxvbmU7XG4gKiAgIFJhbmdlRXJyb3IgZm9yIGEgYm91bmQgdGhhdCBpcyBub3QgYSB3aG9sZSBudW1iZXIg4omlIDE7IHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgZXJyb3Igd2hlblxuICogICB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkIChhIHN5bWJvbGljIGxpbmsgYXQgYHBhdGhgIGluY2x1ZGVkKS4gTWFkZSBvbmNlLCBhdCBzZXR1cCDigJQgbmV2ZXIgZHVyaW5nIGEgcnVuLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBmaWxlU2luaywgcmVhZFJlY29yZEZpbGUgfSBmcm9tICdmb290cHJpbnRqcy9zaW5rcyc7XG4gKiBpbXBvcnQgeyByZWFkU3RvcmVkUmVjb3JkIH0gZnJvbSAnZm9vdHRyYWNlJztcbiAqXG4gKiBjb25zdCBzaW5rID0gZmlsZVNpbmsoJy92YXIvZm9vdHByaW50L29yZGVycy5qc29ubCcpO1xuICogY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2luayB9KTtcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0IH0pO1xuICogLy8g4oCmbGF0ZXIsIG9yIGFmdGVyIGEgY3Jhc2g6XG4gKiBjb25zdCByZWNvcmQgPSByZWFkU3RvcmVkUmVjb3JkKHJlYWRSZWNvcmRGaWxlKCcvdmFyL2Zvb3RwcmludC9vcmRlcnMuanNvbmwnKS5lbnRyaWVzKTtcbiAqIHJlY29yZC5yb290KHJ1bklkKT8uY29tcGxldGU7IC8vIGZhbHNlIGZvciBhIHJ1biB0aGF0IG5ldmVyIGVuZGVkXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGVTaW5rKHBhdGg6IHN0cmluZywgb3B0aW9ucz86IEZpbGVTaW5rT3B0aW9ucyk6IEZpbGVTaW5rIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJyB8fCBwYXRoID09PSAnJykgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlsZVNpbms6IHBhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgY29uc3QgbWF4Qnl0ZXMgPSBib3VuZCgnbWF4Qnl0ZXMnLCBvcHRpb25zPy5tYXhCeXRlcywgREVGQVVMVF9GSUxFX1NJTktfTUFYX0JZVEVTLCAxKTtcbiAgY29uc3QgbWF4RW50cnlCeXRlcyA9IGJvdW5kKCdtYXhFbnRyeUJ5dGVzJywgb3B0aW9ucz8ubWF4RW50cnlCeXRlcywgREVGQVVMVF9GSUxFX1NJTktfTUFYX0VOVFJZX0JZVEVTLCAxKTtcbiAgY29uc3QgbWF4UXVldWVkQnl0ZXMgPSBib3VuZCgnbWF4UXVldWVkQnl0ZXMnLCBvcHRpb25zPy5tYXhRdWV1ZWRCeXRlcywgREVGQVVMVF9GSUxFX1NJTktfTUFYX1FVRVVFRF9CWVRFUywgMSk7XG4gIGNvbnN0IGZsdXNoVGltZW91dE1zID0gYm91bmQoJ2ZsdXNoVGltZW91dE1zJywgb3B0aW9ucz8uZmx1c2hUaW1lb3V0TXMsIERFRkFVTFRfRklMRV9TSU5LX0ZMVVNIX1RJTUVPVVRfTVMsIDEpO1xuICBjb25zdCBhYnNvbHV0ZSA9IHJlc29sdmVQYXRoKHBhdGgpO1xuICAvLyBOT1QgYE9fQVBQRU5EYDogZWFjaCBlbnRyeSBpcyB3cml0dGVuIGF0IHRoZSBvZmZzZXQgaXQgd2FzIGdpdmVuIHdoZW4gaXQgd2FzIHF1ZXVlZCAoYSBwb3NpdGlvbmFsIHdyaXRlKSwgc29cbiAgLy8gZXZlcnkgZW50cnkgaXMgaGFuZGVkIHRvIHRoZSBJL08gcG9vbCB0aGUgbW9tZW50IGl0IGlzIGFjY2VwdGVkIOKAlCBub25lIHdhaXRzIGZvciB0aGUgZXZlbnQgbG9vcCB0byB0dXJuLlxuICBjb25zdCBmZCA9IG9wZW5TeW5jKGFic29sdXRlLCBjb25zdGFudHMuT19SRFdSIHwgY29uc3RhbnRzLk9fQ1JFQVQgfCAoY29uc3RhbnRzLk9fTk9GT0xMT1cgPz8gMCksIDBvNjAwKTtcbiAgbGV0IGlkZW50aXR5OiBzdHJpbmc7XG4gIGxldCBzaXplOiBudW1iZXI7XG4gIGxldCBuZWVkc05ld2xpbmU6IGJvb2xlYW47IC8vIHRoZSBmaWxlIGVuZHMgd2l0aCBhIHRvcm4gbGluZTogdGhlIGZpcnN0IGVudHJ5IHN0YXJ0cyBhIG5ldyBvbmVcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gZnN0YXRTeW5jKGZkKTtcbiAgICBpZiAoIXN0YXQuaXNGaWxlKCkpIHRocm93IG5ldyBUeXBlRXJyb3IoYGZpbGVTaW5rOiAke2Fic29sdXRlfSBpcyBub3QgYSByZWd1bGFyIGZpbGVgKTtcbiAgICByZWZ1c2VGb3JlaWduKGFic29sdXRlLCBzdGF0KTtcbiAgICBpZGVudGl0eSA9IGAke3N0YXQuZGV2fToke3N0YXQuaW5vfWA7XG4gICAgLy8gT25lIHdyaXRlciBwZXIgZmlsZSwgaW4gdGhpcyBwcm9jZXNzOiBhIHNlY29uZCBzaW5rIHdvdWxkIHBsYWNlIGl0cyBlbnRyaWVzIG92ZXIgdGhlIGZpcnN0J3MuXG4gICAgaWYgKE9QRU5fRklMRVMuaGFzKGlkZW50aXR5KSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgZmlsZVNpbms6ICR7YWJzb2x1dGV9IGFscmVhZHkgaGFzIGFuIG9wZW4gc2luayBpbiB0aGlzIHByb2Nlc3NgKTtcbiAgICBzaXplID0gc3RhdC5zaXplO1xuICAgIG5lZWRzTmV3bGluZSA9IHNpemUgPiAwICYmICFlbmRzV2l0aE5ld2xpbmUoZmQsIHNpemUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNsb3NlU3luYyhmZCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgT1BFTl9GSUxFUy5hZGQoaWRlbnRpdHkpO1xuXG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgbGV0IG5leHQgPSBzaXplOyAvLyB0aGUgb2Zmc2V0IHRoZSBuZXh0IGFjY2VwdGVkIGVudHJ5IGlzIHdyaXR0ZW4gYXQg4oCUIHdoYXQgYG1heEJ5dGVzYCBib3VuZHNcbiAgbGV0IHdyaXR0ZW4gPSBzaXplOyAvLyBieXRlcyBrbm93biBvbiBkaXNrXG4gIGxldCBxdWV1ZWRCeXRlcyA9IDA7IC8vIGFjY2VwdGVkLCBub3QgeWV0IHdyaXR0ZW4gKGluIHRoZSBJL08gcG9vbCdzIGhhbmRzKVxuICBsZXQgaW5GbGlnaHQgPSAwO1xuICBsZXQgc3luY2luZyA9IDA7XG4gIGxldCBmdWxsID0gZmFsc2U7XG4gIGxldCBjbG9zaW5nID0gZmFsc2U7XG4gIGxldCByZWxlYXNlZCA9IGZhbHNlO1xuICBsZXQgZHJhaW5lZDogKCgpID0+IHZvaWQpW10gPSBbXTtcbiAgbGV0IGNsb3NlZFNpZ25hbDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICBjb25zdCB3aGVuUmVsZWFzZWQgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gKGNsb3NlZFNpZ25hbCA9IHJlc29sdmUpKTtcblxuICAvKiogUmVsZWFzZSB0aGUgZmlsZSBvbmNlIG5vdGhpbmcgaXMgaW4gZmxpZ2h0IGFuZCBubyBmc3luYyBpcyBwZW5kaW5nIOKAlCBhc3luY2hyb25vdXNseTsgYW4gZXJyb3IgaXMgaWdub3JlZC4gKi9cbiAgY29uc3QgcmVsZWFzZUlmSWRsZSA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIWNsb3NpbmcgfHwgcmVsZWFzZWQgfHwgaW5GbGlnaHQgPiAwIHx8IHN5bmNpbmcgPiAwKSByZXR1cm47XG4gICAgcmVsZWFzZWQgPSB0cnVlO1xuICAgIE9QRU5fRklMRVMuZGVsZXRlKGlkZW50aXR5KTtcbiAgICBjbG9zZShmZCwgKCkgPT4gY2xvc2VkU2lnbmFsPy4oKSk7XG4gIH07XG5cbiAgLyoqIEV2ZXJ5dGhpbmcgYWNjZXB0ZWQgaXMgd3JpdHRlbjogc3RhcnQgZWFjaCB3YWl0aW5nIGZsdXNoJ3MgZnN5bmMsIHRoZW4gcmVsZWFzZSBpZiBjbG9zaW5nLiAqL1xuICBjb25zdCBzZXR0bGVEcmFpbmVkID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChpbkZsaWdodCA+IDApIHJldHVybjtcbiAgICBjb25zdCB3YWl0aW5nID0gZHJhaW5lZDtcbiAgICBkcmFpbmVkID0gW107XG4gICAgZm9yIChjb25zdCBzdGFydCBvZiB3YWl0aW5nKSBzdGFydCgpO1xuICAgIHJlbGVhc2VJZklkbGUoKTtcbiAgfTtcblxuICAvKiogT25lIGVudHJ5OiByZWZ1c2VkIHdob2xlIHdpdGggYSBuYW1lZCBib3VuZCAodGhlIGxvZyBjb3VudHMgaXQpLCBvciBzdWJtaXR0ZWQg4oCUIG5ldmVyIGluIHBhcnQsIG5ldmVyIGJsb2NraW5nLiAqL1xuICBjb25zdCBlbnF1ZXVlID0gKGVudHJ5OiBSZWNvcmRFbnRyeSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChjbG9zaW5nKSB0aHJvdyBuZXcgRXJyb3IoYGZpbGVTaW5rOiAke2Fic29sdXRlfSBpcyBjbG9zZWRgKTtcbiAgICAvLyBUaGUgY2hlYXAgcmVmdXNhbHMgZmlyc3Q6IGEgZnVsbCBmaWxlIG9yIGEgZnVsbCBxdWV1ZSBjb3N0cyBubyBlbmNvZGluZy5cbiAgICBpZiAoZnVsbCAmJiBlbnRyeS5raW5kICE9PSAnY2xvc2VkJykgdGhyb3cgZmlsZUZ1bGwoYWJzb2x1dGUsIG1heEJ5dGVzLCBlbnRyeS5raW5kKTtcbiAgICAvLyBBIGNsb3NpbmcgZW50cnkgaXMgZXhlbXB0IGZyb20gdGhlIHF1ZXVlIGJvdW5kIChhcyBmcm9tIGBtYXhCeXRlc2AsIHdpdGhpbiBpdHMgcmVzZXJ2ZSk6IGhvdyBhIGxvZyBlbmRlZCBpc1xuICAgIC8vIHRoZSBvbmUgZW50cnkgYSBmdWxsIHF1ZXVlIG11c3Qgbm90IGRyb3AuXG4gICAgY29uc3QgaXNDbG9zaW5nRW50cnkgPSBlbnRyeS5raW5kID09PSAnY2xvc2VkJztcbiAgICBpZiAoIWlzQ2xvc2luZ0VudHJ5ICYmIHF1ZXVlZEJ5dGVzID49IG1heFF1ZXVlZEJ5dGVzKVxuICAgICAgdGhyb3cgcXVldWVGdWxsKGFic29sdXRlLCBxdWV1ZWRCeXRlcywgbWF4UXVldWVkQnl0ZXMsIGVudHJ5LmtpbmQpO1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShlbnRyeSk7IC8vIGFuIGVudHJ5IEpTT04gY2Fubm90IHdyaXRlIChhIEJpZ0ludCwgYSBjeWNsZSkgdGhyb3dzIGhlcmUsIHdob2xlXG4gICAgLy8gQSBzdHJpbmcncyBsZW5ndGggbmV2ZXIgZXhjZWVkcyBpdHMgVVRGLTggc2l6ZTogYW4gZW50cnkgYWxyZWFkeSB0b28gbG9uZyBpcyByZWZ1c2VkIGJlZm9yZSBpdCBpcyBlbmNvZGVkLlxuICAgIGlmIChqc29uLmxlbmd0aCArIDEgPiBtYXhFbnRyeUJ5dGVzKSB0aHJvdyB0b29MYXJnZShhYnNvbHV0ZSwgZW50cnkua2luZCwgbWF4RW50cnlCeXRlcyk7XG4gICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZXIuZW5jb2RlKGAke25lZWRzTmV3bGluZSA/ICdcXG4nIDogJyd9JHtqc29ufVxcbmApO1xuICAgIGlmIChlbmNvZGVkLmxlbmd0aCA+IG1heEVudHJ5Qnl0ZXMgKyAxKSB0aHJvdyB0b29MYXJnZShhYnNvbHV0ZSwgZW50cnkua2luZCwgbWF4RW50cnlCeXRlcyk7XG4gICAgY29uc3QgbGltaXQgPSBlbnRyeS5raW5kID09PSAnY2xvc2VkJyA/IG1heEJ5dGVzICsgQ0xPU0VfUkVTRVJWRV9CWVRFUyA6IG1heEJ5dGVzO1xuICAgIGlmIChuZXh0ICsgZW5jb2RlZC5sZW5ndGggPiBsaW1pdCkge1xuICAgICAgaWYgKGVudHJ5LmtpbmQgIT09ICdjbG9zZWQnKSBmdWxsID0gdHJ1ZTtcbiAgICAgIHRocm93IGZpbGVGdWxsKGFic29sdXRlLCBtYXhCeXRlcywgZW50cnkua2luZCk7XG4gICAgfVxuICAgIGlmICghaXNDbG9zaW5nRW50cnkgJiYgcXVldWVkQnl0ZXMgKyBlbmNvZGVkLmxlbmd0aCA+IG1heFF1ZXVlZEJ5dGVzKSB7XG4gICAgICB0aHJvdyBxdWV1ZUZ1bGwoYWJzb2x1dGUsIHF1ZXVlZEJ5dGVzLCBtYXhRdWV1ZWRCeXRlcywgZW50cnkua2luZCk7XG4gICAgfVxuICAgIG5lZWRzTmV3bGluZSA9IGZhbHNlO1xuICAgIGNvbnN0IGF0ID0gbmV4dDtcbiAgICBuZXh0ICs9IGVuY29kZWQubGVuZ3RoO1xuICAgIHF1ZXVlZEJ5dGVzICs9IGVuY29kZWQubGVuZ3RoO1xuICAgIGluRmxpZ2h0ICs9IDE7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHdyaXRlQXQoZmQsIGVuY29kZWQsIGF0LCAoZXJyb3IsIHdyb3RlKSA9PiB7XG4gICAgICAgIGluRmxpZ2h0IC09IDE7XG4gICAgICAgIHF1ZXVlZEJ5dGVzIC09IGVuY29kZWQubGVuZ3RoO1xuICAgICAgICB3cml0dGVuICs9IHdyb3RlO1xuICAgICAgICAvLyBBIGxpbmUgY3V0IHNob3J0IGxlYXZlcyBhIGhvbGUgdXAgdG8gdGhlIG5leHQgZW50cnkncyBvZmZzZXQ6IHRoZSByZWFkZXIgc3BsaXRzIGF0IGl0IChOVUwpLCBzbyBhIHRvcm5cbiAgICAgICAgLy8gbGluZSBuZXZlciBzd2FsbG93cyB0aGUgZW50cnkgYWZ0ZXIgaXQuXG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgZWxzZSByZXNvbHZlKCk7XG4gICAgICAgIHNldHRsZURyYWluZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGFkYXB0ZXI6IEZpbGVTaW5rID0ge1xuICAgIHBhdGg6IGFic29sdXRlLFxuICAgIGdldCBieXRlcygpIHtcbiAgICAgIHJldHVybiB3cml0dGVuO1xuICAgIH0sXG4gICAgZ2V0IHF1ZXVlZEJ5dGVzKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlZEJ5dGVzO1xuICAgIH0sXG4gICAgZ2V0IGZ1bGwoKSB7XG4gICAgICByZXR1cm4gZnVsbDtcbiAgICB9LFxuICAgIG9wZW5lZDogKHsgYWRkcmVzcywgYXQsIGluaXRpYWxTdGF0ZSwgbWV0YSB9KSA9PlxuICAgICAgZW5xdWV1ZSh7IGtpbmQ6ICdvcGVuZWQnLCBhZGRyZXNzLCBhdCwgaW5pdGlhbFN0YXRlLCAuLi4obWV0YSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG1ldGEgfSkgfSksXG4gICAgY29tbWl0OiAoeyBhZGRyZXNzLCBhdCwgYnVuZGxlIH0pID0+IGVucXVldWUoeyBraW5kOiAnY29tbWl0JywgYWRkcmVzcywgYXQsIGJ1bmRsZSB9KSxcbiAgICBub3RlOiAoeyBhZGRyZXNzLCBhdCwga2luZCwgZGF0YSB9KSA9PiBlbnF1ZXVlKHsga2luZDogJ25vdGUnLCBhZGRyZXNzLCBhdCwgbm90ZToga2luZCwgZGF0YSB9KSxcbiAgICBjbG9zZWQ6ICh7IGFkZHJlc3MsIGF0LCBvdXRjb21lLCBjb21taXRzLCBtZXRhIH0pID0+XG4gICAgICBlbnF1ZXVlKHsga2luZDogJ2Nsb3NlZCcsIGFkZHJlc3MsIGF0LCBvdXRjb21lLCBjb21taXRzLCAuLi4obWV0YSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG1ldGEgfSkgfSksXG4gICAgLy8gRXhwbGljaXQgZmlsZSBjYXBhYmlsaXR5OiBmc3luYyBvZiBhbGwgcHJlY2VkaW5nIGVudHJpZXMuIFRoaXMgaXMgbm90IGFzc3VtZWQgZm9yIG90aGVyIGFkYXB0ZXJzLlxuICAgIGFja25vd2xlZGdlOiBhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICBhd2FpdCBhZGFwdGVyLmZsdXNoISgpO1xuICAgICAgcmV0dXJuIE9iamVjdC5mcmVlemUoeyAuLi50YXJnZXQsIGR1cmFiaWxpdHk6ICdkdXJhYmxlJyB9KTtcbiAgICB9LFxuICAgIGZsdXNoOiAoKSA9PiB7XG4gICAgICBpZiAoY2xvc2luZykgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZmlsZVNpbms6ICR7YWJzb2x1dGV9IGlzIGNsb3NlZGApKTtcbiAgICAgIGNvbnN0IHdvcmsgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGRyYWluZWQucHVzaCgoKSA9PiB7XG4gICAgICAgICAgc3luY2luZyArPSAxO1xuICAgICAgICAgIGZzeW5jKGZkLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICBzeW5jaW5nIC09IDE7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgIHJlbGVhc2VJZklkbGUoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQW5vdGhlciB3cml0ZXIgKGFub3RoZXIgcHJvY2VzcyBvbiB0aGUgc2FtZSBwYXRoKSBncmV3IHRoZSBmaWxlIHBhc3Qgd2hhdCB0aGlzIHNpbmsgcGxhY2VkOiBpdHNcbiAgICAgICAgICAgIC8vIGVudHJpZXMgYW5kIG91cnMgb3ZlcmxhcC4gU2FpZCwgbmV2ZXIgc2lsZW50LlxuICAgICAgICAgICAgZnN0YXQoZmQsIChzdGF0RXJyb3IsIHN0YXQpID0+IHtcbiAgICAgICAgICAgICAgc3luY2luZyAtPSAxO1xuICAgICAgICAgICAgICBpZiAoc3RhdEVycm9yKSByZWplY3Qoc3RhdEVycm9yKTtcbiAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdC5zaXplID4gbmV4dCkge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYGZpbGVTaW5rOiAke2Fic29sdXRlfSB3YXMgd3JpdHRlbiBieSBhbm90aGVyIHdyaXRlciAob25lIHNpbmsgcGVyIGZpbGUpYCkpO1xuICAgICAgICAgICAgICB9IGVsc2UgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICByZWxlYXNlSWZJZGxlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNldHRsZURyYWluZWQoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHdpdGhUaW1lb3V0KFxuICAgICAgICB3b3JrLFxuICAgICAgICBmbHVzaFRpbWVvdXRNcyxcbiAgICAgICAgYGZpbGVTaW5rOiBmbHVzaCgpIG9mICR7YWJzb2x1dGV9IGRpZCBub3QgZmluaXNoIGluICR7Zmx1c2hUaW1lb3V0TXN9bXNgLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGNsb3NlOiAoKSA9PiB7XG4gICAgICBpZiAoIWNsb3NpbmcpIHtcbiAgICAgICAgY2xvc2luZyA9IHRydWU7XG4gICAgICAgIHJlbGVhc2VJZklkbGUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aGVuUmVsZWFzZWQ7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIGFkYXB0ZXI7XG59XG5cbi8qKlxuICogRmlsZXMgYSBzaW5rIG9mIHRoaXMgcHJvY2VzcyBoYXMgb3BlbiwgYnkgZGV2aWNlIGFuZCBpbm9kZSDigJQgb25lIHdyaXRlciBwZXIgZmlsZS4gS2VwdCBvbiB0aGUgZ2xvYmFsIG9iamVjdCwgc29cbiAqIHRoZSBwYWNrYWdlJ3MgQ29tbW9uSlMgYW5kIEVTTSBidWlsZHMgKHR3byBtb2R1bGUgaW5zdGFuY2VzIGluIG9uZSBwcm9jZXNzKSBzaGFyZSBpdC5cbiAqL1xuY29uc3QgT1BFTl9GSUxFUzogU2V0PHN0cmluZz4gPSAoKGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1N5bWJvbC5mb3IoJ2Zvb3RwcmludGpzLmZpbGVTaW5rLm9wZW4nKV0gPz89XG4gIG5ldyBTZXQ8c3RyaW5nPigpKSBhcyBTZXQ8c3RyaW5nPjtcblxuZnVuY3Rpb24gZmlsZUZ1bGwocGF0aDogc3RyaW5nLCBtYXhCeXRlczogbnVtYmVyLCBraW5kOiBzdHJpbmcpOiBSYW5nZUVycm9yIHtcbiAgcmV0dXJuIG5ldyBSYW5nZUVycm9yKGBmaWxlU2luazogJHtwYXRofSBpcyBmdWxsIChtYXhCeXRlcyAke21heEJ5dGVzfSk7IHRoaXMgJHtraW5kfSBlbnRyeSB3YXMgbm90IHdyaXR0ZW5gKTtcbn1cblxuZnVuY3Rpb24gcXVldWVGdWxsKHBhdGg6IHN0cmluZywgcXVldWVkOiBudW1iZXIsIG1heFF1ZXVlZEJ5dGVzOiBudW1iZXIsIGtpbmQ6IHN0cmluZyk6IFJhbmdlRXJyb3Ige1xuICByZXR1cm4gbmV3IFJhbmdlRXJyb3IoXG4gICAgYGZpbGVTaW5rOiAke3BhdGh9IGhhcyAke3F1ZXVlZH0gYnl0ZXMgd2FpdGluZyAobWF4UXVldWVkQnl0ZXMgJHttYXhRdWV1ZWRCeXRlc30pOyB0aGlzICR7a2luZH0gZW50cnkgd2FzIGRyb3BwZWRgLFxuICApO1xufVxuXG4vKiogQSBib3VuZCByZWFkIG9mZiB0aGUgb3B0aW9uczogYWJzZW50IOKGkiB0aGUgZGVmYXVsdDsgZWxzZSBhIHdob2xlIG51bWJlciDiiaUgYG1pbmAsIG9yIGEgUmFuZ2VFcnJvciBuYW1pbmcgaXQuICovXG5mdW5jdGlvbiBib3VuZChuYW1lOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIsIG1pbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxsYmFjaztcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgfHwgdmFsdWUgPCBtaW4pIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgZmlsZVNpbms6ICR7bmFtZX0gbXVzdCBiZSBhIHdob2xlIG51bWJlciwgYXQgbGVhc3QgJHttaW59YCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB0b29MYXJnZShwYXRoOiBzdHJpbmcsIGtpbmQ6IHN0cmluZywgbWF4RW50cnlCeXRlczogbnVtYmVyKTogUmFuZ2VFcnJvciB7XG4gIHJldHVybiBuZXcgUmFuZ2VFcnJvcihcbiAgICBgZmlsZVNpbms6IGEgJHtraW5kfSBlbnRyeSBsYXJnZXIgdGhhbiBtYXhFbnRyeUJ5dGVzICgke21heEVudHJ5Qnl0ZXN9KSB3YXMgbm90IHdyaXR0ZW4gdG8gJHtwYXRofWAsXG4gICk7XG59XG5cbi8qKiBXcml0ZSBhbGwgb2YgYGJ1ZmZlcmAgYXQgYHBvc2l0aW9uYCAoYXN5bmNocm9ub3VzbHksIGFzIG1hbnkgd3JpdGVzIGFzIGl0IHRha2VzKTsgYHdyb3RlYCBpcyBob3cgbXVjaCB3ZW50IG91dC4gKi9cbmZ1bmN0aW9uIHdyaXRlQXQoXG4gIGZkOiBudW1iZXIsXG4gIGJ1ZmZlcjogVWludDhBcnJheSxcbiAgcG9zaXRpb246IG51bWJlcixcbiAgZG9uZTogKGVycm9yOiBFcnJvciB8IG51bGwsIHdyb3RlOiBudW1iZXIpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgY29uc3Qgc3RlcCA9IChvZmZzZXQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIHdyaXRlKGZkLCBidWZmZXIsIG9mZnNldCwgYnVmZmVyLmxlbmd0aCAtIG9mZnNldCwgcG9zaXRpb24gKyBvZmZzZXQsIChlcnJvciwgbikgPT4ge1xuICAgICAgaWYgKGVycm9yKSBkb25lKGVycm9yLCBvZmZzZXQpO1xuICAgICAgZWxzZSBpZiAobiA9PT0gMCkgZG9uZShuZXcgRXJyb3IoJ2ZpbGVTaW5rOiB0aGUgZGlzayB0b29rIG5vIGJ5dGVzJyksIG9mZnNldCk7XG4gICAgICBlbHNlIGlmIChvZmZzZXQgKyBuIDwgYnVmZmVyLmxlbmd0aCkgc3RlcChvZmZzZXQgKyBuKTtcbiAgICAgIGVsc2UgZG9uZShudWxsLCBidWZmZXIubGVuZ3RoKTtcbiAgICB9KTtcbiAgfTtcbiAgc3RlcCgwKTtcbn1cblxuLyoqIGB3b3JrYCwgb3IgYSByZWplY3Rpb24gbmFtaW5nIHRoZSBib3VuZCBvbmNlIGBtc2AgcGFzc2VkIOKAlCB0aGUgd29yayBnb2VzIG9uLCBub2JvZHkgd2FpdHMgZm9yIGl0LiAqL1xuZnVuY3Rpb24gd2l0aFRpbWVvdXQod29yazogUHJvbWlzZTx2b2lkPiwgbXM6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gVGhlIG9uZSBsb25nLXRpbWVyIGxhdyAoYHRpbWVycy9sb25nVGltZW91dC50c2ApOiBhIGJvdW5kIHBhc3QgMl4zMSDiiJIgMSBtcyBpcyB3YWl0ZWQgaW4gZnVsbCwgbmV2ZXIgMSBtcy5cbiAgICAvLyBBIHRpbWVyIHRoYXQgb25seSBib3VuZHMgYSB3YWl0IG5ldmVyIGtlZXBzIHRoZSBwcm9jZXNzIGFsaXZlIG9uIGl0cyBvd24gKGB1bnJlZmApLlxuICAgIGNvbnN0IGNhbmNlbCA9IHNldExvbmdUaW1lb3V0KCgpID0+IHJlamVjdChuZXcgRXJyb3IobWVzc2FnZSkpLCBtcywgeyB1bnJlZjogdHJ1ZSB9KTtcbiAgICBQcm9taXNlLnByb3RvdHlwZS50aGVuLmNhbGwoXG4gICAgICB3b3JrLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSxcbiAgICAgIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVmdXNlIGEgZmlsZSBzb21lb25lIGVsc2UgY291bGQgcmVhZCBvciByZXdyaXRlIGJlaGluZCB0aGUgc2luazogYSBoYXJkIGxpbmsgKGFub3RoZXIgbmFtZSBmb3IgdGhlIHNhbWUgYnl0ZXMg4oCUXG4gKiB0aGUgc2luayB3b3VsZCBhcHBlbmQgaW50byBpdCksIGEgZmlsZSBvd25lZCBieSBhbm90aGVyIHVzZXIsIG9yIG9uZSBvdGhlcnMgbWF5IHdyaXRlLiBBIGZpbGUgdGhlIHNpbmsgY3JlYXRlcyBpc1xuICogYDBvNjAwYCBhbmQgcGFzc2VzOyBhIHByZS1leGlzdGluZyBvbmUgbXVzdCBhbHJlYWR5IGJlIHByaXZhdGUgdG8gdGhlIHdyaXRlci4gKE5vdCBvbiBXaW5kb3dzLCB3aG9zZSBtb2RlcyBhbmRcbiAqIG93bmVycyBkbyBub3QgbWFwOiB0aGVyZSBgT19OT0ZPTExPV2AgaXMgYWJzZW50IHRvbyDigJQgdGhlIGd1aWRlIG5hbWVzIGJvdGguKVxuICovXG5mdW5jdGlvbiByZWZ1c2VGb3JlaWduKHBhdGg6IHN0cmluZywgc3RhdDogeyByZWFkb25seSBubGluazogbnVtYmVyOyByZWFkb25seSB1aWQ6IG51bWJlcjsgcmVhZG9ubHkgbW9kZTogbnVtYmVyIH0pIHtcbiAgaWYgKHN0YXQubmxpbmsgPiAxKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBmaWxlU2luazogJHtwYXRofSBoYXMgb3RoZXIgaGFyZCBsaW5rcyDigJQgcmVmdXNpbmcgdG8gd3JpdGUgdGhyb3VnaCBvbmVgKTtcbiAgY29uc3QgdWlkID0gdHlwZW9mIGdldHVpZCA9PT0gJ2Z1bmN0aW9uJyA/IGdldHVpZCgpIDogdW5kZWZpbmVkO1xuICBpZiAodWlkICE9PSB1bmRlZmluZWQgJiYgc3RhdC51aWQgIT09IHVpZCkgdGhyb3cgbmV3IFR5cGVFcnJvcihgZmlsZVNpbms6ICR7cGF0aH0gYmVsb25ncyB0byBhbm90aGVyIHVzZXJgKTtcbiAgaWYgKHVpZCAhPT0gdW5kZWZpbmVkICYmIChzdGF0Lm1vZGUgJiAwbzAyMikgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBmaWxlU2luazogJHtwYXRofSBpcyB3cml0YWJsZSBieSBvdGhlcnMg4oCUIG1ha2UgaXQgMG82MDAgKG9yIHJlbW92ZSBpdCkgZmlyc3RgKTtcbiAgfVxufVxuXG4vKiogV2hldGhlciB0aGUgZmlsZSdzIGxhc3QgYnl0ZSBpcyBhIG5ld2xpbmUg4oCUIHJlYWQgb25jZSwgd2hlbiB0aGUgc2luayBvcGVucyBhbiBleGlzdGluZyBmaWxlLiAqL1xuZnVuY3Rpb24gZW5kc1dpdGhOZXdsaW5lKGZkOiBudW1iZXIsIHNpemU6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBsYXN0ID0gbmV3IFVpbnQ4QXJyYXkoMSk7XG4gIHJldHVybiByZWFkU3luYyhmZCwgbGFzdCwgMCwgMSwgc2l6ZSAtIDEpID09PSAxICYmIGxhc3RbMF0gPT09IDB4MGE7XG59XG5cbi8qKiBBIHJlY29yZCBmaWxlIHJlYWQgYmFjazogZXZlcnkgcGFyc2VkIGxpbmUsIGFuZCBldmVyeSBsaW5lIHRoYXQgY291bGQgbm90IGJlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRGaWxlIHtcbiAgLyoqIFRoZSBwYXJzZWQgZW50cmllcywgaW4gZmlsZSBvcmRlciDigJQgdW50cnVzdGVkIGlucHV0IGZvciBgcmVhZFN0b3JlZFJlY29yZGAgKGBmb290dHJhY2VgKS4gKi9cbiAgcmVhZG9ubHkgZW50cmllczogcmVhZG9ubHkgdW5rbm93bltdO1xuICAvKiogRWFjaCBsaW5lIHRoYXQgaXMgbm90IEpTT04gKGEgdG9ybiBsYXN0IGxpbmUsIGEgY29ycnVwdCBvbmUpLCBieSBpdHMgMS1iYXNlZCBudW1iZXIuIEJsYW5rIGxpbmVzIGFyZSBza2lwcGVkLiAqL1xuICByZWFkb25seSB1bnJlYWRhYmxlOiByZWFkb25seSB7IHJlYWRvbmx5IGxpbmU6IG51bWJlcjsgcmVhZG9ubHkgcmVhc29uOiBzdHJpbmcgfVtdO1xufVxuXG4vKipcbiAqIFJlYWQgYSByZWNvcmQgZmlsZSBiYWNrLCBsaW5lIGJ5IGxpbmUg4oCUIHRoZSBlbnRyaWVzIGZvciBgcmVhZFN0b3JlZFJlY29yZGAsIGFuZCBldmVyeSBsaW5lIHRoYXQgY291bGQgbm90IGJlXG4gKiByZWFkLCBieSBudW1iZXIsIG5ldmVyIGEgZmFpbGVkIHJlYWQuIEEgc3RvcmVkIGtleSBuYW1lZCBgX19wcm90b19fYCBzdGF5cyBkYXRhIChgSlNPTi5wYXJzZWAgbWFrZXMgaXQgYW4gb3duXG4gKiBwcm9wZXJ0eSkuIFRoZSBmaWxlIGlzIHVudHJ1c3RlZDogYSBmaWxlIGxhcmdlciB0aGFuIGBtYXhCeXRlc2AgKGRlZmF1bHQgMjU2IE1pQikgaXMgcmVmdXNlZCBiZWZvcmUgaXQgaXMgcmVhZC5cbiAqXG4gKiBAdGhyb3dzIFJhbmdlRXJyb3Igd2hlbiB0aGUgZmlsZSBpcyBsYXJnZXIgdGhhbiBgbWF4Qnl0ZXNgOyB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIGVycm9yIHdoZW4gaXQgY2Fubm90IGJlIHJlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkUmVjb3JkRmlsZShwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG1heEJ5dGVzPzogbnVtYmVyIH0pOiBSZWNvcmRGaWxlIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJyB8fCBwYXRoID09PSAnJykgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVhZFJlY29yZEZpbGU6IHBhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgY29uc3QgbWF4Qnl0ZXMgPSBib3VuZCgnbWF4Qnl0ZXMnLCBvcHRpb25zPy5tYXhCeXRlcywgREVGQVVMVF9SRUFEX01BWF9CWVRFUywgMSk7XG4gIC8vIE9uZSBkZXNjcmlwdG9yIGZvciB0aGUgY2hlY2sgQU5EIHRoZSByZWFkIChhIGZpbGUgdGhhdCBncm93cyBiZXR3ZWVuIHRoZW0gaXMgc3RpbGwgYm91bmRlZCk7IGEgcmVndWxhciBmaWxlXG4gIC8vIG9ubHkgKGEgRklGTyB3b3VsZCBibG9jaywgYSBkZXZpY2UgbmV2ZXIgZW5kKTsgYXQgbW9zdCBgbWF4Qnl0ZXNgIHJlYWQuXG4gIC8vIE9fTk9OQkxPQ0s6IGEgRklGTyBhdCB0aGUgcGF0aCBtdXN0IG5vdCBibG9jayB0aGUgb3BlbiBiZWZvcmUgdGhlIHJlZ3VsYXItZmlsZSBjaGVjayByZWZ1c2VzIGl0LlxuICBjb25zdCBmZCA9IG9wZW5TeW5jKHBhdGgsIGNvbnN0YW50cy5PX1JET05MWSB8IChjb25zdGFudHMuT19OT0ZPTExPVyA/PyAwKSB8IChjb25zdGFudHMuT19OT05CTE9DSyA/PyAwKSk7XG4gIGxldCByYXc6IFVpbnQ4QXJyYXk7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGZzdGF0U3luYyhmZCk7XG4gICAgaWYgKCFzdGF0LmlzRmlsZSgpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGByZWFkUmVjb3JkRmlsZTogJHtwYXRofSBpcyBub3QgYSByZWd1bGFyIGZpbGVgKTtcbiAgICBpZiAoc3RhdC5zaXplID4gbWF4Qnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGByZWFkUmVjb3JkRmlsZTogJHtwYXRofSBob2xkcyAke3N0YXQuc2l6ZX0gYnl0ZXMsIHBhc3QgdGhlIGxpbWl0IG9mICR7bWF4Qnl0ZXN9YCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KE1hdGgubWluKHN0YXQuc2l6ZSwgbWF4Qnl0ZXMpICsgMSk7XG4gICAgbGV0IHJlYWQgPSAwO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IG4gPSByZWFkU3luYyhmZCwgYnVmZmVyLCByZWFkLCBidWZmZXIubGVuZ3RoIC0gcmVhZCwgcmVhZCk7XG4gICAgICBpZiAobiA9PT0gMCkgYnJlYWs7XG4gICAgICByZWFkICs9IG47XG4gICAgICBpZiAocmVhZCA9PT0gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgcmVhZFJlY29yZEZpbGU6ICR7cGF0aH0gZ3JldyBwYXN0IHRoZSBsaW1pdCBvZiAke21heEJ5dGVzfSBieXRlcyB3aGlsZSBiZWluZyByZWFkYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJhdyA9IGJ1ZmZlci5zdWJhcnJheSgwLCByZWFkKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbG9zZVN5bmMoZmQpO1xuICB9XG4gIGNvbnN0IHRleHQgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi04JykuZGVjb2RlKHJhdyk7XG4gIGNvbnN0IGVudHJpZXM6IHVua25vd25bXSA9IFtdO1xuICBjb25zdCB1bnJlYWRhYmxlOiB7IGxpbmU6IG51bWJlcjsgcmVhc29uOiBzdHJpbmcgfVtdID0gW107XG4gIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBBIHJ1biBvZiBOVUwgYnl0ZXMgaXMgYSBob2xlIGEgY3V0LXNob3J0IHdyaXRlIGxlZnQgYmVmb3JlIHRoZSBuZXh0IGVudHJ5J3Mgb2Zmc2V0OiBpdCBlbmRzIHRoZSB0b3JuIHBhcnQsXG4gICAgLy8gc28gdGhlIGVudHJ5IGFmdGVyIGl0IHJlYWRzIG9uIGl0cyBvd24gKHRoZSBzYW1lIGxpbmUgbnVtYmVyIG5hbWVzIGJvdGggcGllY2VzKS5cbiAgICBjb25zdCBsaW5lID0gbGluZXNbaV07XG4gICAgLy8gQSBob2xlIGlzIHJlcG9ydGVkLCBuZXZlciBza2lwcGVkOiBieXRlcyB0aGF0IG5ldmVyIHJlYWNoZWQgdGhlIGRpc2sgbWF5IGJlIGEgd2hvbGUgZW50cnkgbG9zdCBtaWQtZmlsZS5cbiAgICBpZiAobGluZS5pbmNsdWRlcygnXFwwJykpIHVucmVhZGFibGUucHVzaCh7IGxpbmU6IGkgKyAxLCByZWFzb246ICdhIGhvbGUg4oCUIGJ5dGVzIHRoYXQgbmV2ZXIgcmVhY2hlZCB0aGUgZGlzaycgfSk7XG4gICAgZm9yIChjb25zdCBwaWVjZSBvZiBsaW5lLnNwbGl0KC9cXDArLykpIHtcbiAgICAgIGlmIChwaWVjZS50cmltKCkgPT09ICcnKSBjb250aW51ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVudHJpZXMucHVzaChKU09OLnBhcnNlKHBpZWNlKSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdW5yZWFkYWJsZS5wdXNoKHsgbGluZTogaSArIDEsIHJlYXNvbjogJ25vdCBKU09OIOKAlCBhIHRvcm4gb3IgY29ycnVwdCBsaW5lJyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgZW50cmllcywgdW5yZWFkYWJsZSB9O1xufVxuIl19
|