sliftutils 1.7.11 → 1.7.13
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/.claude/settings.local.json +2 -1
- package/index.d.ts +42 -1
- package/misc/dist/getSecret.ts.cache +2 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/dist/yaml.ts.cache +2 -2
- package/misc/dist/yamlBase.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/package.json +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
- package/storage/dist/embeddingFormats.ts.cache +2 -2
- package/storage/proxydatabase/dist/Database.ts.cache +2 -2
- package/storage/proxydatabase/dist/ivfEmbeddingDatabase.ts.cache +123 -61
- package/storage/proxydatabase/dist/transactionSet.ts.cache +16 -4
- package/storage/remoteStorage/blobStore.d.ts +11 -0
- package/storage/remoteStorage/blobStore.ts +8 -3
- package/storage/remoteStorage/createArchives.d.ts +16 -0
- package/storage/remoteStorage/createArchives.ts +30 -2
- package/storage/remoteStorage/sourceWrapper.ts +1 -1
- package/storage/remoteStorage/storageController.d.ts +2 -0
- package/storage/remoteStorage/storageController.ts +9 -9
- package/storage/remoteStorage/storageServerState.d.ts +13 -1
- package/storage/remoteStorage/storageServerState.ts +64 -9
- package/yarn.lock +4 -4
|
@@ -1,9 +1,20 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
|
-
//exports.removeEmbeddings = exports.insertEmbeddings = exports.searchEmbeddings = exports.rebuildStructure = void 0;
|
|
6
|
+
//exports.removeEmbeddings = exports.insertEmbeddings = exports.lookupEmbeddings = exports.searchEmbeddings = exports.rebuildStructure = void 0;
|
|
7
|
+
const cbor_x_1 = __importDefault(require("cbor-x"));
|
|
4
8
|
const Database_1 = require("./Database");
|
|
5
9
|
const transactionSet_1 = require("./transactionSet");
|
|
6
10
|
const embeddingFormats_1 = require("../embeddingFormats");
|
|
11
|
+
const embeddingCbor = new cbor_x_1.default.Encoder({ structuredClone: true });
|
|
12
|
+
function encodeRefValue(embedding) {
|
|
13
|
+
return embeddingCbor.encode(embedding);
|
|
14
|
+
}
|
|
15
|
+
function decodeRefValue(value) {
|
|
16
|
+
return embeddingCbor.decode(value);
|
|
17
|
+
}
|
|
7
18
|
// Below this many embeddings we skip the IVF entirely (flat store). 1024 = a clean power of two.
|
|
8
19
|
const FLAT_LIMIT = 1024;
|
|
9
20
|
// Force a from-scratch rebuild once at each of these (multiples of 4 above FLAT_LIMIT, up to ~16k), gated by a step flag so each runs at most once ever.
|
|
@@ -21,14 +32,6 @@ function centroidStore(database) {
|
|
|
21
32
|
function cellStore(database, cellId) {
|
|
22
33
|
return (0, Database_1.namespaceDatabase)(database, root => root.cells[cellId]);
|
|
23
34
|
}
|
|
24
|
-
function readSteps(database) {
|
|
25
|
-
var _a;
|
|
26
|
-
return (_a = database.readData(root => root.steps)) !== null && _a !== void 0 ? _a : {};
|
|
27
|
-
}
|
|
28
|
-
function readCount(database) {
|
|
29
|
-
var _a;
|
|
30
|
-
return (_a = database.readData(root => root.count)) !== null && _a !== void 0 ? _a : 0;
|
|
31
|
-
}
|
|
32
35
|
function rankCellsByCloseness(embedding, centroids) {
|
|
33
36
|
const ranked = [];
|
|
34
37
|
for (const cellId of centroids.keys()) {
|
|
@@ -132,12 +135,20 @@ function rebuildStructure(database) {
|
|
|
132
135
|
const config = database.readData(root => root.config);
|
|
133
136
|
if (!config)
|
|
134
137
|
return;
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
if (!flat)
|
|
138
|
+
const steps = database.readData(root => root.steps);
|
|
139
|
+
if (!steps)
|
|
138
140
|
return;
|
|
139
|
-
|
|
140
|
-
|
|
141
|
+
const allMembers = [];
|
|
142
|
+
// Only the one-time flat->IVF upgrade pulls from the flat tier. Once STEP_IVF is set the flat data has
|
|
143
|
+
// already been folded into cells, so later rebuilds ignore it. It's left in place, never deleted: deleteData
|
|
144
|
+
// only removes primitive leaves, not a whole store, and the flat tier is small enough not to matter.
|
|
145
|
+
if (!steps[STEP_IVF]) {
|
|
146
|
+
const flat = (0, transactionSet_1.transactionRead)(flatStore(database));
|
|
147
|
+
if (!flat)
|
|
148
|
+
return;
|
|
149
|
+
for (const ref of flat.keys()) {
|
|
150
|
+
allMembers.push({ ref, embedding: flat.get(ref) });
|
|
151
|
+
}
|
|
141
152
|
}
|
|
142
153
|
const centroids = (0, transactionSet_1.transactionRead)(centroidStore(database));
|
|
143
154
|
if (!centroids)
|
|
@@ -170,10 +181,9 @@ function rebuildStructure(database) {
|
|
|
170
181
|
continue;
|
|
171
182
|
}
|
|
172
183
|
centroidWrites.push({ key: oldCellId, value: undefined });
|
|
173
|
-
|
|
184
|
+
(0, transactionSet_1.transactionDelete)(cellStore(database, oldCellId));
|
|
174
185
|
}
|
|
175
186
|
(0, transactionSet_1.transactionMutate)(centroidStore(database), centroidWrites);
|
|
176
|
-
database.deleteData(root => root.flat);
|
|
177
187
|
database.writeData(root => root.count, allMembers.length);
|
|
178
188
|
database.writeData(root => root.steps[STEP_IVF], true);
|
|
179
189
|
}
|
|
@@ -182,7 +192,9 @@ function searchEmbeddings(database, query, options) {
|
|
|
182
192
|
const config = database.readData(root => root.config);
|
|
183
193
|
if (!config)
|
|
184
194
|
return undefined;
|
|
185
|
-
const steps =
|
|
195
|
+
const steps = database.readData(root => root.steps);
|
|
196
|
+
if (!steps)
|
|
197
|
+
return undefined;
|
|
186
198
|
const hits = [];
|
|
187
199
|
if (!steps[STEP_IVF]) {
|
|
188
200
|
const flat = (0, transactionSet_1.transactionRead)(flatStore(database));
|
|
@@ -214,22 +226,46 @@ function searchEmbeddings(database, query, options) {
|
|
|
214
226
|
return hits.slice(0, options.resultCount);
|
|
215
227
|
}
|
|
216
228
|
exports.searchEmbeddings = searchEmbeddings;
|
|
229
|
+
// Direct ref -> stored embedding lookup through the byRef index: one key-value read per ref, no cell scan. A
|
|
230
|
+
// search returns refs; this fetches the data behind them. Skips refs that aren't present; undefined if not synced.
|
|
231
|
+
function lookupEmbeddings(database, refs) {
|
|
232
|
+
const values = database.readData(root => refs.map(ref => root.byRef[ref]));
|
|
233
|
+
if (!values)
|
|
234
|
+
return undefined;
|
|
235
|
+
const result = new Map();
|
|
236
|
+
for (let index = 0; index < refs.length; index++) {
|
|
237
|
+
const value = values[index];
|
|
238
|
+
if (value) {
|
|
239
|
+
result.set(refs[index], decodeRefValue(value));
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return result;
|
|
243
|
+
}
|
|
244
|
+
exports.lookupEmbeddings = lookupEmbeddings;
|
|
217
245
|
function insertEmbeddings(database, items) {
|
|
218
246
|
if (!items.length)
|
|
219
|
-
return
|
|
247
|
+
return;
|
|
220
248
|
const config = database.readData(root => root.config);
|
|
249
|
+
const steps = database.readData(root => root.steps);
|
|
250
|
+
let count = database.readData(root => root.count);
|
|
221
251
|
if (!config)
|
|
222
|
-
return
|
|
223
|
-
|
|
224
|
-
|
|
252
|
+
return;
|
|
253
|
+
if (!steps)
|
|
254
|
+
return;
|
|
255
|
+
if (count === undefined)
|
|
256
|
+
return;
|
|
257
|
+
const newCount = count + items.length;
|
|
225
258
|
if (!steps[STEP_IVF]) {
|
|
226
259
|
const flatWrites = items.map(item => ({ key: item.ref, value: item.embedding }));
|
|
227
260
|
(0, transactionSet_1.transactionMutate)(flatStore(database), flatWrites);
|
|
261
|
+
for (const item of items) {
|
|
262
|
+
database.writeData(root => root.byRef[item.ref], encodeRefValue(item.embedding));
|
|
263
|
+
}
|
|
228
264
|
database.writeData(root => root.count, newCount);
|
|
229
265
|
if (newCount > FLAT_LIMIT) {
|
|
230
266
|
rebuildStructure(database);
|
|
231
267
|
}
|
|
232
|
-
return
|
|
268
|
+
return;
|
|
233
269
|
}
|
|
234
270
|
const centroids = (0, transactionSet_1.transactionRead)(centroidStore(database));
|
|
235
271
|
if (!centroids)
|
|
@@ -249,46 +285,70 @@ function insertEmbeddings(database, items) {
|
|
|
249
285
|
const memberWrites = group.map(item => ({ key: item.ref, value: item.embedding }));
|
|
250
286
|
(0, transactionSet_1.transactionMutate)(cellStore(database, cellId), memberWrites);
|
|
251
287
|
}
|
|
288
|
+
for (const item of items) {
|
|
289
|
+
database.writeData(root => root.byRef[item.ref], encodeRefValue(item.embedding));
|
|
290
|
+
}
|
|
252
291
|
database.writeData(root => root.count, newCount);
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
292
|
+
const shouldRegenerate = (database) => {
|
|
293
|
+
let steps = database.readData(root => root.steps);
|
|
294
|
+
if (!steps)
|
|
295
|
+
return;
|
|
296
|
+
for (const threshold of REGENERATE_AT) {
|
|
297
|
+
const stepName = "regen" + threshold;
|
|
298
|
+
if (!steps[stepName] && newCount > threshold) {
|
|
299
|
+
database.writeData(root => root.steps[stepName], true);
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
260
302
|
}
|
|
261
|
-
}
|
|
262
|
-
if (!regenerated) {
|
|
263
303
|
const averageFill = newCount / Math.max(1, centroids.size) / config.cellTargetSize;
|
|
264
304
|
if (Math.random() < rebalanceProbability(averageFill)) {
|
|
265
305
|
rebuildStructure(database);
|
|
266
306
|
}
|
|
307
|
+
return true;
|
|
308
|
+
};
|
|
309
|
+
if (shouldRegenerate(database)) {
|
|
310
|
+
rebuildStructure(database);
|
|
267
311
|
}
|
|
268
|
-
return true;
|
|
269
312
|
}
|
|
270
313
|
exports.insertEmbeddings = insertEmbeddings;
|
|
271
|
-
function removeEmbeddings(database,
|
|
272
|
-
if (!
|
|
273
|
-
return
|
|
274
|
-
const steps =
|
|
275
|
-
const count =
|
|
314
|
+
function removeEmbeddings(database, refs) {
|
|
315
|
+
if (!refs.length)
|
|
316
|
+
return;
|
|
317
|
+
const steps = database.readData(root => root.steps);
|
|
318
|
+
const count = database.readData(root => root.count);
|
|
319
|
+
if (!steps)
|
|
320
|
+
return;
|
|
321
|
+
if (count === undefined)
|
|
322
|
+
return;
|
|
276
323
|
if (!steps[STEP_IVF]) {
|
|
277
|
-
const flatDeletes =
|
|
324
|
+
const flatDeletes = refs.map(ref => ({ key: ref, value: undefined }));
|
|
278
325
|
(0, transactionSet_1.transactionMutate)(flatStore(database), flatDeletes);
|
|
279
|
-
|
|
280
|
-
|
|
326
|
+
for (const ref of refs) {
|
|
327
|
+
database.deleteData(root => root.byRef[ref]);
|
|
328
|
+
}
|
|
329
|
+
database.writeData(root => root.count, Math.max(0, count - refs.length));
|
|
330
|
+
return;
|
|
281
331
|
}
|
|
282
332
|
const centroids = (0, transactionSet_1.transactionRead)(centroidStore(database));
|
|
283
333
|
if (!centroids)
|
|
284
|
-
return
|
|
334
|
+
return;
|
|
285
335
|
if (!centroids.size)
|
|
286
|
-
return
|
|
336
|
+
return;
|
|
337
|
+
// Look up each ref's embedding through byRef, then rank its cells the way an insert would, so we delete from
|
|
338
|
+
// the cell it actually landed in (plus a few neighbours, in case a rebuild nudged it across a boundary).
|
|
339
|
+
const refValues = database.readData(root => refs.map(ref => root.byRef[ref]));
|
|
340
|
+
if (!refValues)
|
|
341
|
+
return;
|
|
287
342
|
const candidatesByItem = [];
|
|
288
343
|
const candidateSet = new Set();
|
|
289
|
-
for (
|
|
290
|
-
const
|
|
291
|
-
|
|
344
|
+
for (let index = 0; index < refs.length; index++) {
|
|
345
|
+
const value = refValues[index];
|
|
346
|
+
if (!value) {
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
const embedding = decodeRefValue(value);
|
|
350
|
+
const cellIds = rankCellsByCloseness(embedding, centroids).slice(0, 1 + DELETE_FALLBACK_CELLS);
|
|
351
|
+
candidatesByItem.push({ ref: refs[index], cellIds });
|
|
292
352
|
for (const cellId of cellIds) {
|
|
293
353
|
candidateSet.add(cellId);
|
|
294
354
|
}
|
|
@@ -296,39 +356,41 @@ function removeEmbeddings(database, items) {
|
|
|
296
356
|
const candidateCellIds = Array.from(candidateSet);
|
|
297
357
|
const stores = database.readData(root => candidateCellIds.map(cellId => root.cells[cellId]));
|
|
298
358
|
if (!stores)
|
|
299
|
-
return
|
|
359
|
+
return;
|
|
300
360
|
const membersByCell = new Map();
|
|
301
361
|
for (let index = 0; index < candidateCellIds.length; index++) {
|
|
302
362
|
membersByCell.set(candidateCellIds[index], (0, transactionSet_1.replayTransactionStore)(stores[index]));
|
|
303
363
|
}
|
|
304
364
|
const deletesByCell = new Map();
|
|
365
|
+
const deletedRefs = [];
|
|
305
366
|
for (const candidate of candidatesByItem) {
|
|
306
367
|
for (const cellId of candidate.cellIds) {
|
|
307
368
|
const members = membersByCell.get(cellId);
|
|
308
369
|
if (!members || !members.has(candidate.ref)) {
|
|
309
370
|
continue;
|
|
310
371
|
}
|
|
311
|
-
let
|
|
312
|
-
if (!
|
|
313
|
-
|
|
314
|
-
deletesByCell.set(cellId,
|
|
372
|
+
let cellRefs = deletesByCell.get(cellId);
|
|
373
|
+
if (!cellRefs) {
|
|
374
|
+
cellRefs = [];
|
|
375
|
+
deletesByCell.set(cellId, cellRefs);
|
|
315
376
|
}
|
|
316
|
-
|
|
377
|
+
cellRefs.push(candidate.ref);
|
|
378
|
+
deletedRefs.push(candidate.ref);
|
|
317
379
|
break;
|
|
318
380
|
}
|
|
319
381
|
}
|
|
320
|
-
let deletedCount = 0;
|
|
321
382
|
for (const cellId of deletesByCell.keys()) {
|
|
322
|
-
const
|
|
323
|
-
|
|
324
|
-
const memberDeletes = refs.map(ref => ({ key: ref, value: undefined }));
|
|
383
|
+
const cellRefs = deletesByCell.get(cellId);
|
|
384
|
+
const memberDeletes = cellRefs.map(ref => ({ key: ref, value: undefined }));
|
|
325
385
|
(0, transactionSet_1.transactionMutate)(cellStore(database, cellId), memberDeletes);
|
|
326
386
|
}
|
|
327
|
-
|
|
328
|
-
database.
|
|
387
|
+
for (const ref of deletedRefs) {
|
|
388
|
+
database.deleteData(root => root.byRef[ref]);
|
|
389
|
+
}
|
|
390
|
+
if (deletedRefs.length) {
|
|
391
|
+
database.writeData(root => root.count, Math.max(0, count - deletedRefs.length));
|
|
329
392
|
}
|
|
330
|
-
return true;
|
|
331
393
|
}
|
|
332
394
|
exports.removeEmbeddings = removeEmbeddings;
|
|
333
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXZmRW1iZWRkaW5nRGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpdmZFbWJlZGRpbmdEYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBeUQ7QUFDekQscURBQW1IO0FBQ25ILDBEQUF5SjtBQTBCekosaUdBQWlHO0FBQ2pHLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQztBQUN4Qix5SkFBeUo7QUFDekosTUFBTSxhQUFhLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDcEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBQ3ZCLHFIQUFxSDtBQUNySCxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQUNqQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUUvQixTQUFTLFNBQVMsQ0FBQyxRQUFvQztJQUNuRCxPQUFPLElBQUEsNEJBQWlCLEVBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFDRCxTQUFTLGFBQWEsQ0FBQyxRQUFvQztJQUN2RCxPQUFPLElBQUEsNEJBQWlCLEVBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRCxTQUFTLFNBQVMsQ0FBQyxRQUFvQyxFQUFFLE1BQWM7SUFDbkUsT0FBTyxJQUFBLDRCQUFpQixFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsUUFBb0M7O0lBQ25ELE9BQU8sTUFBQSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQ0FBSSxFQUFFLENBQUM7QUFDdkQsQ0FBQztB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QUFZLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBakVELDRDQWlFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFiYXNlLCBuYW1lc3BhY2VEYXRhYmFzZSB9IGZyb20gXCIuL0RhdGFiYXNlXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblNldFN0b3JlLCB0cmFuc2FjdGlvblJlYWQsIHRyYW5zYWN0aW9uTXV0YXRlLCByZXBsYXlUcmFuc2FjdGlvblN0b3JlIH0gZnJvbSBcIi4vdHJhbnNhY3Rpb25TZXRcIjtcbmltcG9ydCB7IFN0b3JlZEVtYmVkZGluZywgRW1iZWRkaW5nRm9ybWF0LCBnZXRDbG9zZW5lc3MsIGVtYmVkZGluZ1RvRmxvYXQzMiwgcmVsZWFzZUZsb2F0MzIsIGVuY29kZUVtYmVkZGluZywgaGFzaEVtYmVkZGluZyB9IGZyb20gXCIuLi9lbWJlZGRpbmdGb3JtYXRzXCI7XG5cbmV4cG9ydCB0eXBlIEl2ZkNvbmZpZyA9IHtcbiAgICBtb2RlbDogc3RyaW5nO1xuICAgIGZvcm1hdDogRW1iZWRkaW5nRm9ybWF0O1xuICAgIC8vIFRhcmdldCBudW1iZXIgb2YgZW1iZWRkaW5ncyBwZXIgY2VsbC5cbiAgICBjZWxsVGFyZ2V0U2l6ZTogbnVtYmVyO1xufTtcblxuLy8gVGllcmVkIHN0b3JhZ2UuIEJlbG93IEZMQVRfTElNSVQgZW1iZWRkaW5ncyB0aGUgd2hvbGUgc2V0IGxpdmVzIGluIG9uZSBmbGF0IHRyYW5zYWN0aW9uIHNldCAobm8gSVZGKTtcbi8vIG9uY2UgaXQgZ3Jvd3MgcGFzdCB0aGF0IHdlIGJ1aWxkIHRoZSBJVkYgKGNlbnRyb2lkcyArIHBlci1jZWxsIHNldHMpIGFuZCBzdGF5IHRoZXJlIGZvcmV2ZXIuIGBjb3VudGAgaXNcbi8vIHRoZSBsaXZlIGVtYmVkZGluZyBjb3VudCAocmUtZGVyaXZlZCBleGFjdGx5IG9uIGEgcmVidWlsZCkuIGBzdGVwc2AgcmVjb3JkcyBvbmUtdGltZSB1cGdyYWRlcyB0aGF0IG11c3Rcbi8vIG5ldmVyIHJlLXJ1biBldmVuIGlmIHRoZSBzZXQgbGF0ZXIgc2hyaW5rcyBhbmQgcmVncm93cy5cbmV4cG9ydCB0eXBlIEl2ZkVtYmVkZGluZ1Jvb3QgPSB7XG4gICAgY29uZmlnOiBJdmZDb25maWc7XG4gICAgY291bnQ6IG51bWJlcjtcbiAgICBmbGF0OiBUcmFuc2FjdGlvblNldFN0b3JlPFN0b3JlZEVtYmVkZGluZz47XG4gICAgc3RlcHM6IHsgW3N0ZXA6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgICBjZW50cm9pZHM6IFRyYW5zYWN0aW9uU2V0U3RvcmU8U3RvcmVkRW1iZWRkaW5nPjtcbiAgICBjZWxsczogeyBbY2VsbElkOiBzdHJpbmddOiBUcmFuc2FjdGlvblNldFN0b3JlPFN0b3JlZEVtYmVkZGluZz4gfTtcbn07XG5cbmV4cG9ydCB0eXBlIEVtYmVkZGluZ0lucHV0ID0geyByZWY6IHN0cmluZzsgZW1iZWRkaW5nOiBTdG9yZWRFbWJlZGRpbmcgfTtcbmV4cG9ydCB0eXBlIFNlYXJjaEhpdCA9IHsgcmVmOiBzdHJpbmc7IGNsb3NlbmVzczogbnVtYmVyIH07XG50eXBlIENlbGxFbnRyeSA9IHsgcmVmOiBzdHJpbmc7IGVtYmVkZGluZzogU3RvcmVkRW1iZWRkaW5nIH07XG5cbi8vIEJlbG93IHRoaXMgbWFueSBlbWJlZGRpbmdzIHdlIHNraXAgdGhlIElWRiBlbnRpcmVseSAoZmxhdCBzdG9yZSkuIDEwMjQgPSBhIGNsZWFuIHBvd2VyIG9mIHR3by5cbmNvbnN0IEZMQVRfTElNSVQgPSAxMDI0O1xuLy8gRm9yY2UgYSBmcm9tLXNjcmF0Y2ggcmVidWlsZCBvbmNlIGF0IGVhY2ggb2YgdGhlc2UgKG11bHRpcGxlcyBvZiA0IGFib3ZlIEZMQVRfTElNSVQsIHVwIHRvIH4xNmspLCBnYXRlZCBieSBhIHN0ZXAgZmxhZyBzbyBlYWNoIHJ1bnMgYXQgbW9zdCBvbmNlIGV2ZXIuXG5jb25zdCBSRUdFTkVSQVRFX0FUID0gWzQwOTYsIDE2Mzg0XTtcbmNvbnN0IFNURVBfSVZGID0gXCJpdmZcIjtcbi8vIE9uIGRlbGV0ZSwgdGhlIG1lbWJlcidzIGV4YWN0IGNlbGwgcGx1cyB0aGlzIG1hbnkgbmVhcmJ5IGNlbGxzIGFyZSBjaGVja2VkLCBpbiBjYXNlIGEgcmVidWlsZCBsZWZ0IGl0IG5vbi1vcHRpbWFsLlxuY29uc3QgREVMRVRFX0ZBTExCQUNLX0NFTExTID0gMTA7XG5jb25zdCBSRUJBTEFOQ0VfSVRFUkFUSU9OUyA9IDQ7XG5cbmZ1bmN0aW9uIGZsYXRTdG9yZShkYXRhYmFzZTogRGF0YWJhc2U8SXZmRW1iZWRkaW5nUm9vdD4pOiBEYXRhYmFzZTxUcmFuc2FjdGlvblNldFN0b3JlPFN0b3JlZEVtYmVkZGluZz4+IHtcbiAgICByZXR1cm4gbmFtZXNwYWNlRGF0YWJhc2UoZGF0YWJhc2UsIHJvb3QgPT4gcm9vdC5mbGF0KTtcbn1cbmZ1bmN0aW9uIGNlbnRyb2lkU3RvcmUoZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+KTogRGF0YWJhc2U8VHJhbnNhY3Rpb25TZXRTdG9yZTxTdG9yZWRFbWJlZGRpbmc+PiB7XG4gICAgcmV0dXJuIG5hbWVzcGFjZURhdGFiYXNlKGRhdGFiYXNlLCByb290ID0+IHJvb3QuY2VudHJvaWRzKTtcbn1cbmZ1bmN0aW9uIGNlbGxTdG9yZShkYXRhYmFzZTogRGF0YWJhc2U8SXZmRW1iZWRkaW5nUm9vdD4sIGNlbGxJZDogc3RyaW5nKTogRGF0YWJhc2U8VHJhbnNhY3Rpb25TZXRTdG9yZTxTdG9yZWRFbWJlZGRpbmc+PiB7XG4gICAgcmV0dXJuIG5hbWVzcGFjZURhdGFiYXNlKGRhdGFiYXNlLCByb290ID0+IHJvb3QuY2VsbHNbY2VsbElkXSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRTdGVwcyhkYXRhYmFzZTogRGF0YWJhc2U8SXZmRW1iZWRkaW5nUm9vdD4pOiB7IFtzdGVwOiBzdHJpbmddOiBib29sZWFuIH0ge1xuICAgIHJldHVybiBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3Quc3RlcHMpID8/IHt9O1xufVxuZnVuY3Rpb24gcmVhZENvdW50KGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290Pik6IG51bWJlciB7XG4gICAgcmV0dXJuIGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5jb3VudCkgPz8gMDtcbn1cblxuZnVuY3Rpb24gcmFua0NlbGxzQnlDbG9zZW5lc3MoZW1iZWRkaW5nOiBTdG9yZWRFbWJlZGRpbmcsIGNlbnRyb2lkczogTWFwPHN0cmluZywgU3RvcmVkRW1iZWRkaW5nPik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByYW5rZWQ6IHsgY2VsbElkOiBzdHJpbmc7IGNsb3NlbmVzczogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2VsbElkIG9mIGNlbnRyb2lkcy5rZXlzKCkpIHtcbiAgICAgICAgcmFua2VkLnB1c2goeyBjZWxsSWQsIGNsb3NlbmVzczogZ2V0Q2xvc2VuZXNzKGVtYmVkZGluZywgY2VudHJvaWRzLmdldChjZWxsSWQpISkgfSk7XG4gICAgfVxuICAgIHJhbmtlZC5zb3J0KChsZWZ0LCByaWdodCkgPT4gcmlnaHQuY2xvc2VuZXNzIC0gbGVmdC5jbG9zZW5lc3MpO1xuICAgIHJldHVybiByYW5rZWQubWFwKGVudHJ5ID0+IGVudHJ5LmNlbGxJZCk7XG59XG5cbi8vIFBlci13cml0ZSBjaGFuY2Ugb2YgYSBmdWxsIHJlYnVpbGQuIFplcm8gYXQvdW5kZXIgdGhlIHRhcmdldCBzaXplLCB0aGVuIHJpc2VzIChjdWJpY2FsbHkpIHBhc3QgaXQgc28gY2VsbHNcbi8vIHN0YXkgcm91Z2hseSBiZXR3ZWVuIHRhcmdldCBhbmQgfjJ4IHRhcmdldC5cbmZ1bmN0aW9uIHJlYmFsYW5jZVByb2JhYmlsaXR5KGZpbGxSYXRpbzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoZmlsbFJhdGlvIDw9IDEpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IG92ZXIgPSBmaWxsUmF0aW8gLSAxO1xuICAgIHJldHVybiBNYXRoLm1pbigxLCBvdmVyICogb3ZlciAqIG92ZXIgKiAwLjI1KTtcbn1cblxuLy8gay1tZWFucy4gRGVjb2RlcyBldmVyeSBtZW1iZXIgdG8gYSBwb29sZWQgZmxvYXQzMiBidWZmZXIgT05DRSwgdGhlbiBhc3NpZ25zIHdpdGggYSBwbGFpbiBpbnRlcm5hbCBmbG9hdFxuLy8gZG90IChubyBnZXRDbG9zZW5lc3MgY2FsbCDigJQgY29tcGFyaW5nIHR3byBmbG9hdCB2ZWN0b3JzIGlzIHRyaXZpYWwpIGFuZCBrZWVwcyBjZW50cm9pZHMgYXMgZmxvYXQgbWVhbnMsXG4vLyBlbmNvZGluZyB0aGVtIHRvIFN0b3JlZEVtYmVkZGluZyBvbmx5IGF0IHRoZSBlbmQuIFJlbGVhc2VzIHRoZSBib3Jyb3dlZCBidWZmZXJzIHdoZW4gZG9uZS5cbmZ1bmN0aW9uIGNsdXN0ZXJNZW1iZXJzKG1lbWJlcnM6IENlbGxFbnRyeVtdLCBjbHVzdGVyQ291bnQ6IG51bWJlciwgY29uZmlnOiBJdmZDb25maWcpOiB7IGNlbnRyb2lkOiBTdG9yZWRFbWJlZGRpbmc7IG1lbWJlcnM6IENlbGxFbnRyeVtdIH1bXSB7XG4gICAgY29uc3QgbWVtYmVyRmxvYXRzOiBGbG9hdDMyQXJyYXlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMpIHtcbiAgICAgICAgbWVtYmVyRmxvYXRzLnB1c2goZW1iZWRkaW5nVG9GbG9hdDMyKG1lbWJlci5lbWJlZGRpbmcsIHRydWUpKTtcbiAgICB9XG4gICAgY29uc3QgbGVuZ3RoID0gbWVtYmVyRmxvYXRzLmxlbmd0aCA/IG1lbWJlckZsb2F0c1swXS5sZW5ndGggOiAwO1xuICAgIGxldCBjZW50cm9pZHM6IEZsb2F0MzJBcnJheVtdID0gW107XG4gICAgY29uc3Qgc2VlZFN0ZXAgPSBtZW1iZXJzLmxlbmd0aCAvIGNsdXN0ZXJDb3VudDtcbiAgICBmb3IgKGxldCBjbHVzdGVySW5kZXggPSAwOyBjbHVzdGVySW5kZXggPCBjbHVzdGVyQ291bnQ7IGNsdXN0ZXJJbmRleCsrKSB7XG4gICAgICAgIGNlbnRyb2lkcy5wdXNoKG5ldyBGbG9hdDMyQXJyYXkobWVtYmVyRmxvYXRzW01hdGguZmxvb3IoY2x1c3RlckluZGV4ICogc2VlZFN0ZXApXSkpO1xuICAgIH1cbiAgICBsZXQgZ3JvdXBzOiBudW1iZXJbXVtdID0gW107XG4gICAgZm9yIChsZXQgaXRlcmF0aW9uID0gMDsgaXRlcmF0aW9uIDwgUkVCQUxBTkNFX0lURVJBVElPTlM7IGl0ZXJhdGlvbisrKSB7XG4gICAgICAgIGdyb3VwcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBjbHVzdGVySW5kZXggPSAwOyBjbHVzdGVySW5kZXggPCBjZW50cm9pZHMubGVuZ3RoOyBjbHVzdGVySW5kZXgrKykge1xuICAgICAgICAgICAgZ3JvdXBzLnB1c2goW10pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IG1lbWJlckluZGV4ID0gMDsgbWVtYmVySW5kZXggPCBtZW1iZXJGbG9hdHMubGVuZ3RoOyBtZW1iZXJJbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBtZW1iZXJGbG9hdCA9IG1lbWJlckZsb2F0c1ttZW1iZXJJbmRleF07XG4gICAgICAgICAgICBsZXQgYmVzdEluZGV4ID0gMDtcbiAgICAgICAgICAgIGxldCBiZXN0RG90ID0gLUluZmluaXR5O1xuICAgICAgICAgICAgZm9yIChsZXQgY2VudHJvaWRJbmRleCA9IDA7IGNlbnRyb2lkSW5kZXggPCBjZW50cm9pZHMubGVuZ3RoOyBjZW50cm9pZEluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZW50cm9pZEZsb2F0ID0gY2VudHJvaWRzW2NlbnRyb2lkSW5kZXhdO1xuICAgICAgICAgICAgICAgIGxldCBkb3QgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IGxlbmd0aDsgZGltKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZG90ICs9IG1lbWJlckZsb2F0W2RpbV0gKiBjZW50cm9pZEZsb2F0W2RpbV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkb3QgPiBiZXN0RG90KSB7XG4gICAgICAgICAgICAgICAgICAgIGJlc3REb3QgPSBkb3Q7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RJbmRleCA9IGNlbnRyb2lkSW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JvdXBzW2Jlc3RJbmRleF0ucHVzaChtZW1iZXJJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV4dENlbnRyb2lkczogRmxvYXQzMkFycmF5W10gPSBbXTtcbiAgICAgICAgY29uc3QgbmV4dEdyb3VwczogbnVtYmVyW11bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGdyb3Vwcykge1xuICAgICAgICAgICAgaWYgKCFncm91cC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1lYW4gPSBuZXcgRmxvYXQzMkFycmF5KGxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1lbWJlckluZGV4IG9mIGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVtYmVyRmxvYXQgPSBtZW1iZXJGbG9hdHNbbWVtYmVySW5kZXhdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IGxlbmd0aDsgZGltKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbWVhbltkaW1dICs9IG1lbWJlckZsb2F0W2RpbV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG5vcm0gPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgbGVuZ3RoOyBkaW0rKykge1xuICAgICAgICAgICAgICAgIG5vcm0gKz0gbWVhbltkaW1dICogbWVhbltkaW1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWFnbml0dWRlID0gTWF0aC5zcXJ0KG5vcm0pIHx8IDE7XG4gICAgICAgICAgICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCBsZW5ndGg7IGRpbSsrKSB7XG4gICAgICAgICAgICAgICAgbWVhbltkaW1dIC89IG1hZ25pdHVkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHRDZW50cm9pZHMucHVzaChtZWFuKTtcbiAgICAgICAgICAgIG5leHRHcm91cHMucHVzaChncm91cCk7XG4gICAgICAgIH1cbiAgICAgICAgY2VudHJvaWRzID0gbmV4dENlbnRyb2lkcztcbiAgICAgICAgZ3JvdXBzID0gbmV4dEdyb3VwcztcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiB7IGNlbnRyb2lkOiBTdG9yZWRFbWJlZGRpbmc7IG1lbWJlcnM6IENlbGxFbnRyeVtdIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IGNsdXN0ZXJJbmRleCA9IDA7IGNsdXN0ZXJJbmRleCA8IGNlbnRyb2lkcy5sZW5ndGg7IGNsdXN0ZXJJbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGNlbnRyb2lkID0gZW5jb2RlRW1iZWRkaW5nKHsgaW5wdXQ6IGNlbnRyb2lkc1tjbHVzdGVySW5kZXhdLCBmb3JtYXQ6IGNvbmZpZy5mb3JtYXQsIG1vZGVsOiBjb25maWcubW9kZWwgfSk7XG4gICAgICAgIGNvbnN0IGNlbGxNZW1iZXJzOiBDZWxsRW50cnlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlckluZGV4IG9mIGdyb3Vwc1tjbHVzdGVySW5kZXhdKSB7XG4gICAgICAgICAgICBjZWxsTWVtYmVycy5wdXNoKG1lbWJlcnNbbWVtYmVySW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaCh7IGNlbnRyb2lkLCBtZW1iZXJzOiBjZWxsTWVtYmVycyB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZW1iZXJGbG9hdCBvZiBtZW1iZXJGbG9hdHMpIHtcbiAgICAgICAgcmVsZWFzZUZsb2F0MzIobWVtYmVyRmxvYXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBSZS1jbHVzdGVyIEVWRVJZIGVtYmVkZGluZyAoZmxhdCB0aWVyICsgYWxsIGNlbGxzKSBpbnRvIGEgZnJlc2ggSVZGLCBjbGVhciB0aGUgZmxhdCB0aWVyLCBhbmQgbWFyayBJVkZcbi8vIG1vZGUuIFRoaXMgaXMgdGhlIHJlYXJyYW5nZXI6IHJ1biBwcm9iYWJpbGlzdGljYWxseSBhcyB0aGUgc2V0IGdyb3dzLCBvbmNlIGF0IGVhY2ggcmVnZW5lcmF0ZSB0aHJlc2hvbGQsXG4vLyBhbmQgb25jZSB0byB1cGdyYWRlIGZyb20gZmxhdC4gUmVhZHMgZXZlcnl0aGluZyBpdCB1c2VzLCBzbyBpdCBiYWlscyAoZG9lcyBub3RoaW5nKSBpZiBhbnl0aGluZyBpc24ndFxuLy8gc3luY2VkIGFuZCB0aGUgY2FsbGVyJ3MgcmV0cnkgcmUtcnVucyBpdDsgbm8gY2FsbGVyIGNhcmVzIGFib3V0IGl0cyByZXN1bHQuXG5leHBvcnQgZnVuY3Rpb24gcmVidWlsZFN0cnVjdHVyZShkYXRhYmFzZTogRGF0YWJhc2U8SXZmRW1iZWRkaW5nUm9vdD4pOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3QuY29uZmlnKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuXG4gICAgY29uc3QgYWxsTWVtYmVyczogQ2VsbEVudHJ5W10gPSBbXTtcbiAgICBjb25zdCBmbGF0ID0gdHJhbnNhY3Rpb25SZWFkKGZsYXRTdG9yZShkYXRhYmFzZSkpO1xuICAgIGlmICghZmxhdCkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgcmVmIG9mIGZsYXQua2V5cygpKSB7XG4gICAgICAgIGFsbE1lbWJlcnMucHVzaCh7IHJlZiwgZW1iZWRkaW5nOiBmbGF0LmdldChyZWYpISB9KTtcbiAgICB9XG4gICAgY29uc3QgY2VudHJvaWRzID0gdHJhbnNhY3Rpb25SZWFkKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpKTtcbiAgICBpZiAoIWNlbnRyb2lkcykgcmV0dXJuO1xuICAgIGNvbnN0IG9sZENlbGxJZHMgPSBBcnJheS5mcm9tKGNlbnRyb2lkcy5rZXlzKCkpO1xuICAgIGNvbnN0IGNlbGxTdG9yZXMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IG9sZENlbGxJZHMubWFwKGNlbGxJZCA9PiByb290LmNlbGxzW2NlbGxJZF0pKTtcbiAgICBpZiAoIWNlbGxTdG9yZXMpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IHN0b3JlIG9mIGNlbGxTdG9yZXMpIHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IHJlcGxheVRyYW5zYWN0aW9uU3RvcmU8U3RvcmVkRW1iZWRkaW5nPihzdG9yZSk7XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIG1lbWJlcnMua2V5cygpKSB7XG4gICAgICAgICAgICBhbGxNZW1iZXJzLnB1c2goeyByZWYsIGVtYmVkZGluZzogbWVtYmVycy5nZXQocmVmKSEgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFhbGxNZW1iZXJzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2x1c3RlckNvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChhbGxNZW1iZXJzLmxlbmd0aCAvIGNvbmZpZy5jZWxsVGFyZ2V0U2l6ZSkpO1xuICAgIGNvbnN0IGNsdXN0ZXJzID0gY2x1c3Rlck1lbWJlcnMoYWxsTWVtYmVycywgY2x1c3RlckNvdW50LCBjb25maWcpO1xuXG4gICAgY29uc3QgbmV3Q2VsbElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGNlbnRyb2lkV3JpdGVzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogU3RvcmVkRW1iZWRkaW5nIHwgdW5kZWZpbmVkIH1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2x1c3RlciBvZiBjbHVzdGVycykge1xuICAgICAgICBjb25zdCBjZWxsSWQgPSBoYXNoRW1iZWRkaW5nKGNsdXN0ZXIuY2VudHJvaWQpO1xuICAgICAgICBuZXdDZWxsSWRzLmFkZChjZWxsSWQpO1xuICAgICAgICBjZW50cm9pZFdyaXRlcy5wdXNoKHsga2V5OiBjZWxsSWQsIHZhbHVlOiBjbHVzdGVyLmNlbnRyb2lkIH0pO1xuICAgICAgICBjb25zdCBtZW1iZXJXcml0ZXMgPSBjbHVzdGVyLm1lbWJlcnMubWFwKG1lbWJlciA9PiAoeyBrZXk6IG1lbWJlci5yZWYsIHZhbHVlOiBtZW1iZXIuZW1iZWRkaW5nIH0pKTtcbiAgICAgICAgdHJhbnNhY3Rpb25NdXRhdGUoY2VsbFN0b3JlKGRhdGFiYXNlLCBjZWxsSWQpLCBtZW1iZXJXcml0ZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9sZENlbGxJZCBvZiBvbGRDZWxsSWRzKSB7XG4gICAgICAgIGlmIChuZXdDZWxsSWRzLmhhcyhvbGRDZWxsSWQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjZW50cm9pZFdyaXRlcy5wdXNoKHsga2V5OiBvbGRDZWxsSWQsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIGRhdGFiYXNlLmRlbGV0ZURhdGEocm9vdCA9PiByb290LmNlbGxzW29sZENlbGxJZF0pO1xuICAgIH1cbiAgICB0cmFuc2FjdGlvbk11dGF0ZShjZW50cm9pZFN0b3JlKGRhdGFiYXNlKSwgY2VudHJvaWRXcml0ZXMpO1xuICAgIGRhdGFiYXNlLmRlbGV0ZURhdGEocm9vdCA9PiByb290LmZsYXQpO1xuICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3QuY291bnQsIGFsbE1lbWJlcnMubGVuZ3RoKTtcbiAgICBkYXRhYmFzZS53cml0ZURhdGEocm9vdCA9PiByb290LnN0ZXBzW1NURVBfSVZGXSwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWFyY2hFbWJlZGRpbmdzKFxuICAgIGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290PixcbiAgICBxdWVyeTogU3RvcmVkRW1iZWRkaW5nLFxuICAgIG9wdGlvbnM6IHsgcHJvYmVCdWRnZXQ6IG51bWJlcjsgcmVzdWx0Q291bnQ6IG51bWJlciB9LFxuKTogU2VhcmNoSGl0W10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5jb25maWcpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0ZXBzID0gcmVhZFN0ZXBzKGRhdGFiYXNlKTtcblxuICAgIGNvbnN0IGhpdHM6IFNlYXJjaEhpdFtdID0gW107XG4gICAgaWYgKCFzdGVwc1tTVEVQX0lWRl0pIHtcbiAgICAgICAgY29uc3QgZmxhdCA9IHRyYW5zYWN0aW9uUmVhZChmbGF0U3RvcmUoZGF0YWJhc2UpKTtcbiAgICAgICAgaWYgKCFmbGF0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiBmbGF0LmtleXMoKSkge1xuICAgICAgICAgICAgaGl0cy5wdXNoKHsgcmVmLCBjbG9zZW5lc3M6IGdldENsb3NlbmVzcyhxdWVyeSwgZmxhdC5nZXQocmVmKSEpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGhpdHMuc29ydCgobGVmdCwgcmlnaHQpID0+IHJpZ2h0LmNsb3NlbmVzcyAtIGxlZnQuY2xvc2VuZXNzKTtcbiAgICAgICAgcmV0dXJuIGhpdHMuc2xpY2UoMCwgb3B0aW9ucy5yZXN1bHRDb3VudCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2VudHJvaWRzID0gdHJhbnNhY3Rpb25SZWFkKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpKTtcbiAgICBpZiAoIWNlbnRyb2lkcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIWNlbnRyb2lkcy5zaXplKSByZXR1cm4gW107XG4gICAgY29uc3QgcHJvYmVDZWxsQ291bnQgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwob3B0aW9ucy5wcm9iZUJ1ZGdldCAvIGNvbmZpZy5jZWxsVGFyZ2V0U2l6ZSkpO1xuICAgIGNvbnN0IHByb2JlQ2VsbElkcyA9IHJhbmtDZWxsc0J5Q2xvc2VuZXNzKHF1ZXJ5LCBjZW50cm9pZHMpLnNsaWNlKDAsIHByb2JlQ2VsbENvdW50KTtcbiAgICBjb25zdCBzdG9yZXMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHByb2JlQ2VsbElkcy5tYXAoY2VsbElkID0+IHJvb3QuY2VsbHNbY2VsbElkXSkpO1xuICAgIGlmICghc3RvcmVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3Qgc3RvcmUgb2Ygc3RvcmVzKSB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSByZXBsYXlUcmFuc2FjdGlvblN0b3JlPFN0b3JlZEVtYmVkZGluZz4oc3RvcmUpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiBtZW1iZXJzLmtleXMoKSkge1xuICAgICAgICAgICAgaGl0cy5wdXNoKHsgcmVmLCBjbG9zZW5lc3M6IGdldENsb3NlbmVzcyhxdWVyeSwgbWVtYmVycy5nZXQocmVmKSEpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhpdHMuc29ydCgobGVmdCwgcmlnaHQpID0+IHJpZ2h0LmNsb3NlbmVzcyAtIGxlZnQuY2xvc2VuZXNzKTtcbiAgICByZXR1cm4gaGl0cy5zbGljZSgwLCBvcHRpb25zLnJlc3VsdENvdW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIGl0ZW1zOiBFbWJlZGRpbmdJbnB1dFtdLFxuKTogdHJ1ZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGNvbmZpZyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5jb25maWcpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0ZXBzID0gcmVhZFN0ZXBzKGRhdGFiYXNlKTtcbiAgICBjb25zdCBuZXdDb3VudCA9IHJlYWRDb3VudChkYXRhYmFzZSkgKyBpdGVtcy5sZW5ndGg7XG5cbiAgICBpZiAoIXN0ZXBzW1NURVBfSVZGXSkge1xuICAgICAgICBjb25zdCBmbGF0V3JpdGVzID0gaXRlbXMubWFwKGl0ZW0gPT4gKHsga2V5OiBpdGVtLnJlZiwgdmFsdWU6IGl0ZW0uZW1iZWRkaW5nIH0pKTtcbiAgICAgICAgdHJhbnNhY3Rpb25NdXRhdGUoZmxhdFN0b3JlKGRhdGFiYXNlKSwgZmxhdFdyaXRlcyk7XG4gICAgICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3QuY291bnQsIG5ld0NvdW50KTtcbiAgICAgICAgaWYgKG5ld0NvdW50ID4gRkxBVF9MSU1JVCkge1xuICAgICAgICAgICAgcmVidWlsZFN0cnVjdHVyZShkYXRhYmFzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2VudHJvaWRzID0gdHJhbnNhY3Rpb25SZWFkKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpKTtcbiAgICBpZiAoIWNlbnRyb2lkcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBpdGVtc0J5Q2VsbCA9IG5ldyBNYXA8c3RyaW5nLCBFbWJlZGRpbmdJbnB1dFtdPigpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBjb25zdCBjZWxsSWQgPSByYW5rQ2VsbHNCeUNsb3NlbmVzcyhpdGVtLmVtYmVkZGluZywgY2VudHJvaWRzKVswXTtcbiAgICAgICAgbGV0IGdyb3VwID0gaXRlbXNCeUNlbGwuZ2V0KGNlbGxJZCk7XG4gICAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgICAgIGdyb3VwID0gW107XG4gICAgICAgICAgICBpdGVtc0J5Q2VsbC5zZXQoY2VsbElkLCBncm91cCk7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAucHVzaChpdGVtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjZWxsSWQgb2YgaXRlbXNCeUNlbGwua2V5cygpKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gaXRlbXNCeUNlbGwuZ2V0KGNlbGxJZCkhO1xuICAgICAgICBjb25zdCBtZW1iZXJXcml0ZXMgPSBncm91cC5tYXAoaXRlbSA9PiAoeyBrZXk6IGl0ZW0ucmVmLCB2YWx1ZTogaXRlbS5lbWJlZGRpbmcgfSkpO1xuICAgICAgICB0cmFuc2FjdGlvbk11dGF0ZShjZWxsU3RvcmUoZGF0YWJhc2UsIGNlbGxJZCksIG1lbWJlcldyaXRlcyk7XG4gICAgfVxuICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3QuY291bnQsIG5ld0NvdW50KTtcblxuICAgIGxldCByZWdlbmVyYXRlZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgdGhyZXNob2xkIG9mIFJFR0VORVJBVEVfQVQpIHtcbiAgICAgICAgY29uc3Qgc3RlcE5hbWUgPSBcInJlZ2VuXCIgKyB0aHJlc2hvbGQ7XG4gICAgICAgIGlmICghc3RlcHNbc3RlcE5hbWVdICYmIG5ld0NvdW50ID4gdGhyZXNob2xkKSB7XG4gICAgICAgICAgICByZWJ1aWxkU3RydWN0dXJlKGRhdGFiYXNlKTtcbiAgICAgICAgICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3Quc3RlcHNbc3RlcE5hbWVdLCB0cnVlKTtcbiAgICAgICAgICAgIHJlZ2VuZXJhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXJlZ2VuZXJhdGVkKSB7XG4gICAgICAgIGNvbnN0IGF2ZXJhZ2VGaWxsID0gbmV3Q291bnQgLyBNYXRoLm1heCgxLCBjZW50cm9pZHMuc2l6ZSkgLyBjb25maWcuY2VsbFRhcmdldFNpemU7XG4gICAgICAgIGlmIChNYXRoLnJhbmRvbSgpIDwgcmViYWxhbmNlUHJvYmFiaWxpdHkoYXZlcmFnZUZpbGwpKSB7XG4gICAgICAgICAgICByZWJ1aWxkU3RydWN0dXJlKGRhdGFiYXNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIGl0ZW1zOiBFbWJlZGRpbmdJbnB1dFtdLFxuKTogdHJ1ZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHN0ZXBzID0gcmVhZFN0ZXBzKGRhdGFiYXNlKTtcbiAgICBjb25zdCBjb3VudCA9IHJlYWRDb3VudChkYXRhYmFzZSk7XG5cbiAgICBpZiAoIXN0ZXBzW1NURVBfSVZGXSkge1xuICAgICAgICBjb25zdCBmbGF0RGVsZXRlcyA9IGl0ZW1zLm1hcChpdGVtID0+ICh7IGtleTogaXRlbS5yZWYsIHZhbHVlOiB1bmRlZmluZWQgfSkpO1xuICAgICAgICB0cmFuc2FjdGlvbk11dGF0ZShmbGF0U3RvcmUoZGF0YWJhc2UpLCBmbGF0RGVsZXRlcyk7XG4gICAgICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3QuY291bnQsIE1hdGgubWF4KDAsIGNvdW50IC0gaXRlbXMubGVuZ3RoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNlbnRyb2lkcyA9IHRyYW5zYWN0aW9uUmVhZChjZW50cm9pZFN0b3JlKGRhdGFiYXNlKSk7XG4gICAgaWYgKCFjZW50cm9pZHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCFjZW50cm9pZHMuc2l6ZSkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBjYW5kaWRhdGVzQnlJdGVtOiB7IHJlZjogc3RyaW5nOyBjZWxsSWRzOiBzdHJpbmdbXSB9W10gPSBbXTtcbiAgICBjb25zdCBjYW5kaWRhdGVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgY29uc3QgY2VsbElkcyA9IHJhbmtDZWxsc0J5Q2xvc2VuZXNzKGl0ZW0uZW1iZWRkaW5nLCBjZW50cm9pZHMpLnNsaWNlKDAsIDEgKyBERUxFVEVfRkFMTEJBQ0tfQ0VMTFMpO1xuICAgICAgICBjYW5kaWRhdGVzQnlJdGVtLnB1c2goeyByZWY6IGl0ZW0ucmVmLCBjZWxsSWRzIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGNlbGxJZCBvZiBjZWxsSWRzKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVTZXQuYWRkKGNlbGxJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjYW5kaWRhdGVDZWxsSWRzID0gQXJyYXkuZnJvbShjYW5kaWRhdGVTZXQpO1xuICAgIGNvbnN0IHN0b3JlcyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gY2FuZGlkYXRlQ2VsbElkcy5tYXAoY2VsbElkID0+IHJvb3QuY2VsbHNbY2VsbElkXSkpO1xuICAgIGlmICghc3RvcmVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1lbWJlcnNCeUNlbGwgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgU3RvcmVkRW1iZWRkaW5nPj4oKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2FuZGlkYXRlQ2VsbElkcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgbWVtYmVyc0J5Q2VsbC5zZXQoY2FuZGlkYXRlQ2VsbElkc1tpbmRleF0sIHJlcGxheVRyYW5zYWN0aW9uU3RvcmUoc3RvcmVzW2luZGV4XSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbGV0ZXNCeUNlbGwgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlc0J5SXRlbSkge1xuICAgICAgICBmb3IgKGNvbnN0IGNlbGxJZCBvZiBjYW5kaWRhdGUuY2VsbElkcykge1xuICAgICAgICAgICAgY29uc3QgbWVtYmVycyA9IG1lbWJlcnNCeUNlbGwuZ2V0KGNlbGxJZCk7XG4gICAgICAgICAgICBpZiAoIW1lbWJlcnMgfHwgIW1lbWJlcnMuaGFzKGNhbmRpZGF0ZS5yZWYpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVmcyA9IGRlbGV0ZXNCeUNlbGwuZ2V0KGNlbGxJZCk7XG4gICAgICAgICAgICBpZiAoIXJlZnMpIHtcbiAgICAgICAgICAgICAgICByZWZzID0gW107XG4gICAgICAgICAgICAgICAgZGVsZXRlc0J5Q2VsbC5zZXQoY2VsbElkLCByZWZzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZnMucHVzaChjYW5kaWRhdGUucmVmKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRlbGV0ZWRDb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBjZWxsSWQgb2YgZGVsZXRlc0J5Q2VsbC5rZXlzKCkpIHtcbiAgICAgICAgY29uc3QgcmVmcyA9IGRlbGV0ZXNCeUNlbGwuZ2V0KGNlbGxJZCkhO1xuICAgICAgICBkZWxldGVkQ291bnQgKz0gcmVmcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG1lbWJlckRlbGV0ZXMgPSByZWZzLm1hcChyZWYgPT4gKHsga2V5OiByZWYsIHZhbHVlOiB1bmRlZmluZWQgfSkpO1xuICAgICAgICB0cmFuc2FjdGlvbk11dGF0ZShjZWxsU3RvcmUoZGF0YWJhc2UsIGNlbGxJZCksIG1lbWJlckRlbGV0ZXMpO1xuICAgIH1cbiAgICBpZiAoZGVsZXRlZENvdW50KSB7XG4gICAgICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3QuY291bnQsIE1hdGgubWF4KDAsIGNvdW50IC0gZGVsZXRlZENvdW50KSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuIl19
|
|
334
|
-
/* _JS_SOURCE_HASH = "
|
|
395
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXZmRW1iZWRkaW5nRGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpdmZFbWJlZGRpbmdEYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBMkI7QUFDM0IseUNBQXlEO0FBQ3pELHFEQUFzSTtBQUN0SSwwREFBeUo7QUE4QnpKLE1BQU0sYUFBYSxHQUFHLElBQUksZ0JBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNuRSxTQUFTLGNBQWMsQ0FBQyxTQUEwQjtJQUM5QyxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFlLENBQUM7QUFDekQsQ0FBQztBQUNELFNBQVMsY0FBYyxDQUFDLEtBQWlCO0lBQ3JDLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQW9CLENBQUM7QUFDMUQsQ0FBQztBQUVELGlHQUFpRztBQUNqRyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDeEIseUpBQXlKO0FBQ3pKLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQztBQUN2QixxSEFBcUg7QUFDckgsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDakMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFFL0IsU0FBUyxTQUFTLENBQUMsUUFBb0M7SUFDbkQsT0FBTyxJQUFBLDRCQUFpQixFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ0QsU0FBUyxhQUFhLENBQUMsUUFBb0M7SUFDdkQsT0FBTyxJQUFBLDRCQUFpQixFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBQ0QsU0FBUyxT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RSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBQSxrQ0FBaUIsRUFBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzVCLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3JCLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDO0FBQ0wsQ0FBQztBQWpGRCw0Q0FpRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2JvcnggZnJvbSBcImNib3IteFwiO1xuaW1wb3J0IHsgRGF0YWJhc2UsIG5hbWVzcGFjZURhdGFiYXNlIH0gZnJvbSBcIi4vRGF0YWJhc2VcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uU2V0U3RvcmUsIHRyYW5zYWN0aW9uUmVhZCwgdHJhbnNhY3Rpb25NdXRhdGUsIHRyYW5zYWN0aW9uRGVsZXRlLCByZXBsYXlUcmFuc2FjdGlvblN0b3JlIH0gZnJvbSBcIi4vdHJhbnNhY3Rpb25TZXRcIjtcbmltcG9ydCB7IFN0b3JlZEVtYmVkZGluZywgRW1iZWRkaW5nRm9ybWF0LCBnZXRDbG9zZW5lc3MsIGVtYmVkZGluZ1RvRmxvYXQzMiwgcmVsZWFzZUZsb2F0MzIsIGVuY29kZUVtYmVkZGluZywgaGFzaEVtYmVkZGluZyB9IGZyb20gXCIuLi9lbWJlZGRpbmdGb3JtYXRzXCI7XG5cbmV4cG9ydCB0eXBlIEl2ZkNvbmZpZyA9IHtcbiAgICBtb2RlbDogc3RyaW5nO1xuICAgIGZvcm1hdDogRW1iZWRkaW5nRm9ybWF0O1xuICAgIC8vIFRhcmdldCBudW1iZXIgb2YgZW1iZWRkaW5ncyBwZXIgY2VsbC5cbiAgICBjZWxsVGFyZ2V0U2l6ZTogbnVtYmVyO1xufTtcblxuLy8gVGllcmVkIHN0b3JhZ2UuIEJlbG93IEZMQVRfTElNSVQgZW1iZWRkaW5ncyB0aGUgd2hvbGUgc2V0IGxpdmVzIGluIG9uZSBmbGF0IHRyYW5zYWN0aW9uIHNldCAobm8gSVZGKTtcbi8vIG9uY2UgaXQgZ3Jvd3MgcGFzdCB0aGF0IHdlIGJ1aWxkIHRoZSBJVkYgKGNlbnRyb2lkcyArIHBlci1jZWxsIHNldHMpIGFuZCBzdGF5IHRoZXJlIGZvcmV2ZXIuIGBjb3VudGAgaXNcbi8vIHRoZSBsaXZlIGVtYmVkZGluZyBjb3VudCAocmUtZGVyaXZlZCBleGFjdGx5IG9uIGEgcmVidWlsZCkuIGBzdGVwc2AgcmVjb3JkcyBvbmUtdGltZSB1cGdyYWRlcyB0aGF0IG11c3Rcbi8vIG5ldmVyIHJlLXJ1biBldmVuIGlmIHRoZSBzZXQgbGF0ZXIgc2hyaW5rcyBhbmQgcmVncm93cy5cbmV4cG9ydCB0eXBlIEl2ZkVtYmVkZGluZ1Jvb3QgPSB7XG4gICAgY29uZmlnOiBJdmZDb25maWc7XG4gICAgY291bnQ6IG51bWJlcjtcbiAgICBmbGF0OiBUcmFuc2FjdGlvblNldFN0b3JlPFN0b3JlZEVtYmVkZGluZz47XG4gICAgLy8gRGlyZWN0IHJlZiAtPiBlbWJlZGRpbmcgaW5kZXguIEVhY2ggZW50cnkgaXMgb25lIENCT1IgYmxvYiBhdCBpdHMgb3duIGtleSwgc28gYSBsb29rdXAgb3IgZGVsZXRlIGlzIGFcbiAgICAvLyBzaW5nbGUga2V5LXZhbHVlIG9wIChubyB0cmFuc2FjdGlvbi1zZXQgcmVwbGF5KSBhbmQgZGVsZXRlRGF0YSBjYW4gZHJvcCBpdCAoaXQncyBhIHByaW1pdGl2ZSBsZWFmKS4gUmVmc1xuICAgIC8vIGFuZCB0aGVpciBlbWJlZGRpbmdzIG5ldmVyIG1vdmUsIHNvIGEgcmVidWlsZCBsZWF2ZXMgdGhpcyB1bnRvdWNoZWQuXG4gICAgYnlSZWY6IHsgW3JlZjogc3RyaW5nXTogVWludDhBcnJheSB9O1xuICAgIHN0ZXBzOiB7IFtzdGVwOiBzdHJpbmddOiBib29sZWFuIH07XG4gICAgY2VudHJvaWRzOiBUcmFuc2FjdGlvblNldFN0b3JlPFN0b3JlZEVtYmVkZGluZz47XG4gICAgY2VsbHM6IHsgW2NlbGxJZDogc3RyaW5nXTogVHJhbnNhY3Rpb25TZXRTdG9yZTxTdG9yZWRFbWJlZGRpbmc+IH07XG59O1xuXG5leHBvcnQgdHlwZSBFbWJlZGRpbmdJbnB1dCA9IHsgcmVmOiBzdHJpbmc7IGVtYmVkZGluZzogU3RvcmVkRW1iZWRkaW5nIH07XG5leHBvcnQgdHlwZSBTZWFyY2hIaXQgPSB7IHJlZjogc3RyaW5nOyBjbG9zZW5lc3M6IG51bWJlciB9O1xudHlwZSBDZWxsRW50cnkgPSB7IHJlZjogc3RyaW5nOyBlbWJlZGRpbmc6IFN0b3JlZEVtYmVkZGluZyB9O1xuXG5jb25zdCBlbWJlZGRpbmdDYm9yID0gbmV3IGNib3J4LkVuY29kZXIoeyBzdHJ1Y3R1cmVkQ2xvbmU6IHRydWUgfSk7XG5mdW5jdGlvbiBlbmNvZGVSZWZWYWx1ZShlbWJlZGRpbmc6IFN0b3JlZEVtYmVkZGluZyk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBlbWJlZGRpbmdDYm9yLmVuY29kZShlbWJlZGRpbmcpIGFzIFVpbnQ4QXJyYXk7XG59XG5mdW5jdGlvbiBkZWNvZGVSZWZWYWx1ZSh2YWx1ZTogVWludDhBcnJheSk6IFN0b3JlZEVtYmVkZGluZyB7XG4gICAgcmV0dXJuIGVtYmVkZGluZ0Nib3IuZGVjb2RlKHZhbHVlKSBhcyBTdG9yZWRFbWJlZGRpbmc7XG59XG5cbi8vIEJlbG93IHRoaXMgbWFueSBlbWJlZGRpbmdzIHdlIHNraXAgdGhlIElWRiBlbnRpcmVseSAoZmxhdCBzdG9yZSkuIDEwMjQgPSBhIGNsZWFuIHBvd2VyIG9mIHR3by5cbmNvbnN0IEZMQVRfTElNSVQgPSAxMDI0O1xuLy8gRm9yY2UgYSBmcm9tLXNjcmF0Y2ggcmVidWlsZCBvbmNlIGF0IGVhY2ggb2YgdGhlc2UgKG11bHRpcGxlcyBvZiA0IGFib3ZlIEZMQVRfTElNSVQsIHVwIHRvIH4xNmspLCBnYXRlZCBieSBhIHN0ZXAgZmxhZyBzbyBlYWNoIHJ1bnMgYXQgbW9zdCBvbmNlIGV2ZXIuXG5jb25zdCBSRUdFTkVSQVRFX0FUID0gWzQwOTYsIDE2Mzg0XTtcbmNvbnN0IFNURVBfSVZGID0gXCJpdmZcIjtcbi8vIE9uIGRlbGV0ZSwgdGhlIG1lbWJlcidzIGV4YWN0IGNlbGwgcGx1cyB0aGlzIG1hbnkgbmVhcmJ5IGNlbGxzIGFyZSBjaGVja2VkLCBpbiBjYXNlIGEgcmVidWlsZCBsZWZ0IGl0IG5vbi1vcHRpbWFsLlxuY29uc3QgREVMRVRFX0ZBTExCQUNLX0NFTExTID0gMTA7XG5jb25zdCBSRUJBTEFOQ0VfSVRFUkFUSU9OUyA9IDQ7XG5cbmZ1bmN0aW9uIGZsYXRTdG9yZShkYXRhYmFzZTogRGF0YWJhc2U8SXZmRW1iZWRkaW5nUm9vdD4pOiBEYXRhYmFzZTxUcmFuc2FjdGlvblNldFN0b3JlPFN0b3JlZEVtYmVkZGluZz4+IHtcbiAgICByZXR1cm4gbmFtZXNwYWNlRGF0YWJhc2UoZGF0YWJhc2UsIHJvb3QgPT4gcm9vdC5mbGF0KTtcbn1cbmZ1bmN0aW9uIGNlbnRyb2lkU3RvcmUoZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+KTogRGF0YWJhc2U8VHJhbnNhY3Rpb25TZXRTdG9yZTxTdG9yZWRFbWJlZGRpbmc+PiB7XG4gICAgcmV0dXJuIG5hbWVzcGFjZURhdGFiYXNlKGRhdGFiYXNlLCByb290ID0+IHJvb3QuY2VudHJvaWRzKTtcbn1cbmZ1bmN0aW9uIGNlbGxTdG9yZShkYXRhYmFzZTogRGF0YWJhc2U8SXZmRW1iZWRkaW5nUm9vdD4sIGNlbGxJZDogc3RyaW5nKTogRGF0YWJhc2U8VHJhbnNhY3Rpb25TZXRTdG9yZTxTdG9yZWRFbWJlZGRpbmc+PiB7XG4gICAgcmV0dXJuIG5hbWVzcGFjZURhdGFiYXNlKGRhdGFiYXNlLCByb290ID0+IHJvb3QuY2VsbHNbY2VsbElkXSk7XG59XG5cbmZ1bmN0aW9uIHJhbmtDZWxsc0J5Q2xvc2VuZXNzKGVtYmVkZGluZzogU3RvcmVkRW1iZWRkaW5nLCBjZW50cm9pZHM6IE1hcDxzdHJpbmcsIFN0b3JlZEVtYmVkZGluZz4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmFua2VkOiB7IGNlbGxJZDogc3RyaW5nOyBjbG9zZW5lc3M6IG51bWJlciB9W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNlbGxJZCBvZiBjZW50cm9pZHMua2V5cygpKSB7XG4gICAgICAgIHJhbmtlZC5wdXNoKHsgY2VsbElkLCBjbG9zZW5lc3M6IGdldENsb3NlbmVzcyhlbWJlZGRpbmcsIGNlbnRyb2lkcy5nZXQoY2VsbElkKSEpIH0pO1xuICAgIH1cbiAgICByYW5rZWQuc29ydCgobGVmdCwgcmlnaHQpID0+IHJpZ2h0LmNsb3NlbmVzcyAtIGxlZnQuY2xvc2VuZXNzKTtcbiAgICByZXR1cm4gcmFua2VkLm1hcChlbnRyeSA9PiBlbnRyeS5jZWxsSWQpO1xufVxuXG4vLyBQZXItd3JpdGUgY2hhbmNlIG9mIGEgZnVsbCByZWJ1aWxkLiBaZXJvIGF0L3VuZGVyIHRoZSB0YXJnZXQgc2l6ZSwgdGhlbiByaXNlcyAoY3ViaWNhbGx5KSBwYXN0IGl0IHNvIGNlbGxzXG4vLyBzdGF5IHJvdWdobHkgYmV0d2VlbiB0YXJnZXQgYW5kIH4yeCB0YXJnZXQuXG5mdW5jdGlvbiByZWJhbGFuY2VQcm9iYWJpbGl0eShmaWxsUmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKGZpbGxSYXRpbyA8PSAxKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBvdmVyID0gZmlsbFJhdGlvIC0gMTtcbiAgICByZXR1cm4gTWF0aC5taW4oMSwgb3ZlciAqIG92ZXIgKiBvdmVyICogMC4yNSk7XG59XG5cbi8vIGstbWVhbnMuIERlY29kZXMgZXZlcnkgbWVtYmVyIHRvIGEgcG9vbGVkIGZsb2F0MzIgYnVmZmVyIE9OQ0UsIHRoZW4gYXNzaWducyB3aXRoIGEgcGxhaW4gaW50ZXJuYWwgZmxvYXRcbi8vIGRvdCAobm8gZ2V0Q2xvc2VuZXNzIGNhbGwg4oCUIGNvbXBhcmluZyB0d28gZmxvYXQgdmVjdG9ycyBpcyB0cml2aWFsKSBhbmQga2VlcHMgY2VudHJvaWRzIGFzIGZsb2F0IG1lYW5zLFxuLy8gZW5jb2RpbmcgdGhlbSB0byBTdG9yZWRFbWJlZGRpbmcgb25seSBhdCB0aGUgZW5kLiBSZWxlYXNlcyB0aGUgYm9ycm93ZWQgYnVmZmVycyB3aGVuIGRvbmUuXG5mdW5jdGlvbiBjbHVzdGVyTWVtYmVycyhtZW1iZXJzOiBDZWxsRW50cnlbXSwgY2x1c3RlckNvdW50OiBudW1iZXIsIGNvbmZpZzogSXZmQ29uZmlnKTogeyBjZW50cm9pZDogU3RvcmVkRW1iZWRkaW5nOyBtZW1iZXJzOiBDZWxsRW50cnlbXSB9W10ge1xuICAgIGNvbnN0IG1lbWJlckZsb2F0czogRmxvYXQzMkFycmF5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzKSB7XG4gICAgICAgIG1lbWJlckZsb2F0cy5wdXNoKGVtYmVkZGluZ1RvRmxvYXQzMihtZW1iZXIuZW1iZWRkaW5nLCB0cnVlKSk7XG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9IG1lbWJlckZsb2F0cy5sZW5ndGggPyBtZW1iZXJGbG9hdHNbMF0ubGVuZ3RoIDogMDtcbiAgICBsZXQgY2VudHJvaWRzOiBGbG9hdDMyQXJyYXlbXSA9IFtdO1xuICAgIGNvbnN0IHNlZWRTdGVwID0gbWVtYmVycy5sZW5ndGggLyBjbHVzdGVyQ291bnQ7XG4gICAgZm9yIChsZXQgY2x1c3RlckluZGV4ID0gMDsgY2x1c3RlckluZGV4IDwgY2x1c3RlckNvdW50OyBjbHVzdGVySW5kZXgrKykge1xuICAgICAgICBjZW50cm9pZHMucHVzaChuZXcgRmxvYXQzMkFycmF5KG1lbWJlckZsb2F0c1tNYXRoLmZsb29yKGNsdXN0ZXJJbmRleCAqIHNlZWRTdGVwKV0pKTtcbiAgICB9XG4gICAgbGV0IGdyb3VwczogbnVtYmVyW11bXSA9IFtdO1xuICAgIGZvciAobGV0IGl0ZXJhdGlvbiA9IDA7IGl0ZXJhdGlvbiA8IFJFQkFMQU5DRV9JVEVSQVRJT05TOyBpdGVyYXRpb24rKykge1xuICAgICAgICBncm91cHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgY2x1c3RlckluZGV4ID0gMDsgY2x1c3RlckluZGV4IDwgY2VudHJvaWRzLmxlbmd0aDsgY2x1c3RlckluZGV4KyspIHtcbiAgICAgICAgICAgIGdyb3Vwcy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBtZW1iZXJJbmRleCA9IDA7IG1lbWJlckluZGV4IDwgbWVtYmVyRmxvYXRzLmxlbmd0aDsgbWVtYmVySW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgbWVtYmVyRmxvYXQgPSBtZW1iZXJGbG9hdHNbbWVtYmVySW5kZXhdO1xuICAgICAgICAgICAgbGV0IGJlc3RJbmRleCA9IDA7XG4gICAgICAgICAgICBsZXQgYmVzdERvdCA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgIGZvciAobGV0IGNlbnRyb2lkSW5kZXggPSAwOyBjZW50cm9pZEluZGV4IDwgY2VudHJvaWRzLmxlbmd0aDsgY2VudHJvaWRJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VudHJvaWRGbG9hdCA9IGNlbnRyb2lkc1tjZW50cm9pZEluZGV4XTtcbiAgICAgICAgICAgICAgICBsZXQgZG90ID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCBsZW5ndGg7IGRpbSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvdCArPSBtZW1iZXJGbG9hdFtkaW1dICogY2VudHJvaWRGbG9hdFtkaW1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZG90ID4gYmVzdERvdCkge1xuICAgICAgICAgICAgICAgICAgICBiZXN0RG90ID0gZG90O1xuICAgICAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSBjZW50cm9pZEluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyb3Vwc1tiZXN0SW5kZXhdLnB1c2gobWVtYmVySW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5leHRDZW50cm9pZHM6IEZsb2F0MzJBcnJheVtdID0gW107XG4gICAgICAgIGNvbnN0IG5leHRHcm91cHM6IG51bWJlcltdW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiBncm91cHMpIHtcbiAgICAgICAgICAgIGlmICghZ3JvdXAubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtZWFuID0gbmV3IEZsb2F0MzJBcnJheShsZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBtZW1iZXJJbmRleCBvZiBncm91cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lbWJlckZsb2F0ID0gbWVtYmVyRmxvYXRzW21lbWJlckluZGV4XTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCBsZW5ndGg7IGRpbSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lYW5bZGltXSArPSBtZW1iZXJGbG9hdFtkaW1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBub3JtID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IGxlbmd0aDsgZGltKyspIHtcbiAgICAgICAgICAgICAgICBub3JtICs9IG1lYW5bZGltXSAqIG1lYW5bZGltXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1hZ25pdHVkZSA9IE1hdGguc3FydChub3JtKSB8fCAxO1xuICAgICAgICAgICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgbGVuZ3RoOyBkaW0rKykge1xuICAgICAgICAgICAgICAgIG1lYW5bZGltXSAvPSBtYWduaXR1ZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0Q2VudHJvaWRzLnB1c2gobWVhbik7XG4gICAgICAgICAgICBuZXh0R3JvdXBzLnB1c2goZ3JvdXApO1xuICAgICAgICB9XG4gICAgICAgIGNlbnRyb2lkcyA9IG5leHRDZW50cm9pZHM7XG4gICAgICAgIGdyb3VwcyA9IG5leHRHcm91cHM7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogeyBjZW50cm9pZDogU3RvcmVkRW1iZWRkaW5nOyBtZW1iZXJzOiBDZWxsRW50cnlbXSB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBjbHVzdGVySW5kZXggPSAwOyBjbHVzdGVySW5kZXggPCBjZW50cm9pZHMubGVuZ3RoOyBjbHVzdGVySW5kZXgrKykge1xuICAgICAgICBjb25zdCBjZW50cm9pZCA9IGVuY29kZUVtYmVkZGluZyh7IGlucHV0OiBjZW50cm9pZHNbY2x1c3RlckluZGV4XSwgZm9ybWF0OiBjb25maWcuZm9ybWF0LCBtb2RlbDogY29uZmlnLm1vZGVsIH0pO1xuICAgICAgICBjb25zdCBjZWxsTWVtYmVyczogQ2VsbEVudHJ5W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBtZW1iZXJJbmRleCBvZiBncm91cHNbY2x1c3RlckluZGV4XSkge1xuICAgICAgICAgICAgY2VsbE1lbWJlcnMucHVzaChtZW1iZXJzW21lbWJlckluZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2goeyBjZW50cm9pZCwgbWVtYmVyczogY2VsbE1lbWJlcnMgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWVtYmVyRmxvYXQgb2YgbWVtYmVyRmxvYXRzKSB7XG4gICAgICAgIHJlbGVhc2VGbG9hdDMyKG1lbWJlckZsb2F0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gUmUtY2x1c3RlciBFVkVSWSBlbWJlZGRpbmcgKGZsYXQgdGllciArIGFsbCBjZWxscykgaW50byBhIGZyZXNoIElWRiwgY2xlYXIgdGhlIGZsYXQgdGllciwgYW5kIG1hcmsgSVZGXG4vLyBtb2RlLiBUaGlzIGlzIHRoZSByZWFycmFuZ2VyOiBydW4gcHJvYmFiaWxpc3RpY2FsbHkgYXMgdGhlIHNldCBncm93cywgb25jZSBhdCBlYWNoIHJlZ2VuZXJhdGUgdGhyZXNob2xkLFxuLy8gYW5kIG9uY2UgdG8gdXBncmFkZSBmcm9tIGZsYXQuIFJlYWRzIGV2ZXJ5dGhpbmcgaXQgdXNlcywgc28gaXQgYmFpbHMgKGRvZXMgbm90aGluZykgaWYgYW55dGhpbmcgaXNuJ3Rcbi8vIHN5bmNlZCBhbmQgdGhlIGNhbGxlcidzIHJldHJ5IHJlLXJ1bnMgaXQ7IG5vIGNhbGxlciBjYXJlcyBhYm91dCBpdHMgcmVzdWx0LlxuZXhwb3J0IGZ1bmN0aW9uIHJlYnVpbGRTdHJ1Y3R1cmUoZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+KTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlnID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByb290LmNvbmZpZyk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybjtcbiAgICBjb25zdCBzdGVwcyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5zdGVwcyk7XG4gICAgaWYgKCFzdGVwcykgcmV0dXJuO1xuXG4gICAgY29uc3QgYWxsTWVtYmVyczogQ2VsbEVudHJ5W10gPSBbXTtcbiAgICAvLyBPbmx5IHRoZSBvbmUtdGltZSBmbGF0LT5JVkYgdXBncmFkZSBwdWxscyBmcm9tIHRoZSBmbGF0IHRpZXIuIE9uY2UgU1RFUF9JVkYgaXMgc2V0IHRoZSBmbGF0IGRhdGEgaGFzXG4gICAgLy8gYWxyZWFkeSBiZWVuIGZvbGRlZCBpbnRvIGNlbGxzLCBzbyBsYXRlciByZWJ1aWxkcyBpZ25vcmUgaXQuIEl0J3MgbGVmdCBpbiBwbGFjZSwgbmV2ZXIgZGVsZXRlZDogZGVsZXRlRGF0YVxuICAgIC8vIG9ubHkgcmVtb3ZlcyBwcmltaXRpdmUgbGVhdmVzLCBub3QgYSB3aG9sZSBzdG9yZSwgYW5kIHRoZSBmbGF0IHRpZXIgaXMgc21hbGwgZW5vdWdoIG5vdCB0byBtYXR0ZXIuXG4gICAgaWYgKCFzdGVwc1tTVEVQX0lWRl0pIHtcbiAgICAgICAgY29uc3QgZmxhdCA9IHRyYW5zYWN0aW9uUmVhZChmbGF0U3RvcmUoZGF0YWJhc2UpKTtcbiAgICAgICAgaWYgKCFmbGF0KSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIGZsYXQua2V5cygpKSB7XG4gICAgICAgICAgICBhbGxNZW1iZXJzLnB1c2goeyByZWYsIGVtYmVkZGluZzogZmxhdC5nZXQocmVmKSEgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2VudHJvaWRzID0gdHJhbnNhY3Rpb25SZWFkKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpKTtcbiAgICBpZiAoIWNlbnRyb2lkcykgcmV0dXJuO1xuICAgIGNvbnN0IG9sZENlbGxJZHMgPSBBcnJheS5mcm9tKGNlbnRyb2lkcy5rZXlzKCkpO1xuICAgIGNvbnN0IGNlbGxTdG9yZXMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IG9sZENlbGxJZHMubWFwKGNlbGxJZCA9PiByb290LmNlbGxzW2NlbGxJZF0pKTtcbiAgICBpZiAoIWNlbGxTdG9yZXMpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IHN0b3JlIG9mIGNlbGxTdG9yZXMpIHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IHJlcGxheVRyYW5zYWN0aW9uU3RvcmU8U3RvcmVkRW1iZWRkaW5nPihzdG9yZSk7XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIG1lbWJlcnMua2V5cygpKSB7XG4gICAgICAgICAgICBhbGxNZW1iZXJzLnB1c2goeyByZWYsIGVtYmVkZGluZzogbWVtYmVycy5nZXQocmVmKSEgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFhbGxNZW1iZXJzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2x1c3RlckNvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChhbGxNZW1iZXJzLmxlbmd0aCAvIGNvbmZpZy5jZWxsVGFyZ2V0U2l6ZSkpO1xuICAgIGNvbnN0IGNsdXN0ZXJzID0gY2x1c3Rlck1lbWJlcnMoYWxsTWVtYmVycywgY2x1c3RlckNvdW50LCBjb25maWcpO1xuXG4gICAgY29uc3QgbmV3Q2VsbElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGNlbnRyb2lkV3JpdGVzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogU3RvcmVkRW1iZWRkaW5nIHwgdW5kZWZpbmVkIH1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2x1c3RlciBvZiBjbHVzdGVycykge1xuICAgICAgICBjb25zdCBjZWxsSWQgPSBoYXNoRW1iZWRkaW5nKGNsdXN0ZXIuY2VudHJvaWQpO1xuICAgICAgICBuZXdDZWxsSWRzLmFkZChjZWxsSWQpO1xuICAgICAgICBjZW50cm9pZFdyaXRlcy5wdXNoKHsga2V5OiBjZWxsSWQsIHZhbHVlOiBjbHVzdGVyLmNlbnRyb2lkIH0pO1xuICAgICAgICBjb25zdCBtZW1iZXJXcml0ZXMgPSBjbHVzdGVyLm1lbWJlcnMubWFwKG1lbWJlciA9PiAoeyBrZXk6IG1lbWJlci5yZWYsIHZhbHVlOiBtZW1iZXIuZW1iZWRkaW5nIH0pKTtcbiAgICAgICAgdHJhbnNhY3Rpb25NdXRhdGUoY2VsbFN0b3JlKGRhdGFiYXNlLCBjZWxsSWQpLCBtZW1iZXJXcml0ZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9sZENlbGxJZCBvZiBvbGRDZWxsSWRzKSB7XG4gICAgICAgIGlmIChuZXdDZWxsSWRzLmhhcyhvbGRDZWxsSWQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjZW50cm9pZFdyaXRlcy5wdXNoKHsga2V5OiBvbGRDZWxsSWQsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIHRyYW5zYWN0aW9uRGVsZXRlKGNlbGxTdG9yZShkYXRhYmFzZSwgb2xkQ2VsbElkKSk7XG4gICAgfVxuICAgIHRyYW5zYWN0aW9uTXV0YXRlKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpLCBjZW50cm9pZFdyaXRlcyk7XG4gICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgYWxsTWVtYmVycy5sZW5ndGgpO1xuICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3Quc3RlcHNbU1RFUF9JVkZdLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaEVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIHF1ZXJ5OiBTdG9yZWRFbWJlZGRpbmcsXG4gICAgb3B0aW9uczogeyBwcm9iZUJ1ZGdldDogbnVtYmVyOyByZXN1bHRDb3VudDogbnVtYmVyIH0sXG4pOiBTZWFyY2hIaXRbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29uZmlnID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByb290LmNvbmZpZyk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3RlcHMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3Quc3RlcHMpO1xuICAgIGlmICghc3RlcHMpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBoaXRzOiBTZWFyY2hIaXRbXSA9IFtdO1xuICAgIGlmICghc3RlcHNbU1RFUF9JVkZdKSB7XG4gICAgICAgIGNvbnN0IGZsYXQgPSB0cmFuc2FjdGlvblJlYWQoZmxhdFN0b3JlKGRhdGFiYXNlKSk7XG4gICAgICAgIGlmICghZmxhdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCByZWYgb2YgZmxhdC5rZXlzKCkpIHtcbiAgICAgICAgICAgIGhpdHMucHVzaCh7IHJlZiwgY2xvc2VuZXNzOiBnZXRDbG9zZW5lc3MocXVlcnksIGZsYXQuZ2V0KHJlZikhKSB9KTtcbiAgICAgICAgfVxuICAgICAgICBoaXRzLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodC5jbG9zZW5lc3MgLSBsZWZ0LmNsb3NlbmVzcyk7XG4gICAgICAgIHJldHVybiBoaXRzLnNsaWNlKDAsIG9wdGlvbnMucmVzdWx0Q291bnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGNlbnRyb2lkcyA9IHRyYW5zYWN0aW9uUmVhZChjZW50cm9pZFN0b3JlKGRhdGFiYXNlKSk7XG4gICAgaWYgKCFjZW50cm9pZHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCFjZW50cm9pZHMuc2l6ZSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHByb2JlQ2VsbENvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKG9wdGlvbnMucHJvYmVCdWRnZXQgLyBjb25maWcuY2VsbFRhcmdldFNpemUpKTtcbiAgICBjb25zdCBwcm9iZUNlbGxJZHMgPSByYW5rQ2VsbHNCeUNsb3NlbmVzcyhxdWVyeSwgY2VudHJvaWRzKS5zbGljZSgwLCBwcm9iZUNlbGxDb3VudCk7XG4gICAgY29uc3Qgc3RvcmVzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiBwcm9iZUNlbGxJZHMubWFwKGNlbGxJZCA9PiByb290LmNlbGxzW2NlbGxJZF0pKTtcbiAgICBpZiAoIXN0b3JlcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHN0b3JlIG9mIHN0b3Jlcykge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gcmVwbGF5VHJhbnNhY3Rpb25TdG9yZTxTdG9yZWRFbWJlZGRpbmc+KHN0b3JlKTtcbiAgICAgICAgZm9yIChjb25zdCByZWYgb2YgbWVtYmVycy5rZXlzKCkpIHtcbiAgICAgICAgICAgIGhpdHMucHVzaCh7IHJlZiwgY2xvc2VuZXNzOiBnZXRDbG9zZW5lc3MocXVlcnksIG1lbWJlcnMuZ2V0KHJlZikhKSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoaXRzLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodC5jbG9zZW5lc3MgLSBsZWZ0LmNsb3NlbmVzcyk7XG4gICAgcmV0dXJuIGhpdHMuc2xpY2UoMCwgb3B0aW9ucy5yZXN1bHRDb3VudCk7XG59XG5cbi8vIERpcmVjdCByZWYgLT4gc3RvcmVkIGVtYmVkZGluZyBsb29rdXAgdGhyb3VnaCB0aGUgYnlSZWYgaW5kZXg6IG9uZSBrZXktdmFsdWUgcmVhZCBwZXIgcmVmLCBubyBjZWxsIHNjYW4uIEFcbi8vIHNlYXJjaCByZXR1cm5zIHJlZnM7IHRoaXMgZmV0Y2hlcyB0aGUgZGF0YSBiZWhpbmQgdGhlbS4gU2tpcHMgcmVmcyB0aGF0IGFyZW4ndCBwcmVzZW50OyB1bmRlZmluZWQgaWYgbm90IHN5bmNlZC5cbmV4cG9ydCBmdW5jdGlvbiBsb29rdXBFbWJlZGRpbmdzKFxuICAgIGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290PixcbiAgICByZWZzOiBzdHJpbmdbXSxcbik6IE1hcDxzdHJpbmcsIFN0b3JlZEVtYmVkZGluZz4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZhbHVlcyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcmVmcy5tYXAocmVmID0+IHJvb3QuYnlSZWZbcmVmXSkpO1xuICAgIGlmICghdmFsdWVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBTdG9yZWRFbWJlZGRpbmc+KCk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJlZnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2luZGV4XTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICByZXN1bHQuc2V0KHJlZnNbaW5kZXhdLCBkZWNvZGVSZWZWYWx1ZSh2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRFbWJlZGRpbmdzKFxuICAgIGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290PixcbiAgICBpdGVtczogRW1iZWRkaW5nSW5wdXRbXSxcbikge1xuICAgIGlmICghaXRlbXMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgY29uZmlnID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByb290LmNvbmZpZyk7XG4gICAgY29uc3Qgc3RlcHMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3Quc3RlcHMpO1xuICAgIGxldCBjb3VudCA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5jb3VudCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybjtcbiAgICBpZiAoIXN0ZXBzKSByZXR1cm47XG4gICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBuZXdDb3VudCA9IGNvdW50ICsgaXRlbXMubGVuZ3RoO1xuXG4gICAgaWYgKCFzdGVwc1tTVEVQX0lWRl0pIHtcbiAgICAgICAgY29uc3QgZmxhdFdyaXRlcyA9IGl0ZW1zLm1hcChpdGVtID0+ICh7IGtleTogaXRlbS5yZWYsIHZhbHVlOiBpdGVtLmVtYmVkZGluZyB9KSk7XG4gICAgICAgIHRyYW5zYWN0aW9uTXV0YXRlKGZsYXRTdG9yZShkYXRhYmFzZSksIGZsYXRXcml0ZXMpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3QuYnlSZWZbaXRlbS5yZWZdLCBlbmNvZGVSZWZWYWx1ZShpdGVtLmVtYmVkZGluZykpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3QuY291bnQsIG5ld0NvdW50KTtcbiAgICAgICAgaWYgKG5ld0NvdW50ID4gRkxBVF9MSU1JVCkge1xuICAgICAgICAgICAgcmVidWlsZFN0cnVjdHVyZShkYXRhYmFzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNlbnRyb2lkcyA9IHRyYW5zYWN0aW9uUmVhZChjZW50cm9pZFN0b3JlKGRhdGFiYXNlKSk7XG4gICAgaWYgKCFjZW50cm9pZHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXRlbXNCeUNlbGwgPSBuZXcgTWFwPHN0cmluZywgRW1iZWRkaW5nSW5wdXRbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgY29uc3QgY2VsbElkID0gcmFua0NlbGxzQnlDbG9zZW5lc3MoaXRlbS5lbWJlZGRpbmcsIGNlbnRyb2lkcylbMF07XG4gICAgICAgIGxldCBncm91cCA9IGl0ZW1zQnlDZWxsLmdldChjZWxsSWQpO1xuICAgICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgICAgICBncm91cCA9IFtdO1xuICAgICAgICAgICAgaXRlbXNCeUNlbGwuc2V0KGNlbGxJZCwgZ3JvdXApO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwLnB1c2goaXRlbSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2VsbElkIG9mIGl0ZW1zQnlDZWxsLmtleXMoKSkge1xuICAgICAgICBjb25zdCBncm91cCA9IGl0ZW1zQnlDZWxsLmdldChjZWxsSWQpITtcbiAgICAgICAgY29uc3QgbWVtYmVyV3JpdGVzID0gZ3JvdXAubWFwKGl0ZW0gPT4gKHsga2V5OiBpdGVtLnJlZiwgdmFsdWU6IGl0ZW0uZW1iZWRkaW5nIH0pKTtcbiAgICAgICAgdHJhbnNhY3Rpb25NdXRhdGUoY2VsbFN0b3JlKGRhdGFiYXNlLCBjZWxsSWQpLCBtZW1iZXJXcml0ZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5ieVJlZltpdGVtLnJlZl0sIGVuY29kZVJlZlZhbHVlKGl0ZW0uZW1iZWRkaW5nKSk7XG4gICAgfVxuICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3QuY291bnQsIG5ld0NvdW50KTtcblxuXG4gICAgY29uc3Qgc2hvdWxkUmVnZW5lcmF0ZSA9IChkYXRhYmFzZTogRGF0YWJhc2U8SXZmRW1iZWRkaW5nUm9vdD4pID0+IHtcbiAgICAgICAgbGV0IHN0ZXBzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByb290LnN0ZXBzKTtcbiAgICAgICAgaWYgKCFzdGVwcykgcmV0dXJuO1xuICAgICAgICBmb3IgKGNvbnN0IHRocmVzaG9sZCBvZiBSRUdFTkVSQVRFX0FUKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwTmFtZSA9IFwicmVnZW5cIiArIHRocmVzaG9sZDtcbiAgICAgICAgICAgIGlmICghc3RlcHNbc3RlcE5hbWVdICYmIG5ld0NvdW50ID4gdGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5zdGVwc1tzdGVwTmFtZV0sIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF2ZXJhZ2VGaWxsID0gbmV3Q291bnQgLyBNYXRoLm1heCgxLCBjZW50cm9pZHMuc2l6ZSkgLyBjb25maWcuY2VsbFRhcmdldFNpemU7XG4gICAgICAgIGlmIChNYXRoLnJhbmRvbSgpIDwgcmViYWxhbmNlUHJvYmFiaWxpdHkoYXZlcmFnZUZpbGwpKSB7XG4gICAgICAgICAgICByZWJ1aWxkU3RydWN0dXJlKGRhdGFiYXNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIGlmIChzaG91bGRSZWdlbmVyYXRlKGRhdGFiYXNlKSkge1xuICAgICAgICByZWJ1aWxkU3RydWN0dXJlKGRhdGFiYXNlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFbWJlZGRpbmdzKFxuICAgIGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290PixcbiAgICByZWZzOiBzdHJpbmdbXSxcbikge1xuICAgIGlmICghcmVmcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBzdGVwcyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5zdGVwcyk7XG4gICAgY29uc3QgY291bnQgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3QuY291bnQpO1xuICAgIGlmICghc3RlcHMpIHJldHVybjtcbiAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgaWYgKCFzdGVwc1tTVEVQX0lWRl0pIHtcbiAgICAgICAgY29uc3QgZmxhdERlbGV0ZXMgPSByZWZzLm1hcChyZWYgPT4gKHsga2V5OiByZWYsIHZhbHVlOiB1bmRlZmluZWQgfSkpO1xuICAgICAgICB0cmFuc2FjdGlvbk11dGF0ZShmbGF0U3RvcmUoZGF0YWJhc2UpLCBmbGF0RGVsZXRlcyk7XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIHJlZnMpIHtcbiAgICAgICAgICAgIGRhdGFiYXNlLmRlbGV0ZURhdGEocm9vdCA9PiByb290LmJ5UmVmW3JlZl0pO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3QuY291bnQsIE1hdGgubWF4KDAsIGNvdW50IC0gcmVmcy5sZW5ndGgpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNlbnRyb2lkcyA9IHRyYW5zYWN0aW9uUmVhZChjZW50cm9pZFN0b3JlKGRhdGFiYXNlKSk7XG4gICAgaWYgKCFjZW50cm9pZHMpIHJldHVybjtcbiAgICBpZiAoIWNlbnRyb2lkcy5zaXplKSByZXR1cm47XG5cbiAgICAvLyBMb29rIHVwIGVhY2ggcmVmJ3MgZW1iZWRkaW5nIHRocm91Z2ggYnlSZWYsIHRoZW4gcmFuayBpdHMgY2VsbHMgdGhlIHdheSBhbiBpbnNlcnQgd291bGQsIHNvIHdlIGRlbGV0ZSBmcm9tXG4gICAgLy8gdGhlIGNlbGwgaXQgYWN0dWFsbHkgbGFuZGVkIGluIChwbHVzIGEgZmV3IG5laWdoYm91cnMsIGluIGNhc2UgYSByZWJ1aWxkIG51ZGdlZCBpdCBhY3Jvc3MgYSBib3VuZGFyeSkuXG4gICAgY29uc3QgcmVmVmFsdWVzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByZWZzLm1hcChyZWYgPT4gcm9vdC5ieVJlZltyZWZdKSk7XG4gICAgaWYgKCFyZWZWYWx1ZXMpIHJldHVybjtcbiAgICBjb25zdCBjYW5kaWRhdGVzQnlJdGVtOiB7IHJlZjogc3RyaW5nOyBjZWxsSWRzOiBzdHJpbmdbXSB9W10gPSBbXTtcbiAgICBjb25zdCBjYW5kaWRhdGVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVmcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWZWYWx1ZXNbaW5kZXhdO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbWJlZGRpbmcgPSBkZWNvZGVSZWZWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGNlbGxJZHMgPSByYW5rQ2VsbHNCeUNsb3NlbmVzcyhlbWJlZGRpbmcsIGNlbnRyb2lkcykuc2xpY2UoMCwgMSArIERFTEVURV9GQUxMQkFDS19DRUxMUyk7XG4gICAgICAgIGNhbmRpZGF0ZXNCeUl0ZW0ucHVzaCh7IHJlZjogcmVmc1tpbmRleF0sIGNlbGxJZHMgfSk7XG4gICAgICAgIGZvciAoY29uc3QgY2VsbElkIG9mIGNlbGxJZHMpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZVNldC5hZGQoY2VsbElkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNhbmRpZGF0ZUNlbGxJZHMgPSBBcnJheS5mcm9tKGNhbmRpZGF0ZVNldCk7XG4gICAgY29uc3Qgc3RvcmVzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiBjYW5kaWRhdGVDZWxsSWRzLm1hcChjZWxsSWQgPT4gcm9vdC5jZWxsc1tjZWxsSWRdKSk7XG4gICAgaWYgKCFzdG9yZXMpIHJldHVybjtcbiAgICBjb25zdCBtZW1iZXJzQnlDZWxsID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFN0b3JlZEVtYmVkZGluZz4+KCk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNhbmRpZGF0ZUNlbGxJZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIG1lbWJlcnNCeUNlbGwuc2V0KGNhbmRpZGF0ZUNlbGxJZHNbaW5kZXhdLCByZXBsYXlUcmFuc2FjdGlvblN0b3JlKHN0b3Jlc1tpbmRleF0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxldGVzQnlDZWxsID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgIGNvbnN0IGRlbGV0ZWRSZWZzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXNCeUl0ZW0pIHtcbiAgICAgICAgZm9yIChjb25zdCBjZWxsSWQgb2YgY2FuZGlkYXRlLmNlbGxJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlcnMgPSBtZW1iZXJzQnlDZWxsLmdldChjZWxsSWQpO1xuICAgICAgICAgICAgaWYgKCFtZW1iZXJzIHx8ICFtZW1iZXJzLmhhcyhjYW5kaWRhdGUucmVmKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNlbGxSZWZzID0gZGVsZXRlc0J5Q2VsbC5nZXQoY2VsbElkKTtcbiAgICAgICAgICAgIGlmICghY2VsbFJlZnMpIHtcbiAgICAgICAgICAgICAgICBjZWxsUmVmcyA9IFtdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZXNCeUNlbGwuc2V0KGNlbGxJZCwgY2VsbFJlZnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2VsbFJlZnMucHVzaChjYW5kaWRhdGUucmVmKTtcbiAgICAgICAgICAgIGRlbGV0ZWRSZWZzLnB1c2goY2FuZGlkYXRlLnJlZik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2VsbElkIG9mIGRlbGV0ZXNCeUNlbGwua2V5cygpKSB7XG4gICAgICAgIGNvbnN0IGNlbGxSZWZzID0gZGVsZXRlc0J5Q2VsbC5nZXQoY2VsbElkKSE7XG4gICAgICAgIGNvbnN0IG1lbWJlckRlbGV0ZXMgPSBjZWxsUmVmcy5tYXAocmVmID0+ICh7IGtleTogcmVmLCB2YWx1ZTogdW5kZWZpbmVkIH0pKTtcbiAgICAgICAgdHJhbnNhY3Rpb25NdXRhdGUoY2VsbFN0b3JlKGRhdGFiYXNlLCBjZWxsSWQpLCBtZW1iZXJEZWxldGVzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByZWYgb2YgZGVsZXRlZFJlZnMpIHtcbiAgICAgICAgZGF0YWJhc2UuZGVsZXRlRGF0YShyb290ID0+IHJvb3QuYnlSZWZbcmVmXSk7XG4gICAgfVxuICAgIGlmIChkZWxldGVkUmVmcy5sZW5ndGgpIHtcbiAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgTWF0aC5tYXgoMCwgY291bnQgLSBkZWxldGVkUmVmcy5sZW5ndGgpKTtcbiAgICB9XG59XG4iXX0=
|
|
396
|
+
/* _JS_SOURCE_HASH = "c451ec18a4ef4b2bfa161102a830634813d59e328ea1cc5dc85d3a8c9b258635"; */
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
6
|
-
//exports.transactionMutate = exports.replayTransactionStore = exports.transactionRead = void 0;
|
|
6
|
+
//exports.transactionDelete = exports.transactionMutate = exports.replayTransactionStore = exports.transactionRead = void 0;
|
|
7
7
|
const cbor_x_1 = __importDefault(require("cbor-x"));
|
|
8
8
|
// structuredClone keeps typed arrays / Maps / undefined intact through the round-trip.
|
|
9
9
|
const transactionCbor = new cbor_x_1.default.Encoder({ structuredClone: true });
|
|
@@ -104,5 +104,17 @@ function transactionMutate(database, transactions, compactAfterFiles = DEFAULT_C
|
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
106
|
exports.transactionMutate = transactionMutate;
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25TZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0cmFuc2FjdGlvblNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBMkI7QUFHM0IsdUZBQXVGO0FBQ3ZGLE1BQU0sZUFBZSxHQUFHLElBQUksZ0JBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQVdyRSxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUV2QyxTQUFTLFNBQVMsQ0FBQyxNQUFnQixFQUFFLFFBQWdCO0lBQ2pELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQztJQUN0QixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsT0FBcUI7SUFDeEMsTUFBTSxZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzNCLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFrQixDQUFDO1FBQ2hFLEtBQUssTUFBTSxXQUFXLElBQUksT0FBTyxFQUFFLENBQUM7WUFDaEMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUN6QixRQUE4QztJQUU5QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3ZDLHFHQUFxRztRQUNyRyxNQUFNLE9BQU8sR0FBRyxLQUErQyxDQUFD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RSxLQUFLLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7U0FBTSxDQUFDO1FBQ0osTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQWUsQ0FBQztRQUMvRCxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hFLENBQUM7QUFDTCxDQUFDO0FBckJELDhDQXFCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjYm9yeCBmcm9tIFwiY2Jvci14XCI7XG5pbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gXCIuL0RhdGFiYXNlXCI7XG5cbi8vIHN0cnVjdHVyZWRDbG9uZSBrZWVwcyB0eXBlZCBhcnJheXMgLyBNYXBzIC8gdW5kZWZpbmVkIGludGFjdCB0aHJvdWdoIHRoZSByb3VuZC10cmlwLlxuY29uc3QgdHJhbnNhY3Rpb25DYm9yID0gbmV3IGNib3J4LkVuY29kZXIoeyBzdHJ1Y3R1cmVkQ2xvbmU6IHRydWUgfSk7XG5cbi8vIE9uIHRoZSBzdG9yZTogZmlsZXMga2V5ZWQgYnkgYSBtb25vdG9uaWMgbnVtYmVyLCBlYWNoIGEgQ0JPUiBhcnJheSBvZiB0cmFuc2FjdGlvbnM7IGEgdHJhbnNhY3Rpb24gc2V0cyBvbmUga2V5ICh2YWx1ZSB1bmRlZmluZWQgPSBkZWxldGUpIGFuZCBjYXJyaWVzIGEgZ2xvYmFsIHNlcXVlbmNlIG51bWJlci4gUmVwbGF5aW5nIGV2ZXJ5IHRyYW5zYWN0aW9uIGluIHNlcXVlbmNlIG9yZGVyIChsYXN0IHdyaXRlIHdpbnMpIGdpdmVzIHRoZSBjdXJyZW50IG1hcC4gTXV0YXRpb25zIGFwcGVuZCBhIGZpbGUsIHRoZW4gZm9sZCB0aGUgd2hvbGUgc2V0IGludG8gb25lIG9uY2UgZW5vdWdoIGFjY3VtdWxhdGUuIFZhbHVlIGlzIHBoYW50b20g4oCUIGl0IG9ubHkgcmVjb3JkcyB3aGF0IHRoZSBlbmNvZGVkIHZhbHVlcyBkZXNlcmlhbGl6ZSB0by5cbmRlY2xhcmUgY29uc3QgdmFsdWVUYWc6IHVuaXF1ZSBzeW1ib2w7XG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvblNldFN0b3JlPFZhbHVlPiA9IHtcbiAgICBbZmlsZU51bWJlcjogc3RyaW5nXTogVWludDhBcnJheTtcbiAgICBbdmFsdWVUYWddPzogVmFsdWU7XG59O1xuXG50eXBlIFRyYW5zYWN0aW9uID0geyBzZXF1ZW5jZTogbnVtYmVyOyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfTtcblxuY29uc3QgREVGQVVMVF9DT01QQUNUX0FGVEVSX0ZJTEVTID0gMTY7XG5cbmZ1bmN0aW9uIG1heE51bWJlcih2YWx1ZXM6IG51bWJlcltdLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0ID0gZmFsbGJhY2s7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlID4gcmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBkZWNvZGVCdWZmZXJzKGJ1ZmZlcnM6IFVpbnQ4QXJyYXlbXSk6IFRyYW5zYWN0aW9uW10ge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcnMpIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IHRyYW5zYWN0aW9uQ2Jvci5kZWNvZGUoYnVmZmVyKSBhcyBUcmFuc2FjdGlvbltdO1xuICAgICAgICBmb3IgKGNvbnN0IHRyYW5zYWN0aW9uIG9mIGRlY29kZWQpIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9ucy5wdXNoKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJhbnNhY3Rpb25zO1xufVxuXG5mdW5jdGlvbiByZWFkVHJhbnNhY3Rpb25GaWxlczxWYWx1ZT4oXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPFRyYW5zYWN0aW9uU2V0U3RvcmU8VmFsdWU+Pixcbik6IHsgZmlsZUtleXM6IHN0cmluZ1tdOyB0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10gfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBkYXRhYmFzZS5yZWFkRGF0YShzdG9yZSA9PiB7XG4gICAgICAgIC8vIEEgbmV2ZXItd3JpdHRlbiAvIGRlbGV0ZWQgc2V0IHJlYWRzIGFzIGVtcHR5ICh2cyB0aGUgd2hvbGUgcmVhZERhdGEgYmVpbmcgdW5kZWZpbmVkID0gbm90IHN5bmNlZCkuXG4gICAgICAgIGNvbnN0IHByZXNlbnQgPSBzdG9yZSBhcyBUcmFuc2FjdGlvblNldFN0b3JlPFZhbHVlPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFwcmVzZW50KSByZXR1cm4geyBmaWxlS2V5czogW10gYXMgc3RyaW5nW10sIGJ1ZmZlcnM6IFtdIGFzIFVpbnQ4QXJyYXlbXSB9O1xuICAgICAgICByZXR1cm4geyBmaWxlS2V5czogT2JqZWN0LmtleXMocHJlc2VudCksIGJ1ZmZlcnM6IE9iamVjdC52YWx1ZXMocHJlc2VudCkgfTtcbiAgICB9KTtcbiAgICBpZiAoIXNuYXBzaG90KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IGZpbGVLZXlzOiBzbmFwc2hvdC5maWxlS2V5cywgdHJhbnNhY3Rpb25zOiBkZWNvZGVCdWZmZXJzKHNuYXBzaG90LmJ1ZmZlcnMpIH07XG59XG5cbmZ1bmN0aW9uIHJlcGxheSh0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10pOiBNYXA8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3Qgb3JkZXJlZCA9IHRyYW5zYWN0aW9ucy5zbGljZSgpLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LnNlcXVlbmNlIC0gcmlnaHQuc2VxdWVuY2UpO1xuICAgIGNvbnN0IHN0YXRlID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gICAgZm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiBvcmRlcmVkKSB7XG4gICAgICAgIC8vIHVuZGVmaW5lZCAobm90IGZhbHN5KSBpcyB0aGUgZGVsZXRlIG1hcmtlciwgc28gMCAvIFwiXCIgLyBmYWxzZSBzdGF5IHJlYWwgdmFsdWVzLlxuICAgICAgICBpZiAodHJhbnNhY3Rpb24udmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhdGUuZGVsZXRlKHRyYW5zYWN0aW9uLmtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZS5zZXQodHJhbnNhY3Rpb24ua2V5LCB0cmFuc2FjdGlvbi52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xufVxuXG4vLyBEZWxldGVzIG9sZCBmaWxlcyBieSB0aGVpciBPUklHSU5BTCBzdHJpbmcga2V5LCBzbyBhIHN0cmF5IG5vbi1udW1lcmljIGtleSBzdGlsbCBnZXRzIHJlbW92ZWQuXG5mdW5jdGlvbiBjb21wYWN0VHJhbnNhY3Rpb25zPFZhbHVlPihcbiAgICBkYXRhYmFzZTogRGF0YWJhc2U8VHJhbnNhY3Rpb25TZXRTdG9yZTxWYWx1ZT4+LFxuICAgIGFsbFRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25bXSxcbiAgICBvbGRGaWxlS2V5czogc3RyaW5nW10sXG4gICAgbmV3RmlsZU51bWJlcjogbnVtYmVyLFxuKTogdm9pZCB7XG4gICAgY29uc3QgZmluYWxTdGF0ZSA9IHJlcGxheShhbGxUcmFuc2FjdGlvbnMpO1xuICAgIGNvbnN0IG1lcmdlZDogVHJhbnNhY3Rpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGZpbmFsU3RhdGUua2V5cygpKSB7XG4gICAgICAgIG1lcmdlZC5wdXNoKHsgc2VxdWVuY2U6IG1lcmdlZC5sZW5ndGgsIGtleSwgdmFsdWU6IGZpbmFsU3RhdGUuZ2V0KGtleSkgfSk7XG4gICAgfVxuICAgIGNvbnN0IGVuY29kZWQgPSB0cmFuc2FjdGlvbkNib3IuZW5jb2RlKG1lcmdlZCkgYXMgVWludDhBcnJheTtcbiAgICBkYXRhYmFzZS53cml0ZURhdGEoc3RvcmUgPT4gc3RvcmVbU3RyaW5nKG5ld0ZpbGVOdW1iZXIpXSwgZW5jb2RlZCk7XG4gICAgZm9yIChjb25zdCBmaWxlS2V5IG9mIG9sZEZpbGVLZXlzKSB7XG4gICAgICAgIGRhdGFiYXNlLmRlbGV0ZURhdGEoc3RvcmUgPT4gc3RvcmVbZmlsZUtleV0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zYWN0aW9uUmVhZDxWYWx1ZT4oXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPFRyYW5zYWN0aW9uU2V0U3RvcmU8VmFsdWU+Pixcbik6IE1hcDxzdHJpbmcsIFZhbHVlPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmlsZXMgPSByZWFkVHJhbnNhY3Rpb25GaWxlcyhkYXRhYmFzZSk7XG4gICAgaWYgKCFmaWxlcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVwbGF5KGZpbGVzLnRyYW5zYWN0aW9ucykgYXMgTWFwPHN0cmluZywgVmFsdWU+O1xufVxuXG4vLyBSZXBsYXkgYW4gYWxyZWFkeS1yZWFkIHN0b3JlIChubyByZWFkIG9mIGl0cyBvd24pLCBzbyBhIGNhbGxlciBjYW4gZmV0Y2ggbWFueSBzZXRzIGluIG9uZSBiYXRjaGVkIHJlYWQgYW5kIG1hdGVyaWFsaXplIGVhY2guXG5leHBvcnQgZnVuY3Rpb24gcmVwbGF5VHJhbnNhY3Rpb25TdG9yZTxWYWx1ZT4oc3RvcmU6IFRyYW5zYWN0aW9uU2V0U3RvcmU8VmFsdWU+IHwgdW5kZWZpbmVkKTogTWFwPHN0cmluZywgVmFsdWU+IHtcbiAgICBpZiAoIXN0b3JlKSByZXR1cm4gbmV3IE1hcCgpO1xuICAgIHJldHVybiByZXBsYXkoZGVjb2RlQnVmZmVycyhPYmplY3QudmFsdWVzKHN0b3JlKSkpIGFzIE1hcDxzdHJpbmcsIFZhbHVlPjtcbn1cblxuLy8gRmlyZS1hbmQtZm9yZ2V0OiBubyBjYWxsZXIgc2hvdWxkIGNhcmUgd2hldGhlciB0aGlzIFwic3VjY2VlZGVkXCIuIElmIHRoZSBzZXQgaXNuJ3Qgc3luY2VkIGZvciByZWFkaW5nXG4vLyB5ZXQgaXQgc2ltcGx5IGRvZXMgbm90aGluZyB0aGlzIHBhc3MgYW5kIHRoZSBjYWxsZXIncyByZXRyeSB3cmFwcGVyIHJlLXJ1bnMgdGhlIHdob2xlIG9wZXJhdGlvbiBsYXRlci5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbk11dGF0ZTxWYWx1ZT4oXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPFRyYW5zYWN0aW9uU2V0U3RvcmU8VmFsdWU+PixcbiAgICB0cmFuc2FjdGlvbnM6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBWYWx1ZSB8IHVuZGVmaW5lZCB9W10sXG4gICAgY29tcGFjdEFmdGVyRmlsZXM6IG51bWJlciA9IERFRkFVTFRfQ09NUEFDVF9BRlRFUl9GSUxFUyxcbik6IHZvaWQge1xuICAgIGlmICghdHJhbnNhY3Rpb25zLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGZpbGVzID0gcmVhZFRyYW5zYWN0aW9uRmlsZXMoZGF0YWJhc2UpO1xuICAgIGlmICghZmlsZXMpIHJldHVybjtcbiAgICBjb25zdCBiYXNlU2VxdWVuY2UgPSBtYXhOdW1iZXIoZmlsZXMudHJhbnNhY3Rpb25zLm1hcCh0cmFuc2FjdGlvbiA9PiB0cmFuc2FjdGlvbi5zZXF1ZW5jZSksIC0xKSArIDE7XG4gICAgY29uc3QgaW5jb21pbmc6IFRyYW5zYWN0aW9uW10gPSB0cmFuc2FjdGlvbnMubWFwKCh0cmFuc2FjdGlvbiwgaW5kZXgpID0+ICh7XG4gICAgICAgIHNlcXVlbmNlOiBiYXNlU2VxdWVuY2UgKyBpbmRleCxcbiAgICAgICAga2V5OiB0cmFuc2FjdGlvbi5rZXksXG4gICAgICAgIHZhbHVlOiB0cmFuc2FjdGlvbi52YWx1ZSxcbiAgICB9KSk7XG4gICAgY29uc3QgbmV4dEZpbGVOdW1iZXIgPSBtYXhOdW1iZXIoZmlsZXMuZmlsZUtleXMubWFwKGZpbGVLZXkgPT4gTnVtYmVyKGZpbGVLZXkpKSwgLTEpICsgMTtcbiAgICBpZiAoZmlsZXMuZmlsZUtleXMubGVuZ3RoICsgMSA+PSBjb21wYWN0QWZ0ZXJGaWxlcykge1xuICAgICAgICBjb21wYWN0VHJhbnNhY3Rpb25zKGRhdGFiYXNlLCBmaWxlcy50cmFuc2FjdGlvbnMuY29uY2F0KGluY29taW5nKSwgZmlsZXMuZmlsZUtleXMsIG5leHRGaWxlTnVtYmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gdHJhbnNhY3Rpb25DYm9yLmVuY29kZShpbmNvbWluZykgYXMgVWludDhBcnJheTtcbiAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHN0b3JlID0+IHN0b3JlW1N0cmluZyhuZXh0RmlsZU51bWJlcildLCBlbmNvZGVkKTtcbiAgICB9XG59XG4iXX0=
|
|
108
|
-
|
|
107
|
+
// Fire-and-forget like transactionMutate: clears the whole set by deleting every file. deleteData only removes
|
|
108
|
+
// a primitive leaf (not a store object), so we delete each file key individually. No-ops (the retry re-runs)
|
|
109
|
+
// if the store isn't synced yet.
|
|
110
|
+
function transactionDelete(database) {
|
|
111
|
+
const files = readTransactionFiles(database);
|
|
112
|
+
if (!files)
|
|
113
|
+
return;
|
|
114
|
+
for (const fileKey of files.fileKeys) {
|
|
115
|
+
database.deleteData(store => store[fileKey]);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.transactionDelete = transactionDelete;
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25TZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0cmFuc2FjdGlvblNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBMkI7QUFHM0IsdUZBQXVGO0FBQ3ZGLE1BQU0sZUFBZSxHQUFHLElBQUksZ0JBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQVdyRSxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUV2QyxTQUFTLFNBQVMsQ0FBQyxNQUFnQixFQUFFLFFBQWdCO0lBQ2pELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQztJQUN0QixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsT0FBcUI7SUFDeEMsTUFBTSxZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzNCLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFrQixDQUFDO1FBQ2hFLEtBQUssTUFBTSxXQUFXLElBQUksT0FBTyxFQUFFLENBQUM7WUFDaEMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUN6QixRQUE4QztJQUU5QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3ZDLHFHQUFxRztRQUNyRyxNQUFNLE9BQU8sR0FBRyxLQUErQyxDQUFD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RSxLQUFLLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7U0FBTSxDQUFDO1FBQ0osTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQWUsQ0FBQztRQUMvRCxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hFLENBQUM7QUFDTCxDQUFDO0FBckJELDhDQXFCQztBQUVELCtHQUErRztBQUMvRyw2R0FBNkc7QUFDN0csaUNBQWlDO0FBQ2pDLFNBQWdCLGlCQUFpQixDQUM3QixRQUE4QztJQUU5QyxNQUFNLEtBQUssR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU87SUFDbkIsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7QUFDTCxDQUFDO0FBUkQsOENBUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2JvcnggZnJvbSBcImNib3IteFwiO1xuaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tIFwiLi9EYXRhYmFzZVwiO1xuXG4vLyBzdHJ1Y3R1cmVkQ2xvbmUga2VlcHMgdHlwZWQgYXJyYXlzIC8gTWFwcyAvIHVuZGVmaW5lZCBpbnRhY3QgdGhyb3VnaCB0aGUgcm91bmQtdHJpcC5cbmNvbnN0IHRyYW5zYWN0aW9uQ2JvciA9IG5ldyBjYm9yeC5FbmNvZGVyKHsgc3RydWN0dXJlZENsb25lOiB0cnVlIH0pO1xuXG4vLyBPbiB0aGUgc3RvcmU6IGZpbGVzIGtleWVkIGJ5IGEgbW9ub3RvbmljIG51bWJlciwgZWFjaCBhIENCT1IgYXJyYXkgb2YgdHJhbnNhY3Rpb25zOyBhIHRyYW5zYWN0aW9uIHNldHMgb25lIGtleSAodmFsdWUgdW5kZWZpbmVkID0gZGVsZXRlKSBhbmQgY2FycmllcyBhIGdsb2JhbCBzZXF1ZW5jZSBudW1iZXIuIFJlcGxheWluZyBldmVyeSB0cmFuc2FjdGlvbiBpbiBzZXF1ZW5jZSBvcmRlciAobGFzdCB3cml0ZSB3aW5zKSBnaXZlcyB0aGUgY3VycmVudCBtYXAuIE11dGF0aW9ucyBhcHBlbmQgYSBmaWxlLCB0aGVuIGZvbGQgdGhlIHdob2xlIHNldCBpbnRvIG9uZSBvbmNlIGVub3VnaCBhY2N1bXVsYXRlLiBWYWx1ZSBpcyBwaGFudG9tIOKAlCBpdCBvbmx5IHJlY29yZHMgd2hhdCB0aGUgZW5jb2RlZCB2YWx1ZXMgZGVzZXJpYWxpemUgdG8uXG5kZWNsYXJlIGNvbnN0IHZhbHVlVGFnOiB1bmlxdWUgc3ltYm9sO1xuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25TZXRTdG9yZTxWYWx1ZT4gPSB7XG4gICAgW2ZpbGVOdW1iZXI6IHN0cmluZ106IFVpbnQ4QXJyYXk7XG4gICAgW3ZhbHVlVGFnXT86IFZhbHVlO1xufTtcblxudHlwZSBUcmFuc2FjdGlvbiA9IHsgc2VxdWVuY2U6IG51bWJlcjsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH07XG5cbmNvbnN0IERFRkFVTFRfQ09NUEFDVF9BRlRFUl9GSUxFUyA9IDE2O1xuXG5mdW5jdGlvbiBtYXhOdW1iZXIodmFsdWVzOiBudW1iZXJbXSwgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHJlc3VsdCA9IGZhbGxiYWNrO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZSA+IHJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZGVjb2RlQnVmZmVycyhidWZmZXJzOiBVaW50OEFycmF5W10pOiBUcmFuc2FjdGlvbltdIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGJ1ZmZlciBvZiBidWZmZXJzKSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSB0cmFuc2FjdGlvbkNib3IuZGVjb2RlKGJ1ZmZlcikgYXMgVHJhbnNhY3Rpb25bXTtcbiAgICAgICAgZm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiBkZWNvZGVkKSB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnMucHVzaCh0cmFuc2FjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9ucztcbn1cblxuZnVuY3Rpb24gcmVhZFRyYW5zYWN0aW9uRmlsZXM8VmFsdWU+KFxuICAgIGRhdGFiYXNlOiBEYXRhYmFzZTxUcmFuc2FjdGlvblNldFN0b3JlPFZhbHVlPj4sXG4pOiB7IGZpbGVLZXlzOiBzdHJpbmdbXTsgdHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdIH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gZGF0YWJhc2UucmVhZERhdGEoc3RvcmUgPT4ge1xuICAgICAgICAvLyBBIG5ldmVyLXdyaXR0ZW4gLyBkZWxldGVkIHNldCByZWFkcyBhcyBlbXB0eSAodnMgdGhlIHdob2xlIHJlYWREYXRhIGJlaW5nIHVuZGVmaW5lZCA9IG5vdCBzeW5jZWQpLlxuICAgICAgICBjb25zdCBwcmVzZW50ID0gc3RvcmUgYXMgVHJhbnNhY3Rpb25TZXRTdG9yZTxWYWx1ZT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghcHJlc2VudCkgcmV0dXJuIHsgZmlsZUtleXM6IFtdIGFzIHN0cmluZ1tdLCBidWZmZXJzOiBbXSBhcyBVaW50OEFycmF5W10gfTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZUtleXM6IE9iamVjdC5rZXlzKHByZXNlbnQpLCBidWZmZXJzOiBPYmplY3QudmFsdWVzKHByZXNlbnQpIH07XG4gICAgfSk7XG4gICAgaWYgKCFzbmFwc2hvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBmaWxlS2V5czogc25hcHNob3QuZmlsZUtleXMsIHRyYW5zYWN0aW9uczogZGVjb2RlQnVmZmVycyhzbmFwc2hvdC5idWZmZXJzKSB9O1xufVxuXG5mdW5jdGlvbiByZXBsYXkodHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdKTogTWFwPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IG9yZGVyZWQgPSB0cmFuc2FjdGlvbnMuc2xpY2UoKS5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5zZXF1ZW5jZSAtIHJpZ2h0LnNlcXVlbmNlKTtcbiAgICBjb25zdCBzdGF0ZSA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuICAgIGZvciAoY29uc3QgdHJhbnNhY3Rpb24gb2Ygb3JkZXJlZCkge1xuICAgICAgICAvLyB1bmRlZmluZWQgKG5vdCBmYWxzeSkgaXMgdGhlIGRlbGV0ZSBtYXJrZXIsIHNvIDAgLyBcIlwiIC8gZmFsc2Ugc3RheSByZWFsIHZhbHVlcy5cbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0YXRlLmRlbGV0ZSh0cmFuc2FjdGlvbi5rZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUuc2V0KHRyYW5zYWN0aW9uLmtleSwgdHJhbnNhY3Rpb24udmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbn1cblxuLy8gRGVsZXRlcyBvbGQgZmlsZXMgYnkgdGhlaXIgT1JJR0lOQUwgc3RyaW5nIGtleSwgc28gYSBzdHJheSBub24tbnVtZXJpYyBrZXkgc3RpbGwgZ2V0cyByZW1vdmVkLlxuZnVuY3Rpb24gY29tcGFjdFRyYW5zYWN0aW9uczxWYWx1ZT4oXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPFRyYW5zYWN0aW9uU2V0U3RvcmU8VmFsdWU+PixcbiAgICBhbGxUcmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10sXG4gICAgb2xkRmlsZUtleXM6IHN0cmluZ1tdLFxuICAgIG5ld0ZpbGVOdW1iZXI6IG51bWJlcixcbik6IHZvaWQge1xuICAgIGNvbnN0IGZpbmFsU3RhdGUgPSByZXBsYXkoYWxsVHJhbnNhY3Rpb25zKTtcbiAgICBjb25zdCBtZXJnZWQ6IFRyYW5zYWN0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaW5hbFN0YXRlLmtleXMoKSkge1xuICAgICAgICBtZXJnZWQucHVzaCh7IHNlcXVlbmNlOiBtZXJnZWQubGVuZ3RoLCBrZXksIHZhbHVlOiBmaW5hbFN0YXRlLmdldChrZXkpIH0pO1xuICAgIH1cbiAgICBjb25zdCBlbmNvZGVkID0gdHJhbnNhY3Rpb25DYm9yLmVuY29kZShtZXJnZWQpIGFzIFVpbnQ4QXJyYXk7XG4gICAgZGF0YWJhc2Uud3JpdGVEYXRhKHN0b3JlID0+IHN0b3JlW1N0cmluZyhuZXdGaWxlTnVtYmVyKV0sIGVuY29kZWQpO1xuICAgIGZvciAoY29uc3QgZmlsZUtleSBvZiBvbGRGaWxlS2V5cykge1xuICAgICAgICBkYXRhYmFzZS5kZWxldGVEYXRhKHN0b3JlID0+IHN0b3JlW2ZpbGVLZXldKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvblJlYWQ8VmFsdWU+KFxuICAgIGRhdGFiYXNlOiBEYXRhYmFzZTxUcmFuc2FjdGlvblNldFN0b3JlPFZhbHVlPj4sXG4pOiBNYXA8c3RyaW5nLCBWYWx1ZT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZpbGVzID0gcmVhZFRyYW5zYWN0aW9uRmlsZXMoZGF0YWJhc2UpO1xuICAgIGlmICghZmlsZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlcGxheShmaWxlcy50cmFuc2FjdGlvbnMpIGFzIE1hcDxzdHJpbmcsIFZhbHVlPjtcbn1cblxuLy8gUmVwbGF5IGFuIGFscmVhZHktcmVhZCBzdG9yZSAobm8gcmVhZCBvZiBpdHMgb3duKSwgc28gYSBjYWxsZXIgY2FuIGZldGNoIG1hbnkgc2V0cyBpbiBvbmUgYmF0Y2hlZCByZWFkIGFuZCBtYXRlcmlhbGl6ZSBlYWNoLlxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxheVRyYW5zYWN0aW9uU3RvcmU8VmFsdWU+KHN0b3JlOiBUcmFuc2FjdGlvblNldFN0b3JlPFZhbHVlPiB8IHVuZGVmaW5lZCk6IE1hcDxzdHJpbmcsIFZhbHVlPiB7XG4gICAgaWYgKCFzdG9yZSkgcmV0dXJuIG5ldyBNYXAoKTtcbiAgICByZXR1cm4gcmVwbGF5KGRlY29kZUJ1ZmZlcnMoT2JqZWN0LnZhbHVlcyhzdG9yZSkpKSBhcyBNYXA8c3RyaW5nLCBWYWx1ZT47XG59XG5cbi8vIEZpcmUtYW5kLWZvcmdldDogbm8gY2FsbGVyIHNob3VsZCBjYXJlIHdoZXRoZXIgdGhpcyBcInN1Y2NlZWRlZFwiLiBJZiB0aGUgc2V0IGlzbid0IHN5bmNlZCBmb3IgcmVhZGluZ1xuLy8geWV0IGl0IHNpbXBseSBkb2VzIG5vdGhpbmcgdGhpcyBwYXNzIGFuZCB0aGUgY2FsbGVyJ3MgcmV0cnkgd3JhcHBlciByZS1ydW5zIHRoZSB3aG9sZSBvcGVyYXRpb24gbGF0ZXIuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25NdXRhdGU8VmFsdWU+KFxuICAgIGRhdGFiYXNlOiBEYXRhYmFzZTxUcmFuc2FjdGlvblNldFN0b3JlPFZhbHVlPj4sXG4gICAgdHJhbnNhY3Rpb25zOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogVmFsdWUgfCB1bmRlZmluZWQgfVtdLFxuICAgIGNvbXBhY3RBZnRlckZpbGVzOiBudW1iZXIgPSBERUZBVUxUX0NPTVBBQ1RfQUZURVJfRklMRVMsXG4pOiB2b2lkIHtcbiAgICBpZiAoIXRyYW5zYWN0aW9ucy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBmaWxlcyA9IHJlYWRUcmFuc2FjdGlvbkZpbGVzKGRhdGFiYXNlKTtcbiAgICBpZiAoIWZpbGVzKSByZXR1cm47XG4gICAgY29uc3QgYmFzZVNlcXVlbmNlID0gbWF4TnVtYmVyKGZpbGVzLnRyYW5zYWN0aW9ucy5tYXAodHJhbnNhY3Rpb24gPT4gdHJhbnNhY3Rpb24uc2VxdWVuY2UpLCAtMSkgKyAxO1xuICAgIGNvbnN0IGluY29taW5nOiBUcmFuc2FjdGlvbltdID0gdHJhbnNhY3Rpb25zLm1hcCgodHJhbnNhY3Rpb24sIGluZGV4KSA9PiAoe1xuICAgICAgICBzZXF1ZW5jZTogYmFzZVNlcXVlbmNlICsgaW5kZXgsXG4gICAgICAgIGtleTogdHJhbnNhY3Rpb24ua2V5LFxuICAgICAgICB2YWx1ZTogdHJhbnNhY3Rpb24udmFsdWUsXG4gICAgfSkpO1xuICAgIGNvbnN0IG5leHRGaWxlTnVtYmVyID0gbWF4TnVtYmVyKGZpbGVzLmZpbGVLZXlzLm1hcChmaWxlS2V5ID0+IE51bWJlcihmaWxlS2V5KSksIC0xKSArIDE7XG4gICAgaWYgKGZpbGVzLmZpbGVLZXlzLmxlbmd0aCArIDEgPj0gY29tcGFjdEFmdGVyRmlsZXMpIHtcbiAgICAgICAgY29tcGFjdFRyYW5zYWN0aW9ucyhkYXRhYmFzZSwgZmlsZXMudHJhbnNhY3Rpb25zLmNvbmNhdChpbmNvbWluZyksIGZpbGVzLmZpbGVLZXlzLCBuZXh0RmlsZU51bWJlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IHRyYW5zYWN0aW9uQ2Jvci5lbmNvZGUoaW5jb21pbmcpIGFzIFVpbnQ4QXJyYXk7XG4gICAgICAgIGRhdGFiYXNlLndyaXRlRGF0YShzdG9yZSA9PiBzdG9yZVtTdHJpbmcobmV4dEZpbGVOdW1iZXIpXSwgZW5jb2RlZCk7XG4gICAgfVxufVxuXG4vLyBGaXJlLWFuZC1mb3JnZXQgbGlrZSB0cmFuc2FjdGlvbk11dGF0ZTogY2xlYXJzIHRoZSB3aG9sZSBzZXQgYnkgZGVsZXRpbmcgZXZlcnkgZmlsZS4gZGVsZXRlRGF0YSBvbmx5IHJlbW92ZXNcbi8vIGEgcHJpbWl0aXZlIGxlYWYgKG5vdCBhIHN0b3JlIG9iamVjdCksIHNvIHdlIGRlbGV0ZSBlYWNoIGZpbGUga2V5IGluZGl2aWR1YWxseS4gTm8tb3BzICh0aGUgcmV0cnkgcmUtcnVucylcbi8vIGlmIHRoZSBzdG9yZSBpc24ndCBzeW5jZWQgeWV0LlxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zYWN0aW9uRGVsZXRlPFZhbHVlPihcbiAgICBkYXRhYmFzZTogRGF0YWJhc2U8VHJhbnNhY3Rpb25TZXRTdG9yZTxWYWx1ZT4+LFxuKTogdm9pZCB7XG4gICAgY29uc3QgZmlsZXMgPSByZWFkVHJhbnNhY3Rpb25GaWxlcyhkYXRhYmFzZSk7XG4gICAgaWYgKCFmaWxlcykgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgZmlsZUtleSBvZiBmaWxlcy5maWxlS2V5cykge1xuICAgICAgICBkYXRhYmFzZS5kZWxldGVEYXRhKHN0b3JlID0+IHN0b3JlW2ZpbGVLZXldKTtcbiAgICB9XG59XG4iXX0=
|
|
120
|
+
/* _JS_SOURCE_HASH = "29a0af616bc7beb258ce8346158aee94e6d01c2632e869161cafb8063b596eb0"; */
|
|
@@ -41,11 +41,22 @@ export type IBucketStore = {
|
|
|
41
41
|
fileCount: number;
|
|
42
42
|
byteCount: number;
|
|
43
43
|
};
|
|
44
|
+
sources: {
|
|
45
|
+
debugName: string;
|
|
46
|
+
fileCount: number;
|
|
47
|
+
byteCount: number;
|
|
48
|
+
}[];
|
|
49
|
+
readerDiskLimit?: number;
|
|
44
50
|
syncing: SyncActivity[];
|
|
45
51
|
};
|
|
46
52
|
computeIndexTotals?(): Promise<{
|
|
47
53
|
fileCount: number;
|
|
48
54
|
byteCount: number;
|
|
55
|
+
sources: {
|
|
56
|
+
debugName: string;
|
|
57
|
+
fileCount: number;
|
|
58
|
+
byteCount: number;
|
|
59
|
+
}[];
|
|
49
60
|
}>;
|
|
50
61
|
startLargeUpload(): Promise<string>;
|
|
51
62
|
appendLargeUpload(id: string, data: Buffer): Promise<void>;
|
|
@@ -66,8 +66,13 @@ export type IBucketStore = {
|
|
|
66
66
|
findInfo(prefix: string, config?: { shallow?: boolean; type?: "files" | "folders" }): Promise<ArchiveFileInfo[]>;
|
|
67
67
|
getChangesAfter?(time: number): Promise<ArchiveFileInfo[]>;
|
|
68
68
|
getSyncStatus?(): Promise<ArchivesSyncStatus>;
|
|
69
|
-
getSyncProgress?(): {
|
|
70
|
-
|
|
69
|
+
getSyncProgress?(): {
|
|
70
|
+
index: { fileCount: number; byteCount: number };
|
|
71
|
+
sources: { debugName: string; fileCount: number; byteCount: number }[];
|
|
72
|
+
readerDiskLimit?: number;
|
|
73
|
+
syncing: SyncActivity[];
|
|
74
|
+
};
|
|
75
|
+
computeIndexTotals?(): Promise<{ fileCount: number; byteCount: number; sources: { debugName: string; fileCount: number; byteCount: number }[] }>;
|
|
71
76
|
startLargeUpload(): Promise<string>;
|
|
72
77
|
appendLargeUpload(id: string, data: Buffer): Promise<void>;
|
|
73
78
|
finishLargeUpload(id: string, key: string): Promise<void>;
|
|
@@ -595,7 +600,7 @@ export class BlobStore implements IBucketStore {
|
|
|
595
600
|
// OLDER one - and it's copied onto our disk so the next read doesn't depend on luck.
|
|
596
601
|
for (let i = 0; i < this.sources.length; i++) {
|
|
597
602
|
if (i === holder) continue;
|
|
598
|
-
let fallback:
|
|
603
|
+
let fallback: { data: Buffer; writeTime: number; size: number } | undefined;
|
|
599
604
|
try {
|
|
600
605
|
fallback = await this.sources[i].source.get2(key);
|
|
601
606
|
} catch {
|