@dbx-tools/appkit 0.9.118 → 0.9.119
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -21
- package/index.ts +4 -1
- package/lib/index.d.ts +4 -1
- package/lib/index.js +4 -2
- package/lib/src/appkit.js +15 -20
- package/lib/src/{_cache-storage.d.ts → cache-storage.d.ts} +28 -16
- package/lib/src/cache-storage.js +276 -0
- package/lib/src/files-cache.d.ts +2 -4
- package/lib/src/files-cache.js +38 -37
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -9
- package/src/appkit.ts +14 -21
- package/src/{_cache-storage.ts → cache-storage.ts} +136 -69
- package/src/files-cache.ts +37 -43
- package/lib/src/_cache-storage.js +0 -235
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory-first AppKit cache storage with soft-fail Lakebase persistence.
|
|
3
|
+
*
|
|
4
|
+
* AppKit's `PersistentStorage.initialize()` runs DDL migrations and throws on
|
|
5
|
+
* any step failure. With `cache.strictPersistence: true` that throw makes
|
|
6
|
+
* `CacheManager` silently disable the cache. This wraps the same storage,
|
|
7
|
+
* still runs its migrations, but logs a failed step instead of throwing so a
|
|
8
|
+
* usable table keeps serving.
|
|
9
|
+
*
|
|
10
|
+
* `PersistentStorage` is not on AppKit's public export map. The deep load is
|
|
11
|
+
* lazy and best-effort: if the installed AppKit layout changes, Lakebase is
|
|
12
|
+
* skipped and the adapter keeps its project-scoped disk persistence.
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
import { EventEmitter } from "node:events";
|
|
17
|
+
import { createRequire } from "node:module";
|
|
18
|
+
import { dirname, join } from "node:path";
|
|
19
|
+
import { createLakebasePool, getWorkspaceClient } from "@databricks/appkit";
|
|
20
|
+
import { closeCache, createCache, flushCache, projectCache, } from "@dbx-tools/cache/cache";
|
|
21
|
+
import { postgresConnectionOptions } from "@dbx-tools/postgres";
|
|
22
|
+
import { errorUtils, hash, log } from "@dbx-tools/shared-core";
|
|
23
|
+
import { handleOwnershipMigrationError } from "./migration.js";
|
|
24
|
+
const logger = log.logger("cache-storage");
|
|
25
|
+
let persistentStorageCtor = null;
|
|
26
|
+
class AppKitStorageLevel extends EventEmitter {
|
|
27
|
+
storage;
|
|
28
|
+
opts = {};
|
|
29
|
+
constructor(storage) {
|
|
30
|
+
super();
|
|
31
|
+
this.storage = storage;
|
|
32
|
+
}
|
|
33
|
+
async get(key) {
|
|
34
|
+
const entry = await this.storage.get(key);
|
|
35
|
+
if (!entry)
|
|
36
|
+
return undefined;
|
|
37
|
+
if (entry.expiry <= Date.now()) {
|
|
38
|
+
await this.storage.delete(key);
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
return entry.value;
|
|
42
|
+
}
|
|
43
|
+
async set(key, value, ttl) {
|
|
44
|
+
await this.storage.set(key, {
|
|
45
|
+
value,
|
|
46
|
+
expiry: Date.now() + (ttl ?? 60_000),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async delete(key) {
|
|
50
|
+
await this.storage.delete(key);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
clear() {
|
|
54
|
+
return this.storage.clear();
|
|
55
|
+
}
|
|
56
|
+
has(key) {
|
|
57
|
+
return this.storage.has(key);
|
|
58
|
+
}
|
|
59
|
+
disconnect() {
|
|
60
|
+
return this.storage.close();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Memory-first AppKit CacheStorage backed by @dbx-tools/cache. */
|
|
64
|
+
export class AppKitCacheStorage {
|
|
65
|
+
persistent;
|
|
66
|
+
cache;
|
|
67
|
+
keys = new Set();
|
|
68
|
+
closed = false;
|
|
69
|
+
constructor(cache, persistent) {
|
|
70
|
+
this.persistent = persistent;
|
|
71
|
+
this.cache = cache;
|
|
72
|
+
}
|
|
73
|
+
async get(key) {
|
|
74
|
+
const entry = await this.cache.get(key);
|
|
75
|
+
if (!entry)
|
|
76
|
+
return null;
|
|
77
|
+
this.keys.add(key);
|
|
78
|
+
return entry;
|
|
79
|
+
}
|
|
80
|
+
async set(key, entry) {
|
|
81
|
+
const ttl = entry.expiry - Date.now();
|
|
82
|
+
if (ttl <= 0) {
|
|
83
|
+
await this.delete(key);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
await this.cache.set(key, entry, { ttl });
|
|
87
|
+
this.keys.add(key);
|
|
88
|
+
}
|
|
89
|
+
async delete(key) {
|
|
90
|
+
await this.cache.delete(key);
|
|
91
|
+
this.keys.delete(key);
|
|
92
|
+
}
|
|
93
|
+
async clear() {
|
|
94
|
+
await this.cache.clear();
|
|
95
|
+
this.keys.clear();
|
|
96
|
+
}
|
|
97
|
+
async has(key) {
|
|
98
|
+
return this.cache.has(key);
|
|
99
|
+
}
|
|
100
|
+
async size() {
|
|
101
|
+
return this.persistent ? this.persistent.size() : this.keys.size;
|
|
102
|
+
}
|
|
103
|
+
isPersistent() {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
async healthCheck() {
|
|
107
|
+
return this.persistent ? this.persistent.healthCheck() : true;
|
|
108
|
+
}
|
|
109
|
+
/** Drain tracked write-behind persistence without closing the storage. */
|
|
110
|
+
flush() {
|
|
111
|
+
return flushCache(this.cache);
|
|
112
|
+
}
|
|
113
|
+
async close() {
|
|
114
|
+
if (this.closed)
|
|
115
|
+
return;
|
|
116
|
+
await closeCache(this.cache);
|
|
117
|
+
this.closed = true;
|
|
118
|
+
this.keys.clear();
|
|
119
|
+
}
|
|
120
|
+
/** Forward AppKit's runtime-only persistent cleanup hook when available. */
|
|
121
|
+
async cleanupExpired() {
|
|
122
|
+
const cleanup = this.persistent?.cleanupExpired;
|
|
123
|
+
return cleanup && this.persistent ? cleanup.call(this.persistent) : 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Lazily resolve AppKit's internal `PersistentStorage` constructor. `null`
|
|
128
|
+
* means not attempted yet; `undefined` means the lookup already failed.
|
|
129
|
+
*/
|
|
130
|
+
export function loadPersistentStorage() {
|
|
131
|
+
if (persistentStorageCtor !== null) {
|
|
132
|
+
return persistentStorageCtor;
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
const require = createRequire(import.meta.url);
|
|
136
|
+
const modulePath = join(dirname(require.resolve("@databricks/appkit")), "cache/storage/persistent.js");
|
|
137
|
+
const loaded = require(modulePath).PersistentStorage;
|
|
138
|
+
if (typeof loaded !== "function") {
|
|
139
|
+
logger.debug("soft persistent cache skipped (PersistentStorage missing)");
|
|
140
|
+
persistentStorageCtor = undefined;
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
persistentStorageCtor = loaded;
|
|
144
|
+
return loaded;
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
logger.debug("soft persistent cache skipped (PersistentStorage unavailable)", {
|
|
148
|
+
error: errorUtils.errorMessage(err),
|
|
149
|
+
});
|
|
150
|
+
persistentStorageCtor = undefined;
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Whether an existing cache table belongs to another role.
|
|
156
|
+
*
|
|
157
|
+
* PostgreSQL allows granted reads/writes but reserves index DDL for the table
|
|
158
|
+
* owner. Skip AppKit migrations in that case; {@link probeStorage} still proves
|
|
159
|
+
* the existing table can serve the cache before it is accepted.
|
|
160
|
+
*/
|
|
161
|
+
async function tableOwnedByAnotherRole(storage, pool) {
|
|
162
|
+
if (!storage.schemaName || !storage.tableName)
|
|
163
|
+
return false;
|
|
164
|
+
const result = await pool.query(`SELECT pg_get_userbyid(c.relowner) = current_user AS owned
|
|
165
|
+
FROM pg_class c
|
|
166
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
167
|
+
WHERE n.nspname = $1 AND c.relname = $2 AND c.relkind IN ('r', 'p')`, [storage.schemaName, storage.tableName]);
|
|
168
|
+
if (result.rows[0]?.owned !== false)
|
|
169
|
+
return false;
|
|
170
|
+
logger.warn("persistent cache migrations skipped (table owned by another role)", {
|
|
171
|
+
schema: storage.schemaName,
|
|
172
|
+
table: storage.tableName,
|
|
173
|
+
});
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
/** Soften `initialize()` so an ownership-only migration failure is not fatal. */
|
|
177
|
+
export function softenInitialize(storage, skipMigrations) {
|
|
178
|
+
const originalInitialize = storage.initialize.bind(storage);
|
|
179
|
+
let softInitPromise;
|
|
180
|
+
storage.initialize = async () => {
|
|
181
|
+
if (storage.initialized)
|
|
182
|
+
return;
|
|
183
|
+
softInitPromise ??= (async () => {
|
|
184
|
+
try {
|
|
185
|
+
if (!(await skipMigrations?.()))
|
|
186
|
+
await originalInitialize();
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
if (!handleOwnershipMigrationError(err, {
|
|
190
|
+
scope: "cache-storage",
|
|
191
|
+
logger,
|
|
192
|
+
event: "persistent cache migration failed",
|
|
193
|
+
})) {
|
|
194
|
+
throw err;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
})();
|
|
198
|
+
try {
|
|
199
|
+
await softInitPromise;
|
|
200
|
+
storage.initialized = true;
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
softInitPromise = undefined;
|
|
204
|
+
throw err;
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/** Verify the migrated cache table can serve the reads and writes AppKit needs. */
|
|
209
|
+
export async function probeStorage(storage) {
|
|
210
|
+
const key = `dbx-tools:cache-probe:${hash.id()}`;
|
|
211
|
+
try {
|
|
212
|
+
await storage.set(key, { value: key, expiry: Date.now() + 60_000 });
|
|
213
|
+
const result = await storage.get(key);
|
|
214
|
+
if (result?.value !== key) {
|
|
215
|
+
throw new Error("persistent cache probe returned an unexpected value");
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
await storage.delete(key).catch(() => undefined);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Build a soft-fail Lakebase cache storage when a pool can be created and
|
|
224
|
+
* AppKit's PersistentStorage can be loaded. Returns `undefined` otherwise so
|
|
225
|
+
* the caller can use portable disk persistence.
|
|
226
|
+
*/
|
|
227
|
+
async function createPersistentStorage(cache) {
|
|
228
|
+
const PersistentStorage = loadPersistentStorage();
|
|
229
|
+
if (!PersistentStorage) {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
let pool;
|
|
233
|
+
try {
|
|
234
|
+
const createdPool = createLakebasePool(postgresConnectionOptions({ workspaceClient: getWorkspaceClient({}) }));
|
|
235
|
+
pool = createdPool;
|
|
236
|
+
const storage = new PersistentStorage(cache ?? {}, createdPool);
|
|
237
|
+
softenInitialize(storage, () => tableOwnedByAnotherRole(storage, createdPool));
|
|
238
|
+
if (!(await storage.healthCheck())) {
|
|
239
|
+
await storage.close().catch(() => { });
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
await storage.initialize();
|
|
243
|
+
await probeStorage(storage);
|
|
244
|
+
return storage;
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
logger.debug("soft persistent cache unavailable", {
|
|
248
|
+
error: errorUtils.errorMessage(err),
|
|
249
|
+
});
|
|
250
|
+
if (pool) {
|
|
251
|
+
await pool.end().catch(() => { });
|
|
252
|
+
}
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Create AppKit CacheStorage with bounded memory first and tracked persistence.
|
|
258
|
+
* Lakebase remains AppKit's persistent owner when available; otherwise the
|
|
259
|
+
* shared project-scoped portable disk level is used.
|
|
260
|
+
*/
|
|
261
|
+
export async function createAppKitCacheStorage(options = {}) {
|
|
262
|
+
const nativeCache = options.cache;
|
|
263
|
+
const persistent = options.preferLakebase === false ? undefined : await createPersistentStorage(nativeCache);
|
|
264
|
+
const common = {
|
|
265
|
+
maxEntries: options.maxEntries ?? nativeCache?.maxSize,
|
|
266
|
+
writeDelayMs: options.writeDelayMs,
|
|
267
|
+
};
|
|
268
|
+
const cache = persistent
|
|
269
|
+
? createCache({
|
|
270
|
+
...common,
|
|
271
|
+
levels: [{ name: "appkit-persistent", store: new AppKitStorageLevel(persistent) }],
|
|
272
|
+
})
|
|
273
|
+
: projectCache(options.diskScope ?? "appkit", common);
|
|
274
|
+
return new AppKitCacheStorage(cache, persistent);
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYWNoZS1zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBb0IsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RixPQUFPLEVBQ0wsVUFBVSxFQUNWLFdBQVcsRUFDWCxVQUFVLEVBQ1YsWUFBWSxHQUViLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0QsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQXNDM0MsSUFBSSxxQkFBcUIsR0FBb0QsSUFBSSxDQUFDO0FBRWxGLE1BQU0sa0JBQW1CLFNBQVEsWUFBWTtJQUdkO0lBRnBCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFbkIsWUFBNkIsT0FBcUI7UUFDaEQsS0FBSyxFQUFFLENBQUM7UUFEbUIsWUFBTyxHQUFQLE9BQU8sQ0FBYztJQUVsRCxDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBSSxHQUFXO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUksR0FBRyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFD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QXdCLENBQzVDLFVBQXFDLEVBQUU7SUFFdkMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNsQyxNQUFNLFVBQVUsR0FDZCxPQUFPLENBQUMsY0FBYyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVGLE1BQU0sTUFBTSxHQUFpQjtRQUMzQixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsSUFBSSxXQUFXLEVBQUUsT0FBTztRQUN0RCxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7S0FDbkMsQ0FBQztJQUNGLE1BQU0sS0FBSyxHQUFHLFVBQVU7UUFDdEIsQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUNWLEdBQUcsTUFBTTtZQUNULE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxJQUFJLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7U0FDbkYsQ0FBQztRQUNKLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEQsT0FBTyxJQUFJLGtCQUFrQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZW1vcnktZmlyc3QgQXBwS2l0IGNhY2hlIHN0b3JhZ2Ugd2l0aCBzb2Z0LWZhaWwgTGFrZWJhc2UgcGVyc2lzdGVuY2UuXG4gKlxuICogQXBwS2l0J3MgYFBlcnNpc3RlbnRTdG9yYWdlLmluaXRpYWxpemUoKWAgcnVucyBEREwgbWlncmF0aW9ucyBhbmQgdGhyb3dzIG9uXG4gKiBhbnkgc3RlcCBmYWlsdXJlLiBXaXRoIGBjYWNoZS5zdHJpY3RQZXJzaXN0ZW5jZTogdHJ1ZWAgdGhhdCB0aHJvdyBtYWtlc1xuICogYENhY2hlTWFuYWdlcmAgc2lsZW50bHkgZGlzYWJsZSB0aGUgY2FjaGUuIFRoaXMgd3JhcHMgdGhlIHNhbWUgc3RvcmFnZSxcbiAqIHN0aWxsIHJ1bnMgaXRzIG1pZ3JhdGlvbnMsIGJ1dCBsb2dzIGEgZmFpbGVkIHN0ZXAgaW5zdGVhZCBvZiB0aHJvd2luZyBzbyBhXG4gKiB1c2FibGUgdGFibGUga2VlcHMgc2VydmluZy5cbiAqXG4gKiBgUGVyc2lzdGVudFN0b3JhZ2VgIGlzIG5vdCBvbiBBcHBLaXQncyBwdWJsaWMgZXhwb3J0IG1hcC4gVGhlIGRlZXAgbG9hZCBpc1xuICogbGF6eSBhbmQgYmVzdC1lZmZvcnQ6IGlmIHRoZSBpbnN0YWxsZWQgQXBwS2l0IGxheW91dCBjaGFuZ2VzLCBMYWtlYmFzZSBpc1xuICogc2tpcHBlZCBhbmQgdGhlIGFkYXB0ZXIga2VlcHMgaXRzIHByb2plY3Qtc2NvcGVkIGRpc2sgcGVyc2lzdGVuY2UuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGNyZWF0ZUxha2ViYXNlUG9vbCwgZ2V0V29ya3NwYWNlQ2xpZW50LCB0eXBlIENhY2hlQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgY2xvc2VDYWNoZSxcbiAgY3JlYXRlQ2FjaGUsXG4gIGZsdXNoQ2FjaGUsXG4gIHByb2plY3RDYWNoZSxcbiAgdHlwZSBDYWNoZU9wdGlvbnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL2NhY2hlL2NhY2hlXCI7XG5pbXBvcnQgeyBwb3N0Z3Jlc0Nvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGhhc2gsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBoYW5kbGVPd25lcnNoaXBNaWdyYXRpb25FcnJvciB9IGZyb20gXCIuL21pZ3JhdGlvbi50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiY2FjaGUtc3RvcmFnZVwiKTtcblxudHlwZSBMYWtlYmFzZVBvb2wgPSBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVMYWtlYmFzZVBvb2w+O1xudHlwZSBDYWNoZVN0b3JhZ2UgPSBOb25OdWxsYWJsZTxDYWNoZUNvbmZpZ1tcInN0b3JhZ2VcIl0+O1xuXG5pbnRlcmZhY2UgQ2FjaGVFbnRyeTxUID0gdW5rbm93bj4ge1xuICBleHBpcnk6IG51bWJlcjtcbiAgdmFsdWU6IFQ7XG59XG5cbi8qKiBPcHRpb25zIGZvciBBcHBLaXQncyBtZW1vcnktZmlyc3QgY2FjaGUgc3RvcmFnZSBhZGFwdGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBLaXRDYWNoZVN0b3JhZ2VPcHRpb25zIHtcbiAgLyoqIE5hdGl2ZSBBcHBLaXQgY2FjaGUgY29uZmlndXJhdGlvbi4gKi9cbiAgY2FjaGU/OiBDYWNoZUNvbmZpZztcbiAgLyoqIFdoZXRoZXIgdG8gYXR0ZW1wdCBBcHBLaXQncyBMYWtlYmFzZSBQZXJzaXN0ZW50U3RvcmFnZS4gRGVmYXVsdHMgdG8gdHJ1ZS4gKi9cbiAgcHJlZmVyTGFrZWJhc2U/OiBib29sZWFuO1xuICAvKiogUG9ydGFibGUgZGlzayBzY29wZSB1c2VkIHdoZW4gTGFrZWJhc2UgaXMgdW5hdmFpbGFibGUuICovXG4gIGRpc2tTY29wZT86IHN0cmluZztcbiAgLyoqIFdyaXRlLWJlaGluZCBjb2FsZXNjaW5nIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gKi9cbiAgd3JpdGVEZWxheU1zPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSBlbnRyaWVzIHJldGFpbmVkIGluIHRoZSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBwcmltYXJ5LiAqL1xuICBtYXhFbnRyaWVzPzogbnVtYmVyO1xufVxuXG4vKiogQXBwS2l0J3MgaW50ZXJuYWwgcGVyc2lzdGVudCBzdG9yYWdlIHN1cmZhY2UuICovXG5leHBvcnQgdHlwZSBQZXJzaXN0ZW50U3RvcmFnZUJhc2UgPSBDYWNoZVN0b3JhZ2UgJiB7XG4gIGNsZWFudXBFeHBpcmVkPygpOiBQcm9taXNlPG51bWJlcj47XG4gIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPjtcbiAgaW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIHNjaGVtYU5hbWU/OiBzdHJpbmc7XG4gIHRhYmxlTmFtZT86IHN0cmluZztcbn07XG5cbnR5cGUgUGVyc2lzdGVudFN0b3JhZ2VDb25zdHJ1Y3RvciA9IG5ldyAoXG4gIGNvbmZpZzogQ2FjaGVDb25maWcsXG4gIHBvb2w6IExha2ViYXNlUG9vbCxcbikgPT4gUGVyc2lzdGVudFN0b3JhZ2VCYXNlO1xuXG5sZXQgcGVyc2lzdGVudFN0b3JhZ2VDdG9yOiBQZXJzaXN0ZW50U3RvcmFnZUNvbnN0cnVjdG9yIHwgdW5kZWZpbmVkIHwgbnVsbCA9IG51bGw7XG5cbmNsYXNzIEFwcEtpdFN0b3JhZ2VMZXZlbCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHJlYWRvbmx5IG9wdHMgPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2U6IENhY2hlU3RvcmFnZSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBhc3luYyBnZXQ8VD4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQ8VD4oa2V5KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChlbnRyeS5leHBpcnkgPD0gRGF0ZS5ub3coKSkge1xuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xuICB9XG5cbiAgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgdHRsPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zdG9yYWdlLnNldChrZXksIHtcbiAgICAgIHZhbHVlLFxuICAgICAgZXhwaXJ5OiBEYXRlLm5vdygpICsgKHR0bCA/PyA2MF8wMDApLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgYXdhaXQgdGhpcy5zdG9yYWdlLmRlbGV0ZShrZXkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5jbGVhcigpO1xuICB9XG5cbiAgaGFzKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5oYXMoa2V5KTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5jbG9zZSgpO1xuICB9XG59XG5cbi8qKiBNZW1vcnktZmlyc3QgQXBwS2l0IENhY2hlU3RvcmFnZSBiYWNrZWQgYnkgQGRieC10b29scy9jYWNoZS4gKi9cbmV4cG9ydCBjbGFzcyBBcHBLaXRDYWNoZVN0b3JhZ2UgaW1wbGVtZW50cyBDYWNoZVN0b3JhZ2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDYWNoZT47XG4gIHByaXZhdGUgcmVhZG9ubHkga2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNhY2hlOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDYWNoZT4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBwZXJzaXN0ZW50OiBDYWNoZVN0b3JhZ2UgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIHRoaXMuY2FjaGUgPSBjYWNoZTtcbiAgfVxuXG4gIGFzeW5jIGdldDxUPihrZXk6IHN0cmluZyk6IFByb21pc2U8Q2FjaGVFbnRyeTxUPiB8IG51bGw+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuY2FjaGUuZ2V0PENhY2hlRW50cnk8VD4+KGtleSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5rZXlzLmFkZChrZXkpO1xuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIGFzeW5jIHNldDxUPihrZXk6IHN0cmluZywgZW50cnk6IENhY2hlRW50cnk8VD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0dGwgPSBlbnRyeS5leHBpcnkgLSBEYXRlLm5vdygpO1xuICAgIGlmICh0dGwgPD0gMCkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGUoa2V5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jYWNoZS5zZXQoa2V5LCBlbnRyeSwgeyB0dGwgfSk7XG4gICAgdGhpcy5rZXlzLmFkZChrZXkpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICB0aGlzLmtleXMuZGVsZXRlKGtleSk7XG4gIH1cblxuICBhc3luYyBjbGVhcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5rZXlzLmNsZWFyKCk7XG4gIH1cblxuICBhc3luYyBoYXMoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5oYXMoa2V5KTtcbiAgfVxuXG4gIGFzeW5jIHNpemUoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW50ID8gdGhpcy5wZXJzaXN0ZW50LnNpemUoKSA6IHRoaXMua2V5cy5zaXplO1xuICB9XG5cbiAgaXNQZXJzaXN0ZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgaGVhbHRoQ2hlY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucGVyc2lzdGVudCA/IHRoaXMucGVyc2lzdGVudC5oZWFsdGhDaGVjaygpIDogdHJ1ZTtcbiAgfVxuXG4gIC8qKiBEcmFpbiB0cmFja2VkIHdyaXRlLWJlaGluZCBwZXJzaXN0ZW5jZSB3aXRob3V0IGNsb3NpbmcgdGhlIHN0b3JhZ2UuICovXG4gIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBmbHVzaENhY2hlKHRoaXMuY2FjaGUpO1xuICB9XG5cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm47XG4gICAgYXdhaXQgY2xvc2VDYWNoZSh0aGlzLmNhY2hlKTtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgdGhpcy5rZXlzLmNsZWFyKCk7XG4gIH1cblxuICAvKiogRm9yd2FyZCBBcHBLaXQncyBydW50aW1lLW9ubHkgcGVyc2lzdGVudCBjbGVhbnVwIGhvb2sgd2hlbiBhdmFpbGFibGUuICovXG4gIGFzeW5jIGNsZWFudXBFeHBpcmVkKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY2xlYW51cCA9IChcbiAgICAgIHRoaXMucGVyc2lzdGVudCBhc1xuICAgICAgICB8IChDYWNoZVN0b3JhZ2UgJiB7XG4gICAgICAgICAgICBjbGVhbnVwRXhwaXJlZD86ICgpID0+IFByb21pc2U8bnVtYmVyPjtcbiAgICAgICAgICB9KVxuICAgICAgICB8IHVuZGVmaW5lZFxuICAgICk/LmNsZWFudXBFeHBpcmVkO1xuICAgIHJldHVybiBjbGVhbnVwICYmIHRoaXMucGVyc2lzdGVudCA/IGNsZWFudXAuY2FsbCh0aGlzLnBlcnNpc3RlbnQpIDogMDtcbiAgfVxufVxuXG4vKipcbiAqIExhemlseSByZXNvbHZlIEFwcEtpdCdzIGludGVybmFsIGBQZXJzaXN0ZW50U3RvcmFnZWAgY29uc3RydWN0b3IuIGBudWxsYFxuICogbWVhbnMgbm90IGF0dGVtcHRlZCB5ZXQ7IGB1bmRlZmluZWRgIG1lYW5zIHRoZSBsb29rdXAgYWxyZWFkeSBmYWlsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUGVyc2lzdGVudFN0b3JhZ2UoKTogUGVyc2lzdGVudFN0b3JhZ2VDb25zdHJ1Y3RvciB8IHVuZGVmaW5lZCB7XG4gIGlmIChwZXJzaXN0ZW50U3RvcmFnZUN0b3IgIT09IG51bGwpIHtcbiAgICByZXR1cm4gcGVyc2lzdGVudFN0b3JhZ2VDdG9yO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICBjb25zdCBtb2R1bGVQYXRoID0gam9pbihcbiAgICAgIGRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKFwiQGRhdGFicmlja3MvYXBwa2l0XCIpKSxcbiAgICAgIFwiY2FjaGUvc3RvcmFnZS9wZXJzaXN0ZW50LmpzXCIsXG4gICAgKTtcbiAgICBjb25zdCBsb2FkZWQgPSByZXF1aXJlKG1vZHVsZVBhdGgpLlBlcnNpc3RlbnRTdG9yYWdlIGFzXG4gICAgICBQZXJzaXN0ZW50U3RvcmFnZUNvbnN0cnVjdG9yIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgbG9hZGVkICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNvZnQgcGVyc2lzdGVudCBjYWNoZSBza2lwcGVkIChQZXJzaXN0ZW50U3RvcmFnZSBtaXNzaW5nKVwiKTtcbiAgICAgIHBlcnNpc3RlbnRTdG9yYWdlQ3RvciA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHBlcnNpc3RlbnRTdG9yYWdlQ3RvciA9IGxvYWRlZDtcbiAgICByZXR1cm4gbG9hZGVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJzb2Z0IHBlcnNpc3RlbnQgY2FjaGUgc2tpcHBlZCAoUGVyc2lzdGVudFN0b3JhZ2UgdW5hdmFpbGFibGUpXCIsIHtcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICAgIHBlcnNpc3RlbnRTdG9yYWdlQ3RvciA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBleGlzdGluZyBjYWNoZSB0YWJsZSBiZWxvbmdzIHRvIGFub3RoZXIgcm9sZS5cbiAqXG4gKiBQb3N0Z3JlU1FMIGFsbG93cyBncmFudGVkIHJlYWRzL3dyaXRlcyBidXQgcmVzZXJ2ZXMgaW5kZXggRERMIGZvciB0aGUgdGFibGVcbiAqIG93bmVyLiBTa2lwIEFwcEtpdCBtaWdyYXRpb25zIGluIHRoYXQgY2FzZTsge0BsaW5rIHByb2JlU3RvcmFnZX0gc3RpbGwgcHJvdmVzXG4gKiB0aGUgZXhpc3RpbmcgdGFibGUgY2FuIHNlcnZlIHRoZSBjYWNoZSBiZWZvcmUgaXQgaXMgYWNjZXB0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRhYmxlT3duZWRCeUFub3RoZXJSb2xlKFxuICBzdG9yYWdlOiBQZXJzaXN0ZW50U3RvcmFnZUJhc2UsXG4gIHBvb2w6IExha2ViYXNlUG9vbCxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoIXN0b3JhZ2Uuc2NoZW1hTmFtZSB8fCAhc3RvcmFnZS50YWJsZU5hbWUpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9vbC5xdWVyeShcbiAgICBgU0VMRUNUIHBnX2dldF91c2VyYnlpZChjLnJlbG93bmVyKSA9IGN1cnJlbnRfdXNlciBBUyBvd25lZFxuICAgICBGUk9NIHBnX2NsYXNzIGNcbiAgICAgSk9JTiBwZ19uYW1lc3BhY2UgbiBPTiBuLm9pZCA9IGMucmVsbmFtZXNwYWNlXG4gICAgIFdIRVJFIG4ubnNwbmFtZSA9ICQxIEFORCBjLnJlbG5hbWUgPSAkMiBBTkQgYy5yZWxraW5kIElOICgncicsICdwJylgLFxuICAgIFtzdG9yYWdlLnNjaGVtYU5hbWUsIHN0b3JhZ2UudGFibGVOYW1lXSxcbiAgKTtcbiAgaWYgKHJlc3VsdC5yb3dzWzBdPy5vd25lZCAhPT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgbG9nZ2VyLndhcm4oXCJwZXJzaXN0ZW50IGNhY2hlIG1pZ3JhdGlvbnMgc2tpcHBlZCAodGFibGUgb3duZWQgYnkgYW5vdGhlciByb2xlKVwiLCB7XG4gICAgc2NoZW1hOiBzdG9yYWdlLnNjaGVtYU5hbWUsXG4gICAgdGFibGU6IHN0b3JhZ2UudGFibGVOYW1lLFxuICB9KTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBTb2Z0ZW4gYGluaXRpYWxpemUoKWAgc28gYW4gb3duZXJzaGlwLW9ubHkgbWlncmF0aW9uIGZhaWx1cmUgaXMgbm90IGZhdGFsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvZnRlbkluaXRpYWxpemUoXG4gIHN0b3JhZ2U6IFBlcnNpc3RlbnRTdG9yYWdlQmFzZSxcbiAgc2tpcE1pZ3JhdGlvbnM/OiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+LFxuKTogdm9pZCB7XG4gIGNvbnN0IG9yaWdpbmFsSW5pdGlhbGl6ZSA9IHN0b3JhZ2UuaW5pdGlhbGl6ZS5iaW5kKHN0b3JhZ2UpO1xuICBsZXQgc29mdEluaXRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIHN0b3JhZ2UuaW5pdGlhbGl6ZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoc3RvcmFnZS5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHNvZnRJbml0UHJvbWlzZSA/Pz0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghKGF3YWl0IHNraXBNaWdyYXRpb25zPy4oKSkpIGF3YWl0IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhaGFuZGxlT3duZXJzaGlwTWlncmF0aW9uRXJyb3IoZXJyLCB7XG4gICAgICAgICAgICBzY29wZTogXCJjYWNoZS1zdG9yYWdlXCIsXG4gICAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgICBldmVudDogXCJwZXJzaXN0ZW50IGNhY2hlIG1pZ3JhdGlvbiBmYWlsZWRcIixcbiAgICAgICAgICB9KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzb2Z0SW5pdFByb21pc2U7XG4gICAgICBzdG9yYWdlLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNvZnRJbml0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH07XG59XG5cbi8qKiBWZXJpZnkgdGhlIG1pZ3JhdGVkIGNhY2hlIHRhYmxlIGNhbiBzZXJ2ZSB0aGUgcmVhZHMgYW5kIHdyaXRlcyBBcHBLaXQgbmVlZHMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvYmVTdG9yYWdlKHN0b3JhZ2U6IFBlcnNpc3RlbnRTdG9yYWdlQmFzZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBrZXkgPSBgZGJ4LXRvb2xzOmNhY2hlLXByb2JlOiR7aGFzaC5pZCgpfWA7XG4gIHRyeSB7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQoa2V5LCB7IHZhbHVlOiBrZXksIGV4cGlyeTogRGF0ZS5ub3coKSArIDYwXzAwMCB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLmdldChrZXkpO1xuICAgIGlmIChyZXN1bHQ/LnZhbHVlICE9PSBrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInBlcnNpc3RlbnQgY2FjaGUgcHJvYmUgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCB2YWx1ZVwiKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgc3RvcmFnZS5kZWxldGUoa2V5KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgYSBzb2Z0LWZhaWwgTGFrZWJhc2UgY2FjaGUgc3RvcmFnZSB3aGVuIGEgcG9vbCBjYW4gYmUgY3JlYXRlZCBhbmRcbiAqIEFwcEtpdCdzIFBlcnNpc3RlbnRTdG9yYWdlIGNhbiBiZSBsb2FkZWQuIFJldHVybnMgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlIHNvXG4gKiB0aGUgY2FsbGVyIGNhbiB1c2UgcG9ydGFibGUgZGlzayBwZXJzaXN0ZW5jZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlUGVyc2lzdGVudFN0b3JhZ2UoXG4gIGNhY2hlOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8Q2FjaGVTdG9yYWdlIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFBlcnNpc3RlbnRTdG9yYWdlID0gbG9hZFBlcnNpc3RlbnRTdG9yYWdlKCk7XG4gIGlmICghUGVyc2lzdGVudFN0b3JhZ2UpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IHBvb2w6IExha2ViYXNlUG9vbCB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBjcmVhdGVkUG9vbCA9IGNyZWF0ZUxha2ViYXNlUG9vbChcbiAgICAgIHBvc3RncmVzQ29ubmVjdGlvbk9wdGlvbnMoeyB3b3Jrc3BhY2VDbGllbnQ6IGdldFdvcmtzcGFjZUNsaWVudCh7fSkgfSksXG4gICAgKTtcbiAgICBwb29sID0gY3JlYXRlZFBvb2w7XG4gICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBQZXJzaXN0ZW50U3RvcmFnZShjYWNoZSA/PyB7fSwgY3JlYXRlZFBvb2wpO1xuICAgIHNvZnRlbkluaXRpYWxpemUoc3RvcmFnZSwgKCkgPT4gdGFibGVPd25lZEJ5QW5vdGhlclJvbGUoc3RvcmFnZSwgY3JlYXRlZFBvb2wpKTtcbiAgICBpZiAoIShhd2FpdCBzdG9yYWdlLmhlYWx0aENoZWNrKCkpKSB7XG4gICAgICBhd2FpdCBzdG9yYWdlLmNsb3NlKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgYXdhaXQgc3RvcmFnZS5pbml0aWFsaXplKCk7XG4gICAgYXdhaXQgcHJvYmVTdG9yYWdlKHN0b3JhZ2UpO1xuICAgIHJldHVybiBzdG9yYWdlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJzb2Z0IHBlcnNpc3RlbnQgY2FjaGUgdW5hdmFpbGFibGVcIiwge1xuICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgaWYgKHBvb2wpIHtcbiAgICAgIGF3YWl0IHBvb2wuZW5kKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIEFwcEtpdCBDYWNoZVN0b3JhZ2Ugd2l0aCBib3VuZGVkIG1lbW9yeSBmaXJzdCBhbmQgdHJhY2tlZCBwZXJzaXN0ZW5jZS5cbiAqIExha2ViYXNlIHJlbWFpbnMgQXBwS2l0J3MgcGVyc2lzdGVudCBvd25lciB3aGVuIGF2YWlsYWJsZTsgb3RoZXJ3aXNlIHRoZVxuICogc2hhcmVkIHByb2plY3Qtc2NvcGVkIHBvcnRhYmxlIGRpc2sgbGV2ZWwgaXMgdXNlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwcEtpdENhY2hlU3RvcmFnZShcbiAgb3B0aW9uczogQXBwS2l0Q2FjaGVTdG9yYWdlT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxBcHBLaXRDYWNoZVN0b3JhZ2U+IHtcbiAgY29uc3QgbmF0aXZlQ2FjaGUgPSBvcHRpb25zLmNhY2hlO1xuICBjb25zdCBwZXJzaXN0ZW50ID1cbiAgICBvcHRpb25zLnByZWZlckxha2ViYXNlID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGF3YWl0IGNyZWF0ZVBlcnNpc3RlbnRTdG9yYWdlKG5hdGl2ZUNhY2hlKTtcbiAgY29uc3QgY29tbW9uOiBDYWNoZU9wdGlvbnMgPSB7XG4gICAgbWF4RW50cmllczogb3B0aW9ucy5tYXhFbnRyaWVzID8/IG5hdGl2ZUNhY2hlPy5tYXhTaXplLFxuICAgIHdyaXRlRGVsYXlNczogb3B0aW9ucy53cml0ZURlbGF5TXMsXG4gIH07XG4gIGNvbnN0IGNhY2hlID0gcGVyc2lzdGVudFxuICAgID8gY3JlYXRlQ2FjaGUoe1xuICAgICAgICAuLi5jb21tb24sXG4gICAgICAgIGxldmVsczogW3sgbmFtZTogXCJhcHBraXQtcGVyc2lzdGVudFwiLCBzdG9yZTogbmV3IEFwcEtpdFN0b3JhZ2VMZXZlbChwZXJzaXN0ZW50KSB9XSxcbiAgICAgIH0pXG4gICAgOiBwcm9qZWN0Q2FjaGUob3B0aW9ucy5kaXNrU2NvcGUgPz8gXCJhcHBraXRcIiwgY29tbW9uKTtcbiAgcmV0dXJuIG5ldyBBcHBLaXRDYWNoZVN0b3JhZ2UoY2FjaGUsIHBlcnNpc3RlbnQpO1xufVxuIl19
|
package/lib/src/files-cache.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AppKit-global filesystem cache with user-isolated process-local
|
|
2
|
+
* AppKit-global filesystem cache with user-isolated process-local values.
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
@@ -13,8 +13,6 @@ export interface FilesCachePluginConfig extends BasePluginConfig {
|
|
|
13
13
|
invalidationBatchMs?: number;
|
|
14
14
|
/** Maximum entries retained in each user L1. Defaults to 1,000. */
|
|
15
15
|
maxEntries?: number;
|
|
16
|
-
/** Maximum retained bytes in each user L1. Defaults to 64 MiB. */
|
|
17
|
-
maxBytes?: number;
|
|
18
16
|
/** Maximum active user scopes retained by the process. Defaults to 256. */
|
|
19
17
|
maxScopes?: number;
|
|
20
18
|
}
|
|
@@ -67,7 +65,7 @@ export declare class FilesCacheManager {
|
|
|
67
65
|
private queueInvalidation;
|
|
68
66
|
private flushInvalidations;
|
|
69
67
|
}
|
|
70
|
-
/** AppKit plugin that owns process-local filesystem
|
|
68
|
+
/** AppKit plugin that owns process-local filesystem caches. */
|
|
71
69
|
export declare class FilesCachePlugin extends Plugin<FilesCachePluginConfig> {
|
|
72
70
|
static manifest: {
|
|
73
71
|
name: "files-cache";
|
package/lib/src/files-cache.js
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AppKit-global filesystem cache with user-isolated process-local
|
|
2
|
+
* AppKit-global filesystem cache with user-isolated process-local values.
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
import { Plugin, toPlugin } from "@databricks/appkit";
|
|
7
|
+
import { cacheKeys, closeCache, createCache, getOrSet } from "@dbx-tools/cache/cache";
|
|
7
8
|
import { errorUtils, log, object } from "@dbx-tools/shared-core";
|
|
8
9
|
import { posixPath } from "@dbx-tools/shared-fs";
|
|
9
|
-
import { LRUCache } from "lru-cache";
|
|
10
10
|
const DEFAULT_TTL_MS = 60_000;
|
|
11
11
|
const DEFAULT_INVALIDATION_BATCH_MS = 25;
|
|
12
12
|
const DEFAULT_MAX_ENTRIES = 1_000;
|
|
13
|
-
const DEFAULT_MAX_BYTES = 64 * 1024 * 1024;
|
|
14
13
|
const DEFAULT_MAX_SCOPES = 256;
|
|
15
14
|
const logger = log.logger("files-cache");
|
|
16
15
|
/** Process-local filesystem cache manager. */
|
|
@@ -23,15 +22,9 @@ export class FilesCacheManager {
|
|
|
23
22
|
ttlMs: positiveDuration(config.ttlMs, DEFAULT_TTL_MS, "ttlMs"),
|
|
24
23
|
invalidationBatchMs: positiveDuration(config.invalidationBatchMs, DEFAULT_INVALIDATION_BATCH_MS, "invalidationBatchMs"),
|
|
25
24
|
maxEntries: positiveInteger(config.maxEntries, DEFAULT_MAX_ENTRIES, "maxEntries"),
|
|
26
|
-
maxBytes: positiveInteger(config.maxBytes, DEFAULT_MAX_BYTES, "maxBytes"),
|
|
27
25
|
maxScopes: positiveInteger(config.maxScopes, DEFAULT_MAX_SCOPES, "maxScopes"),
|
|
28
26
|
};
|
|
29
|
-
this.scopes =
|
|
30
|
-
max: this.config.maxScopes,
|
|
31
|
-
dispose: (state) => {
|
|
32
|
-
state.group.scopes.delete(state);
|
|
33
|
-
},
|
|
34
|
-
});
|
|
27
|
+
this.scopes = createCache({ maxEntries: this.config.maxScopes, useClone: false });
|
|
35
28
|
}
|
|
36
29
|
/** Return one user-isolated cache within a host/workspace invalidation group. */
|
|
37
30
|
async forScope(input) {
|
|
@@ -65,12 +58,23 @@ export class FilesCacheManager {
|
|
|
65
58
|
userKey: scope.userKey,
|
|
66
59
|
workspaceId: scope.workspaceId,
|
|
67
60
|
});
|
|
68
|
-
let state = this.scopes.get(scopeKey);
|
|
61
|
+
let state = await this.scopes.get(scopeKey);
|
|
69
62
|
if (!state) {
|
|
63
|
+
if ([...cacheKeys(this.scopes)].length >= this.config.maxScopes) {
|
|
64
|
+
const oldestKey = cacheKeys(this.scopes).next().value;
|
|
65
|
+
if (oldestKey) {
|
|
66
|
+
const oldest = await this.scopes.get(oldestKey);
|
|
67
|
+
if (oldest) {
|
|
68
|
+
oldest.group.scopes.delete(oldest);
|
|
69
|
+
await closeCache(oldest.entries);
|
|
70
|
+
}
|
|
71
|
+
await this.scopes.delete(oldestKey);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
70
74
|
const group = this.group(scope);
|
|
71
75
|
state = this.createScope(scope, group);
|
|
72
76
|
group.scopes.add(state);
|
|
73
|
-
this.scopes.set(scopeKey, state);
|
|
77
|
+
await this.scopes.set(scopeKey, state);
|
|
74
78
|
}
|
|
75
79
|
return state;
|
|
76
80
|
}
|
|
@@ -86,7 +90,12 @@ export class FilesCacheManager {
|
|
|
86
90
|
group.timer = undefined;
|
|
87
91
|
}
|
|
88
92
|
await this.flush();
|
|
89
|
-
this.scopes
|
|
93
|
+
for (const key of cacheKeys(this.scopes)) {
|
|
94
|
+
const state = await this.scopes.get(key);
|
|
95
|
+
if (state)
|
|
96
|
+
await closeCache(state.entries);
|
|
97
|
+
}
|
|
98
|
+
await closeCache(this.scopes);
|
|
90
99
|
this.groups.clear();
|
|
91
100
|
}
|
|
92
101
|
group(scope) {
|
|
@@ -108,11 +117,7 @@ export class FilesCacheManager {
|
|
|
108
117
|
const state = {};
|
|
109
118
|
state.scope = scope;
|
|
110
119
|
state.group = group;
|
|
111
|
-
state.entries =
|
|
112
|
-
max: this.config.maxEntries,
|
|
113
|
-
maxSize: this.config.maxBytes,
|
|
114
|
-
sizeCalculation: (entry, cacheKey) => retainedSize(cacheKey, entry),
|
|
115
|
-
});
|
|
120
|
+
state.entries = createCache({ maxEntries: this.config.maxEntries, useClone: false });
|
|
116
121
|
state.sources = new Map();
|
|
117
122
|
state.cache = {
|
|
118
123
|
read: (cacheKey, load) => this.read(state, cacheKey, load),
|
|
@@ -123,16 +128,21 @@ export class FilesCacheManager {
|
|
|
123
128
|
}
|
|
124
129
|
async read(state, key, load) {
|
|
125
130
|
if (!state.group.pending.has(key)) {
|
|
126
|
-
const retained = state.entries.get(key);
|
|
127
|
-
if (retained)
|
|
128
|
-
return retained
|
|
131
|
+
const retained = await state.entries.get(key);
|
|
132
|
+
if (retained !== undefined)
|
|
133
|
+
return retained;
|
|
134
|
+
}
|
|
135
|
+
if (state.group.pending.has(key)) {
|
|
136
|
+
const value = await load();
|
|
137
|
+
await state.entries.set(key, value, { ttl: state.scope.ttlMs });
|
|
138
|
+
return value;
|
|
129
139
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
140
|
+
return (await getOrSet(state.entries, key, () => Promise.resolve(load()), {
|
|
141
|
+
ttl: state.scope.ttlMs,
|
|
142
|
+
}));
|
|
133
143
|
}
|
|
134
144
|
*keys(state) {
|
|
135
|
-
for (const key of state.entries
|
|
145
|
+
for (const key of cacheKeys(state.entries)) {
|
|
136
146
|
if (!state.group.pending.has(key))
|
|
137
147
|
yield key;
|
|
138
148
|
}
|
|
@@ -160,12 +170,11 @@ export class FilesCacheManager {
|
|
|
160
170
|
const keys = [...group.pending];
|
|
161
171
|
group.pending.clear();
|
|
162
172
|
for (const state of group.scopes) {
|
|
163
|
-
|
|
164
|
-
state.entries.delete(key);
|
|
173
|
+
await Promise.all(keys.map((key) => state.entries.delete(key)));
|
|
165
174
|
}
|
|
166
175
|
}
|
|
167
176
|
}
|
|
168
|
-
/** AppKit plugin that owns process-local filesystem
|
|
177
|
+
/** AppKit plugin that owns process-local filesystem caches. */
|
|
169
178
|
export class FilesCachePlugin extends Plugin {
|
|
170
179
|
static manifest = {
|
|
171
180
|
name: "files-cache",
|
|
@@ -219,12 +228,4 @@ function positiveDuration(value, fallback, name) {
|
|
|
219
228
|
function positiveInteger(value, fallback, name) {
|
|
220
229
|
return Math.floor(positiveDuration(value, fallback, name));
|
|
221
230
|
}
|
|
222
|
-
function retainedSize(key, entry) {
|
|
223
|
-
try {
|
|
224
|
-
return Buffer.byteLength(key) + Buffer.byteLength(JSON.stringify(entry.value));
|
|
225
|
-
}
|
|
226
|
-
catch {
|
|
227
|
-
return Number.MAX_SAFE_INTEGER;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmlsZXMtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUE4QyxNQUFNLG9CQUFvQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQXlDLE1BQU0sc0JBQXNCLENBQUM7QUFDeEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUM7QUFDOUIsTUFBTSw2QkFBNkIsR0FBRyxFQUFFLENBQUM7QUFDekMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7QUFDbEMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMzQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUMvQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBbUZ6Qyw4Q0FBOEM7QUFDOUMsTUFBTSxPQUFPLGlCQUFpQjtJQUNYLE1BQU0sQ0FBMkI7SUFDakMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO0lBQ3ZDLE1BQU0sQ0FBK0I7SUFFdEQsWUFBWSxTQUFpQyxFQUFFO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixLQUFLLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDO1lBQzlELG1CQUFtQixFQUFFLGdCQUFnQixDQUNuQyxNQUFNLENBQUMsbUJBQW1CLEVBQzFCLDZCQUE2QixFQUM3QixxQkFBcUIsQ0FDdEI7WUFDRCxVQUFVLEVBQUUsZUFBZSxDQUFDLE1BQU0s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QUFDLEtBQXlCLEVBQUUsUUFBZ0IsRUFBRSxJQUFZO0lBQ2hGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEdBQVcsRUFBRSxLQUFvQjtJQUNyRCxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqQyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0LWdsb2JhbCBmaWxlc3lzdGVtIGNhY2hlIHdpdGggdXNlci1pc29sYXRlZCBwcm9jZXNzLWxvY2FsIExSVSB2YWx1ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFBsdWdpbiwgdG9QbHVnaW4sIHR5cGUgQmFzZVBsdWdpbkNvbmZpZywgdHlwZSBQbHVnaW5NYW5pZmVzdCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZywgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHBvc2l4UGF0aCwgdHlwZSBDYWNoZVZhbHVlLCB0eXBlIEZpbGVTeXN0ZW1DYWNoZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tIFwibHJ1LWNhY2hlXCI7XG5cbmNvbnN0IERFRkFVTFRfVFRMX01TID0gNjBfMDAwO1xuY29uc3QgREVGQVVMVF9JTlZBTElEQVRJT05fQkFUQ0hfTVMgPSAyNTtcbmNvbnN0IERFRkFVTFRfTUFYX0VOVFJJRVMgPSAxXzAwMDtcbmNvbnN0IERFRkFVTFRfTUFYX0JZVEVTID0gNjQgKiAxMDI0ICogMTAyNDtcbmNvbnN0IERFRkFVTFRfTUFYX1NDT1BFUyA9IDI1NjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJmaWxlcy1jYWNoZVwiKTtcblxuaW50ZXJmYWNlIFJldGFpbmVkRW50cnkge1xuICB2YWx1ZTogQ2FjaGVWYWx1ZTtcbn1cblxuaW50ZXJmYWNlIFNjb3BlU3RhdGUge1xuICBjYWNoZTogRmlsZVN5c3RlbUNhY2hlO1xuICBlbnRyaWVzOiBMUlVDYWNoZTxzdHJpbmcsIFJldGFpbmVkRW50cnk+O1xuICBncm91cDogR3JvdXBTdGF0ZTtcbiAgc2NvcGU6IFJlc29sdmVkRmlsZXNDYWNoZVNjb3BlO1xuICBzb3VyY2VzOiBNYXA8c3RyaW5nLCBQcm9taXNlPG9iamVjdD4+O1xufVxuXG5pbnRlcmZhY2UgR3JvdXBTdGF0ZSB7XG4gIHBlbmRpbmc6IFNldDxzdHJpbmc+O1xuICBzY29wZXM6IFNldDxTY29wZVN0YXRlPjtcbiAgdGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pjtcbn1cblxuaW50ZXJmYWNlIFJlc29sdmVkRmlsZXNDYWNoZUNvbmZpZyB7XG4gIGludmFsaWRhdGlvbkJhdGNoTXM6IG51bWJlcjtcbiAgbWF4Qnl0ZXM6IG51bWJlcjtcbiAgbWF4RW50cmllczogbnVtYmVyO1xuICBtYXhTY29wZXM6IG51bWJlcjtcbiAgdHRsTXM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFJlc29sdmVkRmlsZXNDYWNoZVNjb3BlIHtcbiAgaG9zdDogc3RyaW5nO1xuICB0dGxNczogbnVtYmVyO1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIHdvcmtzcGFjZUlkPzogc3RyaW5nO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgdGhlIEFwcEtpdCBmaWxlcy1jYWNoZSBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVzQ2FjaGVQbHVnaW5Db25maWcgZXh0ZW5kcyBCYXNlUGx1Z2luQ29uZmlnIHtcbiAgLyoqIERlZmF1bHQgZW50cnkgVFRMIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gNjAgc2Vjb25kcy4gKi9cbiAgdHRsTXM/OiBudW1iZXI7XG4gIC8qKiBJbnZhbGlkYXRpb24gZGVib3VuY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gMjVtcy4gKi9cbiAgaW52YWxpZGF0aW9uQmF0Y2hNcz86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gZW50cmllcyByZXRhaW5lZCBpbiBlYWNoIHVzZXIgTDEuIERlZmF1bHRzIHRvIDEsMDAwLiAqL1xuICBtYXhFbnRyaWVzPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSByZXRhaW5lZCBieXRlcyBpbiBlYWNoIHVzZXIgTDEuIERlZmF1bHRzIHRvIDY0IE1pQi4gKi9cbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIGFjdGl2ZSB1c2VyIHNjb3BlcyByZXRhaW5lZCBieSB0aGUgcHJvY2Vzcy4gRGVmYXVsdHMgdG8gMjU2LiAqL1xuICBtYXhTY29wZXM/OiBudW1iZXI7XG59XG5cbi8qKiBJZGVudGl0eSBmb3Igb25lIGF1dGhvcml6YXRpb24tc2FmZSBmaWxlc3lzdGVtIGNhY2hlIHNjb3BlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlc0NhY2hlU2NvcGUge1xuICAvKiogRGF0YWJyaWNrcyB3b3Jrc3BhY2UgaG9zdC4gKi9cbiAgaG9zdDogc3RyaW5nO1xuICAvKiogQXR0cmlidXRlZCB1c2VyIGlkZW50aWZpZXIgdXNlZCB0byBpc29sYXRlIHZhbHVlcy4gKi9cbiAgdXNlcktleTogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgd29ya3NwYWNlIGlkZW50aWZpZXIgaW5jbHVkZWQgaW4gc2hhcmVkIGludmFsaWRhdGlvbiBzY29wZS4gKi9cbiAgd29ya3NwYWNlSWQ/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBwZXItc2NvcGUgZW50cnkgVFRMIG92ZXJyaWRlIGluIG1pbGxpc2Vjb25kcy4gKi9cbiAgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBTdGFibGUgaWRlbnRpdHkgZm9yIGEgZnJhbWV3b3JrIGZpbGVzeXN0ZW0gc291cmNlIHJldGFpbmVkIHdpdGhpbiBvbmUgdXNlciBzY29wZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZXNDYWNoZVNvdXJjZUlkZW50aXR5IHtcbiAgLyoqIEFjdHVhbCBtb3VudGVkIGZpbGVzeXN0ZW0gcGF0aHMgcmVwcmVzZW50ZWQgYnkgdGhlIHNvdXJjZS4gKi9cbiAgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogV29ya3NwYWNlLWluc3RhbmNlIGtleSBzZXBhcmF0aW5nIHNvdXJjZXMgd2l0aCBkaWZmZXJlbnQgcG9saWNpZXMgb3ZlciB0aGUgc2FtZSBwYXRocy4gKi9cbiAga2V5Pzogc3RyaW5nO1xufVxuXG4vKiogUHVibGljIGV4cG9ydHMgZnJvbSB7QGxpbmsgRmlsZXNDYWNoZVBsdWdpbn0uICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVzQ2FjaGVFeHBvcnRzIHtcbiAgLyoqIFJlc29sdmUgb25lIHVzZXItaXNvbGF0ZWQgZmlsZXN5c3RlbSBjYWNoZS4gKi9cbiAgZm9yU2NvcGUoc2NvcGU6IEZpbGVzQ2FjaGVTY29wZSk6IFByb21pc2U8RmlsZVN5c3RlbUNhY2hlPjtcbiAgLyoqIFJlc29sdmUgb25lIGFwcC1saWZldGltZSBmaWxlc3lzdGVtIHNvdXJjZSBmb3IgYSB1c2VyIGFuZCBpdHMgYWN0dWFsIG1vdW50ZWQgcGF0aHMuICovXG4gIGZvckZpbGVTeXN0ZW08VCBleHRlbmRzIG9iamVjdD4oXG4gICAgc2NvcGU6IEZpbGVzQ2FjaGVTY29wZSxcbiAgICBpZGVudGl0eTogRmlsZXNDYWNoZVNvdXJjZUlkZW50aXR5LFxuICAgIGxvYWQ6ICgpID0+IFQgfCBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+O1xuICAvKiogRmx1c2ggcGVuZGluZyBpbnZhbGlkYXRpb24gYmF0Y2hlcy4gKi9cbiAgZmx1c2goKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqIFByb2Nlc3MtbG9jYWwgZmlsZXN5c3RlbSBjYWNoZSBtYW5hZ2VyLiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVzQ2FjaGVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IFJlc29sdmVkRmlsZXNDYWNoZUNvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgR3JvdXBTdGF0ZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY29wZXM6IExSVUNhY2hlPHN0cmluZywgU2NvcGVTdGF0ZT47XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBGaWxlc0NhY2hlUGx1Z2luQ29uZmlnID0ge30pIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIHR0bE1zOiBwb3NpdGl2ZUR1cmF0aW9uKGNvbmZpZy50dGxNcywgREVGQVVMVF9UVExfTVMsIFwidHRsTXNcIiksXG4gICAgICBpbnZhbGlkYXRpb25CYXRjaE1zOiBwb3NpdGl2ZUR1cmF0aW9uKFxuICAgICAgICBjb25maWcuaW52YWxpZGF0aW9uQmF0Y2hNcyxcbiAgICAgICAgREVGQVVMVF9JTlZBTElEQVRJT05fQkFUQ0hfTVMsXG4gICAgICAgIFwiaW52YWxpZGF0aW9uQmF0Y2hNc1wiLFxuICAgICAgKSxcbiAgICAgIG1heEVudHJpZXM6IHBvc2l0aXZlSW50ZWdlcihjb25maWcubWF4RW50cmllcywgREVGQVVMVF9NQVhfRU5UUklFUywgXCJtYXhFbnRyaWVzXCIpLFxuICAgICAgbWF4Qnl0ZXM6IHBvc2l0aXZlSW50ZWdlcihjb25maWcubWF4Qnl0ZXMsIERFRkFVTFRfTUFYX0JZVEVTLCBcIm1heEJ5dGVzXCIpLFxuICAgICAgbWF4U2NvcGVzOiBwb3NpdGl2ZUludGVnZXIoY29uZmlnLm1heFNjb3BlcywgREVGQVVMVF9NQVhfU0NPUEVTLCBcIm1heFNjb3Blc1wiKSxcbiAgICB9O1xuICAgIHRoaXMuc2NvcGVzID0gbmV3IExSVUNhY2hlKHtcbiAgICAgIG1heDogdGhpcy5jb25maWcubWF4U2NvcGVzLFxuICAgICAgZGlzcG9zZTogKHN0YXRlKSA9PiB7XG4gICAgICAgIHN0YXRlLmdyb3VwLnNjb3Blcy5kZWxldGUoc3RhdGUpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gb25lIHVzZXItaXNvbGF0ZWQgY2FjaGUgd2l0aGluIGEgaG9zdC93b3Jrc3BhY2UgaW52YWxpZGF0aW9uIGdyb3VwLiAqL1xuICBhc3luYyBmb3JTY29wZShpbnB1dDogRmlsZXNDYWNoZVNjb3BlKTogUHJvbWlzZTxGaWxlU3lzdGVtQ2FjaGU+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMucmVzb2x2ZVNjb3BlU3RhdGUoaW5wdXQpKS5jYWNoZTtcbiAgfVxuXG4gIC8qKiBSZXRhaW4gb25lIHN0YWJsZSBmcmFtZXdvcmsgZmlsZXN5c3RlbSBzb3VyY2UgZm9yIHRoZSBzY29wZSBhbmQgbW91bnRlZCBwYXRocy4gKi9cbiAgYXN5bmMgZm9yRmlsZVN5c3RlbTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgICBpbnB1dDogRmlsZXNDYWNoZVNjb3BlLFxuICAgIGlkZW50aXR5OiBGaWxlc0NhY2hlU291cmNlSWRlbnRpdHksXG4gICAgbG9hZDogKCkgPT4gVCB8IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgdGhpcy5yZXNvbHZlU2NvcGVTdGF0ZShpbnB1dCk7XG4gICAgY29uc3QgcGF0aHMgPSBpZGVudGl0eS5wYXRocy5tYXAoKHBhdGgpID0+IHBvc2l4UGF0aC5ub3JtYWxpemVSb290KHBhdGgpKTtcbiAgICBpZiAocGF0aHMubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmlsZXN5c3RlbSBzb3VyY2UgcGF0aHMgbXVzdCBub3QgYmUgZW1wdHlcIik7XG4gICAgY29uc3Qgc291cmNlS2V5ID0gb2JqZWN0LnRvU3RhYmxlS2V5KHsgcGF0aHMsIGtleTogaWRlbnRpdHkua2V5IH0pO1xuICAgIGxldCBzb3VyY2UgPSBzdGF0ZS5zb3VyY2VzLmdldChzb3VyY2VLZXkpO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBzb3VyY2UgPSBQcm9taXNlLnJlc29sdmUobG9hZCgpKTtcbiAgICAgIHN0YXRlLnNvdXJjZXMuc2V0KHNvdXJjZUtleSwgc291cmNlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoYXdhaXQgc291cmNlKSBhcyBUO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoc3RhdGUuc291cmNlcy5nZXQoc291cmNlS2V5KSA9PT0gc291cmNlKSBzdGF0ZS5zb3VyY2VzLmRlbGV0ZShzb3VyY2VLZXkpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlU2NvcGVTdGF0ZShpbnB1dDogRmlsZXNDYWNoZVNjb3BlKTogUHJvbWlzZTxTY29wZVN0YXRlPiB7XG4gICAgY29uc3Qgc2NvcGUgPSByZXNvbHZlU2NvcGUoaW5wdXQsIHRoaXMuY29uZmlnLnR0bE1zKTtcbiAgICBjb25zdCBzY29wZUtleSA9IG9iamVjdC50b1N0YWJsZUtleSh7XG4gICAgICBob3N0OiBzY29wZS5ob3N0LFxuICAgICAgdXNlcktleTogc2NvcGUudXNlcktleSxcbiAgICAgIHdvcmtzcGFjZUlkOiBzY29wZS53b3Jrc3BhY2VJZCxcbiAgICB9KTtcbiAgICBsZXQgc3RhdGUgPSB0aGlzLnNjb3Blcy5nZXQoc2NvcGVLZXkpO1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cChzY29wZSk7XG4gICAgICBzdGF0ZSA9IHRoaXMuY3JlYXRlU2NvcGUoc2NvcGUsIGdyb3VwKTtcbiAgICAgIGdyb3VwLnNjb3Blcy5hZGQoc3RhdGUpO1xuICAgICAgdGhpcy5zY29wZXMuc2V0KHNjb3BlS2V5LCBzdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8qKiBGbHVzaCBldmVyeSBwZW5kaW5nIGludmFsaWRhdGlvbiBiYXRjaC4gKi9cbiAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoWy4uLnRoaXMuZ3JvdXBzLnZhbHVlcygpXS5tYXAoKGdyb3VwKSA9PiB0aGlzLmZsdXNoSW52YWxpZGF0aW9ucyhncm91cCkpKTtcbiAgfVxuXG4gIC8qKiBGbHVzaCBzdGF0ZSBhbmQgcmVsZWFzZSBhbGwgcHJvY2Vzcy1sb2NhbCBlbnRyaWVzIGFuZCB0aW1lcnMuICovXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5ncm91cHMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChncm91cC50aW1lcikgY2xlYXJUaW1lb3V0KGdyb3VwLnRpbWVyKTtcbiAgICAgIGdyb3VwLnRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmZsdXNoKCk7XG4gICAgdGhpcy5zY29wZXMuY2xlYXIoKTtcbiAgICB0aGlzLmdyb3Vwcy5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBncm91cChzY29wZTogUmVzb2x2ZWRGaWxlc0NhY2hlU2NvcGUpOiBHcm91cFN0YXRlIHtcbiAgICBjb25zdCBrZXkgPSBvYmplY3QudG9TdGFibGVLZXkoe1xuICAgICAgaG9zdDogc2NvcGUuaG9zdCxcbiAgICAgIHdvcmtzcGFjZUlkOiBzY29wZS53b3Jrc3BhY2VJZCxcbiAgICB9KTtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ3JvdXBzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGNvbnN0IGdyb3VwOiBHcm91cFN0YXRlID0ge1xuICAgICAgcGVuZGluZzogbmV3IFNldCgpLFxuICAgICAgc2NvcGVzOiBuZXcgU2V0KCksXG4gICAgfTtcbiAgICB0aGlzLmdyb3Vwcy5zZXQoa2V5LCBncm91cCk7XG4gICAgcmV0dXJuIGdyb3VwO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTY29wZShzY29wZTogUmVzb2x2ZWRGaWxlc0NhY2hlU2NvcGUsIGdyb3VwOiBHcm91cFN0YXRlKTogU2NvcGVTdGF0ZSB7XG4gICAgY29uc3Qgc3RhdGUgPSB7fSBhcyBTY29wZVN0YXRlO1xuICAgIHN0YXRlLnNjb3BlID0gc2NvcGU7XG4gICAgc3RhdGUuZ3JvdXAgPSBncm91cDtcbiAgICBzdGF0ZS5lbnRyaWVzID0gbmV3IExSVUNhY2hlKHtcbiAgICAgIG1heDogdGhpcy5jb25maWcubWF4RW50cmllcyxcbiAgICAgIG1heFNpemU6IHRoaXMuY29uZmlnLm1heEJ5dGVzLFxuICAgICAgc2l6ZUNhbGN1bGF0aW9uOiAoZW50cnksIGNhY2hlS2V5KSA9PiByZXRhaW5lZFNpemUoY2FjaGVLZXksIGVudHJ5KSxcbiAgICB9KTtcbiAgICBzdGF0ZS5zb3VyY2VzID0gbmV3IE1hcCgpO1xuICAgIHN0YXRlLmNhY2hlID0ge1xuICAgICAgcmVhZDogPFQgZXh0ZW5kcyBDYWNoZVZhbHVlPihjYWNoZUtleTogc3RyaW5nLCBsb2FkOiAoKSA9PiBUIHwgUHJvbWlzZTxUPikgPT5cbiAgICAgICAgdGhpcy5yZWFkKHN0YXRlLCBjYWNoZUtleSwgbG9hZCksXG4gICAgICBpbnZhbGlkYXRlOiAoY2FjaGVLZXk6IHN0cmluZykgPT4gdGhpcy5xdWV1ZUludmFsaWRhdGlvbihzdGF0ZSwgY2FjaGVLZXkpLFxuICAgICAga2V5czogKCkgPT4gdGhpcy5rZXlzKHN0YXRlKSxcbiAgICB9O1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZDxUIGV4dGVuZHMgQ2FjaGVWYWx1ZT4oXG4gICAgc3RhdGU6IFNjb3BlU3RhdGUsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgbG9hZDogKCkgPT4gVCB8IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGlmICghc3RhdGUuZ3JvdXAucGVuZGluZy5oYXMoa2V5KSkge1xuICAgICAgY29uc3QgcmV0YWluZWQgPSBzdGF0ZS5lbnRyaWVzLmdldChrZXkpO1xuICAgICAgaWYgKHJldGFpbmVkKSByZXR1cm4gcmV0YWluZWQudmFsdWUgYXMgVDtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBsb2FkKCk7XG4gICAgc3RhdGUuZW50cmllcy5zZXQoa2V5LCB7IHZhbHVlIH0sIHsgdHRsOiBzdGF0ZS5zY29wZS50dGxNcyB9KTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlICprZXlzKHN0YXRlOiBTY29wZVN0YXRlKTogSXRlcmFibGU8c3RyaW5nPiB7XG4gICAgZm9yIChjb25zdCBrZXkgb2Ygc3RhdGUuZW50cmllcy5rZXlzKCkpIHtcbiAgICAgIGlmICghc3RhdGUuZ3JvdXAucGVuZGluZy5oYXMoa2V5KSkgeWllbGQga2V5O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcXVldWVJbnZhbGlkYXRpb24oc3RhdGU6IFNjb3BlU3RhdGUsIGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgc3RhdGUuZ3JvdXAucGVuZGluZy5hZGQoa2V5KTtcbiAgICBpZiAoc3RhdGUuZ3JvdXAudGltZXIpIHJldHVybjtcbiAgICBzdGF0ZS5ncm91cC50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3RhdGUuZ3JvdXAudGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICB2b2lkIHRoaXMuZmx1c2hJbnZhbGlkYXRpb25zKHN0YXRlLmdyb3VwKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJmaWxlc3lzdGVtIGNhY2hlIGludmFsaWRhdGlvbiBiYXRjaCBmYWlsZWRcIiwge1xuICAgICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSwgdGhpcy5jb25maWcuaW52YWxpZGF0aW9uQmF0Y2hNcyk7XG4gICAgc3RhdGUuZ3JvdXAudGltZXIudW5yZWY/LigpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmbHVzaEludmFsaWRhdGlvbnMoZ3JvdXA6IEdyb3VwU3RhdGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZ3JvdXAudGltZXIpIGNsZWFyVGltZW91dChncm91cC50aW1lcik7XG4gICAgZ3JvdXAudGltZXIgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGdyb3VwLnBlbmRpbmcuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleXMgPSBbLi4uZ3JvdXAucGVuZGluZ107XG4gICAgZ3JvdXAucGVuZGluZy5jbGVhcigpO1xuICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgZ3JvdXAuc2NvcGVzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSBzdGF0ZS5lbnRyaWVzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQXBwS2l0IHBsdWdpbiB0aGF0IG93bnMgcHJvY2Vzcy1sb2NhbCBmaWxlc3lzdGVtIExSVSBjYWNoZXMuICovXG5leHBvcnQgY2xhc3MgRmlsZXNDYWNoZVBsdWdpbiBleHRlbmRzIFBsdWdpbjxGaWxlc0NhY2hlUGx1Z2luQ29uZmlnPiB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImZpbGVzLWNhY2hlXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiRmlsZXMgQ2FjaGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQcm92aWRlcyBib3VuZGVkIHVzZXItc2NvcGVkIHByb2Nlc3MtbG9jYWwgZmlsZXN5c3RlbSBjYWNoZXMuXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHsgcmVxdWlyZWQ6IFtdLCBvcHRpb25hbDogW10gfSxcbiAgfSBzYXRpc2ZpZXMgUGx1Z2luTWFuaWZlc3Q8XCJmaWxlcy1jYWNoZVwiPjtcblxuICBwcml2YXRlIG1hbmFnZXI/OiBGaWxlc0NhY2hlTWFuYWdlcjtcblxuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgRmlsZXNDYWNoZU1hbmFnZXIodGhpcy5jb25maWcpO1xuICAgIHRoaXMuY29udGV4dD8ub25MaWZlY3ljbGUoXCJzaHV0ZG93blwiLCAoKSA9PiB0aGlzLm1hbmFnZXI/LmNsb3NlKCkpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZXhwb3J0cygpOiBGaWxlc0NhY2hlRXhwb3J0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvclNjb3BlOiAoc2NvcGUpID0+IHRoaXMucmVxdWlyZU1hbmFnZXIoKS5mb3JTY29wZShzY29wZSksXG4gICAgICBmb3JGaWxlU3lzdGVtOiAoc2NvcGUsIGlkZW50aXR5LCBsb2FkKSA9PlxuICAgICAgICB0aGlzLnJlcXVpcmVNYW5hZ2VyKCkuZm9yRmlsZVN5c3RlbShzY29wZSwgaWRlbnRpdHksIGxvYWQpLFxuICAgICAgZmx1c2g6ICgpID0+IHRoaXMucmVxdWlyZU1hbmFnZXIoKS5mbHVzaCgpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlcXVpcmVNYW5hZ2VyKCk6IEZpbGVzQ2FjaGVNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMubWFuYWdlcikgdGhyb3cgbmV3IEVycm9yKFwiRmlsZXMgY2FjaGUgcGx1Z2luIGhhcyBub3QgY29tcGxldGVkIHNldHVwXCIpO1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXI7XG4gIH1cbn1cblxuLyoqIEFwcEtpdCByZWdpc3RyYXRpb24gZmFjdG9yeSBmb3Ige0BsaW5rIEZpbGVzQ2FjaGVQbHVnaW59LiAqL1xuZXhwb3J0IGNvbnN0IGZpbGVzQ2FjaGUgPSB0b1BsdWdpbihGaWxlc0NhY2hlUGx1Z2luKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVNjb3BlKGlucHV0OiBGaWxlc0NhY2hlU2NvcGUsIGRlZmF1bHRUdGxNczogbnVtYmVyKTogUmVzb2x2ZWRGaWxlc0NhY2hlU2NvcGUge1xuICBjb25zdCBob3N0ID0gaW5wdXQuaG9zdC50cmltKCkucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgY29uc3QgdXNlcktleSA9IGlucHV0LnVzZXJLZXkudHJpbSgpO1xuICBjb25zdCB3b3Jrc3BhY2VJZCA9IGlucHV0LndvcmtzcGFjZUlkPy50cmltKCkgfHwgdW5kZWZpbmVkO1xuICBpZiAoIWhvc3QpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGaWxlcyBjYWNoZSBzY29wZSBob3N0IG11c3Qgbm90IGJlIGJsYW5rXCIpO1xuICBpZiAoIXVzZXJLZXkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGaWxlcyBjYWNoZSBzY29wZSB1c2VyS2V5IG11c3Qgbm90IGJlIGJsYW5rXCIpO1xuICByZXR1cm4ge1xuICAgIGhvc3QsXG4gICAgdXNlcktleSxcbiAgICAuLi4od29ya3NwYWNlSWQgPyB7IHdvcmtzcGFjZUlkIH0gOiB7fSksXG4gICAgdHRsTXM6IHBvc2l0aXZlRHVyYXRpb24oaW5wdXQudHRsTXMsIGRlZmF1bHRUdGxNcywgXCJzY29wZS50dGxNc1wiKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpdmVEdXJhdGlvbih2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCByZXNvbHZlZCA9IHZhbHVlID8/IGZhbGxiYWNrO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZXNvbHZlZCkgfHwgcmVzb2x2ZWQgPD0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGAke25hbWV9IG11c3QgYmUgYSBmaW5pdGUgcG9zaXRpdmUgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5mdW5jdGlvbiBwb3NpdGl2ZUludGVnZXIodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlciwgbmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IocG9zaXRpdmVEdXJhdGlvbih2YWx1ZSwgZmFsbGJhY2ssIG5hbWUpKTtcbn1cblxuZnVuY3Rpb24gcmV0YWluZWRTaXplKGtleTogc3RyaW5nLCBlbnRyeTogUmV0YWluZWRFbnRyeSk6IG51bWJlciB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKGtleSkgKyBCdWZmZXIuYnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeShlbnRyeS52YWx1ZSkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gIH1cbn1cbiJdfQ==
|
|
231
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmlsZXMtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUE4QyxNQUFNLG9CQUFvQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUF5QyxNQUFNLHNCQUFzQixDQUFDO0FBRXhGLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQztBQUM5QixNQUFNLDZCQUE2QixHQUFHLEVBQUUsQ0FBQztBQUN6QyxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQztBQUNsQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUMvQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBNEV6Qyw4Q0FBOEM7QUFDOUMsTUFBTSxPQUFPLGlCQUFpQjtJQUNYLE1BQU0sQ0FBMkI7SUFDakMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO0lBQ3ZDLE1BQU0sQ0FBaUM7SUFFeEQsWUFBWSxTQUFpQyxFQUFFO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixLQUFLLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDO1lBQzlELG1CQUFtQixFQUFFLGdCQUFnQixDQUNuQyxNQUFNLENBQUMsbUJBQW1CLEVBQzFCLDZCQUE2QixFQUM3QixxQkFBcUIsQ0FDdEI7WUFDRCxVQUFVLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsbUJBQW1C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ICogQXBwS2l0LWdsb2JhbCBmaWxlc3lzdGVtIGNhY2hlIHdpdGggdXNlci1pc29sYXRlZCBwcm9jZXNzLWxvY2FsIHZhbHVlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgUGx1Z2luLCB0b1BsdWdpbiwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLCB0eXBlIFBsdWdpbk1hbmlmZXN0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY2FjaGVLZXlzLCBjbG9zZUNhY2hlLCBjcmVhdGVDYWNoZSwgZ2V0T3JTZXQgfSBmcm9tIFwiQGRieC10b29scy9jYWNoZS9jYWNoZVwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgcG9zaXhQYXRoLCB0eXBlIENhY2hlVmFsdWUsIHR5cGUgRmlsZVN5c3RlbUNhY2hlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWZzXCI7XG5cbmNvbnN0IERFRkFVTFRfVFRMX01TID0gNjBfMDAwO1xuY29uc3QgREVGQVVMVF9JTlZBTElEQVRJT05fQkFUQ0hfTVMgPSAyNTtcbmNvbnN0IERFRkFVTFRfTUFYX0VOVFJJRVMgPSAxXzAwMDtcbmNvbnN0IERFRkFVTFRfTUFYX1NDT1BFUyA9IDI1NjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJmaWxlcy1jYWNoZVwiKTtcblxuaW50ZXJmYWNlIFNjb3BlU3RhdGUge1xuICBjYWNoZTogRmlsZVN5c3RlbUNhY2hlO1xuICBlbnRyaWVzOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDYWNoZT47XG4gIGdyb3VwOiBHcm91cFN0YXRlO1xuICBzY29wZTogUmVzb2x2ZWRGaWxlc0NhY2hlU2NvcGU7XG4gIHNvdXJjZXM6IE1hcDxzdHJpbmcsIFByb21pc2U8b2JqZWN0Pj47XG59XG5cbmludGVyZmFjZSBHcm91cFN0YXRlIHtcbiAgcGVuZGluZzogU2V0PHN0cmluZz47XG4gIHNjb3BlczogU2V0PFNjb3BlU3RhdGU+O1xuICB0aW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZWRGaWxlc0NhY2hlQ29uZmlnIHtcbiAgaW52YWxpZGF0aW9uQmF0Y2hNczogbnVtYmVyO1xuICBtYXhFbnRyaWVzOiBudW1iZXI7XG4gIG1heFNjb3BlczogbnVtYmVyO1xuICB0dGxNczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZWRGaWxlc0NhY2hlU2NvcGUge1xuICBob3N0OiBzdHJpbmc7XG4gIHR0bE1zOiBudW1iZXI7XG4gIHVzZXJLZXk6IHN0cmluZztcbiAgd29ya3NwYWNlSWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciB0aGUgQXBwS2l0IGZpbGVzLWNhY2hlIHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZXNDYWNoZVBsdWdpbkNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcge1xuICAvKiogRGVmYXVsdCBlbnRyeSBUVEwgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byA2MCBzZWNvbmRzLiAqL1xuICB0dGxNcz86IG51bWJlcjtcbiAgLyoqIEludmFsaWRhdGlvbiBkZWJvdW5jZSB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byAyNW1zLiAqL1xuICBpbnZhbGlkYXRpb25CYXRjaE1zPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSBlbnRyaWVzIHJldGFpbmVkIGluIGVhY2ggdXNlciBMMS4gRGVmYXVsdHMgdG8gMSwwMDAuICovXG4gIG1heEVudHJpZXM/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIGFjdGl2ZSB1c2VyIHNjb3BlcyByZXRhaW5lZCBieSB0aGUgcHJvY2Vzcy4gRGVmYXVsdHMgdG8gMjU2LiAqL1xuICBtYXhTY29wZXM/OiBudW1iZXI7XG59XG5cbi8qKiBJZGVudGl0eSBmb3Igb25lIGF1dGhvcml6YXRpb24tc2FmZSBmaWxlc3lzdGVtIGNhY2hlIHNjb3BlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlc0NhY2hlU2NvcGUge1xuICAvKiogRGF0YWJyaWNrcyB3b3Jrc3BhY2UgaG9zdC4gKi9cbiAgaG9zdDogc3RyaW5nO1xuICAvKiogQXR0cmlidXRlZCB1c2VyIGlkZW50aWZpZXIgdXNlZCB0byBpc29sYXRlIHZhbHVlcy4gKi9cbiAgdXNlcktleTogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgd29ya3NwYWNlIGlkZW50aWZpZXIgaW5jbHVkZWQgaW4gc2hhcmVkIGludmFsaWRhdGlvbiBzY29wZS4gKi9cbiAgd29ya3NwYWNlSWQ/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBwZXItc2NvcGUgZW50cnkgVFRMIG92ZXJyaWRlIGluIG1pbGxpc2Vjb25kcy4gKi9cbiAgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBTdGFibGUgaWRlbnRpdHkgZm9yIGEgZnJhbWV3b3JrIGZpbGVzeXN0ZW0gc291cmNlIHJldGFpbmVkIHdpdGhpbiBvbmUgdXNlciBzY29wZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZXNDYWNoZVNvdXJjZUlkZW50aXR5IHtcbiAgLyoqIEFjdHVhbCBtb3VudGVkIGZpbGVzeXN0ZW0gcGF0aHMgcmVwcmVzZW50ZWQgYnkgdGhlIHNvdXJjZS4gKi9cbiAgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogV29ya3NwYWNlLWluc3RhbmNlIGtleSBzZXBhcmF0aW5nIHNvdXJjZXMgd2l0aCBkaWZmZXJlbnQgcG9saWNpZXMgb3ZlciB0aGUgc2FtZSBwYXRocy4gKi9cbiAga2V5Pzogc3RyaW5nO1xufVxuXG4vKiogUHVibGljIGV4cG9ydHMgZnJvbSB7QGxpbmsgRmlsZXNDYWNoZVBsdWdpbn0uICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVzQ2FjaGVFeHBvcnRzIHtcbiAgLyoqIFJlc29sdmUgb25lIHVzZXItaXNvbGF0ZWQgZmlsZXN5c3RlbSBjYWNoZS4gKi9cbiAgZm9yU2NvcGUoc2NvcGU6IEZpbGVzQ2FjaGVTY29wZSk6IFByb21pc2U8RmlsZVN5c3RlbUNhY2hlPjtcbiAgLyoqIFJlc29sdmUgb25lIGFwcC1saWZldGltZSBmaWxlc3lzdGVtIHNvdXJjZSBmb3IgYSB1c2VyIGFuZCBpdHMgYWN0dWFsIG1vdW50ZWQgcGF0aHMuICovXG4gIGZvckZpbGVTeXN0ZW08VCBleHRlbmRzIG9iamVjdD4oXG4gICAgc2NvcGU6IEZpbGVzQ2FjaGVTY29wZSxcbiAgICBpZGVudGl0eTogRmlsZXNDYWNoZVNvdXJjZUlkZW50aXR5LFxuICAgIGxvYWQ6ICgpID0+IFQgfCBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+O1xuICAvKiogRmx1c2ggcGVuZGluZyBpbnZhbGlkYXRpb24gYmF0Y2hlcy4gKi9cbiAgZmx1c2goKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqIFByb2Nlc3MtbG9jYWwgZmlsZXN5c3RlbSBjYWNoZSBtYW5hZ2VyLiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVzQ2FjaGVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IFJlc29sdmVkRmlsZXNDYWNoZUNvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgR3JvdXBTdGF0ZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY29wZXM6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNhY2hlPjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEZpbGVzQ2FjaGVQbHVnaW5Db25maWcgPSB7fSkge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgdHRsTXM6IHBvc2l0aXZlRHVyYXRpb24oY29uZmlnLnR0bE1zLCBERUZBVUxUX1RUTF9NUywgXCJ0dGxNc1wiKSxcbiAgICAgIGludmFsaWRhdGlvbkJhdGNoTXM6IHBvc2l0aXZlRHVyYXRpb24oXG4gICAgICAgIGNvbmZpZy5pbnZhbGlkYXRpb25CYXRjaE1zLFxuICAgICAgICBERUZBVUxUX0lOVkFMSURBVElPTl9CQVRDSF9NUyxcbiAgICAgICAgXCJpbnZhbGlkYXRpb25CYXRjaE1zXCIsXG4gICAgICApLFxuICAgICAgbWF4RW50cmllczogcG9zaXRpdmVJbnRlZ2VyKGNvbmZpZy5tYXhFbnRyaWVzLCBERUZBVUxUX01BWF9FTlRSSUVTLCBcIm1heEVudHJpZXNcIiksXG4gICAgICBtYXhTY29wZXM6IHBvc2l0aXZlSW50ZWdlcihjb25maWcubWF4U2NvcGVzLCBERUZBVUxUX01BWF9TQ09QRVMsIFwibWF4U2NvcGVzXCIpLFxuICAgIH07XG4gICAgdGhpcy5zY29wZXMgPSBjcmVhdGVDYWNoZSh7IG1heEVudHJpZXM6IHRoaXMuY29uZmlnLm1heFNjb3BlcywgdXNlQ2xvbmU6IGZhbHNlIH0pO1xuICB9XG5cbiAgLyoqIFJldHVybiBvbmUgdXNlci1pc29sYXRlZCBjYWNoZSB3aXRoaW4gYSBob3N0L3dvcmtzcGFjZSBpbnZhbGlkYXRpb24gZ3JvdXAuICovXG4gIGFzeW5jIGZvclNjb3BlKGlucHV0OiBGaWxlc0NhY2hlU2NvcGUpOiBQcm9taXNlPEZpbGVTeXN0ZW1DYWNoZT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5yZXNvbHZlU2NvcGVTdGF0ZShpbnB1dCkpLmNhY2hlO1xuICB9XG5cbiAgLyoqIFJldGFpbiBvbmUgc3RhYmxlIGZyYW1ld29yayBmaWxlc3lzdGVtIHNvdXJjZSBmb3IgdGhlIHNjb3BlIGFuZCBtb3VudGVkIHBhdGhzLiAqL1xuICBhc3luYyBmb3JGaWxlU3lzdGVtPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICAgIGlucHV0OiBGaWxlc0NhY2hlU2NvcGUsXG4gICAgaWRlbnRpdHk6IEZpbGVzQ2FjaGVTb3VyY2VJZGVudGl0eSxcbiAgICBsb2FkOiAoKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLnJlc29sdmVTY29wZVN0YXRlKGlucHV0KTtcbiAgICBjb25zdCBwYXRocyA9IGlkZW50aXR5LnBhdGhzLm1hcCgocGF0aCkgPT4gcG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3QocGF0aCkpO1xuICAgIGlmIChwYXRocy5sZW5ndGggPT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGaWxlc3lzdGVtIHNvdXJjZSBwYXRocyBtdXN0IG5vdCBiZSBlbXB0eVwiKTtcbiAgICBjb25zdCBzb3VyY2VLZXkgPSBvYmplY3QudG9TdGFibGVLZXkoeyBwYXRocywga2V5OiBpZGVudGl0eS5rZXkgfSk7XG4gICAgbGV0IHNvdXJjZSA9IHN0YXRlLnNvdXJjZXMuZ2V0KHNvdXJjZUtleSk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIHNvdXJjZSA9IFByb21pc2UucmVzb2x2ZShsb2FkKCkpO1xuICAgICAgc3RhdGUuc291cmNlcy5zZXQoc291cmNlS2V5LCBzb3VyY2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChhd2FpdCBzb3VyY2UpIGFzIFQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChzdGF0ZS5zb3VyY2VzLmdldChzb3VyY2VLZXkpID09PSBzb3VyY2UpIHN0YXRlLnNvdXJjZXMuZGVsZXRlKHNvdXJjZUtleSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVTY29wZVN0YXRlKGlucHV0OiBGaWxlc0NhY2hlU2NvcGUpOiBQcm9taXNlPFNjb3BlU3RhdGU+IHtcbiAgICBjb25zdCBzY29wZSA9IHJlc29sdmVTY29wZShpbnB1dCwgdGhpcy5jb25maWcudHRsTXMpO1xuICAgIGNvbnN0IHNjb3BlS2V5ID0gb2JqZWN0LnRvU3RhYmxlS2V5KHtcbiAgICAgIGhvc3Q6IHNjb3BlLmhvc3QsXG4gICAgICB1c2VyS2V5OiBzY29wZS51c2VyS2V5LFxuICAgICAgd29ya3NwYWNlSWQ6IHNjb3BlLndvcmtzcGFjZUlkLFxuICAgIH0pO1xuICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuc2NvcGVzLmdldDxTY29wZVN0YXRlPihzY29wZUtleSk7XG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgaWYgKFsuLi5jYWNoZUtleXModGhpcy5zY29wZXMpXS5sZW5ndGggPj0gdGhpcy5jb25maWcubWF4U2NvcGVzKSB7XG4gICAgICAgIGNvbnN0IG9sZGVzdEtleSA9IGNhY2hlS2V5cyh0aGlzLnNjb3BlcykubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZiAob2xkZXN0S2V5KSB7XG4gICAgICAgICAgY29uc3Qgb2xkZXN0ID0gYXdhaXQgdGhpcy5zY29wZXMuZ2V0PFNjb3BlU3RhdGU+KG9sZGVzdEtleSk7XG4gICAgICAgICAgaWYgKG9sZGVzdCkge1xuICAgICAgICAgICAgb2xkZXN0Lmdyb3VwLnNjb3Blcy5kZWxldGUob2xkZXN0KTtcbiAgICAgICAgICAgIGF3YWl0IGNsb3NlQ2FjaGUob2xkZXN0LmVudHJpZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCB0aGlzLnNjb3Blcy5kZWxldGUob2xkZXN0S2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3VwKHNjb3BlKTtcbiAgICAgIHN0YXRlID0gdGhpcy5jcmVhdGVTY29wZShzY29wZSwgZ3JvdXApO1xuICAgICAgZ3JvdXAuc2NvcGVzLmFkZChzdGF0ZSk7XG4gICAgICBhd2FpdCB0aGlzLnNjb3Blcy5zZXQoc2NvcGVLZXksIHN0YXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLyoqIEZsdXNoIGV2ZXJ5IHBlbmRpbmcgaW52YWxpZGF0aW9uIGJhdGNoLiAqL1xuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbLi4udGhpcy5ncm91cHMudmFsdWVzKCldLm1hcCgoZ3JvdXApID0+IHRoaXMuZmx1c2hJbnZhbGlkYXRpb25zKGdyb3VwKSkpO1xuICB9XG5cbiAgLyoqIEZsdXNoIHN0YXRlIGFuZCByZWxlYXNlIGFsbCBwcm9jZXNzLWxvY2FsIGVudHJpZXMgYW5kIHRpbWVycy4gKi9cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLmdyb3Vwcy52YWx1ZXMoKSkge1xuICAgICAgaWYgKGdyb3VwLnRpbWVyKSBjbGVhclRpbWVvdXQoZ3JvdXAudGltZXIpO1xuICAgICAgZ3JvdXAudGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZmx1c2goKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBjYWNoZUtleXModGhpcy5zY29wZXMpKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHRoaXMuc2NvcGVzLmdldDxTY29wZVN0YXRlPihrZXkpO1xuICAgICAgaWYgKHN0YXRlKSBhd2FpdCBjbG9zZUNhY2hlKHN0YXRlLmVudHJpZXMpO1xuICAgIH1cbiAgICBhd2FpdCBjbG9zZUNhY2hlKHRoaXMuc2NvcGVzKTtcbiAgICB0aGlzLmdyb3Vwcy5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBncm91cChzY29wZTogUmVzb2x2ZWRGaWxlc0NhY2hlU2NvcGUpOiBHcm91cFN0YXRlIHtcbiAgICBjb25zdCBrZXkgPSBvYmplY3QudG9TdGFibGVLZXkoe1xuICAgICAgaG9zdDogc2NvcGUuaG9zdCxcbiAgICAgIHdvcmtzcGFjZUlkOiBzY29wZS53b3Jrc3BhY2VJZCxcbiAgICB9KTtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ3JvdXBzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGNvbnN0IGdyb3VwOiBHcm91cFN0YXRlID0ge1xuICAgICAgcGVuZGluZzogbmV3IFNldCgpLFxuICAgICAgc2NvcGVzOiBuZXcgU2V0KCksXG4gICAgfTtcbiAgICB0aGlzLmdyb3Vwcy5zZXQoa2V5LCBncm91cCk7XG4gICAgcmV0dXJuIGdyb3VwO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTY29wZShzY29wZTogUmVzb2x2ZWRGaWxlc0NhY2hlU2NvcGUsIGdyb3VwOiBHcm91cFN0YXRlKTogU2NvcGVTdGF0ZSB7XG4gICAgY29uc3Qgc3RhdGUgPSB7fSBhcyBTY29wZVN0YXRlO1xuICAgIHN0YXRlLnNjb3BlID0gc2NvcGU7XG4gICAgc3RhdGUuZ3JvdXAgPSBncm91cDtcbiAgICBzdGF0ZS5lbnRyaWVzID0gY3JlYXRlQ2FjaGUoeyBtYXhFbnRyaWVzOiB0aGlzLmNvbmZpZy5tYXhFbnRyaWVzLCB1c2VDbG9uZTogZmFsc2UgfSk7XG4gICAgc3RhdGUuc291cmNlcyA9IG5ldyBNYXAoKTtcbiAgICBzdGF0ZS5jYWNoZSA9IHtcbiAgICAgIHJlYWQ6IDxUIGV4dGVuZHMgQ2FjaGVWYWx1ZT4oY2FjaGVLZXk6IHN0cmluZywgbG9hZDogKCkgPT4gVCB8IFByb21pc2U8VD4pID0+XG4gICAgICAgIHRoaXMucmVhZChzdGF0ZSwgY2FjaGVLZXksIGxvYWQpLFxuICAgICAgaW52YWxpZGF0ZTogKGNhY2hlS2V5OiBzdHJpbmcpID0+IHRoaXMucXVldWVJbnZhbGlkYXRpb24oc3RhdGUsIGNhY2hlS2V5KSxcbiAgICAgIGtleXM6ICgpID0+IHRoaXMua2V5cyhzdGF0ZSksXG4gICAgfTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWQ8VCBleHRlbmRzIENhY2hlVmFsdWU+KFxuICAgIHN0YXRlOiBTY29wZVN0YXRlLFxuICAgIGtleTogc3RyaW5nLFxuICAgIGxvYWQ6ICgpID0+IFQgfCBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIXN0YXRlLmdyb3VwLnBlbmRpbmcuaGFzKGtleSkpIHtcbiAgICAgIGNvbnN0IHJldGFpbmVkID0gYXdhaXQgc3RhdGUuZW50cmllcy5nZXQ8VD4oa2V5KTtcbiAgICAgIGlmIChyZXRhaW5lZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcmV0YWluZWQ7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5ncm91cC5wZW5kaW5nLmhhcyhrZXkpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGxvYWQoKTtcbiAgICAgIGF3YWl0IHN0YXRlLmVudHJpZXMuc2V0KGtleSwgdmFsdWUsIHsgdHRsOiBzdGF0ZS5zY29wZS50dGxNcyB9KTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIChhd2FpdCBnZXRPclNldChzdGF0ZS5lbnRyaWVzLCBrZXksICgpID0+IFByb21pc2UucmVzb2x2ZShsb2FkKCkpLCB7XG4gICAgICB0dGw6IHN0YXRlLnNjb3BlLnR0bE1zLFxuICAgIH0pKSBhcyBUO1xuICB9XG5cbiAgcHJpdmF0ZSAqa2V5cyhzdGF0ZTogU2NvcGVTdGF0ZSk6IEl0ZXJhYmxlPHN0cmluZz4ge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGNhY2hlS2V5cyhzdGF0ZS5lbnRyaWVzKSkge1xuICAgICAgaWYgKCFzdGF0ZS5ncm91cC5wZW5kaW5nLmhhcyhrZXkpKSB5aWVsZCBrZXk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBxdWV1ZUludmFsaWRhdGlvbihzdGF0ZTogU2NvcGVTdGF0ZSwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzdGF0ZS5ncm91cC5wZW5kaW5nLmFkZChrZXkpO1xuICAgIGlmIChzdGF0ZS5ncm91cC50aW1lcikgcmV0dXJuO1xuICAgIHN0YXRlLmdyb3VwLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzdGF0ZS5ncm91cC50aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgIHZvaWQgdGhpcy5mbHVzaEludmFsaWRhdGlvbnMoc3RhdGUuZ3JvdXApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBsb2dnZXIud2FybihcImZpbGVzeXN0ZW0gY2FjaGUgaW52YWxpZGF0aW9uIGJhdGNoIGZhaWxlZFwiLCB7XG4gICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCB0aGlzLmNvbmZpZy5pbnZhbGlkYXRpb25CYXRjaE1zKTtcbiAgICBzdGF0ZS5ncm91cC50aW1lci51bnJlZj8uKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZsdXNoSW52YWxpZGF0aW9ucyhncm91cDogR3JvdXBTdGF0ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChncm91cC50aW1lcikgY2xlYXJUaW1lb3V0KGdyb3VwLnRpbWVyKTtcbiAgICBncm91cC50aW1lciA9IHVuZGVmaW5lZDtcbiAgICBpZiAoZ3JvdXAucGVuZGluZy5zaXplID09PSAwKSByZXR1cm47XG4gICAgY29uc3Qga2V5cyA9IFsuLi5ncm91cC5wZW5kaW5nXTtcbiAgICBncm91cC5wZW5kaW5nLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCBzdGF0ZSBvZiBncm91cC5zY29wZXMpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGtleXMubWFwKChrZXkpID0+IHN0YXRlLmVudHJpZXMuZGVsZXRlKGtleSkpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFwcEtpdCBwbHVnaW4gdGhhdCBvd25zIHByb2Nlc3MtbG9jYWwgZmlsZXN5c3RlbSBjYWNoZXMuICovXG5leHBvcnQgY2xhc3MgRmlsZXNDYWNoZVBsdWdpbiBleHRlbmRzIFBsdWdpbjxGaWxlc0NhY2hlUGx1Z2luQ29uZmlnPiB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImZpbGVzLWNhY2hlXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiRmlsZXMgQ2FjaGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQcm92aWRlcyBib3VuZGVkIHVzZXItc2NvcGVkIHByb2Nlc3MtbG9jYWwgZmlsZXN5c3RlbSBjYWNoZXMuXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHsgcmVxdWlyZWQ6IFtdLCBvcHRpb25hbDogW10gfSxcbiAgfSBzYXRpc2ZpZXMgUGx1Z2luTWFuaWZlc3Q8XCJmaWxlcy1jYWNoZVwiPjtcblxuICBwcml2YXRlIG1hbmFnZXI/OiBGaWxlc0NhY2hlTWFuYWdlcjtcblxuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgRmlsZXNDYWNoZU1hbmFnZXIodGhpcy5jb25maWcpO1xuICAgIHRoaXMuY29udGV4dD8ub25MaWZlY3ljbGUoXCJzaHV0ZG93blwiLCAoKSA9PiB0aGlzLm1hbmFnZXI/LmNsb3NlKCkpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZXhwb3J0cygpOiBGaWxlc0NhY2hlRXhwb3J0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvclNjb3BlOiAoc2NvcGUpID0+IHRoaXMucmVxdWlyZU1hbmFnZXIoKS5mb3JTY29wZShzY29wZSksXG4gICAgICBmb3JGaWxlU3lzdGVtOiAoc2NvcGUsIGlkZW50aXR5LCBsb2FkKSA9PlxuICAgICAgICB0aGlzLnJlcXVpcmVNYW5hZ2VyKCkuZm9yRmlsZVN5c3RlbShzY29wZSwgaWRlbnRpdHksIGxvYWQpLFxuICAgICAgZmx1c2g6ICgpID0+IHRoaXMucmVxdWlyZU1hbmFnZXIoKS5mbHVzaCgpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlcXVpcmVNYW5hZ2VyKCk6IEZpbGVzQ2FjaGVNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMubWFuYWdlcikgdGhyb3cgbmV3IEVycm9yKFwiRmlsZXMgY2FjaGUgcGx1Z2luIGhhcyBub3QgY29tcGxldGVkIHNldHVwXCIpO1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXI7XG4gIH1cbn1cblxuLyoqIEFwcEtpdCByZWdpc3RyYXRpb24gZmFjdG9yeSBmb3Ige0BsaW5rIEZpbGVzQ2FjaGVQbHVnaW59LiAqL1xuZXhwb3J0IGNvbnN0IGZpbGVzQ2FjaGUgPSB0b1BsdWdpbihGaWxlc0NhY2hlUGx1Z2luKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVNjb3BlKGlucHV0OiBGaWxlc0NhY2hlU2NvcGUsIGRlZmF1bHRUdGxNczogbnVtYmVyKTogUmVzb2x2ZWRGaWxlc0NhY2hlU2NvcGUge1xuICBjb25zdCBob3N0ID0gaW5wdXQuaG9zdC50cmltKCkucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgY29uc3QgdXNlcktleSA9IGlucHV0LnVzZXJLZXkudHJpbSgpO1xuICBjb25zdCB3b3Jrc3BhY2VJZCA9IGlucHV0LndvcmtzcGFjZUlkPy50cmltKCkgfHwgdW5kZWZpbmVkO1xuICBpZiAoIWhvc3QpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGaWxlcyBjYWNoZSBzY29wZSBob3N0IG11c3Qgbm90IGJlIGJsYW5rXCIpO1xuICBpZiAoIXVzZXJLZXkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGaWxlcyBjYWNoZSBzY29wZSB1c2VyS2V5IG11c3Qgbm90IGJlIGJsYW5rXCIpO1xuICByZXR1cm4ge1xuICAgIGhvc3QsXG4gICAgdXNlcktleSxcbiAgICAuLi4od29ya3NwYWNlSWQgPyB7IHdvcmtzcGFjZUlkIH0gOiB7fSksXG4gICAgdHRsTXM6IHBvc2l0aXZlRHVyYXRpb24oaW5wdXQudHRsTXMsIGRlZmF1bHRUdGxNcywgXCJzY29wZS50dGxNc1wiKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpdmVEdXJhdGlvbih2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCByZXNvbHZlZCA9IHZhbHVlID8/IGZhbGxiYWNrO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZXNvbHZlZCkgfHwgcmVzb2x2ZWQgPD0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGAke25hbWV9IG11c3QgYmUgYSBmaW5pdGUgcG9zaXRpdmUgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5mdW5jdGlvbiBwb3NpdGl2ZUludGVnZXIodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlciwgbmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IocG9zaXRpdmVEdXJhdGlvbih2YWx1ZSwgZmFsbGJhY2ssIG5hbWUpKTtcbn1cbiJdfQ==
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/_auto-configure.ts","../src/
|
|
1
|
+
{"root":["../src/_auto-configure.ts","../src/appkit.ts","../src/brand-context.ts","../src/bundle.ts","../src/cache-storage.ts","../src/child-process.ts","../src/databricks.ts","../src/files-cache.ts","../src/identity.ts","../src/interceptor.ts","../src/lakebase-resolver.ts","../src/migration.ts","../src/pgaddress.ts","../src/plugin-execution.ts","../src/plugin-registry.ts","../src/provision.ts","../src/request-tags.ts","../src/tool-provider.ts","../src/toolkit-entries.ts","../index.ts"],"version":"5.9.3"}
|