@pipeline-builder/api-core 5.2.8 → 5.2.9
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/lib/services/scheduler.d.ts +20 -0
- package/lib/services/scheduler.js +33 -1
- package/package.json +1 -1
|
@@ -49,6 +49,26 @@ export interface Scheduler {
|
|
|
49
49
|
*/
|
|
50
50
|
stop(): void;
|
|
51
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Liveness gauges every scheduler publishes, labelled `{key}` (the lock key, or
|
|
54
|
+
* the scheduler's name when it has no lock). Together they let ONE alert rule
|
|
55
|
+
* cover every job at its own cadence — the interval is published rather than
|
|
56
|
+
* written into the rule, so a job whose interval an operator overrides through
|
|
57
|
+
* the environment is judged against the interval it actually runs at.
|
|
58
|
+
*
|
|
59
|
+
* - `scheduler_interval_seconds` — the configured interval, set on `start()`.
|
|
60
|
+
* - `scheduler_started_timestamp_seconds` — when `start()` ran, so a job that
|
|
61
|
+
* started but has NEVER succeeded on any pod still has something to age.
|
|
62
|
+
* - `scheduler_last_success_timestamp_seconds` — the end of the last cycle that
|
|
63
|
+
* actually ran the job and returned without throwing. Only the pod that held
|
|
64
|
+
* the lock publishes it; a contended or unavailable lock is not a success.
|
|
65
|
+
*
|
|
66
|
+
* The values live in process memory, so a restart drops the last success until
|
|
67
|
+
* the next cycle republishes it. Most jobs run on start, so the gap is minutes.
|
|
68
|
+
*/
|
|
69
|
+
export declare const SCHEDULER_INTERVAL_METRIC = "scheduler_interval_seconds";
|
|
70
|
+
export declare const SCHEDULER_STARTED_METRIC = "scheduler_started_timestamp_seconds";
|
|
71
|
+
export declare const SCHEDULER_LAST_SUCCESS_METRIC = "scheduler_last_success_timestamp_seconds";
|
|
52
72
|
/**
|
|
53
73
|
* A periodic background job: a single unref'd `setInterval` with start-once
|
|
54
74
|
* semantics, error isolation (a throwing cycle is logged, never crashes the
|
|
@@ -2,7 +2,28 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { acquireSharedEnvLock, releaseSharedEnvLock, withLeaderLock } from './leader-lock.js';
|
|
4
4
|
import { createLogger } from '../utils/logger.js';
|
|
5
|
+
import { emitGauge } from '../utils/metric-emitter.js';
|
|
5
6
|
import { errorMessage } from '../utils/response.js';
|
|
7
|
+
/**
|
|
8
|
+
* Liveness gauges every scheduler publishes, labelled `{key}` (the lock key, or
|
|
9
|
+
* the scheduler's name when it has no lock). Together they let ONE alert rule
|
|
10
|
+
* cover every job at its own cadence — the interval is published rather than
|
|
11
|
+
* written into the rule, so a job whose interval an operator overrides through
|
|
12
|
+
* the environment is judged against the interval it actually runs at.
|
|
13
|
+
*
|
|
14
|
+
* - `scheduler_interval_seconds` — the configured interval, set on `start()`.
|
|
15
|
+
* - `scheduler_started_timestamp_seconds` — when `start()` ran, so a job that
|
|
16
|
+
* started but has NEVER succeeded on any pod still has something to age.
|
|
17
|
+
* - `scheduler_last_success_timestamp_seconds` — the end of the last cycle that
|
|
18
|
+
* actually ran the job and returned without throwing. Only the pod that held
|
|
19
|
+
* the lock publishes it; a contended or unavailable lock is not a success.
|
|
20
|
+
*
|
|
21
|
+
* The values live in process memory, so a restart drops the last success until
|
|
22
|
+
* the next cycle republishes it. Most jobs run on start, so the gap is minutes.
|
|
23
|
+
*/
|
|
24
|
+
export const SCHEDULER_INTERVAL_METRIC = 'scheduler_interval_seconds';
|
|
25
|
+
export const SCHEDULER_STARTED_METRIC = 'scheduler_started_timestamp_seconds';
|
|
26
|
+
export const SCHEDULER_LAST_SUCCESS_METRIC = 'scheduler_last_success_timestamp_seconds';
|
|
6
27
|
/**
|
|
7
28
|
* A periodic background job: a single unref'd `setInterval` with start-once
|
|
8
29
|
* semantics, error isolation (a throwing cycle is logged, never crashes the
|
|
@@ -14,6 +35,7 @@ import { errorMessage } from '../utils/response.js';
|
|
|
14
35
|
*/
|
|
15
36
|
export function createScheduler(opts) {
|
|
16
37
|
const log = createLogger(opts.name);
|
|
38
|
+
const metricLabels = { key: opts.lock?.key ?? opts.name };
|
|
17
39
|
let interval = null;
|
|
18
40
|
let startup = null;
|
|
19
41
|
let stopped = false;
|
|
@@ -25,6 +47,10 @@ export function createScheduler(opts) {
|
|
|
25
47
|
let shutdown = new AbortController();
|
|
26
48
|
/** The in-flight cycle, so `stop()` can wait for it before closing the client. */
|
|
27
49
|
let inFlight = null;
|
|
50
|
+
/** A cycle that was cut short by `stop()` is not stamped: it did not finish. */
|
|
51
|
+
const stampSuccess = () => {
|
|
52
|
+
emitGauge(SCHEDULER_LAST_SUCCESS_METRIC, metricLabels, Date.now() / 1000);
|
|
53
|
+
};
|
|
28
54
|
const cycle = async () => {
|
|
29
55
|
// Same-pod re-entrancy guard: setInterval doesn't await the async cycle, so
|
|
30
56
|
// a cycle slower than intervalMs would otherwise overlap ITSELF on this pod
|
|
@@ -45,11 +71,15 @@ export function createScheduler(opts) {
|
|
|
45
71
|
const ran = await withLeaderLock(redis, opts.lock.key, opts.lock.ttlMs, opts.run, { signal });
|
|
46
72
|
if (!ran)
|
|
47
73
|
log.debug('Cycle skipped — another pod holds the lock');
|
|
74
|
+
else if (!signal.aborted)
|
|
75
|
+
stampSuccess();
|
|
48
76
|
}
|
|
49
77
|
else {
|
|
50
78
|
// Unlocked: still give the job a signal, so `stop()` can cut a long cycle
|
|
51
79
|
// short rather than waiting for it during shutdown.
|
|
52
80
|
await opts.run({ signal });
|
|
81
|
+
if (!signal.aborted)
|
|
82
|
+
stampSuccess();
|
|
53
83
|
}
|
|
54
84
|
}
|
|
55
85
|
catch (err) {
|
|
@@ -82,6 +112,8 @@ export function createScheduler(opts) {
|
|
|
82
112
|
// one, and an already-aborted signal would make every cycle a no-op.
|
|
83
113
|
if (shutdown.signal.aborted)
|
|
84
114
|
shutdown = new AbortController();
|
|
115
|
+
emitGauge(SCHEDULER_INTERVAL_METRIC, metricLabels, opts.intervalMs / 1000);
|
|
116
|
+
emitGauge(SCHEDULER_STARTED_METRIC, metricLabels, Date.now() / 1000);
|
|
85
117
|
if (opts.lock && !opts.lock.redis && !holdsEnvLock) {
|
|
86
118
|
envLock = acquireSharedEnvLock();
|
|
87
119
|
holdsEnvLock = true;
|
|
@@ -125,4 +157,4 @@ export function createScheduler(opts) {
|
|
|
125
157
|
},
|
|
126
158
|
};
|
|
127
159
|
}
|
|
128
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvc2NoZWR1bGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBc0MsTUFBTSxrQkFBa0IsQ0FBQztBQUNsSSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBdURwRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBc0I7SUFDcEQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxJQUFJLFFBQVEsR0FBMEMsSUFBSSxDQUFDO0lBQzNELElBQUksT0FBTyxHQUF5QyxJQUFJLENBQUM7SUFDekQsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQiwwRkFBMEY7SUFDMUYsSUFBSSxPQUFPLEdBQXFCLElBQUksQ0FBQztJQUNyQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDekIsa0ZBQWtGO0lBQ2xGLElBQUksUUFBUSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDckMsa0ZBQWtGO0lBQ2xGLElBQUksUUFBUSxHQUF5QixJQUFJLENBQUM7SUFFMUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxJQUFtQixFQUFFO1FBQ3RDLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUsNkVBQTZFO1FBQzdFLDhFQUE4RTtRQUM5RSxxQkFBcUI7UUFDckIsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLEdBQUcsQ0FBQyxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztZQUNqRixPQUFPO1FBQ1QsQ0FBQztRQUNELE9BQU8sR0FBRyxJQUFJ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QUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztxQkFDaEUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBhY3F1aXJlU2hhcmVkRW52TG9jaywgcmVsZWFzZVNoYXJlZEVudkxvY2ssIHdpdGhMZWFkZXJMb2NrLCB0eXBlIExlYWRlckxvY2tSdW4sIHR5cGUgTG9ja1JlZGlzIH0gZnJvbSAnLi9sZWFkZXItbG9jay5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG4vKipcbiAqIE9wdGlvbmFsIGNyb3NzLXBvZCBzaW5nbGUtcnVubmVyIGxvY2sgZm9yIGEgc2NoZWR1bGVyJ3MgY3ljbGUuIFdpdGhvdXRcbiAqIGByZWRpc2AgdGhlIHNjaGVkdWxlciB1c2VzIHRoZSBwcm9jZXNzJ3Mgc2hhcmVkIGVudi1jb25maWd1cmVkIGxvY2sgY2xpZW50XG4gKiAodGFrZW4gb24gYHN0YXJ0YCwgcmVsZWFzZWQgb24gYHN0b3BgKTsgd2hlbiBSZWRpcyBpc24ndCBjb25maWd1cmVkIHRoZSBjeWNsZVxuICogcnVucyBvbiBldmVyeSBwb2QsIHNvIHRoZSB3b3JrIGl0IHdyYXBzIG11c3Qgc3RheSBzYWZlIHRvIHJ1biBjb25jdXJyZW50bHkuXG4gKiBBIHN1cHBsaWVkIGByZWRpc2AgZmFjdG9yeSBpcyByZXNvbHZlZCBwZXIgY3ljbGUgKGUuZy4gYSBCdWxsTVEgY29ubmVjdGlvbikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyTG9jayB7XG4gIGtleTogc3RyaW5nO1xuICB0dGxNczogbnVtYmVyO1xuICByZWRpcz86ICgpID0+IExvY2tSZWRpcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXJPcHRpb25zIHtcbiAgLyoqIExvZyBsYWJlbCAoYWxzbyB0aGUgbG9nZ2VyIG5hbWUpLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBJbnRlcnZhbCBiZXR3ZWVuIGN5Y2xlcyAobXMpLiAqL1xuICBpbnRlcnZhbE1zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgd29yayB0byBydW4gZWFjaCBjeWNsZS4gRXJyb3JzIGFyZSBjYXVnaHQgKyBsb2dnZWQsIG5ldmVyIHRocm93bi5cbiAgICpcbiAgICogYHJ1bi5zaWduYWxgIGlzIGFib3J0ZWQgd2hlbiBhIGxlYWRlci1sb2NrZWQgY3ljbGUgTE9TRVMgaXRzIGxvY2sgbWlkLXJ1biwgb3JcbiAgICogd2hlbiBgc3RvcCgpYCBpcyBjYWxsZWQuIEEgam9iIHRoYXQgaXRlcmF0ZXMgb3ZlciB1bml0cyBvZiB3b3JrIChvcmdzLCByZXBvcyxcbiAgICogZW50aXRpZXMpIG11c3QgY2hlY2sgaXQgYmV0d2VlbiB1bml0cyBhbmQgcmV0dXJuOiBwYXN0IGEgbG9jayBsb3NzIGFub3RoZXIgcG9kXG4gICAqIG1heSBiZSBkb2luZyB0aGUgc2FtZSB3b3JrLCBhbmQgb24gc2h1dGRvd24gcmV0dXJuaW5nIHByb21wdGx5IGlzIHdoYXRcbiAgICogcmVsZWFzZXMgdGhlIGxvY2sgaW5zdGVhZCBvZiBsZWF2aW5nIGl0IHRvIGV4cGlyZS4gVW5sb2NrZWQgc2NoZWR1bGVycyBnZXQgYVxuICAgKiBzaWduYWwgdG9vIOKAlCBpdCBmaXJlcyBvbiBgc3RvcCgpYCBvbmx5LlxuICAgKi9cbiAgcnVuOiAocnVuOiBMZWFkZXJMb2NrUnVuKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogUnVuIGEgY3ljbGUgaW1tZWRpYXRlbHkgd2hlbiBzdGFydGVkLiBEZWZhdWx0IHRydWUuICovXG4gIHJ1bk9uU3RhcnQ/OiBib29sZWFuO1xuICAvKiogRGVsYXkgYmVmb3JlIHRoZSBmaXJzdCBjeWNsZSAoYW5kIGJlZm9yZSB0aGUgaW50ZXJ2YWwgYmVnaW5zKSwgbXMuXG4gICAqICBEZWZhdWx0IDAuIExldHMgYSBzZXJ2aWNlIHdhaXQgZm9yIGRlcGVuZGVuY2llcyB0byBjb21lIHVwLiAqL1xuICBzdGFydHVwRGVsYXlNcz86IG51bWJlcjtcbiAgLyoqIFdoZW4gc2V0LCBlYWNoIGN5Y2xlIHJ1bnMgb25seSBvbiB0aGUgcG9kIHRoYXQgd2lucyB0aGlzIGxvY2sg4oCUIHNvIHdpdGhcbiAgICogIG11bHRpcGxlIHJlcGxpY2FzIG9ubHkgb25lIHJ1bnMgcGVyIHdpbmRvdy4gKi9cbiAgbG9jaz86IFNjaGVkdWxlckxvY2s7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyIHtcbiAgLyoqIFN0YXJ0IHRoZSB0aW1lci4gSWRlbXBvdGVudCDigJQgcmVwZWF0ZWQgY2FsbHMgYXJlIG5vLW9wcy4gKi9cbiAgc3RhcnQoKTogdm9pZDtcbiAgLyoqXG4gICAqIFN0b3AgdGhlIHRpbWVyIChhbmQgY2FuY2VsIGEgcGVuZGluZyBzdGFydHVwIGRlbGF5KS4gU2FmZSBiZWZvcmUgc3RhcnQuXG4gICAqXG4gICAqIEFsc28gQUJPUlRTIGFuIGluLWZsaWdodCBjeWNsZSdzIGBydW4uc2lnbmFsYCBhbmQgZGVmZXJzIGNsb3NpbmcgdGhlIHNoYXJlZFxuICAgKiBsb2NrIGNsaWVudCB1bnRpbCB0aGF0IGN5Y2xlIHNldHRsZXM6IGEgcnVubmluZyBjeWNsZSB1c2VkIHRvIGtlZXAgaXRzIGxvY2tcbiAgICoga2V5IHVudGlsIHRoZSBUVEwgbGFwc2VkLCBzbyBhIHJvbGxpbmcgZGVwbG95IG1pZC1ydW4gcGFya2VkIHRoZSBqb2IgZm9yIHRoZVxuICAgKiByZXN0IG9mIHRoZSBUVEwuIEEgc2lnbmFsLWF3YXJlIGBydW5gIHJldHVybnMgYW5kIHRoZSBsb2NrIGlzIHJlbGVhc2VkLlxuICAgKi9cbiAgc3RvcCgpOiB2b2lkO1xufVxuXG4vKipcbiAqIEEgcGVyaW9kaWMgYmFja2dyb3VuZCBqb2I6IGEgc2luZ2xlIHVucmVmJ2QgYHNldEludGVydmFsYCB3aXRoIHN0YXJ0LW9uY2VcbiAqIHNlbWFudGljcywgZXJyb3IgaXNvbGF0aW9uIChhIHRocm93aW5nIGN5Y2xlIGlzIGxvZ2dlZCwgbmV2ZXIgY3Jhc2hlcyB0aGVcbiAqIGxvb3ApLCBhbiBvcHRpb25hbCBzdGFydHVwIGRlbGF5LCBhbmQgYW4gb3B0aW9uYWwgY3Jvc3MtcG9kIGxlYWRlciBsb2NrLlxuICpcbiAqIFJlcGxhY2VzIHRoZSBoYW5kLXJvbGxlZCB0aW1lci9gdW5yZWZgL2BjYXRjaGAvc3RhcnQtc3RvcCBib2lsZXJwbGF0ZSB0aGF0XG4gKiBlYWNoIHNjaGVkdWxlciAoc2NhbiwgZGlnZXN0LCByZWdpc3RyeSBHQywgYmlsbGluZyBsaWZlY3ljbGUpIHJlcGVhdGVkLCBhbmRcbiAqIG1ha2VzIHRoZSBsZWFkZXIgbG9jayBhdmFpbGFibGUgdG8gYWxsIG9mIHRoZW0gdW5pZm9ybWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2NoZWR1bGVyKG9wdHM6IFNjaGVkdWxlck9wdGlvbnMpOiBTY2hlZHVsZXIge1xuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIob3B0cy5uYW1lKTtcbiAgbGV0IGludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgbGV0IHN0YXJ0dXA6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gIGxldCBydW5uaW5nID0gZmFsc2U7XG4gIC8qKiBUaGUgc2hhcmVkIGVudiBjbGllbnQgdGhpcyBzY2hlZHVsZXIgaG9sZHMgYSByZWZlcmVuY2Ugb24gKG93bi1jbGllbnQgbG9ja3MgZG9uJ3QpLiAqL1xuICBsZXQgZW52TG9jazogTG9ja1JlZGlzIHwgbnVsbCA9IG51bGw7XG4gIGxldCBob2xkc0VudkxvY2sgPSBmYWxzZTtcbiAgLyoqIEFib3J0ZWQgYnkgYHN0b3AoKWAsIHNvIGFuIGluLWZsaWdodCBjeWNsZSBjYW4gcmV0dXJuIGFuZCByZWxlYXNlIGl0cyBsb2NrLiAqL1xuICBsZXQgc2h1dGRvd24gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIC8qKiBUaGUgaW4tZmxpZ2h0IGN5Y2xlLCBzbyBgc3RvcCgpYCBjYW4gd2FpdCBmb3IgaXQgYmVmb3JlIGNsb3NpbmcgdGhlIGNsaWVudC4gKi9cbiAgbGV0IGluRmxpZ2h0OiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3QgY3ljbGUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLy8gU2FtZS1wb2QgcmUtZW50cmFuY3kgZ3VhcmQ6IHNldEludGVydmFsIGRvZXNuJ3QgYXdhaXQgdGhlIGFzeW5jIGN5Y2xlLCBzb1xuICAgIC8vIGEgY3ljbGUgc2xvd2VyIHRoYW4gaW50ZXJ2YWxNcyB3b3VsZCBvdGhlcndpc2Ugb3ZlcmxhcCBJVFNFTEYgb24gdGhpcyBwb2RcbiAgICAvLyAoZG91YmxlLXByb2Nlc3NpbmcsIGR1cGxpY2F0ZSBzaWRlIGVmZmVjdHMpLiBUaGUgb3B0aW9uYWwgbGVhZGVyIGxvY2sgb25seVxuICAgIC8vIGd1YXJkcyBDUk9TUy1wb2Qgb3ZlcmxhcDsgdGhpcyBndWFyZHMgc2FtZS1wb2QuIEEgc2tpcHBlZCB0aWNrIGp1c3QgcnVucyBvblxuICAgIC8vIHRoZSBuZXh0IGludGVydmFsLlxuICAgIGlmIChydW5uaW5nKSB7XG4gICAgICBsb2cuZGVidWcoJ0N5Y2xlIHNraXBwZWQg4oCUIHByZXZpb3VzIGN5Y2xlIHN0aWxsIHJ1bm5pbmcgKHNhbWUtcG9kIHJlLWVudHJhbmN5KScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBydW5uaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBzaWduYWwgPSBzaHV0ZG93bi5zaWduYWw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlZGlzID0gb3B0cy5sb2NrID8gKG9wdHMubG9jay5yZWRpcyA/IG9wdHMubG9jay5yZWRpcygpIDogZW52TG9jaykgOiBudWxsO1xuICAgICAgaWYgKG9wdHMubG9jayAmJiByZWRpcykge1xuICAgICAgICAvLyB3aXRoTGVhZGVyTG9jayBtZXJnZXMgYHNpZ25hbGAgaW50byB0aGUgcnVuJ3Mgb3duLCBzbyBgcnVuYCBzZWVzIGEgc2luZ2xlXG4gICAgICAgIC8vIHNpZ25hbCBmb3IgYm90aCBcImxvY2sgbG9zdFwiIGFuZCBcInNodXR0aW5nIGRvd25cIi5cbiAgICAgICAgY29uc3QgcmFuID0gYXdhaXQgd2l0aExlYWRlckxvY2socmVkaXMsIG9wdHMubG9jay5rZXksIG9wdHMubG9jay50dGxNcywgb3B0cy5ydW4sIHsgc2lnbmFsIH0pO1xuICAgICAgICBpZiAoIXJhbikgbG9nLmRlYnVnKCdDeWNsZSBza2lwcGVkIOKAlCBhbm90aGVyIHBvZCBob2xkcyB0aGUgbG9jaycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVW5sb2NrZWQ6IHN0aWxsIGdpdmUgdGhlIGpvYiBhIHNpZ25hbCwgc28gYHN0b3AoKWAgY2FuIGN1dCBhIGxvbmcgY3ljbGVcbiAgICAgICAgLy8gc2hvcnQgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgaXQgZHVyaW5nIHNodXRkb3duLlxuICAgICAgICBhd2FpdCBvcHRzLnJ1bih7IHNpZ25hbCB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvcignU2NoZWR1bGVyIGN5Y2xlIGZhaWxlZCcsIHsgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBSdW4gYSBjeWNsZSBhbmQgcHVibGlzaCBpdCBhcyBgaW5GbGlnaHRgIHNvIGBzdG9wKClgIGNhbiBhd2FpdCBpdC4gKi9cbiAgY29uc3QgcnVuQ3ljbGUgPSAoKTogdm9pZCA9PiB7XG4gICAgY29uc3QgcCA9IGN5Y2xlKCkuZmluYWxseSgoKSA9PiB7IGlmIChpbkZsaWdodCA9PT0gcCkgaW5GbGlnaHQgPSBudWxsOyB9KTtcbiAgICBpbkZsaWdodCA9IHA7XG4gIH07XG5cbiAgY29uc3QgYmVnaW4gPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHN0b3BwZWQpIHJldHVybjsgLy8gc3RvcCgpIGNhbGxlZCBkdXJpbmcgdGhlIHN0YXJ0dXAgZGVsYXlcbiAgICBpZiAob3B0cy5ydW5PblN0YXJ0ICE9PSBmYWxzZSkgcnVuQ3ljbGUoKTtcbiAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHJ1bkN5Y2xlKCksIG9wdHMuaW50ZXJ2YWxNcyk7XG4gICAgaW50ZXJ2YWwudW5yZWYoKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0KCk6IHZvaWQge1xuICAgICAgaWYgKGludGVydmFsIHx8IHN0YXJ0dXApIHJldHVybjtcbiAgICAgIHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIC8vIEEgcmVzdGFydCBuZWVkcyBhIGZyZXNoIGNvbnRyb2xsZXI6IHRoZSBwcmV2aW91cyBzdG9wKCkgYWJvcnRlZCB0aGUgb2xkXG4gICAgICAvLyBvbmUsIGFuZCBhbiBhbHJlYWR5LWFib3J0ZWQgc2lnbmFsIHdvdWxkIG1ha2UgZXZlcnkgY3ljbGUgYSBuby1vcC5cbiAgICAgIGlmIChzaHV0ZG93bi5zaWduYWwuYWJvcnRlZCkgc2h1dGRvd24gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBpZiAob3B0cy5sb2NrICYmICFvcHRzLmxvY2sucmVkaXMgJiYgIWhvbGRzRW52TG9jaykge1xuICAgICAgICBlbnZMb2NrID0gYWNxdWlyZVNoYXJlZEVudkxvY2soKTtcbiAgICAgICAgaG9sZHNFbnZMb2NrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRzLnN0YXJ0dXBEZWxheU1zICYmIG9wdHMuc3RhcnR1cERlbGF5TXMgPiAwKSB7XG4gICAgICAgIHN0YXJ0dXAgPSBzZXRUaW1lb3V0KCgpID0+IHsgc3RhcnR1cCA9IG51bGw7IGJlZ2luKCk7IH0sIG9wdHMuc3RhcnR1cERlbGF5TXMpO1xuICAgICAgICBzdGFydHVwLnVucmVmKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiZWdpbigpO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oJ1NjaGVkdWxlciBzdGFydGVkJywgeyBpbnRlcnZhbE1zOiBvcHRzLmludGVydmFsTXMsIGxvY2tlZDogISFvcHRzLmxvY2sgJiYgKCEhb3B0cy5sb2NrLnJlZGlzIHx8ICEhZW52TG9jaykgfSk7XG4gICAgfSxcbiAgICBzdG9wKCk6IHZvaWQge1xuICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICBpZiAoc3RhcnR1cCkgeyBjbGVhclRpbWVvdXQoc3RhcnR1cCk7IHN0YXJ0dXAgPSBudWxsOyB9XG4gICAgICBpZiAoaW50ZXJ2YWwpIHsgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7IGludGVydmFsID0gbnVsbDsgfVxuICAgICAgLy8gQXNrIGFuIGluLWZsaWdodCBjeWNsZSB0byB3aW5kIHVwLiBBIHNpZ25hbC1hd2FyZSBgcnVuYCByZXR1cm5zIGJldHdlZW5cbiAgICAgIC8vIHVuaXRzIG9mIHdvcmssIHdoaWNoIGxldHMgd2l0aExlYWRlckxvY2sncyBgZmluYWxseWAgUkVMRUFTRSB0aGUgbG9jayDigJRcbiAgICAgIC8vIG90aGVyd2lzZSB0aGUga2V5IHNhdCB0aGVyZSB1bnRpbCB0aGUgVFRMIGxhcHNlZCBhbmQgdGhlIGpvYiB3YXMgcGFya2VkXG4gICAgICAvLyBmbGVldC13aWRlIGZvciB0aGF0IGxvbmcgYWZ0ZXIgZXZlcnkgcm9sbGluZyBkZXBsb3kuXG4gICAgICBpZiAoIXNodXRkb3duLnNpZ25hbC5hYm9ydGVkKSBzaHV0ZG93bi5hYm9ydCgnc2h1dGRvd24nKTtcbiAgICAgIGlmIChob2xkc0VudkxvY2spIHtcbiAgICAgICAgaG9sZHNFbnZMb2NrID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSBpbkZsaWdodDtcbiAgICAgICAgZW52TG9jayA9IG51bGw7XG4gICAgICAgIC8vIENsb3NpbmcgdGhlIGNsaWVudCB1bmRlciBhIHJ1bm5pbmcgY3ljbGUga2lsbHMgaXRzIGhlYXJ0YmVhdCBhbmQgaXRzXG4gICAgICAgIC8vIHJlbGVhc2UsIHNvIHdhaXQgZm9yIHRoZSBjeWNsZSB0byBzZXR0bGUgZmlyc3QuIEJvdW5kZWQgYnkgdGhlIGN5Y2xlXG4gICAgICAgIC8vIGl0c2VsZiwgd2hpY2ggaXMgbm93IGJlaW5nIGFza2VkIHRvIHN0b3AuXG4gICAgICAgIHZvaWQgKHBlbmRpbmcgPyBwZW5kaW5nLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkgOiBQcm9taXNlLnJlc29sdmUoKSlcbiAgICAgICAgICAudGhlbigoKSA9PiByZWxlYXNlU2hhcmVkRW52TG9jaygpKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKCdTY2hlZHVsZXIgc3RvcHBlZCcpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvc2NoZWR1bGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBc0MsTUFBTSxrQkFBa0IsQ0FBQztBQUNsSSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQXVEcEQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyw0QkFBNEIsQ0FBQztBQUN0RSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxxQ0FBcUMsQ0FBQztBQUM5RSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRywwQ0FBMEMsQ0FBQztBQUV4Rjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBc0I7SUFDcEQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUQsSUFBSSxRQUFRLEdBQTBDLElBQUksQ0FBQztJQUMzRCxJQUFJLE9BQU8sR0FBeUMsSUFBSSxDQUFDO0lBQ3pELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDcEIsMEZBQTBGO0lBQzFGLElBQUksT0FBTyxHQUFxQixJQUFJLENBQUM7SUFDckMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLGtGQUFrRjtJ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Z2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGFjcXVpcmVTaGFyZWRFbnZMb2NrLCByZWxlYXNlU2hhcmVkRW52TG9jaywgd2l0aExlYWRlckxvY2ssIHR5cGUgTGVhZGVyTG9ja1J1biwgdHlwZSBMb2NrUmVkaXMgfSBmcm9tICcuL2xlYWRlci1sb2NrLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0R2F1Z2UgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbi8qKlxuICogT3B0aW9uYWwgY3Jvc3MtcG9kIHNpbmdsZS1ydW5uZXIgbG9jayBmb3IgYSBzY2hlZHVsZXIncyBjeWNsZS4gV2l0aG91dFxuICogYHJlZGlzYCB0aGUgc2NoZWR1bGVyIHVzZXMgdGhlIHByb2Nlc3MncyBzaGFyZWQgZW52LWNvbmZpZ3VyZWQgbG9jayBjbGllbnRcbiAqICh0YWtlbiBvbiBgc3RhcnRgLCByZWxlYXNlZCBvbiBgc3RvcGApOyB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQgdGhlIGN5Y2xlXG4gKiBydW5zIG9uIGV2ZXJ5IHBvZCwgc28gdGhlIHdvcmsgaXQgd3JhcHMgbXVzdCBzdGF5IHNhZmUgdG8gcnVuIGNvbmN1cnJlbnRseS5cbiAqIEEgc3VwcGxpZWQgYHJlZGlzYCBmYWN0b3J5IGlzIHJlc29sdmVkIHBlciBjeWNsZSAoZS5nLiBhIEJ1bGxNUSBjb25uZWN0aW9uKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXJMb2NrIHtcbiAga2V5OiBzdHJpbmc7XG4gIHR0bE1zOiBudW1iZXI7XG4gIHJlZGlzPzogKCkgPT4gTG9ja1JlZGlzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlck9wdGlvbnMge1xuICAvKiogTG9nIGxhYmVsIChhbHNvIHRoZSBsb2dnZXIgbmFtZSkuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEludGVydmFsIGJldHdlZW4gY3ljbGVzIChtcykuICovXG4gIGludGVydmFsTXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB3b3JrIHRvIHJ1biBlYWNoIGN5Y2xlLiBFcnJvcnMgYXJlIGNhdWdodCArIGxvZ2dlZCwgbmV2ZXIgdGhyb3duLlxuICAgKlxuICAgKiBgcnVuLnNpZ25hbGAgaXMgYWJvcnRlZCB3aGVuIGEgbGVhZGVyLWxvY2tlZCBjeWNsZSBMT1NFUyBpdHMgbG9jayBtaWQtcnVuLCBvclxuICAgKiB3aGVuIGBzdG9wKClgIGlzIGNhbGxlZC4gQSBqb2IgdGhhdCBpdGVyYXRlcyBvdmVyIHVuaXRzIG9mIHdvcmsgKG9yZ3MsIHJlcG9zLFxuICAgKiBlbnRpdGllcykgbXVzdCBjaGVjayBpdCBiZXR3ZWVuIHVuaXRzIGFuZCByZXR1cm46IHBhc3QgYSBsb2NrIGxvc3MgYW5vdGhlciBwb2RcbiAgICogbWF5IGJlIGRvaW5nIHRoZSBzYW1lIHdvcmssIGFuZCBvbiBzaHV0ZG93biByZXR1cm5pbmcgcHJvbXB0bHkgaXMgd2hhdFxuICAgKiByZWxlYXNlcyB0aGUgbG9jayBpbnN0ZWFkIG9mIGxlYXZpbmcgaXQgdG8gZXhwaXJlLiBVbmxvY2tlZCBzY2hlZHVsZXJzIGdldCBhXG4gICAqIHNpZ25hbCB0b28g4oCUIGl0IGZpcmVzIG9uIGBzdG9wKClgIG9ubHkuXG4gICAqL1xuICBydW46IChydW46IExlYWRlckxvY2tSdW4pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKiBSdW4gYSBjeWNsZSBpbW1lZGlhdGVseSB3aGVuIHN0YXJ0ZWQuIERlZmF1bHQgdHJ1ZS4gKi9cbiAgcnVuT25TdGFydD86IGJvb2xlYW47XG4gIC8qKiBEZWxheSBiZWZvcmUgdGhlIGZpcnN0IGN5Y2xlIChhbmQgYmVmb3JlIHRoZSBpbnRlcnZhbCBiZWdpbnMpLCBtcy5cbiAgICogIERlZmF1bHQgMC4gTGV0cyBhIHNlcnZpY2Ugd2FpdCBmb3IgZGVwZW5kZW5jaWVzIHRvIGNvbWUgdXAuICovXG4gIHN0YXJ0dXBEZWxheU1zPzogbnVtYmVyO1xuICAvKiogV2hlbiBzZXQsIGVhY2ggY3ljbGUgcnVucyBvbmx5IG9uIHRoZSBwb2QgdGhhdCB3aW5zIHRoaXMgbG9jayDigJQgc28gd2l0aFxuICAgKiAgbXVsdGlwbGUgcmVwbGljYXMgb25seSBvbmUgcnVucyBwZXIgd2luZG93LiAqL1xuICBsb2NrPzogU2NoZWR1bGVyTG9jaztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXIge1xuICAvKiogU3RhcnQgdGhlIHRpbWVyLiBJZGVtcG90ZW50IOKAlCByZXBlYXRlZCBjYWxscyBhcmUgbm8tb3BzLiAqL1xuICBzdGFydCgpOiB2b2lkO1xuICAvKipcbiAgICogU3RvcCB0aGUgdGltZXIgKGFuZCBjYW5jZWwgYSBwZW5kaW5nIHN0YXJ0dXAgZGVsYXkpLiBTYWZlIGJlZm9yZSBzdGFydC5cbiAgICpcbiAgICogQWxzbyBBQk9SVFMgYW4gaW4tZmxpZ2h0IGN5Y2xlJ3MgYHJ1bi5zaWduYWxgIGFuZCBkZWZlcnMgY2xvc2luZyB0aGUgc2hhcmVkXG4gICAqIGxvY2sgY2xpZW50IHVudGlsIHRoYXQgY3ljbGUgc2V0dGxlczogYSBydW5uaW5nIGN5Y2xlIHVzZWQgdG8ga2VlcCBpdHMgbG9ja1xuICAgKiBrZXkgdW50aWwgdGhlIFRUTCBsYXBzZWQsIHNvIGEgcm9sbGluZyBkZXBsb3kgbWlkLXJ1biBwYXJrZWQgdGhlIGpvYiBmb3IgdGhlXG4gICAqIHJlc3Qgb2YgdGhlIFRUTC4gQSBzaWduYWwtYXdhcmUgYHJ1bmAgcmV0dXJucyBhbmQgdGhlIGxvY2sgaXMgcmVsZWFzZWQuXG4gICAqL1xuICBzdG9wKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogTGl2ZW5lc3MgZ2F1Z2VzIGV2ZXJ5IHNjaGVkdWxlciBwdWJsaXNoZXMsIGxhYmVsbGVkIGB7a2V5fWAgKHRoZSBsb2NrIGtleSwgb3JcbiAqIHRoZSBzY2hlZHVsZXIncyBuYW1lIHdoZW4gaXQgaGFzIG5vIGxvY2spLiBUb2dldGhlciB0aGV5IGxldCBPTkUgYWxlcnQgcnVsZVxuICogY292ZXIgZXZlcnkgam9iIGF0IGl0cyBvd24gY2FkZW5jZSDigJQgdGhlIGludGVydmFsIGlzIHB1Ymxpc2hlZCByYXRoZXIgdGhhblxuICogd3JpdHRlbiBpbnRvIHRoZSBydWxlLCBzbyBhIGpvYiB3aG9zZSBpbnRlcnZhbCBhbiBvcGVyYXRvciBvdmVycmlkZXMgdGhyb3VnaFxuICogdGhlIGVudmlyb25tZW50IGlzIGp1ZGdlZCBhZ2FpbnN0IHRoZSBpbnRlcnZhbCBpdCBhY3R1YWxseSBydW5zIGF0LlxuICpcbiAqIC0gYHNjaGVkdWxlcl9pbnRlcnZhbF9zZWNvbmRzYCDigJQgdGhlIGNvbmZpZ3VyZWQgaW50ZXJ2YWwsIHNldCBvbiBgc3RhcnQoKWAuXG4gKiAtIGBzY2hlZHVsZXJfc3RhcnRlZF90aW1lc3RhbXBfc2Vjb25kc2Ag4oCUIHdoZW4gYHN0YXJ0KClgIHJhbiwgc28gYSBqb2IgdGhhdFxuICogICBzdGFydGVkIGJ1dCBoYXMgTkVWRVIgc3VjY2VlZGVkIG9uIGFueSBwb2Qgc3RpbGwgaGFzIHNvbWV0aGluZyB0byBhZ2UuXG4gKiAtIGBzY2hlZHVsZXJfbGFzdF9zdWNjZXNzX3RpbWVzdGFtcF9zZWNvbmRzYCDigJQgdGhlIGVuZCBvZiB0aGUgbGFzdCBjeWNsZSB0aGF0XG4gKiAgIGFjdHVhbGx5IHJhbiB0aGUgam9iIGFuZCByZXR1cm5lZCB3aXRob3V0IHRocm93aW5nLiBPbmx5IHRoZSBwb2QgdGhhdCBoZWxkXG4gKiAgIHRoZSBsb2NrIHB1Ymxpc2hlcyBpdDsgYSBjb250ZW5kZWQgb3IgdW5hdmFpbGFibGUgbG9jayBpcyBub3QgYSBzdWNjZXNzLlxuICpcbiAqIFRoZSB2YWx1ZXMgbGl2ZSBpbiBwcm9jZXNzIG1lbW9yeSwgc28gYSByZXN0YXJ0IGRyb3BzIHRoZSBsYXN0IHN1Y2Nlc3MgdW50aWxcbiAqIHRoZSBuZXh0IGN5Y2xlIHJlcHVibGlzaGVzIGl0LiBNb3N0IGpvYnMgcnVuIG9uIHN0YXJ0LCBzbyB0aGUgZ2FwIGlzIG1pbnV0ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBTQ0hFRFVMRVJfSU5URVJWQUxfTUVUUklDID0gJ3NjaGVkdWxlcl9pbnRlcnZhbF9zZWNvbmRzJztcbmV4cG9ydCBjb25zdCBTQ0hFRFVMRVJfU1RBUlRFRF9NRVRSSUMgPSAnc2NoZWR1bGVyX3N0YXJ0ZWRfdGltZXN0YW1wX3NlY29uZHMnO1xuZXhwb3J0IGNvbnN0IFNDSEVEVUxFUl9MQVNUX1NVQ0NFU1NfTUVUUklDID0gJ3NjaGVkdWxlcl9sYXN0X3N1Y2Nlc3NfdGltZXN0YW1wX3NlY29uZHMnO1xuXG4vKipcbiAqIEEgcGVyaW9kaWMgYmFja2dyb3VuZCBqb2I6IGEgc2luZ2xlIHVucmVmJ2QgYHNldEludGVydmFsYCB3aXRoIHN0YXJ0LW9uY2VcbiAqIHNlbWFudGljcywgZXJyb3IgaXNvbGF0aW9uIChhIHRocm93aW5nIGN5Y2xlIGlzIGxvZ2dlZCwgbmV2ZXIgY3Jhc2hlcyB0aGVcbiAqIGxvb3ApLCBhbiBvcHRpb25hbCBzdGFydHVwIGRlbGF5LCBhbmQgYW4gb3B0aW9uYWwgY3Jvc3MtcG9kIGxlYWRlciBsb2NrLlxuICpcbiAqIFJlcGxhY2VzIHRoZSBoYW5kLXJvbGxlZCB0aW1lci9gdW5yZWZgL2BjYXRjaGAvc3RhcnQtc3RvcCBib2lsZXJwbGF0ZSB0aGF0XG4gKiBlYWNoIHNjaGVkdWxlciAoc2NhbiwgZGlnZXN0LCByZWdpc3RyeSBHQywgYmlsbGluZyBsaWZlY3ljbGUpIHJlcGVhdGVkLCBhbmRcbiAqIG1ha2VzIHRoZSBsZWFkZXIgbG9jayBhdmFpbGFibGUgdG8gYWxsIG9mIHRoZW0gdW5pZm9ybWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2NoZWR1bGVyKG9wdHM6IFNjaGVkdWxlck9wdGlvbnMpOiBTY2hlZHVsZXIge1xuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIob3B0cy5uYW1lKTtcbiAgY29uc3QgbWV0cmljTGFiZWxzID0geyBrZXk6IG9wdHMubG9jaz8ua2V5ID8/IG9wdHMubmFtZSB9O1xuICBsZXQgaW50ZXJ2YWw6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuICBsZXQgc3RhcnR1cDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgbGV0IHJ1bm5pbmcgPSBmYWxzZTtcbiAgLyoqIFRoZSBzaGFyZWQgZW52IGNsaWVudCB0aGlzIHNjaGVkdWxlciBob2xkcyBhIHJlZmVyZW5jZSBvbiAob3duLWNsaWVudCBsb2NrcyBkb24ndCkuICovXG4gIGxldCBlbnZMb2NrOiBMb2NrUmVkaXMgfCBudWxsID0gbnVsbDtcbiAgbGV0IGhvbGRzRW52TG9jayA9IGZhbHNlO1xuICAvKiogQWJvcnRlZCBieSBgc3RvcCgpYCwgc28gYW4gaW4tZmxpZ2h0IGN5Y2xlIGNhbiByZXR1cm4gYW5kIHJlbGVhc2UgaXRzIGxvY2suICovXG4gIGxldCBzaHV0ZG93biA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgLyoqIFRoZSBpbi1mbGlnaHQgY3ljbGUsIHNvIGBzdG9wKClgIGNhbiB3YWl0IGZvciBpdCBiZWZvcmUgY2xvc2luZyB0aGUgY2xpZW50LiAqL1xuICBsZXQgaW5GbGlnaHQ6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblxuICAvKiogQSBjeWNsZSB0aGF0IHdhcyBjdXQgc2hvcnQgYnkgYHN0b3AoKWAgaXMgbm90IHN0YW1wZWQ6IGl0IGRpZCBub3QgZmluaXNoLiAqL1xuICBjb25zdCBzdGFtcFN1Y2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgZW1pdEdhdWdlKFNDSEVEVUxFUl9MQVNUX1NVQ0NFU1NfTUVUUklDLCBtZXRyaWNMYWJlbHMsIERhdGUubm93KCkgLyAxMDAwKTtcbiAgfTtcblxuICBjb25zdCBjeWNsZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvLyBTYW1lLXBvZCByZS1lbnRyYW5jeSBndWFyZDogc2V0SW50ZXJ2YWwgZG9lc24ndCBhd2FpdCB0aGUgYXN5bmMgY3ljbGUsIHNvXG4gICAgLy8gYSBjeWNsZSBzbG93ZXIgdGhhbiBpbnRlcnZhbE1zIHdvdWxkIG90aGVyd2lzZSBvdmVybGFwIElUU0VMRiBvbiB0aGlzIHBvZFxuICAgIC8vIChkb3VibGUtcHJvY2Vzc2luZywgZHVwbGljYXRlIHNpZGUgZWZmZWN0cykuIFRoZSBvcHRpb25hbCBsZWFkZXIgbG9jayBvbmx5XG4gICAgLy8gZ3VhcmRzIENST1NTLXBvZCBvdmVybGFwOyB0aGlzIGd1YXJkcyBzYW1lLXBvZC4gQSBza2lwcGVkIHRpY2sganVzdCBydW5zIG9uXG4gICAgLy8gdGhlIG5leHQgaW50ZXJ2YWwuXG4gICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgIGxvZy5kZWJ1ZygnQ3ljbGUgc2tpcHBlZCDigJQgcHJldmlvdXMgY3ljbGUgc3RpbGwgcnVubmluZyAoc2FtZS1wb2QgcmUtZW50cmFuY3kpJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgIGNvbnN0IHNpZ25hbCA9IHNodXRkb3duLnNpZ25hbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVkaXMgPSBvcHRzLmxvY2sgPyAob3B0cy5sb2NrLnJlZGlzID8gb3B0cy5sb2NrLnJlZGlzKCkgOiBlbnZMb2NrKSA6IG51bGw7XG4gICAgICBpZiAob3B0cy5sb2NrICYmIHJlZGlzKSB7XG4gICAgICAgIC8vIHdpdGhMZWFkZXJMb2NrIG1lcmdlcyBgc2lnbmFsYCBpbnRvIHRoZSBydW4ncyBvd24sIHNvIGBydW5gIHNlZXMgYSBzaW5nbGVcbiAgICAgICAgLy8gc2lnbmFsIGZvciBib3RoIFwibG9jayBsb3N0XCIgYW5kIFwic2h1dHRpbmcgZG93blwiLlxuICAgICAgICBjb25zdCByYW4gPSBhd2FpdCB3aXRoTGVhZGVyTG9jayhyZWRpcywgb3B0cy5sb2NrLmtleSwgb3B0cy5sb2NrLnR0bE1zLCBvcHRzLnJ1biwgeyBzaWduYWwgfSk7XG4gICAgICAgIGlmICghcmFuKSBsb2cuZGVidWcoJ0N5Y2xlIHNraXBwZWQg4oCUIGFub3RoZXIgcG9kIGhvbGRzIHRoZSBsb2NrJyk7XG4gICAgICAgIGVsc2UgaWYgKCFzaWduYWwuYWJvcnRlZCkgc3RhbXBTdWNjZXNzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVbmxvY2tlZDogc3RpbGwgZ2l2ZSB0aGUgam9iIGEgc2lnbmFsLCBzbyBgc3RvcCgpYCBjYW4gY3V0IGEgbG9uZyBjeWNsZVxuICAgICAgICAvLyBzaG9ydCByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciBpdCBkdXJpbmcgc2h1dGRvd24uXG4gICAgICAgIGF3YWl0IG9wdHMucnVuKHsgc2lnbmFsIH0pO1xuICAgICAgICBpZiAoIXNpZ25hbC5hYm9ydGVkKSBzdGFtcFN1Y2Nlc3MoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvcignU2NoZWR1bGVyIGN5Y2xlIGZhaWxlZCcsIHsgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBSdW4gYSBjeWNsZSBhbmQgcHVibGlzaCBpdCBhcyBgaW5GbGlnaHRgIHNvIGBzdG9wKClgIGNhbiBhd2FpdCBpdC4gKi9cbiAgY29uc3QgcnVuQ3ljbGUgPSAoKTogdm9pZCA9PiB7XG4gICAgY29uc3QgcCA9IGN5Y2xlKCkuZmluYWxseSgoKSA9PiB7IGlmIChpbkZsaWdodCA9PT0gcCkgaW5GbGlnaHQgPSBudWxsOyB9KTtcbiAgICBpbkZsaWdodCA9IHA7XG4gIH07XG5cbiAgY29uc3QgYmVnaW4gPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHN0b3BwZWQpIHJldHVybjsgLy8gc3RvcCgpIGNhbGxlZCBkdXJpbmcgdGhlIHN0YXJ0dXAgZGVsYXlcbiAgICBpZiAob3B0cy5ydW5PblN0YXJ0ICE9PSBmYWxzZSkgcnVuQ3ljbGUoKTtcbiAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHJ1bkN5Y2xlKCksIG9wdHMuaW50ZXJ2YWxNcyk7XG4gICAgaW50ZXJ2YWwudW5yZWYoKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0KCk6IHZvaWQge1xuICAgICAgaWYgKGludGVydmFsIHx8IHN0YXJ0dXApIHJldHVybjtcbiAgICAgIHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIC8vIEEgcmVzdGFydCBuZWVkcyBhIGZyZXNoIGNvbnRyb2xsZXI6IHRoZSBwcmV2aW91cyBzdG9wKCkgYWJvcnRlZCB0aGUgb2xkXG4gICAgICAvLyBvbmUsIGFuZCBhbiBhbHJlYWR5LWFib3J0ZWQgc2lnbmFsIHdvdWxkIG1ha2UgZXZlcnkgY3ljbGUgYSBuby1vcC5cbiAgICAgIGlmIChzaHV0ZG93bi5zaWduYWwuYWJvcnRlZCkgc2h1dGRvd24gPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBlbWl0R2F1Z2UoU0NIRURVTEVSX0lOVEVSVkFMX01FVFJJQywgbWV0cmljTGFiZWxzLCBvcHRzLmludGVydmFsTXMgLyAxMDAwKTtcbiAgICAgIGVtaXRHYXVnZShTQ0hFRFVMRVJfU1RBUlRFRF9NRVRSSUMsIG1ldHJpY0xhYmVscywgRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgaWYgKG9wdHMubG9jayAmJiAhb3B0cy5sb2NrLnJlZGlzICYmICFob2xkc0VudkxvY2spIHtcbiAgICAgICAgZW52TG9jayA9IGFjcXVpcmVTaGFyZWRFbnZMb2NrKCk7XG4gICAgICAgIGhvbGRzRW52TG9jayA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAob3B0cy5zdGFydHVwRGVsYXlNcyAmJiBvcHRzLnN0YXJ0dXBEZWxheU1zID4gMCkge1xuICAgICAgICBzdGFydHVwID0gc2V0VGltZW91dCgoKSA9PiB7IHN0YXJ0dXAgPSBudWxsOyBiZWdpbigpOyB9LCBvcHRzLnN0YXJ0dXBEZWxheU1zKTtcbiAgICAgICAgc3RhcnR1cC51bnJlZigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmVnaW4oKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKCdTY2hlZHVsZXIgc3RhcnRlZCcsIHsgaW50ZXJ2YWxNczogb3B0cy5pbnRlcnZhbE1zLCBsb2NrZWQ6ICEhb3B0cy5sb2NrICYmICghIW9wdHMubG9jay5yZWRpcyB8fCAhIWVudkxvY2spIH0pO1xuICAgIH0sXG4gICAgc3RvcCgpOiB2b2lkIHtcbiAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgaWYgKHN0YXJ0dXApIHsgY2xlYXJUaW1lb3V0KHN0YXJ0dXApOyBzdGFydHVwID0gbnVsbDsgfVxuICAgICAgaWYgKGludGVydmFsKSB7IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpOyBpbnRlcnZhbCA9IG51bGw7IH1cbiAgICAgIC8vIEFzayBhbiBpbi1mbGlnaHQgY3ljbGUgdG8gd2luZCB1cC4gQSBzaWduYWwtYXdhcmUgYHJ1bmAgcmV0dXJucyBiZXR3ZWVuXG4gICAgICAvLyB1bml0cyBvZiB3b3JrLCB3aGljaCBsZXRzIHdpdGhMZWFkZXJMb2NrJ3MgYGZpbmFsbHlgIFJFTEVBU0UgdGhlIGxvY2sg4oCUXG4gICAgICAvLyBvdGhlcndpc2UgdGhlIGtleSBzYXQgdGhlcmUgdW50aWwgdGhlIFRUTCBsYXBzZWQgYW5kIHRoZSBqb2Igd2FzIHBhcmtlZFxuICAgICAgLy8gZmxlZXQtd2lkZSBmb3IgdGhhdCBsb25nIGFmdGVyIGV2ZXJ5IHJvbGxpbmcgZGVwbG95LlxuICAgICAgaWYgKCFzaHV0ZG93bi5zaWduYWwuYWJvcnRlZCkgc2h1dGRvd24uYWJvcnQoJ3NodXRkb3duJyk7XG4gICAgICBpZiAoaG9sZHNFbnZMb2NrKSB7XG4gICAgICAgIGhvbGRzRW52TG9jayA9IGZhbHNlO1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gaW5GbGlnaHQ7XG4gICAgICAgIGVudkxvY2sgPSBudWxsO1xuICAgICAgICAvLyBDbG9zaW5nIHRoZSBjbGllbnQgdW5kZXIgYSBydW5uaW5nIGN5Y2xlIGtpbGxzIGl0cyBoZWFydGJlYXQgYW5kIGl0c1xuICAgICAgICAvLyByZWxlYXNlLCBzbyB3YWl0IGZvciB0aGUgY3ljbGUgdG8gc2V0dGxlIGZpcnN0LiBCb3VuZGVkIGJ5IHRoZSBjeWNsZVxuICAgICAgICAvLyBpdHNlbGYsIHdoaWNoIGlzIG5vdyBiZWluZyBhc2tlZCB0byBzdG9wLlxuICAgICAgICB2b2lkIChwZW5kaW5nID8gcGVuZGluZy5jYXRjaCgoKSA9PiB1bmRlZmluZWQpIDogUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4gcmVsZWFzZVNoYXJlZEVudkxvY2soKSk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbygnU2NoZWR1bGVyIHN0b3BwZWQnKTtcbiAgICB9LFxuICB9O1xufVxuIl19
|