sliftutils 1.7.29 → 1.7.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/builders/extensionBuild.ts +1 -1
  2. package/bundler/bundleEntry.ts +1 -3
  3. package/bundler/bundler.ts +2 -4
  4. package/bundler/sourceMaps.ts +1 -2
  5. package/examplestorage/browser.tsx +1 -2
  6. package/examplestorage/exampleserver.ts +1 -2
  7. package/index.d.ts +106 -99
  8. package/misc/dist/environment.ts.cache +2 -2
  9. package/misc/dist/getSecret.ts.cache +2 -2
  10. package/misc/dist/strings.ts.cache +2 -2
  11. package/misc/dist/zip.ts.cache +2 -2
  12. package/misc/https/dist/certs.ts.cache +2 -2
  13. package/misc/https/dist/dns.ts.cache +7 -16
  14. package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
  15. package/misc/https/dns.d.ts +1 -4
  16. package/misc/https/dns.ts +5 -14
  17. package/misc/https/hostServer.d.ts +2 -0
  18. package/misc/https/hostServer.ts +6 -7
  19. package/misc/https/httpsCerts.ts +4 -10
  20. package/misc/openrouter.ts +1 -2
  21. package/package.json +1 -1
  22. package/render-utils/FullscreenModal.tsx +1 -4
  23. package/render-utils/GenericFormat.tsx +2 -8
  24. package/render-utils/Input.tsx +5 -13
  25. package/render-utils/InputLabel.tsx +4 -6
  26. package/render-utils/InputPicker.tsx +1 -2
  27. package/render-utils/URLParam.ts +2 -3
  28. package/render-utils/dist/observer.tsx.cache +2 -2
  29. package/render-utils/mobxTyped.ts +2 -3
  30. package/render-utils/niceStringify.ts +2 -4
  31. package/storage/ArchivesDisk.ts +4 -14
  32. package/storage/BulkDatabase2/BulkDatabase2.d.ts +1 -2
  33. package/storage/BulkDatabase2/BulkDatabase2.ts +4 -11
  34. package/storage/BulkDatabase2/BulkDatabaseBase.ts +42 -114
  35. package/storage/BulkDatabase2/BulkDatabaseFormat.ts +31 -91
  36. package/storage/BulkDatabase2/BulkDatabaseMerge.ts +19 -57
  37. package/storage/BulkDatabase2/BulkDatabaseReader.ts +4 -12
  38. package/storage/BulkDatabase2/LoadedIndex.ts +6 -18
  39. package/storage/BulkDatabase2/WriteOverlay.ts +3 -8
  40. package/storage/BulkDatabase2/blockCache.ts +12 -28
  41. package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +40 -103
  42. package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +19 -50
  43. package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +18 -50
  44. package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +7 -15
  45. package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +9 -21
  46. package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +6 -11
  47. package/storage/BulkDatabase2/dist/blockCache.ts.cache +15 -31
  48. package/storage/BulkDatabase2/dist/mergeLock.ts.cache +10 -29
  49. package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +10 -18
  50. package/storage/BulkDatabase2/dist/streamLog.ts.cache +17 -43
  51. package/storage/BulkDatabase2/dist/syncClient.ts.cache +11 -27
  52. package/storage/BulkDatabase2/mergeLock.ts +7 -26
  53. package/storage/BulkDatabase2/mergeMarkers.ts +7 -15
  54. package/storage/BulkDatabase2/streamLog.ts +14 -40
  55. package/storage/BulkDatabase2/syncClient.ts +8 -24
  56. package/storage/FileFolderAPI.tsx +28 -75
  57. package/storage/IArchives.d.ts +3 -3
  58. package/storage/IArchives.ts +21 -50
  59. package/storage/IStorage.ts +2 -4
  60. package/storage/PendingManager.tsx +2 -3
  61. package/storage/TransactionStorage.ts +11 -24
  62. package/storage/backblaze.ts +12 -43
  63. package/storage/dist/ArchivesDisk.ts.cache +7 -17
  64. package/storage/dist/FileFolderAPI.tsx.cache +25 -63
  65. package/storage/dist/IArchives.ts.cache +10 -20
  66. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
  67. package/storage/dist/JSONStorage.ts.cache +2 -2
  68. package/storage/dist/PendingManager.tsx.cache +5 -6
  69. package/storage/dist/TransactionStorage.ts.cache +14 -27
  70. package/storage/dist/backblaze.ts.cache +15 -46
  71. package/storage/dist/embeddingFormats.ts.cache +11 -24
  72. package/storage/dist/fileSystemPointer.ts.cache +4 -7
  73. package/storage/dist/remoteFileStorage.ts.cache +17 -36
  74. package/storage/embeddingFormats.ts +11 -27
  75. package/storage/fileSystemPointer.ts +2 -7
  76. package/storage/proxydatabase/dist/ivfEmbeddingDatabase.ts.cache +8 -18
  77. package/storage/proxydatabase/dist/transactionSet.ts.cache +4 -7
  78. package/storage/proxydatabase/inMemoryDatabase.ts +1 -3
  79. package/storage/proxydatabase/ivfEmbeddingDatabase.ts +8 -23
  80. package/storage/proxydatabase/transactionSet.ts +2 -5
  81. package/storage/remoteFileServer.ts +20 -48
  82. package/storage/remoteFileStorage.ts +14 -33
  83. package/storage/remoteStorage/ArchivesRemote.d.ts +1 -4
  84. package/storage/remoteStorage/ArchivesRemote.ts +11 -26
  85. package/storage/remoteStorage/ArchivesUrl.ts +2 -4
  86. package/storage/remoteStorage/accessPage.tsx +1 -5
  87. package/storage/remoteStorage/blobStore.d.ts +5 -13
  88. package/storage/remoteStorage/blobStore.ts +52 -130
  89. package/storage/remoteStorage/createArchives.d.ts +9 -13
  90. package/storage/remoteStorage/createArchives.ts +43 -187
  91. package/storage/remoteStorage/deployTakeover.d.ts +18 -32
  92. package/storage/remoteStorage/deployTakeover.ts +70 -384
  93. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +12 -24
  94. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +5 -7
  95. package/storage/remoteStorage/dist/blobStore.ts.cache +47 -117
  96. package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
  97. package/storage/remoteStorage/dist/createArchives.ts.cache +54 -186
  98. package/storage/remoteStorage/dist/deployTakeover.ts.cache +81 -387
  99. package/storage/remoteStorage/dist/intermediateSources.ts.cache +119 -0
  100. package/storage/remoteStorage/dist/remoteConfig.ts.cache +36 -24
  101. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +20 -40
  102. package/storage/remoteStorage/dist/storageClientController.ts.cache +32 -0
  103. package/storage/remoteStorage/dist/storageController.ts.cache +30 -64
  104. package/storage/remoteStorage/dist/storageServerState.ts.cache +269 -186
  105. package/storage/remoteStorage/grantAccessCli.ts +1 -3
  106. package/storage/remoteStorage/intermediateSources.d.ts +21 -0
  107. package/storage/remoteStorage/intermediateSources.ts +117 -0
  108. package/storage/remoteStorage/remoteConfig.ts +33 -20
  109. package/storage/remoteStorage/sourceWrapper.d.ts +8 -19
  110. package/storage/remoteStorage/sourceWrapper.ts +19 -41
  111. package/storage/remoteStorage/storageClientController.ts +1 -3
  112. package/storage/remoteStorage/storageController.d.ts +5 -3
  113. package/storage/remoteStorage/storageController.ts +12 -83
  114. package/storage/remoteStorage/storageServer.ts +20 -34
  115. package/storage/remoteStorage/storageServerState.d.ts +28 -6
  116. package/storage/remoteStorage/storageServerState.ts +275 -221
@@ -1,18 +1,7 @@
1
- "use strict";
2
- // Best-effort "only one tab merges this collection at a time" guard. This is purely an efficiency
3
- // measure: correctness does NOT depend on it. Reads resolve by per-row write-time, merges write new
4
- // files before deleting consumed ones, and a duplicate-heavy region gets re-mergedso two tabs
5
- // merging at once only waste work and briefly duplicate data, never corrupt or lose it. The lock just
6
- // stops that wasted work. It uses localStorage (shared across same-origin tabs) and is a no-op where
7
- // localStorage is unavailable (Node) — there concurrent merges are harmless, which the Node stress
8
- // tests exercise. localStorage has no atomic compare-and-swap, so we write-then-reread to shrink the
9
- // race window, and a TTL frees a lock left behind by a tab that crashed or closed mid-merge.
10
- //
11
- // File-lock layer (see acquireMergeFileLock at the bottom): for cross-PROCESS safety (different
12
- // browsers, different machines pointing at the same remote storage), we ALSO write a `.merge-lock`
13
- // file inside the collection's storage with our ID. The protocol is check-write-wait-recheck — last
14
- // writer wins after the 15s settle window. The localStorage lock above covers same-origin tabs; this
15
- // covers everything else (separate processes, remote shared storage).
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
+ // Best-effort "only one tab merges this collection at a time" guard. This is purely an efficiency measure: correctness does NOT depend on it. Reads resolve by per-row write-time, merges write new files before deleting consumed ones, and a duplicate-heavy region gets re-merged — so two tabs merging at once only waste work and briefly duplicate data, never corrupt or lose it. The lock just stops that wasted work. It uses localStorage (shared across same-origin tabs) and is a no-op where localStorage is unavailable (Node) — there concurrent merges are harmless, which the Node stress tests exercise. localStorage has no atomic compare-and-swap, so we write-then-reread to shrink the race window, and a TTL frees a lock left behind by a tab that crashed or closed mid-merge.
3
+ //
4
+ // File-lock layer (see acquireMergeFileLock at the bottom): for cross-PROCESS safety (different browsers, different machines pointing at the same remote storage), we ALSO write a `.merge-lock` file inside the collection's storage with our ID. The protocol is check-write-wait-rechecklast writer wins after the 15s settle window. The localStorage lock above covers same-origin tabs; this covers everything else (separate processes, remote shared storage).
16
5
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
17
6
  exports.releaseMergeFileLock = exports.startMergeFileLockHeartbeat = exports.tryAcquireMergeFileLock = exports.peekMergeFileLock = exports.releaseMergeLock = exports.peekMergeLock = exports.tryAcquireMergeLock = void 0;
18
7
  const LOCK_TTL_MS = 30 * 1000;
@@ -36,10 +25,7 @@ function getLocalStorage() {
36
25
  function lockKey(collection) {
37
26
  return "bulkDatabase2-merge:" + collection;
38
27
  }
39
- // Returns true if we now hold the lock (or there's no localStorage to coordinate through, in which case
40
- // we proceed — concurrent merges are harmless). Returns false only if a DIFFERENT holder has a fresh
41
- // lock. Re-stamping our own lock always succeeds, so this doubles as a heartbeat: call it periodically
42
- // during a long, spaced-out merge to keep the lock alive (and detect if another tab took it over).
28
+ // Returns true if we now hold the lock (or there's no localStorage to coordinate through, in which case we proceed — concurrent merges are harmless). Returns false only if a DIFFERENT holder has a fresh lock. Re-stamping our own lock always succeeds, so this doubles as a heartbeat: call it periodically during a long, spaced-out merge to keep the lock alive (and detect if another tab took it over).
43
29
  function tryAcquireMergeLock(collection, holderId) {
44
30
  const ls = getLocalStorage();
45
31
  if (!ls)
@@ -58,8 +44,7 @@ function tryAcquireMergeLock(collection, holderId) {
58
44
  return ls.getItem(key) === token;
59
45
  }
60
46
  exports.tryAcquireMergeLock = tryAcquireMergeLock;
61
- // Non-mutating look at the tab lock: who holds it and how long until it goes stale (negative = already
62
- // stale). For logging why a merge was skipped.
47
+ // Non-mutating look at the tab lock: who holds it and how long until it goes stale (negative = already stale). For logging why a merge was skipped.
63
48
  function peekMergeLock(collection) {
64
49
  const ls = getLocalStorage();
65
50
  if (!ls)
@@ -110,9 +95,7 @@ exports.peekMergeFileLock = peekMergeFileLock;
110
95
  async function writeMergeFileLock(storage, holderId, time) {
111
96
  await storage.set(FILE_LOCK_KEY, Buffer.from(`${holderId}:${time}`, "utf8"));
112
97
  }
113
- // Acquire the cross-process file lock. Resolves to true ONLY if, after writing our ID and waiting
114
- // FILE_LOCK_SETTLE_MS for concurrent writers to settle, the file still names us. Caller must
115
- // releaseMergeFileLock() on the same storage + holderId when done.
98
+ // Acquire the cross-process file lock. Resolves to true ONLY if, after writing our ID and waiting FILE_LOCK_SETTLE_MS for concurrent writers to settle, the file still names us. Caller must releaseMergeFileLock() on the same storage + holderId when done.
116
99
  async function tryAcquireMergeFileLock(storage, holderId) {
117
100
  const now = Date.now();
118
101
  const existing = await readMergeFileLock(storage);
@@ -124,9 +107,7 @@ async function tryAcquireMergeFileLock(storage, holderId) {
124
107
  return !!after && after.holderId === holderId;
125
108
  }
126
109
  exports.tryAcquireMergeFileLock = tryAcquireMergeFileLock;
127
- // Keep the lock fresh. The merge might run longer than FILE_LOCK_TTL_MS; without periodic re-stamping,
128
- // another process would see the lock as stale and acquire it. Returns a stop function the caller calls
129
- // in `finally`. Heartbeat is best-effort: a failed write is logged but not propagated.
110
+ // Keep the lock fresh. The merge might run longer than FILE_LOCK_TTL_MS; without periodic re-stamping, another process would see the lock as stale and acquire it. Returns a stop function the caller calls in `finally`. Heartbeat is best-effort: a failed write is logged but not propagated.
130
111
  function startMergeFileLockHeartbeat(storage, holderId) {
131
112
  var _a, _b;
132
113
  const interval = setInterval(() => {
@@ -145,5 +126,5 @@ async function releaseMergeFileLock(storage, holderId) {
145
126
  catch ( /* ignore */_a) { /* ignore */ }
146
127
  }
147
128
  exports.releaseMergeFileLock = releaseMergeFileLock;
148
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2VMb2NrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWVyZ2VMb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrR0FBa0c7QUFDbEcsb0dBQW9HO0FBQ3BHLGlHQUFpRztBQUNqRyxzR0FBc0c7QUFDdEcscUdBQXFHO0FBQ3JHLG1HQUFtRztBQUNuRyxxR0FBcUc7QUFDckcsNkZBQTZGO0FBQzdGLEVBQUU7QUFDRixnR0FBZ0c7QUFDaEcsbUdBQW1HO0FBQ25HLG9HQUFvRztBQUNwRyxxR0FBcUc7QUFDckcsc0VBQXNFOzs7QUFJdEUsTUFBTSxXQUFXLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUk5QixTQUFTLGNBQWMsQ0FBQyxLQUFhO0lBQ2pDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsSUFBSSxLQUFLLEdBQUcsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLGVBQWU7SUFDcEIsSUFBSSxDQUFDO1FBQ0QsT0FBTyxPQUFPLFlBQVksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzFFLENBQUM7SUFBQyxXQUFNLENBQUM7UUFDTCxPQUFPLFNBQVMsQ0FBQyxDQUFDLDJEQUEyRDtJQUNqRixDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMs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QUMsUUFBUSxLQUFLLFFBQVE7WUFBRSxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUFDLFFBQVEsWUFBWSxJQUFkLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBTEQsb0RBS0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCZXN0LWVmZm9ydCBcIm9ubHkgb25lIHRhYiBtZXJnZXMgdGhpcyBjb2xsZWN0aW9uIGF0IGEgdGltZVwiIGd1YXJkLiBUaGlzIGlzIHB1cmVseSBhbiBlZmZpY2llbmN5XG4vLyBtZWFzdXJlOiBjb3JyZWN0bmVzcyBkb2VzIE5PVCBkZXBlbmQgb24gaXQuIFJlYWRzIHJlc29sdmUgYnkgcGVyLXJvdyB3cml0ZS10aW1lLCBtZXJnZXMgd3JpdGUgbmV3XG4vLyBmaWxlcyBiZWZvcmUgZGVsZXRpbmcgY29uc3VtZWQgb25lcywgYW5kIGEgZHVwbGljYXRlLWhlYXZ5IHJlZ2lvbiBnZXRzIHJlLW1lcmdlZCDigJQgc28gdHdvIHRhYnNcbi8vIG1lcmdpbmcgYXQgb25jZSBvbmx5IHdhc3RlIHdvcmsgYW5kIGJyaWVmbHkgZHVwbGljYXRlIGRhdGEsIG5ldmVyIGNvcnJ1cHQgb3IgbG9zZSBpdC4gVGhlIGxvY2sganVzdFxuLy8gc3RvcHMgdGhhdCB3YXN0ZWQgd29yay4gSXQgdXNlcyBsb2NhbFN0b3JhZ2UgKHNoYXJlZCBhY3Jvc3Mgc2FtZS1vcmlnaW4gdGFicykgYW5kIGlzIGEgbm8tb3Agd2hlcmVcbi8vIGxvY2FsU3RvcmFnZSBpcyB1bmF2YWlsYWJsZSAoTm9kZSkg4oCUIHRoZXJlIGNvbmN1cnJlbnQgbWVyZ2VzIGFyZSBoYXJtbGVzcywgd2hpY2ggdGhlIE5vZGUgc3RyZXNzXG4vLyB0ZXN0cyBleGVyY2lzZS4gbG9jYWxTdG9yYWdlIGhhcyBubyBhdG9taWMgY29tcGFyZS1hbmQtc3dhcCwgc28gd2Ugd3JpdGUtdGhlbi1yZXJlYWQgdG8gc2hyaW5rIHRoZVxuLy8gcmFjZSB3aW5kb3csIGFuZCBhIFRUTCBmcmVlcyBhIGxvY2sgbGVmdCBiZWhpbmQgYnkgYSB0YWIgdGhhdCBjcmFzaGVkIG9yIGNsb3NlZCBtaWQtbWVyZ2UuXG4vL1xuLy8gRmlsZS1sb2NrIGxheWVyIChzZWUgYWNxdWlyZU1lcmdlRmlsZUxvY2sgYXQgdGhlIGJvdHRvbSk6IGZvciBjcm9zcy1QUk9DRVNTIHNhZmV0eSAoZGlmZmVyZW50XG4vLyBicm93c2VycywgZGlmZmVyZW50IG1hY2hpbmVzIHBvaW50aW5nIGF0IHRoZSBzYW1lIHJlbW90ZSBzdG9yYWdlKSwgd2UgQUxTTyB3cml0ZSBhIGAubWVyZ2UtbG9ja2Bcbi8vIGZpbGUgaW5zaWRlIHRoZSBjb2xsZWN0aW9uJ3Mgc3RvcmFnZSB3aXRoIG91ciBJRC4gVGhlIHByb3RvY29sIGlzIGNoZWNrLXdyaXRlLXdhaXQtcmVjaGVjayDigJQgbGFzdFxuLy8gd3JpdGVyIHdpbnMgYWZ0ZXIgdGhlIDE1cyBzZXR0bGUgd2luZG93LiBUaGUgbG9jYWxTdG9yYWdlIGxvY2sgYWJvdmUgY292ZXJzIHNhbWUtb3JpZ2luIHRhYnM7IHRoaXNcbi8vIGNvdmVycyBldmVyeXRoaW5nIGVsc2UgKHNlcGFyYXRlIHByb2Nlc3NlcywgcmVtb3RlIHNoYXJlZCBzdG9yYWdlKS5cblxuaW1wb3J0IHR5cGUgeyBGaWxlU3RvcmFnZSB9IGZyb20gXCIuLi9GaWxlRm9sZGVyQVBJXCI7XG5cbmNvbnN0IExPQ0tfVFRMX01TID0gMzAgKiAxMDAwO1xuXG5leHBvcnQgdHlwZSBNZXJnZUxvY2tJbmZvID0geyBob2xkZXJJZDogc3RyaW5nOyBleHBpcmVzSW5NczogbnVtYmVyIH07XG5cbmZ1bmN0aW9uIHBhcnNlTG9ja1Rva2VuKHRva2VuOiBzdHJpbmcpOiB7IGhvbGRlcklkOiBzdHJpbmc7IHRpbWU6IG51bWJlciB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2xvbiA9IHRva2VuLmxhc3RJbmRleE9mKFwiOlwiKTtcbiAgICBpZiAoY29sb24gPCAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRpbWUgPSBwYXJzZUludCh0b2tlbi5zbGljZShjb2xvbiArIDEpLCAxMCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGltZSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgaG9sZGVySWQ6IHRva2VuLnNsaWNlKDAsIGNvbG9uKSwgdGltZSB9O1xufVxuXG5mdW5jdGlvbiBnZXRMb2NhbFN0b3JhZ2UoKTogU3RvcmFnZSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBsb2NhbFN0b3JhZ2UgIT09IFwidW5kZWZpbmVkXCIgPyBsb2NhbFN0b3JhZ2UgOiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIGFjY2Vzc2luZyBsb2NhbFN0b3JhZ2UgY2FuIHRocm93IChlLmcuIGRpc2FibGVkIGNvb2tpZXMpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBsb2NrS2V5KGNvbGxlY3Rpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYnVsa0RhdGFiYXNlMi1tZXJnZTpcIiArIGNvbGxlY3Rpb247XG59XG5cbi8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBub3cgaG9sZCB0aGUgbG9jayAob3IgdGhlcmUncyBubyBsb2NhbFN0b3JhZ2UgdG8gY29vcmRpbmF0ZSB0aHJvdWdoLCBpbiB3aGljaCBjYXNlXG4vLyB3ZSBwcm9jZWVkIOKAlCBjb25jdXJyZW50IG1lcmdlcyBhcmUgaGFybWxlc3MpLiBSZXR1cm5zIGZhbHNlIG9ubHkgaWYgYSBESUZGRVJFTlQgaG9sZGVyIGhhcyBhIGZyZXNoXG4vLyBsb2NrLiBSZS1zdGFtcGluZyBvdXIgb3duIGxvY2sgYWx3YXlzIHN1Y2NlZWRzLCBzbyB0aGlzIGRvdWJsZXMgYXMgYSBoZWFydGJlYXQ6IGNhbGwgaXQgcGVyaW9kaWNhbGx5XG4vLyBkdXJpbmcgYSBsb25nLCBzcGFjZWQtb3V0IG1lcmdlIHRvIGtlZXAgdGhlIGxvY2sgYWxpdmUgKGFuZCBkZXRlY3QgaWYgYW5vdGhlciB0YWIgdG9vayBpdCBvdmVyKS5cbmV4cG9ydCBmdW5jdGlvbiB0cnlBY3F1aXJlTWVyZ2VMb2NrKGNvbGxlY3Rpb246IHN0cmluZywgaG9sZGVySWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxzID0gZ2V0TG9jYWxTdG9yYWdlKCk7XG4gICAgaWYgKCFscykgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qga2V5ID0gbG9ja0tleShjb2xsZWN0aW9uKTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gbHMuZ2V0SXRlbShrZXkpO1xuICAgIGlmIChleGlzdGluZyAmJiAhZXhpc3Rpbmcuc3RhcnRzV2l0aChob2xkZXJJZCArIFwiOlwiKSkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUxvY2tUb2tlbihleGlzdGluZyk7XG4gICAgICAgIGlmIChwYXJzZWQgJiYgbm93IC0gcGFyc2VkLnRpbWUgPCBMT0NLX1RUTF9NUykgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IGhvbGRlcklkICsgXCI6XCIgKyBub3c7XG4gICAgbHMuc2V0SXRlbShrZXksIHRva2VuKTtcbiAgICAvLyBSZS1yZWFkIHRvIGNhdGNoIGEgcmFjaW5nIHNldEl0ZW0gZnJvbSBhbm90aGVyIHRhYiAoYmVzdC1lZmZvcnQsIG5vdCBhdG9taWMpLlxuICAgIHJldHVybiBscy5nZXRJdGVtKGtleSkgPT09IHRva2VuO1xufVxuXG4vLyBOb24tbXV0YXRpbmcgbG9vayBhdCB0aGUgdGFiIGxvY2s6IHdobyBob2xkcyBpdCBhbmQgaG93IGxvbmcgdW50aWwgaXQgZ29lcyBzdGFsZSAobmVnYXRpdmUgPSBhbHJlYWR5XG4vLyBzdGFsZSkuIEZvciBsb2dnaW5nIHdoeSBhIG1lcmdlIHdhcyBza2lwcGVkLlxuZXhwb3J0IGZ1bmN0aW9uIHBlZWtNZXJnZUxvY2soY29sbGVjdGlvbjogc3RyaW5nKTogTWVyZ2VMb2NrSW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbHMgPSBnZXRMb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAoIWxzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gbHMuZ2V0SXRlbShsb2NrS2V5KGNvbGxlY3Rpb24pKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlTG9ja1Rva2VuKGV4aXN0aW5nKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBob2xkZXJJZDogcGFyc2VkLmhvbGRlcklkLCBleHBpcmVzSW5NczogcGFyc2VkLnRpbWUgKyBMT0NLX1RUTF9NUyAtIERhdGUubm93KCkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGVhc2VNZXJnZUxvY2soY29sbGVjdGlvbjogc3RyaW5nLCBob2xkZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbHMgPSBnZXRMb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAoIWxzKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gbG9ja0tleShjb2xsZWN0aW9uKTtcbiAgICBjb25zdCBleGlzdGluZyA9IGxzLmdldEl0ZW0oa2V5KTtcbiAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3Rpbmcuc3RhcnRzV2l0aChob2xkZXJJZCArIFwiOlwiKSkgbHMucmVtb3ZlSXRlbShrZXkpO1xufVxuXG4vLyDilIDilIAgRmlsZS1iYXNlZCBsb2NrIChjcm9zcy1wcm9jZXNzIC8gc2hhcmVkIHN0b3JhZ2UpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuY29uc3QgRklMRV9MT0NLX0tFWSA9IFwiLm1lcmdlLWxvY2tcIjtcbmNvbnN0IEZJTEVfTE9DS19UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuY29uc3QgRklMRV9MT0NLX1NFVFRMRV9NUyA9IDE1ICogMTAwMDtcbmNvbnN0IEZJTEVfTE9DS19IRUFSVEJFQVRfTVMgPSAyICogNjAgKiAxMDAwO1xuXG5hc3luYyBmdW5jdGlvbiByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlOiBGaWxlU3RvcmFnZSk6IFByb21pc2U8eyBob2xkZXJJZDogc3RyaW5nOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHN0b3JhZ2UuZ2V0KEZJTEVfTE9DS19LRVkpO1xuICAgICAgICBpZiAoIWJ1ZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHBhcnNlTG9ja1Rva2VuKGJ1Zi50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgIH0gY2F0Y2ggeyByZXR1cm4gdW5kZWZpbmVkOyB9XG59XG5cbi8vIE5vbi1tdXRhdGluZyBsb29rIGF0IHRoZSBjcm9zcy1wcm9jZXNzIGxvY2sgZmlsZSAoc2VlIHBlZWtNZXJnZUxvY2spLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlZWtNZXJnZUZpbGVMb2NrKHN0b3JhZ2U6IEZpbGVTdG9yYWdlKTogUHJvbWlzZTxNZXJnZUxvY2tJbmZvIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IGhvbGRlcklkOiBleGlzdGluZy5ob2xkZXJJZCwgZXhwaXJlc0luTXM6IGV4aXN0aW5nLnRpbWUgKyBGSUxFX0xPQ0tfVFRMX01TIC0gRGF0ZS5ub3coKSB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1lcmdlRmlsZUxvY2soc3RvcmFnZTogRmlsZVN0b3JhZ2UsIGhvbGRlcklkOiBzdHJpbmcsIHRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KEZJTEVfTE9DS19LRVksIEJ1ZmZlci5mcm9tKGAke2hvbGRlcklkfToke3RpbWV9YCwgXCJ1dGY4XCIpIGFzIEJ1ZmZlcik7XG59XG5cbi8vIEFjcXVpcmUgdGhlIGNyb3NzLXByb2Nlc3MgZmlsZSBsb2NrLiBSZXNvbHZlcyB0byB0cnVlIE9OTFkgaWYsIGFmdGVyIHdyaXRpbmcgb3VyIElEIGFuZCB3YWl0aW5nXG4vLyBGSUxFX0xPQ0tfU0VUVExFX01TIGZvciBjb25jdXJyZW50IHdyaXRlcnMgdG8gc2V0dGxlLCB0aGUgZmlsZSBzdGlsbCBuYW1lcyB1cy4gQ2FsbGVyIG11c3Rcbi8vIHJlbGVhc2VNZXJnZUZpbGVMb2NrKCkgb24gdGhlIHNhbWUgc3RvcmFnZSArIGhvbGRlcklkIHdoZW4gZG9uZS5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cnlBY3F1aXJlTWVyZ2VGaWxlTG9jayhzdG9yYWdlOiBGaWxlU3RvcmFnZSwgaG9sZGVySWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlKTtcbiAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcuaG9sZGVySWQgIT09IGhvbGRlcklkICYmIG5vdyAtIGV4aXN0aW5nLnRpbWUgPCBGSUxFX0xPQ0tfVFRMX01TKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgd3JpdGVNZXJnZUZpbGVMb2NrKHN0b3JhZ2UsIGhvbGRlcklkLCBub3cpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCBGSUxFX0xPQ0tfU0VUVExFX01TKSk7XG4gICAgY29uc3QgYWZ0ZXIgPSBhd2FpdCByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlKTtcbiAgICByZXR1cm4gISFhZnRlciAmJiBhZnRlci5ob2xkZXJJZCA9PT0gaG9sZGVySWQ7XG59XG5cbi8vIEtlZXAgdGhlIGxvY2sgZnJlc2guIFRoZSBtZXJnZSBtaWdodCBydW4gbG9uZ2VyIHRoYW4gRklMRV9MT0NLX1RUTF9NUzsgd2l0aG91dCBwZXJpb2RpYyByZS1zdGFtcGluZyxcbi8vIGFub3RoZXIgcHJvY2VzcyB3b3VsZCBzZWUgdGhlIGxvY2sgYXMgc3RhbGUgYW5kIGFjcXVpcmUgaXQuIFJldHVybnMgYSBzdG9wIGZ1bmN0aW9uIHRoZSBjYWxsZXIgY2FsbHNcbi8vIGluIGBmaW5hbGx5YC4gSGVhcnRiZWF0IGlzIGJlc3QtZWZmb3J0OiBhIGZhaWxlZCB3cml0ZSBpcyBsb2dnZWQgYnV0IG5vdCBwcm9wYWdhdGVkLlxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0TWVyZ2VGaWxlTG9ja0hlYXJ0YmVhdChzdG9yYWdlOiBGaWxlU3RvcmFnZSwgaG9sZGVySWQ6IHN0cmluZyk6ICgpID0+IHZvaWQge1xuICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICB2b2lkIHdyaXRlTWVyZ2VGaWxlTG9jayhzdG9yYWdlLCBob2xkZXJJZCwgRGF0ZS5ub3coKSkuY2F0Y2goKCkgPT4geyAvKiBiZXN0LWVmZm9ydCAqLyB9KTtcbiAgICB9LCBGSUxFX0xPQ0tfSEVBUlRCRUFUX01TKTtcbiAgICAoaW50ZXJ2YWwgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgIHJldHVybiAoKSA9PiBjbGVhckludGVydmFsKGludGVydmFsKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VNZXJnZUZpbGVMb2NrKHN0b3JhZ2U6IEZpbGVTdG9yYWdlLCBob2xkZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nICYmIGV4aXN0aW5nLmhvbGRlcklkID09PSBob2xkZXJJZCkgYXdhaXQgc3RvcmFnZS5yZW1vdmUoRklMRV9MT0NLX0tFWSk7XG4gICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9XG59XG4iXX0=
149
- /* _JS_SOURCE_HASH = "2aac3ba2f7436a4c1d62546c0460b7653a910453df0d38de41be658805d69ee3"; */
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2VMb2NrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWVyZ2VMb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx5d0JBQXl3QjtBQUN6d0IsR0FBRztBQUNILDBjQUEwYzs7O0FBSTFjLE1BQU0sV0FBVyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFJOUIsU0FBUyxjQUFjLENBQUMsS0FBYTtJQUNqQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLElBQUksS0FBSyxHQUFHLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNyRCxDQUFDO0FBRUQsU0FBUyxlQUFlO0lBQ3BCLElBQUksQ0FBQztRQUNELE9BQU8sT0FBTyxZQUFZLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMxRSxDQUFDO0lBQUMsV0FBTSxDQUFDO1FBQ0wsT0FBTyxTQUFTLENBQUMsQ0FBQywyREFBMkQ7SUFDakYsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxVQUFrQjtJQUMvQixPQUFPLHNCQUFzQixHQUFHLFVBQVUsQ0FBQztBQUMvQyxDQUFDO0FBRUQsaVpBQWlaO0FBQ2paLFNBQWdCLG1CQUFtQixDQUFDLFVBQWtCLEVBQUUsUUFBZ0I7SUFDcEUsTUFBTSxFQUFFLEdBQUcsZUFBZSxF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bUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQzNELE1BQU0sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDO0FBQ2xELENBQUM7QUFSRCwwREFRQztBQUVELGlTQUFpUztBQUNqUyxTQUFnQiwyQkFBMkIsQ0FBQyxPQUFvQixFQUFFLFFBQWdCOztJQUM5RSxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQzlCLEtBQUssa0JBQWtCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQXFCLENBQUMsQ0FBQyxDQUFDO0lBQzlGLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0lBQzNCLE1BQUEsTUFBQyxRQUFtQyxFQUFDLEtBQUssa0RBQUksQ0FBQztJQUMvQyxPQUFPLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBTkQsa0VBTUM7QUFFTSxLQUFLLFVBQVUsb0JBQW9CLENBQUMsT0FBb0IsRUFBRSxRQUFnQjtJQUM3RSxJQUFJLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssUUFBUTtZQUFFLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQUMsUUFBUSxZQUFZLElBQWQsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFMRCxvREFLQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEJlc3QtZWZmb3J0IFwib25seSBvbmUgdGFiIG1lcmdlcyB0aGlzIGNvbGxlY3Rpb24gYXQgYSB0aW1lXCIgZ3VhcmQuIFRoaXMgaXMgcHVyZWx5IGFuIGVmZmljaWVuY3kgbWVhc3VyZTogY29ycmVjdG5lc3MgZG9lcyBOT1QgZGVwZW5kIG9uIGl0LiBSZWFkcyByZXNvbHZlIGJ5IHBlci1yb3cgd3JpdGUtdGltZSwgbWVyZ2VzIHdyaXRlIG5ldyBmaWxlcyBiZWZvcmUgZGVsZXRpbmcgY29uc3VtZWQgb25lcywgYW5kIGEgZHVwbGljYXRlLWhlYXZ5IHJlZ2lvbiBnZXRzIHJlLW1lcmdlZCDigJQgc28gdHdvIHRhYnMgbWVyZ2luZyBhdCBvbmNlIG9ubHkgd2FzdGUgd29yayBhbmQgYnJpZWZseSBkdXBsaWNhdGUgZGF0YSwgbmV2ZXIgY29ycnVwdCBvciBsb3NlIGl0LiBUaGUgbG9jayBqdXN0IHN0b3BzIHRoYXQgd2FzdGVkIHdvcmsuIEl0IHVzZXMgbG9jYWxTdG9yYWdlIChzaGFyZWQgYWNyb3NzIHNhbWUtb3JpZ2luIHRhYnMpIGFuZCBpcyBhIG5vLW9wIHdoZXJlIGxvY2FsU3RvcmFnZSBpcyB1bmF2YWlsYWJsZSAoTm9kZSkg4oCUIHRoZXJlIGNvbmN1cnJlbnQgbWVyZ2VzIGFyZSBoYXJtbGVzcywgd2hpY2ggdGhlIE5vZGUgc3RyZXNzIHRlc3RzIGV4ZXJjaXNlLiBsb2NhbFN0b3JhZ2UgaGFzIG5vIGF0b21pYyBjb21wYXJlLWFuZC1zd2FwLCBzbyB3ZSB3cml0ZS10aGVuLXJlcmVhZCB0byBzaHJpbmsgdGhlIHJhY2Ugd2luZG93LCBhbmQgYSBUVEwgZnJlZXMgYSBsb2NrIGxlZnQgYmVoaW5kIGJ5IGEgdGFiIHRoYXQgY3Jhc2hlZCBvciBjbG9zZWQgbWlkLW1lcmdlLlxuLy8gXG4vLyBGaWxlLWxvY2sgbGF5ZXIgKHNlZSBhY3F1aXJlTWVyZ2VGaWxlTG9jayBhdCB0aGUgYm90dG9tKTogZm9yIGNyb3NzLVBST0NFU1Mgc2FmZXR5IChkaWZmZXJlbnQgYnJvd3NlcnMsIGRpZmZlcmVudCBtYWNoaW5lcyBwb2ludGluZyBhdCB0aGUgc2FtZSByZW1vdGUgc3RvcmFnZSksIHdlIEFMU08gd3JpdGUgYSBgLm1lcmdlLWxvY2tgIGZpbGUgaW5zaWRlIHRoZSBjb2xsZWN0aW9uJ3Mgc3RvcmFnZSB3aXRoIG91ciBJRC4gVGhlIHByb3RvY29sIGlzIGNoZWNrLXdyaXRlLXdhaXQtcmVjaGVjayDigJQgbGFzdCB3cml0ZXIgd2lucyBhZnRlciB0aGUgMTVzIHNldHRsZSB3aW5kb3cuIFRoZSBsb2NhbFN0b3JhZ2UgbG9jayBhYm92ZSBjb3ZlcnMgc2FtZS1vcmlnaW4gdGFiczsgdGhpcyBjb3ZlcnMgZXZlcnl0aGluZyBlbHNlIChzZXBhcmF0ZSBwcm9jZXNzZXMsIHJlbW90ZSBzaGFyZWQgc3RvcmFnZSkuXG5cbmltcG9ydCB0eXBlIHsgRmlsZVN0b3JhZ2UgfSBmcm9tIFwiLi4vRmlsZUZvbGRlckFQSVwiO1xuXG5jb25zdCBMT0NLX1RUTF9NUyA9IDMwICogMTAwMDtcblxuZXhwb3J0IHR5cGUgTWVyZ2VMb2NrSW5mbyA9IHsgaG9sZGVySWQ6IHN0cmluZzsgZXhwaXJlc0luTXM6IG51bWJlciB9O1xuXG5mdW5jdGlvbiBwYXJzZUxvY2tUb2tlbih0b2tlbjogc3RyaW5nKTogeyBob2xkZXJJZDogc3RyaW5nOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29sb24gPSB0b2tlbi5sYXN0SW5kZXhPZihcIjpcIik7XG4gICAgaWYgKGNvbG9uIDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB0aW1lID0gcGFyc2VJbnQodG9rZW4uc2xpY2UoY29sb24gKyAxKSwgMTApO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRpbWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IGhvbGRlcklkOiB0b2tlbi5zbGljZSgwLCBjb2xvbiksIHRpbWUgfTtcbn1cblxuZnVuY3Rpb24gZ2V0TG9jYWxTdG9yYWdlKCk6IFN0b3JhZ2UgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSBcInVuZGVmaW5lZFwiID8gbG9jYWxTdG9yYWdlIDogdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBhY2Nlc3NpbmcgbG9jYWxTdG9yYWdlIGNhbiB0aHJvdyAoZS5nLiBkaXNhYmxlZCBjb29raWVzKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbG9ja0tleShjb2xsZWN0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImJ1bGtEYXRhYmFzZTItbWVyZ2U6XCIgKyBjb2xsZWN0aW9uO1xufVxuXG4vLyBSZXR1cm5zIHRydWUgaWYgd2Ugbm93IGhvbGQgdGhlIGxvY2sgKG9yIHRoZXJlJ3Mgbm8gbG9jYWxTdG9yYWdlIHRvIGNvb3JkaW5hdGUgdGhyb3VnaCwgaW4gd2hpY2ggY2FzZSB3ZSBwcm9jZWVkIOKAlCBjb25jdXJyZW50IG1lcmdlcyBhcmUgaGFybWxlc3MpLiBSZXR1cm5zIGZhbHNlIG9ubHkgaWYgYSBESUZGRVJFTlQgaG9sZGVyIGhhcyBhIGZyZXNoIGxvY2suIFJlLXN0YW1waW5nIG91ciBvd24gbG9jayBhbHdheXMgc3VjY2VlZHMsIHNvIHRoaXMgZG91YmxlcyBhcyBhIGhlYXJ0YmVhdDogY2FsbCBpdCBwZXJpb2RpY2FsbHkgZHVyaW5nIGEgbG9uZywgc3BhY2VkLW91dCBtZXJnZSB0byBrZWVwIHRoZSBsb2NrIGFsaXZlIChhbmQgZGV0ZWN0IGlmIGFub3RoZXIgdGFiIHRvb2sgaXQgb3ZlcikuXG5leHBvcnQgZnVuY3Rpb24gdHJ5QWNxdWlyZU1lcmdlTG9jayhjb2xsZWN0aW9uOiBzdHJpbmcsIGhvbGRlcklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBscyA9IGdldExvY2FsU3RvcmFnZSgpO1xuICAgIGlmICghbHMpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGtleSA9IGxvY2tLZXkoY29sbGVjdGlvbik7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBleGlzdGluZyA9IGxzLmdldEl0ZW0oa2V5KTtcbiAgICBpZiAoZXhpc3RpbmcgJiYgIWV4aXN0aW5nLnN0YXJ0c1dpdGgoaG9sZGVySWQgKyBcIjpcIikpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VMb2NrVG9rZW4oZXhpc3RpbmcpO1xuICAgICAgICBpZiAocGFyc2VkICYmIG5vdyAtIHBhcnNlZC50aW1lIDwgTE9DS19UVExfTVMpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSBob2xkZXJJZCArIFwiOlwiICsgbm93O1xuICAgIGxzLnNldEl0ZW0oa2V5LCB0b2tlbik7XG4gICAgLy8gUmUtcmVhZCB0byBjYXRjaCBhIHJhY2luZyBzZXRJdGVtIGZyb20gYW5vdGhlciB0YWIgKGJlc3QtZWZmb3J0LCBub3QgYXRvbWljKS5cbiAgICByZXR1cm4gbHMuZ2V0SXRlbShrZXkpID09PSB0b2tlbjtcbn1cblxuLy8gTm9uLW11dGF0aW5nIGxvb2sgYXQgdGhlIHRhYiBsb2NrOiB3aG8gaG9sZHMgaXQgYW5kIGhvdyBsb25nIHVudGlsIGl0IGdvZXMgc3RhbGUgKG5lZ2F0aXZlID0gYWxyZWFkeSBzdGFsZSkuIEZvciBsb2dnaW5nIHdoeSBhIG1lcmdlIHdhcyBza2lwcGVkLlxuZXhwb3J0IGZ1bmN0aW9uIHBlZWtNZXJnZUxvY2soY29sbGVjdGlvbjogc3RyaW5nKTogTWVyZ2VMb2NrSW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbHMgPSBnZXRMb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAoIWxzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gbHMuZ2V0SXRlbShsb2NrS2V5KGNvbGxlY3Rpb24pKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlTG9ja1Rva2VuKGV4aXN0aW5nKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBob2xkZXJJZDogcGFyc2VkLmhvbGRlcklkLCBleHBpcmVzSW5NczogcGFyc2VkLnRpbWUgKyBMT0NLX1RUTF9NUyAtIERhdGUubm93KCkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGVhc2VNZXJnZUxvY2soY29sbGVjdGlvbjogc3RyaW5nLCBob2xkZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbHMgPSBnZXRMb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAoIWxzKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gbG9ja0tleShjb2xsZWN0aW9uKTtcbiAgICBjb25zdCBleGlzdGluZyA9IGxzLmdldEl0ZW0oa2V5KTtcbiAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3Rpbmcuc3RhcnRzV2l0aChob2xkZXJJZCArIFwiOlwiKSkgbHMucmVtb3ZlSXRlbShrZXkpO1xufVxuXG4vLyDilIDilIAgRmlsZS1iYXNlZCBsb2NrIChjcm9zcy1wcm9jZXNzIC8gc2hhcmVkIHN0b3JhZ2UpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuY29uc3QgRklMRV9MT0NLX0tFWSA9IFwiLm1lcmdlLWxvY2tcIjtcbmNvbnN0IEZJTEVfTE9DS19UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuY29uc3QgRklMRV9MT0NLX1NFVFRMRV9NUyA9IDE1ICogMTAwMDtcbmNvbnN0IEZJTEVfTE9DS19IRUFSVEJFQVRfTVMgPSAyICogNjAgKiAxMDAwO1xuXG5hc3luYyBmdW5jdGlvbiByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlOiBGaWxlU3RvcmFnZSk6IFByb21pc2U8eyBob2xkZXJJZDogc3RyaW5nOyB0aW1lOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHN0b3JhZ2UuZ2V0KEZJTEVfTE9DS19LRVkpO1xuICAgICAgICBpZiAoIWJ1ZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHBhcnNlTG9ja1Rva2VuKGJ1Zi50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgIH0gY2F0Y2ggeyByZXR1cm4gdW5kZWZpbmVkOyB9XG59XG5cbi8vIE5vbi1tdXRhdGluZyBsb29rIGF0IHRoZSBjcm9zcy1wcm9jZXNzIGxvY2sgZmlsZSAoc2VlIHBlZWtNZXJnZUxvY2spLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlZWtNZXJnZUZpbGVMb2NrKHN0b3JhZ2U6IEZpbGVTdG9yYWdlKTogUHJvbWlzZTxNZXJnZUxvY2tJbmZvIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkTWVyZ2VGaWxlTG9jayhzdG9yYWdlKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IGhvbGRlcklkOiBleGlzdGluZy5ob2xkZXJJZCwgZXhwaXJlc0luTXM6IGV4aXN0aW5nLnRpbWUgKyBGSUxFX0xPQ0tfVFRMX01TIC0gRGF0ZS5ub3coKSB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZU1lcmdlRmlsZUxvY2soc3RvcmFnZTogRmlsZVN0b3JhZ2UsIGhvbGRlcklkOiBzdHJpbmcsIHRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KEZJTEVfTE9DS19LRVksIEJ1ZmZlci5mcm9tKGAke2hvbGRlcklkfToke3RpbWV9YCwgXCJ1dGY4XCIpIGFzIEJ1ZmZlcik7XG59XG5cbi8vIEFjcXVpcmUgdGhlIGNyb3NzLXByb2Nlc3MgZmlsZSBsb2NrLiBSZXNvbHZlcyB0byB0cnVlIE9OTFkgaWYsIGFmdGVyIHdyaXRpbmcgb3VyIElEIGFuZCB3YWl0aW5nIEZJTEVfTE9DS19TRVRUTEVfTVMgZm9yIGNvbmN1cnJlbnQgd3JpdGVycyB0byBzZXR0bGUsIHRoZSBmaWxlIHN0aWxsIG5hbWVzIHVzLiBDYWxsZXIgbXVzdCByZWxlYXNlTWVyZ2VGaWxlTG9jaygpIG9uIHRoZSBzYW1lIHN0b3JhZ2UgKyBob2xkZXJJZCB3aGVuIGRvbmUuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5QWNxdWlyZU1lcmdlRmlsZUxvY2soc3RvcmFnZTogRmlsZVN0b3JhZ2UsIGhvbGRlcklkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZE1lcmdlRmlsZUxvY2soc3RvcmFnZSk7XG4gICAgaWYgKGV4aXN0aW5nICYmIGV4aXN0aW5nLmhvbGRlcklkICE9PSBob2xkZXJJZCAmJiBub3cgLSBleGlzdGluZy50aW1lIDwgRklMRV9MT0NLX1RUTF9NUykgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IHdyaXRlTWVyZ2VGaWxlTG9jayhzdG9yYWdlLCBob2xkZXJJZCwgbm93KTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgRklMRV9MT0NLX1NFVFRMRV9NUykpO1xuICAgIGNvbnN0IGFmdGVyID0gYXdhaXQgcmVhZE1lcmdlRmlsZUxvY2soc3RvcmFnZSk7XG4gICAgcmV0dXJuICEhYWZ0ZXIgJiYgYWZ0ZXIuaG9sZGVySWQgPT09IGhvbGRlcklkO1xufVxuXG4vLyBLZWVwIHRoZSBsb2NrIGZyZXNoLiBUaGUgbWVyZ2UgbWlnaHQgcnVuIGxvbmdlciB0aGFuIEZJTEVfTE9DS19UVExfTVM7IHdpdGhvdXQgcGVyaW9kaWMgcmUtc3RhbXBpbmcsIGFub3RoZXIgcHJvY2VzcyB3b3VsZCBzZWUgdGhlIGxvY2sgYXMgc3RhbGUgYW5kIGFjcXVpcmUgaXQuIFJldHVybnMgYSBzdG9wIGZ1bmN0aW9uIHRoZSBjYWxsZXIgY2FsbHMgaW4gYGZpbmFsbHlgLiBIZWFydGJlYXQgaXMgYmVzdC1lZmZvcnQ6IGEgZmFpbGVkIHdyaXRlIGlzIGxvZ2dlZCBidXQgbm90IHByb3BhZ2F0ZWQuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRNZXJnZUZpbGVMb2NrSGVhcnRiZWF0KHN0b3JhZ2U6IEZpbGVTdG9yYWdlLCBob2xkZXJJZDogc3RyaW5nKTogKCkgPT4gdm9pZCB7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIHZvaWQgd3JpdGVNZXJnZUZpbGVMb2NrKHN0b3JhZ2UsIGhvbGRlcklkLCBEYXRlLm5vdygpKS5jYXRjaCgoKSA9PiB7IC8qIGJlc3QtZWZmb3J0ICovIH0pO1xuICAgIH0sIEZJTEVfTE9DS19IRUFSVEJFQVRfTVMpO1xuICAgIChpbnRlcnZhbCBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgcmV0dXJuICgpID0+IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVsZWFzZU1lcmdlRmlsZUxvY2soc3RvcmFnZTogRmlsZVN0b3JhZ2UsIGhvbGRlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRNZXJnZUZpbGVMb2NrKHN0b3JhZ2UpO1xuICAgICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcuaG9sZGVySWQgPT09IGhvbGRlcklkKSBhd2FpdCBzdG9yYWdlLnJlbW92ZShGSUxFX0xPQ0tfS0VZKTtcbiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH1cbn1cbiJdfQ==
130
+ /* _JS_SOURCE_HASH = "4835586d08d4f89d124b3f45f798b450a1de03dea4f9332b3dd22ae53f266c1f"; */
@@ -1,19 +1,12 @@
1
- "use strict";
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
2
  // Deletion markers: how a merge retires the input files it consumed WITHOUT deleting them inline.
3
- //
4
- // The old approach deleted consumed inputs on a 15-min timer. If the tab closed before the timer fired
5
- // the inputs survived AND were still read — so the next merge re-merged the same duplicates, forever
6
- // (the "1739 files, 155GB, 99% duplicate" loop). Markers fix both halves: the consumed inputs are
7
- // EXCLUDED from reads the moment the marker exists (so they're never re-merged), and their physical
8
- // deletion is driven off the marker on a later read instead of an in-process timer.
9
- //
10
- // A marker names the input files it wants gone (`deleteFiles`) and the output files that supersede them
11
- // (`replacedBy`). On every read we:
3
+ //
4
+ // The old approach deleted consumed inputs on a 15-min timer. If the tab closed before the timer fired the inputs survived AND were still read — so the next merge re-merged the same duplicates, forever (the "1739 files, 155GB, 99% duplicate" loop). Markers fix both halves: the consumed inputs are EXCLUDED from reads the moment the marker exists (so they're never re-merged), and their physical deletion is driven off the marker on a later read instead of an in-process timer.
5
+ //
6
+ // A marker names the input files it wants gone (`deleteFiles`) and the output files that supersede them (`replacedBy`). On every read we:
12
7
  // 1) exclude every `deleteFiles` entry from the active file set (unconditionally — that's the loop fix);
13
- // 2) delete a marker's `deleteFiles` once its `replacedBy` outputs all exist OR the marker is older than
14
- // the grace window (a crash-safety floor so a marker whose outputs never landed still gets cleaned);
15
- // 3) once a marker's `deleteFiles` are all gone, and the marker has aged past the grace window, delete
16
- // the marker itself (kept around briefly so a concurrent reader still excludes the files consistently).
8
+ // 2) delete a marker's `deleteFiles` once its `replacedBy` outputs all exist OR the marker is older than the grace window (a crash-safety floor so a marker whose outputs never landed still gets cleaned);
9
+ // 3) once a marker's `deleteFiles` are all gone, and the marker has aged past the grace window, delete the marker itself (kept around briefly so a concurrent reader still excludes the files consistently).
17
10
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
18
11
  exports.processDeleteMarkers = exports.markerExclusions = exports.readDeleteMarkers = exports.writeDeleteMarker = exports.isMarkerFile = void 0;
19
12
  const logColors_1 = require("socket-function/src/formatting/logColors");
@@ -63,8 +56,7 @@ function markerExclusions(markers) {
63
56
  return excluded;
64
57
  }
65
58
  exports.markerExclusions = markerExclusions;
66
- // Act on each marker (see file header). Idempotent and best-effort: every removal is guarded, so two
67
- // processes (or two reads) running this at once just race to the same already-correct end state.
59
+ // Act on each marker (see file header). Idempotent and best-effort: every removal is guarded, so two processes (or two reads) running this at once just race to the same already-correct end state.
68
60
  async function processDeleteMarkers(name, storage, markers, allNames) {
69
61
  const present = new Set(allNames);
70
62
  const now = Date.now();
@@ -97,5 +89,5 @@ async function processDeleteMarkers(name, storage, markers, allNames) {
97
89
  }
98
90
  }
99
91
  exports.processDeleteMarkers = processDeleteMarkers;
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2VNYXJrZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWVyZ2VNYXJrZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrR0FBa0c7QUFDbEcsRUFBRTtBQUNGLHVHQUF1RztBQUN2RyxxR0FBcUc7QUFDckcsa0dBQWtHO0FBQ2xHLG9HQUFvRztBQUNwRyxvRkFBb0Y7QUFDcEYsRUFBRTtBQUNGLHdHQUF3RztBQUN4RyxvQ0FBb0M7QUFDcEMsMkdBQTJHO0FBQzNHLDJHQUEyRztBQUMzRywwR0FBMEc7QUFDMUcseUdBQXlHO0FBQ3pHLDZHQUE2Rzs7O0FBRzdHLHdFQUF5RTtBQUV6RSxNQUFNLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztBQUN4QyxNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQVN0QyxTQUFnQixZQUFZLENBQUMsSUFBWTtJQUNyQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUZELG9DQUVDO0FBRU0sS0FBSyxVQUFVLGlCQUFpQixDQUFDLE9BQW9CLEVBQUUsTUFBdUQ7SUFDakgsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLE1BQU0sSUFBSSxHQUFHLEdBQUcsYUFBYSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNsRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENB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Q2IsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRyxJQUFJLGNBQWMsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxlQUFlLEVBQUUsQ0FBQztZQUN4RCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxlQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDakgsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLEtBQUssTUFBTSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQztvQkFBQyxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQUMsQ0FBQztnQkFBQyxRQUFRLGtCQUFrQixJQUFwQixDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUM1RSxDQUFDO1lBQ0QsSUFBSSxPQUFPO2dCQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFBLGdCQUFJLEVBQUMsSUFBSSxDQUFDLElBQUksSUFBQSxtQkFBTyxFQUFDLFFBQVEsQ0FBQyxhQUFhLE9BQU8sK0JBQStCLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDN0gsQ0FBQztJQUNMLENBQUM7QUFDTCxDQUFDO0FBdEJELG9EQXNCQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIERlbGV0aW9uIG1hcmtlcnM6IGhvdyBhIG1lcmdlIHJldGlyZXMgdGhlIGlucHV0IGZpbGVzIGl0IGNvbnN1bWVkIFdJVEhPVVQgZGVsZXRpbmcgdGhlbSBpbmxpbmUuXG4vL1xuLy8gVGhlIG9sZCBhcHByb2FjaCBkZWxldGVkIGNvbnN1bWVkIGlucHV0cyBvbiBhIDE1LW1pbiB0aW1lci4gSWYgdGhlIHRhYiBjbG9zZWQgYmVmb3JlIHRoZSB0aW1lciBmaXJlZFxuLy8gdGhlIGlucHV0cyBzdXJ2aXZlZCBBTkQgd2VyZSBzdGlsbCByZWFkIOKAlCBzbyB0aGUgbmV4dCBtZXJnZSByZS1tZXJnZWQgdGhlIHNhbWUgZHVwbGljYXRlcywgZm9yZXZlclxuLy8gKHRoZSBcIjE3MzkgZmlsZXMsIDE1NUdCLCA5OSUgZHVwbGljYXRlXCIgbG9vcCkuIE1hcmtlcnMgZml4IGJvdGggaGFsdmVzOiB0aGUgY29uc3VtZWQgaW5wdXRzIGFyZVxuLy8gRVhDTFVERUQgZnJvbSByZWFkcyB0aGUgbW9tZW50IHRoZSBtYXJrZXIgZXhpc3RzIChzbyB0aGV5J3JlIG5ldmVyIHJlLW1lcmdlZCksIGFuZCB0aGVpciBwaHlzaWNhbFxuLy8gZGVsZXRpb24gaXMgZHJpdmVuIG9mZiB0aGUgbWFya2VyIG9uIGEgbGF0ZXIgcmVhZCBpbnN0ZWFkIG9mIGFuIGluLXByb2Nlc3MgdGltZXIuXG4vL1xuLy8gQSBtYXJrZXIgbmFtZXMgdGhlIGlucHV0IGZpbGVzIGl0IHdhbnRzIGdvbmUgKGBkZWxldGVGaWxlc2ApIGFuZCB0aGUgb3V0cHV0IGZpbGVzIHRoYXQgc3VwZXJzZWRlIHRoZW1cbi8vIChgcmVwbGFjZWRCeWApLiBPbiBldmVyeSByZWFkIHdlOlxuLy8gICAxKSBleGNsdWRlIGV2ZXJ5IGBkZWxldGVGaWxlc2AgZW50cnkgZnJvbSB0aGUgYWN0aXZlIGZpbGUgc2V0ICh1bmNvbmRpdGlvbmFsbHkg4oCUIHRoYXQncyB0aGUgbG9vcCBmaXgpO1xuLy8gICAyKSBkZWxldGUgYSBtYXJrZXIncyBgZGVsZXRlRmlsZXNgIG9uY2UgaXRzIGByZXBsYWNlZEJ5YCBvdXRwdXRzIGFsbCBleGlzdCBPUiB0aGUgbWFya2VyIGlzIG9sZGVyIHRoYW5cbi8vICAgICAgdGhlIGdyYWNlIHdpbmRvdyAoYSBjcmFzaC1zYWZldHkgZmxvb3Igc28gYSBtYXJrZXIgd2hvc2Ugb3V0cHV0cyBuZXZlciBsYW5kZWQgc3RpbGwgZ2V0cyBjbGVhbmVkKTtcbi8vICAgMykgb25jZSBhIG1hcmtlcidzIGBkZWxldGVGaWxlc2AgYXJlIGFsbCBnb25lLCBhbmQgdGhlIG1hcmtlciBoYXMgYWdlZCBwYXN0IHRoZSBncmFjZSB3aW5kb3csIGRlbGV0ZVxuLy8gICAgICB0aGUgbWFya2VyIGl0c2VsZiAoa2VwdCBhcm91bmQgYnJpZWZseSBzbyBhIGNvbmN1cnJlbnQgcmVhZGVyIHN0aWxsIGV4Y2x1ZGVzIHRoZSBmaWxlcyBjb25zaXN0ZW50bHkpLlxuXG5pbXBvcnQgdHlwZSB7IEZpbGVTdG9yYWdlIH0gZnJvbSBcIi4uL0ZpbGVGb2xkZXJBUElcIjtcbmltcG9ydCB7IGJsdWUsIG1hZ2VudGEgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuXG5jb25zdCBNQVJLRVJfUFJFRklYID0gXCIuZGVsZXRlLW1hcmtlcl9cIjtcbmNvbnN0IE1BUktFUl9HUkFDRV9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbmV4cG9ydCB0eXBlIERlbGV0ZU1hcmtlciA9IHtcbiAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgIGRlbGV0ZUZpbGVzOiBzdHJpbmdbXTtcbiAgICByZXBsYWNlZEJ5OiBzdHJpbmdbXTtcbiAgICB0aW1lOiBudW1iZXI7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNNYXJrZXJGaWxlKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBuYW1lLnN0YXJ0c1dpdGgoTUFSS0VSX1BSRUZJWCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZURlbGV0ZU1hcmtlcihzdG9yYWdlOiBGaWxlU3RvcmFnZSwgY29uZmlnOiB7IGRlbGV0ZUZpbGVzOiBzdHJpbmdbXTsgcmVwbGFjZWRCeTogc3RyaW5nW10gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IG5hbWUgPSBgJHtNQVJLRVJfUFJFRklYfSR7dGltZX1fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YDtcbiAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoeyBkZWxldGVGaWxlczogY29uZmlnLmRlbGV0ZUZpbGVzLCByZXBsYWNlZEJ5OiBjb25maWcucmVwbGFjZWRCeSwgdGltZSB9KTtcbiAgICBhd2FpdCBzdG9yYWdlLnNldChuYW1lLCBCdWZmZXIuZnJvbShib2R5LCBcInV0ZjhcIikgYXMgQnVmZmVyKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWREZWxldGVNYXJrZXJzKHN0b3JhZ2U6IEZpbGVTdG9yYWdlLCBhbGxOYW1lczogc3RyaW5nW10pOiBQcm9taXNlPERlbGV0ZU1hcmtlcltdPiB7XG4gICAgY29uc3QgbWFya2VyTmFtZXMgPSBhbGxOYW1lcy5maWx0ZXIoaXNNYXJrZXJGaWxlKTtcbiAgICBjb25zdCBtYXJrZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwobWFya2VyTmFtZXMubWFwKGFzeW5jIChmaWxlTmFtZSk6IFByb21pc2U8RGVsZXRlTWFya2VyIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBidWYgPSBhd2FpdCBzdG9yYWdlLmdldChmaWxlTmFtZSk7XG4gICAgICAgICAgICBpZiAoIWJ1ZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoYnVmLnRvU3RyaW5nKFwidXRmOFwiKSkgYXMgeyBkZWxldGVGaWxlcz86IHVua25vd247IHJlcGxhY2VkQnk/OiB1bmtub3duOyB0aW1lPzogdW5rbm93biB9O1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcnNlZC5kZWxldGVGaWxlcykgfHwgIUFycmF5LmlzQXJyYXkocGFyc2VkLnJlcGxhY2VkQnkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICBkZWxldGVGaWxlczogcGFyc2VkLmRlbGV0ZUZpbGVzIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIHJlcGxhY2VkQnk6IHBhcnNlZC5yZXBsYWNlZEJ5IGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIHRpbWU6IHR5cGVvZiBwYXJzZWQudGltZSA9PT0gXCJudW1iZXJcIiA/IHBhcnNlZC50aW1lIDogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICByZXR1cm4gbWFya2Vycy5maWx0ZXIoKG0pOiBtIGlzIERlbGV0ZU1hcmtlciA9PiAhIW0pO1xufVxuXG4vLyBUaGUgc2V0IG9mIGZpbGVzIHRoYXQgYW55IG1hcmtlciB3YW50cyBkZWxldGVkIOKAlCB0aGVzZSBtdXN0IGJlIGRyb3BwZWQgZnJvbSB0aGUgYWN0aXZlIHJlYWQgc2V0LlxuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlckV4Y2x1c2lvbnMobWFya2VyczogRGVsZXRlTWFya2VyW10pOiBTZXQ8c3RyaW5nPiB7XG4gICAgY29uc3QgZXhjbHVkZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IG0gb2YgbWFya2VycykgZm9yIChjb25zdCBuIG9mIG0uZGVsZXRlRmlsZXMpIGV4Y2x1ZGVkLmFkZChuKTtcbiAgICByZXR1cm4gZXhjbHVkZWQ7XG59XG5cbi8vIEFjdCBvbiBlYWNoIG1hcmtlciAoc2VlIGZpbGUgaGVhZGVyKS4gSWRlbXBvdGVudCBhbmQgYmVzdC1lZmZvcnQ6IGV2ZXJ5IHJlbW92YWwgaXMgZ3VhcmRlZCwgc28gdHdvXG4vLyBwcm9jZXNzZXMgKG9yIHR3byByZWFkcykgcnVubmluZyB0aGlzIGF0IG9uY2UganVzdCByYWNlIHRvIHRoZSBzYW1lIGFscmVhZHktY29ycmVjdCBlbmQgc3RhdGUuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RlbGV0ZU1hcmtlcnMobmFtZTogc3RyaW5nLCBzdG9yYWdlOiBGaWxlU3RvcmFnZSwgbWFya2VyczogRGVsZXRlTWFya2VyW10sIGFsbE5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KGFsbE5hbWVzKTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIG1hcmtlcnMpIHtcbiAgICAgICAgY29uc3Qgc3RpbGxQcmVzZW50ID0gbWFya2VyLmRlbGV0ZUZpbGVzLmZpbHRlcihuID0+IHByZXNlbnQuaGFzKG4pKTtcbiAgICAgICAgaWYgKCFzdGlsbFByZXNlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBUaGUgZmlsZXMgdGhpcyBtYXJrZXIgcmV0aXJlZCBhcmUgZ29uZTsgb25jZSBpdCdzIGFnZWQgcGFzdCB0aGUgZ3JhY2Ugd2luZG93LCByZXRpcmUgdGhlIG1hcmtlciB0b28uXG4gICAgICAgICAgICBpZiAobm93IC0gbWFya2VyLnRpbWUgPiBNQVJLRVJfR1JBQ0VfTVMpIHtcbiAgICAgICAgICAgICAgICB0cnkgeyBhd2FpdCBzdG9yYWdlLnJlbW92ZShtYXJrZXIuZmlsZU5hbWUpOyB9IGNhdGNoIHsgLyogYWxyZWFkeSBnb25lICovIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcGxhY2VkRXhpc3RzID0gbWFya2VyLnJlcGxhY2VkQnkubGVuZ3RoID4gMCAmJiBtYXJrZXIucmVwbGFjZWRCeS5ldmVyeShuID0+IHByZXNlbnQuaGFzKG4pKTtcbiAgICAgICAgaWYgKHJlcGxhY2VkRXhpc3RzIHx8IG5vdyAtIG1hcmtlci50aW1lID4gTUFSS0VSX0dSQUNFX01TKSB7XG4gICAgICAgICAgICBjb25zdCByZWFzb24gPSByZXBsYWNlZEV4aXN0cyA/IGByZXBsYWNlbWVudHMgbGFuZGVkYCA6IGBtYXJrZXIgYWdlZCAke01hdGgucm91bmQoKG5vdyAtIG1hcmtlci50aW1lKSAvIDEwMDApfXNgO1xuICAgICAgICAgICAgbGV0IGRlbGV0ZWQgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIHN0aWxsUHJlc2VudCkge1xuICAgICAgICAgICAgICAgIHRyeSB7IGF3YWl0IHN0b3JhZ2UucmVtb3ZlKG4pOyBkZWxldGVkKys7IH0gY2F0Y2ggeyAvKiBhbHJlYWR5IGdvbmUgKi8gfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIGNvbnNvbGUubG9nKGAke2JsdWUobmFtZSl9ICR7bWFnZW50YShcInJldGlyZVwiKX06IGRlbGV0ZWQgJHtkZWxldGVkfSBtZXJnZWQtYXdheSBpbnB1dCBmaWxlKHMpICgke3JlYXNvbn0pYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
101
- /* _JS_SOURCE_HASH = "77027f83d4d551a0568e2117f614c13ae4cac060aa7870e7357bbda2526ff717"; */
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2VNYXJrZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWVyZ2VNYXJrZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxrR0FBa0c7QUFDbEcsR0FBRztBQUNILDhkQUE4ZDtBQUM5ZCxHQUFHO0FBQ0gsMElBQTBJO0FBQzFJLDJHQUEyRztBQUMzRyw4TUFBOE07QUFDOU0sK01BQStNOzs7QUFHL00sd0VBQXlFO0FBRXpFLE1BQU0sYUFBYSxHQUFHLGlCQUFpQixDQUFDO0FBQ3hDLE1BQU0sZUFBZSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBU3RDLFNBQWdCLFlBQVksQ0FBQyxJQUFZO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRkQsb0NBRUM7QUFFTSxLQUFLLFVBQVUsaUJBQWlCLENBQUMsT0FBb0IsRUFBRSxNQUF1RDtJQUNqSCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDeEIsTUFBTSxJQUFJLEdBQUcsR0FBRyxhQUFhLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2xGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFXLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBTEQsOENBS0M7QUFFTSxLQUFLLFVBQVUsaUJBQWlCLENBQUMsT0FBb0IsRUFB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QUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEcsSUFBSSxjQUFjLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsZUFBZSxFQUFFLENBQUM7WUFDeEQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ2pILElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNoQixLQUFLLE1BQU0sQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUM7b0JBQUMsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsUUFBUSxrQkFBa0IsSUFBcEIsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDNUUsQ0FBQztZQUNELElBQUksT0FBTztnQkFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBQSxnQkFBSSxFQUFDLElBQUksQ0FBQyxJQUFJLElBQUEsbUJBQU8sRUFBQyxRQUFRLENBQUMsYUFBYSxPQUFPLCtCQUErQixNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdILENBQUM7SUFDTCxDQUFDO0FBQ0wsQ0FBQztBQXRCRCxvREFzQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBEZWxldGlvbiBtYXJrZXJzOiBob3cgYSBtZXJnZSByZXRpcmVzIHRoZSBpbnB1dCBmaWxlcyBpdCBjb25zdW1lZCBXSVRIT1VUIGRlbGV0aW5nIHRoZW0gaW5saW5lLlxuLy8gXG4vLyBUaGUgb2xkIGFwcHJvYWNoIGRlbGV0ZWQgY29uc3VtZWQgaW5wdXRzIG9uIGEgMTUtbWluIHRpbWVyLiBJZiB0aGUgdGFiIGNsb3NlZCBiZWZvcmUgdGhlIHRpbWVyIGZpcmVkIHRoZSBpbnB1dHMgc3Vydml2ZWQgQU5EIHdlcmUgc3RpbGwgcmVhZCDigJQgc28gdGhlIG5leHQgbWVyZ2UgcmUtbWVyZ2VkIHRoZSBzYW1lIGR1cGxpY2F0ZXMsIGZvcmV2ZXIgKHRoZSBcIjE3MzkgZmlsZXMsIDE1NUdCLCA5OSUgZHVwbGljYXRlXCIgbG9vcCkuIE1hcmtlcnMgZml4IGJvdGggaGFsdmVzOiB0aGUgY29uc3VtZWQgaW5wdXRzIGFyZSBFWENMVURFRCBmcm9tIHJlYWRzIHRoZSBtb21lbnQgdGhlIG1hcmtlciBleGlzdHMgKHNvIHRoZXkncmUgbmV2ZXIgcmUtbWVyZ2VkKSwgYW5kIHRoZWlyIHBoeXNpY2FsIGRlbGV0aW9uIGlzIGRyaXZlbiBvZmYgdGhlIG1hcmtlciBvbiBhIGxhdGVyIHJlYWQgaW5zdGVhZCBvZiBhbiBpbi1wcm9jZXNzIHRpbWVyLlxuLy8gXG4vLyBBIG1hcmtlciBuYW1lcyB0aGUgaW5wdXQgZmlsZXMgaXQgd2FudHMgZ29uZSAoYGRlbGV0ZUZpbGVzYCkgYW5kIHRoZSBvdXRwdXQgZmlsZXMgdGhhdCBzdXBlcnNlZGUgdGhlbSAoYHJlcGxhY2VkQnlgKS4gT24gZXZlcnkgcmVhZCB3ZTpcbi8vICAgMSkgZXhjbHVkZSBldmVyeSBgZGVsZXRlRmlsZXNgIGVudHJ5IGZyb20gdGhlIGFjdGl2ZSBmaWxlIHNldCAodW5jb25kaXRpb25hbGx5IOKAlCB0aGF0J3MgdGhlIGxvb3AgZml4KTtcbi8vICAgMikgZGVsZXRlIGEgbWFya2VyJ3MgYGRlbGV0ZUZpbGVzYCBvbmNlIGl0cyBgcmVwbGFjZWRCeWAgb3V0cHV0cyBhbGwgZXhpc3QgT1IgdGhlIG1hcmtlciBpcyBvbGRlciB0aGFuIHRoZSBncmFjZSB3aW5kb3cgKGEgY3Jhc2gtc2FmZXR5IGZsb29yIHNvIGEgbWFya2VyIHdob3NlIG91dHB1dHMgbmV2ZXIgbGFuZGVkIHN0aWxsIGdldHMgY2xlYW5lZCk7XG4vLyAgIDMpIG9uY2UgYSBtYXJrZXIncyBgZGVsZXRlRmlsZXNgIGFyZSBhbGwgZ29uZSwgYW5kIHRoZSBtYXJrZXIgaGFzIGFnZWQgcGFzdCB0aGUgZ3JhY2Ugd2luZG93LCBkZWxldGUgdGhlIG1hcmtlciBpdHNlbGYgKGtlcHQgYXJvdW5kIGJyaWVmbHkgc28gYSBjb25jdXJyZW50IHJlYWRlciBzdGlsbCBleGNsdWRlcyB0aGUgZmlsZXMgY29uc2lzdGVudGx5KS5cblxuaW1wb3J0IHR5cGUgeyBGaWxlU3RvcmFnZSB9IGZyb20gXCIuLi9GaWxlRm9sZGVyQVBJXCI7XG5pbXBvcnQgeyBibHVlLCBtYWdlbnRhIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcblxuY29uc3QgTUFSS0VSX1BSRUZJWCA9IFwiLmRlbGV0ZS1tYXJrZXJfXCI7XG5jb25zdCBNQVJLRVJfR1JBQ0VfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG5leHBvcnQgdHlwZSBEZWxldGVNYXJrZXIgPSB7XG4gICAgZmlsZU5hbWU6IHN0cmluZztcbiAgICBkZWxldGVGaWxlczogc3RyaW5nW107XG4gICAgcmVwbGFjZWRCeTogc3RyaW5nW107XG4gICAgdGltZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFya2VyRmlsZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKE1BUktFUl9QUkVGSVgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVEZWxldGVNYXJrZXIoc3RvcmFnZTogRmlsZVN0b3JhZ2UsIGNvbmZpZzogeyBkZWxldGVGaWxlczogc3RyaW5nW107IHJlcGxhY2VkQnk6IHN0cmluZ1tdIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBuYW1lID0gYCR7TUFSS0VSX1BSRUZJWH0ke3RpbWV9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfWA7XG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHsgZGVsZXRlRmlsZXM6IGNvbmZpZy5kZWxldGVGaWxlcywgcmVwbGFjZWRCeTogY29uZmlnLnJlcGxhY2VkQnksIHRpbWUgfSk7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQobmFtZSwgQnVmZmVyLmZyb20oYm9keSwgXCJ1dGY4XCIpIGFzIEJ1ZmZlcik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRGVsZXRlTWFya2VycyhzdG9yYWdlOiBGaWxlU3RvcmFnZSwgYWxsTmFtZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxEZWxldGVNYXJrZXJbXT4ge1xuICAgIGNvbnN0IG1hcmtlck5hbWVzID0gYWxsTmFtZXMuZmlsdGVyKGlzTWFya2VyRmlsZSk7XG4gICAgY29uc3QgbWFya2VycyA9IGF3YWl0IFByb21pc2UuYWxsKG1hcmtlck5hbWVzLm1hcChhc3luYyAoZmlsZU5hbWUpOiBQcm9taXNlPERlbGV0ZU1hcmtlciB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYnVmID0gYXdhaXQgc3RvcmFnZS5nZXQoZmlsZU5hbWUpO1xuICAgICAgICAgICAgaWYgKCFidWYpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGJ1Zi50b1N0cmluZyhcInV0ZjhcIikpIGFzIHsgZGVsZXRlRmlsZXM/OiB1bmtub3duOyByZXBsYWNlZEJ5PzogdW5rbm93bjsgdGltZT86IHVua25vd24gfTtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJzZWQuZGVsZXRlRmlsZXMpIHx8ICFBcnJheS5pc0FycmF5KHBhcnNlZC5yZXBsYWNlZEJ5KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgZGVsZXRlRmlsZXM6IHBhcnNlZC5kZWxldGVGaWxlcyBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICByZXBsYWNlZEJ5OiBwYXJzZWQucmVwbGFjZWRCeSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICB0aW1lOiB0eXBlb2YgcGFyc2VkLnRpbWUgPT09IFwibnVtYmVyXCIgPyBwYXJzZWQudGltZSA6IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9KSk7XG4gICAgcmV0dXJuIG1hcmtlcnMuZmlsdGVyKChtKTogbSBpcyBEZWxldGVNYXJrZXIgPT4gISFtKTtcbn1cblxuLy8gVGhlIHNldCBvZiBmaWxlcyB0aGF0IGFueSBtYXJrZXIgd2FudHMgZGVsZXRlZCDigJQgdGhlc2UgbXVzdCBiZSBkcm9wcGVkIGZyb20gdGhlIGFjdGl2ZSByZWFkIHNldC5cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJFeGNsdXNpb25zKG1hcmtlcnM6IERlbGV0ZU1hcmtlcltdKTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IGV4Y2x1ZGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBtIG9mIG1hcmtlcnMpIGZvciAoY29uc3QgbiBvZiBtLmRlbGV0ZUZpbGVzKSBleGNsdWRlZC5hZGQobik7XG4gICAgcmV0dXJuIGV4Y2x1ZGVkO1xufVxuXG4vLyBBY3Qgb24gZWFjaCBtYXJrZXIgKHNlZSBmaWxlIGhlYWRlcikuIElkZW1wb3RlbnQgYW5kIGJlc3QtZWZmb3J0OiBldmVyeSByZW1vdmFsIGlzIGd1YXJkZWQsIHNvIHR3byBwcm9jZXNzZXMgKG9yIHR3byByZWFkcykgcnVubmluZyB0aGlzIGF0IG9uY2UganVzdCByYWNlIHRvIHRoZSBzYW1lIGFscmVhZHktY29ycmVjdCBlbmQgc3RhdGUuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0RlbGV0ZU1hcmtlcnMobmFtZTogc3RyaW5nLCBzdG9yYWdlOiBGaWxlU3RvcmFnZSwgbWFya2VyczogRGVsZXRlTWFya2VyW10sIGFsbE5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KGFsbE5hbWVzKTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIG1hcmtlcnMpIHtcbiAgICAgICAgY29uc3Qgc3RpbGxQcmVzZW50ID0gbWFya2VyLmRlbGV0ZUZpbGVzLmZpbHRlcihuID0+IHByZXNlbnQuaGFzKG4pKTtcbiAgICAgICAgaWYgKCFzdGlsbFByZXNlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBUaGUgZmlsZXMgdGhpcyBtYXJrZXIgcmV0aXJlZCBhcmUgZ29uZTsgb25jZSBpdCdzIGFnZWQgcGFzdCB0aGUgZ3JhY2Ugd2luZG93LCByZXRpcmUgdGhlIG1hcmtlciB0b28uXG4gICAgICAgICAgICBpZiAobm93IC0gbWFya2VyLnRpbWUgPiBNQVJLRVJfR1JBQ0VfTVMpIHtcbiAgICAgICAgICAgICAgICB0cnkgeyBhd2FpdCBzdG9yYWdlLnJlbW92ZShtYXJrZXIuZmlsZU5hbWUpOyB9IGNhdGNoIHsgLyogYWxyZWFkeSBnb25lICovIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcGxhY2VkRXhpc3RzID0gbWFya2VyLnJlcGxhY2VkQnkubGVuZ3RoID4gMCAmJiBtYXJrZXIucmVwbGFjZWRCeS5ldmVyeShuID0+IHByZXNlbnQuaGFzKG4pKTtcbiAgICAgICAgaWYgKHJlcGxhY2VkRXhpc3RzIHx8IG5vdyAtIG1hcmtlci50aW1lID4gTUFSS0VSX0dSQUNFX01TKSB7XG4gICAgICAgICAgICBjb25zdCByZWFzb24gPSByZXBsYWNlZEV4aXN0cyA/IGByZXBsYWNlbWVudHMgbGFuZGVkYCA6IGBtYXJrZXIgYWdlZCAke01hdGgucm91bmQoKG5vdyAtIG1hcmtlci50aW1lKSAvIDEwMDApfXNgO1xuICAgICAgICAgICAgbGV0IGRlbGV0ZWQgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIHN0aWxsUHJlc2VudCkge1xuICAgICAgICAgICAgICAgIHRyeSB7IGF3YWl0IHN0b3JhZ2UucmVtb3ZlKG4pOyBkZWxldGVkKys7IH0gY2F0Y2ggeyAvKiBhbHJlYWR5IGdvbmUgKi8gfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIGNvbnNvbGUubG9nKGAke2JsdWUobmFtZSl9ICR7bWFnZW50YShcInJldGlyZVwiKX06IGRlbGV0ZWQgJHtkZWxldGVkfSBtZXJnZWQtYXdheSBpbnB1dCBmaWxlKHMpICgke3JlYXNvbn0pYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
93
+ /* _JS_SOURCE_HASH = "467563fc9e9ab0cb44c142e68d864cde7f3a0ac92c177b15c7b80ba76a9f88cd"; */
@@ -1,4 +1,4 @@
1
- "use strict";
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
@@ -6,16 +6,11 @@ Object.defineProperty(exports, "__esModule", { value: true , configurable: true}
6
6
  //exports.streamReaderFromEntries = exports.parseStream = exports.frameDeletes = exports.frameRows = exports.STREAM_EXTENSION = void 0;
7
7
  const cbor_x_1 = __importDefault(require("cbor-x"));
8
8
  const BulkDatabaseFormat_1 = require("./BulkDatabaseFormat");
9
- // Tier-0 streaming format: an append log of whole-row writes and deletes (row-format, not columnar),
10
- // so small mutations are a single cheap append instead of rewriting a columnar file. Each block is:
11
- //
9
+ // Tier-0 streaming format: an append log of whole-row writes and deletes (row-format, not columnar), so small mutations are a single cheap append instead of rewriting a columnar file. Each block is:
10
+ //
12
11
  // [u32 len][CBOR({ t, v }) or CBOR({ t, d })][u32 len]
13
- //
14
- // `t` is a per-write unique timestamp (getTimeUnique); `v` is a set row; `d` is a deleted key. Because
15
- // every thread streams to its own file, the only way to recover the global mutation order — needed
16
- // for newest-wins — is a per-write timestamp, with ties broken by file name. The trailing length must
17
- // match the leading one; a torn/incomplete append leaves a mismatched or missing suffix, so we stop
18
- // there and report trailing bad bytes instead of throwing. structuredClone preserves typed arrays.
12
+ //
13
+ // `t` is a per-write unique timestamp (getTimeUnique); `v` is a set row; `d` is a deleted key. Because every thread streams to its own file, the only way to recover the global mutation order — needed for newest-wins — is a per-write timestamp, with ties broken by file name. The trailing length must match the leading one; a torn/incomplete append leaves a mismatched or missing suffix, so we stop there and report trailing bad bytes instead of throwing. structuredClone preserves typed arrays.
19
14
  exports.STREAM_EXTENSION = ".stream";
20
15
  const cborEncoder = new cbor_x_1.default.Encoder({ structuredClone: true });
21
16
  function frame(payload) {
@@ -23,12 +18,8 @@ function frame(payload) {
23
18
  len.writeUInt32LE(payload.length, 0);
24
19
  return Buffer.concat([len, payload, len]);
25
20
  }
26
- // Framing only — no batching here. BulkDatabase2 coalesces and flushes these framed bytes on a ramping
27
- // per-collection schedule (see streamAppend in BulkDatabaseBase), because the browser File System Access
28
- // API rewrites the whole file on every append, so one-append-per-write is quadratic. The first write
29
- // after a lull still flushes immediately, so a single action then a tab close is saved at once.
30
- // Times are assigned by the caller (BulkDatabase2) so the exact same timestamp lands on disk, in the
31
- // in-memory overlay, and in the cross-tab broadcast — keeping the global write order consistent.
21
+ // Framing only — no batching here. BulkDatabase2 coalesces and flushes these framed bytes on a ramping per-collection schedule (see streamAppend in BulkDatabaseBase), because the browser File System Access API rewrites the whole file on every append, so one-append-per-write is quadratic. The first write after a lull still flushes immediately, so a single action then a tab close is saved at once.
22
+ // Times are assigned by the caller (BulkDatabase2) so the exact same timestamp lands on disk, in the in-memory overlay, and in the cross-tab broadcast keeping the global write order consistent.
32
23
  function frameRows(entries) {
33
24
  return Buffer.concat(entries.map(e => frame(Buffer.from(cborEncoder.encode({ t: e.time, v: e.row })))));
34
25
  }
@@ -64,12 +55,7 @@ function parseStream(buffer) {
64
55
  return { entries, badBytes: buffer.length - pos };
65
56
  }
66
57
  exports.parseStream = parseStream;
67
- // Wraps streamed entries (already ordered oldest-first) as a BaseBulkDatabaseReader. Each set MERGES
68
- // its fields onto the key's current row (so a partial write/update only changes the columns it
69
- // includes); a delete tombstones the key (exposed via deletedKeys so the join suppresses it in older
70
- // bulk readers) and resets the merge. A column the merged row never set reads as ABSENT, so the join
71
- // falls through to older readers for it. Also returns the latest timestamp seen per key (live or
72
- // deleted), used for cross-tab conflict resolution.
58
+ // Wraps streamed entries (already ordered oldest-first) as a BaseBulkDatabaseReader. Each set MERGES its fields onto the key's current row (so a partial write/update only changes the columns it includes); a delete tombstones the key (exposed via deletedKeys so the join suppresses it in older bulk readers) and resets the merge. A column the merged row never set reads as ABSENT, so the join falls through to older readers for it. Also returns the latest timestamp seen per key (live or deleted), used for cross-tab conflict resolution.
73
59
  function streamReaderFromEntries(entries, totalBytes) {
74
60
  let byKey = new Map();
75
61
  let deletedKeys = new Set();
@@ -103,8 +89,7 @@ function streamReaderFromEntries(entries, totalBytes) {
103
89
  let deleteTimes = new Map();
104
90
  for (let key of deletedKeys)
105
91
  deleteTimes.set(key, times.get(key) || 0);
106
- // Iterate to find min/max — NOT Math.min(...times)/Math.max(...times): spreading a large array as call
107
- // arguments overflows the stack ("Maximum call stack size exceeded") once a stream has many keys.
92
+ // Iterate to find min/max — NOT Math.min(...times)/Math.max(...times): spreading a large array as call arguments overflows the stack ("Maximum call stack size exceeded") once a stream has many keys.
108
93
  let minTime = Infinity, maxTime = -Infinity;
109
94
  for (let t of times.values()) {
110
95
  if (t < minTime)
@@ -123,8 +108,7 @@ function streamReaderFromEntries(entries, totalBytes) {
123
108
  keyTimes: new Map(keys.map(key => [key, times.get(key) || 0])),
124
109
  columns,
125
110
  deleteTimes,
126
- // A key's time is its latest write across all columns (per-key, not per-column). For a column
127
- // it never set we return ABSENT so the join falls through to an older reader.
111
+ // A key's time is its latest write across all columns (per-key, not per-column). For a column it never set we return ABSENT so the join falls through to an older reader.
128
112
  async getColumn(column) {
129
113
  return keys.map(key => {
130
114
  let row = byKey.get(key);
@@ -137,9 +121,7 @@ function streamReaderFromEntries(entries, totalBytes) {
137
121
  return BulkDatabaseFormat_1.ABSENT;
138
122
  return { value: row[column], time: times.get(key) || 0 };
139
123
  },
140
- // Stream values are decoded objects (CBOR), so unlike a bulk file we have to encode them to raw
141
- // cells here. Stream data is small (tier-0, size-capped), so this is cheap. A column the row never
142
- // set is omitted (ABSENT → fall through); a stored undefined is kept (a real clear).
124
+ // Stream values are decoded objects (CBOR), so unlike a bulk file we have to encode them to raw cells here. Stream data is small (tier-0, size-capped), so this is cheap. A column the row never set is omitted (ABSENT → fall through); a stored undefined is kept (a real clear).
143
125
  async getRawColumn(column) {
144
126
  let map = new Map();
145
127
  for (let key of keys) {
@@ -150,10 +132,7 @@ function streamReaderFromEntries(entries, totalBytes) {
150
132
  }
151
133
  return map;
152
134
  },
153
- // Per-column index in the same shape a bulk file exposes, materialized in memory once (stream data
154
- // is tier-0, size-capped, so the encode is cheap). Lets the planned merge treat stream + bulk
155
- // sources uniformly: it loads each (source, column) index, uses offsets/types to plan the output's
156
- // byte layout, and reads contiguous runs from this index's in-memory data buffer during execute.
135
+ // Per-column index in the same shape a bulk file exposes, materialized in memory once (stream data is tier-0, size-capped, so the encode is cheap). Lets the planned merge treat stream + bulk sources uniformly: it loads each (source, column) index, uses offsets/types to plan the output's byte layout, and reads contiguous runs from this index's in-memory data buffer during execute.
157
136
  async getColumnIndex(column) {
158
137
  return getStreamColumnIndex(keys, byKey, column);
159
138
  },
@@ -164,18 +143,14 @@ function streamReaderFromEntries(entries, totalBytes) {
164
143
  return { reader, times };
165
144
  }
166
145
  exports.streamReaderFromEntries = streamReaderFromEntries;
167
- // keys[] is the column-side row order for this stream reader; rowOfKey is used by the planner to look up
168
- // a winning cell's source row without going through a column read. Stays consistent with getColumnIndex,
169
- // which builds its offsets/types over the same `keys` array in the same order.
146
+ // keys[] is the column-side row order for this stream reader; rowOfKey is used by the planner to look up a winning cell's source row without going through a column read. Stays consistent with getColumnIndex, which builds its offsets/types over the same `keys` array in the same order.
170
147
  function buildKeyIndex(keys) {
171
148
  const m = new Map();
172
149
  for (let i = 0; i < keys.length; i++)
173
150
  m.set(keys[i], i);
174
151
  return m;
175
152
  }
176
- // Build a stream-side ColumnIndex (offsets + types + a contiguous-row byte slicer) over the in-memory
177
- // merged rows. Encodes each row's value for this column once into a single backing buffer; readValueBytes
178
- // then slices it. Cached per (reader, column) so a merge planning + execution pass doesn't re-encode.
153
+ // Build a stream-side ColumnIndex (offsets + types + a contiguous-row byte slicer) over the in-memory merged rows. Encodes each row's value for this column once into a single backing buffer; readValueBytes then slices it. Cached per (reader, column) so a merge planning + execution pass doesn't re-encode.
179
154
  function getStreamColumnIndex(keys, byKey, column) {
180
155
  var _a;
181
156
  let cached = (_a = columnIndexCache.get(byKey)) === null || _a === void 0 ? void 0 : _a.get(column);
@@ -220,8 +195,7 @@ function getStreamColumnIndex(keys, byKey, column) {
220
195
  perReader.set(column, idx);
221
196
  return idx;
222
197
  }
223
- // Per stream-reader cache of its column indexes. Keyed by the reader's byKey map (a fresh
224
- // streamReaderFromEntries call produces a fresh map, so this is effectively per-reader).
198
+ // Per stream-reader cache of its column indexes. Keyed by the reader's byKey map (a fresh streamReaderFromEntries call produces a fresh map, so this is effectively per-reader).
225
199
  const columnIndexCache = new WeakMap();
226
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtTG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RyZWFtTG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUEyQjtBQUMzQiw2REFBd0k7QUFFeEkscUdBQXFHO0FBQ3JHLG9HQUFvRztBQUNwRyxFQUFFO0FBQ0YsMkRBQTJEO0FBQzNELEVBQUU7QUFDRix1R0FBdUc7QUFDdkcsbUdBQW1HO0FBQ25HLHNHQUFzRztBQUN0RyxvR0FBb0c7QUFDcEcsbUdBQW1HO0FBRXRGLFFBQUEsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO0FBRTFDLE1BQU0sV0FBVyxHQUFHLElBQUksZ0JBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUlqRSxTQUFTLEtBQUssQ0FBQyxPQUFlO0lBQzFCLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsdUdBQXVHO0FBQ3ZHLHlHQUF5RztBQUN6RyxxR0FBcUc7QUFDckcsZ0dBQWdHO0FBRWhHLHFHQUFxRztBQUNyRyxpR0FBaUc7QUFDakcsU0FBZ0IsU0FBUyxDQUFDLE9BQXlEO0lBQy9FLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FB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RyxHQUFnQjtRQUNyQixPQUFPO1FBQ1AsS0FBSztRQUNMLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU07WUFDakMsSUFBSSxNQUFNLElBQUksUUFBUTtnQkFBRSxPQUFPLGlDQUFZLENBQUM7WUFDNUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixJQUFJLEdBQUcsSUFBSSxLQUFLO2dCQUFFLE9BQU8saUNBQVksQ0FBQztZQUN0QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7S0FDSixDQUFDO0lBQ0YsSUFBSSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUFDLENBQUM7SUFDbEYsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0IsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBRUQsMEZBQTBGO0FBQzFGLHlGQUF5RjtBQUN6RixNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUFrRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNib3J4IGZyb20gXCJjYm9yLXhcIjtcbmltcG9ydCB7IEFCU0VOVCwgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlciwgQ29sdW1uSW5kZXgsIEVNUFRZX0JVRkZFUiwgZW5jb2RlVmFsdWUsIFJhd0NlbGwsIFRZUEVfQUJTRU5UX1RBRyB9IGZyb20gXCIuL0J1bGtEYXRhYmFzZUZvcm1hdFwiO1xuXG4vLyBUaWVyLTAgc3RyZWFtaW5nIGZvcm1hdDogYW4gYXBwZW5kIGxvZyBvZiB3aG9sZS1yb3cgd3JpdGVzIGFuZCBkZWxldGVzIChyb3ctZm9ybWF0LCBub3QgY29sdW1uYXIpLFxuLy8gc28gc21hbGwgbXV0YXRpb25zIGFyZSBhIHNpbmdsZSBjaGVhcCBhcHBlbmQgaW5zdGVhZCBvZiByZXdyaXRpbmcgYSBjb2x1bW5hciBmaWxlLiBFYWNoIGJsb2NrIGlzOlxuLy9cbi8vICAgW3UzMiBsZW5dW0NCT1IoeyB0LCB2IH0pICBvciAgQ0JPUih7IHQsIGQgfSldW3UzMiBsZW5dXG4vL1xuLy8gYHRgIGlzIGEgcGVyLXdyaXRlIHVuaXF1ZSB0aW1lc3RhbXAgKGdldFRpbWVVbmlxdWUpOyBgdmAgaXMgYSBzZXQgcm93OyBgZGAgaXMgYSBkZWxldGVkIGtleS4gQmVjYXVzZVxuLy8gZXZlcnkgdGhyZWFkIHN0cmVhbXMgdG8gaXRzIG93biBmaWxlLCB0aGUgb25seSB3YXkgdG8gcmVjb3ZlciB0aGUgZ2xvYmFsIG11dGF0aW9uIG9yZGVyIOKAlCBuZWVkZWRcbi8vIGZvciBuZXdlc3Qtd2lucyDigJQgaXMgYSBwZXItd3JpdGUgdGltZXN0YW1wLCB3aXRoIHRpZXMgYnJva2VuIGJ5IGZpbGUgbmFtZS4gVGhlIHRyYWlsaW5nIGxlbmd0aCBtdXN0XG4vLyBtYXRjaCB0aGUgbGVhZGluZyBvbmU7IGEgdG9ybi9pbmNvbXBsZXRlIGFwcGVuZCBsZWF2ZXMgYSBtaXNtYXRjaGVkIG9yIG1pc3Npbmcgc3VmZml4LCBzbyB3ZSBzdG9wXG4vLyB0aGVyZSBhbmQgcmVwb3J0IHRyYWlsaW5nIGJhZCBieXRlcyBpbnN0ZWFkIG9mIHRocm93aW5nLiBzdHJ1Y3R1cmVkQ2xvbmUgcHJlc2VydmVzIHR5cGVkIGFycmF5cy5cblxuZXhwb3J0IGNvbnN0IFNUUkVBTV9FWFRFTlNJT04gPSBcIi5zdHJlYW1cIjtcblxuY29uc3QgY2JvckVuY29kZXIgPSBuZXcgY2JvcnguRW5jb2Rlcih7IHN0cnVjdHVyZWRDbG9uZTogdHJ1ZSB9KTtcblxuZXhwb3J0IHR5cGUgU3RyZWFtRW50cnkgPSB7IHRpbWU6IG51bWJlcjsgcm93PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGRlbGV0ZWRLZXk/OiBzdHJpbmcgfTtcblxuZnVuY3Rpb24gZnJhbWUocGF5bG9hZDogQnVmZmVyKTogQnVmZmVyIHtcbiAgICBsZXQgbGVuID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIGxlbi53cml0ZVVJbnQzMkxFKHBheWxvYWQubGVuZ3RoLCAwKTtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbbGVuLCBwYXlsb2FkLCBsZW5dKTtcbn1cblxuLy8gRnJhbWluZyBvbmx5IOKAlCBubyBiYXRjaGluZyBoZXJlLiBCdWxrRGF0YWJhc2UyIGNvYWxlc2NlcyBhbmQgZmx1c2hlcyB0aGVzZSBmcmFtZWQgYnl0ZXMgb24gYSByYW1waW5nXG4vLyBwZXItY29sbGVjdGlvbiBzY2hlZHVsZSAoc2VlIHN0cmVhbUFwcGVuZCBpbiBCdWxrRGF0YWJhc2VCYXNlKSwgYmVjYXVzZSB0aGUgYnJvd3NlciBGaWxlIFN5c3RlbSBBY2Nlc3Ncbi8vIEFQSSByZXdyaXRlcyB0aGUgd2hvbGUgZmlsZSBvbiBldmVyeSBhcHBlbmQsIHNvIG9uZS1hcHBlbmQtcGVyLXdyaXRlIGlzIHF1YWRyYXRpYy4gVGhlIGZpcnN0IHdyaXRlXG4vLyBhZnRlciBhIGx1bGwgc3RpbGwgZmx1c2hlcyBpbW1lZGlhdGVseSwgc28gYSBzaW5nbGUgYWN0aW9uIHRoZW4gYSB0YWIgY2xvc2UgaXMgc2F2ZWQgYXQgb25jZS5cblxuLy8gVGltZXMgYXJlIGFzc2lnbmVkIGJ5IHRoZSBjYWxsZXIgKEJ1bGtEYXRhYmFzZTIpIHNvIHRoZSBleGFjdCBzYW1lIHRpbWVzdGFtcCBsYW5kcyBvbiBkaXNrLCBpbiB0aGVcbi8vIGluLW1lbW9yeSBvdmVybGF5LCBhbmQgaW4gdGhlIGNyb3NzLXRhYiBicm9hZGNhc3Qg4oCUIGtlZXBpbmcgdGhlIGdsb2JhbCB3cml0ZSBvcmRlciBjb25zaXN0ZW50LlxuZXhwb3J0IGZ1bmN0aW9uIGZyYW1lUm93cyhlbnRyaWVzOiB7IHRpbWU6IG51bWJlcjsgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9W10pOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGVudHJpZXMubWFwKGUgPT4gZnJhbWUoQnVmZmVyLmZyb20oY2JvckVuY29kZXIuZW5jb2RlKHsgdDogZS50aW1lLCB2OiBlLnJvdyB9KSkpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcmFtZURlbGV0ZXMoZW50cmllczogeyB0aW1lOiBudW1iZXI7IGtleTogc3RyaW5nIH1bXSk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoZW50cmllcy5tYXAoZSA9PiBmcmFtZShCdWZmZXIuZnJvbShjYm9yRW5jb2Rlci5lbmNvZGUoeyB0OiBlLnRpbWUsIGQ6IGUua2V5IH0pKSkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RyZWFtKGJ1ZmZlcjogQnVmZmVyKTogeyBlbnRyaWVzOiBTdHJlYW1FbnRyeVtdOyBiYWRCeXRlczogbnVtYmVyIH0ge1xuICAgIGxldCBlbnRyaWVzOiBTdHJlYW1FbnRyeVtdID0gW107XG4gICAgbGV0IHBvcyA9IDA7XG4gICAgd2hpbGUgKHBvcyArIDQgPD0gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICBsZXQgbGVuID0gYnVmZmVyLnJlYWRVSW50MzJMRShwb3MpO1xuICAgICAgICBsZXQgcGF5bG9hZFN0YXJ0ID0gcG9zICsgNDtcbiAgICAgICAgbGV0IHN1ZmZpeFN0YXJ0ID0gcGF5bG9hZFN0YXJ0ICsgbGVuO1xuICAgICAgICBpZiAoc3VmZml4U3RhcnQgKyA0ID4gYnVmZmVyLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIGlmIChidWZmZXIucmVhZFVJbnQzMkxFKHN1ZmZpeFN0YXJ0KSAhPT0gbGVuKSBicmVhaztcbiAgICAgICAgbGV0IGRlY29kZWQ6IHsgdDogbnVtYmVyOyB2PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlY29kZWQgPSBjYm9yRW5jb2Rlci5kZWNvZGUoYnVmZmVyLnN1YmFycmF5KHBheWxvYWRTdGFydCwgc3VmZml4U3RhcnQpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVjb2RlZCAmJiBkZWNvZGVkLmQgIT09IHVuZGVmaW5lZCkgZW50cmllcy5wdXNoKHsgdGltZTogZGVjb2RlZC50LCBkZWxldGVkS2V5OiBkZWNvZGVkLmQgfSk7XG4gICAgICAgIGVsc2UgaWYgKGRlY29kZWQgJiYgZGVjb2RlZC52KSBlbnRyaWVzLnB1c2goeyB0aW1lOiBkZWNvZGVkLnQsIHJvdzogZGVjb2RlZC52IH0pO1xuICAgICAgICBwb3MgPSBzdWZmaXhTdGFydCArIDQ7XG4gICAgfVxuICAgIHJldHVybiB7IGVudHJpZXMsIGJhZEJ5dGVzOiBidWZmZXIubGVuZ3RoIC0gcG9zIH07XG59XG5cbi8vIFdyYXBzIHN0cmVhbWVkIGVudHJpZXMgKGFscmVhZHkgb3JkZXJlZCBvbGRlc3QtZmlyc3QpIGFzIGEgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlci4gRWFjaCBzZXQgTUVSR0VTXG4vLyBpdHMgZmllbGRzIG9udG8gdGhlIGtleSdzIGN1cnJlbnQgcm93IChzbyBhIHBhcnRpYWwgd3JpdGUvdXBkYXRlIG9ubHkgY2hhbmdlcyB0aGUgY29sdW1ucyBpdFxuLy8gaW5jbHVkZXMpOyBhIGRlbGV0ZSB0b21ic3RvbmVzIHRoZSBrZXkgKGV4cG9zZWQgdmlhIGRlbGV0ZWRLZXlzIHNvIHRoZSBqb2luIHN1cHByZXNzZXMgaXQgaW4gb2xkZXJcbi8vIGJ1bGsgcmVhZGVycykgYW5kIHJlc2V0cyB0aGUgbWVyZ2UuIEEgY29sdW1uIHRoZSBtZXJnZWQgcm93IG5ldmVyIHNldCByZWFkcyBhcyBBQlNFTlQsIHNvIHRoZSBqb2luXG4vLyBmYWxscyB0aHJvdWdoIHRvIG9sZGVyIHJlYWRlcnMgZm9yIGl0LiBBbHNvIHJldHVybnMgdGhlIGxhdGVzdCB0aW1lc3RhbXAgc2VlbiBwZXIga2V5IChsaXZlIG9yXG4vLyBkZWxldGVkKSwgdXNlZCBmb3IgY3Jvc3MtdGFiIGNvbmZsaWN0IHJlc29sdXRpb24uXG5leHBvcnQgZnVuY3Rpb24gc3RyZWFtUmVhZGVyRnJvbUVudHJpZXMoZW50cmllczogU3RyZWFtRW50cnlbXSwgdG90YWxCeXRlczogbnVtYmVyKTogeyByZWFkZXI6IEJhc2VCdWxrRGF0YWJhc2VSZWFkZXI7IHRpbWVzOiBNYXA8c3RyaW5nLCBudW1iZXI+IH0ge1xuICAgIGxldCBieUtleSA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBsZXQgZGVsZXRlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgdGltZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKGVudHJ5LmRlbGV0ZWRLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYnlLZXkuZGVsZXRlKGVudHJ5LmRlbGV0ZWRLZXkpO1xuICAgICAgICAgICAgZGVsZXRlZEtleXMuYWRkKGVudHJ5LmRlbGV0ZWRLZXkpO1xuICAgICAgICAgICAgdGltZXMuc2V0KGVudHJ5LmRlbGV0ZWRLZXksIGVudHJ5LnRpbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LnJvdykge1xuICAgICAgICAgICAgbGV0IGtleSA9IGVudHJ5LnJvdy5rZXkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgYnlLZXkuc2V0KGtleSwgeyAuLi5ieUtleS5nZXQoa2V5KSwgLi4uZW50cnkucm93IH0pO1xuICAgICAgICAgICAgZGVsZXRlZEtleXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB0aW1lcy5zZXQoa2V5LCBlbnRyeS50aW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQga2V5cyA9IFsuLi5ieUtleS5rZXlzKCldO1xuICAgIGxldCBjb2x1bW5OYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAobGV0IHJvdyBvZiBieUtleS52YWx1ZXMoKSkge1xuICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBPYmplY3Qua2V5cyhyb3cpKSB7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMoZmllbGQpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHNlZW4uYWRkKGZpZWxkKTtcbiAgICAgICAgICAgIGNvbHVtbk5hbWVzLnB1c2goZmllbGQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBjb2x1bW5zID0gY29sdW1uTmFtZXMubWFwKGNvbHVtbiA9PiAoeyBjb2x1bW4sIGJ5dGVTaXplOiAwIH0pKTtcbiAgICAvLyBQZXIta2V5IHRvbWJzdG9uZSB0aW1lcyBmb3IgdGhlIGpvaW4ncyBkZWxldGUgcmVzb2x1dGlvbi5cbiAgICBsZXQgZGVsZXRlVGltZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAobGV0IGtleSBvZiBkZWxldGVkS2V5cykgZGVsZXRlVGltZXMuc2V0KGtleSwgdGltZXMuZ2V0KGtleSkgfHwgMCk7XG4gICAgLy8gSXRlcmF0ZSB0byBmaW5kIG1pbi9tYXgg4oCUIE5PVCBNYXRoLm1pbiguLi50aW1lcykvTWF0aC5tYXgoLi4udGltZXMpOiBzcHJlYWRpbmcgYSBsYXJnZSBhcnJheSBhcyBjYWxsXG4gICAgLy8gYXJndW1lbnRzIG92ZXJmbG93cyB0aGUgc3RhY2sgKFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIikgb25jZSBhIHN0cmVhbSBoYXMgbWFueSBrZXlzLlxuICAgIGxldCBtaW5UaW1lID0gSW5maW5pdHksIG1heFRpbWUgPSAtSW5maW5pdHk7XG4gICAgZm9yIChsZXQgdCBvZiB0aW1lcy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAodCA8IG1pblRpbWUpIG1pblRpbWUgPSB0O1xuICAgICAgICBpZiAodCA+IG1heFRpbWUpIG1heFRpbWUgPSB0O1xuICAgIH1cbiAgICBjb25zdCBrZXlJbmRleE1hcCA9IGJ1aWxkS2V5SW5kZXgoa2V5cyk7XG4gICAgbGV0IHJlYWRlcjogQmFzZUJ1bGtEYXRhYmFzZVJlYWRlciA9IHtcbiAgICAgICAgbmFtZTogXCIoc3RyZWFtcylcIixcbiAgICAgICAgdG90YWxCeXRlcyxcbiAgICAgICAgcm93Q291bnQ6IGtleXMubGVuZ3RoLFxuICAgICAgICBtaW5UaW1lOiB0aW1lcy5zaXplID8gbWluVGltZSA6IDAsXG4gICAgICAgIG1heFRpbWU6IHRpbWVzLnNpemUgPyBtYXhUaW1lIDogMCxcbiAgICAgICAga2V5cyxcbiAgICAgICAga2V5VGltZXM6IG5ldyBNYXAoa2V5cy5tYXAoa2V5ID0+IFtrZXksIHRpbWVzLmdldChrZXkpIHx8IDBdKSksXG4gICAgICAgIGNvbHVtbnMsXG4gICAgICAgIGRlbGV0ZVRpbWVzLFxuICAgICAgICAvLyBBIGtleSdzIHRpbWUgaXMgaXRzIGxhdGVzdCB3cml0ZSBhY3Jvc3MgYWxsIGNvbHVtbnMgKHBlci1rZXksIG5vdCBwZXItY29sdW1uKS4gRm9yIGEgY29sdW1uXG4gICAgICAgIC8vIGl0IG5ldmVyIHNldCB3ZSByZXR1cm4gQUJTRU5UIHNvIHRoZSBqb2luIGZhbGxzIHRocm91Z2ggdG8gYW4gb2xkZXIgcmVhZGVyLlxuICAgICAgICBhc3luYyBnZXRDb2x1bW4oY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5cy5tYXAoa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcm93ID0gYnlLZXkuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZTogcm93ICYmIGNvbHVtbiBpbiByb3cgPyByb3dbY29sdW1uXSA6IEFCU0VOVCwgdGltZTogdGltZXMuZ2V0KGtleSkgfHwgMCB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdldFNpbmdsZUZpZWxkKGtleSwgY29sdW1uKSB7XG4gICAgICAgICAgICBsZXQgcm93ID0gYnlLZXkuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoIXJvdyB8fCAhKGNvbHVtbiBpbiByb3cpKSByZXR1cm4gQUJTRU5UO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJvd1tjb2x1bW5dLCB0aW1lOiB0aW1lcy5nZXQoa2V5KSB8fCAwIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8vIFN0cmVhbSB2YWx1ZXMgYXJlIGRlY29kZWQgb2JqZWN0cyAoQ0JPUiksIHNvIHVubGlrZSBhIGJ1bGsgZmlsZSB3ZSBoYXZlIHRvIGVuY29kZSB0aGVtIHRvIHJhd1xuICAgICAgICAvLyBjZWxscyBoZXJlLiBTdHJlYW0gZGF0YSBpcyBzbWFsbCAodGllci0wLCBzaXplLWNhcHBlZCksIHNvIHRoaXMgaXMgY2hlYXAuIEEgY29sdW1uIHRoZSByb3cgbmV2ZXJcbiAgICAgICAgLy8gc2V0IGlzIG9taXR0ZWQgKEFCU0VOVCDihpIgZmFsbCB0aHJvdWdoKTsgYSBzdG9yZWQgdW5kZWZpbmVkIGlzIGtlcHQgKGEgcmVhbCBjbGVhcikuXG4gICAgICAgIGFzeW5jIGdldFJhd0NvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgICAgIGxldCBtYXAgPSBuZXcgTWFwPHN0cmluZywgUmF3Q2VsbD4oKTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvdyA9IGJ5S2V5LmdldChrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghcm93IHx8ICEoY29sdW1uIGluIHJvdykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG1hcC5zZXQoa2V5LCBlbmNvZGVWYWx1ZShyb3dbY29sdW1uXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gUGVyLWNvbHVtbiBpbmRleCBpbiB0aGUgc2FtZSBzaGFwZSBhIGJ1bGsgZmlsZSBleHBvc2VzLCBtYXRlcmlhbGl6ZWQgaW4gbWVtb3J5IG9uY2UgKHN0cmVhbSBkYXRhXG4gICAgICAgIC8vIGlzIHRpZXItMCwgc2l6ZS1jYXBwZWQsIHNvIHRoZSBlbmNvZGUgaXMgY2hlYXApLiBMZXRzIHRoZSBwbGFubmVkIG1lcmdlIHRyZWF0IHN0cmVhbSArIGJ1bGtcbiAgICAgICAgLy8gc291cmNlcyB1bmlmb3JtbHk6IGl0IGxvYWRzIGVhY2ggKHNvdXJjZSwgY29sdW1uKSBpbmRleCwgdXNlcyBvZmZzZXRzL3R5cGVzIHRvIHBsYW4gdGhlIG91dHB1dCdzXG4gICAgICAgIC8vIGJ5dGUgbGF5b3V0LCBhbmQgcmVhZHMgY29udGlndW91cyBydW5zIGZyb20gdGhpcyBpbmRleCdzIGluLW1lbW9yeSBkYXRhIGJ1ZmZlciBkdXJpbmcgZXhlY3V0ZS5cbiAgICAgICAgYXN5bmMgZ2V0Q29sdW1uSW5kZXgoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0U3RyZWFtQ29sdW1uSW5kZXgoa2V5cywgYnlLZXksIGNvbHVtbik7XG4gICAgICAgIH0sXG4gICAgICAgIHJvd09mS2V5KGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGtleUluZGV4TWFwLmdldChrZXkpO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIHsgcmVhZGVyLCB0aW1lcyB9O1xufVxuXG4vLyBrZXlzW10gaXMgdGhlIGNvbHVtbi1zaWRlIHJvdyBvcmRlciBmb3IgdGhpcyBzdHJlYW0gcmVhZGVyOyByb3dPZktleSBpcyB1c2VkIGJ5IHRoZSBwbGFubmVyIHRvIGxvb2sgdXBcbi8vIGEgd2lubmluZyBjZWxsJ3Mgc291cmNlIHJvdyB3aXRob3V0IGdvaW5nIHRocm91Z2ggYSBjb2x1bW4gcmVhZC4gU3RheXMgY29uc2lzdGVudCB3aXRoIGdldENvbHVtbkluZGV4LFxuLy8gd2hpY2ggYnVpbGRzIGl0cyBvZmZzZXRzL3R5cGVzIG92ZXIgdGhlIHNhbWUgYGtleXNgIGFycmF5IGluIHRoZSBzYW1lIG9yZGVyLlxuZnVuY3Rpb24gYnVpbGRLZXlJbmRleChrZXlzOiBzdHJpbmdbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICAgIGNvbnN0IG0gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgbS5zZXQoa2V5c1tpXSwgaSk7XG4gICAgcmV0dXJuIG07XG59XG5cbi8vIEJ1aWxkIGEgc3RyZWFtLXNpZGUgQ29sdW1uSW5kZXggKG9mZnNldHMgKyB0eXBlcyArIGEgY29udGlndW91cy1yb3cgYnl0ZSBzbGljZXIpIG92ZXIgdGhlIGluLW1lbW9yeVxuLy8gbWVyZ2VkIHJvd3MuIEVuY29kZXMgZWFjaCByb3cncyB2YWx1ZSBmb3IgdGhpcyBjb2x1bW4gb25jZSBpbnRvIGEgc2luZ2xlIGJhY2tpbmcgYnVmZmVyOyByZWFkVmFsdWVCeXRlc1xuLy8gdGhlbiBzbGljZXMgaXQuIENhY2hlZCBwZXIgKHJlYWRlciwgY29sdW1uKSBzbyBhIG1lcmdlIHBsYW5uaW5nICsgZXhlY3V0aW9uIHBhc3MgZG9lc24ndCByZS1lbmNvZGUuXG5mdW5jdGlvbiBnZXRTdHJlYW1Db2x1bW5JbmRleChrZXlzOiBzdHJpbmdbXSwgYnlLZXk6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiwgY29sdW1uOiBzdHJpbmcpOiBDb2x1bW5JbmRleCB7XG4gICAgbGV0IGNhY2hlZCA9IGNvbHVtbkluZGV4Q2FjaGUuZ2V0KGJ5S2V5KT8uZ2V0KGNvbHVtbik7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KGtleXMubGVuZ3RoICsgMSk7XG4gICAgY29uc3QgdHlwZXMgPSBuZXcgVWludDhBcnJheShrZXlzLmxlbmd0aCk7XG4gICAgY29uc3QgcGFydHM6IEJ1ZmZlcltdID0gW107XG4gICAgbGV0IHBvcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IGJ5S2V5LmdldChrZXlzW2ldKTtcbiAgICAgICAgb2Zmc2V0c1tpXSA9IHBvcztcbiAgICAgICAgaWYgKCFyb3cgfHwgIShjb2x1bW4gaW4gcm93KSkge1xuICAgICAgICAgICAgdHlwZXNbaV0gPSBUWVBFX0FCU0VOVF9UQUc7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHR5cGUsIGJ5dGVzIH0gPSBlbmNvZGVWYWx1ZShyb3dbY29sdW1uXSk7XG4gICAgICAgIHR5cGVzW2ldID0gdHlwZTtcbiAgICAgICAgcGFydHMucHVzaChieXRlcyk7XG4gICAgICAgIHBvcyArPSBieXRlcy5sZW5ndGg7XG4gICAgfVxuICAgIG9mZnNldHNba2V5cy5sZW5ndGhdID0gcG9zO1xuICAgIGNvbnN0IGRhdGEgPSBwYXJ0cy5sZW5ndGggPyBCdWZmZXIuY29uY2F0KHBhcnRzKSA6IEVNUFRZX0JVRkZFUjtcbiAgICBjb25zdCBpZHg6IENvbHVtbkluZGV4ID0ge1xuICAgICAgICBvZmZzZXRzLFxuICAgICAgICB0eXBlcyxcbiAgICAgICAgYXN5bmMgcmVhZFZhbHVlQnl0ZXMoc3RhcnRSb3csIGVuZFJvdykge1xuICAgICAgICAgICAgaWYgKGVuZFJvdyA8PSBzdGFydFJvdykgcmV0dXJuIEVNUFRZX0JVRkZFUjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gb2Zmc2V0c1tzdGFydFJvd107XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBvZmZzZXRzW2VuZFJvd107XG4gICAgICAgICAgICBpZiAoZW5kIDw9IHN0YXJ0KSByZXR1cm4gRU1QVFlfQlVGRkVSO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoc3RhcnQsIGVuZCk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBsZXQgcGVyUmVhZGVyID0gY29sdW1uSW5kZXhDYWNoZS5nZXQoYnlLZXkpO1xuICAgIGlmICghcGVyUmVhZGVyKSB7IHBlclJlYWRlciA9IG5ldyBNYXAoKTsgY29sdW1uSW5kZXhDYWNoZS5zZXQoYnlLZXksIHBlclJlYWRlcik7IH1cbiAgICBwZXJSZWFkZXIuc2V0KGNvbHVtbiwgaWR4KTtcbiAgICByZXR1cm4gaWR4O1xufVxuXG4vLyBQZXIgc3RyZWFtLXJlYWRlciBjYWNoZSBvZiBpdHMgY29sdW1uIGluZGV4ZXMuIEtleWVkIGJ5IHRoZSByZWFkZXIncyBieUtleSBtYXAgKGEgZnJlc2hcbi8vIHN0cmVhbVJlYWRlckZyb21FbnRyaWVzIGNhbGwgcHJvZHVjZXMgYSBmcmVzaCBtYXAsIHNvIHRoaXMgaXMgZWZmZWN0aXZlbHkgcGVyLXJlYWRlcikuXG5jb25zdCBjb2x1bW5JbmRleENhY2hlID0gbmV3IFdlYWtNYXA8TWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCBNYXA8c3RyaW5nLCBDb2x1bW5JbmRleD4+KCk7XG4iXX0=
227
- /* _JS_SOURCE_HASH = "08eaba4c0c9769af93ebb263b95b81e1794078b5b393f952ec461f32722944e8"; */
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtTG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RyZWFtTG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUEyQjtBQUMzQiw2REFBd0k7QUFFeEksdU1BQXVNO0FBQ3ZNLEdBQUc7QUFDSCwyREFBMkQ7QUFDM0QsR0FBRztBQUNILCtlQUErZTtBQUVsZSxRQUFBLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztBQUUxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLGdCQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFJakUsU0FBUyxLQUFLLENBQUMsT0FBZTtJQUMxQixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVELCtZQUErWTtBQUUvWSxvTUFBb007QUFDcE0sU0FBZ0IsU0FBUyxDQUFDLE9BQXlEO0lBQy9FLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVHLENBQUM7QUFGRCw4QkFFQztBQUVELFNBQWdCLFlBQVksQ0FBQyxPQUF3QztJQUNqRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcs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QztLQUNKLENBQUM7SUFDRixJQUFJLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQUMsQ0FBQztJQUNsRixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzQixPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFFRCxpTEFBaUw7QUFDakwsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBa0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjYm9yeCBmcm9tIFwiY2Jvci14XCI7XG5pbXBvcnQgeyBBQlNFTlQsIEJhc2VCdWxrRGF0YWJhc2VSZWFkZXIsIENvbHVtbkluZGV4LCBFTVBUWV9CVUZGRVIsIGVuY29kZVZhbHVlLCBSYXdDZWxsLCBUWVBFX0FCU0VOVF9UQUcgfSBmcm9tIFwiLi9CdWxrRGF0YWJhc2VGb3JtYXRcIjtcblxuLy8gVGllci0wIHN0cmVhbWluZyBmb3JtYXQ6IGFuIGFwcGVuZCBsb2cgb2Ygd2hvbGUtcm93IHdyaXRlcyBhbmQgZGVsZXRlcyAocm93LWZvcm1hdCwgbm90IGNvbHVtbmFyKSwgc28gc21hbGwgbXV0YXRpb25zIGFyZSBhIHNpbmdsZSBjaGVhcCBhcHBlbmQgaW5zdGVhZCBvZiByZXdyaXRpbmcgYSBjb2x1bW5hciBmaWxlLiBFYWNoIGJsb2NrIGlzOlxuLy8gXG4vLyAgIFt1MzIgbGVuXVtDQk9SKHsgdCwgdiB9KSAgb3IgIENCT1IoeyB0LCBkIH0pXVt1MzIgbGVuXVxuLy8gXG4vLyBgdGAgaXMgYSBwZXItd3JpdGUgdW5pcXVlIHRpbWVzdGFtcCAoZ2V0VGltZVVuaXF1ZSk7IGB2YCBpcyBhIHNldCByb3c7IGBkYCBpcyBhIGRlbGV0ZWQga2V5LiBCZWNhdXNlIGV2ZXJ5IHRocmVhZCBzdHJlYW1zIHRvIGl0cyBvd24gZmlsZSwgdGhlIG9ubHkgd2F5IHRvIHJlY292ZXIgdGhlIGdsb2JhbCBtdXRhdGlvbiBvcmRlciDigJQgbmVlZGVkIGZvciBuZXdlc3Qtd2lucyDigJQgaXMgYSBwZXItd3JpdGUgdGltZXN0YW1wLCB3aXRoIHRpZXMgYnJva2VuIGJ5IGZpbGUgbmFtZS4gVGhlIHRyYWlsaW5nIGxlbmd0aCBtdXN0IG1hdGNoIHRoZSBsZWFkaW5nIG9uZTsgYSB0b3JuL2luY29tcGxldGUgYXBwZW5kIGxlYXZlcyBhIG1pc21hdGNoZWQgb3IgbWlzc2luZyBzdWZmaXgsIHNvIHdlIHN0b3AgdGhlcmUgYW5kIHJlcG9ydCB0cmFpbGluZyBiYWQgYnl0ZXMgaW5zdGVhZCBvZiB0aHJvd2luZy4gc3RydWN0dXJlZENsb25lIHByZXNlcnZlcyB0eXBlZCBhcnJheXMuXG5cbmV4cG9ydCBjb25zdCBTVFJFQU1fRVhURU5TSU9OID0gXCIuc3RyZWFtXCI7XG5cbmNvbnN0IGNib3JFbmNvZGVyID0gbmV3IGNib3J4LkVuY29kZXIoeyBzdHJ1Y3R1cmVkQ2xvbmU6IHRydWUgfSk7XG5cbmV4cG9ydCB0eXBlIFN0cmVhbUVudHJ5ID0geyB0aW1lOiBudW1iZXI7IHJvdz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBkZWxldGVkS2V5Pzogc3RyaW5nIH07XG5cbmZ1bmN0aW9uIGZyYW1lKHBheWxvYWQ6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgbGV0IGxlbiA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBsZW4ud3JpdGVVSW50MzJMRShwYXlsb2FkLmxlbmd0aCwgMCk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2xlbiwgcGF5bG9hZCwgbGVuXSk7XG59XG5cbi8vIEZyYW1pbmcgb25seSDigJQgbm8gYmF0Y2hpbmcgaGVyZS4gQnVsa0RhdGFiYXNlMiBjb2FsZXNjZXMgYW5kIGZsdXNoZXMgdGhlc2UgZnJhbWVkIGJ5dGVzIG9uIGEgcmFtcGluZyBwZXItY29sbGVjdGlvbiBzY2hlZHVsZSAoc2VlIHN0cmVhbUFwcGVuZCBpbiBCdWxrRGF0YWJhc2VCYXNlKSwgYmVjYXVzZSB0aGUgYnJvd3NlciBGaWxlIFN5c3RlbSBBY2Nlc3MgQVBJIHJld3JpdGVzIHRoZSB3aG9sZSBmaWxlIG9uIGV2ZXJ5IGFwcGVuZCwgc28gb25lLWFwcGVuZC1wZXItd3JpdGUgaXMgcXVhZHJhdGljLiBUaGUgZmlyc3Qgd3JpdGUgYWZ0ZXIgYSBsdWxsIHN0aWxsIGZsdXNoZXMgaW1tZWRpYXRlbHksIHNvIGEgc2luZ2xlIGFjdGlvbiB0aGVuIGEgdGFiIGNsb3NlIGlzIHNhdmVkIGF0IG9uY2UuXG5cbi8vIFRpbWVzIGFyZSBhc3NpZ25lZCBieSB0aGUgY2FsbGVyIChCdWxrRGF0YWJhc2UyKSBzbyB0aGUgZXhhY3Qgc2FtZSB0aW1lc3RhbXAgbGFuZHMgb24gZGlzaywgaW4gdGhlIGluLW1lbW9yeSBvdmVybGF5LCBhbmQgaW4gdGhlIGNyb3NzLXRhYiBicm9hZGNhc3Qg4oCUIGtlZXBpbmcgdGhlIGdsb2JhbCB3cml0ZSBvcmRlciBjb25zaXN0ZW50LlxuZXhwb3J0IGZ1bmN0aW9uIGZyYW1lUm93cyhlbnRyaWVzOiB7IHRpbWU6IG51bWJlcjsgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9W10pOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGVudHJpZXMubWFwKGUgPT4gZnJhbWUoQnVmZmVyLmZyb20oY2JvckVuY29kZXIuZW5jb2RlKHsgdDogZS50aW1lLCB2OiBlLnJvdyB9KSkpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcmFtZURlbGV0ZXMoZW50cmllczogeyB0aW1lOiBudW1iZXI7IGtleTogc3RyaW5nIH1bXSk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoZW50cmllcy5tYXAoZSA9PiBmcmFtZShCdWZmZXIuZnJvbShjYm9yRW5jb2Rlci5lbmNvZGUoeyB0OiBlLnRpbWUsIGQ6IGUua2V5IH0pKSkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RyZWFtKGJ1ZmZlcjogQnVmZmVyKTogeyBlbnRyaWVzOiBTdHJlYW1FbnRyeVtdOyBiYWRCeXRlczogbnVtYmVyIH0ge1xuICAgIGxldCBlbnRyaWVzOiBTdHJlYW1FbnRyeVtdID0gW107XG4gICAgbGV0IHBvcyA9IDA7XG4gICAgd2hpbGUgKHBvcyArIDQgPD0gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICBsZXQgbGVuID0gYnVmZmVyLnJlYWRVSW50MzJMRShwb3MpO1xuICAgICAgICBsZXQgcGF5bG9hZFN0YXJ0ID0gcG9zICsgNDtcbiAgICAgICAgbGV0IHN1ZmZpeFN0YXJ0ID0gcGF5bG9hZFN0YXJ0ICsgbGVuO1xuICAgICAgICBpZiAoc3VmZml4U3RhcnQgKyA0ID4gYnVmZmVyLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIGlmIChidWZmZXIucmVhZFVJbnQzMkxFKHN1ZmZpeFN0YXJ0KSAhPT0gbGVuKSBicmVhaztcbiAgICAgICAgbGV0IGRlY29kZWQ6IHsgdDogbnVtYmVyOyB2PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlY29kZWQgPSBjYm9yRW5jb2Rlci5kZWNvZGUoYnVmZmVyLnN1YmFycmF5KHBheWxvYWRTdGFydCwgc3VmZml4U3RhcnQpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVjb2RlZCAmJiBkZWNvZGVkLmQgIT09IHVuZGVmaW5lZCkgZW50cmllcy5wdXNoKHsgdGltZTogZGVjb2RlZC50LCBkZWxldGVkS2V5OiBkZWNvZGVkLmQgfSk7XG4gICAgICAgIGVsc2UgaWYgKGRlY29kZWQgJiYgZGVjb2RlZC52KSBlbnRyaWVzLnB1c2goeyB0aW1lOiBkZWNvZGVkLnQsIHJvdzogZGVjb2RlZC52IH0pO1xuICAgICAgICBwb3MgPSBzdWZmaXhTdGFydCArIDQ7XG4gICAgfVxuICAgIHJldHVybiB7IGVudHJpZXMsIGJhZEJ5dGVzOiBidWZmZXIubGVuZ3RoIC0gcG9zIH07XG59XG5cbi8vIFdyYXBzIHN0cmVhbWVkIGVudHJpZXMgKGFscmVhZHkgb3JkZXJlZCBvbGRlc3QtZmlyc3QpIGFzIGEgQmFzZUJ1bGtEYXRhYmFzZVJlYWRlci4gRWFjaCBzZXQgTUVSR0VTIGl0cyBmaWVsZHMgb250byB0aGUga2V5J3MgY3VycmVudCByb3cgKHNvIGEgcGFydGlhbCB3cml0ZS91cGRhdGUgb25seSBjaGFuZ2VzIHRoZSBjb2x1bW5zIGl0IGluY2x1ZGVzKTsgYSBkZWxldGUgdG9tYnN0b25lcyB0aGUga2V5IChleHBvc2VkIHZpYSBkZWxldGVkS2V5cyBzbyB0aGUgam9pbiBzdXBwcmVzc2VzIGl0IGluIG9sZGVyIGJ1bGsgcmVhZGVycykgYW5kIHJlc2V0cyB0aGUgbWVyZ2UuIEEgY29sdW1uIHRoZSBtZXJnZWQgcm93IG5ldmVyIHNldCByZWFkcyBhcyBBQlNFTlQsIHNvIHRoZSBqb2luIGZhbGxzIHRocm91Z2ggdG8gb2xkZXIgcmVhZGVycyBmb3IgaXQuIEFsc28gcmV0dXJucyB0aGUgbGF0ZXN0IHRpbWVzdGFtcCBzZWVuIHBlciBrZXkgKGxpdmUgb3IgZGVsZXRlZCksIHVzZWQgZm9yIGNyb3NzLXRhYiBjb25mbGljdCByZXNvbHV0aW9uLlxuZXhwb3J0IGZ1bmN0aW9uIHN0cmVhbVJlYWRlckZyb21FbnRyaWVzKGVudHJpZXM6IFN0cmVhbUVudHJ5W10sIHRvdGFsQnl0ZXM6IG51bWJlcik6IHsgcmVhZGVyOiBCYXNlQnVsa0RhdGFiYXNlUmVhZGVyOyB0aW1lczogTWFwPHN0cmluZywgbnVtYmVyPiB9IHtcbiAgICBsZXQgYnlLZXkgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk7XG4gICAgbGV0IGRlbGV0ZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IHRpbWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS5kZWxldGVkS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGJ5S2V5LmRlbGV0ZShlbnRyeS5kZWxldGVkS2V5KTtcbiAgICAgICAgICAgIGRlbGV0ZWRLZXlzLmFkZChlbnRyeS5kZWxldGVkS2V5KTtcbiAgICAgICAgICAgIHRpbWVzLnNldChlbnRyeS5kZWxldGVkS2V5LCBlbnRyeS50aW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5yb3cpIHtcbiAgICAgICAgICAgIGxldCBrZXkgPSBlbnRyeS5yb3cua2V5IGFzIHN0cmluZztcbiAgICAgICAgICAgIGJ5S2V5LnNldChrZXksIHsgLi4uYnlLZXkuZ2V0KGtleSksIC4uLmVudHJ5LnJvdyB9KTtcbiAgICAgICAgICAgIGRlbGV0ZWRLZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgdGltZXMuc2V0KGtleSwgZW50cnkudGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGtleXMgPSBbLi4uYnlLZXkua2V5cygpXTtcbiAgICBsZXQgY29sdW1uTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCByb3cgb2YgYnlLZXkudmFsdWVzKCkpIHtcbiAgICAgICAgZm9yIChsZXQgZmllbGQgb2YgT2JqZWN0LmtleXMocm93KSkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGZpZWxkKSkgY29udGludWU7XG4gICAgICAgICAgICBzZWVuLmFkZChmaWVsZCk7XG4gICAgICAgICAgICBjb2x1bW5OYW1lcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgY29sdW1ucyA9IGNvbHVtbk5hbWVzLm1hcChjb2x1bW4gPT4gKHsgY29sdW1uLCBieXRlU2l6ZTogMCB9KSk7XG4gICAgLy8gUGVyLWtleSB0b21ic3RvbmUgdGltZXMgZm9yIHRoZSBqb2luJ3MgZGVsZXRlIHJlc29sdXRpb24uXG4gICAgbGV0IGRlbGV0ZVRpbWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmb3IgKGxldCBrZXkgb2YgZGVsZXRlZEtleXMpIGRlbGV0ZVRpbWVzLnNldChrZXksIHRpbWVzLmdldChrZXkpIHx8IDApO1xuICAgIC8vIEl0ZXJhdGUgdG8gZmluZCBtaW4vbWF4IOKAlCBOT1QgTWF0aC5taW4oLi4udGltZXMpL01hdGgubWF4KC4uLnRpbWVzKTogc3ByZWFkaW5nIGEgbGFyZ2UgYXJyYXkgYXMgY2FsbCBhcmd1bWVudHMgb3ZlcmZsb3dzIHRoZSBzdGFjayAoXCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiKSBvbmNlIGEgc3RyZWFtIGhhcyBtYW55IGtleXMuXG4gICAgbGV0IG1pblRpbWUgPSBJbmZpbml0eSwgbWF4VGltZSA9IC1JbmZpbml0eTtcbiAgICBmb3IgKGxldCB0IG9mIHRpbWVzLnZhbHVlcygpKSB7XG4gICAgICAgIGlmICh0IDwgbWluVGltZSkgbWluVGltZSA9IHQ7XG4gICAgICAgIGlmICh0ID4gbWF4VGltZSkgbWF4VGltZSA9IHQ7XG4gICAgfVxuICAgIGNvbnN0IGtleUluZGV4TWFwID0gYnVpbGRLZXlJbmRleChrZXlzKTtcbiAgICBsZXQgcmVhZGVyOiBCYXNlQnVsa0RhdGFiYXNlUmVhZGVyID0ge1xuICAgICAgICBuYW1lOiBcIihzdHJlYW1zKVwiLFxuICAgICAgICB0b3RhbEJ5dGVzLFxuICAgICAgICByb3dDb3VudDoga2V5cy5sZW5ndGgsXG4gICAgICAgIG1pblRpbWU6IHRpbWVzLnNpemUgPyBtaW5UaW1lIDogMCxcbiAgICAgICAgbWF4VGltZTogdGltZXMuc2l6ZSA/IG1heFRpbWUgOiAwLFxuICAgICAgICBrZXlzLFxuICAgICAgICBrZXlUaW1lczogbmV3IE1hcChrZXlzLm1hcChrZXkgPT4gW2tleSwgdGltZXMuZ2V0KGtleSkgfHwgMF0pKSxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgICAgZGVsZXRlVGltZXMsXG4gICAgICAgIC8vIEEga2V5J3MgdGltZSBpcyBpdHMgbGF0ZXN0IHdyaXRlIGFjcm9zcyBhbGwgY29sdW1ucyAocGVyLWtleSwgbm90IHBlci1jb2x1bW4pLiBGb3IgYSBjb2x1bW4gaXQgbmV2ZXIgc2V0IHdlIHJldHVybiBBQlNFTlQgc28gdGhlIGpvaW4gZmFsbHMgdGhyb3VnaCB0byBhbiBvbGRlciByZWFkZXIuXG4gICAgICAgIGFzeW5jIGdldENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBrZXlzLm1hcChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCByb3cgPSBieUtleS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBrZXksIHZhbHVlOiByb3cgJiYgY29sdW1uIGluIHJvdyA/IHJvd1tjb2x1bW5dIDogQUJTRU5ULCB0aW1lOiB0aW1lcy5nZXQoa2V5KSB8fCAwIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0U2luZ2xlRmllbGQoa2V5LCBjb2x1bW4pIHtcbiAgICAgICAgICAgIGxldCByb3cgPSBieUtleS5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICghcm93IHx8ICEoY29sdW1uIGluIHJvdykpIHJldHVybiBBQlNFTlQ7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcm93W2NvbHVtbl0sIHRpbWU6IHRpbWVzLmdldChrZXkpIHx8IDAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gU3RyZWFtIHZhbHVlcyBhcmUgZGVjb2RlZCBvYmplY3RzIChDQk9SKSwgc28gdW5saWtlIGEgYnVsayBmaWxlIHdlIGhhdmUgdG8gZW5jb2RlIHRoZW0gdG8gcmF3IGNlbGxzIGhlcmUuIFN0cmVhbSBkYXRhIGlzIHNtYWxsICh0aWVyLTAsIHNpemUtY2FwcGVkKSwgc28gdGhpcyBpcyBjaGVhcC4gQSBjb2x1bW4gdGhlIHJvdyBuZXZlciBzZXQgaXMgb21pdHRlZCAoQUJTRU5UIOKGkiBmYWxsIHRocm91Z2gpOyBhIHN0b3JlZCB1bmRlZmluZWQgaXMga2VwdCAoYSByZWFsIGNsZWFyKS5cbiAgICAgICAgYXN5bmMgZ2V0UmF3Q29sdW1uKGNvbHVtbikge1xuICAgICAgICAgICAgbGV0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBSYXdDZWxsPigpO1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm93ID0gYnlLZXkuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyb3cgfHwgIShjb2x1bW4gaW4gcm93KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbWFwLnNldChrZXksIGVuY29kZVZhbHVlKHJvd1tjb2x1bW5dKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9LFxuICAgICAgICAvLyBQZXItY29sdW1uIGluZGV4IGluIHRoZSBzYW1lIHNoYXBlIGEgYnVsayBmaWxlIGV4cG9zZXMsIG1hdGVyaWFsaXplZCBpbiBtZW1vcnkgb25jZSAoc3RyZWFtIGRhdGEgaXMgdGllci0wLCBzaXplLWNhcHBlZCwgc28gdGhlIGVuY29kZSBpcyBjaGVhcCkuIExldHMgdGhlIHBsYW5uZWQgbWVyZ2UgdHJlYXQgc3RyZWFtICsgYnVsayBzb3VyY2VzIHVuaWZvcm1seTogaXQgbG9hZHMgZWFjaCAoc291cmNlLCBjb2x1bW4pIGluZGV4LCB1c2VzIG9mZnNldHMvdHlwZXMgdG8gcGxhbiB0aGUgb3V0cHV0J3MgYnl0ZSBsYXlvdXQsIGFuZCByZWFkcyBjb250aWd1b3VzIHJ1bnMgZnJvbSB0aGlzIGluZGV4J3MgaW4tbWVtb3J5IGRhdGEgYnVmZmVyIGR1cmluZyBleGVjdXRlLlxuICAgICAgICBhc3luYyBnZXRDb2x1bW5JbmRleChjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRTdHJlYW1Db2x1bW5JbmRleChrZXlzLCBieUtleSwgY29sdW1uKTtcbiAgICAgICAgfSxcbiAgICAgICAgcm93T2ZLZXkoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5SW5kZXhNYXAuZ2V0KGtleSk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4geyByZWFkZXIsIHRpbWVzIH07XG59XG5cbi8vIGtleXNbXSBpcyB0aGUgY29sdW1uLXNpZGUgcm93IG9yZGVyIGZvciB0aGlzIHN0cmVhbSByZWFkZXI7IHJvd09mS2V5IGlzIHVzZWQgYnkgdGhlIHBsYW5uZXIgdG8gbG9vayB1cCBhIHdpbm5pbmcgY2VsbCdzIHNvdXJjZSByb3cgd2l0aG91dCBnb2luZyB0aHJvdWdoIGEgY29sdW1uIHJlYWQuIFN0YXlzIGNvbnNpc3RlbnQgd2l0aCBnZXRDb2x1bW5JbmRleCwgd2hpY2ggYnVpbGRzIGl0cyBvZmZzZXRzL3R5cGVzIG92ZXIgdGhlIHNhbWUgYGtleXNgIGFycmF5IGluIHRoZSBzYW1lIG9yZGVyLlxuZnVuY3Rpb24gYnVpbGRLZXlJbmRleChrZXlzOiBzdHJpbmdbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICAgIGNvbnN0IG0gPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgbS5zZXQoa2V5c1tpXSwgaSk7XG4gICAgcmV0dXJuIG07XG59XG5cbi8vIEJ1aWxkIGEgc3RyZWFtLXNpZGUgQ29sdW1uSW5kZXggKG9mZnNldHMgKyB0eXBlcyArIGEgY29udGlndW91cy1yb3cgYnl0ZSBzbGljZXIpIG92ZXIgdGhlIGluLW1lbW9yeSBtZXJnZWQgcm93cy4gRW5jb2RlcyBlYWNoIHJvdydzIHZhbHVlIGZvciB0aGlzIGNvbHVtbiBvbmNlIGludG8gYSBzaW5nbGUgYmFja2luZyBidWZmZXI7IHJlYWRWYWx1ZUJ5dGVzIHRoZW4gc2xpY2VzIGl0LiBDYWNoZWQgcGVyIChyZWFkZXIsIGNvbHVtbikgc28gYSBtZXJnZSBwbGFubmluZyArIGV4ZWN1dGlvbiBwYXNzIGRvZXNuJ3QgcmUtZW5jb2RlLlxuZnVuY3Rpb24gZ2V0U3RyZWFtQ29sdW1uSW5kZXgoa2V5czogc3RyaW5nW10sIGJ5S2V5OiBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sIGNvbHVtbjogc3RyaW5nKTogQ29sdW1uSW5kZXgge1xuICAgIGxldCBjYWNoZWQgPSBjb2x1bW5JbmRleENhY2hlLmdldChieUtleSk/LmdldChjb2x1bW4pO1xuICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShrZXlzLmxlbmd0aCArIDEpO1xuICAgIGNvbnN0IHR5cGVzID0gbmV3IFVpbnQ4QXJyYXkoa2V5cy5sZW5ndGgpO1xuICAgIGNvbnN0IHBhcnRzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGxldCBwb3MgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByb3cgPSBieUtleS5nZXQoa2V5c1tpXSk7XG4gICAgICAgIG9mZnNldHNbaV0gPSBwb3M7XG4gICAgICAgIGlmICghcm93IHx8ICEoY29sdW1uIGluIHJvdykpIHtcbiAgICAgICAgICAgIHR5cGVzW2ldID0gVFlQRV9BQlNFTlRfVEFHO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlLCBieXRlcyB9ID0gZW5jb2RlVmFsdWUocm93W2NvbHVtbl0pO1xuICAgICAgICB0eXBlc1tpXSA9IHR5cGU7XG4gICAgICAgIHBhcnRzLnB1c2goYnl0ZXMpO1xuICAgICAgICBwb3MgKz0gYnl0ZXMubGVuZ3RoO1xuICAgIH1cbiAgICBvZmZzZXRzW2tleXMubGVuZ3RoXSA9IHBvcztcbiAgICBjb25zdCBkYXRhID0gcGFydHMubGVuZ3RoID8gQnVmZmVyLmNvbmNhdChwYXJ0cykgOiBFTVBUWV9CVUZGRVI7XG4gICAgY29uc3QgaWR4OiBDb2x1bW5JbmRleCA9IHtcbiAgICAgICAgb2Zmc2V0cyxcbiAgICAgICAgdHlwZXMsXG4gICAgICAgIGFzeW5jIHJlYWRWYWx1ZUJ5dGVzKHN0YXJ0Um93LCBlbmRSb3cpIHtcbiAgICAgICAgICAgIGlmIChlbmRSb3cgPD0gc3RhcnRSb3cpIHJldHVybiBFTVBUWV9CVUZGRVI7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IG9mZnNldHNbc3RhcnRSb3ddO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gb2Zmc2V0c1tlbmRSb3ddO1xuICAgICAgICAgICAgaWYgKGVuZCA8PSBzdGFydCkgcmV0dXJuIEVNUFRZX0JVRkZFUjtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnN1YmFycmF5KHN0YXJ0LCBlbmQpO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgbGV0IHBlclJlYWRlciA9IGNvbHVtbkluZGV4Q2FjaGUuZ2V0KGJ5S2V5KTtcbiAgICBpZiAoIXBlclJlYWRlcikgeyBwZXJSZWFkZXIgPSBuZXcgTWFwKCk7IGNvbHVtbkluZGV4Q2FjaGUuc2V0KGJ5S2V5LCBwZXJSZWFkZXIpOyB9XG4gICAgcGVyUmVhZGVyLnNldChjb2x1bW4sIGlkeCk7XG4gICAgcmV0dXJuIGlkeDtcbn1cblxuLy8gUGVyIHN0cmVhbS1yZWFkZXIgY2FjaGUgb2YgaXRzIGNvbHVtbiBpbmRleGVzLiBLZXllZCBieSB0aGUgcmVhZGVyJ3MgYnlLZXkgbWFwIChhIGZyZXNoIHN0cmVhbVJlYWRlckZyb21FbnRyaWVzIGNhbGwgcHJvZHVjZXMgYSBmcmVzaCBtYXAsIHNvIHRoaXMgaXMgZWZmZWN0aXZlbHkgcGVyLXJlYWRlcikuXG5jb25zdCBjb2x1bW5JbmRleENhY2hlID0gbmV3IFdlYWtNYXA8TWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCBNYXA8c3RyaW5nLCBDb2x1bW5JbmRleD4+KCk7XG4iXX0=
201
+ /* _JS_SOURCE_HASH = "efc43db21e50b2804f6d23b6c8b9202622e7616e222981c9cb612fd3ed580fd5"; */