sliftutils 1.7.121 → 1.7.123
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/dist/treeSummary.ts.cache +2 -2
- package/index.d.ts +74 -7
- 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/persistentLocalStorage.ts.cache +2 -2
- package/package.json +2 -2
- package/render-utils/dist/observer.tsx.cache +2 -2
- package/storage/BulkDatabase2/BulkDatabase2.d.ts +14 -2
- package/storage/BulkDatabase2/BulkDatabase2.ts +15 -2
- package/storage/BulkDatabase2/BulkDatabaseBase.d.ts +57 -5
- package/storage/BulkDatabase2/BulkDatabaseBase.ts +288 -137
- package/storage/BulkDatabase2/LoadedIndex.d.ts +1 -0
- package/storage/BulkDatabase2/LoadedIndex.ts +2 -1
- package/storage/BulkDatabase2/blockCache.ts +6 -1
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +257 -162
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +8 -3
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +30 -4
- package/storage/BulkDatabase2/syncClient.d.ts +2 -0
- package/storage/BulkDatabase2/syncClient.ts +27 -2
- package/storage/dist/ArchivesDisk.ts.cache +2 -2
- package/storage/dist/FileFolderAPI.tsx.cache +2 -2
- package/storage/dist/IArchives.ts.cache +2 -2
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
- package/storage/dist/JSONStorage.ts.cache +2 -2
- package/storage/dist/PendingManager.tsx.cache +2 -2
- package/storage/dist/StreamingLogs.ts.cache +2 -2
- package/storage/dist/TransactionFile.ts.cache +2 -2
- package/storage/dist/TransactionStorage.ts.cache +2 -2
- package/storage/dist/backblaze.ts.cache +2 -2
- package/storage/dist/fileSystemPointer.ts.cache +2 -2
- package/storage/dist/remoteFileStorage.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +2 -2
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
- package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
- package/storage/remoteStorage/dist/blobStore.ts.cache +2 -2
- package/storage/remoteStorage/dist/bucketDisk.ts.cache +2 -2
- package/storage/remoteStorage/dist/certTrustModal.tsx.cache +2 -2
- package/storage/remoteStorage/dist/chainStartup.ts.cache +2 -2
- package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +2 -2
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateManagement.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/serverConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourcesList.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageLogs.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageServerState.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/storePlan.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeSync.ts.cache +2 -2
- package/storage/remoteStorage/dist/validation.ts.cache +2 -2
- package/yarn.lock +4 -4
|
@@ -422,5 +422,5 @@ function joinBulkDatabases(databases) {
|
|
|
422
422
|
},
|
|
423
423
|
};
|
|
424
424
|
}
|
|
425
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZGVkSW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJMb2FkZWRJbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2REFBa0g7QUFDbEgsNkNBQW9EO0FBQ3BELDJDQUFrRztBQUNsRyxrRUFBaUY7QUFDakYsd0VBQXFFO0FBRXJFLG9JQUFvSTtBQUNwSSxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBTTFDLE1BQWEsZ0JBQWlCLFNBQVEsS0FBSztDQUFJO0FBQS9DLDRDQUErQztBQUMvQyxNQUFNLGlCQUFrQixTQUFRLEtBQUs7Q0FBSTtBQW9CekMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFFNUIsU0FBUyxRQUFRLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDbEMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELG9XQUFvVztBQUNwVyxNQUFhLFdBQVc7SUFDcEIsWUFDb0IsSUFBWSxFQUNaLE9BQW9CLEVBQ3BCLFNBQXlCLEVBQ3pCLFdBQTZCLEVBQzdCLE1BQXNCLEVBQ3RCLFdBQWdDLEVBQ2hDLFdBQWdDLEVBQ2hDLGdCQUF3QixFQUN4QixpQkFBeUIsRUFDekIsU0FBMEI7UUFUMUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDcEIsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUFDekIsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLGdCQUFXLEdBQVgsV0FBVyxDQUFxQjtRQUNoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7UUFDaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFRO1FBQ3hCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBUTtRQUN6QixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQVN0QyxnQkFBVyxHQUFHLElBQUks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QUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1QsZUFBZSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQy9CLFNBQVM7Z0JBQ2IsQ0FBQztnQkFDRCxJQUFJLENBQUMsS0FBSywyQkFBTTtvQkFBRSxTQUFTO2dCQUMzQixJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxFQUFFLENBQUM7b0JBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztnQkFBQyxDQUFDO1lBQ2xGLENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxLQUFLLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3RSxDQUFDO0tBQ0osQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZpbGVTdG9yYWdlIH0gZnJvbSBcIi4uL0ZpbGVGb2xkZXJBUElcIjtcbmltcG9ydCB7IEFCU0VOVCwgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlciwgRU1QVFlfQlVGRkVSLCBLRVlfQ09MVU1OLCBsb2FkQnVsa0RhdGFiYXNlIH0gZnJvbSBcIi4vQnVsa0RhdGFiYXNlRm9ybWF0XCI7XG5pbXBvcnQgeyBibG9ja0NhY2hlLCBHZXRSYW5nZSB9IGZyb20gXCIuL2Jsb2NrQ2FjaGVcIjtcbmltcG9ydCB7IFNUUkVBTV9FWFRFTlNJT04sIFN0cmVhbUVudHJ5LCBwYXJzZVN0cmVhbSwgc3RyZWFtUmVhZGVyRnJvbUVudHJpZXMgfSBmcm9tIFwiLi9zdHJlYW1Mb2dcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyBibHVlLCByZWQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuXG4vLyBEdXBsaWNhdGVkIGZyb20gQnVsa0RhdGFiYXNlQmFzZSB0byBhdm9pZCBhIGNpcmN1bGFyIGltcG9ydCDigJQgdXNlZCBvbmx5IHRvIGJ1aWxkIGEgZnVsbGVyIHN0b3JhZ2UtcmVsYXRpdmUgcGF0aCBmb3IgbG9nIG1lc3NhZ2VzLlxuY29uc3QgQlVMS19ST09UX0ZPTERFUiA9IFwiYnVsa0RhdGFiYXNlczJcIjtcblxuZXhwb3J0IHR5cGUgQnVsa0ZpbGVJbmZvID0geyBmaWxlTmFtZTogc3RyaW5nOyBsZXZlbDogbnVtYmVyOyB0aW1lc3RhbXA6IG51bWJlciB9O1xuZXhwb3J0IHR5cGUgU3RyZWFtRmlsZUluZm8gPSB7IGZpbGVOYW1lOiBzdHJpbmc7IHRpbWVzdGFtcDogbnVtYmVyIH07XG5leHBvcnQgdHlwZSBTdHJlYW1SZWFkZXJDYWNoZUVudHJ5ID0geyByZWFkU2l6ZTogbnVtYmVyOyBwYXJzZWRQb3M6IG51bWJlcjsgZW50cmllczogU3RyZWFtRW50cnlbXSB9O1xuXG5leHBvcnQgY2xhc3MgTWlzc2luZ0ZpbGVFcnJvciBleHRlbmRzIEVycm9yIHsgfVxuY2xhc3MgRmlsZXNDaGFuZ2VkRXJyb3IgZXh0ZW5kcyBFcnJvciB7IH1cblxuZXhwb3J0IHR5cGUgUmVzb2x2ZWRSZWFkZXIgPSB7XG4gICAgcm93Q291bnQ6IG51bWJlcjtcbiAgICB0b3RhbEJ5dGVzOiBudW1iZXI7XG4gICAga2V5czogc3RyaW5nW107XG4gICAgcmF3S2V5Q291bnQ6IG51bWJlcjtcbiAgICByZWFkZXJDb3VudDogbnVtYmVyO1xuICAgIGNvbHVtbnM6IHsgY29sdW1uOiBzdHJpbmc7IGJ5dGVTaXplOiBudW1iZXIgfVtdO1xuICAgIGtleVRpbWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICAgIGRlbGV0ZVRpbWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICAgIGdldENvbHVtbjogKGNvbHVtbjogc3RyaW5nKSA9PiBQcm9taXNlPHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfVtdPjtcbiAgICBnZXRTaW5nbGVGaWVsZDogKGtleTogc3RyaW5nLCBjb2x1bW46IHN0cmluZykgPT4gUHJvbWlzZTx7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZD47XG59O1xuXG5leHBvcnQgdHlwZSBTdWJSZWFkZXJDYWNoZXMgPSB7XG4gICAgYnVsazogTWFwPHN0cmluZywgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlcj47XG4gICAgc3RyZWFtOiBNYXA8c3RyaW5nLCBTdHJlYW1SZWFkZXJDYWNoZUVudHJ5Pjtcbn07XG5cbmNvbnN0IE1BWF9SRUFEX0FUVEVNUFRTID0gODtcblxuZnVuY3Rpb24gbnVsbEpvaW4oYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBhICsgU3RyaW5nLmZyb21DaGFyQ29kZSgwKSArIGI7XG59XG5cbi8vIEEgbG9hZGVkIHNuYXBzaG90IG9mIG9uZSBjb2xsZWN0aW9uJ3Mgb24tZGlzayBzdGF0ZTogdGhlIHJlc29sdmVkIHJlYWRlciArIHRoZSBwZXItZmlsZSBkZWNvZGVkIHN1Yi0gcmVhZGVycyBpdCBzdGl0Y2hlZCwgdGhlIHN0cmVhbSBmaWxlIHNpemVzL3RpbWVzIGl0IG9ic2VydmVkLCBhbmQgdGhlIHN5bmMgKHJlYWN0aXZlKSBjYWNoZXMgdGhhdCBzdXJmYWNlIGNvbHVtbi9maWVsZCByZWFkcy4gQnVpbHQgb25jZSB2aWEgTG9hZGVkSW5kZXguYnVpbGQg4oCUIGVhZ2VybHksIHNvIHRoZSBzd2FwIGludG8gYSBmcmVzaCBMb2FkZWRJbmRleCBuZXZlciBibG9ja3MgYSByZWFkIG9uIGEgc3luY2hyb25vdXMgcmVidWlsZC5cbmV4cG9ydCBjbGFzcyBMb2FkZWRJbmRleDxUIGV4dGVuZHMgeyBrZXk6IHN0cmluZyB9PiB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2U6IEZpbGVTdG9yYWdlLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYnVsa0ZpbGVzOiBCdWxrRmlsZUluZm9bXSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVhZGVyOiBSZXNvbHZlZFJlYWRlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0cmVhbVRpbWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RyZWFtU2l6ZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdHJlYW1Sb3dzT25EaXNrOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdHJlYW1CeXRlc09uRGlzazogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3ViQ2FjaGVzOiBTdWJSZWFkZXJDYWNoZXMsXG4gICAgKSB7XG4gICAgICAgIHRoaXMua2V5cyA9IG5ldyBTZXQocmVhZGVyLmtleXMpO1xuICAgICAgICB0aGlzLmZpbGVTZXQgPSBuZXcgU2V0KFsuLi5idWxrRmlsZXMubWFwKGYgPT4gZi5maWxlTmFtZSksIC4uLnN0cmVhbUZpbGVzLm1hcChmID0+IGYuZmlsZU5hbWUpXSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IGtleXM6IFNldDxzdHJpbmc+O1xuICAgIHB1YmxpYyByZWFkb25seSBmaWxlU2V0OiBTZXQ8c3RyaW5nPjtcblxuICAgIHByaXZhdGUgYmFzZUNvbHVtbnMgPSBuZXcgTWFwPHN0cmluZywgeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd247IHRpbWU6IG51bWJlciB9W10+KCk7XG4gICAgcHJpdmF0ZSBiYXNlQ29sdW1uc0xvYWRpbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIGJhc2VGaWVsZHMgPSBuZXcgTWFwPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+KCk7XG4gICAgcHJpdmF0ZSBiYXNlRmllbGRzTG9hZGluZyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIC8vIExhc3Qta25vd24gdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIGluZGV4LCBzZXJ2ZWQgdW50aWwgdGhpcyBpbmRleCBsb2FkcyBpdHMgb3duIGZyZXNoIHZhbHVlLCBzbyBhIHN3YXAgZG9lc24ndCBmbGFzaCBlbXB0eSBpbiBzeW5jIHJlYWRzLiBDbGVhcmVkIHBlci1lbnRyeSB3aGVuIHRoZSBmcmVzaCB2YWx1ZSBsYW5kcy5cbiAgICBwcml2YXRlIHN0YWxlQmFzZUNvbHVtbnMgPSBuZXcgTWFwPHN0cmluZywgeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd247IHRpbWU6IG51bWJlciB9W10+KCk7XG4gICAgcHJpdmF0ZSBzdGFsZUJhc2VGaWVsZHMgPSBuZXcgTWFwPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+KCk7XG5cbiAgICBnZXQgdG90YWxCeXRlcygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5yZWFkZXIudG90YWxCeXRlczsgfVxuICAgIGdldCByb3dDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5yZWFkZXIucm93Q291bnQ7IH1cblxuICAgIGlzTGl2ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5rZXlzLmhhcyhrZXkpOyB9XG5cbiAgICBzdGF0aWMgYXN5bmMgYnVpbGQ8VCBleHRlbmRzIHsga2V5OiBzdHJpbmcgfT4oY29uZmlnOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgc3RvcmFnZTogRmlsZVN0b3JhZ2U7XG4gICAgICAgIGJ1bGtGaWxlczogQnVsa0ZpbGVJbmZvW107XG4gICAgICAgIHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdO1xuICAgICAgICBzdWJDYWNoZXM6IFN1YlJlYWRlckNhY2hlcztcbiAgICAgICAgb25VbnJlYWRhYmxlRmlsZT86IChmaWxlOiBCdWxrRmlsZUluZm8sIG1lc3NhZ2U6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICB9KTogUHJvbWlzZTxMb2FkZWRJbmRleDxUPj4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCB7IGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMgfSA9IGNvbmZpZztcbiAgICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgdG9sZXJhdGVNaXNzaW5nID0gYXR0ZW1wdCA+PSBNQVhfUkVBRF9BVFRFTVBUUztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IFtidWxrUmVhZGVyc1Jhdywgc3RyZWFtRGF0YV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGJ1bGtGaWxlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBsb2FkRmlsZVJlYWRlcihjb25maWcubmFtZSwgY29uZmlnLnN0b3JhZ2UsIGYsIGNvbmZpZy5zdWJDYWNoZXMuYnVsayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNaXNzaW5nRmlsZUVycm9yKSB7IGZpbGVzQ2hhbmdlZCA9IHRydWU7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uVW5yZWFkYWJsZUZpbGUpIGF3YWl0IGNvbmZpZy5vblVucmVhZGFibGVGaWxlKGYsIChlIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGxvYWRTdHJlYW1FbnRyaWVzKGNvbmZpZy5uYW1lLCBjb25maWcuc3RvcmFnZSwgc3RyZWFtRmlsZXMsIGNvbmZpZy5zdWJDYWNoZXMuc3RyZWFtKSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtRGF0YS5taXNzaW5nKSBmaWxlc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlc0NoYW5nZWQgJiYgIXRvbGVyYXRlTWlzc2luZykgdGhyb3cgbmV3IEZpbGVzQ2hhbmdlZEVycm9yKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBidWxrUmVhZGVycyA9IGJ1bGtSZWFkZXJzUmF3LmZpbHRlcigocik6IHIgaXMgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlciA9PiAhIXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlcnM6IEJhc2VCdWxrRGF0YWJhc2VSZWFkZXJbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBzdHJlYW1UaW1lcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JkZXJlZCA9IG9yZGVyU3RyZWFtRW50cmllcyhzdHJlYW1EYXRhLmVudHJpZXMpO1xuICAgICAgICAgICAgICAgIGlmIChvcmRlcmVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBzdHJlYW1SZWFkZXJGcm9tRW50cmllcyhvcmRlcmVkLCBzdHJlYW1EYXRhLnRvdGFsQnl0ZXMpO1xuICAgICAgICAgICAgICAgICAgICByZWFkZXJzLnB1c2goc3RyZWFtLnJlYWRlcik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbVRpbWVzID0gc3RyZWFtLnRpbWVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWFkZXJzLnB1c2goLi4uYnVsa1JlYWRlcnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IGpvaW5CdWxrRGF0YWJhc2VzKHJlYWRlcnMpO1xuXG4gICAgICAgICAgICAgICAgcHJ1bmVTdWJDYWNoZXMoYnVsa0ZpbGVzLCBzdHJlYW1GaWxlcywgY29uZmlnLnN1YkNhY2hlcyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgIGlmIChlbGFwc2VkID4gNTApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJ5dGVzUmVhZCA9IHN0cmVhbURhdGEudG90YWxCeXRlcztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByIG9mIGJ1bGtSZWFkZXJzKSBieXRlc1JlYWQgKz0gci5jb2x1bW5zLmZpbmQoYyA9PiBjLmNvbHVtbiA9PT0gS0VZX0NPTFVNTik/LmJ5dGVTaXplID8/IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2JsdWUoY29uZmlnLm5hbWUpfSBsb2FkZWQgaW4gJHtyZWQoZm9ybWF0VGltZShlbGFwc2VkKSl9ICgke2JsdWUoZm9ybWF0TnVtYmVyKHJlYWRlci5yb3dDb3VudCkpfSByb3dzLCAke2J1bGtGaWxlcy5sZW5ndGh9IGJ1bGsgKyAke3N0cmVhbUZpbGVzLmxlbmd0aH0gc3RyZWFtIGZpbGVzLCByZWFkICR7Ymx1ZShmb3JtYXROdW1iZXIoYnl0ZXNSZWFkKSl9QilgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvYWRlZEluZGV4PFQ+KFxuICAgICAgICAgICAgICAgICAgICBjb25maWcubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGJ1bGtGaWxlcyxcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtRmlsZXMsXG4gICAgICAgICAgICAgICAgICAgIHJlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtVGltZXMsXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbURhdGEuc2l6ZXMsXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbURhdGEuZW50cmllcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbURhdGEudG90YWxCeXRlcyxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN1YkNhY2hlcyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRmlsZXNDaGFuZ2VkRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkb3B0cyB0aGUgcHJldmlvdXMgaW5kZXgncyBsb2FkZWQgYmFzZSB2YWx1ZXMgYXMgU1RBTEUgb24gdGhpcyBvbmUsIHNvIGEgc3luYyByZWFkIG1pZC1zd2FwIGNhbiBzZXJ2ZSB0aGUgb2xkIHZhbHVlIChwYXRjaGVkIHdpdGggdGhlIGN1cnJlbnQgb3ZlcmxheSkgaW5zdGVhZCBvZiBmbGFzaGluZyBlbXB0eSB3aGlsZSB0aGUgZnJlc2ggbG9hZCBydW5zLiBQZXItZW50cnk6IGRyb3BwZWQgd2hlbiB0aGUgZnJlc2ggdmFsdWUgbGFuZHMgaGVyZS5cbiAgICBpbmhlcml0U3RhbGVGcm9tKHByZXY6IExvYWRlZEluZGV4PFQ+KTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIHByZXYuYmFzZUNvbHVtbnMpIHRoaXMuc3RhbGVCYXNlQ29sdW1ucy5zZXQoaywgdik7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIHByZXYuc3RhbGVCYXNlQ29sdW1ucykgaWYgKCF0aGlzLnN0YWxlQmFzZUNvbHVtbnMuaGFzKGspKSB0aGlzLnN0YWxlQmFzZUNvbHVtbnMuc2V0KGssIHYpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBwcmV2LmJhc2VGaWVsZHMpIHRoaXMuc3RhbGVCYXNlRmllbGRzLnNldChrLCB2KTtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgcHJldi5zdGFsZUJhc2VGaWVsZHMpIGlmICghdGhpcy5zdGFsZUJhc2VGaWVsZHMuaGFzKGspKSB0aGlzLnN0YWxlQmFzZUZpZWxkcy5zZXQoaywgdik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0Q29sdW1uKGNvbHVtbjogc3RyaW5nKTogUHJvbWlzZTx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH1bXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0U2luZ2xlRmllbGQoa2V5OiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKTogUHJvbWlzZTx7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuZ2V0U2luZ2xlRmllbGQoa2V5LCBjb2x1bW4pO1xuICAgIH1cblxuICAgIGVuc3VyZUJhc2VDb2x1bW4oY29sdW1uOiBzdHJpbmcsIG9uTG9hZGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VDb2x1bW5zLmhhcyhjb2x1bW4pIHx8IHRoaXMuYmFzZUNvbHVtbnNMb2FkaW5nLmhhcyhjb2x1bW4pKSByZXR1cm47XG4gICAgICAgIHRoaXMuYmFzZUNvbHVtbnNMb2FkaW5nLmFkZChjb2x1bW4pO1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5yZWFkZXIuZ2V0Q29sdW1uKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlQ29sdW1ucy5zZXQoY29sdW1uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFsZUJhc2VDb2x1bW5zLmRlbGV0ZShjb2x1bW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZUNvbHVtbnNMb2FkaW5nLmRlbGV0ZShjb2x1bW4pO1xuICAgICAgICAgICAgICAgIG9uTG9hZGVkKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gc2NoZWR1bGVkIHJldHJ5IGV4aXN0czogY2xlYXJpbmcgdGhlIGxvYWRpbmcgZmxhZyBtYWtlcyB0aGUgTkVYVCByZWFkIHJlLWF0dGVtcHQgdGhlIGxvYWQsIGFuZCB1bnRpbCBvbmUgaGFwcGVucyB0aGUgdmFsdWUgc3RheXMgbWlzc2luZy9zdGFsZVxuICAgICAgICAgICAgICAgIHRoaXMuYmFzZUNvbHVtbnNMb2FkaW5nLmRlbGV0ZShjb2x1bW4pO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5uYW1lfS5nZXRDb2x1bW5TeW5jKCR7SlNPTi5zdHJpbmdpZnkoY29sdW1uKX0pIGxvYWQgZmFpbGVkICh0aGUgbmV4dCByZWFkIHJlLWF0dGVtcHRzIGl0KTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICB9XG5cbiAgICBlbnN1cmVCYXNlRmllbGQoa2V5OiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nLCBvbkxvYWRlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjayA9IG51bGxKb2luKGNvbHVtbiwga2V5KTtcbiAgICAgICAgaWYgKHRoaXMuYmFzZUZpZWxkcy5oYXMoY2spIHx8IHRoaXMuYmFzZUZpZWxkc0xvYWRpbmcuaGFzKGNrKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmJhc2VGaWVsZHNMb2FkaW5nLmFkZChjayk7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLnJlYWRlci5nZXRTaW5nbGVGaWVsZChrZXksIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlRmllbGRzLnNldChjaywgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhbGVCYXNlRmllbGRzLmRlbGV0ZShjayk7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlRmllbGRzTG9hZGluZy5kZWxldGUoY2spO1xuICAgICAgICAgICAgICAgIG9uTG9hZGVkKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlRmllbGRzTG9hZGluZy5kZWxldGUoY2spO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5uYW1lfS5nZXRTaW5nbGVGaWVsZFN5bmMoJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgJHtKU09OLnN0cmluZ2lmeShjb2x1bW4pfSkgbG9hZCBmYWlsZWQgKHRoZSBuZXh0IHJlYWQgcmUtYXR0ZW1wdHMgaXQpOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgdGhlIGxvYWRlZCB2YWx1ZSAoZnJlc2ggaWYgYXZhaWxhYmxlLCBlbHNlIGxhc3Qta25vd24gc3RhbGUpIGZvciB0aGUgY29sdW1uLCBvciB1bmRlZmluZWQgaWYgbmVpdGhlciBpcyBwcmVzZW50IHlldC4gVGhlIGJvb2xlYW4gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJldHVybmVkIHZhbHVlIGlzIGZyZXNoOyBjYWxsZXJzIG1heSBza2lwIGNhY2hpbmcgYSBzdGFsZSB2YWx1ZS5cbiAgICBnZXRCYXNlQ29sdW1uKGNvbHVtbjogc3RyaW5nKTogeyBlbnRyaWVzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH1bXTsgZnJlc2g6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IGZyZXNoID0gdGhpcy5iYXNlQ29sdW1ucy5nZXQoY29sdW1uKTtcbiAgICAgICAgaWYgKGZyZXNoKSByZXR1cm4geyBlbnRyaWVzOiBmcmVzaCwgZnJlc2g6IHRydWUgfTtcbiAgICAgICAgY29uc3Qgc3RhbGUgPSB0aGlzLnN0YWxlQmFzZUNvbHVtbnMuZ2V0KGNvbHVtbik7XG4gICAgICAgIGlmIChzdGFsZSkgcmV0dXJuIHsgZW50cmllczogc3RhbGUsIGZyZXNoOiBmYWxzZSB9O1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGdldEJhc2VGaWVsZChrZXk6IHN0cmluZywgY29sdW1uOiBzdHJpbmcpOiB7IHZhbHVlOiB7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZDsgZnJlc2g6IGJvb2xlYW47IGxvYWRlZDogYm9vbGVhbiB9IHtcbiAgICAgICAgY29uc3QgY2sgPSBudWxsSm9pbihjb2x1bW4sIGtleSk7XG4gICAgICAgIGlmICh0aGlzLmJhc2VGaWVsZHMuaGFzKGNrKSkgcmV0dXJuIHsgdmFsdWU6IHRoaXMuYmFzZUZpZWxkcy5nZXQoY2spLCBmcmVzaDogdHJ1ZSwgbG9hZGVkOiB0cnVlIH07XG4gICAgICAgIGlmICh0aGlzLnN0YWxlQmFzZUZpZWxkcy5oYXMoY2spKSByZXR1cm4geyB2YWx1ZTogdGhpcy5zdGFsZUJhc2VGaWVsZHMuZ2V0KGNrKSwgZnJlc2g6IGZhbHNlLCBsb2FkZWQ6IHRydWUgfTtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZnJlc2g6IGZhbHNlLCBsb2FkZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaXNCYXNlQ29sdW1uTG9hZGVkKGNvbHVtbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2x1bW5zLmhhcyhjb2x1bW4pIHx8IHRoaXMuc3RhbGVCYXNlQ29sdW1ucy5oYXMoY29sdW1uKTtcbiAgICB9XG5cbiAgICBpc0Jhc2VGaWVsZExvYWRlZChrZXk6IHN0cmluZywgY29sdW1uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY2sgPSBudWxsSm9pbihjb2x1bW4sIGtleSk7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VGaWVsZHMuaGFzKGNrKSB8fCB0aGlzLnN0YWxlQmFzZUZpZWxkcy5oYXMoY2spO1xuICAgIH1cblxuICAgIC8vIERyb3BzIGluLW1lbW9yeSBsb2FkZWQgdmFsdWVzIGZvciB0aGlzIGluZGV4LCBzbyBhIHN1YnNlcXVlbnQgcmVhZCByZWxvYWRzIGZyZXNoIGZyb20gZGlzay4gVXNlZCBieSByZWxvYWRGcm9tRGlzaygpIOKAlCBhIGhhcmQgcmVzZXQsIG5vIHN0YWxlIGZhbGxiYWNrIHN1cnZpdmVzLlxuICAgIGRyb3BMb2FkZWRWYWx1ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYmFzZUNvbHVtbnMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5iYXNlQ29sdW1uc0xvYWRpbmcuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5iYXNlRmllbGRzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuYmFzZUZpZWxkc0xvYWRpbmcuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zdGFsZUJhc2VDb2x1bW5zLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc3RhbGVCYXNlRmllbGRzLmNsZWFyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFrZVJhd0dldFJhbmdlKHN0b3JhZ2U6IEZpbGVTdG9yYWdlLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHJhd0dldFJhbmdlOiBHZXRSYW5nZTsgc2l6ZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgc3RvcmFnZS5nZXRJbmZvKGZpbGVOYW1lKTtcbiAgICBpZiAoIWluZm8pIHRocm93IG5ldyBNaXNzaW5nRmlsZUVycm9yKGBidWxrIGZpbGUgJHtmaWxlTmFtZX0gaXMgbWlzc2luZ2ApO1xuICAgIGNvbnN0IHJhd0dldFJhbmdlOiBHZXRSYW5nZSA9IGFzeW5jIChzdGFydCwgZW5kKSA9PiB7XG4gICAgICAgIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiBFTVBUWV9CVUZGRVI7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHN0b3JhZ2UuZ2V0UmFuZ2UoZmlsZU5hbWUsIHsgc3RhcnQsIGVuZCB9KTtcbiAgICAgICAgaWYgKCFidWYpIHRocm93IG5ldyBNaXNzaW5nRmlsZUVycm9yKGByYW5nZSBbJHtzdGFydH0sICR7ZW5kfSkgb2YgJHtmaWxlTmFtZX0gaXMgbWlzc2luZ2ApO1xuICAgICAgICByZXR1cm4gYnVmO1xuICAgIH07XG4gICAgcmV0dXJuIHsgcmF3R2V0UmFuZ2UsIHNpemU6IGluZm8uc2l6ZSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEZpbGVSZWFkZXIobmFtZTogc3RyaW5nLCBzdG9yYWdlOiBGaWxlU3RvcmFnZSwgZjogQnVsa0ZpbGVJbmZvLCBjYWNoZTogTWFwPHN0cmluZywgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlcj4pOiBQcm9taXNlPEJhc2VCdWxrRGF0YWJhc2VSZWFkZXI+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoZi5maWxlTmFtZSk7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICBjb25zdCByYXcgPSBhd2FpdCBtYWtlUmF3R2V0UmFuZ2Uoc3RvcmFnZSwgZi5maWxlTmFtZSk7XG4gICAgY29uc3QgZmlsZUlkID0gbnVsbEpvaW4obmFtZSwgZi5maWxlTmFtZSk7XG4gICAgY29uc3Qgb3BlbmVkID0gYXdhaXQgYmxvY2tDYWNoZS5vcGVuKGZpbGVJZCwgcmF3LnNpemUsIHJhdy5yYXdHZXRSYW5nZSk7XG4gICAgY29uc3QgcmVhZGVyID0gYXdhaXQgbG9hZEJ1bGtEYXRhYmFzZSh7IHRvdGFsQnl0ZXM6IG9wZW5lZC51bmNvbXByZXNzZWRTaXplLCBnZXRSYW5nZTogb3BlbmVkLmdldFJhbmdlLCBuYW1lOiBgJHtCVUxLX1JPT1RfRk9MREVSfS8ke25hbWV9LyR7Zi5maWxlTmFtZX1gIH0pO1xuICAgIGNhY2hlLnNldChmLmZpbGVOYW1lLCByZWFkZXIpO1xuICAgIHJldHVybiByZWFkZXI7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkU3RyZWFtRW50cmllcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RvcmFnZTogRmlsZVN0b3JhZ2UsXG4gICAgc3RyZWFtRmlsZXM6IFN0cmVhbUZpbGVJbmZvW10sXG4gICAgY2FjaGU6IE1hcDxzdHJpbmcsIFN0cmVhbVJlYWRlckNhY2hlRW50cnk+LFxuKTogUHJvbWlzZTx7IGVudHJpZXM6IHsgdGltZTogbnVtYmVyOyBmaWxlTmFtZTogc3RyaW5nOyBlbnRyeTogU3RyZWFtRW50cnkgfVtdOyB0b3RhbEJ5dGVzOiBudW1iZXI7IG1pc3Npbmc6IGJvb2xlYW47IHNpemVzOiBNYXA8c3RyaW5nLCBudW1iZXI+IH0+IHtcbiAgICBjb25zdCBzaXplcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgaWYgKCFzdHJlYW1GaWxlcy5sZW5ndGgpIHJldHVybiB7IGVudHJpZXM6IFtdLCB0b3RhbEJ5dGVzOiAwLCBtaXNzaW5nOiBmYWxzZSwgc2l6ZXMgfTtcbiAgICBsZXQgbWlzc2luZyA9IGZhbHNlO1xuICAgIGNvbnN0IHBlckZpbGUgPSBhd2FpdCBQcm9taXNlLmFsbChzdHJlYW1GaWxlcy5tYXAoYXN5bmMgKGYpOiBQcm9taXNlPHsgZmlsZU5hbWU6IHN0cmluZzsgc2l6ZTogbnVtYmVyOyBlbnRyaWVzOiBTdHJlYW1FbnRyeVtdIH0gfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBzdG9yYWdlLmdldEluZm8oZi5maWxlTmFtZSk7XG4gICAgICAgICAgICBpZiAoIWluZm8pIHsgbWlzc2luZyA9IHRydWU7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBpbmZvLnNpemU7XG4gICAgICAgICAgICBzaXplcy5zZXQoZi5maWxlTmFtZSwgc2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoZi5maWxlTmFtZSk7XG4gICAgICAgICAgICBpZiAoY2FjaGVkICYmIGNhY2hlZC5yZWFkU2l6ZSA9PT0gc2l6ZSkgcmV0dXJuIHsgZmlsZU5hbWU6IGYuZmlsZU5hbWUsIHNpemUsIGVudHJpZXM6IGNhY2hlZC5lbnRyaWVzIH07XG4gICAgICAgICAgICBpZiAoc2l6ZSA9PT0gMCkgeyBjYWNoZS5zZXQoZi5maWxlTmFtZSwgeyByZWFkU2l6ZTogMCwgcGFyc2VkUG9zOiAwLCBlbnRyaWVzOiBbXSB9KTsgcmV0dXJuIHsgZmlsZU5hbWU6IGYuZmlsZU5hbWUsIHNpemU6IDAsIGVudHJpZXM6IFtdIH07IH1cbiAgICAgICAgICAgIC8vIEFwcGVuZC1vbmx5OiBhIGxhcmdlciBzaXplIG1lYW5zIG5ldyBieXRlcyBhdCB0aGUgdGFpbCwgcGFyc2Ugb25seSB0aG9zZS5cbiAgICAgICAgICAgIGlmIChjYWNoZWQgJiYgc2l6ZSA+IGNhY2hlZC5yZWFkU2l6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGF3YWl0IHN0b3JhZ2UuZ2V0UmFuZ2UoZi5maWxlTmFtZSwgeyBzdGFydDogY2FjaGVkLnBhcnNlZFBvcywgZW5kOiBzaXplIH0pO1xuICAgICAgICAgICAgICAgIGlmICghc3VmZml4KSB7IG1pc3NpbmcgPSB0cnVlOyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VTdHJlYW0oc3VmZml4KTtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmJhZEJ5dGVzID4gMCkgY29uc29sZS53YXJuKGAke25hbWV9IHN0cmVhbSBmaWxlICR7Zi5maWxlTmFtZX0gaGFkICR7cGFyc2VkLmJhZEJ5dGVzfSB0cmFpbGluZyBiYWQvaW5jb21wbGV0ZSBieXRlcyAoc3RvcHBlZCByZWFkaW5nIHRoZXJlKWApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBwYXJzZWQuZW50cmllcy5sZW5ndGggPyBjYWNoZWQuZW50cmllcy5jb25jYXQocGFyc2VkLmVudHJpZXMpIDogY2FjaGVkLmVudHJpZXM7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkUG9zID0gY2FjaGVkLnBhcnNlZFBvcyArIChzdWZmaXgubGVuZ3RoIC0gcGFyc2VkLmJhZEJ5dGVzKTtcbiAgICAgICAgICAgICAgICBjYWNoZS5zZXQoZi5maWxlTmFtZSwgeyByZWFkU2l6ZTogc2l6ZSwgcGFyc2VkUG9zLCBlbnRyaWVzIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGZpbGVOYW1lOiBmLmZpbGVOYW1lLCBzaXplLCBlbnRyaWVzIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBzdG9yYWdlLmdldFJhbmdlKGYuZmlsZU5hbWUsIHsgc3RhcnQ6IDAsIGVuZDogc2l6ZSB9KTtcbiAgICAgICAgICAgIGlmICghYnVmZmVyKSB7IG1pc3NpbmcgPSB0cnVlOyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVN0cmVhbShidWZmZXIpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZC5iYWRCeXRlcyA+IDApIGNvbnNvbGUud2FybihgJHtuYW1lfSBzdHJlYW0gZmlsZSAke2YuZmlsZU5hbWV9IGhhZCAke3BhcnNlZC5iYWRCeXRlc30gdHJhaWxpbmcgYmFkL2luY29tcGxldGUgYnl0ZXMgKHN0b3BwZWQgcmVhZGluZyB0aGVyZSlgKTtcbiAgICAgICAgICAgIGNhY2hlLnNldChmLmZpbGVOYW1lLCB7IHJlYWRTaXplOiBzaXplLCBwYXJzZWRQb3M6IHNpemUgLSBwYXJzZWQuYmFkQnl0ZXMsIGVudHJpZXM6IHBhcnNlZC5lbnRyaWVzIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgZmlsZU5hbWU6IGYuZmlsZU5hbWUsIHNpemUsIGVudHJpZXM6IHBhcnNlZC5lbnRyaWVzIH07XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgbWlzc2luZyA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfSkpO1xuICAgIGNvbnN0IGVudHJpZXM6IHsgdGltZTogbnVtYmVyOyBmaWxlTmFtZTogc3RyaW5nOyBlbnRyeTogU3RyZWFtRW50cnkgfVtdID0gW107XG4gICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgIGZvciAoY29uc3QgcGYgb2YgcGVyRmlsZSkge1xuICAgICAgICBpZiAoIXBmKSBjb250aW51ZTtcbiAgICAgICAgdG90YWxCeXRlcyArPSBwZi5zaXplO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBmLmVudHJpZXMpIGVudHJpZXMucHVzaCh7IHRpbWU6IGVudHJ5LnRpbWUsIGZpbGVOYW1lOiBwZi5maWxlTmFtZSwgZW50cnkgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IGVudHJpZXMsIHRvdGFsQnl0ZXMsIG1pc3NpbmcsIHNpemVzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcmRlclN0cmVhbUVudHJpZXMoZW50cmllczogeyB0aW1lOiBudW1iZXI7IGZpbGVOYW1lOiBzdHJpbmc7IGVudHJ5OiBTdHJlYW1FbnRyeSB9W10pOiBTdHJlYW1FbnRyeVtdIHtcbiAgICBlbnRyaWVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGEudGltZSAhPT0gYi50aW1lKSByZXR1cm4gYS50aW1lIC0gYi50aW1lO1xuICAgICAgICByZXR1cm4gYS5maWxlTmFtZSA8IGIuZmlsZU5hbWUgJiYgLTEgfHwgYS5maWxlTmFtZSA+IGIuZmlsZU5hbWUgJiYgMSB8fCAwO1xuICAgIH0pO1xuICAgIHJldHVybiBlbnRyaWVzLm1hcChlID0+IGUuZW50cnkpO1xufVxuXG5mdW5jdGlvbiBwcnVuZVN1YkNhY2hlcyhidWxrRmlsZXM6IEJ1bGtGaWxlSW5mb1tdLCBzdHJlYW1GaWxlczogU3RyZWFtRmlsZUluZm9bXSwgc3ViQ2FjaGVzOiBTdWJSZWFkZXJDYWNoZXMpIHtcbiAgICBjb25zdCBsaXZlQnVsayA9IG5ldyBTZXQoYnVsa0ZpbGVzLm1hcChmID0+IGYuZmlsZU5hbWUpKTtcbiAgICBjb25zdCBsaXZlU3RyZWFtID0gbmV3IFNldChzdHJlYW1GaWxlcy5tYXAoZiA9PiBmLmZpbGVOYW1lKSk7XG4gICAgZm9yIChjb25zdCBuIG9mIHN1YkNhY2hlcy5idWxrLmtleXMoKSkgaWYgKCFsaXZlQnVsay5oYXMobikpIHN1YkNhY2hlcy5idWxrLmRlbGV0ZShuKTtcbiAgICBmb3IgKGNvbnN0IG4gb2Ygc3ViQ2FjaGVzLnN0cmVhbS5rZXlzKCkpIGlmICghbGl2ZVN0cmVhbS5oYXMobikpIHN1YkNhY2hlcy5zdHJlYW0uZGVsZXRlKG4pO1xufVxuXG4vLyBBIGNvcnJ1cHQvdW5yZWFkYWJsZSBjb2x1bW4gaW4gT05FIHVuZGVybHlpbmcgZmlsZSBtdXN0IG5vdCBicmVhayB0aGUgd2hvbGUgam9pbmVkIHJlYWQuIFdoZW4gYSBzb3VyY2UncyBjb2x1bW4gcmVhZCB0aHJvd3MsIHdlIGRyb3AgdGhhdCBzb3VyY2UgZm9yIHRoYXQgY29sdW1uIChmYWxsaW5nIHRocm91Z2ggdG8gb2xkZXIgcmVhZGVycywgZXhhY3RseSBhcyBpZiB0aGUgZmlsZSBuZXZlciBzZXQgdGhlIGNvbHVtbikgYW5kIHdhcm4gb25jZSBwZXIgKGZpbGUsIGNvbHVtbikgc28gdGhlIGNvcnJ1cHRpb24gaXMgdmlzaWJsZSB3aXRob3V0IGZsb29kaW5nIHRoZSBsb2cgb24gZXZlcnkgcmVidWlsZC5cbmNvbnN0IHdhcm5lZENvcnJ1cHRSZWFkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuZnVuY3Rpb24gd2FybkNvcnJ1cHRSZWFkKGRiOiBCYXNlQnVsa0RhdGFiYXNlUmVhZGVyLCBjb2x1bW46IHN0cmluZywgZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSBkYi5uYW1lIHx8IFwiKHVua25vd24gc291cmNlKVwiO1xuICAgIGNvbnN0IGRlZHVwZUtleSA9IG51bGxKb2luKHBhdGgsIGNvbHVtbik7XG4gICAgaWYgKHdhcm5lZENvcnJ1cHRSZWFkcy5oYXMoZGVkdXBlS2V5KSkgcmV0dXJuO1xuICAgIHdhcm5lZENvcnJ1cHRSZWFkcy5hZGQoZGVkdXBlS2V5KTtcbiAgICBjb25zb2xlLndhcm4oYCR7cmVkKFwiY29ycnVwdCByZWFkXCIpfTogZmlsZSAke3BhdGh9IGNvbHVtbiAke0pTT04uc3RyaW5naWZ5KGNvbHVtbil9IGNvdWxkIG5vdCBiZSByZWFkIC0gc2tpcHBpbmcgaXQgKGl0cyBkYXRhIGlzIGRyb3BwZWQgZnJvbSByZXN1bHRzKTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbn1cblxuZnVuY3Rpb24gam9pbkJ1bGtEYXRhYmFzZXMoZGF0YWJhc2VzOiBCYXNlQnVsa0RhdGFiYXNlUmVhZGVyW10pOiBSZXNvbHZlZFJlYWRlciB7XG4gICAgY29uc3QgZGVsZXRlVGltZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgZm9yIChjb25zdCBkYiBvZiBkYXRhYmFzZXMpIHtcbiAgICAgICAgaWYgKCFkYi5kZWxldGVUaW1lcykgY29udGludWU7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdF0gb2YgZGIuZGVsZXRlVGltZXMpIGRlbGV0ZVRpbWUuc2V0KGtleSwgTWF0aC5tYXgoZGVsZXRlVGltZS5nZXQoa2V5KSA/PyAtSW5maW5pdHksIHQpKTtcbiAgICB9XG4gICAgY29uc3Qga2V5VGltZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgZm9yIChjb25zdCBkYiBvZiBkYXRhYmFzZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB0XSBvZiBkYi5rZXlUaW1lcykga2V5VGltZS5zZXQoa2V5LCBNYXRoLm1heChrZXlUaW1lLmdldChrZXkpID8/IC1JbmZpbml0eSwgdCkpO1xuICAgIH1cbiAgICBjb25zdCBkZWxPZiA9IChrZXk6IHN0cmluZykgPT4gZGVsZXRlVGltZS5nZXQoa2V5KSA/PyAtSW5maW5pdHk7XG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHRdIG9mIGtleVRpbWUpIGlmICh0ID4gZGVsT2Yoa2V5KSkga2V5cy5wdXNoKGtleSk7XG5cbiAgICBjb25zdCBjb2x1bW5zOiB7IGNvbHVtbjogc3RyaW5nOyBieXRlU2l6ZTogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGNvbnN0IGNvbHVtbkJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCB7IGNvbHVtbjogc3RyaW5nOyBieXRlU2l6ZTogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChjb25zdCBkYiBvZiBkYXRhYmFzZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgZGIuY29sdW1ucykge1xuICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gY29sdW1uQnlOYW1lLmdldChjb2wuY29sdW1uKTtcbiAgICAgICAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICBleGlzdGluZyA9IHsgY29sdW1uOiBjb2wuY29sdW1uLCBieXRlU2l6ZTogMCB9O1xuICAgICAgICAgICAgICAgIGNvbHVtbkJ5TmFtZS5zZXQoY29sLmNvbHVtbiwgZXhpc3RpbmcpO1xuICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaChleGlzdGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBleGlzdGluZy5ieXRlU2l6ZSArPSBjb2wuYnl0ZVNpemU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0b3RhbEJ5dGVzOiBkYXRhYmFzZXMucmVkdWNlKChhY2MsIGRiKSA9PiBhY2MgKyBkYi50b3RhbEJ5dGVzLCAwKSxcbiAgICAgICAgcm93Q291bnQ6IGtleXMubGVuZ3RoLFxuICAgICAgICBrZXlzLFxuICAgICAgICByYXdLZXlDb3VudDogZGF0YWJhc2VzLnJlZHVjZSgoYWNjLCBkYikgPT4gYWNjICsgZGIua2V5VGltZXMuc2l6ZSArIChkYi5kZWxldGVUaW1lcz8uc2l6ZSA/PyAwKSwgMCksXG4gICAgICAgIHJlYWRlckNvdW50OiBkYXRhYmFzZXMubGVuZ3RoLFxuICAgICAgICBjb2x1bW5zLFxuICAgICAgICBrZXlUaW1lczoga2V5VGltZSxcbiAgICAgICAgZGVsZXRlVGltZXM6IGRlbGV0ZVRpbWUsXG4gICAgICAgIGFzeW5jIGdldENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHBlclJlYWRlciA9IGF3YWl0IFByb21pc2UuYWxsKGRhdGFiYXNlcy5tYXAoYXN5bmMgZGIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZGIuY29sdW1ucy5zb21lKGMgPT4gYy5jb2x1bW4gPT09IGNvbHVtbikpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGRiLmdldENvbHVtbihjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1hcChlbnRyaWVzLm1hcChlID0+IFtlLmtleSwgeyB2YWx1ZTogZS52YWx1ZSwgdGltZTogZS50aW1lIH1dKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuQ29ycnVwdFJlYWQoZGIsIGNvbHVtbiwgZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIGtleXMubWFwKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJlc3RUaW1lID0gLUluZmluaXR5O1xuICAgICAgICAgICAgICAgIGxldCBiZXN0VmFsOiB1bmtub3duO1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbSBvZiBwZXJSZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IG0gJiYgbS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsIHx8IGNlbGwudmFsdWUgPT09IEFCU0VOVCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjZWxsLnRpbWUgPiBiZXN0VGltZSkgeyBiZXN0VGltZSA9IGNlbGwudGltZTsgYmVzdFZhbCA9IGNlbGwudmFsdWU7IGZvdW5kID0gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsaXZlID0gZm91bmQgJiYgYmVzdFRpbWUgPiBkZWxPZihrZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGtleSwgdmFsdWU6IGxpdmUgPyBiZXN0VmFsIDogdW5kZWZpbmVkLCB0aW1lOiBsaXZlID8gYmVzdFRpbWUgOiAoa2V5VGltZS5nZXQoa2V5KSA/PyAwKSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldFNpbmdsZUZpZWxkKGtleSwgY29sdW1uKSB7XG4gICAgICAgICAgICBjb25zdCBrdCA9IGtleVRpbWUuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoa3QgPT09IHVuZGVmaW5lZCB8fCBrdCA8PSBkZWxPZihrZXkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgbGV0IGJlc3RUaW1lID0gLUluZmluaXR5O1xuICAgICAgICAgICAgbGV0IGJlc3RWYWw6IHVua25vd247XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZGIgb2YgZGF0YWJhc2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkYi5jb2x1bW5zLnNvbWUoYyA9PiBjLmNvbHVtbiA9PT0gY29sdW1uKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHI7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgciA9IGF3YWl0IGRiLmdldFNpbmdsZUZpZWxkKGtleSwgY29sdW1uKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5Db3JydXB0UmVhZChkYiwgY29sdW1uLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyID09PSBBQlNFTlQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChyLnRpbWUgPiBiZXN0VGltZSkgeyBiZXN0VGltZSA9IHIudGltZTsgYmVzdFZhbCA9IHIudmFsdWU7IGZvdW5kID0gdHJ1ZTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbGl2ZSA9IGZvdW5kICYmIGJlc3RUaW1lID4gZGVsT2Yoa2V5KTtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBsaXZlID8gYmVzdFZhbCA6IHVuZGVmaW5lZCwgdGltZTogbGl2ZSA/IGJlc3RUaW1lIDoga3QgfTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuIl19
|
|
426
|
-
/* _JS_SOURCE_HASH = "
|
|
425
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZGVkSW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJMb2FkZWRJbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2REFBa0g7QUFDbEgsNkNBQW9EO0FBQ3BELDJDQUFrRztBQUNsRyxrRUFBaUY7QUFDakYsd0VBQXFFO0FBRXJFLG9JQUFvSTtBQUNwSSxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBTzFDLE1BQWEsZ0JBQWlCLFNBQVEsS0FBSztDQUFJO0FBQS9DLDRDQUErQztBQUMvQyxNQUFNLGlCQUFrQixTQUFRLEtBQUs7Q0FBSTtBQW9CekMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFFNUIsU0FBUyxRQUFRLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDbEMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELG9XQUFvVztBQUNwVyxNQUFhLFdBQVc7SUFDcEIsWUFDb0IsSUFBWSxFQUNaLE9BQW9CLEVBQ3BCLFNBQXlCLEVBQ3pCLFdBQTZCLEVBQzdCLE1BQXNCLEVBQ3RCLFdBQWdDLEVBQ2hDLFdBQWdDLEVBQ2hDLGdCQUF3QixFQUN4QixpQkFBeUIsRUFDekIsU0FBMEI7UUFUMUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDcEIsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUFDekIsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLGdCQUFXLEdBQVgsV0FBVyxDQUFxQjtRQUNoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7UUFDaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFRO1FBQ3hCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBUTtRQUN6QixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQVN0QyxnQkFBVyxHQUFHLElBQUks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QUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1QsZUFBZSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQy9CLFNBQVM7Z0JBQ2IsQ0FBQztnQkFDRCxJQUFJLENBQUMsS0FBSywyQkFBTTtvQkFBRSxTQUFTO2dCQUMzQixJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxFQUFFLENBQUM7b0JBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztnQkFBQyxDQUFDO1lBQ2xGLENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxLQUFLLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3RSxDQUFDO0tBQ0osQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZpbGVTdG9yYWdlIH0gZnJvbSBcIi4uL0ZpbGVGb2xkZXJBUElcIjtcbmltcG9ydCB7IEFCU0VOVCwgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlciwgRU1QVFlfQlVGRkVSLCBLRVlfQ09MVU1OLCBsb2FkQnVsa0RhdGFiYXNlIH0gZnJvbSBcIi4vQnVsa0RhdGFiYXNlRm9ybWF0XCI7XG5pbXBvcnQgeyBibG9ja0NhY2hlLCBHZXRSYW5nZSB9IGZyb20gXCIuL2Jsb2NrQ2FjaGVcIjtcbmltcG9ydCB7IFNUUkVBTV9FWFRFTlNJT04sIFN0cmVhbUVudHJ5LCBwYXJzZVN0cmVhbSwgc3RyZWFtUmVhZGVyRnJvbUVudHJpZXMgfSBmcm9tIFwiLi9zdHJlYW1Mb2dcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyBibHVlLCByZWQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuXG4vLyBEdXBsaWNhdGVkIGZyb20gQnVsa0RhdGFiYXNlQmFzZSB0byBhdm9pZCBhIGNpcmN1bGFyIGltcG9ydCDigJQgdXNlZCBvbmx5IHRvIGJ1aWxkIGEgZnVsbGVyIHN0b3JhZ2UtcmVsYXRpdmUgcGF0aCBmb3IgbG9nIG1lc3NhZ2VzLlxuY29uc3QgQlVMS19ST09UX0ZPTERFUiA9IFwiYnVsa0RhdGFiYXNlczJcIjtcblxuZXhwb3J0IHR5cGUgQnVsa0ZpbGVJbmZvID0geyBmaWxlTmFtZTogc3RyaW5nOyBsZXZlbDogbnVtYmVyOyB0aW1lc3RhbXA6IG51bWJlciB9O1xuLy8gb3duZXJJZCBpcyB0aGUgd3JpdGVyIHRoYXQgbWF5IHN0aWxsIGJlIGFwcGVuZGluZyB0byB0aGlzIGZpbGU7IHVuZGVmaW5lZCBmb3IgbGVnYWN5IG5hbWVzIHRoYXQgcHJlZGF0ZSB0aGUgc3RhbXAgKG5vdGhpbmcgYXBwZW5kcyB0byB0aG9zZSBhbnltb3JlKS5cbmV4cG9ydCB0eXBlIFN0cmVhbUZpbGVJbmZvID0geyBmaWxlTmFtZTogc3RyaW5nOyB0aW1lc3RhbXA6IG51bWJlcjsgb3duZXJJZD86IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgU3RyZWFtUmVhZGVyQ2FjaGVFbnRyeSA9IHsgcmVhZFNpemU6IG51bWJlcjsgcGFyc2VkUG9zOiBudW1iZXI7IGVudHJpZXM6IFN0cmVhbUVudHJ5W10gfTtcblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdGaWxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7IH1cbmNsYXNzIEZpbGVzQ2hhbmdlZEVycm9yIGV4dGVuZHMgRXJyb3IgeyB9XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVkUmVhZGVyID0ge1xuICAgIHJvd0NvdW50OiBudW1iZXI7XG4gICAgdG90YWxCeXRlczogbnVtYmVyO1xuICAgIGtleXM6IHN0cmluZ1tdO1xuICAgIHJhd0tleUNvdW50OiBudW1iZXI7XG4gICAgcmVhZGVyQ291bnQ6IG51bWJlcjtcbiAgICBjb2x1bW5zOiB7IGNvbHVtbjogc3RyaW5nOyBieXRlU2l6ZTogbnVtYmVyIH1bXTtcbiAgICBrZXlUaW1lczogTWFwPHN0cmluZywgbnVtYmVyPjtcbiAgICBkZWxldGVUaW1lczogTWFwPHN0cmluZywgbnVtYmVyPjtcbiAgICBnZXRDb2x1bW46IChjb2x1bW46IHN0cmluZykgPT4gUHJvbWlzZTx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH1bXT47XG4gICAgZ2V0U2luZ2xlRmllbGQ6IChrZXk6IHN0cmluZywgY29sdW1uOiBzdHJpbmcpID0+IFByb21pc2U8eyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+O1xufTtcblxuZXhwb3J0IHR5cGUgU3ViUmVhZGVyQ2FjaGVzID0ge1xuICAgIGJ1bGs6IE1hcDxzdHJpbmcsIEJhc2VCdWxrRGF0YWJhc2VSZWFkZXI+O1xuICAgIHN0cmVhbTogTWFwPHN0cmluZywgU3RyZWFtUmVhZGVyQ2FjaGVFbnRyeT47XG59O1xuXG5jb25zdCBNQVhfUkVBRF9BVFRFTVBUUyA9IDg7XG5cbmZ1bmN0aW9uIG51bGxKb2luKGE6IHN0cmluZywgYjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYSArIFN0cmluZy5mcm9tQ2hhckNvZGUoMCkgKyBiO1xufVxuXG4vLyBBIGxvYWRlZCBzbmFwc2hvdCBvZiBvbmUgY29sbGVjdGlvbidzIG9uLWRpc2sgc3RhdGU6IHRoZSByZXNvbHZlZCByZWFkZXIgKyB0aGUgcGVyLWZpbGUgZGVjb2RlZCBzdWItIHJlYWRlcnMgaXQgc3RpdGNoZWQsIHRoZSBzdHJlYW0gZmlsZSBzaXplcy90aW1lcyBpdCBvYnNlcnZlZCwgYW5kIHRoZSBzeW5jIChyZWFjdGl2ZSkgY2FjaGVzIHRoYXQgc3VyZmFjZSBjb2x1bW4vZmllbGQgcmVhZHMuIEJ1aWx0IG9uY2UgdmlhIExvYWRlZEluZGV4LmJ1aWxkIOKAlCBlYWdlcmx5LCBzbyB0aGUgc3dhcCBpbnRvIGEgZnJlc2ggTG9hZGVkSW5kZXggbmV2ZXIgYmxvY2tzIGEgcmVhZCBvbiBhIHN5bmNocm9ub3VzIHJlYnVpbGQuXG5leHBvcnQgY2xhc3MgTG9hZGVkSW5kZXg8VCBleHRlbmRzIHsga2V5OiBzdHJpbmcgfT4ge1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdG9yYWdlOiBGaWxlU3RvcmFnZSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGJ1bGtGaWxlczogQnVsa0ZpbGVJbmZvW10sXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdHJlYW1GaWxlczogU3RyZWFtRmlsZUluZm9bXSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlYWRlcjogUmVzb2x2ZWRSZWFkZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzdHJlYW1UaW1lczogTWFwPHN0cmluZywgbnVtYmVyPixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0cmVhbVNpemVzOiBNYXA8c3RyaW5nLCBudW1iZXI+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RyZWFtUm93c09uRGlzazogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RyZWFtQnl0ZXNPbkRpc2s6IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN1YkNhY2hlczogU3ViUmVhZGVyQ2FjaGVzLFxuICAgICkge1xuICAgICAgICB0aGlzLmtleXMgPSBuZXcgU2V0KHJlYWRlci5rZXlzKTtcbiAgICAgICAgdGhpcy5maWxlU2V0ID0gbmV3IFNldChbLi4uYnVsa0ZpbGVzLm1hcChmID0+IGYuZmlsZU5hbWUpLCAuLi5zdHJlYW1GaWxlcy5tYXAoZiA9PiBmLmZpbGVOYW1lKV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSBrZXlzOiBTZXQ8c3RyaW5nPjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlsZVNldDogU2V0PHN0cmluZz47XG5cbiAgICBwcml2YXRlIGJhc2VDb2x1bW5zID0gbmV3IE1hcDxzdHJpbmcsIHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfVtdPigpO1xuICAgIHByaXZhdGUgYmFzZUNvbHVtbnNMb2FkaW5nID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBiYXNlRmllbGRzID0gbmV3IE1hcDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IHRpbWU6IG51bWJlciB9IHwgdW5kZWZpbmVkPigpO1xuICAgIHByaXZhdGUgYmFzZUZpZWxkc0xvYWRpbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAvLyBMYXN0LWtub3duIHZhbHVlcyBmcm9tIHRoZSBwcmV2aW91cyBpbmRleCwgc2VydmVkIHVudGlsIHRoaXMgaW5kZXggbG9hZHMgaXRzIG93biBmcmVzaCB2YWx1ZSwgc28gYSBzd2FwIGRvZXNuJ3QgZmxhc2ggZW1wdHkgaW4gc3luYyByZWFkcy4gQ2xlYXJlZCBwZXItZW50cnkgd2hlbiB0aGUgZnJlc2ggdmFsdWUgbGFuZHMuXG4gICAgcHJpdmF0ZSBzdGFsZUJhc2VDb2x1bW5zID0gbmV3IE1hcDxzdHJpbmcsIHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duOyB0aW1lOiBudW1iZXIgfVtdPigpO1xuICAgIHByaXZhdGUgc3RhbGVCYXNlRmllbGRzID0gbmV3IE1hcDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IHRpbWU6IG51bWJlciB9IHwgdW5kZWZpbmVkPigpO1xuXG4gICAgZ2V0IHRvdGFsQnl0ZXMoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMucmVhZGVyLnRvdGFsQnl0ZXM7IH1cbiAgICBnZXQgcm93Q291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMucmVhZGVyLnJvd0NvdW50OyB9XG5cbiAgICBpc0xpdmUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMua2V5cy5oYXMoa2V5KTsgfVxuXG4gICAgc3RhdGljIGFzeW5jIGJ1aWxkPFQgZXh0ZW5kcyB7IGtleTogc3RyaW5nIH0+KGNvbmZpZzoge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHN0b3JhZ2U6IEZpbGVTdG9yYWdlO1xuICAgICAgICBidWxrRmlsZXM6IEJ1bGtGaWxlSW5mb1tdO1xuICAgICAgICBzdHJlYW1GaWxlczogU3RyZWFtRmlsZUluZm9bXTtcbiAgICAgICAgc3ViQ2FjaGVzOiBTdWJSZWFkZXJDYWNoZXM7XG4gICAgICAgIG9uVW5yZWFkYWJsZUZpbGU/OiAoZmlsZTogQnVsa0ZpbGVJbmZvLCBtZXNzYWdlOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gICAgfSk6IFByb21pc2U8TG9hZGVkSW5kZXg8VD4+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgeyBidWxrRmlsZXMsIHN0cmVhbUZpbGVzIH0gPSBjb25maWc7XG4gICAgICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvbGVyYXRlTWlzc2luZyA9IGF0dGVtcHQgPj0gTUFYX1JFQURfQVRURU1QVFM7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBmaWxlc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBbYnVsa1JlYWRlcnNSYXcsIHN0cmVhbURhdGFdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChidWxrRmlsZXMubWFwKGFzeW5jIGYgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgbG9hZEZpbGVSZWFkZXIoY29uZmlnLm5hbWUsIGNvbmZpZy5zdG9yYWdlLCBmLCBjb25maWcuc3ViQ2FjaGVzLmJ1bGspO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0ZpbGVFcnJvcikgeyBmaWxlc0NoYW5nZWQgPSB0cnVlOyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5vblVucmVhZGFibGVGaWxlKSBhd2FpdCBjb25maWcub25VbnJlYWRhYmxlRmlsZShmLCAoZSBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICBsb2FkU3RyZWFtRW50cmllcyhjb25maWcubmFtZSwgY29uZmlnLnN0b3JhZ2UsIHN0cmVhbUZpbGVzLCBjb25maWcuc3ViQ2FjaGVzLnN0cmVhbSksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbURhdGEubWlzc2luZykgZmlsZXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZXNDaGFuZ2VkICYmICF0b2xlcmF0ZU1pc3NpbmcpIHRocm93IG5ldyBGaWxlc0NoYW5nZWRFcnJvcigpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYnVsa1JlYWRlcnMgPSBidWxrUmVhZGVyc1Jhdy5maWx0ZXIoKHIpOiByIGlzIEJhc2VCdWxrRGF0YWJhc2VSZWFkZXIgPT4gISFyKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXJzOiBCYXNlQnVsa0RhdGFiYXNlUmVhZGVyW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgc3RyZWFtVGltZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yZGVyZWQgPSBvcmRlclN0cmVhbUVudHJpZXMoc3RyZWFtRGF0YS5lbnRyaWVzKTtcbiAgICAgICAgICAgICAgICBpZiAob3JkZXJlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtUmVhZGVyRnJvbUVudHJpZXMob3JkZXJlZCwgc3RyZWFtRGF0YS50b3RhbEJ5dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVycy5wdXNoKHN0cmVhbS5yZWFkZXIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW1UaW1lcyA9IHN0cmVhbS50aW1lcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVhZGVycy5wdXNoKC4uLmJ1bGtSZWFkZXJzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBqb2luQnVsa0RhdGFiYXNlcyhyZWFkZXJzKTtcblxuICAgICAgICAgICAgICAgIHBydW5lU3ViQ2FjaGVzKGJ1bGtGaWxlcywgc3RyZWFtRmlsZXMsIGNvbmZpZy5zdWJDYWNoZXMpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZWxhcHNlZCA9IERhdGUubm93KCkgLSBzdGFydDtcbiAgICAgICAgICAgICAgICBpZiAoZWxhcHNlZCA+IDUwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBieXRlc1JlYWQgPSBzdHJlYW1EYXRhLnRvdGFsQnl0ZXM7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgciBvZiBidWxrUmVhZGVycykgYnl0ZXNSZWFkICs9IHIuY29sdW1ucy5maW5kKGMgPT4gYy5jb2x1bW4gPT09IEtFWV9DT0xVTU4pPy5ieXRlU2l6ZSA/PyAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtibHVlKGNvbmZpZy5uYW1lKX0gbG9hZGVkIGluICR7cmVkKGZvcm1hdFRpbWUoZWxhcHNlZCkpfSAoJHtibHVlKGZvcm1hdE51bWJlcihyZWFkZXIucm93Q291bnQpKX0gcm93cywgJHtidWxrRmlsZXMubGVuZ3RofSBidWxrICsgJHtzdHJlYW1GaWxlcy5sZW5ndGh9IHN0cmVhbSBmaWxlcywgcmVhZCAke2JsdWUoZm9ybWF0TnVtYmVyKGJ5dGVzUmVhZCkpfUIpYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2FkZWRJbmRleDxUPihcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdG9yYWdlLFxuICAgICAgICAgICAgICAgICAgICBidWxrRmlsZXMsXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUZpbGVzLFxuICAgICAgICAgICAgICAgICAgICByZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbVRpbWVzLFxuICAgICAgICAgICAgICAgICAgICBzdHJlYW1EYXRhLnNpemVzLFxuICAgICAgICAgICAgICAgICAgICBzdHJlYW1EYXRhLmVudHJpZXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBzdHJlYW1EYXRhLnRvdGFsQnl0ZXMsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdWJDYWNoZXMsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEZpbGVzQ2hhbmdlZEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZG9wdHMgdGhlIHByZXZpb3VzIGluZGV4J3MgbG9hZGVkIGJhc2UgdmFsdWVzIGFzIFNUQUxFIG9uIHRoaXMgb25lLCBzbyBhIHN5bmMgcmVhZCBtaWQtc3dhcCBjYW4gc2VydmUgdGhlIG9sZCB2YWx1ZSAocGF0Y2hlZCB3aXRoIHRoZSBjdXJyZW50IG92ZXJsYXkpIGluc3RlYWQgb2YgZmxhc2hpbmcgZW1wdHkgd2hpbGUgdGhlIGZyZXNoIGxvYWQgcnVucy4gUGVyLWVudHJ5OiBkcm9wcGVkIHdoZW4gdGhlIGZyZXNoIHZhbHVlIGxhbmRzIGhlcmUuXG4gICAgaW5oZXJpdFN0YWxlRnJvbShwcmV2OiBMb2FkZWRJbmRleDxUPik6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBwcmV2LmJhc2VDb2x1bW5zKSB0aGlzLnN0YWxlQmFzZUNvbHVtbnMuc2V0KGssIHYpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBwcmV2LnN0YWxlQmFzZUNvbHVtbnMpIGlmICghdGhpcy5zdGFsZUJhc2VDb2x1bW5zLmhhcyhrKSkgdGhpcy5zdGFsZUJhc2VDb2x1bW5zLnNldChrLCB2KTtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgcHJldi5iYXNlRmllbGRzKSB0aGlzLnN0YWxlQmFzZUZpZWxkcy5zZXQoaywgdik7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIHByZXYuc3RhbGVCYXNlRmllbGRzKSBpZiAoIXRoaXMuc3RhbGVCYXNlRmllbGRzLmhhcyhrKSkgdGhpcy5zdGFsZUJhc2VGaWVsZHMuc2V0KGssIHYpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldENvbHVtbihjb2x1bW46IHN0cmluZyk6IFByb21pc2U8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd247IHRpbWU6IG51bWJlciB9W10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldENvbHVtbihjb2x1bW4pO1xuICAgIH1cblxuICAgIGFzeW5jIGdldFNpbmdsZUZpZWxkKGtleTogc3RyaW5nLCBjb2x1bW46IHN0cmluZyk6IFByb21pc2U8eyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldFNpbmdsZUZpZWxkKGtleSwgY29sdW1uKTtcbiAgICB9XG5cbiAgICBlbnN1cmVCYXNlQ29sdW1uKGNvbHVtbjogc3RyaW5nLCBvbkxvYWRlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5iYXNlQ29sdW1ucy5oYXMoY29sdW1uKSB8fCB0aGlzLmJhc2VDb2x1bW5zTG9hZGluZy5oYXMoY29sdW1uKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmJhc2VDb2x1bW5zTG9hZGluZy5hZGQoY29sdW1uKTtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMucmVhZGVyLmdldENvbHVtbihjb2x1bW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZUNvbHVtbnMuc2V0KGNvbHVtbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhbGVCYXNlQ29sdW1ucy5kZWxldGUoY29sdW1uKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VDb2x1bW5zTG9hZGluZy5kZWxldGUoY29sdW1uKTtcbiAgICAgICAgICAgICAgICBvbkxvYWRlZCgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE5vIHNjaGVkdWxlZCByZXRyeSBleGlzdHM6IGNsZWFyaW5nIHRoZSBsb2FkaW5nIGZsYWcgbWFrZXMgdGhlIE5FWFQgcmVhZCByZS1hdHRlbXB0IHRoZSBsb2FkLCBhbmQgdW50aWwgb25lIGhhcHBlbnMgdGhlIHZhbHVlIHN0YXlzIG1pc3Npbmcvc3RhbGVcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VDb2x1bW5zTG9hZGluZy5kZWxldGUoY29sdW1uKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMubmFtZX0uZ2V0Q29sdW1uU3luYygke0pTT04uc3RyaW5naWZ5KGNvbHVtbil9KSBsb2FkIGZhaWxlZCAodGhlIG5leHQgcmVhZCByZS1hdHRlbXB0cyBpdCk6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgfVxuXG4gICAgZW5zdXJlQmFzZUZpZWxkKGtleTogc3RyaW5nLCBjb2x1bW46IHN0cmluZywgb25Mb2FkZWQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2sgPSBudWxsSm9pbihjb2x1bW4sIGtleSk7XG4gICAgICAgIGlmICh0aGlzLmJhc2VGaWVsZHMuaGFzKGNrKSB8fCB0aGlzLmJhc2VGaWVsZHNMb2FkaW5nLmhhcyhjaykpIHJldHVybjtcbiAgICAgICAgdGhpcy5iYXNlRmllbGRzTG9hZGluZy5hZGQoY2spO1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5yZWFkZXIuZ2V0U2luZ2xlRmllbGQoa2V5LCBjb2x1bW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZUZpZWxkcy5zZXQoY2ssIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWxlQmFzZUZpZWxkcy5kZWxldGUoY2spO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZUZpZWxkc0xvYWRpbmcuZGVsZXRlKGNrKTtcbiAgICAgICAgICAgICAgICBvbkxvYWRlZCgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZUZpZWxkc0xvYWRpbmcuZGVsZXRlKGNrKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMubmFtZX0uZ2V0U2luZ2xlRmllbGRTeW5jKCR7SlNPTi5zdHJpbmdpZnkoa2V5KX0sICR7SlNPTi5zdHJpbmdpZnkoY29sdW1uKX0pIGxvYWQgZmFpbGVkICh0aGUgbmV4dCByZWFkIHJlLWF0dGVtcHRzIGl0KTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIHRoZSBsb2FkZWQgdmFsdWUgKGZyZXNoIGlmIGF2YWlsYWJsZSwgZWxzZSBsYXN0LWtub3duIHN0YWxlKSBmb3IgdGhlIGNvbHVtbiwgb3IgdW5kZWZpbmVkIGlmIG5laXRoZXIgaXMgcHJlc2VudCB5ZXQuIFRoZSBib29sZWFuIGluZGljYXRlcyB3aGV0aGVyIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBmcmVzaDsgY2FsbGVycyBtYXkgc2tpcCBjYWNoaW5nIGEgc3RhbGUgdmFsdWUuXG4gICAgZ2V0QmFzZUNvbHVtbihjb2x1bW46IHN0cmluZyk6IHsgZW50cmllczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd247IHRpbWU6IG51bWJlciB9W107IGZyZXNoOiBib29sZWFuIH0gfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBmcmVzaCA9IHRoaXMuYmFzZUNvbHVtbnMuZ2V0KGNvbHVtbik7XG4gICAgICAgIGlmIChmcmVzaCkgcmV0dXJuIHsgZW50cmllczogZnJlc2gsIGZyZXNoOiB0cnVlIH07XG4gICAgICAgIGNvbnN0IHN0YWxlID0gdGhpcy5zdGFsZUJhc2VDb2x1bW5zLmdldChjb2x1bW4pO1xuICAgICAgICBpZiAoc3RhbGUpIHJldHVybiB7IGVudHJpZXM6IHN0YWxlLCBmcmVzaDogZmFsc2UgfTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBnZXRCYXNlRmllbGQoa2V5OiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKTogeyB2YWx1ZTogeyB2YWx1ZTogdW5rbm93bjsgdGltZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7IGZyZXNoOiBib29sZWFuOyBsb2FkZWQ6IGJvb2xlYW4gfSB7XG4gICAgICAgIGNvbnN0IGNrID0gbnVsbEpvaW4oY29sdW1uLCBrZXkpO1xuICAgICAgICBpZiAodGhpcy5iYXNlRmllbGRzLmhhcyhjaykpIHJldHVybiB7IHZhbHVlOiB0aGlzLmJhc2VGaWVsZHMuZ2V0KGNrKSwgZnJlc2g6IHRydWUsIGxvYWRlZDogdHJ1ZSB9O1xuICAgICAgICBpZiAodGhpcy5zdGFsZUJhc2VGaWVsZHMuaGFzKGNrKSkgcmV0dXJuIHsgdmFsdWU6IHRoaXMuc3RhbGVCYXNlRmllbGRzLmdldChjayksIGZyZXNoOiBmYWxzZSwgbG9hZGVkOiB0cnVlIH07XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGZyZXNoOiBmYWxzZSwgbG9hZGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlzQmFzZUNvbHVtbkxvYWRlZChjb2x1bW46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29sdW1ucy5oYXMoY29sdW1uKSB8fCB0aGlzLnN0YWxlQmFzZUNvbHVtbnMuaGFzKGNvbHVtbik7XG4gICAgfVxuXG4gICAgaXNCYXNlRmllbGRMb2FkZWQoa2V5OiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNrID0gbnVsbEpvaW4oY29sdW1uLCBrZXkpO1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlRmllbGRzLmhhcyhjaykgfHwgdGhpcy5zdGFsZUJhc2VGaWVsZHMuaGFzKGNrKTtcbiAgICB9XG5cbiAgICAvLyBEcm9wcyBpbi1tZW1vcnkgbG9hZGVkIHZhbHVlcyBmb3IgdGhpcyBpbmRleCwgc28gYSBzdWJzZXF1ZW50IHJlYWQgcmVsb2FkcyBmcmVzaCBmcm9tIGRpc2suIFVzZWQgYnkgcmVsb2FkRnJvbURpc2soKSDigJQgYSBoYXJkIHJlc2V0LCBubyBzdGFsZSBmYWxsYmFjayBzdXJ2aXZlcy5cbiAgICBkcm9wTG9hZGVkVmFsdWVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmJhc2VDb2x1bW5zLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuYmFzZUNvbHVtbnNMb2FkaW5nLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuYmFzZUZpZWxkcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmJhc2VGaWVsZHNMb2FkaW5nLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc3RhbGVCYXNlQ29sdW1ucy5jbGVhcigpO1xuICAgICAgICB0aGlzLnN0YWxlQmFzZUZpZWxkcy5jbGVhcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1ha2VSYXdHZXRSYW5nZShzdG9yYWdlOiBGaWxlU3RvcmFnZSwgZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8eyByYXdHZXRSYW5nZTogR2V0UmFuZ2U7IHNpemU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgaW5mbyA9IGF3YWl0IHN0b3JhZ2UuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgaWYgKCFpbmZvKSB0aHJvdyBuZXcgTWlzc2luZ0ZpbGVFcnJvcihgYnVsayBmaWxlICR7ZmlsZU5hbWV9IGlzIG1pc3NpbmdgKTtcbiAgICBjb25zdCByYXdHZXRSYW5nZTogR2V0UmFuZ2UgPSBhc3luYyAoc3RhcnQsIGVuZCkgPT4ge1xuICAgICAgICBpZiAoZW5kIDw9IHN0YXJ0KSByZXR1cm4gRU1QVFlfQlVGRkVSO1xuICAgICAgICBjb25zdCBidWYgPSBhd2FpdCBzdG9yYWdlLmdldFJhbmdlKGZpbGVOYW1lLCB7IHN0YXJ0LCBlbmQgfSk7XG4gICAgICAgIGlmICghYnVmKSB0aHJvdyBuZXcgTWlzc2luZ0ZpbGVFcnJvcihgcmFuZ2UgWyR7c3RhcnR9LCAke2VuZH0pIG9mICR7ZmlsZU5hbWV9IGlzIG1pc3NpbmdgKTtcbiAgICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9O1xuICAgIHJldHVybiB7IHJhd0dldFJhbmdlLCBzaXplOiBpbmZvLnNpemUgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRGaWxlUmVhZGVyKG5hbWU6IHN0cmluZywgc3RvcmFnZTogRmlsZVN0b3JhZ2UsIGY6IEJ1bGtGaWxlSW5mbywgY2FjaGU6IE1hcDxzdHJpbmcsIEJhc2VCdWxrRGF0YWJhc2VSZWFkZXI+KTogUHJvbWlzZTxCYXNlQnVsa0RhdGFiYXNlUmVhZGVyPiB7XG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGYuZmlsZU5hbWUpO1xuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgbWFrZVJhd0dldFJhbmdlKHN0b3JhZ2UsIGYuZmlsZU5hbWUpO1xuICAgIGNvbnN0IGZpbGVJZCA9IG51bGxKb2luKG5hbWUsIGYuZmlsZU5hbWUpO1xuICAgIGNvbnN0IG9wZW5lZCA9IGF3YWl0IGJsb2NrQ2FjaGUub3BlbihmaWxlSWQsIHJhdy5zaXplLCByYXcucmF3R2V0UmFuZ2UpO1xuICAgIGNvbnN0IHJlYWRlciA9IGF3YWl0IGxvYWRCdWxrRGF0YWJhc2UoeyB0b3RhbEJ5dGVzOiBvcGVuZWQudW5jb21wcmVzc2VkU2l6ZSwgZ2V0UmFuZ2U6IG9wZW5lZC5nZXRSYW5nZSwgbmFtZTogYCR7QlVMS19ST09UX0ZPTERFUn0vJHtuYW1lfS8ke2YuZmlsZU5hbWV9YCB9KTtcbiAgICBjYWNoZS5zZXQoZi5maWxlTmFtZSwgcmVhZGVyKTtcbiAgICByZXR1cm4gcmVhZGVyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFN0cmVhbUVudHJpZXMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0b3JhZ2U6IEZpbGVTdG9yYWdlLFxuICAgIHN0cmVhbUZpbGVzOiBTdHJlYW1GaWxlSW5mb1tdLFxuICAgIGNhY2hlOiBNYXA8c3RyaW5nLCBTdHJlYW1SZWFkZXJDYWNoZUVudHJ5Pixcbik6IFByb21pc2U8eyBlbnRyaWVzOiB7IHRpbWU6IG51bWJlcjsgZmlsZU5hbWU6IHN0cmluZzsgZW50cnk6IFN0cmVhbUVudHJ5IH1bXTsgdG90YWxCeXRlczogbnVtYmVyOyBtaXNzaW5nOiBib29sZWFuOyBzaXplczogTWFwPHN0cmluZywgbnVtYmVyPiB9PiB7XG4gICAgY29uc3Qgc2l6ZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGlmICghc3RyZWFtRmlsZXMubGVuZ3RoKSByZXR1cm4geyBlbnRyaWVzOiBbXSwgdG90YWxCeXRlczogMCwgbWlzc2luZzogZmFsc2UsIHNpemVzIH07XG4gICAgbGV0IG1pc3NpbmcgPSBmYWxzZTtcbiAgICBjb25zdCBwZXJGaWxlID0gYXdhaXQgUHJvbWlzZS5hbGwoc3RyZWFtRmlsZXMubWFwKGFzeW5jIChmKTogUHJvbWlzZTx7IGZpbGVOYW1lOiBzdHJpbmc7IHNpemU6IG51bWJlcjsgZW50cmllczogU3RyZWFtRW50cnlbXSB9IHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgc3RvcmFnZS5nZXRJbmZvKGYuZmlsZU5hbWUpO1xuICAgICAgICAgICAgaWYgKCFpbmZvKSB7IG1pc3NpbmcgPSB0cnVlOyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICBjb25zdCBzaXplID0gaW5mby5zaXplO1xuICAgICAgICAgICAgc2l6ZXMuc2V0KGYuZmlsZU5hbWUsIHNpemUpO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGYuZmlsZU5hbWUpO1xuICAgICAgICAgICAgaWYgKGNhY2hlZCAmJiBjYWNoZWQucmVhZFNpemUgPT09IHNpemUpIHJldHVybiB7IGZpbGVOYW1lOiBmLmZpbGVOYW1lLCBzaXplLCBlbnRyaWVzOiBjYWNoZWQuZW50cmllcyB9O1xuICAgICAgICAgICAgaWYgKHNpemUgPT09IDApIHsgY2FjaGUuc2V0KGYuZmlsZU5hbWUsIHsgcmVhZFNpemU6IDAsIHBhcnNlZFBvczogMCwgZW50cmllczogW10gfSk7IHJldHVybiB7IGZpbGVOYW1lOiBmLmZpbGVOYW1lLCBzaXplOiAwLCBlbnRyaWVzOiBbXSB9OyB9XG4gICAgICAgICAgICAvLyBBcHBlbmQtb25seTogYSBsYXJnZXIgc2l6ZSBtZWFucyBuZXcgYnl0ZXMgYXQgdGhlIHRhaWwsIHBhcnNlIG9ubHkgdGhvc2UuXG4gICAgICAgICAgICBpZiAoY2FjaGVkICYmIHNpemUgPiBjYWNoZWQucmVhZFNpemUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWZmaXggPSBhd2FpdCBzdG9yYWdlLmdldFJhbmdlKGYuZmlsZU5hbWUsIHsgc3RhcnQ6IGNhY2hlZC5wYXJzZWRQb3MsIGVuZDogc2l6ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXN1ZmZpeCkgeyBtaXNzaW5nID0gdHJ1ZTsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlU3RyZWFtKHN1ZmZpeCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5iYWRCeXRlcyA+IDApIGNvbnNvbGUud2FybihgJHtuYW1lfSBzdHJlYW0gZmlsZSAke2YuZmlsZU5hbWV9IGhhZCAke3BhcnNlZC5iYWRCeXRlc30gdHJhaWxpbmcgYmFkL2luY29tcGxldGUgYnl0ZXMgKHN0b3BwZWQgcmVhZGluZyB0aGVyZSlgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gcGFyc2VkLmVudHJpZXMubGVuZ3RoID8gY2FjaGVkLmVudHJpZXMuY29uY2F0KHBhcnNlZC5lbnRyaWVzKSA6IGNhY2hlZC5lbnRyaWVzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFBvcyA9IGNhY2hlZC5wYXJzZWRQb3MgKyAoc3VmZml4Lmxlbmd0aCAtIHBhcnNlZC5iYWRCeXRlcyk7XG4gICAgICAgICAgICAgICAgY2FjaGUuc2V0KGYuZmlsZU5hbWUsIHsgcmVhZFNpemU6IHNpemUsIHBhcnNlZFBvcywgZW50cmllcyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBmaWxlTmFtZTogZi5maWxlTmFtZSwgc2l6ZSwgZW50cmllcyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgc3RvcmFnZS5nZXRSYW5nZShmLmZpbGVOYW1lLCB7IHN0YXJ0OiAwLCBlbmQ6IHNpemUgfSk7XG4gICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeyBtaXNzaW5nID0gdHJ1ZTsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VTdHJlYW0oYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWQuYmFkQnl0ZXMgPiAwKSBjb25zb2xlLndhcm4oYCR7bmFtZX0gc3RyZWFtIGZpbGUgJHtmLmZpbGVOYW1lfSBoYWQgJHtwYXJzZWQuYmFkQnl0ZXN9IHRyYWlsaW5nIGJhZC9pbmNvbXBsZXRlIGJ5dGVzIChzdG9wcGVkIHJlYWRpbmcgdGhlcmUpYCk7XG4gICAgICAgICAgICBjYWNoZS5zZXQoZi5maWxlTmFtZSwgeyByZWFkU2l6ZTogc2l6ZSwgcGFyc2VkUG9zOiBzaXplIC0gcGFyc2VkLmJhZEJ5dGVzLCBlbnRyaWVzOiBwYXJzZWQuZW50cmllcyB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IGZpbGVOYW1lOiBmLmZpbGVOYW1lLCBzaXplLCBlbnRyaWVzOiBwYXJzZWQuZW50cmllcyB9O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIG1pc3NpbmcgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCBlbnRyaWVzOiB7IHRpbWU6IG51bWJlcjsgZmlsZU5hbWU6IHN0cmluZzsgZW50cnk6IFN0cmVhbUVudHJ5IH1bXSA9IFtdO1xuICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICBmb3IgKGNvbnN0IHBmIG9mIHBlckZpbGUpIHtcbiAgICAgICAgaWYgKCFwZikgY29udGludWU7XG4gICAgICAgIHRvdGFsQnl0ZXMgKz0gcGYuc2l6ZTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBwZi5lbnRyaWVzKSBlbnRyaWVzLnB1c2goeyB0aW1lOiBlbnRyeS50aW1lLCBmaWxlTmFtZTogcGYuZmlsZU5hbWUsIGVudHJ5IH0pO1xuICAgIH1cbiAgICByZXR1cm4geyBlbnRyaWVzLCB0b3RhbEJ5dGVzLCBtaXNzaW5nLCBzaXplcyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3JkZXJTdHJlYW1FbnRyaWVzKGVudHJpZXM6IHsgdGltZTogbnVtYmVyOyBmaWxlTmFtZTogc3RyaW5nOyBlbnRyeTogU3RyZWFtRW50cnkgfVtdKTogU3RyZWFtRW50cnlbXSB7XG4gICAgZW50cmllcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGlmIChhLnRpbWUgIT09IGIudGltZSkgcmV0dXJuIGEudGltZSAtIGIudGltZTtcbiAgICAgICAgcmV0dXJuIGEuZmlsZU5hbWUgPCBiLmZpbGVOYW1lICYmIC0xIHx8IGEuZmlsZU5hbWUgPiBiLmZpbGVOYW1lICYmIDEgfHwgMDtcbiAgICB9KTtcbiAgICByZXR1cm4gZW50cmllcy5tYXAoZSA9PiBlLmVudHJ5KTtcbn1cblxuZnVuY3Rpb24gcHJ1bmVTdWJDYWNoZXMoYnVsa0ZpbGVzOiBCdWxrRmlsZUluZm9bXSwgc3RyZWFtRmlsZXM6IFN0cmVhbUZpbGVJbmZvW10sIHN1YkNhY2hlczogU3ViUmVhZGVyQ2FjaGVzKSB7XG4gICAgY29uc3QgbGl2ZUJ1bGsgPSBuZXcgU2V0KGJ1bGtGaWxlcy5tYXAoZiA9PiBmLmZpbGVOYW1lKSk7XG4gICAgY29uc3QgbGl2ZVN0cmVhbSA9IG5ldyBTZXQoc3RyZWFtRmlsZXMubWFwKGYgPT4gZi5maWxlTmFtZSkpO1xuICAgIGZvciAoY29uc3QgbiBvZiBzdWJDYWNoZXMuYnVsay5rZXlzKCkpIGlmICghbGl2ZUJ1bGsuaGFzKG4pKSBzdWJDYWNoZXMuYnVsay5kZWxldGUobik7XG4gICAgZm9yIChjb25zdCBuIG9mIHN1YkNhY2hlcy5zdHJlYW0ua2V5cygpKSBpZiAoIWxpdmVTdHJlYW0uaGFzKG4pKSBzdWJDYWNoZXMuc3RyZWFtLmRlbGV0ZShuKTtcbn1cblxuLy8gQSBjb3JydXB0L3VucmVhZGFibGUgY29sdW1uIGluIE9ORSB1bmRlcmx5aW5nIGZpbGUgbXVzdCBub3QgYnJlYWsgdGhlIHdob2xlIGpvaW5lZCByZWFkLiBXaGVuIGEgc291cmNlJ3MgY29sdW1uIHJlYWQgdGhyb3dzLCB3ZSBkcm9wIHRoYXQgc291cmNlIGZvciB0aGF0IGNvbHVtbiAoZmFsbGluZyB0aHJvdWdoIHRvIG9sZGVyIHJlYWRlcnMsIGV4YWN0bHkgYXMgaWYgdGhlIGZpbGUgbmV2ZXIgc2V0IHRoZSBjb2x1bW4pIGFuZCB3YXJuIG9uY2UgcGVyIChmaWxlLCBjb2x1bW4pIHNvIHRoZSBjb3JydXB0aW9uIGlzIHZpc2libGUgd2l0aG91dCBmbG9vZGluZyB0aGUgbG9nIG9uIGV2ZXJ5IHJlYnVpbGQuXG5jb25zdCB3YXJuZWRDb3JydXB0UmVhZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbmZ1bmN0aW9uIHdhcm5Db3JydXB0UmVhZChkYjogQmFzZUJ1bGtEYXRhYmFzZVJlYWRlciwgY29sdW1uOiBzdHJpbmcsIGU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBwYXRoID0gZGIubmFtZSB8fCBcIih1bmtub3duIHNvdXJjZSlcIjtcbiAgICBjb25zdCBkZWR1cGVLZXkgPSBudWxsSm9pbihwYXRoLCBjb2x1bW4pO1xuICAgIGlmICh3YXJuZWRDb3JydXB0UmVhZHMuaGFzKGRlZHVwZUtleSkpIHJldHVybjtcbiAgICB3YXJuZWRDb3JydXB0UmVhZHMuYWRkKGRlZHVwZUtleSk7XG4gICAgY29uc29sZS53YXJuKGAke3JlZChcImNvcnJ1cHQgcmVhZFwiKX06IGZpbGUgJHtwYXRofSBjb2x1bW4gJHtKU09OLnN0cmluZ2lmeShjb2x1bW4pfSBjb3VsZCBub3QgYmUgcmVhZCAtIHNraXBwaW5nIGl0IChpdHMgZGF0YSBpcyBkcm9wcGVkIGZyb20gcmVzdWx0cyk6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG59XG5cbmZ1bmN0aW9uIGpvaW5CdWxrRGF0YWJhc2VzKGRhdGFiYXNlczogQmFzZUJ1bGtEYXRhYmFzZVJlYWRlcltdKTogUmVzb2x2ZWRSZWFkZXIge1xuICAgIGNvbnN0IGRlbGV0ZVRpbWUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgZGIgb2YgZGF0YWJhc2VzKSB7XG4gICAgICAgIGlmICghZGIuZGVsZXRlVGltZXMpIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHRdIG9mIGRiLmRlbGV0ZVRpbWVzKSBkZWxldGVUaW1lLnNldChrZXksIE1hdGgubWF4KGRlbGV0ZVRpbWUuZ2V0KGtleSkgPz8gLUluZmluaXR5LCB0KSk7XG4gICAgfVxuICAgIGNvbnN0IGtleVRpbWUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgZGIgb2YgZGF0YWJhc2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdF0gb2YgZGIua2V5VGltZXMpIGtleVRpbWUuc2V0KGtleSwgTWF0aC5tYXgoa2V5VGltZS5nZXQoa2V5KSA/PyAtSW5maW5pdHksIHQpKTtcbiAgICB9XG4gICAgY29uc3QgZGVsT2YgPSAoa2V5OiBzdHJpbmcpID0+IGRlbGV0ZVRpbWUuZ2V0KGtleSkgPz8gLUluZmluaXR5O1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB0XSBvZiBrZXlUaW1lKSBpZiAodCA+IGRlbE9mKGtleSkpIGtleXMucHVzaChrZXkpO1xuXG4gICAgY29uc3QgY29sdW1uczogeyBjb2x1bW46IHN0cmluZzsgYnl0ZVNpemU6IG51bWJlciB9W10gPSBbXTtcbiAgICBjb25zdCBjb2x1bW5CeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgeyBjb2x1bW46IHN0cmluZzsgYnl0ZVNpemU6IG51bWJlciB9PigpO1xuICAgIGZvciAoY29uc3QgZGIgb2YgZGF0YWJhc2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGRiLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGNvbHVtbkJ5TmFtZS5nZXQoY29sLmNvbHVtbik7XG4gICAgICAgICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcgPSB7IGNvbHVtbjogY29sLmNvbHVtbiwgYnl0ZVNpemU6IDAgfTtcbiAgICAgICAgICAgICAgICBjb2x1bW5CeU5hbWUuc2V0KGNvbC5jb2x1bW4sIGV4aXN0aW5nKTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goZXhpc3RpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXhpc3RpbmcuYnl0ZVNpemUgKz0gY29sLmJ5dGVTaXplO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdG90YWxCeXRlczogZGF0YWJhc2VzLnJlZHVjZSgoYWNjLCBkYikgPT4gYWNjICsgZGIudG90YWxCeXRlcywgMCksXG4gICAgICAgIHJvd0NvdW50OiBrZXlzLmxlbmd0aCxcbiAgICAgICAga2V5cyxcbiAgICAgICAgcmF3S2V5Q291bnQ6IGRhdGFiYXNlcy5yZWR1Y2UoKGFjYywgZGIpID0+IGFjYyArIGRiLmtleVRpbWVzLnNpemUgKyAoZGIuZGVsZXRlVGltZXM/LnNpemUgPz8gMCksIDApLFxuICAgICAgICByZWFkZXJDb3VudDogZGF0YWJhc2VzLmxlbmd0aCxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgICAga2V5VGltZXM6IGtleVRpbWUsXG4gICAgICAgIGRlbGV0ZVRpbWVzOiBkZWxldGVUaW1lLFxuICAgICAgICBhc3luYyBnZXRDb2x1bW4oY29sdW1uKSB7XG4gICAgICAgICAgICBjb25zdCBwZXJSZWFkZXIgPSBhd2FpdCBQcm9taXNlLmFsbChkYXRhYmFzZXMubWFwKGFzeW5jIGRiID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWRiLmNvbHVtbnMuc29tZShjID0+IGMuY29sdW1uID09PSBjb2x1bW4pKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBkYi5nZXRDb2x1bW4oY29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXAoZW50cmllcy5tYXAoZSA9PiBbZS5rZXksIHsgdmFsdWU6IGUudmFsdWUsIHRpbWU6IGUudGltZSB9XSkpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybkNvcnJ1cHRSZWFkKGRiLCBjb2x1bW4sIGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBrZXlzLm1hcChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBiZXN0VGltZSA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgICAgICBsZXQgYmVzdFZhbDogdW5rbm93bjtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG0gb2YgcGVyUmVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBtICYmIG0uZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2VsbCB8fCBjZWxsLnZhbHVlID09PSBBQlNFTlQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC50aW1lID4gYmVzdFRpbWUpIHsgYmVzdFRpbWUgPSBjZWxsLnRpbWU7IGJlc3RWYWwgPSBjZWxsLnZhbHVlOyBmb3VuZCA9IHRydWU7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbGl2ZSA9IGZvdW5kICYmIGJlc3RUaW1lID4gZGVsT2Yoa2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBrZXksIHZhbHVlOiBsaXZlID8gYmVzdFZhbCA6IHVuZGVmaW5lZCwgdGltZTogbGl2ZSA/IGJlc3RUaW1lIDogKGtleVRpbWUuZ2V0KGtleSkgPz8gMCkgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBnZXRTaW5nbGVGaWVsZChrZXksIGNvbHVtbikge1xuICAgICAgICAgICAgY29uc3Qga3QgPSBrZXlUaW1lLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGt0ID09PSB1bmRlZmluZWQgfHwga3QgPD0gZGVsT2Yoa2V5KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBiZXN0VGltZSA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgIGxldCBiZXN0VmFsOiB1bmtub3duO1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRiIG9mIGRhdGFiYXNlcykge1xuICAgICAgICAgICAgICAgIGlmICghZGIuY29sdW1ucy5zb21lKGMgPT4gYy5jb2x1bW4gPT09IGNvbHVtbikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHIgPSBhd2FpdCBkYi5nZXRTaW5nbGVGaWVsZChrZXksIGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuQ29ycnVwdFJlYWQoZGIsIGNvbHVtbiwgZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAociA9PT0gQUJTRU5UKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoci50aW1lID4gYmVzdFRpbWUpIHsgYmVzdFRpbWUgPSByLnRpbWU7IGJlc3RWYWwgPSByLnZhbHVlOyBmb3VuZCA9IHRydWU7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxpdmUgPSBmb3VuZCAmJiBiZXN0VGltZSA+IGRlbE9mKGtleSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbGl2ZSA/IGJlc3RWYWwgOiB1bmRlZmluZWQsIHRpbWU6IGxpdmUgPyBiZXN0VGltZSA6IGt0IH07XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbiJdfQ==
|
|
426
|
+
/* _JS_SOURCE_HASH = "446b9e23af0de5c11ca3b74d1e8ef9b62bb041ff0b48814ae1627f606216215d"; */
|
|
@@ -12,7 +12,12 @@ const LZ4_1 = require("socket-function/src/lz4/LZ4");
|
|
|
12
12
|
//
|
|
13
13
|
// Per-block compression mainly helps slow storage (HDD): fewer bytes off disk per block, at the cost of a fast in-memory LZ4 decompress.
|
|
14
14
|
const BLOCK_SIZE = 256 * 1024;
|
|
15
|
-
|
|
15
|
+
// 128MB per context. This cache exists per browsing context (each tab, each
|
|
16
|
+
// worker), so a generous cap multiplies fast — at 512MB, three same-process
|
|
17
|
+
// tabs could pin 1.5GB of block data, and the resulting GC pressure visibly
|
|
18
|
+
// janks video playback. 128MB still holds ~500 hot blocks per context; misses
|
|
19
|
+
// just re-read from local disk, which is cheap.
|
|
20
|
+
const MAX_BLOCKS = Math.floor((128 * 1024 * 1024) / BLOCK_SIZE);
|
|
16
21
|
const MIN_COMPRESSION_RATIO = 2;
|
|
17
22
|
const EMPTY = Buffer.alloc(0);
|
|
18
23
|
// Writes a logical bulk buffer in the compressed-block format described above.
|
|
@@ -159,5 +164,5 @@ class BlockCache {
|
|
|
159
164
|
exports.BlockCache = BlockCache;
|
|
160
165
|
// Shared across every BulkDatabase2 collection/file (the 512MB budget is global).
|
|
161
166
|
exports.blockCache = new BlockCache();
|
|
162
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tDYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJsb2NrQ2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWtEO0FBRWxELCtGQUErRjtBQUMvRixHQUFHO0FBQ0gsMlhBQTJYO0FBQzNYLEdBQUc7QUFDSCxpRkFBaUY7QUFDakYsR0FBRztBQUNILDZYQUE2WDtBQUM3WCxHQUFHO0FBQ0gseUlBQXlJO0FBRXpJLE1BQU0sVUFBVSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDOUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7QUFDaEUsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFFaEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQVcsQ0FBQztBQWF4QywrRUFBK0U7QUFDL0UsU0FBZ0Isc0JBQXNCLENBQUMsSUFBWTtJQUMvQyxJQUFJLE1BQU0sR0FBZ0IsRUFBRSxDQUFDO0lBQzdCLElBQUksV0FBVyxHQUFhLEVBQUUsQ0FBQztJQUMvQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFDckQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNyRixJQUFJLFVBQVUsR0FBRyxTQUFHLENBQUMsUUFBUSxDQUFDLEdB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LENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNoSixDQUFDO1lBQ0QsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxVQUFVLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUM7SUFDTixDQUFDO0NBQ0o7QUFsSEQsZ0NBa0hDO0FBRUQsa0ZBQWtGO0FBQ3JFLFFBQUEsVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMWjQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9sejQvTFo0XCI7XG5cbi8vIEJsb2NrLWFsaWduZWQsIHByb21pc2UtZGVkdXBlZCwgZGVjb21wcmVzc2luZyByYW5nZSBjYWNoZSBmb3IgQnVsa0RhdGFiYXNlMidzIG9uLWRpc2sgZmlsZXMuXG4vLyBcbi8vIE9uLWRpc2sgZm9ybWF0IChwcm9kdWNlZCBieSBlbmNvZGVDb21wcmVzc2VkQmxvY2tzKTogdGhlIGxvZ2ljYWwgKHVuY29tcHJlc3NlZCkgYnVsayBidWZmZXIgaXMgc3BsaXQgaW50byBmaXhlZCBCTE9DS19TSVpFIGJsb2NrczsgZWFjaCBibG9jayBpcyBMWjQtY29tcHJlc3NlZCB1bmxlc3MgdGhhdCB3b3VsZG4ndCBzaHJpbmsgaXQgYnkgYXQgbGVhc3QgMngsIGluIHdoaWNoIGNhc2UgaXQncyBzdG9yZWQgcmF3LiBUaGUgZmlsZSBzdGFydHMgd2l0aCBhIEpTT04gaW5kZXggbWFwcGluZyBlYWNoIGJsb2NrIHRvIGl0cyBzdG9yZWQgbGVuZ3RoICsgYSBjb21wcmVzc2VkIGZsYWcsIHNvIGEgcmVhZGVyIGNhbiBzZWVrIHN0cmFpZ2h0IHRvIGFueSBibG9jazpcbi8vIFxuLy8gICBbdTMyIGluZGV4TGVuZ3RoXVtpbmRleCBKU09OXVtibG9jayAwIHN0b3JlZCBieXRlc11bYmxvY2sgMSBzdG9yZWQgYnl0ZXNdLi4uXG4vLyBcbi8vIFRoZSBjYWNoZSBwcmVzZW50cyBhICpsb2dpY2FsKiBnZXRSYW5nZSAob3ZlciB1bmNvbXByZXNzZWQgYnl0ZXMpIHNvIEJ1bGtEYXRhYmFzZTIncyByZWFkZXIgaXMgb2JsaXZpb3VzIHRvIGNvbXByZXNzaW9uLiBJdCByZWFkcyBjb21wcmVzc2VkIGJ5dGVzIHZpYSB0aGUgdW5kZXJseWluZyBnZXRSYW5nZSwgZGVjb21wcmVzc2VzLCBhbmQgY2FjaGVzIHRoZSB1bmNvbXByZXNzZWQgYmxvY2tzLiBSZWFkcyBhcmUgcHJvbWlzZS1kZWR1cGVkIGFuZCBjb250aWd1b3VzIG1pc3NpbmcgYmxvY2tzIGFyZSBjb2FsZXNjZWQgaW50byBvbmUgdW5kZXJseWluZyByZWFkLiBGaWxlcyBhcmUgaW1tdXRhYmxlLCBzbyBjYWNoZWQgYmxvY2tzIGFyZSB2YWxpZCBmb3JldmVyLlxuLy8gXG4vLyBQZXItYmxvY2sgY29tcHJlc3Npb24gbWFpbmx5IGhlbHBzIHNsb3cgc3RvcmFnZSAoSEREKTogZmV3ZXIgYnl0ZXMgb2ZmIGRpc2sgcGVyIGJsb2NrLCBhdCB0aGUgY29zdCBvZiBhIGZhc3QgaW4tbWVtb3J5IExaNCBkZWNvbXByZXNzLlxuXG5jb25zdCBCTE9DS19TSVpFID0gMjU2ICogMTAyNDtcbmNvbnN0IE1BWF9CTE9DS1MgPSBNYXRoLmZsb29yKCg1MTIgKiAxMDI0ICogMTAyNCkgLyBCTE9DS19TSVpFKTtcbmNvbnN0IE1JTl9DT01QUkVTU0lPTl9SQVRJTyA9IDI7XG5cbmNvbnN0IEVNUFRZID0gQnVmZmVyLmFsbG9jKDApIGFzIEJ1ZmZlcjtcblxuZXhwb3J0IHR5cGUgR2V0UmFuZ2UgPSAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpID0+IFByb21pc2U8QnVmZmVyPjtcblxudHlwZSBCbG9ja01ldGEgPSB7IGxlbjogbnVtYmVyOyBjOiAwIHwgMSB9O1xudHlwZSBGaWxlSW5kZXggPSB7XG4gICAgdW5jb21wcmVzc2VkU2l6ZTogbnVtYmVyO1xuICAgIGJsb2NrU2l6ZTogbnVtYmVyO1xuICAgIGJsb2NrczogQmxvY2tNZXRhW107XG4gICAgLy8gU3RvcmVkIGJ5dGUgb2Zmc2V0IG9mIGVhY2ggYmxvY2sgKG9mZnNldHNbaV0uLm9mZnNldHNbaV0rYmxvY2tzW2ldLmxlbiksIGZpbGxlZCBpbiBvbiBwYXJzZS5cbiAgICBvZmZzZXRzOiBudW1iZXJbXTtcbn07XG5cbi8vIFdyaXRlcyBhIGxvZ2ljYWwgYnVsayBidWZmZXIgaW4gdGhlIGNvbXByZXNzZWQtYmxvY2sgZm9ybWF0IGRlc2NyaWJlZCBhYm92ZS5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVDb21wcmVzc2VkQmxvY2tzKGRhdGE6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgbGV0IGJsb2NrczogQmxvY2tNZXRhW10gPSBbXTtcbiAgICBsZXQgc3RvcmVkUGFydHM6IEJ1ZmZlcltdID0gW107XG4gICAgbGV0IGJsb2NrQ291bnQgPSBNYXRoLmNlaWwoZGF0YS5sZW5ndGggLyBCTE9DS19TSVpFKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJsb2NrQ291bnQ7IGkrKykge1xuICAgICAgICBsZXQgcmF3ID0gZGF0YS5zdWJhcnJheShpICogQkxPQ0tfU0laRSwgTWF0aC5taW4oKGkgKyAxKSAqIEJMT0NLX1NJWkUsIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgIGxldCBjb21wcmVzc2VkID0gTFo0LmNvbXByZXNzKHJhdyk7XG4gICAgICAgIC8vIE9ubHkga2VlcCB0aGUgY29tcHJlc3NlZCBmb3JtIGlmIGl0IHNocmlua3MgdGhlIGJsb2NrIGJ5IGF0IGxlYXN0IE1JTl9DT01QUkVTU0lPTl9SQVRJTy5cbiAgICAgICAgaWYgKGNvbXByZXNzZWQubGVuZ3RoICogTUlOX0NPTVBSRVNTSU9OX1JBVElPIDw9IHJhdy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0b3JlZFBhcnRzLnB1c2goY29tcHJlc3NlZCk7XG4gICAgICAgICAgICBibG9ja3MucHVzaCh7IGxlbjogY29tcHJlc3NlZC5sZW5ndGgsIGM6IDEgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdG9yZWRQYXJ0cy5wdXNoKHJhdyk7XG4gICAgICAgICAgICBibG9ja3MucHVzaCh7IGxlbjogcmF3Lmxlbmd0aCwgYzogMCB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgaW5kZXhCdWYgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7IHVuY29tcHJlc3NlZFNpemU6IGRhdGEubGVuZ3RoLCBibG9ja1NpemU6IEJMT0NLX1NJWkUsIGJsb2NrcyB9KSwgXCJ1dGY4XCIpO1xuICAgIGxldCBwcmVmaXggPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgcHJlZml4LndyaXRlVUludDMyTEUoaW5kZXhCdWYubGVuZ3RoLCAwKTtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbcHJlZml4LCBpbmRleEJ1ZiwgLi4uc3RvcmVkUGFydHNdKTtcbn1cblxuZXhwb3J0IGNsYXNzIEJsb2NrQ2FjaGUge1xuICAgIC8vIFVuY29tcHJlc3NlZCBibG9ja3M7IGluc2VydGlvbiBvcmRlciBpcyBMUlUgb3JkZXIgKHJlLWluc2VydGVkIG9uIGFjY2VzcykuXG4gICAgcHJpdmF0ZSBibG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxCdWZmZXI+PigpO1xuICAgIC8vIFBhcnNlZCBmaWxlIGluZGV4IHBlciBmaWxlSWQgKHNtYWxsOyBub3Qgc3ViamVjdCB0byB0aGUgYmxvY2sgTFJVKS5cbiAgICBwcml2YXRlIGluZGV4ZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxGaWxlSW5kZXg+PigpO1xuXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmJsb2Nrcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmluZGV4ZXMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXZpY3QoZmlsZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5pbmRleGVzLmRlbGV0ZShmaWxlSWQpO1xuICAgICAgICBjb25zdCBwcmVmaXggPSBmaWxlSWQgKyBcIjpcIjtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5ibG9ja3Mua2V5cygpKSBpZiAoa2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgdGhpcy5ibG9ja3MuZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b3VjaChrZXk6IHN0cmluZywgdmFsdWU6IFByb21pc2U8QnVmZmVyPikge1xuICAgICAgICB0aGlzLmJsb2Nrcy5kZWxldGUoa2V5KTtcbiAgICAgICAgdGhpcy5ibG9ja3Muc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB3aGlsZSAodGhpcy5ibG9ja3Muc2l6ZSA+IE1BWF9CTE9DS1MpIHtcbiAgICAgICAgICAgIGxldCBvbGRlc3QgPSB0aGlzLmJsb2Nrcy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICAgICAgaWYgKG9sZGVzdCA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgICAgIHRoaXMuYmxvY2tzLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVhZHMgKyB2YWxpZGF0ZXMgdGhlIGZpbGUgaW5kZXguIFJlamVjdHMgdGhlIFdIT0xFIGZpbGUgaWYgaXQgaXNuJ3QgZXhhY3RseSB0aGUgc2l6ZSBpdHMgaW5kZXggaW1wbGllcyDigJQgYSB0cnVuY2F0ZWQvcGFydGlhbCB3cml0ZSAoZS5nLiBhIGNyYXNoIG1pZC13cml0ZSkgaXMgZGV0ZWN0ZWQgaGVyZSByYXRoZXIgdGhhbiBzaWxlbnRseSByZXR1cm5pbmcgY29ycnVwdGVkIHZhbHVlcyBmb3IgdGhlIHJvd3MgbmVhciB0aGUgZW5kLlxuICAgIHByaXZhdGUgYXN5bmMgcmVhZEluZGV4KHJhd0dldFJhbmdlOiBHZXRSYW5nZSwgZmlsZVNpemU6IG51bWJlcik6IFByb21pc2U8RmlsZUluZGV4PiB7XG4gICAgICAgIGxldCBoZWFkID0gYXdhaXQgcmF3R2V0UmFuZ2UoMCwgNCk7XG4gICAgICAgIGlmIChoZWFkLmxlbmd0aCA8IDQpIHRocm93IG5ldyBFcnJvcihgYnVsayBmaWxlIHRvbyBzaG9ydCBmb3IgYW4gaW5kZXggaGVhZGVyICgke2ZpbGVTaXplfSBieXRlcylgKTtcbiAgICAgICAgbGV0IGluZGV4TGVuZ3RoID0gaGVhZC5yZWFkVUludDMyTEUoMCk7XG4gICAgICAgIGlmIChpbmRleExlbmd0aCA8PSAwIHx8IDQgKyBpbmRleExlbmd0aCA+IGZpbGVTaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1bGsgZmlsZSBpbmRleCBsZW5ndGggJHtpbmRleExlbmd0aH0gaXMgaW52YWxpZCBmb3IgYSAke2ZpbGVTaXplfS1ieXRlIGZpbGVgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5kZXhCdWYgPSBhd2FpdCByYXdHZXRSYW5nZSg0LCA0ICsgaW5kZXhMZW5ndGgpO1xuICAgICAgICBsZXQgcGFyc2VkID0gSlNPTi5wYXJzZShpbmRleEJ1Zi50b1N0cmluZyhcInV0ZjhcIikpIGFzIHsgdW5jb21wcmVzc2VkU2l6ZTogbnVtYmVyOyBibG9ja1NpemU6IG51bWJlcjsgYmxvY2tzOiBCbG9ja01ldGFbXSB9O1xuICAgICAgICBsZXQgZGF0YUJhc2UgPSA0ICsgaW5kZXhMZW5ndGg7XG4gICAgICAgIGxldCBvZmZzZXRzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gZGF0YUJhc2U7XG4gICAgICAgIGZvciAobGV0IGJsb2NrIG9mIHBhcnNlZC5ibG9ja3MpIHtcbiAgICAgICAgICAgIG9mZnNldHMucHVzaChvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGJsb2NrLmxlbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYmxvY2tzIG11c3QgYWNjb3VudCBmb3IgZXhhY3RseSB0aGUgcmVzdCBvZiB0aGUgZmlsZS4gQW55IG1pc21hdGNoIG1lYW5zIHRoZSBmaWxlIGlzIHRydW5jYXRlZCBvciBvdGhlcndpc2UgY29ycnVwdCDigJQgcmVqZWN0IGl0IGVudGlyZWx5LlxuICAgICAgICBpZiAob2Zmc2V0ICE9PSBmaWxlU2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBidWxrIGZpbGUgaXMgJHtmaWxlU2l6ZX0gYnl0ZXMgYnV0IGl0cyBpbmRleCBpbXBsaWVzICR7b2Zmc2V0fSAodHJ1bmNhdGVkL2NvcnJ1cHQpYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgLi4ucGFyc2VkLCBvZmZzZXRzIH07XG4gICAgfVxuXG4gICAgLy8gT3BlbnMgYW4gaW1tdXRhYmxlIGZpbGU6IHJlYWRzICsgdmFsaWRhdGVzIGl0cyBpbmRleCAoY2FjaGVkKSBhbmQgcmV0dXJucyB0aGUgbG9naWNhbCAodW5jb21wcmVzc2VkKSBzaXplIHBsdXMgYSBsb2dpY2FsIGdldFJhbmdlIHRoYXQgdGhlIGNhbGxlciBjYW4gdXNlIGV4YWN0bHkgbGlrZSBhbiB1bmNvbXByZXNzZWQgZmlsZS4gYGZpbGVTaXplYCBpcyB0aGUgYWN0dWFsIG9uLWRpc2sgYnl0ZSBsZW5ndGgsIHVzZWQgdG8gZGV0ZWN0IHRydW5jYXRpb24uXG4gICAgcHVibGljIGFzeW5jIG9wZW4oZmlsZUlkOiBzdHJpbmcsIGZpbGVTaXplOiBudW1iZXIsIHJhd0dldFJhbmdlOiBHZXRSYW5nZSk6IFByb21pc2U8eyB1bmNvbXByZXNzZWRTaXplOiBudW1iZXI7IGdldFJhbmdlOiBHZXRSYW5nZSB9PiB7XG4gICAgICAgIGxldCBpbmRleFByb21pc2UgPSB0aGlzLmluZGV4ZXMuZ2V0KGZpbGVJZCk7XG4gICAgICAgIGlmICghaW5kZXhQcm9taXNlKSB7XG4gICAgICAgICAgICBpbmRleFByb21pc2UgPSB0aGlzLnJlYWRJbmRleChyYXdHZXRSYW5nZSwgZmlsZVNpemUpO1xuICAgICAgICAgICAgdGhpcy5pbmRleGVzLnNldChmaWxlSWQsIGluZGV4UHJvbWlzZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluZGV4ID0gYXdhaXQgaW5kZXhQcm9taXNlO1xuICAgICAgICByZXR1cm4geyB1bmNvbXByZXNzZWRTaXplOiBpbmRleC51bmNvbXByZXNzZWRTaXplLCBnZXRSYW5nZTogdGhpcy5tYWtlR2V0UmFuZ2UoZmlsZUlkLCBpbmRleCwgcmF3R2V0UmFuZ2UpIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlR2V0UmFuZ2UoZmlsZUlkOiBzdHJpbmcsIGluZGV4OiBGaWxlSW5kZXgsIHJhd0dldFJhbmdlOiBHZXRSYW5nZSk6IEdldFJhbmdlIHtcbiAgICAgICAgbGV0IGJsb2NrU2l6ZSA9IGluZGV4LmJsb2NrU2l6ZTtcbiAgICAgICAgcmV0dXJuIGFzeW5jIChzdGFydCwgZW5kKSA9PiB7XG4gICAgICAgICAgICBpZiAoZW5kIDw9IHN0YXJ0KSByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgICBsZXQgZmlyc3RCbG9jayA9IE1hdGguZmxvb3Ioc3RhcnQgLyBibG9ja1NpemUpO1xuICAgICAgICAgICAgbGV0IGxhc3RCbG9jayA9IE1hdGguZmxvb3IoKGVuZCAtIDEpIC8gYmxvY2tTaXplKTtcblxuICAgICAgICAgICAgbGV0IHBhcnRzOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IGJsb2NrID0gZmlyc3RCbG9jaztcbiAgICAgICAgICAgIHdoaWxlIChibG9jayA8PSBsYXN0QmxvY2spIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gYCR7ZmlsZUlkfToke2Jsb2NrfWA7XG4gICAgICAgICAgICAgICAgbGV0IGNhY2hlZCA9IHRoaXMuYmxvY2tzLmdldChrZXkpO1xuICAgICAgICAgICAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3VjaChrZXksIGNhY2hlZCk7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goYXdhaXQgY2FjaGVkKTtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2srKztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENvYWxlc2NlIGEgcnVuIG9mIGNvbnNlY3V0aXZlIG1pc3NpbmcgYmxvY2tzIGludG8gb25lIHVuZGVybHlpbmcgKGNvbXByZXNzZWQpIHJlYWQuXG4gICAgICAgICAgICAgICAgbGV0IHJ1blN0YXJ0ID0gYmxvY2s7XG4gICAgICAgICAgICAgICAgbGV0IHJ1bkVuZCA9IGJsb2NrICsgMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocnVuRW5kIDw9IGxhc3RCbG9jayAmJiAhdGhpcy5ibG9ja3MuaGFzKGAke2ZpbGVJZH06JHtydW5FbmR9YCkpIHJ1bkVuZCsrO1xuICAgICAgICAgICAgICAgIGxldCBjb21wU3RhcnQgPSBpbmRleC5vZmZzZXRzW3J1blN0YXJ0XTtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdE1ldGEgPSBpbmRleC5ibG9ja3NbcnVuRW5kIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IGNvbXBFbmQgPSBpbmRleC5vZmZzZXRzW3J1bkVuZCAtIDFdICsgbGFzdE1ldGEubGVuO1xuICAgICAgICAgICAgICAgIGxldCBydW5Db21wcmVzc2VkID0gcmF3R2V0UmFuZ2UoY29tcFN0YXJ0LCBjb21wRW5kKTtcbiAgICAgICAgICAgICAgICAvLyBIb2xkIHRoaXMgcnVuJ3MgcHJvbWlzZXMgbG9jYWxseS4gUmVnaXN0ZXJpbmcgdGhlbSBpbiB0aGUgTFJVIGNhbiBldmljdCBlYXJsaWVyIGJsb2NrcyBvZiB0aGUgc2FtZSBydW4gKG9yIG9mIGEgY29uY3VycmVudCBydW4pIGJlZm9yZSB3ZSBnZXQgdG8gYXdhaXQgdGhlbSwgc28gcmVhZGluZyB0aGVtIGJhY2sgb3V0IG9mIHRoZSBjYWNoZSB3b3VsZCBzaWxlbnRseSBkcm9wIGJsb2NrcyBhbmQgcmV0dXJuIGEgc2hvcnQgYnVmZmVyLiBXZSBzdGlsbCByZWdpc3RlciBpbiB0aGUgTFJVIHNvIGNvbmN1cnJlbnQgcmVhZHMgZGVkdXBlIG9udG8gdGhlbS5cbiAgICAgICAgICAgICAgICBsZXQgcnVuUHJvbWlzZXM6IFByb21pc2U8QnVmZmVyPltdID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJ1blN0YXJ0OyBpIDwgcnVuRW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1ldGEgPSBpbmRleC5ibG9ja3NbaV07XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWxPZmZzZXQgPSBpbmRleC5vZmZzZXRzW2ldIC0gY29tcFN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmxvY2tQcm9taXNlID0gcnVuQ29tcHJlc3NlZC50aGVuKGJ1ZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RvcmVkID0gYnVmLnN1YmFycmF5KHJlbE9mZnNldCwgcmVsT2Zmc2V0ICsgbWV0YS5sZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEuYykgcmV0dXJuIExaNC5kZWNvbXByZXNzKHN0b3JlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmVkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcnVuUHJvbWlzZXMucHVzaChibG9ja1Byb21pc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdWNoKGAke2ZpbGVJZH06JHtpfWAsIGJsb2NrUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHByb21pc2Ugb2YgcnVuUHJvbWlzZXMpIHBhcnRzLnB1c2goYXdhaXQgcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgYmxvY2sgPSBydW5FbmQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjb21iaW5lZCA9IHBhcnRzLmxlbmd0aCA9PT0gMSAmJiBwYXJ0c1swXSB8fCBCdWZmZXIuY29uY2F0KHBhcnRzKTtcbiAgICAgICAgICAgIGxldCBzbGljZVN0YXJ0ID0gc3RhcnQgLSBmaXJzdEJsb2NrICogYmxvY2tTaXplO1xuICAgICAgICAgICAgLy8gQSBzaG9ydCBjb21iaW5lZCBidWZmZXIgbWVhbnMgd2UgbG9zdCBibG9ja3M7IHN1YmFycmF5IHdvdWxkIGNsYW1wIGFuZCBoYW5kIGJhY2sgdHJ1bmNhdGVkIGRhdGEgdGhhdCBldmVyeSBjYWxsZXIgdHJlYXRzIGFzIHZhbGlkLiBGYWlsIGxvdWRseSBpbnN0ZWFkLlxuICAgICAgICAgICAgaWYgKGNvbWJpbmVkLmxlbmd0aCA8IHNsaWNlU3RhcnQgKyAoZW5kIC0gc3RhcnQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke3NsaWNlU3RhcnQgKyAoZW5kIC0gc3RhcnQpfSBieXRlcyBvZiBibG9ja3MgZm9yIHJhbmdlIFske3N0YXJ0fSwgJHtlbmR9KSBvZiAke2ZpbGVJZH0sIHdhcyAke2NvbWJpbmVkLmxlbmd0aH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb21iaW5lZC5zdWJhcnJheShzbGljZVN0YXJ0LCBzbGljZVN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSk7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vLyBTaGFyZWQgYWNyb3NzIGV2ZXJ5IEJ1bGtEYXRhYmFzZTIgY29sbGVjdGlvbi9maWxlICh0aGUgNTEyTUIgYnVkZ2V0IGlzIGdsb2JhbCkuXG5leHBvcnQgY29uc3QgYmxvY2tDYWNoZSA9IG5ldyBCbG9ja0NhY2hlKCk7XG4iXX0=
|
|
163
|
-
/* _JS_SOURCE_HASH = "
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tDYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJsb2NrQ2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWtEO0FBRWxELCtGQUErRjtBQUMvRixHQUFHO0FBQ0gsMlhBQTJYO0FBQzNYLEdBQUc7QUFDSCxpRkFBaUY7QUFDakYsR0FBRztBQUNILDZYQUE2WDtBQUM3WCxHQUFHO0FBQ0gseUlBQXlJO0FBRXpJLE1BQU0sVUFBVSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDOUIsNEVBQTRFO0FBQzVFLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLGdEQUFnRDtBQUNoRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztBQUNoRSxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUVoQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBVyxDQUFDO0FBYXhDLCtFQUErRTtBQUMvRSxTQUFnQixzQkFBc0IsQ0FBQyxJQUFZO0lBQy9DLElBQUksTUFBTSxHQUFnQixFQUFFLENBQUM7SUFDN0IsSUFBSSxXQUFXLEdBQWEsRUFBRSxDQUFDO0lBQy9CLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNyRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFLElBQUksQ0FB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QUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsK0JBQStCLEtBQUssS0FBSyxHQUFHLFFBQVEsTUFBTSxTQUFTLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ2hKLENBQUM7WUFDRCxPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFVBQVUsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQztJQUNOLENBQUM7Q0FDSjtBQWxIRCxnQ0FrSEM7QUFFRCxrRkFBa0Y7QUFDckUsUUFBQSxVQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExaNCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2x6NC9MWjRcIjtcblxuLy8gQmxvY2stYWxpZ25lZCwgcHJvbWlzZS1kZWR1cGVkLCBkZWNvbXByZXNzaW5nIHJhbmdlIGNhY2hlIGZvciBCdWxrRGF0YWJhc2UyJ3Mgb24tZGlzayBmaWxlcy5cbi8vIFxuLy8gT24tZGlzayBmb3JtYXQgKHByb2R1Y2VkIGJ5IGVuY29kZUNvbXByZXNzZWRCbG9ja3MpOiB0aGUgbG9naWNhbCAodW5jb21wcmVzc2VkKSBidWxrIGJ1ZmZlciBpcyBzcGxpdCBpbnRvIGZpeGVkIEJMT0NLX1NJWkUgYmxvY2tzOyBlYWNoIGJsb2NrIGlzIExaNC1jb21wcmVzc2VkIHVubGVzcyB0aGF0IHdvdWxkbid0IHNocmluayBpdCBieSBhdCBsZWFzdCAyeCwgaW4gd2hpY2ggY2FzZSBpdCdzIHN0b3JlZCByYXcuIFRoZSBmaWxlIHN0YXJ0cyB3aXRoIGEgSlNPTiBpbmRleCBtYXBwaW5nIGVhY2ggYmxvY2sgdG8gaXRzIHN0b3JlZCBsZW5ndGggKyBhIGNvbXByZXNzZWQgZmxhZywgc28gYSByZWFkZXIgY2FuIHNlZWsgc3RyYWlnaHQgdG8gYW55IGJsb2NrOlxuLy8gXG4vLyAgIFt1MzIgaW5kZXhMZW5ndGhdW2luZGV4IEpTT05dW2Jsb2NrIDAgc3RvcmVkIGJ5dGVzXVtibG9jayAxIHN0b3JlZCBieXRlc10uLi5cbi8vIFxuLy8gVGhlIGNhY2hlIHByZXNlbnRzIGEgKmxvZ2ljYWwqIGdldFJhbmdlIChvdmVyIHVuY29tcHJlc3NlZCBieXRlcykgc28gQnVsa0RhdGFiYXNlMidzIHJlYWRlciBpcyBvYmxpdmlvdXMgdG8gY29tcHJlc3Npb24uIEl0IHJlYWRzIGNvbXByZXNzZWQgYnl0ZXMgdmlhIHRoZSB1bmRlcmx5aW5nIGdldFJhbmdlLCBkZWNvbXByZXNzZXMsIGFuZCBjYWNoZXMgdGhlIHVuY29tcHJlc3NlZCBibG9ja3MuIFJlYWRzIGFyZSBwcm9taXNlLWRlZHVwZWQgYW5kIGNvbnRpZ3VvdXMgbWlzc2luZyBibG9ja3MgYXJlIGNvYWxlc2NlZCBpbnRvIG9uZSB1bmRlcmx5aW5nIHJlYWQuIEZpbGVzIGFyZSBpbW11dGFibGUsIHNvIGNhY2hlZCBibG9ja3MgYXJlIHZhbGlkIGZvcmV2ZXIuXG4vLyBcbi8vIFBlci1ibG9jayBjb21wcmVzc2lvbiBtYWlubHkgaGVscHMgc2xvdyBzdG9yYWdlIChIREQpOiBmZXdlciBieXRlcyBvZmYgZGlzayBwZXIgYmxvY2ssIGF0IHRoZSBjb3N0IG9mIGEgZmFzdCBpbi1tZW1vcnkgTFo0IGRlY29tcHJlc3MuXG5cbmNvbnN0IEJMT0NLX1NJWkUgPSAyNTYgKiAxMDI0O1xuLy8gMTI4TUIgcGVyIGNvbnRleHQuIFRoaXMgY2FjaGUgZXhpc3RzIHBlciBicm93c2luZyBjb250ZXh0IChlYWNoIHRhYiwgZWFjaFxuLy8gd29ya2VyKSwgc28gYSBnZW5lcm91cyBjYXAgbXVsdGlwbGllcyBmYXN0IOKAlCBhdCA1MTJNQiwgdGhyZWUgc2FtZS1wcm9jZXNzXG4vLyB0YWJzIGNvdWxkIHBpbiAxLjVHQiBvZiBibG9jayBkYXRhLCBhbmQgdGhlIHJlc3VsdGluZyBHQyBwcmVzc3VyZSB2aXNpYmx5XG4vLyBqYW5rcyB2aWRlbyBwbGF5YmFjay4gMTI4TUIgc3RpbGwgaG9sZHMgfjUwMCBob3QgYmxvY2tzIHBlciBjb250ZXh0OyBtaXNzZXNcbi8vIGp1c3QgcmUtcmVhZCBmcm9tIGxvY2FsIGRpc2ssIHdoaWNoIGlzIGNoZWFwLlxuY29uc3QgTUFYX0JMT0NLUyA9IE1hdGguZmxvb3IoKDEyOCAqIDEwMjQgKiAxMDI0KSAvIEJMT0NLX1NJWkUpO1xuY29uc3QgTUlOX0NPTVBSRVNTSU9OX1JBVElPID0gMjtcblxuY29uc3QgRU1QVFkgPSBCdWZmZXIuYWxsb2MoMCkgYXMgQnVmZmVyO1xuXG5leHBvcnQgdHlwZSBHZXRSYW5nZSA9IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4gUHJvbWlzZTxCdWZmZXI+O1xuXG50eXBlIEJsb2NrTWV0YSA9IHsgbGVuOiBudW1iZXI7IGM6IDAgfCAxIH07XG50eXBlIEZpbGVJbmRleCA9IHtcbiAgICB1bmNvbXByZXNzZWRTaXplOiBudW1iZXI7XG4gICAgYmxvY2tTaXplOiBudW1iZXI7XG4gICAgYmxvY2tzOiBCbG9ja01ldGFbXTtcbiAgICAvLyBTdG9yZWQgYnl0ZSBvZmZzZXQgb2YgZWFjaCBibG9jayAob2Zmc2V0c1tpXS4ub2Zmc2V0c1tpXStibG9ja3NbaV0ubGVuKSwgZmlsbGVkIGluIG9uIHBhcnNlLlxuICAgIG9mZnNldHM6IG51bWJlcltdO1xufTtcblxuLy8gV3JpdGVzIGEgbG9naWNhbCBidWxrIGJ1ZmZlciBpbiB0aGUgY29tcHJlc3NlZC1ibG9jayBmb3JtYXQgZGVzY3JpYmVkIGFib3ZlLlxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUNvbXByZXNzZWRCbG9ja3MoZGF0YTogQnVmZmVyKTogQnVmZmVyIHtcbiAgICBsZXQgYmxvY2tzOiBCbG9ja01ldGFbXSA9IFtdO1xuICAgIGxldCBzdG9yZWRQYXJ0czogQnVmZmVyW10gPSBbXTtcbiAgICBsZXQgYmxvY2tDb3VudCA9IE1hdGguY2VpbChkYXRhLmxlbmd0aCAvIEJMT0NLX1NJWkUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tDb3VudDsgaSsrKSB7XG4gICAgICAgIGxldCByYXcgPSBkYXRhLnN1YmFycmF5KGkgKiBCTE9DS19TSVpFLCBNYXRoLm1pbigoaSArIDEpICogQkxPQ0tfU0laRSwgZGF0YS5sZW5ndGgpKTtcbiAgICAgICAgbGV0IGNvbXByZXNzZWQgPSBMWjQuY29tcHJlc3MocmF3KTtcbiAgICAgICAgLy8gT25seSBrZWVwIHRoZSBjb21wcmVzc2VkIGZvcm0gaWYgaXQgc2hyaW5rcyB0aGUgYmxvY2sgYnkgYXQgbGVhc3QgTUlOX0NPTVBSRVNTSU9OX1JBVElPLlxuICAgICAgICBpZiAoY29tcHJlc3NlZC5sZW5ndGggKiBNSU5fQ09NUFJFU1NJT05fUkFUSU8gPD0gcmF3Lmxlbmd0aCkge1xuICAgICAgICAgICAgc3RvcmVkUGFydHMucHVzaChjb21wcmVzc2VkKTtcbiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKHsgbGVuOiBjb21wcmVzc2VkLmxlbmd0aCwgYzogMSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0b3JlZFBhcnRzLnB1c2gocmF3KTtcbiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKHsgbGVuOiByYXcubGVuZ3RoLCBjOiAwIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBpbmRleEJ1ZiA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgdW5jb21wcmVzc2VkU2l6ZTogZGF0YS5sZW5ndGgsIGJsb2NrU2l6ZTogQkxPQ0tfU0laRSwgYmxvY2tzIH0pLCBcInV0ZjhcIik7XG4gICAgbGV0IHByZWZpeCA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBwcmVmaXgud3JpdGVVSW50MzJMRShpbmRleEJ1Zi5sZW5ndGgsIDApO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtwcmVmaXgsIGluZGV4QnVmLCAuLi5zdG9yZWRQYXJ0c10pO1xufVxuXG5leHBvcnQgY2xhc3MgQmxvY2tDYWNoZSB7XG4gICAgLy8gVW5jb21wcmVzc2VkIGJsb2NrczsgaW5zZXJ0aW9uIG9yZGVyIGlzIExSVSBvcmRlciAocmUtaW5zZXJ0ZWQgb24gYWNjZXNzKS5cbiAgICBwcml2YXRlIGJsb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPEJ1ZmZlcj4+KCk7XG4gICAgLy8gUGFyc2VkIGZpbGUgaW5kZXggcGVyIGZpbGVJZCAoc21hbGw7IG5vdCBzdWJqZWN0IHRvIHRoZSBibG9jayBMUlUpLlxuICAgIHByaXZhdGUgaW5kZXhlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPEZpbGVJbmRleD4+KCk7XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuYmxvY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaW5kZXhlcy5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBldmljdChmaWxlSWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmluZGV4ZXMuZGVsZXRlKGZpbGVJZCk7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGZpbGVJZCArIFwiOlwiO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmJsb2Nrcy5rZXlzKCkpIGlmIChrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSB0aGlzLmJsb2Nrcy5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvdWNoKGtleTogc3RyaW5nLCB2YWx1ZTogUHJvbWlzZTxCdWZmZXI+KSB7XG4gICAgICAgIHRoaXMuYmxvY2tzLmRlbGV0ZShrZXkpO1xuICAgICAgICB0aGlzLmJsb2Nrcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHdoaWxlICh0aGlzLmJsb2Nrcy5zaXplID4gTUFYX0JMT0NLUykge1xuICAgICAgICAgICAgbGV0IG9sZGVzdCA9IHRoaXMuYmxvY2tzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgICAgICBpZiAob2xkZXN0ID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgICAgICAgdGhpcy5ibG9ja3MuZGVsZXRlKG9sZGVzdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWFkcyArIHZhbGlkYXRlcyB0aGUgZmlsZSBpbmRleC4gUmVqZWN0cyB0aGUgV0hPTEUgZmlsZSBpZiBpdCBpc24ndCBleGFjdGx5IHRoZSBzaXplIGl0cyBpbmRleCBpbXBsaWVzIOKAlCBhIHRydW5jYXRlZC9wYXJ0aWFsIHdyaXRlIChlLmcuIGEgY3Jhc2ggbWlkLXdyaXRlKSBpcyBkZXRlY3RlZCBoZXJlIHJhdGhlciB0aGFuIHNpbGVudGx5IHJldHVybmluZyBjb3JydXB0ZWQgdmFsdWVzIGZvciB0aGUgcm93cyBuZWFyIHRoZSBlbmQuXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkSW5kZXgocmF3R2V0UmFuZ2U6IEdldFJhbmdlLCBmaWxlU2l6ZTogbnVtYmVyKTogUHJvbWlzZTxGaWxlSW5kZXg+IHtcbiAgICAgICAgbGV0IGhlYWQgPSBhd2FpdCByYXdHZXRSYW5nZSgwLCA0KTtcbiAgICAgICAgaWYgKGhlYWQubGVuZ3RoIDwgNCkgdGhyb3cgbmV3IEVycm9yKGBidWxrIGZpbGUgdG9vIHNob3J0IGZvciBhbiBpbmRleCBoZWFkZXIgKCR7ZmlsZVNpemV9IGJ5dGVzKWApO1xuICAgICAgICBsZXQgaW5kZXhMZW5ndGggPSBoZWFkLnJlYWRVSW50MzJMRSgwKTtcbiAgICAgICAgaWYgKGluZGV4TGVuZ3RoIDw9IDAgfHwgNCArIGluZGV4TGVuZ3RoID4gZmlsZVNpemUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYnVsayBmaWxlIGluZGV4IGxlbmd0aCAke2luZGV4TGVuZ3RofSBpcyBpbnZhbGlkIGZvciBhICR7ZmlsZVNpemV9LWJ5dGUgZmlsZWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbmRleEJ1ZiA9IGF3YWl0IHJhd0dldFJhbmdlKDQsIDQgKyBpbmRleExlbmd0aCk7XG4gICAgICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGluZGV4QnVmLnRvU3RyaW5nKFwidXRmOFwiKSkgYXMgeyB1bmNvbXByZXNzZWRTaXplOiBudW1iZXI7IGJsb2NrU2l6ZTogbnVtYmVyOyBibG9ja3M6IEJsb2NrTWV0YVtdIH07XG4gICAgICAgIGxldCBkYXRhQmFzZSA9IDQgKyBpbmRleExlbmd0aDtcbiAgICAgICAgbGV0IG9mZnNldHM6IG51bWJlcltdID0gW107XG4gICAgICAgIGxldCBvZmZzZXQgPSBkYXRhQmFzZTtcbiAgICAgICAgZm9yIChsZXQgYmxvY2sgb2YgcGFyc2VkLmJsb2Nrcykge1xuICAgICAgICAgICAgb2Zmc2V0cy5wdXNoKG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gYmxvY2subGVuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBibG9ja3MgbXVzdCBhY2NvdW50IGZvciBleGFjdGx5IHRoZSByZXN0IG9mIHRoZSBmaWxlLiBBbnkgbWlzbWF0Y2ggbWVhbnMgdGhlIGZpbGUgaXMgdHJ1bmNhdGVkIG9yIG90aGVyd2lzZSBjb3JydXB0IOKAlCByZWplY3QgaXQgZW50aXJlbHkuXG4gICAgICAgIGlmIChvZmZzZXQgIT09IGZpbGVTaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1bGsgZmlsZSBpcyAke2ZpbGVTaXplfSBieXRlcyBidXQgaXRzIGluZGV4IGltcGxpZXMgJHtvZmZzZXR9ICh0cnVuY2F0ZWQvY29ycnVwdClgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyAuLi5wYXJzZWQsIG9mZnNldHMgfTtcbiAgICB9XG5cbiAgICAvLyBPcGVucyBhbiBpbW11dGFibGUgZmlsZTogcmVhZHMgKyB2YWxpZGF0ZXMgaXRzIGluZGV4IChjYWNoZWQpIGFuZCByZXR1cm5zIHRoZSBsb2dpY2FsICh1bmNvbXByZXNzZWQpIHNpemUgcGx1cyBhIGxvZ2ljYWwgZ2V0UmFuZ2UgdGhhdCB0aGUgY2FsbGVyIGNhbiB1c2UgZXhhY3RseSBsaWtlIGFuIHVuY29tcHJlc3NlZCBmaWxlLiBgZmlsZVNpemVgIGlzIHRoZSBhY3R1YWwgb24tZGlzayBieXRlIGxlbmd0aCwgdXNlZCB0byBkZXRlY3QgdHJ1bmNhdGlvbi5cbiAgICBwdWJsaWMgYXN5bmMgb3BlbihmaWxlSWQ6IHN0cmluZywgZmlsZVNpemU6IG51bWJlciwgcmF3R2V0UmFuZ2U6IEdldFJhbmdlKTogUHJvbWlzZTx7IHVuY29tcHJlc3NlZFNpemU6IG51bWJlcjsgZ2V0UmFuZ2U6IEdldFJhbmdlIH0+IHtcbiAgICAgICAgbGV0IGluZGV4UHJvbWlzZSA9IHRoaXMuaW5kZXhlcy5nZXQoZmlsZUlkKTtcbiAgICAgICAgaWYgKCFpbmRleFByb21pc2UpIHtcbiAgICAgICAgICAgIGluZGV4UHJvbWlzZSA9IHRoaXMucmVhZEluZGV4KHJhd0dldFJhbmdlLCBmaWxlU2l6ZSk7XG4gICAgICAgICAgICB0aGlzLmluZGV4ZXMuc2V0KGZpbGVJZCwgaW5kZXhQcm9taXNlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5kZXggPSBhd2FpdCBpbmRleFByb21pc2U7XG4gICAgICAgIHJldHVybiB7IHVuY29tcHJlc3NlZFNpemU6IGluZGV4LnVuY29tcHJlc3NlZFNpemUsIGdldFJhbmdlOiB0aGlzLm1ha2VHZXRSYW5nZShmaWxlSWQsIGluZGV4LCByYXdHZXRSYW5nZSkgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VHZXRSYW5nZShmaWxlSWQ6IHN0cmluZywgaW5kZXg6IEZpbGVJbmRleCwgcmF3R2V0UmFuZ2U6IEdldFJhbmdlKTogR2V0UmFuZ2Uge1xuICAgICAgICBsZXQgYmxvY2tTaXplID0gaW5kZXguYmxvY2tTaXplO1xuICAgICAgICByZXR1cm4gYXN5bmMgKHN0YXJ0LCBlbmQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgIGxldCBmaXJzdEJsb2NrID0gTWF0aC5mbG9vcihzdGFydCAvIGJsb2NrU2l6ZSk7XG4gICAgICAgICAgICBsZXQgbGFzdEJsb2NrID0gTWF0aC5mbG9vcigoZW5kIC0gMSkgLyBibG9ja1NpemUpO1xuXG4gICAgICAgICAgICBsZXQgcGFydHM6IEJ1ZmZlcltdID0gW107XG4gICAgICAgICAgICBsZXQgYmxvY2sgPSBmaXJzdEJsb2NrO1xuICAgICAgICAgICAgd2hpbGUgKGJsb2NrIDw9IGxhc3RCbG9jaykge1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBgJHtmaWxlSWR9OiR7YmxvY2t9YDtcbiAgICAgICAgICAgICAgICBsZXQgY2FjaGVkID0gdGhpcy5ibG9ja3MuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdWNoKGtleSwgY2FjaGVkKTtcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaChhd2FpdCBjYWNoZWQpO1xuICAgICAgICAgICAgICAgICAgICBibG9jaysrO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29hbGVzY2UgYSBydW4gb2YgY29uc2VjdXRpdmUgbWlzc2luZyBibG9ja3MgaW50byBvbmUgdW5kZXJseWluZyAoY29tcHJlc3NlZCkgcmVhZC5cbiAgICAgICAgICAgICAgICBsZXQgcnVuU3RhcnQgPSBibG9jaztcbiAgICAgICAgICAgICAgICBsZXQgcnVuRW5kID0gYmxvY2sgKyAxO1xuICAgICAgICAgICAgICAgIHdoaWxlIChydW5FbmQgPD0gbGFzdEJsb2NrICYmICF0aGlzLmJsb2Nrcy5oYXMoYCR7ZmlsZUlkfToke3J1bkVuZH1gKSkgcnVuRW5kKys7XG4gICAgICAgICAgICAgICAgbGV0IGNvbXBTdGFydCA9IGluZGV4Lm9mZnNldHNbcnVuU3RhcnRdO1xuICAgICAgICAgICAgICAgIGxldCBsYXN0TWV0YSA9IGluZGV4LmJsb2Nrc1tydW5FbmQgLSAxXTtcbiAgICAgICAgICAgICAgICBsZXQgY29tcEVuZCA9IGluZGV4Lm9mZnNldHNbcnVuRW5kIC0gMV0gKyBsYXN0TWV0YS5sZW47XG4gICAgICAgICAgICAgICAgbGV0IHJ1bkNvbXByZXNzZWQgPSByYXdHZXRSYW5nZShjb21wU3RhcnQsIGNvbXBFbmQpO1xuICAgICAgICAgICAgICAgIC8vIEhvbGQgdGhpcyBydW4ncyBwcm9taXNlcyBsb2NhbGx5LiBSZWdpc3RlcmluZyB0aGVtIGluIHRoZSBMUlUgY2FuIGV2aWN0IGVhcmxpZXIgYmxvY2tzIG9mIHRoZSBzYW1lIHJ1biAob3Igb2YgYSBjb25jdXJyZW50IHJ1bikgYmVmb3JlIHdlIGdldCB0byBhd2FpdCB0aGVtLCBzbyByZWFkaW5nIHRoZW0gYmFjayBvdXQgb2YgdGhlIGNhY2hlIHdvdWxkIHNpbGVudGx5IGRyb3AgYmxvY2tzIGFuZCByZXR1cm4gYSBzaG9ydCBidWZmZXIuIFdlIHN0aWxsIHJlZ2lzdGVyIGluIHRoZSBMUlUgc28gY29uY3VycmVudCByZWFkcyBkZWR1cGUgb250byB0aGVtLlxuICAgICAgICAgICAgICAgIGxldCBydW5Qcm9taXNlczogUHJvbWlzZTxCdWZmZXI+W10gPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcnVuU3RhcnQ7IGkgPCBydW5FbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWV0YSA9IGluZGV4LmJsb2Nrc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlbE9mZnNldCA9IGluZGV4Lm9mZnNldHNbaV0gLSBjb21wU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBibG9ja1Byb21pc2UgPSBydW5Db21wcmVzc2VkLnRoZW4oYnVmID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdG9yZWQgPSBidWYuc3ViYXJyYXkocmVsT2Zmc2V0LCByZWxPZmZzZXQgKyBtZXRhLmxlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0YS5jKSByZXR1cm4gTFo0LmRlY29tcHJlc3Moc3RvcmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBydW5Qcm9taXNlcy5wdXNoKGJsb2NrUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG91Y2goYCR7ZmlsZUlkfToke2l9YCwgYmxvY2tQcm9taXNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcHJvbWlzZSBvZiBydW5Qcm9taXNlcykgcGFydHMucHVzaChhd2FpdCBwcm9taXNlKTtcbiAgICAgICAgICAgICAgICBibG9jayA9IHJ1bkVuZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNvbWJpbmVkID0gcGFydHMubGVuZ3RoID09PSAxICYmIHBhcnRzWzBdIHx8IEJ1ZmZlci5jb25jYXQocGFydHMpO1xuICAgICAgICAgICAgbGV0IHNsaWNlU3RhcnQgPSBzdGFydCAtIGZpcnN0QmxvY2sgKiBibG9ja1NpemU7XG4gICAgICAgICAgICAvLyBBIHNob3J0IGNvbWJpbmVkIGJ1ZmZlciBtZWFucyB3ZSBsb3N0IGJsb2Nrczsgc3ViYXJyYXkgd291bGQgY2xhbXAgYW5kIGhhbmQgYmFjayB0cnVuY2F0ZWQgZGF0YSB0aGF0IGV2ZXJ5IGNhbGxlciB0cmVhdHMgYXMgdmFsaWQuIEZhaWwgbG91ZGx5IGluc3RlYWQuXG4gICAgICAgICAgICBpZiAoY29tYmluZWQubGVuZ3RoIDwgc2xpY2VTdGFydCArIChlbmQgLSBzdGFydCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7c2xpY2VTdGFydCArIChlbmQgLSBzdGFydCl9IGJ5dGVzIG9mIGJsb2NrcyBmb3IgcmFuZ2UgWyR7c3RhcnR9LCAke2VuZH0pIG9mICR7ZmlsZUlkfSwgd2FzICR7Y29tYmluZWQubGVuZ3RofWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVkLnN1YmFycmF5KHNsaWNlU3RhcnQsIHNsaWNlU3RhcnQgKyAoZW5kIC0gc3RhcnQpKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbi8vIFNoYXJlZCBhY3Jvc3MgZXZlcnkgQnVsa0RhdGFiYXNlMiBjb2xsZWN0aW9uL2ZpbGUgKHRoZSA1MTJNQiBidWRnZXQgaXMgZ2xvYmFsKS5cbmV4cG9ydCBjb25zdCBibG9ja0NhY2hlID0gbmV3IEJsb2NrQ2FjaGUoKTtcbiJdfQ==
|
|
168
|
+
/* _JS_SOURCE_HASH = "419a5bb907ff279f5054010d6219bbf6a060d17918d0261bfac6b246d6c09e77"; */
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
2
|
// Browser-side cross-tab write sync for BulkDatabase2, over BroadcastChannel (one channel per collection, same-origin tabs and workers). It does NOT persist anything — each side writes to disk itself; this just relays live writes to other open tabs/workers and, when one starts up, asks peers for writes they've made recently that may not be on disk yet. No-op in Node / where BroadcastChannel is unavailable, so BulkDatabase2 can call these unconditionally. This is an optional feature, so there is no fallback.
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
4
|
-
//exports.broadcastSeal = exports.broadcast = exports.connect = exports.isSyncSupported = void 0;
|
|
4
|
+
//exports.broadcastSeal = exports.queryLiveWriters = exports.broadcast = exports.connect = exports.isSyncSupported = exports.registerWriterId = void 0;
|
|
5
5
|
// Writes older than this are assumed already flushed to disk (a freshly-opened tab gets those by reading disk), so a tab only replays writes newer than this when a peer says hello.
|
|
6
6
|
const RECENT_WINDOW_MS = 60000;
|
|
7
7
|
const channels = new Map();
|
|
8
|
+
// The id this process stamps into its stream file names. Registered by BulkDatabase2 so we can answer a peer's liveness probe even on a channel that was created by a write rather than by connect().
|
|
9
|
+
let selfWriterId;
|
|
10
|
+
function registerWriterId(id) {
|
|
11
|
+
selfWriterId = id;
|
|
12
|
+
}
|
|
13
|
+
exports.registerWriterId = registerWriterId;
|
|
8
14
|
function isSyncSupported() {
|
|
9
15
|
// window (main-thread browser) or WorkerGlobalScope (Web/Service/Shared worker) — but not Node (typesafecss's isNode is `typeof window === "undefined"`, which misclassifies workers)
|
|
10
16
|
let isBrowserOrWorker = typeof window !== "undefined"
|
|
@@ -28,7 +34,7 @@ function ensure(collection) {
|
|
|
28
34
|
return channel;
|
|
29
35
|
// BroadcastChannel never delivers a message back to the instance that sent it, so a tab never hears its own writes — only the other open tabs do.
|
|
30
36
|
const bc = new BroadcastChannel(`bulkDatabase2:${collection}`);
|
|
31
|
-
const created = { bc, subscribers: [], sealSubscribers: [], recent: [] };
|
|
37
|
+
const created = { bc, subscribers: [], sealSubscribers: [], recent: [], aliveReplies: new Set() };
|
|
32
38
|
bc.onmessage = (event) => {
|
|
33
39
|
const msg = event.data;
|
|
34
40
|
if (!msg)
|
|
@@ -45,6 +51,13 @@ function ensure(collection) {
|
|
|
45
51
|
for (const sub of created.sealSubscribers)
|
|
46
52
|
sub();
|
|
47
53
|
}
|
|
54
|
+
else if (msg.type === "whoIsAlive") {
|
|
55
|
+
if (selfWriterId)
|
|
56
|
+
created.bc.postMessage({ type: "alive", writerId: selfWriterId });
|
|
57
|
+
}
|
|
58
|
+
else if (msg.type === "alive" && msg.writerId) {
|
|
59
|
+
created.aliveReplies.add(msg.writerId);
|
|
60
|
+
}
|
|
48
61
|
else if (msg.type === "hello") {
|
|
49
62
|
// Another tab just started; replay our recent writes so it doesn't miss any. The reply goes to every tab, but peers that already have a write ignore it (its timestamp isn't newer than what they hold), so the redundant broadcast is harmless.
|
|
50
63
|
pruneRecent(created);
|
|
@@ -76,6 +89,19 @@ function broadcast(collection, write) {
|
|
|
76
89
|
channel.bc.postMessage({ type: "write", write });
|
|
77
90
|
}
|
|
78
91
|
exports.broadcast = broadcast;
|
|
92
|
+
// Which writer ids are still running, so a merge can tell a stream file whose owner is gone (fold it now) from one that is still being appended to (leave it). Returns undefined where BroadcastChannel is unavailable (Node) — there we cannot know, so the caller must assume every owner is alive and fall back to the age rule.
|
|
93
|
+
//
|
|
94
|
+
// A peer that is frozen or too slow to answer inside timeoutMs looks dead. That is safe, not lossy: the fold writes the stream's rows into a bulk file before deleting the stream, and FileStorage.append recreates a deleted file and seeks to its LIVE size, so a late append starts a fresh file instead of resurrecting folded bytes.
|
|
95
|
+
async function queryLiveWriters(collection, timeoutMs) {
|
|
96
|
+
const channel = ensure(collection);
|
|
97
|
+
if (!channel)
|
|
98
|
+
return undefined;
|
|
99
|
+
channel.aliveReplies.clear();
|
|
100
|
+
channel.bc.postMessage({ type: "whoIsAlive" });
|
|
101
|
+
await new Promise(r => setTimeout(r, timeoutMs));
|
|
102
|
+
return new Set(channel.aliveReplies);
|
|
103
|
+
}
|
|
104
|
+
exports.queryLiveWriters = queryLiveWriters;
|
|
79
105
|
// Ask every other open tab of this collection to seal (stop appending to) its current stream file, so a merge can fold recent data up to the present without racing an append. Best-effort: no-op in Node, and a peer that misses it just keeps appending — worst case the merge folds a prefix and the rest folds later (duplication, resolved by write-time), never data loss.
|
|
80
106
|
function broadcastSeal(collection) {
|
|
81
107
|
const channel = ensure(collection);
|
|
@@ -84,5 +110,5 @@ function broadcastSeal(collection) {
|
|
|
84
110
|
channel.bc.postMessage({ type: "seal" });
|
|
85
111
|
}
|
|
86
112
|
exports.broadcastSeal = broadcastSeal;
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY0NsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN5bmNDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLGlnQkFBaWdCOzs7QUFJamdCLHFMQUFxTDtBQUNyTCxNQUFNLGdCQUFnQixHQUFHLEtBQU0sQ0FBQztBQVdoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztBQUU1QyxTQUFnQixlQUFlO0lBQzNCLHNMQUFzTDtJQUN0TCxJQUFJLGlCQUFpQixHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVc7V0FDOUMsbUJBQW1CLElBQUksVUFBVSxDQUFDO0lBQ3pDLE9BQU8saUJBQWlCLElBQUksT0FBTyxnQkFBZ0IsS0FBSyxXQUFXLENBQUM7QUFDeEUsQ0FBQztBQUxELDBDQUtDO0FBRUQsU0FBUyxXQUFXLENBQUMsT0FBZ0I7SUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGdCQUFnQixDQUFDO0lBQzdDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxPQUFnQixFQUFFLEtBQWtCO0lBQ2pELEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLFdBQVc7UUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLFVBQWtCO0lBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN6QyxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksT0FBTztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzVCLGtKQUFrSjtJQUNsSixNQUFNLEVBQUUs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TSxPQUFPLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTztJQUNyQixPQUFPLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFKRCxzQ0FJQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEJyb3dzZXItc2lkZSBjcm9zcy10YWIgd3JpdGUgc3luYyBmb3IgQnVsa0RhdGFiYXNlMiwgb3ZlciBCcm9hZGNhc3RDaGFubmVsIChvbmUgY2hhbm5lbCBwZXIgY29sbGVjdGlvbiwgc2FtZS1vcmlnaW4gdGFicyBhbmQgd29ya2VycykuIEl0IGRvZXMgTk9UIHBlcnNpc3QgYW55dGhpbmcg4oCUIGVhY2ggc2lkZSB3cml0ZXMgdG8gZGlzayBpdHNlbGY7IHRoaXMganVzdCByZWxheXMgbGl2ZSB3cml0ZXMgdG8gb3RoZXIgb3BlbiB0YWJzL3dvcmtlcnMgYW5kLCB3aGVuIG9uZSBzdGFydHMgdXAsIGFza3MgcGVlcnMgZm9yIHdyaXRlcyB0aGV5J3ZlIG1hZGUgcmVjZW50bHkgdGhhdCBtYXkgbm90IGJlIG9uIGRpc2sgeWV0LiBOby1vcCBpbiBOb2RlIC8gd2hlcmUgQnJvYWRjYXN0Q2hhbm5lbCBpcyB1bmF2YWlsYWJsZSwgc28gQnVsa0RhdGFiYXNlMiBjYW4gY2FsbCB0aGVzZSB1bmNvbmRpdGlvbmFsbHkuIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmVhdHVyZSwgc28gdGhlcmUgaXMgbm8gZmFsbGJhY2suXG5cbmV4cG9ydCB0eXBlIFJlbW90ZVdyaXRlID0geyBrZXk6IHN0cmluZzsgdGltZTogbnVtYmVyOyBkZWxldGVkPzogYm9vbGVhbjsgdmFsdWU/OiB1bmtub3duIH07XG5cbi8vIFdyaXRlcyBvbGRlciB0aGFuIHRoaXMgYXJlIGFzc3VtZWQgYWxyZWFkeSBmbHVzaGVkIHRvIGRpc2sgKGEgZnJlc2hseS1vcGVuZWQgdGFiIGdldHMgdGhvc2UgYnkgcmVhZGluZyBkaXNrKSwgc28gYSB0YWIgb25seSByZXBsYXlzIHdyaXRlcyBuZXdlciB0aGFuIHRoaXMgd2hlbiBhIHBlZXIgc2F5cyBoZWxsby5cbmNvbnN0IFJFQ0VOVF9XSU5ET1dfTVMgPSA2MF8wMDA7XG5cbnR5cGUgQ2hhbm5lbCA9IHtcbiAgICBiYzogQnJvYWRjYXN0Q2hhbm5lbDtcbiAgICBzdWJzY3JpYmVyczogKCh3cml0ZTogUmVtb3RlV3JpdGUpID0+IHZvaWQpW107XG4gICAgLy8gQ2FsbGVkIHdoZW4gYSBwZWVyIGFza3MgZXZlcnlvbmUgdG8gc2VhbCAoc3RvcCBhcHBlbmRpbmcgdG8pIHRoZWlyIGN1cnJlbnQgc3RyZWFtIGZpbGUuXG4gICAgc2VhbFN1YnNjcmliZXJzOiAoKCkgPT4gdm9pZClbXTtcbiAgICAvLyBUaGlzIHRhYidzIG93biByZWNlbnQgd3JpdGVzLCBrZXB0IHNvIGl0IGNhbiBhbnN3ZXIgYW5vdGhlciB0YWIncyBcImhlbGxvXCIuXG4gICAgcmVjZW50OiBSZW1vdGVXcml0ZVtdO1xufTtcblxuY29uc3QgY2hhbm5lbHMgPSBuZXcgTWFwPHN0cmluZywgQ2hhbm5lbD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3luY1N1cHBvcnRlZCgpOiBib29sZWFuIHtcbiAgICAvLyB3aW5kb3cgKG1haW4tdGhyZWFkIGJyb3dzZXIpIG9yIFdvcmtlckdsb2JhbFNjb3BlIChXZWIvU2VydmljZS9TaGFyZWQgd29ya2VyKSDigJQgYnV0IG5vdCBOb2RlICh0eXBlc2FmZWNzcydzIGlzTm9kZSBpcyBgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcImAsIHdoaWNoIG1pc2NsYXNzaWZpZXMgd29ya2VycylcbiAgICBsZXQgaXNCcm93c2VyT3JXb3JrZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgIHx8IFwiV29ya2VyR2xvYmFsU2NvcGVcIiBpbiBnbG9iYWxUaGlzO1xuICAgIHJldHVybiBpc0Jyb3dzZXJPcldvcmtlciAmJiB0eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbCAhPT0gXCJ1bmRlZmluZWRcIjtcbn1cblxuZnVuY3Rpb24gcHJ1bmVSZWNlbnQoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIGNvbnN0IGN1dG9mZiA9IERhdGUubm93KCkgLSBSRUNFTlRfV0lORE9XX01TO1xuICAgIGNoYW5uZWwucmVjZW50ID0gY2hhbm5lbC5yZWNlbnQuZmlsdGVyKHcgPT4gdy50aW1lID49IGN1dG9mZik7XG59XG5cbmZ1bmN0aW9uIGRlbGl2ZXIoY2hhbm5lbDogQ2hhbm5lbCwgd3JpdGU6IFJlbW90ZVdyaXRlKSB7XG4gICAgZm9yIChjb25zdCBzdWIgb2YgY2hhbm5lbC5zdWJzY3JpYmVycykgc3ViKHdyaXRlKTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlKGNvbGxlY3Rpb246IHN0cmluZyk6IENoYW5uZWwgfCB1bmRlZmluZWQge1xuICAgIGlmICghaXNTeW5jU3VwcG9ydGVkKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IGNoYW5uZWwgPSBjaGFubmVscy5nZXQoY29sbGVjdGlvbik7XG4gICAgaWYgKGNoYW5uZWwpIHJldHVybiBjaGFubmVsO1xuICAgIC8vIEJyb2FkY2FzdENoYW5uZWwgbmV2ZXIgZGVsaXZlcnMgYSBtZXNzYWdlIGJhY2sgdG8gdGhlIGluc3RhbmNlIHRoYXQgc2VudCBpdCwgc28gYSB0YWIgbmV2ZXIgaGVhcnMgaXRzIG93biB3cml0ZXMg4oCUIG9ubHkgdGhlIG90aGVyIG9wZW4gdGFicyBkby5cbiAgICBjb25zdCBiYyA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKGBidWxrRGF0YWJhc2UyOiR7Y29sbGVjdGlvbn1gKTtcbiAgICBjb25zdCBjcmVhdGVkOiBDaGFubmVsID0geyBiYywgc3Vic2NyaWJlcnM6IFtdLCBzZWFsU3Vic2NyaWJlcnM6IFtdLCByZWNlbnQ6IFtdIH07XG4gICAgYmMub25tZXNzYWdlID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgbXNnID0gZXZlbnQuZGF0YSBhcyB7IHR5cGU6IHN0cmluZzsgd3JpdGU/OiBSZW1vdGVXcml0ZTsgd3JpdGVzPzogUmVtb3RlV3JpdGVbXSB9O1xuICAgICAgICBpZiAoIW1zZykgcmV0dXJuO1xuICAgICAgICBpZiAobXNnLnR5cGUgPT09IFwid3JpdGVcIiAmJiBtc2cud3JpdGUpIHtcbiAgICAgICAgICAgIGRlbGl2ZXIoY3JlYXRlZCwgbXNnLndyaXRlKTtcbiAgICAgICAgfSBlbHNlIGlmIChtc2cudHlwZSA9PT0gXCJyZWNlbnRcIiAmJiBtc2cud3JpdGVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHdyaXRlIG9mIG1zZy53cml0ZXMpIGRlbGl2ZXIoY3JlYXRlZCwgd3JpdGUpO1xuICAgICAgICB9IGVsc2UgaWYgKG1zZy50eXBlID09PSBcInNlYWxcIikge1xuICAgICAgICAgICAgLy8gQSBwZWVyIGlzIGFib3V0IHRvIGZvbGQgcmVjZW50IGRhdGE7IHN0b3AgYXBwZW5kaW5nIHRvIG91ciBjdXJyZW50IHN0cmVhbSBmaWxlIHNvIGl0IGJlY29tZXMgY29tcGxldGUgYW5kIHRoZSBtZXJnZSBjYW4gZm9sZCBpdCB3aG9sZS4gT3VyIG5leHQgd3JpdGUgc3RhcnRzIGEgZnJlc2ggZmlsZS5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIGNyZWF0ZWQuc2VhbFN1YnNjcmliZXJzKSBzdWIoKTtcbiAgICAgICAgfSBlbHNlIGlmIChtc2cudHlwZSA9PT0gXCJoZWxsb1wiKSB7XG4gICAgICAgICAgICAvLyBBbm90aGVyIHRhYiBqdXN0IHN0YXJ0ZWQ7IHJlcGxheSBvdXIgcmVjZW50IHdyaXRlcyBzbyBpdCBkb2Vzbid0IG1pc3MgYW55LiBUaGUgcmVwbHkgZ29lcyB0byBldmVyeSB0YWIsIGJ1dCBwZWVycyB0aGF0IGFscmVhZHkgaGF2ZSBhIHdyaXRlIGlnbm9yZSBpdCAoaXRzIHRpbWVzdGFtcCBpc24ndCBuZXdlciB0aGFuIHdoYXQgdGhleSBob2xkKSwgc28gdGhlIHJlZHVuZGFudCBicm9hZGNhc3QgaXMgaGFybWxlc3MuXG4gICAgICAgICAgICBwcnVuZVJlY2VudChjcmVhdGVkKTtcbiAgICAgICAgICAgIGlmIChjcmVhdGVkLnJlY2VudC5sZW5ndGgpIGNyZWF0ZWQuYmMucG9zdE1lc3NhZ2UoeyB0eXBlOiBcInJlY2VudFwiLCB3cml0ZXM6IGNyZWF0ZWQucmVjZW50IH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjaGFubmVscy5zZXQoY29sbGVjdGlvbiwgY3JlYXRlZCk7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG59XG5cbi8vIFN1YnNjcmliZSB0byByZW1vdGUgd3JpdGVzIGZvciBhIGNvbGxlY3Rpb24uIFJlY2VudCB3cml0ZXMgZnJvbSBhbHJlYWR5LW9wZW4gdGFicyBhcnJpdmUgdGhyb3VnaCB0aGUgc2FtZSBvbldyaXRlIGNhbGxiYWNrIChhcyB0aGUgcmVwbHkgdG8gb3VyIGhlbGxvKSwgc28gdGhlIHJldHVybmVkIGFycmF5IGlzIGFsd2F5cyBlbXB0eSDigJQgaXQncyBrZXB0IG9ubHkgZm9yIEFQSSBjb21wYXRpYmlsaXR5IHdpdGggY2FsbGVycyB0aGF0IGF3YWl0IGl0LlxuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3QoY29sbGVjdGlvbjogc3RyaW5nLCBvbldyaXRlOiAod3JpdGU6IFJlbW90ZVdyaXRlKSA9PiB2b2lkLCBvblNlYWw/OiAoKSA9PiB2b2lkKTogUHJvbWlzZTxSZW1vdGVXcml0ZVtdPiB7XG4gICAgY29uc3QgY2hhbm5lbCA9IGVuc3VyZShjb2xsZWN0aW9uKTtcbiAgICBpZiAoIWNoYW5uZWwpIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICAgIGNoYW5uZWwuc3Vic2NyaWJlcnMucHVzaChvbldyaXRlKTtcbiAgICBpZiAob25TZWFsKSBjaGFubmVsLnNlYWxTdWJzY3JpYmVycy5wdXNoKG9uU2VhbCk7XG4gICAgY2hhbm5lbC5iYy5wb3N0TWVzc2FnZSh7IHR5cGU6IFwiaGVsbG9cIiB9KTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyb2FkY2FzdChjb2xsZWN0aW9uOiBzdHJpbmcsIHdyaXRlOiBSZW1vdGVXcml0ZSk6IHZvaWQge1xuICAgIGNvbnN0IGNoYW5uZWwgPSBlbnN1cmUoY29sbGVjdGlvbik7XG4gICAgaWYgKCFjaGFubmVsKSByZXR1cm47XG4gICAgY2hhbm5lbC5yZWNlbnQucHVzaCh3cml0ZSk7XG4gICAgcHJ1bmVSZWNlbnQoY2hhbm5lbCk7XG4gICAgY2hhbm5lbC5iYy5wb3N0TWVzc2FnZSh7IHR5cGU6IFwid3JpdGVcIiwgd3JpdGUgfSk7XG59XG5cbi8vIEFzayBldmVyeSBvdGhlciBvcGVuIHRhYiBvZiB0aGlzIGNvbGxlY3Rpb24gdG8gc2VhbCAoc3RvcCBhcHBlbmRpbmcgdG8pIGl0cyBjdXJyZW50IHN0cmVhbSBmaWxlLCBzbyBhIG1lcmdlIGNhbiBmb2xkIHJlY2VudCBkYXRhIHVwIHRvIHRoZSBwcmVzZW50IHdpdGhvdXQgcmFjaW5nIGFuIGFwcGVuZC4gQmVzdC1lZmZvcnQ6IG5vLW9wIGluIE5vZGUsIGFuZCBhIHBlZXIgdGhhdCBtaXNzZXMgaXQganVzdCBrZWVwcyBhcHBlbmRpbmcg4oCUIHdvcnN0IGNhc2UgdGhlIG1lcmdlIGZvbGRzIGEgcHJlZml4IGFuZCB0aGUgcmVzdCBmb2xkcyBsYXRlciAoZHVwbGljYXRpb24sIHJlc29sdmVkIGJ5IHdyaXRlLXRpbWUpLCBuZXZlciBkYXRhIGxvc3MuXG5leHBvcnQgZnVuY3Rpb24gYnJvYWRjYXN0U2VhbChjb2xsZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjaGFubmVsID0gZW5zdXJlKGNvbGxlY3Rpb24pO1xuICAgIGlmICghY2hhbm5lbCkgcmV0dXJuO1xuICAgIGNoYW5uZWwuYmMucG9zdE1lc3NhZ2UoeyB0eXBlOiBcInNlYWxcIiB9KTtcbn1cbiJdfQ==
|
|
88
|
-
/* _JS_SOURCE_HASH = "
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY0NsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN5bmNDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLGlnQkFBaWdCOzs7QUFJamdCLHFMQUFxTDtBQUNyTCxNQUFNLGdCQUFnQixHQUFHLEtBQU0sQ0FBQztBQWFoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztBQUU1QyxzTUFBc007QUFDdE0sSUFBSSxZQUFnQyxDQUFDO0FBRXJDLFNBQWdCLGdCQUFnQixDQUFDLEVBQVU7SUFDdkMsWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUN0QixDQUFDO0FBRkQsNENBRUM7QUFFRCxTQUFnQixlQUFlO0lBQzNCLHNMQUFzTDtJQUN0TCxJQUFJLGlCQUFpQixHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVc7V0FDOUMsbUJBQW1CLElBQUksVUFBVSxDQUFDO0lBQ3pDLE9BQU8saUJBQWlCLElBQUksT0FBTyxnQkFBZ0IsS0FBSyxXQUFXLENBQUM7QUFDeEUsQ0FBQztBQUxELDBDQUtDO0FBRUQsU0FBUyxXQUFXLENBQUMsT0FBZ0I7SUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGdCQUFnQixDQUFDO0lBQzdDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxPQUFnQixFQUFFLEtBQWtCO0lBQ2pELEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLFdBQVc7UUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLFVBQWtCO0lBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN6QyxJQUFJ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LFVBQVUsQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTztJQUNyQixPQUFPLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFKRCxzQ0FJQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEJyb3dzZXItc2lkZSBjcm9zcy10YWIgd3JpdGUgc3luYyBmb3IgQnVsa0RhdGFiYXNlMiwgb3ZlciBCcm9hZGNhc3RDaGFubmVsIChvbmUgY2hhbm5lbCBwZXIgY29sbGVjdGlvbiwgc2FtZS1vcmlnaW4gdGFicyBhbmQgd29ya2VycykuIEl0IGRvZXMgTk9UIHBlcnNpc3QgYW55dGhpbmcg4oCUIGVhY2ggc2lkZSB3cml0ZXMgdG8gZGlzayBpdHNlbGY7IHRoaXMganVzdCByZWxheXMgbGl2ZSB3cml0ZXMgdG8gb3RoZXIgb3BlbiB0YWJzL3dvcmtlcnMgYW5kLCB3aGVuIG9uZSBzdGFydHMgdXAsIGFza3MgcGVlcnMgZm9yIHdyaXRlcyB0aGV5J3ZlIG1hZGUgcmVjZW50bHkgdGhhdCBtYXkgbm90IGJlIG9uIGRpc2sgeWV0LiBOby1vcCBpbiBOb2RlIC8gd2hlcmUgQnJvYWRjYXN0Q2hhbm5lbCBpcyB1bmF2YWlsYWJsZSwgc28gQnVsa0RhdGFiYXNlMiBjYW4gY2FsbCB0aGVzZSB1bmNvbmRpdGlvbmFsbHkuIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmVhdHVyZSwgc28gdGhlcmUgaXMgbm8gZmFsbGJhY2suXG5cbmV4cG9ydCB0eXBlIFJlbW90ZVdyaXRlID0geyBrZXk6IHN0cmluZzsgdGltZTogbnVtYmVyOyBkZWxldGVkPzogYm9vbGVhbjsgdmFsdWU/OiB1bmtub3duIH07XG5cbi8vIFdyaXRlcyBvbGRlciB0aGFuIHRoaXMgYXJlIGFzc3VtZWQgYWxyZWFkeSBmbHVzaGVkIHRvIGRpc2sgKGEgZnJlc2hseS1vcGVuZWQgdGFiIGdldHMgdGhvc2UgYnkgcmVhZGluZyBkaXNrKSwgc28gYSB0YWIgb25seSByZXBsYXlzIHdyaXRlcyBuZXdlciB0aGFuIHRoaXMgd2hlbiBhIHBlZXIgc2F5cyBoZWxsby5cbmNvbnN0IFJFQ0VOVF9XSU5ET1dfTVMgPSA2MF8wMDA7XG5cbnR5cGUgQ2hhbm5lbCA9IHtcbiAgICBiYzogQnJvYWRjYXN0Q2hhbm5lbDtcbiAgICBzdWJzY3JpYmVyczogKCh3cml0ZTogUmVtb3RlV3JpdGUpID0+IHZvaWQpW107XG4gICAgLy8gQ2FsbGVkIHdoZW4gYSBwZWVyIGFza3MgZXZlcnlvbmUgdG8gc2VhbCAoc3RvcCBhcHBlbmRpbmcgdG8pIHRoZWlyIGN1cnJlbnQgc3RyZWFtIGZpbGUuXG4gICAgc2VhbFN1YnNjcmliZXJzOiAoKCkgPT4gdm9pZClbXTtcbiAgICAvLyBUaGlzIHRhYidzIG93biByZWNlbnQgd3JpdGVzLCBrZXB0IHNvIGl0IGNhbiBhbnN3ZXIgYW5vdGhlciB0YWIncyBcImhlbGxvXCIuXG4gICAgcmVjZW50OiBSZW1vdGVXcml0ZVtdO1xuICAgIC8vIFdyaXRlciBpZHMgdGhhdCBhbnN3ZXJlZCBvdXIgbW9zdCByZWNlbnQgbGl2ZW5lc3MgcHJvYmUuXG4gICAgYWxpdmVSZXBsaWVzOiBTZXQ8c3RyaW5nPjtcbn07XG5cbmNvbnN0IGNoYW5uZWxzID0gbmV3IE1hcDxzdHJpbmcsIENoYW5uZWw+KCk7XG5cbi8vIFRoZSBpZCB0aGlzIHByb2Nlc3Mgc3RhbXBzIGludG8gaXRzIHN0cmVhbSBmaWxlIG5hbWVzLiBSZWdpc3RlcmVkIGJ5IEJ1bGtEYXRhYmFzZTIgc28gd2UgY2FuIGFuc3dlciBhIHBlZXIncyBsaXZlbmVzcyBwcm9iZSBldmVuIG9uIGEgY2hhbm5lbCB0aGF0IHdhcyBjcmVhdGVkIGJ5IGEgd3JpdGUgcmF0aGVyIHRoYW4gYnkgY29ubmVjdCgpLlxubGV0IHNlbGZXcml0ZXJJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJXcml0ZXJJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgc2VsZldyaXRlcklkID0gaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N5bmNTdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgLy8gd2luZG93IChtYWluLXRocmVhZCBicm93c2VyKSBvciBXb3JrZXJHbG9iYWxTY29wZSAoV2ViL1NlcnZpY2UvU2hhcmVkIHdvcmtlcikg4oCUIGJ1dCBub3QgTm9kZSAodHlwZXNhZmVjc3MncyBpc05vZGUgaXMgYHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCJgLCB3aGljaCBtaXNjbGFzc2lmaWVzIHdvcmtlcnMpXG4gICAgbGV0IGlzQnJvd3Nlck9yV29ya2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICB8fCBcIldvcmtlckdsb2JhbFNjb3BlXCIgaW4gZ2xvYmFsVGhpcztcbiAgICByZXR1cm4gaXNCcm93c2VyT3JXb3JrZXIgJiYgdHlwZW9mIEJyb2FkY2FzdENoYW5uZWwgIT09IFwidW5kZWZpbmVkXCI7XG59XG5cbmZ1bmN0aW9uIHBydW5lUmVjZW50KGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgICBjb25zdCBjdXRvZmYgPSBEYXRlLm5vdygpIC0gUkVDRU5UX1dJTkRPV19NUztcbiAgICBjaGFubmVsLnJlY2VudCA9IGNoYW5uZWwucmVjZW50LmZpbHRlcih3ID0+IHcudGltZSA+PSBjdXRvZmYpO1xufVxuXG5mdW5jdGlvbiBkZWxpdmVyKGNoYW5uZWw6IENoYW5uZWwsIHdyaXRlOiBSZW1vdGVXcml0ZSkge1xuICAgIGZvciAoY29uc3Qgc3ViIG9mIGNoYW5uZWwuc3Vic2NyaWJlcnMpIHN1Yih3cml0ZSk7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZShjb2xsZWN0aW9uOiBzdHJpbmcpOiBDaGFubmVsIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWlzU3luY1N1cHBvcnRlZCgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGxldCBjaGFubmVsID0gY2hhbm5lbHMuZ2V0KGNvbGxlY3Rpb24pO1xuICAgIGlmIChjaGFubmVsKSByZXR1cm4gY2hhbm5lbDtcbiAgICAvLyBCcm9hZGNhc3RDaGFubmVsIG5ldmVyIGRlbGl2ZXJzIGEgbWVzc2FnZSBiYWNrIHRvIHRoZSBpbnN0YW5jZSB0aGF0IHNlbnQgaXQsIHNvIGEgdGFiIG5ldmVyIGhlYXJzIGl0cyBvd24gd3JpdGVzIOKAlCBvbmx5IHRoZSBvdGhlciBvcGVuIHRhYnMgZG8uXG4gICAgY29uc3QgYmMgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbChgYnVsa0RhdGFiYXNlMjoke2NvbGxlY3Rpb259YCk7XG4gICAgY29uc3QgY3JlYXRlZDogQ2hhbm5lbCA9IHsgYmMsIHN1YnNjcmliZXJzOiBbXSwgc2VhbFN1YnNjcmliZXJzOiBbXSwgcmVjZW50OiBbXSwgYWxpdmVSZXBsaWVzOiBuZXcgU2V0KCkgfTtcbiAgICBiYy5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBtc2cgPSBldmVudC5kYXRhIGFzIHsgdHlwZTogc3RyaW5nOyB3cml0ZT86IFJlbW90ZVdyaXRlOyB3cml0ZXM/OiBSZW1vdGVXcml0ZVtdOyB3cml0ZXJJZD86IHN0cmluZyB9O1xuICAgICAgICBpZiAoIW1zZykgcmV0dXJuO1xuICAgICAgICBpZiAobXNnLnR5cGUgPT09IFwid3JpdGVcIiAmJiBtc2cud3JpdGUpIHtcbiAgICAgICAgICAgIGRlbGl2ZXIoY3JlYXRlZCwgbXNnLndyaXRlKTtcbiAgICAgICAgfSBlbHNlIGlmIChtc2cudHlwZSA9PT0gXCJyZWNlbnRcIiAmJiBtc2cud3JpdGVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHdyaXRlIG9mIG1zZy53cml0ZXMpIGRlbGl2ZXIoY3JlYXRlZCwgd3JpdGUpO1xuICAgICAgICB9IGVsc2UgaWYgKG1zZy50eXBlID09PSBcInNlYWxcIikge1xuICAgICAgICAgICAgLy8gQSBwZWVyIGlzIGFib3V0IHRvIGZvbGQgcmVjZW50IGRhdGE7IHN0b3AgYXBwZW5kaW5nIHRvIG91ciBjdXJyZW50IHN0cmVhbSBmaWxlIHNvIGl0IGJlY29tZXMgY29tcGxldGUgYW5kIHRoZSBtZXJnZSBjYW4gZm9sZCBpdCB3aG9sZS4gT3VyIG5leHQgd3JpdGUgc3RhcnRzIGEgZnJlc2ggZmlsZS5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIGNyZWF0ZWQuc2VhbFN1YnNjcmliZXJzKSBzdWIoKTtcbiAgICAgICAgfSBlbHNlIGlmIChtc2cudHlwZSA9PT0gXCJ3aG9Jc0FsaXZlXCIpIHtcbiAgICAgICAgICAgIGlmIChzZWxmV3JpdGVySWQpIGNyZWF0ZWQuYmMucG9zdE1lc3NhZ2UoeyB0eXBlOiBcImFsaXZlXCIsIHdyaXRlcklkOiBzZWxmV3JpdGVySWQgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAobXNnLnR5cGUgPT09IFwiYWxpdmVcIiAmJiBtc2cud3JpdGVySWQpIHtcbiAgICAgICAgICAgIGNyZWF0ZWQuYWxpdmVSZXBsaWVzLmFkZChtc2cud3JpdGVySWQpO1xuICAgICAgICB9IGVsc2UgaWYgKG1zZy50eXBlID09PSBcImhlbGxvXCIpIHtcbiAgICAgICAgICAgIC8vIEFub3RoZXIgdGFiIGp1c3Qgc3RhcnRlZDsgcmVwbGF5IG91ciByZWNlbnQgd3JpdGVzIHNvIGl0IGRvZXNuJ3QgbWlzcyBhbnkuIFRoZSByZXBseSBnb2VzIHRvIGV2ZXJ5IHRhYiwgYnV0IHBlZXJzIHRoYXQgYWxyZWFkeSBoYXZlIGEgd3JpdGUgaWdub3JlIGl0IChpdHMgdGltZXN0YW1wIGlzbid0IG5ld2VyIHRoYW4gd2hhdCB0aGV5IGhvbGQpLCBzbyB0aGUgcmVkdW5kYW50IGJyb2FkY2FzdCBpcyBoYXJtbGVzcy5cbiAgICAgICAgICAgIHBydW5lUmVjZW50KGNyZWF0ZWQpO1xuICAgICAgICAgICAgaWYgKGNyZWF0ZWQucmVjZW50Lmxlbmd0aCkgY3JlYXRlZC5iYy5wb3N0TWVzc2FnZSh7IHR5cGU6IFwicmVjZW50XCIsIHdyaXRlczogY3JlYXRlZC5yZWNlbnQgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNoYW5uZWxzLnNldChjb2xsZWN0aW9uLCBjcmVhdGVkKTtcbiAgICByZXR1cm4gY3JlYXRlZDtcbn1cblxuLy8gU3Vic2NyaWJlIHRvIHJlbW90ZSB3cml0ZXMgZm9yIGEgY29sbGVjdGlvbi4gUmVjZW50IHdyaXRlcyBmcm9tIGFscmVhZHktb3BlbiB0YWJzIGFycml2ZSB0aHJvdWdoIHRoZSBzYW1lIG9uV3JpdGUgY2FsbGJhY2sgKGFzIHRoZSByZXBseSB0byBvdXIgaGVsbG8pLCBzbyB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgYWx3YXlzIGVtcHR5IOKAlCBpdCdzIGtlcHQgb25seSBmb3IgQVBJIGNvbXBhdGliaWxpdHkgd2l0aCBjYWxsZXJzIHRoYXQgYXdhaXQgaXQuXG5leHBvcnQgZnVuY3Rpb24gY29ubmVjdChjb2xsZWN0aW9uOiBzdHJpbmcsIG9uV3JpdGU6ICh3cml0ZTogUmVtb3RlV3JpdGUpID0+IHZvaWQsIG9uU2VhbD86ICgpID0+IHZvaWQpOiBQcm9taXNlPFJlbW90ZVdyaXRlW10+IHtcbiAgICBjb25zdCBjaGFubmVsID0gZW5zdXJlKGNvbGxlY3Rpb24pO1xuICAgIGlmICghY2hhbm5lbCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgY2hhbm5lbC5zdWJzY3JpYmVycy5wdXNoKG9uV3JpdGUpO1xuICAgIGlmIChvblNlYWwpIGNoYW5uZWwuc2VhbFN1YnNjcmliZXJzLnB1c2gob25TZWFsKTtcbiAgICBjaGFubmVsLmJjLnBvc3RNZXNzYWdlKHsgdHlwZTogXCJoZWxsb1wiIH0pO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJvYWRjYXN0KGNvbGxlY3Rpb246IHN0cmluZywgd3JpdGU6IFJlbW90ZVdyaXRlKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbm5lbCA9IGVuc3VyZShjb2xsZWN0aW9uKTtcbiAgICBpZiAoIWNoYW5uZWwpIHJldHVybjtcbiAgICBjaGFubmVsLnJlY2VudC5wdXNoKHdyaXRlKTtcbiAgICBwcnVuZVJlY2VudChjaGFubmVsKTtcbiAgICBjaGFubmVsLmJjLnBvc3RNZXNzYWdlKHsgdHlwZTogXCJ3cml0ZVwiLCB3cml0ZSB9KTtcbn1cblxuLy8gV2hpY2ggd3JpdGVyIGlkcyBhcmUgc3RpbGwgcnVubmluZywgc28gYSBtZXJnZSBjYW4gdGVsbCBhIHN0cmVhbSBmaWxlIHdob3NlIG93bmVyIGlzIGdvbmUgKGZvbGQgaXQgbm93KSBmcm9tIG9uZSB0aGF0IGlzIHN0aWxsIGJlaW5nIGFwcGVuZGVkIHRvIChsZWF2ZSBpdCkuIFJldHVybnMgdW5kZWZpbmVkIHdoZXJlIEJyb2FkY2FzdENoYW5uZWwgaXMgdW5hdmFpbGFibGUgKE5vZGUpIOKAlCB0aGVyZSB3ZSBjYW5ub3Qga25vdywgc28gdGhlIGNhbGxlciBtdXN0IGFzc3VtZSBldmVyeSBvd25lciBpcyBhbGl2ZSBhbmQgZmFsbCBiYWNrIHRvIHRoZSBhZ2UgcnVsZS5cbi8vXG4vLyBBIHBlZXIgdGhhdCBpcyBmcm96ZW4gb3IgdG9vIHNsb3cgdG8gYW5zd2VyIGluc2lkZSB0aW1lb3V0TXMgbG9va3MgZGVhZC4gVGhhdCBpcyBzYWZlLCBub3QgbG9zc3k6IHRoZSBmb2xkIHdyaXRlcyB0aGUgc3RyZWFtJ3Mgcm93cyBpbnRvIGEgYnVsayBmaWxlIGJlZm9yZSBkZWxldGluZyB0aGUgc3RyZWFtLCBhbmQgRmlsZVN0b3JhZ2UuYXBwZW5kIHJlY3JlYXRlcyBhIGRlbGV0ZWQgZmlsZSBhbmQgc2Vla3MgdG8gaXRzIExJVkUgc2l6ZSwgc28gYSBsYXRlIGFwcGVuZCBzdGFydHMgYSBmcmVzaCBmaWxlIGluc3RlYWQgb2YgcmVzdXJyZWN0aW5nIGZvbGRlZCBieXRlcy5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBxdWVyeUxpdmVXcml0ZXJzKGNvbGxlY3Rpb246IHN0cmluZywgdGltZW91dE1zOiBudW1iZXIpOiBQcm9taXNlPFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgY2hhbm5lbCA9IGVuc3VyZShjb2xsZWN0aW9uKTtcbiAgICBpZiAoIWNoYW5uZWwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY2hhbm5lbC5hbGl2ZVJlcGxpZXMuY2xlYXIoKTtcbiAgICBjaGFubmVsLmJjLnBvc3RNZXNzYWdlKHsgdHlwZTogXCJ3aG9Jc0FsaXZlXCIgfSk7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ociA9PiBzZXRUaW1lb3V0KHIsIHRpbWVvdXRNcykpO1xuICAgIHJldHVybiBuZXcgU2V0KGNoYW5uZWwuYWxpdmVSZXBsaWVzKTtcbn1cblxuLy8gQXNrIGV2ZXJ5IG90aGVyIG9wZW4gdGFiIG9mIHRoaXMgY29sbGVjdGlvbiB0byBzZWFsIChzdG9wIGFwcGVuZGluZyB0bykgaXRzIGN1cnJlbnQgc3RyZWFtIGZpbGUsIHNvIGEgbWVyZ2UgY2FuIGZvbGQgcmVjZW50IGRhdGEgdXAgdG8gdGhlIHByZXNlbnQgd2l0aG91dCByYWNpbmcgYW4gYXBwZW5kLiBCZXN0LWVmZm9ydDogbm8tb3AgaW4gTm9kZSwgYW5kIGEgcGVlciB0aGF0IG1pc3NlcyBpdCBqdXN0IGtlZXBzIGFwcGVuZGluZyDigJQgd29yc3QgY2FzZSB0aGUgbWVyZ2UgZm9sZHMgYSBwcmVmaXggYW5kIHRoZSByZXN0IGZvbGRzIGxhdGVyIChkdXBsaWNhdGlvbiwgcmVzb2x2ZWQgYnkgd3JpdGUtdGltZSksIG5ldmVyIGRhdGEgbG9zcy5cbmV4cG9ydCBmdW5jdGlvbiBicm9hZGNhc3RTZWFsKGNvbGxlY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNoYW5uZWwgPSBlbnN1cmUoY29sbGVjdGlvbik7XG4gICAgaWYgKCFjaGFubmVsKSByZXR1cm47XG4gICAgY2hhbm5lbC5iYy5wb3N0TWVzc2FnZSh7IHR5cGU6IFwic2VhbFwiIH0pO1xufVxuIl19
|
|
114
|
+
/* _JS_SOURCE_HASH = "bf4bd0ec9a98b50d83f2d7e3ebab184ef21d150dddcd69fe527b62f1ca128692"; */
|
|
@@ -4,7 +4,9 @@ export type RemoteWrite = {
|
|
|
4
4
|
deleted?: boolean;
|
|
5
5
|
value?: unknown;
|
|
6
6
|
};
|
|
7
|
+
export declare function registerWriterId(id: string): void;
|
|
7
8
|
export declare function isSyncSupported(): boolean;
|
|
8
9
|
export declare function connect(collection: string, onWrite: (write: RemoteWrite) => void, onSeal?: () => void): Promise<RemoteWrite[]>;
|
|
9
10
|
export declare function broadcast(collection: string, write: RemoteWrite): void;
|
|
11
|
+
export declare function queryLiveWriters(collection: string, timeoutMs: number): Promise<Set<string> | undefined>;
|
|
10
12
|
export declare function broadcastSeal(collection: string): void;
|
|
@@ -12,10 +12,19 @@ type Channel = {
|
|
|
12
12
|
sealSubscribers: (() => void)[];
|
|
13
13
|
// This tab's own recent writes, kept so it can answer another tab's "hello".
|
|
14
14
|
recent: RemoteWrite[];
|
|
15
|
+
// Writer ids that answered our most recent liveness probe.
|
|
16
|
+
aliveReplies: Set<string>;
|
|
15
17
|
};
|
|
16
18
|
|
|
17
19
|
const channels = new Map<string, Channel>();
|
|
18
20
|
|
|
21
|
+
// The id this process stamps into its stream file names. Registered by BulkDatabase2 so we can answer a peer's liveness probe even on a channel that was created by a write rather than by connect().
|
|
22
|
+
let selfWriterId: string | undefined;
|
|
23
|
+
|
|
24
|
+
export function registerWriterId(id: string): void {
|
|
25
|
+
selfWriterId = id;
|
|
26
|
+
}
|
|
27
|
+
|
|
19
28
|
export function isSyncSupported(): boolean {
|
|
20
29
|
// window (main-thread browser) or WorkerGlobalScope (Web/Service/Shared worker) — but not Node (typesafecss's isNode is `typeof window === "undefined"`, which misclassifies workers)
|
|
21
30
|
let isBrowserOrWorker = typeof window !== "undefined"
|
|
@@ -38,9 +47,9 @@ function ensure(collection: string): Channel | undefined {
|
|
|
38
47
|
if (channel) return channel;
|
|
39
48
|
// BroadcastChannel never delivers a message back to the instance that sent it, so a tab never hears its own writes — only the other open tabs do.
|
|
40
49
|
const bc = new BroadcastChannel(`bulkDatabase2:${collection}`);
|
|
41
|
-
const created: Channel = { bc, subscribers: [], sealSubscribers: [], recent: [] };
|
|
50
|
+
const created: Channel = { bc, subscribers: [], sealSubscribers: [], recent: [], aliveReplies: new Set() };
|
|
42
51
|
bc.onmessage = (event: MessageEvent) => {
|
|
43
|
-
const msg = event.data as { type: string; write?: RemoteWrite; writes?: RemoteWrite[] };
|
|
52
|
+
const msg = event.data as { type: string; write?: RemoteWrite; writes?: RemoteWrite[]; writerId?: string };
|
|
44
53
|
if (!msg) return;
|
|
45
54
|
if (msg.type === "write" && msg.write) {
|
|
46
55
|
deliver(created, msg.write);
|
|
@@ -49,6 +58,10 @@ function ensure(collection: string): Channel | undefined {
|
|
|
49
58
|
} else if (msg.type === "seal") {
|
|
50
59
|
// A peer is about to fold recent data; stop appending to our current stream file so it becomes complete and the merge can fold it whole. Our next write starts a fresh file.
|
|
51
60
|
for (const sub of created.sealSubscribers) sub();
|
|
61
|
+
} else if (msg.type === "whoIsAlive") {
|
|
62
|
+
if (selfWriterId) created.bc.postMessage({ type: "alive", writerId: selfWriterId });
|
|
63
|
+
} else if (msg.type === "alive" && msg.writerId) {
|
|
64
|
+
created.aliveReplies.add(msg.writerId);
|
|
52
65
|
} else if (msg.type === "hello") {
|
|
53
66
|
// Another tab just started; replay our recent writes so it doesn't miss any. The reply goes to every tab, but peers that already have a write ignore it (its timestamp isn't newer than what they hold), so the redundant broadcast is harmless.
|
|
54
67
|
pruneRecent(created);
|
|
@@ -77,6 +90,18 @@ export function broadcast(collection: string, write: RemoteWrite): void {
|
|
|
77
90
|
channel.bc.postMessage({ type: "write", write });
|
|
78
91
|
}
|
|
79
92
|
|
|
93
|
+
// Which writer ids are still running, so a merge can tell a stream file whose owner is gone (fold it now) from one that is still being appended to (leave it). Returns undefined where BroadcastChannel is unavailable (Node) — there we cannot know, so the caller must assume every owner is alive and fall back to the age rule.
|
|
94
|
+
//
|
|
95
|
+
// A peer that is frozen or too slow to answer inside timeoutMs looks dead. That is safe, not lossy: the fold writes the stream's rows into a bulk file before deleting the stream, and FileStorage.append recreates a deleted file and seeks to its LIVE size, so a late append starts a fresh file instead of resurrecting folded bytes.
|
|
96
|
+
export async function queryLiveWriters(collection: string, timeoutMs: number): Promise<Set<string> | undefined> {
|
|
97
|
+
const channel = ensure(collection);
|
|
98
|
+
if (!channel) return undefined;
|
|
99
|
+
channel.aliveReplies.clear();
|
|
100
|
+
channel.bc.postMessage({ type: "whoIsAlive" });
|
|
101
|
+
await new Promise<void>(r => setTimeout(r, timeoutMs));
|
|
102
|
+
return new Set(channel.aliveReplies);
|
|
103
|
+
}
|
|
104
|
+
|
|
80
105
|
// Ask every other open tab of this collection to seal (stop appending to) its current stream file, so a merge can fold recent data up to the present without racing an append. Best-effort: no-op in Node, and a peer that misses it just keeps appending — worst case the merge folds a prefix and the rest folds later (duplication, resolved by write-time), never data loss.
|
|
81
106
|
export function broadcastSeal(collection: string): void {
|
|
82
107
|
const channel = ensure(collection);
|