@dollhousemcp/mcp-server 2.0.40 → 2.0.42
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/CHANGELOG.md +13 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +10 -7
- package/dist/elements/agents/AgentManager.d.ts +25 -6
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +127 -21
- package/dist/elements/base/BaseElementManager.d.ts +18 -2
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +36 -3
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ElementCRUDHandler.d.ts +36 -8
- package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
- package/dist/handlers/ElementCRUDHandler.js +227 -96
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +3 -3
- package/dist/handlers/strategies/AgentActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/AgentActivationStrategy.js +5 -2
- package/dist/handlers/strategies/ElementActivationStrategy.d.ts +2 -0
- package/dist/handlers/strategies/ElementActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/ElementActivationStrategy.js +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +5 -5
- package/dist/services/ActivationStore.d.ts +5 -4
- package/dist/services/ActivationStore.d.ts.map +1 -1
- package/dist/services/ActivationStore.js +35 -9
- package/dist/services/PolicyExportService.d.ts +8 -2
- package/dist/services/PolicyExportService.d.ts.map +1 -1
- package/dist/services/PolicyExportService.js +37 -6
- package/dist/storage/ElementStorageLayer.d.ts +3 -3
- package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
- package/dist/storage/ElementStorageLayer.js +33 -7
- package/dist/storage/IStorageLayer.d.ts +8 -1
- package/dist/storage/IStorageLayer.d.ts.map +1 -1
- package/dist/storage/IStorageLayer.js +1 -1
- package/dist/storage/MemoryStorageLayer.d.ts +4 -3
- package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
- package/dist/storage/MemoryStorageLayer.js +43 -13
- package/dist/storage/types.d.ts +7 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +17 -2
- package/oauth-helper.mjs +19 -26
- package/package.json +2 -2
- package/server.json +2 -2
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import * as path from 'path';
|
|
8
8
|
import { logger } from '../utils/logger.js';
|
|
9
|
+
import { mergeManifestDiffResults } from './types.js';
|
|
9
10
|
import { StorageManifest } from './StorageManifest.js';
|
|
10
11
|
import { MetadataIndex } from './MetadataIndex.js';
|
|
11
12
|
import { FrontmatterParser } from './FrontmatterParser.js';
|
|
@@ -38,22 +39,47 @@ export class ElementStorageLayer {
|
|
|
38
39
|
* - Deduplicates concurrent calls (returns same promise)
|
|
39
40
|
* - Updates index and manifest based on diff
|
|
40
41
|
*/
|
|
41
|
-
async scan() {
|
|
42
|
+
async scan(options = {}) {
|
|
43
|
+
let drainedDiff;
|
|
44
|
+
const existingScan = this.scanInProgress;
|
|
45
|
+
if (existingScan) {
|
|
46
|
+
if (!options.freshAfterInFlight) {
|
|
47
|
+
return existingScan;
|
|
48
|
+
}
|
|
49
|
+
// A security-sensitive caller must not inherit a directory snapshot that
|
|
50
|
+
// began before the caller. Drain it, then force a trailing disk scan.
|
|
51
|
+
try {
|
|
52
|
+
drainedDiff = await existingScan;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// The trailing scan gets an independent chance to recover.
|
|
56
|
+
}
|
|
57
|
+
if (this.scanInProgress === existingScan) {
|
|
58
|
+
this.scanInProgress = null;
|
|
59
|
+
}
|
|
60
|
+
this.invalidate();
|
|
61
|
+
}
|
|
42
62
|
const now = Date.now();
|
|
43
63
|
if (now - this.lastScanTimestamp < this.scanCooldownMs) {
|
|
44
64
|
logger.debug(`ElementStorageLayer.scan: COOLDOWN ACTIVE for ${path.basename(this.elementDir)} — skipping disk I/O (${this.scanCooldownMs - (now - this.lastScanTimestamp)}ms remaining)`);
|
|
45
65
|
return EMPTY_DIFF;
|
|
46
66
|
}
|
|
47
|
-
// Deduplicate
|
|
67
|
+
// Deduplicate a scan that started after the freshness wait above. Such a
|
|
68
|
+
// scan is new enough for this caller and can safely be shared.
|
|
48
69
|
if (this.scanInProgress) {
|
|
49
|
-
|
|
70
|
+
const result = await this.scanInProgress;
|
|
71
|
+
return drainedDiff ? mergeManifestDiffResults(drainedDiff, result) : result;
|
|
50
72
|
}
|
|
51
|
-
|
|
73
|
+
const scan = this.performScan();
|
|
74
|
+
this.scanInProgress = scan;
|
|
52
75
|
try {
|
|
53
|
-
|
|
76
|
+
const result = await scan;
|
|
77
|
+
return drainedDiff ? mergeManifestDiffResults(drainedDiff, result) : result;
|
|
54
78
|
}
|
|
55
79
|
finally {
|
|
56
|
-
this.scanInProgress
|
|
80
|
+
if (this.scanInProgress === scan) {
|
|
81
|
+
this.scanInProgress = null;
|
|
82
|
+
}
|
|
57
83
|
}
|
|
58
84
|
}
|
|
59
85
|
/**
|
|
@@ -202,4 +228,4 @@ export class ElementStorageLayer {
|
|
|
202
228
|
}
|
|
203
229
|
}
|
|
204
230
|
}
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudFN0b3JhZ2VMYXllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL0VsZW1lbnRTdG9yYWdlTGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQWE5RSxNQUFNLFVBQVUsR0FBdUIsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFFL0YsTUFBTSxPQUFPLG1CQUFtQjtJQUNiLE9BQU8sQ0FBa0I7SUFDekIsUUFBUSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDakMsS0FBSyxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDNUIsVUFBVSxDQUFTO0lBQ25CLGFBQWEsQ0FBUztJQUN0QixjQUFjLENBQVM7SUFFaEMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLGNBQWMsR0FBdUMsSUFBSSxDQUFDO0lBRWxFLFlBQ0UscUJBQTRDLEVBQzVDLE9BQW1DO1FBRW5DLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7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O2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsK0NBQStDO29CQUMvQyxNQUFNLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxPQUFPLEVBQUUsRUFBRTt3QkFDOUQsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7cUJBQzlELENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUVGLG9DQUFvQztZQUNwQyxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0IsQ0FBQztZQUVELG1DQUFtQztZQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBRXBDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyx1QkFBdUI7WUFDNUQsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRWxlbWVudFN0b3JhZ2VMYXllciAtIENvb3JkaW5hdGVzIGluZGV4LCBtYW5pZmVzdCwgYW5kIGJhY2tlbmQgZm9yIGNhY2hlLWF3YXJlIGxpc3RpbmcuXG4gKlxuICogT3ducyB0aGUgc2NhbiBsaWZlY3ljbGU6IGNvb2xkb3duIGVuZm9yY2VtZW50LCBjb25jdXJyZW50IGNhbGwgZGVkdXBsaWNhdGlvbixcbiAqIGRpZmYtYmFzZWQgaW5jcmVtZW50YWwgaW5kZXggdXBkYXRlcywgYW5kIG5vdGlmaWNhdGlvbnMgZnJvbSBzYXZlL2RlbGV0ZS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VCYWNrZW5kIH0gZnJvbSAnLi9JU3RvcmFnZUJhY2tlbmQuanMnO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZUxheWVyIH0gZnJvbSAnLi9JU3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB0eXBlIHsgRWxlbWVudEluZGV4RW50cnksIE1hbmlmZXN0RGlmZlJlc3VsdCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgU3RvcmFnZU1hbmlmZXN0IH0gZnJvbSAnLi9TdG9yYWdlTWFuaWZlc3QuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFJbmRleCB9IGZyb20gJy4vTWV0YWRhdGFJbmRleC5qcyc7XG5pbXBvcnQgeyBGcm9udG1hdHRlclBhcnNlciB9IGZyb20gJy4vRnJvbnRtYXR0ZXJQYXJzZXIuanMnO1xuaW1wb3J0IHsgRmlsZVN0b3JhZ2VCYWNrZW5kIH0gZnJvbSAnLi9GaWxlU3RvcmFnZUJhY2tlbmQuanMnO1xuaW1wb3J0IHR5cGUgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFN0b3JhZ2VMYXllck9wdGlvbnMge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgZWxlbWVudCBkaXJlY3RvcnkgKi9cbiAgZWxlbWVudERpcjogc3RyaW5nO1xuICAvKiogRmlsZSBleHRlbnNpb24gdG8gZmlsdGVyIChlLmcuICcubWQnKSAqL1xuICBmaWxlRXh0ZW5zaW9uOiBzdHJpbmc7XG4gIC8qKiBNaW5pbXVtIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGZ1bGwgc2NhbnMgKGRlZmF1bHQ6IDEwMDApICovXG4gIHNjYW5Db29sZG93bk1zPzogbnVtYmVyO1xuICAvKiogT3ZlcnJpZGUgdGhlIHN0b3JhZ2UgYmFja2VuZCAodXNlZnVsIGZvciB0ZXN0aW5nKSAqL1xuICBzdG9yYWdlQmFja2VuZD86IElTdG9yYWdlQmFja2VuZDtcbn1cblxuY29uc3QgRU1QVFlfRElGRjogTWFuaWZlc3REaWZmUmVzdWx0ID0geyBhZGRlZDogW10sIG1vZGlmaWVkOiBbXSwgcmVtb3ZlZDogW10sIHVuY2hhbmdlZDogW10gfTtcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRTdG9yYWdlTGF5ZXIgaW1wbGVtZW50cyBJU3RvcmFnZUxheWVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYWNrZW5kOiBJU3RvcmFnZUJhY2tlbmQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFuaWZlc3QgPSBuZXcgU3RvcmFnZU1hbmlmZXN0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kZXggPSBuZXcgTWV0YWRhdGFJbmRleCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnREaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlRXh0ZW5zaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NhbkNvb2xkb3duTXM6IG51bWJlcjtcblxuICBwcml2YXRlIGxhc3RTY2FuVGltZXN0YW1wID0gMDtcbiAgcHJpdmF0ZSBzY2FuSW5Qcm9ncmVzczogUHJvbWlzZTxNYW5pZmVzdERpZmZSZXN1bHQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgb3B0aW9uczogRWxlbWVudFN0b3JhZ2VMYXllck9wdGlvbnNcbiAgKSB7XG4gICAgdGhpcy5lbGVtZW50RGlyID0gb3B0aW9ucy5lbGVtZW50RGlyO1xuICAgIHRoaXMuZmlsZUV4dGVuc2lvbiA9IG9wdGlvbnMuZmlsZUV4dGVuc2lvbjtcbiAgICB0aGlzLnNjYW5Db29sZG93bk1zID0gb3B0aW9ucy5zY2FuQ29vbGRvd25NcyA/PyAxMDAwO1xuXG4gICAgaWYgKG9wdGlvbnMuc3RvcmFnZUJhY2tlbmQpIHtcbiAgICAgIHRoaXMuYmFja2VuZCA9IG9wdGlvbnMuc3RvcmFnZUJhY2tlbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmFja2VuZCA9IG5ldyBGaWxlU3RvcmFnZUJhY2tlbmQoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2NhbiB0aGUgZWxlbWVudCBkaXJlY3RvcnkgZm9yIGNoYW5nZXMuXG4gICAqIC0gTm8tb3AgaWYgd2l0aGluIGNvb2xkb3duIHBlcmlvZCAocmV0dXJucyBlbXB0eSBkaWZmKVxuICAgKiAtIERlZHVwbGljYXRlcyBjb25jdXJyZW50IGNhbGxzIChyZXR1cm5zIHNhbWUgcHJvbWlzZSlcbiAgICogLSBVcGRhdGVzIGluZGV4IGFuZCBtYW5pZmVzdCBiYXNlZCBvbiBkaWZmXG4gICAqL1xuICBhc3luYyBzY2FuKCk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA8IHRoaXMuc2NhbkNvb2xkb3duTXMpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRWxlbWVudFN0b3JhZ2VMYXllci5zY2FuOiBDT09MRE9XTiBBQ1RJVkUgZm9yICR7cGF0aC5iYXNlbmFtZSh0aGlzLmVsZW1lbnREaXIpfSDigJQgc2tpcHBpbmcgZGlzayBJL08gKCR7dGhpcy5zY2FuQ29vbGRvd25NcyAtIChub3cgLSB0aGlzLmxhc3RTY2FuVGltZXN0YW1wKX1tcyByZW1haW5pbmcpYCk7XG4gICAgICByZXR1cm4gRU1QVFlfRElGRjtcbiAgICB9XG5cbiAgICAvLyBEZWR1cGxpY2F0ZSBjb25jdXJyZW50IHNjYW5zXG4gICAgaWYgKHRoaXMuc2NhbkluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjYW5JblByb2dyZXNzO1xuICAgIH1cblxuICAgIHRoaXMuc2NhbkluUHJvZ3Jlc3MgPSB0aGlzLnBlcmZvcm1TY2FuKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNjYW5JblByb2dyZXNzO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNjYW5JblByb2dyZXNzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBzY2FuIGFuZCByZXR1cm4gYWxsIGluZGV4IGVudHJpZXMuXG4gICAqL1xuICBhc3luYyBsaXN0U3VtbWFyaWVzKCk6IFByb21pc2U8RWxlbWVudEluZGV4RW50cnlbXT4ge1xuICAgIGF3YWl0IHRoaXMuc2NhbigpO1xuICAgIHJldHVybiB0aGlzLmluZGV4LmdldEFsbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgc2NhbiBhbmQgcmV0dXJuIGFsbCBpbmRleGVkIGZpbGUgcGF0aHMuXG4gICAqL1xuICBhc3luYyBnZXRJbmRleGVkUGF0aHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGF3YWl0IHRoaXMuc2NhbigpO1xuICAgIHJldHVybiB0aGlzLmluZGV4LmdldFBhdGhzKCk7XG4gIH1cblxuICAvKipcbiAgICogTygxKSBuYW1lLXRvLXBhdGggbG9va3VwIGZyb20gdGhlIGluZGV4LiBEb2VzIG5vdCB0cmlnZ2VyIGEgc2Nhbi5cbiAgICovXG4gIGdldFBhdGhCeU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5hbWUpLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIHJldHVybiB0aGlzLmluZGV4LmdldFBhdGhCeU5hbWUobm9ybWFsaXplZE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc2NhbiBoYXMgY29tcGxldGVkIChpbmRleCBpcyBhdXRob3JpdGF0aXZlKS5cbiAgICovXG4gIGhhc0NvbXBsZXRlZFNjYW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGlmeSB0aGUgc3RvcmFnZSBsYXllciB0aGF0IGEgZmlsZSB3YXMgc2F2ZWQuXG4gICAqIFJlLXN0YXRzIGFuZCByZS1wYXJzZXMgdGhlIGZpbGUgdG8gdXBkYXRlIGluZGV4L21hbmlmZXN0LlxuICAgKi9cbiAgYXN5bmMgbm90aWZ5U2F2ZWQocmVsYXRpdmVQYXRoOiBzdHJpbmcsIGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1ldGEgPSBhd2FpdCB0aGlzLmJhY2tlbmQuc3RhdChhYnNvbHV0ZVBhdGgpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuYmFja2VuZC5yZWFkRmlsZShhYnNvbHV0ZVBhdGgpO1xuICAgICAgY29uc3QgZm0gPSBGcm9udG1hdHRlclBhcnNlci5leHRyYWN0TWV0YWRhdGEoY29udGVudCk7XG5cbiAgICAgIHRoaXMuaW5kZXguc2V0KHtcbiAgICAgICAgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgbmFtZTogZm0ubmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGZtLmRlc2NyaXB0aW9uLFxuICAgICAgICB2ZXJzaW9uOiBmbS52ZXJzaW9uLFxuICAgICAgICBhdXRob3I6IGZtLmF1dGhvcixcbiAgICAgICAgdGFnczogZm0udGFncyxcbiAgICAgICAgbXRpbWVNczogbWV0YS5tdGltZU1zLFxuICAgICAgICBzaXplQnl0ZXM6IG1ldGEuc2l6ZUJ5dGVzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm1hbmlmZXN0LnNldChyZWxhdGl2ZVBhdGgsIG1ldGEubXRpbWVNcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnRWxlbWVudFN0b3JhZ2VMYXllci5ub3RpZnlTYXZlZCBmYWlsZWQsIGludmFsaWRhdGluZycsIHtcbiAgICAgICAgcmVsYXRpdmVQYXRoLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmludmFsaWRhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZ5IHRoZSBzdG9yYWdlIGxheWVyIHRoYXQgYSBmaWxlIHdhcyBkZWxldGVkLlxuICAgKiBSZW1vdmVzIHRoZSBlbnRyeSBmcm9tIGluZGV4IGFuZCBtYW5pZmVzdC5cbiAgICovXG4gIG5vdGlmeURlbGV0ZWQocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4LnJlbW92ZShyZWxhdGl2ZVBhdGgpO1xuICAgIHRoaXMubWFuaWZlc3QucmVtb3ZlKHJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgdGhlIG5leHQgc2NhbigpIHRvIGhpdCBkaXNrIGJ5IHJlc2V0dGluZyB0aGUgY29vbGRvd24gdGltZXIuXG4gICAqL1xuICBpbnZhbGlkYXRlKCk6IHZvaWQge1xuICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGFsbCBzdGF0ZSAoaW5kZXgsIG1hbmlmZXN0LCBjb29sZG93bikuXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4LmNsZWFyKCk7XG4gICAgdGhpcy5tYW5pZmVzdC5jbGVhcigpO1xuICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSAwO1xuICB9XG5cbiAgLy8gLS0tLSBwcml2YXRlIC0tLS1cblxuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1TY2FuKCk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuYmFja2VuZC5kaXJlY3RvcnlFeGlzdHModGhpcy5lbGVtZW50RGlyKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIC8vIERpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IOKAlCBjbGVhciBldmVyeXRoaW5nIGFuZCByZXR1cm5cbiAgICAgICAgY29uc3QgcmVtb3ZlZFBhdGhzID0gdGhpcy5pbmRleC5nZXRQYXRocygpO1xuICAgICAgICB0aGlzLmluZGV4LmNsZWFyKCk7XG4gICAgICAgIHRoaXMubWFuaWZlc3QuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWRkZWQ6IFtdLFxuICAgICAgICAgIG1vZGlmaWVkOiBbXSxcbiAgICAgICAgICByZW1vdmVkOiByZW1vdmVkUGF0aHMsXG4gICAgICAgICAgdW5jaGFuZ2VkOiBbXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gMS4gTGlzdCArIHN0YXRcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5iYWNrZW5kLmxpc3RGaWxlcyh0aGlzLmVsZW1lbnREaXIsIHRoaXMuZmlsZUV4dGVuc2lvbik7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuYmFja2VuZC5zdGF0TWFueSh0aGlzLmVsZW1lbnREaXIsIGZpbGVzKTtcblxuICAgICAgLy8gMi4gRGlmZiBhZ2FpbnN0IG1hbmlmZXN0XG4gICAgICBjb25zdCBkaWZmID0gdGhpcy5tYW5pZmVzdC5kaWZmKHN0YXRzKTtcblxuICAgICAgY29uc3QgaGFzQ2hhbmdlcyA9IGRpZmYuYWRkZWQubGVuZ3RoID4gMCB8fCBkaWZmLm1vZGlmaWVkLmxlbmd0aCA+IDAgfHwgZGlmZi5yZW1vdmVkLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEVsZW1lbnRTdG9yYWdlTGF5ZXIuc2NhbjogRElTSyBTQ0FOIGZvciAke3BhdGguYmFzZW5hbWUodGhpcy5lbGVtZW50RGlyKX0g4oCUICR7ZmlsZXMubGVuZ3RofSBmaWxlcywgJHtkaWZmLmFkZGVkLmxlbmd0aH0gYWRkZWQsICR7ZGlmZi5tb2RpZmllZC5sZW5ndGh9IG1vZGlmaWVkLCAke2RpZmYucmVtb3ZlZC5sZW5ndGh9IHJlbW92ZWRgKTtcbiAgICAgIH1cblxuICAgICAgLy8gMy4gRm9yIGFkZGVkL21vZGlmaWVkOiByZWFkIGZyb250bWF0dGVyLCB1cGRhdGUgaW5kZXhcbiAgICAgIGNvbnN0IHRvSW5kZXggPSBbLi4uZGlmZi5hZGRlZCwgLi4uZGlmZi5tb2RpZmllZF07XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdG9JbmRleC5tYXAoYXN5bmMgKHJlbFBhdGgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIHJlbFBhdGgpO1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuYmFja2VuZC5yZWFkRmlsZShhYnNQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGZtID0gRnJvbnRtYXR0ZXJQYXJzZXIuZXh0cmFjdE1ldGFkYXRhKGNvbnRlbnQpO1xuICAgICAgICAgICAgY29uc3QgbWV0YSA9IHN0YXRzLmdldChyZWxQYXRoKTtcblxuICAgICAgICAgICAgdGhpcy5pbmRleC5zZXQoe1xuICAgICAgICAgICAgICBmaWxlUGF0aDogcmVsUGF0aCxcbiAgICAgICAgICAgICAgbmFtZTogZm0ubmFtZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGZtLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICB2ZXJzaW9uOiBmbS52ZXJzaW9uLFxuICAgICAgICAgICAgICBhdXRob3I6IGZtLmF1dGhvcixcbiAgICAgICAgICAgICAgdGFnczogZm0udGFncyxcbiAgICAgICAgICAgICAgbXRpbWVNczogbWV0YT8ubXRpbWVNcyA/PyAwLFxuICAgICAgICAgICAgICBzaXplQnl0ZXM6IG1ldGE/LnNpemVCeXRlcyA/PyAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIGZhaWx1cmUgaXMgbm9uLWZhdGFsIOKAlCBza2lwIHRoaXMgZW50cnlcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRWxlbWVudFN0b3JhZ2VMYXllcjogZmFpbGVkIHRvIGluZGV4ICR7cmVsUGF0aH1gLCB7XG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyA0LiBGb3IgcmVtb3ZlZDogcmVtb3ZlIGZyb20gaW5kZXhcbiAgICAgIGZvciAoY29uc3QgcmVsUGF0aCBvZiBkaWZmLnJlbW92ZWQpIHtcbiAgICAgICAgdGhpcy5pbmRleC5yZW1vdmUocmVsUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIFVwZGF0ZSBtYW5pZmVzdCBhbmQgdGltZXN0YW1wXG4gICAgICB0aGlzLm1hbmlmZXN0LnVwZGF0ZShzdGF0cyk7XG4gICAgICB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuICAgICAgcmV0dXJuIGRpZmY7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRWxlbWVudFN0b3JhZ2VMYXllci5wZXJmb3JtU2NhbiBmYWlsZWQnLCBlcnJvcik7XG4gICAgICB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID0gRGF0ZS5ub3coKTsgLy8gUHJldmVudCByZXRyeSBzdG9ybXNcbiAgICAgIHJldHVybiBFTVBUWV9ESUZGO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
231
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudFN0b3JhZ2VMYXllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL0VsZW1lbnRTdG9yYWdlTGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFtRCxNQUFNLFlBQVksQ0FBQztBQUN2RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBYTlFLE1BQU0sVUFBVSxHQUF1QixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUUvRixNQUFNLE9BQU8sbUJBQW1CO0lBQ2IsT0FBTyxDQUFrQjtJQUN6QixRQUFRLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUNqQyxLQUFLLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztJQUM1QixVQUFVLENBQVM7SUFDbkIsYUFBYSxDQUFTO0lBQ3RCLGNBQWMsQ0FBUztJQUVoQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7SUFDdEIsY0FBYyxHQUF1QyxJQUFJLENBQUM7SUFFbEUsWUFDRSxxQkFBNEMsRUFDNUMsT0FBbUM7UUFFbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUMzQyxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDO1FBRXJELElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUN4QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQThCLEVBQUU7UUFDekMsSUFBSSxXQUEyQyxDQUFDO1FBQ2hELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDekMsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sWUFBWSxDQUFDO1lBQ3RCLENBQUM7WUFFRCx5RUFBeUU7WUFDekUsc0VBQXNFO1lBQ3RFLElBQUksQ0FBQztnQkFDSCxXQUFXLEdBQUcsTUFBTSxZQUFZLENBQUM7WUFDbkMsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCwyREFBMkQ7WUFDN0QsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDN0IsQ0FBQztZQUNELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkQsTUFBTSxDQUFDLEtBQUssQ0FBQyxpREFBaUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLHlCQUF5QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMxTCxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDO1FBRUQseUVBQXlFO1FBQ3pFLCtEQUErRDtRQUMvRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDekMsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzlFLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUM7WUFDMUIsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzlFLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsYUFBYTtRQUNqQixNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGVBQWU7UUFDbkIsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxJQUFZO1FBQ3hCLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztRQUMxRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFvQixFQUFFLFlBQW9CO1FBQzFELElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxRCxNQUFNLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7Z0JBQ2IsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSTtnQkFDYixXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVc7Z0JBQzNCLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTztnQkFDbkIsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNO2dCQUNqQixJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUk7Z0JBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDMUIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0RBQXNELEVBQUU7Z0JBQ25FLFlBQVk7Z0JBQ1osS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDOUQsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYSxDQUFDLFlBQW9CO1FBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDUixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsb0JBQW9CO0lBRVosS0FBSyxDQUFDLFdBQVc7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLHdEQUF3RDtnQkFDeEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDcEMsT0FBTztvQkFDTCxLQUFLLEVBQUUsRUFBRTtvQkFDVCxRQUFRLEVBQUUsRUFBRTtvQkFDWixPQUFPLEVBQUUsWUFBWTtvQkFDckIsU0FBUyxFQUFFLEVBQUU7aUJBQ2QsQ0FBQztZQUNKLENBQUM7WUFFRCxpQkFBaUI7WUFDakIsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNoRixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFbEUsMkJBQTJCO1lBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXZDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2hHLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLE1BQU0sV0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sV0FBVyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sY0FBYyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sVUFBVSxDQUFDLENBQUM7WUFDbE4sQ0FBQztZQUVELHdEQUF3RDtZQUN4RCxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQzVCLElBQUksQ0FBQztvQkFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ3BELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3JELE1BQU0sRUFBRSxHQUFHLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFFaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7d0JBQ2IsUUFBUSxFQUFFLE9BQU87d0JBQ2pCLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSTt3QkFDYixXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVc7d0JBQzNCLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTzt3QkFDbkIsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNO3dCQUNqQixJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUk7d0JBQ2IsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQzt3QkFDM0IsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLElBQUksQ0FBQztxQkFDaEMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZiwrQ0FBK0M7b0JBQy9DLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLE9BQU8sRUFBRSxFQUFFO3dCQUM5RCxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztxQkFDOUQsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1lBRUYsb0NBQW9DO1lBQ3BDLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBRUQsbUNBQW1DO1lBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFcEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QjtZQUM1RCxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbGVtZW50U3RvcmFnZUxheWVyIC0gQ29vcmRpbmF0ZXMgaW5kZXgsIG1hbmlmZXN0LCBhbmQgYmFja2VuZCBmb3IgY2FjaGUtYXdhcmUgbGlzdGluZy5cbiAqXG4gKiBPd25zIHRoZSBzY2FuIGxpZmVjeWNsZTogY29vbGRvd24gZW5mb3JjZW1lbnQsIGNvbmN1cnJlbnQgY2FsbCBkZWR1cGxpY2F0aW9uLFxuICogZGlmZi1iYXNlZCBpbmNyZW1lbnRhbCBpbmRleCB1cGRhdGVzLCBhbmQgbm90aWZpY2F0aW9ucyBmcm9tIHNhdmUvZGVsZXRlLlxuICovXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZUJhY2tlbmQgfSBmcm9tICcuL0lTdG9yYWdlQmFja2VuZC5qcyc7XG5pbXBvcnQgdHlwZSB7IElTdG9yYWdlTGF5ZXIsIFN0b3JhZ2VTY2FuT3B0aW9ucyB9IGZyb20gJy4vSVN0b3JhZ2VMYXllci5qcyc7XG5pbXBvcnQgeyBtZXJnZU1hbmlmZXN0RGlmZlJlc3VsdHMsIHR5cGUgRWxlbWVudEluZGV4RW50cnksIHR5cGUgTWFuaWZlc3REaWZmUmVzdWx0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBTdG9yYWdlTWFuaWZlc3QgfSBmcm9tICcuL1N0b3JhZ2VNYW5pZmVzdC5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YUluZGV4IH0gZnJvbSAnLi9NZXRhZGF0YUluZGV4LmpzJztcbmltcG9ydCB7IEZyb250bWF0dGVyUGFyc2VyIH0gZnJvbSAnLi9Gcm9udG1hdHRlclBhcnNlci5qcyc7XG5pbXBvcnQgeyBGaWxlU3RvcmFnZUJhY2tlbmQgfSBmcm9tICcuL0ZpbGVTdG9yYWdlQmFja2VuZC5qcyc7XG5pbXBvcnQgdHlwZSB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50U3RvcmFnZUxheWVyT3B0aW9ucyB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBlbGVtZW50IGRpcmVjdG9yeSAqL1xuICBlbGVtZW50RGlyOiBzdHJpbmc7XG4gIC8qKiBGaWxlIGV4dGVuc2lvbiB0byBmaWx0ZXIgKGUuZy4gJy5tZCcpICovXG4gIGZpbGVFeHRlbnNpb246IHN0cmluZztcbiAgLyoqIE1pbmltdW0gbWlsbGlzZWNvbmRzIGJldHdlZW4gZnVsbCBzY2FucyAoZGVmYXVsdDogMTAwMCkgKi9cbiAgc2NhbkNvb2xkb3duTXM/OiBudW1iZXI7XG4gIC8qKiBPdmVycmlkZSB0aGUgc3RvcmFnZSBiYWNrZW5kICh1c2VmdWwgZm9yIHRlc3RpbmcpICovXG4gIHN0b3JhZ2VCYWNrZW5kPzogSVN0b3JhZ2VCYWNrZW5kO1xufVxuXG5jb25zdCBFTVBUWV9ESUZGOiBNYW5pZmVzdERpZmZSZXN1bHQgPSB7IGFkZGVkOiBbXSwgbW9kaWZpZWQ6IFtdLCByZW1vdmVkOiBbXSwgdW5jaGFuZ2VkOiBbXSB9O1xuXG5leHBvcnQgY2xhc3MgRWxlbWVudFN0b3JhZ2VMYXllciBpbXBsZW1lbnRzIElTdG9yYWdlTGF5ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGJhY2tlbmQ6IElTdG9yYWdlQmFja2VuZDtcbiAgcHJpdmF0ZSByZWFkb25seSBtYW5pZmVzdCA9IG5ldyBTdG9yYWdlTWFuaWZlc3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRleCA9IG5ldyBNZXRhZGF0YUluZGV4KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudERpcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVFeHRlbnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzY2FuQ29vbGRvd25NczogbnVtYmVyO1xuXG4gIHByaXZhdGUgbGFzdFNjYW5UaW1lc3RhbXAgPSAwO1xuICBwcml2YXRlIHNjYW5JblByb2dyZXNzOiBQcm9taXNlPE1hbmlmZXN0RGlmZlJlc3VsdD4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICBvcHRpb25zOiBFbGVtZW50U3RvcmFnZUxheWVyT3B0aW9uc1xuICApIHtcbiAgICB0aGlzLmVsZW1lbnREaXIgPSBvcHRpb25zLmVsZW1lbnREaXI7XG4gICAgdGhpcy5maWxlRXh0ZW5zaW9uID0gb3B0aW9ucy5maWxlRXh0ZW5zaW9uO1xuICAgIHRoaXMuc2NhbkNvb2xkb3duTXMgPSBvcHRpb25zLnNjYW5Db29sZG93bk1zID8/IDEwMDA7XG5cbiAgICBpZiAob3B0aW9ucy5zdG9yYWdlQmFja2VuZCkge1xuICAgICAgdGhpcy5iYWNrZW5kID0gb3B0aW9ucy5zdG9yYWdlQmFja2VuZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iYWNrZW5kID0gbmV3IEZpbGVTdG9yYWdlQmFja2VuZChmaWxlT3BlcmF0aW9uc1NlcnZpY2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FuIHRoZSBlbGVtZW50IGRpcmVjdG9yeSBmb3IgY2hhbmdlcy5cbiAgICogLSBOby1vcCBpZiB3aXRoaW4gY29vbGRvd24gcGVyaW9kIChyZXR1cm5zIGVtcHR5IGRpZmYpXG4gICAqIC0gRGVkdXBsaWNhdGVzIGNvbmN1cnJlbnQgY2FsbHMgKHJldHVybnMgc2FtZSBwcm9taXNlKVxuICAgKiAtIFVwZGF0ZXMgaW5kZXggYW5kIG1hbmlmZXN0IGJhc2VkIG9uIGRpZmZcbiAgICovXG4gIGFzeW5jIHNjYW4ob3B0aW9uczogU3RvcmFnZVNjYW5PcHRpb25zID0ge30pOiBQcm9taXNlPE1hbmlmZXN0RGlmZlJlc3VsdD4ge1xuICAgIGxldCBkcmFpbmVkRGlmZjogTWFuaWZlc3REaWZmUmVzdWx0IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGV4aXN0aW5nU2NhbiA9IHRoaXMuc2NhbkluUHJvZ3Jlc3M7XG4gICAgaWYgKGV4aXN0aW5nU2Nhbikge1xuICAgICAgaWYgKCFvcHRpb25zLmZyZXNoQWZ0ZXJJbkZsaWdodCkge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdTY2FuO1xuICAgICAgfVxuXG4gICAgICAvLyBBIHNlY3VyaXR5LXNlbnNpdGl2ZSBjYWxsZXIgbXVzdCBub3QgaW5oZXJpdCBhIGRpcmVjdG9yeSBzbmFwc2hvdCB0aGF0XG4gICAgICAvLyBiZWdhbiBiZWZvcmUgdGhlIGNhbGxlci4gRHJhaW4gaXQsIHRoZW4gZm9yY2UgYSB0cmFpbGluZyBkaXNrIHNjYW4uXG4gICAgICB0cnkge1xuICAgICAgICBkcmFpbmVkRGlmZiA9IGF3YWl0IGV4aXN0aW5nU2NhbjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgdHJhaWxpbmcgc2NhbiBnZXRzIGFuIGluZGVwZW5kZW50IGNoYW5jZSB0byByZWNvdmVyLlxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2NhbkluUHJvZ3Jlc3MgPT09IGV4aXN0aW5nU2Nhbikge1xuICAgICAgICB0aGlzLnNjYW5JblByb2dyZXNzID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKG5vdyAtIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPCB0aGlzLnNjYW5Db29sZG93bk1zKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEVsZW1lbnRTdG9yYWdlTGF5ZXIuc2NhbjogQ09PTERPV04gQUNUSVZFIGZvciAke3BhdGguYmFzZW5hbWUodGhpcy5lbGVtZW50RGlyKX0g4oCUIHNraXBwaW5nIGRpc2sgSS9PICgke3RoaXMuc2NhbkNvb2xkb3duTXMgLSAobm93IC0gdGhpcy5sYXN0U2NhblRpbWVzdGFtcCl9bXMgcmVtYWluaW5nKWApO1xuICAgICAgcmV0dXJuIEVNUFRZX0RJRkY7XG4gICAgfVxuXG4gICAgLy8gRGVkdXBsaWNhdGUgYSBzY2FuIHRoYXQgc3RhcnRlZCBhZnRlciB0aGUgZnJlc2huZXNzIHdhaXQgYWJvdmUuIFN1Y2ggYVxuICAgIC8vIHNjYW4gaXMgbmV3IGVub3VnaCBmb3IgdGhpcyBjYWxsZXIgYW5kIGNhbiBzYWZlbHkgYmUgc2hhcmVkLlxuICAgIGlmICh0aGlzLnNjYW5JblByb2dyZXNzKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjYW5JblByb2dyZXNzO1xuICAgICAgcmV0dXJuIGRyYWluZWREaWZmID8gbWVyZ2VNYW5pZmVzdERpZmZSZXN1bHRzKGRyYWluZWREaWZmLCByZXN1bHQpIDogcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHNjYW4gPSB0aGlzLnBlcmZvcm1TY2FuKCk7XG4gICAgdGhpcy5zY2FuSW5Qcm9ncmVzcyA9IHNjYW47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNjYW47XG4gICAgICByZXR1cm4gZHJhaW5lZERpZmYgPyBtZXJnZU1hbmlmZXN0RGlmZlJlc3VsdHMoZHJhaW5lZERpZmYsIHJlc3VsdCkgOiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aGlzLnNjYW5JblByb2dyZXNzID09PSBzY2FuKSB7XG4gICAgICAgIHRoaXMuc2NhbkluUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIHNjYW4gYW5kIHJldHVybiBhbGwgaW5kZXggZW50cmllcy5cbiAgICovXG4gIGFzeW5jIGxpc3RTdW1tYXJpZXMoKTogUHJvbWlzZTxFbGVtZW50SW5kZXhFbnRyeVtdPiB7XG4gICAgYXdhaXQgdGhpcy5zY2FuKCk7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXguZ2V0QWxsKCk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBzY2FuIGFuZCByZXR1cm4gYWxsIGluZGV4ZWQgZmlsZSBwYXRocy5cbiAgICovXG4gIGFzeW5jIGdldEluZGV4ZWRQYXRocygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgYXdhaXQgdGhpcy5zY2FuKCk7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXguZ2V0UGF0aHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPKDEpIG5hbWUtdG8tcGF0aCBsb29rdXAgZnJvbSB0aGUgaW5kZXguIERvZXMgbm90IHRyaWdnZXIgYSBzY2FuLlxuICAgKi9cbiAgZ2V0UGF0aEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXguZ2V0UGF0aEJ5TmFtZShub3JtYWxpemVkTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBzY2FuIGhhcyBjb21wbGV0ZWQgKGluZGV4IGlzIGF1dGhvcml0YXRpdmUpLlxuICAgKi9cbiAgaGFzQ29tcGxldGVkU2NhbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZ5IHRoZSBzdG9yYWdlIGxheWVyIHRoYXQgYSBmaWxlIHdhcyBzYXZlZC5cbiAgICogUmUtc3RhdHMgYW5kIHJlLXBhcnNlcyB0aGUgZmlsZSB0byB1cGRhdGUgaW5kZXgvbWFuaWZlc3QuXG4gICAqL1xuICBhc3luYyBub3RpZnlTYXZlZChyZWxhdGl2ZVBhdGg6IHN0cmluZywgYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0YSA9IGF3YWl0IHRoaXMuYmFja2VuZC5zdGF0KGFic29sdXRlUGF0aCk7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5iYWNrZW5kLnJlYWRGaWxlKGFic29sdXRlUGF0aCk7XG4gICAgICBjb25zdCBmbSA9IEZyb250bWF0dGVyUGFyc2VyLmV4dHJhY3RNZXRhZGF0YShjb250ZW50KTtcblxuICAgICAgdGhpcy5pbmRleC5zZXQoe1xuICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICBuYW1lOiBmbS5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogZm0uZGVzY3JpcHRpb24sXG4gICAgICAgIHZlcnNpb246IGZtLnZlcnNpb24sXG4gICAgICAgIGF1dGhvcjogZm0uYXV0aG9yLFxuICAgICAgICB0YWdzOiBmbS50YWdzLFxuICAgICAgICBtdGltZU1zOiBtZXRhLm10aW1lTXMsXG4gICAgICAgIHNpemVCeXRlczogbWV0YS5zaXplQnl0ZXMsXG4gICAgICB9KTtcbiAgICAgIHRoaXMubWFuaWZlc3Quc2V0KHJlbGF0aXZlUGF0aCwgbWV0YS5tdGltZU1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdFbGVtZW50U3RvcmFnZUxheWVyLm5vdGlmeVNhdmVkIGZhaWxlZCwgaW52YWxpZGF0aW5nJywge1xuICAgICAgICByZWxhdGl2ZVBhdGgsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgdGhlIHN0b3JhZ2UgbGF5ZXIgdGhhdCBhIGZpbGUgd2FzIGRlbGV0ZWQuXG4gICAqIFJlbW92ZXMgdGhlIGVudHJ5IGZyb20gaW5kZXggYW5kIG1hbmlmZXN0LlxuICAgKi9cbiAgbm90aWZ5RGVsZXRlZChyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaW5kZXgucmVtb3ZlKHJlbGF0aXZlUGF0aCk7XG4gICAgdGhpcy5tYW5pZmVzdC5yZW1vdmUocmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSB0aGUgbmV4dCBzY2FuKCkgdG8gaGl0IGRpc2sgYnkgcmVzZXR0aW5nIHRoZSBjb29sZG93biB0aW1lci5cbiAgICovXG4gIGludmFsaWRhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IDA7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgYWxsIHN0YXRlIChpbmRleCwgbWFuaWZlc3QsIGNvb2xkb3duKS5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuaW5kZXguY2xlYXIoKTtcbiAgICB0aGlzLm1hbmlmZXN0LmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IDA7XG4gIH1cblxuICAvLyAtLS0tIHByaXZhdGUgLS0tLVxuXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybVNjYW4oKTogUHJvbWlzZTxNYW5pZmVzdERpZmZSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5iYWNrZW5kLmRpcmVjdG9yeUV4aXN0cyh0aGlzLmVsZW1lbnREaXIpO1xuICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgLy8gRGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3Qg4oCUIGNsZWFyIGV2ZXJ5dGhpbmcgYW5kIHJldHVyblxuICAgICAgICBjb25zdCByZW1vdmVkUGF0aHMgPSB0aGlzLmluZGV4LmdldFBhdGhzKCk7XG4gICAgICAgIHRoaXMuaW5kZXguY2xlYXIoKTtcbiAgICAgICAgdGhpcy5tYW5pZmVzdC5jbGVhcigpO1xuICAgICAgICB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhZGRlZDogW10sXG4gICAgICAgICAgbW9kaWZpZWQ6IFtdLFxuICAgICAgICAgIHJlbW92ZWQ6IHJlbW92ZWRQYXRocyxcbiAgICAgICAgICB1bmNoYW5nZWQ6IFtdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyAxLiBMaXN0ICsgc3RhdFxuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLmJhY2tlbmQubGlzdEZpbGVzKHRoaXMuZWxlbWVudERpciwgdGhpcy5maWxlRXh0ZW5zaW9uKTtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5iYWNrZW5kLnN0YXRNYW55KHRoaXMuZWxlbWVudERpciwgZmlsZXMpO1xuXG4gICAgICAvLyAyLiBEaWZmIGFnYWluc3QgbWFuaWZlc3RcbiAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLm1hbmlmZXN0LmRpZmYoc3RhdHMpO1xuXG4gICAgICBjb25zdCBoYXNDaGFuZ2VzID0gZGlmZi5hZGRlZC5sZW5ndGggPiAwIHx8IGRpZmYubW9kaWZpZWQubGVuZ3RoID4gMCB8fCBkaWZmLnJlbW92ZWQubGVuZ3RoID4gMDtcbiAgICAgIGlmIChoYXNDaGFuZ2VzKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRWxlbWVudFN0b3JhZ2VMYXllci5zY2FuOiBESVNLIFNDQU4gZm9yICR7cGF0aC5iYXNlbmFtZSh0aGlzLmVsZW1lbnREaXIpfSDigJQgJHtmaWxlcy5sZW5ndGh9IGZpbGVzLCAke2RpZmYuYWRkZWQubGVuZ3RofSBhZGRlZCwgJHtkaWZmLm1vZGlmaWVkLmxlbmd0aH0gbW9kaWZpZWQsICR7ZGlmZi5yZW1vdmVkLmxlbmd0aH0gcmVtb3ZlZGApO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiBGb3IgYWRkZWQvbW9kaWZpZWQ6IHJlYWQgZnJvbnRtYXR0ZXIsIHVwZGF0ZSBpbmRleFxuICAgICAgY29uc3QgdG9JbmRleCA9IFsuLi5kaWZmLmFkZGVkLCAuLi5kaWZmLm1vZGlmaWVkXTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB0b0luZGV4Lm1hcChhc3luYyAocmVsUGF0aCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBhYnNQYXRoID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgcmVsUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5iYWNrZW5kLnJlYWRGaWxlKGFic1BhdGgpO1xuICAgICAgICAgICAgY29uc3QgZm0gPSBGcm9udG1hdHRlclBhcnNlci5leHRyYWN0TWV0YWRhdGEoY29udGVudCk7XG4gICAgICAgICAgICBjb25zdCBtZXRhID0gc3RhdHMuZ2V0KHJlbFBhdGgpO1xuXG4gICAgICAgICAgICB0aGlzLmluZGV4LnNldCh7XG4gICAgICAgICAgICAgIGZpbGVQYXRoOiByZWxQYXRoLFxuICAgICAgICAgICAgICBuYW1lOiBmbS5uYW1lLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZm0uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIHZlcnNpb246IGZtLnZlcnNpb24sXG4gICAgICAgICAgICAgIGF1dGhvcjogZm0uYXV0aG9yLFxuICAgICAgICAgICAgICB0YWdzOiBmbS50YWdzLFxuICAgICAgICAgICAgICBtdGltZU1zOiBtZXRhPy5tdGltZU1zID8/IDAsXG4gICAgICAgICAgICAgIHNpemVCeXRlczogbWV0YT8uc2l6ZUJ5dGVzID8/IDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gUGFyc2UgZmFpbHVyZSBpcyBub24tZmF0YWwg4oCUIHNraXAgdGhpcyBlbnRyeVxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBFbGVtZW50U3RvcmFnZUxheWVyOiBmYWlsZWQgdG8gaW5kZXggJHtyZWxQYXRofWAsIHtcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIDQuIEZvciByZW1vdmVkOiByZW1vdmUgZnJvbSBpbmRleFxuICAgICAgZm9yIChjb25zdCByZWxQYXRoIG9mIGRpZmYucmVtb3ZlZCkge1xuICAgICAgICB0aGlzLmluZGV4LnJlbW92ZShyZWxQYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8gNS4gVXBkYXRlIG1hbmlmZXN0IGFuZCB0aW1lc3RhbXBcbiAgICAgIHRoaXMubWFuaWZlc3QudXBkYXRlKHN0YXRzKTtcbiAgICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgICByZXR1cm4gZGlmZjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFbGVtZW50U3RvcmFnZUxheWVyLnBlcmZvcm1TY2FuIGZhaWxlZCcsIGVycm9yKTtcbiAgICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSBEYXRlLm5vdygpOyAvLyBQcmV2ZW50IHJldHJ5IHN0b3Jtc1xuICAgICAgcmV0dXJuIEVNUFRZX0RJRkY7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -6,12 +6,19 @@
|
|
|
6
6
|
* MemoryStorageLayer (Phase 2, .yaml memories) to share the same contract.
|
|
7
7
|
*/
|
|
8
8
|
import type { ElementIndexEntry, ManifestDiffResult } from './types.js';
|
|
9
|
+
export interface StorageScanOptions {
|
|
10
|
+
/**
|
|
11
|
+
* If a scan was already running when this call began, wait for it and then
|
|
12
|
+
* force a trailing disk scan instead of reusing its potentially older view.
|
|
13
|
+
*/
|
|
14
|
+
freshAfterInFlight?: boolean;
|
|
15
|
+
}
|
|
9
16
|
export interface IStorageLayer {
|
|
10
17
|
/**
|
|
11
18
|
* Scan the filesystem for changes relative to the last snapshot.
|
|
12
19
|
* Implementations should enforce cooldown and deduplicate concurrent calls.
|
|
13
20
|
*/
|
|
14
|
-
scan(): Promise<ManifestDiffResult>;
|
|
21
|
+
scan(options?: StorageScanOptions): Promise<ManifestDiffResult>;
|
|
15
22
|
/**
|
|
16
23
|
* Trigger scan and return all indexed entries.
|
|
17
24
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IStorageLayer.d.ts","sourceRoot":"","sources":["../../src/storage/IStorageLayer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,IAAI,
|
|
1
|
+
{"version":3,"file":"IStorageLayer.d.ts","sourceRoot":"","sources":["../../src/storage/IStorageLayer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEhE;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAE9C;;OAEG;IACH,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErC;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAEhD;;;;OAIG;IACH,gBAAgB,IAAI,OAAO,CAAC;IAE5B;;;OAGG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE;;;OAGG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1C;;OAEG;IACH,UAAU,IAAI,IAAI,CAAC;IAEnB;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACf"}
|
|
@@ -6,4 +6,4 @@
|
|
|
6
6
|
* MemoryStorageLayer (Phase 2, .yaml memories) to share the same contract.
|
|
7
7
|
*/
|
|
8
8
|
export {};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVN0b3JhZ2VMYXllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL0lTdG9yYWdlTGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHN0b3JhZ2UgbGF5ZXIgaW1wbGVtZW50YXRpb25zLlxuICpcbiAqIERlY291cGxlcyBCYXNlRWxlbWVudE1hbmFnZXIgZnJvbSBhIGNvbmNyZXRlIHN0b3JhZ2Ugc3RyYXRlZ3ksXG4gKiBhbGxvd2luZyBFbGVtZW50U3RvcmFnZUxheWVyIChQaGFzZSAxLCAubWQgZmlsZXMpIGFuZFxuICogTWVtb3J5U3RvcmFnZUxheWVyIChQaGFzZSAyLCAueWFtbCBtZW1vcmllcykgdG8gc2hhcmUgdGhlIHNhbWUgY29udHJhY3QuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFbGVtZW50SW5kZXhFbnRyeSwgTWFuaWZlc3REaWZmUmVzdWx0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZVNjYW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIGEgc2NhbiB3YXMgYWxyZWFkeSBydW5uaW5nIHdoZW4gdGhpcyBjYWxsIGJlZ2FuLCB3YWl0IGZvciBpdCBhbmQgdGhlblxuICAgKiBmb3JjZSBhIHRyYWlsaW5nIGRpc2sgc2NhbiBpbnN0ZWFkIG9mIHJldXNpbmcgaXRzIHBvdGVudGlhbGx5IG9sZGVyIHZpZXcuXG4gICAqL1xuICBmcmVzaEFmdGVySW5GbGlnaHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdG9yYWdlTGF5ZXIge1xuICAvKipcbiAgICogU2NhbiB0aGUgZmlsZXN5c3RlbSBmb3IgY2hhbmdlcyByZWxhdGl2ZSB0byB0aGUgbGFzdCBzbmFwc2hvdC5cbiAgICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBlbmZvcmNlIGNvb2xkb3duIGFuZCBkZWR1cGxpY2F0ZSBjb25jdXJyZW50IGNhbGxzLlxuICAgKi9cbiAgc2NhbihvcHRpb25zPzogU3RvcmFnZVNjYW5PcHRpb25zKTogUHJvbWlzZTxNYW5pZmVzdERpZmZSZXN1bHQ+O1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIHNjYW4gYW5kIHJldHVybiBhbGwgaW5kZXhlZCBlbnRyaWVzLlxuICAgKi9cbiAgbGlzdFN1bW1hcmllcygpOiBQcm9taXNlPEVsZW1lbnRJbmRleEVudHJ5W10+O1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIHNjYW4gYW5kIHJldHVybiBhbGwgaW5kZXhlZCBmaWxlIHBhdGhzLlxuICAgKi9cbiAgZ2V0SW5kZXhlZFBhdGhzKCk6IFByb21pc2U8c3RyaW5nW10+O1xuXG4gIC8qKlxuICAgKiBPKDEpIG5hbWUtdG8tcGF0aCBsb29rdXAgZnJvbSB0aGUgaW5kZXguIERvZXMgbm90IHRyaWdnZXIgYSBzY2FuLlxuICAgKi9cbiAgZ2V0UGF0aEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgc2NhbiBoYXMgY29tcGxldGVkLCBtZWFuaW5nIHRoZSBpbmRleFxuICAgKiBpcyBwb3B1bGF0ZWQgYW5kIG5hbWUgbG9va3VwcyBhcmUgYXV0aG9yaXRhdGl2ZSAoYSBtaXNzIG1lYW5zIHRoZVxuICAgKiBlbGVtZW50IGdlbnVpbmVseSBkb2VzIG5vdCBleGlzdCBvbiBkaXNrKS5cbiAgICovXG4gIGhhc0NvbXBsZXRlZFNjYW4oKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogTm90aWZ5IHRoZSBzdG9yYWdlIGxheWVyIHRoYXQgYSBmaWxlIHdhcyBzYXZlZC5cbiAgICogUmUtc3RhdHMgYW5kIHJlLXBhcnNlcyB0aGUgZmlsZSB0byB1cGRhdGUgaW5kZXgvbWFuaWZlc3QuXG4gICAqL1xuICBub3RpZnlTYXZlZChyZWxhdGl2ZVBhdGg6IHN0cmluZywgYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBOb3RpZnkgdGhlIHN0b3JhZ2UgbGF5ZXIgdGhhdCBhIGZpbGUgd2FzIGRlbGV0ZWQuXG4gICAqIFJlbW92ZXMgdGhlIGVudHJ5IGZyb20gaW5kZXggYW5kIG1hbmlmZXN0LlxuICAgKi9cbiAgbm90aWZ5RGVsZXRlZChyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBuZXh0IHNjYW4oKSB0byBoaXQgZGlzayBieSByZXNldHRpbmcgdGhlIGNvb2xkb3duIHRpbWVyLlxuICAgKi9cbiAgaW52YWxpZGF0ZSgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZXNldCBhbGwgc3RhdGUgKGluZGV4LCBtYW5pZmVzdCwgY29vbGRvd24pLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZDtcbn1cbiJdfQ==
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
* StorageManifest, FileStorageBackend) but with fundamentally different scan
|
|
12
12
|
* logic: multi-directory enumeration + _index.json cold-start persistence.
|
|
13
13
|
*/
|
|
14
|
-
import type { IStorageLayer } from './IStorageLayer.js';
|
|
14
|
+
import type { IStorageLayer, StorageScanOptions } from './IStorageLayer.js';
|
|
15
15
|
import type { IStorageBackend } from './IStorageBackend.js';
|
|
16
|
-
import type
|
|
16
|
+
import { type ElementIndexEntry, type ManifestDiffResult } from './types.js';
|
|
17
17
|
import type { FileOperationsService } from '../services/FileOperationsService.js';
|
|
18
18
|
export interface MemoryStorageLayerOptions {
|
|
19
19
|
/** Absolute path to the memories directory */
|
|
@@ -40,7 +40,8 @@ export declare class MemoryStorageLayer implements IStorageLayer {
|
|
|
40
40
|
private scanInProgress;
|
|
41
41
|
private coldStartDone;
|
|
42
42
|
constructor(fileOps: FileOperationsService, options: MemoryStorageLayerOptions);
|
|
43
|
-
scan(): Promise<ManifestDiffResult>;
|
|
43
|
+
scan(options?: StorageScanOptions): Promise<ManifestDiffResult>;
|
|
44
|
+
private drainInFlightScan;
|
|
44
45
|
listSummaries(): Promise<ElementIndexEntry[]>;
|
|
45
46
|
getIndexedPaths(): Promise<string[]>;
|
|
46
47
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryStorageLayer.d.ts","sourceRoot":"","sources":["../../src/storage/MemoryStorageLayer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"MemoryStorageLayer.d.ts","sourceRoot":"","sources":["../../src/storage/MemoryStorageLayer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAA4B,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMvG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAGlF,MAAM,WAAW,yBAAyB;IACxC,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5C;AAKD,qBAAa,kBAAmB,YAAW,aAAa;IAcpD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAgC;IAE5D,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAA4C;IAClE,OAAO,CAAC,aAAa,CAAS;gBAGX,OAAO,EAAE,qBAAqB,EAC/C,OAAO,EAAE,yBAAyB;IAoB9B,IAAI,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,kBAAkB,CAAC;YA0C3D,iBAAiB;IAezB,aAAa,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAK7C,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAM1C;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAYzB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK/C,gBAAgB,IAAI,OAAO;IAIrB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC5E,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAMzC,UAAU,IAAI,IAAI;IAIlB,KAAK,IAAI,IAAI;IASb;;;OAGG;IACH,kBAAkB,IAAI,iBAAiB,EAAE;IAMzC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;;OAGG;YACW,SAAS;IA0BvB;;;OAGG;YACW,sBAAsB;IAkCpC;;OAEG;YACW,WAAW;CAoH1B"}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import * as path from 'path';
|
|
15
15
|
import { logger } from '../utils/logger.js';
|
|
16
|
+
import { mergeManifestDiffResults } from './types.js';
|
|
16
17
|
import { StorageManifest } from './StorageManifest.js';
|
|
17
18
|
import { MetadataIndex } from './MetadataIndex.js';
|
|
18
19
|
import { FileStorageBackend } from './FileStorageBackend.js';
|
|
@@ -50,28 +51,57 @@ export class MemoryStorageLayer {
|
|
|
50
51
|
});
|
|
51
52
|
}
|
|
52
53
|
// ---- IStorageLayer implementation ----
|
|
53
|
-
async scan() {
|
|
54
|
+
async scan(options = {}) {
|
|
55
|
+
let drainedDiff;
|
|
56
|
+
const existingScan = this.scanInProgress;
|
|
57
|
+
if (existingScan) {
|
|
58
|
+
if (!options.freshAfterInFlight) {
|
|
59
|
+
return existingScan;
|
|
60
|
+
}
|
|
61
|
+
drainedDiff = await this.drainInFlightScan(existingScan);
|
|
62
|
+
this.invalidate();
|
|
63
|
+
}
|
|
54
64
|
// Cold start: try loading from _index.json first
|
|
65
|
+
let scan;
|
|
55
66
|
if (!this.coldStartDone) {
|
|
56
67
|
this.coldStartDone = true;
|
|
57
|
-
|
|
68
|
+
scan = this.coldStart();
|
|
58
69
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
70
|
+
else {
|
|
71
|
+
const now = Date.now();
|
|
72
|
+
if (now - this.lastScanTimestamp < this.scanCooldownMs) {
|
|
73
|
+
logger.debug(`MemoryStorageLayer.scan: COOLDOWN ACTIVE — skipping disk I/O (${this.scanCooldownMs - (now - this.lastScanTimestamp)}ms remaining)`);
|
|
74
|
+
return EMPTY_DIFF;
|
|
75
|
+
}
|
|
76
|
+
if (this.scanInProgress) {
|
|
77
|
+
const result = await this.scanInProgress;
|
|
78
|
+
return drainedDiff ? mergeManifestDiffResults(drainedDiff, result) : result;
|
|
79
|
+
}
|
|
80
|
+
scan = this.performScan();
|
|
67
81
|
}
|
|
68
|
-
this.scanInProgress =
|
|
82
|
+
this.scanInProgress = scan;
|
|
69
83
|
try {
|
|
70
|
-
|
|
84
|
+
const result = await scan;
|
|
85
|
+
return drainedDiff ? mergeManifestDiffResults(drainedDiff, result) : result;
|
|
71
86
|
}
|
|
72
87
|
finally {
|
|
88
|
+
if (this.scanInProgress === scan) {
|
|
89
|
+
this.scanInProgress = null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async drainInFlightScan(existingScan) {
|
|
94
|
+
let drainedDiff;
|
|
95
|
+
try {
|
|
96
|
+
drainedDiff = await existingScan;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// The trailing scan gets an independent chance to recover.
|
|
100
|
+
}
|
|
101
|
+
if (this.scanInProgress === existingScan) {
|
|
73
102
|
this.scanInProgress = null;
|
|
74
103
|
}
|
|
104
|
+
return drainedDiff;
|
|
75
105
|
}
|
|
76
106
|
async listSummaries() {
|
|
77
107
|
await this.scan();
|
|
@@ -349,4 +379,4 @@ export class MemoryStorageLayer {
|
|
|
349
379
|
}
|
|
350
380
|
}
|
|
351
381
|
}
|
|
352
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5U3RvcmFnZUxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3JhZ2UvTWVtb3J5U3RvcmFnZUxheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUk1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQWU5RSxNQUFNLFVBQVUsR0FBdUIsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDL0YsTUFBTSxtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQztBQUVsRCxNQUFNLE9BQU8sa0JBQWtCO0lBY1Y7SUFiRixPQUFPLENBQWtCO0lBQ3pCLFFBQVEsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ2pDLEtBQUssR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO0lBQzVCLFNBQVMsQ0FBa0I7SUFDM0IsV0FBVyxDQUFTO0lBQ3BCLGNBQWMsQ0FBUztJQUN2QixVQUFVLENBQWlDO0lBRXBELGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUN0QixjQUFjLEdBQXVDLElBQUksQ0FBQztJQUMxRCxhQUFhLEdBQUcs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QUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQixZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLENBQUM7WUFFRCxtQ0FBbUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUVwQywyREFBMkQ7WUFDM0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsdUJBQXVCO1lBQzVELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeVN0b3JhZ2VMYXllciAtIElTdG9yYWdlTGF5ZXIgaW1wbGVtZW50YXRpb24gZm9yIG11bHRpLWRpcmVjdG9yeSBtZW1vcnkgc2Nhbm5pbmcuXG4gKlxuICogTWVtb3JpZXMgdXNlIHB1cmUgWUFNTCBhY3Jvc3MgYSBtdWx0aS1kaXJlY3RvcnkgbGF5b3V0OlxuICogICBzeXN0ZW0vICAgICAgIOKAlCBTeXN0ZW0tcHJvdmlkZWQgbWVtb3JpZXNcbiAqICAgYWRhcHRlcnMvICAgICDigJQgQWRhcHRlci1zcGVjaWZpYyBtZW1vcmllc1xuICogICBZWVlZLU1NLURELyAgIOKAlCBVc2VyLWNyZWF0ZWQgZGF0ZS1mb2xkZXIgbWVtb3JpZXNcbiAqICAgKHJvb3QpICAgICAgICDigJQgTGVnYWN5IHJvb3QtbGV2ZWwgbWVtb3JpZXNcbiAqXG4gKiBSZXVzZXMgdGhlIHNhbWUgaW50ZXJuYWwgY29tcG9uZW50cyBhcyBFbGVtZW50U3RvcmFnZUxheWVyIChNZXRhZGF0YUluZGV4LFxuICogU3RvcmFnZU1hbmlmZXN0LCBGaWxlU3RvcmFnZUJhY2tlbmQpIGJ1dCB3aXRoIGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IHNjYW5cbiAqIGxvZ2ljOiBtdWx0aS1kaXJlY3RvcnkgZW51bWVyYXRpb24gKyBfaW5kZXguanNvbiBjb2xkLXN0YXJ0IHBlcnNpc3RlbmNlLlxuICovXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZUxheWVyIH0gZnJvbSAnLi9JU3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VCYWNrZW5kIH0gZnJvbSAnLi9JU3RvcmFnZUJhY2tlbmQuanMnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50SW5kZXhFbnRyeSwgTWFuaWZlc3REaWZmUmVzdWx0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBTdG9yYWdlTWFuaWZlc3QgfSBmcm9tICcuL1N0b3JhZ2VNYW5pZmVzdC5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YUluZGV4IH0gZnJvbSAnLi9NZXRhZGF0YUluZGV4LmpzJztcbmltcG9ydCB7IEZpbGVTdG9yYWdlQmFja2VuZCB9IGZyb20gJy4vRmlsZVN0b3JhZ2VCYWNrZW5kLmpzJztcbmltcG9ydCB7IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yIH0gZnJvbSAnLi9NZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5qcyc7XG5pbXBvcnQgeyBNZW1vcnlJbmRleEZpbGUgfSBmcm9tICcuL01lbW9yeUluZGV4RmlsZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlTdG9yYWdlTGF5ZXJPcHRpb25zIHtcbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIG1lbW9yaWVzIGRpcmVjdG9yeSAqL1xuICBtZW1vcmllc0Rpcjogc3RyaW5nO1xuICAvKiogTWluaW11bSBtaWxsaXNlY29uZHMgYmV0d2VlbiBmdWxsIHNjYW5zIChkZWZhdWx0OiAxMDAwKSAqL1xuICBzY2FuQ29vbGRvd25Ncz86IG51bWJlcjtcbiAgLyoqIE92ZXJyaWRlIHRoZSBzdG9yYWdlIGJhY2tlbmQgKHVzZWZ1bCBmb3IgdGVzdGluZykgKi9cbiAgc3RvcmFnZUJhY2tlbmQ/OiBJU3RvcmFnZUJhY2tlbmQ7XG4gIC8qKiBEZWJvdW5jZSBpbnRlcnZhbCBmb3IgX2luZGV4Lmpzb24gd3JpdGVzIChkZWZhdWx0OiAyMDAwKSAqL1xuICBpbmRleERlYm91bmNlTXM/OiBudW1iZXI7XG4gIC8qKiBGaWxlIGZpbHRlciBwcmVkaWNhdGUgKGUuZy4sIGV4Y2x1ZGUgYmFja3VwIGZpbGVzKSAqL1xuICBmaWxlRmlsdGVyPzogKGZpbGVuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG59XG5cbmNvbnN0IEVNUFRZX0RJRkY6IE1hbmlmZXN0RGlmZlJlc3VsdCA9IHsgYWRkZWQ6IFtdLCBtb2RpZmllZDogW10sIHJlbW92ZWQ6IFtdLCB1bmNoYW5nZWQ6IFtdIH07XG5jb25zdCBEQVRFX0ZPTERFUl9QQVRURVJOID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvO1xuXG5leHBvcnQgY2xhc3MgTWVtb3J5U3RvcmFnZUxheWVyIGltcGxlbWVudHMgSVN0b3JhZ2VMYXllciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFja2VuZDogSVN0b3JhZ2VCYWNrZW5kO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hbmlmZXN0ID0gbmV3IFN0b3JhZ2VNYW5pZmVzdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGluZGV4ID0gbmV3IE1ldGFkYXRhSW5kZXgoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRleEZpbGU6IE1lbW9yeUluZGV4RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1vcmllc0Rpcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjYW5Db29sZG93bk1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZUZpbHRlcj86IChmaWxlbmFtZTogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIHByaXZhdGUgbGFzdFNjYW5UaW1lc3RhbXAgPSAwO1xuICBwcml2YXRlIHNjYW5JblByb2dyZXNzOiBQcm9taXNlPE1hbmlmZXN0RGlmZlJlc3VsdD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb2xkU3RhcnREb25lID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWxlT3BzOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgb3B0aW9uczogTWVtb3J5U3RvcmFnZUxheWVyT3B0aW9uc1xuICApIHtcbiAgICB0aGlzLm1lbW9yaWVzRGlyID0gb3B0aW9ucy5tZW1vcmllc0RpcjtcbiAgICB0aGlzLnNjYW5Db29sZG93bk1zID0gb3B0aW9ucy5zY2FuQ29vbGRvd25NcyA/PyAxMDAwO1xuICAgIHRoaXMuZmlsZUZpbHRlciA9IG9wdGlvbnMuZmlsZUZpbHRlcjtcblxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2VCYWNrZW5kKSB7XG4gICAgICB0aGlzLmJhY2tlbmQgPSBvcHRpb25zLnN0b3JhZ2VCYWNrZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJhY2tlbmQgPSBuZXcgRmlsZVN0b3JhZ2VCYWNrZW5kKGZpbGVPcHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4UGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnX2luZGV4Lmpzb24nKTtcbiAgICB0aGlzLmluZGV4RmlsZSA9IG5ldyBNZW1vcnlJbmRleEZpbGUoaW5kZXhQYXRoLCBmaWxlT3BzLCB7XG4gICAgICBkZWJvdW5jZU1zOiBvcHRpb25zLmluZGV4RGVib3VuY2VNcyA/PyAyMDAwLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tLSBJU3RvcmFnZUxheWVyIGltcGxlbWVudGF0aW9uIC0tLS1cblxuICBhc3luYyBzY2FuKCk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgLy8gQ29sZCBzdGFydDogdHJ5IGxvYWRpbmcgZnJvbSBfaW5kZXguanNvbiBmaXJzdFxuICAgIGlmICghdGhpcy5jb2xkU3RhcnREb25lKSB7XG4gICAgICB0aGlzLmNvbGRTdGFydERvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMuY29sZFN0YXJ0KCk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA8IHRoaXMuc2NhbkNvb2xkb3duTXMpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgTWVtb3J5U3RvcmFnZUxheWVyLnNjYW46IENPT0xET1dOIEFDVElWRSDigJQgc2tpcHBpbmcgZGlzayBJL08gKCR7dGhpcy5zY2FuQ29vbGRvd25NcyAtIChub3cgLSB0aGlzLmxhc3RTY2FuVGltZXN0YW1wKX1tcyByZW1haW5pbmcpYCk7XG4gICAgICByZXR1cm4gRU1QVFlfRElGRjtcbiAgICB9XG5cbiAgICAvLyBEZWR1cGxpY2F0ZSBjb25jdXJyZW50IHNjYW5zXG4gICAgaWYgKHRoaXMuc2NhbkluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjYW5JblByb2dyZXNzO1xuICAgIH1cblxuICAgIHRoaXMuc2NhbkluUHJvZ3Jlc3MgPSB0aGlzLnBlcmZvcm1TY2FuKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNjYW5JblByb2dyZXNzO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNjYW5JblByb2dyZXNzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsaXN0U3VtbWFyaWVzKCk6IFByb21pc2U8RWxlbWVudEluZGV4RW50cnlbXT4ge1xuICAgIGF3YWl0IHRoaXMuc2NhbigpO1xuICAgIHJldHVybiB0aGlzLmRlZHVwbGljYXRlQnlOYW1lKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0SW5kZXhlZFBhdGhzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBhd2FpdCB0aGlzLnNjYW4oKTtcbiAgICBjb25zdCBkZWR1cGxpY2F0ZWQgPSB0aGlzLmRlZHVwbGljYXRlQnlOYW1lKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuICAgIHJldHVybiBkZWR1cGxpY2F0ZWQubWFwKGVudHJ5ID0+IGVudHJ5LmZpbGVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWR1cGxpY2F0ZSBpbmRleCBlbnRyaWVzIGJ5IG5vcm1hbGl6ZWQgbmFtZS5cbiAgICogV2hlbiB0aGUgc2FtZSBtZW1vcnkgYXBwZWFycyBpbiBtdWx0aXBsZSBkYXRlIGZvbGRlcnMsIGtlZXAgdGhlIG9uZVxuICAgKiB3aXRoIHRoZSBoaWdoZXN0IG10aW1lTXMgKG1vc3QgcmVjZW50bHkgbW9kaWZpZWQpLlxuICAgKlxuICAgKiBJc3N1ZSAjNjU0OiBTYW1lIG1lbW9yeSBmaWxlcyBkdXBsaWNhdGVkIGFjcm9zcyB+MTUwIGRhdGUgZm9sZGVyc1xuICAgKiBpbmZsYXRlZCBjb3VudHMgZnJvbSB+NzUwIHVuaXF1ZSB0byB+MywxMDArIGxvYWRlZCBtZW1vcmllcy5cbiAgICovXG4gIHByaXZhdGUgZGVkdXBsaWNhdGVCeU5hbWUoZW50cmllczogRWxlbWVudEluZGV4RW50cnlbXSk6IEVsZW1lbnRJbmRleEVudHJ5W10ge1xuICAgIGNvbnN0IGJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBFbGVtZW50SW5kZXhFbnRyeT4oKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGtleSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGVudHJ5Lm5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGJ5TmFtZS5nZXQoa2V5KTtcbiAgICAgIGlmICghZXhpc3RpbmcgfHwgZW50cnkubXRpbWVNcyA+IGV4aXN0aW5nLm10aW1lTXMpIHtcbiAgICAgICAgYnlOYW1lLnNldChrZXksIGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFsuLi5ieU5hbWUudmFsdWVzKCldO1xuICB9XG5cbiAgZ2V0UGF0aEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSkubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXguZ2V0UGF0aEJ5TmFtZShub3JtYWxpemVkTmFtZSk7XG4gIH1cblxuICBoYXNDb21wbGV0ZWRTY2FuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID4gMDtcbiAgfVxuXG4gIGFzeW5jIG5vdGlmeVNhdmVkKHJlbGF0aXZlUGF0aDogc3RyaW5nLCBhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5iYWNrZW5kLnJlYWRGaWxlKGFic29sdXRlUGF0aCk7XG4gICAgICBjb25zdCBtZXRhID0gYXdhaXQgdGhpcy5iYWNrZW5kLnN0YXQoYWJzb2x1dGVQYXRoKTtcbiAgICAgIGNvbnN0IGV4dHJhY3RlZCA9IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLmV4dHJhY3RNZXRhZGF0YShjb250ZW50LCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICBjb25zdCBlbnRyeTogRWxlbWVudEluZGV4RW50cnkgPSB7XG4gICAgICAgIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgIG5hbWU6IGV4dHJhY3RlZC5uYW1lID8/ICd1bm5hbWVkJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGV4dHJhY3RlZC5kZXNjcmlwdGlvbiA/PyAnJyxcbiAgICAgICAgdmVyc2lvbjogZXh0cmFjdGVkLnZlcnNpb24gPz8gJzEuMC4wJyxcbiAgICAgICAgYXV0aG9yOiBleHRyYWN0ZWQuYXV0aG9yID8/ICcnLFxuICAgICAgICB0YWdzOiBleHRyYWN0ZWQudGFncyA/PyBbXSxcbiAgICAgICAgbXRpbWVNczogbWV0YS5tdGltZU1zLFxuICAgICAgICBzaXplQnl0ZXM6IG1ldGEuc2l6ZUJ5dGVzLFxuICAgICAgICBhdXRvTG9hZDogZXh0cmFjdGVkLmF1dG9Mb2FkLFxuICAgICAgICBwcmlvcml0eTogZXh0cmFjdGVkLnByaW9yaXR5LFxuICAgICAgICBtZW1vcnlUeXBlOiBleHRyYWN0ZWQubWVtb3J5VHlwZSxcbiAgICAgICAgdG90YWxFbnRyaWVzOiBleHRyYWN0ZWQudG90YWxFbnRyaWVzLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5pbmRleC5zZXQoZW50cnkpO1xuICAgICAgdGhpcy5tYW5pZmVzdC5zZXQocmVsYXRpdmVQYXRoLCBtZXRhLm10aW1lTXMpO1xuICAgICAgdGhpcy5pbmRleEZpbGUuc2NoZWR1bGVXcml0ZSh0aGlzLmluZGV4LmdldEFsbCgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdNZW1vcnlTdG9yYWdlTGF5ZXIubm90aWZ5U2F2ZWQgZmFpbGVkLCBpbnZhbGlkYXRpbmcnLCB7XG4gICAgICAgIHJlbGF0aXZlUGF0aCxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgbm90aWZ5RGVsZXRlZChyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaW5kZXgucmVtb3ZlKHJlbGF0aXZlUGF0aCk7XG4gICAgdGhpcy5tYW5pZmVzdC5yZW1vdmUocmVsYXRpdmVQYXRoKTtcbiAgICB0aGlzLmluZGV4RmlsZS5zY2hlZHVsZVdyaXRlKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuICB9XG5cbiAgaW52YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID0gMDtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuaW5kZXhGaWxlLmRpc3Bvc2UoKTsgIC8vIENhbmNlbCBwZW5kaW5nIGRlYm91bmNlZCB3cml0ZSAocHJldmVudHMgRU5PVEVNUFRZIGluIHRlc3RzKVxuICAgIHRoaXMuaW5kZXguY2xlYXIoKTtcbiAgICB0aGlzLm1hbmlmZXN0LmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IDA7XG4gIH1cblxuICAvLyAtLS0tIE1lbW9yeS1zcGVjaWZpYyBtZXRob2RzIC0tLS1cblxuICAvKipcbiAgICogUmV0dXJuIGluZGV4IGVudHJpZXMgd2hlcmUgYXV0b0xvYWQgPT09IHRydWUsIHNvcnRlZCBieSBwcmlvcml0eSBhc2NlbmRpbmcuXG4gICAqIFB1cmUgaW4tbWVtb3J5IOKAlCBkb2VzIE5PVCB0cmlnZ2VyIGEgc2Nhbi5cbiAgICovXG4gIGdldEF1dG9Mb2FkRW50cmllcygpOiBFbGVtZW50SW5kZXhFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleC5nZXRBbGwoKVxuICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5hdXRvTG9hZCA9PT0gdHJ1ZSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiAoYS5wcmlvcml0eSA/PyA5OTkpIC0gKGIucHJpb3JpdHkgPz8gOTk5KSk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbCBkaXNrIHNjYW4gb2YgYWxsIHN1YmRpcmVjdG9yaWVzICsgd3JpdGUgX2luZGV4Lmpzb24uXG4gICAqL1xuICBhc3luYyByZWJ1aWxkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oJ01lbW9yeVN0b3JhZ2VMYXllcjogcmVidWlsZGluZyBpbmRleCBmcm9tIGRpc2suLi4nKTtcbiAgICB0aGlzLmluZGV4LmNsZWFyKCk7XG4gICAgdGhpcy5tYW5pZmVzdC5jbGVhcigpO1xuXG4gICAgYXdhaXQgdGhpcy5wZXJmb3JtU2NhbigpO1xuICAgIGF3YWl0IHRoaXMuaW5kZXhGaWxlLndyaXRlKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuXG4gICAgbG9nZ2VyLmluZm8oYE1lbW9yeVN0b3JhZ2VMYXllcjogcmVidWlsZCBjb21wbGV0ZSDigJQgJHt0aGlzLmluZGV4LnNpemV9IGVudHJpZXMgaW5kZXhlZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHBlbmRpbmcgX2luZGV4Lmpzb24gd3JpdGUgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLlxuICAgKi9cbiAgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluZGV4RmlsZS5mbHVzaCgpO1xuICAgIHRoaXMuaW5kZXhGaWxlLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8vIC0tLS0gUHJpdmF0ZSAtLS0tXG5cbiAgLyoqXG4gICAqIENvbGQgc3RhcnQ6IHRyeSB0byByZXN0b3JlIGZyb20gX2luZGV4Lmpzb24sIHRoZW4gcnVuIGluY3JlbWVudGFsIHNjYW4uXG4gICAqIEZhbGxzIGJhY2sgdG8gZnVsbCByZWJ1aWxkIGlmIGluZGV4IGlzIG1pc3NpbmcvY29ycnVwdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29sZFN0YXJ0KCk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IHRoaXMuaW5kZXhGaWxlLnJlYWQoKTtcblxuICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAvLyBQb3B1bGF0ZSBpbmRleCBhbmQgbWFuaWZlc3QgZnJvbSBjYWNoZWQgZGF0YVxuICAgICAgICBmb3IgKGNvbnN0IFtyZWxQYXRoLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoY2FjaGVkLmVudHJpZXMpKSB7XG4gICAgICAgICAgdGhpcy5pbmRleC5zZXQoZW50cnkpO1xuICAgICAgICAgIHRoaXMubWFuaWZlc3Quc2V0KHJlbFBhdGgsIGVudHJ5Lm10aW1lTXMpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5pbmZvKGBNZW1vcnlTdG9yYWdlTGF5ZXI6IGNvbGQgc3RhcnQg4oCUIGxvYWRlZCAke09iamVjdC5rZXlzKGNhY2hlZC5lbnRyaWVzKS5sZW5ndGh9IGVudHJpZXMgZnJvbSBfaW5kZXguanNvbmApO1xuXG4gICAgICAgIC8vIFJ1biBpbmNyZW1lbnRhbCBzY2FuIHRvIGNhdGNoIGNoYW5nZXMgc2luY2UgX2luZGV4Lmpzb24gd2FzIHdyaXR0ZW5cbiAgICAgICAgcmV0dXJuIHRoaXMucGVyZm9ybVNjYW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdNZW1vcnlTdG9yYWdlTGF5ZXI6IGNvbGQgc3RhcnQgX2luZGV4Lmpzb24gcmVhZCBmYWlsZWQsIHJlYnVpbGRpbmcnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBObyB2YWxpZCBfaW5kZXguanNvbiDigJQgZnVsbCByZWJ1aWxkXG4gICAgYXdhaXQgdGhpcy5yZWJ1aWxkSW5kZXgoKTtcbiAgICByZXR1cm4gRU1QVFlfRElGRjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb3ZlciBhbGwgc3ViZGlyZWN0b3JpZXMgdG8gc2Nhbi5cbiAgICogUmV0dXJucyBbJ3N5c3RlbScsICdhZGFwdGVycycsIC4uLmRhdGVGb2xkZXJzLCAnJ10gd2hlcmUgJycgPSByb290LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNjb3ZlclN1YmRpcmVjdG9yaWVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBzdWJkaXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmZpbGVPcHMubGlzdERpcmVjdG9yeSh0aGlzLm1lbW9yaWVzRGlyKTtcblxuICAgICAgY29uc3QgZGF0ZUZvbGRlcnM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgLy8gSW5jbHVkZSBrbm93biBmaXhlZCBkaXJlY3Rvcmllc1xuICAgICAgICBpZiAoZW50cnkgPT09ICdzeXN0ZW0nIHx8IGVudHJ5ID09PSAnYWRhcHRlcnMnKSB7XG4gICAgICAgICAgc3ViZGlycy5wdXNoKGVudHJ5KTtcbiAgICAgICAgfSBlbHNlIGlmIChEQVRFX0ZPTERFUl9QQVRURVJOLnRlc3QoZW50cnkpKSB7XG4gICAgICAgICAgZGF0ZUZvbGRlcnMucHVzaChlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2tpcCBiYWNrdXBzLywgX2luZGV4Lmpzb24sIGFuZCBvdGhlciBub24tbWVtb3J5IGRpcmVjdG9yaWVzXG4gICAgICB9XG4gICAgICAvLyBTb3J0IGRhdGUgZm9sZGVycyBjaHJvbm9sb2dpY2FsbHkgKG9sZGVzdCBmaXJzdCDihpIgbmV3ZXN0IGxhc3QpXG4gICAgICAvLyBzbyB0aGF0IG5hbWVUb1BhdGggaW4gTWV0YWRhdGFJbmRleCBlbmRzIHVwIHBvaW50aW5nIHRvIHRoZSBuZXdlc3QgY29weVxuICAgICAgZGF0ZUZvbGRlcnMuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgICAgIHN1YmRpcnMucHVzaCguLi5kYXRlRm9sZGVycyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ01lbW9yeVN0b3JhZ2VMYXllcjogZmFpbGVkIHRvIGxpc3Qgc3ViZGlyZWN0b3JpZXMnLCB7XG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIGluY2x1ZGUgcm9vdCAoZW1wdHkgc3RyaW5nID0gcm9vdCBkaXJlY3RvcnkpXG4gICAgc3ViZGlycy5wdXNoKCcnKTtcblxuICAgIHJldHVybiBzdWJkaXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBmdWxsIGluY3JlbWVudGFsIHNjYW4gYWNyb3NzIGFsbCBzdWJkaXJlY3Rvcmllcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybVNjYW4oKTogUHJvbWlzZTxNYW5pZmVzdERpZmZSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5iYWNrZW5kLmRpcmVjdG9yeUV4aXN0cyh0aGlzLm1lbW9yaWVzRGlyKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRQYXRocyA9IHRoaXMuaW5kZXguZ2V0UGF0aHMoKTtcbiAgICAgICAgdGhpcy5pbmRleC5jbGVhcigpO1xuICAgICAgICB0aGlzLm1hbmlmZXN0LmNsZWFyKCk7XG4gICAgICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFkZGVkOiBbXSxcbiAgICAgICAgICBtb2RpZmllZDogW10sXG4gICAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZFBhdGhzLFxuICAgICAgICAgIHVuY2hhbmdlZDogW10sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIDEuIERpc2NvdmVyIHN1YmRpcmVjdG9yaWVzXG4gICAgICBjb25zdCBzdWJkaXJzID0gYXdhaXQgdGhpcy5kaXNjb3ZlclN1YmRpcmVjdG9yaWVzKCk7XG5cbiAgICAgIC8vIDIuIEVudW1lcmF0ZSBhbGwgLnlhbWwgZmlsZXMgYWNyb3NzIHN1YmRpcmVjdG9yaWVzXG4gICAgICBjb25zdCBhbGxSZWxhdGl2ZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IHN1YmRpciBvZiBzdWJkaXJzKSB7XG4gICAgICAgIGNvbnN0IGFic0RpciA9IHN1YmRpciA/IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCBzdWJkaXIpIDogdGhpcy5tZW1vcmllc0RpcjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5iYWNrZW5kLmxpc3RGaWxlcyhhYnNEaXIsICcueWFtbCcpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICAvLyBBcHBseSBmaWxlIGZpbHRlciAoZS5nLiwgZXhjbHVkZSBiYWNrdXAgZmlsZXMpXG4gICAgICAgICAgICBpZiAodGhpcy5maWxlRmlsdGVyICYmICF0aGlzLmZpbGVGaWx0ZXIoZmlsZSkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByZWZpeCB3aXRoIHN1YmRpciBmb3IgcmVsYXRpdmUgcGF0aFxuICAgICAgICAgICAgY29uc3QgcmVsUGF0aCA9IHN1YmRpciA/IGAke3N1YmRpcn0vJHtmaWxlfWAgOiBmaWxlO1xuICAgICAgICAgICAgYWxsUmVsYXRpdmVQYXRocy5wdXNoKHJlbFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBEaXJlY3RvcnkgbWlnaHQgbm90IGV4aXN0IChlLmcuLCBubyBzeXN0ZW0vIGZvbGRlciB5ZXQpXG4gICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYE1lbW9yeVN0b3JhZ2VMYXllcjogZmFpbGVkIHRvIGxpc3QgJHthYnNEaXJ9YCwge1xuICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFN0YXQgYWxsIGZpbGVzXG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuYmFja2VuZC5zdGF0TWFueSh0aGlzLm1lbW9yaWVzRGlyLCBhbGxSZWxhdGl2ZVBhdGhzKTtcblxuICAgICAgLy8gNC4gRGlmZiBhZ2FpbnN0IG1hbmlmZXN0XG4gICAgICBjb25zdCBkaWZmID0gdGhpcy5tYW5pZmVzdC5kaWZmKHN0YXRzKTtcblxuICAgICAgY29uc3QgaGFzQ2hhbmdlcyA9IGRpZmYuYWRkZWQubGVuZ3RoID4gMCB8fCBkaWZmLm1vZGlmaWVkLmxlbmd0aCA+IDAgfHwgZGlmZi5yZW1vdmVkLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgICBsb2dnZXIuZGVidWcoYE1lbW9yeVN0b3JhZ2VMYXllci5zY2FuOiBESVNLIFNDQU4g4oCUICR7YWxsUmVsYXRpdmVQYXRocy5sZW5ndGh9IGZpbGVzLCAke2RpZmYuYWRkZWQubGVuZ3RofSBhZGRlZCwgJHtkaWZmLm1vZGlmaWVkLmxlbmd0aH0gbW9kaWZpZWQsICR7ZGlmZi5yZW1vdmVkLmxlbmd0aH0gcmVtb3ZlZGApO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiBGb3IgYWRkZWQvbW9kaWZpZWQ6IHJlYWQgZmlsZSwgZXh0cmFjdCBtZXRhZGF0YSwgdXBkYXRlIGluZGV4XG4gICAgICBjb25zdCB0b0luZGV4ID0gWy4uLmRpZmYuYWRkZWQsIC4uLmRpZmYubW9kaWZpZWRdO1xuICAgICAgbGV0IGluZGV4VXBkYXRlZCA9IGZhbHNlO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdG9JbmRleC5tYXAoYXN5bmMgKHJlbFBhdGgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCByZWxQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmJhY2tlbmQucmVhZEZpbGUoYWJzUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBleHRyYWN0ZWQgPSBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5leHRyYWN0TWV0YWRhdGEoY29udGVudCwgcmVsUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBtZXRhID0gc3RhdHMuZ2V0KHJlbFBhdGgpO1xuXG4gICAgICAgICAgICB0aGlzLmluZGV4LnNldCh7XG4gICAgICAgICAgICAgIGZpbGVQYXRoOiByZWxQYXRoLFxuICAgICAgICAgICAgICBuYW1lOiBleHRyYWN0ZWQubmFtZSA/PyAndW5uYW1lZCcsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBleHRyYWN0ZWQuZGVzY3JpcHRpb24gPz8gJycsXG4gICAgICAgICAgICAgIHZlcnNpb246IGV4dHJhY3RlZC52ZXJzaW9uID8/ICcxLjAuMCcsXG4gICAgICAgICAgICAgIGF1dGhvcjogZXh0cmFjdGVkLmF1dGhvciA/PyAnJyxcbiAgICAgICAgICAgICAgdGFnczogZXh0cmFjdGVkLnRhZ3MgPz8gW10sXG4gICAgICAgICAgICAgIG10aW1lTXM6IG1ldGE/Lm10aW1lTXMgPz8gMCxcbiAgICAgICAgICAgICAgc2l6ZUJ5dGVzOiBtZXRhPy5zaXplQnl0ZXMgPz8gMCxcbiAgICAgICAgICAgICAgYXV0b0xvYWQ6IGV4dHJhY3RlZC5hdXRvTG9hZCxcbiAgICAgICAgICAgICAgcHJpb3JpdHk6IGV4dHJhY3RlZC5wcmlvcml0eSxcbiAgICAgICAgICAgICAgbWVtb3J5VHlwZTogZXh0cmFjdGVkLm1lbW9yeVR5cGUsXG4gICAgICAgICAgICAgIHRvdGFsRW50cmllczogZXh0cmFjdGVkLnRvdGFsRW50cmllcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5kZXhVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBNZW1vcnlTdG9yYWdlTGF5ZXI6IGZhaWxlZCB0byBpbmRleCAke3JlbFBhdGh9YCwge1xuICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgLy8gNi4gRm9yIHJlbW92ZWQ6IHJlbW92ZSBmcm9tIGluZGV4XG4gICAgICBmb3IgKGNvbnN0IHJlbFBhdGggb2YgZGlmZi5yZW1vdmVkKSB7XG4gICAgICAgIHRoaXMuaW5kZXgucmVtb3ZlKHJlbFBhdGgpO1xuICAgICAgICBpbmRleFVwZGF0ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyA3LiBVcGRhdGUgbWFuaWZlc3QgYW5kIHRpbWVzdGFtcFxuICAgICAgdGhpcy5tYW5pZmVzdC51cGRhdGUoc3RhdHMpO1xuICAgICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIDguIFNjaGVkdWxlIGRlYm91bmNlZCBfaW5kZXguanNvbiB3cml0ZSBpZiBpbmRleCBjaGFuZ2VkXG4gICAgICBpZiAoaW5kZXhVcGRhdGVkKSB7XG4gICAgICAgIHRoaXMuaW5kZXhGaWxlLnNjaGVkdWxlV3JpdGUodGhpcy5pbmRleC5nZXRBbGwoKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkaWZmO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ01lbW9yeVN0b3JhZ2VMYXllci5wZXJmb3JtU2NhbiBmYWlsZWQnLCBlcnJvcik7XG4gICAgICB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID0gRGF0ZS5ub3coKTsgLy8gUHJldmVudCByZXRyeSBzdG9ybXNcbiAgICAgIHJldHVybiBFTVBUWV9ESUZGO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
382
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5U3RvcmFnZUxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3JhZ2UvTWVtb3J5U3RvcmFnZUxheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUc1QyxPQUFPLEVBQUUsd0JBQXdCLEVBQW1ELE1BQU0sWUFBWSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBZTlFLE1BQU0sVUFBVSxHQUF1QixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUMvRixNQUFNLG1CQUFtQixHQUFHLHFCQUFxQixDQUFDO0FBRWxELE1BQU0sT0FBTyxrQkFBa0I7SUFjVjtJQWJGLE9BQU8sQ0FBa0I7SUFDekIsUUFBUSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDakMsS0FBSyxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFDNUIsU0FBUyxDQUFrQjtJQUMzQixXQUFXLENBQVM7SUFDcEIsY0FBYyxDQUFTO0lBQ3ZCLFVBQVUsQ0FBaUM7SUFFcEQsaUJBQWlCLEdBQUcsQ0FBQyxDQUFD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QUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0IsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN0QixDQUFDO1lBRUQsbUNBQW1DO1lBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFcEMsMkRBQTJEO1lBQzNELElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNwRCxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QjtZQUM1RCxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZW1vcnlTdG9yYWdlTGF5ZXIgLSBJU3RvcmFnZUxheWVyIGltcGxlbWVudGF0aW9uIGZvciBtdWx0aS1kaXJlY3RvcnkgbWVtb3J5IHNjYW5uaW5nLlxuICpcbiAqIE1lbW9yaWVzIHVzZSBwdXJlIFlBTUwgYWNyb3NzIGEgbXVsdGktZGlyZWN0b3J5IGxheW91dDpcbiAqICAgc3lzdGVtLyAgICAgICDigJQgU3lzdGVtLXByb3ZpZGVkIG1lbW9yaWVzXG4gKiAgIGFkYXB0ZXJzLyAgICAg4oCUIEFkYXB0ZXItc3BlY2lmaWMgbWVtb3JpZXNcbiAqICAgWVlZWS1NTS1ERC8gICDigJQgVXNlci1jcmVhdGVkIGRhdGUtZm9sZGVyIG1lbW9yaWVzXG4gKiAgIChyb290KSAgICAgICAg4oCUIExlZ2FjeSByb290LWxldmVsIG1lbW9yaWVzXG4gKlxuICogUmV1c2VzIHRoZSBzYW1lIGludGVybmFsIGNvbXBvbmVudHMgYXMgRWxlbWVudFN0b3JhZ2VMYXllciAoTWV0YWRhdGFJbmRleCxcbiAqIFN0b3JhZ2VNYW5pZmVzdCwgRmlsZVN0b3JhZ2VCYWNrZW5kKSBidXQgd2l0aCBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCBzY2FuXG4gKiBsb2dpYzogbXVsdGktZGlyZWN0b3J5IGVudW1lcmF0aW9uICsgX2luZGV4Lmpzb24gY29sZC1zdGFydCBwZXJzaXN0ZW5jZS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VMYXllciwgU3RvcmFnZVNjYW5PcHRpb25zIH0gZnJvbSAnLi9JU3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VCYWNrZW5kIH0gZnJvbSAnLi9JU3RvcmFnZUJhY2tlbmQuanMnO1xuaW1wb3J0IHsgbWVyZ2VNYW5pZmVzdERpZmZSZXN1bHRzLCB0eXBlIEVsZW1lbnRJbmRleEVudHJ5LCB0eXBlIE1hbmlmZXN0RGlmZlJlc3VsdCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgU3RvcmFnZU1hbmlmZXN0IH0gZnJvbSAnLi9TdG9yYWdlTWFuaWZlc3QuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFJbmRleCB9IGZyb20gJy4vTWV0YWRhdGFJbmRleC5qcyc7XG5pbXBvcnQgeyBGaWxlU3RvcmFnZUJhY2tlbmQgfSBmcm9tICcuL0ZpbGVTdG9yYWdlQmFja2VuZC5qcyc7XG5pbXBvcnQgeyBNZW1vcnlNZXRhZGF0YUV4dHJhY3RvciB9IGZyb20gJy4vTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IuanMnO1xuaW1wb3J0IHsgTWVtb3J5SW5kZXhGaWxlIH0gZnJvbSAnLi9NZW1vcnlJbmRleEZpbGUuanMnO1xuaW1wb3J0IHR5cGUgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb3J5U3RvcmFnZUxheWVyT3B0aW9ucyB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBtZW1vcmllcyBkaXJlY3RvcnkgKi9cbiAgbWVtb3JpZXNEaXI6IHN0cmluZztcbiAgLyoqIE1pbmltdW0gbWlsbGlzZWNvbmRzIGJldHdlZW4gZnVsbCBzY2FucyAoZGVmYXVsdDogMTAwMCkgKi9cbiAgc2NhbkNvb2xkb3duTXM/OiBudW1iZXI7XG4gIC8qKiBPdmVycmlkZSB0aGUgc3RvcmFnZSBiYWNrZW5kICh1c2VmdWwgZm9yIHRlc3RpbmcpICovXG4gIHN0b3JhZ2VCYWNrZW5kPzogSVN0b3JhZ2VCYWNrZW5kO1xuICAvKiogRGVib3VuY2UgaW50ZXJ2YWwgZm9yIF9pbmRleC5qc29uIHdyaXRlcyAoZGVmYXVsdDogMjAwMCkgKi9cbiAgaW5kZXhEZWJvdW5jZU1zPzogbnVtYmVyO1xuICAvKiogRmlsZSBmaWx0ZXIgcHJlZGljYXRlIChlLmcuLCBleGNsdWRlIGJhY2t1cCBmaWxlcykgKi9cbiAgZmlsZUZpbHRlcj86IChmaWxlbmFtZTogc3RyaW5nKSA9PiBib29sZWFuO1xufVxuXG5jb25zdCBFTVBUWV9ESUZGOiBNYW5pZmVzdERpZmZSZXN1bHQgPSB7IGFkZGVkOiBbXSwgbW9kaWZpZWQ6IFtdLCByZW1vdmVkOiBbXSwgdW5jaGFuZ2VkOiBbXSB9O1xuY29uc3QgREFURV9GT0xERVJfUEFUVEVSTiA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLztcblxuZXhwb3J0IGNsYXNzIE1lbW9yeVN0b3JhZ2VMYXllciBpbXBsZW1lbnRzIElTdG9yYWdlTGF5ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGJhY2tlbmQ6IElTdG9yYWdlQmFja2VuZDtcbiAgcHJpdmF0ZSByZWFkb25seSBtYW5pZmVzdCA9IG5ldyBTdG9yYWdlTWFuaWZlc3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRleCA9IG5ldyBNZXRhZGF0YUluZGV4KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kZXhGaWxlOiBNZW1vcnlJbmRleEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVtb3JpZXNEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzY2FuQ29vbGRvd25NczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVGaWx0ZXI/OiAoZmlsZW5hbWU6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICBwcml2YXRlIGxhc3RTY2FuVGltZXN0YW1wID0gMDtcbiAgcHJpdmF0ZSBzY2FuSW5Qcm9ncmVzczogUHJvbWlzZTxNYW5pZmVzdERpZmZSZXN1bHQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29sZFN0YXJ0RG9uZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmlsZU9wczogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIG9wdGlvbnM6IE1lbW9yeVN0b3JhZ2VMYXllck9wdGlvbnNcbiAgKSB7XG4gICAgdGhpcy5tZW1vcmllc0RpciA9IG9wdGlvbnMubWVtb3JpZXNEaXI7XG4gICAgdGhpcy5zY2FuQ29vbGRvd25NcyA9IG9wdGlvbnMuc2NhbkNvb2xkb3duTXMgPz8gMTAwMDtcbiAgICB0aGlzLmZpbGVGaWx0ZXIgPSBvcHRpb25zLmZpbGVGaWx0ZXI7XG5cbiAgICBpZiAob3B0aW9ucy5zdG9yYWdlQmFja2VuZCkge1xuICAgICAgdGhpcy5iYWNrZW5kID0gb3B0aW9ucy5zdG9yYWdlQmFja2VuZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iYWNrZW5kID0gbmV3IEZpbGVTdG9yYWdlQmFja2VuZChmaWxlT3BzKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleFBhdGggPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgJ19pbmRleC5qc29uJyk7XG4gICAgdGhpcy5pbmRleEZpbGUgPSBuZXcgTWVtb3J5SW5kZXhGaWxlKGluZGV4UGF0aCwgZmlsZU9wcywge1xuICAgICAgZGVib3VuY2VNczogb3B0aW9ucy5pbmRleERlYm91bmNlTXMgPz8gMjAwMCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0gSVN0b3JhZ2VMYXllciBpbXBsZW1lbnRhdGlvbiAtLS0tXG5cbiAgYXN5bmMgc2NhbihvcHRpb25zOiBTdG9yYWdlU2Nhbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgbGV0IGRyYWluZWREaWZmOiBNYW5pZmVzdERpZmZSZXN1bHQgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZXhpc3RpbmdTY2FuID0gdGhpcy5zY2FuSW5Qcm9ncmVzcztcbiAgICBpZiAoZXhpc3RpbmdTY2FuKSB7XG4gICAgICBpZiAoIW9wdGlvbnMuZnJlc2hBZnRlckluRmxpZ2h0KSB7XG4gICAgICAgIHJldHVybiBleGlzdGluZ1NjYW47XG4gICAgICB9XG5cbiAgICAgIGRyYWluZWREaWZmID0gYXdhaXQgdGhpcy5kcmFpbkluRmxpZ2h0U2NhbihleGlzdGluZ1NjYW4pO1xuICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gQ29sZCBzdGFydDogdHJ5IGxvYWRpbmcgZnJvbSBfaW5kZXguanNvbiBmaXJzdFxuICAgIGxldCBzY2FuOiBQcm9taXNlPE1hbmlmZXN0RGlmZlJlc3VsdD47XG4gICAgaWYgKCF0aGlzLmNvbGRTdGFydERvbmUpIHtcbiAgICAgIHRoaXMuY29sZFN0YXJ0RG9uZSA9IHRydWU7XG4gICAgICBzY2FuID0gdGhpcy5jb2xkU3RhcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmIChub3cgLSB0aGlzLmxhc3RTY2FuVGltZXN0YW1wIDwgdGhpcy5zY2FuQ29vbGRvd25Ncykge1xuICAgICAgICBsb2dnZXIuZGVidWcoYE1lbW9yeVN0b3JhZ2VMYXllci5zY2FuOiBDT09MRE9XTiBBQ1RJVkUg4oCUIHNraXBwaW5nIGRpc2sgSS9PICgke3RoaXMuc2NhbkNvb2xkb3duTXMgLSAobm93IC0gdGhpcy5sYXN0U2NhblRpbWVzdGFtcCl9bXMgcmVtYWluaW5nKWApO1xuICAgICAgICByZXR1cm4gRU1QVFlfRElGRjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2NhbkluUHJvZ3Jlc3MpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zY2FuSW5Qcm9ncmVzcztcbiAgICAgICAgcmV0dXJuIGRyYWluZWREaWZmID8gbWVyZ2VNYW5pZmVzdERpZmZSZXN1bHRzKGRyYWluZWREaWZmLCByZXN1bHQpIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgc2NhbiA9IHRoaXMucGVyZm9ybVNjYW4oKTtcbiAgICB9XG5cbiAgICB0aGlzLnNjYW5JblByb2dyZXNzID0gc2NhbjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2NhbjtcbiAgICAgIHJldHVybiBkcmFpbmVkRGlmZiA/IG1lcmdlTWFuaWZlc3REaWZmUmVzdWx0cyhkcmFpbmVkRGlmZiwgcmVzdWx0KSA6IHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuc2NhbkluUHJvZ3Jlc3MgPT09IHNjYW4pIHtcbiAgICAgICAgdGhpcy5zY2FuSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkcmFpbkluRmxpZ2h0U2NhbihcbiAgICBleGlzdGluZ1NjYW46IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PixcbiAgKTogUHJvbWlzZTxNYW5pZmVzdERpZmZSZXN1bHQgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgZHJhaW5lZERpZmY6IE1hbmlmZXN0RGlmZlJlc3VsdCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgZHJhaW5lZERpZmYgPSBhd2FpdCBleGlzdGluZ1NjYW47XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGUgdHJhaWxpbmcgc2NhbiBnZXRzIGFuIGluZGVwZW5kZW50IGNoYW5jZSB0byByZWNvdmVyLlxuICAgIH1cbiAgICBpZiAodGhpcy5zY2FuSW5Qcm9ncmVzcyA9PT0gZXhpc3RpbmdTY2FuKSB7XG4gICAgICB0aGlzLnNjYW5JblByb2dyZXNzID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGRyYWluZWREaWZmO1xuICB9XG5cbiAgYXN5bmMgbGlzdFN1bW1hcmllcygpOiBQcm9taXNlPEVsZW1lbnRJbmRleEVudHJ5W10+IHtcbiAgICBhd2FpdCB0aGlzLnNjYW4oKTtcbiAgICByZXR1cm4gdGhpcy5kZWR1cGxpY2F0ZUJ5TmFtZSh0aGlzLmluZGV4LmdldEFsbCgpKTtcbiAgfVxuXG4gIGFzeW5jIGdldEluZGV4ZWRQYXRocygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgYXdhaXQgdGhpcy5zY2FuKCk7XG4gICAgY29uc3QgZGVkdXBsaWNhdGVkID0gdGhpcy5kZWR1cGxpY2F0ZUJ5TmFtZSh0aGlzLmluZGV4LmdldEFsbCgpKTtcbiAgICByZXR1cm4gZGVkdXBsaWNhdGVkLm1hcChlbnRyeSA9PiBlbnRyeS5maWxlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRGVkdXBsaWNhdGUgaW5kZXggZW50cmllcyBieSBub3JtYWxpemVkIG5hbWUuXG4gICAqIFdoZW4gdGhlIHNhbWUgbWVtb3J5IGFwcGVhcnMgaW4gbXVsdGlwbGUgZGF0ZSBmb2xkZXJzLCBrZWVwIHRoZSBvbmVcbiAgICogd2l0aCB0aGUgaGlnaGVzdCBtdGltZU1zIChtb3N0IHJlY2VudGx5IG1vZGlmaWVkKS5cbiAgICpcbiAgICogSXNzdWUgIzY1NDogU2FtZSBtZW1vcnkgZmlsZXMgZHVwbGljYXRlZCBhY3Jvc3MgfjE1MCBkYXRlIGZvbGRlcnNcbiAgICogaW5mbGF0ZWQgY291bnRzIGZyb20gfjc1MCB1bmlxdWUgdG8gfjMsMTAwKyBsb2FkZWQgbWVtb3JpZXMuXG4gICAqL1xuICBwcml2YXRlIGRlZHVwbGljYXRlQnlOYW1lKGVudHJpZXM6IEVsZW1lbnRJbmRleEVudHJ5W10pOiBFbGVtZW50SW5kZXhFbnRyeVtdIHtcbiAgICBjb25zdCBieU5hbWUgPSBuZXcgTWFwPHN0cmluZywgRWxlbWVudEluZGV4RW50cnk+KCk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBrZXkgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShlbnRyeS5uYW1lKS5ub3JtYWxpemVkQ29udGVudC50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBieU5hbWUuZ2V0KGtleSk7XG4gICAgICBpZiAoIWV4aXN0aW5nIHx8IGVudHJ5Lm10aW1lTXMgPiBleGlzdGluZy5tdGltZU1zKSB7XG4gICAgICAgIGJ5TmFtZS5zZXQoa2V5LCBlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbLi4uYnlOYW1lLnZhbHVlcygpXTtcbiAgfVxuXG4gIGdldFBhdGhCeU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5hbWUpLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIHJldHVybiB0aGlzLmluZGV4LmdldFBhdGhCeU5hbWUobm9ybWFsaXplZE5hbWUpO1xuICB9XG5cbiAgaGFzQ29tcGxldGVkU2NhbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA+IDA7XG4gIH1cblxuICBhc3luYyBub3RpZnlTYXZlZChyZWxhdGl2ZVBhdGg6IHN0cmluZywgYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuYmFja2VuZC5yZWFkRmlsZShhYnNvbHV0ZVBhdGgpO1xuICAgICAgY29uc3QgbWV0YSA9IGF3YWl0IHRoaXMuYmFja2VuZC5zdGF0KGFic29sdXRlUGF0aCk7XG4gICAgICBjb25zdCBleHRyYWN0ZWQgPSBNZW1vcnlNZXRhZGF0YUV4dHJhY3Rvci5leHRyYWN0TWV0YWRhdGEoY29udGVudCwgcmVsYXRpdmVQYXRoKTtcblxuICAgICAgY29uc3QgZW50cnk6IEVsZW1lbnRJbmRleEVudHJ5ID0ge1xuICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICBuYW1lOiBleHRyYWN0ZWQubmFtZSA/PyAndW5uYW1lZCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBleHRyYWN0ZWQuZGVzY3JpcHRpb24gPz8gJycsXG4gICAgICAgIHZlcnNpb246IGV4dHJhY3RlZC52ZXJzaW9uID8/ICcxLjAuMCcsXG4gICAgICAgIGF1dGhvcjogZXh0cmFjdGVkLmF1dGhvciA/PyAnJyxcbiAgICAgICAgdGFnczogZXh0cmFjdGVkLnRhZ3MgPz8gW10sXG4gICAgICAgIG10aW1lTXM6IG1ldGEubXRpbWVNcyxcbiAgICAgICAgc2l6ZUJ5dGVzOiBtZXRhLnNpemVCeXRlcyxcbiAgICAgICAgYXV0b0xvYWQ6IGV4dHJhY3RlZC5hdXRvTG9hZCxcbiAgICAgICAgcHJpb3JpdHk6IGV4dHJhY3RlZC5wcmlvcml0eSxcbiAgICAgICAgbWVtb3J5VHlwZTogZXh0cmFjdGVkLm1lbW9yeVR5cGUsXG4gICAgICAgIHRvdGFsRW50cmllczogZXh0cmFjdGVkLnRvdGFsRW50cmllcyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuaW5kZXguc2V0KGVudHJ5KTtcbiAgICAgIHRoaXMubWFuaWZlc3Quc2V0KHJlbGF0aXZlUGF0aCwgbWV0YS5tdGltZU1zKTtcbiAgICAgIHRoaXMuaW5kZXhGaWxlLnNjaGVkdWxlV3JpdGUodGhpcy5pbmRleC5nZXRBbGwoKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTWVtb3J5U3RvcmFnZUxheWVyLm5vdGlmeVNhdmVkIGZhaWxlZCwgaW52YWxpZGF0aW5nJywge1xuICAgICAgICByZWxhdGl2ZVBhdGgsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5vdGlmeURlbGV0ZWQocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4LnJlbW92ZShyZWxhdGl2ZVBhdGgpO1xuICAgIHRoaXMubWFuaWZlc3QucmVtb3ZlKHJlbGF0aXZlUGF0aCk7XG4gICAgdGhpcy5pbmRleEZpbGUuc2NoZWR1bGVXcml0ZSh0aGlzLmluZGV4LmdldEFsbCgpKTtcbiAgfVxuXG4gIGludmFsaWRhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IDA7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4RmlsZS5kaXNwb3NlKCk7ICAvLyBDYW5jZWwgcGVuZGluZyBkZWJvdW5jZWQgd3JpdGUgKHByZXZlbnRzIEVOT1RFTVBUWSBpbiB0ZXN0cylcbiAgICB0aGlzLmluZGV4LmNsZWFyKCk7XG4gICAgdGhpcy5tYW5pZmVzdC5jbGVhcigpO1xuICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSAwO1xuICB9XG5cbiAgLy8gLS0tLSBNZW1vcnktc3BlY2lmaWMgbWV0aG9kcyAtLS0tXG5cbiAgLyoqXG4gICAqIFJldHVybiBpbmRleCBlbnRyaWVzIHdoZXJlIGF1dG9Mb2FkID09PSB0cnVlLCBzb3J0ZWQgYnkgcHJpb3JpdHkgYXNjZW5kaW5nLlxuICAgKiBQdXJlIGluLW1lbW9yeSDigJQgZG9lcyBOT1QgdHJpZ2dlciBhIHNjYW4uXG4gICAqL1xuICBnZXRBdXRvTG9hZEVudHJpZXMoKTogRWxlbWVudEluZGV4RW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXguZ2V0QWxsKClcbiAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkuYXV0b0xvYWQgPT09IHRydWUpXG4gICAgICAuc29ydCgoYSwgYikgPT4gKGEucHJpb3JpdHkgPz8gOTk5KSAtIChiLnByaW9yaXR5ID8/IDk5OSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGwgZGlzayBzY2FuIG9mIGFsbCBzdWJkaXJlY3RvcmllcyArIHdyaXRlIF9pbmRleC5qc29uLlxuICAgKi9cbiAgYXN5bmMgcmVidWlsZEluZGV4KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5pbmZvKCdNZW1vcnlTdG9yYWdlTGF5ZXI6IHJlYnVpbGRpbmcgaW5kZXggZnJvbSBkaXNrLi4uJyk7XG4gICAgdGhpcy5pbmRleC5jbGVhcigpO1xuICAgIHRoaXMubWFuaWZlc3QuY2xlYXIoKTtcblxuICAgIGF3YWl0IHRoaXMucGVyZm9ybVNjYW4oKTtcbiAgICBhd2FpdCB0aGlzLmluZGV4RmlsZS53cml0ZSh0aGlzLmluZGV4LmdldEFsbCgpKTtcblxuICAgIGxvZ2dlci5pbmZvKGBNZW1vcnlTdG9yYWdlTGF5ZXI6IHJlYnVpbGQgY29tcGxldGUg4oCUICR7dGhpcy5pbmRleC5zaXplfSBlbnRyaWVzIGluZGV4ZWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCBwZW5kaW5nIF9pbmRleC5qc29uIHdyaXRlIGFuZCByZWxlYXNlIHJlc291cmNlcy5cbiAgICovXG4gIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pbmRleEZpbGUuZmx1c2goKTtcbiAgICB0aGlzLmluZGV4RmlsZS5kaXNwb3NlKCk7XG4gIH1cblxuICAvLyAtLS0tIFByaXZhdGUgLS0tLVxuXG4gIC8qKlxuICAgKiBDb2xkIHN0YXJ0OiB0cnkgdG8gcmVzdG9yZSBmcm9tIF9pbmRleC5qc29uLCB0aGVuIHJ1biBpbmNyZW1lbnRhbCBzY2FuLlxuICAgKiBGYWxscyBiYWNrIHRvIGZ1bGwgcmVidWlsZCBpZiBpbmRleCBpcyBtaXNzaW5nL2NvcnJ1cHQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbGRTdGFydCgpOiBQcm9taXNlPE1hbmlmZXN0RGlmZlJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCB0aGlzLmluZGV4RmlsZS5yZWFkKCk7XG5cbiAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgLy8gUG9wdWxhdGUgaW5kZXggYW5kIG1hbmlmZXN0IGZyb20gY2FjaGVkIGRhdGFcbiAgICAgICAgZm9yIChjb25zdCBbcmVsUGF0aCwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGNhY2hlZC5lbnRyaWVzKSkge1xuICAgICAgICAgIHRoaXMuaW5kZXguc2V0KGVudHJ5KTtcbiAgICAgICAgICB0aGlzLm1hbmlmZXN0LnNldChyZWxQYXRoLCBlbnRyeS5tdGltZU1zKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaW5mbyhgTWVtb3J5U3RvcmFnZUxheWVyOiBjb2xkIHN0YXJ0IOKAlCBsb2FkZWQgJHtPYmplY3Qua2V5cyhjYWNoZWQuZW50cmllcykubGVuZ3RofSBlbnRyaWVzIGZyb20gX2luZGV4Lmpzb25gKTtcblxuICAgICAgICAvLyBSdW4gaW5jcmVtZW50YWwgc2NhbiB0byBjYXRjaCBjaGFuZ2VzIHNpbmNlIF9pbmRleC5qc29uIHdhcyB3cml0dGVuXG4gICAgICAgIHJldHVybiB0aGlzLnBlcmZvcm1TY2FuKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTWVtb3J5U3RvcmFnZUxheWVyOiBjb2xkIHN0YXJ0IF9pbmRleC5qc29uIHJlYWQgZmFpbGVkLCByZWJ1aWxkaW5nJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTm8gdmFsaWQgX2luZGV4Lmpzb24g4oCUIGZ1bGwgcmVidWlsZFxuICAgIGF3YWl0IHRoaXMucmVidWlsZEluZGV4KCk7XG4gICAgcmV0dXJuIEVNUFRZX0RJRkY7XG4gIH1cblxuICAvKipcbiAgICogRGlzY292ZXIgYWxsIHN1YmRpcmVjdG9yaWVzIHRvIHNjYW4uXG4gICAqIFJldHVybnMgWydzeXN0ZW0nLCAnYWRhcHRlcnMnLCAuLi5kYXRlRm9sZGVycywgJyddIHdoZXJlICcnID0gcm9vdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzY292ZXJTdWJkaXJlY3RvcmllcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgc3ViZGlyczogc3RyaW5nW10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5maWxlT3BzLmxpc3REaXJlY3RvcnkodGhpcy5tZW1vcmllc0Rpcik7XG5cbiAgICAgIGNvbnN0IGRhdGVGb2xkZXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIC8vIEluY2x1ZGUga25vd24gZml4ZWQgZGlyZWN0b3JpZXNcbiAgICAgICAgaWYgKGVudHJ5ID09PSAnc3lzdGVtJyB8fCBlbnRyeSA9PT0gJ2FkYXB0ZXJzJykge1xuICAgICAgICAgIHN1YmRpcnMucHVzaChlbnRyeSk7XG4gICAgICAgIH0gZWxzZSBpZiAoREFURV9GT0xERVJfUEFUVEVSTi50ZXN0KGVudHJ5KSkge1xuICAgICAgICAgIGRhdGVGb2xkZXJzLnB1c2goZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNraXAgYmFja3Vwcy8sIF9pbmRleC5qc29uLCBhbmQgb3RoZXIgbm9uLW1lbW9yeSBkaXJlY3Rvcmllc1xuICAgICAgfVxuICAgICAgLy8gU29ydCBkYXRlIGZvbGRlcnMgY2hyb25vbG9naWNhbGx5IChvbGRlc3QgZmlyc3Qg4oaSIG5ld2VzdCBsYXN0KVxuICAgICAgLy8gc28gdGhhdCBuYW1lVG9QYXRoIGluIE1ldGFkYXRhSW5kZXggZW5kcyB1cCBwb2ludGluZyB0byB0aGUgbmV3ZXN0IGNvcHlcbiAgICAgIGRhdGVGb2xkZXJzLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gICAgICBzdWJkaXJzLnB1c2goLi4uZGF0ZUZvbGRlcnMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdNZW1vcnlTdG9yYWdlTGF5ZXI6IGZhaWxlZCB0byBsaXN0IHN1YmRpcmVjdG9yaWVzJywge1xuICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsd2F5cyBpbmNsdWRlIHJvb3QgKGVtcHR5IHN0cmluZyA9IHJvb3QgZGlyZWN0b3J5KVxuICAgIHN1YmRpcnMucHVzaCgnJyk7XG5cbiAgICByZXR1cm4gc3ViZGlycztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgZnVsbCBpbmNyZW1lbnRhbCBzY2FuIGFjcm9zcyBhbGwgc3ViZGlyZWN0b3JpZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1TY2FuKCk6IFByb21pc2U8TWFuaWZlc3REaWZmUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuYmFja2VuZC5kaXJlY3RvcnlFeGlzdHModGhpcy5tZW1vcmllc0Rpcik7XG4gICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICBjb25zdCByZW1vdmVkUGF0aHMgPSB0aGlzLmluZGV4LmdldFBhdGhzKCk7XG4gICAgICAgIHRoaXMuaW5kZXguY2xlYXIoKTtcbiAgICAgICAgdGhpcy5tYW5pZmVzdC5jbGVhcigpO1xuICAgICAgICB0aGlzLmxhc3RTY2FuVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhZGRlZDogW10sXG4gICAgICAgICAgbW9kaWZpZWQ6IFtdLFxuICAgICAgICAgIHJlbW92ZWQ6IHJlbW92ZWRQYXRocyxcbiAgICAgICAgICB1bmNoYW5nZWQ6IFtdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyAxLiBEaXNjb3ZlciBzdWJkaXJlY3Rvcmllc1xuICAgICAgY29uc3Qgc3ViZGlycyA9IGF3YWl0IHRoaXMuZGlzY292ZXJTdWJkaXJlY3RvcmllcygpO1xuXG4gICAgICAvLyAyLiBFbnVtZXJhdGUgYWxsIC55YW1sIGZpbGVzIGFjcm9zcyBzdWJkaXJlY3Rvcmllc1xuICAgICAgY29uc3QgYWxsUmVsYXRpdmVQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBzdWJkaXIgb2Ygc3ViZGlycykge1xuICAgICAgICBjb25zdCBhYnNEaXIgPSBzdWJkaXIgPyBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0Rpciwgc3ViZGlyKSA6IHRoaXMubWVtb3JpZXNEaXI7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMuYmFja2VuZC5saXN0RmlsZXMoYWJzRGlyLCAnLnlhbWwnKTtcblxuICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgLy8gQXBwbHkgZmlsZSBmaWx0ZXIgKGUuZy4sIGV4Y2x1ZGUgYmFja3VwIGZpbGVzKVxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsZUZpbHRlciAmJiAhdGhpcy5maWxlRmlsdGVyKGZpbGUpKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQcmVmaXggd2l0aCBzdWJkaXIgZm9yIHJlbGF0aXZlIHBhdGhcbiAgICAgICAgICAgIGNvbnN0IHJlbFBhdGggPSBzdWJkaXIgPyBgJHtzdWJkaXJ9LyR7ZmlsZX1gIDogZmlsZTtcbiAgICAgICAgICAgIGFsbFJlbGF0aXZlUGF0aHMucHVzaChyZWxQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gRGlyZWN0b3J5IG1pZ2h0IG5vdCBleGlzdCAoZS5nLiwgbm8gc3lzdGVtLyBmb2xkZXIgeWV0KVxuICAgICAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBNZW1vcnlTdG9yYWdlTGF5ZXI6IGZhaWxlZCB0byBsaXN0ICR7YWJzRGlyfWAsIHtcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBTdGF0IGFsbCBmaWxlc1xuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCB0aGlzLmJhY2tlbmQuc3RhdE1hbnkodGhpcy5tZW1vcmllc0RpciwgYWxsUmVsYXRpdmVQYXRocyk7XG5cbiAgICAgIC8vIDQuIERpZmYgYWdhaW5zdCBtYW5pZmVzdFxuICAgICAgY29uc3QgZGlmZiA9IHRoaXMubWFuaWZlc3QuZGlmZihzdGF0cyk7XG5cbiAgICAgIGNvbnN0IGhhc0NoYW5nZXMgPSBkaWZmLmFkZGVkLmxlbmd0aCA+IDAgfHwgZGlmZi5tb2RpZmllZC5sZW5ndGggPiAwIHx8IGRpZmYucmVtb3ZlZC5sZW5ndGggPiAwO1xuICAgICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBNZW1vcnlTdG9yYWdlTGF5ZXIuc2NhbjogRElTSyBTQ0FOIOKAlCAke2FsbFJlbGF0aXZlUGF0aHMubGVuZ3RofSBmaWxlcywgJHtkaWZmLmFkZGVkLmxlbmd0aH0gYWRkZWQsICR7ZGlmZi5tb2RpZmllZC5sZW5ndGh9IG1vZGlmaWVkLCAke2RpZmYucmVtb3ZlZC5sZW5ndGh9IHJlbW92ZWRgKTtcbiAgICAgIH1cblxuICAgICAgLy8gNS4gRm9yIGFkZGVkL21vZGlmaWVkOiByZWFkIGZpbGUsIGV4dHJhY3QgbWV0YWRhdGEsIHVwZGF0ZSBpbmRleFxuICAgICAgY29uc3QgdG9JbmRleCA9IFsuLi5kaWZmLmFkZGVkLCAuLi5kaWZmLm1vZGlmaWVkXTtcbiAgICAgIGxldCBpbmRleFVwZGF0ZWQgPSBmYWxzZTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHRvSW5kZXgubWFwKGFzeW5jIChyZWxQYXRoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgcmVsUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5iYWNrZW5kLnJlYWRGaWxlKGFic1BhdGgpO1xuICAgICAgICAgICAgY29uc3QgZXh0cmFjdGVkID0gTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IuZXh0cmFjdE1ldGFkYXRhKGNvbnRlbnQsIHJlbFBhdGgpO1xuICAgICAgICAgICAgY29uc3QgbWV0YSA9IHN0YXRzLmdldChyZWxQYXRoKTtcblxuICAgICAgICAgICAgdGhpcy5pbmRleC5zZXQoe1xuICAgICAgICAgICAgICBmaWxlUGF0aDogcmVsUGF0aCxcbiAgICAgICAgICAgICAgbmFtZTogZXh0cmFjdGVkLm5hbWUgPz8gJ3VubmFtZWQnLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZXh0cmFjdGVkLmRlc2NyaXB0aW9uID8/ICcnLFxuICAgICAgICAgICAgICB2ZXJzaW9uOiBleHRyYWN0ZWQudmVyc2lvbiA/PyAnMS4wLjAnLFxuICAgICAgICAgICAgICBhdXRob3I6IGV4dHJhY3RlZC5hdXRob3IgPz8gJycsXG4gICAgICAgICAgICAgIHRhZ3M6IGV4dHJhY3RlZC50YWdzID8/IFtdLFxuICAgICAgICAgICAgICBtdGltZU1zOiBtZXRhPy5tdGltZU1zID8/IDAsXG4gICAgICAgICAgICAgIHNpemVCeXRlczogbWV0YT8uc2l6ZUJ5dGVzID8/IDAsXG4gICAgICAgICAgICAgIGF1dG9Mb2FkOiBleHRyYWN0ZWQuYXV0b0xvYWQsXG4gICAgICAgICAgICAgIHByaW9yaXR5OiBleHRyYWN0ZWQucHJpb3JpdHksXG4gICAgICAgICAgICAgIG1lbW9yeVR5cGU6IGV4dHJhY3RlZC5tZW1vcnlUeXBlLFxuICAgICAgICAgICAgICB0b3RhbEVudHJpZXM6IGV4dHJhY3RlZC50b3RhbEVudHJpZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGluZGV4VXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgTWVtb3J5U3RvcmFnZUxheWVyOiBmYWlsZWQgdG8gaW5kZXggJHtyZWxQYXRofWAsIHtcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIDYuIEZvciByZW1vdmVkOiByZW1vdmUgZnJvbSBpbmRleFxuICAgICAgZm9yIChjb25zdCByZWxQYXRoIG9mIGRpZmYucmVtb3ZlZCkge1xuICAgICAgICB0aGlzLmluZGV4LnJlbW92ZShyZWxQYXRoKTtcbiAgICAgICAgaW5kZXhVcGRhdGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gNy4gVXBkYXRlIG1hbmlmZXN0IGFuZCB0aW1lc3RhbXBcbiAgICAgIHRoaXMubWFuaWZlc3QudXBkYXRlKHN0YXRzKTtcbiAgICAgIHRoaXMubGFzdFNjYW5UaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyA4LiBTY2hlZHVsZSBkZWJvdW5jZWQgX2luZGV4Lmpzb24gd3JpdGUgaWYgaW5kZXggY2hhbmdlZFxuICAgICAgaWYgKGluZGV4VXBkYXRlZCkge1xuICAgICAgICB0aGlzLmluZGV4RmlsZS5zY2hlZHVsZVdyaXRlKHRoaXMuaW5kZXguZ2V0QWxsKCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGlmZjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdNZW1vcnlTdG9yYWdlTGF5ZXIucGVyZm9ybVNjYW4gZmFpbGVkJywgZXJyb3IpO1xuICAgICAgdGhpcy5sYXN0U2NhblRpbWVzdGFtcCA9IERhdGUubm93KCk7IC8vIFByZXZlbnQgcmV0cnkgc3Rvcm1zXG4gICAgICByZXR1cm4gRU1QVFlfRElGRjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
package/dist/storage/types.d.ts
CHANGED
|
@@ -62,4 +62,11 @@ export interface ManifestDiffResult {
|
|
|
62
62
|
/** Files whose mtime matches the manifest (no change) */
|
|
63
63
|
unchanged: string[];
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Merge sequential scan results without losing an earlier invalidation when a
|
|
67
|
+
* trailing scan observes the same path as unchanged. Changed categories are
|
|
68
|
+
* intentionally retained as unions; consumers that evict caches must see any
|
|
69
|
+
* modification/removal observed during the freshness window.
|
|
70
|
+
*/
|
|
71
|
+
export declare function mergeManifestDiffResults(first: ManifestDiffResult, second: ManifestDiffResult): ManifestDiffResult;
|
|
65
72
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAGlB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAGlB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,kBAAkB,GACzB,kBAAkB,CAUpB"}
|
package/dist/storage/types.js
CHANGED
|
@@ -4,5 +4,20 @@
|
|
|
4
4
|
* Phase 1: Provides lightweight metadata indexing to avoid
|
|
5
5
|
* full file reads during list() operations.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Merge sequential scan results without losing an earlier invalidation when a
|
|
9
|
+
* trailing scan observes the same path as unchanged. Changed categories are
|
|
10
|
+
* intentionally retained as unions; consumers that evict caches must see any
|
|
11
|
+
* modification/removal observed during the freshness window.
|
|
12
|
+
*/
|
|
13
|
+
export function mergeManifestDiffResults(first, second) {
|
|
14
|
+
const unique = (values) => Array.from(new Set(values));
|
|
15
|
+
const added = unique([...first.added, ...second.added]);
|
|
16
|
+
const modified = unique([...first.modified, ...second.modified]);
|
|
17
|
+
const removed = unique([...first.removed, ...second.removed]);
|
|
18
|
+
const changed = new Set([...added, ...modified, ...removed]);
|
|
19
|
+
const unchanged = unique([...first.unchanged, ...second.unchanged])
|
|
20
|
+
.filter((filePath) => !changed.has(filePath));
|
|
21
|
+
return { added, modified, removed, unchanged };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQWlFSDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsS0FBeUIsRUFDekIsTUFBMEI7SUFFMUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFnQixFQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0UsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDakUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLFFBQVEsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDN0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2hFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0b3JhZ2UgbGF5ZXIgdHlwZXMgZm9yIGNhY2hlLWF3YXJlIGVsZW1lbnQgbGlzdGluZy5cbiAqXG4gKiBQaGFzZSAxOiBQcm92aWRlcyBsaWdodHdlaWdodCBtZXRhZGF0YSBpbmRleGluZyB0byBhdm9pZFxuICogZnVsbCBmaWxlIHJlYWRzIGR1cmluZyBsaXN0KCkgb3BlcmF0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEZpbGVzeXN0ZW0gbWV0YWRhdGEgZm9yIGEgc2luZ2xlIHN0b3JhZ2UgaXRlbS5cbiAqIFJldHVybmVkIGJ5IHN0YXQgb3BlcmF0aW9ucyBvbiB0aGUgc3RvcmFnZSBiYWNrZW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VJdGVtTWV0YWRhdGEge1xuICAvKiogUGF0aCByZWxhdGl2ZSB0byB0aGUgZWxlbWVudCBkaXJlY3RvcnkgKi9cbiAgcmVsYXRpdmVQYXRoOiBzdHJpbmc7XG4gIC8qKiBGdWxseSByZXNvbHZlZCBhYnNvbHV0ZSBwYXRoICovXG4gIGFic29sdXRlUGF0aDogc3RyaW5nO1xuICAvKiogTGFzdCBtb2RpZmljYXRpb24gdGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2ggKi9cbiAgbXRpbWVNczogbnVtYmVyO1xuICAvKiogRmlsZSBzaXplIGluIGJ5dGVzICovXG4gIHNpemVCeXRlczogbnVtYmVyO1xufVxuXG4vKipcbiAqIEluZGV4ZWQgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIGVsZW1lbnQuXG4gKiBFeHRyYWN0ZWQgZnJvbSBmcm9udG1hdHRlciB3aXRob3V0IGxvYWRpbmcgZnVsbCBlbGVtZW50IGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudEluZGV4RW50cnkge1xuICAvKiogUmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGVsZW1lbnQgZGlyZWN0b3J5ICovXG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIC8qKiBFbGVtZW50IG5hbWUgZnJvbSBmcm9udG1hdHRlciAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBFbGVtZW50IGRlc2NyaXB0aW9uIGZyb20gZnJvbnRtYXR0ZXIgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqIFNlbWFudGljIHZlcnNpb24gc3RyaW5nICovXG4gIHZlcnNpb246IHN0cmluZztcbiAgLyoqIEF1dGhvciBuYW1lICovXG4gIGF1dGhvcjogc3RyaW5nO1xuICAvKiogQ2xhc3NpZmljYXRpb24gdGFncyAqL1xuICB0YWdzOiBzdHJpbmdbXTtcbiAgLyoqIExhc3QgbW9kaWZpY2F0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzIChtaXJyb3JzIFN0b3JhZ2VJdGVtTWV0YWRhdGEubXRpbWVNcykgKi9cbiAgbXRpbWVNczogbnVtYmVyO1xuICAvKiogRmlsZSBzaXplIGluIGJ5dGVzIChtaXJyb3JzIFN0b3JhZ2VJdGVtTWV0YWRhdGEuc2l6ZUJ5dGVzKSAqL1xuICBzaXplQnl0ZXM6IG51bWJlcjtcblxuICAvLyBQaGFzZSAyOiBtZW1vcnktc3BlY2lmaWMgb3B0aW9uYWwgZmllbGRzXG4gIC8qKiBXaGV0aGVyIHRoaXMgbWVtb3J5IHNob3VsZCBiZSBhdXRvLWxvYWRlZCBvbiBzZXJ2ZXIgc3RhcnR1cCAqL1xuICBhdXRvTG9hZD86IGJvb2xlYW47XG4gIC8qKiBMb2FkIHByaW9yaXR5IChsb3dlciA9IGhpZ2hlciBwcmlvcml0eSkgKi9cbiAgcHJpb3JpdHk/OiBudW1iZXI7XG4gIC8qKiBNZW1vcnkgdHlwZSBjbGFzc2lmaWNhdGlvbiAoc3lzdGVtLCBhZGFwdGVyLCB1c2VyKSAqL1xuICBtZW1vcnlUeXBlPzogc3RyaW5nO1xuICAvKiogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG1lbW9yeSAqL1xuICB0b3RhbEVudHJpZXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGRpZmZpbmcgY3VycmVudCBmaWxlc3lzdGVtIHN0YXRlIGFnYWluc3QgYSBzdG9yZWQgbWFuaWZlc3QuXG4gKiBFYWNoIGFycmF5IGNvbnRhaW5zIHJlbGF0aXZlIHBhdGhzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hbmlmZXN0RGlmZlJlc3VsdCB7XG4gIC8qKiBGaWxlcyBwcmVzZW50IG9uIGRpc2sgYnV0IG5vdCBpbiBtYW5pZmVzdCAobmV3IGZpbGVzKSAqL1xuICBhZGRlZDogc3RyaW5nW107XG4gIC8qKiBGaWxlcyB3aG9zZSBtdGltZSBjaGFuZ2VkIHNpbmNlIGxhc3QgbWFuaWZlc3Qgc25hcHNob3QgKi9cbiAgbW9kaWZpZWQ6IHN0cmluZ1tdO1xuICAvKiogRmlsZXMgaW4gbWFuaWZlc3QgYnV0IG5vIGxvbmdlciBvbiBkaXNrICovXG4gIHJlbW92ZWQ6IHN0cmluZ1tdO1xuICAvKiogRmlsZXMgd2hvc2UgbXRpbWUgbWF0Y2hlcyB0aGUgbWFuaWZlc3QgKG5vIGNoYW5nZSkgKi9cbiAgdW5jaGFuZ2VkOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBNZXJnZSBzZXF1ZW50aWFsIHNjYW4gcmVzdWx0cyB3aXRob3V0IGxvc2luZyBhbiBlYXJsaWVyIGludmFsaWRhdGlvbiB3aGVuIGFcbiAqIHRyYWlsaW5nIHNjYW4gb2JzZXJ2ZXMgdGhlIHNhbWUgcGF0aCBhcyB1bmNoYW5nZWQuIENoYW5nZWQgY2F0ZWdvcmllcyBhcmVcbiAqIGludGVudGlvbmFsbHkgcmV0YWluZWQgYXMgdW5pb25zOyBjb25zdW1lcnMgdGhhdCBldmljdCBjYWNoZXMgbXVzdCBzZWUgYW55XG4gKiBtb2RpZmljYXRpb24vcmVtb3ZhbCBvYnNlcnZlZCBkdXJpbmcgdGhlIGZyZXNobmVzcyB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU1hbmlmZXN0RGlmZlJlc3VsdHMoXG4gIGZpcnN0OiBNYW5pZmVzdERpZmZSZXN1bHQsXG4gIHNlY29uZDogTWFuaWZlc3REaWZmUmVzdWx0LFxuKTogTWFuaWZlc3REaWZmUmVzdWx0IHtcbiAgY29uc3QgdW5pcXVlID0gKHZhbHVlczogc3RyaW5nW10pOiBzdHJpbmdbXSA9PiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKSk7XG4gIGNvbnN0IGFkZGVkID0gdW5pcXVlKFsuLi5maXJzdC5hZGRlZCwgLi4uc2Vjb25kLmFkZGVkXSk7XG4gIGNvbnN0IG1vZGlmaWVkID0gdW5pcXVlKFsuLi5maXJzdC5tb2RpZmllZCwgLi4uc2Vjb25kLm1vZGlmaWVkXSk7XG4gIGNvbnN0IHJlbW92ZWQgPSB1bmlxdWUoWy4uLmZpcnN0LnJlbW92ZWQsIC4uLnNlY29uZC5yZW1vdmVkXSk7XG4gIGNvbnN0IGNoYW5nZWQgPSBuZXcgU2V0KFsuLi5hZGRlZCwgLi4ubW9kaWZpZWQsIC4uLnJlbW92ZWRdKTtcbiAgY29uc3QgdW5jaGFuZ2VkID0gdW5pcXVlKFsuLi5maXJzdC51bmNoYW5nZWQsIC4uLnNlY29uZC51bmNoYW5nZWRdKVxuICAgIC5maWx0ZXIoKGZpbGVQYXRoKSA9PiAhY2hhbmdlZC5oYXMoZmlsZVBhdGgpKTtcblxuICByZXR1cm4geyBhZGRlZCwgbW9kaWZpZWQsIHJlbW92ZWQsIHVuY2hhbmdlZCB9O1xufVxuIl19
|
package/oauth-helper.mjs
CHANGED
|
@@ -330,6 +330,25 @@ async function writePidFile() {
|
|
|
330
330
|
}
|
|
331
331
|
|
|
332
332
|
async function main() {
|
|
333
|
+
let attempts = 0;
|
|
334
|
+
|
|
335
|
+
// Install termination handling before the first await and before publishing
|
|
336
|
+
// the PID file. Callers use that file as the helper readiness signal.
|
|
337
|
+
process.on('exit', cleanupPidFileSync);
|
|
338
|
+
process.on('beforeExit', async () => {
|
|
339
|
+
await log('OAuth helper completing cleanup');
|
|
340
|
+
await cleanupPidFile();
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
const handleInterruption = () => {
|
|
344
|
+
writeTerminalResultSync('failed', attempts, 'interrupted');
|
|
345
|
+
cleanupStateFileSync();
|
|
346
|
+
cleanupPidFileSync();
|
|
347
|
+
process.exit(1);
|
|
348
|
+
};
|
|
349
|
+
process.once('SIGINT', handleInterruption);
|
|
350
|
+
process.once('SIGTERM', handleInterruption);
|
|
351
|
+
|
|
333
352
|
await log(`[START] OAuth helper started - PID: ${process.pid}`);
|
|
334
353
|
await log('[CONFIG] Device code received');
|
|
335
354
|
await log(`[CONFIG] Poll interval: ${pollIntervalSeconds}s, Expires in: ${expiresIn}s`);
|
|
@@ -349,35 +368,9 @@ async function main() {
|
|
|
349
368
|
|
|
350
369
|
const startTime = Date.now();
|
|
351
370
|
const timeout = startTime + (expiresIn * 1000);
|
|
352
|
-
let attempts = 0;
|
|
353
371
|
let consecutiveErrors = 0;
|
|
354
372
|
let currentPollIntervalMs = pollIntervalSeconds * 1000;
|
|
355
373
|
const MAX_CONSECUTIVE_ERRORS = 5;
|
|
356
|
-
|
|
357
|
-
// Set up cleanup on exit - use synchronous cleanup for exit event
|
|
358
|
-
process.on('exit', () => {
|
|
359
|
-
cleanupPidFileSync();
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
// Use beforeExit for async cleanup when possible
|
|
363
|
-
process.on('beforeExit', async () => {
|
|
364
|
-
await log('OAuth helper completing cleanup');
|
|
365
|
-
await cleanupPidFile();
|
|
366
|
-
});
|
|
367
|
-
|
|
368
|
-
process.on('SIGINT', () => {
|
|
369
|
-
writeTerminalResultSync('failed', attempts, 'interrupted');
|
|
370
|
-
cleanupStateFileSync();
|
|
371
|
-
cleanupPidFileSync();
|
|
372
|
-
process.exit(1);
|
|
373
|
-
});
|
|
374
|
-
|
|
375
|
-
process.on('SIGTERM', () => {
|
|
376
|
-
writeTerminalResultSync('failed', attempts, 'interrupted');
|
|
377
|
-
cleanupStateFileSync();
|
|
378
|
-
cleanupPidFileSync();
|
|
379
|
-
process.exit(1);
|
|
380
|
-
});
|
|
381
374
|
|
|
382
375
|
async function finish(status, errorCode, exitCode) {
|
|
383
376
|
clearInterval(heartbeatInterval);
|