velocious 1.0.719 → 1.0.721
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/build/background-jobs/main.js +163 -2
- package/build/configuration.js +20 -2
- package/build/database/advisory-lock-file-backend.js +21 -3
- package/build/database/advisory-lock-lock-server-backend.js +12 -2
- package/build/database/advisory-lock-runner.js +91 -1
- package/build/routes/base-route.js +3 -2
- package/build/routes/basic-route.js +33 -8
- package/build/routes/get-route.js +17 -1
- package/build/routes/post-route.js +17 -1
- package/build/routes/resolver.js +5 -3
- package/build/src/background-jobs/main.d.ts +60 -0
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +154 -3
- package/build/src/configuration.d.ts +18 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +20 -3
- package/build/src/database/advisory-lock-file-backend.d.ts +2 -1
- package/build/src/database/advisory-lock-file-backend.d.ts.map +1 -1
- package/build/src/database/advisory-lock-file-backend.js +18 -5
- package/build/src/database/advisory-lock-lock-server-backend.d.ts +5 -1
- package/build/src/database/advisory-lock-lock-server-backend.d.ts.map +1 -1
- package/build/src/database/advisory-lock-lock-server-backend.js +11 -3
- package/build/src/database/advisory-lock-runner.d.ts +42 -0
- package/build/src/database/advisory-lock-runner.d.ts.map +1 -1
- package/build/src/database/advisory-lock-runner.js +82 -2
- package/build/src/routes/base-route.d.ts +3 -2
- package/build/src/routes/base-route.d.ts.map +1 -1
- package/build/src/routes/base-route.js +4 -3
- package/build/src/routes/basic-route.d.ts +19 -6
- package/build/src/routes/basic-route.d.ts.map +1 -1
- package/build/src/routes/basic-route.js +29 -9
- package/build/src/routes/get-route.d.ts +12 -1
- package/build/src/routes/get-route.d.ts.map +1 -1
- package/build/src/routes/get-route.js +16 -2
- package/build/src/routes/post-route.d.ts +12 -1
- package/build/src/routes/post-route.d.ts.map +1 -1
- package/build/src/routes/post-route.js +16 -2
- package/build/src/routes/resolver.d.ts +2 -1
- package/build/src/routes/resolver.d.ts.map +1 -1
- package/build/src/routes/resolver.js +6 -4
- package/package.json +1 -1
- package/src/background-jobs/main.js +163 -2
- package/src/configuration.js +20 -2
- package/src/database/advisory-lock-file-backend.js +21 -3
- package/src/database/advisory-lock-lock-server-backend.js +12 -2
- package/src/database/advisory-lock-runner.js +91 -1
- package/src/routes/base-route.js +3 -2
- package/src/routes/basic-route.js +33 -8
- package/src/routes/get-route.js +17 -1
- package/src/routes/post-route.js +17 -1
- package/src/routes/resolver.js +5 -3
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
3
|
import timeout, { TimeoutError } from "awaitery/build/timeout.js";
|
|
3
4
|
import { DEFAULT_ADVISORY_LOCK_ACQUIRE_TIMEOUT_MS } from "./advisory-lock-bound.js";
|
|
4
5
|
import { AdvisoryLockBackendUnavailableError, resolveAdvisoryLockBackendPolicy, refuseAdvisoryLockTierBelowMinimum } from "./advisory-lock-backend-policy.js";
|
|
@@ -46,6 +47,26 @@ class AdvisoryLockBusyError extends Error {
|
|
|
46
47
|
this.lockName = name;
|
|
47
48
|
}
|
|
48
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Advisory locks held by one async context, keyed by
|
|
52
|
+
* `<databaseIdentifier>\u0000<lock name>` and carrying the re-entry depth plus
|
|
53
|
+
* the provenance of the tier that actually holds the lock.
|
|
54
|
+
*
|
|
55
|
+
* Re-entry is scoped to the async context, not to the process: a nested call
|
|
56
|
+
* made inside a held callback belongs to the same logical operation and must
|
|
57
|
+
* not contend with itself, while an unrelated concurrent request in the same
|
|
58
|
+
* process is a different context and must still wait. That is Ruby's `Monitor`
|
|
59
|
+
* ("re-entrant for the holding thread") expressed with the async-context
|
|
60
|
+
* analogue of a thread.
|
|
61
|
+
*
|
|
62
|
+
* Without this, the four tiers disagreed on re-entry: a nested acquisition on
|
|
63
|
+
* a `dedicatedConnection` opened a second connection and self-deadlocked, the
|
|
64
|
+
* file tier refused it as held, and the lock-server tier received
|
|
65
|
+
* `already-held` and treated it as contention. Applications worked around it
|
|
66
|
+
* with hand-passed `*LockHeld` booleans, which is exactly the parameter a
|
|
67
|
+
* monitor makes redundant.
|
|
68
|
+
*/
|
|
69
|
+
const heldAdvisoryLocks = new AsyncLocalStorage();
|
|
49
70
|
/**
|
|
50
71
|
* Thrown when a callback holds an advisory lock longer than `holdTimeoutMs`.
|
|
51
72
|
*/
|
|
@@ -92,6 +113,9 @@ export default class AdvisoryLockRunner {
|
|
|
92
113
|
* @returns {Promise<T>} - Resolves with the callback result.
|
|
93
114
|
*/
|
|
94
115
|
async withAdvisoryLock(name, callback, args = {}) {
|
|
116
|
+
const heldEntry = this.heldEntryFor(name);
|
|
117
|
+
if (heldEntry)
|
|
118
|
+
return await this.runReentrantCallback({ callback, entry: heldEntry, name });
|
|
95
119
|
const lockServerResult = await this.attemptLockServer({ args, callback, mode: "wait", name });
|
|
96
120
|
// The wait mode never returns a deferred outcome, so the value member is present.
|
|
97
121
|
if (lockServerResult)
|
|
@@ -131,6 +155,9 @@ export default class AdvisoryLockRunner {
|
|
|
131
155
|
* @returns {Promise<T>} - Resolves with the callback result.
|
|
132
156
|
*/
|
|
133
157
|
async withAdvisoryLockOrFail(name, callback, args = {}) {
|
|
158
|
+
const heldEntry = this.heldEntryFor(name);
|
|
159
|
+
if (heldEntry)
|
|
160
|
+
return await this.runReentrantCallback({ callback, entry: heldEntry, name });
|
|
134
161
|
const lockServerResult = await this.attemptLockServer({ args, callback, mode: "or-fail", name });
|
|
135
162
|
// The or-fail mode throws on contention, so the value member is present.
|
|
136
163
|
if (lockServerResult)
|
|
@@ -177,6 +204,9 @@ export default class AdvisoryLockRunner {
|
|
|
177
204
|
* @returns {Promise<{acquired: true, result: T} | {acquired: false, reason: "contended", lockName: string}>} - Either the held-callback result or the defer outcome.
|
|
178
205
|
*/
|
|
179
206
|
async withAdvisoryLockOrDefer(name, callback, args = {}) {
|
|
207
|
+
const heldEntry = this.heldEntryFor(name);
|
|
208
|
+
if (heldEntry)
|
|
209
|
+
return { acquired: true, result: await this.runReentrantCallback({ callback, entry: heldEntry, name }) };
|
|
180
210
|
const lockServerResult = await this.attemptLockServer({ args, callback, mode: "defer", name });
|
|
181
211
|
if (lockServerResult) {
|
|
182
212
|
if ("deferred" in lockServerResult)
|
|
@@ -211,13 +241,63 @@ export default class AdvisoryLockRunner {
|
|
|
211
241
|
* @returns {Promise<T>} - Resolves with the callback result.
|
|
212
242
|
*/
|
|
213
243
|
async runLockedCallback({ callback, holdTimeoutMs, lockBackend, name, release }) {
|
|
244
|
+
const store = new Map(heldAdvisoryLocks.getStore() ?? []);
|
|
245
|
+
store.set(this.lockStorageKey(name), { depth: 1, lockBackend });
|
|
214
246
|
try {
|
|
215
|
-
|
|
247
|
+
// The lock is released outside the context scope: a release path that
|
|
248
|
+
// touches the same name (a cleanup hook, an error reporter) must not look
|
|
249
|
+
// like a re-entry of a hold that is already over.
|
|
250
|
+
return await heldAdvisoryLocks.run(store, async () => await AdvisoryLockRunner.runWithAdvisoryLockHoldTimeout(name, callback, holdTimeoutMs, lockBackend));
|
|
216
251
|
}
|
|
217
252
|
finally {
|
|
218
253
|
await release();
|
|
219
254
|
}
|
|
220
255
|
}
|
|
256
|
+
/**
|
|
257
|
+
* Returns the held entry when this async context already holds the lock.
|
|
258
|
+
* @param {string} name - Lock name.
|
|
259
|
+
* @returns {{depth: number, lockBackend: AdvisoryLockBackendProvenance} | null} - The held entry, or null when this context does not hold the lock.
|
|
260
|
+
*/
|
|
261
|
+
heldEntryFor(name) {
|
|
262
|
+
const store = heldAdvisoryLocks.getStore();
|
|
263
|
+
if (!store)
|
|
264
|
+
return null;
|
|
265
|
+
return store.get(this.lockStorageKey(name)) ?? null;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Runs a callback as a re-entry of a lock this async context already holds.
|
|
269
|
+
*
|
|
270
|
+
* The re-entry adds no backend round trip and cannot fail on contention: the
|
|
271
|
+
* outer hold already owns the lock, so mutual exclusion is unchanged. The
|
|
272
|
+
* outer hold owns the hold timeout and the lease; a re-entry does not start a
|
|
273
|
+
* second one, and the callback therefore receives the outer provenance without
|
|
274
|
+
* a `control`.
|
|
275
|
+
* @template T
|
|
276
|
+
* @param {{callback: (args?: {control?: import("awaitery/build/timeout.js").TimeoutControl, lockBackend: AdvisoryLockBackendProvenance}) => Promise<T>, entry: {depth: number, lockBackend: AdvisoryLockBackendProvenance}, name: string}} args - Re-entry request.
|
|
277
|
+
* @returns {Promise<T>} - Callback result.
|
|
278
|
+
*/
|
|
279
|
+
async runReentrantCallback({ callback, entry, name }) {
|
|
280
|
+
entry.depth += 1;
|
|
281
|
+
this.configuration.recordAdvisoryLockReentry({ lockName: name });
|
|
282
|
+
try {
|
|
283
|
+
return await callback({ lockBackend: entry.lockBackend });
|
|
284
|
+
}
|
|
285
|
+
finally {
|
|
286
|
+
entry.depth -= 1;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Builds the async-context storage key for one lock name.
|
|
291
|
+
*
|
|
292
|
+
* The database identifier is part of the key because it is part of the lock's
|
|
293
|
+
* identity: two tenant databases reusing one name hold two different locks,
|
|
294
|
+
* and a nested call in the other database is not a re-entry.
|
|
295
|
+
* @param {string} name - Lock name.
|
|
296
|
+
* @returns {string} - Storage key for the held-entry map.
|
|
297
|
+
*/
|
|
298
|
+
lockStorageKey(name) {
|
|
299
|
+
return `${this.databaseIdentifier}\u0000${name}`;
|
|
300
|
+
}
|
|
221
301
|
/**
|
|
222
302
|
* Serves one acquisition on the lock-server tier when the lock name prefers
|
|
223
303
|
* it (design §1/§9), falling *upward* to the driver path when the server is
|
|
@@ -547,4 +627,4 @@ function advisoryLockPolicyAllowsFileTier(policy) {
|
|
|
547
627
|
export { AdvisoryLockBusyError, AdvisoryLockHoldTimeoutError, AdvisoryLockTimeoutError };
|
|
548
628
|
export { AdvisoryLockBackendUnavailableError, AdvisoryLockMinTierRefusedError } from "./advisory-lock-backend-policy.js";
|
|
549
629
|
export { AdvisoryLockLostError, AdvisoryLockServiceUnavailableError } from "./advisory-lock-errors.js";
|
|
550
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2aXNvcnktbG9jay1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJhc2UvYWR2aXNvcnktbG9jay1ydW5uZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sT0FBTyxFQUFFLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFDL0QsT0FBTyxFQUFDLHdDQUF3QyxFQUFDLE1BQU0sMEJBQTBCLENBQUE7QUFDakYsT0FBTyxFQUNMLG1DQUFtQyxFQUNuQyxnQ0FBZ0MsRUFDaEMsa0NBQWtDLEVBQ25DLE1BQU0sbUNBQW1DLENBQUE7QUFDMUMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixtQ0FBbUMsRUFDbkMsOEJBQThCLEVBQy9CLE1BQU0sMkJBQTJCLENBQUE7QUFDbEMsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sOEJBQThCLENBQUE7QUFFM0U7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7R0FFRztBQUNILE1BQU0sd0JBQXlCLFNBQVEsS0FBSztJQUMxQzs7OztPQUlHO0lBQ0gsWUFBWSxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUM7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2QsSUFBSSxDQUFDLElBQUksR0FBRywwQkFBMEIsQ0FBQTtRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtJQUN0QixDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0scUJBQXNCLFNBQVEsS0FBSztJQUN2Qzs7OztPQUlHO0lBQ0gsWUFBWSxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUM7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2QsSUFBSSxDQUFDLElBQUksR0FBRyx1QkFBdUIsQ0FBQTtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtJQUN0QixDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sNEJB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QUFBO0FBQ3RGLE9BQU8sRUFBQyxtQ0FBbUMsRUFBRSwrQkFBK0IsRUFBQyxNQUFNLG1DQUFtQyxDQUFBO0FBQ3RILE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxtQ0FBbUMsRUFBQyxNQUFNLDJCQUEyQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB0aW1lb3V0LCB7VGltZW91dEVycm9yfSBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiXG5pbXBvcnQge0RFRkFVTFRfQURWSVNPUllfTE9DS19BQ1FVSVJFX1RJTUVPVVRfTVN9IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2stYm91bmQuanNcIlxuaW1wb3J0IHtcbiAgQWR2aXNvcnlMb2NrQmFja2VuZFVuYXZhaWxhYmxlRXJyb3IsXG4gIHJlc29sdmVBZHZpc29yeUxvY2tCYWNrZW5kUG9saWN5LFxuICByZWZ1c2VBZHZpc29yeUxvY2tUaWVyQmVsb3dNaW5pbXVtXG59IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2stYmFja2VuZC1wb2xpY3kuanNcIlxuaW1wb3J0IHtcbiAgQWR2aXNvcnlMb2NrTG9zdEVycm9yLFxuICBBZHZpc29yeUxvY2tTZXJ2aWNlVW5hdmFpbGFibGVFcnJvcixcbiAgYWR2aXNvcnlMb2NrQmFja2VuZFVuYXZhaWxhYmxlXG59IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2stZXJyb3JzLmpzXCJcbmltcG9ydCB7ZW1pdEFkdmlzb3J5TG9ja0ZhbGxiYWNrUmVwb3J0fSBmcm9tIFwiLi9hZHZpc29yeS1sb2NrLXRlbGVtZXRyeS5qc1wiXG5cbi8qKlxuICogUHJvdmVuYW5jZSBvZiBvbmUgYWR2aXNvcnktbG9jayBhY3F1aXNpdGlvbiAoU1RDLTIxMCBkZXNpZ24gwqczKTogZXZlcnlcbiAqIGhlbGQgbG9jayByZXBvcnRzIHRoZSB0aWVyIHRoYXQgYWN0dWFsbHkgc2VydmVkIGl0LCBzbyBhIGZhbGxiYWNrIGlzXG4gKiB2aXNpYmxlIHRvIHRoZSBjYWxsYmFjaywgaW4gbG9ncywgYW5kIGluIGBnZXRBZHZpc29yeUxvY2tCYWNrZW5kU3RhdHVzKClgLlxuICogQHR5cGVkZWYge29iamVjdH0gQWR2aXNvcnlMb2NrQmFja2VuZFByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9hZHZpc29yeS1sb2NrLWJhY2tlbmQtcG9saWN5LmpzXCIpLkFkdmlzb3J5TG9ja1RpZXJ9IGJhY2tlbmQgLSBUaWVyIHRoYXQgc2VydmVkIHRoZSBhY3F1aXNpdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZHJpdmVyVHlwZV0gLSBEYXRhYmFzZSBkcml2ZXIgdHlwZSB3aGVuIHRoZSBkcml2ZXIgdGllciBzZXJ2ZWQgaXQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2Vwb2NoXSAtIEZlbmNpbmcgZXBvY2ggd2hlbiB0aGUgc2VydmluZyB0aWVyIGlzc3VlcyBvbmUuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGZlbmNpbmdTdXBwb3J0ZWQgLSBXaGV0aGVyIHRoaXMgdGllciBjYXJyaWVzIGZlbmNpbmcgdG9rZW5zIChkZXNpZ24gwqc4KTsgdGhlIGZpbGUgdGllciByZXBvcnRzIGZhbHNlIHJhdGhlciB0aGFuIHByZXRlbmRpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvbGRlcklkXSAtIEJhY2tlbmQgaG9sZGVyIGlkIGZvciB0aGUgZmlsZSB0aWVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtsb2NrTmFtZV0gLSBMb2NrIG5hbWUgdGhpcyBwcm92ZW5hbmNlIGJlbG9uZ3MgdG8uXG4gKi9cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhbiBhZHZpc29yeSBsb2NrIGNvdWxkIG5vdCBiZSBhY3F1aXJlZCBiZWZvcmUgYHRpbWVvdXRNc2AgZWxhcHNlZC5cbiAqL1xuY2xhc3MgQWR2aXNvcnlMb2NrVGltZW91dEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge3tuYW1lOiBzdHJpbmd9fSBhcmdzIC0gVGhlIGFkdmlzb3J5IGxvY2sgbmFtZSB0aGF0IHRpbWVkIG91dC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHtuYW1lfSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gXCJBZHZpc29yeUxvY2tUaW1lb3V0RXJyb3JcIlxuICAgIHRoaXMubG9ja05hbWUgPSBuYW1lXG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBgd2l0aEFkdmlzb3J5TG9ja09yRmFpbGAgZmluZHMgdGhlIGxvY2sgYWxyZWFkeSBoZWxkLlxuICovXG5jbGFzcyBBZHZpc29yeUxvY2tCdXN5RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7e25hbWU6IHN0cmluZ319IGFyZ3MgLSBUaGUgYWR2aXNvcnkgbG9jayBuYW1lIHRoYXQgd2FzIGFscmVhZHkgaGVsZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHtuYW1lfSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gXCJBZHZpc29yeUxvY2tCdXN5RXJyb3JcIlxuICAgIHRoaXMubG9ja05hbWUgPSBuYW1lXG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIGNhbGxiYWNrIGhvbGRzIGFuIGFkdmlzb3J5IGxvY2sgbG9uZ2VyIHRoYW4gYGhvbGRUaW1lb3V0TXNgLlxuICovXG5jbGFzcyBBZHZpc29yeUxvY2tIb2xkVGltZW91dEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge3tuYW1lOiBzdHJpbmd9fSBhcmdzIC0gVGhlIGFkdmlzb3J5IGxvY2sgbmFtZSB3aG9zZSBob2xkIHRpbWVkIG91dC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHtuYW1lfSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gXCJBZHZpc29yeUxvY2tIb2xkVGltZW91dEVycm9yXCJcbiAgICB0aGlzLmxvY2tOYW1lID0gbmFtZVxuICB9XG59XG5cbi8qKlxuICogUnVucyBhZHZpc29yeSBsb2NrcyBvbiB0aGUgY2FsbGVyIGNvbm5lY3Rpb24gYnkgZGVmYXVsdCwgdXNpbmcgYSBkZWRpY2F0ZWRcbiAqIGxvY2sgY29ubmVjdGlvbiB3aGVuIGBkZWRpY2F0ZWRDb25uZWN0aW9uYCBpcyByZXF1ZXN0ZWQgb3Igd2hlbiBhIHBvc2l0aXZlXG4gKiBob2xkIHRpbWVvdXQgbmVlZHMgc2VwYXJhdGUgb3duZXJzaGlwLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZHZpc29yeUxvY2tSdW5uZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBhZHZpc29yeS1sb2NrIHJ1bm5lciBmb3Igb25lIG1vZGVsIGRhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7e2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgY29ubmVjdGlvblByb3ZpZGVyOiAoKSA9PiBpbXBvcnQoXCIuL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZ319IGFyZ3MgLSBSdW5uZXIgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGNvbm5lY3Rpb25Qcm92aWRlciwgZGF0YWJhc2VJZGVudGlmaWVyfSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmNvbm5lY3Rpb25Qcm92aWRlciA9IGNvbm5lY3Rpb25Qcm92aWRlclxuICAgIHRoaXMuZGF0YWJhc2VJZGVudGlmaWVyID0gZGF0YWJhc2VJZGVudGlmaWVyXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIGNhbGxiYWNrIGFmdGVyIGFjcXVpcmluZyB0aGUgYWR2aXNvcnkgbG9jaywgd2FpdGluZyB1cCB0byBgdGltZW91dE1zYC5cbiAgICogV2hlbiBgZGVkaWNhdGVkQ29ubmVjdGlvbmAgaXMgdHJ1ZSB0aGUgbG9jayBpcyBhY3F1aXJlZCBvbiBhIHNwYXduZWRcbiAgICogY29ubmVjdGlvbiB0aGF0IGlzIHJlbGVhc2VkIGFmdGVyIHRoZSBjYWxsYmFjayBmaW5pc2hlcywgd2hpbGUgdGhlIGNhbGxiYWNrXG4gICAqIGl0c2VsZiBzdGlsbCBydW5zIGFnYWluc3QgdGhlIGNhbGxlci9tb2RlbCBjb25uZWN0aW9uLiBXaGVuIGEgYGhvbGRUaW1lb3V0TXNgXG4gICAqIGlzIHNldCB0aGUgY2FsbGJhY2sgcmVjZWl2ZXMgYSBgVGltZW91dENvbnRyb2xgIGZyb20gYXdhaXRlcnkgZm9yIGNvb3BlcmF0aXZlXG4gICAqIGNhbmNlbGxhdGlvbiAoYGNvbnRyb2wuY2hlY2soKWAsIGBjb250cm9sLnNpZ25hbGAsIGBjb250cm9sLnRpbWVkT3V0YCxcbiAgICogYGNvbnRyb2wucmVtYWluaW5nKClgKTsgYSBkZWRpY2F0ZWQgY29ubmVjdGlvbiBpcyBhbHNvIHVzZWQgc28gdGltZW91dFxuICAgKiBjbGVhbnVwIGNhbiByZWxlYXNlIHRoZSBsb2NrIGV2ZW4gaWYgY2FsbGJhY2sgZGF0YWJhc2Ugd29yayBpcyBzdHVjay5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7KGFyZ3M/OiB7Y29udHJvbD86IGltcG9ydChcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIikuVGltZW91dENvbnRyb2wsIGxvY2tCYWNrZW5kOiBBZHZpc29yeUxvY2tCYWNrZW5kUHJvdmVuYW5jZX0pID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gaW52b2tlIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGQuXG4gICAqIEBwYXJhbSB7e3RpbWVvdXRNcz86IG51bWJlciB8IG51bGwsIGhvbGRUaW1lb3V0TXM/OiBudW1iZXIgfCBudWxsLCBkZWRpY2F0ZWRDb25uZWN0aW9uPzogYm9vbGVhbn19IFthcmdzXSAtIExvY2sgYW5kIGhvbGQgdGltZW91dCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRoQWR2aXNvcnlMb2NrKG5hbWUsIGNhbGxiYWNrLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBsb2NrU2VydmVyUmVzdWx0ID0gYXdhaXQgdGhpcy5hdHRlbXB0TG9ja1NlcnZlcih7YXJncywgY2FsbGJhY2ssIG1vZGU6IFwid2FpdFwiLCBuYW1lfSlcblxuICAgIC8vIFRoZSB3YWl0IG1vZGUgbmV2ZXIgcmV0dXJucyBhIGRlZmVycmVkIG91dGNvbWUsIHNvIHRoZSB2YWx1ZSBtZW1iZXIgaXMgcHJlc2VudC5cbiAgICBpZiAobG9ja1NlcnZlclJlc3VsdCkgcmV0dXJuIC8qKiBAdHlwZSB7e3ZhbHVlOiBUfX0gKi8gKGxvY2tTZXJ2ZXJSZXN1bHQpLnZhbHVlXG5cbiAgICBjb25zdCBmaWxlQmFja2VuZCA9IGF3YWl0IHRoaXMuZmlsZUJhY2tlbmRGb3JOYW1lKG5hbWUpXG5cbiAgICBpZiAoZmlsZUJhY2tlbmQpIHtcbiAgICAgIGNvbnN0IGFjcXVpcmVkID0gYXdhaXQgZmlsZUJhY2tlbmQuYWNxdWlyZShuYW1lLCB7dGltZW91dE1zOiB0aGlzLmFjcXVpcmVUaW1lb3V0TXMoYXJncyl9KVxuXG4gICAgICBpZiAoIWFjcXVpcmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBBZHZpc29yeUxvY2tUaW1lb3V0RXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBhZHZpc29yeSBsb2NrICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9IG9uIHRoZSBmaWxlIHRpZXJgLCB7bmFtZX0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvY2tCYWNrZW5kID0gdGhpcy5maWxlUHJvdmVuYW5jZShmaWxlQmFja2VuZCwgbmFtZSlcblxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnJlY29yZEFkdmlzb3J5TG9ja0FjcXVpc2l0aW9uKHtiYWNrZW5kOiBsb2NrQmFja2VuZC5iYWNrZW5kLCBmZW5jaW5nU3VwcG9ydGVkOiBsb2NrQmFja2VuZC5mZW5jaW5nU3VwcG9ydGVkLCBsb2NrTmFtZTogbmFtZX0pXG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bkxvY2tlZENhbGxiYWNrKHtjYWxsYmFjaywgaG9sZFRpbWVvdXRNczogYXJncy5ob2xkVGltZW91dE1zLCBsb2NrQmFja2VuZCwgbmFtZSwgcmVsZWFzZTogYXN5bmMgKCkgPT4gYXdhaXQgZmlsZUJhY2tlbmQucmVsZWFzZShuYW1lKX0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aExvY2tDb25uZWN0aW9uKGFyZ3MsIGFzeW5jIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBsb2NrQmFja2VuZCA9IHRoaXMuZHJpdmVyUHJvdmVuYW5jZShjb25uZWN0aW9uKVxuXG4gICAgICB0aGlzLmFzc2VydERyaXZlclRpZXJFbGlnaWJsZShuYW1lLCBsb2NrQmFja2VuZClcblxuICAgICAgY29uc3QgYWNxdWlyZWQgPSBhd2FpdCBjb25uZWN0aW9uLmFjcXVpcmVBZHZpc29yeUxvY2sobmFtZSwgYXJncylcblxuICAgICAgaWYgKCFhY3F1aXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgQWR2aXNvcnlMb2NrVGltZW91dEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgYWR2aXNvcnkgbG9jayAke0pTT04uc3RyaW5naWZ5KG5hbWUpfWAsIHtuYW1lfSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnJlY29yZEFkdmlzb3J5TG9ja0FjcXVpc2l0aW9uKHtiYWNrZW5kOiBsb2NrQmFja2VuZC5iYWNrZW5kLCBmZW5jaW5nU3VwcG9ydGVkOiBsb2NrQmFja2VuZC5mZW5jaW5nU3VwcG9ydGVkLCBsb2NrTmFtZTogbmFtZX0pXG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bkxvY2tlZENhbGxiYWNrKHtjYWxsYmFjaywgaG9sZFRpbWVvdXRNczogYXJncy5ob2xkVGltZW91dE1zLCBsb2NrQmFja2VuZCwgbmFtZSwgcmVsZWFzZTogYXN5bmMgKCkgPT4gYXdhaXQgY29ubmVjdGlvbi5yZWxlYXNlQWR2aXNvcnlMb2NrKG5hbWUpfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBjYWxsYmFjayBvbmx5IGlmIHRoZSBhZHZpc29yeSBsb2NrIGNhbiBiZSBhY3F1aXJlZCBpbW1lZGlhdGVseS5cbiAgICogV2hlbiBgZGVkaWNhdGVkQ29ubmVjdGlvbmAgaXMgdHJ1ZSB0aGUgbG9jayBpcyBhY3F1aXJlZCBvbiBhIHNwYXduZWRcbiAgICogY29ubmVjdGlvbiB0aGF0IGlzIHJlbGVhc2VkIGFmdGVyIHRoZSBjYWxsYmFjayBmaW5pc2hlcywgd2hpbGUgdGhlIGNhbGxiYWNrXG4gICAqIGl0c2VsZiBzdGlsbCBydW5zIGFnYWluc3QgdGhlIGNhbGxlci9tb2RlbCBjb25uZWN0aW9uLiBXaGVuIGEgYGhvbGRUaW1lb3V0TXNgXG4gICAqIGlzIHNldCB0aGUgY2FsbGJhY2sgcmVjZWl2ZXMgYSBgVGltZW91dENvbnRyb2xgIGZyb20gYXdhaXRlcnkgZm9yIGNvb3BlcmF0aXZlXG4gICAqIGNhbmNlbGxhdGlvbi5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7KGFyZ3M/OiB7Y29udHJvbD86IGltcG9ydChcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIikuVGltZW91dENvbnRyb2wsIGxvY2tCYWNrZW5kOiBBZHZpc29yeUxvY2tCYWNrZW5kUHJvdmVuYW5jZX0pID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gaW52b2tlIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGQuXG4gICAqIEBwYXJhbSB7e2hvbGRUaW1lb3V0TXM/OiBudW1iZXIgfCBudWxsLCBkZWRpY2F0ZWRDb25uZWN0aW9uPzogYm9vbGVhbn19IFthcmdzXSAtIEhvbGQgdGltZW91dCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRoQWR2aXNvcnlMb2NrT3JGYWlsKG5hbWUsIGNhbGxiYWNrLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBsb2NrU2VydmVyUmVzdWx0ID0gYXdhaXQgdGhpcy5hdHRlbXB0TG9ja1NlcnZlcih7YXJncywgY2FsbGJhY2ssIG1vZGU6IFwib3ItZmFpbFwiLCBuYW1lfSlcblxuICAgIC8vIFRoZSBvci1mYWlsIG1vZGUgdGhyb3dzIG9uIGNvbnRlbnRpb24sIHNvIHRoZSB2YWx1ZSBtZW1iZXIgaXMgcHJlc2VudC5cbiAgICBpZiAobG9ja1NlcnZlclJlc3VsdCkgcmV0dXJuIC8qKiBAdHlwZSB7e3ZhbHVlOiBUfX0gKi8gKGxvY2tTZXJ2ZXJSZXN1bHQpLnZhbHVlXG5cbiAgICBjb25zdCBmaWxlQmFja2VuZCA9IGF3YWl0IHRoaXMuZmlsZUJhY2tlbmRGb3JOYW1lKG5hbWUpXG5cbiAgICBpZiAoZmlsZUJhY2tlbmQpIHtcbiAgICAgIGNvbnN0IGFjcXVpcmVkID0gYXdhaXQgZmlsZUJhY2tlbmQudHJ5QWNxdWlyZShuYW1lKVxuXG4gICAgICBpZiAoIWFjcXVpcmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBBZHZpc29yeUxvY2tCdXN5RXJyb3IoYEFkdmlzb3J5IGxvY2sgJHtKU09OLnN0cmluZ2lmeShuYW1lKX0gaXMgYWxyZWFkeSBoZWxkIG9uIHRoZSBmaWxlIHRpZXJgLCB7bmFtZX0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvY2tCYWNrZW5kID0gdGhpcy5maWxlUHJvdmVuYW5jZShmaWxlQmFja2VuZCwgbmFtZSlcblxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnJlY29yZEFkdmlzb3J5TG9ja0FjcXVpc2l0aW9uKHtiYWNrZW5kOiBsb2NrQmFja2VuZC5iYWNrZW5kLCBmZW5jaW5nU3VwcG9ydGVkOiBsb2NrQmFja2VuZC5mZW5jaW5nU3VwcG9ydGVkLCBsb2NrTmFtZTogbmFtZX0pXG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bkxvY2tlZENhbGxiYWNrKHtjYWxsYmFjaywgaG9sZFRpbWVvdXRNczogYXJncy5ob2xkVGltZW91dE1zLCBsb2NrQmFja2VuZCwgbmFtZSwgcmVsZWFzZTogYXN5bmMgKCkgPT4gYXdhaXQgZmlsZUJhY2tlbmQucmVsZWFzZShuYW1lKX0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aExvY2tDb25uZWN0aW9uKGFyZ3MsIGFzeW5jIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBsb2NrQmFja2VuZCA9IHRoaXMuZHJpdmVyUHJvdmVuYW5jZShjb25uZWN0aW9uKVxuXG4gICAgICB0aGlzLmFzc2VydERyaXZlclRpZXJFbGlnaWJsZShuYW1lLCBsb2NrQmFja2VuZClcblxuICAgICAgY29uc3QgYWNxdWlyZWQgPSBhd2FpdCBjb25uZWN0aW9uLnRyeUFjcXVpcmVBZHZpc29yeUxvY2sobmFtZSlcblxuICAgICAgaWYgKCFhY3F1aXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgQWR2aXNvcnlMb2NrQnVzeUVycm9yKGBBZHZpc29yeSBsb2NrICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9IGlzIGFscmVhZHkgaGVsZGAsIHtuYW1lfSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnJlY29yZEFkdmlzb3J5TG9ja0FjcXVpc2l0aW9uKHtiYWNrZW5kOiBsb2NrQmFja2VuZC5iYWNrZW5kLCBmZW5jaW5nU3VwcG9ydGVkOiBsb2NrQmFja2VuZC5mZW5jaW5nU3VwcG9ydGVkLCBsb2NrTmFtZTogbmFtZX0pXG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bkxvY2tlZENhbGxiYWNrKHtjYWxsYmFjaywgaG9sZFRpbWVvdXRNczogYXJncy5ob2xkVGltZW91dE1zLCBsb2NrQmFja2VuZCwgbmFtZSwgcmVsZWFzZTogYXN5bmMgKCkgPT4gYXdhaXQgY29ubmVjdGlvbi5yZWxlYXNlQWR2aXNvcnlMb2NrKG5hbWUpfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gIC8qKlxuICAgKiBSdW5zIGEgY2FsbGJhY2sgaWYgdGhlIGFkdmlzb3J5IGxvY2sgY2FuIGJlIGFjcXVpcmVkIHdpdGhvdXQgd2FpdGluZztcbiAgICogb3RoZXJ3aXNlIHJldHVybnMgYSBge2FjcXVpcmVkOiBmYWxzZX1gIGRlZmVyIHJlc3VsdCBpbnN0ZWFkIG9mIHRocm93aW5nLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBub24tdGhyb3dpbmcgY291bnRlcnBhcnQgb2YgYHdpdGhBZHZpc29yeUxvY2tPckZhaWxgIGZvciBob3RcbiAgICogcGF0aHM6IFwiaG9sZGVyIGJ1c3ksIGRlZmVyIG1lXCIgaXMgYSBmaXJzdC1jbGFzcyBvdXRjb21lLCBzbyBhIGNvbnRlbmRlZFxuICAgKiBsb2NrIHByb2R1Y2VzIHplcm8gZXhjZXB0aW9uIHRyYWZmaWMgYW5kIOKAlCBiZWNhdXNlIHRoZSBwcm9iZSBpcyBhIHNpbmdsZVxuICAgKiBpbW1lZGlhdGUgdHJ5LWFjcXVpcmUg4oCUIHplcm8gcGlubmVkIGNvbm5lY3Rpb25zLiBDYWxsZXJzIHJlc2NoZWR1bGUgdmlhXG4gICAqIHRoZWlyIG93biBldmVudC1kcml2ZW4gcmV0cnkgbWFjaGluZXJ5LiBUaGUgcmVzdWx0IGZvcm0gaXMgaWRlbnRpY2FsXG4gICAqIGFjcm9zcyB0aWVyczogdGhlIGRyaXZlcidzIGB0cnlBY3F1aXJlQWR2aXNvcnlMb2NrYCBtYXBzIHBlci10aWVyIChNeVNRTFxuICAgKiBgR0VUX0xPQ0sobmFtZSwgMClgLCBQb3N0Z3JlU1FMIGBwZ190cnlfYWR2aXNvcnlfbG9ja2AsIFNRTCBTZXJ2ZXJcbiAgICogYHNwX2dldGFwcGxvY2sgQExvY2tUaW1lb3V0ID0gMGAsIFNRTGl0ZSBwcm9jZXNzLWxvY2FsIHF1ZXVlLCBTUUxpdGUgTm9kZVxuICAgKiBmaWxlIGxvY2spLCBzbyBhIGNhbGxlciBuZXZlciBicmFuY2hlcyBvbiB0aGUgYmFja2VuZC5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7KGFyZ3M/OiB7Y29udHJvbD86IGltcG9ydChcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIikuVGltZW91dENvbnRyb2wsIGxvY2tCYWNrZW5kOiBBZHZpc29yeUxvY2tCYWNrZW5kUHJvdmVuYW5jZX0pID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gaW52b2tlIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGQuXG4gICAqIEBwYXJhbSB7e2hvbGRUaW1lb3V0TXM/OiBudW1iZXIgfCBudWxsLCBkZWRpY2F0ZWRDb25uZWN0aW9uPzogYm9vbGVhbn19IFthcmdzXSAtIEhvbGQgdGltZW91dCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7YWNxdWlyZWQ6IHRydWUsIHJlc3VsdDogVH0gfCB7YWNxdWlyZWQ6IGZhbHNlLCByZWFzb246IFwiY29udGVuZGVkXCIsIGxvY2tOYW1lOiBzdHJpbmd9Pn0gLSBFaXRoZXIgdGhlIGhlbGQtY2FsbGJhY2sgcmVzdWx0IG9yIHRoZSBkZWZlciBvdXRjb21lLlxuICAgKi9cbiAgYXN5bmMgd2l0aEFkdmlzb3J5TG9ja09yRGVmZXIobmFtZSwgY2FsbGJhY2ssIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IGxvY2tTZXJ2ZXJSZXN1bHQgPSBhd2FpdCB0aGlzLmF0dGVtcHRMb2NrU2VydmVyKHthcmdzLCBjYWxsYmFjaywgbW9kZTogXCJkZWZlclwiLCBuYW1lfSlcblxuICAgIGlmIChsb2NrU2VydmVyUmVzdWx0KSB7XG4gICAgICBpZiAoXCJkZWZlcnJlZFwiIGluIGxvY2tTZXJ2ZXJSZXN1bHQpIHJldHVybiBsb2NrU2VydmVyUmVzdWx0LmRlZmVycmVkXG5cbiAgICAgIHJldHVybiB7YWNxdWlyZWQ6IHRydWUsIHJlc3VsdDogLyoqIEB0eXBlIHt7dmFsdWU6IFR9fSAqLyAobG9ja1NlcnZlclJlc3VsdCkudmFsdWV9XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZUJhY2tlbmQgPSBhd2FpdCB0aGlzLmZpbGVCYWNrZW5kRm9yTmFtZShuYW1lKVxuXG4gICAgaWYgKGZpbGVCYWNrZW5kKSB7XG4gICAgICBjb25zdCBhY3F1aXJlZCA9IGF3YWl0IGZpbGVCYWNrZW5kLmFjcXVpcmUobmFtZSwge3RpbWVvdXRNczogMH0pXG5cbiAgICAgIGlmICghYWNxdWlyZWQpIHJldHVybiB7YWNxdWlyZWQ6IGZhbHNlLCByZWFzb246IFwiY29udGVuZGVkXCIsIGxvY2tOYW1lOiBuYW1lfVxuXG4gICAgICBjb25zdCBsb2NrQmFja2VuZCA9IHRoaXMuZmlsZVByb3ZlbmFuY2UoZmlsZUJhY2tlbmQsIG5hbWUpXG5cbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5yZWNvcmRBZHZpc29yeUxvY2tBY3F1aXNpdGlvbih7YmFja2VuZDogbG9ja0JhY2tlbmQuYmFja2VuZCwgZmVuY2luZ1N1cHBvcnRlZDogbG9ja0JhY2tlbmQuZmVuY2luZ1N1cHBvcnRlZCwgbG9ja05hbWU6IG5hbWV9KVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkxvY2tlZENhbGxiYWNrKHtjYWxsYmFjaywgaG9sZFRpbWVvdXRNczogYXJncy5ob2xkVGltZW91dE1zLCBsb2NrQmFja2VuZCwgbmFtZSwgcmVsZWFzZTogYXN5bmMgKCkgPT4gYXdhaXQgZmlsZUJhY2tlbmQucmVsZWFzZShuYW1lKX0pXG5cbiAgICAgIHJldHVybiB7YWNxdWlyZWQ6IHRydWUsIHJlc3VsdH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy53aXRoTG9ja0Nvbm5lY3Rpb24oYXJncywgYXN5bmMgKGNvbm5lY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IGFjcXVpcmVkID0gYXdhaXQgY29ubmVjdGlvbi50cnlBY3F1aXJlQWR2aXNvcnlMb2NrKG5hbWUpXG5cbiAgICAgIGlmICghYWNxdWlyZWQpIHJldHVybiB7YWNxdWlyZWQ6IGZhbHNlLCByZWFzb246IFwiY29udGVuZGVkXCIsIGxvY2tOYW1lOiBuYW1lfVxuXG4gICAgICBjb25zdCBsb2NrQmFja2VuZCA9IHRoaXMuZHJpdmVyUHJvdmVuYW5jZShjb25uZWN0aW9uKVxuXG4gICAgICB0aGlzLmFzc2VydERyaXZlclRpZXJFbGlnaWJsZShuYW1lLCBsb2NrQmFja2VuZClcblxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnJlY29yZEFkdmlzb3J5TG9ja0FjcXVpc2l0aW9uKHtiYWNrZW5kOiBsb2NrQmFja2VuZC5iYWNrZW5kLCBmZW5jaW5nU3VwcG9ydGVkOiBsb2NrQmFja2VuZC5mZW5jaW5nU3VwcG9ydGVkLCBsb2NrTmFtZTogbmFtZX0pXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuTG9ja2VkQ2FsbGJhY2soe2NhbGxiYWNrLCBob2xkVGltZW91dE1zOiBhcmdzLmhvbGRUaW1lb3V0TXMsIGxvY2tCYWNrZW5kLCBuYW1lLCByZWxlYXNlOiBhc3luYyAoKSA9PiBhd2FpdCBjb25uZWN0aW9uLnJlbGVhc2VBZHZpc29yeUxvY2sobmFtZSl9KVxuXG4gICAgICByZXR1cm4ge2FjcXVpcmVkOiB0cnVlLCByZXN1bHR9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBsb2NrIGhvbGRlciBjYWxsYmFjayBhbmQgcmVsZWFzZXMgdGhlIGxvY2sgZnJvbSBpdHMgb3duaW5nIGJhY2tlbmQuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2NhbGxiYWNrOiAoYXJncz86IHtjb250cm9sPzogaW1wb3J0KFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiKS5UaW1lb3V0Q29udHJvbCwgbG9ja0JhY2tlbmQ6IEFkdmlzb3J5TG9ja0JhY2tlbmRQcm92ZW5hbmNlfSkgPT4gUHJvbWlzZTxUPiwgaG9sZFRpbWVvdXRNcz86IG51bWJlciB8IG51bGwsIGxvY2tCYWNrZW5kOiBBZHZpc29yeUxvY2tCYWNrZW5kUHJvdmVuYW5jZSwgbmFtZTogc3RyaW5nLCByZWxlYXNlOiAoKSA9PiBQcm9taXNlPHVua25vd24+fX0gYXJncyAtIExvY2tlZCBjYWxsYmFjayBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBydW5Mb2NrZWRDYWxsYmFjayh7Y2FsbGJhY2ssIGhvbGRUaW1lb3V0TXMsIGxvY2tCYWNrZW5kLCBuYW1lLCByZWxlYXNlfSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgQWR2aXNvcnlMb2NrUnVubmVyLnJ1bldpdGhBZHZpc29yeUxvY2tIb2xkVGltZW91dChuYW1lLCBjYWxsYmFjaywgaG9sZFRpbWVvdXRNcywgbG9ja0JhY2tlbmQpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHJlbGVhc2UoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJ2ZXMgb25lIGFjcXVpc2l0aW9uIG9uIHRoZSBsb2NrLXNlcnZlciB0aWVyIHdoZW4gdGhlIGxvY2sgbmFtZSBwcmVmZXJzXG4gICAqIGl0IChkZXNpZ24gwqcxL8KnOSksIGZhbGxpbmcgKnVwd2FyZCogdG8gdGhlIGRyaXZlciBwYXRoIHdoZW4gdGhlIHNlcnZlciBpc1xuICAgKiB1bnJlYWNoYWJsZSBhbmQgdGhlIG5hbWUncyBtaW5pbXVtIHRpZXIgcGVybWl0cyBhIERCLW5hdGl2ZSBob2xkLlxuICAgKlxuICAgKiBgbnVsbGAgbWVhbnMgXCJ0aGlzIHRpZXIgZGlkIG5vdCBzZXJ2ZSB0aGUgYWNxdWlzaXRpb24g4oCUIGNvbnRpbnVlIHdpdGggdGhlXG4gICAqIG5leHQgZWxpZ2libGUgdGllclwiLiBBIHJldHVybmVkIHZhbHVlIG1lYW5zIHRoZSBsb2NrLXNlcnZlciB0aWVyIGFuc3dlcmVkLFxuICAgKiBpbmNsdWRpbmcgYSBkZWZpbml0aXZlIGJ1c3kvdGltZW91dCBvdXRjb21lLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3thcmdzOiB7aG9sZFRpbWVvdXRNcz86IG51bWJlciB8IG51bGwsIHRpbWVvdXRNcz86IG51bWJlciB8IG51bGx9LCBjYWxsYmFjazogKGFyZ3M/OiB7Y29udHJvbD86IGltcG9ydChcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIikuVGltZW91dENvbnRyb2wsIGxvY2tCYWNrZW5kOiBBZHZpc29yeUxvY2tCYWNrZW5kUHJvdmVuYW5jZX0pID0+IFByb21pc2U8VD4sIG1vZGU6IFwid2FpdFwiIHwgXCJvci1mYWlsXCIgfCBcImRlZmVyXCIsIG5hbWU6IHN0cmluZ319IHJlcXVlc3QgLSBBY3F1aXNpdGlvbiByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7ZGVmZXJyZWQ6IHthY3F1aXJlZDogZmFsc2UsIHJlYXNvbjogXCJjb250ZW5kZWRcIiwgbG9ja05hbWU6IHN0cmluZ319IHwge3ZhbHVlOiBUfSB8IG51bGw+fSAtIFJlc3VsdCB3aGVuIHRoaXMgdGllciBzZXJ2ZWQgaXQsIG90aGVyd2lzZSBudWxsLlxuICAgKi9cbiAgYXN5bmMgYXR0ZW1wdExvY2tTZXJ2ZXIoe2FyZ3MsIGNhbGxiYWNrLCBtb2RlLCBuYW1lfSkge1xuICAgIGNvbnN0IHBvbGljeSA9IHJlc29sdmVBZHZpc29yeUxvY2tCYWNrZW5kUG9saWN5KG5hbWUsIHRoaXMuY29uZmlndXJhdGlvbi5nZXRBZHZpc29yeUxvY2tQb2xpY3koKSlcblxuICAgIGlmIChwb2xpY3kucHJlZmVycmVkVGllciAhPT0gXCJsb2NrLXNlcnZlclwiKSByZXR1cm4gbnVsbFxuICAgIGlmICghcG9saWN5LmFsbG93ZWRUaWVycy5pbmNsdWRlcyhcImxvY2stc2VydmVyXCIpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgYmFja2VuZCA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5nZXRBZHZpc29yeUxvY2tMb2NrU2VydmVyQmFja2VuZCgpXG5cbiAgICBpZiAoIWJhY2tlbmQpIHtcbiAgICAgIHRoaXMucmVwb3J0QWR2aXNvcnlMb2NrRmFsbGJhY2soe3JlYXNvbjogXCJsb2NrLXNlcnZlciB0aWVyIGlzIG5vdCBlbmFibGVkIGluIGNvbmZpZ3VyYXRpb25cIiwgc2VydmVkQnk6IFwiZHJpdmVyLW5hdGl2ZVwiLCBsb2NrTmFtZTogbmFtZX0pXG5cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgIGxldCBhY3F1aXJlZFxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChtb2RlID09PSBcIndhaXRcIikge1xuICAgICAgICBhY3F1aXJlZCA9IGF3YWl0IGJhY2tlbmQuYWNxdWlyZShuYW1lLCB7dGltZW91dE1zOiB0aGlzLmFjcXVpcmVUaW1lb3V0TXMoYXJncyl9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNxdWlyZWQgPSBhd2FpdCBiYWNrZW5kLnRyeUFjcXVpcmUobmFtZSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBBZHZpc29yeUxvY2tTZXJ2aWNlVW5hdmFpbGFibGVFcnJvcikpIHRocm93IGVycm9yXG5cbiAgICAgIGlmIChwb2xpY3kubWluVGllciA9PT0gXCJsb2NrLXNlcnZlclwiKSB7XG4gICAgICAgIHRocm93IGFkdmlzb3J5TG9ja0JhY2tlbmRVbmF2YWlsYWJsZSh7XG4gICAgICAgICAgbG9ja05hbWU6IG5hbWUsXG4gICAgICAgICAgbWluVGllcjogcG9saWN5Lm1pblRpZXIsXG4gICAgICAgICAgcmVhc29uczogW2Bsb2NrLXNlcnZlciB1bmF2YWlsYWJsZTogJHtlcnJvci5tZXNzYWdlfWBdXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVwb3J0QWR2aXNvcnlMb2NrRmFsbGJhY2soe3JlYXNvbjogZXJyb3IubWVzc2FnZSwgc2VydmVkQnk6IFwiZHJpdmVyLW5hdGl2ZVwiLCBsb2NrTmFtZTogbmFtZX0pXG5cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKCFhY3F1aXJlZCkge1xuICAgICAgaWYgKG1vZGUgPT09IFwiZGVmZXJcIikgcmV0dXJuIHtkZWZlcnJlZDoge2FjcXVpcmVkOiBmYWxzZSwgcmVhc29uOiBcImNvbnRlbmRlZFwiLCBsb2NrTmFtZTogbmFtZX19XG4gICAgICBpZiAobW9kZSA9PT0gXCJvci1mYWlsXCIpIHRocm93IG5ldyBBZHZpc29yeUxvY2tCdXN5RXJyb3IoYEFkdmlzb3J5IGxvY2sgJHtKU09OLnN0cmluZ2lmeShuYW1lKX0gaXMgYWxyZWFkeSBoZWxkYCwge25hbWV9KVxuXG4gICAgICB0aHJvdyBuZXcgQWR2aXNvcnlMb2NrVGltZW91dEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgYWR2aXNvcnkgbG9jayAke0pTT04uc3RyaW5naWZ5KG5hbWUpfWAsIHtuYW1lfSlcbiAgICB9XG5cbiAgICBjb25zdCBlcG9jaCA9IGJhY2tlbmQuZ2V0SG9sZEVwb2NoKG5hbWUpXG4gICAgY29uc3QgbG9ja0JhY2tlbmQgPSAvKiogQHR5cGUge0Fkdmlzb3J5TG9ja0JhY2tlbmRQcm92ZW5hbmNlfSAqLyAoe1xuICAgICAgYmFja2VuZDogXCJsb2NrLXNlcnZlclwiLFxuICAgICAgZXBvY2g6IGVwb2NoID8/IHVuZGVmaW5lZCxcbiAgICAgIGZlbmNpbmdTdXBwb3J0ZWQ6IHRydWUsXG4gICAgICBsb2NrTmFtZTogbmFtZVxuICAgIH0pXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucmVjb3JkQWR2aXNvcnlMb2NrQWNxdWlzaXRpb24oe2JhY2tlbmQ6IFwibG9jay1zZXJ2ZXJcIiwgZmVuY2luZ1N1cHBvcnRlZDogdHJ1ZSwgbG9ja05hbWU6IG5hbWV9KVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5ydW5Mb2NrU2VydmVySG9sZCh7XG4gICAgICBiYWNrZW5kLFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBob2xkVGltZW91dE1zOiBhcmdzLmhvbGRUaW1lb3V0TXMsXG4gICAgICBsb2NrQmFja2VuZCxcbiAgICAgIG5hbWVcbiAgICB9KVxuXG4gICAgcmV0dXJuIHt2YWx1ZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBjcml0aWNhbCBzZWN0aW9uIHVuZGVyIGEgbG9jay1zZXJ2ZXIgbGVhc2UgYW5kIHN1cmZhY2VzIGEgZmVuY2VkXG4gICAqIGxlYXNlIGFzIGBBZHZpc29yeUxvY2tMb3N0RXJyb3JgIChkZXNpZ24gwqc4KTogdGhlIHNlY3Rpb24gbWF5IGhhdmVcbiAgICogb3ZlcmxhcHBlZCBhbm90aGVyIGhvbGRlciwgc28gaXRzIG91dGNvbWUgbXVzdCBub3QgYmUgdHJ1c3RlZCBhcyBleGNsdXNpdmUuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2JhY2tlbmQ6IGltcG9ydChcIi4vYWR2aXNvcnktbG9jay1sb2NrLXNlcnZlci1iYWNrZW5kLmpzXCIpLmRlZmF1bHQsIGNhbGxiYWNrOiAoYXJncz86IHtjb250cm9sPzogaW1wb3J0KFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiKS5UaW1lb3V0Q29udHJvbCwgbG9ja0JhY2tlbmQ6IEFkdmlzb3J5TG9ja0JhY2tlbmRQcm92ZW5hbmNlfSkgPT4gUHJvbWlzZTxUPiwgaG9sZFRpbWVvdXRNcz86IG51bWJlciB8IG51bGwsIGxvY2tCYWNrZW5kOiBBZHZpc29yeUxvY2tCYWNrZW5kUHJvdmVuYW5jZSwgbmFtZTogc3RyaW5nfX0gYXJncyAtIEhvbGQgcmVxdWVzdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgcnVuTG9ja1NlcnZlckhvbGQoe2JhY2tlbmQsIGNhbGxiYWNrLCBob2xkVGltZW91dE1zLCBsb2NrQmFja2VuZCwgbmFtZX0pIHtcbiAgICAvKiogQHR5cGUge1QgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IHZhbHVlXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICAgIGxldCBjYWxsYmFja0Vycm9yXG4gICAgbGV0IGZhaWxlZCA9IGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBhd2FpdCB0aGlzLnJ1bkxvY2tlZENhbGxiYWNrKHtcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgIGhvbGRUaW1lb3V0TXMsXG4gICAgICAgIGxvY2tCYWNrZW5kLFxuICAgICAgICBuYW1lLFxuICAgICAgICByZWxlYXNlOiBhc3luYyAoKSA9PiBhd2FpdCBiYWNrZW5kLnJlbGVhc2UobmFtZSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZhaWxlZCA9IHRydWVcbiAgICAgIGNhbGxiYWNrRXJyb3IgPSBlcnJvclxuICAgIH1cblxuICAgIGNvbnN0IGxvc3MgPSBiYWNrZW5kLnRha2VMb3NzKG5hbWUsIGxvY2tCYWNrZW5kLmVwb2NoID8/IG51bGwpXG5cbiAgICBpZiAobG9zcykge1xuICAgICAgdGhyb3cgbmV3IEFkdmlzb3J5TG9ja0xvc3RFcnJvcihcbiAgICAgICAgYExvc3QgdGhlIGxlYXNlIGZvciBhZHZpc29yeSBsb2NrICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9IHdoaWxlIHRoZSBjcml0aWNhbCBzZWN0aW9uIHdhcyBydW5uaW5nYCxcbiAgICAgICAge1xuICAgICAgICAgIGNhdXNlOiBjYWxsYmFja0Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBjYWxsYmFja0Vycm9yIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGN1cnJlbnRFcG9jaDogbG9zcy5jdXJyZW50RXBvY2gsXG4gICAgICAgICAgZXBvY2g6IGxvY2tCYWNrZW5kLmVwb2NoID8/IG51bGwsXG4gICAgICAgICAgbG9ja05hbWU6IG5hbWVcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cblxuICAgIGlmIChmYWlsZWQpIHRocm93IGNhbGxiYWNrRXJyb3JcblxuICAgIHJldHVybiAvKiogQHR5cGUge1R9ICovICh2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIGFuIGFjcXVpc2l0aW9uIHNlcnZlZCBiZWxvdyB0aGUgbG9jayBuYW1lJ3MgcHJlZmVycmVkIHRpZXJcbiAgICogKGRlc2lnbiDCpzMpOiBldmVyeSBmYWxsYmFjayBpcyB2aXNpYmxlIG9uIHRoZSBmcmFtZXdvcmstZXJyb3IgY2hhbm5lbCwgc28gYVxuICAgKiBzaWxlbnQgZG93bmdyYWRlIGlzIGltcG9zc2libGUuXG4gICAqIEBwYXJhbSB7e2xvY2tOYW1lOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nLCBzZXJ2ZWRCeTogaW1wb3J0KFwiLi9hZHZpc29yeS1sb2NrLWJhY2tlbmQtcG9saWN5LmpzXCIpLkFkdmlzb3J5TG9ja1RpZXJ9fSBhcmdzIC0gRmFsbGJhY2sgZGV0YWlscy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZXBvcnRBZHZpc29yeUxvY2tGYWxsYmFjayh7bG9ja05hbWUsIHJlYXNvbiwgc2VydmVkQnl9KSB7XG4gICAgY29uc3QgcG9saWN5ID0gcmVzb2x2ZUFkdmlzb3J5TG9ja0JhY2tlbmRQb2xpY3kobG9ja05hbWUsIHRoaXMuY29uZmlndXJhdGlvbi5nZXRBZHZpc29yeUxvY2tQb2xpY3koKSlcbiAgICBlbWl0QWR2aXNvcnlMb2NrRmFsbGJhY2tSZXBvcnQodGhpcy5jb25maWd1cmF0aW9uLCB7XG4gICAgICBsb2NrTmFtZSxcbiAgICAgIHByZWZlcnJlZFRpZXI6IHBvbGljeS5wcmVmZXJyZWRUaWVyLFxuICAgICAgcmVhc29uLFxuICAgICAgc2VydmVkQnlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBiYWNrZW5kIHBvbGljeSBmb3Igb25lIGxvY2sgbmFtZSBhbmQgcmV0dXJucyB0aGUgZmlsZVxuICAgKiBiYWNrZW5kIHdoZW4gdGhlIG5hbWUgZXhwbGljaXRseSBvcHRzIGludG8gdGhlIGZpbGUgdGllclxuICAgKiAoYHByZWZlcnJlZFRpZXI6IFwiZmlsZVwiYCBwbHVzIGBhZHZpc29yeUxvY2tzLmJhY2tlbmRzLmZpbGUuZW5hYmxlZDogdHJ1ZWApLlxuICAgKiBBIG5hbWUgd2hvc2UgZGVjbGFyZWQgbWluaW11bSB0aWVyIGlzIGNyb3NzLWhvc3QgaXMgcmVmdXNlZCBsb3VkbHlcbiAgICogKGBBZHZpc29yeUxvY2tNaW5UaWVyUmVmdXNlZEVycm9yYCkgYmVmb3JlIGFueSBjb250YWN0IHdpdGggdGhlIGZpbGVcbiAgICogdGllci4gQSBuYW1lIHRoYXQgcHJlZmVycyB0aGUgZmlsZSB0aWVyIHdoaWxlIHRoZSBiYWNrZW5kIGlzIGRpc2FibGVkXG4gICAqIG1vdmVzIHRvIHRoZSBkcml2ZXIgcGF0aCAoYSBzdHJvbmdlci1vci1lcXVhbCB0aWVyKSwgbmV2ZXIgdGhlIG90aGVyIHdheVxuICAgKiBhcm91bmQuIE5vdGhpbmcgaGVyZSBldmVyIGF1dG8tZW5hYmxlcyB0aGUgZmlsZSB0aWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9hZHZpc29yeS1sb2NrLWZpbGUtYmFja2VuZC5qc1wiKS5kZWZhdWx0IHwgbnVsbD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgZmlsZSBiYWNrZW5kIHNlcnZpbmcgdGhpcyBuYW1lLCBvciBudWxsIGZvciB0aGUgZHJpdmVyIHBhdGguXG4gICAqL1xuICBhc3luYyBmaWxlQmFja2VuZEZvck5hbWUobmFtZSkge1xuICAgIGNvbnN0IHBvbGljeSA9IHJlc29sdmVBZHZpc29yeUxvY2tCYWNrZW5kUG9saWN5KG5hbWUsIHRoaXMuY29uZmlndXJhdGlvbi5nZXRBZHZpc29yeUxvY2tQb2xpY3koKSlcblxuICAgIGlmIChwb2xpY3kucHJlZmVycmVkVGllciAhPT0gXCJmaWxlXCIpIHJldHVybiBudWxsXG5cbiAgICBpZiAoIWFkdmlzb3J5TG9ja1BvbGljeUFsbG93c0ZpbGVUaWVyKHBvbGljeSkpIHtcbiAgICAgIHJlZnVzZUFkdmlzb3J5TG9ja1RpZXJCZWxvd01pbmltdW0oe1xuICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgIGxvY2tOYW1lOiBuYW1lLFxuICAgICAgICBtaW5UaWVyOiBwb2xpY3kubWluVGllcixcbiAgICAgICAgcmVxdWVzdGVkQmFja2VuZDogXCJmaWxlXCJcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgYmFja2VuZCA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5nZXRBZHZpc29yeUxvY2tGaWxlQmFja2VuZCgpXG5cbiAgICBpZiAoIWJhY2tlbmQpIHtcbiAgICAgIC8vIFByZWZlcnJlZCB0aWVyIHVuYXZhaWxhYmxlOiBmYWlsICp1cHdhcmQqIHRvIHRoZSBkcml2ZXIgcGF0aCAoYVxuICAgICAgLy8gc3Ryb25nZXItb3ItZXF1YWwgdGllciksIG5ldmVyIGRvd253YXJkLiBJZiB0aGUgZHJpdmVyIGNhbm5vdCBzYXRpc2Z5XG4gICAgICAvLyB0aGUgbWluaW11bSBlaXRoZXIsIGBhc3NlcnREcml2ZXJUaWVyRWxpZ2libGVgIHRocm93c1xuICAgICAgLy8gYEFkdmlzb3J5TG9ja0JhY2tlbmRVbmF2YWlsYWJsZUVycm9yYCBvbiB0aGUgZHJpdmVyIHBhdGguXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBiYWNrZW5kXG4gIH1cblxuICAvKipcbiAgICogRmFpbC1jbG9zZWQgY2hlY2sgb24gdGhlIGRyaXZlciBwYXRoIChkZXNpZ24gwqc5KTogYW4gdW5kZWNsYXJlZCBsb2NrIG5hbWVcbiAgICoga2VlcHMgdG9kYXkncyBiZWhhdmlvciAoYW55IGRyaXZlciBzZXJ2ZXMgaXQg4oCUIGZ1bGwgYmFja3dhcmRcbiAgICogY29tcGF0aWJpbGl0eSksIGJ1dCBhIG5hbWUgd2l0aCBhbiBleHBsaWNpdCBwb2xpY3kgZW50cnkgaXMgcmVmdXNlZCB3aXRoXG4gICAqIGBBZHZpc29yeUxvY2tCYWNrZW5kVW5hdmFpbGFibGVFcnJvcmAgd2hlbiB0aGUgY29uZmlndXJlZCBkcml2ZXIgY2Fubm90XG4gICAqIHNhdGlzZnkgaXRzIG1pbmltdW0gdGllciAoZS5nLiBgbWluVGllcjogXCJkcml2ZXItbmF0aXZlXCJgIG9uIGEgU1FMaXRlXG4gICAqIGRyaXZlciwgd2hpY2ggaGFzIG5vIG5hdGl2ZSBhZHZpc29yeS1sb2NrIHByaW1pdGl2ZSkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcGFyYW0ge0Fkdmlzb3J5TG9ja0JhY2tlbmRQcm92ZW5hbmNlfSBsb2NrQmFja2VuZCAtIFRpZXIgdGhlIGRyaXZlciBwYXRoIHdvdWxkIHNlcnZlIHdpdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXNzZXJ0RHJpdmVyVGllckVsaWdpYmxlKG5hbWUsIGxvY2tCYWNrZW5kKSB7XG4gICAgY29uc3QgcG9saWN5ID0gcmVzb2x2ZUFkdmlzb3J5TG9ja0JhY2tlbmRQb2xpY3kobmFtZSwgdGhpcy5jb25maWd1cmF0aW9uLmdldEFkdmlzb3J5TG9ja1BvbGljeSgpKVxuXG4gICAgaWYgKCFwb2xpY3kuZW50cnkpIHJldHVyblxuXG4gICAgY29uc3QgdGllciA9IGxvY2tCYWNrZW5kLmJhY2tlbmRcblxuICAgIGlmICh0aWVyID09PSBcInByb2Nlc3MtbG9jYWxcIiAmJiAhcG9saWN5LmFsbG93ZWRUaWVycy5pbmNsdWRlcyhcInByb2Nlc3MtbG9jYWxcIikpIHtcbiAgICAgIHRocm93IG5ldyBBZHZpc29yeUxvY2tCYWNrZW5kVW5hdmFpbGFibGVFcnJvcihcbiAgICAgICAgYEFkdmlzb3J5IGxvY2sgJHtKU09OLnN0cmluZ2lmeShuYW1lKX0gcmVxdWlyZXMgbWluaW11bSB0aWVyICR7SlNPTi5zdHJpbmdpZnkocG9saWN5Lm1pblRpZXIpfSBidXQgdGhlIGNvbmZpZ3VyZWQgZHJpdmVyICgke1N0cmluZyhsb2NrQmFja2VuZC5kcml2ZXJUeXBlKX0pIG9ubHkgb2ZmZXJzIHRoZSBwcm9jZXNzLWxvY2FsIHRpZXJgLFxuICAgICAgICB7bG9ja05hbWU6IG5hbWUsIG1pblRpZXI6IHBvbGljeS5taW5UaWVyLCByZWFzb25zOiBbYGRyaXZlciB0aWVyICR7dGllcn0gYmVsb3cgbWluVGllciAke3BvbGljeS5taW5UaWVyfWBdfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgd2FpdCBib3VuZCBmb3IgYSBmaWxlLXRpZXIgYWNxdWlzaXRpb246IGFuIGV4cGxpY2l0IGNhbGxlclxuICAgKiBgdGltZW91dE1zYCAoaW5jbHVkaW5nIGFuIGV4cGxpY2l0IGBudWxsYCBvcHQtb3V0KSB3aW5zLCBvdGhlcndpc2UgdGhlXG4gICAqIHNhbWUgZnJhbWV3b3JrIGRlZmF1bHQgdGhhdCBib3VuZHMgZHJpdmVyIGFjcXVpc2l0aW9ucyBhcHBsaWVzLlxuICAgKiBAcGFyYW0ge3t0aW1lb3V0TXM/OiBudW1iZXIgfCBudWxsfX0gYXJncyAtIExvY2sgb3B0aW9ucy5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IC0gV2FpdCBib3VuZCBpbiBtaWxsaXNlY29uZHMsIG9yIGBudWxsYCBmb3IgYW4gaW5kZWZpbml0ZSB3YWl0LlxuICAgKi9cbiAgYWNxdWlyZVRpbWVvdXRNcyhhcmdzKSB7XG4gICAgaWYgKGFyZ3MudGltZW91dE1zICE9PSB1bmRlZmluZWQpIHJldHVybiBhcmdzLnRpbWVvdXRNc1xuXG4gICAgcmV0dXJuIERFRkFVTFRfQURWSVNPUllfTE9DS19BQ1FVSVJFX1RJTUVPVVRfTVNcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGFjcXVpc2l0aW9uIHByb3ZlbmFuY2UgZm9yIGEgZmlsZS10aWVyIGhvbGQuIFRoZSBmaWxlIHRpZXJcbiAgICogY2Fubm90IGNhcnJ5IGZlbmNpbmcgdG9rZW5zLCBzbyB0aGUgbGltaXRhdGlvbiBpcyByZXBvcnRlZCBvbiBldmVyeVxuICAgKiBhY3F1aXNpdGlvbiByYXRoZXIgdGhhbiBzaWxlbnRseSBwcmV0ZW5kZWQgYXdheSAoZGVzaWduIMKnOCkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9hZHZpc29yeS1sb2NrLWZpbGUtYmFja2VuZC5qc1wiKS5kZWZhdWx0fSBiYWNrZW5kIC0gQmFja2VuZCB0aGF0IHNlcnZlZCB0aGUgYWNxdWlzaXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7QWR2aXNvcnlMb2NrQmFja2VuZFByb3ZlbmFuY2V9IC0gQWNxdWlzaXRpb24gcHJvdmVuYW5jZS5cbiAgICovXG4gIGZpbGVQcm92ZW5hbmNlKGJhY2tlbmQsIG5hbWUpIHtcbiAgICByZXR1cm4ge2JhY2tlbmQ6IFwiZmlsZVwiLCBmZW5jaW5nU3VwcG9ydGVkOiBmYWxzZSwgaG9sZGVySWQ6IGJhY2tlbmQuaG9sZGVySWQsIGxvY2tOYW1lOiBuYW1lfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgYWNxdWlzaXRpb24gcHJvdmVuYW5jZSBmb3IgYSBkcml2ZXItc2VydmVkIGhvbGQuIFNRTGl0ZSBoYXMgbm9cbiAgICogbmF0aXZlIGFkdmlzb3J5LWxvY2sgcHJpbWl0aXZlLCBzbyBpdHMgZW11bGF0aW9uIHRpZXIgaXMgcmVwb3J0ZWQgYXNcbiAgICogYHByb2Nlc3MtbG9jYWxgIHJhdGhlciB0aGFuIHByZXRlbmRpbmcgdG8gYmUgZGF0YWJhc2UtbmF0aXZlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGNvbm5lY3Rpb24gLSBDb25uZWN0aW9uIHRoYXQgc2VydmVkIHRoZSBhY3F1aXNpdGlvbi5cbiAgICogQHJldHVybnMge0Fkdmlzb3J5TG9ja0JhY2tlbmRQcm92ZW5hbmNlfSAtIEFjcXVpc2l0aW9uIHByb3ZlbmFuY2UuXG4gICAqL1xuICBkcml2ZXJQcm92ZW5hbmNlKGNvbm5lY3Rpb24pIHtcbiAgICBsZXQgZHJpdmVyVHlwZSA9IG51bGxcblxuICAgIHRyeSB7XG4gICAgICBkcml2ZXJUeXBlID0gY29ubmVjdGlvbi5nZXRUeXBlKClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRlc3Qgc3R1YiBkcml2ZXJzIG1heSBub3QgaW1wbGVtZW50IGdldFR5cGUoKTsgdGhlIHRpZXIgYWxvbmUgaWRlbnRpZmllcyB0aGUgYmFja2VuZC5cbiAgICB9XG5cbiAgICBjb25zdCB0aWVyID0gdHlwZW9mIGNvbm5lY3Rpb24uYWR2aXNvcnlMb2NrQmFja2VuZFRpZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBjb25uZWN0aW9uLmFkdmlzb3J5TG9ja0JhY2tlbmRUaWVyKClcbiAgICAgIDogKGRyaXZlclR5cGUgPT09IFwic3FsaXRlXCIgPyBcInByb2Nlc3MtbG9jYWxcIiA6IFwiZHJpdmVyLW5hdGl2ZVwiKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJhY2tlbmQ6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9hZHZpc29yeS1sb2NrLWJhY2tlbmQtcG9saWN5LmpzXCIpLkFkdmlzb3J5TG9ja1RpZXJ9ICovICh0aWVyKSxcbiAgICAgIGRyaXZlclR5cGU6IGRyaXZlclR5cGUgPz8gdW5kZWZpbmVkLFxuICAgICAgZmVuY2luZ1N1cHBvcnRlZDogdGllciA9PT0gXCJkcml2ZXItbmF0aXZlXCJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBsb2NrIHdvcmsgb24gdGhlIGNhbGxlciBjb25uZWN0aW9uIHVubGVzcyBgZGVkaWNhdGVkQ29ubmVjdGlvbmAgaXNcbiAgICogcmVxdWVzdGVkIG9yIGEgcG9zaXRpdmUgaG9sZCB0aW1lb3V0IG5lZWRzIGl0cyBvd24gbG9jayBjb25uZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3tkZWRpY2F0ZWRDb25uZWN0aW9uPzogYm9vbGVhbiwgaG9sZFRpbWVvdXRNcz86IG51bWJlciB8IG51bGx9fSBhcmdzIC0gTG9jayBjb25uZWN0aW9uIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7KGNvbm5lY3Rpb246IGltcG9ydChcIi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgcmVjZWl2aW5nIHRoZSBjb25uZWN0aW9uIHRoYXQgb3ducyB0aGUgYWR2aXNvcnkgbG9jay5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd2l0aExvY2tDb25uZWN0aW9uKGFyZ3MsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaG9sZFRpbWVvdXRNcyA9IGFyZ3MuaG9sZFRpbWVvdXRNc1xuXG4gICAgaWYgKGFyZ3MuZGVkaWNhdGVkQ29ubmVjdGlvbiB8fCAoaG9sZFRpbWVvdXRNcyAmJiBob2xkVGltZW91dE1zID4gMCkpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhEZWRpY2F0ZWRDb25uZWN0aW9uKGNhbGxiYWNrKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBjYWxsYmFjayh0aGlzLmNvbm5lY3Rpb25Qcm92aWRlcigpKVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhIGRlZGljYXRlZCBsb2NrIGNvbm5lY3Rpb24gYW5kIGNsb3NlcyBpdCBhZnRlciBsb2NrIHdvcmsgY29tcGxldGVzXG4gICAqIHdoZW4gdGhlIHNwYXduZWQgZHJpdmVyIG93bnMgdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgY29ubmVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHsoY29ubmVjdGlvbjogaW1wb3J0KFwiLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0aGF0IHJlY2VpdmVzIHRoZSBkZWRpY2F0ZWQgbG9jayBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRoRGVkaWNhdGVkQ29ubmVjdGlvbihjYWxsYmFjaykge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJhc2VQb29sKHRoaXMuZGF0YWJhc2VJZGVudGlmaWVyKS5zcGF3bkNvbm5lY3Rpb24oKVxuXG4gICAgLy8gVGhlIHNwYXduZWQgZHJpdmVyIG93bnMgaXRzIHBoeXNpY2FsIGNvbm5lY3Rpb24gdW5sZXNzIGl0IGJvcnJvd3MgYSBzaGFyZWQgb25lXG4gICAgLy8gdmlhIGBnZXRDb25uZWN0aW9uYC4gQW4gb3duZWQgY29ubmVjdGlvbiBsaXZlcyBvdXRzaWRlIHRoZSBwb29scycgdHJhY2tlZCBzZXRzLFxuICAgIC8vIHNvIHJlZ2lzdGVyIGl0IHdoaWxlIHRoZSBsb2NrIGlzIGhlbGQ6IGEgc2h1dGRvd24gdGhlbiBjbG9zZXMgaXQgKHJlbGVhc2luZyB0aGVcbiAgICAvLyBsb2NrKSBpbnN0ZWFkIG9mIG9ycGhhbmluZyBhIGhhbGYtb3BlbiBzZXNzaW9uIHVudGlsIHRoZSBEQiBgd2FpdF90aW1lb3V0YC5cbiAgICBjb25zdCBvd25zQ29ubmVjdGlvbiA9ICFjb25uZWN0aW9uLmdldEFyZ3MoKS5nZXRDb25uZWN0aW9uXG5cbiAgICBpZiAob3duc0Nvbm5lY3Rpb24pIHRoaXMuY29uZmlndXJhdGlvbi5yZWdpc3RlckFkdmlzb3J5TG9ja0Nvbm5lY3Rpb24oY29ubmVjdGlvbilcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soY29ubmVjdGlvbilcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKG93bnNDb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi51bnJlZ2lzdGVyQWR2aXNvcnlMb2NrQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLmNsb3NlKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ucmVsZWFzZUhlbGRBZHZpc29yeUxvY2tzKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBgY2FsbGJhY2tgLCByZWplY3Rpbmcgd2l0aCBgQWR2aXNvcnlMb2NrSG9sZFRpbWVvdXRFcnJvcmAgaWYgaXQgaGFzXG4gICAqIG5vdCBzZXR0bGVkIHdpdGhpbiBgaG9sZFRpbWVvdXRNc2AuIFRoZSBjYWxsYmFjayBpcyBub3QgY2FuY2VsbGVkOyBjYWxsZXJzXG4gICAqIHVzZSBhIGRlZGljYXRlZCBhZHZpc29yeS1sb2NrIGNvbm5lY3Rpb24gc28gdGhlIGxvY2sgY2FuIHN0aWxsIGJlIHJlbGVhc2VkLlxuICAgKlxuICAgKiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgYSBgVGltZW91dENvbnRyb2xgIGZyb20gYXdhaXRlcnksIGVuYWJsaW5nIGNvb3BlcmF0aXZlXG4gICAqIGNhbmNlbGxhdGlvbiB2aWEgYGNvbnRyb2wuY2hlY2soKWAsIGBjb250cm9sLnNpZ25hbGAsIGBjb250cm9sLnRpbWVkT3V0YCxcbiAgICogYW5kIGBjb250cm9sLnJlbWFpbmluZygpYCwgcGx1cyBgbG9ja0JhY2tlbmRgIHByb3ZlbmFuY2UgZm9yIHRoZSB0aWVyIHRoYXRcbiAgICogc2VydmVkIHRoZSBhY3F1aXNpdGlvbi5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUgKGZvciB0aGUgZXJyb3IgbWVzc2FnZSkuXG4gICAqIEBwYXJhbSB7KGFyZ3M/OiB7Y29udHJvbD86IGltcG9ydChcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIikuVGltZW91dENvbnRyb2wsIGxvY2tCYWNrZW5kOiBBZHZpc29yeUxvY2tCYWNrZW5kUHJvdmVuYW5jZX0pID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgaG9sZGluZyB0aGUgbG9jay5cbiAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsfSBbaG9sZFRpbWVvdXRNc10gLSBNYXggaG9sZCB0aW1lOyBmYWxzeSBkaXNhYmxlcyB0aGUgdGltZW91dC5cbiAgICogQHBhcmFtIHtBZHZpc29yeUxvY2tCYWNrZW5kUHJvdmVuYW5jZX0gW2xvY2tCYWNrZW5kXSAtIFByb3ZlbmFuY2Ugb2YgdGhlIGFjcXVpc2l0aW9uIHNlcnZpbmcgdGhpcyBob2xkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcnVuV2l0aEFkdmlzb3J5TG9ja0hvbGRUaW1lb3V0KG5hbWUsIGNhbGxiYWNrLCBob2xkVGltZW91dE1zLCBsb2NrQmFja2VuZCkge1xuICAgIGlmICghaG9sZFRpbWVvdXRNcyB8fCBob2xkVGltZW91dE1zIDw9IDApIHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjayh7bG9ja0JhY2tlbmQ6IGxvY2tCYWNrZW5kID8/IEFkdmlzb3J5TG9ja1J1bm5lci51bmtub3duQmFja2VuZFByb3ZlbmFuY2UoKX0pXG4gICAgfVxuXG4gICAgbGV0IGNhbGxiYWNrU2V0dGxlZCA9IGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IGhvbGRUaW1lb3V0TXN9LCBhc3luYyAoe2NvbnRyb2x9KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKHtjb250cm9sLCBsb2NrQmFja2VuZDogbG9ja0JhY2tlbmQgPz8gQWR2aXNvcnlMb2NrUnVubmVyLnVua25vd25CYWNrZW5kUHJvdmVuYW5jZSgpfSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBjYWxsYmFja1NldHRsZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghY2FsbGJhY2tTZXR0bGVkIHx8IGVycm9yIGluc3RhbmNlb2YgVGltZW91dEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBBZHZpc29yeUxvY2tIb2xkVGltZW91dEVycm9yKGBBZHZpc29yeSBsb2NrICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9IGhlbGQgbG9uZ2VyIHRoYW4gJHtob2xkVGltZW91dE1zfW1zYCwge25hbWV9KVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOZXV0cmFsIHByb3ZlbmFuY2UgZm9yIGRpcmVjdCBgcnVuV2l0aEFkdmlzb3J5TG9ja0hvbGRUaW1lb3V0YCBjYWxsZXJzIHRoYXRcbiAgICogaG9sZCBhIGxvY2sgYWNxdWlyZWQgb3V0c2lkZSB0aGlzIHJ1bm5lci5cbiAgICogQHJldHVybnMge0Fkdmlzb3J5TG9ja0JhY2tlbmRQcm92ZW5hbmNlfSAtIFByb3ZlbmFuY2Ugd2l0aCBhbiB1bmtub3duIHRpZXIuXG4gICAqL1xuICBzdGF0aWMgdW5rbm93bkJhY2tlbmRQcm92ZW5hbmNlKCkge1xuICAgIHJldHVybiB7YmFja2VuZDogXCJwcm9jZXNzLWxvY2FsXCIsIGZlbmNpbmdTdXBwb3J0ZWQ6IGZhbHNlfVxuICB9XG59XG5cbi8qKlxuICogUnVucyBhZHZpc29yeSBsb2NrIHBvbGljeSBhbGxvd3MgZmlsZSB0aWVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2Fkdmlzb3J5LWxvY2stYmFja2VuZC1wb2xpY3kuanNcIikuUmVzb2x2ZWRBZHZpc29yeUxvY2tCYWNrZW5kUG9saWN5fSBwb2xpY3kgLSBSZXNvbHZlZCBwb2xpY3kuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBmaWxlIHRpZXIgbWF5IHNlcnZlIHRoaXMgbmFtZS5cbiAqL1xuZnVuY3Rpb24gYWR2aXNvcnlMb2NrUG9saWN5QWxsb3dzRmlsZVRpZXIocG9saWN5KSB7XG4gIHJldHVybiBwb2xpY3kuYWxsb3dlZFRpZXJzLmluY2x1ZGVzKFwiZmlsZVwiKVxufVxuXG5leHBvcnQge0Fkdmlzb3J5TG9ja0J1c3lFcnJvciwgQWR2aXNvcnlMb2NrSG9sZFRpbWVvdXRFcnJvciwgQWR2aXNvcnlMb2NrVGltZW91dEVycm9yfVxuZXhwb3J0IHtBZHZpc29yeUxvY2tCYWNrZW5kVW5hdmFpbGFibGVFcnJvciwgQWR2aXNvcnlMb2NrTWluVGllclJlZnVzZWRFcnJvcn0gZnJvbSBcIi4vYWR2aXNvcnktbG9jay1iYWNrZW5kLXBvbGljeS5qc1wiXG5leHBvcnQge0Fkdmlzb3J5TG9ja0xvc3RFcnJvciwgQWR2aXNvcnlMb2NrU2VydmljZVVuYXZhaWxhYmxlRXJyb3J9IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2stZXJyb3JzLmpzXCJcbiJdfQ==
|
|
630
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2aXNvcnktbG9jay1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJhc2UvYWR2aXNvcnktbG9jay1ydW5uZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBQ2xELE9BQU8sT0FBTyxFQUFFLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFDL0QsT0FBTyxFQUFDLHdDQUF3QyxFQUFDLE1BQU0sMEJBQTBCLENBQUE7QUFDakYsT0FBTyxFQUNMLG1DQUFtQyxFQUNuQyxnQ0FBZ0MsRUFDaEMsa0NBQWtDLEVBQ25DLE1BQU0sbUNBQW1DLENBQUE7QUFDMUMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixtQ0FBbUMsRUFDbkMsOEJBQThCLEVBQy9CLE1BQU0sMkJBQTJCLENBQUE7QUFDbEMsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sOEJBQThCLENBQUE7QUFFM0U7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7R0FFRztBQUNILE1BQU0sd0JBQXlCLFNBQVEsS0FBSztJQUMxQzs7OztPQUlHO0lBQ0gsWUFBWSxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUM7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2QsSUFBSSxDQUFDLElBQUksR0FBRywwQkFBMEIsQ0FBQTtRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtJQUN0QixDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0scUJBQXNCLFNBQVEsS0FBSztJQUN2Qzs7OztPQUlHO0lBQ0gsWUFBWSxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUM7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2QsSUFBSSxDQUFDLElBQUksR0FBRyx1QkFBdUIsQ0FBQTtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUks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O29CQUNILE9BQU8sTUFBTSxRQUFRLENBQUMsRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsSUFBSSxrQkFBa0IsQ0FBQyx3QkFBd0IsRUFBRSxFQUFDLENBQUMsQ0FBQTtnQkFDN0csQ0FBQzt3QkFBUyxDQUFDO29CQUNULGVBQWUsR0FBRyxJQUFJLENBQUE7Z0JBQ3hCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLGVBQWUsSUFBSSxLQUFLLFlBQVksWUFBWSxFQUFFLENBQUM7Z0JBQ3RELE1BQU0sSUFBSSw0QkFBNEIsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLGFBQWEsSUFBSSxFQUFFLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQTtZQUM3SCxDQUFDO1lBRUQsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsd0JBQXdCO1FBQzdCLE9BQU8sRUFBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBQyxDQUFBO0lBQzVELENBQUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGdDQUFnQyxDQUFDLE1BQU07SUFDOUMsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUM3QyxDQUFDO0FBRUQsT0FBTyxFQUFDLHFCQUFxQixFQUFFLDRCQUE0QixFQUFFLHdCQUF3QixFQUFDLENBQUE7QUFDdEYsT0FBTyxFQUFDLG1DQUFtQyxFQUFFLCtCQUErQixFQUFDLE1BQU0sbUNBQW1DLENBQUE7QUFDdEgsT0FBTyxFQUFDLHFCQUFxQixFQUFFLG1DQUFtQyxFQUFDLE1BQU0sMkJBQTJCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtBc3luY0xvY2FsU3RvcmFnZX0gZnJvbSBcIm5vZGU6YXN5bmNfaG9va3NcIlxuaW1wb3J0IHRpbWVvdXQsIHtUaW1lb3V0RXJyb3J9IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCB7REVGQVVMVF9BRFZJU09SWV9MT0NLX0FDUVVJUkVfVElNRU9VVF9NU30gZnJvbSBcIi4vYWR2aXNvcnktbG9jay1ib3VuZC5qc1wiXG5pbXBvcnQge1xuICBBZHZpc29yeUxvY2tCYWNrZW5kVW5hdmFpbGFibGVFcnJvcixcbiAgcmVzb2x2ZUFkdmlzb3J5TG9ja0JhY2tlbmRQb2xpY3ksXG4gIHJlZnVzZUFkdmlzb3J5TG9ja1RpZXJCZWxvd01pbmltdW1cbn0gZnJvbSBcIi4vYWR2aXNvcnktbG9jay1iYWNrZW5kLXBvbGljeS5qc1wiXG5pbXBvcnQge1xuICBBZHZpc29yeUxvY2tMb3N0RXJyb3IsXG4gIEFkdmlzb3J5TG9ja1NlcnZpY2VVbmF2YWlsYWJsZUVycm9yLFxuICBhZHZpc29yeUxvY2tCYWNrZW5kVW5hdmFpbGFibGVcbn0gZnJvbSBcIi4vYWR2aXNvcnktbG9jay1lcnJvcnMuanNcIlxuaW1wb3J0IHtlbWl0QWR2aXNvcnlMb2NrRmFsbGJhY2tSZXBvcnR9IGZyb20gXCIuL2Fkdmlzb3J5LWxvY2stdGVsZW1ldHJ5LmpzXCJcblxuLyoqXG4gKiBQcm92ZW5hbmNlIG9mIG9uZSBhZHZpc29yeS1sb2NrIGFjcXVpc2l0aW9uIChTVEMtMjEwIGRlc2lnbiDCpzMpOiBldmVyeVxuICogaGVsZCBsb2NrIHJlcG9ydHMgdGhlIHRpZXIgdGhhdCBhY3R1YWxseSBzZXJ2ZWQgaXQsIHNvIGEgZmFsbGJhY2sgaXNcbiAqIHZpc2libGUgdG8gdGhlIGNhbGxiYWNrLCBpbiBsb2dzLCBhbmQgaW4gYGdldEFkdmlzb3J5TG9ja0JhY2tlbmRTdGF0dXMoKWAuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBZHZpc29yeUxvY2tCYWNrZW5kUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2Fkdmlzb3J5LWxvY2stYmFja2VuZC1wb2xpY3kuanNcIikuQWR2aXNvcnlMb2NrVGllcn0gYmFja2VuZCAtIFRpZXIgdGhhdCBzZXJ2ZWQgdGhlIGFjcXVpc2l0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkcml2ZXJUeXBlXSAtIERhdGFiYXNlIGRyaXZlciB0eXBlIHdoZW4gdGhlIGRyaXZlciB0aWVyIHNlcnZlZCBpdC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZXBvY2hdIC0gRmVuY2luZyBlcG9jaCB3aGVuIHRoZSBzZXJ2aW5nIHRpZXIgaXNzdWVzIG9uZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZmVuY2luZ1N1cHBvcnRlZCAtIFdoZXRoZXIgdGhpcyB0aWVyIGNhcnJpZXMgZmVuY2luZyB0b2tlbnMgKGRlc2lnbiDCpzgpOyB0aGUgZmlsZSB0aWVyIHJlcG9ydHMgZmFsc2UgcmF0aGVyIHRoYW4gcHJldGVuZGluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaG9sZGVySWRdIC0gQmFja2VuZCBob2xkZXIgaWQgZm9yIHRoZSBmaWxlIHRpZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2xvY2tOYW1lXSAtIExvY2sgbmFtZSB0aGlzIHByb3ZlbmFuY2UgYmVsb25ncyB0by5cbiAqL1xuXG4vKipcbiAqIFRocm93biB3aGVuIGFuIGFkdmlzb3J5IGxvY2sgY291bGQgbm90IGJlIGFjcXVpcmVkIGJlZm9yZSBgdGltZW91dE1zYCBlbGFwc2VkLlxuICovXG5jbGFzcyBBZHZpc29yeUxvY2tUaW1lb3V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7e25hbWU6IHN0cmluZ319IGFyZ3MgLSBUaGUgYWR2aXNvcnkgbG9jayBuYW1lIHRoYXQgdGltZWQgb3V0LlxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSwge25hbWV9KSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSBcIkFkdmlzb3J5TG9ja1RpbWVvdXRFcnJvclwiXG4gICAgdGhpcy5sb2NrTmFtZSA9IG5hbWVcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGB3aXRoQWR2aXNvcnlMb2NrT3JGYWlsYCBmaW5kcyB0aGUgbG9jayBhbHJlYWR5IGhlbGQuXG4gKi9cbmNsYXNzIEFkdmlzb3J5TG9ja0J1c3lFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZS5cbiAgICogQHBhcmFtIHt7bmFtZTogc3RyaW5nfX0gYXJncyAtIFRoZSBhZHZpc29yeSBsb2NrIG5hbWUgdGhhdCB3YXMgYWxyZWFkeSBoZWxkLlxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSwge25hbWV9KSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLm5hbWUgPSBcIkFkdmlzb3J5TG9ja0J1c3lFcnJvclwiXG4gICAgdGhpcy5sb2NrTmFtZSA9IG5hbWVcbiAgfVxufVxuXG4vKipcbiAqIEFkdmlzb3J5IGxvY2tzIGhlbGQgYnkgb25lIGFzeW5jIGNvbnRleHQsIGtleWVkIGJ5XG4gKiBgPGRhdGFiYXNlSWRlbnRpZmllcj5cXHUwMDAwPGxvY2sgbmFtZT5gIGFuZCBjYXJyeWluZyB0aGUgcmUtZW50cnkgZGVwdGggcGx1c1xuICogdGhlIHByb3ZlbmFuY2Ugb2YgdGhlIHRpZXIgdGhhdCBhY3R1YWxseSBob2xkcyB0aGUgbG9jay5cbiAqXG4gKiBSZS1lbnRyeSBpcyBzY29wZWQgdG8gdGhlIGFzeW5jIGNvbnRleHQsIG5vdCB0byB0aGUgcHJvY2VzczogYSBuZXN0ZWQgY2FsbFxuICogbWFkZSBpbnNpZGUgYSBoZWxkIGNhbGxiYWNrIGJlbG9uZ3MgdG8gdGhlIHNhbWUgbG9naWNhbCBvcGVyYXRpb24gYW5kIG11c3RcbiAqIG5vdCBjb250ZW5kIHdpdGggaXRzZWxmLCB3aGlsZSBhbiB1bnJlbGF0ZWQgY29uY3VycmVudCByZXF1ZXN0IGluIHRoZSBzYW1lXG4gKiBwcm9jZXNzIGlzIGEgZGlmZmVyZW50IGNvbnRleHQgYW5kIG11c3Qgc3RpbGwgd2FpdC4gVGhhdCBpcyBSdWJ5J3MgYE1vbml0b3JgXG4gKiAoXCJyZS1lbnRyYW50IGZvciB0aGUgaG9sZGluZyB0aHJlYWRcIikgZXhwcmVzc2VkIHdpdGggdGhlIGFzeW5jLWNvbnRleHRcbiAqIGFuYWxvZ3VlIG9mIGEgdGhyZWFkLlxuICpcbiAqIFdpdGhvdXQgdGhpcywgdGhlIGZvdXIgdGllcnMgZGlzYWdyZWVkIG9uIHJlLWVudHJ5OiBhIG5lc3RlZCBhY3F1aXNpdGlvbiBvblxuICogYSBgZGVkaWNhdGVkQ29ubmVjdGlvbmAgb3BlbmVkIGEgc2Vjb25kIGNvbm5lY3Rpb24gYW5kIHNlbGYtZGVhZGxvY2tlZCwgdGhlXG4gKiBmaWxlIHRpZXIgcmVmdXNlZCBpdCBhcyBoZWxkLCBhbmQgdGhlIGxvY2stc2VydmVyIHRpZXIgcmVjZWl2ZWRcbiAqIGBhbHJlYWR5LWhlbGRgIGFuZCB0cmVhdGVkIGl0IGFzIGNvbnRlbnRpb24uIEFwcGxpY2F0aW9ucyB3b3JrZWQgYXJvdW5kIGl0XG4gKiB3aXRoIGhhbmQtcGFzc2VkIGAqTG9ja0hlbGRgIGJvb2xlYW5zLCB3aGljaCBpcyBleGFjdGx5IHRoZSBwYXJhbWV0ZXIgYVxuICogbW9uaXRvciBtYWtlcyByZWR1bmRhbnQuXG4gKi9cbmNvbnN0IGhlbGRBZHZpc29yeUxvY2tzID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKClcblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIGNhbGxiYWNrIGhvbGRzIGFuIGFkdmlzb3J5IGxvY2sgbG9uZ2VyIHRoYW4gYGhvbGRUaW1lb3V0TXNgLlxuICovXG5jbGFzcyBBZHZpc29yeUxvY2tIb2xkVGltZW91dEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge3tuYW1lOiBzdHJpbmd9fSBhcmdzIC0gVGhlIGFkdmlzb3J5IGxvY2sgbmFtZSB3aG9zZSBob2xkIHRpbWVkIG91dC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHtuYW1lfSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gXCJBZHZpc29yeUxvY2tIb2xkVGltZW91dEVycm9yXCJcbiAgICB0aGlzLmxvY2tOYW1lID0gbmFtZVxuICB9XG59XG5cbi8qKlxuICogUnVucyBhZHZpc29yeSBsb2NrcyBvbiB0aGUgY2FsbGVyIGNvbm5lY3Rpb24gYnkgZGVmYXVsdCwgdXNpbmcgYSBkZWRpY2F0ZWRcbiAqIGxvY2sgY29ubmVjdGlvbiB3aGVuIGBkZWRpY2F0ZWRDb25uZWN0aW9uYCBpcyByZXF1ZXN0ZWQgb3Igd2hlbiBhIHBvc2l0aXZlXG4gKiBob2xkIHRpbWVvdXQgbmVlZHMgc2VwYXJhdGUgb3duZXJzaGlwLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZHZpc29yeUxvY2tSdW5uZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBhZHZpc29yeS1sb2NrIHJ1bm5lciBmb3Igb25lIG1vZGVsIGRhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7e2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgY29ubmVjdGlvblByb3ZpZGVyOiAoKSA9PiBpbXBvcnQoXCIuL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZ319IGFyZ3MgLSBSdW5uZXIgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGNvbm5lY3Rpb25Qcm92aWRlciwgZGF0YWJhc2VJZGVudGlmaWVyfSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmNvbm5lY3Rpb25Qcm92aWRlciA9IGNvbm5lY3Rpb25Qcm92aWRlclxuICAgIHRoaXMuZGF0YWJhc2VJZGVudGlmaWVyID0gZGF0YWJhc2VJZGVudGlmaWVyXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIGNhbGxiYWNrIGFmdGVyIGFjcXVpcmluZyB0aGUgYWR2aXNvcnkgbG9jaywgd2FpdGluZyB1cCB0byBgdGltZW91dE1zYC5cbiAgICogV2hlbiBgZGVkaWNhdGVkQ29ubmVjdGlvbmAgaXMgdHJ1ZSB0aGUgbG9jayBpcyBhY3F1aXJlZCBvbiBhIHNwYXduZWRcbiAgICogY29ubmVjdGlvbiB0aGF0IGlzIHJlbGVhc2VkIGFmdGVyIHRoZSBjYWxsYmFjayBmaW5pc2hlcywgd2hpbGUgdGhlIGNhbGxiYWNrXG4gICAqIGl0c2VsZiBzdGlsbCBydW5zIGFnYWluc3QgdGhlIGNhbGxlci9tb2RlbCBjb25uZWN0aW9uLiBXaGVuIGEgYGhvbGRUaW1lb3V0TXNgXG4gICAqIGlzIHNldCB0aGUgY2FsbGJhY2sgcmVjZWl2ZXMgYSBgVGltZW91dENvbnRyb2xgIGZyb20gYXdhaXRlcnkgZm9yIGNvb3BlcmF0aXZlXG4gICAqIGNhbmNlbGxhdGlvbiAoYGNvbnRyb2wuY2hlY2soKWAsIGBjb250cm9sLnNpZ25hbGAsIGBjb250cm9sLnRpbWVkT3V0YCxcbiAgICogYGNvbnRyb2wucmVtYWluaW5nKClgKTsgYSBkZWRpY2F0ZWQgY29ubmVjdGlvbiBpcyBhbHNvIHVzZWQgc28gdGltZW91dFxuICAgKiBjbGVhbnVwIGNhbiByZWxlYXNlIHRoZSBsb2NrIGV2ZW4gaWYgY2FsbGJhY2sgZGF0YWJhc2Ugd29yayBpcyBzdHVjay5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7KGFyZ3M/OiB7Y29udHJvbD86IGltcG9ydChcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIikuVGltZW91dENvbnRyb2wsIGxvY2tCYWNrZW5kOiBBZHZpc29yeUxvY2tCYWNrZW5kUHJvdmVuYW5jZX0pID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gaW52b2tlIHdoaWxlIHRoZSBsb2NrIGlzIGhlbGQuXG4gICAqIEBwYXJhbSB7e3RpbWVvdXRNcz86IG51bWJlciB8IG51bGwsIGhvbGRUaW1lb3V0TXM/OiBudW1iZXIgfCBudWxsLCBkZWRpY2F0ZWRDb25uZWN0aW9uPzogYm9vbGVhbn19IFthcmdzXSAtIExvY2sgYW5kIGhvbGQgdGltZW91dCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRoQWR2aXNvcnlMb2NrKG5hbWUsIGNhbGxiYWNrLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBoZWxkRW50cnkgPSB0aGlzLmhlbGRFbnRyeUZvcihuYW1lKVxuXG4gICAgaWYgKGhlbGRFbnRyeSkgcmV0dXJuIGF3YWl0IHRoaXMucnVuUmVlbnRyYW50Q2FsbGJhY2soe2NhbGxiYWNrLCBlbnRyeTogaGVsZEVudHJ5LCBuYW1lfSlcblxuICAgIGNvbnN0IGxvY2tTZXJ2ZXJSZXN1bHQgPSBhd2FpdCB0aGlzLmF0dGVtcHRMb2NrU2VydmVyKHthcmdzLCBjYWxsYmFjaywgbW9kZTogXCJ3YWl0XCIsIG5hbWV9KVxuXG4gICAgLy8gVGhlIHdhaXQgbW9kZSBuZXZlciByZXR1cm5zIGEgZGVmZXJyZWQgb3V0Y29tZSwgc28gdGhlIHZhbHVlIG1lbWJlciBpcyBwcmVzZW50LlxuICAgIGlmIChsb2NrU2VydmVyUmVzdWx0KSByZXR1cm4gLyoqIEB0eXBlIHt7dmFsdWU6IFR9fSAqLyAobG9ja1NlcnZlclJlc3VsdCkudmFsdWVcblxuICAgIGNvbnN0IGZpbGVCYWNrZW5kID0gYXdhaXQgdGhpcy5maWxlQmFja2VuZEZvck5hbWUobmFtZSlcblxuICAgIGlmIChmaWxlQmFja2VuZCkge1xuICAgICAgY29uc3QgYWNxdWlyZWQgPSBhd2FpdCBmaWxlQmFja2VuZC5hY3F1aXJlKG5hbWUsIHt0aW1lb3V0TXM6IHRoaXMuYWNxdWlyZVRpbWVvdXRNcyhhcmdzKX0pXG5cbiAgICAgIGlmICghYWNxdWlyZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFkdmlzb3J5TG9ja1RpbWVvdXRFcnJvcihgVGltZWQgb3V0IHdhaXRpbmcgZm9yIGFkdmlzb3J5IGxvY2sgJHtKU09OLnN0cmluZ2lmeShuYW1lKX0gb24gdGhlIGZpbGUgdGllcmAsIHtuYW1lfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9ja0JhY2tlbmQgPSB0aGlzLmZpbGVQcm92ZW5hbmNlKGZpbGVCYWNrZW5kLCBuYW1lKVxuXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucmVjb3JkQWR2aXNvcnlMb2NrQWNxdWlzaXRpb24oe2JhY2tlbmQ6IGxvY2tCYWNrZW5kLmJhY2tlbmQsIGZlbmNpbmdTdXBwb3J0ZWQ6IGxvY2tCYWNrZW5kLmZlbmNpbmdTdXBwb3J0ZWQsIGxvY2tOYW1lOiBuYW1lfSlcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuTG9ja2VkQ2FsbGJhY2soe2NhbGxiYWNrLCBob2xkVGltZW91dE1zOiBhcmdzLmhvbGRUaW1lb3V0TXMsIGxvY2tCYWNrZW5kLCBuYW1lLCByZWxlYXNlOiBhc3luYyAoKSA9PiBhd2FpdCBmaWxlQmFja2VuZC5yZWxlYXNlKG5hbWUpfSlcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy53aXRoTG9ja0Nvbm5lY3Rpb24oYXJncywgYXN5bmMgKGNvbm5lY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IGxvY2tCYWNrZW5kID0gdGhpcy5kcml2ZXJQcm92ZW5hbmNlKGNvbm5lY3Rpb24pXG5cbiAgICAgIHRoaXMuYXNzZXJ0RHJpdmVyVGllckVsaWdpYmxlKG5hbWUsIGxvY2tCYWNrZW5kKVxuXG4gICAgICBjb25zdCBhY3F1aXJlZCA9IGF3YWl0IGNvbm5lY3Rpb24uYWNxdWlyZUFkdmlzb3J5TG9jayhuYW1lLCBhcmdzKVxuXG4gICAgICBpZiAoIWFjcXVpcmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBBZHZpc29yeUxvY2tUaW1lb3V0RXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBhZHZpc29yeSBsb2NrICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9YCwge25hbWV9KVxuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucmVjb3JkQWR2aXNvcnlMb2NrQWNxdWlzaXRpb24oe2JhY2tlbmQ6IGxvY2tCYWNrZW5kLmJhY2tlbmQsIGZlbmNpbmdTdXBwb3J0ZWQ6IGxvY2tCYWNrZW5kLmZlbmNpbmdTdXBwb3J0ZWQsIGxvY2tOYW1lOiBuYW1lfSlcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuTG9ja2VkQ2FsbGJhY2soe2NhbGxiYWNrLCBob2xkVGltZW91dE1zOiBhcmdzLmhvbGRUaW1lb3V0TXMsIGxvY2tCYWNrZW5kLCBuYW1lLCByZWxlYXNlOiBhc3luYyAoKSA9PiBhd2FpdCBjb25uZWN0aW9uLnJlbGVhc2VBZHZpc29yeUxvY2sobmFtZSl9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIGNhbGxiYWNrIG9ubHkgaWYgdGhlIGFkdmlzb3J5IGxvY2sgY2FuIGJlIGFjcXVpcmVkIGltbWVkaWF0ZWx5LlxuICAgKiBXaGVuIGBkZWRpY2F0ZWRDb25uZWN0aW9uYCBpcyB0cnVlIHRoZSBsb2NrIGlzIGFjcXVpcmVkIG9uIGEgc3Bhd25lZFxuICAgKiBjb25uZWN0aW9uIHRoYXQgaXMgcmVsZWFzZWQgYWZ0ZXIgdGhlIGNhbGxiYWNrIGZpbmlzaGVzLCB3aGlsZSB0aGUgY2FsbGJhY2tcbiAgICogaXRzZWxmIHN0aWxsIHJ1bnMgYWdhaW5zdCB0aGUgY2FsbGVyL21vZGVsIGNvbm5lY3Rpb24uIFdoZW4gYSBgaG9sZFRpbWVvdXRNc2BcbiAgICogaXMgc2V0IHRoZSBjYWxsYmFjayByZWNlaXZlcyBhIGBUaW1lb3V0Q29udHJvbGAgZnJvbSBhd2FpdGVyeSBmb3IgY29vcGVyYXRpdmVcbiAgICogY2FuY2VsbGF0aW9uLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHBhcmFtIHsoYXJncz86IHtjb250cm9sPzogaW1wb3J0KFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiKS5UaW1lb3V0Q29udHJvbCwgbG9ja0JhY2tlbmQ6IEFkdmlzb3J5TG9ja0JhY2tlbmRQcm92ZW5hbmNlfSkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byBpbnZva2Ugd2hpbGUgdGhlIGxvY2sgaXMgaGVsZC5cbiAgICogQHBhcmFtIHt7aG9sZFRpbWVvdXRNcz86IG51bWJlciB8IG51bGwsIGRlZGljYXRlZENvbm5lY3Rpb24/OiBib29sZWFufX0gW2FyZ3NdIC0gSG9sZCB0aW1lb3V0IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhBZHZpc29yeUxvY2tPckZhaWwobmFtZSwgY2FsbGJhY2ssIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IGhlbGRFbnRyeSA9IHRoaXMuaGVsZEVudHJ5Rm9yKG5hbWUpXG5cbiAgICBpZiAoaGVsZEVudHJ5KSByZXR1cm4gYXdhaXQgdGhpcy5ydW5SZWVudHJhbnRDYWxsYmFjayh7Y2FsbGJhY2ssIGVudHJ5OiBoZWxkRW50cnksIG5hbWV9KVxuXG4gICAgY29uc3QgbG9ja1NlcnZlclJlc3VsdCA9IGF3YWl0IHRoaXMuYXR0ZW1wdExvY2tTZXJ2ZXIoe2FyZ3MsIGNhbGxiYWNrLCBtb2RlOiBcIm9yLWZhaWxcIiwgbmFtZX0pXG5cbiAgICAvLyBUaGUgb3ItZmFpbCBtb2RlIHRocm93cyBvbiBjb250ZW50aW9uLCBzbyB0aGUgdmFsdWUgbWVtYmVyIGlzIHByZXNlbnQuXG4gICAgaWYgKGxvY2tTZXJ2ZXJSZXN1bHQpIHJldHVybiAvKiogQHR5cGUge3t2YWx1ZTogVH19ICovIChsb2NrU2VydmVyUmVzdWx0KS52YWx1ZVxuXG4gICAgY29uc3QgZmlsZUJhY2tlbmQgPSBhd2FpdCB0aGlzLmZpbGVCYWNrZW5kRm9yTmFtZShuYW1lKVxuXG4gICAgaWYgKGZpbGVCYWNrZW5kKSB7XG4gICAgICBjb25zdCBhY3F1aXJlZCA9IGF3YWl0IGZpbGVCYWNrZW5kLnRyeUFjcXVpcmUobmFtZSlcblxuICAgICAgaWYgKCFhY3F1aXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgQWR2aXNvcnlMb2NrQnVzeUVycm9yKGBBZHZpc29yeSBsb2NrICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9IGlzIGFscmVhZHkgaGVsZCBvbiB0aGUgZmlsZSB0aWVyYCwge25hbWV9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBsb2NrQmFja2VuZCA9IHRoaXMuZmlsZVByb3ZlbmFuY2UoZmlsZUJhY2tlbmQsIG5hbWUpXG5cbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5yZWNvcmRBZHZpc29yeUxvY2tBY3F1aXNpdGlvbih7YmFja2VuZDogbG9ja0JhY2tlbmQuYmFja2VuZCwgZmVuY2luZ1N1cHBvcnRlZDogbG9ja0JhY2tlbmQuZmVuY2luZ1N1cHBvcnRlZCwgbG9ja05hbWU6IG5hbWV9KVxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5Mb2NrZWRDYWxsYmFjayh7Y2FsbGJhY2ssIGhvbGRUaW1lb3V0TXM6IGFyZ3MuaG9sZFRpbWVvdXRNcywgbG9ja0JhY2tlbmQsIG5hbWUsIHJlbGVhc2U6IGFzeW5jICgpID0+IGF3YWl0IGZpbGVCYWNrZW5kLnJlbGVhc2UobmFtZSl9KVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhMb2NrQ29ubmVjdGlvbihhcmdzLCBhc3luYyAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgY29uc3QgbG9ja0JhY2tlbmQgPSB0aGlzLmRyaXZlclByb3ZlbmFuY2UoY29ubmVjdGlvbilcblxuICAgICAgdGhpcy5hc3NlcnREcml2ZXJUaWVyRWxpZ2libGUobmFtZSwgbG9ja0JhY2tlbmQpXG5cbiAgICAgIGNvbnN0IGFjcXVpcmVkID0gYXdhaXQgY29ubmVjdGlvbi50cnlBY3F1aXJlQWR2aXNvcnlMb2NrKG5hbWUpXG5cbiAgICAgIGlmICghYWNxdWlyZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFkdmlzb3J5TG9ja0J1c3lFcnJvcihgQWR2aXNvcnkgbG9jayAke0pTT04uc3RyaW5naWZ5KG5hbWUpfSBpcyBhbHJlYWR5IGhlbGRgLCB7bmFtZX0pXG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5yZWNvcmRBZHZpc29yeUxvY2tBY3F1aXNpdGlvbih7YmFja2VuZDogbG9ja0JhY2tlbmQuYmFja2VuZCwgZmVuY2luZ1N1cHBvcnRlZDogbG9ja0JhY2tlbmQuZmVuY2luZ1N1cHBvcnRlZCwgbG9ja05hbWU6IG5hbWV9KVxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5Mb2NrZWRDYWxsYmFjayh7Y2FsbGJhY2ssIGhvbGRUaW1lb3V0TXM6IGFyZ3MuaG9sZFRpbWVvdXRNcywgbG9ja0JhY2tlbmQsIG5hbWUsIHJlbGVhc2U6IGFzeW5jICgpID0+IGF3YWl0IGNvbm5lY3Rpb24ucmVsZWFzZUFkdmlzb3J5TG9jayhuYW1lKX0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAvKipcbiAgICogUnVucyBhIGNhbGxiYWNrIGlmIHRoZSBhZHZpc29yeSBsb2NrIGNhbiBiZSBhY3F1aXJlZCB3aXRob3V0IHdhaXRpbmc7XG4gICAqIG90aGVyd2lzZSByZXR1cm5zIGEgYHthY3F1aXJlZDogZmFsc2V9YCBkZWZlciByZXN1bHQgaW5zdGVhZCBvZiB0aHJvd2luZy5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgbm9uLXRocm93aW5nIGNvdW50ZXJwYXJ0IG9mIGB3aXRoQWR2aXNvcnlMb2NrT3JGYWlsYCBmb3IgaG90XG4gICAqIHBhdGhzOiBcImhvbGRlciBidXN5LCBkZWZlciBtZVwiIGlzIGEgZmlyc3QtY2xhc3Mgb3V0Y29tZSwgc28gYSBjb250ZW5kZWRcbiAgICogbG9jayBwcm9kdWNlcyB6ZXJvIGV4Y2VwdGlvbiB0cmFmZmljIGFuZCDigJQgYmVjYXVzZSB0aGUgcHJvYmUgaXMgYSBzaW5nbGVcbiAgICogaW1tZWRpYXRlIHRyeS1hY3F1aXJlIOKAlCB6ZXJvIHBpbm5lZCBjb25uZWN0aW9ucy4gQ2FsbGVycyByZXNjaGVkdWxlIHZpYVxuICAgKiB0aGVpciBvd24gZXZlbnQtZHJpdmVuIHJldHJ5IG1hY2hpbmVyeS4gVGhlIHJlc3VsdCBmb3JtIGlzIGlkZW50aWNhbFxuICAgKiBhY3Jvc3MgdGllcnM6IHRoZSBkcml2ZXIncyBgdHJ5QWNxdWlyZUFkdmlzb3J5TG9ja2AgbWFwcyBwZXItdGllciAoTXlTUUxcbiAgICogYEdFVF9MT0NLKG5hbWUsIDApYCwgUG9zdGdyZVNRTCBgcGdfdHJ5X2Fkdmlzb3J5X2xvY2tgLCBTUUwgU2VydmVyXG4gICAqIGBzcF9nZXRhcHBsb2NrIEBMb2NrVGltZW91dCA9IDBgLCBTUUxpdGUgcHJvY2Vzcy1sb2NhbCBxdWV1ZSwgU1FMaXRlIE5vZGVcbiAgICogZmlsZSBsb2NrKSwgc28gYSBjYWxsZXIgbmV2ZXIgYnJhbmNoZXMgb24gdGhlIGJhY2tlbmQuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcGFyYW0geyhhcmdzPzoge2NvbnRyb2w/OiBpbXBvcnQoXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCIpLlRpbWVvdXRDb250cm9sLCBsb2NrQmFja2VuZDogQWR2aXNvcnlMb2NrQmFja2VuZFByb3ZlbmFuY2V9KSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIGludm9rZSB3aGlsZSB0aGUgbG9jayBpcyBoZWxkLlxuICAgKiBAcGFyYW0ge3tob2xkVGltZW91dE1zPzogbnVtYmVyIHwgbnVsbCwgZGVkaWNhdGVkQ29ubmVjdGlvbj86IGJvb2xlYW59fSBbYXJnc10gLSBIb2xkIHRpbWVvdXQgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2FjcXVpcmVkOiB0cnVlLCByZXN1bHQ6IFR9IHwge2FjcXVpcmVkOiBmYWxzZSwgcmVhc29uOiBcImNvbnRlbmRlZFwiLCBsb2NrTmFtZTogc3RyaW5nfT59IC0gRWl0aGVyIHRoZSBoZWxkLWNhbGxiYWNrIHJlc3VsdCBvciB0aGUgZGVmZXIgb3V0Y29tZS5cbiAgICovXG4gIGFzeW5jIHdpdGhBZHZpc29yeUxvY2tPckRlZmVyKG5hbWUsIGNhbGxiYWNrLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBoZWxkRW50cnkgPSB0aGlzLmhlbGRFbnRyeUZvcihuYW1lKVxuXG4gICAgaWYgKGhlbGRFbnRyeSkgcmV0dXJuIHthY3F1aXJlZDogdHJ1ZSwgcmVzdWx0OiBhd2FpdCB0aGlzLnJ1blJlZW50cmFudENhbGxiYWNrKHtjYWxsYmFjaywgZW50cnk6IGhlbGRFbnRyeSwgbmFtZX0pfVxuXG4gICAgY29uc3QgbG9ja1NlcnZlclJlc3VsdCA9IGF3YWl0IHRoaXMuYXR0ZW1wdExvY2tTZXJ2ZXIoe2FyZ3MsIGNhbGxiYWNrLCBtb2RlOiBcImRlZmVyXCIsIG5hbWV9KVxuXG4gICAgaWYgKGxvY2tTZXJ2ZXJSZXN1bHQpIHtcbiAgICAgIGlmIChcImRlZmVycmVkXCIgaW4gbG9ja1NlcnZlclJlc3VsdCkgcmV0dXJuIGxvY2tTZXJ2ZXJSZXN1bHQuZGVmZXJyZWRcblxuICAgICAgcmV0dXJuIHthY3F1aXJlZDogdHJ1ZSwgcmVzdWx0OiAvKiogQHR5cGUge3t2YWx1ZTogVH19ICovIChsb2NrU2VydmVyUmVzdWx0KS52YWx1ZX1cbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQmFja2VuZCA9IGF3YWl0IHRoaXMuZmlsZUJhY2tlbmRGb3JOYW1lKG5hbWUpXG5cbiAgICBpZiAoZmlsZUJhY2tlbmQpIHtcbiAgICAgIGNvbnN0IGFjcXVpcmVkID0gYXdhaXQgZmlsZUJhY2tlbmQuYWNxdWlyZShuYW1lLCB7dGltZW91dE1zOiAwfSlcblxuICAgICAgaWYgKCFhY3F1aXJlZCkgcmV0dXJuIHthY3F1aXJlZDogZmFsc2UsIHJlYXNvbjogXCJjb250ZW5kZWRcIiwgbG9ja05hbWU6IG5hbWV9XG5cbiAgICAgIGNvbnN0IGxvY2tCYWNrZW5kID0gdGhpcy5maWxlUHJvdmVuYW5jZShmaWxlQmFja2VuZCwgbmFtZSlcblxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnJlY29yZEFkdmlzb3J5TG9ja0FjcXVpc2l0aW9uKHtiYWNrZW5kOiBsb2NrQmFja2VuZC5iYWNrZW5kLCBmZW5jaW5nU3VwcG9ydGVkOiBsb2NrQmFja2VuZC5mZW5jaW5nU3VwcG9ydGVkLCBsb2NrTmFtZTogbmFtZX0pXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuTG9ja2VkQ2FsbGJhY2soe2NhbGxiYWNrLCBob2xkVGltZW91dE1zOiBhcmdzLmhvbGRUaW1lb3V0TXMsIGxvY2tCYWNrZW5kLCBuYW1lLCByZWxlYXNlOiBhc3luYyAoKSA9PiBhd2FpdCBmaWxlQmFja2VuZC5yZWxlYXNlKG5hbWUpfSlcblxuICAgICAgcmV0dXJuIHthY3F1aXJlZDogdHJ1ZSwgcmVzdWx0fVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhMb2NrQ29ubmVjdGlvbihhcmdzLCBhc3luYyAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgY29uc3QgYWNxdWlyZWQgPSBhd2FpdCBjb25uZWN0aW9uLnRyeUFjcXVpcmVBZHZpc29yeUxvY2sobmFtZSlcblxuICAgICAgaWYgKCFhY3F1aXJlZCkgcmV0dXJuIHthY3F1aXJlZDogZmFsc2UsIHJlYXNvbjogXCJjb250ZW5kZWRcIiwgbG9ja05hbWU6IG5hbWV9XG5cbiAgICAgIGNvbnN0IGxvY2tCYWNrZW5kID0gdGhpcy5kcml2ZXJQcm92ZW5hbmNlKGNvbm5lY3Rpb24pXG5cbiAgICAgIHRoaXMuYXNzZXJ0RHJpdmVyVGllckVsaWdpYmxlKG5hbWUsIGxvY2tCYWNrZW5kKVxuXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucmVjb3JkQWR2aXNvcnlMb2NrQWNxdWlzaXRpb24oe2JhY2tlbmQ6IGxvY2tCYWNrZW5kLmJhY2tlbmQsIGZlbmNpbmdTdXBwb3J0ZWQ6IGxvY2tCYWNrZW5kLmZlbmNpbmdTdXBwb3J0ZWQsIGxvY2tOYW1lOiBuYW1lfSlcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5Mb2NrZWRDYWxsYmFjayh7Y2FsbGJhY2ssIGhvbGRUaW1lb3V0TXM6IGFyZ3MuaG9sZFRpbWVvdXRNcywgbG9ja0JhY2tlbmQsIG5hbWUsIHJlbGVhc2U6IGFzeW5jICgpID0+IGF3YWl0IGNvbm5lY3Rpb24ucmVsZWFzZUFkdmlzb3J5TG9jayhuYW1lKX0pXG5cbiAgICAgIHJldHVybiB7YWNxdWlyZWQ6IHRydWUsIHJlc3VsdH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIGxvY2sgaG9sZGVyIGNhbGxiYWNrIGFuZCByZWxlYXNlcyB0aGUgbG9jayBmcm9tIGl0cyBvd25pbmcgYmFja2VuZC5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7Y2FsbGJhY2s6IChhcmdzPzoge2NvbnRyb2w/OiBpbXBvcnQoXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCIpLlRpbWVvdXRDb250cm9sLCBsb2NrQmFja2VuZDogQWR2aXNvcnlMb2NrQmFja2VuZFByb3ZlbmFuY2V9KSA9PiBQcm9taXNlPFQ+LCBob2xkVGltZW91dE1zPzogbnVtYmVyIHwgbnVsbCwgbG9ja0JhY2tlbmQ6IEFkdmlzb3J5TG9ja0JhY2tlbmRQcm92ZW5hbmNlLCBuYW1lOiBzdHJpbmcsIHJlbGVhc2U6ICgpID0+IFByb21pc2U8dW5rbm93bj59fSBhcmdzIC0gTG9ja2VkIGNhbGxiYWNrIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHJ1bkxvY2tlZENhbGxiYWNrKHtjYWxsYmFjaywgaG9sZFRpbWVvdXRNcywgbG9ja0JhY2tlbmQsIG5hbWUsIHJlbGVhc2V9KSB7XG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgTWFwKGhlbGRBZHZpc29yeUxvY2tzLmdldFN0b3JlKCkgPz8gW10pXG5cbiAgICBzdG9yZS5zZXQodGhpcy5sb2NrU3RvcmFnZUtleShuYW1lKSwge2RlcHRoOiAxLCBsb2NrQmFja2VuZH0pXG5cbiAgICB0cnkge1xuICAgICAgLy8gVGhlIGxvY2sgaXMgcmVsZWFzZWQgb3V0c2lkZSB0aGUgY29udGV4dCBzY29wZTogYSByZWxlYXNlIHBhdGggdGhhdFxuICAgICAgLy8gdG91Y2hlcyB0aGUgc2FtZSBuYW1lIChhIGNsZWFudXAgaG9vaywgYW4gZXJyb3IgcmVwb3J0ZXIpIG11c3Qgbm90IGxvb2tcbiAgICAgIC8vIGxpa2UgYSByZS1lbnRyeSBvZiBhIGhvbGQgdGhhdCBpcyBhbHJlYWR5IG92ZXIuXG4gICAgICByZXR1cm4gYXdhaXQgaGVsZEFkdmlzb3J5TG9ja3MucnVuKHN0b3JlLCBhc3luYyAoKSA9PiBhd2FpdCBBZHZpc29yeUxvY2tSdW5uZXIucnVuV2l0aEFkdmlzb3J5TG9ja0hvbGRUaW1lb3V0KG5hbWUsIGNhbGxiYWNrLCBob2xkVGltZW91dE1zLCBsb2NrQmFja2VuZCkpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHJlbGVhc2UoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBoZWxkIGVudHJ5IHdoZW4gdGhpcyBhc3luYyBjb250ZXh0IGFscmVhZHkgaG9sZHMgdGhlIGxvY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7e2RlcHRoOiBudW1iZXIsIGxvY2tCYWNrZW5kOiBBZHZpc29yeUxvY2tCYWNrZW5kUHJvdmVuYW5jZX0gfCBudWxsfSAtIFRoZSBoZWxkIGVudHJ5LCBvciBudWxsIHdoZW4gdGhpcyBjb250ZXh0IGRvZXMgbm90IGhvbGQgdGhlIGxvY2suXG4gICAqL1xuICBoZWxkRW50cnlGb3IobmFtZSkge1xuICAgIGNvbnN0IHN0b3JlID0gaGVsZEFkdmlzb3J5TG9ja3MuZ2V0U3RvcmUoKVxuXG4gICAgaWYgKCFzdG9yZSkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBzdG9yZS5nZXQodGhpcy5sb2NrU3RvcmFnZUtleShuYW1lKSkgPz8gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBjYWxsYmFjayBhcyBhIHJlLWVudHJ5IG9mIGEgbG9jayB0aGlzIGFzeW5jIGNvbnRleHQgYWxyZWFkeSBob2xkcy5cbiAgICpcbiAgICogVGhlIHJlLWVudHJ5IGFkZHMgbm8gYmFja2VuZCByb3VuZCB0cmlwIGFuZCBjYW5ub3QgZmFpbCBvbiBjb250ZW50aW9uOiB0aGVcbiAgICogb3V0ZXIgaG9sZCBhbHJlYWR5IG93bnMgdGhlIGxvY2ssIHNvIG11dHVhbCBleGNsdXNpb24gaXMgdW5jaGFuZ2VkLiBUaGVcbiAgICogb3V0ZXIgaG9sZCBvd25zIHRoZSBob2xkIHRpbWVvdXQgYW5kIHRoZSBsZWFzZTsgYSByZS1lbnRyeSBkb2VzIG5vdCBzdGFydCBhXG4gICAqIHNlY29uZCBvbmUsIGFuZCB0aGUgY2FsbGJhY2sgdGhlcmVmb3JlIHJlY2VpdmVzIHRoZSBvdXRlciBwcm92ZW5hbmNlIHdpdGhvdXRcbiAgICogYSBgY29udHJvbGAuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2NhbGxiYWNrOiAoYXJncz86IHtjb250cm9sPzogaW1wb3J0KFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiKS5UaW1lb3V0Q29udHJvbCwgbG9ja0JhY2tlbmQ6IEFkdmlzb3J5TG9ja0JhY2tlbmRQcm92ZW5hbmNlfSkgPT4gUHJvbWlzZTxUPiwgZW50cnk6IHtkZXB0aDogbnVtYmVyLCBsb2NrQmFja2VuZDogQWR2aXNvcnlMb2NrQmFja2VuZFByb3ZlbmFuY2V9LCBuYW1lOiBzdHJpbmd9fSBhcmdzIC0gUmUtZW50cnkgcmVxdWVzdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgcnVuUmVlbnRyYW50Q2FsbGJhY2soe2NhbGxiYWNrLCBlbnRyeSwgbmFtZX0pIHtcbiAgICBlbnRyeS5kZXB0aCArPSAxXG4gICAgdGhpcy5jb25maWd1cmF0aW9uLnJlY29yZEFkdmlzb3J5TG9ja1JlZW50cnkoe2xvY2tOYW1lOiBuYW1lfSlcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soe2xvY2tCYWNrZW5kOiBlbnRyeS5sb2NrQmFja2VuZH0pXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVudHJ5LmRlcHRoIC09IDFcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBhc3luYy1jb250ZXh0IHN0b3JhZ2Uga2V5IGZvciBvbmUgbG9jayBuYW1lLlxuICAgKlxuICAgKiBUaGUgZGF0YWJhc2UgaWRlbnRpZmllciBpcyBwYXJ0IG9mIHRoZSBrZXkgYmVjYXVzZSBpdCBpcyBwYXJ0IG9mIHRoZSBsb2NrJ3NcbiAgICogaWRlbnRpdHk6IHR3byB0ZW5hbnQgZGF0YWJhc2VzIHJldXNpbmcgb25lIG5hbWUgaG9sZCB0d28gZGlmZmVyZW50IGxvY2tzLFxuICAgKiBhbmQgYSBuZXN0ZWQgY2FsbCBpbiB0aGUgb3RoZXIgZGF0YWJhc2UgaXMgbm90IGEgcmUtZW50cnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0b3JhZ2Uga2V5IGZvciB0aGUgaGVsZC1lbnRyeSBtYXAuXG4gICAqL1xuICBsb2NrU3RvcmFnZUtleShuYW1lKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyfVxcdTAwMDAke25hbWV9YFxuICB9XG5cbiAgLyoqXG4gICAqIFNlcnZlcyBvbmUgYWNxdWlzaXRpb24gb24gdGhlIGxvY2stc2VydmVyIHRpZXIgd2hlbiB0aGUgbG9jayBuYW1lIHByZWZlcnNcbiAgICogaXQgKGRlc2lnbiDCpzEvwqc5KSwgZmFsbGluZyAqdXB3YXJkKiB0byB0aGUgZHJpdmVyIHBhdGggd2hlbiB0aGUgc2VydmVyIGlzXG4gICAqIHVucmVhY2hhYmxlIGFuZCB0aGUgbmFtZSdzIG1pbmltdW0gdGllciBwZXJtaXRzIGEgREItbmF0aXZlIGhvbGQuXG4gICAqXG4gICAqIGBudWxsYCBtZWFucyBcInRoaXMgdGllciBkaWQgbm90IHNlcnZlIHRoZSBhY3F1aXNpdGlvbiDigJQgY29udGludWUgd2l0aCB0aGVcbiAgICogbmV4dCBlbGlnaWJsZSB0aWVyXCIuIEEgcmV0dXJuZWQgdmFsdWUgbWVhbnMgdGhlIGxvY2stc2VydmVyIHRpZXIgYW5zd2VyZWQsXG4gICAqIGluY2x1ZGluZyBhIGRlZmluaXRpdmUgYnVzeS90aW1lb3V0IG91dGNvbWUuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2FyZ3M6IHtob2xkVGltZW91dE1zPzogbnVtYmVyIHwgbnVsbCwgdGltZW91dE1zPzogbnVtYmVyIHwgbnVsbH0sIGNhbGxiYWNrOiAoYXJncz86IHtjb250cm9sPzogaW1wb3J0KFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiKS5UaW1lb3V0Q29udHJvbCwgbG9ja0JhY2tlbmQ6IEFkdmlzb3J5TG9ja0JhY2tlbmRQcm92ZW5hbmNlfSkgPT4gUHJvbWlzZTxUPiwgbW9kZTogXCJ3YWl0XCIgfCBcIm9yLWZhaWxcIiB8IFwiZGVmZXJcIiwgbmFtZTogc3RyaW5nfX0gcmVxdWVzdCAtIEFjcXVpc2l0aW9uIHJlcXVlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtkZWZlcnJlZDoge2FjcXVpcmVkOiBmYWxzZSwgcmVhc29uOiBcImNvbnRlbmRlZFwiLCBsb2NrTmFtZTogc3RyaW5nfX0gfCB7dmFsdWU6IFR9IHwgbnVsbD59IC0gUmVzdWx0IHdoZW4gdGhpcyB0aWVyIHNlcnZlZCBpdCwgb3RoZXJ3aXNlIG51bGwuXG4gICAqL1xuICBhc3luYyBhdHRlbXB0TG9ja1NlcnZlcih7YXJncywgY2FsbGJhY2ssIG1vZGUsIG5hbWV9KSB7XG4gICAgY29uc3QgcG9saWN5ID0gcmVzb2x2ZUFkdmlzb3J5TG9ja0JhY2tlbmRQb2xpY3kobmFtZSwgdGhpcy5jb25maWd1cmF0aW9uLmdldEFkdmlzb3J5TG9ja1BvbGljeSgpKVxuXG4gICAgaWYgKHBvbGljeS5wcmVmZXJyZWRUaWVyICE9PSBcImxvY2stc2VydmVyXCIpIHJldHVybiBudWxsXG4gICAgaWYgKCFwb2xpY3kuYWxsb3dlZFRpZXJzLmluY2x1ZGVzKFwibG9jay1zZXJ2ZXJcIikpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBiYWNrZW5kID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmdldEFkdmlzb3J5TG9ja0xvY2tTZXJ2ZXJCYWNrZW5kKClcblxuICAgIGlmICghYmFja2VuZCkge1xuICAgICAgdGhpcy5yZXBvcnRBZHZpc29yeUxvY2tGYWxsYmFjayh7cmVhc29uOiBcImxvY2stc2VydmVyIHRpZXIgaXMgbm90IGVuYWJsZWQgaW4gY29uZmlndXJhdGlvblwiLCBzZXJ2ZWRCeTogXCJkcml2ZXItbmF0aXZlXCIsIGxvY2tOYW1lOiBuYW1lfSlcblxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgbGV0IGFjcXVpcmVkXG5cbiAgICB0cnkge1xuICAgICAgaWYgKG1vZGUgPT09IFwid2FpdFwiKSB7XG4gICAgICAgIGFjcXVpcmVkID0gYXdhaXQgYmFja2VuZC5hY3F1aXJlKG5hbWUsIHt0aW1lb3V0TXM6IHRoaXMuYWNxdWlyZVRpbWVvdXRNcyhhcmdzKX0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3F1aXJlZCA9IGF3YWl0IGJhY2tlbmQudHJ5QWNxdWlyZShuYW1lKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEFkdmlzb3J5TG9ja1NlcnZpY2VVbmF2YWlsYWJsZUVycm9yKSkgdGhyb3cgZXJyb3JcblxuICAgICAgaWYgKHBvbGljeS5taW5UaWVyID09PSBcImxvY2stc2VydmVyXCIpIHtcbiAgICAgICAgdGhyb3cgYWR2aXNvcnlMb2NrQmFja2VuZFVuYXZhaWxhYmxlKHtcbiAgICAgICAgICBsb2NrTmFtZTogbmFtZSxcbiAgICAgICAgICBtaW5UaWVyOiBwb2xpY3kubWluVGllcixcbiAgICAgICAgICByZWFzb25zOiBbYGxvY2stc2VydmVyIHVuYXZhaWxhYmxlOiAke2Vycm9yLm1lc3NhZ2V9YF1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXBvcnRBZHZpc29yeUxvY2tGYWxsYmFjayh7cmVhc29uOiBlcnJvci5tZXNzYWdlLCBzZXJ2ZWRCeTogXCJkcml2ZXItbmF0aXZlXCIsIGxvY2tOYW1lOiBuYW1lfSlcblxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAoIWFjcXVpcmVkKSB7XG4gICAgICBpZiAobW9kZSA9PT0gXCJkZWZlclwiKSByZXR1cm4ge2RlZmVycmVkOiB7YWNxdWlyZWQ6IGZhbHNlLCByZWFzb246IFwiY29udGVuZGVkXCIsIGxvY2tOYW1lOiBuYW1lfX1cbiAgICAgIGlmIChtb2RlID09PSBcIm9yLWZhaWxcIikgdGhyb3cgbmV3IEFkdmlzb3J5TG9ja0J1c3lFcnJvcihgQWR2aXNvcnkgbG9jayAke0pTT04uc3RyaW5naWZ5KG5hbWUpfSBpcyBhbHJlYWR5IGhlbGRgLCB7bmFtZX0pXG5cbiAgICAgIHRocm93IG5ldyBBZHZpc29yeUxvY2tUaW1lb3V0RXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBhZHZpc29yeSBsb2NrICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9YCwge25hbWV9KVxuICAgIH1cblxuICAgIGNvbnN0IGVwb2NoID0gYmFja2VuZC5nZXRIb2xkRXBvY2gobmFtZSlcbiAgICBjb25zdCBsb2NrQmFja2VuZCA9IC8qKiBAdHlwZSB7QWR2aXNvcnlMb2NrQmFja2VuZFByb3ZlbmFuY2V9ICovICh7XG4gICAgICBiYWNrZW5kOiBcImxvY2stc2VydmVyXCIsXG4gICAgICBlcG9jaDogZXBvY2ggPz8gdW5kZWZpbmVkLFxuICAgICAgZmVuY2luZ1N1cHBvcnRlZDogdHJ1ZSxcbiAgICAgIGxvY2tOYW1lOiBuYW1lXG4gICAgfSlcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbi5yZWNvcmRBZHZpc29yeUxvY2tBY3F1aXNpdGlvbih7YmFja2VuZDogXCJsb2NrLXNlcnZlclwiLCBmZW5jaW5nU3VwcG9ydGVkOiB0cnVlLCBsb2NrTmFtZTogbmFtZX0pXG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLnJ1bkxvY2tTZXJ2ZXJIb2xkKHtcbiAgICAgIGJhY2tlbmQsXG4gICAgICBjYWxsYmFjayxcbiAgICAgIGhvbGRUaW1lb3V0TXM6IGFyZ3MuaG9sZFRpbWVvdXRNcyxcbiAgICAgIGxvY2tCYWNrZW5kLFxuICAgICAgbmFtZVxuICAgIH0pXG5cbiAgICByZXR1cm4ge3ZhbHVlfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIGNyaXRpY2FsIHNlY3Rpb24gdW5kZXIgYSBsb2NrLXNlcnZlciBsZWFzZSBhbmQgc3VyZmFjZXMgYSBmZW5jZWRcbiAgICogbGVhc2UgYXMgYEFkdmlzb3J5TG9ja0xvc3RFcnJvcmAgKGRlc2lnbiDCpzgpOiB0aGUgc2VjdGlvbiBtYXkgaGF2ZVxuICAgKiBvdmVybGFwcGVkIGFub3RoZXIgaG9sZGVyLCBzbyBpdHMgb3V0Y29tZSBtdXN0IG5vdCBiZSB0cnVzdGVkIGFzIGV4Y2x1c2l2ZS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7YmFja2VuZDogaW1wb3J0KFwiLi9hZHZpc29yeS1sb2NrLWxvY2stc2VydmVyLWJhY2tlbmQuanNcIikuZGVmYXVsdCwgY2FsbGJhY2s6IChhcmdzPzoge2NvbnRyb2w/OiBpbXBvcnQoXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCIpLlRpbWVvdXRDb250cm9sLCBsb2NrQmFja2VuZDogQWR2aXNvcnlMb2NrQmFja2VuZFByb3ZlbmFuY2V9KSA9PiBQcm9taXNlPFQ+LCBob2xkVGltZW91dE1zPzogbnVtYmVyIHwgbnVsbCwgbG9ja0JhY2tlbmQ6IEFkdmlzb3J5TG9ja0JhY2tlbmRQcm92ZW5hbmNlLCBuYW1lOiBzdHJpbmd9fSBhcmdzIC0gSG9sZCByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBydW5Mb2NrU2VydmVySG9sZCh7YmFja2VuZCwgY2FsbGJhY2ssIGhvbGRUaW1lb3V0TXMsIGxvY2tCYWNrZW5kLCBuYW1lfSkge1xuICAgIC8qKiBAdHlwZSB7VCB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgdmFsdWVcbiAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgbGV0IGNhbGxiYWNrRXJyb3JcbiAgICBsZXQgZmFpbGVkID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IGF3YWl0IHRoaXMucnVuTG9ja2VkQ2FsbGJhY2soe1xuICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgaG9sZFRpbWVvdXRNcyxcbiAgICAgICAgbG9ja0JhY2tlbmQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJlbGVhc2U6IGFzeW5jICgpID0+IGF3YWl0IGJhY2tlbmQucmVsZWFzZShuYW1lKVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZmFpbGVkID0gdHJ1ZVxuICAgICAgY2FsbGJhY2tFcnJvciA9IGVycm9yXG4gICAgfVxuXG4gICAgY29uc3QgbG9zcyA9IGJhY2tlbmQudGFrZUxvc3MobmFtZSwgbG9ja0JhY2tlbmQuZXBvY2ggPz8gbnVsbClcblxuICAgIGlmIChsb3NzKSB7XG4gICAgICB0aHJvdyBuZXcgQWR2aXNvcnlMb2NrTG9zdEVycm9yKFxuICAgICAgICBgTG9zdCB0aGUgbGVhc2UgZm9yIGFkdmlzb3J5IGxvY2sgJHtKU09OLnN0cmluZ2lmeShuYW1lKX0gd2hpbGUgdGhlIGNyaXRpY2FsIHNlY3Rpb24gd2FzIHJ1bm5pbmdgLFxuICAgICAgICB7XG4gICAgICAgICAgY2F1c2U6IGNhbGxiYWNrRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGNhbGxiYWNrRXJyb3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY3VycmVudEVwb2NoOiBsb3NzLmN1cnJlbnRFcG9jaCxcbiAgICAgICAgICBlcG9jaDogbG9ja0JhY2tlbmQuZXBvY2ggPz8gbnVsbCxcbiAgICAgICAgICBsb2NrTmFtZTogbmFtZVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKGZhaWxlZCkgdGhyb3cgY2FsbGJhY2tFcnJvclxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgYW4gYWNxdWlzaXRpb24gc2VydmVkIGJlbG93IHRoZSBsb2NrIG5hbWUncyBwcmVmZXJyZWQgdGllclxuICAgKiAoZGVzaWduIMKnMyk6IGV2ZXJ5IGZhbGxiYWNrIGlzIHZpc2libGUgb24gdGhlIGZyYW1ld29yay1lcnJvciBjaGFubmVsLCBzbyBhXG4gICAqIHNpbGVudCBkb3duZ3JhZGUgaXMgaW1wb3NzaWJsZS5cbiAgICogQHBhcmFtIHt7bG9ja05hbWU6IHN0cmluZywgcmVhc29uOiBzdHJpbmcsIHNlcnZlZEJ5OiBpbXBvcnQoXCIuL2Fkdmlzb3J5LWxvY2stYmFja2VuZC1wb2xpY3kuanNcIikuQWR2aXNvcnlMb2NrVGllcn19IGFyZ3MgLSBGYWxsYmFjayBkZXRhaWxzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlcG9ydEFkdmlzb3J5TG9ja0ZhbGxiYWNrKHtsb2NrTmFtZSwgcmVhc29uLCBzZXJ2ZWRCeX0pIHtcbiAgICBjb25zdCBwb2xpY3kgPSByZXNvbHZlQWR2aXNvcnlMb2NrQmFja2VuZFBvbGljeShsb2NrTmFtZSwgdGhpcy5jb25maWd1cmF0aW9uLmdldEFkdmlzb3J5TG9ja1BvbGljeSgpKVxuICAgIGVtaXRBZHZpc29yeUxvY2tGYWxsYmFja1JlcG9ydCh0aGlzLmNvbmZpZ3VyYXRpb24sIHtcbiAgICAgIGxvY2tOYW1lLFxuICAgICAgcHJlZmVycmVkVGllcjogcG9saWN5LnByZWZlcnJlZFRpZXIsXG4gICAgICByZWFzb24sXG4gICAgICBzZXJ2ZWRCeVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGJhY2tlbmQgcG9saWN5IGZvciBvbmUgbG9jayBuYW1lIGFuZCByZXR1cm5zIHRoZSBmaWxlXG4gICAqIGJhY2tlbmQgd2hlbiB0aGUgbmFtZSBleHBsaWNpdGx5IG9wdHMgaW50byB0aGUgZmlsZSB0aWVyXG4gICAqIChgcHJlZmVycmVkVGllcjogXCJmaWxlXCJgIHBsdXMgYGFkdmlzb3J5TG9ja3MuYmFja2VuZHMuZmlsZS5lbmFibGVkOiB0cnVlYCkuXG4gICAqIEEgbmFtZSB3aG9zZSBkZWNsYXJlZCBtaW5pbXVtIHRpZXIgaXMgY3Jvc3MtaG9zdCBpcyByZWZ1c2VkIGxvdWRseVxuICAgKiAoYEFkdmlzb3J5TG9ja01pblRpZXJSZWZ1c2VkRXJyb3JgKSBiZWZvcmUgYW55IGNvbnRhY3Qgd2l0aCB0aGUgZmlsZVxuICAgKiB0aWVyLiBBIG5hbWUgdGhhdCBwcmVmZXJzIHRoZSBmaWxlIHRpZXIgd2hpbGUgdGhlIGJhY2tlbmQgaXMgZGlzYWJsZWRcbiAgICogbW92ZXMgdG8gdGhlIGRyaXZlciBwYXRoIChhIHN0cm9uZ2VyLW9yLWVxdWFsIHRpZXIpLCBuZXZlciB0aGUgb3RoZXIgd2F5XG4gICAqIGFyb3VuZC4gTm90aGluZyBoZXJlIGV2ZXIgYXV0by1lbmFibGVzIHRoZSBmaWxlIHRpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL2Fkdmlzb3J5LWxvY2stZmlsZS1iYWNrZW5kLmpzXCIpLmRlZmF1bHQgfCBudWxsPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBmaWxlIGJhY2tlbmQgc2VydmluZyB0aGlzIG5hbWUsIG9yIG51bGwgZm9yIHRoZSBkcml2ZXIgcGF0aC5cbiAgICovXG4gIGFzeW5jIGZpbGVCYWNrZW5kRm9yTmFtZShuYW1lKSB7XG4gICAgY29uc3QgcG9saWN5ID0gcmVzb2x2ZUFkdmlzb3J5TG9ja0JhY2tlbmRQb2xpY3kobmFtZSwgdGhpcy5jb25maWd1cmF0aW9uLmdldEFkdmlzb3J5TG9ja1BvbGljeSgpKVxuXG4gICAgaWYgKHBvbGljeS5wcmVmZXJyZWRUaWVyICE9PSBcImZpbGVcIikgcmV0dXJuIG51bGxcblxuICAgIGlmICghYWR2aXNvcnlMb2NrUG9saWN5QWxsb3dzRmlsZVRpZXIocG9saWN5KSkge1xuICAgICAgcmVmdXNlQWR2aXNvcnlMb2NrVGllckJlbG93TWluaW11bSh7XG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgbG9ja05hbWU6IG5hbWUsXG4gICAgICAgIG1pblRpZXI6IHBvbGljeS5taW5UaWVyLFxuICAgICAgICByZXF1ZXN0ZWRCYWNrZW5kOiBcImZpbGVcIlxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBiYWNrZW5kID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmdldEFkdmlzb3J5TG9ja0ZpbGVCYWNrZW5kKClcblxuICAgIGlmICghYmFja2VuZCkge1xuICAgICAgLy8gUHJlZmVycmVkIHRpZXIgdW5hdmFpbGFibGU6IGZhaWwgKnVwd2FyZCogdG8gdGhlIGRyaXZlciBwYXRoIChhXG4gICAgICAvLyBzdHJvbmdlci1vci1lcXVhbCB0aWVyKSwgbmV2ZXIgZG93bndhcmQuIElmIHRoZSBkcml2ZXIgY2Fubm90IHNhdGlzZnlcbiAgICAgIC8vIHRoZSBtaW5pbXVtIGVpdGhlciwgYGFzc2VydERyaXZlclRpZXJFbGlnaWJsZWAgdGhyb3dzXG4gICAgICAvLyBgQWR2aXNvcnlMb2NrQmFja2VuZFVuYXZhaWxhYmxlRXJyb3JgIG9uIHRoZSBkcml2ZXIgcGF0aC5cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIGJhY2tlbmRcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWlsLWNsb3NlZCBjaGVjayBvbiB0aGUgZHJpdmVyIHBhdGggKGRlc2lnbiDCpzkpOiBhbiB1bmRlY2xhcmVkIGxvY2sgbmFtZVxuICAgKiBrZWVwcyB0b2RheSdzIGJlaGF2aW9yIChhbnkgZHJpdmVyIHNlcnZlcyBpdCDigJQgZnVsbCBiYWNrd2FyZFxuICAgKiBjb21wYXRpYmlsaXR5KSwgYnV0IGEgbmFtZSB3aXRoIGFuIGV4cGxpY2l0IHBvbGljeSBlbnRyeSBpcyByZWZ1c2VkIHdpdGhcbiAgICogYEFkdmlzb3J5TG9ja0JhY2tlbmRVbmF2YWlsYWJsZUVycm9yYCB3aGVuIHRoZSBjb25maWd1cmVkIGRyaXZlciBjYW5ub3RcbiAgICogc2F0aXNmeSBpdHMgbWluaW11bSB0aWVyIChlLmcuIGBtaW5UaWVyOiBcImRyaXZlci1uYXRpdmVcImAgb24gYSBTUUxpdGVcbiAgICogZHJpdmVyLCB3aGljaCBoYXMgbm8gbmF0aXZlIGFkdmlzb3J5LWxvY2sgcHJpbWl0aXZlKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7QWR2aXNvcnlMb2NrQmFja2VuZFByb3ZlbmFuY2V9IGxvY2tCYWNrZW5kIC0gVGllciB0aGUgZHJpdmVyIHBhdGggd291bGQgc2VydmUgd2l0aC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NlcnREcml2ZXJUaWVyRWxpZ2libGUobmFtZSwgbG9ja0JhY2tlbmQpIHtcbiAgICBjb25zdCBwb2xpY3kgPSByZXNvbHZlQWR2aXNvcnlMb2NrQmFja2VuZFBvbGljeShuYW1lLCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0QWR2aXNvcnlMb2NrUG9saWN5KCkpXG5cbiAgICBpZiAoIXBvbGljeS5lbnRyeSkgcmV0dXJuXG5cbiAgICBjb25zdCB0aWVyID0gbG9ja0JhY2tlbmQuYmFja2VuZFxuXG4gICAgaWYgKHRpZXIgPT09IFwicHJvY2Vzcy1sb2NhbFwiICYmICFwb2xpY3kuYWxsb3dlZFRpZXJzLmluY2x1ZGVzKFwicHJvY2Vzcy1sb2NhbFwiKSkge1xuICAgICAgdGhyb3cgbmV3IEFkdmlzb3J5TG9ja0JhY2tlbmRVbmF2YWlsYWJsZUVycm9yKFxuICAgICAgICBgQWR2aXNvcnkgbG9jayAke0pTT04uc3RyaW5naWZ5KG5hbWUpfSByZXF1aXJlcyBtaW5pbXVtIHRpZXIgJHtKU09OLnN0cmluZ2lmeShwb2xpY3kubWluVGllcil9IGJ1dCB0aGUgY29uZmlndXJlZCBkcml2ZXIgKCR7U3RyaW5nKGxvY2tCYWNrZW5kLmRyaXZlclR5cGUpfSkgb25seSBvZmZlcnMgdGhlIHByb2Nlc3MtbG9jYWwgdGllcmAsXG4gICAgICAgIHtsb2NrTmFtZTogbmFtZSwgbWluVGllcjogcG9saWN5Lm1pblRpZXIsIHJlYXNvbnM6IFtgZHJpdmVyIHRpZXIgJHt0aWVyfSBiZWxvdyBtaW5UaWVyICR7cG9saWN5Lm1pblRpZXJ9YF19XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSB3YWl0IGJvdW5kIGZvciBhIGZpbGUtdGllciBhY3F1aXNpdGlvbjogYW4gZXhwbGljaXQgY2FsbGVyXG4gICAqIGB0aW1lb3V0TXNgIChpbmNsdWRpbmcgYW4gZXhwbGljaXQgYG51bGxgIG9wdC1vdXQpIHdpbnMsIG90aGVyd2lzZSB0aGVcbiAgICogc2FtZSBmcmFtZXdvcmsgZGVmYXVsdCB0aGF0IGJvdW5kcyBkcml2ZXIgYWNxdWlzaXRpb25zIGFwcGxpZXMuXG4gICAqIEBwYXJhbSB7e3RpbWVvdXRNcz86IG51bWJlciB8IG51bGx9fSBhcmdzIC0gTG9jayBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gLSBXYWl0IGJvdW5kIGluIG1pbGxpc2Vjb25kcywgb3IgYG51bGxgIGZvciBhbiBpbmRlZmluaXRlIHdhaXQuXG4gICAqL1xuICBhY3F1aXJlVGltZW91dE1zKGFyZ3MpIHtcbiAgICBpZiAoYXJncy50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGFyZ3MudGltZW91dE1zXG5cbiAgICByZXR1cm4gREVGQVVMVF9BRFZJU09SWV9MT0NLX0FDUVVJUkVfVElNRU9VVF9NU1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgYWNxdWlzaXRpb24gcHJvdmVuYW5jZSBmb3IgYSBmaWxlLXRpZXIgaG9sZC4gVGhlIGZpbGUgdGllclxuICAgKiBjYW5ub3QgY2FycnkgZmVuY2luZyB0b2tlbnMsIHNvIHRoZSBsaW1pdGF0aW9uIGlzIHJlcG9ydGVkIG9uIGV2ZXJ5XG4gICAqIGFjcXVpc2l0aW9uIHJhdGhlciB0aGFuIHNpbGVudGx5IHByZXRlbmRlZCBhd2F5IChkZXNpZ24gwqc4KS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Fkdmlzb3J5LWxvY2stZmlsZS1iYWNrZW5kLmpzXCIpLmRlZmF1bHR9IGJhY2tlbmQgLSBCYWNrZW5kIHRoYXQgc2VydmVkIHRoZSBhY3F1aXNpdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtBZHZpc29yeUxvY2tCYWNrZW5kUHJvdmVuYW5jZX0gLSBBY3F1aXNpdGlvbiBwcm92ZW5hbmNlLlxuICAgKi9cbiAgZmlsZVByb3ZlbmFuY2UoYmFja2VuZCwgbmFtZSkge1xuICAgIHJldHVybiB7YmFja2VuZDogXCJmaWxlXCIsIGZlbmNpbmdTdXBwb3J0ZWQ6IGZhbHNlLCBob2xkZXJJZDogYmFja2VuZC5ob2xkZXJJZCwgbG9ja05hbWU6IG5hbWV9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBhY3F1aXNpdGlvbiBwcm92ZW5hbmNlIGZvciBhIGRyaXZlci1zZXJ2ZWQgaG9sZC4gU1FMaXRlIGhhcyBub1xuICAgKiBuYXRpdmUgYWR2aXNvcnktbG9jayBwcmltaXRpdmUsIHNvIGl0cyBlbXVsYXRpb24gdGllciBpcyByZXBvcnRlZCBhc1xuICAgKiBgcHJvY2Vzcy1sb2NhbGAgcmF0aGVyIHRoYW4gcHJldGVuZGluZyB0byBiZSBkYXRhYmFzZS1uYXRpdmUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gY29ubmVjdGlvbiAtIENvbm5lY3Rpb24gdGhhdCBzZXJ2ZWQgdGhlIGFjcXVpc2l0aW9uLlxuICAgKiBAcmV0dXJucyB7QWR2aXNvcnlMb2NrQmFja2VuZFByb3ZlbmFuY2V9IC0gQWNxdWlzaXRpb24gcHJvdmVuYW5jZS5cbiAgICovXG4gIGRyaXZlclByb3ZlbmFuY2UoY29ubmVjdGlvbikge1xuICAgIGxldCBkcml2ZXJUeXBlID0gbnVsbFxuXG4gICAgdHJ5IHtcbiAgICAgIGRyaXZlclR5cGUgPSBjb25uZWN0aW9uLmdldFR5cGUoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGVzdCBzdHViIGRyaXZlcnMgbWF5IG5vdCBpbXBsZW1lbnQgZ2V0VHlwZSgpOyB0aGUgdGllciBhbG9uZSBpZGVudGlmaWVzIHRoZSBiYWNrZW5kLlxuICAgIH1cblxuICAgIGNvbnN0IHRpZXIgPSB0eXBlb2YgY29ubmVjdGlvbi5hZHZpc29yeUxvY2tCYWNrZW5kVGllciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGNvbm5lY3Rpb24uYWR2aXNvcnlMb2NrQmFja2VuZFRpZXIoKVxuICAgICAgOiAoZHJpdmVyVHlwZSA9PT0gXCJzcWxpdGVcIiA/IFwicHJvY2Vzcy1sb2NhbFwiIDogXCJkcml2ZXItbmF0aXZlXCIpXG5cbiAgICByZXR1cm4ge1xuICAgICAgYmFja2VuZDogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2Fkdmlzb3J5LWxvY2stYmFja2VuZC1wb2xpY3kuanNcIikuQWR2aXNvcnlMb2NrVGllcn0gKi8gKHRpZXIpLFxuICAgICAgZHJpdmVyVHlwZTogZHJpdmVyVHlwZSA/PyB1bmRlZmluZWQsXG4gICAgICBmZW5jaW5nU3VwcG9ydGVkOiB0aWVyID09PSBcImRyaXZlci1uYXRpdmVcIlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvY2sgd29yayBvbiB0aGUgY2FsbGVyIGNvbm5lY3Rpb24gdW5sZXNzIGBkZWRpY2F0ZWRDb25uZWN0aW9uYCBpc1xuICAgKiByZXF1ZXN0ZWQgb3IgYSBwb3NpdGl2ZSBob2xkIHRpbWVvdXQgbmVlZHMgaXRzIG93biBsb2NrIGNvbm5lY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2RlZGljYXRlZENvbm5lY3Rpb24/OiBib29sZWFuLCBob2xkVGltZW91dE1zPzogbnVtYmVyIHwgbnVsbH19IGFyZ3MgLSBMb2NrIGNvbm5lY3Rpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHsoY29ubmVjdGlvbjogaW1wb3J0KFwiLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBDYWxsYmFjayByZWNlaXZpbmcgdGhlIGNvbm5lY3Rpb24gdGhhdCBvd25zIHRoZSBhZHZpc29yeSBsb2NrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRoTG9ja0Nvbm5lY3Rpb24oYXJncywgY2FsbGJhY2spIHtcbiAgICBjb25zdCBob2xkVGltZW91dE1zID0gYXJncy5ob2xkVGltZW91dE1zXG5cbiAgICBpZiAoYXJncy5kZWRpY2F0ZWRDb25uZWN0aW9uIHx8IChob2xkVGltZW91dE1zICYmIGhvbGRUaW1lb3V0TXMgPiAwKSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aERlZGljYXRlZENvbm5lY3Rpb24oY2FsbGJhY2spXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKHRoaXMuY29ubmVjdGlvblByb3ZpZGVyKCkpXG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgZGVkaWNhdGVkIGxvY2sgY29ubmVjdGlvbiBhbmQgY2xvc2VzIGl0IGFmdGVyIGxvY2sgd29yayBjb21wbGV0ZXNcbiAgICogd2hlbiB0aGUgc3Bhd25lZCBkcml2ZXIgb3ducyB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0geyhjb25uZWN0aW9uOiBpbXBvcnQoXCIuL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0KSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIENhbGxiYWNrIHRoYXQgcmVjZWl2ZXMgdGhlIGRlZGljYXRlZCBsb2NrIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhEZWRpY2F0ZWRDb25uZWN0aW9uKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZVBvb2wodGhpcy5kYXRhYmFzZUlkZW50aWZpZXIpLnNwYXduQ29ubmVjdGlvbigpXG5cbiAgICAvLyBUaGUgc3Bhd25lZCBkcml2ZXIgb3ducyBpdHMgcGh5c2ljYWwgY29ubmVjdGlvbiB1bmxlc3MgaXQgYm9ycm93cyBhIHNoYXJlZCBvbmVcbiAgICAvLyB2aWEgYGdldENvbm5lY3Rpb25gLiBBbiBvd25lZCBjb25uZWN0aW9uIGxpdmVzIG91dHNpZGUgdGhlIHBvb2xzJyB0cmFja2VkIHNldHMsXG4gICAgLy8gc28gcmVnaXN0ZXIgaXQgd2hpbGUgdGhlIGxvY2sgaXMgaGVsZDogYSBzaHV0ZG93biB0aGVuIGNsb3NlcyBpdCAocmVsZWFzaW5nIHRoZVxuICAgIC8vIGxvY2spIGluc3RlYWQgb2Ygb3JwaGFuaW5nIGEgaGFsZi1vcGVuIHNlc3Npb24gdW50aWwgdGhlIERCIGB3YWl0X3RpbWVvdXRgLlxuICAgIGNvbnN0IG93bnNDb25uZWN0aW9uID0gIWNvbm5lY3Rpb24uZ2V0QXJncygpLmdldENvbm5lY3Rpb25cblxuICAgIGlmIChvd25zQ29ubmVjdGlvbikgdGhpcy5jb25maWd1cmF0aW9uLnJlZ2lzdGVyQWR2aXNvcnlMb2NrQ29ubmVjdGlvbihjb25uZWN0aW9uKVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjayhjb25uZWN0aW9uKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAob3duc0Nvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnVucmVnaXN0ZXJBZHZpc29yeUxvY2tDb25uZWN0aW9uKGNvbm5lY3Rpb24pXG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uY2xvc2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5yZWxlYXNlSGVsZEFkdmlzb3J5TG9ja3MoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGBjYWxsYmFja2AsIHJlamVjdGluZyB3aXRoIGBBZHZpc29yeUxvY2tIb2xkVGltZW91dEVycm9yYCBpZiBpdCBoYXNcbiAgICogbm90IHNldHRsZWQgd2l0aGluIGBob2xkVGltZW91dE1zYC4gVGhlIGNhbGxiYWNrIGlzIG5vdCBjYW5jZWxsZWQ7IGNhbGxlcnNcbiAgICogdXNlIGEgZGVkaWNhdGVkIGFkdmlzb3J5LWxvY2sgY29ubmVjdGlvbiBzbyB0aGUgbG9jayBjYW4gc3RpbGwgYmUgcmVsZWFzZWQuXG4gICAqXG4gICAqIFRoZSBjYWxsYmFjayByZWNlaXZlcyBhIGBUaW1lb3V0Q29udHJvbGAgZnJvbSBhd2FpdGVyeSwgZW5hYmxpbmcgY29vcGVyYXRpdmVcbiAgICogY2FuY2VsbGF0aW9uIHZpYSBgY29udHJvbC5jaGVjaygpYCwgYGNvbnRyb2wuc2lnbmFsYCwgYGNvbnRyb2wudGltZWRPdXRgLFxuICAgKiBhbmQgYGNvbnRyb2wucmVtYWluaW5nKClgLCBwbHVzIGBsb2NrQmFja2VuZGAgcHJvdmVuYW5jZSBmb3IgdGhlIHRpZXIgdGhhdFxuICAgKiBzZXJ2ZWQgdGhlIGFjcXVpc2l0aW9uLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZSAoZm9yIHRoZSBlcnJvciBtZXNzYWdlKS5cbiAgICogQHBhcmFtIHsoYXJncz86IHtjb250cm9sPzogaW1wb3J0KFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiKS5UaW1lb3V0Q29udHJvbCwgbG9ja0JhY2tlbmQ6IEFkdmlzb3J5TG9ja0JhY2tlbmRQcm92ZW5hbmNlfSkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBDYWxsYmFjayBob2xkaW5nIHRoZSBsb2NrLlxuICAgKiBAcGFyYW0ge251bWJlciB8IG51bGx9IFtob2xkVGltZW91dE1zXSAtIE1heCBob2xkIHRpbWU7IGZhbHN5IGRpc2FibGVzIHRoZSB0aW1lb3V0LlxuICAgKiBAcGFyYW0ge0Fkdmlzb3J5TG9ja0JhY2tlbmRQcm92ZW5hbmNlfSBbbG9ja0JhY2tlbmRdIC0gUHJvdmVuYW5jZSBvZiB0aGUgYWNxdWlzaXRpb24gc2VydmluZyB0aGlzIGhvbGQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIGNhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBydW5XaXRoQWR2aXNvcnlMb2NrSG9sZFRpbWVvdXQobmFtZSwgY2FsbGJhY2ssIGhvbGRUaW1lb3V0TXMsIGxvY2tCYWNrZW5kKSB7XG4gICAgaWYgKCFob2xkVGltZW91dE1zIHx8IGhvbGRUaW1lb3V0TXMgPD0gMCkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKHtsb2NrQmFja2VuZDogbG9ja0JhY2tlbmQgPz8gQWR2aXNvcnlMb2NrUnVubmVyLnVua25vd25CYWNrZW5kUHJvdmVuYW5jZSgpfSlcbiAgICB9XG5cbiAgICBsZXQgY2FsbGJhY2tTZXR0bGVkID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGltZW91dCh7dGltZW91dDogaG9sZFRpbWVvdXRNc30sIGFzeW5jICh7Y29udHJvbH0pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soe2NvbnRyb2wsIGxvY2tCYWNrZW5kOiBsb2NrQmFja2VuZCA/PyBBZHZpc29yeUxvY2tSdW5uZXIudW5rbm93bkJhY2tlbmRQcm92ZW5hbmNlKCl9KVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGNhbGxiYWNrU2V0dGxlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFjYWxsYmFja1NldHRsZWQgfHwgZXJyb3IgaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFkdmlzb3J5TG9ja0hvbGRUaW1lb3V0RXJyb3IoYEFkdmlzb3J5IGxvY2sgJHtKU09OLnN0cmluZ2lmeShuYW1lKX0gaGVsZCBsb25nZXIgdGhhbiAke2hvbGRUaW1lb3V0TXN9bXNgLCB7bmFtZX0pXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5ldXRyYWwgcHJvdmVuYW5jZSBmb3IgZGlyZWN0IGBydW5XaXRoQWR2aXNvcnlMb2NrSG9sZFRpbWVvdXRgIGNhbGxlcnMgdGhhdFxuICAgKiBob2xkIGEgbG9jayBhY3F1aXJlZCBvdXRzaWRlIHRoaXMgcnVubmVyLlxuICAgKiBAcmV0dXJucyB7QWR2aXNvcnlMb2NrQmFja2VuZFByb3ZlbmFuY2V9IC0gUHJvdmVuYW5jZSB3aXRoIGFuIHVua25vd24gdGllci5cbiAgICovXG4gIHN0YXRpYyB1bmtub3duQmFja2VuZFByb3ZlbmFuY2UoKSB7XG4gICAgcmV0dXJuIHtiYWNrZW5kOiBcInByb2Nlc3MtbG9jYWxcIiwgZmVuY2luZ1N1cHBvcnRlZDogZmFsc2V9XG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGFkdmlzb3J5IGxvY2sgcG9saWN5IGFsbG93cyBmaWxlIHRpZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vYWR2aXNvcnktbG9jay1iYWNrZW5kLXBvbGljeS5qc1wiKS5SZXNvbHZlZEFkdmlzb3J5TG9ja0JhY2tlbmRQb2xpY3l9IHBvbGljeSAtIFJlc29sdmVkIHBvbGljeS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGZpbGUgdGllciBtYXkgc2VydmUgdGhpcyBuYW1lLlxuICovXG5mdW5jdGlvbiBhZHZpc29yeUxvY2tQb2xpY3lBbGxvd3NGaWxlVGllcihwb2xpY3kpIHtcbiAgcmV0dXJuIHBvbGljeS5hbGxvd2VkVGllcnMuaW5jbHVkZXMoXCJmaWxlXCIpXG59XG5cbmV4cG9ydCB7QWR2aXNvcnlMb2NrQnVzeUVycm9yLCBBZHZpc29yeUxvY2tIb2xkVGltZW91dEVycm9yLCBBZHZpc29yeUxvY2tUaW1lb3V0RXJyb3J9XG5leHBvcnQge0Fkdmlzb3J5TG9ja0JhY2tlbmRVbmF2YWlsYWJsZUVycm9yLCBBZHZpc29yeUxvY2tNaW5UaWVyUmVmdXNlZEVycm9yfSBmcm9tIFwiLi9hZHZpc29yeS1sb2NrLWJhY2tlbmQtcG9saWN5LmpzXCJcbmV4cG9ydCB7QWR2aXNvcnlMb2NrTG9zdEVycm9yLCBBZHZpc29yeUxvY2tTZXJ2aWNlVW5hdmFpbGFibGVFcnJvcn0gZnJvbSBcIi4vYWR2aXNvcnktbG9jay1lcnJvcnMuanNcIlxuIl19
|
|
@@ -99,10 +99,11 @@ export default class VelociousBaseRoute {
|
|
|
99
99
|
* Runs namespace.
|
|
100
100
|
* @abstract
|
|
101
101
|
* @param {string} name - Name.
|
|
102
|
-
* @param {(arg: import("./namespace-route.js").default) => void}
|
|
102
|
+
* @param {object | ((arg: import("./namespace-route.js").default) => void)} options - Namespace options or the draw callback (legacy form).
|
|
103
|
+
* @param {((arg: import("./namespace-route.js").default) => void) | undefined} [callback] - Callback function.
|
|
103
104
|
* @returns {void} - No return value.
|
|
104
105
|
*/
|
|
105
|
-
namespace(name: string,
|
|
106
|
+
namespace(name: string, options: object | ((arg: import("./namespace-route.js").default) => void), callback?: ((arg: import("./namespace-route.js").default) => void) | undefined): void;
|
|
106
107
|
/**
|
|
107
108
|
* Runs post.
|
|
108
109
|
* @abstract
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-route.d.ts","sourceRoot":"","sources":["../../../src/routes/base-route.js"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,kBAAkB;IACrC;;yDAEqD;IACrD,MAAM,CAAC,YAAY,EADT,cAAc,gBAAgB,EAAE,OAAO,CAC9B;IAEnB;;+DAE2D;IAC3D,MAAM,CAAC,kBAAkB,EADf,cAAc,sBAAsB,EAAE,OAAO,CAC9B;IAEzB;;0DAEsD;IACtD,MAAM,CAAC,aAAa,EADV,cAAc,iBAAiB,EAAE,OAAO,CAC9B;IAEpB;;8DAE0D;IAC1D,MAAM,CAAC,iBAAiB,EADd,cAAc,qBAAqB,EAAE,OAAO,CAC9B;IAExB;;;OAGG;IACH,MAAM,CAAC,oBAAoB,CAAC,UAAU,EAF3B,cAAc,gBAAgB,EAAE,OAEL,QAErC;IAED;;;OAGG;IACH,MAAM,CAAC,0BAA0B,CAAC,UAAU,EAFjC,cAAc,sBAAsB,EAAE,OAEL,QAE3C;IAED;;;OAGG;IACH,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAF5B,cAAc,iBAAiB,EAAE,OAEL,QAEtC;IAED;;;OAGG;IACH,MAAM,CAAC,yBAAyB,CAAC,UAAU,EAFhC,cAAc,qBAAqB,EAAE,OAEL,QAE1C;IAED;;2CAEuC;IACvC,MAAM,EADI,KAAK,CAAC,kBAAkB,CAAC,CACxB;IAEX;;iIAE6H;IAC7H,MAAM,EADI,KAAK,CAAC;QAAC,SAAS,EAAE;YAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;SAAC,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;KAAC,CAAC,CAC9G;IAEX,cAEC;IAED;;;OAGG;IACH,SAAS,IAFI,KAAK,CAAC;QAAC,SAAS,EAAE;YAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;SAAC,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;KAAC,CAAC,CAE1F;IAElC;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAFG,MAEH,QAA8C;IAEtD;;;;OAIG;IACH,aAAa,IAFA,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC,CAE0B;IAEnG;;;OAGG;IACH,YAAY,IAFC,KAAK,CAAC,kBAAkB,CAAC,CAED;IAErC;;;;;;;OAOG;IACH,aAAa,CAAC,EAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAC,EALlC;QAA4D,MAAM,EAA1D,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CACrD;QAAqB,IAAI,EAAjB,MAAM,CACd;QAAgI,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO,CACzH;KAEkC,GAFxB;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,SAAS,CAI1C;IAED
|
|
1
|
+
{"version":3,"file":"base-route.d.ts","sourceRoot":"","sources":["../../../src/routes/base-route.js"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,kBAAkB;IACrC;;yDAEqD;IACrD,MAAM,CAAC,YAAY,EADT,cAAc,gBAAgB,EAAE,OAAO,CAC9B;IAEnB;;+DAE2D;IAC3D,MAAM,CAAC,kBAAkB,EADf,cAAc,sBAAsB,EAAE,OAAO,CAC9B;IAEzB;;0DAEsD;IACtD,MAAM,CAAC,aAAa,EADV,cAAc,iBAAiB,EAAE,OAAO,CAC9B;IAEpB;;8DAE0D;IAC1D,MAAM,CAAC,iBAAiB,EADd,cAAc,qBAAqB,EAAE,OAAO,CAC9B;IAExB;;;OAGG;IACH,MAAM,CAAC,oBAAoB,CAAC,UAAU,EAF3B,cAAc,gBAAgB,EAAE,OAEL,QAErC;IAED;;;OAGG;IACH,MAAM,CAAC,0BAA0B,CAAC,UAAU,EAFjC,cAAc,sBAAsB,EAAE,OAEL,QAE3C;IAED;;;OAGG;IACH,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAF5B,cAAc,iBAAiB,EAAE,OAEL,QAEtC;IAED;;;OAGG;IACH,MAAM,CAAC,yBAAyB,CAAC,UAAU,EAFhC,cAAc,qBAAqB,EAAE,OAEL,QAE1C;IAED;;2CAEuC;IACvC,MAAM,EADI,KAAK,CAAC,kBAAkB,CAAC,CACxB;IAEX;;iIAE6H;IAC7H,MAAM,EADI,KAAK,CAAC;QAAC,SAAS,EAAE;YAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;SAAC,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;KAAC,CAAC,CAC9G;IAEX,cAEC;IAED;;;OAGG;IACH,SAAS,IAFI,KAAK,CAAC;QAAC,SAAS,EAAE;YAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;SAAC,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;KAAC,CAAC,CAE1F;IAElC;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAFG,MAEH,QAA8C;IAEtD;;;;OAIG;IACH,aAAa,IAFA,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC,CAE0B;IAEnG;;;OAGG;IACH,YAAY,IAFC,KAAK,CAAC,kBAAkB,CAAC,CAED;IAErC;;;;;;;OAOG;IACH,aAAa,CAAC,EAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAC,EALlC;QAA4D,MAAM,EAA1D,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CACrD;QAAqB,IAAI,EAAjB,MAAM,CACd;QAAgI,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO,CACzH;KAEkC,GAFxB;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,SAAS,CAI1C;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,IAAI,EALH,MAKG,EAAE,OAAO,EAJZ,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,sBAAsB,EAAE,OAAO,KAAK,IAAI,CAInD,EAAE,QAAQ,AAH9B,CACA,EADQ,CAAC,CAAC,GAAG,EAAE,OAAO,sBAAsB,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAGpC,GAFpB,IAAI,CAEoE;IAErF;;;;;OAKG;IACH,IAAI,CAAC,IAAI,EAHE,MAGF,GAFI,IAAI,CAEuC;IAExD;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAJH,MAIG,EAAE,QAAQ,EAHb,CAAC,GAAG,EAAE,OAAO,qBAAqB,EAAE,OAAO,KAAK,IAGnC,GAFX,IAAI,CAE2D;CAC7E"}
|
|
@@ -92,10 +92,11 @@ export default class VelociousBaseRoute {
|
|
|
92
92
|
* Runs namespace.
|
|
93
93
|
* @abstract
|
|
94
94
|
* @param {string} name - Name.
|
|
95
|
-
* @param {(arg: import("./namespace-route.js").default) => void}
|
|
95
|
+
* @param {object | ((arg: import("./namespace-route.js").default) => void)} options - Namespace options or the draw callback (legacy form).
|
|
96
|
+
* @param {((arg: import("./namespace-route.js").default) => void) | undefined} [callback] - Callback function.
|
|
96
97
|
* @returns {void} - No return value.
|
|
97
98
|
*/
|
|
98
|
-
namespace(name, callback) { throw new Error("'namespace' not implemented"); } // eslint-disable-line no-unused-vars
|
|
99
|
+
namespace(name, options, callback) { throw new Error("'namespace' not implemented"); } // eslint-disable-line no-unused-vars
|
|
99
100
|
/**
|
|
100
101
|
* Runs post.
|
|
101
102
|
* @abstract
|
|
@@ -112,4 +113,4 @@ export default class VelociousBaseRoute {
|
|
|
112
113
|
*/
|
|
113
114
|
resources(name, callback) { throw new Error("'resources' not implemented"); } // eslint-disable-line no-unused-vars
|
|
114
115
|
}
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1yb3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yb3V0ZXMvYmFzZS1yb3V0ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosTUFBTSxDQUFDLE9BQU8sT0FBTyxrQkFBa0I7SUFDckM7O3lEQUVxRDtJQUNyRCxNQUFNLENBQUMsWUFBWSxDQUFBO0lBRW5COzsrREFFMkQ7SUFDM0QsTUFBTSxDQUFDLGtCQUFrQixDQUFBO0lBRXpCOzswREFFc0Q7SUFDdEQsTUFBTSxDQUFDLGFBQWEsQ0FBQTtJQUVwQjs7OERBRTBEO0lBQzFELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQTtJQUV4Qjs7O09BR0c7SUFDSCxNQUFNLENBQUMsb0JBQW9CLENBQUMsVUFBVTtRQUNwQyxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQTtJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLDBCQUEwQixDQUFDLFVBQVU7UUFDMUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsQ0FBQTtJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFVBQVU7UUFDckMsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUE7SUFDakMsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVO1FBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUE7SUFDckMsQ0FBQztJQUVEOzsyQ0FFdUM7SUFDdkMsTUFBTSxHQUFHLEVBQUUsQ0FBQTtJQUVYOztpSUFFNkg7SUFDN0gsTUFBTSxHQUFHLEVBQUUsQ0FBQTtJQUVYO1FBQ0UsVUFBVTtJQUNaLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBLENBQUMsQ0FBQztJQUVsQzs7OztPQUlHO0lBQ0gsR0FBRyxDQUFDLElBQUksSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMscUNBQXFDO0lBRTVGOzs7O09BSUc7SUFDSCxhQUFhLEtBQUssTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUVuRzs7O09BR0c7SUFDSCxZQUFZLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBLENBQUMsQ0FBQztJQUVyQzs7Ozs7OztPQU9HO0lBQ0gsYUFBYSxDQUFDLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQy9FLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxxQ0FBcUM7SUFFM0g7Ozs7O09BS0c7SUFDSCxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxxQ0FBcUM7SUFFOUY7Ozs7OztPQU1HO0lBQ0gsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLHFDQUFxQztDQUNuSCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNCYXNlUm91dGUge1xuICAvKipcbiAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vZ2V0LXJvdXRlLmpzXCIpLmRlZmF1bHR9ICovXG4gIHN0YXRpYyBHZXRSb3V0ZVR5cGVcblxuICAvKipcbiAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vbmFtZXNwYWNlLXJvdXRlLmpzXCIpLmRlZmF1bHR9ICovXG4gIHN0YXRpYyBOYW1lU3BhY2VSb3V0ZVR5cGVcblxuICAvKipcbiAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vcG9zdC1yb3V0ZS5qc1wiKS5kZWZhdWx0fSAqL1xuICBzdGF0aWMgUG9zdFJvdXRlVHlwZVxuXG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9yZXNvdXJjZS1yb3V0ZS5qc1wiKS5kZWZhdWx0fSAqL1xuICBzdGF0aWMgUmVzb3VyY2VSb3V0ZVR5cGVcblxuICAvKipcbiAgICogUnVucyByZWdpc3RlciByb3V0ZSBnZXQgdHlwZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9nZXQtcm91dGUuanNcIikuZGVmYXVsdH0gUm91dGVDbGFzcyAtIFJvdXRlIGNsYXNzIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyUm91dGVHZXRUeXBlKFJvdXRlQ2xhc3MpIHtcbiAgICB0aGlzLkdldFJvdXRlVHlwZSA9IFJvdXRlQ2xhc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlZ2lzdGVyIHJvdXRlIG5hbWVzcGFjZSB0eXBlLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL25hbWVzcGFjZS1yb3V0ZS5qc1wiKS5kZWZhdWx0fSBSb3V0ZUNsYXNzIC0gUm91dGUgY2xhc3MgdG8gcmVnaXN0ZXIuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJSb3V0ZU5hbWVzcGFjZVR5cGUoUm91dGVDbGFzcykge1xuICAgIHRoaXMuTmFtZVNwYWNlUm91dGVUeXBlID0gUm91dGVDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVnaXN0ZXIgcm91dGUgcG9zdCB0eXBlLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL3Bvc3Qtcm91dGUuanNcIikuZGVmYXVsdH0gUm91dGVDbGFzcyAtIFJvdXRlIGNsYXNzIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyUm91dGVQb3N0VHlwZShSb3V0ZUNsYXNzKSB7XG4gICAgdGhpcy5Qb3N0Um91dGVUeXBlID0gUm91dGVDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVnaXN0ZXIgcm91dGUgcmVzb3VyY2UgdHlwZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9yZXNvdXJjZS1yb3V0ZS5qc1wiKS5kZWZhdWx0fSBSb3V0ZUNsYXNzIC0gUm91dGUgY2xhc3MgdG8gcmVnaXN0ZXIuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJSb3V0ZVJlc291cmNlVHlwZShSb3V0ZUNsYXNzKSB7XG4gICAgdGhpcy5SZXNvdXJjZVJvdXRlVHlwZSA9IFJvdXRlQ2xhc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZXMuXG4gICAqIEB0eXBlIHtBcnJheTxWZWxvY2lvdXNCYXNlUm91dGU+fSAqL1xuICByb3V0ZXMgPSBbXVxuXG4gIC8qKlxuICAgKiBNb3VudHMuXG4gICAqIEB0eXBlIHtBcnJheTx7bW91bnRhYmxlOiB7bW91bnRJbnRvOiAoYXJnczogb2JqZWN0KSA9PiB2b2lkfSwgb3B0aW9uczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fT59ICovXG4gIG1vdW50cyA9IFtdXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gTm90aGluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IG1vdW50cy5cbiAgICogQHJldHVybnMge0FycmF5PHttb3VudGFibGU6IHttb3VudEludG86IChhcmdzOiBvYmplY3QpID0+IHZvaWR9LCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59Pn0gLSBNb3VudHMgZGVjbGFyZWQgb24gdGhpcyByb3V0ZS5cbiAgICovXG4gIGdldE1vdW50cygpIHsgcmV0dXJuIHRoaXMubW91bnRzIH1cblxuICAvKipcbiAgICogUnVucyBnZXQuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIE5hbWUuXG4gICAqL1xuICBnZXQobmFtZSkgeyB0aHJvdyBuZXcgRXJyb3IoXCInZ2V0JyBub3QgaW1wbGVtZW50ZWRcIikgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGh1bWFuIHBhdGhzLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHJldHVybnMge0FycmF5PHthY3Rpb246IHN0cmluZyB8IG51bGwsIG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmd9Pn0gLSBSb3V0ZSBkZWZpbml0aW9ucyBmb3IgdGhpcyByZXNvdXJjZS5cbiAgICovXG4gIGdldEh1bWFuUGF0aHMoKSB7IHRocm93IG5ldyBFcnJvcihgJ2dldEh1bWFuUGF0aHMnIG5vdCBpbXBsZW1lbnRlZCBmb3IgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9YCkgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBzdWIgcm91dGVzLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8VmVsb2Npb3VzQmFzZVJvdXRlPn0gLSBUaGUgc3ViIHJvdXRlcy5cbiAgICovXG4gIGdldFN1YlJvdXRlcygpIHsgcmV0dXJuIHRoaXMucm91dGVzIH1cblxuICAvKipcbiAgICogUnVucyBtYXRjaCB3aXRoIHBhdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzLnBhcmFtcyAtIFBhcmFtZXRlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wYXRoIC0gUGF0aC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7e3Jlc3RQYXRoOiBzdHJpbmd9IHwgdW5kZWZpbmVkfSAtIFJFU1QgcGF0aCBtZXRhZGF0YSBmb3IgdGhpcyByb3V0ZS5cbiAgICovXG4gIG1hdGNoV2l0aFBhdGgoe3BhcmFtcywgcGF0aCwgcmVxdWVzdH0pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gJ21hdGNoV2l0aFBhdGgnIGltcGxlbWVudGVkIG9uICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfWApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBuYW1lc3BhY2UuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIE5hbWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgKChhcmc6IGltcG9ydChcIi4vbmFtZXNwYWNlLXJvdXRlLmpzXCIpLmRlZmF1bHQpID0+IHZvaWQpfSBvcHRpb25zIC0gTmFtZXNwYWNlIG9wdGlvbnMgb3IgdGhlIGRyYXcgY2FsbGJhY2sgKGxlZ2FjeSBmb3JtKS5cbiAgICogQHBhcmFtIHsoKGFyZzogaW1wb3J0KFwiLi9uYW1lc3BhY2Utcm91dGUuanNcIikuZGVmYXVsdCkgPT4gdm9pZCkgfCB1bmRlZmluZWR9IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgbmFtZXNwYWNlKG5hbWUsIG9wdGlvbnMsIGNhbGxiYWNrKSB7IHRocm93IG5ldyBFcnJvcihcIiduYW1lc3BhY2UnIG5vdCBpbXBsZW1lbnRlZFwiKSB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcblxuICAvKipcbiAgICogUnVucyBwb3N0LlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBOYW1lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBwb3N0KG5hbWUpIHsgdGhyb3cgbmV3IEVycm9yKFwiJ3Bvc3QnIG5vdCBpbXBsZW1lbnRlZFwiKSB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcblxuICAvKipcbiAgICogUnVucyByZXNvdXJjZXMuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIE5hbWUuXG4gICAqIEBwYXJhbSB7KGFyZzogaW1wb3J0KFwiLi9yZXNvdXJjZS1yb3V0ZS5qc1wiKS5kZWZhdWx0KSA9PiB2b2lkfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICByZXNvdXJjZXMobmFtZSwgY2FsbGJhY2spIHsgdGhyb3cgbmV3IEVycm9yKFwiJ3Jlc291cmNlcycgbm90IGltcGxlbWVudGVkXCIpIH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xufVxuIl19
|
|
@@ -3,8 +3,13 @@ export default class VelociousBasicRoute extends BaseRoute {
|
|
|
3
3
|
/**
|
|
4
4
|
* Runs get.
|
|
5
5
|
* @param {string} name - Route name.
|
|
6
|
+
* @param {{on?: "member" | "collection"} | {skipControllerConnections?: boolean}} [options] - Route options; `skipControllerConnections: true` skips the request-scoped controller connection for this route.
|
|
6
7
|
*/
|
|
7
|
-
get(name: string
|
|
8
|
+
get(name: string, options?: {
|
|
9
|
+
on?: "member" | "collection";
|
|
10
|
+
} | {
|
|
11
|
+
skipControllerConnections?: boolean;
|
|
12
|
+
}): void;
|
|
8
13
|
/**
|
|
9
14
|
* Runs match with path.
|
|
10
15
|
* @param {object} args - Options object.
|
|
@@ -34,17 +39,25 @@ export default class VelociousBasicRoute extends BaseRoute {
|
|
|
34
39
|
}, options?: object): void;
|
|
35
40
|
/**
|
|
36
41
|
* Runs namespace.
|
|
37
|
-
* @param {string} name -
|
|
38
|
-
* @param {(arg: import("./namespace-route.js").default) => void}
|
|
42
|
+
* @param {string} name - Route name.
|
|
43
|
+
* @param {{skipControllerConnections?: boolean} | ((arg: import("./namespace-route.js").default) => void)} [options] - Namespace options (`skipControllerConnections: true` skips the request-scoped controller connection for every route declared inside this namespace; a per-route option still overrides it) or the draw callback (legacy form).
|
|
44
|
+
* @param {((arg: import("./namespace-route.js").default) => void) | undefined} [callback] - Callback function.
|
|
39
45
|
* @returns {void} - No return value.
|
|
40
46
|
*/
|
|
41
|
-
namespace(name: string,
|
|
47
|
+
namespace(name: string, options?: {
|
|
48
|
+
skipControllerConnections?: boolean;
|
|
49
|
+
} | ((arg: import("./namespace-route.js").default) => void), callback?: ((arg: import("./namespace-route.js").default) => void) | undefined): void;
|
|
42
50
|
/**
|
|
43
51
|
* Runs post.
|
|
44
|
-
* @param {string} name -
|
|
52
|
+
* @param {string} name - Route name.
|
|
53
|
+
* @param {{on?: "member" | "collection"} | {skipControllerConnections?: boolean}} [options] - Route options; `skipControllerConnections: true` skips the request-scoped controller connection for this route.
|
|
45
54
|
* @returns {void} - No return value.
|
|
46
55
|
*/
|
|
47
|
-
post(name: string
|
|
56
|
+
post(name: string, options?: {
|
|
57
|
+
on?: "member" | "collection";
|
|
58
|
+
} | {
|
|
59
|
+
skipControllerConnections?: boolean;
|
|
60
|
+
}): void;
|
|
48
61
|
/**
|
|
49
62
|
* Runs resources.
|
|
50
63
|
* @param {string} name - Name.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basic-route.d.ts","sourceRoot":"","sources":["../../../src/routes/basic-route.js"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,iBAAiB,CAAA;AAEvC,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,SAAS;IACxD
|
|
1
|
+
{"version":3,"file":"basic-route.d.ts","sourceRoot":"","sources":["../../../src/routes/basic-route.js"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,iBAAiB,CAAA;AAEvC,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,SAAS;IACxD;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAHG,MAGH,EAAE,OAAO,AAFd,CACF,EADU;QAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAA;KAAC,GAAG;QAAC,yBAAyB,CAAC,EAAE,OAAO,CAAA;KAE1D,QAKrB;IAED;;;;;;;OAOG;IACH,aAAa,CAAC,EAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAC,EALlC;QAA4D,MAAM,EAA1D,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CACrD;QAAqB,IAAI,EAAjB,MAAM,CACd;QAAgI,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO,CACzH;KAEkC,GAFxB;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,SAAS,CAI1C;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,SAAS,EAJJ;QAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;KAI9B,EAAE,OAAO,AAHrB,CACA,EADQ,MAGkB,GAFhB,IAAI,CAchB;IAED;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EALH,MAKG,EAAE,OAAO,AAJpB,CACA,EADQ;QAAC,yBAAyB,CAAC,EAAE,OAAO,CAAA;KAAC,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,sBAAsB,EAAE,OAAO,KAAK,IAAI,CAI7E,EAAE,QAAQ,AAHnC,CACA,EADQ,CAAC,CAAC,GAAG,EAAE,OAAO,sBAAsB,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAG/B,GAFzB,IAAI,CAoChB;IAED;;;;;OAKG;IACH,IAAI,CAAC,IAAI,EAJE,MAIF,EAAE,OAAO,AAHf,CACA,EADQ;QAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAA;KAAC,GAAG;QAAC,yBAAyB,CAAC,EAAE,OAAO,CAAA;KAGzD,GAFV,IAAI,CAUhB;IAED;;;;;OAKG;IACH,SAAS,CAAC,IAAI,EAJH,MAIG,EAAE,QAAQ,AAHrB,CACA,EADQ,CAAC,GAAG,EAAE,OAAO,qBAAqB,EAAE,OAAO,KAAK,IAGnC,GAFX,IAAI,CAchB;CACF"}
|