sliftutils 1.7.32 → 1.7.33
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/builders/extensionBuild.ts +1 -1
- package/bundler/bundleEntry.ts +1 -3
- package/bundler/bundler.ts +2 -4
- package/bundler/sourceMaps.ts +1 -2
- package/examplestorage/browser.tsx +1 -2
- package/examplestorage/exampleserver.ts +1 -2
- package/index.d.ts +105 -100
- package/misc/dist/environment.ts.cache +2 -2
- package/misc/dist/getSecret.ts.cache +2 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/dist/zip.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/dns.ts.cache +7 -16
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/misc/https/dns.d.ts +1 -4
- package/misc/https/dns.ts +5 -14
- package/misc/https/hostServer.d.ts +2 -0
- package/misc/https/hostServer.ts +6 -7
- package/misc/https/httpsCerts.ts +4 -10
- package/misc/openrouter.ts +1 -2
- package/package.json +1 -1
- package/render-utils/FullscreenModal.tsx +1 -4
- package/render-utils/GenericFormat.tsx +2 -8
- package/render-utils/Input.tsx +5 -13
- package/render-utils/InputLabel.tsx +4 -6
- package/render-utils/InputPicker.tsx +1 -2
- package/render-utils/URLParam.ts +2 -3
- package/render-utils/dist/observer.tsx.cache +2 -2
- package/render-utils/mobxTyped.ts +2 -3
- package/render-utils/niceStringify.ts +2 -4
- package/storage/ArchivesDisk.ts +4 -14
- package/storage/BulkDatabase2/BulkDatabase2.d.ts +1 -2
- package/storage/BulkDatabase2/BulkDatabase2.ts +4 -11
- package/storage/BulkDatabase2/BulkDatabaseBase.ts +42 -114
- package/storage/BulkDatabase2/BulkDatabaseFormat.ts +31 -91
- package/storage/BulkDatabase2/BulkDatabaseMerge.ts +19 -57
- package/storage/BulkDatabase2/BulkDatabaseReader.ts +4 -12
- package/storage/BulkDatabase2/LoadedIndex.ts +6 -18
- package/storage/BulkDatabase2/WriteOverlay.ts +3 -8
- package/storage/BulkDatabase2/blockCache.ts +12 -28
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +40 -103
- package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +19 -50
- package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +18 -50
- package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +7 -15
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +9 -21
- package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +6 -11
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +15 -31
- package/storage/BulkDatabase2/dist/mergeLock.ts.cache +10 -29
- package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +10 -18
- package/storage/BulkDatabase2/dist/streamLog.ts.cache +17 -43
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +11 -27
- package/storage/BulkDatabase2/mergeLock.ts +7 -26
- package/storage/BulkDatabase2/mergeMarkers.ts +7 -15
- package/storage/BulkDatabase2/streamLog.ts +14 -40
- package/storage/BulkDatabase2/syncClient.ts +8 -24
- package/storage/FileFolderAPI.tsx +28 -75
- package/storage/IArchives.d.ts +3 -3
- package/storage/IArchives.ts +21 -50
- package/storage/IStorage.ts +2 -4
- package/storage/PendingManager.tsx +2 -3
- package/storage/TransactionStorage.ts +11 -24
- package/storage/backblaze.ts +12 -43
- package/storage/dist/ArchivesDisk.ts.cache +7 -17
- package/storage/dist/FileFolderAPI.tsx.cache +25 -63
- package/storage/dist/IArchives.ts.cache +10 -20
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
- package/storage/dist/JSONStorage.ts.cache +2 -2
- package/storage/dist/PendingManager.tsx.cache +5 -6
- package/storage/dist/TransactionStorage.ts.cache +14 -27
- package/storage/dist/backblaze.ts.cache +15 -46
- package/storage/dist/embeddingFormats.ts.cache +11 -24
- package/storage/dist/fileSystemPointer.ts.cache +4 -7
- package/storage/dist/remoteFileStorage.ts.cache +17 -36
- package/storage/embeddingFormats.ts +11 -27
- package/storage/fileSystemPointer.ts +2 -7
- package/storage/proxydatabase/dist/ivfEmbeddingDatabase.ts.cache +8 -18
- package/storage/proxydatabase/dist/transactionSet.ts.cache +4 -7
- package/storage/proxydatabase/inMemoryDatabase.ts +1 -3
- package/storage/proxydatabase/ivfEmbeddingDatabase.ts +8 -23
- package/storage/proxydatabase/transactionSet.ts +2 -5
- package/storage/remoteFileServer.ts +20 -48
- package/storage/remoteFileStorage.ts +14 -33
- package/storage/remoteStorage/ArchivesRemote.d.ts +1 -4
- package/storage/remoteStorage/ArchivesRemote.ts +11 -26
- package/storage/remoteStorage/ArchivesUrl.ts +2 -4
- package/storage/remoteStorage/accessPage.tsx +1 -5
- package/storage/remoteStorage/blobStore.d.ts +5 -13
- package/storage/remoteStorage/blobStore.ts +52 -130
- package/storage/remoteStorage/createArchives.d.ts +9 -13
- package/storage/remoteStorage/createArchives.ts +43 -187
- package/storage/remoteStorage/deployTakeover.d.ts +18 -32
- package/storage/remoteStorage/deployTakeover.ts +70 -384
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +12 -24
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +5 -7
- package/storage/remoteStorage/dist/blobStore.ts.cache +47 -117
- package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +48 -189
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +81 -387
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +119 -0
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +36 -24
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +20 -40
- package/storage/remoteStorage/dist/storageClientController.ts.cache +4 -6
- package/storage/remoteStorage/dist/storageController.ts.cache +11 -73
- package/storage/remoteStorage/dist/storageServerState.ts.cache +265 -178
- package/storage/remoteStorage/grantAccessCli.ts +1 -3
- package/storage/remoteStorage/intermediateSources.d.ts +21 -0
- package/storage/remoteStorage/intermediateSources.ts +117 -0
- package/storage/remoteStorage/remoteConfig.ts +33 -20
- package/storage/remoteStorage/sourceWrapper.d.ts +8 -19
- package/storage/remoteStorage/sourceWrapper.ts +19 -41
- package/storage/remoteStorage/storageClientController.ts +1 -3
- package/storage/remoteStorage/storageController.d.ts +4 -5
- package/storage/remoteStorage/storageController.ts +10 -81
- package/storage/remoteStorage/storageServer.ts +20 -34
- package/storage/remoteStorage/storageServerState.d.ts +28 -5
- package/storage/remoteStorage/storageServerState.ts +271 -207
|
@@ -40,8 +40,7 @@ function rankCellsByCloseness(embedding, centroids) {
|
|
|
40
40
|
ranked.sort((left, right) => right.closeness - left.closeness);
|
|
41
41
|
return ranked.map(entry => entry.cellId);
|
|
42
42
|
}
|
|
43
|
-
// Per-write chance of a full rebuild. Zero at/under the target size, then rises (cubically) past it so cells
|
|
44
|
-
// stay roughly between target and ~2x target.
|
|
43
|
+
// Per-write chance of a full rebuild. Zero at/under the target size, then rises (cubically) past it so cells stay roughly between target and ~2x target.
|
|
45
44
|
function rebalanceProbability(fillRatio) {
|
|
46
45
|
if (fillRatio <= 1) {
|
|
47
46
|
return 0;
|
|
@@ -49,9 +48,7 @@ function rebalanceProbability(fillRatio) {
|
|
|
49
48
|
const over = fillRatio - 1;
|
|
50
49
|
return Math.min(1, over * over * over * 0.25);
|
|
51
50
|
}
|
|
52
|
-
// k-means. Decodes every member to a pooled float32 buffer ONCE, then assigns with a plain internal float
|
|
53
|
-
// dot (no getCloseness call — comparing two float vectors is trivial) and keeps centroids as float means,
|
|
54
|
-
// encoding them to StoredEmbedding only at the end. Releases the borrowed buffers when done.
|
|
51
|
+
// k-means. Decodes every member to a pooled float32 buffer ONCE, then assigns with a plain internal float dot (no getCloseness call — comparing two float vectors is trivial) and keeps centroids as float means, encoding them to StoredEmbedding only at the end. Releases the borrowed buffers when done.
|
|
55
52
|
function clusterMembers(members, clusterCount, config) {
|
|
56
53
|
const memberFloats = [];
|
|
57
54
|
for (const member of members) {
|
|
@@ -127,10 +124,7 @@ function clusterMembers(members, clusterCount, config) {
|
|
|
127
124
|
}
|
|
128
125
|
return result;
|
|
129
126
|
}
|
|
130
|
-
// Re-cluster EVERY embedding (flat tier + all cells) into a fresh IVF, clear the flat tier, and mark IVF
|
|
131
|
-
// mode. This is the rearranger: run probabilistically as the set grows, once at each regenerate threshold,
|
|
132
|
-
// and once to upgrade from flat. Reads everything it uses, so it bails (does nothing) if anything isn't
|
|
133
|
-
// synced and the caller's retry re-runs it; no caller cares about its result.
|
|
127
|
+
// Re-cluster EVERY embedding (flat tier + all cells) into a fresh IVF, clear the flat tier, and mark IVF mode. This is the rearranger: run probabilistically as the set grows, once at each regenerate threshold, and once to upgrade from flat. Reads everything it uses, so it bails (does nothing) if anything isn't synced and the caller's retry re-runs it; no caller cares about its result.
|
|
134
128
|
function rebuildStructure(database) {
|
|
135
129
|
const config = database.readData(root => root.config);
|
|
136
130
|
if (!config)
|
|
@@ -139,9 +133,7 @@ function rebuildStructure(database) {
|
|
|
139
133
|
if (!steps)
|
|
140
134
|
return;
|
|
141
135
|
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.
|
|
136
|
+
// Only the one-time flat->IVF upgrade pulls from the flat tier. Once STEP_IVF is set the flat data has already been folded into cells, so later rebuilds ignore it. It's left in place, never deleted: deleteData only removes primitive leaves, not a whole store, and the flat tier is small enough not to matter.
|
|
145
137
|
if (!steps[STEP_IVF]) {
|
|
146
138
|
const flat = (0, transactionSet_1.transactionRead)(flatStore(database));
|
|
147
139
|
if (!flat)
|
|
@@ -226,8 +218,7 @@ function searchEmbeddings(database, query, options) {
|
|
|
226
218
|
return hits.slice(0, options.resultCount);
|
|
227
219
|
}
|
|
228
220
|
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.
|
|
221
|
+
// Direct ref -> stored embedding lookup through the byRef index: one key-value read per ref, no cell scan. A search returns refs; this fetches the data behind them. Skips refs that aren't present; undefined if not synced.
|
|
231
222
|
function lookupEmbeddings(database, refs) {
|
|
232
223
|
const values = database.readData(root => refs.map(ref => root.byRef[ref]));
|
|
233
224
|
if (!values)
|
|
@@ -334,8 +325,7 @@ function removeEmbeddings(database, refs) {
|
|
|
334
325
|
return;
|
|
335
326
|
if (!centroids.size)
|
|
336
327
|
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).
|
|
328
|
+
// Look up each ref's embedding through byRef, then rank its cells the way an insert would, so we delete from the cell it actually landed in (plus a few neighbours, in case a rebuild nudged it across a boundary).
|
|
339
329
|
const refValues = database.readData(root => refs.map(ref => root.byRef[ref]));
|
|
340
330
|
if (!refValues)
|
|
341
331
|
return;
|
|
@@ -392,5 +382,5 @@ function removeEmbeddings(database, refs) {
|
|
|
392
382
|
}
|
|
393
383
|
}
|
|
394
384
|
exports.removeEmbeddings = removeEmbeddings;
|
|
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 = "
|
|
385
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXZmRW1iZWRkaW5nRGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpdmZFbWJlZGRpbmdEYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBMkI7QUFDM0IseUNBQXlEO0FBQ3pELHFEQUFzSTtBQUN0SSwwREFBeUo7QUF5QnpKLE1BQU0sYUFBYSxHQUFHLElBQUksZ0JBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNuRSxTQUFTLGNBQWMsQ0FBQyxTQUEwQjtJQUM5QyxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFlLENBQUM7QUFDekQsQ0FBQztBQUNELFNBQVMsY0FBYyxDQUFDLEtBQWlCO0lBQ3JDLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQW9CLENBQUM7QUFDMUQsQ0FBQztBQUVELGlHQUFpRztBQUNqRyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDeEIseUpBQXlKO0FBQ3pKLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQztBQUN2QixxSEFBcUg7QUFDckgsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDakMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFFL0IsU0FBUyxTQUFTLENBQUMsUUFBb0M7SUFDbkQsT0FBTyxJQUFBLDRCQUFpQixFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ0QsU0FBUyxhQUFhLENBQUMsUUFBb0M7SUFDdkQsT0FBTyxJQUFBLDRCQUFpQixFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBQ0QsU0FBUyxT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YUFBYSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELEtBQUssTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDNUIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckIsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7QUFDTCxDQUFDO0FBaEZELDRDQWdGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjYm9yeCBmcm9tIFwiY2Jvci14XCI7XG5pbXBvcnQgeyBEYXRhYmFzZSwgbmFtZXNwYWNlRGF0YWJhc2UgfSBmcm9tIFwiLi9EYXRhYmFzZVwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TZXRTdG9yZSwgdHJhbnNhY3Rpb25SZWFkLCB0cmFuc2FjdGlvbk11dGF0ZSwgdHJhbnNhY3Rpb25EZWxldGUsIHJlcGxheVRyYW5zYWN0aW9uU3RvcmUgfSBmcm9tIFwiLi90cmFuc2FjdGlvblNldFwiO1xuaW1wb3J0IHsgU3RvcmVkRW1iZWRkaW5nLCBFbWJlZGRpbmdGb3JtYXQsIGdldENsb3NlbmVzcywgZW1iZWRkaW5nVG9GbG9hdDMyLCByZWxlYXNlRmxvYXQzMiwgZW5jb2RlRW1iZWRkaW5nLCBoYXNoRW1iZWRkaW5nIH0gZnJvbSBcIi4uL2VtYmVkZGluZ0Zvcm1hdHNcIjtcblxuZXhwb3J0IHR5cGUgSXZmQ29uZmlnID0ge1xuICAgIG1vZGVsOiBzdHJpbmc7XG4gICAgZm9ybWF0OiBFbWJlZGRpbmdGb3JtYXQ7XG4gICAgLy8gVGFyZ2V0IG51bWJlciBvZiBlbWJlZGRpbmdzIHBlciBjZWxsLlxuICAgIGNlbGxUYXJnZXRTaXplOiBudW1iZXI7XG59O1xuXG4vLyBUaWVyZWQgc3RvcmFnZS4gQmVsb3cgRkxBVF9MSU1JVCBlbWJlZGRpbmdzIHRoZSB3aG9sZSBzZXQgbGl2ZXMgaW4gb25lIGZsYXQgdHJhbnNhY3Rpb24gc2V0IChubyBJVkYpOyBvbmNlIGl0IGdyb3dzIHBhc3QgdGhhdCB3ZSBidWlsZCB0aGUgSVZGIChjZW50cm9pZHMgKyBwZXItY2VsbCBzZXRzKSBhbmQgc3RheSB0aGVyZSBmb3JldmVyLiBgY291bnRgIGlzIHRoZSBsaXZlIGVtYmVkZGluZyBjb3VudCAocmUtZGVyaXZlZCBleGFjdGx5IG9uIGEgcmVidWlsZCkuIGBzdGVwc2AgcmVjb3JkcyBvbmUtdGltZSB1cGdyYWRlcyB0aGF0IG11c3QgbmV2ZXIgcmUtcnVuIGV2ZW4gaWYgdGhlIHNldCBsYXRlciBzaHJpbmtzIGFuZCByZWdyb3dzLlxuZXhwb3J0IHR5cGUgSXZmRW1iZWRkaW5nUm9vdCA9IHtcbiAgICBjb25maWc6IEl2ZkNvbmZpZztcbiAgICBjb3VudDogbnVtYmVyO1xuICAgIGZsYXQ6IFRyYW5zYWN0aW9uU2V0U3RvcmU8U3RvcmVkRW1iZWRkaW5nPjtcbiAgICAvLyBEaXJlY3QgcmVmIC0+IGVtYmVkZGluZyBpbmRleC4gRWFjaCBlbnRyeSBpcyBvbmUgQ0JPUiBibG9iIGF0IGl0cyBvd24ga2V5LCBzbyBhIGxvb2t1cCBvciBkZWxldGUgaXMgYSBzaW5nbGUga2V5LXZhbHVlIG9wIChubyB0cmFuc2FjdGlvbi1zZXQgcmVwbGF5KSBhbmQgZGVsZXRlRGF0YSBjYW4gZHJvcCBpdCAoaXQncyBhIHByaW1pdGl2ZSBsZWFmKS4gUmVmcyBhbmQgdGhlaXIgZW1iZWRkaW5ncyBuZXZlciBtb3ZlLCBzbyBhIHJlYnVpbGQgbGVhdmVzIHRoaXMgdW50b3VjaGVkLlxuICAgIGJ5UmVmOiB7IFtyZWY6IHN0cmluZ106IFVpbnQ4QXJyYXkgfTtcbiAgICBzdGVwczogeyBbc3RlcDogc3RyaW5nXTogYm9vbGVhbiB9O1xuICAgIGNlbnRyb2lkczogVHJhbnNhY3Rpb25TZXRTdG9yZTxTdG9yZWRFbWJlZGRpbmc+O1xuICAgIGNlbGxzOiB7IFtjZWxsSWQ6IHN0cmluZ106IFRyYW5zYWN0aW9uU2V0U3RvcmU8U3RvcmVkRW1iZWRkaW5nPiB9O1xufTtcblxuZXhwb3J0IHR5cGUgRW1iZWRkaW5nSW5wdXQgPSB7IHJlZjogc3RyaW5nOyBlbWJlZGRpbmc6IFN0b3JlZEVtYmVkZGluZyB9O1xuZXhwb3J0IHR5cGUgU2VhcmNoSGl0ID0geyByZWY6IHN0cmluZzsgY2xvc2VuZXNzOiBudW1iZXIgfTtcbnR5cGUgQ2VsbEVudHJ5ID0geyByZWY6IHN0cmluZzsgZW1iZWRkaW5nOiBTdG9yZWRFbWJlZGRpbmcgfTtcblxuY29uc3QgZW1iZWRkaW5nQ2JvciA9IG5ldyBjYm9yeC5FbmNvZGVyKHsgc3RydWN0dXJlZENsb25lOiB0cnVlIH0pO1xuZnVuY3Rpb24gZW5jb2RlUmVmVmFsdWUoZW1iZWRkaW5nOiBTdG9yZWRFbWJlZGRpbmcpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gZW1iZWRkaW5nQ2Jvci5lbmNvZGUoZW1iZWRkaW5nKSBhcyBVaW50OEFycmF5O1xufVxuZnVuY3Rpb24gZGVjb2RlUmVmVmFsdWUodmFsdWU6IFVpbnQ4QXJyYXkpOiBTdG9yZWRFbWJlZGRpbmcge1xuICAgIHJldHVybiBlbWJlZGRpbmdDYm9yLmRlY29kZSh2YWx1ZSkgYXMgU3RvcmVkRW1iZWRkaW5nO1xufVxuXG4vLyBCZWxvdyB0aGlzIG1hbnkgZW1iZWRkaW5ncyB3ZSBza2lwIHRoZSBJVkYgZW50aXJlbHkgKGZsYXQgc3RvcmUpLiAxMDI0ID0gYSBjbGVhbiBwb3dlciBvZiB0d28uXG5jb25zdCBGTEFUX0xJTUlUID0gMTAyNDtcbi8vIEZvcmNlIGEgZnJvbS1zY3JhdGNoIHJlYnVpbGQgb25jZSBhdCBlYWNoIG9mIHRoZXNlIChtdWx0aXBsZXMgb2YgNCBhYm92ZSBGTEFUX0xJTUlULCB1cCB0byB+MTZrKSwgZ2F0ZWQgYnkgYSBzdGVwIGZsYWcgc28gZWFjaCBydW5zIGF0IG1vc3Qgb25jZSBldmVyLlxuY29uc3QgUkVHRU5FUkFURV9BVCA9IFs0MDk2LCAxNjM4NF07XG5jb25zdCBTVEVQX0lWRiA9IFwiaXZmXCI7XG4vLyBPbiBkZWxldGUsIHRoZSBtZW1iZXIncyBleGFjdCBjZWxsIHBsdXMgdGhpcyBtYW55IG5lYXJieSBjZWxscyBhcmUgY2hlY2tlZCwgaW4gY2FzZSBhIHJlYnVpbGQgbGVmdCBpdCBub24tb3B0aW1hbC5cbmNvbnN0IERFTEVURV9GQUxMQkFDS19DRUxMUyA9IDEwO1xuY29uc3QgUkVCQUxBTkNFX0lURVJBVElPTlMgPSA0O1xuXG5mdW5jdGlvbiBmbGF0U3RvcmUoZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+KTogRGF0YWJhc2U8VHJhbnNhY3Rpb25TZXRTdG9yZTxTdG9yZWRFbWJlZGRpbmc+PiB7XG4gICAgcmV0dXJuIG5hbWVzcGFjZURhdGFiYXNlKGRhdGFiYXNlLCByb290ID0+IHJvb3QuZmxhdCk7XG59XG5mdW5jdGlvbiBjZW50cm9pZFN0b3JlKGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290Pik6IERhdGFiYXNlPFRyYW5zYWN0aW9uU2V0U3RvcmU8U3RvcmVkRW1iZWRkaW5nPj4ge1xuICAgIHJldHVybiBuYW1lc3BhY2VEYXRhYmFzZShkYXRhYmFzZSwgcm9vdCA9PiByb290LmNlbnRyb2lkcyk7XG59XG5mdW5jdGlvbiBjZWxsU3RvcmUoZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LCBjZWxsSWQ6IHN0cmluZyk6IERhdGFiYXNlPFRyYW5zYWN0aW9uU2V0U3RvcmU8U3RvcmVkRW1iZWRkaW5nPj4ge1xuICAgIHJldHVybiBuYW1lc3BhY2VEYXRhYmFzZShkYXRhYmFzZSwgcm9vdCA9PiByb290LmNlbGxzW2NlbGxJZF0pO1xufVxuXG5mdW5jdGlvbiByYW5rQ2VsbHNCeUNsb3NlbmVzcyhlbWJlZGRpbmc6IFN0b3JlZEVtYmVkZGluZywgY2VudHJvaWRzOiBNYXA8c3RyaW5nLCBTdG9yZWRFbWJlZGRpbmc+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJhbmtlZDogeyBjZWxsSWQ6IHN0cmluZzsgY2xvc2VuZXNzOiBudW1iZXIgfVtdID0gW107XG4gICAgZm9yIChjb25zdCBjZWxsSWQgb2YgY2VudHJvaWRzLmtleXMoKSkge1xuICAgICAgICByYW5rZWQucHVzaCh7IGNlbGxJZCwgY2xvc2VuZXNzOiBnZXRDbG9zZW5lc3MoZW1iZWRkaW5nLCBjZW50cm9pZHMuZ2V0KGNlbGxJZCkhKSB9KTtcbiAgICB9XG4gICAgcmFua2VkLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodC5jbG9zZW5lc3MgLSBsZWZ0LmNsb3NlbmVzcyk7XG4gICAgcmV0dXJuIHJhbmtlZC5tYXAoZW50cnkgPT4gZW50cnkuY2VsbElkKTtcbn1cblxuLy8gUGVyLXdyaXRlIGNoYW5jZSBvZiBhIGZ1bGwgcmVidWlsZC4gWmVybyBhdC91bmRlciB0aGUgdGFyZ2V0IHNpemUsIHRoZW4gcmlzZXMgKGN1YmljYWxseSkgcGFzdCBpdCBzbyBjZWxscyBzdGF5IHJvdWdobHkgYmV0d2VlbiB0YXJnZXQgYW5kIH4yeCB0YXJnZXQuXG5mdW5jdGlvbiByZWJhbGFuY2VQcm9iYWJpbGl0eShmaWxsUmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKGZpbGxSYXRpbyA8PSAxKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBvdmVyID0gZmlsbFJhdGlvIC0gMTtcbiAgICByZXR1cm4gTWF0aC5taW4oMSwgb3ZlciAqIG92ZXIgKiBvdmVyICogMC4yNSk7XG59XG5cbi8vIGstbWVhbnMuIERlY29kZXMgZXZlcnkgbWVtYmVyIHRvIGEgcG9vbGVkIGZsb2F0MzIgYnVmZmVyIE9OQ0UsIHRoZW4gYXNzaWducyB3aXRoIGEgcGxhaW4gaW50ZXJuYWwgZmxvYXQgZG90IChubyBnZXRDbG9zZW5lc3MgY2FsbCDigJQgY29tcGFyaW5nIHR3byBmbG9hdCB2ZWN0b3JzIGlzIHRyaXZpYWwpIGFuZCBrZWVwcyBjZW50cm9pZHMgYXMgZmxvYXQgbWVhbnMsIGVuY29kaW5nIHRoZW0gdG8gU3RvcmVkRW1iZWRkaW5nIG9ubHkgYXQgdGhlIGVuZC4gUmVsZWFzZXMgdGhlIGJvcnJvd2VkIGJ1ZmZlcnMgd2hlbiBkb25lLlxuZnVuY3Rpb24gY2x1c3Rlck1lbWJlcnMobWVtYmVyczogQ2VsbEVudHJ5W10sIGNsdXN0ZXJDb3VudDogbnVtYmVyLCBjb25maWc6IEl2ZkNvbmZpZyk6IHsgY2VudHJvaWQ6IFN0b3JlZEVtYmVkZGluZzsgbWVtYmVyczogQ2VsbEVudHJ5W10gfVtdIHtcbiAgICBjb25zdCBtZW1iZXJGbG9hdHM6IEZsb2F0MzJBcnJheVtdID0gW107XG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycykge1xuICAgICAgICBtZW1iZXJGbG9hdHMucHVzaChlbWJlZGRpbmdUb0Zsb2F0MzIobWVtYmVyLmVtYmVkZGluZywgdHJ1ZSkpO1xuICAgIH1cbiAgICBjb25zdCBsZW5ndGggPSBtZW1iZXJGbG9hdHMubGVuZ3RoID8gbWVtYmVyRmxvYXRzWzBdLmxlbmd0aCA6IDA7XG4gICAgbGV0IGNlbnRyb2lkczogRmxvYXQzMkFycmF5W10gPSBbXTtcbiAgICBjb25zdCBzZWVkU3RlcCA9IG1lbWJlcnMubGVuZ3RoIC8gY2x1c3RlckNvdW50O1xuICAgIGZvciAobGV0IGNsdXN0ZXJJbmRleCA9IDA7IGNsdXN0ZXJJbmRleCA8IGNsdXN0ZXJDb3VudDsgY2x1c3RlckluZGV4KyspIHtcbiAgICAgICAgY2VudHJvaWRzLnB1c2gobmV3IEZsb2F0MzJBcnJheShtZW1iZXJGbG9hdHNbTWF0aC5mbG9vcihjbHVzdGVySW5kZXggKiBzZWVkU3RlcCldKSk7XG4gICAgfVxuICAgIGxldCBncm91cHM6IG51bWJlcltdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpdGVyYXRpb24gPSAwOyBpdGVyYXRpb24gPCBSRUJBTEFOQ0VfSVRFUkFUSU9OUzsgaXRlcmF0aW9uKyspIHtcbiAgICAgICAgZ3JvdXBzID0gW107XG4gICAgICAgIGZvciAobGV0IGNsdXN0ZXJJbmRleCA9IDA7IGNsdXN0ZXJJbmRleCA8IGNlbnRyb2lkcy5sZW5ndGg7IGNsdXN0ZXJJbmRleCsrKSB7XG4gICAgICAgICAgICBncm91cHMucHVzaChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbWVtYmVySW5kZXggPSAwOyBtZW1iZXJJbmRleCA8IG1lbWJlckZsb2F0cy5sZW5ndGg7IG1lbWJlckluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlckZsb2F0ID0gbWVtYmVyRmxvYXRzW21lbWJlckluZGV4XTtcbiAgICAgICAgICAgIGxldCBiZXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGJlc3REb3QgPSAtSW5maW5pdHk7XG4gICAgICAgICAgICBmb3IgKGxldCBjZW50cm9pZEluZGV4ID0gMDsgY2VudHJvaWRJbmRleCA8IGNlbnRyb2lkcy5sZW5ndGg7IGNlbnRyb2lkSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbnRyb2lkRmxvYXQgPSBjZW50cm9pZHNbY2VudHJvaWRJbmRleF07XG4gICAgICAgICAgICAgICAgbGV0IGRvdCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgbGVuZ3RoOyBkaW0rKykge1xuICAgICAgICAgICAgICAgICAgICBkb3QgKz0gbWVtYmVyRmxvYXRbZGltXSAqIGNlbnRyb2lkRmxvYXRbZGltXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRvdCA+IGJlc3REb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdERvdCA9IGRvdDtcbiAgICAgICAgICAgICAgICAgICAgYmVzdEluZGV4ID0gY2VudHJvaWRJbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cHNbYmVzdEluZGV4XS5wdXNoKG1lbWJlckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0Q2VudHJvaWRzOiBGbG9hdDMyQXJyYXlbXSA9IFtdO1xuICAgICAgICBjb25zdCBuZXh0R3JvdXBzOiBudW1iZXJbXVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICAgICAgICBpZiAoIWdyb3VwLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVhbiA9IG5ldyBGbG9hdDMyQXJyYXkobGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWVtYmVySW5kZXggb2YgZ3JvdXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXJGbG9hdCA9IG1lbWJlckZsb2F0c1ttZW1iZXJJbmRleF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgbGVuZ3RoOyBkaW0rKykge1xuICAgICAgICAgICAgICAgICAgICBtZWFuW2RpbV0gKz0gbWVtYmVyRmxvYXRbZGltXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbm9ybSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCBsZW5ndGg7IGRpbSsrKSB7XG4gICAgICAgICAgICAgICAgbm9ybSArPSBtZWFuW2RpbV0gKiBtZWFuW2RpbV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtYWduaXR1ZGUgPSBNYXRoLnNxcnQobm9ybSkgfHwgMTtcbiAgICAgICAgICAgIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IGxlbmd0aDsgZGltKyspIHtcbiAgICAgICAgICAgICAgICBtZWFuW2RpbV0gLz0gbWFnbml0dWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dENlbnRyb2lkcy5wdXNoKG1lYW4pO1xuICAgICAgICAgICAgbmV4dEdyb3Vwcy5wdXNoKGdyb3VwKTtcbiAgICAgICAgfVxuICAgICAgICBjZW50cm9pZHMgPSBuZXh0Q2VudHJvaWRzO1xuICAgICAgICBncm91cHMgPSBuZXh0R3JvdXBzO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQ6IHsgY2VudHJvaWQ6IFN0b3JlZEVtYmVkZGluZzsgbWVtYmVyczogQ2VsbEVudHJ5W10gfVtdID0gW107XG4gICAgZm9yIChsZXQgY2x1c3RlckluZGV4ID0gMDsgY2x1c3RlckluZGV4IDwgY2VudHJvaWRzLmxlbmd0aDsgY2x1c3RlckluZGV4KyspIHtcbiAgICAgICAgY29uc3QgY2VudHJvaWQgPSBlbmNvZGVFbWJlZGRpbmcoeyBpbnB1dDogY2VudHJvaWRzW2NsdXN0ZXJJbmRleF0sIGZvcm1hdDogY29uZmlnLmZvcm1hdCwgbW9kZWw6IGNvbmZpZy5tb2RlbCB9KTtcbiAgICAgICAgY29uc3QgY2VsbE1lbWJlcnM6IENlbGxFbnRyeVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbWVtYmVySW5kZXggb2YgZ3JvdXBzW2NsdXN0ZXJJbmRleF0pIHtcbiAgICAgICAgICAgIGNlbGxNZW1iZXJzLnB1c2gobWVtYmVyc1ttZW1iZXJJbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHsgY2VudHJvaWQsIG1lbWJlcnM6IGNlbGxNZW1iZXJzIH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1lbWJlckZsb2F0IG9mIG1lbWJlckZsb2F0cykge1xuICAgICAgICByZWxlYXNlRmxvYXQzMihtZW1iZXJGbG9hdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIFJlLWNsdXN0ZXIgRVZFUlkgZW1iZWRkaW5nIChmbGF0IHRpZXIgKyBhbGwgY2VsbHMpIGludG8gYSBmcmVzaCBJVkYsIGNsZWFyIHRoZSBmbGF0IHRpZXIsIGFuZCBtYXJrIElWRiBtb2RlLiBUaGlzIGlzIHRoZSByZWFycmFuZ2VyOiBydW4gcHJvYmFiaWxpc3RpY2FsbHkgYXMgdGhlIHNldCBncm93cywgb25jZSBhdCBlYWNoIHJlZ2VuZXJhdGUgdGhyZXNob2xkLCBhbmQgb25jZSB0byB1cGdyYWRlIGZyb20gZmxhdC4gUmVhZHMgZXZlcnl0aGluZyBpdCB1c2VzLCBzbyBpdCBiYWlscyAoZG9lcyBub3RoaW5nKSBpZiBhbnl0aGluZyBpc24ndCBzeW5jZWQgYW5kIHRoZSBjYWxsZXIncyByZXRyeSByZS1ydW5zIGl0OyBubyBjYWxsZXIgY2FyZXMgYWJvdXQgaXRzIHJlc3VsdC5cbmV4cG9ydCBmdW5jdGlvbiByZWJ1aWxkU3RydWN0dXJlKGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290Pik6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5jb25maWcpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm47XG4gICAgY29uc3Qgc3RlcHMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3Quc3RlcHMpO1xuICAgIGlmICghc3RlcHMpIHJldHVybjtcblxuICAgIGNvbnN0IGFsbE1lbWJlcnM6IENlbGxFbnRyeVtdID0gW107XG4gICAgLy8gT25seSB0aGUgb25lLXRpbWUgZmxhdC0+SVZGIHVwZ3JhZGUgcHVsbHMgZnJvbSB0aGUgZmxhdCB0aWVyLiBPbmNlIFNURVBfSVZGIGlzIHNldCB0aGUgZmxhdCBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gZm9sZGVkIGludG8gY2VsbHMsIHNvIGxhdGVyIHJlYnVpbGRzIGlnbm9yZSBpdC4gSXQncyBsZWZ0IGluIHBsYWNlLCBuZXZlciBkZWxldGVkOiBkZWxldGVEYXRhIG9ubHkgcmVtb3ZlcyBwcmltaXRpdmUgbGVhdmVzLCBub3QgYSB3aG9sZSBzdG9yZSwgYW5kIHRoZSBmbGF0IHRpZXIgaXMgc21hbGwgZW5vdWdoIG5vdCB0byBtYXR0ZXIuXG4gICAgaWYgKCFzdGVwc1tTVEVQX0lWRl0pIHtcbiAgICAgICAgY29uc3QgZmxhdCA9IHRyYW5zYWN0aW9uUmVhZChmbGF0U3RvcmUoZGF0YWJhc2UpKTtcbiAgICAgICAgaWYgKCFmbGF0KSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIGZsYXQua2V5cygpKSB7XG4gICAgICAgICAgICBhbGxNZW1iZXJzLnB1c2goeyByZWYsIGVtYmVkZGluZzogZmxhdC5nZXQocmVmKSEgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2VudHJvaWRzID0gdHJhbnNhY3Rpb25SZWFkKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpKTtcbiAgICBpZiAoIWNlbnRyb2lkcykgcmV0dXJuO1xuICAgIGNvbnN0IG9sZENlbGxJZHMgPSBBcnJheS5mcm9tKGNlbnRyb2lkcy5rZXlzKCkpO1xuICAgIGNvbnN0IGNlbGxTdG9yZXMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IG9sZENlbGxJZHMubWFwKGNlbGxJZCA9PiByb290LmNlbGxzW2NlbGxJZF0pKTtcbiAgICBpZiAoIWNlbGxTdG9yZXMpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IHN0b3JlIG9mIGNlbGxTdG9yZXMpIHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IHJlcGxheVRyYW5zYWN0aW9uU3RvcmU8U3RvcmVkRW1iZWRkaW5nPihzdG9yZSk7XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIG1lbWJlcnMua2V5cygpKSB7XG4gICAgICAgICAgICBhbGxNZW1iZXJzLnB1c2goeyByZWYsIGVtYmVkZGluZzogbWVtYmVycy5nZXQocmVmKSEgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFhbGxNZW1iZXJzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2x1c3RlckNvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChhbGxNZW1iZXJzLmxlbmd0aCAvIGNvbmZpZy5jZWxsVGFyZ2V0U2l6ZSkpO1xuICAgIGNvbnN0IGNsdXN0ZXJzID0gY2x1c3Rlck1lbWJlcnMoYWxsTWVtYmVycywgY2x1c3RlckNvdW50LCBjb25maWcpO1xuXG4gICAgY29uc3QgbmV3Q2VsbElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGNlbnRyb2lkV3JpdGVzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogU3RvcmVkRW1iZWRkaW5nIHwgdW5kZWZpbmVkIH1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2x1c3RlciBvZiBjbHVzdGVycykge1xuICAgICAgICBjb25zdCBjZWxsSWQgPSBoYXNoRW1iZWRkaW5nKGNsdXN0ZXIuY2VudHJvaWQpO1xuICAgICAgICBuZXdDZWxsSWRzLmFkZChjZWxsSWQpO1xuICAgICAgICBjZW50cm9pZFdyaXRlcy5wdXNoKHsga2V5OiBjZWxsSWQsIHZhbHVlOiBjbHVzdGVyLmNlbnRyb2lkIH0pO1xuICAgICAgICBjb25zdCBtZW1iZXJXcml0ZXMgPSBjbHVzdGVyLm1lbWJlcnMubWFwKG1lbWJlciA9PiAoeyBrZXk6IG1lbWJlci5yZWYsIHZhbHVlOiBtZW1iZXIuZW1iZWRkaW5nIH0pKTtcbiAgICAgICAgdHJhbnNhY3Rpb25NdXRhdGUoY2VsbFN0b3JlKGRhdGFiYXNlLCBjZWxsSWQpLCBtZW1iZXJXcml0ZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9sZENlbGxJZCBvZiBvbGRDZWxsSWRzKSB7XG4gICAgICAgIGlmIChuZXdDZWxsSWRzLmhhcyhvbGRDZWxsSWQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjZW50cm9pZFdyaXRlcy5wdXNoKHsga2V5OiBvbGRDZWxsSWQsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIHRyYW5zYWN0aW9uRGVsZXRlKGNlbGxTdG9yZShkYXRhYmFzZSwgb2xkQ2VsbElkKSk7XG4gICAgfVxuICAgIHRyYW5zYWN0aW9uTXV0YXRlKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpLCBjZW50cm9pZFdyaXRlcyk7XG4gICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgYWxsTWVtYmVycy5sZW5ndGgpO1xuICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3Quc3RlcHNbU1RFUF9JVkZdLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaEVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIHF1ZXJ5OiBTdG9yZWRFbWJlZGRpbmcsXG4gICAgb3B0aW9uczogeyBwcm9iZUJ1ZGdldDogbnVtYmVyOyByZXN1bHRDb3VudDogbnVtYmVyIH0sXG4pOiBTZWFyY2hIaXRbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29uZmlnID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByb290LmNvbmZpZyk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3RlcHMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3Quc3RlcHMpO1xuICAgIGlmICghc3RlcHMpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBoaXRzOiBTZWFyY2hIaXRbXSA9IFtdO1xuICAgIGlmICghc3RlcHNbU1RFUF9JVkZdKSB7XG4gICAgICAgIGNvbnN0IGZsYXQgPSB0cmFuc2FjdGlvblJlYWQoZmxhdFN0b3JlKGRhdGFiYXNlKSk7XG4gICAgICAgIGlmICghZmxhdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCByZWYgb2YgZmxhdC5rZXlzKCkpIHtcbiAgICAgICAgICAgIGhpdHMucHVzaCh7IHJlZiwgY2xvc2VuZXNzOiBnZXRDbG9zZW5lc3MocXVlcnksIGZsYXQuZ2V0KHJlZikhKSB9KTtcbiAgICAgICAgfVxuICAgICAgICBoaXRzLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodC5jbG9zZW5lc3MgLSBsZWZ0LmNsb3NlbmVzcyk7XG4gICAgICAgIHJldHVybiBoaXRzLnNsaWNlKDAsIG9wdGlvbnMucmVzdWx0Q291bnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGNlbnRyb2lkcyA9IHRyYW5zYWN0aW9uUmVhZChjZW50cm9pZFN0b3JlKGRhdGFiYXNlKSk7XG4gICAgaWYgKCFjZW50cm9pZHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCFjZW50cm9pZHMuc2l6ZSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHByb2JlQ2VsbENvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKG9wdGlvbnMucHJvYmVCdWRnZXQgLyBjb25maWcuY2VsbFRhcmdldFNpemUpKTtcbiAgICBjb25zdCBwcm9iZUNlbGxJZHMgPSByYW5rQ2VsbHNCeUNsb3NlbmVzcyhxdWVyeSwgY2VudHJvaWRzKS5zbGljZSgwLCBwcm9iZUNlbGxDb3VudCk7XG4gICAgY29uc3Qgc3RvcmVzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiBwcm9iZUNlbGxJZHMubWFwKGNlbGxJZCA9PiByb290LmNlbGxzW2NlbGxJZF0pKTtcbiAgICBpZiAoIXN0b3JlcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHN0b3JlIG9mIHN0b3Jlcykge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gcmVwbGF5VHJhbnNhY3Rpb25TdG9yZTxTdG9yZWRFbWJlZGRpbmc+KHN0b3JlKTtcbiAgICAgICAgZm9yIChjb25zdCByZWYgb2YgbWVtYmVycy5rZXlzKCkpIHtcbiAgICAgICAgICAgIGhpdHMucHVzaCh7IHJlZiwgY2xvc2VuZXNzOiBnZXRDbG9zZW5lc3MocXVlcnksIG1lbWJlcnMuZ2V0KHJlZikhKSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoaXRzLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodC5jbG9zZW5lc3MgLSBsZWZ0LmNsb3NlbmVzcyk7XG4gICAgcmV0dXJuIGhpdHMuc2xpY2UoMCwgb3B0aW9ucy5yZXN1bHRDb3VudCk7XG59XG5cbi8vIERpcmVjdCByZWYgLT4gc3RvcmVkIGVtYmVkZGluZyBsb29rdXAgdGhyb3VnaCB0aGUgYnlSZWYgaW5kZXg6IG9uZSBrZXktdmFsdWUgcmVhZCBwZXIgcmVmLCBubyBjZWxsIHNjYW4uIEEgc2VhcmNoIHJldHVybnMgcmVmczsgdGhpcyBmZXRjaGVzIHRoZSBkYXRhIGJlaGluZCB0aGVtLiBTa2lwcyByZWZzIHRoYXQgYXJlbid0IHByZXNlbnQ7IHVuZGVmaW5lZCBpZiBub3Qgc3luY2VkLlxuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cEVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIHJlZnM6IHN0cmluZ1tdLFxuKTogTWFwPHN0cmluZywgU3RvcmVkRW1iZWRkaW5nPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmFsdWVzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByZWZzLm1hcChyZWYgPT4gcm9vdC5ieVJlZltyZWZdKSk7XG4gICAgaWYgKCF2YWx1ZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIFN0b3JlZEVtYmVkZGluZz4oKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVmcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaW5kZXhdO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zZXQocmVmc1tpbmRleF0sIGRlY29kZVJlZlZhbHVlKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIGl0ZW1zOiBFbWJlZGRpbmdJbnB1dFtdLFxuKSB7XG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBjb25maWcgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3QuY29uZmlnKTtcbiAgICBjb25zdCBzdGVwcyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5zdGVwcyk7XG4gICAgbGV0IGNvdW50ID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByb290LmNvdW50KTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuICAgIGlmICghc3RlcHMpIHJldHVybjtcbiAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0NvdW50ID0gY291bnQgKyBpdGVtcy5sZW5ndGg7XG5cbiAgICBpZiAoIXN0ZXBzW1NURVBfSVZGXSkge1xuICAgICAgICBjb25zdCBmbGF0V3JpdGVzID0gaXRlbXMubWFwKGl0ZW0gPT4gKHsga2V5OiBpdGVtLnJlZiwgdmFsdWU6IGl0ZW0uZW1iZWRkaW5nIH0pKTtcbiAgICAgICAgdHJhbnNhY3Rpb25NdXRhdGUoZmxhdFN0b3JlKGRhdGFiYXNlKSwgZmxhdFdyaXRlcyk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5ieVJlZltpdGVtLnJlZl0sIGVuY29kZVJlZlZhbHVlKGl0ZW0uZW1iZWRkaW5nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgbmV3Q291bnQpO1xuICAgICAgICBpZiAobmV3Q291bnQgPiBGTEFUX0xJTUlUKSB7XG4gICAgICAgICAgICByZWJ1aWxkU3RydWN0dXJlKGRhdGFiYXNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2VudHJvaWRzID0gdHJhbnNhY3Rpb25SZWFkKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpKTtcbiAgICBpZiAoIWNlbnRyb2lkcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBpdGVtc0J5Q2VsbCA9IG5ldyBNYXA8c3RyaW5nLCBFbWJlZGRpbmdJbnB1dFtdPigpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBjb25zdCBjZWxsSWQgPSByYW5rQ2VsbHNCeUNsb3NlbmVzcyhpdGVtLmVtYmVkZGluZywgY2VudHJvaWRzKVswXTtcbiAgICAgICAgbGV0IGdyb3VwID0gaXRlbXNCeUNlbGwuZ2V0KGNlbGxJZCk7XG4gICAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgICAgIGdyb3VwID0gW107XG4gICAgICAgICAgICBpdGVtc0J5Q2VsbC5zZXQoY2VsbElkLCBncm91cCk7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAucHVzaChpdGVtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjZWxsSWQgb2YgaXRlbXNCeUNlbGwua2V5cygpKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gaXRlbXNCeUNlbGwuZ2V0KGNlbGxJZCkhO1xuICAgICAgICBjb25zdCBtZW1iZXJXcml0ZXMgPSBncm91cC5tYXAoaXRlbSA9PiAoeyBrZXk6IGl0ZW0ucmVmLCB2YWx1ZTogaXRlbS5lbWJlZGRpbmcgfSkpO1xuICAgICAgICB0cmFuc2FjdGlvbk11dGF0ZShjZWxsU3RvcmUoZGF0YWJhc2UsIGNlbGxJZCksIG1lbWJlcldyaXRlcyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBkYXRhYmFzZS53cml0ZURhdGEocm9vdCA9PiByb290LmJ5UmVmW2l0ZW0ucmVmXSwgZW5jb2RlUmVmVmFsdWUoaXRlbS5lbWJlZGRpbmcpKTtcbiAgICB9XG4gICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgbmV3Q291bnQpO1xuXG5cbiAgICBjb25zdCBzaG91bGRSZWdlbmVyYXRlID0gKGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290PikgPT4ge1xuICAgICAgICBsZXQgc3RlcHMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3Quc3RlcHMpO1xuICAgICAgICBpZiAoIXN0ZXBzKSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgdGhyZXNob2xkIG9mIFJFR0VORVJBVEVfQVQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBOYW1lID0gXCJyZWdlblwiICsgdGhyZXNob2xkO1xuICAgICAgICAgICAgaWYgKCFzdGVwc1tzdGVwTmFtZV0gJiYgbmV3Q291bnQgPiB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBkYXRhYmFzZS53cml0ZURhdGEocm9vdCA9PiByb290LnN0ZXBzW3N0ZXBOYW1lXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXZlcmFnZUZpbGwgPSBuZXdDb3VudCAvIE1hdGgubWF4KDEsIGNlbnRyb2lkcy5zaXplKSAvIGNvbmZpZy5jZWxsVGFyZ2V0U2l6ZTtcbiAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPCByZWJhbGFuY2VQcm9iYWJpbGl0eShhdmVyYWdlRmlsbCkpIHtcbiAgICAgICAgICAgIHJlYnVpbGRTdHJ1Y3R1cmUoZGF0YWJhc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgaWYgKHNob3VsZFJlZ2VuZXJhdGUoZGF0YWJhc2UpKSB7XG4gICAgICAgIHJlYnVpbGRTdHJ1Y3R1cmUoZGF0YWJhc2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIHJlZnM6IHN0cmluZ1tdLFxuKSB7XG4gICAgaWYgKCFyZWZzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHN0ZXBzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByb290LnN0ZXBzKTtcbiAgICBjb25zdCBjb3VudCA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5jb3VudCk7XG4gICAgaWYgKCFzdGVwcykgcmV0dXJuO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICBpZiAoIXN0ZXBzW1NURVBfSVZGXSkge1xuICAgICAgICBjb25zdCBmbGF0RGVsZXRlcyA9IHJlZnMubWFwKHJlZiA9PiAoeyBrZXk6IHJlZiwgdmFsdWU6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgIHRyYW5zYWN0aW9uTXV0YXRlKGZsYXRTdG9yZShkYXRhYmFzZSksIGZsYXREZWxldGVzKTtcbiAgICAgICAgZm9yIChjb25zdCByZWYgb2YgcmVmcykge1xuICAgICAgICAgICAgZGF0YWJhc2UuZGVsZXRlRGF0YShyb290ID0+IHJvb3QuYnlSZWZbcmVmXSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgTWF0aC5tYXgoMCwgY291bnQgLSByZWZzLmxlbmd0aCkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2VudHJvaWRzID0gdHJhbnNhY3Rpb25SZWFkKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpKTtcbiAgICBpZiAoIWNlbnRyb2lkcykgcmV0dXJuO1xuICAgIGlmICghY2VudHJvaWRzLnNpemUpIHJldHVybjtcblxuICAgIC8vIExvb2sgdXAgZWFjaCByZWYncyBlbWJlZGRpbmcgdGhyb3VnaCBieVJlZiwgdGhlbiByYW5rIGl0cyBjZWxscyB0aGUgd2F5IGFuIGluc2VydCB3b3VsZCwgc28gd2UgZGVsZXRlIGZyb20gdGhlIGNlbGwgaXQgYWN0dWFsbHkgbGFuZGVkIGluIChwbHVzIGEgZmV3IG5laWdoYm91cnMsIGluIGNhc2UgYSByZWJ1aWxkIG51ZGdlZCBpdCBhY3Jvc3MgYSBib3VuZGFyeSkuXG4gICAgY29uc3QgcmVmVmFsdWVzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByZWZzLm1hcChyZWYgPT4gcm9vdC5ieVJlZltyZWZdKSk7XG4gICAgaWYgKCFyZWZWYWx1ZXMpIHJldHVybjtcbiAgICBjb25zdCBjYW5kaWRhdGVzQnlJdGVtOiB7IHJlZjogc3RyaW5nOyBjZWxsSWRzOiBzdHJpbmdbXSB9W10gPSBbXTtcbiAgICBjb25zdCBjYW5kaWRhdGVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVmcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWZWYWx1ZXNbaW5kZXhdO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbWJlZGRpbmcgPSBkZWNvZGVSZWZWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGNlbGxJZHMgPSByYW5rQ2VsbHNCeUNsb3NlbmVzcyhlbWJlZGRpbmcsIGNlbnRyb2lkcykuc2xpY2UoMCwgMSArIERFTEVURV9GQUxMQkFDS19DRUxMUyk7XG4gICAgICAgIGNhbmRpZGF0ZXNCeUl0ZW0ucHVzaCh7IHJlZjogcmVmc1tpbmRleF0sIGNlbGxJZHMgfSk7XG4gICAgICAgIGZvciAoY29uc3QgY2VsbElkIG9mIGNlbGxJZHMpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZVNldC5hZGQoY2VsbElkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNhbmRpZGF0ZUNlbGxJZHMgPSBBcnJheS5mcm9tKGNhbmRpZGF0ZVNldCk7XG4gICAgY29uc3Qgc3RvcmVzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiBjYW5kaWRhdGVDZWxsSWRzLm1hcChjZWxsSWQgPT4gcm9vdC5jZWxsc1tjZWxsSWRdKSk7XG4gICAgaWYgKCFzdG9yZXMpIHJldHVybjtcbiAgICBjb25zdCBtZW1iZXJzQnlDZWxsID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFN0b3JlZEVtYmVkZGluZz4+KCk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNhbmRpZGF0ZUNlbGxJZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIG1lbWJlcnNCeUNlbGwuc2V0KGNhbmRpZGF0ZUNlbGxJZHNbaW5kZXhdLCByZXBsYXlUcmFuc2FjdGlvblN0b3JlKHN0b3Jlc1tpbmRleF0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxldGVzQnlDZWxsID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgIGNvbnN0IGRlbGV0ZWRSZWZzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXNCeUl0ZW0pIHtcbiAgICAgICAgZm9yIChjb25zdCBjZWxsSWQgb2YgY2FuZGlkYXRlLmNlbGxJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlcnMgPSBtZW1iZXJzQnlDZWxsLmdldChjZWxsSWQpO1xuICAgICAgICAgICAgaWYgKCFtZW1iZXJzIHx8ICFtZW1iZXJzLmhhcyhjYW5kaWRhdGUucmVmKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNlbGxSZWZzID0gZGVsZXRlc0J5Q2VsbC5nZXQoY2VsbElkKTtcbiAgICAgICAgICAgIGlmICghY2VsbFJlZnMpIHtcbiAgICAgICAgICAgICAgICBjZWxsUmVmcyA9IFtdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZXNCeUNlbGwuc2V0KGNlbGxJZCwgY2VsbFJlZnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2VsbFJlZnMucHVzaChjYW5kaWRhdGUucmVmKTtcbiAgICAgICAgICAgIGRlbGV0ZWRSZWZzLnB1c2goY2FuZGlkYXRlLnJlZik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2VsbElkIG9mIGRlbGV0ZXNCeUNlbGwua2V5cygpKSB7XG4gICAgICAgIGNvbnN0IGNlbGxSZWZzID0gZGVsZXRlc0J5Q2VsbC5nZXQoY2VsbElkKSE7XG4gICAgICAgIGNvbnN0IG1lbWJlckRlbGV0ZXMgPSBjZWxsUmVmcy5tYXAocmVmID0+ICh7IGtleTogcmVmLCB2YWx1ZTogdW5kZWZpbmVkIH0pKTtcbiAgICAgICAgdHJhbnNhY3Rpb25NdXRhdGUoY2VsbFN0b3JlKGRhdGFiYXNlLCBjZWxsSWQpLCBtZW1iZXJEZWxldGVzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByZWYgb2YgZGVsZXRlZFJlZnMpIHtcbiAgICAgICAgZGF0YWJhc2UuZGVsZXRlRGF0YShyb290ID0+IHJvb3QuYnlSZWZbcmVmXSk7XG4gICAgfVxuICAgIGlmIChkZWxldGVkUmVmcy5sZW5ndGgpIHtcbiAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgTWF0aC5tYXgoMCwgY291bnQgLSBkZWxldGVkUmVmcy5sZW5ndGgpKTtcbiAgICB9XG59XG4iXX0=
|
|
386
|
+
/* _JS_SOURCE_HASH = "70f29b37ecb31f18faad5b811c7545265a305feca4b9b3397ebf45fe143c3929"; */
|
|
@@ -80,8 +80,7 @@ function replayTransactionStore(store) {
|
|
|
80
80
|
return replay(decodeBuffers(Object.values(store)));
|
|
81
81
|
}
|
|
82
82
|
exports.replayTransactionStore = replayTransactionStore;
|
|
83
|
-
// Fire-and-forget: no caller should care whether this "succeeded". If the set isn't synced for reading
|
|
84
|
-
// yet it simply does nothing this pass and the caller's retry wrapper re-runs the whole operation later.
|
|
83
|
+
// Fire-and-forget: no caller should care whether this "succeeded". If the set isn't synced for reading yet it simply does nothing this pass and the caller's retry wrapper re-runs the whole operation later.
|
|
85
84
|
function transactionMutate(database, transactions, compactAfterFiles = DEFAULT_COMPACT_AFTER_FILES) {
|
|
86
85
|
if (!transactions.length)
|
|
87
86
|
return;
|
|
@@ -104,9 +103,7 @@ function transactionMutate(database, transactions, compactAfterFiles = DEFAULT_C
|
|
|
104
103
|
}
|
|
105
104
|
}
|
|
106
105
|
exports.transactionMutate = transactionMutate;
|
|
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.
|
|
106
|
+
// Fire-and-forget like transactionMutate: clears the whole set by deleting every file. deleteData only removes a primitive leaf (not a store object), so we delete each file key individually. No-ops (the retry re-runs) if the store isn't synced yet.
|
|
110
107
|
function transactionDelete(database) {
|
|
111
108
|
const files = readTransactionFiles(database);
|
|
112
109
|
if (!files)
|
|
@@ -116,5 +113,5 @@ function transactionDelete(database) {
|
|
|
116
113
|
}
|
|
117
114
|
}
|
|
118
115
|
exports.transactionDelete = transactionDelete;
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25TZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0cmFuc2FjdGlvblNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBMkI7QUFHM0IsdUZBQXVGO0FBQ3ZGLE1BQU0sZUFBZSxHQUFHLElBQUksZ0JBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQVdyRSxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUV2QyxTQUFTLFNBQVMsQ0FBQyxNQUFnQixFQUFFLFFBQWdCO0lBQ2pELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQztJQUN0QixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsT0FBcUI7SUFDeEMsTUFBTSxZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzNCLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFrQixDQUFDO1FBQ2hFLEtBQUssTUFBTSxXQUFXLElBQUksT0FBTyxFQUFFLENBQUM7WUFDaEMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUN6QixRQUE4QztJQUU5QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3ZDLHFHQUFxRztRQUNyRyxNQUFNLE9BQU8sR0FBRyxLQUErQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFjLEVBQUUsT0FBTyxFQUFFLEVBQWtCLEVBQUUsQ0FBQztRQUMvRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMvRSxDQUFDLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDaEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDMUYsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLFlBQTJCO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztJQUN6QyxLQUFLLE1BQU0sV0FBVyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLGtGQUFrRjtRQUNsRixJQUFJLFdBQVcsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsQ0FBQzthQUFNLENBQUM7WUFDSixLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQUVELGlHQUFpRztBQUNqRyxTQUFTLG1CQUFtQixDQUN4QixRQUE4QyxFQUM5QyxlQUE4QixFQUM5QixXQUFxQixFQUNyQixhQUFxQjtJQUVyQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDM0MsTUFBTSxNQUFNLEdBQWtCLEVBQUUsQ0FBQztJQUNqQyxLQUFLLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBQzdELFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkUsS0FBSyxNQUFNLE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFnQixlQUFlLENBQzNCLFFBQThDO0lBRTlDLE1BQU0sS0FBSyxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBdUIsQ0FBQztBQUM1RCxDQUFDO0FBTkQsMENBTUM7QUFFRCwrSEFBK0g7QUFDL0gsU0FBZ0Isc0JBQXNCLENBQVEsS0FBNkM7SUFDdkYsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBdUIsQ0FBQztBQUM3RSxDQUFDO0FBSEQsd0RBR0M7QUFFRCx1R0FBdUc7QUFDdkcseUdBQXlHO0FBQ3pHLFNBQWdCLGlCQUFpQixDQUM3QixRQUE4QyxFQUM5QyxZQUF5RCxFQUN6RCxvQkFBNEIsMkJBQTJCO0lBRXZELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTtRQUFFLE9BQU87SUFDakMsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0MsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPO0lBQ25CLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwRyxNQUFNLFFBQVEsR0FBa0IsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEUsUUFBUSxFQUFFLFlBQVksR0FBRyxLQUFLO1FBQzlCLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztRQUNwQixLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUs7S0FDM0IsQ0FBQyxDQUFDLENBQUM7SUFDSixNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6RixJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ2pELG1CQUFtQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7U0FBTSxDQUFDO1FBQ0osTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQWUsQ0FBQztRQUMvRCxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hFLENBQUM7QUFDTCxDQUFDO0FBckJELDhDQXFCQztBQUVELCtHQUErRztBQUMvRyw2R0FBNkc7QUFDN0csaUNBQWlDO0FBQ2pDLFNBQWdCLGlCQUFpQixDQUM3QixRQUE4QztJQUU5QyxNQUFNLEtBQUssR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU87SUFDbkIsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7QUFDTCxDQUFDO0FBUkQsOENBUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2JvcnggZnJvbSBcImNib3IteFwiO1xuaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tIFwiLi9EYXRhYmFzZVwiO1xuXG4vLyBzdHJ1Y3R1cmVkQ2xvbmUga2VlcHMgdHlwZWQgYXJyYXlzIC8gTWFwcyAvIHVuZGVmaW5lZCBpbnRhY3QgdGhyb3VnaCB0aGUgcm91bmQtdHJpcC5cbmNvbnN0IHRyYW5zYWN0aW9uQ2JvciA9IG5ldyBjYm9yeC5FbmNvZGVyKHsgc3RydWN0dXJlZENsb25lOiB0cnVlIH0pO1xuXG4vLyBPbiB0aGUgc3RvcmU6IGZpbGVzIGtleWVkIGJ5IGEgbW9ub3RvbmljIG51bWJlciwgZWFjaCBhIENCT1IgYXJyYXkgb2YgdHJhbnNhY3Rpb25zOyBhIHRyYW5zYWN0aW9uIHNldHMgb25lIGtleSAodmFsdWUgdW5kZWZpbmVkID0gZGVsZXRlKSBhbmQgY2FycmllcyBhIGdsb2JhbCBzZXF1ZW5jZSBudW1iZXIuIFJlcGxheWluZyBldmVyeSB0cmFuc2FjdGlvbiBpbiBzZXF1ZW5jZSBvcmRlciAobGFzdCB3cml0ZSB3aW5zKSBnaXZlcyB0aGUgY3VycmVudCBtYXAuIE11dGF0aW9ucyBhcHBlbmQgYSBmaWxlLCB0aGVuIGZvbGQgdGhlIHdob2xlIHNldCBpbnRvIG9uZSBvbmNlIGVub3VnaCBhY2N1bXVsYXRlLiBWYWx1ZSBpcyBwaGFudG9tIOKAlCBpdCBvbmx5IHJlY29yZHMgd2hhdCB0aGUgZW5jb2RlZCB2YWx1ZXMgZGVzZXJpYWxpemUgdG8uXG5kZWNsYXJlIGNvbnN0IHZhbHVlVGFnOiB1bmlxdWUgc3ltYm9sO1xuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25TZXRTdG9yZTxWYWx1ZT4gPSB7XG4gICAgW2ZpbGVOdW1iZXI6IHN0cmluZ106IFVpbnQ4QXJyYXk7XG4gICAgW3ZhbHVlVGFnXT86IFZhbHVlO1xufTtcblxudHlwZSBUcmFuc2FjdGlvbiA9IHsgc2VxdWVuY2U6IG51bWJlcjsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH07XG5cbmNvbnN0IERFRkFVTFRfQ09NUEFDVF9BRlRFUl9GSUxFUyA9IDE2O1xuXG5mdW5jdGlvbiBtYXhOdW1iZXIodmFsdWVzOiBudW1iZXJbXSwgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHJlc3VsdCA9IGZhbGxiYWNrO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZSA+IHJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZGVjb2RlQnVmZmVycyhidWZmZXJzOiBVaW50OEFycmF5W10pOiBUcmFuc2FjdGlvbltdIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGJ1ZmZlciBvZiBidWZmZXJzKSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSB0cmFuc2FjdGlvbkNib3IuZGVjb2RlKGJ1ZmZlcikgYXMgVHJhbnNhY3Rpb25bXTtcbiAgICAgICAgZm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiBkZWNvZGVkKSB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnMucHVzaCh0cmFuc2FjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9ucztcbn1cblxuZnVuY3Rpb24gcmVhZFRyYW5zYWN0aW9uRmlsZXM8VmFsdWU+KFxuICAgIGRhdGFiYXNlOiBEYXRhYmFzZTxUcmFuc2FjdGlvblNldFN0b3JlPFZhbHVlPj4sXG4pOiB7IGZpbGVLZXlzOiBzdHJpbmdbXTsgdHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdIH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gZGF0YWJhc2UucmVhZERhdGEoc3RvcmUgPT4ge1xuICAgICAgICAvLyBBIG5ldmVyLXdyaXR0ZW4gLyBkZWxldGVkIHNldCByZWFkcyBhcyBlbXB0eSAodnMgdGhlIHdob2xlIHJlYWREYXRhIGJlaW5nIHVuZGVmaW5lZCA9IG5vdCBzeW5jZWQpLlxuICAgICAgICBjb25zdCBwcmVzZW50ID0gc3RvcmUgYXMgVHJhbnNhY3Rpb25TZXRTdG9yZTxWYWx1ZT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghcHJlc2VudCkgcmV0dXJuIHsgZmlsZUtleXM6IFtdIGFzIHN0cmluZ1tdLCBidWZmZXJzOiBbXSBhcyBVaW50OEFycmF5W10gfTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZUtleXM6IE9iamVjdC5rZXlzKHByZXNlbnQpLCBidWZmZXJzOiBPYmplY3QudmFsdWVzKHByZXNlbnQpIH07XG4gICAgfSk7XG4gICAgaWYgKCFzbmFwc2hvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBmaWxlS2V5czogc25hcHNob3QuZmlsZUtleXMsIHRyYW5zYWN0aW9uczogZGVjb2RlQnVmZmVycyhzbmFwc2hvdC5idWZmZXJzKSB9O1xufVxuXG5mdW5jdGlvbiByZXBsYXkodHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdKTogTWFwPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IG9yZGVyZWQgPSB0cmFuc2FjdGlvbnMuc2xpY2UoKS5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5zZXF1ZW5jZSAtIHJpZ2h0LnNlcXVlbmNlKTtcbiAgICBjb25zdCBzdGF0ZSA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuICAgIGZvciAoY29uc3QgdHJhbnNhY3Rpb24gb2Ygb3JkZXJlZCkge1xuICAgICAgICAvLyB1bmRlZmluZWQgKG5vdCBmYWxzeSkgaXMgdGhlIGRlbGV0ZSBtYXJrZXIsIHNvIDAgLyBcIlwiIC8gZmFsc2Ugc3RheSByZWFsIHZhbHVlcy5cbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0YXRlLmRlbGV0ZSh0cmFuc2FjdGlvbi5rZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUuc2V0KHRyYW5zYWN0aW9uLmtleSwgdHJhbnNhY3Rpb24udmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbn1cblxuLy8gRGVsZXRlcyBvbGQgZmlsZXMgYnkgdGhlaXIgT1JJR0lOQUwgc3RyaW5nIGtleSwgc28gYSBzdHJheSBub24tbnVtZXJpYyBrZXkgc3RpbGwgZ2V0cyByZW1vdmVkLlxuZnVuY3Rpb24gY29tcGFjdFRyYW5zYWN0aW9uczxWYWx1ZT4oXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPFRyYW5zYWN0aW9uU2V0U3RvcmU8VmFsdWU+PixcbiAgICBhbGxUcmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10sXG4gICAgb2xkRmlsZUtleXM6IHN0cmluZ1tdLFxuICAgIG5ld0ZpbGVOdW1iZXI6IG51bWJlcixcbik6IHZvaWQge1xuICAgIGNvbnN0IGZpbmFsU3RhdGUgPSByZXBsYXkoYWxsVHJhbnNhY3Rpb25zKTtcbiAgICBjb25zdCBtZXJnZWQ6IFRyYW5zYWN0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaW5hbFN0YXRlLmtleXMoKSkge1xuICAgICAgICBtZXJnZWQucHVzaCh7IHNlcXVlbmNlOiBtZXJnZWQubGVuZ3RoLCBrZXksIHZhbHVlOiBmaW5hbFN0YXRlLmdldChrZXkpIH0pO1xuICAgIH1cbiAgICBjb25zdCBlbmNvZGVkID0gdHJhbnNhY3Rpb25DYm9yLmVuY29kZShtZXJnZWQpIGFzIFVpbnQ4QXJyYXk7XG4gICAgZGF0YWJhc2Uud3JpdGVEYXRhKHN0b3JlID0+IHN0b3JlW1N0cmluZyhuZXdGaWxlTnVtYmVyKV0sIGVuY29kZWQpO1xuICAgIGZvciAoY29uc3QgZmlsZUtleSBvZiBvbGRGaWxlS2V5cykge1xuICAgICAgICBkYXRhYmFzZS5kZWxldGVEYXRhKHN0b3JlID0+IHN0b3JlW2ZpbGVLZXldKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvblJlYWQ8VmFsdWU+KFxuICAgIGRhdGFiYXNlOiBEYXRhYmFzZTxUcmFuc2FjdGlvblNldFN0b3JlPFZhbHVlPj4sXG4pOiBNYXA8c3RyaW5nLCBWYWx1ZT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZpbGVzID0gcmVhZFRyYW5zYWN0aW9uRmlsZXMoZGF0YWJhc2UpO1xuICAgIGlmICghZmlsZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlcGxheShmaWxlcy50cmFuc2FjdGlvbnMpIGFzIE1hcDxzdHJpbmcsIFZhbHVlPjtcbn1cblxuLy8gUmVwbGF5IGFuIGFscmVhZHktcmVhZCBzdG9yZSAobm8gcmVhZCBvZiBpdHMgb3duKSwgc28gYSBjYWxsZXIgY2FuIGZldGNoIG1hbnkgc2V0cyBpbiBvbmUgYmF0Y2hlZCByZWFkIGFuZCBtYXRlcmlhbGl6ZSBlYWNoLlxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxheVRyYW5zYWN0aW9uU3RvcmU8VmFsdWU+KHN0b3JlOiBUcmFuc2FjdGlvblNldFN0b3JlPFZhbHVlPiB8IHVuZGVmaW5lZCk6IE1hcDxzdHJpbmcsIFZhbHVlPiB7XG4gICAgaWYgKCFzdG9yZSkgcmV0dXJuIG5ldyBNYXAoKTtcbiAgICByZXR1cm4gcmVwbGF5KGRlY29kZUJ1ZmZlcnMoT2JqZWN0LnZhbHVlcyhzdG9yZSkpKSBhcyBNYXA8c3RyaW5nLCBWYWx1ZT47XG59XG5cbi8vIEZpcmUtYW5kLWZvcmdldDogbm8gY2FsbGVyIHNob3VsZCBjYXJlIHdoZXRoZXIgdGhpcyBcInN1Y2NlZWRlZFwiLiBJZiB0aGUgc2V0IGlzbid0IHN5bmNlZCBmb3IgcmVhZGluZ1xuLy8geWV0IGl0IHNpbXBseSBkb2VzIG5vdGhpbmcgdGhpcyBwYXNzIGFuZCB0aGUgY2FsbGVyJ3MgcmV0cnkgd3JhcHBlciByZS1ydW5zIHRoZSB3aG9sZSBvcGVyYXRpb24gbGF0ZXIuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25NdXRhdGU8VmFsdWU+KFxuICAgIGRhdGFiYXNlOiBEYXRhYmFzZTxUcmFuc2FjdGlvblNldFN0b3JlPFZhbHVlPj4sXG4gICAgdHJhbnNhY3Rpb25zOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogVmFsdWUgfCB1bmRlZmluZWQgfVtdLFxuICAgIGNvbXBhY3RBZnRlckZpbGVzOiBudW1iZXIgPSBERUZBVUxUX0NPTVBBQ1RfQUZURVJfRklMRVMsXG4pOiB2b2lkIHtcbiAgICBpZiAoIXRyYW5zYWN0aW9ucy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBmaWxlcyA9IHJlYWRUcmFuc2FjdGlvbkZpbGVzKGRhdGFiYXNlKTtcbiAgICBpZiAoIWZpbGVzKSByZXR1cm47XG4gICAgY29uc3QgYmFzZVNlcXVlbmNlID0gbWF4TnVtYmVyKGZpbGVzLnRyYW5zYWN0aW9ucy5tYXAodHJhbnNhY3Rpb24gPT4gdHJhbnNhY3Rpb24uc2VxdWVuY2UpLCAtMSkgKyAxO1xuICAgIGNvbnN0IGluY29taW5nOiBUcmFuc2FjdGlvbltdID0gdHJhbnNhY3Rpb25zLm1hcCgodHJhbnNhY3Rpb24sIGluZGV4KSA9PiAoe1xuICAgICAgICBzZXF1ZW5jZTogYmFzZVNlcXVlbmNlICsgaW5kZXgsXG4gICAgICAgIGtleTogdHJhbnNhY3Rpb24ua2V5LFxuICAgICAgICB2YWx1ZTogdHJhbnNhY3Rpb24udmFsdWUsXG4gICAgfSkpO1xuICAgIGNvbnN0IG5leHRGaWxlTnVtYmVyID0gbWF4TnVtYmVyKGZpbGVzLmZpbGVLZXlzLm1hcChmaWxlS2V5ID0+IE51bWJlcihmaWxlS2V5KSksIC0xKSArIDE7XG4gICAgaWYgKGZpbGVzLmZpbGVLZXlzLmxlbmd0aCArIDEgPj0gY29tcGFjdEFmdGVyRmlsZXMpIHtcbiAgICAgICAgY29tcGFjdFRyYW5zYWN0aW9ucyhkYXRhYmFzZSwgZmlsZXMudHJhbnNhY3Rpb25zLmNvbmNhdChpbmNvbWluZyksIGZpbGVzLmZpbGVLZXlzLCBuZXh0RmlsZU51bWJlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IHRyYW5zYWN0aW9uQ2Jvci5lbmNvZGUoaW5jb21pbmcpIGFzIFVpbnQ4QXJyYXk7XG4gICAgICAgIGRhdGFiYXNlLndyaXRlRGF0YShzdG9yZSA9PiBzdG9yZVtTdHJpbmcobmV4dEZpbGVOdW1iZXIpXSwgZW5jb2RlZCk7XG4gICAgfVxufVxuXG4vLyBGaXJlLWFuZC1mb3JnZXQgbGlrZSB0cmFuc2FjdGlvbk11dGF0ZTogY2xlYXJzIHRoZSB3aG9sZSBzZXQgYnkgZGVsZXRpbmcgZXZlcnkgZmlsZS4gZGVsZXRlRGF0YSBvbmx5IHJlbW92ZXNcbi8vIGEgcHJpbWl0aXZlIGxlYWYgKG5vdCBhIHN0b3JlIG9iamVjdCksIHNvIHdlIGRlbGV0ZSBlYWNoIGZpbGUga2V5IGluZGl2aWR1YWxseS4gTm8tb3BzICh0aGUgcmV0cnkgcmUtcnVucylcbi8vIGlmIHRoZSBzdG9yZSBpc24ndCBzeW5jZWQgeWV0LlxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zYWN0aW9uRGVsZXRlPFZhbHVlPihcbiAgICBkYXRhYmFzZTogRGF0YWJhc2U8VHJhbnNhY3Rpb25TZXRTdG9yZTxWYWx1ZT4+LFxuKTogdm9pZCB7XG4gICAgY29uc3QgZmlsZXMgPSByZWFkVHJhbnNhY3Rpb25GaWxlcyhkYXRhYmFzZSk7XG4gICAgaWYgKCFmaWxlcykgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgZmlsZUtleSBvZiBmaWxlcy5maWxlS2V5cykge1xuICAgICAgICBkYXRhYmFzZS5kZWxldGVEYXRhKHN0b3JlID0+IHN0b3JlW2ZpbGVLZXldKTtcbiAgICB9XG59XG4iXX0=
|
|
120
|
-
/* _JS_SOURCE_HASH = "
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25TZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0cmFuc2FjdGlvblNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBMkI7QUFHM0IsdUZBQXVGO0FBQ3ZGLE1BQU0sZUFBZSxHQUFHLElBQUksZ0JBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQVdyRSxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUV2QyxTQUFTLFNBQVMsQ0FBQyxNQUFnQixFQUFFLFFBQWdCO0lBQ2pELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQztJQUN0QixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsT0FBcUI7SUFDeEMsTUFBTSxZQUFZLEdBQWtCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzNCLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFrQixDQUFDO1FBQ2hFLEtBQUssTUFBTSxXQUFXLElBQUksT0FBTyxFQUFFLENBQUM7WUFDaEMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUN6QixRQUE4QztJQUU5QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3ZDLHFHQUFxRztRQUNyRyxNQUFNLE9BQU8sR0FBRyxLQUErQyxDQUFD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QUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDdkcsQ0FBQztTQUFNLENBQUM7UUFDSixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBZSxDQUFDO1FBQy9ELFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEUsQ0FBQztBQUNMLENBQUM7QUFyQkQsOENBcUJDO0FBRUQseVBBQXlQO0FBQ3pQLFNBQWdCLGlCQUFpQixDQUM3QixRQUE4QztJQUU5QyxNQUFNLEtBQUssR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU87SUFDbkIsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7QUFDTCxDQUFDO0FBUkQsOENBUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2JvcnggZnJvbSBcImNib3IteFwiO1xuaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tIFwiLi9EYXRhYmFzZVwiO1xuXG4vLyBzdHJ1Y3R1cmVkQ2xvbmUga2VlcHMgdHlwZWQgYXJyYXlzIC8gTWFwcyAvIHVuZGVmaW5lZCBpbnRhY3QgdGhyb3VnaCB0aGUgcm91bmQtdHJpcC5cbmNvbnN0IHRyYW5zYWN0aW9uQ2JvciA9IG5ldyBjYm9yeC5FbmNvZGVyKHsgc3RydWN0dXJlZENsb25lOiB0cnVlIH0pO1xuXG4vLyBPbiB0aGUgc3RvcmU6IGZpbGVzIGtleWVkIGJ5IGEgbW9ub3RvbmljIG51bWJlciwgZWFjaCBhIENCT1IgYXJyYXkgb2YgdHJhbnNhY3Rpb25zOyBhIHRyYW5zYWN0aW9uIHNldHMgb25lIGtleSAodmFsdWUgdW5kZWZpbmVkID0gZGVsZXRlKSBhbmQgY2FycmllcyBhIGdsb2JhbCBzZXF1ZW5jZSBudW1iZXIuIFJlcGxheWluZyBldmVyeSB0cmFuc2FjdGlvbiBpbiBzZXF1ZW5jZSBvcmRlciAobGFzdCB3cml0ZSB3aW5zKSBnaXZlcyB0aGUgY3VycmVudCBtYXAuIE11dGF0aW9ucyBhcHBlbmQgYSBmaWxlLCB0aGVuIGZvbGQgdGhlIHdob2xlIHNldCBpbnRvIG9uZSBvbmNlIGVub3VnaCBhY2N1bXVsYXRlLiBWYWx1ZSBpcyBwaGFudG9tIOKAlCBpdCBvbmx5IHJlY29yZHMgd2hhdCB0aGUgZW5jb2RlZCB2YWx1ZXMgZGVzZXJpYWxpemUgdG8uXG5kZWNsYXJlIGNvbnN0IHZhbHVlVGFnOiB1bmlxdWUgc3ltYm9sO1xuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25TZXRTdG9yZTxWYWx1ZT4gPSB7XG4gICAgW2ZpbGVOdW1iZXI6IHN0cmluZ106IFVpbnQ4QXJyYXk7XG4gICAgW3ZhbHVlVGFnXT86IFZhbHVlO1xufTtcblxudHlwZSBUcmFuc2FjdGlvbiA9IHsgc2VxdWVuY2U6IG51bWJlcjsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH07XG5cbmNvbnN0IERFRkFVTFRfQ09NUEFDVF9BRlRFUl9GSUxFUyA9IDE2O1xuXG5mdW5jdGlvbiBtYXhOdW1iZXIodmFsdWVzOiBudW1iZXJbXSwgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHJlc3VsdCA9IGZhbGxiYWNrO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZSA+IHJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZGVjb2RlQnVmZmVycyhidWZmZXJzOiBVaW50OEFycmF5W10pOiBUcmFuc2FjdGlvbltdIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGJ1ZmZlciBvZiBidWZmZXJzKSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSB0cmFuc2FjdGlvbkNib3IuZGVjb2RlKGJ1ZmZlcikgYXMgVHJhbnNhY3Rpb25bXTtcbiAgICAgICAgZm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiBkZWNvZGVkKSB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbnMucHVzaCh0cmFuc2FjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9ucztcbn1cblxuZnVuY3Rpb24gcmVhZFRyYW5zYWN0aW9uRmlsZXM8VmFsdWU+KFxuICAgIGRhdGFiYXNlOiBEYXRhYmFzZTxUcmFuc2FjdGlvblNldFN0b3JlPFZhbHVlPj4sXG4pOiB7IGZpbGVLZXlzOiBzdHJpbmdbXTsgdHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdIH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gZGF0YWJhc2UucmVhZERhdGEoc3RvcmUgPT4ge1xuICAgICAgICAvLyBBIG5ldmVyLXdyaXR0ZW4gLyBkZWxldGVkIHNldCByZWFkcyBhcyBlbXB0eSAodnMgdGhlIHdob2xlIHJlYWREYXRhIGJlaW5nIHVuZGVmaW5lZCA9IG5vdCBzeW5jZWQpLlxuICAgICAgICBjb25zdCBwcmVzZW50ID0gc3RvcmUgYXMgVHJhbnNhY3Rpb25TZXRTdG9yZTxWYWx1ZT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghcHJlc2VudCkgcmV0dXJuIHsgZmlsZUtleXM6IFtdIGFzIHN0cmluZ1tdLCBidWZmZXJzOiBbXSBhcyBVaW50OEFycmF5W10gfTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZUtleXM6IE9iamVjdC5rZXlzKHByZXNlbnQpLCBidWZmZXJzOiBPYmplY3QudmFsdWVzKHByZXNlbnQpIH07XG4gICAgfSk7XG4gICAgaWYgKCFzbmFwc2hvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBmaWxlS2V5czogc25hcHNob3QuZmlsZUtleXMsIHRyYW5zYWN0aW9uczogZGVjb2RlQnVmZmVycyhzbmFwc2hvdC5idWZmZXJzKSB9O1xufVxuXG5mdW5jdGlvbiByZXBsYXkodHJhbnNhY3Rpb25zOiBUcmFuc2FjdGlvbltdKTogTWFwPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IG9yZGVyZWQgPSB0cmFuc2FjdGlvbnMuc2xpY2UoKS5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5zZXF1ZW5jZSAtIHJpZ2h0LnNlcXVlbmNlKTtcbiAgICBjb25zdCBzdGF0ZSA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuICAgIGZvciAoY29uc3QgdHJhbnNhY3Rpb24gb2Ygb3JkZXJlZCkge1xuICAgICAgICAvLyB1bmRlZmluZWQgKG5vdCBmYWxzeSkgaXMgdGhlIGRlbGV0ZSBtYXJrZXIsIHNvIDAgLyBcIlwiIC8gZmFsc2Ugc3RheSByZWFsIHZhbHVlcy5cbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0YXRlLmRlbGV0ZSh0cmFuc2FjdGlvbi5rZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUuc2V0KHRyYW5zYWN0aW9uLmtleSwgdHJhbnNhY3Rpb24udmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbn1cblxuLy8gRGVsZXRlcyBvbGQgZmlsZXMgYnkgdGhlaXIgT1JJR0lOQUwgc3RyaW5nIGtleSwgc28gYSBzdHJheSBub24tbnVtZXJpYyBrZXkgc3RpbGwgZ2V0cyByZW1vdmVkLlxuZnVuY3Rpb24gY29tcGFjdFRyYW5zYWN0aW9uczxWYWx1ZT4oXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPFRyYW5zYWN0aW9uU2V0U3RvcmU8VmFsdWU+PixcbiAgICBhbGxUcmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10sXG4gICAgb2xkRmlsZUtleXM6IHN0cmluZ1tdLFxuICAgIG5ld0ZpbGVOdW1iZXI6IG51bWJlcixcbik6IHZvaWQge1xuICAgIGNvbnN0IGZpbmFsU3RhdGUgPSByZXBsYXkoYWxsVHJhbnNhY3Rpb25zKTtcbiAgICBjb25zdCBtZXJnZWQ6IFRyYW5zYWN0aW9uW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaW5hbFN0YXRlLmtleXMoKSkge1xuICAgICAgICBtZXJnZWQucHVzaCh7IHNlcXVlbmNlOiBtZXJnZWQubGVuZ3RoLCBrZXksIHZhbHVlOiBmaW5hbFN0YXRlLmdldChrZXkpIH0pO1xuICAgIH1cbiAgICBjb25zdCBlbmNvZGVkID0gdHJhbnNhY3Rpb25DYm9yLmVuY29kZShtZXJnZWQpIGFzIFVpbnQ4QXJyYXk7XG4gICAgZGF0YWJhc2Uud3JpdGVEYXRhKHN0b3JlID0+IHN0b3JlW1N0cmluZyhuZXdGaWxlTnVtYmVyKV0sIGVuY29kZWQpO1xuICAgIGZvciAoY29uc3QgZmlsZUtleSBvZiBvbGRGaWxlS2V5cykge1xuICAgICAgICBkYXRhYmFzZS5kZWxldGVEYXRhKHN0b3JlID0+IHN0b3JlW2ZpbGVLZXldKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvblJlYWQ8VmFsdWU+KFxuICAgIGRhdGFiYXNlOiBEYXRhYmFzZTxUcmFuc2FjdGlvblNldFN0b3JlPFZhbHVlPj4sXG4pOiBNYXA8c3RyaW5nLCBWYWx1ZT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZpbGVzID0gcmVhZFRyYW5zYWN0aW9uRmlsZXMoZGF0YWJhc2UpO1xuICAgIGlmICghZmlsZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlcGxheShmaWxlcy50cmFuc2FjdGlvbnMpIGFzIE1hcDxzdHJpbmcsIFZhbHVlPjtcbn1cblxuLy8gUmVwbGF5IGFuIGFscmVhZHktcmVhZCBzdG9yZSAobm8gcmVhZCBvZiBpdHMgb3duKSwgc28gYSBjYWxsZXIgY2FuIGZldGNoIG1hbnkgc2V0cyBpbiBvbmUgYmF0Y2hlZCByZWFkIGFuZCBtYXRlcmlhbGl6ZSBlYWNoLlxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxheVRyYW5zYWN0aW9uU3RvcmU8VmFsdWU+KHN0b3JlOiBUcmFuc2FjdGlvblNldFN0b3JlPFZhbHVlPiB8IHVuZGVmaW5lZCk6IE1hcDxzdHJpbmcsIFZhbHVlPiB7XG4gICAgaWYgKCFzdG9yZSkgcmV0dXJuIG5ldyBNYXAoKTtcbiAgICByZXR1cm4gcmVwbGF5KGRlY29kZUJ1ZmZlcnMoT2JqZWN0LnZhbHVlcyhzdG9yZSkpKSBhcyBNYXA8c3RyaW5nLCBWYWx1ZT47XG59XG5cbi8vIEZpcmUtYW5kLWZvcmdldDogbm8gY2FsbGVyIHNob3VsZCBjYXJlIHdoZXRoZXIgdGhpcyBcInN1Y2NlZWRlZFwiLiBJZiB0aGUgc2V0IGlzbid0IHN5bmNlZCBmb3IgcmVhZGluZyB5ZXQgaXQgc2ltcGx5IGRvZXMgbm90aGluZyB0aGlzIHBhc3MgYW5kIHRoZSBjYWxsZXIncyByZXRyeSB3cmFwcGVyIHJlLXJ1bnMgdGhlIHdob2xlIG9wZXJhdGlvbiBsYXRlci5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbk11dGF0ZTxWYWx1ZT4oXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPFRyYW5zYWN0aW9uU2V0U3RvcmU8VmFsdWU+PixcbiAgICB0cmFuc2FjdGlvbnM6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBWYWx1ZSB8IHVuZGVmaW5lZCB9W10sXG4gICAgY29tcGFjdEFmdGVyRmlsZXM6IG51bWJlciA9IERFRkFVTFRfQ09NUEFDVF9BRlRFUl9GSUxFUyxcbik6IHZvaWQge1xuICAgIGlmICghdHJhbnNhY3Rpb25zLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGZpbGVzID0gcmVhZFRyYW5zYWN0aW9uRmlsZXMoZGF0YWJhc2UpO1xuICAgIGlmICghZmlsZXMpIHJldHVybjtcbiAgICBjb25zdCBiYXNlU2VxdWVuY2UgPSBtYXhOdW1iZXIoZmlsZXMudHJhbnNhY3Rpb25zLm1hcCh0cmFuc2FjdGlvbiA9PiB0cmFuc2FjdGlvbi5zZXF1ZW5jZSksIC0xKSArIDE7XG4gICAgY29uc3QgaW5jb21pbmc6IFRyYW5zYWN0aW9uW10gPSB0cmFuc2FjdGlvbnMubWFwKCh0cmFuc2FjdGlvbiwgaW5kZXgpID0+ICh7XG4gICAgICAgIHNlcXVlbmNlOiBiYXNlU2VxdWVuY2UgKyBpbmRleCxcbiAgICAgICAga2V5OiB0cmFuc2FjdGlvbi5rZXksXG4gICAgICAgIHZhbHVlOiB0cmFuc2FjdGlvbi52YWx1ZSxcbiAgICB9KSk7XG4gICAgY29uc3QgbmV4dEZpbGVOdW1iZXIgPSBtYXhOdW1iZXIoZmlsZXMuZmlsZUtleXMubWFwKGZpbGVLZXkgPT4gTnVtYmVyKGZpbGVLZXkpKSwgLTEpICsgMTtcbiAgICBpZiAoZmlsZXMuZmlsZUtleXMubGVuZ3RoICsgMSA+PSBjb21wYWN0QWZ0ZXJGaWxlcykge1xuICAgICAgICBjb21wYWN0VHJhbnNhY3Rpb25zKGRhdGFiYXNlLCBmaWxlcy50cmFuc2FjdGlvbnMuY29uY2F0KGluY29taW5nKSwgZmlsZXMuZmlsZUtleXMsIG5leHRGaWxlTnVtYmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gdHJhbnNhY3Rpb25DYm9yLmVuY29kZShpbmNvbWluZykgYXMgVWludDhBcnJheTtcbiAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHN0b3JlID0+IHN0b3JlW1N0cmluZyhuZXh0RmlsZU51bWJlcildLCBlbmNvZGVkKTtcbiAgICB9XG59XG5cbi8vIEZpcmUtYW5kLWZvcmdldCBsaWtlIHRyYW5zYWN0aW9uTXV0YXRlOiBjbGVhcnMgdGhlIHdob2xlIHNldCBieSBkZWxldGluZyBldmVyeSBmaWxlLiBkZWxldGVEYXRhIG9ubHkgcmVtb3ZlcyBhIHByaW1pdGl2ZSBsZWFmIChub3QgYSBzdG9yZSBvYmplY3QpLCBzbyB3ZSBkZWxldGUgZWFjaCBmaWxlIGtleSBpbmRpdmlkdWFsbHkuIE5vLW9wcyAodGhlIHJldHJ5IHJlLXJ1bnMpIGlmIHRoZSBzdG9yZSBpc24ndCBzeW5jZWQgeWV0LlxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zYWN0aW9uRGVsZXRlPFZhbHVlPihcbiAgICBkYXRhYmFzZTogRGF0YWJhc2U8VHJhbnNhY3Rpb25TZXRTdG9yZTxWYWx1ZT4+LFxuKTogdm9pZCB7XG4gICAgY29uc3QgZmlsZXMgPSByZWFkVHJhbnNhY3Rpb25GaWxlcyhkYXRhYmFzZSk7XG4gICAgaWYgKCFmaWxlcykgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgZmlsZUtleSBvZiBmaWxlcy5maWxlS2V5cykge1xuICAgICAgICBkYXRhYmFzZS5kZWxldGVEYXRhKHN0b3JlID0+IHN0b3JlW2ZpbGVLZXldKTtcbiAgICB9XG59XG4iXX0=
|
|
117
|
+
/* _JS_SOURCE_HASH = "4fb1c30fee2a94da155ca09c7716110d3e3ec9e064357c52e6c930bc193c7524"; */
|
|
@@ -75,9 +75,7 @@ function deletePath(root: Record<string, unknown>, path: string[]): void {
|
|
|
75
75
|
delete node[path[path.length - 1]];
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
// In-memory Database for tests/dev: holds the whole root as a plain object and counts every call plus the
|
|
79
|
-
// bytes flowing through. Synchronous and always "synced", so reads only return undefined for a genuinely
|
|
80
|
-
// missing scalar (a missing transaction set reads as empty inside the set helpers).
|
|
78
|
+
// In-memory Database for tests/dev: holds the whole root as a plain object and counts every call plus the bytes flowing through. Synchronous and always "synced", so reads only return undefined for a genuinely missing scalar (a missing transaction set reads as empty inside the set helpers).
|
|
81
79
|
export class InMemoryDatabase<Root> implements Database<Root> {
|
|
82
80
|
public readCalls = 0;
|
|
83
81
|
public writeCalls = 0;
|
|
@@ -10,17 +10,12 @@ export type IvfConfig = {
|
|
|
10
10
|
cellTargetSize: number;
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
-
// Tiered storage. Below FLAT_LIMIT embeddings the whole set lives in one flat transaction set (no IVF);
|
|
14
|
-
// once it grows past that we build the IVF (centroids + per-cell sets) and stay there forever. `count` is
|
|
15
|
-
// the live embedding count (re-derived exactly on a rebuild). `steps` records one-time upgrades that must
|
|
16
|
-
// never re-run even if the set later shrinks and regrows.
|
|
13
|
+
// Tiered storage. Below FLAT_LIMIT embeddings the whole set lives in one flat transaction set (no IVF); once it grows past that we build the IVF (centroids + per-cell sets) and stay there forever. `count` is the live embedding count (re-derived exactly on a rebuild). `steps` records one-time upgrades that must never re-run even if the set later shrinks and regrows.
|
|
17
14
|
export type IvfEmbeddingRoot = {
|
|
18
15
|
config: IvfConfig;
|
|
19
16
|
count: number;
|
|
20
17
|
flat: TransactionSetStore<StoredEmbedding>;
|
|
21
|
-
// Direct ref -> embedding index. Each entry is one CBOR blob at its own key, so a lookup or delete is a
|
|
22
|
-
// single key-value op (no transaction-set replay) and deleteData can drop it (it's a primitive leaf). Refs
|
|
23
|
-
// and their embeddings never move, so a rebuild leaves this untouched.
|
|
18
|
+
// Direct ref -> embedding index. Each entry is one CBOR blob at its own key, so a lookup or delete is a single key-value op (no transaction-set replay) and deleteData can drop it (it's a primitive leaf). Refs and their embeddings never move, so a rebuild leaves this untouched.
|
|
24
19
|
byRef: { [ref: string]: Uint8Array };
|
|
25
20
|
steps: { [step: string]: boolean };
|
|
26
21
|
centroids: TransactionSetStore<StoredEmbedding>;
|
|
@@ -67,8 +62,7 @@ function rankCellsByCloseness(embedding: StoredEmbedding, centroids: Map<string,
|
|
|
67
62
|
return ranked.map(entry => entry.cellId);
|
|
68
63
|
}
|
|
69
64
|
|
|
70
|
-
// Per-write chance of a full rebuild. Zero at/under the target size, then rises (cubically) past it so cells
|
|
71
|
-
// stay roughly between target and ~2x target.
|
|
65
|
+
// Per-write chance of a full rebuild. Zero at/under the target size, then rises (cubically) past it so cells stay roughly between target and ~2x target.
|
|
72
66
|
function rebalanceProbability(fillRatio: number): number {
|
|
73
67
|
if (fillRatio <= 1) {
|
|
74
68
|
return 0;
|
|
@@ -77,9 +71,7 @@ function rebalanceProbability(fillRatio: number): number {
|
|
|
77
71
|
return Math.min(1, over * over * over * 0.25);
|
|
78
72
|
}
|
|
79
73
|
|
|
80
|
-
// k-means. Decodes every member to a pooled float32 buffer ONCE, then assigns with a plain internal float
|
|
81
|
-
// dot (no getCloseness call — comparing two float vectors is trivial) and keeps centroids as float means,
|
|
82
|
-
// encoding them to StoredEmbedding only at the end. Releases the borrowed buffers when done.
|
|
74
|
+
// k-means. Decodes every member to a pooled float32 buffer ONCE, then assigns with a plain internal float dot (no getCloseness call — comparing two float vectors is trivial) and keeps centroids as float means, encoding them to StoredEmbedding only at the end. Releases the borrowed buffers when done.
|
|
83
75
|
function clusterMembers(members: CellEntry[], clusterCount: number, config: IvfConfig): { centroid: StoredEmbedding; members: CellEntry[] }[] {
|
|
84
76
|
const memberFloats: Float32Array[] = [];
|
|
85
77
|
for (const member of members) {
|
|
@@ -156,10 +148,7 @@ function clusterMembers(members: CellEntry[], clusterCount: number, config: IvfC
|
|
|
156
148
|
return result;
|
|
157
149
|
}
|
|
158
150
|
|
|
159
|
-
// Re-cluster EVERY embedding (flat tier + all cells) into a fresh IVF, clear the flat tier, and mark IVF
|
|
160
|
-
// mode. This is the rearranger: run probabilistically as the set grows, once at each regenerate threshold,
|
|
161
|
-
// and once to upgrade from flat. Reads everything it uses, so it bails (does nothing) if anything isn't
|
|
162
|
-
// synced and the caller's retry re-runs it; no caller cares about its result.
|
|
151
|
+
// Re-cluster EVERY embedding (flat tier + all cells) into a fresh IVF, clear the flat tier, and mark IVF mode. This is the rearranger: run probabilistically as the set grows, once at each regenerate threshold, and once to upgrade from flat. Reads everything it uses, so it bails (does nothing) if anything isn't synced and the caller's retry re-runs it; no caller cares about its result.
|
|
163
152
|
export function rebuildStructure(database: Database<IvfEmbeddingRoot>): void {
|
|
164
153
|
const config = database.readData(root => root.config);
|
|
165
154
|
if (!config) return;
|
|
@@ -167,9 +156,7 @@ export function rebuildStructure(database: Database<IvfEmbeddingRoot>): void {
|
|
|
167
156
|
if (!steps) return;
|
|
168
157
|
|
|
169
158
|
const allMembers: CellEntry[] = [];
|
|
170
|
-
// Only the one-time flat->IVF upgrade pulls from the flat tier. Once STEP_IVF is set the flat data has
|
|
171
|
-
// already been folded into cells, so later rebuilds ignore it. It's left in place, never deleted: deleteData
|
|
172
|
-
// only removes primitive leaves, not a whole store, and the flat tier is small enough not to matter.
|
|
159
|
+
// Only the one-time flat->IVF upgrade pulls from the flat tier. Once STEP_IVF is set the flat data has already been folded into cells, so later rebuilds ignore it. It's left in place, never deleted: deleteData only removes primitive leaves, not a whole store, and the flat tier is small enough not to matter.
|
|
173
160
|
if (!steps[STEP_IVF]) {
|
|
174
161
|
const flat = transactionRead(flatStore(database));
|
|
175
162
|
if (!flat) return;
|
|
@@ -252,8 +239,7 @@ export function searchEmbeddings(
|
|
|
252
239
|
return hits.slice(0, options.resultCount);
|
|
253
240
|
}
|
|
254
241
|
|
|
255
|
-
// Direct ref -> stored embedding lookup through the byRef index: one key-value read per ref, no cell scan. A
|
|
256
|
-
// search returns refs; this fetches the data behind them. Skips refs that aren't present; undefined if not synced.
|
|
242
|
+
// Direct ref -> stored embedding lookup through the byRef index: one key-value read per ref, no cell scan. A search returns refs; this fetches the data behind them. Skips refs that aren't present; undefined if not synced.
|
|
257
243
|
export function lookupEmbeddings(
|
|
258
244
|
database: Database<IvfEmbeddingRoot>,
|
|
259
245
|
refs: string[],
|
|
@@ -364,8 +350,7 @@ export function removeEmbeddings(
|
|
|
364
350
|
if (!centroids) return;
|
|
365
351
|
if (!centroids.size) return;
|
|
366
352
|
|
|
367
|
-
// Look up each ref's embedding through byRef, then rank its cells the way an insert would, so we delete from
|
|
368
|
-
// the cell it actually landed in (plus a few neighbours, in case a rebuild nudged it across a boundary).
|
|
353
|
+
// Look up each ref's embedding through byRef, then rank its cells the way an insert would, so we delete from the cell it actually landed in (plus a few neighbours, in case a rebuild nudged it across a boundary).
|
|
369
354
|
const refValues = database.readData(root => refs.map(ref => root.byRef[ref]));
|
|
370
355
|
if (!refValues) return;
|
|
371
356
|
const candidatesByItem: { ref: string; cellIds: string[] }[] = [];
|
|
@@ -96,8 +96,7 @@ export function replayTransactionStore<Value>(store: TransactionSetStore<Value>
|
|
|
96
96
|
return replay(decodeBuffers(Object.values(store))) as Map<string, Value>;
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
// Fire-and-forget: no caller should care whether this "succeeded". If the set isn't synced for reading
|
|
100
|
-
// yet it simply does nothing this pass and the caller's retry wrapper re-runs the whole operation later.
|
|
99
|
+
// Fire-and-forget: no caller should care whether this "succeeded". If the set isn't synced for reading yet it simply does nothing this pass and the caller's retry wrapper re-runs the whole operation later.
|
|
101
100
|
export function transactionMutate<Value>(
|
|
102
101
|
database: Database<TransactionSetStore<Value>>,
|
|
103
102
|
transactions: { key: string; value: Value | undefined }[],
|
|
@@ -121,9 +120,7 @@ export function transactionMutate<Value>(
|
|
|
121
120
|
}
|
|
122
121
|
}
|
|
123
122
|
|
|
124
|
-
// Fire-and-forget like transactionMutate: clears the whole set by deleting every file. deleteData only removes
|
|
125
|
-
// a primitive leaf (not a store object), so we delete each file key individually. No-ops (the retry re-runs)
|
|
126
|
-
// if the store isn't synced yet.
|
|
123
|
+
// Fire-and-forget like transactionMutate: clears the whole set by deleting every file. deleteData only removes a primitive leaf (not a store object), so we delete each file key individually. No-ops (the retry re-runs) if the store isn't synced yet.
|
|
127
124
|
export function transactionDelete<Value>(
|
|
128
125
|
database: Database<TransactionSetStore<Value>>,
|
|
129
126
|
): void {
|