@mnaoumov/obsidian-lib 10.7.0 → 10.9.0

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 (69) hide show
  1. package/README.md +4 -0
  2. package/data-stores/data-store-locations/package.json +6 -0
  3. package/dist/lib/cjs/__merged.cjs +18 -1
  4. package/dist/lib/cjs/__merged.d.cts +4 -1
  5. package/dist/lib/cjs/code-block-render-handoff.cjs +2 -5
  6. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +2 -2
  7. package/dist/lib/cjs/community-plugins.cjs +2 -2
  8. package/dist/lib/cjs/components/all-windows-event-component.cjs +86 -14
  9. package/dist/lib/cjs/components/all-windows-event-component.d.cts +54 -3
  10. package/dist/lib/cjs/components/monkey-around-component.cjs +1 -1
  11. package/dist/lib/cjs/components/plugin-notice-component.cjs +2 -6
  12. package/dist/lib/cjs/components/style-sheet-component.cjs +1 -4
  13. package/dist/lib/cjs/data-stores/data-store-locations.cjs +248 -0
  14. package/dist/lib/cjs/data-stores/data-store-locations.d.cts +60 -0
  15. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +2 -2
  16. package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +1 -1
  17. package/dist/lib/cjs/data-stores/data-store-transport.cjs +126 -21
  18. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +38 -4
  19. package/dist/lib/cjs/data-stores/index.cjs +4 -1
  20. package/dist/lib/cjs/data-stores/index.d.cts +1 -0
  21. package/dist/lib/cjs/data-stores/shared-data-store.cjs +145 -22
  22. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +53 -1
  23. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +5 -5
  24. package/dist/lib/cjs/folder-note.cjs +5 -5
  25. package/dist/lib/cjs/formula-function.cjs +152 -0
  26. package/dist/lib/cjs/formula-function.d.cts +98 -0
  27. package/dist/lib/cjs/frontmatter-formatting.cjs +2 -2
  28. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  29. package/dist/lib/cjs/index.cjs +7 -1
  30. package/dist/lib/cjs/index.d.cts +2 -0
  31. package/dist/lib/cjs/link.cjs +12 -12
  32. package/dist/lib/cjs/markdown.cjs +7 -7
  33. package/dist/lib/cjs/vault.cjs +2 -2
  34. package/dist/lib/cjs/virtual-file.cjs +340 -0
  35. package/dist/lib/cjs/virtual-file.d.cts +48 -0
  36. package/dist/lib/esm/__merged.d.mts +4 -1
  37. package/dist/lib/esm/__merged.mjs +20 -2
  38. package/dist/lib/esm/code-block-render-handoff.mjs +2 -5
  39. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +2 -2
  40. package/dist/lib/esm/community-plugins.mjs +2 -2
  41. package/dist/lib/esm/components/all-windows-event-component.d.mts +54 -3
  42. package/dist/lib/esm/components/all-windows-event-component.mjs +87 -14
  43. package/dist/lib/esm/components/monkey-around-component.mjs +1 -1
  44. package/dist/lib/esm/components/plugin-notice-component.mjs +2 -6
  45. package/dist/lib/esm/components/style-sheet-component.mjs +1 -4
  46. package/dist/lib/esm/data-stores/data-store-locations.d.mts +60 -0
  47. package/dist/lib/esm/data-stores/data-store-locations.mjs +160 -0
  48. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +1 -1
  49. package/dist/lib/esm/data-stores/data-store-seeds.mjs +2 -2
  50. package/dist/lib/esm/data-stores/data-store-transport.d.mts +38 -4
  51. package/dist/lib/esm/data-stores/data-store-transport.mjs +126 -21
  52. package/dist/lib/esm/data-stores/index.d.mts +1 -0
  53. package/dist/lib/esm/data-stores/index.mjs +3 -1
  54. package/dist/lib/esm/data-stores/shared-data-store.d.mts +53 -1
  55. package/dist/lib/esm/data-stores/shared-data-store.mjs +145 -22
  56. package/dist/lib/esm/desktop-bulk-operation-git.mjs +5 -5
  57. package/dist/lib/esm/folder-note.mjs +5 -5
  58. package/dist/lib/esm/formula-function.d.mts +98 -0
  59. package/dist/lib/esm/formula-function.mjs +62 -0
  60. package/dist/lib/esm/frontmatter-formatting.mjs +2 -2
  61. package/dist/lib/esm/generated-during-build.mjs +1 -1
  62. package/dist/lib/esm/index.d.mts +2 -0
  63. package/dist/lib/esm/index.mjs +5 -1
  64. package/dist/lib/esm/link.mjs +12 -12
  65. package/dist/lib/esm/markdown.mjs +7 -7
  66. package/dist/lib/esm/vault.mjs +2 -2
  67. package/dist/lib/esm/virtual-file.d.mts +48 -0
  68. package/dist/lib/esm/virtual-file.mjs +264 -0
  69. package/package.json +5 -5
@@ -123,6 +123,7 @@ var import_debug = require('../debug.cjs');
123
123
  const DEFAULT_MAX_FILE_BYTES = 1e6;
124
124
  const MIN_FILE_BYTES = 256;
125
125
  const MAX_FILE_BYTES = 4e6;
126
+ const MAX_SNAPSHOT_BYTES = 64e6;
126
127
  const DOCUMENT_PREFIX = "```json\n";
127
128
  const DOCUMENT_SUFFIX = "\n```\n";
128
129
  const BISECTION_DIVISOR = 2;
@@ -137,6 +138,7 @@ class DataStoreTransport {
137
138
  constructor(params) {
138
139
  this.params = params;
139
140
  this.adapter = params.adapter;
141
+ this.extension = params.format === "json" ? ".json" : ".md";
140
142
  const folder = params.folder ?? "Plugin data";
141
143
  if (!isSafeVaultPath(folder) || !/^[\w-]+$/.test(params.pluginId) || !/^[\w-]+$/.test(params.storeId)) {
142
144
  throw new Error("Data store requires a safe vault-relative folder and safe plugin/store ids");
@@ -146,8 +148,16 @@ class DataStoreTransport {
146
148
  if (!Number.isSafeInteger(this.maxFileBytes) || this.maxFileBytes < MIN_FILE_BYTES || this.maxFileBytes > MAX_FILE_BYTES) {
147
149
  throw new Error("Data-store file limit must be between 256 and 4000000 bytes");
148
150
  }
151
+ this.maxSnapshotBytes = params.maxSnapshotBytes ?? MAX_SNAPSHOT_BYTES;
152
+ if (!Number.isSafeInteger(this.maxSnapshotBytes) || this.maxSnapshotBytes < MIN_FILE_BYTES || this.maxSnapshotBytes > MAX_SNAPSHOT_BYTES) {
153
+ throw new Error("Data-store snapshot limit must be between 256 and 64000000 bytes");
154
+ }
149
155
  }
150
156
  params;
157
+ /**
158
+ File extension for new documents.
159
+ */
160
+ extension;
151
161
  /**
152
162
  * Maximum encoded bytes per document.
153
163
  */
@@ -160,6 +170,57 @@ class DataStoreTransport {
160
170
  * Vault adapter used by this transport.
161
171
  */
162
172
  adapter;
173
+ maxSnapshotBytes;
174
+ /**
175
+ * Copies history byte for byte, preserving source files and refusing conflicting immutable destinations.
176
+ * Acknowledgements are local to each location and are not copied.
177
+ *
178
+ * @param target - Destination for this same plugin and store.
179
+ * @returns A promise that resolves after every copied file has been verified.
180
+ */
181
+ async copyHistoryTo(target) {
182
+ if (this.params.pluginId !== target.params.pluginId || this.params.storeId !== target.params.storeId) {
183
+ throw new Error("Cannot copy data-store history to a different store");
184
+ }
185
+ const allFiles = await this.list();
186
+ const files = allFiles.filter((path) => path.startsWith(`${this.root}/devices/`));
187
+ const complete = /* @__PURE__ */ new Set();
188
+ for (const path of files) {
189
+ if (/\/log-\d+\.(?:md|json)$/.test(path) && await this.read(path) !== void 0) {
190
+ complete.add(path);
191
+ }
192
+ if (!/\/snapshot-[\w-]+-manifest\.(?:md|json)$/.test(path) || await this.readSnapshot(path) === void 0) {
193
+ continue;
194
+ }
195
+ const extension = path.endsWith(".json") ? ".json" : ".md";
196
+ const base = path.slice(0, -extension.length);
197
+ for (const chunk of files) {
198
+ if (chunk.startsWith(`${base}-`) && chunk.endsWith(extension)) {
199
+ complete.add(chunk);
200
+ }
201
+ }
202
+ complete.add(path);
203
+ }
204
+ for (const path of complete) {
205
+ this.checkPath(path);
206
+ const text = await this.adapter.read(path);
207
+ this.checkSize(text);
208
+ target.checkSize(text);
209
+ const destination = target.root + path.slice(this.root.length);
210
+ target.checkPath(destination);
211
+ if (await target.adapter.exists(destination)) {
212
+ if (await target.adapter.read(destination) !== text) {
213
+ throw new Error("Conflicting immutable data-store history");
214
+ }
215
+ } else {
216
+ await target.ensureParent(destination);
217
+ await target.adapter.write(destination, text);
218
+ }
219
+ if (await target.adapter.read(destination) !== text) {
220
+ throw new Error("Data-store history copy failed verification");
221
+ }
222
+ }
223
+ }
163
224
  /**
164
225
  * Tests the complete encoded size without writing.
165
226
  *
@@ -189,7 +250,7 @@ class DataStoreTransport {
189
250
  return files.sort();
190
251
  }
191
252
  /**
192
- * Reads a complete fenced JSON document. Partial or not-yet-delivered documents are ignored.
253
+ * Reads complete fenced Markdown JSON or a version-one JSON envelope. Partial documents remain pending.
193
254
  *
194
255
  * @param path - Vault-relative file within this store.
195
256
  * @returns Parsed JSON, or `undefined` for an incomplete document.
@@ -209,6 +270,18 @@ class DataStoreTransport {
209
270
  throw error;
210
271
  }
211
272
  this.checkSize(text);
273
+ if (path.endsWith(".json")) {
274
+ let document;
275
+ try {
276
+ document = JSON.parse(text);
277
+ } catch {
278
+ return void 0;
279
+ }
280
+ if (typeof document !== "object" || document === null || !("format" in document) || document.format !== 1 || !("payload" in document)) {
281
+ throw new Error("Invalid JSON data-store document");
282
+ }
283
+ return document.payload;
284
+ }
212
285
  if (!text.startsWith(DOCUMENT_PREFIX) || !text.endsWith(DOCUMENT_SUFFIX)) {
213
286
  return void 0;
214
287
  }
@@ -227,11 +300,17 @@ class DataStoreTransport {
227
300
  return void 0;
228
301
  }
229
302
  const chunks = [];
303
+ let bytes = 0;
230
304
  for (const [index, hash] of manifest.hashes.entries()) {
231
- const chunk = await this.read(`${path.slice(0, -".md".length)}-${String(index)}.md`);
305
+ const extension = path.endsWith(".json") ? ".json" : ".md";
306
+ const chunk = await this.read(`${path.slice(0, -extension.length)}-${String(index)}${extension}`);
232
307
  if (typeof chunk !== "string" || await digest(chunk) !== hash) {
233
308
  return void 0;
234
309
  }
310
+ bytes += new TextEncoder().encode(chunk).length;
311
+ if (bytes > this.maxSnapshotBytes) {
312
+ throw new Error("Data-store snapshot exceeds decoded byte limit");
313
+ }
235
314
  chunks.push(chunk);
236
315
  }
237
316
  const parsed = JSON.parse(chunks.join(""));
@@ -256,23 +335,29 @@ class DataStoreTransport {
256
335
  */
257
336
  async write(path, value) {
258
337
  this.checkPath(path);
259
- const text = this.encode(value);
338
+ const text = this.encode(value, path.endsWith(".json"));
260
339
  this.checkSize(text);
261
- const parts = path.split("/");
262
- parts.pop();
263
- let folder = "";
264
- for (const part of parts) {
265
- folder = folder ? `${folder}/${part}` : part;
266
- if (!await this.adapter.exists(folder)) {
267
- try {
268
- await this.adapter.mkdir(folder);
269
- } catch (error) {
270
- if (!await this.adapter.exists(folder)) {
271
- throw error;
272
- }
273
- }
340
+ await this.ensureParent(path);
341
+ await this.adapter.write(path, text);
342
+ }
343
+ /**
344
+ * Publishes an immutable document, accepting only byte-identical retries at an occupied path.
345
+ *
346
+ * @param path - Vault-relative destination within this store.
347
+ * @param value - JSON-compatible payload.
348
+ * @returns A promise that resolves after publication or an identical retry.
349
+ */
350
+ async writeImmutable(path, value) {
351
+ this.checkPath(path);
352
+ const text = this.encode(value, path.endsWith(".json"));
353
+ this.checkSize(text);
354
+ if (await this.adapter.exists(path)) {
355
+ if (await this.adapter.read(path) !== text) {
356
+ throw new Error("Conflicting immutable data-store document");
274
357
  }
358
+ return;
275
359
  }
360
+ await this.ensureParent(path);
276
361
  await this.adapter.write(path, text);
277
362
  }
278
363
  /**
@@ -286,6 +371,9 @@ class DataStoreTransport {
286
371
  if (payload === void 0) {
287
372
  throw new Error("Snapshot must be JSON-compatible");
288
373
  }
374
+ if (new TextEncoder().encode(payload).length > this.maxSnapshotBytes) {
375
+ throw new Error("Data-store snapshot exceeds decoded byte limit");
376
+ }
289
377
  const chunks = [];
290
378
  let offset = 0;
291
379
  while (offset < payload.length) {
@@ -309,9 +397,9 @@ class DataStoreTransport {
309
397
  const manifest = { format: 1, hashes };
310
398
  this.checkSize(this.encode(manifest));
311
399
  for (const [index, chunk] of chunks.entries()) {
312
- await this.write(`${params.base}-${String(index)}.md`, chunk);
400
+ await this.write(`${params.base}-${String(index)}${this.extension}`, chunk);
313
401
  }
314
- await this.write(`${params.base}.md`, manifest);
402
+ await this.write(`${params.base}${this.extension}`, manifest);
315
403
  }
316
404
  checkPath(path) {
317
405
  if (!path.startsWith(`${this.root}/`) || !isSafeVaultPath(path)) {
@@ -328,12 +416,29 @@ class DataStoreTransport {
328
416
  (0, import_debug.getObsidianLibDebugger)("DataStore")(message);
329
417
  throw new Error(message);
330
418
  }
331
- encode(value) {
419
+ encode(value, isJson = this.extension === ".json") {
332
420
  const json = JSON.stringify(value);
333
421
  if (json === void 0) {
334
422
  throw new Error("Data-store payload must be JSON-compatible");
335
423
  }
336
- return `${DOCUMENT_PREFIX}${json}${DOCUMENT_SUFFIX}`;
424
+ return isJson ? JSON.stringify({ format: 1, payload: value }) : `${DOCUMENT_PREFIX}${json}${DOCUMENT_SUFFIX}`;
425
+ }
426
+ async ensureParent(path) {
427
+ const parts = path.split("/");
428
+ parts.pop();
429
+ let folder = "";
430
+ for (const part of parts) {
431
+ folder = folder ? `${folder}/${part}` : part;
432
+ if (!await this.adapter.exists(folder)) {
433
+ try {
434
+ await this.adapter.mkdir(folder);
435
+ } catch (error) {
436
+ if (!await this.adapter.exists(folder)) {
437
+ throw error;
438
+ }
439
+ }
440
+ }
441
+ }
337
442
  }
338
443
  }
339
444
  async function digest(text) {
@@ -347,4 +452,4 @@ function isSafeVaultPath(path) {
347
452
  0 && (module.exports = {
348
453
  DataStoreTransport
349
454
  });
350
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9kYXRhLXN0b3JlLXRyYW5zcG9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqXG4gKiBTaXplLWJvdW5kZWQgTWFya2Rvd24gdHJhbnNwb3J0IGNhcnJpZWQgYnkgdmF1bHQgc3luY2hyb25pemF0aW9uIHdpdGggZGVmYXVsdCBmaWxlIHR5cGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGF0YUFkYXB0ZXIgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IE5vdGljZSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlciB9IGZyb20gJy4uL2RlYnVnLnRzJztcblxuY29uc3QgREVGQVVMVF9NQVhfRklMRV9CWVRFUyA9IDFfMDAwXzAwMDtcbmNvbnN0IE1JTl9GSUxFX0JZVEVTID0gMjU2O1xuY29uc3QgTUFYX0ZJTEVfQllURVMgPSA0XzAwMF8wMDA7XG5jb25zdCBET0NVTUVOVF9QUkVGSVggPSAnYGBganNvblxcbic7XG5jb25zdCBET0NVTUVOVF9TVUZGSVggPSAnXFxuYGBgXFxuJztcbmNvbnN0IEJJU0VDVElPTl9ESVZJU09SID0gMjtcbmNvbnN0IEhFWF9SQURJWCA9IDE2O1xuY29uc3QgSEVYX0JZVEVfTEVOR1RIID0gMjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUgc2hhcmVkLXN0b3JlIHZhdWx0IHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVUcmFuc3BvcnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBWYXVsdCBhZGFwdGVyOyBubyBkZXNrdG9wIGZpbGVzeXN0ZW0gQVBJcyBhcmUgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFkYXB0ZXI6IERhdGFBZGFwdGVyO1xuICAvKipcbiAgICogVmF1bHQtcmVsYXRpdmUgZm9sZGVyLiBIaWRkZW4gc2VnbWVudHMgYXJlIGFsbG93ZWQ7IGNhbGxlcnMgbXVzdCBhcnJhbmdlIHRoZWlyIHN5bmNocm9uaXphdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdQbHVnaW4gZGF0YSdgXG4gICAqL1xuICByZWFkb25seSBmb2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNYXhpbXVtIFVURi04IGJ5dGVzIGluIGFueSBmaWxlLCBpbmNsdWRpbmcgaXRzIE1hcmtkb3duIHdyYXBwZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbWF4RmlsZUJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogUGx1Z2luIG1hbmlmZXN0IGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFN0b3JlIG5hbWUgaW5jbHVkaW5nIGl0cyBjb25zdW1lciBzY2hlbWEgdmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBwdWJsaXNoaW5nIGEgY2h1bmtlZCBzbmFwc2hvdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVUcmFuc3BvcnRXcml0ZVNuYXBzaG90UGFyYW1zIHtcbiAgLyoqXG4gICAqIFZhdWx0LXJlbGF0aXZlIGJhc2UgcGF0aCB3aXRob3V0IHRoZSBgLm1kYCBleHRlbnNpb24uIFVzZSBhIGZyZXNoIHVuaXF1ZSBuYW1lIGZvciBldmVyeSBwdWJsaWNhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2U6IHN0cmluZztcbiAgLyoqXG4gICAqIEpTT04tY29tcGF0aWJsZSBzbmFwc2hvdCwgaW5jbHVkaW5nIGl0cyBjb25zdW1lciBzY2hlbWEgYW5kIGNvdmVyYWdlIG1ldGFkYXRhLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZDogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBIHN0b3JlLXNjb3BlZCB0cmFuc3BvcnQuIEV2ZXJ5IHB1Ymxpc2hlZCBkb2N1bWVudCBpcyBpbW11dGFibGUgZXhjZXB0IGRldmljZSBhY2tub3dsZWRnZW1lbnRzLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YVN0b3JlVHJhbnNwb3J0IHtcbiAgLyoqXG4gICAqIE1heGltdW0gZW5jb2RlZCBieXRlcyBwZXIgZG9jdW1lbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWF4RmlsZUJ5dGVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBGdWxsIHZhdWx0LXJlbGF0aXZlIHN0b3JlIHJvb3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9vdDogc3RyaW5nO1xuICAvKipcbiAgICogVmF1bHQgYWRhcHRlciB1c2VkIGJ5IHRoaXMgdHJhbnNwb3J0LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFkYXB0ZXI6IERhdGFBZGFwdGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYm91bmRlZCB2YXVsdCB0cmFuc3BvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBZGFwdGVyLCBpZGVudGl0eSBhbmQgZmlsZSBib3VuZHMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBhcmFtczogRGF0YVN0b3JlVHJhbnNwb3J0Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFkYXB0ZXIgPSBwYXJhbXMuYWRhcHRlcjtcbiAgICBjb25zdCBmb2xkZXIgPSBwYXJhbXMuZm9sZGVyID8/ICdQbHVnaW4gZGF0YSc7XG4gICAgaWYgKFxuICAgICAgIWlzU2FmZVZhdWx0UGF0aChmb2xkZXIpXG4gICAgICB8fCAhL15bXFx3LV0rJC8udGVzdChwYXJhbXMucGx1Z2luSWQpIHx8ICEvXltcXHctXSskLy50ZXN0KHBhcmFtcy5zdG9yZUlkKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIHN0b3JlIHJlcXVpcmVzIGEgc2FmZSB2YXVsdC1yZWxhdGl2ZSBmb2xkZXIgYW5kIHNhZmUgcGx1Z2luL3N0b3JlIGlkcycpO1xuICAgIH1cbiAgICB0aGlzLnJvb3QgPSBgJHtmb2xkZXJ9LyR7cGFyYW1zLnBsdWdpbklkfS8ke3BhcmFtcy5zdG9yZUlkfWA7XG4gICAgdGhpcy5tYXhGaWxlQnl0ZXMgPSBwYXJhbXMubWF4RmlsZUJ5dGVzID8/IERFRkFVTFRfTUFYX0ZJTEVfQllURVM7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih0aGlzLm1heEZpbGVCeXRlcykgfHwgdGhpcy5tYXhGaWxlQnl0ZXMgPCBNSU5fRklMRV9CWVRFUyB8fCB0aGlzLm1heEZpbGVCeXRlcyA+IE1BWF9GSUxFX0JZVEVTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgZmlsZSBsaW1pdCBtdXN0IGJlIGJldHdlZW4gMjU2IGFuZCA0MDAwMDAwIGJ5dGVzJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRlc3RzIHRoZSBjb21wbGV0ZSBlbmNvZGVkIHNpemUgd2l0aG91dCB3cml0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBKU09OIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgaXRzIGRvY3VtZW50IGZpdHMgdGhlIGNvbmZpZ3VyZWQgY2FwLlxuICAgKi9cbiAgcHVibGljIGZpdHModmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHRoaXMuZW5jb2RlKHZhbHVlKSkubGVuZ3RoIDw9IHRoaXMubWF4RmlsZUJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIHRoZSBzdG9yZSdzIGZpbGVzIHJlY3Vyc2l2ZWx5LCBuZXZlciBsZWF2aW5nIGl0cyBmb2xkZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFZhdWx0LXJlbGF0aXZlIHBhdGhzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGlmICghYXdhaXQgdGhpcy5hZGFwdGVyLmV4aXN0cyh0aGlzLnJvb3QpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmcgPSBbdGhpcy5yb290XTtcbiAgICBjb25zdCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICB3aGlsZSAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmb2xkZXIgPSBlbnN1cmVOb25OdWxsYWJsZShwZW5kaW5nLnNoaWZ0KCkpO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCB0aGlzLmFkYXB0ZXIubGlzdChmb2xkZXIpO1xuICAgICAgZmlsZXMucHVzaCguLi5jaGlsZHJlbi5maWxlcy5maWx0ZXIoKHBhdGgpID0+IHBhdGguc3RhcnRzV2l0aChgJHtmb2xkZXJ9L2ApKSk7XG4gICAgICBwZW5kaW5nLnB1c2goLi4uY2hpbGRyZW4uZm9sZGVycy5maWx0ZXIoKHBhdGgpID0+IHBhdGguc3RhcnRzV2l0aChgJHtmb2xkZXJ9L2ApKSk7XG4gICAgfVxuICAgIHJldHVybiBmaWxlcy5zb3J0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSBjb21wbGV0ZSBmZW5jZWQgSlNPTiBkb2N1bWVudC4gUGFydGlhbCBvciBub3QteWV0LWRlbGl2ZXJlZCBkb2N1bWVudHMgYXJlIGlnbm9yZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVmF1bHQtcmVsYXRpdmUgZmlsZSB3aXRoaW4gdGhpcyBzdG9yZS5cbiAgICogQHJldHVybnMgUGFyc2VkIEpTT04sIG9yIGB1bmRlZmluZWRgIGZvciBhbiBpbmNvbXBsZXRlIGRvY3VtZW50LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWQocGF0aDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdGhpcy5jaGVja1BhdGgocGF0aCk7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICB0ZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQocGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYXdhaXQgdGhpcy5hZGFwdGVyLmV4aXN0cyhwYXRoKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGlmICghdGV4dC5zdGFydHNXaXRoKERPQ1VNRU5UX1BSRUZJWCkgfHwgIXRleHQuZW5kc1dpdGgoRE9DVU1FTlRfU1VGRklYKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkOiB1bmtub3duID0gSlNPTi5wYXJzZSh0ZXh0LnNsaWNlKERPQ1VNRU5UX1BSRUZJWC5sZW5ndGgsIC1ET0NVTUVOVF9TVUZGSVgubGVuZ3RoKSk7XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHNuYXBzaG90IG9ubHkgYWZ0ZXIgZXZlcnkgbnVtYmVyZWQgY2h1bmsgYXJyaXZlcyBhbmQgcGFzc2VzIGl0cyBTSEEtMjU2IGNoZWNrLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIG1hbmlmZXN0IHBhdGguXG4gICAqIEByZXR1cm5zIEl0cyBwYXlsb2FkLCBvciBgdW5kZWZpbmVkYCB3aGlsZSBkZWxpdmVyeSBpcyBpbmNvbXBsZXRlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWRTbmFwc2hvdChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IHRoaXMucmVhZChwYXRoKTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbWFuaWZlc3QgIT09ICdvYmplY3QnIHx8IG1hbmlmZXN0ID09PSBudWxsIHx8ICEoJ2Zvcm1hdCcgaW4gbWFuaWZlc3QpIHx8IG1hbmlmZXN0LmZvcm1hdCAhPT0gMVxuICAgICAgfHwgISgnaGFzaGVzJyBpbiBtYW5pZmVzdCkgfHwgIUFycmF5LmlzQXJyYXkobWFuaWZlc3QuaGFzaGVzKVxuICAgICAgfHwgbWFuaWZlc3QuaGFzaGVzLmxlbmd0aCA9PT0gMCB8fCBtYW5pZmVzdC5oYXNoZXMuc29tZSgoaGFzaDogdW5rbm93bikgPT4gdHlwZW9mIGhhc2ggIT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2luZGV4LCBoYXNoXSBvZiBtYW5pZmVzdC5oYXNoZXMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBjaHVuayA9IGF3YWl0IHRoaXMucmVhZChgJHtwYXRoLnNsaWNlKDAsIC0nLm1kJy5sZW5ndGgpfS0ke1N0cmluZyhpbmRleCl9Lm1kYCk7XG4gICAgICBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyB8fCBhd2FpdCBkaWdlc3QoY2h1bmspICE9PSBoYXNoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZDogdW5rbm93biA9IEpTT04ucGFyc2UoY2h1bmtzLmpvaW4oJycpKTtcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBkb2N1bWVudCBvd25lZCBieSB0aGUgY2FsbGVyJ3MgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIGZpbGUgd2l0aGluIHRoaXMgc3RvcmUuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHJlbW92YWwuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVtb3ZlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZW1vdmUocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgY29tcGxldGUgZG9jdW1lbnQsIHJlZnVzaW5nIGFuIG92ZXJzaXplZCB3cml0ZSBiZWZvcmUgYWRhcHRlciBtdXRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBWYXVsdC1yZWxhdGl2ZSBmaWxlIHdpdGhpbiB0aGlzIHN0b3JlLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBKU09OLWNvbXBhdGlibGUgcGF5bG9hZC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgYWRhcHRlciBmaW5pc2hlcyB3cml0aW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdyaXRlKHBhdGg6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNoZWNrUGF0aChwYXRoKTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5lbmNvZGUodmFsdWUpO1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLycpO1xuICAgIHBhcnRzLnBvcCgpO1xuICAgIGxldCBmb2xkZXIgPSAnJztcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGZvbGRlciA9IGZvbGRlciA/IGAke2ZvbGRlcn0vJHtwYXJ0fWAgOiBwYXJ0O1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKGZvbGRlcikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIubWtkaXIoZm9sZGVyKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYWRhcHRlci5leGlzdHMoZm9sZGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuYWRhcHRlci53cml0ZShwYXRoLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYm91bmRlZCBpbW11dGFibGUgY2h1bmtzIGJlZm9yZSB0aGVpciBtYW5pZmVzdC4gUmVhZGVycyB2ZXJpZnkgZGVsaXZlcnkgY29tcGxldGVuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVW5pcXVlIGJhc2UgcGF0aCBhbmQgc25hcHNob3QgcGF5bG9hZC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFuaWZlc3QgaGFzIGJlZW4gcHVibGlzaGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdyaXRlU25hcHNob3QocGFyYW1zOiBEYXRhU3RvcmVUcmFuc3BvcnRXcml0ZVNuYXBzaG90UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcy5wYXlsb2FkKTtcbiAgICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NuYXBzaG90IG11c3QgYmUgSlNPTi1jb21wYXRpYmxlJyk7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICB3aGlsZSAob2Zmc2V0IDwgcGF5bG9hZC5sZW5ndGgpIHtcbiAgICAgIGxldCBsb3cgPSAxO1xuICAgICAgbGV0IGhpZ2ggPSBNYXRoLm1pbihwYXlsb2FkLmxlbmd0aCAtIG9mZnNldCwgdGhpcy5tYXhGaWxlQnl0ZXMpO1xuICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgY29uc3QgbWlkZGxlID0gTWF0aC5jZWlsKChsb3cgKyBoaWdoKSAvIEJJU0VDVElPTl9ESVZJU09SKTtcbiAgICAgICAgaWYgKHRoaXMuZml0cyhwYXlsb2FkLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbWlkZGxlKSkpIHtcbiAgICAgICAgICBsb3cgPSBtaWRkbGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGlnaCA9IG1pZGRsZSAtIDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNodW5rcy5wdXNoKHBheWxvYWQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsb3cpKTtcbiAgICAgIG9mZnNldCArPSBsb3c7XG4gICAgfVxuICAgIGNvbnN0IGhhc2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgICAgaGFzaGVzLnB1c2goYXdhaXQgZGlnZXN0KGNodW5rKSk7XG4gICAgfVxuICAgIGNvbnN0IG1hbmlmZXN0ID0geyBmb3JtYXQ6IDEsIGhhc2hlcyB9O1xuICAgIHRoaXMuY2hlY2tTaXplKHRoaXMuZW5jb2RlKG1hbmlmZXN0KSk7XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGNodW5rXSBvZiBjaHVua3MuZW50cmllcygpKSB7XG4gICAgICBhd2FpdCB0aGlzLndyaXRlKGAke3BhcmFtcy5iYXNlfS0ke1N0cmluZyhpbmRleCl9Lm1kYCwgY2h1bmspO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLndyaXRlKGAke3BhcmFtcy5iYXNlfS5tZGAsIG1hbmlmZXN0KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGAke3RoaXMucm9vdH0vYCkgfHwgIWlzU2FmZVZhdWx0UGF0aChwYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHBhdGggbGVhdmVzIGl0cyBjb25maWd1cmVkIGZvbGRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tTaXplKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNpemUgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodGV4dCkubGVuZ3RoO1xuICAgIGlmIChzaXplIDw9IHRoaXMubWF4RmlsZUJ5dGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgUGx1Z2luIGRhdGEgc3RvcmU6ICR7U3RyaW5nKHNpemUpfSBieXRlcyBleGNlZWRzIHRoZSAke1N0cmluZyh0aGlzLm1heEZpbGVCeXRlcyl9IGJ5dGUgZmlsZSBsaW1pdC5gO1xuICAgIG5ldyBOb3RpY2UobWVzc2FnZSk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignRGF0YVN0b3JlJykobWVzc2FnZSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmNvZGUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgaWYgKGpzb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHBheWxvYWQgbXVzdCBiZSBKU09OLWNvbXBhdGlibGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke0RPQ1VNRU5UX1BSRUZJWH0ke2pzb259JHtET0NVTUVOVF9TVUZGSVh9YDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkaWdlc3QodGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgaGFzaCA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0ZXh0KSk7XG4gIHJldHVybiBbLi4ubmV3IFVpbnQ4QXJyYXkoaGFzaCldLm1hcCgoYnl0ZSkgPT4gYnl0ZS50b1N0cmluZyhIRVhfUkFESVgpLnBhZFN0YXJ0KEhFWF9CWVRFX0xFTkdUSCwgJzAnKSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGlzU2FmZVZhdWx0UGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoJy8nKS5ldmVyeSgocGFydCkgPT4gcGFydC5sZW5ndGggPiAwICYmIHBhcnQgIT09ICcuJyAmJiBwYXJ0ICE9PSAnLi4nICYmICEvWzw+OlwiXFxcXHw/KlxccHtDb250cm9sfV18Wy4gXSQvdS50ZXN0KHBhcnQpKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBLHlCQUFrQztBQUNsQyxzQkFBdUI7QUFFdkIsbUJBQXVDO0FBRXZDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sWUFBWTtBQUNsQixNQUFNLGtCQUFrQjtBQWlEakIsTUFBTSxtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFtQnZCLFlBQStCLFFBQTZDO0FBQTdDO0FBQ3BDLFNBQUssVUFBVSxP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
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9kYXRhLXN0b3JlLXRyYW5zcG9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqXG4gKiBTaXplLWJvdW5kZWQgTWFya2Rvd24gb3IgSlNPTiB0cmFuc3BvcnQsIHdpdGggdmVyaWZpZWQgY2h1bmtlZCBzbmFwc2hvdHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEYXRhQWRhcHRlciB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgTm90aWNlIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuXG5jb25zdCBERUZBVUxUX01BWF9GSUxFX0JZVEVTID0gMV8wMDBfMDAwO1xuY29uc3QgTUlOX0ZJTEVfQllURVMgPSAyNTY7XG5jb25zdCBNQVhfRklMRV9CWVRFUyA9IDRfMDAwXzAwMDtcbmNvbnN0IE1BWF9TTkFQU0hPVF9CWVRFUyA9IDY0XzAwMF8wMDA7XG5jb25zdCBET0NVTUVOVF9QUkVGSVggPSAnYGBganNvblxcbic7XG5jb25zdCBET0NVTUVOVF9TVUZGSVggPSAnXFxuYGBgXFxuJztcbmNvbnN0IEJJU0VDVElPTl9ESVZJU09SID0gMjtcbmNvbnN0IEhFWF9SQURJWCA9IDE2O1xuY29uc3QgSEVYX0JZVEVfTEVOR1RIID0gMjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUgc2hhcmVkLXN0b3JlIHZhdWx0IHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVUcmFuc3BvcnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBWYXVsdCBhZGFwdGVyOyBubyBkZXNrdG9wIGZpbGVzeXN0ZW0gQVBJcyBhcmUgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFkYXB0ZXI6IERhdGFBZGFwdGVyO1xuICAvKipcbiAgICogVmF1bHQtcmVsYXRpdmUgZm9sZGVyLiBIaWRkZW4gc2VnbWVudHMgYXJlIGFsbG93ZWQ7IGNhbGxlcnMgbXVzdCBhcnJhbmdlIHRoZWlyIHN5bmNocm9uaXphdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdQbHVnaW4gZGF0YSdgXG4gICAqL1xuICByZWFkb25seSBmb2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEb2N1bWVudCBlbmNvZGluZy4gSlNPTiByZXF1aXJlcyBhIHN5bmMgdG9vbCBjb25maWd1cmVkIHRvIGNhcnJ5IGFyYml0cmFyeSBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdtYXJrZG93bidgXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiAnanNvbicgfCAnbWFya2Rvd24nO1xuICAvKipcbiAgICogTWF4aW11bSBVVEYtOCBieXRlcyBpbiBhbnkgZmlsZSwgaW5jbHVkaW5nIGl0cyBlbmNvZGluZyB3cmFwcGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heEZpbGVCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gVVRGLTggYnl0ZXMgaW4gdGhlIHJlY29uc3RydWN0ZWQgc25hcHNob3QsIGJlZm9yZSBKU09OIHBhcnNpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2NDAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heFNuYXBzaG90Qnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQbHVnaW4gbWFuaWZlc3QgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgbmFtZSBpbmNsdWRpbmcgaXRzIGNvbnN1bWVyIHNjaGVtYSB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHB1Ymxpc2hpbmcgYSBjaHVua2VkIHNuYXBzaG90LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTdG9yZVRyYW5zcG9ydFdyaXRlU25hcHNob3RQYXJhbXMge1xuICAvKipcbiAgICogVmF1bHQtcmVsYXRpdmUgYmFzZSBwYXRoIHdpdGhvdXQgaXRzIGV4dGVuc2lvbi4gVXNlIGEgZnJlc2ggdW5pcXVlIG5hbWUgZm9yIGV2ZXJ5IHB1YmxpY2F0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZTogc3RyaW5nO1xuICAvKipcbiAgICogSlNPTi1jb21wYXRpYmxlIHNuYXBzaG90LCBpbmNsdWRpbmcgaXRzIGNvbnN1bWVyIHNjaGVtYSBhbmQgY292ZXJhZ2UgbWV0YWRhdGEuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkOiB1bmtub3duO1xufVxuXG4vKipcbiAqIEEgc3RvcmUtc2NvcGVkIHRyYW5zcG9ydC4gRXZlcnkgcHVibGlzaGVkIGRvY3VtZW50IGlzIGltbXV0YWJsZSBleGNlcHQgZGV2aWNlIGFja25vd2xlZGdlbWVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhU3RvcmVUcmFuc3BvcnQge1xuICAvKipcbiAgRmlsZSBleHRlbnNpb24gZm9yIG5ldyBkb2N1bWVudHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXh0ZW5zaW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGVuY29kZWQgYnl0ZXMgcGVyIGRvY3VtZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1heEZpbGVCeXRlczogbnVtYmVyO1xuICAvKipcbiAgICogRnVsbCB2YXVsdC1yZWxhdGl2ZSBzdG9yZSByb290LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvb3Q6IHN0cmluZztcbiAgLyoqXG4gICAqIFZhdWx0IGFkYXB0ZXIgdXNlZCBieSB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhZGFwdGVyOiBEYXRhQWRhcHRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTbmFwc2hvdEJ5dGVzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBib3VuZGVkIHZhdWx0IHRyYW5zcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFkYXB0ZXIsIGlkZW50aXR5IGFuZCBmaWxlIGJvdW5kcy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcGFyYW1zOiBEYXRhU3RvcmVUcmFuc3BvcnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWRhcHRlciA9IHBhcmFtcy5hZGFwdGVyO1xuICAgIHRoaXMuZXh0ZW5zaW9uID0gcGFyYW1zLmZvcm1hdCA9PT0gJ2pzb24nID8gJy5qc29uJyA6ICcubWQnO1xuICAgIGNvbnN0IGZvbGRlciA9IHBhcmFtcy5mb2xkZXIgPz8gJ1BsdWdpbiBkYXRhJztcbiAgICBpZiAoXG4gICAgICAhaXNTYWZlVmF1bHRQYXRoKGZvbGRlcilcbiAgICAgIHx8ICEvXltcXHctXSskLy50ZXN0KHBhcmFtcy5wbHVnaW5JZCkgfHwgIS9eW1xcdy1dKyQvLnRlc3QocGFyYW1zLnN0b3JlSWQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgc3RvcmUgcmVxdWlyZXMgYSBzYWZlIHZhdWx0LXJlbGF0aXZlIGZvbGRlciBhbmQgc2FmZSBwbHVnaW4vc3RvcmUgaWRzJyk7XG4gICAgfVxuICAgIHRoaXMucm9vdCA9IGAke2ZvbGRlcn0vJHtwYXJhbXMucGx1Z2luSWR9LyR7cGFyYW1zLnN0b3JlSWR9YDtcbiAgICB0aGlzLm1heEZpbGVCeXRlcyA9IHBhcmFtcy5tYXhGaWxlQnl0ZXMgPz8gREVGQVVMVF9NQVhfRklMRV9CWVRFUztcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHRoaXMubWF4RmlsZUJ5dGVzKSB8fCB0aGlzLm1heEZpbGVCeXRlcyA8IE1JTl9GSUxFX0JZVEVTIHx8IHRoaXMubWF4RmlsZUJ5dGVzID4gTUFYX0ZJTEVfQllURVMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBmaWxlIGxpbWl0IG11c3QgYmUgYmV0d2VlbiAyNTYgYW5kIDQwMDAwMDAgYnl0ZXMnKTtcbiAgICB9XG4gICAgdGhpcy5tYXhTbmFwc2hvdEJ5dGVzID0gcGFyYW1zLm1heFNuYXBzaG90Qnl0ZXMgPz8gTUFYX1NOQVBTSE9UX0JZVEVTO1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodGhpcy5tYXhTbmFwc2hvdEJ5dGVzKSB8fCB0aGlzLm1heFNuYXBzaG90Qnl0ZXMgPCBNSU5fRklMRV9CWVRFUyB8fCB0aGlzLm1heFNuYXBzaG90Qnl0ZXMgPiBNQVhfU05BUFNIT1RfQllURVMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBzbmFwc2hvdCBsaW1pdCBtdXN0IGJlIGJldHdlZW4gMjU2IGFuZCA2NDAwMDAwMCBieXRlcycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgaGlzdG9yeSBieXRlIGZvciBieXRlLCBwcmVzZXJ2aW5nIHNvdXJjZSBmaWxlcyBhbmQgcmVmdXNpbmcgY29uZmxpY3RpbmcgaW1tdXRhYmxlIGRlc3RpbmF0aW9ucy5cbiAgICogQWNrbm93bGVkZ2VtZW50cyBhcmUgbG9jYWwgdG8gZWFjaCBsb2NhdGlvbiBhbmQgYXJlIG5vdCBjb3BpZWQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBEZXN0aW5hdGlvbiBmb3IgdGhpcyBzYW1lIHBsdWdpbiBhbmQgc3RvcmUuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGV2ZXJ5IGNvcGllZCBmaWxlIGhhcyBiZWVuIHZlcmlmaWVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvcHlIaXN0b3J5VG8odGFyZ2V0OiBEYXRhU3RvcmVUcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5wYXJhbXMucGx1Z2luSWQgIT09IHRhcmdldC5wYXJhbXMucGx1Z2luSWQgfHwgdGhpcy5wYXJhbXMuc3RvcmVJZCAhPT0gdGFyZ2V0LnBhcmFtcy5zdG9yZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb3B5IGRhdGEtc3RvcmUgaGlzdG9yeSB0byBhIGRpZmZlcmVudCBzdG9yZScpO1xuICAgIH1cbiAgICBjb25zdCBhbGxGaWxlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IGZpbGVzID0gYWxsRmlsZXMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy5yb290fS9kZXZpY2VzL2ApKTtcbiAgICBjb25zdCBjb21wbGV0ZSA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBmaWxlcykge1xuICAgICAgaWYgKC9cXC9sb2ctXFxkK1xcLig/Om1kfGpzb24pJC8udGVzdChwYXRoKSAmJiBhd2FpdCB0aGlzLnJlYWQocGF0aCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb21wbGV0ZS5hZGQocGF0aCk7XG4gICAgICB9XG4gICAgICBpZiAoIS9cXC9zbmFwc2hvdC1bXFx3LV0rLW1hbmlmZXN0XFwuKD86bWR8anNvbikkLy50ZXN0KHBhdGgpIHx8IGF3YWl0IHRoaXMucmVhZFNuYXBzaG90KHBhdGgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmVuZHNXaXRoKCcuanNvbicpID8gJy5qc29uJyA6ICcubWQnO1xuICAgICAgY29uc3QgYmFzZSA9IHBhdGguc2xpY2UoMCwgLWV4dGVuc2lvbi5sZW5ndGgpO1xuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBmaWxlcykge1xuICAgICAgICBpZiAoY2h1bmsuc3RhcnRzV2l0aChgJHtiYXNlfS1gKSAmJiBjaHVuay5lbmRzV2l0aChleHRlbnNpb24pKSB7XG4gICAgICAgICAgY29tcGxldGUuYWRkKGNodW5rKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29tcGxldGUuYWRkKHBhdGgpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgY29tcGxldGUpIHtcbiAgICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHBhdGgpO1xuICAgICAgdGhpcy5jaGVja1NpemUodGV4dCk7XG4gICAgICB0YXJnZXQuY2hlY2tTaXplKHRleHQpO1xuICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0YXJnZXQucm9vdCArIHBhdGguc2xpY2UodGhpcy5yb290Lmxlbmd0aCk7XG4gICAgICB0YXJnZXQuY2hlY2tQYXRoKGRlc3RpbmF0aW9uKTtcbiAgICAgIGlmIChhd2FpdCB0YXJnZXQuYWRhcHRlci5leGlzdHMoZGVzdGluYXRpb24pKSB7XG4gICAgICAgIGlmIChhd2FpdCB0YXJnZXQuYWRhcHRlci5yZWFkKGRlc3RpbmF0aW9uKSAhPT0gdGV4dCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmxpY3RpbmcgaW1tdXRhYmxlIGRhdGEtc3RvcmUgaGlzdG9yeScpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0YXJnZXQuZW5zdXJlUGFyZW50KGRlc3RpbmF0aW9uKTtcbiAgICAgICAgYXdhaXQgdGFyZ2V0LmFkYXB0ZXIud3JpdGUoZGVzdGluYXRpb24sIHRleHQpO1xuICAgICAgfVxuICAgICAgaWYgKGF3YWl0IHRhcmdldC5hZGFwdGVyLnJlYWQoZGVzdGluYXRpb24pICE9PSB0ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBoaXN0b3J5IGNvcHkgZmFpbGVkIHZlcmlmaWNhdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyB0aGUgY29tcGxldGUgZW5jb2RlZCBzaXplIHdpdGhvdXQgd3JpdGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gSlNPTiBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGl0cyBkb2N1bWVudCBmaXRzIHRoZSBjb25maWd1cmVkIGNhcC5cbiAgICovXG4gIHB1YmxpYyBmaXRzKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0aGlzLmVuY29kZSh2YWx1ZSkpLmxlbmd0aCA8PSB0aGlzLm1heEZpbGVCeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyB0aGUgc3RvcmUncyBmaWxlcyByZWN1cnNpdmVseSwgbmV2ZXIgbGVhdmluZyBpdHMgZm9sZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBWYXVsdC1yZWxhdGl2ZSBwYXRocy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsaXN0KCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBpZiAoIWF3YWl0IHRoaXMuYWRhcHRlci5leGlzdHModGhpcy5yb290KSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBwZW5kaW5nID0gW3RoaXMucm9vdF07XG4gICAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZm9sZGVyID0gZW5zdXJlTm9uTnVsbGFibGUocGVuZGluZy5zaGlmdCgpKTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gYXdhaXQgdGhpcy5hZGFwdGVyLmxpc3QoZm9sZGVyKTtcbiAgICAgIGZpbGVzLnB1c2goLi4uY2hpbGRyZW4uZmlsZXMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7Zm9sZGVyfS9gKSkpO1xuICAgICAgcGVuZGluZy5wdXNoKC4uLmNoaWxkcmVuLmZvbGRlcnMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7Zm9sZGVyfS9gKSkpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZXMuc29ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGNvbXBsZXRlIGZlbmNlZCBNYXJrZG93biBKU09OIG9yIGEgdmVyc2lvbi1vbmUgSlNPTiBlbnZlbG9wZS4gUGFydGlhbCBkb2N1bWVudHMgcmVtYWluIHBlbmRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVmF1bHQtcmVsYXRpdmUgZmlsZSB3aXRoaW4gdGhpcyBzdG9yZS5cbiAgICogQHJldHVybnMgUGFyc2VkIEpTT04sIG9yIGB1bmRlZmluZWRgIGZvciBhbiBpbmNvbXBsZXRlIGRvY3VtZW50LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWQocGF0aDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdGhpcy5jaGVja1BhdGgocGF0aCk7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICB0ZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQocGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYXdhaXQgdGhpcy5hZGFwdGVyLmV4aXN0cyhwYXRoKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGlmIChwYXRoLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICBsZXQgZG9jdW1lbnQ6IHVua25vd247XG4gICAgICB0cnkge1xuICAgICAgICBkb2N1bWVudCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICdvYmplY3QnIHx8IGRvY3VtZW50ID09PSBudWxsIHx8ICEoJ2Zvcm1hdCcgaW4gZG9jdW1lbnQpIHx8IGRvY3VtZW50LmZvcm1hdCAhPT0gMSB8fCAhKCdwYXlsb2FkJyBpbiBkb2N1bWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04gZGF0YS1zdG9yZSBkb2N1bWVudCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvY3VtZW50LnBheWxvYWQ7XG4gICAgfVxuICAgIGlmICghdGV4dC5zdGFydHNXaXRoKERPQ1VNRU5UX1BSRUZJWCkgfHwgIXRleHQuZW5kc1dpdGgoRE9DVU1FTlRfU1VGRklYKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkOiB1bmtub3duID0gSlNPTi5wYXJzZSh0ZXh0LnNsaWNlKERPQ1VNRU5UX1BSRUZJWC5sZW5ndGgsIC1ET0NVTUVOVF9TVUZGSVgubGVuZ3RoKSk7XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHNuYXBzaG90IG9ubHkgYWZ0ZXIgZXZlcnkgbnVtYmVyZWQgY2h1bmsgYXJyaXZlcyBhbmQgcGFzc2VzIGl0cyBTSEEtMjU2IGNoZWNrLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIG1hbmlmZXN0IHBhdGguXG4gICAqIEByZXR1cm5zIEl0cyBwYXlsb2FkLCBvciBgdW5kZWZpbmVkYCB3aGlsZSBkZWxpdmVyeSBpcyBpbmNvbXBsZXRlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWRTbmFwc2hvdChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IHRoaXMucmVhZChwYXRoKTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbWFuaWZlc3QgIT09ICdvYmplY3QnIHx8IG1hbmlmZXN0ID09PSBudWxsIHx8ICEoJ2Zvcm1hdCcgaW4gbWFuaWZlc3QpIHx8IG1hbmlmZXN0LmZvcm1hdCAhPT0gMVxuICAgICAgfHwgISgnaGFzaGVzJyBpbiBtYW5pZmVzdCkgfHwgIUFycmF5LmlzQXJyYXkobWFuaWZlc3QuaGFzaGVzKVxuICAgICAgfHwgbWFuaWZlc3QuaGFzaGVzLmxlbmd0aCA9PT0gMCB8fCBtYW5pZmVzdC5oYXNoZXMuc29tZSgoaGFzaDogdW5rbm93bikgPT4gdHlwZW9mIGhhc2ggIT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBieXRlcyA9IDA7XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGhhc2hdIG9mIG1hbmlmZXN0Lmhhc2hlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZW5kc1dpdGgoJy5qc29uJykgPyAnLmpzb24nIDogJy5tZCc7XG4gICAgICBjb25zdCBjaHVuayA9IGF3YWl0IHRoaXMucmVhZChgJHtwYXRoLnNsaWNlKDAsIC1leHRlbnNpb24ubGVuZ3RoKX0tJHtTdHJpbmcoaW5kZXgpfSR7ZXh0ZW5zaW9ufWApO1xuICAgICAgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgfHwgYXdhaXQgZGlnZXN0KGNodW5rKSAhPT0gaGFzaCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYnl0ZXMgKz0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGNodW5rKS5sZW5ndGg7XG4gICAgICBpZiAoYnl0ZXMgPiB0aGlzLm1heFNuYXBzaG90Qnl0ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHNuYXBzaG90IGV4Y2VlZHMgZGVjb2RlZCBieXRlIGxpbWl0Jyk7XG4gICAgICB9XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZDogdW5rbm93biA9IEpTT04ucGFyc2UoY2h1bmtzLmpvaW4oJycpKTtcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBkb2N1bWVudCBvd25lZCBieSB0aGUgY2FsbGVyJ3MgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIGZpbGUgd2l0aGluIHRoaXMgc3RvcmUuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHJlbW92YWwuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVtb3ZlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZW1vdmUocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgY29tcGxldGUgZG9jdW1lbnQsIHJlZnVzaW5nIGFuIG92ZXJzaXplZCB3cml0ZSBiZWZvcmUgYWRhcHRlciBtdXRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBWYXVsdC1yZWxhdGl2ZSBmaWxlIHdpdGhpbiB0aGlzIHN0b3JlLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBKU09OLWNvbXBhdGlibGUgcGF5bG9hZC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgYWRhcHRlciBmaW5pc2hlcyB3cml0aW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdyaXRlKHBhdGg6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNoZWNrUGF0aChwYXRoKTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5lbmNvZGUodmFsdWUsIHBhdGguZW5kc1dpdGgoJy5qc29uJykpO1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50KHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci53cml0ZShwYXRoLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYW4gaW1tdXRhYmxlIGRvY3VtZW50LCBhY2NlcHRpbmcgb25seSBieXRlLWlkZW50aWNhbCByZXRyaWVzIGF0IGFuIG9jY3VwaWVkIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVmF1bHQtcmVsYXRpdmUgZGVzdGluYXRpb24gd2l0aGluIHRoaXMgc3RvcmUuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBwdWJsaWNhdGlvbiBvciBhbiBpZGVudGljYWwgcmV0cnkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd3JpdGVJbW11dGFibGUocGF0aDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmVuY29kZSh2YWx1ZSwgcGF0aC5lbmRzV2l0aCgnLmpzb24nKSk7XG4gICAgdGhpcy5jaGVja1NpemUodGV4dCk7XG4gICAgaWYgKGF3YWl0IHRoaXMuYWRhcHRlci5leGlzdHMocGF0aCkpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZChwYXRoKSAhPT0gdGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZsaWN0aW5nIGltbXV0YWJsZSBkYXRhLXN0b3JlIGRvY3VtZW50Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50KHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci53cml0ZShwYXRoLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYm91bmRlZCBpbW11dGFibGUgY2h1bmtzIGJlZm9yZSB0aGVpciBtYW5pZmVzdC4gUmVhZGVycyB2ZXJpZnkgZGVsaXZlcnkgY29tcGxldGVuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVW5pcXVlIGJhc2UgcGF0aCBhbmQgc25hcHNob3QgcGF5bG9hZC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFuaWZlc3QgaGFzIGJlZW4gcHVibGlzaGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdyaXRlU25hcHNob3QocGFyYW1zOiBEYXRhU3RvcmVUcmFuc3BvcnRXcml0ZVNuYXBzaG90UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcy5wYXlsb2FkKTtcbiAgICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NuYXBzaG90IG11c3QgYmUgSlNPTi1jb21wYXRpYmxlJyk7XG4gICAgfVxuICAgIGlmIChuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocGF5bG9hZCkubGVuZ3RoID4gdGhpcy5tYXhTbmFwc2hvdEJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgc25hcHNob3QgZXhjZWVkcyBkZWNvZGVkIGJ5dGUgbGltaXQnKTtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHdoaWxlIChvZmZzZXQgPCBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgbGV0IGxvdyA9IDE7XG4gICAgICBsZXQgaGlnaCA9IE1hdGgubWluKHBheWxvYWQubGVuZ3RoIC0gb2Zmc2V0LCB0aGlzLm1heEZpbGVCeXRlcyk7XG4gICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmNlaWwoKGxvdyArIGhpZ2gpIC8gQklTRUNUSU9OX0RJVklTT1IpO1xuICAgICAgICBpZiAodGhpcy5maXRzKHBheWxvYWQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBtaWRkbGUpKSkge1xuICAgICAgICAgIGxvdyA9IG1pZGRsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoaWdoID0gbWlkZGxlIC0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2h1bmtzLnB1c2gocGF5bG9hZC5zbGljZShvZmZzZXQsIG9mZnNldCArIGxvdykpO1xuICAgICAgb2Zmc2V0ICs9IGxvdztcbiAgICB9XG4gICAgY29uc3QgaGFzaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICBoYXNoZXMucHVzaChhd2FpdCBkaWdlc3QoY2h1bmspKTtcbiAgICB9XG4gICAgY29uc3QgbWFuaWZlc3QgPSB7IGZvcm1hdDogMSwgaGFzaGVzIH07XG4gICAgdGhpcy5jaGVja1NpemUodGhpcy5lbmNvZGUobWFuaWZlc3QpKTtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY2h1bmtdIG9mIGNodW5rcy5lbnRyaWVzKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGUoYCR7cGFyYW1zLmJhc2V9LSR7U3RyaW5nKGluZGV4KX0ke3RoaXMuZXh0ZW5zaW9ufWAsIGNodW5rKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53cml0ZShgJHtwYXJhbXMuYmFzZX0ke3RoaXMuZXh0ZW5zaW9ufWAsIG1hbmlmZXN0KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGAke3RoaXMucm9vdH0vYCkgfHwgIWlzU2FmZVZhdWx0UGF0aChwYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHBhdGggbGVhdmVzIGl0cyBjb25maWd1cmVkIGZvbGRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tTaXplKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNpemUgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodGV4dCkubGVuZ3RoO1xuICAgIGlmIChzaXplIDw9IHRoaXMubWF4RmlsZUJ5dGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgUGx1Z2luIGRhdGEgc3RvcmU6ICR7U3RyaW5nKHNpemUpfSBieXRlcyBleGNlZWRzIHRoZSAke1N0cmluZyh0aGlzLm1heEZpbGVCeXRlcyl9IGJ5dGUgZmlsZSBsaW1pdC5gO1xuICAgIG5ldyBOb3RpY2UobWVzc2FnZSk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignRGF0YVN0b3JlJykobWVzc2FnZSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmNvZGUodmFsdWU6IHVua25vd24sIGlzSnNvbiA9IHRoaXMuZXh0ZW5zaW9uID09PSAnLmpzb24nKTogc3RyaW5nIHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIGlmIChqc29uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBwYXlsb2FkIG11c3QgYmUgSlNPTi1jb21wYXRpYmxlJyk7XG4gICAgfVxuICAgIHJldHVybiBpc0pzb24gPyBKU09OLnN0cmluZ2lmeSh7IGZvcm1hdDogMSwgcGF5bG9hZDogdmFsdWUgfSkgOiBgJHtET0NVTUVOVF9QUkVGSVh9JHtqc29ufSR7RE9DVU1FTlRfU1VGRklYfWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZVBhcmVudChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy8nKTtcbiAgICBwYXJ0cy5wb3AoKTtcbiAgICBsZXQgZm9sZGVyID0gJyc7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBmb2xkZXIgPSBmb2xkZXIgPyBgJHtmb2xkZXJ9LyR7cGFydH1gIDogcGFydDtcbiAgICAgIGlmICghYXdhaXQgdGhpcy5hZGFwdGVyLmV4aXN0cyhmb2xkZXIpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLm1rZGlyKGZvbGRlcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKGZvbGRlcikpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkaWdlc3QodGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgaGFzaCA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0ZXh0KSk7XG4gIHJldHVybiBbLi4ubmV3IFVpbnQ4QXJyYXkoaGFzaCldLm1hcCgoYnl0ZSkgPT4gYnl0ZS50b1N0cmluZyhIRVhfUkFESVgpLnBhZFN0YXJ0KEhFWF9CWVRFX0xFTkdUSCwgJzAnKSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGlzU2FmZVZhdWx0UGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoJy8nKS5ldmVyeSgocGFydCkgPT4gcGFydC5sZW5ndGggPiAwICYmIHBhcnQgIT09ICcuJyAmJiBwYXJ0ICE9PSAnLi4nICYmICEvWzw+OlwiXFxcXHw/KlxccHtDb250cm9sfV18Wy4gXSQvdS50ZXN0KHBhcnQpKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBLHlCQUFrQztBQUNsQyxzQkFBdUI7QUFFdkIsbUJBQXVDO0FBRXZDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0scUJBQXFCO0FBQzNCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sWUFBWTtBQUNsQixNQUFNLGtCQUFrQjtBQTZEakIsTUFBTSxtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUF3QnZCLFlBQStCLFFBQTZDO0FBQTdDO0FBQ3BDLFNBQUssVUFBVSxPQUFPO0FBQ3RCLFNBQUssWUFBWSxPQUFPLFdBQVcsU0FBUyxVQUFVO0FBQ3RELFVBQU0sU0FBUyxPQUFPLFVBQVU7QUFDaEMsUUFDRSxDQUFDLGdCQUFnQixNQUFNLEtBQ3BCLENBQUMsV0FBVyxLQUFLLE9BQU8sUUFBUSxLQUFLLENBQUMsV0FBVyxLQUFLLE9BQU8sT0FBTyxHQUN2RTtBQUNBLFlBQU0sSUFBSSxNQUFNLDRFQUE0RTtBQUFBLElBQzlGO0FBQ0EsU0FBSyxPQUFPLEdBQUcsTUFBTSxJQUFJLE9BQU8sUUFBUSxJQUFJLE9BQU8sT0FBTztBQUMxRCxTQUFLLGVBQWUsT0FBTyxnQkFBZ0I7QUFDM0MsUUFBSSxDQUFDLE9BQU8sY0FBYyxLQUFLLFlBQVksS0FBSyxLQUFLLGVBQWUsa0JBQWtCLEtBQUssZUFBZSxnQkFBZ0I7QUFDeEgsWUFBTSxJQUFJLE1BQU0sNkRBQTZEO0FBQUEsSUFDL0U7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
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * @file
4
4
  *
5
- * Size-bounded Markdown transport carried by vault synchronization with default file types.
5
+ * Size-bounded Markdown or JSON transport, with verified chunked snapshots.
6
6
  */
7
7
  import type { DataAdapter } from 'obsidian' with { 'resolution-mode': 'import' };
8
8
  /**
@@ -20,11 +20,23 @@ export interface DataStoreTransportConstructorParams {
20
20
  */
21
21
  readonly folder?: string;
22
22
  /**
23
- * Maximum UTF-8 bytes in any file, including its Markdown wrapper.
23
+ * Document encoding. JSON requires a sync tool configured to carry arbitrary files.
24
+ *
25
+ * @default `'markdown'`
26
+ */
27
+ readonly format?: 'json' | 'markdown';
28
+ /**
29
+ * Maximum UTF-8 bytes in any file, including its encoding wrapper.
24
30
  *
25
31
  * @default `1000000`
26
32
  */
27
33
  readonly maxFileBytes?: number;
34
+ /**
35
+ * Maximum UTF-8 bytes in the reconstructed snapshot, before JSON parsing.
36
+ *
37
+ * @default `64000000`
38
+ */
39
+ readonly maxSnapshotBytes?: number;
28
40
  /**
29
41
  * Plugin manifest id.
30
42
  */
@@ -39,7 +51,7 @@ export interface DataStoreTransportConstructorParams {
39
51
  */
40
52
  export interface DataStoreTransportWriteSnapshotParams {
41
53
  /**
42
- * Vault-relative base path without the `.md` extension. Use a fresh unique name for every publication.
54
+ * Vault-relative base path without its extension. Use a fresh unique name for every publication.
43
55
  */
44
56
  readonly base: string;
45
57
  /**
@@ -52,6 +64,10 @@ export interface DataStoreTransportWriteSnapshotParams {
52
64
  */
53
65
  export declare class DataStoreTransport {
54
66
  protected readonly params: DataStoreTransportConstructorParams;
67
+ /**
68
+ File extension for new documents.
69
+ */
70
+ readonly extension: string;
55
71
  /**
56
72
  * Maximum encoded bytes per document.
57
73
  */
@@ -64,12 +80,21 @@ export declare class DataStoreTransport {
64
80
  * Vault adapter used by this transport.
65
81
  */
66
82
  protected readonly adapter: DataAdapter;
83
+ private readonly maxSnapshotBytes;
67
84
  /**
68
85
  * Creates a bounded vault transport.
69
86
  *
70
87
  * @param params - Adapter, identity and file bounds.
71
88
  */
72
89
  constructor(params: DataStoreTransportConstructorParams);
90
+ /**
91
+ * Copies history byte for byte, preserving source files and refusing conflicting immutable destinations.
92
+ * Acknowledgements are local to each location and are not copied.
93
+ *
94
+ * @param target - Destination for this same plugin and store.
95
+ * @returns A promise that resolves after every copied file has been verified.
96
+ */
97
+ copyHistoryTo(target: DataStoreTransport): Promise<void>;
73
98
  /**
74
99
  * Tests the complete encoded size without writing.
75
100
  *
@@ -84,7 +109,7 @@ export declare class DataStoreTransport {
84
109
  */
85
110
  list(): Promise<string[]>;
86
111
  /**
87
- * Reads a complete fenced JSON document. Partial or not-yet-delivered documents are ignored.
112
+ * Reads complete fenced Markdown JSON or a version-one JSON envelope. Partial documents remain pending.
88
113
  *
89
114
  * @param path - Vault-relative file within this store.
90
115
  * @returns Parsed JSON, or `undefined` for an incomplete document.
@@ -112,6 +137,14 @@ export declare class DataStoreTransport {
112
137
  * @returns A promise that resolves once the adapter finishes writing.
113
138
  */
114
139
  write(path: string, value: unknown): Promise<void>;
140
+ /**
141
+ * Publishes an immutable document, accepting only byte-identical retries at an occupied path.
142
+ *
143
+ * @param path - Vault-relative destination within this store.
144
+ * @param value - JSON-compatible payload.
145
+ * @returns A promise that resolves after publication or an identical retry.
146
+ */
147
+ writeImmutable(path: string, value: unknown): Promise<void>;
115
148
  /**
116
149
  * Publishes bounded immutable chunks before their manifest. Readers verify delivery completeness.
117
150
  *
@@ -122,4 +155,5 @@ export declare class DataStoreTransport {
122
155
  private checkPath;
123
156
  private checkSize;
124
157
  private encode;
158
+ private ensureParent;
125
159
  }
@@ -97,6 +97,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
97
97
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
98
98
  var data_stores_exports = {};
99
99
  __export(data_stores_exports, {
100
+ "data-store-locations": () => data_store_locations,
100
101
  "data-store-replica": () => data_store_replica,
101
102
  "data-store-seeds": () => data_store_seeds,
102
103
  "data-store-transport": () => data_store_transport,
@@ -104,6 +105,7 @@ __export(data_stores_exports, {
104
105
  "shared-data-store": () => shared_data_store
105
106
  });
106
107
  module.exports = __toCommonJS(data_stores_exports);
108
+ var data_store_locations = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./data-store-locations.cjs')), 1);
107
109
  var data_store_replica = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./data-store-replica.cjs')), 1);
108
110
  var data_store_seeds = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./data-store-seeds.cjs')), 1);
109
111
  var data_store_transport = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./data-store-transport.cjs')), 1);
@@ -111,10 +113,11 @@ var local_data_store = __toESM(((module) => module && module.__esModule && 'defa
111
113
  var shared_data_store = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./shared-data-store.cjs')), 1);
112
114
  // Annotate the CommonJS export names for ESM import in node:
113
115
  0 && (module.exports = {
116
+ "data-store-locations": null,
114
117
  "data-store-replica": null,
115
118
  "data-store-seeds": null,
116
119
  "data-store-transport": null,
117
120
  "local-data-store": null,
118
121
  "shared-data-store": null
119
122
  });
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2RhdGEtc3RvcmUtcmVwbGljYScgZnJvbSAnLi9kYXRhLXN0b3JlLXJlcGxpY2EudHMnO1xuZXhwb3J0ICogYXMgJ2RhdGEtc3RvcmUtc2VlZHMnIGZyb20gJy4vZGF0YS1zdG9yZS1zZWVkcy50cyc7XG5leHBvcnQgKiBhcyAnZGF0YS1zdG9yZS10cmFuc3BvcnQnIGZyb20gJy4vZGF0YS1zdG9yZS10cmFuc3BvcnQudHMnO1xuZXhwb3J0ICogYXMgJ2xvY2FsLWRhdGEtc3RvcmUnIGZyb20gJy4vbG9jYWwtZGF0YS1zdG9yZS50cyc7XG5leHBvcnQgKiBhcyAnc2hhcmVkLWRhdGEtc3RvcmUnIGZyb20gJy4vc2hhcmVkLWRhdGEtc3RvcmUudHMnO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBLDhCQUFBQTtBQUFBLEVBQUEsMEJBQUFDO0FBQUEsRUFBQSw4QkFBQUM7QUFBQSxFQUFBLDBCQUFBQztBQUFBLEVBQUEsMkJBQUFDO0FBQUE7QUFBQTtBQUVBLElBQUFKLHFCQUFzQztBQUN0QyxJQUFBQyxtQkFBb0M7QUFDcEMsSUFBQUMsdUJBQXdDO0FBQ3hDLElBQUFDLG1CQUFvQztBQUNwQyxJQUFBQyxvQkFBcUM7IiwibmFtZXMiOlsiZGF0YS1zdG9yZS1yZXBsaWNhIiwiZGF0YS1zdG9yZS1zZWVkcyIsImRhdGEtc3RvcmUtdHJhbnNwb3J0IiwibG9jYWwtZGF0YS1zdG9yZSIsInNoYXJlZC1kYXRhLXN0b3JlIl19
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2RhdGEtc3RvcmUtbG9jYXRpb25zJyBmcm9tICcuL2RhdGEtc3RvcmUtbG9jYXRpb25zLnRzJztcbmV4cG9ydCAqIGFzICdkYXRhLXN0b3JlLXJlcGxpY2EnIGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmV4cG9ydCAqIGFzICdkYXRhLXN0b3JlLXNlZWRzJyBmcm9tICcuL2RhdGEtc3RvcmUtc2VlZHMudHMnO1xuZXhwb3J0ICogYXMgJ2RhdGEtc3RvcmUtdHJhbnNwb3J0JyBmcm9tICcuL2RhdGEtc3RvcmUtdHJhbnNwb3J0LnRzJztcbmV4cG9ydCAqIGFzICdsb2NhbC1kYXRhLXN0b3JlJyBmcm9tICcuL2xvY2FsLWRhdGEtc3RvcmUudHMnO1xuZXhwb3J0ICogYXMgJ3NoYXJlZC1kYXRhLXN0b3JlJyBmcm9tICcuL3NoYXJlZC1kYXRhLXN0b3JlLnRzJztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQSxnQ0FBQUE7QUFBQSxFQUFBLDRCQUFBQztBQUFBLEVBQUEsMEJBQUFDO0FBQUEsRUFBQSw4QkFBQUM7QUFBQSxFQUFBLDBCQUFBQztBQUFBLEVBQUEsMkJBQUFDO0FBQUE7QUFBQTtBQUVBLElBQUFMLHVCQUF3QztBQUN4QyxJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsbUJBQW9DO0FBQ3BDLElBQUFDLHVCQUF3QztBQUN4QyxJQUFBQyxtQkFBb0M7QUFDcEMsSUFBQUMsb0JBQXFDOyIsIm5hbWVzIjpbImRhdGEtc3RvcmUtbG9jYXRpb25zIiwiZGF0YS1zdG9yZS1yZXBsaWNhIiwiZGF0YS1zdG9yZS1zZWVkcyIsImRhdGEtc3RvcmUtdHJhbnNwb3J0IiwibG9jYWwtZGF0YS1zdG9yZSIsInNoYXJlZC1kYXRhLXN0b3JlIl19
@@ -1,4 +1,5 @@
1
1
  /// <reference path="../library-references.d.cts" />
2
+ export * as 'data-store-locations' from './data-store-locations.cjs';
2
3
  export * as 'data-store-replica' from './data-store-replica.cjs';
3
4
  export * as 'data-store-seeds' from './data-store-seeds.cjs';
4
5
  export * as 'data-store-transport' from './data-store-transport.cjs';