sliftutils 1.7.49 → 1.7.50

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.
@@ -74,6 +74,7 @@ export declare class ArchivesRemote implements IArchives {
74
74
  getSyncStatus(): Promise<ArchivesSyncStatus>;
75
75
  setLargeFile(config: {
76
76
  path: string;
77
+ lastModified?: number;
77
78
  getNextData(): Promise<Buffer | undefined>;
78
79
  }): Promise<void>;
79
80
  getURL(path: string): Promise<string>;
@@ -171,10 +171,10 @@ export class ArchivesRemote implements IArchives {
171
171
  return await this.call(() => this.controller.getSyncStatus(this.account, this.bucketName));
172
172
  }
173
173
 
174
- public async setLargeFile(config: { path: string; getNextData(): Promise<Buffer | undefined> }): Promise<void> {
174
+ public async setLargeFile(config: { path: string; lastModified?: number; getNextData(): Promise<Buffer | undefined> }): Promise<void> {
175
175
  // Ensure we're authenticated with access BEFORE consuming any data (the stream cannot be rewound, so we can't use the retry loop around the actual upload)
176
176
  await this.call(() => this.controller.getInfo(this.account, this.bucketName, config.path));
177
- let uploadId = await this.controller.startLargeFile(this.account, this.bucketName, config.path);
177
+ let uploadId = await this.controller.startLargeFile(this.account, this.bucketName, config.path, config.lastModified);
178
178
  try {
179
179
  while (true) {
180
180
  let data = await config.getNextData();
@@ -61,7 +61,7 @@ export type IBucketStore = {
61
61
  }>;
62
62
  startLargeUpload(): Promise<string>;
63
63
  appendLargeUpload(id: string, data: Buffer): Promise<void>;
64
- finishLargeUpload(id: string, key: string): Promise<void>;
64
+ finishLargeUpload(id: string, key: string, lastModified?: number): Promise<void>;
65
65
  cancelLargeUpload(id: string): Promise<void>;
66
66
  };
67
67
  export type BlobSourceSpec = {
@@ -190,7 +190,7 @@ export declare class BlobStore implements IBucketStore {
190
190
  private getDiskSource;
191
191
  startLargeUpload(): Promise<string>;
192
192
  appendLargeUpload(id: string, data: Buffer): Promise<void>;
193
- finishLargeUpload(id: string, key: string): Promise<void>;
193
+ finishLargeUpload(id: string, key: string, lastModified?: number): Promise<void>;
194
194
  cancelLargeUpload(id: string): Promise<void>;
195
195
  private flushOverlay;
196
196
  private evicting;
@@ -5,7 +5,7 @@ import { timeInMinute, sort, promiseObj } from "socket-function/src/misc";
5
5
  import { formatNumber, formatTime } from "socket-function/src/formatting/format";
6
6
  import {
7
7
  IArchives, ArchiveFileInfo, ArchivesSource, ArchivesSyncStatus, ChangesAfterConfig, assertValidLastModified,
8
- windowAcceptsWrites, SyncActivity, FULL_ROUTE,
8
+ windowAcceptsWrites, SyncActivity, FULL_ROUTE, copyArchiveFile,
9
9
  } from "../IArchives";
10
10
  import { ArchivesDisk, applyFindInfoShape } from "../ArchivesDisk";
11
11
  import { ArchivesBackblaze } from "../backblaze";
@@ -73,7 +73,7 @@ export type IBucketStore = {
73
73
  computeIndexTotals?(): Promise<{ fileCount: number; byteCount: number; sources: { debugName: string; fileCount: number; byteCount: number }[] }>;
74
74
  startLargeUpload(): Promise<string>;
75
75
  appendLargeUpload(id: string, data: Buffer): Promise<void>;
76
- finishLargeUpload(id: string, key: string): Promise<void>;
76
+ finishLargeUpload(id: string, key: string, lastModified?: number): Promise<void>;
77
77
  cancelLargeUpload(id: string): Promise<void>;
78
78
  };
79
79
 
@@ -441,15 +441,14 @@ export class BlobStore implements IBucketStore {
441
441
  tally.tombstone++;
442
442
  continue;
443
443
  }
444
- let result = await source.get2(file.path);
445
- if (!result) continue;
446
- if (result.data.length === 0) {
447
- this.setIndexEntry(file.path, { writeTime: result.writeTime, size: 0, sourcesListIndex: this.sourcesListIndexOfSlot(0) });
444
+ let copied = await copyArchiveFile({ from: source, to: this.sources[0].source, path: file.path, size: file.size, writeTime: file.createTime, forceSetImmutable: true, noChecks: true });
445
+ if (!copied) continue;
446
+ if (copied.size === 0) {
447
+ this.setIndexEntry(file.path, { writeTime: copied.writeTime, size: 0, sourcesListIndex: this.sourcesListIndexOfSlot(0) });
448
448
  tally.tombstone++;
449
449
  continue;
450
450
  }
451
- await this.sources[0].source.set(file.path, result.data, { lastModified: result.writeTime, forceSetImmutable: true, noChecks: true });
452
- this.setIndexEntry(file.path, { writeTime: result.writeTime, size: result.data.length, sourcesListIndex: this.sourcesListIndexOfSlot(0) });
451
+ this.setIndexEntry(file.path, { writeTime: copied.writeTime, size: copied.size, sourcesListIndex: this.sourcesListIndexOfSlot(0) });
453
452
  if (entry || overlayEntry) {
454
453
  tally.updated++;
455
454
  } else {
@@ -660,9 +659,8 @@ export class BlobStore implements IBucketStore {
660
659
  }
661
660
  let holder = await this.getEntryHolder(entry);
662
661
  if (!holder) continue;
663
- let result = await holder.get2(key);
664
- if (!result) continue;
665
- await source.set(key, result.data, { lastModified: result.writeTime, forceSetImmutable: true, noChecks: true });
662
+ let copied = await copyArchiveFile({ from: holder, to: source, path: key, size: entry.size, writeTime: entry.writeTime, forceSetImmutable: true, noChecks: true });
663
+ if (!copied) continue;
666
664
  pushed++;
667
665
  consecutiveFailures = 0;
668
666
  } catch (e) {
@@ -777,12 +775,11 @@ export class BlobStore implements IBucketStore {
777
775
  let index = nextIndex++;
778
776
  if (index >= pending.length) return;
779
777
  let { key, entry } = pending[index];
780
- let result = await source.get2(key);
781
- if (result) {
782
- await this.sources[0].source.set(key, result.data, { lastModified: result.writeTime, forceSetImmutable: true, noChecks: true });
778
+ let copied = await copyArchiveFile({ from: source, to: this.sources[0].source, path: key, size: entry.size, writeTime: entry.writeTime, forceSetImmutable: true, noChecks: true });
779
+ if (copied) {
783
780
  // Only move the entry's source if it wasn't changed while we copied
784
781
  if (this.mem.get(key) === entry) {
785
- this.setIndexEntry(key, { writeTime: result.writeTime, size: result.data.length, sourcesListIndex: this.sourcesListIndexOfSlot(0) });
782
+ this.setIndexEntry(key, { writeTime: copied.writeTime, size: copied.size, sourcesListIndex: this.sourcesListIndexOfSlot(0) });
786
783
  }
787
784
  }
788
785
  activity.doneFiles = (activity.doneFiles || 0) + 1;
@@ -1086,9 +1083,9 @@ export class BlobStore implements IBucketStore {
1086
1083
  public async appendLargeUpload(id: string, data: Buffer): Promise<void> {
1087
1084
  await this.getDiskSource().disk.appendLargeUpload(id, data);
1088
1085
  }
1089
- public async finishLargeUpload(id: string, key: string): Promise<void> {
1086
+ public async finishLargeUpload(id: string, key: string, lastModified?: number): Promise<void> {
1090
1087
  let { disk, sourceIndex } = this.getDiskSource();
1091
- await disk.finishLargeUpload(id, key);
1088
+ await disk.finishLargeUpload(id, key, lastModified);
1092
1089
  this.overlay.delete(key);
1093
1090
  let info = await disk.getInfo(key);
1094
1091
  if (info) {
@@ -87,6 +87,7 @@ export declare class ArchivesChain implements IArchives {
87
87
  private setVariableShard;
88
88
  setLargeFile(config: {
89
89
  path: string;
90
+ lastModified?: number;
90
91
  getNextData(): Promise<Buffer | undefined>;
91
92
  }): Promise<void>;
92
93
  getURL(path: string): Promise<string>;
@@ -688,7 +688,7 @@ export class ArchivesChain implements IArchives {
688
688
  }
689
689
  }
690
690
 
691
- public async setLargeFile(config: { path: string; getNextData(): Promise<Buffer | undefined> }): Promise<void> {
691
+ public async setLargeFile(config: { path: string; lastModified?: number; getNextData(): Promise<Buffer | undefined> }): Promise<void> {
692
692
  if (config.path.includes(VARIABLE_SHARD) && parseVariableRoute(config.path) === undefined) {
693
693
  throw new Error(`setLargeFile does not support VARIABLE_SHARD keys (there is no way to return the materialized key); write the file with set, or materialize the key yourself. Key: ${JSON.stringify(config.path)}`);
694
694
  }
@@ -143,8 +143,8 @@ class ArchivesRemote {
143
143
  async find(prefix, config) {
144
144
  return (await this.findInfo(prefix, config)).map(x => x.path);
145
145
  }
146
- async getChangesAfter(time) {
147
- return await this.call(() => this.controller.getChangesAfter(this.account, this.bucketName, time));
146
+ async getChangesAfter2(config) {
147
+ return await this.call(() => this.controller.getChangesAfter2(this.account, this.bucketName, config));
148
148
  }
149
149
  async getConfig() {
150
150
  return await this.call(() => this.controller.getArchivesConfig(this.account, this.bucketName));
@@ -181,5 +181,5 @@ class ArchivesRemote {
181
181
  }
182
182
  }
183
183
  exports.ArchivesRemote = ArchivesRemote;
184
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNSZW1vdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBcmNoaXZlc1JlbW90ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtRUFBZ0U7QUFDaEUsbURBQXdEO0FBQ3hELDJEQUFxRDtBQUNyRCxrREFBNkU7QUFFN0UsaURBQWdGO0FBQ2hGLDJEQUc2QjtBQUU3QixrVkFBa1Y7QUFFbFYsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFVN0MsU0FBZ0IsZUFBZSxDQUFDLEdBQVc7SUFDdkMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9HLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN6RCxDQUFDO0FBTkQsMENBTUM7QUFFRCx1RkFBdUY7QUFDaEYsS0FBSyxVQUFVLG1CQUFtQixDQUFDLE1BQXlEO0lBQy9GLG9KQUFvSjtJQUNwSiwrQkFBYyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUN6QyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0Qs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QUFJLEVBQUUsQ0FBQztnQkFDVixJQUFJLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLElBQUk7b0JBQUUsTUFBTTtnQkFDakIsS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLG9CQUFvQixFQUFFLENBQUM7b0JBQ3hFLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JHLENBQUM7WUFDTCxDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQztnQkFDRCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFBQyxXQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ1gsTUFBTSxDQUFDLENBQUM7UUFDWixDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBWTtRQUM1Qix3RkFBd0Y7UUFDeEYsT0FBTyxJQUFBLDJCQUFZLEVBQUMsSUFBQSwrQkFBZ0IsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pFLENBQUM7Q0FDSjtBQXRKRCx3Q0FzSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IHRpbWVJbk1pbnV0ZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGdldElkZW50aXR5Q0EsIGxvYWRJZGVudGl0eUNBLCBzaWduIH0gZnJvbSBcIi4uLy4uL21pc2MvaHR0cHMvY2VydHNcIjtcbmltcG9ydCB7IElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZywgQXJjaGl2ZXNTeW5jU3RhdHVzLCBTZXRDb25maWcgfSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBwYXJzZUhvc3RlZFVybCwgZ2V0QnVja2V0QmFzZVVybCwgYnVpbGRGaWxlVXJsIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQge1xuICAgIFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLCBTVE9SQUdFX0FVVEhfUFVSUE9TRSxcbiAgICBTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVELCBTVE9SQUdFX0FDQ0VTU19ERU5JRUQsXG59IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5cbi8vIEEgYnVja2V0IG9uIG91ciByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIgKHN0b3JhZ2VTZXJ2ZXIudHMpLCB1c2VkIGxpa2UgQXJjaGl2ZXNCYWNrYmxhemUuIFdvcmtzIGluIE5vZGUuanMgYW5kIHRoZSBicm93c2VyLiBBdXRoZW50aWNhdGVzIHdpdGggdGhpcyBtYWNoaW5lJ3MgY2VydHMudHMgaWRlbnRpdHk7IGlmIHRoZSBhY2NvdW50IGhhc24ndCB0cnVzdGVkIHRoaXMgbWFjaGluZSB5ZXQgaXQgcmVxdWVzdHMgYWNjZXNzLCBhbmQgYnkgZGVmYXVsdCB3YWl0cywgbG9nZ2luZyBpbnN0cnVjdGlvbnMgZXZlcnkgbWludXRlIChjYWxscyBibG9jayB1bnRpbCBhY2Nlc3MgaXMgZ3JhbnRlZCkuXG5cbmNvbnN0IEFDQ0VTU19SRVRSWV9ERUxBWSA9IDEwMDAgKiAzMDtcbmNvbnN0IExBUkdFX0ZJTEVfUEFSVF9TSVpFID0gOCAqIDEwMjQgKiAxMDI0O1xuXG5leHBvcnQgdHlwZSBBcmNoaXZlc1JlbW90ZUNvbmZpZyA9IHtcbiAgICAvLyBUaGUgYnVja2V0J3Mgcm91dGluZyBVUkwsIHdoaWNoIGFkZHJlc3NlcyB0aGUgc2VydmVyLCBhY2NvdW50LCBhbmQgYnVja2V0IGluIG9uZTpcbiAgICAvLyAgaHR0cHM6Ly9zdG9yYWdlLmV4YW1wbGUuY29tOjQ0NDQvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgIHVybDogc3RyaW5nO1xuICAgIC8vIGZhbHNlOiBhY2Nlc3MtZGVuaWVkIGNhbGxzIHRocm93IGltbWVkaWF0ZWx5ICh0aGUgZXJyb3IgaW5jbHVkZXMgdGhlIGFjY2VzcyBwYWdlIGxpbmspIGluc3RlYWQgb2YgcmVxdWVzdGluZyBhY2Nlc3MgYW5kIGJsb2NraW5nIHVudGlsIGl0IGlzIGdyYW50ZWQgKHRoZSBkZWZhdWx0KS5cbiAgICB3YWl0Rm9yQWNjZXNzPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN0b3JhZ2VVcmwodXJsOiBzdHJpbmcpOiB7IGFkZHJlc3M6IHN0cmluZzsgcG9ydDogbnVtYmVyIH0ge1xuICAgIGxldCB1ID0gbmV3IFVSTCh1cmwpO1xuICAgIGlmICh1LnByb3RvY29sICE9PSBcImh0dHBzOlwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBVUkwgbXVzdCB1c2UgaHR0cHMsIGdvdCAke0pTT04uc3RyaW5naWZ5KHUucHJvdG9jb2wpfSBpbiAke0pTT04uc3RyaW5naWZ5KHVybCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IGFkZHJlc3M6IHUuaG9zdG5hbWUsIHBvcnQ6ICt1LnBvcnQgfHwgNDQzIH07XG59XG5cbi8vIEF1dGhlbnRpY2F0ZXMgYSBjb25uZWN0aW9uIHRvIGEgc3RvcmFnZSBzZXJ2ZXIgd2l0aCB0aGlzIG1hY2hpbmUncyBjZXJ0cy50cyBpZGVudGl0eVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF1dGhlbnRpY2F0ZVN0b3JhZ2UoY29uZmlnOiB7IGFkZHJlc3M6IHN0cmluZzsgcG9ydDogbnVtYmVyOyBub2RlSWQ6IHN0cmluZyB9KTogUHJvbWlzZTx7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nIH0+IHtcbiAgICAvLyBob3N0U2VydmVyIG5vZGVJZHMgYXJlIG1hY2hpbmUtc3BlY2lmaWMsIHNvIGNvbm5lY3Rpb25zIGJ5IGRvbWFpbiBtdXN0IHRhcmdldCBcImFueSBzZXJ2ZXIgYXQgdGhpcyBhZGRyZXNzXCIgKHdoaWNoIGlzIGhvdyBicm93c2VycyBhbHdheXMgY29ubmVjdClcbiAgICBTb2NrZXRGdW5jdGlvbi5FTkFCTEVfQ0xJRU5UX01PREUgPSB0cnVlO1xuICAgIGxldCByb290RG9tYWluID0gY29uZmlnLmFkZHJlc3Muc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKTtcbiAgICBhd2FpdCBsb2FkSWRlbnRpdHlDQShyb290RG9tYWluKTtcbiAgICBsZXQgY2EgPSBnZXRJZGVudGl0eUNBKHJvb3REb21haW4pO1xuICAgIGxldCBkYXRhID0ge1xuICAgICAgICBwdXJwb3NlOiBTVE9SQUdFX0FVVEhfUFVSUE9TRSxcbiAgICAgICAgdGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgc2VydmVyOiBgJHtjb25maWcuYWRkcmVzc306JHtjb25maWcucG9ydH1gLFxuICAgIH07XG4gICAgbGV0IHNpZ25hdHVyZSA9IHNpZ24oeyBrZXk6IGNhLmtleSB9LCBkYXRhKTtcbiAgICByZXR1cm4gYXdhaXQgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIubm9kZXNbY29uZmlnLm5vZGVJZF0uYXV0aGVudGljYXRlKHsgY2VydFBlbTogY2EuY2VydC50b1N0cmluZygpLCBzaWduYXR1cmUsIGRhdGEgfSk7XG59XG5cbmV4cG9ydCBjbGFzcyBBcmNoaXZlc1JlbW90ZSBpbXBsZW1lbnRzIElBcmNoaXZlcyB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IEFyY2hpdmVzUmVtb3RlQ29uZmlnKSB7XG4gICAgICAgIC8vIGhvc3RTZXJ2ZXIgbm9kZUlkcyBhcmUgbWFjaGluZS1zcGVjaWZpYywgc28gY29ubmVjdGlvbnMgYnkgZG9tYWluIG11c3QgdGFyZ2V0IFwiYW55IHNlcnZlciBhdCB0aGlzIGFkZHJlc3NcIiAod2hpY2ggaXMgaG93IGJyb3dzZXJzIGFsd2F5cyBjb25uZWN0KVxuICAgICAgICBTb2NrZXRGdW5jdGlvbi5FTkFCTEVfQ0xJRU5UX01PREUgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwodGhpcy5jb25maWcudXJsKTtcbiAgICBwcml2YXRlIGFjY291bnQgPSB0aGlzLnBhcnNlZC5hY2NvdW50O1xuICAgIHByaXZhdGUgYnVja2V0TmFtZSA9IHRoaXMucGFyc2VkLmJ1Y2tldE5hbWU7XG4gICAgcHJpdmF0ZSBub2RlSWQgPSBTb2NrZXRGdW5jdGlvbi5jb25uZWN0KHsgYWRkcmVzczogdGhpcy5wYXJzZWQuYWRkcmVzcywgcG9ydDogdGhpcy5wYXJzZWQucG9ydCB9KTtcbiAgICBwcml2YXRlIGNvbnRyb2xsZXIgPSBSZW1vdGVTdG9yYWdlQ29udHJvbGxlci5ub2Rlc1t0aGlzLm5vZGVJZF07XG4gICAgcHJpdmF0ZSBsYXN0RGVuaWVkTG9nID0gMDtcblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIHJldHVybiBgcmVtb3RlU3RvcmFnZSAke3RoaXMucGFyc2VkLmFkZHJlc3N9OiR7dGhpcy5wYXJzZWQucG9ydH0gYWNjb3VudCAke3RoaXMuYWNjb3VudH0gYnVja2V0ICR7dGhpcy5idWNrZXROYW1lfWA7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gU29ja2V0RnVuY3Rpb24uaXNOb2RlQ29ubmVjdGVkKHRoaXMubm9kZUlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcGluZygpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbnRyb2xsZXIucGluZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYXV0aGVudGljYXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBhdXRoZW50aWNhdGVTdG9yYWdlKHsgYWRkcmVzczogdGhpcy5wYXJzZWQuYWRkcmVzcywgcG9ydDogdGhpcy5wYXJzZWQucG9ydCwgbm9kZUlkOiB0aGlzLm5vZGVJZCB9KTtcbiAgICB9XG5cbiAgICAvLyBSdW5zIGEgY2FsbCwgYXV0aGVudGljYXRpbmcgKGFuZCByZS1hdXRoZW50aWNhdGluZyBhZnRlciByZWNvbm5lY3RzKSBhcyBuZWVkZWQuIFVubGlrZSBjYWxsKCksIGRvZXMgTk9UIHdhaXQgZm9yIGFjY291bnQgYWNjZXNzLlxuICAgIHByaXZhdGUgYXN5bmMgY2FsbEF1dGhlZDxUPihmbmM6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbmMoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoIVN0cmluZyhlLnN0YWNrIHx8IGUpLmluY2x1ZGVzKFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQpKSB0aHJvdyBlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hdXRoZW50aWNhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbmMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoaXMgbWFjaGluZSBoYXMgYWNjZXNzIHRvIHRoZSBhY2NvdW50LiBPdGhlcndpc2UgcHV0cyBpbiBhbiBhY2Nlc3MgcmVxdWVzdCBhbmQgcmV0dXJucyBvdXIgbWFjaGluZUlkICsgaXAgKHNvIHRoZSBjYWxsZXIgY2FuIGRpc3BsYXkgdGhlbSBhbG9uZ3NpZGUgdGhlIGxpbmssIGZvciB0aGUgYXBwcm92ZXIgdG8gbWF0Y2ggdGhlIGluY29taW5nIHJlcXVlc3QpIGFuZCB0aGUgbGluayB0byB0aGUgZ3JhbnQgcGFnZS5cbiAgICBwdWJsaWMgYXN5bmMgd2FpdGluZ0ZvckFjY2VzcygpOiBQcm9taXNlPHsgbGluazogc3RyaW5nOyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IGF3YWl0IHRoaXMuY2FsbEF1dGhlZCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWNjZXNzU3RhdGUodGhpcy5hY2NvdW50KSk7XG4gICAgICAgIGlmIChzdGF0ZS5oYXNBY2Nlc3MpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCByZXF1ZXN0ZWQgPSBhd2FpdCB0aGlzLmNhbGxBdXRoZWQoKCkgPT4gdGhpcy5jb250cm9sbGVyLnJlcXVlc3RBY2Nlc3ModGhpcy5hY2NvdW50KSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaW5rOiBgaHR0cHM6Ly8ke3RoaXMucGFyc2VkLmFkZHJlc3N9OiR7dGhpcy5wYXJzZWQucG9ydH0vJHt0aGlzLmFjY291bnR9YCxcbiAgICAgICAgICAgIG1hY2hpbmVJZDogcmVxdWVzdGVkLm1hY2hpbmVJZCxcbiAgICAgICAgICAgIGlwOiByZXF1ZXN0ZWQuaXAsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmNhbGxBdXRoZWQoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldEFjY2Vzc1N0YXRlKHRoaXMuYWNjb3VudCkpO1xuICAgICAgICByZXR1cm4gISFzdGF0ZS5oYXNBY2Nlc3M7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXJzIG91ciBhY2Nlc3MgcmVxdWVzdCBzZXJ2ZXItc2lkZSAoc28gYW4gYWRtaW4gaGFzIGEgcmVxdWVzdElkIHRvIGdyYW50KSBhbmQgbG9ncyB0aGUgZ3JhbnQgaW5zdHJ1Y3Rpb25zLCBhdCBtb3N0IG9uY2UgYSBtaW51dGVcbiAgICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyQWNjZXNzUmVxdWVzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHJlcXVlc3RlZCA9IGF3YWl0IHRoaXMuY2FsbEF1dGhlZCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIucmVxdWVzdEFjY2Vzcyh0aGlzLmFjY291bnQpKTtcbiAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmxhc3REZW5pZWRMb2cgPiB0aW1lSW5NaW51dGUpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdERlbmllZExvZyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTm8gYWNjZXNzIHRvIHN0b3JhZ2UgYWNjb3VudCAke0pTT04uc3RyaW5naWZ5KHRoaXMuYWNjb3VudCl9IG9uICR7dGhpcy5wYXJzZWQuYWRkcmVzc306JHt0aGlzLnBhcnNlZC5wb3J0fSAob3VyIG1hY2hpbmUgJHtyZXF1ZXN0ZWQubWFjaGluZUlkfSwgaXAgJHtyZXF1ZXN0ZWQuaXB9KS4gU2VlIGh0dHBzOi8vJHt0aGlzLnBhcnNlZC5hZGRyZXNzfToke3RoaXMucGFyc2VkLnBvcnR9LyR7dGhpcy5hY2NvdW50fSAtIG9yIGdyYW50IGl0IHdpdGg6ICR7cmVxdWVzdGVkLmdyYW50QWNjZXNzQ29tbWFuZH1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJ1bnMgYSBjYWxsLCBhdXRoZW50aWNhdGluZyAoYW5kIHJlLWF1dGhlbnRpY2F0aW5nIGFmdGVyIHJlY29ubmVjdHMpIGFuZCB3YWl0aW5nIGZvciBhY2NvdW50IGFjY2VzcyBhcyBuZWVkZWQuIFdpdGggd2FpdEZvckFjY2VzcyBmYWxzZSwgZGVuaWVkIGNhbGxzIHRocm93IGltbWVkaWF0ZWx5IGluc3RlYWQgLSBidXQgdGhlIGFjY2VzcyByZXF1ZXN0IGlzIHN0aWxsIHJlZ2lzdGVyZWQgKGluIHRoZSBiYWNrZ3JvdW5kKSwgc28gdGhlIGRlbmlhbCBpcyBncmFudGFibGUuXG4gICAgcHJpdmF0ZSBhc3luYyBjYWxsPFQ+KGZuYzogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZm5jKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IFN0cmluZyhlLnN0YWNrIHx8IGUpO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFNUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX0FDQ0VTU19ERU5JRUQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy53YWl0Rm9yQWNjZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCB0aGlzLnJlZ2lzdGVyQWNjZXNzUmVxdWVzdCgpLmNhdGNoKCgpID0+IHsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJBY2Nlc3NSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGF5KEFDQ0VTU19SRVRSWV9ERUxBWSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldDIodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGZpbGVOYW1lLCBjb25maWc/LnJhbmdlKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgeyBkYXRhOiBCdWZmZXIuZnJvbShyZXN1bHQuZGF0YSksIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUgfSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiBTZXRDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLnNldCh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUsIGRhdGEsIGNvbmZpZz8ubGFzdE1vZGlmaWVkLCBjb25maWc/LmZvcmNlU2V0SW1tdXRhYmxlKSk7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZGVsKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxsKCgpID0+IHRoaXMuY29udHJvbGxlci5nZXRJbmZvKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmZpbmRJbmZvKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBwcmVmaXgsIGNvbmZpZykpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSkubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcih0aW1lOiBudW1iZXIpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldENoYW5nZXNBZnRlcih0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgdGltZSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZ2V0QXJjaGl2ZXNDb25maWcodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUpKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldFN5bmNTdGF0dXMoKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZ2V0U3luY1N0YXR1cyh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gRW5zdXJlIHdlJ3JlIGF1dGhlbnRpY2F0ZWQgd2l0aCBhY2Nlc3MgQkVGT1JFIGNvbnN1bWluZyBhbnkgZGF0YSAodGhlIHN0cmVhbSBjYW5ub3QgYmUgcmV3b3VuZCwgc28gd2UgY2FuJ3QgdXNlIHRoZSByZXRyeSBsb29wIGFyb3VuZCB0aGUgYWN0dWFsIHVwbG9hZClcbiAgICAgICAgYXdhaXQgdGhpcy5jYWxsKCgpID0+IHRoaXMuY29udHJvbGxlci5nZXRJbmZvKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBjb25maWcucGF0aCkpO1xuICAgICAgICBsZXQgdXBsb2FkSWQgPSBhd2FpdCB0aGlzLmNvbnRyb2xsZXIuc3RhcnRMYXJnZUZpbGUodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGNvbmZpZy5wYXRoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGRhdGEubGVuZ3RoOyBvZmZzZXQgKz0gTEFSR0VfRklMRV9QQVJUX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyLnVwbG9hZFBhcnQodXBsb2FkSWQsIGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBMQVJHRV9GSUxFX1BBUlRfU0laRSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlci5maW5pc2hMYXJnZUZpbGUodXBsb2FkSWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlci5jYW5jZWxMYXJnZUZpbGUodXBsb2FkSWQpO1xuICAgICAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIC8vIE9ubHkgYWN0dWFsbHkgbG9hZHMgZm9yIHB1YmxpYyBidWNrZXRzICh0aGUgc2VydmVyIHJlamVjdHMgcGxhaW4gVVJMIHJlYWRzIG90aGVyd2lzZSlcbiAgICAgICAgcmV0dXJuIGJ1aWxkRmlsZVVybChnZXRCdWNrZXRCYXNlVXJsKHRoaXMuY29uZmlnLnVybCksIHBhdGgpO1xuICAgIH1cbn1cbiJdfQ==
185
- /* _JS_SOURCE_HASH = "c7addcba0ee9034173642891286ac30c48407f5a8f060e99ed698807f766ff44"; */
184
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNSZW1vdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBcmNoaXZlc1JlbW90ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtRUFBZ0U7QUFDaEUsbURBQXdEO0FBQ3hELDJEQUFxRDtBQUNyRCxrREFBNkU7QUFFN0UsaURBQWdGO0FBQ2hGLDJEQUc2QjtBQUU3QixrVkFBa1Y7QUFFbFYsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFVN0MsU0FBZ0IsZUFBZSxDQUFDLEdBQVc7SUFDdkMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9HLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN6RCxDQUFDO0FBTkQsMENBTUM7QUFFRCx1RkFBdUY7QUFDaEYsS0FBSyxVQUFVLG1CQUFtQixDQUFDLE1BQXlEO0lBQy9GLG9KQUFvSjtJQUNwSiwrQkFBYyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUN6QyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0Qs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QUFPLElBQUksRUFBRSxDQUFDO2dCQUNWLElBQUksSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsSUFBSTtvQkFBRSxNQUFNO2dCQUNqQixLQUFLLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksb0JBQW9CLEVBQUUsQ0FBQztvQkFDeEUsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQztnQkFDckcsQ0FBQztZQUNMLENBQUM7WUFDRCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDO2dCQUNELE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUFDLFdBQU0sQ0FBQyxDQUFDLENBQUM7WUFDWCxNQUFNLENBQUMsQ0FBQztRQUNaLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFZO1FBQzVCLHdGQUF3RjtRQUN4RixPQUFPLElBQUEsMkJBQVksRUFBQyxJQUFBLCtCQUFnQixFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUNKO0FBdEpELHdDQXNKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNvY2tldEZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgdGltZUluTWludXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZ2V0SWRlbnRpdHlDQSwgbG9hZElkZW50aXR5Q0EsIHNpZ24gfSBmcm9tIFwiLi4vLi4vbWlzYy9odHRwcy9jZXJ0c1wiO1xuaW1wb3J0IHsgSUFyY2hpdmVzLCBBcmNoaXZlRmlsZUluZm8sIEFyY2hpdmVzQ29uZmlnLCBBcmNoaXZlc1N5bmNTdGF0dXMsIENoYW5nZXNBZnRlckNvbmZpZywgU2V0Q29uZmlnIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgcGFyc2VIb3N0ZWRVcmwsIGdldEJ1Y2tldEJhc2VVcmwsIGJ1aWxkRmlsZVVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHtcbiAgICBSZW1vdGVTdG9yYWdlQ29udHJvbGxlciwgU1RPUkFHRV9BVVRIX1BVUlBPU0UsXG4gICAgU1RPUkFHRV9OT1RfQVVUSEVOVElDQVRFRCwgU1RPUkFHRV9BQ0NFU1NfREVOSUVELFxufSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuXG4vLyBBIGJ1Y2tldCBvbiBvdXIgcmVtb3RlIHN0b3JhZ2Ugc2VydmVyIChzdG9yYWdlU2VydmVyLnRzKSwgdXNlZCBsaWtlIEFyY2hpdmVzQmFja2JsYXplLiBXb3JrcyBpbiBOb2RlLmpzIGFuZCB0aGUgYnJvd3Nlci4gQXV0aGVudGljYXRlcyB3aXRoIHRoaXMgbWFjaGluZSdzIGNlcnRzLnRzIGlkZW50aXR5OyBpZiB0aGUgYWNjb3VudCBoYXNuJ3QgdHJ1c3RlZCB0aGlzIG1hY2hpbmUgeWV0IGl0IHJlcXVlc3RzIGFjY2VzcywgYW5kIGJ5IGRlZmF1bHQgd2FpdHMsIGxvZ2dpbmcgaW5zdHJ1Y3Rpb25zIGV2ZXJ5IG1pbnV0ZSAoY2FsbHMgYmxvY2sgdW50aWwgYWNjZXNzIGlzIGdyYW50ZWQpLlxuXG5jb25zdCBBQ0NFU1NfUkVUUllfREVMQVkgPSAxMDAwICogMzA7XG5jb25zdCBMQVJHRV9GSUxFX1BBUlRfU0laRSA9IDggKiAxMDI0ICogMTAyNDtcblxuZXhwb3J0IHR5cGUgQXJjaGl2ZXNSZW1vdGVDb25maWcgPSB7XG4gICAgLy8gVGhlIGJ1Y2tldCdzIHJvdXRpbmcgVVJMLCB3aGljaCBhZGRyZXNzZXMgdGhlIHNlcnZlciwgYWNjb3VudCwgYW5kIGJ1Y2tldCBpbiBvbmU6XG4gICAgLy8gIGh0dHBzOi8vc3RvcmFnZS5leGFtcGxlLmNvbTo0NDQ0L2ZpbGUvPGFjY291bnQ+LzxidWNrZXROYW1lPi9zdG9yYWdlL3N0b3JhZ2Vyb3V0aW5nLmpzb25cbiAgICB1cmw6IHN0cmluZztcbiAgICAvLyBmYWxzZTogYWNjZXNzLWRlbmllZCBjYWxscyB0aHJvdyBpbW1lZGlhdGVseSAodGhlIGVycm9yIGluY2x1ZGVzIHRoZSBhY2Nlc3MgcGFnZSBsaW5rKSBpbnN0ZWFkIG9mIHJlcXVlc3RpbmcgYWNjZXNzIGFuZCBibG9ja2luZyB1bnRpbCBpdCBpcyBncmFudGVkICh0aGUgZGVmYXVsdCkuXG4gICAgd2FpdEZvckFjY2Vzcz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdG9yYWdlVXJsKHVybDogc3RyaW5nKTogeyBhZGRyZXNzOiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9IHtcbiAgICBsZXQgdSA9IG5ldyBVUkwodXJsKTtcbiAgICBpZiAodS5wcm90b2NvbCAhPT0gXCJodHRwczpcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0b3JhZ2UgVVJMIG11c3QgdXNlIGh0dHBzLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh1LnByb3RvY29sKX0gaW4gJHtKU09OLnN0cmluZ2lmeSh1cmwpfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBhZGRyZXNzOiB1Lmhvc3RuYW1lLCBwb3J0OiArdS5wb3J0IHx8IDQ0MyB9O1xufVxuXG4vLyBBdXRoZW50aWNhdGVzIGEgY29ubmVjdGlvbiB0byBhIHN0b3JhZ2Ugc2VydmVyIHdpdGggdGhpcyBtYWNoaW5lJ3MgY2VydHMudHMgaWRlbnRpdHlcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhdXRoZW50aWNhdGVTdG9yYWdlKGNvbmZpZzogeyBhZGRyZXNzOiBzdHJpbmc7IHBvcnQ6IG51bWJlcjsgbm9kZUlkOiBzdHJpbmcgfSk6IFByb21pc2U8eyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZyB9PiB7XG4gICAgLy8gaG9zdFNlcnZlciBub2RlSWRzIGFyZSBtYWNoaW5lLXNwZWNpZmljLCBzbyBjb25uZWN0aW9ucyBieSBkb21haW4gbXVzdCB0YXJnZXQgXCJhbnkgc2VydmVyIGF0IHRoaXMgYWRkcmVzc1wiICh3aGljaCBpcyBob3cgYnJvd3NlcnMgYWx3YXlzIGNvbm5lY3QpXG4gICAgU29ja2V0RnVuY3Rpb24uRU5BQkxFX0NMSUVOVF9NT0RFID0gdHJ1ZTtcbiAgICBsZXQgcm9vdERvbWFpbiA9IGNvbmZpZy5hZGRyZXNzLnNwbGl0KFwiLlwiKS5zbGljZSgtMikuam9pbihcIi5cIik7XG4gICAgYXdhaXQgbG9hZElkZW50aXR5Q0Eocm9vdERvbWFpbik7XG4gICAgbGV0IGNhID0gZ2V0SWRlbnRpdHlDQShyb290RG9tYWluKTtcbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgcHVycG9zZTogU1RPUkFHRV9BVVRIX1BVUlBPU0UsXG4gICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgIHNlcnZlcjogYCR7Y29uZmlnLmFkZHJlc3N9OiR7Y29uZmlnLnBvcnR9YCxcbiAgICB9O1xuICAgIGxldCBzaWduYXR1cmUgPSBzaWduKHsga2V5OiBjYS5rZXkgfSwgZGF0YSk7XG4gICAgcmV0dXJuIGF3YWl0IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLm5vZGVzW2NvbmZpZy5ub2RlSWRdLmF1dGhlbnRpY2F0ZSh7IGNlcnRQZW06IGNhLmNlcnQudG9TdHJpbmcoKSwgc2lnbmF0dXJlLCBkYXRhIH0pO1xufVxuXG5leHBvcnQgY2xhc3MgQXJjaGl2ZXNSZW1vdGUgaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiBBcmNoaXZlc1JlbW90ZUNvbmZpZykge1xuICAgICAgICAvLyBob3N0U2VydmVyIG5vZGVJZHMgYXJlIG1hY2hpbmUtc3BlY2lmaWMsIHNvIGNvbm5lY3Rpb25zIGJ5IGRvbWFpbiBtdXN0IHRhcmdldCBcImFueSBzZXJ2ZXIgYXQgdGhpcyBhZGRyZXNzXCIgKHdoaWNoIGlzIGhvdyBicm93c2VycyBhbHdheXMgY29ubmVjdClcbiAgICAgICAgU29ja2V0RnVuY3Rpb24uRU5BQkxFX0NMSUVOVF9NT0RFID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKHRoaXMuY29uZmlnLnVybCk7XG4gICAgcHJpdmF0ZSBhY2NvdW50ID0gdGhpcy5wYXJzZWQuYWNjb3VudDtcbiAgICBwcml2YXRlIGJ1Y2tldE5hbWUgPSB0aGlzLnBhcnNlZC5idWNrZXROYW1lO1xuICAgIHByaXZhdGUgbm9kZUlkID0gU29ja2V0RnVuY3Rpb24uY29ubmVjdCh7IGFkZHJlc3M6IHRoaXMucGFyc2VkLmFkZHJlc3MsIHBvcnQ6IHRoaXMucGFyc2VkLnBvcnQgfSk7XG4gICAgcHJpdmF0ZSBjb250cm9sbGVyID0gUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXIubm9kZXNbdGhpcy5ub2RlSWRdO1xuICAgIHByaXZhdGUgbGFzdERlbmllZExvZyA9IDA7XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gYHJlbW90ZVN0b3JhZ2UgJHt0aGlzLnBhcnNlZC5hZGRyZXNzfToke3RoaXMucGFyc2VkLnBvcnR9IGFjY291bnQgJHt0aGlzLmFjY291bnR9IGJ1Y2tldCAke3RoaXMuYnVja2V0TmFtZX1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFNvY2tldEZ1bmN0aW9uLmlzTm9kZUNvbm5lY3RlZCh0aGlzLm5vZGVJZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHBpbmcoKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb250cm9sbGVyLnBpbmcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGF1dGhlbnRpY2F0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgYXV0aGVudGljYXRlU3RvcmFnZSh7IGFkZHJlc3M6IHRoaXMucGFyc2VkLmFkZHJlc3MsIHBvcnQ6IHRoaXMucGFyc2VkLnBvcnQsIG5vZGVJZDogdGhpcy5ub2RlSWQgfSk7XG4gICAgfVxuXG4gICAgLy8gUnVucyBhIGNhbGwsIGF1dGhlbnRpY2F0aW5nIChhbmQgcmUtYXV0aGVudGljYXRpbmcgYWZ0ZXIgcmVjb25uZWN0cykgYXMgbmVlZGVkLiBVbmxpa2UgY2FsbCgpLCBkb2VzIE5PVCB3YWl0IGZvciBhY2NvdW50IGFjY2Vzcy5cbiAgICBwcml2YXRlIGFzeW5jIGNhbGxBdXRoZWQ8VD4oZm5jOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm5jKCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgaWYgKCFTdHJpbmcoZS5zdGFjayB8fCBlKS5pbmNsdWRlcyhTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEKSkgdGhyb3cgZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm5jKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGlzIG1hY2hpbmUgaGFzIGFjY2VzcyB0byB0aGUgYWNjb3VudC4gT3RoZXJ3aXNlIHB1dHMgaW4gYW4gYWNjZXNzIHJlcXVlc3QgYW5kIHJldHVybnMgb3VyIG1hY2hpbmVJZCArIGlwIChzbyB0aGUgY2FsbGVyIGNhbiBkaXNwbGF5IHRoZW0gYWxvbmdzaWRlIHRoZSBsaW5rLCBmb3IgdGhlIGFwcHJvdmVyIHRvIG1hdGNoIHRoZSBpbmNvbWluZyByZXF1ZXN0KSBhbmQgdGhlIGxpbmsgdG8gdGhlIGdyYW50IHBhZ2UuXG4gICAgcHVibGljIGFzeW5jIHdhaXRpbmdGb3JBY2Nlc3MoKTogUHJvbWlzZTx7IGxpbms6IHN0cmluZzsgbWFjaGluZUlkOiBzdHJpbmc7IGlwOiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgc3RhdGUgPSBhd2FpdCB0aGlzLmNhbGxBdXRoZWQoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldEFjY2Vzc1N0YXRlKHRoaXMuYWNjb3VudCkpO1xuICAgICAgICBpZiAoc3RhdGUuaGFzQWNjZXNzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgcmVxdWVzdGVkID0gYXdhaXQgdGhpcy5jYWxsQXV0aGVkKCgpID0+IHRoaXMuY29udHJvbGxlci5yZXF1ZXN0QWNjZXNzKHRoaXMuYWNjb3VudCkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGluazogYGh0dHBzOi8vJHt0aGlzLnBhcnNlZC5hZGRyZXNzfToke3RoaXMucGFyc2VkLnBvcnR9LyR7dGhpcy5hY2NvdW50fWAsXG4gICAgICAgICAgICBtYWNoaW5lSWQ6IHJlcXVlc3RlZC5tYWNoaW5lSWQsXG4gICAgICAgICAgICBpcDogcmVxdWVzdGVkLmlwLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IHN0YXRlID0gYXdhaXQgdGhpcy5jYWxsQXV0aGVkKCgpID0+IHRoaXMuY29udHJvbGxlci5nZXRBY2Nlc3NTdGF0ZSh0aGlzLmFjY291bnQpKTtcbiAgICAgICAgcmV0dXJuICEhc3RhdGUuaGFzQWNjZXNzO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVycyBvdXIgYWNjZXNzIHJlcXVlc3Qgc2VydmVyLXNpZGUgKHNvIGFuIGFkbWluIGhhcyBhIHJlcXVlc3RJZCB0byBncmFudCkgYW5kIGxvZ3MgdGhlIGdyYW50IGluc3RydWN0aW9ucywgYXQgbW9zdCBvbmNlIGEgbWludXRlXG4gICAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckFjY2Vzc1JlcXVlc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByZXF1ZXN0ZWQgPSBhd2FpdCB0aGlzLmNhbGxBdXRoZWQoKCkgPT4gdGhpcy5jb250cm9sbGVyLnJlcXVlc3RBY2Nlc3ModGhpcy5hY2NvdW50KSk7XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0RGVuaWVkTG9nID4gdGltZUluTWludXRlKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3REZW5pZWRMb2cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYE5vIGFjY2VzcyB0byBzdG9yYWdlIGFjY291bnQgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmFjY291bnQpfSBvbiAke3RoaXMucGFyc2VkLmFkZHJlc3N9OiR7dGhpcy5wYXJzZWQucG9ydH0gKG91ciBtYWNoaW5lICR7cmVxdWVzdGVkLm1hY2hpbmVJZH0sIGlwICR7cmVxdWVzdGVkLmlwfSkuIFNlZSBodHRwczovLyR7dGhpcy5wYXJzZWQuYWRkcmVzc306JHt0aGlzLnBhcnNlZC5wb3J0fS8ke3RoaXMuYWNjb3VudH0gLSBvciBncmFudCBpdCB3aXRoOiAke3JlcXVlc3RlZC5ncmFudEFjY2Vzc0NvbW1hbmR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSdW5zIGEgY2FsbCwgYXV0aGVudGljYXRpbmcgKGFuZCByZS1hdXRoZW50aWNhdGluZyBhZnRlciByZWNvbm5lY3RzKSBhbmQgd2FpdGluZyBmb3IgYWNjb3VudCBhY2Nlc3MgYXMgbmVlZGVkLiBXaXRoIHdhaXRGb3JBY2Nlc3MgZmFsc2UsIGRlbmllZCBjYWxscyB0aHJvdyBpbW1lZGlhdGVseSBpbnN0ZWFkIC0gYnV0IHRoZSBhY2Nlc3MgcmVxdWVzdCBpcyBzdGlsbCByZWdpc3RlcmVkIChpbiB0aGUgYmFja2dyb3VuZCksIHNvIHRoZSBkZW5pYWwgaXMgZ3JhbnRhYmxlLlxuICAgIHByaXZhdGUgYXN5bmMgY2FsbDxUPihmbmM6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuYygpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBTdHJpbmcoZS5zdGFjayB8fCBlKTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoU1RPUkFHRV9BQ0NFU1NfREVOSUVEKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcud2FpdEZvckFjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5yZWdpc3RlckFjY2Vzc1JlcXVlc3QoKS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyQWNjZXNzUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShBQ0NFU1NfUkVUUllfREVMQVkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYWxsKCgpID0+IHRoaXMuY29udHJvbGxlci5nZXQyKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSwgY29uZmlnPy5yYW5nZSkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHsgZGF0YTogQnVmZmVyLmZyb20ocmVzdWx0LmRhdGEpLCB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplIH0gfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogU2V0Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jYWxsKCgpID0+IHRoaXMuY29udHJvbGxlci5zZXQodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGZpbGVOYW1lLCBkYXRhLCBjb25maWc/Lmxhc3RNb2RpZmllZCwgY29uZmlnPy5mb3JjZVNldEltbXV0YWJsZSkpO1xuICAgICAgICByZXR1cm4gZmlsZU5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmRlbCh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUpKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZ2V0SW5mbyh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUpKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxsKCgpID0+IHRoaXMuY29udHJvbGxlci5maW5kSW5mbyh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgcHJlZml4LCBjb25maWcpKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxsKCgpID0+IHRoaXMuY29udHJvbGxlci5nZXRDaGFuZ2VzQWZ0ZXIyKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBjb25maWcpKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldEFyY2hpdmVzQ29uZmlnKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRTeW5jU3RhdHVzKCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGwoKCkgPT4gdGhpcy5jb250cm9sbGVyLmdldFN5bmNTdGF0dXModGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIEVuc3VyZSB3ZSdyZSBhdXRoZW50aWNhdGVkIHdpdGggYWNjZXNzIEJFRk9SRSBjb25zdW1pbmcgYW55IGRhdGEgKHRoZSBzdHJlYW0gY2Fubm90IGJlIHJld291bmQsIHNvIHdlIGNhbid0IHVzZSB0aGUgcmV0cnkgbG9vcCBhcm91bmQgdGhlIGFjdHVhbCB1cGxvYWQpXG4gICAgICAgIGF3YWl0IHRoaXMuY2FsbCgoKSA9PiB0aGlzLmNvbnRyb2xsZXIuZ2V0SW5mbyh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgY29uZmlnLnBhdGgpKTtcbiAgICAgICAgbGV0IHVwbG9hZElkID0gYXdhaXQgdGhpcy5jb250cm9sbGVyLnN0YXJ0TGFyZ2VGaWxlKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBjb25maWcucGF0aCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29uZmlnLmdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBkYXRhLmxlbmd0aDsgb2Zmc2V0ICs9IExBUkdFX0ZJTEVfUEFSVF9TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlci51cGxvYWRQYXJ0KHVwbG9hZElkLCBkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgTEFSR0VfRklMRV9QQVJUX1NJWkUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbnRyb2xsZXIuZmluaXNoTGFyZ2VGaWxlKHVwbG9hZElkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbnRyb2xsZXIuY2FuY2VsTGFyZ2VGaWxlKHVwbG9hZElkKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVSTChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICAvLyBPbmx5IGFjdHVhbGx5IGxvYWRzIGZvciBwdWJsaWMgYnVja2V0cyAodGhlIHNlcnZlciByZWplY3RzIHBsYWluIFVSTCByZWFkcyBvdGhlcndpc2UpXG4gICAgICAgIHJldHVybiBidWlsZEZpbGVVcmwoZ2V0QnVja2V0QmFzZVVybCh0aGlzLmNvbmZpZy51cmwpLCBwYXRoKTtcbiAgICB9XG59XG4iXX0=
185
+ /* _JS_SOURCE_HASH = "6cb3e9b9c553bb3b31a12b0534236ba222c9d6de833f96617d5b084c61e99d24"; */
@@ -54,8 +54,16 @@ class ArchivesUrl {
54
54
  return { data, writeTime, size };
55
55
  }
56
56
  async getInfo(fileName) {
57
- let result = await this.get2(fileName);
58
- return result && { writeTime: result.writeTime, size: result.size } || undefined;
57
+ // A 1-byte ranged read: Content-Range carries the full size and Last-Modified the write time, so metadata never downloads the file
58
+ try {
59
+ let result = await this.get2(fileName, { range: { start: 0, end: 1 } });
60
+ return result && { writeTime: result.writeTime, size: result.size } || undefined;
61
+ }
62
+ catch (_a) {
63
+ // Some servers reject ranged reads of empty files (416 instead of an empty 206); a full read is the fallback, and for an empty file it is free anyway
64
+ let result = await this.get2(fileName);
65
+ return result && { writeTime: result.writeTime, size: result.size } || undefined;
66
+ }
59
67
  }
60
68
  async set(fileName, data, config) {
61
69
  throw this.readOnlyError("set");
@@ -72,6 +80,9 @@ class ArchivesUrl {
72
80
  async findInfo(prefix, config) {
73
81
  throw this.readOnlyError("findInfo (listing)");
74
82
  }
83
+ async getChangesAfter2(config) {
84
+ throw this.readOnlyError("getChangesAfter2 (listing)");
85
+ }
75
86
  async getURL(path) {
76
87
  return (0, remoteConfig_1.buildFileUrl)(this.base, path);
77
88
  }
@@ -83,5 +94,5 @@ class ArchivesUrl {
83
94
  }
84
95
  }
85
96
  exports.ArchivesUrl = ArchivesUrl;
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNVcmwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBcmNoaXZlc1VybC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBNEU7QUFFNUUsaURBQThDO0FBRTlDLGtGQUFrRjtBQUNsRixnTUFBZ007QUFFaE0sTUFBYSxXQUFXO0lBQ3BCLDJGQUEyRjtJQUMzRixZQUFvQixJQUFZO1FBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtJQUFJLENBQUM7SUFFOUIsWUFBWTtRQUNmLE9BQU8sT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxTQUFpQjtRQUNuQyxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyx5R0FBeUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkosQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxNQUFtRDtRQUNsRixJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDO0lBQzlDLENBQUM7SUFDTSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQWdCLEVBQUUsTUFBbUQ7UUFDbkYsSUFBSSxHQUFHLEdBQUcsSUFBQSwyQkFBWSxFQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUMsSUFBSSxPQUFPLEdBQTJCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLEtBQUssR0FBRyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxDQUFDO1FBQzFCLElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsU0FBUyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFF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RCxDQUFDO0lBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFZO1FBQzVCLE9BQU8sSUFBQSwyQkFBWSxFQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNNLEtBQUssQ0FBQyxTQUFTO1FBQ2xCLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVNLEtBQUssQ0FBQyxjQUFjO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FDSjtBQTlFRCxrQ0E4RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBodHRwc1JlcXVlc3QsIEh0dHBzUmVzcG9uc2VJbmZvIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvaHR0cHNcIjtcbmltcG9ydCB7IElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZyB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IGJ1aWxkRmlsZVVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuXG4vLyBSZWFkLW9ubHkgSUFyY2hpdmVzIG92ZXIgYSBwdWJsaWMgYnVja2V0J3MgcGxhaW4tVVJMIGZvcm0gKG91ciBzdG9yYWdlIHNlcnZlcidzXG4vLyAvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+Ly4uLiByb3V0ZSwgb3IgYSBiYWNrYmxhemUgZnJpZW5kbHkgVVJMKS4gVXNlZCB3aGVuIHdlIGhhdmUgbm8gQVBJIGFjY2VzcyB0byBhIHNvdXJjZS4gT25seSBzaW5nbGUtZmlsZSByZWFkcyB3b3JrOiB0aGVyZSBpcyBubyBsaXN0aW5nLCBhbmQgd3JpdGVzIGFsd2F5cyB0aHJvdy5cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzVXJsIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICAvLyBiYXNlIGlzIHRoZSBidWNrZXQncyBwdWJsaWMgYmFzZSBVUkwsIGUuZy4gaHR0cHM6Ly9ob3N0OnBvcnQvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBiYXNlOiBzdHJpbmcpIHsgfVxuXG4gICAgcHVibGljIGdldERlYnVnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGB1cmwgJHt0aGlzLmJhc2V9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRPbmx5RXJyb3Iob3BlcmF0aW9uOiBzdHJpbmcpOiBFcnJvciB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoYCR7b3BlcmF0aW9ufSBpcyBub3Qgc3VwcG9ydGVkIG92ZXIgVVJMLWZvcm0gYWNjZXNzIChubyBBUEkgYWNjZXNzIHRvIHRoaXMgc291cmNlLCBvbmx5IHB1YmxpYyBVUkwgcmVhZHMpLiBTb3VyY2U6ICR7dGhpcy5iYXNlfWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgdXJsID0gYnVpbGRGaWxlVXJsKHRoaXMuYmFzZSwgZmlsZU5hbWUpO1xuICAgICAgICBsZXQgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWc/LnJhbmdlO1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJSYW5nZVwiXSA9IGBieXRlcz0ke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZCAtIDF9YDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzcG9uc2U6IEh0dHBzUmVzcG9uc2VJbmZvID0geyBoZWFkZXJzOiB7fSB9O1xuICAgICAgICBsZXQgZGF0YTogQnVmZmVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGh0dHBzUmVxdWVzdCh1cmwsIHVuZGVmaW5lZCwgXCJHRVRcIiwgZmFsc2UsIHsgaGVhZGVycywgb3V0UmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBodHRwc1JlcXVlc3QgdGhyb3dzIG9uIGFueSBub24tMnh4OyBhIG1pc3NpbmcgZmlsZSBpcyBhIG5vcm1hbCBhYnNlbnQgcmVzdWx0LCBub3QgYW4gZXJyb3IuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIHJlYWwgMjA2IG9ubHkgcmV0dXJucyB0aGUgcmVxdWVzdGVkIHNsaWNlLCBzbyB0aGUgZnVsbCBzaXplIGxpdmVzIGluIENvbnRlbnQtUmFuZ2UncyB0b3RhbC5cbiAgICAgICAgbGV0IHNpemUgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgbGV0IGNvbnRlbnRSYW5nZSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXJhbmdlXCJdO1xuICAgICAgICBsZXQgdG90YWwgPSBjb250ZW50UmFuZ2UgJiYgTnVtYmVyKGNvbnRlbnRSYW5nZS5zcGxpdChcIi9cIilbMV0pO1xuICAgICAgICBpZiAodG90YWwgJiYgTnVtYmVyLmlzRmluaXRlKHRvdGFsKSkge1xuICAgICAgICAgICAgc2l6ZSA9IHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlcnZlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHJhbmdlcyByZXR1cm4gdGhlIGZ1bGwgZmlsZSB3aXRoIGEgMjAwIChvdXJzIHNlcnZlcyByZWFsIDIwNnMsIGJ1dCBiYWNrYmxhemUgZnJpZW5kbHkgVVJMcyBhbmQgcHJveGllcyBtYXkgbm90KVxuICAgICAgICBpZiAocmFuZ2UgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheShNYXRoLm1pbihyYW5nZS5zdGFydCwgZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxhc3RNb2RpZmllZCA9IHJlc3BvbnNlLmhlYWRlcnNbXCJsYXN0LW1vZGlmaWVkXCJdO1xuICAgICAgICBsZXQgd3JpdGVUaW1lID0gbGFzdE1vZGlmaWVkICYmIG5ldyBEYXRlKGxhc3RNb2RpZmllZCkuZ2V0VGltZSgpIHx8IDA7XG4gICAgICAgIHJldHVybiB7IGRhdGEsIHdyaXRlVGltZSwgc2l6ZSB9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiB7IHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUgfSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldChmaWxlTmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICB0aHJvdyB0aGlzLnJlYWRPbmx5RXJyb3IoXCJzZXRcIik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aHJvdyB0aGlzLnJlYWRPbmx5RXJyb3IoXCJkZWxcIik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhyb3cgdGhpcy5yZWFkT25seUVycm9yKFwic2V0TGFyZ2VGaWxlXCIpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgdGhyb3cgdGhpcy5yZWFkT25seUVycm9yKFwiZmluZCAobGlzdGluZylcIik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5kSW5mbyhwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgdGhyb3cgdGhpcy5yZWFkT25seUVycm9yKFwiZmluZEluZm8gKGxpc3RpbmcpXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkRmlsZVVybCh0aGlzLmJhc2UsIHBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiJdfQ==
87
- /* _JS_SOURCE_HASH = "0e995269880ce37ea2a5cf17baa75ff97ed370cd54cdddf03699d8b429d88441"; */
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJjaGl2ZXNVcmwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBcmNoaXZlc1VybC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBNEU7QUFFNUUsaURBQThDO0FBRTlDLGtGQUFrRjtBQUNsRixnTUFBZ007QUFFaE0sTUFBYSxXQUFXO0lBQ3BCLDJGQUEyRjtJQUMzRixZQUFvQixJQUFZO1FBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtJQUFJLENBQUM7SUFFOUIsWUFBWTtRQUNmLE9BQU8sT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxTQUFpQjtRQUNuQyxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyx5R0FBeUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkosQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxNQUFtRDtRQUNsRixJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDO0lBQzlDLENBQUM7SUFDTSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQWdCLEVBQUUsTUFBbUQ7UUFDbkYsSUFBSSxHQUFHLEdBQUcsSUFBQSwyQkFBWSxFQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUMsSUFBSSxPQUFPLEdBQTJCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLEtBQUssR0FBRyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxDQUFDO1FBQzFCLElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsU0FBUyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFF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LEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDTSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQW9FO1FBQzFGLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ00sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFjLEVBQUUsTUFBeUQ7UUFDdkYsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNNLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBYyxFQUFFLE1BQXlEO1FBQzNGLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDTSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBMEI7UUFDcEQsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBWTtRQUM1QixPQUFPLElBQUEsMkJBQVksRUFBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDTSxLQUFLLENBQUMsU0FBUztRQUNsQixPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYztRQUN2QixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0NBQ0o7QUF4RkQsa0NBd0ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaHR0cHNSZXF1ZXN0LCBIdHRwc1Jlc3BvbnNlSW5mbyB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2h0dHBzXCI7XG5pbXBvcnQgeyBJQXJjaGl2ZXMsIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNDb25maWcsIENoYW5nZXNBZnRlckNvbmZpZyB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IGJ1aWxkRmlsZVVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuXG4vLyBSZWFkLW9ubHkgSUFyY2hpdmVzIG92ZXIgYSBwdWJsaWMgYnVja2V0J3MgcGxhaW4tVVJMIGZvcm0gKG91ciBzdG9yYWdlIHNlcnZlcidzXG4vLyAvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+Ly4uLiByb3V0ZSwgb3IgYSBiYWNrYmxhemUgZnJpZW5kbHkgVVJMKS4gVXNlZCB3aGVuIHdlIGhhdmUgbm8gQVBJIGFjY2VzcyB0byBhIHNvdXJjZS4gT25seSBzaW5nbGUtZmlsZSByZWFkcyB3b3JrOiB0aGVyZSBpcyBubyBsaXN0aW5nLCBhbmQgd3JpdGVzIGFsd2F5cyB0aHJvdy5cblxuZXhwb3J0IGNsYXNzIEFyY2hpdmVzVXJsIGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICAvLyBiYXNlIGlzIHRoZSBidWNrZXQncyBwdWJsaWMgYmFzZSBVUkwsIGUuZy4gaHR0cHM6Ly9ob3N0OnBvcnQvZmlsZS88YWNjb3VudD4vPGJ1Y2tldE5hbWU+XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBiYXNlOiBzdHJpbmcpIHsgfVxuXG4gICAgcHVibGljIGdldERlYnVnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGB1cmwgJHt0aGlzLmJhc2V9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRPbmx5RXJyb3Iob3BlcmF0aW9uOiBzdHJpbmcpOiBFcnJvciB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoYCR7b3BlcmF0aW9ufSBpcyBub3Qgc3VwcG9ydGVkIG92ZXIgVVJMLWZvcm0gYWNjZXNzIChubyBBUEkgYWNjZXNzIHRvIHRoaXMgc291cmNlLCBvbmx5IHB1YmxpYyBVUkwgcmVhZHMpLiBTb3VyY2U6ICR7dGhpcy5iYXNlfWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgdXJsID0gYnVpbGRGaWxlVXJsKHRoaXMuYmFzZSwgZmlsZU5hbWUpO1xuICAgICAgICBsZXQgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWc/LnJhbmdlO1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJSYW5nZVwiXSA9IGBieXRlcz0ke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZCAtIDF9YDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzcG9uc2U6IEh0dHBzUmVzcG9uc2VJbmZvID0geyBoZWFkZXJzOiB7fSB9O1xuICAgICAgICBsZXQgZGF0YTogQnVmZmVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGh0dHBzUmVxdWVzdCh1cmwsIHVuZGVmaW5lZCwgXCJHRVRcIiwgZmFsc2UsIHsgaGVhZGVycywgb3V0UmVzcG9uc2U6IHJlc3BvbnNlIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBodHRwc1JlcXVlc3QgdGhyb3dzIG9uIGFueSBub24tMnh4OyBhIG1pc3NpbmcgZmlsZSBpcyBhIG5vcm1hbCBhYnNlbnQgcmVzdWx0LCBub3QgYW4gZXJyb3IuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIHJlYWwgMjA2IG9ubHkgcmV0dXJucyB0aGUgcmVxdWVzdGVkIHNsaWNlLCBzbyB0aGUgZnVsbCBzaXplIGxpdmVzIGluIENvbnRlbnQtUmFuZ2UncyB0b3RhbC5cbiAgICAgICAgbGV0IHNpemUgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgbGV0IGNvbnRlbnRSYW5nZSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXJhbmdlXCJdO1xuICAgICAgICBsZXQgdG90YWwgPSBjb250ZW50UmFuZ2UgJiYgTnVtYmVyKGNvbnRlbnRSYW5nZS5zcGxpdChcIi9cIilbMV0pO1xuICAgICAgICBpZiAodG90YWwgJiYgTnVtYmVyLmlzRmluaXRlKHRvdGFsKSkge1xuICAgICAgICAgICAgc2l6ZSA9IHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlcnZlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHJhbmdlcyByZXR1cm4gdGhlIGZ1bGwgZmlsZSB3aXRoIGEgMjAwIChvdXJzIHNlcnZlcyByZWFsIDIwNnMsIGJ1dCBiYWNrYmxhemUgZnJpZW5kbHkgVVJMcyBhbmQgcHJveGllcyBtYXkgbm90KVxuICAgICAgICBpZiAocmFuZ2UgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheShNYXRoLm1pbihyYW5nZS5zdGFydCwgZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxhc3RNb2RpZmllZCA9IHJlc3BvbnNlLmhlYWRlcnNbXCJsYXN0LW1vZGlmaWVkXCJdO1xuICAgICAgICBsZXQgd3JpdGVUaW1lID0gbGFzdE1vZGlmaWVkICYmIG5ldyBEYXRlKGxhc3RNb2RpZmllZCkuZ2V0VGltZSgpIHx8IDA7XG4gICAgICAgIHJldHVybiB7IGRhdGEsIHdyaXRlVGltZSwgc2l6ZSB9O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICAvLyBBIDEtYnl0ZSByYW5nZWQgcmVhZDogQ29udGVudC1SYW5nZSBjYXJyaWVzIHRoZSBmdWxsIHNpemUgYW5kIExhc3QtTW9kaWZpZWQgdGhlIHdyaXRlIHRpbWUsIHNvIG1ldGFkYXRhIG5ldmVyIGRvd25sb2FkcyB0aGUgZmlsZVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgeyByYW5nZTogeyBzdGFydDogMCwgZW5kOiAxIH0gfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuc2l6ZSB9IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBTb21lIHNlcnZlcnMgcmVqZWN0IHJhbmdlZCByZWFkcyBvZiBlbXB0eSBmaWxlcyAoNDE2IGluc3RlYWQgb2YgYW4gZW1wdHkgMjA2KTsgYSBmdWxsIHJlYWQgaXMgdGhlIGZhbGxiYWNrLCBhbmQgZm9yIGFuIGVtcHR5IGZpbGUgaXQgaXMgZnJlZSBhbnl3YXlcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoZmlsZU5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiB7IHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUgfSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHRocm93IHRoaXMucmVhZE9ubHlFcnJvcihcInNldFwiKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRocm93IHRoaXMucmVhZE9ubHlFcnJvcihcImRlbFwiKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBnZXROZXh0RGF0YSgpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aHJvdyB0aGlzLnJlYWRPbmx5RXJyb3IoXCJzZXRMYXJnZUZpbGVcIik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICB0aHJvdyB0aGlzLnJlYWRPbmx5RXJyb3IoXCJmaW5kIChsaXN0aW5nKVwiKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICB0aHJvdyB0aGlzLnJlYWRPbmx5RXJyb3IoXCJmaW5kSW5mbyAobGlzdGluZylcIik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICB0aHJvdyB0aGlzLnJlYWRPbmx5RXJyb3IoXCJnZXRDaGFuZ2VzQWZ0ZXIyIChsaXN0aW5nKVwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBidWlsZEZpbGVVcmwodGhpcy5iYXNlLCBwYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iXX0=
98
+ /* _JS_SOURCE_HASH = "2d29e17f3d7abdf5781eeec860d371498d87ca525544510db0beae031759c417"; */