sliftutils 1.7.104 → 1.7.105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliftutils",
3
- "version": "1.7.104",
3
+ "version": "1.7.105",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -54,7 +54,8 @@ type ParsedName = {
54
54
  };
55
55
 
56
56
  function parseLogFileName(name: string): ParsedName | undefined {
57
- let match = /^pid(\d+)_born(\d+)_thread([\w-]+?)_from(\d+)(?:_to(\d+)_count(\d+)_id([a-z0-9]+))?\.jsonl(\.lz4)?$/.exec(name);
57
+ // The time fields accept a fractional part: hosts that shim Date.now to a true-time clock return fractional milliseconds, and files written before the writer rounded them are already on disk everywhere - they must stay listable (and maintainable, or they would never be compressed or cleaned).
58
+ let match = /^pid(\d+)_born(\d+)_thread([\w-]+?)_from(\d+(?:\.\d+)?)(?:_to(\d+(?:\.\d+)?)_count(\d+)_id([a-z0-9]+))?\.jsonl(\.lz4)?$/.exec(name);
58
59
  if (!match) return undefined;
59
60
  let compressed = !!match[8];
60
61
  // A compressed file without its compression fields (or the reverse) is not one of ours
@@ -207,7 +208,8 @@ export class StreamingLogs {
207
208
  try {
208
209
  if (!this.currentPath) {
209
210
  await fs.promises.mkdir(this.config.folder, { recursive: true });
210
- this.currentPath = path.join(this.config.folder, `pid${process.pid}_born${this.processStartTime}_thread${this.threadId}_from${Date.now()}${UNCOMPRESSED_EXT}`);
211
+ // Rounded, as a shimmed Date.now can return fractional milliseconds, and a "." in the name breaks name parsing for any reader without the fractional-tolerant regex
212
+ this.currentPath = path.join(this.config.folder, `pid${process.pid}_born${this.processStartTime}_thread${this.threadId}_from${Math.round(Date.now())}${UNCOMPRESSED_EXT}`);
211
213
  this.currentBytes = 0;
212
214
  }
213
215
  await fs.promises.appendFile(this.currentPath, data);
@@ -245,7 +247,7 @@ export class StreamingLogs {
245
247
  }
246
248
  let compressed = LZ4.compress(raw);
247
249
  let id = Math.random().toString(36).slice(2, 10);
248
- let finalName = `${parsed.originKey}_to${Date.now()}_count${entryCount}_id${id}${COMPRESSED_EXT}`;
250
+ let finalName = `${parsed.originKey}_to${Math.round(Date.now())}_count${entryCount}_id${id}${COMPRESSED_EXT}`;
249
251
  let tempDir = path.join(this.config.folder, ".tmp");
250
252
  await fs.promises.mkdir(tempDir, { recursive: true });
251
253
  let tempPath = path.join(tempDir, finalName);
@@ -25,7 +25,8 @@ const MAX_PENDING_ENTRIES = 10000;
25
25
  const UNCOMPRESSED_EXT = ".jsonl";
26
26
  const COMPRESSED_EXT = ".jsonl.lz4";
27
27
  function parseLogFileName(name) {
28
- let match = /^pid(\d+)_born(\d+)_thread([\w-]+?)_from(\d+)(?:_to(\d+)_count(\d+)_id([a-z0-9]+))?\.jsonl(\.lz4)?$/.exec(name);
28
+ // The time fields accept a fractional part: hosts that shim Date.now to a true-time clock return fractional milliseconds, and files written before the writer rounded them are already on disk everywhere - they must stay listable (and maintainable, or they would never be compressed or cleaned).
29
+ let match = /^pid(\d+)_born(\d+)_thread([\w-]+?)_from(\d+(?:\.\d+)?)(?:_to(\d+(?:\.\d+)?)_count(\d+)_id([a-z0-9]+))?\.jsonl(\.lz4)?$/.exec(name);
29
30
  if (!match)
30
31
  return undefined;
31
32
  let compressed = !!match[8];
@@ -176,7 +177,8 @@ class StreamingLogs {
176
177
  try {
177
178
  if (!this.currentPath) {
178
179
  await fs_1.default.promises.mkdir(this.config.folder, { recursive: true });
179
- this.currentPath = path_1.default.join(this.config.folder, `pid${process.pid}_born${this.processStartTime}_thread${this.threadId}_from${Date.now()}${UNCOMPRESSED_EXT}`);
180
+ // Rounded, as a shimmed Date.now can return fractional milliseconds, and a "." in the name breaks name parsing for any reader without the fractional-tolerant regex
181
+ this.currentPath = path_1.default.join(this.config.folder, `pid${process.pid}_born${this.processStartTime}_thread${this.threadId}_from${Math.round(Date.now())}${UNCOMPRESSED_EXT}`);
180
182
  this.currentBytes = 0;
181
183
  }
182
184
  await fs_1.default.promises.appendFile(this.currentPath, data);
@@ -217,7 +219,7 @@ class StreamingLogs {
217
219
  }
218
220
  let compressed = LZ4_1.LZ4.compress(raw);
219
221
  let id = Math.random().toString(36).slice(2, 10);
220
- let finalName = `${parsed.originKey}_to${Date.now()}_count${entryCount}_id${id}${COMPRESSED_EXT}`;
222
+ let finalName = `${parsed.originKey}_to${Math.round(Date.now())}_count${entryCount}_id${id}${COMPRESSED_EXT}`;
221
223
  let tempDir = path_1.default.join(this.config.folder, ".tmp");
222
224
  await fs_1.default.promises.mkdir(tempDir, { recursive: true });
223
225
  let tempPath = path_1.default.join(tempDir, finalName);
@@ -393,5 +395,5 @@ class StreamingLogs {
393
395
  }
394
396
  }
395
397
  exports.StreamingLogs = StreamingLogs;
396
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyZWFtaW5nTG9ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIlN0cmVhbWluZ0xvZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QixtREFBZ0Q7QUFDaEQscURBQWtEO0FBRWxELGdpQkFBZ2lCO0FBRWhpQix1RUFBdUU7QUFDdkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLDBEQUEwRDtBQUMxRCxNQUFNLGNBQWMsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6Qyx5RUFBeUU7QUFDekUsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDbEQsaUpBQWlKO0FBQ2pKLE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDaEQsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNoRCx3TEFBd0w7QUFDeEwsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzFDLHFHQUFxRztBQUNyRyxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQztBQUVsQyxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztBQUNsQyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUM7QUFpQ3BDLFNBQVMsZ0JBQWdCLENBQUMsSUFBWTtJQUNsQyxJQUFJLEtBQUssR0FBRyxxR0FBcUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0gsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3QixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLHVGQUF1RjtJQUN2RixJQUFJLFVBQVUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxT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QyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsS0FBSyw2QkFBNkIsT0FBTyxrQkFBa0IsWUFBWSxZQUFZLEtBQUssZUFBZSxDQUFDLENBQUM7SUFDeEssQ0FBQztJQUVNLE9BQU87UUFDVixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBdFFELHNDQXNRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgTFo0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbHo0L0xaNFwiO1xuXG4vLyBHZW5lcmljIGFwcGVuZC1vbmx5IEpTT04tbGluZXMgbG9nZ2luZyBvdmVyIGEgZm9sZGVyLiBFdmVyeSBwcm9jZXNzIHN0cmVhbXMgdG8gaXRzIE9XTiBmaWxlIChuYW1lZCBieSBwaWQgKyBwcm9jZXNzIHN0YXJ0IHRpbWUgKyB0aHJlYWQgaWQsIHdoaWNoIHRvZ2V0aGVyIGlkZW50aWZ5IGEgcHJvY2VzcyBpbmNhcm5hdGlvbiksIHJvdGF0aW5nIHRvIGEgbmV3IGZpbGUgYXQgYSBzaXplIGxpbWl0IGFuZCBMWjQtY29tcHJlc3NpbmcgdGhlIGZpbmlzaGVkIG9uZS4gRXZlcnkgcHJvY2VzcyB1c2luZyB0aGUgZm9sZGVyIGFsc28gTUFJTlRBSU5TIGl0IG9uIGEgcmFuZG9taXplZCBpbnRlcnZhbDogZGVhZCBwcm9jZXNzZXMnIGZpbGVzIGFyZSBjb21wcmVzc2VkIGZvciB0aGVtLCBkdXBsaWNhdGUgY29tcHJlc3Npb25zIGFyZSByZXNvbHZlZCwgYW5kIHRoZSBvbGRlc3QgZmlsZXMgYXJlIGRlbGV0ZWQgb25jZSB0aGUgZm9sZGVyIG91dGdyb3dzIGl0cyBieXRlIGJ1ZGdldC4gSW5zdGFudGlhdGUgb25lIHBlciBmb2xkZXIgYW5kIGNhbGwgbG9nKCkuXG5cbi8vIEFwcGVuZHMgYXJlIGNvYWxlc2NlZCBmb3IgdGhpcyBsb25nOyBhIGNyYXNoIGxvc2VzIGF0IG1vc3QgdGhpcyBtdWNoXG5jb25zdCBGTFVTSF9ERUxBWSA9IDUwMDA7XG4vLyBBIGZpbGUgcmVhY2hpbmcgdGhpcyBzaXplIGlzIHJvdGF0ZWQgb3V0IGFuZCBjb21wcmVzc2VkXG5jb25zdCBNQVhfRklMRV9CWVRFUyA9IDEwMCAqIDEwMjQgKiAxMDI0O1xuLy8gVGhlIGZvbGRlcidzIHRvdGFsIGJ1ZGdldDsgb25jZSBleGNlZWRlZCwgdGhlIG9sZGVzdCBmaWxlcyBhcmUgZGVsZXRlZFxuY29uc3QgVE9UQUxfTElNSVRfQllURVMgPSAzMCAqIDEwMjQgKiAxMDI0ICogMTAyNDtcbi8vIE1haW50ZW5hbmNlIHJ1bnMgYXQgYSByYW5kb20gcG9pbnQgaW4gdGhpcyByYW5nZSwgc28gdGhlIHByb2Nlc3NlcyBzaGFyaW5nIHRoZSBmb2xkZXIgZHJpZnQgYXBhcnQgaW5zdGVhZCBvZiBzdGVwcGluZyBvbiBlYWNoIG90aGVyIGV2ZXJ5IHBhc3NcbmNvbnN0IE1BSU5URU5BTkNFX01JTl9JTlRFUlZBTCA9IDMwICogNjAgKiAxMDAwO1xuY29uc3QgTUFJTlRFTkFOQ0VfTUFYX0lOVEVSVkFMID0gNjAgKiA2MCAqIDEwMDA7XG4vLyBBIHBpZCBpcyBvbmx5IHRoZSBzYW1lIFBST0NFU1MgaWYgaXRzIHN0YXJ0IHRpbWUgbWF0Y2hlcyB0aGUgZmlsZSBuYW1lJ3MgLSB3aXRoaW4gdGhpcyBtdWNoLCBiZWNhdXNlIG91ciBvd24gc3RhcnQgdGltZSBpcyBkZXJpdmVkIGZyb20gcHJvY2Vzcy51cHRpbWUgYW5kIHRoZSBPUydzIGlzIHJlYWQgb2ZmIC9wcm9jXG5jb25zdCBQUk9DRVNTX1NUQVJUX1RPTEVSQU5DRSA9IDYwICogMTAwMDtcbi8vIElmIGZsdXNoaW5nIGZhaWxzIHBlcnNpc3RlbnRseSAoZGlzayBnb25lKSwgcGVuZGluZyBlbnRyaWVzIGFyZSBjYXBwZWQgcmF0aGVyIHRoYW4gZ3Jvd2luZyBmb3JldmVyXG5jb25zdCBNQVhfUEVORElOR19FTlRSSUVTID0gMTAwMDA7XG5cbmNvbnN0IFVOQ09NUFJFU1NFRF9FWFQgPSBcIi5qc29ubFwiO1xuY29uc3QgQ09NUFJFU1NFRF9FWFQgPSBcIi5qc29ubC5sejRcIjtcblxuLyoqIEV2ZXJ5dGhpbmcgYSBsb2cgZmlsZSdzIE5BTUUgc2F5cyBhYm91dCBpdCAocGx1cyBpdHMgb24tZGlzayBzaXplKS4gVGltZXMgYm91bmQgdGhlIGVudHJpZXMgcm91Z2hseTogZnJvbSBpcyB3aGVuIGl0cyBwcm9jZXNzIHN0YXJ0ZWQgd3JpdGluZyBpdCwgdG8gaXMgd2hlbiBpdCB3YXMgY29tcHJlc3NlZC4gKi9cbmV4cG9ydCB0eXBlIExvZ0ZpbGVJbmZvID0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKiogQnl0ZXMgb24gZGlzayAoY29tcHJlc3NlZCBieXRlcyBmb3IgY29tcHJlc3NlZCBmaWxlcykgKi9cbiAgICBzaXplOiBudW1iZXI7XG4gICAgcGlkOiBudW1iZXI7XG4gICAgcHJvY2Vzc1N0YXJ0VGltZTogbnVtYmVyO1xuICAgIHRocmVhZElkOiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gdGhlIHByb2Nlc3Mgc3RhcnRlZCB3cml0aW5nIHRoaXMgZmlsZSAqL1xuICAgIHN0YXJ0VGltZTogbnVtYmVyO1xuICAgIC8qKiBXaGVuIHRoZSBmaWxlIHdhcyBjb21wcmVzc2VkIC0gYWJzZW50IHdoaWxlIGl0IGlzIHN0aWxsIGJlaW5nIHN0cmVhbWVkIHRvICovXG4gICAgZW5kVGltZT86IG51bWJlcjtcbiAgICAvKiogSG93IG1hbnkgZW50cmllcyBpdCBob2xkcyAtIG9ubHkgY291bnRlZCBhdCBjb21wcmVzc2lvbiwgc28gYWJzZW50IG9uIGxpdmUgZmlsZXMgKi9cbiAgICBlbnRyeUNvdW50PzogbnVtYmVyO1xuICAgIGNvbXByZXNzZWQ6IGJvb2xlYW47XG4gICAgLyoqIFdoZXRoZXIgdGhlIHdyaXRpbmcgcHJvY2VzcyBpcyBzdGlsbCBhbGl2ZSAoYWx3YXlzIGZhbHNlIGZvciBjb21wcmVzc2VkIGZpbGVzKSAqL1xuICAgIGFjdGl2ZTogYm9vbGVhbjtcbn07XG5cbnR5cGUgUGFyc2VkTmFtZSA9IHtcbiAgICBwaWQ6IG51bWJlcjtcbiAgICBwcm9jZXNzU3RhcnRUaW1lOiBudW1iZXI7XG4gICAgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBzdGFydFRpbWU6IG51bWJlcjtcbiAgICBlbmRUaW1lPzogbnVtYmVyO1xuICAgIGVudHJ5Q291bnQ/OiBudW1iZXI7XG4gICAgY29tcHJlc3NlZDogYm9vbGVhbjtcbiAgICAvKiogVGhlIHBhcnQgaWRlbnRpZnlpbmcgdGhlIE9SSUdJTkFMIHN0cmVhbSAocGlkK2Jvcm4rdGhyZWFkK2Zyb20pIC0gd2hhdCBkdXBsaWNhdGUgY29tcHJlc3Npb25zIHNoYXJlICovXG4gICAgb3JpZ2luS2V5OiBzdHJpbmc7XG59O1xuXG5mdW5jdGlvbiBwYXJzZUxvZ0ZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IFBhcnNlZE5hbWUgfCB1bmRlZmluZWQge1xuICAgIGxldCBtYXRjaCA9IC9ecGlkKFxcZCspX2Jvcm4oXFxkKylfdGhyZWFkKFtcXHctXSs/KV9mcm9tKFxcZCspKD86X3RvKFxcZCspX2NvdW50KFxcZCspX2lkKFthLXowLTldKykpP1xcLmpzb25sKFxcLmx6NCk/JC8uZXhlYyhuYW1lKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGxldCBjb21wcmVzc2VkID0gISFtYXRjaFs4XTtcbiAgICAvLyBBIGNvbXByZXNzZWQgZmlsZSB3aXRob3V0IGl0cyBjb21wcmVzc2lvbiBmaWVsZHMgKG9yIHRoZSByZXZlcnNlKSBpcyBub3Qgb25lIG9mIG91cnNcbiAgICBpZiAoY29tcHJlc3NlZCAhPT0gKG1hdGNoWzVdICE9PSB1bmRlZmluZWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICAgIHBpZDogK21hdGNoWzFdLFxuICAgICAgICBwcm9jZXNzU3RhcnRUaW1lOiArbWF0Y2hbMl0sXG4gICAgICAgIHRocmVhZElkOiBtYXRjaFszXSxcbiAgICAgICAgc3RhcnRUaW1lOiArbWF0Y2hbNF0sXG4gICAgICAgIGVuZFRpbWU6IG1hdGNoWzVdICE9PSB1bmRlZmluZWQgJiYgK21hdGNoWzVdIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgZW50cnlDb3VudDogbWF0Y2hbNl0gIT09IHVuZGVmaW5lZCAmJiArbWF0Y2hbNl0gfHwgdW5kZWZpbmVkLFxuICAgICAgICBjb21wcmVzc2VkLFxuICAgICAgICBvcmlnaW5LZXk6IGBwaWQke21hdGNoWzFdfV9ib3JuJHttYXRjaFsyXX1fdGhyZWFkJHttYXRjaFszXX1fZnJvbSR7bWF0Y2hbNF19YCxcbiAgICB9O1xufVxuXG4vKiogV2hldGhlciB0aGUgcGlkIGlzIGFsaXZlIEFORCBpcyB0aGUgc2FtZSBwcm9jZXNzIGluY2FybmF0aW9uIHRoZSBmaWxlIG5hbWUgZGVzY3JpYmVkLiBPbiBMaW51eCAvcHJvYyBnaXZlcyB0aGUgcmVhbCBzdGFydCB0aW1lOyBlbHNld2hlcmUgYSBsaXZlIHBpZCBpcyBjb25zZXJ2YXRpdmVseSB0cmVhdGVkIGFzIHRoZSBzYW1lIHByb2Nlc3MgKG5ldmVyIGNvbXByZXNzIHVuZGVyIGEgcnVubmluZyBwcm9jZXNzKS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzUHJvY2Vzc0FsaXZlKHBpZDogbnVtYmVyLCBwcm9jZXNzU3RhcnRUaW1lOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBsZXQgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoYC9wcm9jLyR7cGlkfWApO1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoc3RhdC5jdGltZU1zIC0gcHJvY2Vzc1N0YXJ0VGltZSkgPCBQUk9DRVNTX1NUQVJUX1RPTEVSQU5DRTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgc2VhcmNoZXIgb3ZlciBvbmUgbG9nIGZpbGUgKGFzIHJlYWRGaWxlQ29tcHJlc3NlZCByZXR1cm5zIGl0IC0gYWx3YXlzIExaNCkgdGhhdCBuZXZlciBkZWNvZGVzXG4gKiB0aGUgd2hvbGUgdGhpbmc6IEpTT04gZXNjYXBlcyBsaW5lIGJyZWFrcyBpbnNpZGUgc3RyaW5ncywgc28gdGhlIG9ubHkgQUNUVUFMIGxpbmUgYnJlYWtzIGluIHRoZVxuICogZmlsZSBhcmUgdGhlIHNlcGFyYXRvcnMgYmV0d2VlbiBsb2cgc3RhdGVtZW50cyAtIGEgcGxhaW4gc3Vic3RyaW5nIHNlYXJjaCBvdmVyIHRoZSByYXcgdGV4dCxcbiAqIGJvdW5kZWQgb3V0IHRvIHRoZSBzdXJyb3VuZGluZyBsaW5lIGJyZWFrcywgZmluZHMgZXhhY3RseSB0aGUgbWF0Y2hpbmcgc3RhdGVtZW50cywgYW5kIG9ubHkgVEhPU0VcbiAqIGFyZSBkZWNvZGVkIGFuZCByZXR1cm5lZCBhcyBvYmplY3RzLiBFdmVyeSBzZWFyY2ggc3RyaW5nIG11c3QgYXBwZWFyIGluIGEgc3RhdGVtZW50J3MgcmF3IEpTT04gZm9yXG4gKiBpdCB0byBtYXRjaCAoc28gc2VhcmNoIGZvciB2YWx1ZXMgYXMgdGhleSBhcmUgZW5jb2RlZCAtIGUuZy4gcXVvdGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvZ1NlYXJjaGVyKGRhdGE6IEJ1ZmZlcik6IChzZWFyY2hlczogc3RyaW5nW10pID0+IHVua25vd25bXSB7XG4gICAgbGV0IHRleHQgPSBMWjQuZGVjb21wcmVzcyhkYXRhKS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgcmV0dXJuIHNlYXJjaGVzID0+IHtcbiAgICAgICAgaWYgKCFzZWFyY2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvdmlkZSBhdCBsZWFzdCBvbmUgc2VhcmNoIHN0cmluZyAoYW4gZW1wdHkgc2VhcmNoIHdvdWxkIGp1c3QgYmUgZGVjb2RlTG9nRmlsZSlgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZW50cmllczogdW5rbm93bltdID0gW107XG4gICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSB0ZXh0LmluZGV4T2Yoc2VhcmNoZXNbMF0sIGluZGV4KTtcbiAgICAgICAgICAgIGlmIChmb3VuZCA9PT0gLTEpIGJyZWFrO1xuICAgICAgICAgICAgbGV0IGxpbmVTdGFydCA9IHRleHQubGFzdEluZGV4T2YoXCJcXG5cIiwgZm91bmQpICsgMTtcbiAgICAgICAgICAgIGxldCBsaW5lRW5kID0gdGV4dC5pbmRleE9mKFwiXFxuXCIsIGZvdW5kKTtcbiAgICAgICAgICAgIGlmIChsaW5lRW5kID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGxpbmVFbmQgPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFBhc3QgdGhpcyBsaW5lIGVpdGhlciB3YXksIHNvIHNldmVyYWwgbWF0Y2hlcyBpbnNpZGUgb25lIHN0YXRlbWVudCByZXR1cm4gaXQgb25jZVxuICAgICAgICAgICAgaW5kZXggPSBsaW5lRW5kICsgMTtcbiAgICAgICAgICAgIGxldCBsaW5lID0gdGV4dC5zbGljZShsaW5lU3RhcnQsIGxpbmVFbmQpO1xuICAgICAgICAgICAgbGV0IG1hdGNoZXNBbGwgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgb3RoZXIgb2Ygc2VhcmNoZXMuc2xpY2UoMSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWxpbmUuaW5jbHVkZXMob3RoZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXNBbGwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtYXRjaGVzQWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZW50cmllcy5wdXNoKEpTT04ucGFyc2UobGluZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gQSB0b3JuIGZpbmFsIGxpbmUgKHRoZSB3cml0ZXIgY3Jhc2hlZCBtaWQtYXBwZW5kKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH07XG59XG5cbi8qKiBEZWNvZGVzIGEgbG9nIGZpbGUncyBieXRlcyAoYXMgcmVhZEZpbGVDb21wcmVzc2VkIHJldHVybnMgdGhlbSAtIGFsd2F5cyBMWjQpIGJhY2sgaW50byB0aGUgbG9nZ2VkIG9iamVjdHMuIEEgdG9ybiBmaW5hbCBsaW5lICh0aGUgd3JpdGVyIGNyYXNoZWQgbWlkLWFwcGVuZCkgaXMgc2tpcHBlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVMb2dGaWxlKGRhdGE6IEJ1ZmZlcik6IHVua25vd25bXSB7XG4gICAgbGV0IHRleHQgPSBMWjQuZGVjb21wcmVzcyhkYXRhKS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgbGV0IGVudHJpZXM6IHVua25vd25bXSA9IFtdO1xuICAgIGZvciAobGV0IGxpbmUgb2YgdGV4dC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgICBpZiAoIWxpbmUpIGNvbnRpbnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW50cmllcy5wdXNoKEpTT04ucGFyc2UobGluZSkpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnRyaWVzO1xufVxuXG5leHBvcnQgY2xhc3MgU3RyZWFtaW5nTG9ncyB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IHtcbiAgICAgICAgZm9sZGVyOiBzdHJpbmc7XG4gICAgICAgIC8qKiBJbmNsdWRlZCBpbiBldmVyeSBmaWxlIG5hbWUgLSBzZWUgbWlzYy9odHRwcy9jZXJ0cy50cyBnZXRPd25UaHJlYWRJZC4gUHJvY2Vzc2VzIHdpdGhvdXQgb25lIHdyaXRlIFwibm9uZVwiLiAqL1xuICAgICAgICB0aHJlYWRJZD86IHN0cmluZztcbiAgICAgICAgbWF4RmlsZUJ5dGVzPzogbnVtYmVyO1xuICAgICAgICB0b3RhbExpbWl0Qnl0ZXM/OiBudW1iZXI7XG4gICAgfSkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlTWFpbnRlbmFuY2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NTdGFydFRpbWUgPSBNYXRoLnJvdW5kKERhdGUubm93KCkgLSBwcm9jZXNzLnVwdGltZSgpICogMTAwMCk7XG4gICAgcHJpdmF0ZSB0aHJlYWRJZCA9ICh0aGlzLmNvbmZpZy50aHJlYWRJZCB8fCBcIm5vbmVcIikucmVwbGFjZSgvW15cXHctXS9nLCBcIl9cIik7XG4gICAgcHJpdmF0ZSBwZW5kaW5nOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgZmx1c2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBtYWludGVuYW5jZVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgICAvLyBTZXJpYWxpemVzIGV2ZXJ5dGhpbmcgdGhhdCB0b3VjaGVzIHRoZSBjdXJyZW50IGZpbGUsIHNvIGFwcGVuZHMsIHJvdGF0aW9uLCBhbmQgaW4tbWVtb3J5IGNvbXByZXNzaW9uIG9mIHRoZSBsaXZlIGZpbGUgbmV2ZXIgaW50ZXJsZWF2ZVxuICAgIHByaXZhdGUgd3JpdGVDaGFpbjogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHByaXZhdGUgY3VycmVudFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGN1cnJlbnRCeXRlcyA9IDA7XG4gICAgcHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXG4gICAgLyoqIFF1ZXVlcyBvbmUgZW50cnkgKGFueXRoaW5nIEpTT04tc2VyaWFsaXphYmxlKS4gTmV2ZXIgdGhyb3dzIC0gbG9nZ2luZyBtdXN0IG5vdCB0YWtlIGRvd24gdGhlIGNhbGxlci4gKi9cbiAgICBwdWJsaWMgbG9nKGVudHJ5OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nLmxlbmd0aCA+PSBNQVhfUEVORElOR19FTlRSSUVTKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGRpc2sgaXMgYnJva2VuIChmbHVzaGVzIGFyZSBmYWlsaW5nKSAtIGRyb3BwaW5nIHRoZSBvbGRlc3QgYmVhdHMgZ3Jvd2luZyBmb3JldmVyXG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcucHVzaChKU09OLnN0cmluZ2lmeShlbnRyeSkpO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUZsdXNoKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IHF1ZXVlIGEgbG9nIGVudHJ5ICgkeyhlIGFzIEVycm9yKS5tZXNzYWdlfSlgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2NoZWR1bGVGbHVzaCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZmx1c2hUaW1lciAhPT0gdW5kZWZpbmVkIHx8IHRoaXMuZGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5mbHVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB2b2lkIHRoaXMuZmx1c2goKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUud2FybihgRmx1c2hpbmcgbG9ncyBpbiAke3RoaXMuY29uZmlnLmZvbGRlcn0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgICAgIH0sIEZMVVNIX0RFTEFZKTtcbiAgICAgICAgKHRoaXMuZmx1c2hUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy53cml0ZUNoYWluLnRoZW4oKCkgPT4gdGhpcy53cml0ZVBlbmRpbmcoKSk7XG4gICAgICAgIC8vIFRoZSBjaGFpbiBvbmx5IHNlcmlhbGl6ZXM7IGEgZmFpbHVyZSBiZWxvbmdzIHRvIHRoZSBjYWxsZXIgdGhhdCBhc2tlZCBmb3IgdGhpcyBmbHVzaCwgbm90IGV2ZXJ5IG9uZSBhZnRlciBpdFxuICAgICAgICB0aGlzLndyaXRlQ2hhaW4gPSByZXN1bHQuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgYXdhaXQgcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgd3JpdGVQZW5kaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMucGVuZGluZy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IGxpbmVzID0gdGhpcy5wZW5kaW5nO1xuICAgICAgICB0aGlzLnBlbmRpbmcgPSBbXTtcbiAgICAgICAgbGV0IGRhdGEgPSBsaW5lcy5qb2luKFwiXFxuXCIpICsgXCJcXG5cIjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50UGF0aCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRoaXMuY29uZmlnLmZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGF0aCA9IHBhdGguam9pbih0aGlzLmNvbmZpZy5mb2xkZXIsIGBwaWQke3Byb2Nlc3MucGlkfV9ib3JuJHt0aGlzLnByb2Nlc3NTdGFydFRpbWV9X3RocmVhZCR7dGhpcy50aHJlYWRJZH1fZnJvbSR7RGF0ZS5ub3coKX0ke1VOQ09NUFJFU1NFRF9FWFR9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Qnl0ZXMgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMuYXBwZW5kRmlsZSh0aGlzLmN1cnJlbnRQYXRoLCBkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEJ5dGVzICs9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSBsaW5lcy5jb25jYXQodGhpcy5wZW5kaW5nKTtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVGbHVzaCgpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Qnl0ZXMgPj0gKHRoaXMuY29uZmlnLm1heEZpbGVCeXRlcyB8fCBNQVhfRklMRV9CWVRFUykpIHtcbiAgICAgICAgICAgIGxldCBmaW5pc2hlZCA9IHRoaXMuY3VycmVudFBhdGg7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Qnl0ZXMgPSAwO1xuICAgICAgICAgICAgdm9pZCB0aGlzLmNvbXByZXNzRmlsZShmaW5pc2hlZCkuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTGVmdCB1bmNvbXByZXNzZWQ6IG1haW50ZW5hbmNlIChvdXJzIGFmdGVyIGRlYXRoLCBvciBhbnkgcGVlcidzKSBjb21wcmVzc2VzIGl0IGxhdGVyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBDb21wcmVzc2luZyByb3RhdGVkIGxvZyAke2ZpbmlzaGVkfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wcmVzc2VzIG9uZSBmaW5pc2hlZCBsb2cgZmlsZTogTFo0IGludG8gYSB0ZW1wIFNVQkZPTERFUiAobmV2ZXIgYSB0ZW1wIG5hbWUgaW4gdGhlIGxvZ1xuICAgICAqIGZvbGRlciBpdHNlbGYgLSBhIGNyYXNoZWQgd3JpdGUgbXVzdCBub3QgbGVhdmUgYSBjb3JydXB0IGZpbGUgd2hlcmUgdGhlIG1haW50ZW5hbmNlIHNjYW5zIGFyZSksXG4gICAgICogcmVuYW1lZCBpbnRvIHBsYWNlIChzYW1lIGRyaXZlLCBzbyB0aGUgcmVuYW1lIGlzIGF0b21pYyksIHZlcmlmaWVkLCBhbmQgb25seSBUSEVOIGlzIHRoZVxuICAgICAqIG9yaWdpbmFsIGRlbGV0ZWQgLSBhdCBubyBwb2ludCBpcyB0aGUgZGF0YSBpbiBmZXdlciB0aGFuIG9uZSBjb21wbGV0ZSBmaWxlLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY29tcHJlc3NGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IG5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKTtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlTG9nRmlsZU5hbWUobmFtZSk7XG4gICAgICAgIGlmICghcGFyc2VkIHx8IHBhcnNlZC5jb21wcmVzc2VkKSByZXR1cm47XG4gICAgICAgIGxldCByYXcgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIGxldCBlbnRyeUNvdW50ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChyYXdbaV0gPT09IDEwKSBlbnRyeUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbXByZXNzZWQgPSBMWjQuY29tcHJlc3MocmF3KTtcbiAgICAgICAgbGV0IGlkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApO1xuICAgICAgICBsZXQgZmluYWxOYW1lID0gYCR7cGFyc2VkLm9yaWdpbktleX1fdG8ke0RhdGUubm93KCl9X2NvdW50JHtlbnRyeUNvdW50fV9pZCR7aWR9JHtDT01QUkVTU0VEX0VYVH1gO1xuICAgICAgICBsZXQgdGVtcERpciA9IHBhdGguam9pbih0aGlzLmNvbmZpZy5mb2xkZXIsIFwiLnRtcFwiKTtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodGVtcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGxldCB0ZW1wUGF0aCA9IHBhdGguam9pbih0ZW1wRGlyLCBmaW5hbE5hbWUpO1xuICAgICAgICBsZXQgZmluYWxQYXRoID0gcGF0aC5qb2luKHRoaXMuY29uZmlnLmZvbGRlciwgZmluYWxOYW1lKTtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHRlbXBQYXRoLCBjb21wcmVzc2VkKTtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKHRlbXBQYXRoLCBmaW5hbFBhdGgpO1xuICAgICAgICAvLyBQYXJhbm9pYSBiZWZvcmUgZGVsZXRpbmcgdGhlIG9ubHkgb3RoZXIgY29weVxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZpbmFsUGF0aCk7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayhmaWxlUGF0aCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDb21wcmVzc2VkIGxvZyAke25hbWV9IC0+ICR7ZmluYWxOYW1lfSAoJHtyYXcubGVuZ3RofSAtPiAke2NvbXByZXNzZWQubGVuZ3RofSBieXRlcywgJHtlbnRyeUNvdW50fSBlbnRyaWVzKWApO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBsaXN0aW5nIC8gcmVhZGluZyDilIDilIBcblxuICAgIHB1YmxpYyBhc3luYyBsaXN0RmlsZXMoKTogUHJvbWlzZTxMb2dGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBuYW1lczogc3RyaW5nW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuYW1lcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIodGhpcy5jb25maWcuZm9sZGVyKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKChlIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4gW107XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaWxlczogTG9nRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICBsZXQgcGFyc2VkID0gcGFyc2VMb2dGaWxlTmFtZShuYW1lKTtcbiAgICAgICAgICAgIGlmICghcGFyc2VkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4odGhpcy5jb25maWcuZm9sZGVyLCBuYW1lKSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICghc3RhdCkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgYWN0aXZlID0gIXBhcnNlZC5jb21wcmVzc2VkICYmIGF3YWl0IGlzUHJvY2Vzc0FsaXZlKHBhcnNlZC5waWQsIHBhcnNlZC5wcm9jZXNzU3RhcnRUaW1lKTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgc2l6ZTogc3RhdC5zaXplLFxuICAgICAgICAgICAgICAgIHBpZDogcGFyc2VkLnBpZCxcbiAgICAgICAgICAgICAgICBwcm9jZXNzU3RhcnRUaW1lOiBwYXJzZWQucHJvY2Vzc1N0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICB0aHJlYWRJZDogcGFyc2VkLnRocmVhZElkLFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogcGFyc2VkLnN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lOiBwYXJzZWQuZW5kVGltZSxcbiAgICAgICAgICAgICAgICBlbnRyeUNvdW50OiBwYXJzZWQuZW50cnlDb3VudCxcbiAgICAgICAgICAgICAgICBjb21wcmVzc2VkOiBwYXJzZWQuY29tcHJlc3NlZCxcbiAgICAgICAgICAgICAgICBhY3RpdmUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHguc3RhcnRUaW1lKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIC8qKiBPbmUgZmlsZSdzIGJ5dGVzLCBBTFdBWVMgTFo0LWNvbXByZXNzZWQ6IGNvbXByZXNzZWQgZmlsZXMgYXJlIHNlbnQgYXMtaXMsIGEgc3RpbGwtc3RyZWFtaW5nIGZpbGUgaXMgZmx1c2hlZCBhbmQgY29tcHJlc3NlZCBpbiBtZW1vcnkgKHNtYWxsZXIgb3ZlciB0aGUgbmV0d29yazsgZGVjb2RlTG9nRmlsZSBoYW5kbGVzIGJvdGggaWRlbnRpY2FsbHkpLiAqL1xuICAgIHB1YmxpYyBhc3luYyByZWFkRmlsZUNvbXByZXNzZWQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlTG9nRmlsZU5hbWUobmFtZSk7XG4gICAgICAgIGlmICghcGFyc2VkIHx8IG5hbWUuaW5jbHVkZXMoXCIvXCIpIHx8IG5hbWUuaW5jbHVkZXMoXCJcXFxcXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBhIGxvZyBmaWxlIG5hbWU6ICR7SlNPTi5zdHJpbmdpZnkobmFtZS5zbGljZSgwLCAyMDApKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5jb25maWcuZm9sZGVyLCBuYW1lKTtcbiAgICAgICAgaWYgKHBhcnNlZC5jb21wcmVzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZsdXNoIHNvIG91ciBvd24gbGl2ZSBmaWxlIGluY2x1ZGVzIGV2ZXJ5dGhpbmcgbG9nZ2VkIHVwIHRvIG5vd1xuICAgICAgICBhd2FpdCB0aGlzLmZsdXNoKCk7XG4gICAgICAgIHJldHVybiBMWjQuY29tcHJlc3MoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgbWFpbnRlbmFuY2Ug4pSA4pSAXG5cbiAgICBwcml2YXRlIHNjaGVkdWxlTWFpbnRlbmFuY2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgIGxldCB3YWl0ID0gTUFJTlRFTkFOQ0VfTUlOX0lOVEVSVkFMICsgTWF0aC5yYW5kb20oKSAqIChNQUlOVEVOQU5DRV9NQVhfSU5URVJWQUwgLSBNQUlOVEVOQU5DRV9NSU5fSU5URVJWQUwpO1xuICAgICAgICB0aGlzLm1haW50ZW5hbmNlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5ydW5NYWludGVuYW5jZSgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS53YXJuKGBMb2cgbWFpbnRlbmFuY2Ugb2YgJHt0aGlzLmNvbmZpZy5mb2xkZXJ9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpLmZpbmFsbHkoKCkgPT4gdGhpcy5zY2hlZHVsZU1haW50ZW5hbmNlKCkpO1xuICAgICAgICB9LCB3YWl0KTtcbiAgICAgICAgKHRoaXMubWFpbnRlbmFuY2VUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hhcmVkIHVwa2VlcCBvZiB0aGUgZm9sZGVyIC0gZXZlcnkgcHJvY2VzcyB1c2luZyBpdCBydW5zIHRoaXMsIHNvIG5vdGhpbmcgZGVwZW5kcyBvbiBhbnkgb25lXG4gICAgICogcHJvY2VzcyBzdXJ2aXZpbmc6IGRlYWQgcHJvY2Vzc2VzJyB1bmNvbXByZXNzZWQgZmlsZXMgYXJlIGNvbXByZXNzZWQgZm9yIHRoZW07IGR1cGxpY2F0ZVxuICAgICAqIGNvbXByZXNzaW9ucyBvZiBvbmUgc3RyZWFtICh0d28gbWFpbnRhaW5lcnMgcmFjaW5nKSBhcmUgcmVzb2x2ZWQgYnkga2VlcGluZyB0aGUgT0xERVNUIGNvcHk7XG4gICAgICogYW4gdW5jb21wcmVzc2VkIG9yaWdpbmFsIHdob3NlIGNvbXByZXNzaW9uIGFscmVhZHkgZXhpc3RzIGlzIGRlbGV0ZWQgKGl0cyBjb21wcmVzc29yIGRpZWRcbiAgICAgKiBiZXR3ZWVuIHJlbmFtZSBhbmQgdW5saW5rKTsgYW5kIHRoZSBmb2xkZXIncyB0b3RhbCBzaXplIGlzIGJyb3VnaHQgdW5kZXIgaXRzIGJ1ZGdldCBieVxuICAgICAqIGRlbGV0aW5nIHRoZSBvbGRlc3QgZmlsZXMuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJ1bk1haW50ZW5hbmNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgbmFtZXM6IHN0cmluZ1tdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmFtZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRoaXMuY29uZmlnLmZvbGRlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICgoZSBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyc2VkQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIFBhcnNlZE5hbWU+KCk7XG4gICAgICAgIGZvciAobGV0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgIGxldCBwYXJzZWQgPSBwYXJzZUxvZ0ZpbGVOYW1lKG5hbWUpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZCkgcGFyc2VkQnlOYW1lLnNldChuYW1lLCBwYXJzZWQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb21wcmVzc2VkT3JpZ2lucyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICAgICAgZm9yIChsZXQgW25hbWUsIHBhcnNlZF0gb2YgcGFyc2VkQnlOYW1lKSB7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZC5jb21wcmVzc2VkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gY29tcHJlc3NlZE9yaWdpbnMuZ2V0KHBhcnNlZC5vcmlnaW5LZXkpO1xuICAgICAgICAgICAgaWYgKCFsaXN0KSB7XG4gICAgICAgICAgICAgICAgbGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbXByZXNzZWRPcmlnaW5zLnNldChwYXJzZWQub3JpZ2luS2V5LCBsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpc3QucHVzaChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEdXBsaWNhdGUgY29tcHJlc3Npb25zOiBrZWVwIHRoZSBvbGRlc3QgKGZpcnN0IHdyaXR0ZW4pLCBkZWxldGUgdGhlIHJlc3RcbiAgICAgICAgZm9yIChsZXQgW29yaWdpbiwgbGlzdF0gb2YgY29tcHJlc3NlZE9yaWdpbnMpIHtcbiAgICAgICAgICAgIGlmIChsaXN0Lmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc29ydChsaXN0LCBuYW1lID0+IHBhcnNlZEJ5TmFtZS5nZXQobmFtZSk/LmVuZFRpbWUgfHwgMCk7XG4gICAgICAgICAgICBmb3IgKGxldCBkdXBsaWNhdGUgb2YgbGlzdC5zbGljZSgxKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBEZWxldGluZyBkdXBsaWNhdGUgY29tcHJlc3NlZCBsb2cgJHtkdXBsaWNhdGV9IChhbm90aGVyIG1haW50YWluZXIgY29tcHJlc3NlZCAke29yaWdpbn0gZmlyc3QsIGtlZXBpbmcgJHtsaXN0WzBdfSlgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsocGF0aC5qb2luKHRoaXMuY29uZmlnLmZvbGRlciwgZHVwbGljYXRlKSkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgICAgICAgICBwYXJzZWRCeU5hbWUuZGVsZXRlKGR1cGxpY2F0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgW25hbWUsIHBhcnNlZF0gb2YgcGFyc2VkQnlOYW1lKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VkLmNvbXByZXNzZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMuY29uZmlnLmZvbGRlciwgbmFtZSk7XG4gICAgICAgICAgICBpZiAoZmlsZVBhdGggPT09IHRoaXMuY3VycmVudFBhdGgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGNvbXByZXNzZWRPcmlnaW5zLmhhcyhwYXJzZWQub3JpZ2luS2V5KSkge1xuICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgY29tcHJlc3NlZCBieSBzb21lb25lIHdob3NlIGNsZWFudXAgZGllZCBiZXR3ZWVuIHJlbmFtZSBhbmQgdW5saW5rXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW5nIHVuY29tcHJlc3NlZCBsb2cgJHtuYW1lfTogaXRzIGNvbXByZXNzZWQgdmVyc2lvbiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayhmaWxlUGF0aCkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEEgbGl2ZSBwcm9jZXNzIG93bnMgaXRzIHVuY29tcHJlc3NlZCBmaWxlOyBvbmx5IGEgREVBRCBwcm9jZXNzJ3MgZmlsZXMgYXJlIGNvbXByZXNzZWQgZm9yIGl0IChvdXIgb3duIHBpZCBhbHdheXMgcmVhZHMgYXMgYWxpdmUsIHdoaWNoIGNvcnJlY3RseSBwcm90ZWN0cyBvdXIgY3VycmVudCBmaWxlIC0gb3VyIHJvdGF0ZWQgbGVmdG92ZXJzIHdlcmUgZXhjbHVkZWQgYWJvdmUgb25seSBpZiBjdXJyZW50LCBzbyBjb21wcmVzcyB0aG9zZSB0b28pXG4gICAgICAgICAgICBpZiAocGFyc2VkLnBpZCAhPT0gcHJvY2Vzcy5waWQgJiYgYXdhaXQgaXNQcm9jZXNzQWxpdmUocGFyc2VkLnBpZCwgcGFyc2VkLnByb2Nlc3NTdGFydFRpbWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21wcmVzc0ZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ29tcHJlc3NpbmcgZGVhZCBwcm9jZXNzJ3MgbG9nICR7bmFtZX0gZmFpbGVkICh0aGUgbmV4dCBtYWludGVuYW5jZSBwYXNzIHJldHJpZXMpOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZW5mb3JjZVRvdGFsTGltaXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGVuZm9yY2VUb3RhbExpbWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgbGltaXQgPSB0aGlzLmNvbmZpZy50b3RhbExpbWl0Qnl0ZXMgfHwgVE9UQUxfTElNSVRfQllURVM7XG4gICAgICAgIGxldCBmaWxlcyA9IGF3YWl0IHRoaXMubGlzdEZpbGVzKCk7XG4gICAgICAgIGxldCB0b3RhbCA9IGZpbGVzLnJlZHVjZSgoc3VtLCB4KSA9PiBzdW0gKyB4LnNpemUsIDApO1xuICAgICAgICBpZiAodG90YWwgPD0gbGltaXQpIHJldHVybjtcbiAgICAgICAgLy8gT2xkZXN0IGZpcnN0LCBieSB0aGUgZW5kIG9mIHdoYXQgdGhleSBjb3ZlcjsgbGl2ZSBmaWxlcyBsYXN0ICh0aGV5IGFyZSB0aGUgbmV3ZXN0IGRhdGEgYnkgZGVmaW5pdGlvbilcbiAgICAgICAgbGV0IGRlbGV0YWJsZSA9IGZpbGVzLmZpbHRlcih4ID0+ICF4LmFjdGl2ZSk7XG4gICAgICAgIHNvcnQoZGVsZXRhYmxlLCB4ID0+IHguZW5kVGltZSB8fCB4LnN0YXJ0VGltZSk7XG4gICAgICAgIGxldCBkZWxldGVkID0gMDtcbiAgICAgICAgbGV0IGRlbGV0ZWRCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgZGVsZXRhYmxlKSB7XG4gICAgICAgICAgICBpZiAodG90YWwgPD0gbGltaXQpIGJyZWFrO1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudW5saW5rKHBhdGguam9pbih0aGlzLmNvbmZpZy5mb2xkZXIsIGZpbGUubmFtZSkpLmNhdGNoKCgpID0+IHsgfSk7XG4gICAgICAgICAgICB0b3RhbCAtPSBmaWxlLnNpemU7XG4gICAgICAgICAgICBkZWxldGVkKys7XG4gICAgICAgICAgICBkZWxldGVkQnl0ZXMgKz0gZmlsZS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBMb2dzIGluICR7dGhpcy5jb25maWcuZm9sZGVyfSBvdXRncmV3IHRoZWlyICR7bGltaXR9IGJ5dGUgYnVkZ2V0OiBkZWxldGVkIHRoZSAke2RlbGV0ZWR9IG9sZGVzdCBmaWxlcyAoJHtkZWxldGVkQnl0ZXN9IGJ5dGVzKSwgJHt0b3RhbH0gYnl0ZXMgcmVtYWluYCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5mbHVzaFRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5mbHVzaFRpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYWludGVuYW5jZVRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tYWludGVuYW5jZVRpbWVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
397
- /* _JS_SOURCE_HASH = "9aef3e7d866ff885fca6b5cfd17cef6d37d5e205ba8cf26f86383392df4169a6"; */
398
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyZWFtaW5nTG9ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIlN0cmVhbWluZ0xvZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QixtREFBZ0Q7QUFDaEQscURBQWtEO0FBRWxELGdpQkFBZ2lCO0FBRWhpQix1RUFBdUU7QUFDdkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLDBEQUEwRDtBQUMxRCxNQUFNLGNBQWMsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6Qyx5RUFBeUU7QUFDekUsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDbEQsaUpBQWlKO0FBQ2pKLE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDaEQsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNoRCx3TEFBd0w7QUFDeEwsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzFDLHFHQUFxRztBQUNyRyxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQztBQUVsQyxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztBQUNsQyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUM7QUFpQ3BDLFNBQVMsZ0JBQWdCLENBQUMsSUFBWTtJQUNsQyxzU0FBc1M7SUFDdFMsSUFBSSxLQUFLLEdBQUcseUhBQXlILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pKLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1Qix1RkFBdUY7SUFDdkYsSUFBSSxVQUFVLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FB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QUUsQ0FBQztZQUNWLFlBQVksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzlCLENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixLQUFLLDZCQUE2QixPQUFPLGtCQUFrQixZQUFZLFlBQVksS0FBSyxlQUFlLENBQUMsQ0FBQztJQUN4SyxDQUFDO0lBRU0sT0FBTztRQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDTCxDQUFDO0NBQ0o7QUF2UUQsc0NBdVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHNvcnQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBMWjQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9sejQvTFo0XCI7XG5cbi8vIEdlbmVyaWMgYXBwZW5kLW9ubHkgSlNPTi1saW5lcyBsb2dnaW5nIG92ZXIgYSBmb2xkZXIuIEV2ZXJ5IHByb2Nlc3Mgc3RyZWFtcyB0byBpdHMgT1dOIGZpbGUgKG5hbWVkIGJ5IHBpZCArIHByb2Nlc3Mgc3RhcnQgdGltZSArIHRocmVhZCBpZCwgd2hpY2ggdG9nZXRoZXIgaWRlbnRpZnkgYSBwcm9jZXNzIGluY2FybmF0aW9uKSwgcm90YXRpbmcgdG8gYSBuZXcgZmlsZSBhdCBhIHNpemUgbGltaXQgYW5kIExaNC1jb21wcmVzc2luZyB0aGUgZmluaXNoZWQgb25lLiBFdmVyeSBwcm9jZXNzIHVzaW5nIHRoZSBmb2xkZXIgYWxzbyBNQUlOVEFJTlMgaXQgb24gYSByYW5kb21pemVkIGludGVydmFsOiBkZWFkIHByb2Nlc3NlcycgZmlsZXMgYXJlIGNvbXByZXNzZWQgZm9yIHRoZW0sIGR1cGxpY2F0ZSBjb21wcmVzc2lvbnMgYXJlIHJlc29sdmVkLCBhbmQgdGhlIG9sZGVzdCBmaWxlcyBhcmUgZGVsZXRlZCBvbmNlIHRoZSBmb2xkZXIgb3V0Z3Jvd3MgaXRzIGJ5dGUgYnVkZ2V0LiBJbnN0YW50aWF0ZSBvbmUgcGVyIGZvbGRlciBhbmQgY2FsbCBsb2coKS5cblxuLy8gQXBwZW5kcyBhcmUgY29hbGVzY2VkIGZvciB0aGlzIGxvbmc7IGEgY3Jhc2ggbG9zZXMgYXQgbW9zdCB0aGlzIG11Y2hcbmNvbnN0IEZMVVNIX0RFTEFZID0gNTAwMDtcbi8vIEEgZmlsZSByZWFjaGluZyB0aGlzIHNpemUgaXMgcm90YXRlZCBvdXQgYW5kIGNvbXByZXNzZWRcbmNvbnN0IE1BWF9GSUxFX0JZVEVTID0gMTAwICogMTAyNCAqIDEwMjQ7XG4vLyBUaGUgZm9sZGVyJ3MgdG90YWwgYnVkZ2V0OyBvbmNlIGV4Y2VlZGVkLCB0aGUgb2xkZXN0IGZpbGVzIGFyZSBkZWxldGVkXG5jb25zdCBUT1RBTF9MSU1JVF9CWVRFUyA9IDMwICogMTAyNCAqIDEwMjQgKiAxMDI0O1xuLy8gTWFpbnRlbmFuY2UgcnVucyBhdCBhIHJhbmRvbSBwb2ludCBpbiB0aGlzIHJhbmdlLCBzbyB0aGUgcHJvY2Vzc2VzIHNoYXJpbmcgdGhlIGZvbGRlciBkcmlmdCBhcGFydCBpbnN0ZWFkIG9mIHN0ZXBwaW5nIG9uIGVhY2ggb3RoZXIgZXZlcnkgcGFzc1xuY29uc3QgTUFJTlRFTkFOQ0VfTUlOX0lOVEVSVkFMID0gMzAgKiA2MCAqIDEwMDA7XG5jb25zdCBNQUlOVEVOQU5DRV9NQVhfSU5URVJWQUwgPSA2MCAqIDYwICogMTAwMDtcbi8vIEEgcGlkIGlzIG9ubHkgdGhlIHNhbWUgUFJPQ0VTUyBpZiBpdHMgc3RhcnQgdGltZSBtYXRjaGVzIHRoZSBmaWxlIG5hbWUncyAtIHdpdGhpbiB0aGlzIG11Y2gsIGJlY2F1c2Ugb3VyIG93biBzdGFydCB0aW1lIGlzIGRlcml2ZWQgZnJvbSBwcm9jZXNzLnVwdGltZSBhbmQgdGhlIE9TJ3MgaXMgcmVhZCBvZmYgL3Byb2NcbmNvbnN0IFBST0NFU1NfU1RBUlRfVE9MRVJBTkNFID0gNjAgKiAxMDAwO1xuLy8gSWYgZmx1c2hpbmcgZmFpbHMgcGVyc2lzdGVudGx5IChkaXNrIGdvbmUpLCBwZW5kaW5nIGVudHJpZXMgYXJlIGNhcHBlZCByYXRoZXIgdGhhbiBncm93aW5nIGZvcmV2ZXJcbmNvbnN0IE1BWF9QRU5ESU5HX0VOVFJJRVMgPSAxMDAwMDtcblxuY29uc3QgVU5DT01QUkVTU0VEX0VYVCA9IFwiLmpzb25sXCI7XG5jb25zdCBDT01QUkVTU0VEX0VYVCA9IFwiLmpzb25sLmx6NFwiO1xuXG4vKiogRXZlcnl0aGluZyBhIGxvZyBmaWxlJ3MgTkFNRSBzYXlzIGFib3V0IGl0IChwbHVzIGl0cyBvbi1kaXNrIHNpemUpLiBUaW1lcyBib3VuZCB0aGUgZW50cmllcyByb3VnaGx5OiBmcm9tIGlzIHdoZW4gaXRzIHByb2Nlc3Mgc3RhcnRlZCB3cml0aW5nIGl0LCB0byBpcyB3aGVuIGl0IHdhcyBjb21wcmVzc2VkLiAqL1xuZXhwb3J0IHR5cGUgTG9nRmlsZUluZm8gPSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKiBCeXRlcyBvbiBkaXNrIChjb21wcmVzc2VkIGJ5dGVzIGZvciBjb21wcmVzc2VkIGZpbGVzKSAqL1xuICAgIHNpemU6IG51bWJlcjtcbiAgICBwaWQ6IG51bWJlcjtcbiAgICBwcm9jZXNzU3RhcnRUaW1lOiBudW1iZXI7XG4gICAgdGhyZWFkSWQ6IHN0cmluZztcbiAgICAvKiogV2hlbiB0aGUgcHJvY2VzcyBzdGFydGVkIHdyaXRpbmcgdGhpcyBmaWxlICovXG4gICAgc3RhcnRUaW1lOiBudW1iZXI7XG4gICAgLyoqIFdoZW4gdGhlIGZpbGUgd2FzIGNvbXByZXNzZWQgLSBhYnNlbnQgd2hpbGUgaXQgaXMgc3RpbGwgYmVpbmcgc3RyZWFtZWQgdG8gKi9cbiAgICBlbmRUaW1lPzogbnVtYmVyO1xuICAgIC8qKiBIb3cgbWFueSBlbnRyaWVzIGl0IGhvbGRzIC0gb25seSBjb3VudGVkIGF0IGNvbXByZXNzaW9uLCBzbyBhYnNlbnQgb24gbGl2ZSBmaWxlcyAqL1xuICAgIGVudHJ5Q291bnQ/OiBudW1iZXI7XG4gICAgY29tcHJlc3NlZDogYm9vbGVhbjtcbiAgICAvKiogV2hldGhlciB0aGUgd3JpdGluZyBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlIChhbHdheXMgZmFsc2UgZm9yIGNvbXByZXNzZWQgZmlsZXMpICovXG4gICAgYWN0aXZlOiBib29sZWFuO1xufTtcblxudHlwZSBQYXJzZWROYW1lID0ge1xuICAgIHBpZDogbnVtYmVyO1xuICAgIHByb2Nlc3NTdGFydFRpbWU6IG51bWJlcjtcbiAgICB0aHJlYWRJZDogc3RyaW5nO1xuICAgIHN0YXJ0VGltZTogbnVtYmVyO1xuICAgIGVuZFRpbWU/OiBudW1iZXI7XG4gICAgZW50cnlDb3VudD86IG51bWJlcjtcbiAgICBjb21wcmVzc2VkOiBib29sZWFuO1xuICAgIC8qKiBUaGUgcGFydCBpZGVudGlmeWluZyB0aGUgT1JJR0lOQUwgc3RyZWFtIChwaWQrYm9ybit0aHJlYWQrZnJvbSkgLSB3aGF0IGR1cGxpY2F0ZSBjb21wcmVzc2lvbnMgc2hhcmUgKi9cbiAgICBvcmlnaW5LZXk6IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIHBhcnNlTG9nRmlsZU5hbWUobmFtZTogc3RyaW5nKTogUGFyc2VkTmFtZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVGhlIHRpbWUgZmllbGRzIGFjY2VwdCBhIGZyYWN0aW9uYWwgcGFydDogaG9zdHMgdGhhdCBzaGltIERhdGUubm93IHRvIGEgdHJ1ZS10aW1lIGNsb2NrIHJldHVybiBmcmFjdGlvbmFsIG1pbGxpc2Vjb25kcywgYW5kIGZpbGVzIHdyaXR0ZW4gYmVmb3JlIHRoZSB3cml0ZXIgcm91bmRlZCB0aGVtIGFyZSBhbHJlYWR5IG9uIGRpc2sgZXZlcnl3aGVyZSAtIHRoZXkgbXVzdCBzdGF5IGxpc3RhYmxlIChhbmQgbWFpbnRhaW5hYmxlLCBvciB0aGV5IHdvdWxkIG5ldmVyIGJlIGNvbXByZXNzZWQgb3IgY2xlYW5lZCkuXG4gICAgbGV0IG1hdGNoID0gL15waWQoXFxkKylfYm9ybihcXGQrKV90aHJlYWQoW1xcdy1dKz8pX2Zyb20oXFxkKyg/OlxcLlxcZCspPykoPzpfdG8oXFxkKyg/OlxcLlxcZCspPylfY291bnQoXFxkKylfaWQoW2EtejAtOV0rKSk/XFwuanNvbmwoXFwubHo0KT8kLy5leGVjKG5hbWUpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IGNvbXByZXNzZWQgPSAhIW1hdGNoWzhdO1xuICAgIC8vIEEgY29tcHJlc3NlZCBmaWxlIHdpdGhvdXQgaXRzIGNvbXByZXNzaW9uIGZpZWxkcyAob3IgdGhlIHJldmVyc2UpIGlzIG5vdCBvbmUgb2Ygb3Vyc1xuICAgIGlmIChjb21wcmVzc2VkICE9PSAobWF0Y2hbNV0gIT09IHVuZGVmaW5lZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcGlkOiArbWF0Y2hbMV0sXG4gICAgICAgIHByb2Nlc3NTdGFydFRpbWU6ICttYXRjaFsyXSxcbiAgICAgICAgdGhyZWFkSWQ6IG1hdGNoWzNdLFxuICAgICAgICBzdGFydFRpbWU6ICttYXRjaFs0XSxcbiAgICAgICAgZW5kVGltZTogbWF0Y2hbNV0gIT09IHVuZGVmaW5lZCAmJiArbWF0Y2hbNV0gfHwgdW5kZWZpbmVkLFxuICAgICAgICBlbnRyeUNvdW50OiBtYXRjaFs2XSAhPT0gdW5kZWZpbmVkICYmICttYXRjaFs2XSB8fCB1bmRlZmluZWQsXG4gICAgICAgIGNvbXByZXNzZWQsXG4gICAgICAgIG9yaWdpbktleTogYHBpZCR7bWF0Y2hbMV19X2Jvcm4ke21hdGNoWzJdfV90aHJlYWQke21hdGNoWzNdfV9mcm9tJHttYXRjaFs0XX1gLFxuICAgIH07XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBwaWQgaXMgYWxpdmUgQU5EIGlzIHRoZSBzYW1lIHByb2Nlc3MgaW5jYXJuYXRpb24gdGhlIGZpbGUgbmFtZSBkZXNjcmliZWQuIE9uIExpbnV4IC9wcm9jIGdpdmVzIHRoZSByZWFsIHN0YXJ0IHRpbWU7IGVsc2V3aGVyZSBhIGxpdmUgcGlkIGlzIGNvbnNlcnZhdGl2ZWx5IHRyZWF0ZWQgYXMgdGhlIHNhbWUgcHJvY2VzcyAobmV2ZXIgY29tcHJlc3MgdW5kZXIgYSBydW5uaW5nIHByb2Nlc3MpLiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNQcm9jZXNzQWxpdmUocGlkOiBudW1iZXIsIHByb2Nlc3NTdGFydFRpbWU6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGxldCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChgL3Byb2MvJHtwaWR9YCk7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyhzdGF0LmN0aW1lTXMgLSBwcm9jZXNzU3RhcnRUaW1lKSA8IFBST0NFU1NfU1RBUlRfVE9MRVJBTkNFO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBzZWFyY2hlciBvdmVyIG9uZSBsb2cgZmlsZSAoYXMgcmVhZEZpbGVDb21wcmVzc2VkIHJldHVybnMgaXQgLSBhbHdheXMgTFo0KSB0aGF0IG5ldmVyIGRlY29kZXNcbiAqIHRoZSB3aG9sZSB0aGluZzogSlNPTiBlc2NhcGVzIGxpbmUgYnJlYWtzIGluc2lkZSBzdHJpbmdzLCBzbyB0aGUgb25seSBBQ1RVQUwgbGluZSBicmVha3MgaW4gdGhlXG4gKiBmaWxlIGFyZSB0aGUgc2VwYXJhdG9ycyBiZXR3ZWVuIGxvZyBzdGF0ZW1lbnRzIC0gYSBwbGFpbiBzdWJzdHJpbmcgc2VhcmNoIG92ZXIgdGhlIHJhdyB0ZXh0LFxuICogYm91bmRlZCBvdXQgdG8gdGhlIHN1cnJvdW5kaW5nIGxpbmUgYnJlYWtzLCBmaW5kcyBleGFjdGx5IHRoZSBtYXRjaGluZyBzdGF0ZW1lbnRzLCBhbmQgb25seSBUSE9TRVxuICogYXJlIGRlY29kZWQgYW5kIHJldHVybmVkIGFzIG9iamVjdHMuIEV2ZXJ5IHNlYXJjaCBzdHJpbmcgbXVzdCBhcHBlYXIgaW4gYSBzdGF0ZW1lbnQncyByYXcgSlNPTiBmb3JcbiAqIGl0IHRvIG1hdGNoIChzbyBzZWFyY2ggZm9yIHZhbHVlcyBhcyB0aGV5IGFyZSBlbmNvZGVkIC0gZS5nLiBxdW90ZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9nU2VhcmNoZXIoZGF0YTogQnVmZmVyKTogKHNlYXJjaGVzOiBzdHJpbmdbXSkgPT4gdW5rbm93bltdIHtcbiAgICBsZXQgdGV4dCA9IExaNC5kZWNvbXByZXNzKGRhdGEpLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICByZXR1cm4gc2VhcmNoZXMgPT4ge1xuICAgICAgICBpZiAoIXNlYXJjaGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm92aWRlIGF0IGxlYXN0IG9uZSBzZWFyY2ggc3RyaW5nIChhbiBlbXB0eSBzZWFyY2ggd291bGQganVzdCBiZSBkZWNvZGVMb2dGaWxlKWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlbnRyaWVzOiB1bmtub3duW10gPSBbXTtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IHRleHQuaW5kZXhPZihzZWFyY2hlc1swXSwgaW5kZXgpO1xuICAgICAgICAgICAgaWYgKGZvdW5kID09PSAtMSkgYnJlYWs7XG4gICAgICAgICAgICBsZXQgbGluZVN0YXJ0ID0gdGV4dC5sYXN0SW5kZXhPZihcIlxcblwiLCBmb3VuZCkgKyAxO1xuICAgICAgICAgICAgbGV0IGxpbmVFbmQgPSB0ZXh0LmluZGV4T2YoXCJcXG5cIiwgZm91bmQpO1xuICAgICAgICAgICAgaWYgKGxpbmVFbmQgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbGluZUVuZCA9IHRleHQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUGFzdCB0aGlzIGxpbmUgZWl0aGVyIHdheSwgc28gc2V2ZXJhbCBtYXRjaGVzIGluc2lkZSBvbmUgc3RhdGVtZW50IHJldHVybiBpdCBvbmNlXG4gICAgICAgICAgICBpbmRleCA9IGxpbmVFbmQgKyAxO1xuICAgICAgICAgICAgbGV0IGxpbmUgPSB0ZXh0LnNsaWNlKGxpbmVTdGFydCwgbGluZUVuZCk7XG4gICAgICAgICAgICBsZXQgbWF0Y2hlc0FsbCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGxldCBvdGhlciBvZiBzZWFyY2hlcy5zbGljZSgxKSkge1xuICAgICAgICAgICAgICAgIGlmICghbGluZS5pbmNsdWRlcyhvdGhlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc0FsbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXNBbGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goSlNPTi5wYXJzZShsaW5lKSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBBIHRvcm4gZmluYWwgbGluZSAodGhlIHdyaXRlciBjcmFzaGVkIG1pZC1hcHBlbmQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfTtcbn1cblxuLyoqIERlY29kZXMgYSBsb2cgZmlsZSdzIGJ5dGVzIChhcyByZWFkRmlsZUNvbXByZXNzZWQgcmV0dXJucyB0aGVtIC0gYWx3YXlzIExaNCkgYmFjayBpbnRvIHRoZSBsb2dnZWQgb2JqZWN0cy4gQSB0b3JuIGZpbmFsIGxpbmUgKHRoZSB3cml0ZXIgY3Jhc2hlZCBtaWQtYXBwZW5kKSBpcyBza2lwcGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUxvZ0ZpbGUoZGF0YTogQnVmZmVyKTogdW5rbm93bltdIHtcbiAgICBsZXQgdGV4dCA9IExaNC5kZWNvbXByZXNzKGRhdGEpLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICBsZXQgZW50cmllczogdW5rbm93bltdID0gW107XG4gICAgZm9yIChsZXQgbGluZSBvZiB0ZXh0LnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgICAgIGlmICghbGluZSkgY29udGludWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goSlNPTi5wYXJzZShsaW5lKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG59XG5cbmV4cG9ydCBjbGFzcyBTdHJlYW1pbmdMb2dzIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzoge1xuICAgICAgICBmb2xkZXI6IHN0cmluZztcbiAgICAgICAgLyoqIEluY2x1ZGVkIGluIGV2ZXJ5IGZpbGUgbmFtZSAtIHNlZSBtaXNjL2h0dHBzL2NlcnRzLnRzIGdldE93blRocmVhZElkLiBQcm9jZXNzZXMgd2l0aG91dCBvbmUgd3JpdGUgXCJub25lXCIuICovXG4gICAgICAgIHRocmVhZElkPzogc3RyaW5nO1xuICAgICAgICBtYXhGaWxlQnl0ZXM/OiBudW1iZXI7XG4gICAgICAgIHRvdGFsTGltaXRCeXRlcz86IG51bWJlcjtcbiAgICB9KSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVNYWludGVuYW5jZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc1N0YXJ0VGltZSA9IE1hdGgucm91bmQoRGF0ZS5ub3coKSAtIHByb2Nlc3MudXB0aW1lKCkgKiAxMDAwKTtcbiAgICBwcml2YXRlIHRocmVhZElkID0gKHRoaXMuY29uZmlnLnRocmVhZElkIHx8IFwibm9uZVwiKS5yZXBsYWNlKC9bXlxcdy1dL2csIFwiX1wiKTtcbiAgICBwcml2YXRlIHBlbmRpbmc6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBmbHVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIG1haW50ZW5hbmNlVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIC8vIFNlcmlhbGl6ZXMgZXZlcnl0aGluZyB0aGF0IHRvdWNoZXMgdGhlIGN1cnJlbnQgZmlsZSwgc28gYXBwZW5kcywgcm90YXRpb24sIGFuZCBpbi1tZW1vcnkgY29tcHJlc3Npb24gb2YgdGhlIGxpdmUgZmlsZSBuZXZlciBpbnRlcmxlYXZlXG4gICAgcHJpdmF0ZSB3cml0ZUNoYWluOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcHJpdmF0ZSBjdXJyZW50UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgY3VycmVudEJ5dGVzID0gMDtcbiAgICBwcml2YXRlIGRpc3Bvc2VkID0gZmFsc2U7XG5cbiAgICAvKiogUXVldWVzIG9uZSBlbnRyeSAoYW55dGhpbmcgSlNPTi1zZXJpYWxpemFibGUpLiBOZXZlciB0aHJvd3MgLSBsb2dnaW5nIG11c3Qgbm90IHRha2UgZG93biB0aGUgY2FsbGVyLiAqL1xuICAgIHB1YmxpYyBsb2coZW50cnk6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmcubGVuZ3RoID49IE1BWF9QRU5ESU5HX0VOVFJJRVMpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgZGlzayBpcyBicm9rZW4gKGZsdXNoZXMgYXJlIGZhaWxpbmcpIC0gZHJvcHBpbmcgdGhlIG9sZGVzdCBiZWF0cyBncm93aW5nIGZvcmV2ZXJcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmcuc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGVuZGluZy5wdXNoKEpTT04uc3RyaW5naWZ5KGVudHJ5KSk7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlRmx1c2goKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDb3VsZCBub3QgcXVldWUgYSBsb2cgZW50cnkgKCR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9KWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzY2hlZHVsZUZsdXNoKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5mbHVzaFRpbWVyICE9PSB1bmRlZmluZWQgfHwgdGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5mbHVzaCgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS53YXJuKGBGbHVzaGluZyBsb2dzIGluICR7dGhpcy5jb25maWcuZm9sZGVyfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgfSwgRkxVU0hfREVMQVkpO1xuICAgICAgICAodGhpcy5mbHVzaFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLndyaXRlQ2hhaW4udGhlbigoKSA9PiB0aGlzLndyaXRlUGVuZGluZygpKTtcbiAgICAgICAgLy8gVGhlIGNoYWluIG9ubHkgc2VyaWFsaXplczsgYSBmYWlsdXJlIGJlbG9uZ3MgdG8gdGhlIGNhbGxlciB0aGF0IGFza2VkIGZvciB0aGlzIGZsdXNoLCBub3QgZXZlcnkgb25lIGFmdGVyIGl0XG4gICAgICAgIHRoaXMud3JpdGVDaGFpbiA9IHJlc3VsdC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICBhd2FpdCByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZVBlbmRpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5wZW5kaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgbGluZXMgPSB0aGlzLnBlbmRpbmc7XG4gICAgICAgIHRoaXMucGVuZGluZyA9IFtdO1xuICAgICAgICBsZXQgZGF0YSA9IGxpbmVzLmpvaW4oXCJcXG5cIikgKyBcIlxcblwiO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRQYXRoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodGhpcy5jb25maWcuZm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAvLyBSb3VuZGVkLCBhcyBhIHNoaW1tZWQgRGF0ZS5ub3cgY2FuIHJldHVybiBmcmFjdGlvbmFsIG1pbGxpc2Vjb25kcywgYW5kIGEgXCIuXCIgaW4gdGhlIG5hbWUgYnJlYWtzIG5hbWUgcGFyc2luZyBmb3IgYW55IHJlYWRlciB3aXRob3V0IHRoZSBmcmFjdGlvbmFsLXRvbGVyYW50IHJlZ2V4XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGF0aCA9IHBhdGguam9pbih0aGlzLmNvbmZpZy5mb2xkZXIsIGBwaWQke3Byb2Nlc3MucGlkfV9ib3JuJHt0aGlzLnByb2Nlc3NTdGFydFRpbWV9X3RocmVhZCR7dGhpcy50aHJlYWRJZH1fZnJvbSR7TWF0aC5yb3VuZChEYXRlLm5vdygpKX0ke1VOQ09NUFJFU1NFRF9FWFR9YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Qnl0ZXMgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMuYXBwZW5kRmlsZSh0aGlzLmN1cnJlbnRQYXRoLCBkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEJ5dGVzICs9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSBsaW5lcy5jb25jYXQodGhpcy5wZW5kaW5nKTtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVGbHVzaCgpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Qnl0ZXMgPj0gKHRoaXMuY29uZmlnLm1heEZpbGVCeXRlcyB8fCBNQVhfRklMRV9CWVRFUykpIHtcbiAgICAgICAgICAgIGxldCBmaW5pc2hlZCA9IHRoaXMuY3VycmVudFBhdGg7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Qnl0ZXMgPSAwO1xuICAgICAgICAgICAgdm9pZCB0aGlzLmNvbXByZXNzRmlsZShmaW5pc2hlZCkuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTGVmdCB1bmNvbXByZXNzZWQ6IG1haW50ZW5hbmNlIChvdXJzIGFmdGVyIGRlYXRoLCBvciBhbnkgcGVlcidzKSBjb21wcmVzc2VzIGl0IGxhdGVyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBDb21wcmVzc2luZyByb3RhdGVkIGxvZyAke2ZpbmlzaGVkfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wcmVzc2VzIG9uZSBmaW5pc2hlZCBsb2cgZmlsZTogTFo0IGludG8gYSB0ZW1wIFNVQkZPTERFUiAobmV2ZXIgYSB0ZW1wIG5hbWUgaW4gdGhlIGxvZ1xuICAgICAqIGZvbGRlciBpdHNlbGYgLSBhIGNyYXNoZWQgd3JpdGUgbXVzdCBub3QgbGVhdmUgYSBjb3JydXB0IGZpbGUgd2hlcmUgdGhlIG1haW50ZW5hbmNlIHNjYW5zIGFyZSksXG4gICAgICogcmVuYW1lZCBpbnRvIHBsYWNlIChzYW1lIGRyaXZlLCBzbyB0aGUgcmVuYW1lIGlzIGF0b21pYyksIHZlcmlmaWVkLCBhbmQgb25seSBUSEVOIGlzIHRoZVxuICAgICAqIG9yaWdpbmFsIGRlbGV0ZWQgLSBhdCBubyBwb2ludCBpcyB0aGUgZGF0YSBpbiBmZXdlciB0aGFuIG9uZSBjb21wbGV0ZSBmaWxlLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY29tcHJlc3NGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IG5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKTtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlTG9nRmlsZU5hbWUobmFtZSk7XG4gICAgICAgIGlmICghcGFyc2VkIHx8IHBhcnNlZC5jb21wcmVzc2VkKSByZXR1cm47XG4gICAgICAgIGxldCByYXcgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIGxldCBlbnRyeUNvdW50ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChyYXdbaV0gPT09IDEwKSBlbnRyeUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbXByZXNzZWQgPSBMWjQuY29tcHJlc3MocmF3KTtcbiAgICAgICAgbGV0IGlkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApO1xuICAgICAgICBsZXQgZmluYWxOYW1lID0gYCR7cGFyc2VkLm9yaWdpbktleX1fdG8ke01hdGgucm91bmQoRGF0ZS5ub3coKSl9X2NvdW50JHtlbnRyeUNvdW50fV9pZCR7aWR9JHtDT01QUkVTU0VEX0VYVH1gO1xuICAgICAgICBsZXQgdGVtcERpciA9IHBhdGguam9pbih0aGlzLmNvbmZpZy5mb2xkZXIsIFwiLnRtcFwiKTtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodGVtcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGxldCB0ZW1wUGF0aCA9IHBhdGguam9pbih0ZW1wRGlyLCBmaW5hbE5hbWUpO1xuICAgICAgICBsZXQgZmluYWxQYXRoID0gcGF0aC5qb2luKHRoaXMuY29uZmlnLmZvbGRlciwgZmluYWxOYW1lKTtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHRlbXBQYXRoLCBjb21wcmVzc2VkKTtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKHRlbXBQYXRoLCBmaW5hbFBhdGgpO1xuICAgICAgICAvLyBQYXJhbm9pYSBiZWZvcmUgZGVsZXRpbmcgdGhlIG9ubHkgb3RoZXIgY29weVxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZpbmFsUGF0aCk7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayhmaWxlUGF0aCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDb21wcmVzc2VkIGxvZyAke25hbWV9IC0+ICR7ZmluYWxOYW1lfSAoJHtyYXcubGVuZ3RofSAtPiAke2NvbXByZXNzZWQubGVuZ3RofSBieXRlcywgJHtlbnRyeUNvdW50fSBlbnRyaWVzKWApO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBsaXN0aW5nIC8gcmVhZGluZyDilIDilIBcblxuICAgIHB1YmxpYyBhc3luYyBsaXN0RmlsZXMoKTogUHJvbWlzZTxMb2dGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBuYW1lczogc3RyaW5nW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuYW1lcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIodGhpcy5jb25maWcuZm9sZGVyKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKChlIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4gW107XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaWxlczogTG9nRmlsZUluZm9bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICBsZXQgcGFyc2VkID0gcGFyc2VMb2dGaWxlTmFtZShuYW1lKTtcbiAgICAgICAgICAgIGlmICghcGFyc2VkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4odGhpcy5jb25maWcuZm9sZGVyLCBuYW1lKSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICghc3RhdCkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgYWN0aXZlID0gIXBhcnNlZC5jb21wcmVzc2VkICYmIGF3YWl0IGlzUHJvY2Vzc0FsaXZlKHBhcnNlZC5waWQsIHBhcnNlZC5wcm9jZXNzU3RhcnRUaW1lKTtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgc2l6ZTogc3RhdC5zaXplLFxuICAgICAgICAgICAgICAgIHBpZDogcGFyc2VkLnBpZCxcbiAgICAgICAgICAgICAgICBwcm9jZXNzU3RhcnRUaW1lOiBwYXJzZWQucHJvY2Vzc1N0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICB0aHJlYWRJZDogcGFyc2VkLnRocmVhZElkLFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogcGFyc2VkLnN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lOiBwYXJzZWQuZW5kVGltZSxcbiAgICAgICAgICAgICAgICBlbnRyeUNvdW50OiBwYXJzZWQuZW50cnlDb3VudCxcbiAgICAgICAgICAgICAgICBjb21wcmVzc2VkOiBwYXJzZWQuY29tcHJlc3NlZCxcbiAgICAgICAgICAgICAgICBhY3RpdmUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHguc3RhcnRUaW1lKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIC8qKiBPbmUgZmlsZSdzIGJ5dGVzLCBBTFdBWVMgTFo0LWNvbXByZXNzZWQ6IGNvbXByZXNzZWQgZmlsZXMgYXJlIHNlbnQgYXMtaXMsIGEgc3RpbGwtc3RyZWFtaW5nIGZpbGUgaXMgZmx1c2hlZCBhbmQgY29tcHJlc3NlZCBpbiBtZW1vcnkgKHNtYWxsZXIgb3ZlciB0aGUgbmV0d29yazsgZGVjb2RlTG9nRmlsZSBoYW5kbGVzIGJvdGggaWRlbnRpY2FsbHkpLiAqL1xuICAgIHB1YmxpYyBhc3luYyByZWFkRmlsZUNvbXByZXNzZWQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlTG9nRmlsZU5hbWUobmFtZSk7XG4gICAgICAgIGlmICghcGFyc2VkIHx8IG5hbWUuaW5jbHVkZXMoXCIvXCIpIHx8IG5hbWUuaW5jbHVkZXMoXCJcXFxcXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBhIGxvZyBmaWxlIG5hbWU6ICR7SlNPTi5zdHJpbmdpZnkobmFtZS5zbGljZSgwLCAyMDApKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5jb25maWcuZm9sZGVyLCBuYW1lKTtcbiAgICAgICAgaWYgKHBhcnNlZC5jb21wcmVzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZsdXNoIHNvIG91ciBvd24gbGl2ZSBmaWxlIGluY2x1ZGVzIGV2ZXJ5dGhpbmcgbG9nZ2VkIHVwIHRvIG5vd1xuICAgICAgICBhd2FpdCB0aGlzLmZsdXNoKCk7XG4gICAgICAgIHJldHVybiBMWjQuY29tcHJlc3MoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgbWFpbnRlbmFuY2Ug4pSA4pSAXG5cbiAgICBwcml2YXRlIHNjaGVkdWxlTWFpbnRlbmFuY2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgIGxldCB3YWl0ID0gTUFJTlRFTkFOQ0VfTUlOX0lOVEVSVkFMICsgTWF0aC5yYW5kb20oKSAqIChNQUlOVEVOQU5DRV9NQVhfSU5URVJWQUwgLSBNQUlOVEVOQU5DRV9NSU5fSU5URVJWQUwpO1xuICAgICAgICB0aGlzLm1haW50ZW5hbmNlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5ydW5NYWludGVuYW5jZSgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS53YXJuKGBMb2cgbWFpbnRlbmFuY2Ugb2YgJHt0aGlzLmNvbmZpZy5mb2xkZXJ9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpLmZpbmFsbHkoKCkgPT4gdGhpcy5zY2hlZHVsZU1haW50ZW5hbmNlKCkpO1xuICAgICAgICB9LCB3YWl0KTtcbiAgICAgICAgKHRoaXMubWFpbnRlbmFuY2VUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hhcmVkIHVwa2VlcCBvZiB0aGUgZm9sZGVyIC0gZXZlcnkgcHJvY2VzcyB1c2luZyBpdCBydW5zIHRoaXMsIHNvIG5vdGhpbmcgZGVwZW5kcyBvbiBhbnkgb25lXG4gICAgICogcHJvY2VzcyBzdXJ2aXZpbmc6IGRlYWQgcHJvY2Vzc2VzJyB1bmNvbXByZXNzZWQgZmlsZXMgYXJlIGNvbXByZXNzZWQgZm9yIHRoZW07IGR1cGxpY2F0ZVxuICAgICAqIGNvbXByZXNzaW9ucyBvZiBvbmUgc3RyZWFtICh0d28gbWFpbnRhaW5lcnMgcmFjaW5nKSBhcmUgcmVzb2x2ZWQgYnkga2VlcGluZyB0aGUgT0xERVNUIGNvcHk7XG4gICAgICogYW4gdW5jb21wcmVzc2VkIG9yaWdpbmFsIHdob3NlIGNvbXByZXNzaW9uIGFscmVhZHkgZXhpc3RzIGlzIGRlbGV0ZWQgKGl0cyBjb21wcmVzc29yIGRpZWRcbiAgICAgKiBiZXR3ZWVuIHJlbmFtZSBhbmQgdW5saW5rKTsgYW5kIHRoZSBmb2xkZXIncyB0b3RhbCBzaXplIGlzIGJyb3VnaHQgdW5kZXIgaXRzIGJ1ZGdldCBieVxuICAgICAqIGRlbGV0aW5nIHRoZSBvbGRlc3QgZmlsZXMuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJ1bk1haW50ZW5hbmNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgbmFtZXM6IHN0cmluZ1tdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmFtZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRoaXMuY29uZmlnLmZvbGRlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICgoZSBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyc2VkQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIFBhcnNlZE5hbWU+KCk7XG4gICAgICAgIGZvciAobGV0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgIGxldCBwYXJzZWQgPSBwYXJzZUxvZ0ZpbGVOYW1lKG5hbWUpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZCkgcGFyc2VkQnlOYW1lLnNldChuYW1lLCBwYXJzZWQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb21wcmVzc2VkT3JpZ2lucyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICAgICAgZm9yIChsZXQgW25hbWUsIHBhcnNlZF0gb2YgcGFyc2VkQnlOYW1lKSB7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZC5jb21wcmVzc2VkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gY29tcHJlc3NlZE9yaWdpbnMuZ2V0KHBhcnNlZC5vcmlnaW5LZXkpO1xuICAgICAgICAgICAgaWYgKCFsaXN0KSB7XG4gICAgICAgICAgICAgICAgbGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbXByZXNzZWRPcmlnaW5zLnNldChwYXJzZWQub3JpZ2luS2V5LCBsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpc3QucHVzaChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEdXBsaWNhdGUgY29tcHJlc3Npb25zOiBrZWVwIHRoZSBvbGRlc3QgKGZpcnN0IHdyaXR0ZW4pLCBkZWxldGUgdGhlIHJlc3RcbiAgICAgICAgZm9yIChsZXQgW29yaWdpbiwgbGlzdF0gb2YgY29tcHJlc3NlZE9yaWdpbnMpIHtcbiAgICAgICAgICAgIGlmIChsaXN0Lmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc29ydChsaXN0LCBuYW1lID0+IHBhcnNlZEJ5TmFtZS5nZXQobmFtZSk/LmVuZFRpbWUgfHwgMCk7XG4gICAgICAgICAgICBmb3IgKGxldCBkdXBsaWNhdGUgb2YgbGlzdC5zbGljZSgxKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBEZWxldGluZyBkdXBsaWNhdGUgY29tcHJlc3NlZCBsb2cgJHtkdXBsaWNhdGV9IChhbm90aGVyIG1haW50YWluZXIgY29tcHJlc3NlZCAke29yaWdpbn0gZmlyc3QsIGtlZXBpbmcgJHtsaXN0WzBdfSlgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsocGF0aC5qb2luKHRoaXMuY29uZmlnLmZvbGRlciwgZHVwbGljYXRlKSkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgICAgICAgICBwYXJzZWRCeU5hbWUuZGVsZXRlKGR1cGxpY2F0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgW25hbWUsIHBhcnNlZF0gb2YgcGFyc2VkQnlOYW1lKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VkLmNvbXByZXNzZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMuY29uZmlnLmZvbGRlciwgbmFtZSk7XG4gICAgICAgICAgICBpZiAoZmlsZVBhdGggPT09IHRoaXMuY3VycmVudFBhdGgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGNvbXByZXNzZWRPcmlnaW5zLmhhcyhwYXJzZWQub3JpZ2luS2V5KSkge1xuICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgY29tcHJlc3NlZCBieSBzb21lb25lIHdob3NlIGNsZWFudXAgZGllZCBiZXR3ZWVuIHJlbmFtZSBhbmQgdW5saW5rXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW5nIHVuY29tcHJlc3NlZCBsb2cgJHtuYW1lfTogaXRzIGNvbXByZXNzZWQgdmVyc2lvbiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayhmaWxlUGF0aCkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEEgbGl2ZSBwcm9jZXNzIG93bnMgaXRzIHVuY29tcHJlc3NlZCBmaWxlOyBvbmx5IGEgREVBRCBwcm9jZXNzJ3MgZmlsZXMgYXJlIGNvbXByZXNzZWQgZm9yIGl0IChvdXIgb3duIHBpZCBhbHdheXMgcmVhZHMgYXMgYWxpdmUsIHdoaWNoIGNvcnJlY3RseSBwcm90ZWN0cyBvdXIgY3VycmVudCBmaWxlIC0gb3VyIHJvdGF0ZWQgbGVmdG92ZXJzIHdlcmUgZXhjbHVkZWQgYWJvdmUgb25seSBpZiBjdXJyZW50LCBzbyBjb21wcmVzcyB0aG9zZSB0b28pXG4gICAgICAgICAgICBpZiAocGFyc2VkLnBpZCAhPT0gcHJvY2Vzcy5waWQgJiYgYXdhaXQgaXNQcm9jZXNzQWxpdmUocGFyc2VkLnBpZCwgcGFyc2VkLnByb2Nlc3NTdGFydFRpbWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21wcmVzc0ZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ29tcHJlc3NpbmcgZGVhZCBwcm9jZXNzJ3MgbG9nICR7bmFtZX0gZmFpbGVkICh0aGUgbmV4dCBtYWludGVuYW5jZSBwYXNzIHJldHJpZXMpOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZW5mb3JjZVRvdGFsTGltaXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGVuZm9yY2VUb3RhbExpbWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgbGltaXQgPSB0aGlzLmNvbmZpZy50b3RhbExpbWl0Qnl0ZXMgfHwgVE9UQUxfTElNSVRfQllURVM7XG4gICAgICAgIGxldCBmaWxlcyA9IGF3YWl0IHRoaXMubGlzdEZpbGVzKCk7XG4gICAgICAgIGxldCB0b3RhbCA9IGZpbGVzLnJlZHVjZSgoc3VtLCB4KSA9PiBzdW0gKyB4LnNpemUsIDApO1xuICAgICAgICBpZiAodG90YWwgPD0gbGltaXQpIHJldHVybjtcbiAgICAgICAgLy8gT2xkZXN0IGZpcnN0LCBieSB0aGUgZW5kIG9mIHdoYXQgdGhleSBjb3ZlcjsgbGl2ZSBmaWxlcyBsYXN0ICh0aGV5IGFyZSB0aGUgbmV3ZXN0IGRhdGEgYnkgZGVmaW5pdGlvbilcbiAgICAgICAgbGV0IGRlbGV0YWJsZSA9IGZpbGVzLmZpbHRlcih4ID0+ICF4LmFjdGl2ZSk7XG4gICAgICAgIHNvcnQoZGVsZXRhYmxlLCB4ID0+IHguZW5kVGltZSB8fCB4LnN0YXJ0VGltZSk7XG4gICAgICAgIGxldCBkZWxldGVkID0gMDtcbiAgICAgICAgbGV0IGRlbGV0ZWRCeXRlcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgZGVsZXRhYmxlKSB7XG4gICAgICAgICAgICBpZiAodG90YWwgPD0gbGltaXQpIGJyZWFrO1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudW5saW5rKHBhdGguam9pbih0aGlzLmNvbmZpZy5mb2xkZXIsIGZpbGUubmFtZSkpLmNhdGNoKCgpID0+IHsgfSk7XG4gICAgICAgICAgICB0b3RhbCAtPSBmaWxlLnNpemU7XG4gICAgICAgICAgICBkZWxldGVkKys7XG4gICAgICAgICAgICBkZWxldGVkQnl0ZXMgKz0gZmlsZS5zaXplO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBMb2dzIGluICR7dGhpcy5jb25maWcuZm9sZGVyfSBvdXRncmV3IHRoZWlyICR7bGltaXR9IGJ5dGUgYnVkZ2V0OiBkZWxldGVkIHRoZSAke2RlbGV0ZWR9IG9sZGVzdCBmaWxlcyAoJHtkZWxldGVkQnl0ZXN9IGJ5dGVzKSwgJHt0b3RhbH0gYnl0ZXMgcmVtYWluYCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5mbHVzaFRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5mbHVzaFRpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYWludGVuYW5jZVRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tYWludGVuYW5jZVRpbWVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
399
+ /* _JS_SOURCE_HASH = "e469b5a680d38d12efd2071191e27c81bcbebfb6ac34330bdf9686d27e2b89da"; */