@dbx-tools/cache 0.9.176 → 0.9.178
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/README.md +19 -0
- package/index.ts +2 -2
- package/lib/index.d.ts +2 -2
- package/lib/index.js +2 -2
- package/lib/src/cache.d.ts +9 -2
- package/lib/src/cache.js +78 -15
- package/package.json +3 -3
- package/src/cache.ts +101 -19
package/README.md
CHANGED
|
@@ -20,6 +20,25 @@ await closeCache(cache);
|
|
|
20
20
|
`projectCache` reuses the same named cache within the process. Call `closeCache`
|
|
21
21
|
during application shutdown to flush pending disk writes.
|
|
22
22
|
|
|
23
|
+
## Refresh hot values without blocking
|
|
24
|
+
|
|
25
|
+
Set `refreshAfterWrite` when callers should keep receiving the current value
|
|
26
|
+
while one asynchronous reload updates it. The duration can depend on the cached
|
|
27
|
+
value:
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
const enabled = await getOrSet(cache, "smart-router", probeSmartRouter, {
|
|
31
|
+
ttl: "2h",
|
|
32
|
+
refreshAfterWrite: (value) => (value ? "5m" : "30s"),
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The first miss blocks for the loader. After `refreshAfterWrite`, the next access
|
|
37
|
+
returns the cached value immediately and starts one coalesced background refresh.
|
|
38
|
+
Unused entries are not refreshed, and `ttl` remains the hard expiration. A
|
|
39
|
+
failed background refresh keeps the previous value. `closeCache()` waits for
|
|
40
|
+
active refreshes before disconnecting persistence.
|
|
41
|
+
|
|
23
42
|
## Create a memory-only cache
|
|
24
43
|
|
|
25
44
|
Use `createCache` without persistence levels when values should remain local to
|
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/cache";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.178";
|
|
7
7
|
export * as cache from "./src/cache.ts";
|
|
8
8
|
export { createCache, cachePath, projectCache, flushCache, closeCache, cacheKeys, deleteCachedValue, getOrSet } from "./src/cache.ts";
|
|
9
|
-
export type { CacheLevel, CacheOptions, ProjectCacheOptions, GetOrSetOptions } from "./src/cache.ts";
|
|
9
|
+
export type { CacheLevel, CacheOptions, ProjectCacheOptions, RefreshAfterWrite, GetOrSetOptions } from "./src/cache.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/cache";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.178";
|
|
3
3
|
export * as cache from "./src/cache.ts";
|
|
4
4
|
export { createCache, cachePath, projectCache, flushCache, closeCache, cacheKeys, deleteCachedValue, getOrSet } from "./src/cache.ts";
|
|
5
|
-
export type { CacheLevel, CacheOptions, ProjectCacheOptions, GetOrSetOptions } from "./src/cache.ts";
|
|
5
|
+
export type { CacheLevel, CacheOptions, ProjectCacheOptions, RefreshAfterWrite, GetOrSetOptions } from "./src/cache.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/cache";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.178";
|
|
6
6
|
export * as cache from "./src/cache.js";
|
|
7
7
|
export { createCache, cachePath, projectCache, flushCache, closeCache, cacheKeys, deleteCachedValue, getOrSet } from "./src/cache.js";
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9jYWNoZVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjE3OFwiO1xuZXhwb3J0ICogYXMgY2FjaGUgZnJvbSBcIi4vc3JjL2NhY2hlLnRzXCI7XG5leHBvcnQgeyBjcmVhdGVDYWNoZSwgY2FjaGVQYXRoLCBwcm9qZWN0Q2FjaGUsIGZsdXNoQ2FjaGUsIGNsb3NlQ2FjaGUsIGNhY2hlS2V5cywgZGVsZXRlQ2FjaGVkVmFsdWUsIGdldE9yU2V0IH0gZnJvbSBcIi4vc3JjL2NhY2hlLnRzXCI7XG5leHBvcnQgdHlwZSB7IENhY2hlTGV2ZWwsIENhY2hlT3B0aW9ucywgUHJvamVjdENhY2hlT3B0aW9ucywgUmVmcmVzaEFmdGVyV3JpdGUsIEdldE9yU2V0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9jYWNoZS50c1wiO1xuIl19
|
package/lib/src/cache.d.ts
CHANGED
|
@@ -33,12 +33,19 @@ export interface ProjectCacheOptions extends CacheOptions {
|
|
|
33
33
|
/** Override the project name resolved through projectUtils.name(). */
|
|
34
34
|
readonly projectName?: string;
|
|
35
35
|
}
|
|
36
|
+
/** Age after which a cache hit returns its value and starts an asynchronous refresh. */
|
|
37
|
+
export type RefreshAfterWrite<T> = number | string | ((value: T) => number | string);
|
|
36
38
|
/** Options for the Cacheable-compatible get-or-set extension. */
|
|
37
|
-
export interface GetOrSetOptions extends GetOrSetFunctionOptions {
|
|
39
|
+
export interface GetOrSetOptions<T = unknown> extends GetOrSetFunctionOptions {
|
|
38
40
|
/** Return a separately retained successful value when the loader fails. Defaults to false. */
|
|
39
41
|
readonly returnCachedOnError?: boolean;
|
|
40
42
|
/** TTL for the cached-on-error value. Defaults to 0, meaning no expiration. */
|
|
41
43
|
readonly cachedOnErrorTtl?: number | string;
|
|
44
|
+
/**
|
|
45
|
+
* Return an older cached value immediately and refresh it once in the background after this
|
|
46
|
+
* duration since its last successful write. The hard `ttl` still controls final expiration.
|
|
47
|
+
*/
|
|
48
|
+
readonly refreshAfterWrite?: RefreshAfterWrite<T>;
|
|
42
49
|
}
|
|
43
50
|
/** Create a memory-first cache with optional ordered persistent levels. */
|
|
44
51
|
export declare function createCache(options?: CacheOptions): Cacheable;
|
|
@@ -61,4 +68,4 @@ export declare function deleteCachedValue(cache: Cacheable, key: string): Promis
|
|
|
61
68
|
* Use Cacheable's native in-flight get-or-set behavior, optionally retaining a
|
|
62
69
|
* successful value under a separate key for recovery when a later loader fails.
|
|
63
70
|
*/
|
|
64
|
-
export declare function getOrSet<T>(cache: Cacheable, key: string, load: () => Promise<T>, options?: GetOrSetOptions): Promise<T | undefined>;
|
|
71
|
+
export declare function getOrSet<T>(cache: Cacheable, key: string, load: () => Promise<T>, options?: GetOrSetOptions<T>): Promise<T | undefined>;
|
package/lib/src/cache.js
CHANGED
|
@@ -7,7 +7,7 @@ import { EventEmitter } from "node:events";
|
|
|
7
7
|
import { join } from "node:path";
|
|
8
8
|
import { projectUtils } from "@dbx-tools/core";
|
|
9
9
|
import { log, toError } from "@dbx-tools/shared-core";
|
|
10
|
-
import { Cacheable, CacheableHooks, KeyvCacheableMemory, } from "cacheable";
|
|
10
|
+
import { Cacheable, CacheableHooks, KeyvCacheableMemory, shorthandToMilliseconds, } from "cacheable";
|
|
11
11
|
import envPaths from "env-paths";
|
|
12
12
|
import { Keyv } from "keyv";
|
|
13
13
|
import { KeyvFile } from "keyv-file";
|
|
@@ -18,6 +18,7 @@ const ENVELOPE_VERSION = 1;
|
|
|
18
18
|
const logger = log.logger("cache");
|
|
19
19
|
const states = new WeakMap();
|
|
20
20
|
const projectCaches = new Map();
|
|
21
|
+
const resultWriteTimes = new WeakMap();
|
|
21
22
|
/**
|
|
22
23
|
* Keyv adapter that composes arbitrary ordered levels behind Cacheable's one
|
|
23
24
|
* secondary-store slot and owns tracked write-behind persistence.
|
|
@@ -208,7 +209,7 @@ export function createCache(options = {}) {
|
|
|
208
209
|
cache.on("error", (error) => {
|
|
209
210
|
logger.warn("cacheable operation failed", { error: toError(error) });
|
|
210
211
|
});
|
|
211
|
-
states.set(cache, { adapter, closed: false });
|
|
212
|
+
states.set(cache, { adapter, refreshes: new Map(), closed: false });
|
|
212
213
|
return cache;
|
|
213
214
|
}
|
|
214
215
|
/** Resolve the default portable disk path for a project cache scope. */
|
|
@@ -253,6 +254,8 @@ export async function closeCache(cache) {
|
|
|
253
254
|
const state = requireState(cache);
|
|
254
255
|
if (state.closed)
|
|
255
256
|
return;
|
|
257
|
+
while (state.refreshes.size > 0)
|
|
258
|
+
await Promise.all([...state.refreshes.values()]);
|
|
256
259
|
await state.adapter?.disconnect();
|
|
257
260
|
state.closed = true;
|
|
258
261
|
if (state.registryKey && projectCaches.get(state.registryKey) === cache) {
|
|
@@ -280,15 +283,40 @@ export async function deleteCachedValue(cache, key) {
|
|
|
280
283
|
* successful value under a separate key for recovery when a later loader fails.
|
|
281
284
|
*/
|
|
282
285
|
export async function getOrSet(cache, key, load, options = {}) {
|
|
283
|
-
const { returnCachedOnError = false, cachedOnErrorTtl = 0, ...cacheableOptions } = options;
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
return await cache.getOrSet(key, async () => {
|
|
288
|
-
const value = await load();
|
|
286
|
+
const { returnCachedOnError = false, cachedOnErrorTtl = 0, refreshAfterWrite, ...cacheableOptions } = options;
|
|
287
|
+
const loadFresh = async () => {
|
|
288
|
+
const value = await load();
|
|
289
|
+
if (returnCachedOnError) {
|
|
289
290
|
await cache.set(cachedOnErrorKey(key), value, { ttl: cachedOnErrorTtl });
|
|
291
|
+
}
|
|
292
|
+
return value;
|
|
293
|
+
};
|
|
294
|
+
if (refreshAfterWrite !== undefined) {
|
|
295
|
+
const getOptions = cacheableOptions.nonBlocking === undefined
|
|
296
|
+
? undefined
|
|
297
|
+
: { nonBlocking: cacheableOptions.nonBlocking };
|
|
298
|
+
let cached = await cache.getRaw(key, getOptions);
|
|
299
|
+
if (!cached) {
|
|
300
|
+
const refresh = requireState(cache).refreshes.get(key);
|
|
301
|
+
if (refresh) {
|
|
302
|
+
await refresh;
|
|
303
|
+
cached = await cache.getRaw(key, getOptions);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (cached) {
|
|
307
|
+
const value = cached.value;
|
|
308
|
+
const writtenAt = resultWriteTimes.get(cached);
|
|
309
|
+
const refreshMs = resolveRefreshAfterWrite(refreshAfterWrite, value);
|
|
310
|
+
if (writtenAt === undefined || Date.now() - writtenAt >= refreshMs) {
|
|
311
|
+
startRefresh(cache, key, loadFresh, cacheableOptions);
|
|
312
|
+
}
|
|
290
313
|
return value;
|
|
291
|
-
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (!returnCachedOnError)
|
|
317
|
+
return cache.getOrSet(key, loadFresh, cacheableOptions);
|
|
318
|
+
try {
|
|
319
|
+
return await cache.getOrSet(key, loadFresh, { ...cacheableOptions, throwErrors: true });
|
|
292
320
|
}
|
|
293
321
|
catch (error) {
|
|
294
322
|
const cached = await cache.get(cachedOnErrorKey(key));
|
|
@@ -309,20 +337,26 @@ function installValueEnvelope(cache) {
|
|
|
309
337
|
});
|
|
310
338
|
cache.onHook(CacheableHooks.AFTER_GET, (item) => {
|
|
311
339
|
if (item.result)
|
|
312
|
-
|
|
340
|
+
unwrapResult(item.result);
|
|
313
341
|
});
|
|
314
342
|
cache.onHook(CacheableHooks.AFTER_GET_MANY, (item) => {
|
|
315
343
|
for (const result of item.result) {
|
|
316
344
|
if (result)
|
|
317
|
-
|
|
345
|
+
unwrapResult(result);
|
|
318
346
|
}
|
|
319
347
|
});
|
|
320
348
|
}
|
|
321
349
|
function envelope(value) {
|
|
322
|
-
return { __dbxToolsCacheEnvelope: ENVELOPE_VERSION, value };
|
|
350
|
+
return { __dbxToolsCacheEnvelope: ENVELOPE_VERSION, value, writtenAt: Date.now() };
|
|
323
351
|
}
|
|
324
|
-
function
|
|
325
|
-
|
|
352
|
+
function unwrapResult(result) {
|
|
353
|
+
if (!isEnvelope(result.value))
|
|
354
|
+
return;
|
|
355
|
+
const { writtenAt } = result.value;
|
|
356
|
+
if (typeof writtenAt === "number" && Number.isFinite(writtenAt)) {
|
|
357
|
+
resultWriteTimes.set(result, writtenAt);
|
|
358
|
+
}
|
|
359
|
+
result.value = result.value.value;
|
|
326
360
|
}
|
|
327
361
|
function isEnvelope(value) {
|
|
328
362
|
return Boolean(value &&
|
|
@@ -334,6 +368,35 @@ function isEnvelope(value) {
|
|
|
334
368
|
function cachedOnErrorKey(key) {
|
|
335
369
|
return `${ERROR_VALUE_PREFIX}${key}`;
|
|
336
370
|
}
|
|
371
|
+
function startRefresh(cache, key, load, options) {
|
|
372
|
+
const state = requireState(cache);
|
|
373
|
+
if (state.refreshes.has(key))
|
|
374
|
+
return;
|
|
375
|
+
let refresh;
|
|
376
|
+
refresh = (async () => {
|
|
377
|
+
const value = await load();
|
|
378
|
+
await cache.set(key, value, {
|
|
379
|
+
...(options.ttl === undefined ? {} : { ttl: options.ttl }),
|
|
380
|
+
...(options.nonBlocking === undefined ? {} : { nonBlocking: options.nonBlocking }),
|
|
381
|
+
});
|
|
382
|
+
})()
|
|
383
|
+
.catch((error) => {
|
|
384
|
+
logger.warn("cache background refresh failed", { key, error: toError(error) });
|
|
385
|
+
})
|
|
386
|
+
.finally(() => {
|
|
387
|
+
if (state.refreshes.get(key) === refresh)
|
|
388
|
+
state.refreshes.delete(key);
|
|
389
|
+
});
|
|
390
|
+
state.refreshes.set(key, refresh);
|
|
391
|
+
}
|
|
392
|
+
function resolveRefreshAfterWrite(option, value) {
|
|
393
|
+
const configured = typeof option === "function" ? option(value) : option;
|
|
394
|
+
const resolved = typeof configured === "number" ? configured : shorthandToMilliseconds(configured);
|
|
395
|
+
if (resolved === undefined || !Number.isFinite(resolved) || resolved <= 0) {
|
|
396
|
+
throw new RangeError("refreshAfterWrite must resolve to a positive duration");
|
|
397
|
+
}
|
|
398
|
+
return resolved;
|
|
399
|
+
}
|
|
337
400
|
async function settleLevels(levels, operation, operationName) {
|
|
338
401
|
const results = await Promise.allSettled(levels.map((level) => operation(level)));
|
|
339
402
|
const errors = results.flatMap((result, index) => result.status === "rejected"
|
|
@@ -369,4 +432,4 @@ function nonNegativeInteger(value, fallback, name) {
|
|
|
369
432
|
}
|
|
370
433
|
return resolved;
|
|
371
434
|
}
|
|
372
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZCxtQkFBbUIsR0FJcEIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxRQUFRLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyQyxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQztBQUNsQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUNsQyxNQUFNLGtCQUFrQixHQUFHLGdDQUFnQyxDQUFDO0FBQzVELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFxRW5DLE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUF5QixDQUFDO0FBQ3BELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFxQixDQUFDO0FBRW5EOzs7R0FHRztBQUNILE1BQU0sa0JBQW1CLFNBQVEsWUFBWTtJQUNsQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ25CLFNBQVMsQ0FBVTtJQUVGLE1BQU0sQ0FBd0I7SUFDOUIsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQ3RDLFVBQVUsR0FBRyxJQUFJ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QU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxJQUFJLGlDQUFpQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeS1maXJzdCBDYWNoZWFibGUgYW5kIEtleXYgY29tcG9zaXRpb24uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHByb2plY3RVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGxvZywgdG9FcnJvciB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBDYWNoZWFibGUsXG4gIENhY2hlYWJsZUhvb2tzLFxuICBLZXl2Q2FjaGVhYmxlTWVtb3J5LFxuICB0eXBlIENhY2hlYWJsZU9wdGlvbnMsXG4gIHR5cGUgR2V0T3JTZXRGdW5jdGlvbk9wdGlvbnMsXG4gIHR5cGUgS2V5dlN0b3JlQWRhcHRlcixcbn0gZnJvbSBcImNhY2hlYWJsZVwiO1xuaW1wb3J0IGVudlBhdGhzIGZyb20gXCJlbnYtcGF0aHNcIjtcbmltcG9ydCB7IEtleXYgfSBmcm9tIFwia2V5dlwiO1xuaW1wb3J0IHsgS2V5dkZpbGUgfSBmcm9tIFwia2V5di1maWxlXCI7XG5cbmNvbnN0IERFRkFVTFRfTUFYX0VOVFJJRVMgPSAxXzAwMDtcbmNvbnN0IERFRkFVTFRfV1JJVEVfREVMQVlfTVMgPSAyNTtcbmNvbnN0IEVSUk9SX1ZBTFVFX1BSRUZJWCA9IFwiX19kYnhfdG9vbHNfY2FjaGVkX29uX2Vycm9yX186XCI7XG5jb25zdCBFTlZFTE9QRV9WRVJTSU9OID0gMTtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJjYWNoZVwiKTtcblxuaW50ZXJmYWNlIFZhbHVlRW52ZWxvcGUge1xuICByZWFkb25seSBfX2RieFRvb2xzQ2FjaGVFbnZlbG9wZTogdHlwZW9mIEVOVkVMT1BFX1ZFUlNJT047XG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgU2V0TXV0YXRpb24ge1xuICByZWFkb25seSBraW5kOiBcInNldFwiO1xuICByZWFkb25seSB0dGw/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgRGVsZXRlTXV0YXRpb24ge1xuICByZWFkb25seSBraW5kOiBcImRlbGV0ZVwiO1xufVxuXG50eXBlIE11dGF0aW9uID0gRGVsZXRlTXV0YXRpb24gfCBTZXRNdXRhdGlvbjtcblxuaW50ZXJmYWNlIENhY2hlU3RhdGUge1xuICByZWFkb25seSBhZGFwdGVyPzogVGllcmVkU3RvcmVBZGFwdGVyO1xuICBwYXRoPzogc3RyaW5nO1xuICByZWdpc3RyeUtleT86IHN0cmluZztcbiAgY2xvc2VkOiBib29sZWFuO1xufVxuXG4vKiogT25lIG9yZGVyZWQgcGVyc2lzdGVudCBjYWNoZSBsZXZlbC4gRWFybGllciBsZXZlbHMgYXJlIHJlYWQgZmlyc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlTGV2ZWwge1xuICAvKiogT3B0aW9uYWwgbmFtZSBpbmNsdWRlZCBpbiBwZXJzaXN0ZW5jZSBlcnJvciBtZXNzYWdlcy4gKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgLyoqIEtleXYtY29tcGF0aWJsZSBzdG9yZSBhZGFwdGVyLiAqL1xuICByZWFkb25seSBzdG9yZTogS2V5dlN0b3JlQWRhcHRlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIGFuIEFwcEtpdC1pbmRlcGVuZGVudCBtZW1vcnktZmlyc3QgY2FjaGUuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlT3B0aW9ucyBleHRlbmRzIFBpY2s8XG4gIENhY2hlYWJsZU9wdGlvbnMsXG4gIFwiY2FjaGVJZFwiIHwgXCJtYXhUdGxcIiB8IFwibmFtZXNwYWNlXCIgfCBcInN0YXRzXCIgfCBcInRhZ3NcIiB8IFwidHRsXCJcbj4ge1xuICAvKiogQWRkaXRpb25hbCBvcmRlcmVkIHBlcnNpc3RlbmNlIGxldmVscy4gTm8gbGV2ZWxzIGNyZWF0ZXMgYSBtZW1vcnktb25seSBjYWNoZS4gKi9cbiAgcmVhZG9ubHkgbGV2ZWxzPzogcmVhZG9ubHkgQ2FjaGVMZXZlbFtdO1xuICAvKiogTWF4aW11bSBlbnRyaWVzIHJldGFpbmVkIGluIHRoZSBtZW1vcnkgcHJpbWFyeS4gRGVmYXVsdHMgdG8gMSwwMDAuICovXG4gIHJlYWRvbmx5IG1heEVudHJpZXM/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIG1lbW9yeSByZWFkcyBjbG9uZSB2YWx1ZXMuIERlZmF1bHRzIHRvIHRydWUuICovXG4gIHJlYWRvbmx5IHVzZUNsb25lPzogYm9vbGVhbjtcbiAgLyoqIERlbGF5IHVzZWQgdG8gY29hbGVzY2UgcGVyc2lzdGVuY2UgbXV0YXRpb25zLiBEZWZhdWx0cyB0byAyNSBtaWxsaXNlY29uZHMuICovXG4gIHJlYWRvbmx5IHdyaXRlRGVsYXlNcz86IG51bWJlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHRoZSBkZWZhdWx0IHByb2plY3Qtc2NvcGVkIG1lbW9yeSBhbmQgZGlzayBjYWNoZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdENhY2hlT3B0aW9ucyBleHRlbmRzIENhY2hlT3B0aW9ucyB7XG4gIC8qKiBPdmVycmlkZSB0aGUgY2FjaGUgZGlyZWN0b3J5LCBwcmltYXJpbHkgZm9yIHRlc3RzLiAqL1xuICByZWFkb25seSBjYWNoZURpcj86IHN0cmluZztcbiAgLyoqIERpc2FibGUgdGhlIGRlZmF1bHQgZGlzayBsZXZlbC4gRGVmYXVsdHMgdG8gdHJ1ZS4gKi9cbiAgcmVhZG9ubHkgZGlzaz86IGJvb2xlYW47XG4gIC8qKiBEZWxheSB1c2VkIGJ5IGtleXYtZmlsZSB0byBjb2FsZXNjZSBmaWxlIHJld3JpdGVzLiBEZWZhdWx0cyB0byAxMDAgbWlsbGlzZWNvbmRzLiAqL1xuICByZWFkb25seSBkaXNrV3JpdGVEZWxheU1zPzogbnVtYmVyO1xuICAvKiogT3ZlcnJpZGUgdGhlIHByb2plY3QgbmFtZSByZXNvbHZlZCB0aHJvdWdoIHByb2plY3RVdGlscy5uYW1lKCkuICovXG4gIHJlYWRvbmx5IHByb2plY3ROYW1lPzogc3RyaW5nO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgdGhlIENhY2hlYWJsZS1jb21wYXRpYmxlIGdldC1vci1zZXQgZXh0ZW5zaW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRPclNldE9wdGlvbnMgZXh0ZW5kcyBHZXRPclNldEZ1bmN0aW9uT3B0aW9ucyB7XG4gIC8qKiBSZXR1cm4gYSBzZXBhcmF0ZWx5IHJldGFpbmVkIHN1Y2Nlc3NmdWwgdmFsdWUgd2hlbiB0aGUgbG9hZGVyIGZhaWxzLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgcmVhZG9ubHkgcmV0dXJuQ2FjaGVkT25FcnJvcj86IGJvb2xlYW47XG4gIC8qKiBUVEwgZm9yIHRoZSBjYWNoZWQtb24tZXJyb3IgdmFsdWUuIERlZmF1bHRzIHRvIDAsIG1lYW5pbmcgbm8gZXhwaXJhdGlvbi4gKi9cbiAgcmVhZG9ubHkgY2FjaGVkT25FcnJvclR0bD86IG51bWJlciB8IHN0cmluZztcbn1cblxuY29uc3Qgc3RhdGVzID0gbmV3IFdlYWtNYXA8Q2FjaGVhYmxlLCBDYWNoZVN0YXRlPigpO1xuY29uc3QgcHJvamVjdENhY2hlcyA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWFibGU+KCk7XG5cbi8qKlxuICogS2V5diBhZGFwdGVyIHRoYXQgY29tcG9zZXMgYXJiaXRyYXJ5IG9yZGVyZWQgbGV2ZWxzIGJlaGluZCBDYWNoZWFibGUncyBvbmVcbiAqIHNlY29uZGFyeS1zdG9yZSBzbG90IGFuZCBvd25zIHRyYWNrZWQgd3JpdGUtYmVoaW5kIHBlcnNpc3RlbmNlLlxuICovXG5jbGFzcyBUaWVyZWRTdG9yZUFkYXB0ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIgaW1wbGVtZW50cyBLZXl2U3RvcmVBZGFwdGVyIHtcbiAgcmVhZG9ubHkgb3B0cyA9IHt9O1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBsZXZlbHM6IHJlYWRvbmx5IENhY2hlTGV2ZWxbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nID0gbmV3IE1hcDxzdHJpbmcsIE11dGF0aW9uPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb21vdGlvbnMgPSBuZXcgU2V0PFByb21pc2U8dm9pZD4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgd3JpdGVEZWxheU1zOiBudW1iZXI7XG4gIHByaXZhdGUgZmx1c2hQcm9taXNlPzogUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSB0aW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIGRpc2Nvbm5lY3RlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGxldmVsczogcmVhZG9ubHkgQ2FjaGVMZXZlbFtdLCB3cml0ZURlbGF5TXM6IG51bWJlcikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sZXZlbHMgPSBsZXZlbHM7XG4gICAgdGhpcy53cml0ZURlbGF5TXMgPSB3cml0ZURlbGF5TXM7XG4gIH1cblxuICBhc3luYyBnZXQ8VmFsdWU+KGtleTogc3RyaW5nKTogUHJvbWlzZTxWYWx1ZSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG11dGF0aW9uID0gdGhpcy5wZW5kaW5nLmdldChrZXkpO1xuICAgIGlmIChtdXRhdGlvbj8ua2luZCA9PT0gXCJkZWxldGVcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAobXV0YXRpb24/LmtpbmQgPT09IFwic2V0XCIpIHJldHVybiBtdXRhdGlvbi52YWx1ZSBhcyBWYWx1ZTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBsZXZlbF0gb2YgdGhpcy5sZXZlbHMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGxldmVsLnN0b3JlLmdldDxWYWx1ZT4oa2V5KTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmIChpbmRleCA+IDApIHRoaXMucHJvbW90ZShrZXksIHZhbHVlLCB0aGlzLmxldmVscy5zbGljZSgwLCBpbmRleCkpO1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgYXN5bmMgZ2V0TWFueTxWYWx1ZT4oa2V5czogc3RyaW5nW10pOiBQcm9taXNlPEFycmF5PFZhbHVlIHwgdW5kZWZpbmVkPj4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChrZXlzLm1hcCgoa2V5KSA9PiB0aGlzLmdldDxWYWx1ZT4oa2V5KSkpO1xuICB9XG5cbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgdHRsPzogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5hc3NlcnRDb25uZWN0ZWQoKTtcbiAgICB0aGlzLnBlbmRpbmcuc2V0KGtleSwgeyBraW5kOiBcInNldFwiLCB2YWx1ZSwgLi4uKHR0bCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHR0bCB9KSB9KTtcbiAgICB0aGlzLnNjaGVkdWxlKCk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIHNldE1hbnkodmFsdWVzOiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bjsgdHRsPzogbnVtYmVyIH0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB2YWx1ZXMpIGF3YWl0IHRoaXMuc2V0KGVudHJ5LmtleSwgZW50cnkudmFsdWUsIGVudHJ5LnR0bCk7XG4gIH1cblxuICBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmFzc2VydENvbm5lY3RlZCgpO1xuICAgIHRoaXMucGVuZGluZy5zZXQoa2V5LCB7IGtpbmQ6IFwiZGVsZXRlXCIgfSk7XG4gICAgdGhpcy5zY2hlZHVsZSgpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVNYW55KGtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoa2V5cy5tYXAoKGtleSkgPT4gdGhpcy5kZWxldGUoa2V5KSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgaGFzKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZy5nZXQoa2V5KTtcbiAgICBpZiAocGVuZGluZykgcmV0dXJuIHBlbmRpbmcua2luZCA9PT0gXCJzZXRcIjtcbiAgICBmb3IgKGNvbnN0IGxldmVsIG9mIHRoaXMubGV2ZWxzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGxldmVsLnN0b3JlLmhhcyA/IGF3YWl0IGxldmVsLnN0b3JlLmhhcyhrZXkpIDogKGF3YWl0IGxldmVsLnN0b3JlLmdldChrZXkpKSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXNzZXJ0Q29ubmVjdGVkKCk7XG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xuICAgIHRoaXMucGVuZGluZy5jbGVhcigpO1xuICAgIGF3YWl0IHNldHRsZUxldmVscyh0aGlzLmxldmVscywgKGxldmVsKSA9PiBsZXZlbC5zdG9yZS5jbGVhcigpLCBcImNsZWFyXCIpO1xuICB9XG5cbiAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgIHRoaXMudGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghdGhpcy5mbHVzaFByb21pc2UpIHtcbiAgICAgIHRoaXMuZmx1c2hQcm9taXNlID0gdGhpcy5mbHVzaFBlbmRpbmcoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy5mbHVzaFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5mbHVzaFByb21pc2U7XG4gICAgYXdhaXQgdGhpcy5mbHVzaFByb21vdGlvbnMoKTtcbiAgICBpZiAodGhpcy5wZW5kaW5nLnNpemUgPiAwKSBhd2FpdCB0aGlzLmZsdXNoKCk7XG4gIH1cblxuICBhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRpc2Nvbm5lY3RlZCkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuZmx1c2goKTtcbiAgICB0aGlzLmRpc2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgYXdhaXQgc2V0dGxlTGV2ZWxzKFxuICAgICAgdGhpcy5sZXZlbHMuZmlsdGVyKChsZXZlbCkgPT4gbGV2ZWwuc3RvcmUuZGlzY29ubmVjdCksXG4gICAgICAobGV2ZWwpID0+IGxldmVsLnN0b3JlLmRpc2Nvbm5lY3QhKCksXG4gICAgICBcImRpc2Nvbm5lY3RcIixcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRDb25uZWN0ZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzY29ubmVjdGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZSBwZXJzaXN0ZW5jZSBpcyBkaXNjb25uZWN0ZWRcIik7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVyIHx8IHRoaXMuZmx1c2hQcm9taXNlKSByZXR1cm47XG4gICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgIHZvaWQgdGhpcy5mbHVzaCgpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBsb2dnZXIud2FybihcImNhY2hlIHBlcnNpc3RlbmNlIGZsdXNoIGZhaWxlZFwiLCB7IGVycm9yOiB0b0Vycm9yKGVycm9yKSB9KTtcbiAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSwgdGhpcy53cml0ZURlbGF5TXMpO1xuICAgIHRoaXMudGltZXIudW5yZWY/LigpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmbHVzaFBlbmRpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2hpbGUgKHRoaXMucGVuZGluZy5zaXplID4gMCkge1xuICAgICAgY29uc3QgYmF0Y2ggPSBuZXcgTWFwKHRoaXMucGVuZGluZyk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBiYXRjaC5rZXlzKCkpIHRoaXMucGVuZGluZy5kZWxldGUoa2V5KTtcbiAgICAgIGNvbnN0IGZhaWx1cmVzOiBBcnJheTx7IGtleTogc3RyaW5nOyBtdXRhdGlvbjogTXV0YXRpb247IGVycm9yOiB1bmtub3duIH0+ID0gW107XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgWy4uLmJhdGNoXS5tYXAoYXN5bmMgKFtrZXksIG11dGF0aW9uXSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBzZXR0bGVMZXZlbHMoXG4gICAgICAgICAgICAgIHRoaXMubGV2ZWxzLFxuICAgICAgICAgICAgICAobGV2ZWwpID0+XG4gICAgICAgICAgICAgICAgbXV0YXRpb24ua2luZCA9PT0gXCJzZXRcIlxuICAgICAgICAgICAgICAgICAgPyBsZXZlbC5zdG9yZS5zZXQoa2V5LCBtdXRhdGlvbi52YWx1ZSwgbXV0YXRpb24udHRsKVxuICAgICAgICAgICAgICAgICAgOiBsZXZlbC5zdG9yZS5kZWxldGUoa2V5KSxcbiAgICAgICAgICAgICAgbXV0YXRpb24ua2luZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goeyBrZXksIG11dGF0aW9uLCBlcnJvciB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGlmIChmYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmFpbHVyZSBvZiBmYWlsdXJlcykge1xuICAgICAgICAgIGlmICghdGhpcy5wZW5kaW5nLmhhcyhmYWlsdXJlLmtleSkpIHRoaXMucGVuZGluZy5zZXQoZmFpbHVyZS5rZXksIGZhaWx1cmUubXV0YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihcbiAgICAgICAgICBmYWlsdXJlcy5tYXAoKGZhaWx1cmUpID0+IGZhaWx1cmUuZXJyb3IpLFxuICAgICAgICAgIGBDYWNoZSBwZXJzaXN0ZW5jZSBmYWlsZWQgZm9yICR7ZmFpbHVyZXMubGVuZ3RofSBtdXRhdGlvbihzKWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9tb3RlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgbGV2ZWxzOiByZWFkb25seSBDYWNoZUxldmVsW10pOiB2b2lkIHtcbiAgICBjb25zdCBwcm9tb3Rpb24gPSBzZXR0bGVMZXZlbHMobGV2ZWxzLCAobGV2ZWwpID0+IGxldmVsLnN0b3JlLnNldChrZXksIHZhbHVlKSwgXCJwcm9tb3RlXCIpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiY2FjaGUgcGVyc2lzdGVuY2UgcHJvbW90aW9uIGZhaWxlZFwiLCB7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGVycm9yOiB0b0Vycm9yKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLnByb21vdGlvbnMuZGVsZXRlKHByb21vdGlvbik7XG4gICAgICB9KTtcbiAgICB0aGlzLnByb21vdGlvbnMuYWRkKHByb21vdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZsdXNoUHJvbW90aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aGlsZSAodGhpcy5wcm9tb3Rpb25zLnNpemUgPiAwKSBhd2FpdCBQcm9taXNlLmFsbChbLi4udGhpcy5wcm9tb3Rpb25zXSk7XG4gIH1cbn1cblxuLyoqIENyZWF0ZSBhIG1lbW9yeS1maXJzdCBjYWNoZSB3aXRoIG9wdGlvbmFsIG9yZGVyZWQgcGVyc2lzdGVudCBsZXZlbHMuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FjaGUob3B0aW9uczogQ2FjaGVPcHRpb25zID0ge30pOiBDYWNoZWFibGUge1xuICBjb25zdCBtYXhFbnRyaWVzID0gcG9zaXRpdmVJbnRlZ2VyKG9wdGlvbnMubWF4RW50cmllcywgREVGQVVMVF9NQVhfRU5UUklFUywgXCJtYXhFbnRyaWVzXCIpO1xuICBjb25zdCB3cml0ZURlbGF5TXMgPSBub25OZWdhdGl2ZUludGVnZXIoXG4gICAgb3B0aW9ucy53cml0ZURlbGF5TXMsXG4gICAgREVGQVVMVF9XUklURV9ERUxBWV9NUyxcbiAgICBcIndyaXRlRGVsYXlNc1wiLFxuICApO1xuICBjb25zdCBwcmltYXJ5ID0gbmV3IEtleXYoe1xuICAgIHN0b3JlOiBuZXcgS2V5dkNhY2hlYWJsZU1lbW9yeSh7XG4gICAgICBscnVTaXplOiBtYXhFbnRyaWVzLFxuICAgICAgdHRsOiBvcHRpb25zLnR0bCxcbiAgICAgIHVzZUNsb25lOiBvcHRpb25zLnVzZUNsb25lID8/IHRydWUsXG4gICAgfSksXG4gICAgLi4uKHR5cGVvZiBvcHRpb25zLnR0bCA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMudHRsKVxuICAgICAgPyB7IHR0bDogb3B0aW9ucy50dGwgfVxuICAgICAgOiB7fSksXG4gIH0pO1xuICBwcmltYXJ5LnNlcmlhbGl6ZSA9IHVuZGVmaW5lZDtcbiAgcHJpbWFyeS5kZXNlcmlhbGl6ZSA9IHVuZGVmaW5lZDtcbiAgY29uc3QgYWRhcHRlciA9IG9wdGlvbnMubGV2ZWxzPy5sZW5ndGhcbiAgICA/IG5ldyBUaWVyZWRTdG9yZUFkYXB0ZXIob3B0aW9ucy5sZXZlbHMsIHdyaXRlRGVsYXlNcylcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2Vjb25kYXJ5ID0gYWRhcHRlciA/IG5ldyBLZXl2KHsgc3RvcmU6IGFkYXB0ZXIgfSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNhY2hlID0gbmV3IENhY2hlYWJsZSh7XG4gICAgcHJpbWFyeSxcbiAgICAuLi4oc2Vjb25kYXJ5ID8geyBzZWNvbmRhcnksIG5vbkJsb2NraW5nOiB0cnVlIH0gOiB7fSksXG4gICAgLi4uKG9wdGlvbnMuY2FjaGVJZCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGNhY2hlSWQ6IG9wdGlvbnMuY2FjaGVJZCB9KSxcbiAgICAuLi4ob3B0aW9ucy5tYXhUdGwgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBtYXhUdGw6IG9wdGlvbnMubWF4VHRsIH0pLFxuICAgIC4uLihvcHRpb25zLm5hbWVzcGFjZSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG5hbWVzcGFjZTogb3B0aW9ucy5uYW1lc3BhY2UgfSksXG4gICAgLi4uKG9wdGlvbnMuc3RhdHMgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBzdGF0czogb3B0aW9ucy5zdGF0cyB9KSxcbiAgICAuLi4ob3B0aW9ucy50YWdzID09PSB1bmRlZmluZWQgPyB7fSA6IHsgdGFnczogb3B0aW9ucy50YWdzIH0pLFxuICAgIC4uLihvcHRpb25zLnR0bCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHR0bDogb3B0aW9ucy50dGwgfSksXG4gIH0pO1xuICBpbnN0YWxsVmFsdWVFbnZlbG9wZShjYWNoZSk7XG4gIGNhY2hlLm9uKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgbG9nZ2VyLndhcm4oXCJjYWNoZWFibGUgb3BlcmF0aW9uIGZhaWxlZFwiLCB7IGVycm9yOiB0b0Vycm9yKGVycm9yKSB9KTtcbiAgfSk7XG4gIHN0YXRlcy5zZXQoY2FjaGUsIHsgYWRhcHRlciwgY2xvc2VkOiBmYWxzZSB9KTtcbiAgcmV0dXJuIGNhY2hlO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgZGVmYXVsdCBwb3J0YWJsZSBkaXNrIHBhdGggZm9yIGEgcHJvamVjdCBjYWNoZSBzY29wZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZVBhdGgoXG4gIHNjb3BlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFBpY2s8UHJvamVjdENhY2hlT3B0aW9ucywgXCJjYWNoZURpclwiIHwgXCJwcm9qZWN0TmFtZVwiPiA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcHJvamVjdE5hbWUgPSBvcHRpb25zLnByb2plY3ROYW1lID8/IHByb2plY3RVdGlscy5uYW1lKCk7XG4gIGNvbnN0IHJvb3QgPSBvcHRpb25zLmNhY2hlRGlyID8/IGVudlBhdGhzKFwiZGJ4LXRvb2xzXCIsIHsgc3VmZml4OiBcIlwiIH0pLmNhY2hlO1xuICByZXR1cm4gam9pbihyb290LCBcImNhY2hlXCIsIHNhZmVTZWdtZW50KHByb2plY3ROYW1lKSwgYCR7c2FmZVNlZ21lbnQoc2NvcGUpfS5qc29uYCk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgcHJvY2Vzcy1zaGFyZWQgcHJvamVjdCBjYWNoZS4gQnkgZGVmYXVsdCBpdCBpcyBtZW1vcnktZmlyc3Qgd2l0aCBhXG4gKiBwb3J0YWJsZSBrZXl2LWZpbGUgc2Vjb25kYXJ5IHNjb3BlZCBieSBwcm9qZWN0IGFuZCBsb2dpY2FsIGNhY2hlIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0Q2FjaGUoc2NvcGU6IHN0cmluZywgb3B0aW9uczogUHJvamVjdENhY2hlT3B0aW9ucyA9IHt9KTogQ2FjaGVhYmxlIHtcbiAgY29uc3QgcGF0aCA9IGNhY2hlUGF0aChzY29wZSwgb3B0aW9ucyk7XG4gIGNvbnN0IHJlZ2lzdHJ5S2V5ID0gSlNPTi5zdHJpbmdpZnkoW3BhdGgsIG9wdGlvbnMuZGlzayAhPT0gZmFsc2VdKTtcbiAgY29uc3QgZXhpc3RpbmcgPSBwcm9qZWN0Q2FjaGVzLmdldChyZWdpc3RyeUtleSk7XG4gIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuXG4gIGNvbnN0IGxldmVscyA9IFsuLi4ob3B0aW9ucy5sZXZlbHMgPz8gW10pXTtcbiAgaWYgKG9wdGlvbnMuZGlzayAhPT0gZmFsc2UpIHtcbiAgICBsZXZlbHMucHVzaCh7XG4gICAgICBuYW1lOiBcImRpc2tcIixcbiAgICAgIHN0b3JlOiBuZXcgS2V5dkZpbGUoe1xuICAgICAgICBmaWxlbmFtZTogcGF0aCxcbiAgICAgICAgd3JpdGVEZWxheTogbm9uTmVnYXRpdmVJbnRlZ2VyKG9wdGlvbnMuZGlza1dyaXRlRGVsYXlNcywgMTAwLCBcImRpc2tXcml0ZURlbGF5TXNcIiksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBjYWNoZSA9IGNyZWF0ZUNhY2hlKHsgLi4ub3B0aW9ucywgbGV2ZWxzIH0pO1xuICBjb25zdCBzdGF0ZSA9IHJlcXVpcmVTdGF0ZShjYWNoZSk7XG4gIHN0YXRlLnBhdGggPSBwYXRoO1xuICBzdGF0ZS5yZWdpc3RyeUtleSA9IHJlZ2lzdHJ5S2V5O1xuICBwcm9qZWN0Q2FjaGVzLnNldChyZWdpc3RyeUtleSwgY2FjaGUpO1xuICByZXR1cm4gY2FjaGU7XG59XG5cbi8qKiBXYWl0IGZvciBhbGwgdHJhY2tlZCB3cml0ZS1iZWhpbmQgcGVyc2lzdGVuY2Ugd2l0aG91dCBjbG9zaW5nIHRoZSBjYWNoZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmbHVzaENhY2hlKGNhY2hlOiBDYWNoZWFibGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVxdWlyZVN0YXRlKGNhY2hlKS5hZGFwdGVyPy5mbHVzaCgpO1xufVxuXG4vKiogRmx1c2ggcGVuZGluZyBwZXJzaXN0ZW5jZSBhbmQgZGlzY29ubmVjdCBhbGwgY2FjaGUgbGV2ZWxzLiBJZGVtcG90ZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQ2FjaGUoY2FjaGU6IENhY2hlYWJsZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzdGF0ZSA9IHJlcXVpcmVTdGF0ZShjYWNoZSk7XG4gIGlmIChzdGF0ZS5jbG9zZWQpIHJldHVybjtcbiAgYXdhaXQgc3RhdGUuYWRhcHRlcj8uZGlzY29ubmVjdCgpO1xuICBzdGF0ZS5jbG9zZWQgPSB0cnVlO1xuICBpZiAoc3RhdGUucmVnaXN0cnlLZXkgJiYgcHJvamVjdENhY2hlcy5nZXQoc3RhdGUucmVnaXN0cnlLZXkpID09PSBjYWNoZSkge1xuICAgIHByb2plY3RDYWNoZXMuZGVsZXRlKHN0YXRlLnJlZ2lzdHJ5S2V5KTtcbiAgfVxufVxuXG4vKiogSXRlcmF0ZSBrZXlzIGN1cnJlbnRseSByZXRhaW5lZCBieSB0aGUgYm91bmRlZCBtZW1vcnkgcHJpbWFyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUtleXMoY2FjaGU6IENhY2hlYWJsZSk6IEl0ZXJhYmxlSXRlcmF0b3I8c3RyaW5nPiB7XG4gIGNvbnN0IHN0b3JlID0gY2FjaGUucHJpbWFyeS5zdG9yZTtcbiAgaWYgKCEoc3RvcmUgaW5zdGFuY2VvZiBLZXl2Q2FjaGVhYmxlTWVtb3J5KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYWNoZSBwcmltYXJ5IGlzIG5vdCBDYWNoZWFibGUgbWVtb3J5XCIpO1xuICB9XG4gIHJldHVybiBzdG9yZS5zdG9yZS5rZXlzO1xufVxuXG4vKiogRGVsZXRlIGEgbm9ybWFsIGNhY2hlIHZhbHVlIGFuZCBpdHMgb3B0aW9uYWwgY2FjaGVkLW9uLWVycm9yIGNvbXBhbmlvbi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVDYWNoZWRWYWx1ZShjYWNoZTogQ2FjaGVhYmxlLCBrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBbdmFsdWUsIGZhbGxiYWNrXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBjYWNoZS5kZWxldGUoa2V5KSxcbiAgICBjYWNoZS5kZWxldGUoY2FjaGVkT25FcnJvcktleShrZXkpKSxcbiAgXSk7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlIHx8IGZhbGxiYWNrKTtcbn1cblxuLyoqXG4gKiBVc2UgQ2FjaGVhYmxlJ3MgbmF0aXZlIGluLWZsaWdodCBnZXQtb3Itc2V0IGJlaGF2aW9yLCBvcHRpb25hbGx5IHJldGFpbmluZyBhXG4gKiBzdWNjZXNzZnVsIHZhbHVlIHVuZGVyIGEgc2VwYXJhdGUga2V5IGZvciByZWNvdmVyeSB3aGVuIGEgbGF0ZXIgbG9hZGVyIGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JTZXQ8VD4oXG4gIGNhY2hlOiBDYWNoZWFibGUsXG4gIGtleTogc3RyaW5nLFxuICBsb2FkOiAoKSA9PiBQcm9taXNlPFQ+LFxuICBvcHRpb25zOiBHZXRPclNldE9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IHJldHVybkNhY2hlZE9uRXJyb3IgPSBmYWxzZSwgY2FjaGVkT25FcnJvclR0bCA9IDAsIC4uLmNhY2hlYWJsZU9wdGlvbnMgfSA9IG9wdGlvbnM7XG4gIGlmICghcmV0dXJuQ2FjaGVkT25FcnJvcikgcmV0dXJuIGNhY2hlLmdldE9yU2V0KGtleSwgbG9hZCwgY2FjaGVhYmxlT3B0aW9ucyk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgY2FjaGUuZ2V0T3JTZXQoXG4gICAgICBrZXksXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgbG9hZCgpO1xuICAgICAgICBhd2FpdCBjYWNoZS5zZXQoY2FjaGVkT25FcnJvcktleShrZXkpLCB2YWx1ZSwgeyB0dGw6IGNhY2hlZE9uRXJyb3JUdGwgfSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICB7IC4uLmNhY2hlYWJsZU9wdGlvbnMsIHRocm93RXJyb3JzOiB0cnVlIH0sXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZS5nZXQ8VD4oY2FjaGVkT25FcnJvcktleShrZXkpKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgaWYgKGNhY2hlYWJsZU9wdGlvbnMudGhyb3dFcnJvcnMpIHRocm93IGVycm9yO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbFZhbHVlRW52ZWxvcGUoY2FjaGU6IENhY2hlYWJsZSk6IHZvaWQge1xuICBjYWNoZS5vbkhvb2soQ2FjaGVhYmxlSG9va3MuQkVGT1JFX1NFVCwgKGl0ZW0pID0+IHtcbiAgICBpdGVtLnZhbHVlID0gZW52ZWxvcGUoaXRlbS52YWx1ZSk7XG4gIH0pO1xuICBjYWNoZS5vbkhvb2soQ2FjaGVhYmxlSG9va3MuQkVGT1JFX1NFVF9NQU5ZLCAoaXRlbXMpID0+IHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIGl0ZW0udmFsdWUgPSBlbnZlbG9wZShpdGVtLnZhbHVlKTtcbiAgfSk7XG4gIGNhY2hlLm9uSG9vayhDYWNoZWFibGVIb29rcy5BRlRFUl9HRVQsIChpdGVtKSA9PiB7XG4gICAgaWYgKGl0ZW0ucmVzdWx0KSBpdGVtLnJlc3VsdC52YWx1ZSA9IHVud3JhcChpdGVtLnJlc3VsdC52YWx1ZSk7XG4gIH0pO1xuICBjYWNoZS5vbkhvb2soQ2FjaGVhYmxlSG9va3MuQUZURVJfR0VUX01BTlksIChpdGVtKSA9PiB7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgaXRlbS5yZXN1bHQpIHtcbiAgICAgIGlmIChyZXN1bHQpIHJlc3VsdC52YWx1ZSA9IHVud3JhcChyZXN1bHQudmFsdWUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVudmVsb3BlKHZhbHVlOiB1bmtub3duKTogVmFsdWVFbnZlbG9wZSB7XG4gIHJldHVybiB7IF9fZGJ4VG9vbHNDYWNoZUVudmVsb3BlOiBFTlZFTE9QRV9WRVJTSU9OLCB2YWx1ZSB9O1xufVxuXG5mdW5jdGlvbiB1bndyYXAodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzRW52ZWxvcGUodmFsdWUpID8gdmFsdWUudmFsdWUgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNFbnZlbG9wZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFZhbHVlRW52ZWxvcGUge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwiX19kYnhUb29sc0NhY2hlRW52ZWxvcGVcIiBpbiB2YWx1ZSAmJlxuICAgICh2YWx1ZSBhcyBWYWx1ZUVudmVsb3BlKS5fX2RieFRvb2xzQ2FjaGVFbnZlbG9wZSA9PT0gRU5WRUxPUEVfVkVSU0lPTiAmJlxuICAgIFwidmFsdWVcIiBpbiB2YWx1ZSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gY2FjaGVkT25FcnJvcktleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtFUlJPUl9WQUxVRV9QUkVGSVh9JHtrZXl9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dGxlTGV2ZWxzKFxuICBsZXZlbHM6IHJlYWRvbmx5IENhY2hlTGV2ZWxbXSxcbiAgb3BlcmF0aW9uOiAobGV2ZWw6IENhY2hlTGV2ZWwpID0+IHVua25vd24gfCBQcm9taXNlPHVua25vd24+LFxuICBvcGVyYXRpb25OYW1lOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChsZXZlbHMubWFwKChsZXZlbCkgPT4gb3BlcmF0aW9uKGxldmVsKSkpO1xuICBjb25zdCBlcnJvcnMgPSByZXN1bHRzLmZsYXRNYXAoKHJlc3VsdCwgaW5kZXgpID0+XG4gICAgcmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiXG4gICAgICA/IFtcbiAgICAgICAgICBuZXcgRXJyb3IoYCR7bGV2ZWxzW2luZGV4XT8ubmFtZSA/PyBgbGV2ZWwtJHtpbmRleCArIDF9YH0gJHtvcGVyYXRpb25OYW1lfSBmYWlsZWRgLCB7XG4gICAgICAgICAgICBjYXVzZTogcmVzdWx0LnJlYXNvbixcbiAgICAgICAgICB9KSxcbiAgICAgICAgXVxuICAgICAgOiBbXSxcbiAgKTtcbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBgQ2FjaGUgJHtvcGVyYXRpb25OYW1lfSBmYWlsZWRgKTtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZVN0YXRlKGNhY2hlOiBDYWNoZWFibGUpOiBDYWNoZVN0YXRlIHtcbiAgY29uc3Qgc3RhdGUgPSBzdGF0ZXMuZ2V0KGNhY2hlKTtcbiAgaWYgKCFzdGF0ZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhY2hlIHdhcyBub3QgY3JlYXRlZCBieSBAZGJ4LXRvb2xzL2NhY2hlXCIpO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbmZ1bmN0aW9uIHNhZmVTZWdtZW50KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlLnRyaW0oKSB8fCBcImRlZmF1bHRcIik7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aXZlSW50ZWdlcih2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCByZXNvbHZlZCA9IHZhbHVlID8/IGZhbGxiYWNrO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocmVzb2x2ZWQpIHx8IHJlc29sdmVkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcmApO1xuICB9XG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuZnVuY3Rpb24gbm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIsIG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHJlc29sdmVkID0gdmFsdWUgPz8gZmFsbGJhY2s7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihyZXNvbHZlZCkgfHwgcmVzb2x2ZWQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCR7bmFtZX0gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYCk7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuIl19
|
|
435
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZCxtQkFBbUIsRUFJbkIsdUJBQXVCLEdBQ3hCLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7QUFDbEMsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxnQ0FBZ0MsQ0FBQztBQUM1RCxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUMzQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBK0VuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBeUIsQ0FBQztBQUNwRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztBQUNuRCxNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUFrQixDQUFDO0FBRXZEOzs7R0FHRztBQUNILE1BQU0sa0JBQW1CLFNBQVEsWUFBWTtJQUNsQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ25CLFNBQVMsQ0FBVTtJQUVGLE1BQU0sQ0FBd0I7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QUFRLENBQUM7SUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxJQUFJLGlDQUFpQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeS1maXJzdCBDYWNoZWFibGUgYW5kIEtleXYgY29tcG9zaXRpb24uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHByb2plY3RVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGxvZywgdG9FcnJvciB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBDYWNoZWFibGUsXG4gIENhY2hlYWJsZUhvb2tzLFxuICBLZXl2Q2FjaGVhYmxlTWVtb3J5LFxuICB0eXBlIENhY2hlYWJsZU9wdGlvbnMsXG4gIHR5cGUgR2V0T3JTZXRGdW5jdGlvbk9wdGlvbnMsXG4gIHR5cGUgS2V5dlN0b3JlQWRhcHRlcixcbiAgc2hvcnRoYW5kVG9NaWxsaXNlY29uZHMsXG59IGZyb20gXCJjYWNoZWFibGVcIjtcbmltcG9ydCBlbnZQYXRocyBmcm9tIFwiZW52LXBhdGhzXCI7XG5pbXBvcnQgeyBLZXl2IH0gZnJvbSBcImtleXZcIjtcbmltcG9ydCB7IEtleXZGaWxlIH0gZnJvbSBcImtleXYtZmlsZVwiO1xuXG5jb25zdCBERUZBVUxUX01BWF9FTlRSSUVTID0gMV8wMDA7XG5jb25zdCBERUZBVUxUX1dSSVRFX0RFTEFZX01TID0gMjU7XG5jb25zdCBFUlJPUl9WQUxVRV9QUkVGSVggPSBcIl9fZGJ4X3Rvb2xzX2NhY2hlZF9vbl9lcnJvcl9fOlwiO1xuY29uc3QgRU5WRUxPUEVfVkVSU0lPTiA9IDE7XG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiY2FjaGVcIik7XG5cbmludGVyZmFjZSBWYWx1ZUVudmVsb3BlIHtcbiAgcmVhZG9ubHkgX19kYnhUb29sc0NhY2hlRW52ZWxvcGU6IHR5cGVvZiBFTlZFTE9QRV9WRVJTSU9OO1xuICByZWFkb25seSB2YWx1ZTogdW5rbm93bjtcbiAgcmVhZG9ubHkgd3JpdHRlbkF0PzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU2V0TXV0YXRpb24ge1xuICByZWFkb25seSBraW5kOiBcInNldFwiO1xuICByZWFkb25seSB0dGw/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgRGVsZXRlTXV0YXRpb24ge1xuICByZWFkb25seSBraW5kOiBcImRlbGV0ZVwiO1xufVxuXG50eXBlIE11dGF0aW9uID0gRGVsZXRlTXV0YXRpb24gfCBTZXRNdXRhdGlvbjtcblxuaW50ZXJmYWNlIENhY2hlU3RhdGUge1xuICByZWFkb25seSBhZGFwdGVyPzogVGllcmVkU3RvcmVBZGFwdGVyO1xuICByZWFkb25seSByZWZyZXNoZXM6IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+O1xuICBwYXRoPzogc3RyaW5nO1xuICByZWdpc3RyeUtleT86IHN0cmluZztcbiAgY2xvc2VkOiBib29sZWFuO1xufVxuXG4vKiogT25lIG9yZGVyZWQgcGVyc2lzdGVudCBjYWNoZSBsZXZlbC4gRWFybGllciBsZXZlbHMgYXJlIHJlYWQgZmlyc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlTGV2ZWwge1xuICAvKiogT3B0aW9uYWwgbmFtZSBpbmNsdWRlZCBpbiBwZXJzaXN0ZW5jZSBlcnJvciBtZXNzYWdlcy4gKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgLyoqIEtleXYtY29tcGF0aWJsZSBzdG9yZSBhZGFwdGVyLiAqL1xuICByZWFkb25seSBzdG9yZTogS2V5dlN0b3JlQWRhcHRlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIGFuIEFwcEtpdC1pbmRlcGVuZGVudCBtZW1vcnktZmlyc3QgY2FjaGUuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlT3B0aW9ucyBleHRlbmRzIFBpY2s8XG4gIENhY2hlYWJsZU9wdGlvbnMsXG4gIFwiY2FjaGVJZFwiIHwgXCJtYXhUdGxcIiB8IFwibmFtZXNwYWNlXCIgfCBcInN0YXRzXCIgfCBcInRhZ3NcIiB8IFwidHRsXCJcbj4ge1xuICAvKiogQWRkaXRpb25hbCBvcmRlcmVkIHBlcnNpc3RlbmNlIGxldmVscy4gTm8gbGV2ZWxzIGNyZWF0ZXMgYSBtZW1vcnktb25seSBjYWNoZS4gKi9cbiAgcmVhZG9ubHkgbGV2ZWxzPzogcmVhZG9ubHkgQ2FjaGVMZXZlbFtdO1xuICAvKiogTWF4aW11bSBlbnRyaWVzIHJldGFpbmVkIGluIHRoZSBtZW1vcnkgcHJpbWFyeS4gRGVmYXVsdHMgdG8gMSwwMDAuICovXG4gIHJlYWRvbmx5IG1heEVudHJpZXM/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIG1lbW9yeSByZWFkcyBjbG9uZSB2YWx1ZXMuIERlZmF1bHRzIHRvIHRydWUuICovXG4gIHJlYWRvbmx5IHVzZUNsb25lPzogYm9vbGVhbjtcbiAgLyoqIERlbGF5IHVzZWQgdG8gY29hbGVzY2UgcGVyc2lzdGVuY2UgbXV0YXRpb25zLiBEZWZhdWx0cyB0byAyNSBtaWxsaXNlY29uZHMuICovXG4gIHJlYWRvbmx5IHdyaXRlRGVsYXlNcz86IG51bWJlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHRoZSBkZWZhdWx0IHByb2plY3Qtc2NvcGVkIG1lbW9yeSBhbmQgZGlzayBjYWNoZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdENhY2hlT3B0aW9ucyBleHRlbmRzIENhY2hlT3B0aW9ucyB7XG4gIC8qKiBPdmVycmlkZSB0aGUgY2FjaGUgZGlyZWN0b3J5LCBwcmltYXJpbHkgZm9yIHRlc3RzLiAqL1xuICByZWFkb25seSBjYWNoZURpcj86IHN0cmluZztcbiAgLyoqIERpc2FibGUgdGhlIGRlZmF1bHQgZGlzayBsZXZlbC4gRGVmYXVsdHMgdG8gdHJ1ZS4gKi9cbiAgcmVhZG9ubHkgZGlzaz86IGJvb2xlYW47XG4gIC8qKiBEZWxheSB1c2VkIGJ5IGtleXYtZmlsZSB0byBjb2FsZXNjZSBmaWxlIHJld3JpdGVzLiBEZWZhdWx0cyB0byAxMDAgbWlsbGlzZWNvbmRzLiAqL1xuICByZWFkb25seSBkaXNrV3JpdGVEZWxheU1zPzogbnVtYmVyO1xuICAvKiogT3ZlcnJpZGUgdGhlIHByb2plY3QgbmFtZSByZXNvbHZlZCB0aHJvdWdoIHByb2plY3RVdGlscy5uYW1lKCkuICovXG4gIHJlYWRvbmx5IHByb2plY3ROYW1lPzogc3RyaW5nO1xufVxuXG4vKiogQWdlIGFmdGVyIHdoaWNoIGEgY2FjaGUgaGl0IHJldHVybnMgaXRzIHZhbHVlIGFuZCBzdGFydHMgYW4gYXN5bmNocm9ub3VzIHJlZnJlc2guICovXG5leHBvcnQgdHlwZSBSZWZyZXNoQWZ0ZXJXcml0ZTxUPiA9IG51bWJlciB8IHN0cmluZyB8ICgodmFsdWU6IFQpID0+IG51bWJlciB8IHN0cmluZyk7XG5cbi8qKiBPcHRpb25zIGZvciB0aGUgQ2FjaGVhYmxlLWNvbXBhdGlibGUgZ2V0LW9yLXNldCBleHRlbnNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEdldE9yU2V0T3B0aW9uczxUID0gdW5rbm93bj4gZXh0ZW5kcyBHZXRPclNldEZ1bmN0aW9uT3B0aW9ucyB7XG4gIC8qKiBSZXR1cm4gYSBzZXBhcmF0ZWx5IHJldGFpbmVkIHN1Y2Nlc3NmdWwgdmFsdWUgd2hlbiB0aGUgbG9hZGVyIGZhaWxzLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgcmVhZG9ubHkgcmV0dXJuQ2FjaGVkT25FcnJvcj86IGJvb2xlYW47XG4gIC8qKiBUVEwgZm9yIHRoZSBjYWNoZWQtb24tZXJyb3IgdmFsdWUuIERlZmF1bHRzIHRvIDAsIG1lYW5pbmcgbm8gZXhwaXJhdGlvbi4gKi9cbiAgcmVhZG9ubHkgY2FjaGVkT25FcnJvclR0bD86IG51bWJlciB8IHN0cmluZztcbiAgLyoqXG4gICAqIFJldHVybiBhbiBvbGRlciBjYWNoZWQgdmFsdWUgaW1tZWRpYXRlbHkgYW5kIHJlZnJlc2ggaXQgb25jZSBpbiB0aGUgYmFja2dyb3VuZCBhZnRlciB0aGlzXG4gICAqIGR1cmF0aW9uIHNpbmNlIGl0cyBsYXN0IHN1Y2Nlc3NmdWwgd3JpdGUuIFRoZSBoYXJkIGB0dGxgIHN0aWxsIGNvbnRyb2xzIGZpbmFsIGV4cGlyYXRpb24uXG4gICAqL1xuICByZWFkb25seSByZWZyZXNoQWZ0ZXJXcml0ZT86IFJlZnJlc2hBZnRlcldyaXRlPFQ+O1xufVxuXG5jb25zdCBzdGF0ZXMgPSBuZXcgV2Vha01hcDxDYWNoZWFibGUsIENhY2hlU3RhdGU+KCk7XG5jb25zdCBwcm9qZWN0Q2FjaGVzID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlYWJsZT4oKTtcbmNvbnN0IHJlc3VsdFdyaXRlVGltZXMgPSBuZXcgV2Vha01hcDxvYmplY3QsIG51bWJlcj4oKTtcblxuLyoqXG4gKiBLZXl2IGFkYXB0ZXIgdGhhdCBjb21wb3NlcyBhcmJpdHJhcnkgb3JkZXJlZCBsZXZlbHMgYmVoaW5kIENhY2hlYWJsZSdzIG9uZVxuICogc2Vjb25kYXJ5LXN0b3JlIHNsb3QgYW5kIG93bnMgdHJhY2tlZCB3cml0ZS1iZWhpbmQgcGVyc2lzdGVuY2UuXG4gKi9cbmNsYXNzIFRpZXJlZFN0b3JlQWRhcHRlciBleHRlbmRzIEV2ZW50RW1pdHRlciBpbXBsZW1lbnRzIEtleXZTdG9yZUFkYXB0ZXIge1xuICByZWFkb25seSBvcHRzID0ge307XG4gIG5hbWVzcGFjZT86IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGxldmVsczogcmVhZG9ubHkgQ2FjaGVMZXZlbFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmcgPSBuZXcgTWFwPHN0cmluZywgTXV0YXRpb24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvbW90aW9ucyA9IG5ldyBTZXQ8UHJvbWlzZTx2b2lkPj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3cml0ZURlbGF5TXM6IG51bWJlcjtcbiAgcHJpdmF0ZSBmbHVzaFByb21pc2U/OiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIHRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgZGlzY29ubmVjdGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IobGV2ZWxzOiByZWFkb25seSBDYWNoZUxldmVsW10sIHdyaXRlRGVsYXlNczogbnVtYmVyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxldmVscyA9IGxldmVscztcbiAgICB0aGlzLndyaXRlRGVsYXlNcyA9IHdyaXRlRGVsYXlNcztcbiAgfVxuXG4gIGFzeW5jIGdldDxWYWx1ZT4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFZhbHVlIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgbXV0YXRpb24gPSB0aGlzLnBlbmRpbmcuZ2V0KGtleSk7XG4gICAgaWYgKG11dGF0aW9uPy5raW5kID09PSBcImRlbGV0ZVwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChtdXRhdGlvbj8ua2luZCA9PT0gXCJzZXRcIikgcmV0dXJuIG11dGF0aW9uLnZhbHVlIGFzIFZhbHVlO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGxldmVsXSBvZiB0aGlzLmxldmVscy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgbGV2ZWwuc3RvcmUuZ2V0PFZhbHVlPihrZXkpO1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGluZGV4ID4gMCkgdGhpcy5wcm9tb3RlKGtleSwgdmFsdWUsIHRoaXMubGV2ZWxzLnNsaWNlKDAsIGluZGV4KSk7XG4gICAgICByZXR1cm4gdmFsdWUgYXMgVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBhc3luYyBnZXRNYW55PFZhbHVlPihrZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8QXJyYXk8VmFsdWUgfCB1bmRlZmluZWQ+PiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGtleXMubWFwKChrZXkpID0+IHRoaXMuZ2V0PFZhbHVlPihrZXkpKSk7XG4gIH1cblxuICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCB0dGw/OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmFzc2VydENvbm5lY3RlZCgpO1xuICAgIHRoaXMucGVuZGluZy5zZXQoa2V5LCB7IGtpbmQ6IFwic2V0XCIsIHZhbHVlLCAuLi4odHRsID09PSB1bmRlZmluZWQgPyB7fSA6IHsgdHRsIH0pIH0pO1xuICAgIHRoaXMuc2NoZWR1bGUoKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICB9XG5cbiAgYXN5bmMgc2V0TWFueSh2YWx1ZXM6IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duOyB0dGw/OiBudW1iZXIgfT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHZhbHVlcykgYXdhaXQgdGhpcy5zZXQoZW50cnkua2V5LCBlbnRyeS52YWx1ZSwgZW50cnkudHRsKTtcbiAgfVxuXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuYXNzZXJ0Q29ubmVjdGVkKCk7XG4gICAgdGhpcy5wZW5kaW5nLnNldChrZXksIHsga2luZDogXCJkZWxldGVcIiB9KTtcbiAgICB0aGlzLnNjaGVkdWxlKCk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZU1hbnkoa2V5czogc3RyaW5nW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChrZXlzLm1hcCgoa2V5KSA9PiB0aGlzLmRlbGV0ZShrZXkpKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBoYXMoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nLmdldChrZXkpO1xuICAgIGlmIChwZW5kaW5nKSByZXR1cm4gcGVuZGluZy5raW5kID09PSBcInNldFwiO1xuICAgIGZvciAoY29uc3QgbGV2ZWwgb2YgdGhpcy5sZXZlbHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGV2ZWwuc3RvcmUuaGFzID8gYXdhaXQgbGV2ZWwuc3RvcmUuaGFzKGtleSkgOiAoYXdhaXQgbGV2ZWwuc3RvcmUuZ2V0KGtleSkpICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hc3NlcnRDb25uZWN0ZWQoKTtcbiAgICBhd2FpdCB0aGlzLmZsdXNoKCk7XG4gICAgdGhpcy5wZW5kaW5nLmNsZWFyKCk7XG4gICAgYXdhaXQgc2V0dGxlTGV2ZWxzKHRoaXMubGV2ZWxzLCAobGV2ZWwpID0+IGxldmVsLnN0b3JlLmNsZWFyKCksIFwiY2xlYXJcIik7XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmZsdXNoUHJvbWlzZSkge1xuICAgICAgdGhpcy5mbHVzaFByb21pc2UgPSB0aGlzLmZsdXNoUGVuZGluZygpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLmZsdXNoUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZsdXNoUHJvbWlzZTtcbiAgICBhd2FpdCB0aGlzLmZsdXNoUHJvbW90aW9ucygpO1xuICAgIGlmICh0aGlzLnBlbmRpbmcuc2l6ZSA+IDApIGF3YWl0IHRoaXMuZmx1c2goKTtcbiAgfVxuXG4gIGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGlzY29ubmVjdGVkKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5mbHVzaCgpO1xuICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcbiAgICBhd2FpdCBzZXR0bGVMZXZlbHMoXG4gICAgICB0aGlzLmxldmVscy5maWx0ZXIoKGxldmVsKSA9PiBsZXZlbC5zdG9yZS5kaXNjb25uZWN0KSxcbiAgICAgIChsZXZlbCkgPT4gbGV2ZWwuc3RvcmUuZGlzY29ubmVjdCEoKSxcbiAgICAgIFwiZGlzY29ubmVjdFwiLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzc2VydENvbm5lY3RlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNjb25uZWN0ZWQpIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIHBlcnNpc3RlbmNlIGlzIGRpc2Nvbm5lY3RlZFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGltZXIgfHwgdGhpcy5mbHVzaFByb21pc2UpIHJldHVybjtcbiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgdm9pZCB0aGlzLmZsdXNoKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiY2FjaGUgcGVyc2lzdGVuY2UgZmx1c2ggZmFpbGVkXCIsIHsgZXJyb3I6IHRvRXJyb3IoZXJyb3IpIH0pO1xuICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9LCB0aGlzLndyaXRlRGVsYXlNcyk7XG4gICAgdGhpcy50aW1lci51bnJlZj8uKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZsdXNoUGVuZGluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aGlsZSAodGhpcy5wZW5kaW5nLnNpemUgPiAwKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IG5ldyBNYXAodGhpcy5wZW5kaW5nKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGJhdGNoLmtleXMoKSkgdGhpcy5wZW5kaW5nLmRlbGV0ZShrZXkpO1xuICAgICAgY29uc3QgZmFpbHVyZXM6IEFycmF5PHsga2V5OiBzdHJpbmc7IG11dGF0aW9uOiBNdXRhdGlvbjsgZXJyb3I6IHVua25vd24gfT4gPSBbXTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBbLi4uYmF0Y2hdLm1hcChhc3luYyAoW2tleSwgbXV0YXRpb25dKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHNldHRsZUxldmVscyhcbiAgICAgICAgICAgICAgdGhpcy5sZXZlbHMsXG4gICAgICAgICAgICAgIChsZXZlbCkgPT5cbiAgICAgICAgICAgICAgICBtdXRhdGlvbi5raW5kID09PSBcInNldFwiXG4gICAgICAgICAgICAgICAgICA/IGxldmVsLnN0b3JlLnNldChrZXksIG11dGF0aW9uLnZhbHVlLCBtdXRhdGlvbi50dGwpXG4gICAgICAgICAgICAgICAgICA6IGxldmVsLnN0b3JlLmRlbGV0ZShrZXkpLFxuICAgICAgICAgICAgICBtdXRhdGlvbi5raW5kLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgZmFpbHVyZXMucHVzaCh7IGtleSwgbXV0YXRpb24sIGVycm9yIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgaWYgKGZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCBmYWlsdXJlIG9mIGZhaWx1cmVzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmcuaGFzKGZhaWx1cmUua2V5KSkgdGhpcy5wZW5kaW5nLnNldChmYWlsdXJlLmtleSwgZmFpbHVyZS5tdXRhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICAgIGZhaWx1cmVzLm1hcCgoZmFpbHVyZSkgPT4gZmFpbHVyZS5lcnJvciksXG4gICAgICAgICAgYENhY2hlIHBlcnNpc3RlbmNlIGZhaWxlZCBmb3IgJHtmYWlsdXJlcy5sZW5ndGh9IG11dGF0aW9uKHMpYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb21vdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBsZXZlbHM6IHJlYWRvbmx5IENhY2hlTGV2ZWxbXSk6IHZvaWQge1xuICAgIGNvbnN0IHByb21vdGlvbiA9IHNldHRsZUxldmVscyhsZXZlbHMsIChsZXZlbCkgPT4gbGV2ZWwuc3RvcmUuc2V0KGtleSwgdmFsdWUpLCBcInByb21vdGVcIilcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJjYWNoZSBwZXJzaXN0ZW5jZSBwcm9tb3Rpb24gZmFpbGVkXCIsIHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIHRoaXMucHJvbW90aW9ucy5kZWxldGUocHJvbW90aW9uKTtcbiAgICAgIH0pO1xuICAgIHRoaXMucHJvbW90aW9ucy5hZGQocHJvbW90aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmx1c2hQcm9tb3Rpb25zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdoaWxlICh0aGlzLnByb21vdGlvbnMuc2l6ZSA+IDApIGF3YWl0IFByb21pc2UuYWxsKFsuLi50aGlzLnByb21vdGlvbnNdKTtcbiAgfVxufVxuXG4vKiogQ3JlYXRlIGEgbWVtb3J5LWZpcnN0IGNhY2hlIHdpdGggb3B0aW9uYWwgb3JkZXJlZCBwZXJzaXN0ZW50IGxldmVscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYWNoZShvcHRpb25zOiBDYWNoZU9wdGlvbnMgPSB7fSk6IENhY2hlYWJsZSB7XG4gIGNvbnN0IG1heEVudHJpZXMgPSBwb3NpdGl2ZUludGVnZXIob3B0aW9ucy5tYXhFbnRyaWVzLCBERUZBVUxUX01BWF9FTlRSSUVTLCBcIm1heEVudHJpZXNcIik7XG4gIGNvbnN0IHdyaXRlRGVsYXlNcyA9IG5vbk5lZ2F0aXZlSW50ZWdlcihcbiAgICBvcHRpb25zLndyaXRlRGVsYXlNcyxcbiAgICBERUZBVUxUX1dSSVRFX0RFTEFZX01TLFxuICAgIFwid3JpdGVEZWxheU1zXCIsXG4gICk7XG4gIGNvbnN0IHByaW1hcnkgPSBuZXcgS2V5dih7XG4gICAgc3RvcmU6IG5ldyBLZXl2Q2FjaGVhYmxlTWVtb3J5KHtcbiAgICAgIGxydVNpemU6IG1heEVudHJpZXMsXG4gICAgICB0dGw6IG9wdGlvbnMudHRsLFxuICAgICAgdXNlQ2xvbmU6IG9wdGlvbnMudXNlQ2xvbmUgPz8gdHJ1ZSxcbiAgICB9KSxcbiAgICAuLi4odHlwZW9mIG9wdGlvbnMudHRsID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0ludGVnZXIob3B0aW9ucy50dGwpXG4gICAgICA/IHsgdHRsOiBvcHRpb25zLnR0bCB9XG4gICAgICA6IHt9KSxcbiAgfSk7XG4gIHByaW1hcnkuc2VyaWFsaXplID0gdW5kZWZpbmVkO1xuICBwcmltYXJ5LmRlc2VyaWFsaXplID0gdW5kZWZpbmVkO1xuICBjb25zdCBhZGFwdGVyID0gb3B0aW9ucy5sZXZlbHM/Lmxlbmd0aFxuICAgID8gbmV3IFRpZXJlZFN0b3JlQWRhcHRlcihvcHRpb25zLmxldmVscywgd3JpdGVEZWxheU1zKVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzZWNvbmRhcnkgPSBhZGFwdGVyID8gbmV3IEtleXYoeyBzdG9yZTogYWRhcHRlciB9KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY2FjaGUgPSBuZXcgQ2FjaGVhYmxlKHtcbiAgICBwcmltYXJ5LFxuICAgIC4uLihzZWNvbmRhcnkgPyB7IHNlY29uZGFyeSwgbm9uQmxvY2tpbmc6IHRydWUgfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy5jYWNoZUlkID09PSB1bmRlZmluZWQgPyB7fSA6IHsgY2FjaGVJZDogb3B0aW9ucy5jYWNoZUlkIH0pLFxuICAgIC4uLihvcHRpb25zLm1heFR0bCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG1heFR0bDogb3B0aW9ucy5tYXhUdGwgfSksXG4gICAgLi4uKG9wdGlvbnMubmFtZXNwYWNlID09PSB1bmRlZmluZWQgPyB7fSA6IHsgbmFtZXNwYWNlOiBvcHRpb25zLm5hbWVzcGFjZSB9KSxcbiAgICAuLi4ob3B0aW9ucy5zdGF0cyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHN0YXRzOiBvcHRpb25zLnN0YXRzIH0pLFxuICAgIC4uLihvcHRpb25zLnRhZ3MgPT09IHVuZGVmaW5lZCA/IHt9IDogeyB0YWdzOiBvcHRpb25zLnRhZ3MgfSksXG4gICAgLi4uKG9wdGlvbnMudHRsID09PSB1bmRlZmluZWQgPyB7fSA6IHsgdHRsOiBvcHRpb25zLnR0bCB9KSxcbiAgfSk7XG4gIGluc3RhbGxWYWx1ZUVudmVsb3BlKGNhY2hlKTtcbiAgY2FjaGUub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICBsb2dnZXIud2FybihcImNhY2hlYWJsZSBvcGVyYXRpb24gZmFpbGVkXCIsIHsgZXJyb3I6IHRvRXJyb3IoZXJyb3IpIH0pO1xuICB9KTtcbiAgc3RhdGVzLnNldChjYWNoZSwgeyBhZGFwdGVyLCByZWZyZXNoZXM6IG5ldyBNYXAoKSwgY2xvc2VkOiBmYWxzZSB9KTtcbiAgcmV0dXJuIGNhY2hlO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgZGVmYXVsdCBwb3J0YWJsZSBkaXNrIHBhdGggZm9yIGEgcHJvamVjdCBjYWNoZSBzY29wZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZVBhdGgoXG4gIHNjb3BlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFBpY2s8UHJvamVjdENhY2hlT3B0aW9ucywgXCJjYWNoZURpclwiIHwgXCJwcm9qZWN0TmFtZVwiPiA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcHJvamVjdE5hbWUgPSBvcHRpb25zLnByb2plY3ROYW1lID8/IHByb2plY3RVdGlscy5uYW1lKCk7XG4gIGNvbnN0IHJvb3QgPSBvcHRpb25zLmNhY2hlRGlyID8/IGVudlBhdGhzKFwiZGJ4LXRvb2xzXCIsIHsgc3VmZml4OiBcIlwiIH0pLmNhY2hlO1xuICByZXR1cm4gam9pbihyb290LCBcImNhY2hlXCIsIHNhZmVTZWdtZW50KHByb2plY3ROYW1lKSwgYCR7c2FmZVNlZ21lbnQoc2NvcGUpfS5qc29uYCk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgcHJvY2Vzcy1zaGFyZWQgcHJvamVjdCBjYWNoZS4gQnkgZGVmYXVsdCBpdCBpcyBtZW1vcnktZmlyc3Qgd2l0aCBhXG4gKiBwb3J0YWJsZSBrZXl2LWZpbGUgc2Vjb25kYXJ5IHNjb3BlZCBieSBwcm9qZWN0IGFuZCBsb2dpY2FsIGNhY2hlIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0Q2FjaGUoc2NvcGU6IHN0cmluZywgb3B0aW9uczogUHJvamVjdENhY2hlT3B0aW9ucyA9IHt9KTogQ2FjaGVhYmxlIHtcbiAgY29uc3QgcGF0aCA9IGNhY2hlUGF0aChzY29wZSwgb3B0aW9ucyk7XG4gIGNvbnN0IHJlZ2lzdHJ5S2V5ID0gSlNPTi5zdHJpbmdpZnkoW3BhdGgsIG9wdGlvbnMuZGlzayAhPT0gZmFsc2VdKTtcbiAgY29uc3QgZXhpc3RpbmcgPSBwcm9qZWN0Q2FjaGVzLmdldChyZWdpc3RyeUtleSk7XG4gIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuXG4gIGNvbnN0IGxldmVscyA9IFsuLi4ob3B0aW9ucy5sZXZlbHMgPz8gW10pXTtcbiAgaWYgKG9wdGlvbnMuZGlzayAhPT0gZmFsc2UpIHtcbiAgICBsZXZlbHMucHVzaCh7XG4gICAgICBuYW1lOiBcImRpc2tcIixcbiAgICAgIHN0b3JlOiBuZXcgS2V5dkZpbGUoe1xuICAgICAgICBmaWxlbmFtZTogcGF0aCxcbiAgICAgICAgd3JpdGVEZWxheTogbm9uTmVnYXRpdmVJbnRlZ2VyKG9wdGlvbnMuZGlza1dyaXRlRGVsYXlNcywgMTAwLCBcImRpc2tXcml0ZURlbGF5TXNcIiksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBjYWNoZSA9IGNyZWF0ZUNhY2hlKHsgLi4ub3B0aW9ucywgbGV2ZWxzIH0pO1xuICBjb25zdCBzdGF0ZSA9IHJlcXVpcmVTdGF0ZShjYWNoZSk7XG4gIHN0YXRlLnBhdGggPSBwYXRoO1xuICBzdGF0ZS5yZWdpc3RyeUtleSA9IHJlZ2lzdHJ5S2V5O1xuICBwcm9qZWN0Q2FjaGVzLnNldChyZWdpc3RyeUtleSwgY2FjaGUpO1xuICByZXR1cm4gY2FjaGU7XG59XG5cbi8qKiBXYWl0IGZvciBhbGwgdHJhY2tlZCB3cml0ZS1iZWhpbmQgcGVyc2lzdGVuY2Ugd2l0aG91dCBjbG9zaW5nIHRoZSBjYWNoZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmbHVzaENhY2hlKGNhY2hlOiBDYWNoZWFibGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVxdWlyZVN0YXRlKGNhY2hlKS5hZGFwdGVyPy5mbHVzaCgpO1xufVxuXG4vKiogRmx1c2ggcGVuZGluZyBwZXJzaXN0ZW5jZSBhbmQgZGlzY29ubmVjdCBhbGwgY2FjaGUgbGV2ZWxzLiBJZGVtcG90ZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQ2FjaGUoY2FjaGU6IENhY2hlYWJsZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzdGF0ZSA9IHJlcXVpcmVTdGF0ZShjYWNoZSk7XG4gIGlmIChzdGF0ZS5jbG9zZWQpIHJldHVybjtcbiAgd2hpbGUgKHN0YXRlLnJlZnJlc2hlcy5zaXplID4gMCkgYXdhaXQgUHJvbWlzZS5hbGwoWy4uLnN0YXRlLnJlZnJlc2hlcy52YWx1ZXMoKV0pO1xuICBhd2FpdCBzdGF0ZS5hZGFwdGVyPy5kaXNjb25uZWN0KCk7XG4gIHN0YXRlLmNsb3NlZCA9IHRydWU7XG4gIGlmIChzdGF0ZS5yZWdpc3RyeUtleSAmJiBwcm9qZWN0Q2FjaGVzLmdldChzdGF0ZS5yZWdpc3RyeUtleSkgPT09IGNhY2hlKSB7XG4gICAgcHJvamVjdENhY2hlcy5kZWxldGUoc3RhdGUucmVnaXN0cnlLZXkpO1xuICB9XG59XG5cbi8qKiBJdGVyYXRlIGtleXMgY3VycmVudGx5IHJldGFpbmVkIGJ5IHRoZSBib3VuZGVkIG1lbW9yeSBwcmltYXJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlS2V5cyhjYWNoZTogQ2FjaGVhYmxlKTogSXRlcmFibGVJdGVyYXRvcjxzdHJpbmc+IHtcbiAgY29uc3Qgc3RvcmUgPSBjYWNoZS5wcmltYXJ5LnN0b3JlO1xuICBpZiAoIShzdG9yZSBpbnN0YW5jZW9mIEtleXZDYWNoZWFibGVNZW1vcnkpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhY2hlIHByaW1hcnkgaXMgbm90IENhY2hlYWJsZSBtZW1vcnlcIik7XG4gIH1cbiAgcmV0dXJuIHN0b3JlLnN0b3JlLmtleXM7XG59XG5cbi8qKiBEZWxldGUgYSBub3JtYWwgY2FjaGUgdmFsdWUgYW5kIGl0cyBvcHRpb25hbCBjYWNoZWQtb24tZXJyb3IgY29tcGFuaW9uLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUNhY2hlZFZhbHVlKGNhY2hlOiBDYWNoZWFibGUsIGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IFt2YWx1ZSwgZmFsbGJhY2tdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGNhY2hlLmRlbGV0ZShrZXkpLFxuICAgIGNhY2hlLmRlbGV0ZShjYWNoZWRPbkVycm9yS2V5KGtleSkpLFxuICBdKTtcbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUgfHwgZmFsbGJhY2spO1xufVxuXG4vKipcbiAqIFVzZSBDYWNoZWFibGUncyBuYXRpdmUgaW4tZmxpZ2h0IGdldC1vci1zZXQgYmVoYXZpb3IsIG9wdGlvbmFsbHkgcmV0YWluaW5nIGFcbiAqIHN1Y2Nlc3NmdWwgdmFsdWUgdW5kZXIgYSBzZXBhcmF0ZSBrZXkgZm9yIHJlY292ZXJ5IHdoZW4gYSBsYXRlciBsb2FkZXIgZmFpbHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPclNldDxUPihcbiAgY2FjaGU6IENhY2hlYWJsZSxcbiAga2V5OiBzdHJpbmcsXG4gIGxvYWQ6ICgpID0+IFByb21pc2U8VD4sXG4gIG9wdGlvbnM6IEdldE9yU2V0T3B0aW9uczxUPiA9IHt9LFxuKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHtcbiAgICByZXR1cm5DYWNoZWRPbkVycm9yID0gZmFsc2UsXG4gICAgY2FjaGVkT25FcnJvclR0bCA9IDAsXG4gICAgcmVmcmVzaEFmdGVyV3JpdGUsXG4gICAgLi4uY2FjaGVhYmxlT3B0aW9uc1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgbG9hZEZyZXNoID0gYXN5bmMgKCk6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgbG9hZCgpO1xuICAgIGlmIChyZXR1cm5DYWNoZWRPbkVycm9yKSB7XG4gICAgICBhd2FpdCBjYWNoZS5zZXQoY2FjaGVkT25FcnJvcktleShrZXkpLCB2YWx1ZSwgeyB0dGw6IGNhY2hlZE9uRXJyb3JUdGwgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICBpZiAocmVmcmVzaEFmdGVyV3JpdGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGdldE9wdGlvbnMgPVxuICAgICAgY2FjaGVhYmxlT3B0aW9ucy5ub25CbG9ja2luZyA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogeyBub25CbG9ja2luZzogY2FjaGVhYmxlT3B0aW9ucy5ub25CbG9ja2luZyB9O1xuICAgIGxldCBjYWNoZWQgPSBhd2FpdCBjYWNoZS5nZXRSYXc8VD4oa2V5LCBnZXRPcHRpb25zKTtcbiAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgY29uc3QgcmVmcmVzaCA9IHJlcXVpcmVTdGF0ZShjYWNoZSkucmVmcmVzaGVzLmdldChrZXkpO1xuICAgICAgaWYgKHJlZnJlc2gpIHtcbiAgICAgICAgYXdhaXQgcmVmcmVzaDtcbiAgICAgICAgY2FjaGVkID0gYXdhaXQgY2FjaGUuZ2V0UmF3PFQ+KGtleSwgZ2V0T3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY2FjaGVkLnZhbHVlIGFzIFQ7XG4gICAgICBjb25zdCB3cml0dGVuQXQgPSByZXN1bHRXcml0ZVRpbWVzLmdldChjYWNoZWQgYXMgb2JqZWN0KTtcbiAgICAgIGNvbnN0IHJlZnJlc2hNcyA9IHJlc29sdmVSZWZyZXNoQWZ0ZXJXcml0ZShyZWZyZXNoQWZ0ZXJXcml0ZSwgdmFsdWUpO1xuICAgICAgaWYgKHdyaXR0ZW5BdCA9PT0gdW5kZWZpbmVkIHx8IERhdGUubm93KCkgLSB3cml0dGVuQXQgPj0gcmVmcmVzaE1zKSB7XG4gICAgICAgIHN0YXJ0UmVmcmVzaChjYWNoZSwga2V5LCBsb2FkRnJlc2gsIGNhY2hlYWJsZU9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghcmV0dXJuQ2FjaGVkT25FcnJvcikgcmV0dXJuIGNhY2hlLmdldE9yU2V0KGtleSwgbG9hZEZyZXNoLCBjYWNoZWFibGVPcHRpb25zKTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBjYWNoZS5nZXRPclNldChrZXksIGxvYWRGcmVzaCwgeyAuLi5jYWNoZWFibGVPcHRpb25zLCB0aHJvd0Vycm9yczogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZS5nZXQ8VD4oY2FjaGVkT25FcnJvcktleShrZXkpKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgaWYgKGNhY2hlYWJsZU9wdGlvbnMudGhyb3dFcnJvcnMpIHRocm93IGVycm9yO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbFZhbHVlRW52ZWxvcGUoY2FjaGU6IENhY2hlYWJsZSk6IHZvaWQge1xuICBjYWNoZS5vbkhvb2soQ2FjaGVhYmxlSG9va3MuQkVGT1JFX1NFVCwgKGl0ZW0pID0+IHtcbiAgICBpdGVtLnZhbHVlID0gZW52ZWxvcGUoaXRlbS52YWx1ZSk7XG4gIH0pO1xuICBjYWNoZS5vbkhvb2soQ2FjaGVhYmxlSG9va3MuQkVGT1JFX1NFVF9NQU5ZLCAoaXRlbXMpID0+IHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIGl0ZW0udmFsdWUgPSBlbnZlbG9wZShpdGVtLnZhbHVlKTtcbiAgfSk7XG4gIGNhY2hlLm9uSG9vayhDYWNoZWFibGVIb29rcy5BRlRFUl9HRVQsIChpdGVtKSA9PiB7XG4gICAgaWYgKGl0ZW0ucmVzdWx0KSB1bndyYXBSZXN1bHQoaXRlbS5yZXN1bHQpO1xuICB9KTtcbiAgY2FjaGUub25Ib29rKENhY2hlYWJsZUhvb2tzLkFGVEVSX0dFVF9NQU5ZLCAoaXRlbSkgPT4ge1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIGl0ZW0ucmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0KSB1bndyYXBSZXN1bHQocmVzdWx0KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlbnZlbG9wZSh2YWx1ZTogdW5rbm93bik6IFZhbHVlRW52ZWxvcGUge1xuICByZXR1cm4geyBfX2RieFRvb2xzQ2FjaGVFbnZlbG9wZTogRU5WRUxPUEVfVkVSU0lPTiwgdmFsdWUsIHdyaXR0ZW5BdDogRGF0ZS5ub3coKSB9O1xufVxuXG5mdW5jdGlvbiB1bndyYXBSZXN1bHQocmVzdWx0OiB7IHZhbHVlPzogdW5rbm93biB9KTogdm9pZCB7XG4gIGlmICghaXNFbnZlbG9wZShyZXN1bHQudmFsdWUpKSByZXR1cm47XG4gIGNvbnN0IHsgd3JpdHRlbkF0IH0gPSByZXN1bHQudmFsdWU7XG4gIGlmICh0eXBlb2Ygd3JpdHRlbkF0ID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh3cml0dGVuQXQpKSB7XG4gICAgcmVzdWx0V3JpdGVUaW1lcy5zZXQocmVzdWx0LCB3cml0dGVuQXQpO1xuICB9XG4gIHJlc3VsdC52YWx1ZSA9IHJlc3VsdC52YWx1ZS52YWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNFbnZlbG9wZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFZhbHVlRW52ZWxvcGUge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwiX19kYnhUb29sc0NhY2hlRW52ZWxvcGVcIiBpbiB2YWx1ZSAmJlxuICAgICh2YWx1ZSBhcyBWYWx1ZUVudmVsb3BlKS5fX2RieFRvb2xzQ2FjaGVFbnZlbG9wZSA9PT0gRU5WRUxPUEVfVkVSU0lPTiAmJlxuICAgIFwidmFsdWVcIiBpbiB2YWx1ZSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gY2FjaGVkT25FcnJvcktleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtFUlJPUl9WQUxVRV9QUkVGSVh9JHtrZXl9YDtcbn1cblxuZnVuY3Rpb24gc3RhcnRSZWZyZXNoPFQ+KFxuICBjYWNoZTogQ2FjaGVhYmxlLFxuICBrZXk6IHN0cmluZyxcbiAgbG9hZDogKCkgPT4gUHJvbWlzZTxUPixcbiAgb3B0aW9uczogR2V0T3JTZXRGdW5jdGlvbk9wdGlvbnMsXG4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSByZXF1aXJlU3RhdGUoY2FjaGUpO1xuICBpZiAoc3RhdGUucmVmcmVzaGVzLmhhcyhrZXkpKSByZXR1cm47XG4gIGxldCByZWZyZXNoITogUHJvbWlzZTx2b2lkPjtcbiAgcmVmcmVzaCA9IChhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBsb2FkKCk7XG4gICAgYXdhaXQgY2FjaGUuc2V0KGtleSwgdmFsdWUsIHtcbiAgICAgIC4uLihvcHRpb25zLnR0bCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHR0bDogb3B0aW9ucy50dGwgfSksXG4gICAgICAuLi4ob3B0aW9ucy5ub25CbG9ja2luZyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG5vbkJsb2NraW5nOiBvcHRpb25zLm5vbkJsb2NraW5nIH0pLFxuICAgIH0pO1xuICB9KSgpXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oXCJjYWNoZSBiYWNrZ3JvdW5kIHJlZnJlc2ggZmFpbGVkXCIsIHsga2V5LCBlcnJvcjogdG9FcnJvcihlcnJvcikgfSk7XG4gICAgfSlcbiAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICBpZiAoc3RhdGUucmVmcmVzaGVzLmdldChrZXkpID09PSByZWZyZXNoKSBzdGF0ZS5yZWZyZXNoZXMuZGVsZXRlKGtleSk7XG4gICAgfSk7XG4gIHN0YXRlLnJlZnJlc2hlcy5zZXQoa2V5LCByZWZyZXNoKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVJlZnJlc2hBZnRlcldyaXRlPFQ+KG9wdGlvbjogUmVmcmVzaEFmdGVyV3JpdGU8VD4sIHZhbHVlOiBUKTogbnVtYmVyIHtcbiAgY29uc3QgY29uZmlndXJlZCA9IHR5cGVvZiBvcHRpb24gPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbih2YWx1ZSkgOiBvcHRpb247XG4gIGNvbnN0IHJlc29sdmVkID1cbiAgICB0eXBlb2YgY29uZmlndXJlZCA9PT0gXCJudW1iZXJcIiA/IGNvbmZpZ3VyZWQgOiBzaG9ydGhhbmRUb01pbGxpc2Vjb25kcyhjb25maWd1cmVkKTtcbiAgaWYgKHJlc29sdmVkID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZShyZXNvbHZlZCkgfHwgcmVzb2x2ZWQgPD0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwicmVmcmVzaEFmdGVyV3JpdGUgbXVzdCByZXNvbHZlIHRvIGEgcG9zaXRpdmUgZHVyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR0bGVMZXZlbHMoXG4gIGxldmVsczogcmVhZG9ubHkgQ2FjaGVMZXZlbFtdLFxuICBvcGVyYXRpb246IChsZXZlbDogQ2FjaGVMZXZlbCkgPT4gdW5rbm93biB8IFByb21pc2U8dW5rbm93bj4sXG4gIG9wZXJhdGlvbk5hbWU6IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGxldmVscy5tYXAoKGxldmVsKSA9PiBvcGVyYXRpb24obGV2ZWwpKSk7XG4gIGNvbnN0IGVycm9ycyA9IHJlc3VsdHMuZmxhdE1hcCgocmVzdWx0LCBpbmRleCkgPT5cbiAgICByZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCJcbiAgICAgID8gW1xuICAgICAgICAgIG5ldyBFcnJvcihgJHtsZXZlbHNbaW5kZXhdPy5uYW1lID8/IGBsZXZlbC0ke2luZGV4ICsgMX1gfSAke29wZXJhdGlvbk5hbWV9IGZhaWxlZGAsIHtcbiAgICAgICAgICAgIGNhdXNlOiByZXN1bHQucmVhc29uLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdXG4gICAgICA6IFtdLFxuICApO1xuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIGBDYWNoZSAke29wZXJhdGlvbk5hbWV9IGZhaWxlZGApO1xufVxuXG5mdW5jdGlvbiByZXF1aXJlU3RhdGUoY2FjaGU6IENhY2hlYWJsZSk6IENhY2hlU3RhdGUge1xuICBjb25zdCBzdGF0ZSA9IHN0YXRlcy5nZXQoY2FjaGUpO1xuICBpZiAoIXN0YXRlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FjaGUgd2FzIG5vdCBjcmVhdGVkIGJ5IEBkYngtdG9vbHMvY2FjaGVcIik7XG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZnVuY3Rpb24gc2FmZVNlZ21lbnQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUudHJpbSgpIHx8IFwiZGVmYXVsdFwiKTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpdmVJbnRlZ2VyKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIsIG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHJlc29sdmVkID0gdmFsdWUgPz8gZmFsbGJhY2s7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihyZXNvbHZlZCkgfHwgcmVzb2x2ZWQgPD0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGAke25hbWV9IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyYCk7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5mdW5jdGlvbiBub25OZWdhdGl2ZUludGVnZXIodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlciwgbmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSB2YWx1ZSA/PyBmYWxsYmFjaztcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHJlc29sdmVkKSB8fCByZXNvbHZlZCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"vitest": "3.2.4"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@dbx-tools/core": "^0.9.
|
|
28
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
27
|
+
"@dbx-tools/core": "^0.9.178",
|
|
28
|
+
"@dbx-tools/shared-core": "^0.9.178",
|
|
29
29
|
"cacheable": "2.5.0",
|
|
30
30
|
"env-paths": "^4.0.0",
|
|
31
31
|
"keyv": "5.6.0",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"./package.json": "./package.json"
|
|
46
46
|
}
|
|
47
47
|
},
|
|
48
|
-
"version": "0.9.
|
|
48
|
+
"version": "0.9.178",
|
|
49
49
|
"types": "./lib/index.d.ts",
|
|
50
50
|
"dbxToolsConfig": {
|
|
51
51
|
"tags": [
|
package/src/cache.ts
CHANGED
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
type CacheableOptions,
|
|
16
16
|
type GetOrSetFunctionOptions,
|
|
17
17
|
type KeyvStoreAdapter,
|
|
18
|
+
shorthandToMilliseconds,
|
|
18
19
|
} from "cacheable";
|
|
19
20
|
import envPaths from "env-paths";
|
|
20
21
|
import { Keyv } from "keyv";
|
|
@@ -29,6 +30,7 @@ const logger = log.logger("cache");
|
|
|
29
30
|
interface ValueEnvelope {
|
|
30
31
|
readonly __dbxToolsCacheEnvelope: typeof ENVELOPE_VERSION;
|
|
31
32
|
readonly value: unknown;
|
|
33
|
+
readonly writtenAt?: number;
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
interface SetMutation {
|
|
@@ -45,6 +47,7 @@ type Mutation = DeleteMutation | SetMutation;
|
|
|
45
47
|
|
|
46
48
|
interface CacheState {
|
|
47
49
|
readonly adapter?: TieredStoreAdapter;
|
|
50
|
+
readonly refreshes: Map<string, Promise<void>>;
|
|
48
51
|
path?: string;
|
|
49
52
|
registryKey?: string;
|
|
50
53
|
closed: boolean;
|
|
@@ -85,16 +88,25 @@ export interface ProjectCacheOptions extends CacheOptions {
|
|
|
85
88
|
readonly projectName?: string;
|
|
86
89
|
}
|
|
87
90
|
|
|
91
|
+
/** Age after which a cache hit returns its value and starts an asynchronous refresh. */
|
|
92
|
+
export type RefreshAfterWrite<T> = number | string | ((value: T) => number | string);
|
|
93
|
+
|
|
88
94
|
/** Options for the Cacheable-compatible get-or-set extension. */
|
|
89
|
-
export interface GetOrSetOptions extends GetOrSetFunctionOptions {
|
|
95
|
+
export interface GetOrSetOptions<T = unknown> extends GetOrSetFunctionOptions {
|
|
90
96
|
/** Return a separately retained successful value when the loader fails. Defaults to false. */
|
|
91
97
|
readonly returnCachedOnError?: boolean;
|
|
92
98
|
/** TTL for the cached-on-error value. Defaults to 0, meaning no expiration. */
|
|
93
99
|
readonly cachedOnErrorTtl?: number | string;
|
|
100
|
+
/**
|
|
101
|
+
* Return an older cached value immediately and refresh it once in the background after this
|
|
102
|
+
* duration since its last successful write. The hard `ttl` still controls final expiration.
|
|
103
|
+
*/
|
|
104
|
+
readonly refreshAfterWrite?: RefreshAfterWrite<T>;
|
|
94
105
|
}
|
|
95
106
|
|
|
96
107
|
const states = new WeakMap<Cacheable, CacheState>();
|
|
97
108
|
const projectCaches = new Map<string, Cacheable>();
|
|
109
|
+
const resultWriteTimes = new WeakMap<object, number>();
|
|
98
110
|
|
|
99
111
|
/**
|
|
100
112
|
* Keyv adapter that composes arbitrary ordered levels behind Cacheable's one
|
|
@@ -311,7 +323,7 @@ export function createCache(options: CacheOptions = {}): Cacheable {
|
|
|
311
323
|
cache.on("error", (error) => {
|
|
312
324
|
logger.warn("cacheable operation failed", { error: toError(error) });
|
|
313
325
|
});
|
|
314
|
-
states.set(cache, { adapter, closed: false });
|
|
326
|
+
states.set(cache, { adapter, refreshes: new Map(), closed: false });
|
|
315
327
|
return cache;
|
|
316
328
|
}
|
|
317
329
|
|
|
@@ -362,6 +374,7 @@ export async function flushCache(cache: Cacheable): Promise<void> {
|
|
|
362
374
|
export async function closeCache(cache: Cacheable): Promise<void> {
|
|
363
375
|
const state = requireState(cache);
|
|
364
376
|
if (state.closed) return;
|
|
377
|
+
while (state.refreshes.size > 0) await Promise.all([...state.refreshes.values()]);
|
|
365
378
|
await state.adapter?.disconnect();
|
|
366
379
|
state.closed = true;
|
|
367
380
|
if (state.registryKey && projectCaches.get(state.registryKey) === cache) {
|
|
@@ -395,21 +408,50 @@ export async function getOrSet<T>(
|
|
|
395
408
|
cache: Cacheable,
|
|
396
409
|
key: string,
|
|
397
410
|
load: () => Promise<T>,
|
|
398
|
-
options: GetOrSetOptions = {},
|
|
411
|
+
options: GetOrSetOptions<T> = {},
|
|
399
412
|
): Promise<T | undefined> {
|
|
400
|
-
const {
|
|
401
|
-
|
|
413
|
+
const {
|
|
414
|
+
returnCachedOnError = false,
|
|
415
|
+
cachedOnErrorTtl = 0,
|
|
416
|
+
refreshAfterWrite,
|
|
417
|
+
...cacheableOptions
|
|
418
|
+
} = options;
|
|
419
|
+
const loadFresh = async (): Promise<T> => {
|
|
420
|
+
const value = await load();
|
|
421
|
+
if (returnCachedOnError) {
|
|
422
|
+
await cache.set(cachedOnErrorKey(key), value, { ttl: cachedOnErrorTtl });
|
|
423
|
+
}
|
|
424
|
+
return value;
|
|
425
|
+
};
|
|
426
|
+
|
|
427
|
+
if (refreshAfterWrite !== undefined) {
|
|
428
|
+
const getOptions =
|
|
429
|
+
cacheableOptions.nonBlocking === undefined
|
|
430
|
+
? undefined
|
|
431
|
+
: { nonBlocking: cacheableOptions.nonBlocking };
|
|
432
|
+
let cached = await cache.getRaw<T>(key, getOptions);
|
|
433
|
+
if (!cached) {
|
|
434
|
+
const refresh = requireState(cache).refreshes.get(key);
|
|
435
|
+
if (refresh) {
|
|
436
|
+
await refresh;
|
|
437
|
+
cached = await cache.getRaw<T>(key, getOptions);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
if (cached) {
|
|
441
|
+
const value = cached.value as T;
|
|
442
|
+
const writtenAt = resultWriteTimes.get(cached as object);
|
|
443
|
+
const refreshMs = resolveRefreshAfterWrite(refreshAfterWrite, value);
|
|
444
|
+
if (writtenAt === undefined || Date.now() - writtenAt >= refreshMs) {
|
|
445
|
+
startRefresh(cache, key, loadFresh, cacheableOptions);
|
|
446
|
+
}
|
|
447
|
+
return value;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
if (!returnCachedOnError) return cache.getOrSet(key, loadFresh, cacheableOptions);
|
|
402
452
|
|
|
403
453
|
try {
|
|
404
|
-
return await cache.getOrSet(
|
|
405
|
-
key,
|
|
406
|
-
async () => {
|
|
407
|
-
const value = await load();
|
|
408
|
-
await cache.set(cachedOnErrorKey(key), value, { ttl: cachedOnErrorTtl });
|
|
409
|
-
return value;
|
|
410
|
-
},
|
|
411
|
-
{ ...cacheableOptions, throwErrors: true },
|
|
412
|
-
);
|
|
454
|
+
return await cache.getOrSet(key, loadFresh, { ...cacheableOptions, throwErrors: true });
|
|
413
455
|
} catch (error) {
|
|
414
456
|
const cached = await cache.get<T>(cachedOnErrorKey(key));
|
|
415
457
|
if (cached !== undefined) return cached;
|
|
@@ -426,21 +468,26 @@ function installValueEnvelope(cache: Cacheable): void {
|
|
|
426
468
|
for (const item of items) item.value = envelope(item.value);
|
|
427
469
|
});
|
|
428
470
|
cache.onHook(CacheableHooks.AFTER_GET, (item) => {
|
|
429
|
-
if (item.result)
|
|
471
|
+
if (item.result) unwrapResult(item.result);
|
|
430
472
|
});
|
|
431
473
|
cache.onHook(CacheableHooks.AFTER_GET_MANY, (item) => {
|
|
432
474
|
for (const result of item.result) {
|
|
433
|
-
if (result)
|
|
475
|
+
if (result) unwrapResult(result);
|
|
434
476
|
}
|
|
435
477
|
});
|
|
436
478
|
}
|
|
437
479
|
|
|
438
480
|
function envelope(value: unknown): ValueEnvelope {
|
|
439
|
-
return { __dbxToolsCacheEnvelope: ENVELOPE_VERSION, value };
|
|
481
|
+
return { __dbxToolsCacheEnvelope: ENVELOPE_VERSION, value, writtenAt: Date.now() };
|
|
440
482
|
}
|
|
441
483
|
|
|
442
|
-
function
|
|
443
|
-
|
|
484
|
+
function unwrapResult(result: { value?: unknown }): void {
|
|
485
|
+
if (!isEnvelope(result.value)) return;
|
|
486
|
+
const { writtenAt } = result.value;
|
|
487
|
+
if (typeof writtenAt === "number" && Number.isFinite(writtenAt)) {
|
|
488
|
+
resultWriteTimes.set(result, writtenAt);
|
|
489
|
+
}
|
|
490
|
+
result.value = result.value.value;
|
|
444
491
|
}
|
|
445
492
|
|
|
446
493
|
function isEnvelope(value: unknown): value is ValueEnvelope {
|
|
@@ -457,6 +504,41 @@ function cachedOnErrorKey(key: string): string {
|
|
|
457
504
|
return `${ERROR_VALUE_PREFIX}${key}`;
|
|
458
505
|
}
|
|
459
506
|
|
|
507
|
+
function startRefresh<T>(
|
|
508
|
+
cache: Cacheable,
|
|
509
|
+
key: string,
|
|
510
|
+
load: () => Promise<T>,
|
|
511
|
+
options: GetOrSetFunctionOptions,
|
|
512
|
+
): void {
|
|
513
|
+
const state = requireState(cache);
|
|
514
|
+
if (state.refreshes.has(key)) return;
|
|
515
|
+
let refresh!: Promise<void>;
|
|
516
|
+
refresh = (async () => {
|
|
517
|
+
const value = await load();
|
|
518
|
+
await cache.set(key, value, {
|
|
519
|
+
...(options.ttl === undefined ? {} : { ttl: options.ttl }),
|
|
520
|
+
...(options.nonBlocking === undefined ? {} : { nonBlocking: options.nonBlocking }),
|
|
521
|
+
});
|
|
522
|
+
})()
|
|
523
|
+
.catch((error) => {
|
|
524
|
+
logger.warn("cache background refresh failed", { key, error: toError(error) });
|
|
525
|
+
})
|
|
526
|
+
.finally(() => {
|
|
527
|
+
if (state.refreshes.get(key) === refresh) state.refreshes.delete(key);
|
|
528
|
+
});
|
|
529
|
+
state.refreshes.set(key, refresh);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
function resolveRefreshAfterWrite<T>(option: RefreshAfterWrite<T>, value: T): number {
|
|
533
|
+
const configured = typeof option === "function" ? option(value) : option;
|
|
534
|
+
const resolved =
|
|
535
|
+
typeof configured === "number" ? configured : shorthandToMilliseconds(configured);
|
|
536
|
+
if (resolved === undefined || !Number.isFinite(resolved) || resolved <= 0) {
|
|
537
|
+
throw new RangeError("refreshAfterWrite must resolve to a positive duration");
|
|
538
|
+
}
|
|
539
|
+
return resolved;
|
|
540
|
+
}
|
|
541
|
+
|
|
460
542
|
async function settleLevels(
|
|
461
543
|
levels: readonly CacheLevel[],
|
|
462
544
|
operation: (level: CacheLevel) => unknown | Promise<unknown>,
|