@workflow/world-local 5.0.0-beta.13 → 5.0.0-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/fs.d.ts CHANGED
@@ -115,9 +115,13 @@ export declare function readBuffer(filePath: string): Promise<Buffer>;
115
115
  export declare function readFirstByte(filePath: string): Promise<number | undefined>;
116
116
  export declare function deleteJSON(filePath: string): Promise<void>;
117
117
  /**
118
- * Atomically create a file using O_CREAT | O_EXCL flags.
119
- * Returns true if the file was created, false if it already exists.
120
- * This is atomic at the OS level, safe for concurrent access.
118
+ * Atomically publish a fully-written file without overwriting an existing one.
119
+ *
120
+ * Writing directly with O_CREAT | O_EXCL makes the destination visible before
121
+ * its contents are complete, so concurrent readers can observe a partial file.
122
+ * Instead, write to a unique file in the same directory, then hard-link it into
123
+ * place. Creating the link is atomic and fails with EEXIST if another writer
124
+ * published the destination first.
121
125
  */
122
126
  export declare function writeExclusive(filePath: string, data: string): Promise<boolean>;
123
127
  export declare function listJSONFiles(dirPath: string): Promise<string[]>;
package/dist/fs.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"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"}
package/dist/fs.js CHANGED
@@ -324,21 +324,36 @@ export async function deleteJSON(filePath) {
324
324
  }
325
325
  }
326
326
  /**
327
- * Atomically create a file using O_CREAT | O_EXCL flags.
328
- * Returns true if the file was created, false if it already exists.
329
- * This is atomic at the OS level, safe for concurrent access.
327
+ * Atomically publish a fully-written file without overwriting an existing one.
328
+ *
329
+ * Writing directly with O_CREAT | O_EXCL makes the destination visible before
330
+ * its contents are complete, so concurrent readers can observe a partial file.
331
+ * Instead, write to a unique file in the same directory, then hard-link it into
332
+ * place. Creating the link is atomic and fails with EEXIST if another writer
333
+ * published the destination first.
330
334
  */
331
335
  export async function writeExclusive(filePath, data) {
332
336
  await ensureDir(path.dirname(filePath));
337
+ const tempPath = `${filePath}.tmp.${ulid()}`;
338
+ let tempFileCreated = false;
333
339
  try {
334
- await fs.writeFile(filePath, data, { flag: 'wx' });
335
- return true;
340
+ await fs.writeFile(tempPath, data, { flag: 'wx' });
341
+ tempFileCreated = true;
342
+ try {
343
+ await withWindowsRetry(() => fs.link(tempPath, filePath));
344
+ return true;
345
+ }
346
+ catch (error) {
347
+ if (error.code === 'EEXIST') {
348
+ return false;
349
+ }
350
+ throw error;
351
+ }
336
352
  }
337
- catch (error) {
338
- if (error.code === 'EEXIST') {
339
- return false;
353
+ finally {
354
+ if (tempFileCreated) {
355
+ await withWindowsRetry(() => fs.unlink(tempPath), 3).catch(() => { });
340
356
  }
341
- throw error;
342
357
  }
343
358
  }
344
359
  export async function listJSONFiles(dirPath) {
@@ -500,4 +515,4 @@ export async function paginatedFileSystemQuery(config) {
500
515
  hasMore,
501
516
  };
502
517
  }
503
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRW5EOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGtCQUFrQjtJQUN6RCxZQUFZLElBQVksRUFBRSxLQUFhO1FBQ3JDLEtBQUssQ0FDSCxVQUFVLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsNkRBQTZELENBQ3hHLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7SUFF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QUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRTNFLHVFQUF1RTtRQUN2RSxJQUFJLGNBQWMsS0FBSyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDbEMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixPQUFPLFNBQVMsS0FBSyxLQUFLO2dCQUN4QixDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hCLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztJQUVILHNCQUFzQjtJQUN0QixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDaEUsTUFBTSxVQUFVLEdBQ2QsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ2QsQ0FBQyxDQUFDLFlBQVksQ0FDVixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQ2pDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQ2pDO1FBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUVYLE9BQU87UUFDTCxJQUFJLEVBQUUsS0FBSztRQUNYLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLE9BQU87S0FDUixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgRW50aXR5Q29uZmxpY3RFcnJvciwgV29ya2Zsb3dXb3JsZEVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2luYXRlZFJlc3BvbnNlIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5jb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgoKSA9PiBNYXRoLnJhbmRvbSgpKTtcblxuLyoqXG4gKiBUcnVuY2F0ZSBhIHBvc3NpYmx5LXVudHJ1c3RlZCB2YWx1ZSBmb3IgaW5jbHVzaW9uIGluIGFuIGVycm9yIG1lc3NhZ2UuXG4gKiBLZWVwcyBlcnJvciBvdXRwdXQgYWN0aW9uYWJsZSBmb3IgZGV2ZWxvcGVycyBpbiBkZXYgbW9kZSB3aGlsZSBsaW1pdGluZ1xuICogdGhlIGFtb3VudCBvZiBhdHRhY2tlci1jb250cm9sbGVkIGRhdGEgcmVmbGVjdGVkIGJhY2sgaWYgYSBgd29ybGQtbG9jYWxgXG4gKiBiYWNrZW5kIGlzIGV2ZXIgcnVuIGluIGEgY29udGV4dCB0aGF0IHN1cmZhY2VzIHRoZXNlIG1lc3NhZ2VzIHRvIGNsaWVudHMuXG4gKi9cbmZ1bmN0aW9uIHRydW5jYXRlRm9yRXJyb3IodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBzID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKTtcbiAgY29uc3QgTUFYID0gNDg7XG4gIHJldHVybiBzLmxlbmd0aCA+IE1BWCA/IGAke3Muc2xpY2UoMCwgTUFYKX3igKZgIDogcztcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIGNhbGxlci1zdXBwbGllZCBlbnRpdHkgSUQgY29udGFpbnMgY2hhcmFjdGVycyB0aGF0IHdvdWxkXG4gKiBlc2NhcGUgdGhlIHN0b3JhZ2Ugcm9vdCAocGF0aCB0cmF2ZXJzYWwpIG9yIG90aGVyd2lzZSBwcm9kdWNlIGFuIHVuc2FmZVxuICogZmlsZW5hbWUuIEV4dGVuZHMge0BsaW5rIFdvcmtmbG93V29ybGRFcnJvcn0gc28gdGhlIHBsYXRmb3JtJ3Mgc3RhbmRhcmRcbiAqIGVycm9yLXRvLUhUVFAgbWFwcGluZyBoYW5kbGVzIGl0IGFsb25nc2lkZSBvdGhlciB3b3JsZC1sYXllciBlcnJvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbnNhZmVFbnRpdHlJZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dXb3JsZEVycm9yIHtcbiAgY29uc3RydWN0b3Ioa2luZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVW5zYWZlICR7a2luZH0gXCIke3RydW5jYXRlRm9yRXJyb3IodmFsdWUpfVwiOiBtdXN0IG5vdCBiZSBlbXB0eSwgY29udGFpbiBcIi5cIiwgXCIvXCIsIFwiXFxcXFwiLCBvciBudWxsIGJ5dGVzYFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1Vuc2FmZUVudGl0eUlkRXJyb3InO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVW5zYWZlRW50aXR5SWRFcnJvciB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IgJiYgdmFsdWUubmFtZSA9PT0gJ1Vuc2FmZUVudGl0eUlkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCBhIHN0cmluZyBpcyBzYWZlIHRvIGVtYmVkIGluIGEgZmlsZXN5c3RlbSBwYXRoIGFzIGEgc2luZ2xlXG4gKiBwYXRoIGNvbXBvbmVudC4gUmVqZWN0cyB2YWx1ZXMgdGhhdCBhcmU6XG4gKiAgIC0gZW1wdHlcbiAqICAgLSBzdGFydGluZyB3aXRoIGAuYCAoYmxvY2tzIGAuYCwgYC4uYCwgYC5sb2Nrc2AsIGAudG1wYCwgYW5kIG90aGVyXG4gKiAgICAgaGlkZGVuIG9yIHJlc2VydmVkIGZpbGVuYW1lcylcbiAqICAgLSBjb250YWluaW5nIGAuYCAod291bGQgY29sbGlkZSB3aXRoIHRoZSBgLnRhZ2AgLyBgLmpzb25gIHN1ZmZpeCB0aGVcbiAqICAgICB0YWdnaW5nIGxvZ2ljIHN0cmlwcyBmcm9tIGZpbGVuYW1lczsgc2VlIHtAbGluayBzdHJpcFRhZ30gL1xuICogICAgIHtAbGluayBnZXRPYmplY3RDcmVhdGVkQXR9KVxuICogICAtIGNvbnRhaW5pbmcgYC9gLCBgXFxgLCBvciBhIE5VTCBieXRlXG4gKlxuICogVGhpcyBpcyB0aGUgcHJpbWFyeSBkZWZlbnNlIGFnYWluc3QgcGF0aC10cmF2ZXJzYWwgYXR0YWNrcyB3aGVyZSBhXG4gKiByZXF1ZXN0IGJvZHkgc3VwcGxpZXMgYSBgcnVuSWRgIC8gYHN0ZXBJZGAgLyBgY29ycmVsYXRpb25JZGAgY29udGFpbmluZ1xuICogYC4uL2Agc2VxdWVuY2VzIHRvIHJlYWQgb3Igd3JpdGUgZmlsZXMgb3V0c2lkZSB0aGUgc3RvcmFnZSByb290LlxuICoge0BsaW5rIHJlc29sdmVXaXRoaW5CYXNlfSBwcm92aWRlcyBhIGJlbHQtYW5kLXN1c3BlbmRlcnMgY29udGFpbm1lbnRcbiAqIGNoZWNrIGF0IHRoZSBwb2ludCBvZiBgcGF0aC5qb2luYCBmb3IgZGVmZW5zZSBpbiBkZXB0aC5cbiAqXG4gKiBAcGFyYW0ga2luZCAtIEh1bWFuLXJlYWRhYmxlIGxhYmVsIHVzZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UgKGUuZy4gXCJydW5JZFwiKVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlOyB0aHJvd3Mge0BsaW5rIFVuc2FmZUVudGl0eUlkRXJyb3J9XG4gKiAgIGlmIHRoZSB2YWx1ZSBpcyBub3Qgc2FmZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVFbnRpdHlJZChraW5kOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKFxuICAgIHZhbHVlLmxlbmd0aCA9PT0gMCB8fFxuICAgIHZhbHVlLnN0YXJ0c1dpdGgoJy4nKSB8fFxuICAgIHZhbHVlLmluY2x1ZGVzKCcvJykgfHxcbiAgICB2YWx1ZS5pbmNsdWRlcygnXFxcXCcpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJ1xcMCcpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJy4nKVxuICApIHtcbiAgICB0aHJvdyBuZXcgVW5zYWZlRW50aXR5SWRFcnJvcihraW5kLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBKb2luIGBiYXNlZGlyYCB3aXRoIGFuIGVudGl0eS1yZWxhdGl2ZSBwYXRoIGFuZCBhc3NlcnQgdGhlIHJlc3VsdCBzdGF5c1xuICogaW5zaWRlIGBiYXNlZGlyYC4gQ29tcGxlbWVudHMge0BsaW5rIGFzc2VydFNhZmVFbnRpdHlJZH06IHBlci1lbnRyeS1wb2ludFxuICogdmFsaWRhdGlvbiBpcyB0aGUgcHJpbWFyeSBkZWZlbnNlLCBhbmQgdGhpcyBmaW5hbCBjaGVjayBjYXRjaGVzIGFueSBwYXRoXG4gKiBlc2NhcGUgdGhhdCBzbGlwcGVkIHBhc3QgKGUuZy4gYSBuZXcgY2FsbCBzaXRlIHRoYXQgZm9yZ290IHRvIHZhbGlkYXRlLFxuICogb3IgYW4gdW51c3VhbCBjaGFyYWN0ZXIgY29tYmluYXRpb24gb24gYSBmdXR1cmUgZmlsZXN5c3RlbSkuIFRocm93c1xuICoge0BsaW5rIFVuc2FmZUVudGl0eUlkRXJyb3J9IGlmIHRoZSBqb2luZWQgcGF0aCBlc2NhcGVzIGBiYXNlZGlyYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoaW5CYXNlKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIC4uLnNlZ21lbnRzOiBzdHJpbmdbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcGF0aC5yZXNvbHZlKGJhc2VkaXIpO1xuICBjb25zdCBqb2luZWQgPSBwYXRoLnJlc29sdmUoYmFzZWRpciwgLi4uc2VnbWVudHMpO1xuICBpZiAoam9pbmVkICE9PSByZXNvbHZlZEJhc2UgJiYgIWpvaW5lZC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSArIHBhdGguc2VwKSkge1xuICAgIHRocm93IG5ldyBVbnNhZmVFbnRpdHlJZEVycm9yKCdwYXRoJywgc2VnbWVudHMuam9pbignLycpKTtcbiAgfVxuICByZXR1cm4gam9pbmVkO1xufVxuXG5jb25zdCBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuXG4vKipcbiAqIEV4ZWN1dGUgYSBmaWxlc3lzdGVtIG9wZXJhdGlvbiB3aXRoIHJldHJ5IGxvZ2ljIG9uIFdpbmRvd3MuXG4gKiBPbiBXaW5kb3dzLCBmaWxlIG9wZXJhdGlvbnMgY2FuIGZhaWwgd2l0aCBFUEVSTS9FQlVTWS9FQUNDRVMgd2hlbiBmaWxlc1xuICogYXJlIGJyaWVmbHkgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2VzcyBvciBhbnRpdmlydXMuIFRoaXMgd3JhcHBlciBhZGRzXG4gKiBleHBvbmVudGlhbCBiYWNrb2ZmIHJldHJ5IGxvZ2ljLiBPbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIGV4ZWN1dGVzIGRpcmVjdGx5LlxuICovXG5hc3luYyBmdW5jdGlvbiB3aXRoV2luZG93c1JldHJ5PFQ+KFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPixcbiAgbWF4UmV0cmllcyA9IDVcbik6IFByb21pc2U8VD4ge1xuICBpZiAoIWlzV2luZG93cykgcmV0dXJuIGZuKCk7XG5cbiAgY29uc3QgcmV0cnlhYmxlRXJyb3JzID0gWydFUEVSTScsICdFQlVTWScsICdFQUNDRVMnXTtcbiAgY29uc3QgYmFzZURlbGF5TXMgPSAxMDtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBtYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc3QgaXNSZXRyeWFibGUgPVxuICAgICAgICBhdHRlbXB0IDwgbWF4UmV0cmllcyAmJiByZXRyeWFibGVFcnJvcnMuaW5jbHVkZXMoZXJyb3IuY29kZSk7XG4gICAgICBpZiAoIWlzUmV0cnlhYmxlKSB0aHJvdyBlcnJvcjtcbiAgICAgIC8vIEV4cG9uZW50aWFsIGJhY2tvZmYgd2l0aCBqaXR0ZXJcbiAgICAgIGNvbnN0IGRlbGF5ID0gYmFzZURlbGF5TXMgKiAyICoqIGF0dGVtcHQgKyBNYXRoLnJhbmRvbSgpICogYmFzZURlbGF5TXM7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xuICAgIH1cbiAgfVxuICAvLyBUeXBlU2NyaXB0OiB1bnJlYWNoYWJsZSwgYnV0IHNhdGlzZmllcyByZXR1cm4gdHlwZVxuICB0aHJvdyBuZXcgRXJyb3IoJ1JldHJ5IGxvb3AgZXhpdGVkIHVuZXhwZWN0ZWRseScpO1xufVxuXG4vLyBJbi1tZW1vcnkgY2FjaGUgb2YgY3JlYXRlZCBmaWxlcyB0byBhdm9pZCBleHBlbnNpdmUgZnMuYWNjZXNzKCkgY2FsbHNcbi8vIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlIG9ubHkgd3JpdGUgb25jZSBwZXIgZmlsZSBwYXRoIChubyBvdmVyd3JpdGVzIHdpdGhvdXQgZXhwbGljaXQgZmxhZylcbmNvbnN0IGNyZWF0ZWRGaWxlc0NhY2hlID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKlxuICogQ2xlYXIgdGhlIGNyZWF0ZWQgZmlsZXMgY2FjaGUuIFVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIGZpbGVzIGFyZSBkZWxldGVkIGV4dGVybmFsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNyZWF0ZWRGaWxlc0NhY2hlKCk6IHZvaWQge1xuICBjcmVhdGVkRmlsZXNDYWNoZS5jbGVhcigpO1xufVxuXG5leHBvcnQgeyB1bGlkVG9EYXRlIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLyoqXG4gKiBSZWdleCBtYXRjaGluZyBhIHRhZyBzdWZmaXggb24gYSBmaWxlSWQgKGFmdGVyIGAuanNvbmAgaGFzIGJlZW4gc3RyaXBwZWQpLlxuICogRS5nLiwgYHdydW5fQUJDLnZpdGVzdC0wYCDihpIgdGhlIGAudml0ZXN0LTBgIHBhcnQuXG4gKiBUYWdzIHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJzIGFuZCBoeXBoZW5zLlxuICogRW50aXR5IElEcyAoVUxJRHMsIHN0ZXBfTiwgZXRjLikgbmV2ZXIgY29udGFpbiBkb3RzLCBzbyB0aGUgZmlyc3QgZG90XG4gKiBhbHdheXMgbWFya3MgdGhlIHRhZyBib3VuZGFyeS5cbiAqL1xuY29uc3QgVEFHX1BBVFRFUk4gPSAvXFwuW2EtekEtWl1bYS16QS1aMC05LV0qJC87XG5cbi8qKlxuICogU3RyaXAgYSB0YWcgc3VmZml4IGZyb20gYSBmaWxlSWQuXG4gKiBgd3J1bl9BQkMudml0ZXN0LTBgIOKGkiBgd3J1bl9BQkNgXG4gKiBgd3J1bl9BQkNgIOKGkiBgd3J1bl9BQkNgIChuby1vcCBpZiBubyB0YWcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFRhZyhmaWxlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBmaWxlSWQucmVwbGFjZShUQUdfUEFUVEVSTiwgJycpO1xufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYSBmaWxlSWQgYmVsb25ncyB0byBhIHNwZWNpZmljIHRhZy5cbiAqIGB3cnVuX0FCQy52aXRlc3QtMGAgYmVsb25ncyB0byBgdml0ZXN0LTBgLlxuICogVW50YWdnZWQgZmlsZUlkcyBuZXZlciBtYXRjaCBhIHRhZy1zY29wZWQgbG9va3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzVGFnKGZpbGVJZDogc3RyaW5nLCB0YWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZUlkLmVuZHNXaXRoKGAuJHt0YWd9YCk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGZpbGUgcGF0aCBmb3IgYW4gZW50aXR5LCB3aXRoIG9wdGlvbmFsIHRhZyBlbWJlZGRlZCBpbiB0aGUgZmlsZW5hbWUuXG4gKiBgdGFnZ2VkUGF0aCgnL2RhdGEnLCAncnVucycsICd3cnVuX0FCQycsICd2aXRlc3QtMCcpYCDihpIgYC9kYXRhL3J1bnMvd3J1bl9BQkMudml0ZXN0LTAuanNvbmBcbiAqIGB0YWdnZWRQYXRoKCcvZGF0YScsICdydW5zJywgJ3dydW5fQUJDJylgIOKGkiBgL2RhdGEvcnVucy93cnVuX0FCQy5qc29uYFxuICpcbiAqIFRoZSBgZmlsZUlkYCBhbmQgYHRhZ2AgYXJlIHZhbGlkYXRlZCB3aXRoIHtAbGluayBhc3NlcnRTYWZlRW50aXR5SWR9IGFuZFxuICogdGhlIHJlc3VsdCBpcyBjb250YWlubWVudC1jaGVja2VkIHdpdGgge0BsaW5rIHJlc29sdmVXaXRoaW5CYXNlfSB0b1xuICogcHJldmVudCBwYXRoLXRyYXZlcnNhbCBhdHRhY2tzIHdoZW4gdmFsdWVzIGFyZSBkZXJpdmVkIGZyb20gdW50cnVzdGVkXG4gKiByZXF1ZXN0IGlucHV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFnZ2VkUGF0aChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBlbnRpdHlEaXI6IHN0cmluZyxcbiAgZmlsZUlkOiBzdHJpbmcsXG4gIHRhZz86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgYXNzZXJ0U2FmZUVudGl0eUlkKCdmaWxlSWQnLCBmaWxlSWQpO1xuICBpZiAodGFnICE9PSB1bmRlZmluZWQpIGFzc2VydFNhZmVFbnRpdHlJZCgndGFnJywgdGFnKTtcbiAgY29uc3QgZmlsZW5hbWUgPSB0YWcgPyBgJHtmaWxlSWR9LiR7dGFnfS5qc29uYCA6IGAke2ZpbGVJZH0uanNvbmA7XG4gIHJldHVybiByZXNvbHZlV2l0aGluQmFzZShiYXNlZGlyLCBlbnRpdHlEaXIsIGZpbGVuYW1lKTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgSlNPTiBlbnRpdHkgd2l0aCB0YWdnZWQgZmFsbGJhY2suXG4gKiBXaGVuIGEgdGFnIGlzIHNldCwgdHJpZXMgdGhlIHRhZ2dlZCBwYXRoIGZpcnN0LCB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlXG4gKiB1bnRhZ2dlZCBwYXRoIChzbyBhIHRhZ2dlZCB3b3JsZCBjYW4gcmVhZCBlbnRpdGllcyB3cml0dGVuIHdpdGhvdXQgYSB0YWcpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEpTT05XaXRoRmFsbGJhY2s8VD4oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgZW50aXR5RGlyOiBzdHJpbmcsXG4gIGZpbGVJZDogc3RyaW5nLFxuICBzY2hlbWE6IHouWm9kVHlwZTxUPixcbiAgdGFnPzogc3RyaW5nXG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCgnZmlsZUlkJywgZmlsZUlkKTtcbiAgaWYgKHRhZyAhPT0gdW5kZWZpbmVkKSBhc3NlcnRTYWZlRW50aXR5SWQoJ3RhZycsIHRhZyk7XG4gIGlmICh0YWcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkSlNPTihcbiAgICAgIHJlc29sdmVXaXRoaW5CYXNlKGJhc2VkaXIsIGVudGl0eURpciwgYCR7ZmlsZUlkfS4ke3RhZ30uanNvbmApLFxuICAgICAgc2NoZW1hXG4gICAgKTtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsKSByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHJldHVybiByZWFkSlNPTihcbiAgICByZXNvbHZlV2l0aGluQmFzZShiYXNlZGlyLCBlbnRpdHlEaXIsIGAke2ZpbGVJZH0uanNvbmApLFxuICAgIHNjaGVtYVxuICApO1xufVxuXG4vKipcbiAqIExpc3QgYWxsIGZpbGVuYW1lcyBpbiBhIGRpcmVjdG9yeSB0aGF0IGhhdmUgYSBzcGVjaWZpYyB0YWcuXG4gKiBSZXR1cm5zIGZ1bGwgZmlsZW5hbWVzIChlLmcuLCBgd3J1bl9BQkMudml0ZXN0LTAuanNvbmApLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFRhZ2dlZEZpbGVzKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHN1ZmZpeCA9IGAuJHt0YWd9Lmpzb25gO1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gZmlsZXMuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKHN1ZmZpeCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogTGlzdCBhbGwgZmlsZW5hbWVzIGluIGEgZGlyZWN0b3J5IHRoYXQgaGF2ZSBhIHNwZWNpZmljIHRhZyBhbmQgZXh0ZW5zaW9uLlxuICogUmV0dXJucyBmdWxsIGZpbGVuYW1lcyAoZS5nLiwgYHN0cmVhbS1jaG5rX0FCQy52aXRlc3QtMC5iaW5gKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RUYWdnZWRGaWxlc0J5RXh0ZW5zaW9uKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBzdWZmaXggPSBgLiR7dGFnfSR7ZXh0ZW5zaW9ufWA7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgIHJldHVybiBmaWxlcy5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoc3VmZml4KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcihkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgLy8gSWdub3JlIGlmIGFscmVhZHkgZXhpc3RzXG4gIH1cbn1cblxuaW50ZXJmYWNlIFdyaXRlT3B0aW9ucyB7XG4gIG92ZXJ3cml0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ3VzdG9tIEpTT04gcmVwbGFjZXIgdGhhdCBlbmNvZGVzIFVpbnQ4QXJyYXkgYXMgYmFzZTY0IHN0cmluZ3MuXG4gKiBGb3JtYXQ6IHsgX190eXBlOiAnVWludDhBcnJheScsIGRhdGE6ICc8YmFzZTY0PicgfVxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvblJlcGxhY2VyKF9rZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdVaW50OEFycmF5JyxcbiAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKHZhbHVlKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogQ3VzdG9tIEpTT04gcmV2aXZlciB0aGF0IGRlY29kZXMgYmFzZTY0IHN0cmluZ3MgYmFjayB0byBVaW50OEFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvblJldml2ZXIoX2tleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgKHZhbHVlIGFzIGFueSkuX190eXBlID09PSAnVWludDhBcnJheScgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIGFueSkuZGF0YSA9PT0gJ3N0cmluZydcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKCh2YWx1ZSBhcyBhbnkpLmRhdGEsICdiYXNlNjQnKSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVKU09OKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBkYXRhOiBhbnksXG4gIG9wdHM/OiBXcml0ZU9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gd3JpdGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEsIGpzb25SZXBsYWNlciwgMiksIG9wdHMpO1xufVxuXG4vKipcbiAqIFdyaXRlcyBkYXRhIHRvIGEgZmlsZSB1c2luZyBhdG9taWMgd3JpdGUtcmVuYW1lIHBhdHRlcm4uXG4gKlxuICogTm90ZTogV2hpbGUgdGhpcyBmdW5jdGlvbiB1c2VzIHRlbXAgZmlsZXMgdG8gYXZvaWQgcGFydGlhbCB3cml0ZXMsXG4gKiBpdCBkb2VzIG5vdCBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBjb25jdXJyZW50IHdyaXRlcyBmcm9tIG11bHRpcGxlXG4gKiBwcm9jZXNzZXMuIEluIGEgbXVsdGktd3JpdGVyIHNjZW5hcmlvLCB0aGUgbGFzdCB3cml0ZXIgd2lucy5cbiAqIEZvciBwcm9kdWN0aW9uIHVzZSB3aXRoIG11bHRpcGxlIHdyaXRlcnMsIGNvbnNpZGVyIHVzaW5nIGEgcHJvcGVyXG4gKiBkYXRhYmFzZSBvciBsb2NraW5nIG1lY2hhbmlzbS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBkYXRhOiBzdHJpbmcgfCBCdWZmZXIsXG4gIG9wdHM/OiBXcml0ZU9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW9wdHM/Lm92ZXJ3cml0ZSkge1xuICAgIC8vIEZhc3QgcGF0aDogY2hlY2sgaW4tbWVtb3J5IGNhY2hlIGZpcnN0IHRvIGF2b2lkIGV4cGVuc2l2ZSBmcy5hY2Nlc3MoKSBjYWxsc1xuICAgIC8vIFRoaXMgcHJvdmlkZXMgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgd2hlbiBjcmVhdGluZyBtYW55IGZpbGVzXG4gICAgaWYgKGNyZWF0ZWRGaWxlc0NhY2hlLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICBgRmlsZSAke2ZpbGVQYXRofSBhbHJlYWR5IGV4aXN0cyBhbmQgJ292ZXJ3cml0ZScgaXMgZmFsc2VgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNsb3cgcGF0aDogY2hlY2sgZmlsZXN5c3RlbSBmb3IgZmlsZXMgY3JlYXRlZCBiZWZvcmUgdGhpcyBwcm9jZXNzIHN0YXJ0ZWRcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgIC8vIEZpbGUgZXhpc3RzIG9uIGRpc2ssIGFkZCB0byBjYWNoZSBmb3IgZnV0dXJlIGNoZWNrc1xuICAgICAgY3JlYXRlZEZpbGVzQ2FjaGUuYWRkKGZpbGVQYXRoKTtcbiAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICBgRmlsZSAke2ZpbGVQYXRofSBhbHJlYWR5IGV4aXN0cyBhbmQgJ292ZXJ3cml0ZScgaXMgZmFsc2VgXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIElmIGZpbGUgZG9lc24ndCBleGlzdCAoRU5PRU5UKSwgY29udGludWUgd2l0aCB3cml0ZVxuICAgICAgaWYgKGVycm9yLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRlbXBQYXRoID0gYCR7ZmlsZVBhdGh9LnRtcC4ke3VsaWQoKX1gO1xuICBsZXQgdGVtcEZpbGVDcmVhdGVkID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgYXdhaXQgZW5zdXJlRGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCkpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wUGF0aCwgZGF0YSk7XG4gICAgdGVtcEZpbGVDcmVhdGVkID0gdHJ1ZTtcbiAgICBhd2FpdCB3aXRoV2luZG93c1JldHJ5KCgpID0+IGZzLnJlbmFtZSh0ZW1wUGF0aCwgZmlsZVBhdGgpKTtcbiAgICAvLyBUcmFjayB0aGlzIGZpbGUgaW4gY2FjaGUgc28gZnV0dXJlIHdyaXRlcyBrbm93IGl0IGV4aXN0c1xuICAgIGNyZWF0ZWRGaWxlc0NhY2hlLmFkZChmaWxlUGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gT25seSB0cnkgdG8gY2xlYW4gdXAgdGVtcCBmaWxlIGlmIGl0IHdhcyBhY3R1YWxseSBjcmVhdGVkXG4gICAgaWYgKHRlbXBGaWxlQ3JlYXRlZCkge1xuICAgICAgYXdhaXQgd2l0aFdpbmRvd3NSZXRyeSgoKSA9PiBmcy51bmxpbmsodGVtcFBhdGgpLCAzKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkSlNPTjxUPihcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGVjb2Rlcjogei5ab2RUeXBlPFQ+XG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICByZXR1cm4gZGVjb2Rlci5wYXJzZShKU09OLnBhcnNlKGNvbnRlbnQsIGpzb25SZXZpdmVyKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEJ1ZmZlcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlyc3RCeXRlKFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBmaWxlID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgJ3InKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBieXRlID0gQnVmZmVyLmFsbG9jVW5zYWZlKDEpO1xuICAgIGNvbnN0IHsgYnl0ZXNSZWFkIH0gPSBhd2FpdCBmaWxlLnJlYWQoYnl0ZSwgMCwgMSwgMCk7XG4gICAgcmV0dXJuIGJ5dGVzUmVhZCA9PT0gMCA/IHVuZGVmaW5lZCA6IGJ5dGVbMF07XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZmlsZS5jbG9zZSgpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVKU09OKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy51bmxpbmsoZmlsZVBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlICE9PSAnRU5PRU5UJykgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBBdG9taWNhbGx5IGNyZWF0ZSBhIGZpbGUgdXNpbmcgT19DUkVBVCB8IE9fRVhDTCBmbGFncy5cbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgY3JlYXRlZCwgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdHMuXG4gKiBUaGlzIGlzIGF0b21pYyBhdCB0aGUgT1MgbGV2ZWwsIHNhZmUgZm9yIGNvbmN1cnJlbnQgYWNjZXNzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVFeGNsdXNpdmUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRhdGE6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGF3YWl0IGVuc3VyZURpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIGRhdGEsIHsgZmxhZzogJ3d4JyB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGlmIChlcnJvci5jb2RlID09PSAnRUVYSVNUJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdEpTT05GaWxlcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHJldHVybiBsaXN0RmlsZXNCeUV4dGVuc2lvbihkaXJQYXRoLCAnLmpzb24nKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RGaWxlc0J5RXh0ZW5zaW9uKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgIHJldHVybiBmaWxlc1xuICAgICAgLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChleHRlbnNpb24pKVxuICAgICAgLm1hcCgoZikgPT4gZi5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmludGVyZmFjZSBQYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnlDb25maWc8VD4ge1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD47XG4gIGZpbGVQcmVmaXg/OiBzdHJpbmc7XG4gIGZpbGVJZEZpbHRlcj86IChmaWxlSWQ6IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgZmlsdGVyPzogKGl0ZW06IFQpID0+IGJvb2xlYW47XG4gIHNvcnRPcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xuICBsaW1pdD86IG51bWJlcjtcbiAgY3Vyc29yPzogc3RyaW5nO1xuICBnZXRDcmVhdGVkQXQoZmlsZW5hbWU6IHN0cmluZyk6IERhdGUgfCBudWxsO1xuICBnZXRJZD8oaXRlbTogVCk6IHN0cmluZztcbn1cbi8vIEN1cnNvciBmb3JtYXQ6IFwidGltZXN0YW1wfGlkXCIgZm9yIHRpZS1icmVha2luZ1xuaW50ZXJmYWNlIFBhcnNlZEN1cnNvciB7XG4gIHRpbWVzdGFtcDogRGF0ZTtcbiAgaWQ6IHN0cmluZyB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ3Vyc29yKGN1cnNvcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogUGFyc2VkQ3Vyc29yIHwgbnVsbCB7XG4gIGlmICghY3Vyc29yKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBwYXJ0cyA9IGN1cnNvci5zcGxpdCgnfCcpO1xuICByZXR1cm4ge1xuICAgIHRpbWVzdGFtcDogbmV3IERhdGUocGFydHNbMF0pLFxuICAgIGlkOiBwYXJ0c1sxXSB8fCBudWxsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDdXJzb3IodGltZXN0YW1wOiBEYXRlLCBpZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlkID8gYCR7dGltZXN0YW1wLnRvSVNPU3RyaW5nKCl9fCR7aWR9YCA6IHRpbWVzdGFtcC50b0lTT1N0cmluZygpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5PFQgZXh0ZW5kcyB7IGNyZWF0ZWRBdDogRGF0ZSB9PihcbiAgY29uZmlnOiBQYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnlDb25maWc8VD5cbik6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8VD4+IHtcbiAgY29uc3Qge1xuICAgIGRpcmVjdG9yeSxcbiAgICBzY2hlbWEsXG4gICAgZmlsZVByZWZpeCxcbiAgICBmaWxlSWRGaWx0ZXIsXG4gICAgZmlsdGVyLFxuICAgIHNvcnRPcmRlciA9ICdkZXNjJyxcbiAgICBsaW1pdCA9IDIwLFxuICAgIGN1cnNvcixcbiAgICBnZXRDcmVhdGVkQXQsXG4gICAgZ2V0SWQsXG4gIH0gPSBjb25maWc7XG5cbiAgLy8gVmFsaWRhdGUgZmlsZVByZWZpeCAodHlwaWNhbGx5IGAke3J1bklkfS1gKSBzbyByZXF1ZXN0LWRlcml2ZWQgcHJlZml4ZXNcbiAgLy8gY29uc2lzdGVudGx5IHJlamVjdCB1bnNhZmUgY2hhcmFjdGVycy4gZmlsZVByZWZpeCBpcyBvbmx5IHVzZWQgYmVsb3cgdG9cbiAgLy8gZmlsdGVyIHJlYWRkaXIoKSByZXN1bHRzIGJ5IHByZWZpeCDigJQgaXQgZG9lc24ndCBwYXJ0aWNpcGF0ZSBpbiBwYXRoXG4gIC8vIGNvbnN0cnVjdGlvbiDigJQgYnV0IGtlZXBpbmcgdGhlIHZhbGlkYXRpb24gcnVsZSB1bmlmb3JtIGFjcm9zcyB0aGVcbiAgLy8gc3RvcmFnZSBsYXllciBhdm9pZHMgc3BlY2lhbCBjYXNlcyBhbmQgY2F0Y2hlcyBiYWQgdmFsdWVzIGVhcmxpZXIuXG4gIGlmIChmaWxlUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2ZpbGVQcmVmaXgnLCBmaWxlUHJlZml4KTtcbiAgfVxuXG4gIC8vIDEuIEdldCBhbGwgSlNPTiBmaWxlcyBpbiBkaXJlY3RvcnlcbiAgY29uc3QgZmlsZUlkcyA9IGF3YWl0IGxpc3RKU09ORmlsZXMoZGlyZWN0b3J5KTtcblxuICAvLyAyLiBGaWx0ZXIgYnkgcHJlZml4IGlmIHByb3ZpZGVkXG4gIGNvbnN0IHJlbGV2YW50RmlsZUlkcyA9IGZpbGVQcmVmaXhcbiAgICA/IGZpbGVJZHMuZmlsdGVyKChmaWxlSWQpID0+IGZpbGVJZC5zdGFydHNXaXRoKGZpbGVQcmVmaXgpKVxuICAgIDogZmlsZUlkcztcbiAgY29uc3QgZmlsdGVyZWRGaWxlSWRzID0gZmlsZUlkRmlsdGVyXG4gICAgPyByZWxldmFudEZpbGVJZHMuZmlsdGVyKGZpbGVJZEZpbHRlcilcbiAgICA6IHJlbGV2YW50RmlsZUlkcztcblxuICAvLyAzLiBVTElEIE9wdGltaXphdGlvbjogRmlsdGVyIGJ5IGN1cnNvciB1c2luZyBmaWxlbmFtZSB0aW1lc3RhbXBzIGJlZm9yZSBsb2FkaW5nIEpTT05cbiAgY29uc3QgcGFyc2VkQ3Vyc29yID0gcGFyc2VDdXJzb3IoY3Vyc29yKTtcbiAgbGV0IGNhbmRpZGF0ZUZpbGVJZHMgPSBmaWx0ZXJlZEZpbGVJZHM7XG5cbiAgaWYgKHBhcnNlZEN1cnNvcikge1xuICAgIGNhbmRpZGF0ZUZpbGVJZHMgPSBmaWx0ZXJlZEZpbGVJZHMuZmlsdGVyKChmaWxlSWQpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lRGF0ZSA9IGdldENyZWF0ZWRBdChgJHtmaWxlSWR9Lmpzb25gKTtcbiAgICAgIGlmIChmaWxlbmFtZURhdGUpIHtcbiAgICAgICAgLy8gVXNlIGZpbGVuYW1lIHRpbWVzdGFtcCBmb3IgY3Vyc29yIGZpbHRlcmluZ1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGJlIGNhcmVmdWwgaGVyZTogaWYgcGFyc2VkQ3Vyc29yIGhhcyBhbiBJRCAoZm9yIHRpZS1icmVha2luZyksXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gaW5jbHVkZSBpdGVtcyB3aXRoIHRoZSBzYW1lIHRpbWVzdGFtcCBmb3IgbGF0ZXIgSUQtYmFzZWQgZmlsdGVyaW5nLlxuICAgICAgICAvLyBJZiBubyBJRCwgd2UgY2FuIHVzZSBzdHJpY3QgaW5lcXVhbGl0eSBmb3Igb3B0aW1pemF0aW9uLlxuICAgICAgICBjb25zdCBjdXJzb3JUaW1lID0gcGFyc2VkQ3Vyc29yLnRpbWVzdGFtcC5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IGZpbGVUaW1lID0gZmlsZW5hbWVEYXRlLmdldFRpbWUoKTtcblxuICAgICAgICBpZiAocGFyc2VkQ3Vyc29yLmlkKSB7XG4gICAgICAgICAgLy8gVGllLWJyZWFraW5nIG1vZGU6IGluY2x1ZGUgaXRlbXMgYXQgb3IgbmVhciBjdXJzb3IgdGltZXN0YW1wXG4gICAgICAgICAgcmV0dXJuIHNvcnRPcmRlciA9PT0gJ2Rlc2MnXG4gICAgICAgICAgICA/IGZpbGVUaW1lIDw9IGN1cnNvclRpbWVcbiAgICAgICAgICAgIDogZmlsZVRpbWUgPj0gY3Vyc29yVGltZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyB0aWUtYnJlYWtpbmc6IHN0cmljdCBpbmVxdWFsaXR5XG4gICAgICAgICAgcmV0dXJuIHNvcnRPcmRlciA9PT0gJ2Rlc2MnXG4gICAgICAgICAgICA/IGZpbGVUaW1lIDwgY3Vyc29yVGltZVxuICAgICAgICAgICAgOiBmaWxlVGltZSA+IGN1cnNvclRpbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENhbid0IGV4dHJhY3QgdGltZXN0YW1wIGZyb20gZmlsZW5hbWUgKGUuZy4sIHN0ZXBzIHVzZSBzZXF1ZW50aWFsIElEcykuXG4gICAgICAvLyBJbmNsdWRlIHRoZSBmaWxlIGFuZCBkZWZlciB0byBKU09OLWJhc2VkIGZpbHRlcmluZyBiZWxvdy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gNC4gTG9hZCBmaWxlcyBpbmRpdmlkdWFsbHkgYW5kIGNvbGxlY3QgdmFsaWQgaXRlbXNcbiAgY29uc3QgdmFsaWRJdGVtczogVFtdID0gW107XG5cbiAgZm9yIChjb25zdCBmaWxlSWQgb2YgY2FuZGlkYXRlRmlsZUlkcykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgYCR7ZmlsZUlkfS5qc29uYCk7XG4gICAgbGV0IGl0ZW06IFQgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgaXRlbSA9IGF3YWl0IHJlYWRKU09OKGZpbGVQYXRoLCBzY2hlbWEpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBXZSBkb24ndCBleHBlY3Qgem9kIGVycm9ycyB0byBoYXBwZW4sIGJ1dCBpZiB0aGUgSlNPTiBkb2VzIGdldCBtYWxmb3JtZWQsXG4gICAgICAvLyB3ZSBza2lwIHRoZSBpdGVtLiBQcmVmZXJhYmx5LCB3ZSdkIGhhdmUgYSB3YXkgdG8gbWFyayBpdGVtcyBhcyBtYWxmb3JtZWQsXG4gICAgICAvLyBzbyB0aGF0IHRoZSBVSSBjYW4gZGlzcGxheSB0aGVtIGFzIHN1Y2gsIHdpdGggcmljaGVyIG1lc3NhZ2luZy4gSW4gdGhlIG1lYW50aW1lLFxuICAgICAgLy8gd2UganVzdCBsb2cgYSB3YXJuaW5nIGFuZCBza2lwIHRoZSBpdGVtLlxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2Ygei5ab2RFcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFNraXBwaW5nIGl0ZW0gJHtmaWxlSWR9IGR1ZSB0byBtYWxmb3JtZWQgSlNPTjogJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgLy8gQXBwbHkgY3VzdG9tIGZpbHRlciBlYXJseSBpZiBwcm92aWRlZFxuICAgICAgaWYgKGZpbHRlciAmJiAhZmlsdGVyKGl0ZW0pKSBjb250aW51ZTtcblxuICAgICAgLy8gRG91YmxlLWNoZWNrIGN1cnNvciBmaWx0ZXJpbmcgd2l0aCBhY3R1YWwgY3JlYXRlZEF0IGZyb20gSlNPTlxuICAgICAgLy8gKGluIGNhc2UgVUxJRCB0aW1lc3RhbXAgZGlmZmVycyBmcm9tIHN0b3JlZCBjcmVhdGVkQXQpXG4gICAgICBpZiAocGFyc2VkQ3Vyc29yKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1UaW1lID0gaXRlbS5jcmVhdGVkQXQuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBjdXJzb3JUaW1lID0gcGFyc2VkQ3Vyc29yLnRpbWVzdGFtcC5nZXRUaW1lKCk7XG5cbiAgICAgICAgaWYgKHNvcnRPcmRlciA9PT0gJ2Rlc2MnKSB7XG4gICAgICAgICAgLy8gRm9yIGRlc2NlbmRpbmcgb3JkZXIsIHNraXAgaXRlbXMgPj0gY3Vyc29yXG4gICAgICAgICAgaWYgKGl0ZW1UaW1lID4gY3Vyc29yVGltZSkgY29udGludWU7XG4gICAgICAgICAgLy8gSWYgdGltZXN0YW1wcyBhcmUgZXF1YWwsIHVzZSBJRCBmb3IgdGllLWJyZWFraW5nIChza2lwIGlmIElEID49IGN1cnNvcklkKVxuICAgICAgICAgIGlmIChpdGVtVGltZSA9PT0gY3Vyc29yVGltZSAmJiBwYXJzZWRDdXJzb3IuaWQgJiYgZ2V0SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldElkKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKGl0ZW1JZCA+PSBwYXJzZWRDdXJzb3IuaWQpIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3IgYXNjZW5kaW5nIG9yZGVyLCBza2lwIGl0ZW1zIDw9IGN1cnNvclxuICAgICAgICAgIGlmIChpdGVtVGltZSA8IGN1cnNvclRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgIC8vIElmIHRpbWVzdGFtcHMgYXJlIGVxdWFsLCB1c2UgSUQgZm9yIHRpZS1icmVha2luZyAoc2tpcCBpZiBJRCA8PSBjdXJzb3JJZClcbiAgICAgICAgICBpZiAoaXRlbVRpbWUgPT09IGN1cnNvclRpbWUgJiYgcGFyc2VkQ3Vyc29yLmlkICYmIGdldElkKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtSWQgPSBnZXRJZChpdGVtKTtcbiAgICAgICAgICAgIGlmIChpdGVtSWQgPD0gcGFyc2VkQ3Vyc29yLmlkKSBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFsaWRJdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIDUuIFNvcnQgYnkgY3JlYXRlZEF0IChhbmQgYnkgSUQgZm9yIHRpZS1icmVha2luZyBpZiBnZXRJZCBpcyBwcm92aWRlZClcbiAgdmFsaWRJdGVtcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgYVRpbWUgPSBhLmNyZWF0ZWRBdC5nZXRUaW1lKCk7XG4gICAgY29uc3QgYlRpbWUgPSBiLmNyZWF0ZWRBdC5nZXRUaW1lKCk7XG4gICAgY29uc3QgdGltZUNvbXBhcmlzb24gPSBzb3J0T3JkZXIgPT09ICdhc2MnID8gYVRpbWUgLSBiVGltZSA6IGJUaW1lIC0gYVRpbWU7XG5cbiAgICAvLyBJZiB0aW1lc3RhbXBzIGFyZSBlcXVhbCBhbmQgd2UgaGF2ZSBnZXRJZCwgdXNlIElEIGZvciBzdGFibGUgc29ydGluZ1xuICAgIGlmICh0aW1lQ29tcGFyaXNvbiA9PT0gMCAmJiBnZXRJZCkge1xuICAgICAgY29uc3QgYUlkID0gZ2V0SWQoYSk7XG4gICAgICBjb25zdCBiSWQgPSBnZXRJZChiKTtcbiAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdhc2MnXG4gICAgICAgID8gYUlkLmxvY2FsZUNvbXBhcmUoYklkKVxuICAgICAgICA6IGJJZC5sb2NhbGVDb21wYXJlKGFJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbWVDb21wYXJpc29uO1xuICB9KTtcblxuICAvLyA2LiBBcHBseSBwYWdpbmF0aW9uXG4gIGNvbnN0IGhhc01vcmUgPSB2YWxpZEl0ZW1zLmxlbmd0aCA+IGxpbWl0O1xuICBjb25zdCBpdGVtcyA9IGhhc01vcmUgPyB2YWxpZEl0ZW1zLnNsaWNlKDAsIGxpbWl0KSA6IHZhbGlkSXRlbXM7XG4gIGNvbnN0IG5leHRDdXJzb3IgPVxuICAgIGl0ZW1zLmxlbmd0aCA+IDBcbiAgICAgID8gY3JlYXRlQ3Vyc29yKFxuICAgICAgICAgIGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdLmNyZWF0ZWRBdCxcbiAgICAgICAgICBnZXRJZD8uKGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdKVxuICAgICAgICApXG4gICAgICA6IG51bGw7XG5cbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBpdGVtcyxcbiAgICBjdXJzb3I6IG5leHRDdXJzb3IsXG4gICAgaGFzTW9yZSxcbiAgfTtcbn1cbiJdfQ==
518
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRW5EOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGtCQUFrQjtJQUN6RCxZQUFZLElBQVksRUFBRSxLQUFhO1FBQ3JDLEtBQUssQ0FDSCxVQUFVLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsNkRBQTZELENBQ3hHLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7SUFF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RUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0lBQ2hFLE1BQU0sVUFBVSxHQUNkLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNkLENBQUMsQ0FBQyxZQUFZLENBQ1YsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUNqQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUNqQztRQUNILENBQUMsQ0FBQyxJQUFJLENBQUM7SUFFWCxPQUFPO1FBQ0wsSUFBSSxFQUFFLEtBQUs7UUFDWCxNQUFNLEVBQUUsVUFBVTtRQUNsQixPQUFPO0tBQ1IsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEVudGl0eUNvbmZsaWN0RXJyb3IsIFdvcmtmbG93V29ybGRFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBQYWdpbmF0ZWRSZXNwb25zZSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuY29uc3QgdWxpZCA9IG1vbm90b25pY0ZhY3RvcnkoKCkgPT4gTWF0aC5yYW5kb20oKSk7XG5cbi8qKlxuICogVHJ1bmNhdGUgYSBwb3NzaWJseS11bnRydXN0ZWQgdmFsdWUgZm9yIGluY2x1c2lvbiBpbiBhbiBlcnJvciBtZXNzYWdlLlxuICogS2VlcHMgZXJyb3Igb3V0cHV0IGFjdGlvbmFibGUgZm9yIGRldmVsb3BlcnMgaW4gZGV2IG1vZGUgd2hpbGUgbGltaXRpbmdcbiAqIHRoZSBhbW91bnQgb2YgYXR0YWNrZXItY29udHJvbGxlZCBkYXRhIHJlZmxlY3RlZCBiYWNrIGlmIGEgYHdvcmxkLWxvY2FsYFxuICogYmFja2VuZCBpcyBldmVyIHJ1biBpbiBhIGNvbnRleHQgdGhhdCBzdXJmYWNlcyB0aGVzZSBtZXNzYWdlcyB0byBjbGllbnRzLlxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZUZvckVycm9yKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSk7XG4gIGNvbnN0IE1BWCA9IDQ4O1xuICByZXR1cm4gcy5sZW5ndGggPiBNQVggPyBgJHtzLnNsaWNlKDAsIE1BWCl94oCmYCA6IHM7XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBjYWxsZXItc3VwcGxpZWQgZW50aXR5IElEIGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCB3b3VsZFxuICogZXNjYXBlIHRoZSBzdG9yYWdlIHJvb3QgKHBhdGggdHJhdmVyc2FsKSBvciBvdGhlcndpc2UgcHJvZHVjZSBhbiB1bnNhZmVcbiAqIGZpbGVuYW1lLiBFeHRlbmRzIHtAbGluayBXb3JrZmxvd1dvcmxkRXJyb3J9IHNvIHRoZSBwbGF0Zm9ybSdzIHN0YW5kYXJkXG4gKiBlcnJvci10by1IVFRQIG1hcHBpbmcgaGFuZGxlcyBpdCBhbG9uZ3NpZGUgb3RoZXIgd29ybGQtbGF5ZXIgZXJyb3JzLlxuICovXG5leHBvcnQgY2xhc3MgVW5zYWZlRW50aXR5SWRFcnJvciBleHRlbmRzIFdvcmtmbG93V29ybGRFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGtpbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgYFVuc2FmZSAke2tpbmR9IFwiJHt0cnVuY2F0ZUZvckVycm9yKHZhbHVlKX1cIjogbXVzdCBub3QgYmUgZW1wdHksIGNvbnRhaW4gXCIuXCIsIFwiL1wiLCBcIlxcXFxcIiwgb3IgbnVsbCBieXRlc2BcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdVbnNhZmVFbnRpdHlJZEVycm9yJztcbiAgfVxuXG4gIHN0YXRpYyBpcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFVuc2FmZUVudGl0eUlkRXJyb3Ige1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yICYmIHZhbHVlLm5hbWUgPT09ICdVbnNhZmVFbnRpdHlJZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBzdHJpbmcgaXMgc2FmZSB0byBlbWJlZCBpbiBhIGZpbGVzeXN0ZW0gcGF0aCBhcyBhIHNpbmdsZVxuICogcGF0aCBjb21wb25lbnQuIFJlamVjdHMgdmFsdWVzIHRoYXQgYXJlOlxuICogICAtIGVtcHR5XG4gKiAgIC0gc3RhcnRpbmcgd2l0aCBgLmAgKGJsb2NrcyBgLmAsIGAuLmAsIGAubG9ja3NgLCBgLnRtcGAsIGFuZCBvdGhlclxuICogICAgIGhpZGRlbiBvciByZXNlcnZlZCBmaWxlbmFtZXMpXG4gKiAgIC0gY29udGFpbmluZyBgLmAgKHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgYC50YWdgIC8gYC5qc29uYCBzdWZmaXggdGhlXG4gKiAgICAgdGFnZ2luZyBsb2dpYyBzdHJpcHMgZnJvbSBmaWxlbmFtZXM7IHNlZSB7QGxpbmsgc3RyaXBUYWd9IC9cbiAqICAgICB7QGxpbmsgZ2V0T2JqZWN0Q3JlYXRlZEF0fSlcbiAqICAgLSBjb250YWluaW5nIGAvYCwgYFxcYCwgb3IgYSBOVUwgYnl0ZVxuICpcbiAqIFRoaXMgaXMgdGhlIHByaW1hcnkgZGVmZW5zZSBhZ2FpbnN0IHBhdGgtdHJhdmVyc2FsIGF0dGFja3Mgd2hlcmUgYVxuICogcmVxdWVzdCBib2R5IHN1cHBsaWVzIGEgYHJ1bklkYCAvIGBzdGVwSWRgIC8gYGNvcnJlbGF0aW9uSWRgIGNvbnRhaW5pbmdcbiAqIGAuLi9gIHNlcXVlbmNlcyB0byByZWFkIG9yIHdyaXRlIGZpbGVzIG91dHNpZGUgdGhlIHN0b3JhZ2Ugcm9vdC5cbiAqIHtAbGluayByZXNvbHZlV2l0aGluQmFzZX0gcHJvdmlkZXMgYSBiZWx0LWFuZC1zdXNwZW5kZXJzIGNvbnRhaW5tZW50XG4gKiBjaGVjayBhdCB0aGUgcG9pbnQgb2YgYHBhdGguam9pbmAgZm9yIGRlZmVuc2UgaW4gZGVwdGguXG4gKlxuICogQHBhcmFtIGtpbmQgLSBIdW1hbi1yZWFkYWJsZSBsYWJlbCB1c2VkIGluIHRoZSBlcnJvciBtZXNzYWdlIChlLmcuIFwicnVuSWRcIilcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZTsgdGhyb3dzIHtAbGluayBVbnNhZmVFbnRpdHlJZEVycm9yfVxuICogICBpZiB0aGUgdmFsdWUgaXMgbm90IHNhZmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTYWZlRW50aXR5SWQoa2luZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChcbiAgICB2YWx1ZS5sZW5ndGggPT09IDAgfHxcbiAgICB2YWx1ZS5zdGFydHNXaXRoKCcuJykgfHxcbiAgICB2YWx1ZS5pbmNsdWRlcygnLycpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJ1xcXFwnKSB8fFxuICAgIHZhbHVlLmluY2x1ZGVzKCdcXDAnKSB8fFxuICAgIHZhbHVlLmluY2x1ZGVzKCcuJylcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFVuc2FmZUVudGl0eUlkRXJyb3Ioa2luZCwgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogSm9pbiBgYmFzZWRpcmAgd2l0aCBhbiBlbnRpdHktcmVsYXRpdmUgcGF0aCBhbmQgYXNzZXJ0IHRoZSByZXN1bHQgc3RheXNcbiAqIGluc2lkZSBgYmFzZWRpcmAuIENvbXBsZW1lbnRzIHtAbGluayBhc3NlcnRTYWZlRW50aXR5SWR9OiBwZXItZW50cnktcG9pbnRcbiAqIHZhbGlkYXRpb24gaXMgdGhlIHByaW1hcnkgZGVmZW5zZSwgYW5kIHRoaXMgZmluYWwgY2hlY2sgY2F0Y2hlcyBhbnkgcGF0aFxuICogZXNjYXBlIHRoYXQgc2xpcHBlZCBwYXN0IChlLmcuIGEgbmV3IGNhbGwgc2l0ZSB0aGF0IGZvcmdvdCB0byB2YWxpZGF0ZSxcbiAqIG9yIGFuIHVudXN1YWwgY2hhcmFjdGVyIGNvbWJpbmF0aW9uIG9uIGEgZnV0dXJlIGZpbGVzeXN0ZW0pLiBUaHJvd3NcbiAqIHtAbGluayBVbnNhZmVFbnRpdHlJZEVycm9yfSBpZiB0aGUgam9pbmVkIHBhdGggZXNjYXBlcyBgYmFzZWRpcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aGluQmFzZShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICAuLi5zZWdtZW50czogc3RyaW5nW11cbik6IHN0cmluZyB7XG4gIGNvbnN0IHJlc29sdmVkQmFzZSA9IHBhdGgucmVzb2x2ZShiYXNlZGlyKTtcbiAgY29uc3Qgam9pbmVkID0gcGF0aC5yZXNvbHZlKGJhc2VkaXIsIC4uLnNlZ21lbnRzKTtcbiAgaWYgKGpvaW5lZCAhPT0gcmVzb2x2ZWRCYXNlICYmICFqb2luZWQuc3RhcnRzV2l0aChyZXNvbHZlZEJhc2UgKyBwYXRoLnNlcCkpIHtcbiAgICB0aHJvdyBuZXcgVW5zYWZlRW50aXR5SWRFcnJvcigncGF0aCcsIHNlZ21lbnRzLmpvaW4oJy8nKSk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cblxuY29uc3QgaXNXaW5kb3dzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcblxuLyoqXG4gKiBFeGVjdXRlIGEgZmlsZXN5c3RlbSBvcGVyYXRpb24gd2l0aCByZXRyeSBsb2dpYyBvbiBXaW5kb3dzLlxuICogT24gV2luZG93cywgZmlsZSBvcGVyYXRpb25zIGNhbiBmYWlsIHdpdGggRVBFUk0vRUJVU1kvRUFDQ0VTIHdoZW4gZmlsZXNcbiAqIGFyZSBicmllZmx5IGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3Mgb3IgYW50aXZpcnVzLiBUaGlzIHdyYXBwZXIgYWRkc1xuICogZXhwb25lbnRpYWwgYmFja29mZiByZXRyeSBsb2dpYy4gT24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCBleGVjdXRlcyBkaXJlY3RseS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aFdpbmRvd3NSZXRyeTxUPihcbiAgZm46ICgpID0+IFByb21pc2U8VD4sXG4gIG1heFJldHJpZXMgPSA1XG4pOiBQcm9taXNlPFQ+IHtcbiAgaWYgKCFpc1dpbmRvd3MpIHJldHVybiBmbigpO1xuXG4gIGNvbnN0IHJldHJ5YWJsZUVycm9ycyA9IFsnRVBFUk0nLCAnRUJVU1knLCAnRUFDQ0VTJ107XG4gIGNvbnN0IGJhc2VEZWxheU1zID0gMTA7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPD0gbWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnN0IGlzUmV0cnlhYmxlID1cbiAgICAgICAgYXR0ZW1wdCA8IG1heFJldHJpZXMgJiYgcmV0cnlhYmxlRXJyb3JzLmluY2x1ZGVzKGVycm9yLmNvZGUpO1xuICAgICAgaWYgKCFpc1JldHJ5YWJsZSkgdGhyb3cgZXJyb3I7XG4gICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmIHdpdGggaml0dGVyXG4gICAgICBjb25zdCBkZWxheSA9IGJhc2VEZWxheU1zICogMiAqKiBhdHRlbXB0ICsgTWF0aC5yYW5kb20oKSAqIGJhc2VEZWxheU1zO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICB9XG4gIH1cbiAgLy8gVHlwZVNjcmlwdDogdW5yZWFjaGFibGUsIGJ1dCBzYXRpc2ZpZXMgcmV0dXJuIHR5cGVcbiAgdGhyb3cgbmV3IEVycm9yKCdSZXRyeSBsb29wIGV4aXRlZCB1bmV4cGVjdGVkbHknKTtcbn1cblxuLy8gSW4tbWVtb3J5IGNhY2hlIG9mIGNyZWF0ZWQgZmlsZXMgdG8gYXZvaWQgZXhwZW5zaXZlIGZzLmFjY2VzcygpIGNhbGxzXG4vLyBUaGlzIGlzIHNhZmUgYmVjYXVzZSB3ZSBvbmx5IHdyaXRlIG9uY2UgcGVyIGZpbGUgcGF0aCAobm8gb3ZlcndyaXRlcyB3aXRob3V0IGV4cGxpY2l0IGZsYWcpXG5jb25zdCBjcmVhdGVkRmlsZXNDYWNoZSA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKipcbiAqIENsZWFyIHRoZSBjcmVhdGVkIGZpbGVzIGNhY2hlLiBVc2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hlbiBmaWxlcyBhcmUgZGVsZXRlZCBleHRlcm5hbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDcmVhdGVkRmlsZXNDYWNoZSgpOiB2b2lkIHtcbiAgY3JlYXRlZEZpbGVzQ2FjaGUuY2xlYXIoKTtcbn1cblxuZXhwb3J0IHsgdWxpZFRvRGF0ZSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5cbi8qKlxuICogUmVnZXggbWF0Y2hpbmcgYSB0YWcgc3VmZml4IG9uIGEgZmlsZUlkIChhZnRlciBgLmpzb25gIGhhcyBiZWVuIHN0cmlwcGVkKS5cbiAqIEUuZy4sIGB3cnVuX0FCQy52aXRlc3QtMGAg4oaSIHRoZSBgLnZpdGVzdC0wYCBwYXJ0LlxuICogVGFncyBzdGFydCB3aXRoIGEgbGV0dGVyIGFuZCBjb250YWluIGFscGhhbnVtZXJpYyBjaGFycyBhbmQgaHlwaGVucy5cbiAqIEVudGl0eSBJRHMgKFVMSURzLCBzdGVwX04sIGV0Yy4pIG5ldmVyIGNvbnRhaW4gZG90cywgc28gdGhlIGZpcnN0IGRvdFxuICogYWx3YXlzIG1hcmtzIHRoZSB0YWcgYm91bmRhcnkuXG4gKi9cbmNvbnN0IFRBR19QQVRURVJOID0gL1xcLlthLXpBLVpdW2EtekEtWjAtOS1dKiQvO1xuXG4vKipcbiAqIFN0cmlwIGEgdGFnIHN1ZmZpeCBmcm9tIGEgZmlsZUlkLlxuICogYHdydW5fQUJDLnZpdGVzdC0wYCDihpIgYHdydW5fQUJDYFxuICogYHdydW5fQUJDYCDihpIgYHdydW5fQUJDYCAobm8tb3AgaWYgbm8gdGFnKVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBUYWcoZmlsZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZmlsZUlkLnJlcGxhY2UoVEFHX1BBVFRFUk4sICcnKTtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGEgZmlsZUlkIGJlbG9uZ3MgdG8gYSBzcGVjaWZpYyB0YWcuXG4gKiBgd3J1bl9BQkMudml0ZXN0LTBgIGJlbG9uZ3MgdG8gYHZpdGVzdC0wYC5cbiAqIFVudGFnZ2VkIGZpbGVJZHMgbmV2ZXIgbWF0Y2ggYSB0YWctc2NvcGVkIGxvb2t1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1RhZyhmaWxlSWQ6IHN0cmluZywgdGFnOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbGVJZC5lbmRzV2l0aChgLiR7dGFnfWApO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBmaWxlIHBhdGggZm9yIGFuIGVudGl0eSwgd2l0aCBvcHRpb25hbCB0YWcgZW1iZWRkZWQgaW4gdGhlIGZpbGVuYW1lLlxuICogYHRhZ2dlZFBhdGgoJy9kYXRhJywgJ3J1bnMnLCAnd3J1bl9BQkMnLCAndml0ZXN0LTAnKWAg4oaSIGAvZGF0YS9ydW5zL3dydW5fQUJDLnZpdGVzdC0wLmpzb25gXG4gKiBgdGFnZ2VkUGF0aCgnL2RhdGEnLCAncnVucycsICd3cnVuX0FCQycpYCDihpIgYC9kYXRhL3J1bnMvd3J1bl9BQkMuanNvbmBcbiAqXG4gKiBUaGUgYGZpbGVJZGAgYW5kIGB0YWdgIGFyZSB2YWxpZGF0ZWQgd2l0aCB7QGxpbmsgYXNzZXJ0U2FmZUVudGl0eUlkfSBhbmRcbiAqIHRoZSByZXN1bHQgaXMgY29udGFpbm1lbnQtY2hlY2tlZCB3aXRoIHtAbGluayByZXNvbHZlV2l0aGluQmFzZX0gdG9cbiAqIHByZXZlbnQgcGF0aC10cmF2ZXJzYWwgYXR0YWNrcyB3aGVuIHZhbHVlcyBhcmUgZGVyaXZlZCBmcm9tIHVudHJ1c3RlZFxuICogcmVxdWVzdCBpbnB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhZ2dlZFBhdGgoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgZW50aXR5RGlyOiBzdHJpbmcsXG4gIGZpbGVJZDogc3RyaW5nLFxuICB0YWc/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCgnZmlsZUlkJywgZmlsZUlkKTtcbiAgaWYgKHRhZyAhPT0gdW5kZWZpbmVkKSBhc3NlcnRTYWZlRW50aXR5SWQoJ3RhZycsIHRhZyk7XG4gIGNvbnN0IGZpbGVuYW1lID0gdGFnID8gYCR7ZmlsZUlkfS4ke3RhZ30uanNvbmAgOiBgJHtmaWxlSWR9Lmpzb25gO1xuICByZXR1cm4gcmVzb2x2ZVdpdGhpbkJhc2UoYmFzZWRpciwgZW50aXR5RGlyLCBmaWxlbmFtZSk7XG59XG5cbi8qKlxuICogUmVhZCBhIEpTT04gZW50aXR5IHdpdGggdGFnZ2VkIGZhbGxiYWNrLlxuICogV2hlbiBhIHRhZyBpcyBzZXQsIHRyaWVzIHRoZSB0YWdnZWQgcGF0aCBmaXJzdCwgdGhlbiBmYWxscyBiYWNrIHRvIHRoZVxuICogdW50YWdnZWQgcGF0aCAoc28gYSB0YWdnZWQgd29ybGQgY2FuIHJlYWQgZW50aXRpZXMgd3JpdHRlbiB3aXRob3V0IGEgdGFnKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRKU09OV2l0aEZhbGxiYWNrPFQ+KFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIGVudGl0eURpcjogc3RyaW5nLFxuICBmaWxlSWQ6IHN0cmluZyxcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD4sXG4gIHRhZz86IHN0cmluZ1xuKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICBhc3NlcnRTYWZlRW50aXR5SWQoJ2ZpbGVJZCcsIGZpbGVJZCk7XG4gIGlmICh0YWcgIT09IHVuZGVmaW5lZCkgYXNzZXJ0U2FmZUVudGl0eUlkKCd0YWcnLCB0YWcpO1xuICBpZiAodGFnKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZEpTT04oXG4gICAgICByZXNvbHZlV2l0aGluQmFzZShiYXNlZGlyLCBlbnRpdHlEaXIsIGAke2ZpbGVJZH0uJHt0YWd9Lmpzb25gKSxcbiAgICAgIHNjaGVtYVxuICAgICk7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gcmVhZEpTT04oXG4gICAgcmVzb2x2ZVdpdGhpbkJhc2UoYmFzZWRpciwgZW50aXR5RGlyLCBgJHtmaWxlSWR9Lmpzb25gKSxcbiAgICBzY2hlbWFcbiAgKTtcbn1cblxuLyoqXG4gKiBMaXN0IGFsbCBmaWxlbmFtZXMgaW4gYSBkaXJlY3RvcnkgdGhhdCBoYXZlIGEgc3BlY2lmaWMgdGFnLlxuICogUmV0dXJucyBmdWxsIGZpbGVuYW1lcyAoZS5nLiwgYHdydW5fQUJDLnZpdGVzdC0wLmpzb25gKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RUYWdnZWRGaWxlcyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICB0YWc6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBzdWZmaXggPSBgLiR7dGFnfS5qc29uYDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChzdWZmaXgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIExpc3QgYWxsIGZpbGVuYW1lcyBpbiBhIGRpcmVjdG9yeSB0aGF0IGhhdmUgYSBzcGVjaWZpYyB0YWcgYW5kIGV4dGVuc2lvbi5cbiAqIFJldHVybnMgZnVsbCBmaWxlbmFtZXMgKGUuZy4sIGBzdHJlYW0tY2hua19BQkMudml0ZXN0LTAuYmluYCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0VGFnZ2VkRmlsZXNCeUV4dGVuc2lvbihcbiAgZGlyUGF0aDogc3RyaW5nLFxuICB0YWc6IHN0cmluZyxcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc3VmZml4ID0gYC4ke3RhZ30ke2V4dGVuc2lvbn1gO1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gZmlsZXMuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKHN1ZmZpeCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVEaXIoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIC8vIElnbm9yZSBpZiBhbHJlYWR5IGV4aXN0c1xuICB9XG59XG5cbmludGVyZmFjZSBXcml0ZU9wdGlvbnMge1xuICBvdmVyd3JpdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEN1c3RvbSBKU09OIHJlcGxhY2VyIHRoYXQgZW5jb2RlcyBVaW50OEFycmF5IGFzIGJhc2U2NCBzdHJpbmdzLlxuICogRm9ybWF0OiB7IF9fdHlwZTogJ1VpbnQ4QXJyYXknLCBkYXRhOiAnPGJhc2U2ND4nIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25SZXBsYWNlcihfa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnVWludDhBcnJheScsXG4gICAgICBkYXRhOiBCdWZmZXIuZnJvbSh2YWx1ZSkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEN1c3RvbSBKU09OIHJldml2ZXIgdGhhdCBkZWNvZGVzIGJhc2U2NCBzdHJpbmdzIGJhY2sgdG8gVWludDhBcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25SZXZpdmVyKF9rZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICh2YWx1ZSBhcyBhbnkpLl9fdHlwZSA9PT0gJ1VpbnQ4QXJyYXknICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyBhbnkpLmRhdGEgPT09ICdzdHJpbmcnXG4gICkge1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSgodmFsdWUgYXMgYW55KS5kYXRhLCAnYmFzZTY0JykpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlSlNPTihcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGF0YTogYW55LFxuICBvcHRzPzogV3JpdGVPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHdyaXRlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhLCBqc29uUmVwbGFjZXIsIDIpLCBvcHRzKTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgZGF0YSB0byBhIGZpbGUgdXNpbmcgYXRvbWljIHdyaXRlLXJlbmFtZSBwYXR0ZXJuLlxuICpcbiAqIE5vdGU6IFdoaWxlIHRoaXMgZnVuY3Rpb24gdXNlcyB0ZW1wIGZpbGVzIHRvIGF2b2lkIHBhcnRpYWwgd3JpdGVzLFxuICogaXQgZG9lcyBub3QgcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgY29uY3VycmVudCB3cml0ZXMgZnJvbSBtdWx0aXBsZVxuICogcHJvY2Vzc2VzLiBJbiBhIG11bHRpLXdyaXRlciBzY2VuYXJpbywgdGhlIGxhc3Qgd3JpdGVyIHdpbnMuXG4gKiBGb3IgcHJvZHVjdGlvbiB1c2Ugd2l0aCBtdWx0aXBsZSB3cml0ZXJzLCBjb25zaWRlciB1c2luZyBhIHByb3BlclxuICogZGF0YWJhc2Ugb3IgbG9ja2luZyBtZWNoYW5pc20uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGF0YTogc3RyaW5nIHwgQnVmZmVyLFxuICBvcHRzPzogV3JpdGVPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFvcHRzPy5vdmVyd3JpdGUpIHtcbiAgICAvLyBGYXN0IHBhdGg6IGNoZWNrIGluLW1lbW9yeSBjYWNoZSBmaXJzdCB0byBhdm9pZCBleHBlbnNpdmUgZnMuYWNjZXNzKCkgY2FsbHNcbiAgICAvLyBUaGlzIHByb3ZpZGVzIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IHdoZW4gY3JlYXRpbmcgbWFueSBmaWxlc1xuICAgIGlmIChjcmVhdGVkRmlsZXNDYWNoZS5oYXMoZmlsZVBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgYEZpbGUgJHtmaWxlUGF0aH0gYWxyZWFkeSBleGlzdHMgYW5kICdvdmVyd3JpdGUnIGlzIGZhbHNlYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTbG93IHBhdGg6IGNoZWNrIGZpbGVzeXN0ZW0gZm9yIGZpbGVzIGNyZWF0ZWQgYmVmb3JlIHRoaXMgcHJvY2VzcyBzdGFydGVkXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAvLyBGaWxlIGV4aXN0cyBvbiBkaXNrLCBhZGQgdG8gY2FjaGUgZm9yIGZ1dHVyZSBjaGVja3NcbiAgICAgIGNyZWF0ZWRGaWxlc0NhY2hlLmFkZChmaWxlUGF0aCk7XG4gICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgYEZpbGUgJHtmaWxlUGF0aH0gYWxyZWFkeSBleGlzdHMgYW5kICdvdmVyd3JpdGUnIGlzIGZhbHNlYFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBJZiBmaWxlIGRvZXNuJ3QgZXhpc3QgKEVOT0VOVCksIGNvbnRpbnVlIHdpdGggd3JpdGVcbiAgICAgIGlmIChlcnJvci5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB0ZW1wUGF0aCA9IGAke2ZpbGVQYXRofS50bXAuJHt1bGlkKCl9YDtcbiAgbGV0IHRlbXBGaWxlQ3JlYXRlZCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGF3YWl0IGVuc3VyZURpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcFBhdGgsIGRhdGEpO1xuICAgIHRlbXBGaWxlQ3JlYXRlZCA9IHRydWU7XG4gICAgYXdhaXQgd2l0aFdpbmRvd3NSZXRyeSgoKSA9PiBmcy5yZW5hbWUodGVtcFBhdGgsIGZpbGVQYXRoKSk7XG4gICAgLy8gVHJhY2sgdGhpcyBmaWxlIGluIGNhY2hlIHNvIGZ1dHVyZSB3cml0ZXMga25vdyBpdCBleGlzdHNcbiAgICBjcmVhdGVkRmlsZXNDYWNoZS5hZGQoZmlsZVBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIE9ubHkgdHJ5IHRvIGNsZWFuIHVwIHRlbXAgZmlsZSBpZiBpdCB3YXMgYWN0dWFsbHkgY3JlYXRlZFxuICAgIGlmICh0ZW1wRmlsZUNyZWF0ZWQpIHtcbiAgICAgIGF3YWl0IHdpdGhXaW5kb3dzUmV0cnkoKCkgPT4gZnMudW5saW5rKHRlbXBQYXRoKSwgMykuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEpTT048VD4oXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRlY29kZXI6IHouWm9kVHlwZTxUPlxuKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgcmV0dXJuIGRlY29kZXIucGFyc2UoSlNPTi5wYXJzZShjb250ZW50LCBqc29uUmV2aXZlcikpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIG51bGw7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRCdWZmZXIoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gIHJldHVybiBjb250ZW50O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEZpcnN0Qnl0ZShcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZmlsZSA9IGF3YWl0IGZzLm9wZW4oZmlsZVBhdGgsICdyJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgYnl0ZSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgxKTtcbiAgICBjb25zdCB7IGJ5dGVzUmVhZCB9ID0gYXdhaXQgZmlsZS5yZWFkKGJ5dGUsIDAsIDEsIDApO1xuICAgIHJldHVybiBieXRlc1JlYWQgPT09IDAgPyB1bmRlZmluZWQgOiBieXRlWzBdO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZpbGUuY2xvc2UoKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlSlNPTihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMudW5saW5rKGZpbGVQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSAhPT0gJ0VOT0VOVCcpIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogQXRvbWljYWxseSBwdWJsaXNoIGEgZnVsbHktd3JpdHRlbiBmaWxlIHdpdGhvdXQgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lLlxuICpcbiAqIFdyaXRpbmcgZGlyZWN0bHkgd2l0aCBPX0NSRUFUIHwgT19FWENMIG1ha2VzIHRoZSBkZXN0aW5hdGlvbiB2aXNpYmxlIGJlZm9yZVxuICogaXRzIGNvbnRlbnRzIGFyZSBjb21wbGV0ZSwgc28gY29uY3VycmVudCByZWFkZXJzIGNhbiBvYnNlcnZlIGEgcGFydGlhbCBmaWxlLlxuICogSW5zdGVhZCwgd3JpdGUgdG8gYSB1bmlxdWUgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnksIHRoZW4gaGFyZC1saW5rIGl0IGludG9cbiAqIHBsYWNlLiBDcmVhdGluZyB0aGUgbGluayBpcyBhdG9taWMgYW5kIGZhaWxzIHdpdGggRUVYSVNUIGlmIGFub3RoZXIgd3JpdGVyXG4gKiBwdWJsaXNoZWQgdGhlIGRlc3RpbmF0aW9uIGZpcnN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVFeGNsdXNpdmUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRhdGE6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGF3YWl0IGVuc3VyZURpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKTtcbiAgY29uc3QgdGVtcFBhdGggPSBgJHtmaWxlUGF0aH0udG1wLiR7dWxpZCgpfWA7XG4gIGxldCB0ZW1wRmlsZUNyZWF0ZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wUGF0aCwgZGF0YSwgeyBmbGFnOiAnd3gnIH0pO1xuICAgIHRlbXBGaWxlQ3JlYXRlZCA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2l0aFdpbmRvd3NSZXRyeSgoKSA9PiBmcy5saW5rKHRlbXBQYXRoLCBmaWxlUGF0aCkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFRVhJU1QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGVtcEZpbGVDcmVhdGVkKSB7XG4gICAgICBhd2FpdCB3aXRoV2luZG93c1JldHJ5KCgpID0+IGZzLnVubGluayh0ZW1wUGF0aCksIDMpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RKU09ORmlsZXMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICByZXR1cm4gbGlzdEZpbGVzQnlFeHRlbnNpb24oZGlyUGF0aCwgJy5qc29uJyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0RmlsZXNCeUV4dGVuc2lvbihcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gZmlsZXNcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoZXh0ZW5zaW9uKSlcbiAgICAgIC5tYXAoKGYpID0+IGYuc2xpY2UoMCwgLWV4dGVuc2lvbi5sZW5ndGgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5pbnRlcmZhY2UgUGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5Q29uZmlnPFQ+IHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIHNjaGVtYTogei5ab2RUeXBlPFQ+O1xuICBmaWxlUHJlZml4Pzogc3RyaW5nO1xuICBmaWxlSWRGaWx0ZXI/OiAoZmlsZUlkOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIGZpbHRlcj86IChpdGVtOiBUKSA9PiBib29sZWFuO1xuICBzb3J0T3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbiAgbGltaXQ/OiBudW1iZXI7XG4gIGN1cnNvcj86IHN0cmluZztcbiAgZ2V0Q3JlYXRlZEF0KGZpbGVuYW1lOiBzdHJpbmcpOiBEYXRlIHwgbnVsbDtcbiAgZ2V0SWQ/KGl0ZW06IFQpOiBzdHJpbmc7XG59XG4vLyBDdXJzb3IgZm9ybWF0OiBcInRpbWVzdGFtcHxpZFwiIGZvciB0aWUtYnJlYWtpbmdcbmludGVyZmFjZSBQYXJzZWRDdXJzb3Ige1xuICB0aW1lc3RhbXA6IERhdGU7XG4gIGlkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5mdW5jdGlvbiBwYXJzZUN1cnNvcihjdXJzb3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFBhcnNlZEN1cnNvciB8IG51bGwge1xuICBpZiAoIWN1cnNvcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcGFydHMgPSBjdXJzb3Iuc3BsaXQoJ3wnKTtcbiAgcmV0dXJuIHtcbiAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKHBhcnRzWzBdKSxcbiAgICBpZDogcGFydHNbMV0gfHwgbnVsbCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ3Vyc29yKHRpbWVzdGFtcDogRGF0ZSwgaWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBpZCA/IGAke3RpbWVzdGFtcC50b0lTT1N0cmluZygpfXwke2lkfWAgOiB0aW1lc3RhbXAudG9JU09TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeTxUIGV4dGVuZHMgeyBjcmVhdGVkQXQ6IERhdGUgfT4oXG4gIGNvbmZpZzogUGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5Q29uZmlnPFQ+XG4pOiBQcm9taXNlPFBhZ2luYXRlZFJlc3BvbnNlPFQ+PiB7XG4gIGNvbnN0IHtcbiAgICBkaXJlY3RvcnksXG4gICAgc2NoZW1hLFxuICAgIGZpbGVQcmVmaXgsXG4gICAgZmlsZUlkRmlsdGVyLFxuICAgIGZpbHRlcixcbiAgICBzb3J0T3JkZXIgPSAnZGVzYycsXG4gICAgbGltaXQgPSAyMCxcbiAgICBjdXJzb3IsXG4gICAgZ2V0Q3JlYXRlZEF0LFxuICAgIGdldElkLFxuICB9ID0gY29uZmlnO1xuXG4gIC8vIFZhbGlkYXRlIGZpbGVQcmVmaXggKHR5cGljYWxseSBgJHtydW5JZH0tYCkgc28gcmVxdWVzdC1kZXJpdmVkIHByZWZpeGVzXG4gIC8vIGNvbnNpc3RlbnRseSByZWplY3QgdW5zYWZlIGNoYXJhY3RlcnMuIGZpbGVQcmVmaXggaXMgb25seSB1c2VkIGJlbG93IHRvXG4gIC8vIGZpbHRlciByZWFkZGlyKCkgcmVzdWx0cyBieSBwcmVmaXgg4oCUIGl0IGRvZXNuJ3QgcGFydGljaXBhdGUgaW4gcGF0aFxuICAvLyBjb25zdHJ1Y3Rpb24g4oCUIGJ1dCBrZWVwaW5nIHRoZSB2YWxpZGF0aW9uIHJ1bGUgdW5pZm9ybSBhY3Jvc3MgdGhlXG4gIC8vIHN0b3JhZ2UgbGF5ZXIgYXZvaWRzIHNwZWNpYWwgY2FzZXMgYW5kIGNhdGNoZXMgYmFkIHZhbHVlcyBlYXJsaWVyLlxuICBpZiAoZmlsZVByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdmaWxlUHJlZml4JywgZmlsZVByZWZpeCk7XG4gIH1cblxuICAvLyAxLiBHZXQgYWxsIEpTT04gZmlsZXMgaW4gZGlyZWN0b3J5XG4gIGNvbnN0IGZpbGVJZHMgPSBhd2FpdCBsaXN0SlNPTkZpbGVzKGRpcmVjdG9yeSk7XG5cbiAgLy8gMi4gRmlsdGVyIGJ5IHByZWZpeCBpZiBwcm92aWRlZFxuICBjb25zdCByZWxldmFudEZpbGVJZHMgPSBmaWxlUHJlZml4XG4gICAgPyBmaWxlSWRzLmZpbHRlcigoZmlsZUlkKSA9PiBmaWxlSWQuc3RhcnRzV2l0aChmaWxlUHJlZml4KSlcbiAgICA6IGZpbGVJZHM7XG4gIGNvbnN0IGZpbHRlcmVkRmlsZUlkcyA9IGZpbGVJZEZpbHRlclxuICAgID8gcmVsZXZhbnRGaWxlSWRzLmZpbHRlcihmaWxlSWRGaWx0ZXIpXG4gICAgOiByZWxldmFudEZpbGVJZHM7XG5cbiAgLy8gMy4gVUxJRCBPcHRpbWl6YXRpb246IEZpbHRlciBieSBjdXJzb3IgdXNpbmcgZmlsZW5hbWUgdGltZXN0YW1wcyBiZWZvcmUgbG9hZGluZyBKU09OXG4gIGNvbnN0IHBhcnNlZEN1cnNvciA9IHBhcnNlQ3Vyc29yKGN1cnNvcik7XG4gIGxldCBjYW5kaWRhdGVGaWxlSWRzID0gZmlsdGVyZWRGaWxlSWRzO1xuXG4gIGlmIChwYXJzZWRDdXJzb3IpIHtcbiAgICBjYW5kaWRhdGVGaWxlSWRzID0gZmlsdGVyZWRGaWxlSWRzLmZpbHRlcigoZmlsZUlkKSA9PiB7XG4gICAgICBjb25zdCBmaWxlbmFtZURhdGUgPSBnZXRDcmVhdGVkQXQoYCR7ZmlsZUlkfS5qc29uYCk7XG4gICAgICBpZiAoZmlsZW5hbWVEYXRlKSB7XG4gICAgICAgIC8vIFVzZSBmaWxlbmFtZSB0aW1lc3RhbXAgZm9yIGN1cnNvciBmaWx0ZXJpbmdcbiAgICAgICAgLy8gV2UgbmVlZCB0byBiZSBjYXJlZnVsIGhlcmU6IGlmIHBhcnNlZEN1cnNvciBoYXMgYW4gSUQgKGZvciB0aWUtYnJlYWtpbmcpLFxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGluY2x1ZGUgaXRlbXMgd2l0aCB0aGUgc2FtZSB0aW1lc3RhbXAgZm9yIGxhdGVyIElELWJhc2VkIGZpbHRlcmluZy5cbiAgICAgICAgLy8gSWYgbm8gSUQsIHdlIGNhbiB1c2Ugc3RyaWN0IGluZXF1YWxpdHkgZm9yIG9wdGltaXphdGlvbi5cbiAgICAgICAgY29uc3QgY3Vyc29yVGltZSA9IHBhcnNlZEN1cnNvci50aW1lc3RhbXAuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBmaWxlVGltZSA9IGZpbGVuYW1lRGF0ZS5nZXRUaW1lKCk7XG5cbiAgICAgICAgaWYgKHBhcnNlZEN1cnNvci5pZCkge1xuICAgICAgICAgIC8vIFRpZS1icmVha2luZyBtb2RlOiBpbmNsdWRlIGl0ZW1zIGF0IG9yIG5lYXIgY3Vyc29yIHRpbWVzdGFtcFxuICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICAgICAgPyBmaWxlVGltZSA8PSBjdXJzb3JUaW1lXG4gICAgICAgICAgICA6IGZpbGVUaW1lID49IGN1cnNvclRpbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gdGllLWJyZWFraW5nOiBzdHJpY3QgaW5lcXVhbGl0eVxuICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICAgICAgPyBmaWxlVGltZSA8IGN1cnNvclRpbWVcbiAgICAgICAgICAgIDogZmlsZVRpbWUgPiBjdXJzb3JUaW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDYW4ndCBleHRyYWN0IHRpbWVzdGFtcCBmcm9tIGZpbGVuYW1lIChlLmcuLCBzdGVwcyB1c2Ugc2VxdWVudGlhbCBJRHMpLlxuICAgICAgLy8gSW5jbHVkZSB0aGUgZmlsZSBhbmQgZGVmZXIgdG8gSlNPTi1iYXNlZCBmaWx0ZXJpbmcgYmVsb3cuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIDQuIExvYWQgZmlsZXMgaW5kaXZpZHVhbGx5IGFuZCBjb2xsZWN0IHZhbGlkIGl0ZW1zXG4gIGNvbnN0IHZhbGlkSXRlbXM6IFRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZmlsZUlkIG9mIGNhbmRpZGF0ZUZpbGVJZHMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGAke2ZpbGVJZH0uanNvbmApO1xuICAgIGxldCBpdGVtOiBUIHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGl0ZW0gPSBhd2FpdCByZWFkSlNPTihmaWxlUGF0aCwgc2NoZW1hKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IHpvZCBlcnJvcnMgdG8gaGFwcGVuLCBidXQgaWYgdGhlIEpTT04gZG9lcyBnZXQgbWFsZm9ybWVkLFxuICAgICAgLy8gd2Ugc2tpcCB0aGUgaXRlbS4gUHJlZmVyYWJseSwgd2UnZCBoYXZlIGEgd2F5IHRvIG1hcmsgaXRlbXMgYXMgbWFsZm9ybWVkLFxuICAgICAgLy8gc28gdGhhdCB0aGUgVUkgY2FuIGRpc3BsYXkgdGhlbSBhcyBzdWNoLCB3aXRoIHJpY2hlciBtZXNzYWdpbmcuIEluIHRoZSBtZWFudGltZSxcbiAgICAgIC8vIHdlIGp1c3QgbG9nIGEgd2FybmluZyBhbmQgc2tpcCB0aGUgaXRlbS5cbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIHouWm9kRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBTa2lwcGluZyBpdGVtICR7ZmlsZUlkfSBkdWUgdG8gbWFsZm9ybWVkIEpTT046ICR7ZXJyb3IubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIC8vIEFwcGx5IGN1c3RvbSBmaWx0ZXIgZWFybHkgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChmaWx0ZXIgJiYgIWZpbHRlcihpdGVtKSkgY29udGludWU7XG5cbiAgICAgIC8vIERvdWJsZS1jaGVjayBjdXJzb3IgZmlsdGVyaW5nIHdpdGggYWN0dWFsIGNyZWF0ZWRBdCBmcm9tIEpTT05cbiAgICAgIC8vIChpbiBjYXNlIFVMSUQgdGltZXN0YW1wIGRpZmZlcnMgZnJvbSBzdG9yZWQgY3JlYXRlZEF0KVxuICAgICAgaWYgKHBhcnNlZEN1cnNvcikge1xuICAgICAgICBjb25zdCBpdGVtVGltZSA9IGl0ZW0uY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICAgICAgY29uc3QgY3Vyc29yVGltZSA9IHBhcnNlZEN1cnNvci50aW1lc3RhbXAuZ2V0VGltZSgpO1xuXG4gICAgICAgIGlmIChzb3J0T3JkZXIgPT09ICdkZXNjJykge1xuICAgICAgICAgIC8vIEZvciBkZXNjZW5kaW5nIG9yZGVyLCBza2lwIGl0ZW1zID49IGN1cnNvclxuICAgICAgICAgIGlmIChpdGVtVGltZSA+IGN1cnNvclRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgIC8vIElmIHRpbWVzdGFtcHMgYXJlIGVxdWFsLCB1c2UgSUQgZm9yIHRpZS1icmVha2luZyAoc2tpcCBpZiBJRCA+PSBjdXJzb3JJZClcbiAgICAgICAgICBpZiAoaXRlbVRpbWUgPT09IGN1cnNvclRpbWUgJiYgcGFyc2VkQ3Vyc29yLmlkICYmIGdldElkKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtSWQgPSBnZXRJZChpdGVtKTtcbiAgICAgICAgICAgIGlmIChpdGVtSWQgPj0gcGFyc2VkQ3Vyc29yLmlkKSBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yIGFzY2VuZGluZyBvcmRlciwgc2tpcCBpdGVtcyA8PSBjdXJzb3JcbiAgICAgICAgICBpZiAoaXRlbVRpbWUgPCBjdXJzb3JUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAvLyBJZiB0aW1lc3RhbXBzIGFyZSBlcXVhbCwgdXNlIElEIGZvciB0aWUtYnJlYWtpbmcgKHNraXAgaWYgSUQgPD0gY3Vyc29ySWQpXG4gICAgICAgICAgaWYgKGl0ZW1UaW1lID09PSBjdXJzb3JUaW1lICYmIHBhcnNlZEN1cnNvci5pZCAmJiBnZXRJZCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SWQoaXRlbSk7XG4gICAgICAgICAgICBpZiAoaXRlbUlkIDw9IHBhcnNlZEN1cnNvci5pZCkgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhbGlkSXRlbXMucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICAvLyA1LiBTb3J0IGJ5IGNyZWF0ZWRBdCAoYW5kIGJ5IElEIGZvciB0aWUtYnJlYWtpbmcgaWYgZ2V0SWQgaXMgcHJvdmlkZWQpXG4gIHZhbGlkSXRlbXMuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGFUaW1lID0gYS5jcmVhdGVkQXQuZ2V0VGltZSgpO1xuICAgIGNvbnN0IGJUaW1lID0gYi5jcmVhdGVkQXQuZ2V0VGltZSgpO1xuICAgIGNvbnN0IHRpbWVDb21wYXJpc29uID0gc29ydE9yZGVyID09PSAnYXNjJyA/IGFUaW1lIC0gYlRpbWUgOiBiVGltZSAtIGFUaW1lO1xuXG4gICAgLy8gSWYgdGltZXN0YW1wcyBhcmUgZXF1YWwgYW5kIHdlIGhhdmUgZ2V0SWQsIHVzZSBJRCBmb3Igc3RhYmxlIHNvcnRpbmdcbiAgICBpZiAodGltZUNvbXBhcmlzb24gPT09IDAgJiYgZ2V0SWQpIHtcbiAgICAgIGNvbnN0IGFJZCA9IGdldElkKGEpO1xuICAgICAgY29uc3QgYklkID0gZ2V0SWQoYik7XG4gICAgICByZXR1cm4gc29ydE9yZGVyID09PSAnYXNjJ1xuICAgICAgICA/IGFJZC5sb2NhbGVDb21wYXJlKGJJZClcbiAgICAgICAgOiBiSWQubG9jYWxlQ29tcGFyZShhSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aW1lQ29tcGFyaXNvbjtcbiAgfSk7XG5cbiAgLy8gNi4gQXBwbHkgcGFnaW5hdGlvblxuICBjb25zdCBoYXNNb3JlID0gdmFsaWRJdGVtcy5sZW5ndGggPiBsaW1pdDtcbiAgY29uc3QgaXRlbXMgPSBoYXNNb3JlID8gdmFsaWRJdGVtcy5zbGljZSgwLCBsaW1pdCkgOiB2YWxpZEl0ZW1zO1xuICBjb25zdCBuZXh0Q3Vyc29yID1cbiAgICBpdGVtcy5sZW5ndGggPiAwXG4gICAgICA/IGNyZWF0ZUN1cnNvcihcbiAgICAgICAgICBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXS5jcmVhdGVkQXQsXG4gICAgICAgICAgZ2V0SWQ/LihpdGVtc1tpdGVtcy5sZW5ndGggLSAxXSlcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgZGF0YTogaXRlbXMsXG4gICAgY3Vyc29yOiBuZXh0Q3Vyc29yLFxuICAgIGhhc01vcmUsXG4gIH07XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"events-storage.d.ts","sourceRoot":"","sources":["../../src/storage/events-storage.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAMV,OAAO,EAGR,MAAM,iBAAiB,CAAC;AA8IzB;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAukCnB"}
1
+ {"version":3,"file":"events-storage.d.ts","sourceRoot":"","sources":["../../src/storage/events-storage.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAMV,OAAO,EAGR,MAAM,iBAAiB,CAAC;AA8IzB;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAskCnB"}
@@ -189,11 +189,10 @@ export function createEventsStorage(basedir, tag) {
189
189
  if (runInputData.deploymentId &&
190
190
  runInputData.workflowName &&
191
191
  runInputData.input !== undefined) {
192
- // Atomically try to create the run entity. writeExclusive
193
- // uses O_CREAT|O_EXCL so only the first writer wins,
194
- // preventing a TOCTOU race where a concurrent run_created
195
- // from start() could overwrite a run that was already
196
- // transitioned to 'running'.
192
+ // Atomically try to publish the run entity so only the first
193
+ // writer wins, preventing a TOCTOU race where a concurrent
194
+ // run_created from start() could overwrite a run that was
195
+ // already transitioned to 'running'.
197
196
  const createdRun = {
198
197
  runId: effectiveRunId,
199
198
  deploymentId: runInputData.deploymentId,
@@ -381,10 +380,10 @@ export function createEventsStorage(basedir, tag) {
381
380
  createdAt: now,
382
381
  updatedAt: now,
383
382
  };
384
- // Use writeExclusive (O_CREAT|O_EXCL) to atomically create the
385
- // run entity file. This prevents a TOCTOU race with the resilient
386
- // start path (run_started on non-existent run) that could result
387
- // in duplicate run_created events in the event log.
383
+ // Atomically publish the run entity file without overwriting an
384
+ // existing winner. This prevents a TOCTOU race with the resilient
385
+ // start path (run_started on non-existent run) that could result in
386
+ // duplicate run_created events in the event log.
388
387
  const runPath = taggedPath(basedir, 'runs', effectiveRunId, tag);
389
388
  const created = await writeExclusive(runPath, JSON.stringify(run, jsonReplacer, 2));
390
389
  if (!created) {
@@ -515,11 +514,11 @@ export function createEventsStorage(basedir, tag) {
515
514
  // must be deduped — otherwise both writes succeed and the event log
516
515
  // ends up with duplicate step_created entries. The outer
517
516
  // withStepLock mutex serializes within a single process; this
518
- // O_CREAT|O_EXCL constraint file additionally protects against
519
- // cross-process races (two pnpm workers, redelivered queue
520
- // messages, etc.). The loser throws EntityConflictError so the
521
- // runtime's existing catch path can swallow it and avoid
522
- // double-queuing the step.
517
+ // The exclusive constraint file additionally protects against
518
+ // cross-process races (two pnpm workers, redelivered queue messages,
519
+ // etc.). The loser throws EntityConflictError so the runtime's
520
+ // existing catch path can swallow it and avoid double-queuing the
521
+ // step.
523
522
  const stepCreatedLockName = tag
524
523
  ? `${effectiveRunId}-${data.correlationId}.created.${tag}`
525
524
  : `${effectiveRunId}-${data.correlationId}.created`;
@@ -895,4 +894,4 @@ export function createEventsStorage(basedir, tag) {
895
894
  },
896
895
  };
897
896
  }
898
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9ldmVudHMtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBVzFCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLFVBQVUsRUFDVixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFlBQVksRUFDWixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixjQUFjLEVBQ2QsU0FBUyxHQUNWLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUs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Q0FBQyxPQUFPO2FBQ2hDLENBQUMsQ0FBQztZQUVILHlEQUF5RDtZQUN6RCxJQUFJLFdBQVcsS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsT0FBTztvQkFDTCxHQUFHLE1BQU07b0JBQ1QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDOUIsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUN2QztpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBIb29rTm90Rm91bmRFcnJvcixcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBSdW5Ob3RTdXBwb3J0ZWRFcnJvcixcbiAgVG9vRWFybHlFcnJvcixcbiAgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBFdmVudCxcbiAgRXZlbnRSZXN1bHQsXG4gIEhvb2ssXG4gIFNlcmlhbGl6ZWREYXRhLFxuICBTdGVwLFxuICBTdG9yYWdlLFxuICBXYWl0LFxuICBXb3JrZmxvd1J1bixcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIEV2ZW50U2NoZW1hLFxuICBIb29rU2NoZW1hLFxuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICByZXF1aXJlc05ld2VyV29ybGQsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTdGVwU2NoZW1hLFxuICB2YWxpZGF0ZVVsaWRUaW1lc3RhbXAsXG4gIFdhaXRTY2hlbWEsXG4gIFdvcmtmbG93UnVuU2NoZW1hLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT04gfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0U2FmZUVudGl0eUlkLFxuICBkZWxldGVKU09OLFxuICBqc29uUmVwbGFjZXIsXG4gIGxpc3RKU09ORmlsZXMsXG4gIHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSxcbiAgcmVhZEpTT04sXG4gIHJlYWRKU09OV2l0aEZhbGxiYWNrLFxuICByZXNvbHZlV2l0aGluQmFzZSxcbiAgdGFnZ2VkUGF0aCxcbiAgd3JpdGVFeGNsdXNpdmUsXG4gIHdyaXRlSlNPTixcbn0gZnJvbSAnLi4vZnMuanMnO1xuaW1wb3J0IHsgc3RyaXBFdmVudERhdGFSZWZzIH0gZnJvbSAnLi9maWx0ZXJzLmpzJztcbmltcG9ydCB7IGdldE9iamVjdENyZWF0ZWRBdCwgaGFzaFRva2VuLCBtb25vdG9uaWNVbGlkIH0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IGRlbGV0ZUFsbEhvb2tzRm9yUnVuIH0gZnJvbSAnLi9ob29rcy1zdG9yYWdlLmpzJztcbmltcG9ydCB7IGhhbmRsZUxlZ2FjeUV2ZW50IH0gZnJvbSAnLi9sZWdhY3kuanMnO1xuaW1wb3J0IHsgd2l0aFJ1bkZpbGVMb2NrIH0gZnJvbSAnLi9ydW5zLXN0b3JhZ2UuanMnO1xuXG4vKipcbiAqIFBlci1zdGVwIGluLXByb2Nlc3MgYXN5bmMgbXV0ZXguIFNlcmlhbGl6ZXMgY29uY3VycmVudCBgZXZlbnRzLmNyZWF0ZWAgY2FsbHNcbiAqIHRoYXQgdGFyZ2V0IHRoZSBzYW1lIHN0ZXAsIHNvIHRoYXQgdGhlIFwiY2hlY2sgdGVybWluYWwgc3RhdGUsIHRoZW4gd3JpdGUgc3RlcFxuICogZW50aXR5ICsgZXZlbnRcIiBzZXF1ZW5jZSBpcyBhdG9taWMuIFdpdGhvdXQgdGhpcywgdHdvIGNvbmN1cnJlbnQgc3RlcF9zdGFydGVkXG4gKiBjYWxscyBjYW4gYm90aCBwYXNzIHRoZSBub3QtdGVybWluYWwgY2hlY2sgYW5kIGJvdGggd3JpdGUgc3RlcF9zdGFydGVkIGV2ZW50c1xuICog4oCUIG9yIGEgc3RlcF9zdGFydGVkIGNhbiBsYW5kIGluIHRoZSBsb2cgYWZ0ZXIgc3RlcF9jb21wbGV0ZWQgaGFzIGFscmVhZHlcbiAqIHdyaXR0ZW4sIHByb2R1Y2luZyB1bmNvbnN1bWVkIGV2ZW50cyBvbiByZXBsYXkuXG4gKlxuICogRHVwbGljYXRlIHN0ZXBfc3RhcnRlZCBldmVudHMgZm9yIGEgbm9uLXRlcm1pbmFsIHN0ZXAgYXJlIHN0aWxsIGFsbG93ZWRcbiAqIChyZXRyaWVzIGxlZ2l0aW1hdGVseSByZS1zdGFydCBhIHN0ZXApLCBvbmx5IHdyaXRlcyB0byBhbiBhbHJlYWR5LXRlcm1pbmFsXG4gKiBzdGVwIGFyZSByZWplY3RlZC5cbiAqL1xuY29uc3Qgc3RlcExvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+KCk7XG5cbmNvbnN0IEhvb2tUb2tlbkNsYWltU2NoZW1hID0gei5vYmplY3Qoe1xuICBydW5JZDogei5zdHJpbmcoKSxcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiByZWFkSG9va1Rva2VuQ2xhaW0oXG4gIGNvbnN0cmFpbnRQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8ei5pbmZlcjx0eXBlb2YgSG9va1Rva2VuQ2xhaW1TY2hlbWE+IHwgbnVsbD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZWFkSlNPTihjb25zdHJhaW50UGF0aCwgSG9va1Rva2VuQ2xhaW1TY2hlbWEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2Ygei5ab2RFcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdpdGhTdGVwTG9jazxUPihrZXk6IHN0cmluZywgZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcHJldiA9IHN0ZXBMb2Nrcy5nZXQoa2V5KTtcbiAgY29uc3QgdGFza0JveDogeyB0YXNrPzogUHJvbWlzZTxUPiB9ID0ge307XG4gIGNvbnN0IHRhc2sgPSAoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChwcmV2KSB7XG4gICAgICAvLyBXYWl0IGZvciB0aGUgcHJldmlvdXMgdGFzayB0byBzZXR0bGU7IGRvbid0IGluaGVyaXQgaXRzIGVycm9ycy5cbiAgICAgIGF3YWl0IHByZXYuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoc3RlcExvY2tzLmdldChrZXkpID09PSB0YXNrQm94LnRhc2spIHtcbiAgICAgICAgc3RlcExvY2tzLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcbiAgdGFza0JveC50YXNrID0gdGFzaztcbiAgc3RlcExvY2tzLnNldChrZXksIHRhc2spO1xuICByZXR1cm4gdGFzaztcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGVsZXRlIGFsbCB3YWl0cyBhc3NvY2lhdGVkIHdpdGggYSB3b3JrZmxvdyBydW4uXG4gKiBDYWxsZWQgd2hlbiBhIHJ1biByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB3YWl0c0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnd2FpdHMnKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBsaXN0SlNPTkZpbGVzKHdhaXRzRGlyKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAvLyBmaWxlSWRzIG1heSBjb250YWluIHRhZyBzdWZmaXhlcyAoZS5nLiwgXCJ3cnVuX0FCQy1jb3JySWQudml0ZXN0LTBcIilcbiAgICAvLyBidXQgc3RhcnRzV2l0aCBzdGlsbCBtYXRjaGVzIGNvcnJlY3RseSBzaW5jZSB0aGUgdGFnIGlzIGEgc3VmZml4LlxuICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoYCR7cnVuSWR9LWApKSB7XG4gICAgICBjb25zdCB3YWl0UGF0aCA9IHBhdGguam9pbih3YWl0c0RpciwgYCR7ZmlsZX0uanNvbmApO1xuICAgICAgYXdhaXQgZGVsZXRlSlNPTih3YWl0UGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUGVyc2lzdCBhIGxpZmVjeWNsZS1kcml2ZW4gcnVuIHVwZGF0ZSAocnVuX3N0YXJ0ZWQgLyBydW5fY29tcGxldGVkIC9cbiAqIHJ1bl9mYWlsZWQgLyBydW5fY2FuY2VsbGVkKSB1bmRlciB0aGUgc2hhcmVkIHBlci1ydW4gZmlsZSBsb2NrLFxuICogcmUtcmVhZGluZyB0aGUgb24tZGlzayBydW4gaW5zaWRlIHRoZSBsb2NrIHNvIGFueSBhdHRyaWJ1dGUgd3JpdGVzXG4gKiB0aGF0IGxhbmRlZCBiZXR3ZWVuIHRoZSBwcmUtdmFsaWRhdGlvbiBgY3VycmVudFJ1bmAgcmVhZCBhbmQgdGhpc1xuICogd3JpdGUgYXJlIHByZXNlcnZlZC4gV2l0aG91dCB0aGUgcmUtcmVhZCwgYW4gYGV4cGVyaW1lbnRhbFNldEF0dHJpYnV0ZXNgXG4gKiBjYWxsIHNhbmR3aWNoZWQgYmV0d2VlbiB0aGUgbGlmZWN5Y2xlIHJlYWQgYW5kIHdyaXRlIHdvdWxkIGJlXG4gKiBzaWxlbnRseSBvdmVyd3JpdHRlbiBieSB0aGUgbGlmZWN5Y2xlIHdyaXRlJ3Mgc3RhbGUgYXR0cmlidXRlIHNuYXBzaG90LlxuICpcbiAqIGBwcm9wb3NlZGAgaXMgdGhlIGZ1bGx5LWNvbnN0cnVjdGVkIHJ1biByb3cgdGhlIGNhbGxlciB3YW50cyB0b1xuICogd3JpdGUgKHdpdGggdGhlIGNvcnJlY3QgZGlzY3JpbWluYXRlZC11bmlvbiBzdGF0dXMgYnJhbmNoKS4gT25seSB0aGVcbiAqIGBhdHRyaWJ1dGVzYCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIHRoZSBmcmVzaGVzdCB2ZXJzaW9uIGluc2lkZSB0aGVcbiAqIGxvY2suXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrPFQgZXh0ZW5kcyBXb3JrZmxvd1J1bj4oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgdGFnOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHByb3Bvc2VkOiBUXG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIHdpdGhSdW5GaWxlTG9jayhydW5JZCwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZyZXNoID0gYXdhaXQgcmVhZEpTT04oXG4gICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgcnVuSWQsIHRhZyksXG4gICAgICBXb3JrZmxvd1J1blNjaGVtYVxuICAgICk7XG4gICAgY29uc3QgbmV4dDogVCA9IHtcbiAgICAgIC4uLnByb3Bvc2VkLFxuICAgICAgYXR0cmlidXRlczogZnJlc2g/LmF0dHJpYnV0ZXMgPz8gcHJvcG9zZWQuYXR0cmlidXRlcyxcbiAgICB9O1xuICAgIGF3YWl0IHdyaXRlSlNPTih0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgcnVuSWQsIHRhZyksIG5leHQsIHtcbiAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgZXZlbnRzIHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIGZpbGVzeXN0ZW0uXG4gKiBJbXBsZW1lbnRzIHRoZSBTdG9yYWdlWydldmVudHMnXSBpbnRlcmZhY2Ugd2l0aCBjcmVhdGUsIGxpc3QsIGFuZCBsaXN0QnlDb3JyZWxhdGlvbklkIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmVudHNTdG9yYWdlKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHRhZz86IHN0cmluZ1xuKTogU3RvcmFnZVsnZXZlbnRzJ10ge1xuICByZXR1cm4ge1xuICAgIGFzeW5jIGNyZWF0ZShydW5JZCwgZGF0YSwgcGFyYW1zKTogUHJvbWlzZTxFdmVudFJlc3VsdD4ge1xuICAgICAgLy8gVmFsaWRhdGUgcmVxdWVzdC1zdXBwbGllZCBJRHMgYmVmb3JlIHRoZXkncmUgY29uY2F0ZW5hdGVkIGludG9cbiAgICAgIC8vIGZpbGVzeXN0ZW0gcGF0aHMuIFRoaXMgaXMgdGhlIHByaW1hcnkgZGVmZW5zZSBhZ2FpbnN0IHBhdGggdHJhdmVyc2FsXG4gICAgICAvLyBhdHRhY2tzIHdoZXJlIGEgY2xpZW50IHN1cHBsaWVzIHJ1bklkIC8gY29ycmVsYXRpb25JZCB2YWx1ZXMgbGlrZVxuICAgICAgLy8gXCIuLi8uLi8uLi9wYWNrYWdlXCIgdG8gcmVhZCBvciB3cml0ZSBmaWxlcyBvdXRzaWRlIHRoZSBzdG9yYWdlIHJvb3QuXG4gICAgICAvLyBSdW4gYmVmb3JlIHRha2luZyB0aGUgcGVyLXN0ZXAgbXV0ZXggc28gbWFsZm9ybWVkIGlucHV0cyBmYWlsIGZhc3QuXG4gICAgICAvL1xuICAgICAgLy8gRW1wdHkgYGNvcnJlbGF0aW9uSWRgIHZhbHVlcyBhcmUgYWxzbyByZWplY3RlZCBoZXJlOiB0aGUgZXZlbnRcbiAgICAgIC8vIHNjaGVtYXMgb25seSByZXF1aXJlIGB6LnN0cmluZygpYCwgc28gd2l0aG91dCB0aGlzIGNoZWNrIGFcbiAgICAgIC8vIHN0ZXBfY3JlYXRlZCAvIGhvb2tfY3JlYXRlZCAvIHdhaXRfY3JlYXRlZCByZXF1ZXN0IHdpdGhcbiAgICAgIC8vIGBjb3JyZWxhdGlvbklkOiAnJ2Agd291bGQgc2lsZW50bHkgYmUgd3JpdHRlbiB1bmRlciBhIG1hbGZvcm1lZFxuICAgICAgLy8gY29tcG9zaXRlIGtleSBsaWtlIGAke3J1bklkfS1gLlxuICAgICAgaWYgKHJ1bklkICE9IG51bGwgJiYgcnVuSWQgIT09ICcnKSB7XG4gICAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgncnVuSWQnLCBydW5JZCk7XG4gICAgICB9XG4gICAgICBpZiAoJ2NvcnJlbGF0aW9uSWQnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEuY29ycmVsYXRpb25JZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdjb3JyZWxhdGlvbklkJywgZGF0YS5jb3JyZWxhdGlvbklkKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCBsaWZlY3ljbGUgZXZlbnRzIGFyZSBzZXJpYWxpemVkIHBlci1zdGVwIHZpYSBhbiBpbi1wcm9jZXNzIG11dGV4XG4gICAgICAvLyBzbyB0aGF0IHRoZSBcImNoZWNrIHN0YXRlLCB0aGVuIHdyaXRlXCIgc2VxdWVuY2UgaW4gc3RlcF9zdGFydGVkIC9cbiAgICAgIC8vIHN0ZXBfY29tcGxldGVkIC8gc3RlcF9mYWlsZWQgLyBzdGVwX3JldHJ5aW5nIGlzIGF0b21pYy4gc3RlcF9jcmVhdGVkXG4gICAgICAvLyBpcyBhbHNvIHNlcmlhbGl6ZWQgc28gZHVwbGljYXRlLWNyZWF0ZSByYWNlcyBkb24ndCBsZWF2ZSBleHRyYVxuICAgICAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50cyBpbiB0aGUgbG9nLlxuICAgICAgY29uc3QgaXNTdGVwRXZlbnQgPVxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcgfHxcbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZyc7XG4gICAgICBpZiAoaXNTdGVwRXZlbnQgJiYgcnVuSWQgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIGNvbnN0IGxvY2tLZXkgPSB0YWdcbiAgICAgICAgICA/IGAke3J1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uJHt0YWd9YFxuICAgICAgICAgIDogYCR7cnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgIHJldHVybiB3aXRoU3RlcExvY2sobG9ja0tleSwgKCkgPT4gY3JlYXRlSW1wbCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVJbXBsKCk7XG5cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUltcGwoKTogUHJvbWlzZTxFdmVudFJlc3VsdD4ge1xuICAgICAgICBjb25zdCBldmVudElkID0gYGV2bnRfJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAgICAgICAvLyBGb3IgcnVuX2NyZWF0ZWQgZXZlbnRzLCB1c2UgY2xpZW50LXByb3ZpZGVkIHJ1bklkIG9yIGdlbmVyYXRlIG9uZSBzZXJ2ZXItc2lkZVxuICAgICAgICBsZXQgZWZmZWN0aXZlUnVuSWQ6IHN0cmluZztcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmICghcnVuSWQgfHwgcnVuSWQgPT09ICcnKSkge1xuICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkID0gYHdydW5fJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgfSBlbHNlIGlmICghcnVuSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3J1bklkIGlzIHJlcXVpcmVkIGZvciBub24tcnVuX2NyZWF0ZWQgZXZlbnRzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWZmZWN0aXZlUnVuSWQgPSBydW5JZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGNsaWVudC1wcm92aWRlZCBydW5JZCB0aW1lc3RhbXAgaXMgd2l0aGluIGFjY2VwdGFibGUgdGhyZXNob2xkXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyAmJiBydW5JZCAmJiBydW5JZCAhPT0gJycpIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0ZVVsaWRUaW1lc3RhbXAoXG4gICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICd3cnVuXydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IodmFsaWRhdGlvbkVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzcGVjVmVyc2lvbiBpcyBhbHdheXMgc2VudCBieSB0aGUgcnVudGltZSwgYnV0IHdlIHByb3ZpZGUgYSBmYWxsYmFjayBmb3Igc2FmZXR5XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVNwZWNWZXJzaW9uID0gZGF0YS5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVDtcblxuICAgICAgICAvLyBIZWxwZXIgdG8gY2hlY2sgaWYgcnVuIGlzIGluIHRlcm1pbmFsIHN0YXRlXG4gICAgICAgIGNvbnN0IGlzUnVuVGVybWluYWwgPSAoc3RhdHVzOiBzdHJpbmcpID0+XG4gICAgICAgICAgWydjb21wbGV0ZWQnLCAnZmFpbGVkJywgJ2NhbmNlbGxlZCddLmluY2x1ZGVzKHN0YXR1cyk7XG5cbiAgICAgICAgLy8gSGVscGVyIHRvIGNoZWNrIGlmIHN0ZXAgaXMgaW4gdGVybWluYWwgc3RhdGVcbiAgICAgICAgY29uc3QgaXNTdGVwVGVybWluYWwgPSAoc3RhdHVzOiBzdHJpbmcpID0+XG4gICAgICAgICAgWydjb21wbGV0ZWQnLCAnZmFpbGVkJywgJ2NhbmNlbGxlZCddLmluY2x1ZGVzKHN0YXR1cyk7XG5cbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgcnVuIHN0YXRlIGZvciB2YWxpZGF0aW9uIChpZiBub3QgY3JlYXRpbmcgYSBuZXcgcnVuKVxuICAgICAgICAvLyBTa2lwIHJ1biB2YWxpZGF0aW9uIGZvciBzdGVwX2NvbXBsZXRlZCBhbmQgc3RlcF9yZXRyeWluZyAtIHRoZXkgb25seSBvcGVyYXRlXG4gICAgICAgIC8vIG9uIHJ1bm5pbmcgc3RlcHMsIGFuZCBydW5uaW5nIHN0ZXBzIGFyZSBhbHdheXMgYWxsb3dlZCB0byBtb2RpZnkgcmVnYXJkbGVzc1xuICAgICAgICAvLyBvZiBydW4gc3RhdGUuIFRoaXMgb3B0aW1pemF0aW9uIHNhdmVzIGZpbGVzeXN0ZW0gcmVhZHMgcGVyIHN0ZXAgZXZlbnQuXG4gICAgICAgIGxldCBjdXJyZW50UnVuOiBXb3JrZmxvd1J1biB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCBza2lwUnVuVmFsaWRhdGlvbkV2ZW50cyA9IFsnc3RlcF9jb21wbGV0ZWQnLCAnc3RlcF9yZXRyeWluZyddO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgIT09ICdydW5fY3JlYXRlZCcgJiZcbiAgICAgICAgICAhc2tpcFJ1blZhbGlkYXRpb25FdmVudHMuaW5jbHVkZXMoZGF0YS5ldmVudFR5cGUpXG4gICAgICAgICkge1xuICAgICAgICAgIGN1cnJlbnRSdW4gPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAncnVucycsXG4gICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIFdvcmtmbG93UnVuU2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlc2lsaWVudCBzdGFydDogcnVuX3N0YXJ0ZWQgb24gbm9uLWV4aXN0ZW50IHJ1biB3aXRoIGV2ZW50RGF0YVxuICAgICAgICAgIC8vIGNyZWF0ZXMgdGhlIHJ1biBmaXJzdCwgc28gdGhlIHF1ZXVlIGNhbiBib290c3RyYXAgYSBydW4gdGhhdFxuICAgICAgICAgIC8vIGZhaWxlZCB0byBjcmVhdGUgZHVyaW5nIHN0YXJ0KCkuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcgJiZcbiAgICAgICAgICAgICFjdXJyZW50UnVuICYmXG4gICAgICAgICAgICAnZXZlbnREYXRhJyBpbiBkYXRhICYmXG4gICAgICAgICAgICBkYXRhLmV2ZW50RGF0YVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcnVuSW5wdXREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ/OiBzdHJpbmc7XG4gICAgICAgICAgICAgIHdvcmtmbG93TmFtZT86IHN0cmluZztcbiAgICAgICAgICAgICAgaW5wdXQ/OiBhbnk7XG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLmRlcGxveW1lbnRJZCAmJlxuICAgICAgICAgICAgICBydW5JbnB1dERhdGEud29ya2Zsb3dOYW1lICYmXG4gICAgICAgICAgICAgIHJ1bklucHV0RGF0YS5pbnB1dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gQXRvbWljYWxseSB0cnkgdG8gY3JlYXRlIHRoZSBydW4gZW50aXR5LiB3cml0ZUV4Y2x1c2l2ZVxuICAgICAgICAgICAgICAvLyB1c2VzIE9fQ1JFQVR8T19FWENMIHNvIG9ubHkgdGhlIGZpcnN0IHdyaXRlciB3aW5zLFxuICAgICAgICAgICAgICAvLyBwcmV2ZW50aW5nIGEgVE9DVE9VIHJhY2Ugd2hlcmUgYSBjb25jdXJyZW50IHJ1bl9jcmVhdGVkXG4gICAgICAgICAgICAgIC8vIGZyb20gc3RhcnQoKSBjb3VsZCBvdmVyd3JpdGUgYSBydW4gdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgICAgICAvLyB0cmFuc2l0aW9uZWQgdG8gJ3J1bm5pbmcnLlxuICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkUnVuOiBXb3JrZmxvd1J1biA9IHtcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dERhdGEuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXREYXRhLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuSW5wdXREYXRhLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0RGF0YS5pbnB1dCxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGNvbnN0IHJ1blBhdGggPSB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgZWZmZWN0aXZlUnVuSWQsIHRhZyk7XG4gICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgICAgICBydW5QYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNyZWF0ZWRSdW4sIGpzb25SZXBsYWNlcilcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoY3JlYXRlZCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGNyZWF0ZWQgdGhlIHJ1biDigJQgYWxzbyB3cml0ZSB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuXG4gICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50SWQgPSBgZXZudF8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ1bkNyZWF0ZWRFdmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICBldmVudElkOiBydW5DcmVhdGVkRXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXREYXRhLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dERhdGEud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXREYXRhLmlucHV0LFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dERhdGEuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7cnVuQ3JlYXRlZEV2ZW50SWR9YDtcbiAgICAgICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdldmVudHMnLCBjcmVhdGVkQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICAgICAgcnVuQ3JlYXRlZEV2ZW50XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gY3JlYXRlZFJ1bjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSdW4gYWxyZWFkeSBleGlzdHMgKGNvbmN1cnJlbnQgcnVuX2NyZWF0ZWQgd29uIHRoZVxuICAgICAgICAgICAgICAgIC8vIHJhY2UpLiBSZS1yZWFkIGl0IHNvIGRvd25zdHJlYW0gbG9naWMgc2VlcyB0aGUgcmVhbCBzdGF0ZS5cbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICBXb3JrZmxvd1J1blNjaGVtYSxcbiAgICAgICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBydW5fZmFpbGVkIG9uIGEgbm9uLWV4aXN0ZW50IHJ1biBpcyByZWplY3RlZCB0byBtYXRjaCB0aGVcbiAgICAgICAgLy8gcG9zdGdyZXMgYW5kIHZlcmNlbCB3b3JsZHMsIHdoaWNoIGJvdGggc3VyZmFjZSB0aGlzIGFzIGFcbiAgICAgICAgLy8gV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIHJhdGhlciB0aGFuIHNpbGVudGx5IHBlcnNpc3RpbmcgYW5cbiAgICAgICAgLy8gZXZlbnQgZm9yIGEgcnVuIHRoYXQgd2FzIG5ldmVyIGNyZWF0ZWQuXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnICYmICFjdXJyZW50UnVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcihlZmZlY3RpdmVSdW5JZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gVkVSU0lPTiBDT01QQVRJQklMSVRZOiBDaGVjayBydW4gc3BlYyB2ZXJzaW9uXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBGb3IgZXZlbnRzIHRoYXQgaGF2ZSBmZXRjaGVkIHRoZSBydW4sIGNoZWNrIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgLy8gU2tpcCBmb3IgcnVuX2NyZWF0ZWQgKG5vIGV4aXN0aW5nIHJ1bikgYW5kIHJ1bnRpbWUgZXZlbnRzIChzdGVwX2NvbXBsZXRlZCwgc3RlcF9yZXRyeWluZykuXG4gICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgcnVuIHJlcXVpcmVzIGEgbmV3ZXIgd29ybGQgdmVyc2lvblxuICAgICAgICAgIGlmIChyZXF1aXJlc05ld2VyV29ybGQoY3VycmVudFJ1bi5zcGVjVmVyc2lvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW5Ob3RTdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICAgICAgY3VycmVudFJ1bi5zcGVjVmVyc2lvbiEsXG4gICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9DVVJSRU5UXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJvdXRlIHRvIGxlZ2FjeSBoYW5kbGVyIGZvciBwcmUtZXZlbnQtc291cmNpbmcgcnVuc1xuICAgICAgICAgIGlmIChpc0xlZ2FjeVNwZWNWZXJzaW9uKGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlTGVnYWN5RXZlbnQoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBjdXJyZW50UnVuLFxuICAgICAgICAgICAgICBwYXJhbXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIFZBTElEQVRJT046IFRlcm1pbmFsIHN0YXRlIGFuZCBldmVudCBvcmRlcmluZyBjaGVja3NcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgICAgLy8gUnVuIHRlcm1pbmFsIHN0YXRlIHZhbGlkYXRpb25cbiAgICAgICAgaWYgKGN1cnJlbnRSdW4gJiYgaXNSdW5UZXJtaW5hbChjdXJyZW50UnVuLnN0YXR1cykpIHtcbiAgICAgICAgICBjb25zdCBydW5UZXJtaW5hbEV2ZW50cyA9IFtcbiAgICAgICAgICAgICdydW5fc3RhcnRlZCcsXG4gICAgICAgICAgICAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIC8vIElkZW1wb3RlbnQgb3BlcmF0aW9uOiBydW5fY2FuY2VsbGVkIG9uIGFscmVhZHkgY2FuY2VsbGVkIHJ1biBpcyBhbGxvd2VkXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJyAmJlxuICAgICAgICAgICAgY3VycmVudFJ1bi5zdGF0dXMgPT09ICdjYW5jZWxsZWQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gZXhpc3Rpbmcgc3RhdGUgKGlkZW1wb3RlbnQpXG4gICAgICAgICAgICBjb25zdCBldmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtldmVudElkfWA7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2V2ZW50cycsIGNvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgZXZlbnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlRGF0YSA9XG4gICAgICAgICAgICAgIHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZXZlbnQ6IHN0cmlwRXZlbnREYXRhUmVmcyhldmVudCwgcmVzb2x2ZURhdGEpLFxuICAgICAgICAgICAgICBydW46IGN1cnJlbnRSdW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZvciBydW5fc3RhcnRlZCBvbiB0ZXJtaW5hbCBydW5zLCB1c2UgUnVuRXhwaXJlZEVycm9yIHNvIHRoZVxuICAgICAgICAgIC8vIHJ1bnRpbWUga25vd3MgdG8gZXhpdCB3aXRob3V0IHJldHJ5aW5nLlxuICAgICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bkV4cGlyZWRFcnJvcihcbiAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7ZWZmZWN0aXZlUnVuSWR9XCIgaXMgYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE90aGVyIHJ1biBzdGF0ZSB0cmFuc2l0aW9ucyBhcmUgbm90IGFsbG93ZWQgb24gdGVybWluYWwgcnVuc1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJ1blRlcm1pbmFsRXZlbnRzLmluY2x1ZGVzKGRhdGEuZXZlbnRUeXBlKSB8fFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBDYW5ub3QgdHJhbnNpdGlvbiBydW4gZnJvbSB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENyZWF0aW5nIG5ldyBlbnRpdGllcyBvbiB0ZXJtaW5hbCBydW5zIGlzIG5vdCBhbGxvd2VkXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgfHxcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBDYW5ub3QgY3JlYXRlIG5ldyBlbnRpdGllcyBvbiBydW4gaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwLXJlbGF0ZWQgZXZlbnQgdmFsaWRhdGlvbiAob3JkZXJpbmcgYW5kIHRlcm1pbmFsIHN0YXRlKVxuICAgICAgICAvLyBTdG9yZSBleGlzdGluZ1N0ZXAgc28gd2UgY2FuIHJldXNlIGl0IGxhdGVyIChhdm9pZCBkb3VibGUgcmVhZClcbiAgICAgICAgbGV0IHZhbGlkYXRlZFN0ZXA6IFN0ZXAgfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3Qgc3RlcEV2ZW50cyA9IFtcbiAgICAgICAgICAnc3RlcF9zdGFydGVkJyxcbiAgICAgICAgICAnc3RlcF9jb21wbGV0ZWQnLFxuICAgICAgICAgICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgJ3N0ZXBfcmV0cnlpbmcnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoc3RlcEV2ZW50cy5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSkgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgIHZhbGlkYXRlZFN0ZXAgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgc3RlcENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIFN0ZXBTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gRXZlbnQgb3JkZXJpbmc6IHN0ZXAgbXVzdCBleGlzdCBiZWZvcmUgdGhlc2UgZXZlbnRzXG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICBgU3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU3RlcCB0ZXJtaW5hbCBzdGF0ZSB2YWxpZGF0aW9uXG4gICAgICAgICAgaWYgKGlzU3RlcFRlcm1pbmFsKHZhbGlkYXRlZFN0ZXAuc3RhdHVzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUgXCIke3ZhbGlkYXRlZFN0ZXAuc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBPbiB0ZXJtaW5hbCBydW5zOiBvbmx5IGFsbG93IGNvbXBsZXRpbmcvZmFpbGluZyBpbi1wcm9ncmVzcyBzdGVwc1xuICAgICAgICAgIGlmIChjdXJyZW50UnVuICYmIGlzUnVuVGVybWluYWwoY3VycmVudFJ1bi5zdGF0dXMpKSB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcC5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVuRXhwaXJlZEVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IG5vbi1ydW5uaW5nIHN0ZXAgb24gcnVuIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIb29rLXJlbGF0ZWQgZXZlbnQgdmFsaWRhdGlvbiAob3JkZXJpbmcpXG4gICAgICAgIGNvbnN0IGhvb2tFdmVudHNSZXF1aXJpbmdFeGlzdGVuY2UgPSBbJ2hvb2tfZGlzcG9zZWQnLCAnaG9va19yZWNlaXZlZCddO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaG9va0V2ZW50c1JlcXVpcmluZ0V4aXN0ZW5jZS5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSkgJiZcbiAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdIb29rID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIEhvb2tTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCFleGlzdGluZ0hvb2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcihkYXRhLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgIH07XG4gICAgICAgIC8vIFN0cmlwIGV2ZW50RGF0YSBmcm9tIHJ1bl9zdGFydGVkIOKAlCBpdCBiZWxvbmdzIG9uIHJ1bl9jcmVhdGVkIG9ubHkuXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJyAmJiAnZXZlbnREYXRhJyBpbiBldmVudCkge1xuICAgICAgICAgIGRlbGV0ZSAoZXZlbnQgYXMgYW55KS5ldmVudERhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmFjayBlbnRpdHkgY3JlYXRlZC91cGRhdGVkIGZvciBFdmVudFJlc3VsdFxuICAgICAgICBsZXQgcnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHN0ZXA6IFN0ZXAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBob29rOiBIb29rIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgd2FpdDogV2FpdCB8IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBDcmVhdGUvdXBkYXRlIGVudGl0eSBiYXNlZCBvbiBldmVudCB0eXBlIChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgICAgLy8gUnVuIGxpZmVjeWNsZSBldmVudHNcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICBjb25zdCBydW5EYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgZGVwbG95bWVudElkOiBzdHJpbmc7XG4gICAgICAgICAgICB3b3JrZmxvd05hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGlucHV0OiBTZXJpYWxpemVkRGF0YTtcbiAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIH07XG4gICAgICAgICAgcnVuID0ge1xuICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5EYXRhLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5EYXRhLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBzcGVjVmVyc2lvbiBmcm9tIHRoZSBldmVudCB0byB0aGUgcnVuIGVudGl0eVxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuRGF0YS5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgaW5wdXQ6IHJ1bkRhdGEuaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdGFydGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBVc2Ugd3JpdGVFeGNsdXNpdmUgKE9fQ1JFQVR8T19FWENMKSB0byBhdG9taWNhbGx5IGNyZWF0ZSB0aGVcbiAgICAgICAgICAvLyBydW4gZW50aXR5IGZpbGUuIFRoaXMgcHJldmVudHMgYSBUT0NUT1UgcmFjZSB3aXRoIHRoZSByZXNpbGllbnRcbiAgICAgICAgICAvLyBzdGFydCBwYXRoIChydW5fc3RhcnRlZCBvbiBub24tZXhpc3RlbnQgcnVuKSB0aGF0IGNvdWxkIHJlc3VsdFxuICAgICAgICAgIC8vIGluIGR1cGxpY2F0ZSBydW5fY3JlYXRlZCBldmVudHMgaW4gdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICBjb25zdCBydW5QYXRoID0gdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIHJ1blBhdGgsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShydW4sIGpzb25SZXBsYWNlciwgMilcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcpIHtcbiAgICAgICAgICAvLyBSZXVzZSBjdXJyZW50UnVuIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgICAvLyBJZiBhbHJlYWR5IHJ1bm5pbmcsIHJldHVybiB0aGUgcnVuIHdpdGhvdXQgaW5zZXJ0aW5nIGFcbiAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSBldmVudC4gIFRoaXMgbWFrZXMgcnVuX3N0YXJ0ZWQgaWRlbXBvdGVudCBmb3JcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMuICBXZSBvbWl0IHByZWxvYWRlZCBldmVudHMgaGVyZVxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGlzIGlzIGEgcmFyZSByYWNlLWNvbmRpdGlvbiBwYXRoIOKAlCB0aGUgcnVudGltZVxuICAgICAgICAgICAgLy8gZmFsbHMgYmFjayB0byBsb2FkV29ya2Zsb3dSdW5FdmVudHMoKS5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UnVuLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHJ1bjogY3VycmVudFJ1biB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydW4gPSBhd2FpdCB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBjdXJyZW50UnVuLnJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogY3VycmVudFJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjdXJyZW50UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogY3VycmVudFJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBjdXJyZW50UnVuLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGN1cnJlbnRSdW4uaW5wdXQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjdXJyZW50UnVuLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVkQXQ6IGN1cnJlbnRSdW4uZXhwaXJlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0ID8/IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBjdXJyZW50UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7IG91dHB1dD86IGFueSB9O1xuICAgICAgICAgIC8vIFJldXNlIGN1cnJlbnRSdW4gZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAgIHJ1biA9IGF3YWl0IHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGN1cnJlbnRSdW4ucnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBjdXJyZW50UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IGN1cnJlbnRSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBjdXJyZW50UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGN1cnJlbnRSdW4uZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogY3VycmVudFJ1bi5pbnB1dCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGN1cnJlbnRSdW4uY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogY3VycmVudFJ1bi5leHBpcmVkQXQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBjdXJyZW50UnVuLnN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogY29tcGxldGVkRGF0YS5vdXRwdXQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgY29uc3QgZmFpbGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgICAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIFNlcmlhbGl6ZWREYXRhIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAgICAgICAgICAgLy8gZGVoeWRyYXRlUnVuRXJyb3IuIFdlIHN0b3JlIGl0IHZlcmJhdGltIOKAlCBjb25zdW1lcnMgaHlkcmF0ZSBpdFxuICAgICAgICAgICAgLy8gdmlhIGh5ZHJhdGVSdW5FcnJvciB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZhaWxlZERhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgICBlcnJvckNvZGU6IGZhaWxlZERhdGEuZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogY3VycmVudFJ1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICBkZWxldGVBbGxIb29rc0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKSB7XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2NhbmNlbGxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gU3RlcCBsaWZlY3ljbGUgZXZlbnRzXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnICYmXG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZGF0YVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQ6IENyZWF0ZXMgc3RlcCBlbnRpdHkgd2l0aCBzdGF0dXMgJ3BlbmRpbmcnLCBhdHRlbXB0PTAsIGNyZWF0ZWRBdCBzZXQuXG4gICAgICAgICAgLy8gVHdvIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgd2l0aCBpZGVudGljYWwgY29ycmVsYXRpb25JZHMgKGUuZy4gdGhlXG4gICAgICAgICAgLy8gc25hcHNob3QgcnVudGltZSdzIGRldGVybWluaXN0aWMgY29ycmVsYXRpb25JZHMgYWNyb3NzIHJlcGxheXMpXG4gICAgICAgICAgLy8gbXVzdCBiZSBkZWR1cGVkIOKAlCBvdGhlcndpc2UgYm90aCB3cml0ZXMgc3VjY2VlZCBhbmQgdGhlIGV2ZW50IGxvZ1xuICAgICAgICAgIC8vIGVuZHMgdXAgd2l0aCBkdXBsaWNhdGUgc3RlcF9jcmVhdGVkIGVudHJpZXMuIFRoZSBvdXRlclxuICAgICAgICAgIC8vIHdpdGhTdGVwTG9jayBtdXRleCBzZXJpYWxpemVzIHdpdGhpbiBhIHNpbmdsZSBwcm9jZXNzOyB0aGlzXG4gICAgICAgICAgLy8gT19DUkVBVHxPX0VYQ0wgY29uc3RyYWludCBmaWxlIGFkZGl0aW9uYWxseSBwcm90ZWN0cyBhZ2FpbnN0XG4gICAgICAgICAgLy8gY3Jvc3MtcHJvY2VzcyByYWNlcyAodHdvIHBucG0gd29ya2VycywgcmVkZWxpdmVyZWQgcXVldWVcbiAgICAgICAgICAvLyBtZXNzYWdlcywgZXRjLikuIFRoZSBsb3NlciB0aHJvd3MgRW50aXR5Q29uZmxpY3RFcnJvciBzbyB0aGVcbiAgICAgICAgICAvLyBydW50aW1lJ3MgZXhpc3RpbmcgY2F0Y2ggcGF0aCBjYW4gc3dhbGxvdyBpdCBhbmQgYXZvaWRcbiAgICAgICAgICAvLyBkb3VibGUtcXVldWluZyB0aGUgc3RlcC5cbiAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZGA7XG4gICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgIHN0ZXBDcmVhdGVkTG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrUGF0aCxcbiAgICAgICAgICAgICcnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXN0ZXBDcmVhdGVkQ2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc3RlcERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBzdGVwTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgaW5wdXQ6IGFueTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBzdGVwSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwRGF0YS5zdGVwTmFtZSxcbiAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgaW5wdXQ6IHN0ZXBEYXRhLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXR0ZW1wdDogMCxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAvLyBQcm9wYWdhdGUgc3BlY1ZlcnNpb24gZnJvbSB0aGUgZXZlbnQgdG8gdGhlIHN0ZXAgZW50aXR5XG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgc3RlcFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgLy8gc3RlcF9zdGFydGVkOiBJbmNyZW1lbnRzIGF0dGVtcHQsIHNldHMgc3RhdHVzIHRvICdydW5uaW5nJ1xuICAgICAgICAgIC8vIFNldHMgc3RhcnRlZEF0IG9ubHkgb24gdGhlIGZpcnN0IHN0YXJ0IChub3QgdXBkYXRlZCBvbiByZXRyaWVzKVxuICAgICAgICAgIC8vIFJldXNlIHZhbGlkYXRlZFN0ZXAgZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHJldHJ5QWZ0ZXIgdGltZXN0YW1wIGhhc24ndCBiZWVuIHJlYWNoZWQgeWV0XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHZhbGlkYXRlZFN0ZXAucmV0cnlBZnRlciAmJlxuICAgICAgICAgICAgICB2YWxpZGF0ZWRTdGVwLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpID4gRGF0ZS5ub3coKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUb29FYXJseUVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3Qgc3RhcnQgc3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiOiByZXRyeUFmdGVyIHRpbWVzdGFtcCBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXRgLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IE1hdGguY2VpbChcbiAgICAgICAgICAgICAgICAgICAgKHZhbGlkYXRlZFN0ZXAucmV0cnlBZnRlci5nZXRUaW1lKCkgLSBEYXRlLm5vdygpKSAvIDEwMDBcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBndWFyZDogcmUtcmVhZCB0aGUgc3RlcCBlbnRpdHkgdG8gY2hlY2sgaWYgaXRcbiAgICAgICAgICAgIC8vIHJlYWNoZWQgdGVybWluYWwgc3RhdGUgYmV0d2VlbiB0aGUgdmFsaWRhdGlvbiByZWFkIGFuZCBub3cuXG4gICAgICAgICAgICAvLyBUaGlzIG5hcnJvd3MgdGhlIFRPQ1RPVSB3aW5kb3cgYnV0IGRvZXMgbm90IGZ1bGx5IGVsaW1pbmF0ZSBpdFxuICAgICAgICAgICAgLy8gKHRoZSBsb2NhbCB3b3JsZCBpcyBzaW5nbGUtcHJvY2VzcyAvIGRldi1vbmx5OyB0aGUgcG9zdGdyZXNcbiAgICAgICAgICAgIC8vIHdvcmxkIHVzZXMgU1FMLWxldmVsIGF0b21pYyBndWFyZHMgZm9yIHByb2R1Y3Rpb24pLlxuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgY29uc3QgZnJlc2hTdGVwID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIHN0ZXBDb21wb3NpdGVLZXksXG4gICAgICAgICAgICAgIFN0ZXBTY2hlbWEsXG4gICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChmcmVzaFN0ZXAgJiYgaXNTdGVwVGVybWluYWwoZnJlc2hTdGVwLnN0YXR1cykpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7ZnJlc2hTdGVwLnN0YXR1c31cImBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgICAgIC8vIE9ubHkgc2V0IHN0YXJ0ZWRBdCBvbiB0aGUgZmlyc3Qgc3RhcnRcbiAgICAgICAgICAgICAgc3RhcnRlZEF0OiB2YWxpZGF0ZWRTdGVwLnN0YXJ0ZWRBdCA/PyBub3csXG4gICAgICAgICAgICAgIC8vIEluY3JlbWVudCBhdHRlbXB0IGNvdW50ZXIgb24gZXZlcnkgc3RhcnRcbiAgICAgICAgICAgICAgYXR0ZW1wdDogdmFsaWRhdGVkU3RlcC5hdHRlbXB0ICsgMSxcbiAgICAgICAgICAgICAgLy8gQ2xlYXIgcmV0cnlBZnRlciBub3cgdGhhdCB0aGUgc3RlcCBoYXMgc3RhcnRlZFxuICAgICAgICAgICAgICByZXRyeUFmdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gc3RlcF9jb21wbGV0ZWQ6IFRlcm1pbmFsIHN0YXRlIHdpdGggb3V0cHV0XG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBjb21wbGV0aW5nIHRoZSBzYW1lIHN0ZXAgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCBjb21wbGV0ZWREYXRhID0gZGF0YS5ldmVudERhdGEgYXMgeyByZXN1bHQ6IGFueSB9O1xuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBjb25zdCBsb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgICA/IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsLiR7dGFnfWBcbiAgICAgICAgICAgICAgOiBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbGA7XG4gICAgICAgICAgICBjb25zdCB0ZXJtaW5hbExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICBsb2NrTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZSh0ZXJtaW5hbExvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgJ0Nhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgIG91dHB1dDogY29tcGxldGVkRGF0YS5yZXN1bHQsXG4gICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gc3RlcF9mYWlsZWQ6IFRlcm1pbmFsIHN0YXRlIHdpdGggZXJyb3JcbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGZhaWxpbmcgdGhlIHNhbWUgc3RlcCAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIGNvbnN0IGZhaWxlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBlcnJvcjogdW5rbm93bjtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBjb25zdCBsb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgICA/IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsLiR7dGFnfWBcbiAgICAgICAgICAgICAgOiBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbGA7XG4gICAgICAgICAgICBjb25zdCB0ZXJtaW5hbExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICBsb2NrTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZSh0ZXJtaW5hbExvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgJ0Nhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBlcnJvciBmaWVsZCBpcyBTZXJpYWxpemVkRGF0YSAoVWludDhBcnJheSkgcHJvZHVjZWQgYnlcbiAgICAgICAgICAgIC8vIGRlaHlkcmF0ZVN0ZXBFcnJvci4gV2Ugc3RvcmUgaXQgdmVyYmF0aW0g4oCUIGNvbnN1bWVycyBoeWRyYXRlIGl0XG4gICAgICAgICAgICAvLyB2aWEgaHlkcmF0ZVN0ZXBFcnJvciB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgZXJyb3I6IGZhaWxlZERhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIC8vIHN0ZXBfcmV0cnlpbmc6IFNldHMgc3RhdHVzIGJhY2sgdG8gJ3BlbmRpbmcnLCByZWNvcmRzIGVycm9yXG4gICAgICAgICAgLy8gUmV1c2UgdmFsaWRhdGVkU3RlcCBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBjb25zdCByZXRyeURhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBlcnJvcjogdW5rbm93bjtcbiAgICAgICAgICAgIHJldHJ5QWZ0ZXI/OiBEYXRlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICBlcnJvcjogcmV0cnlEYXRhLmVycm9yIGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IHJldHJ5RGF0YS5yZXRyeUFmdGVyLFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gSG9vayBsaWZlY3ljbGUgZXZlbnRzXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnICYmXG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZGF0YVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBob29rRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIHRva2VuOiBzdHJpbmc7XG4gICAgICAgICAgICBtZXRhZGF0YT86IGFueTtcbiAgICAgICAgICAgIGlzV2ViaG9vaz86IGJvb2xlYW47XG4gICAgICAgICAgICBpc1N5c3RlbT86IGJvb2xlYW47XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEF0b21pY2FsbHkgY2xhaW0gdGhlIHRva2VuIHVzaW5nIGFuIGV4Y2x1c2l2ZS1jcmVhdGUgY29uc3RyYWludCBmaWxlLlxuICAgICAgICAgIC8vIFRoaXMgYXZvaWRzIHRoZSBUT0NUT1UgcmFjZSBvZiB0aGUgcHJldmlvdXMgcmVhZC1hbGwtdGhlbi1jaGVjayBhcHByb2FjaC5cbiAgICAgICAgICBjb25zdCBjb25zdHJhaW50UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgJ3Rva2VucycsXG4gICAgICAgICAgICBgJHtoYXNoVG9rZW4oaG9va0RhdGEudG9rZW4pfS5qc29uYFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgdG9rZW5DbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICBjb25zdHJhaW50UGF0aCxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgdG9rZW46IGhvb2tEYXRhLnRva2VuLFxuICAgICAgICAgICAgICBob29rSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCF0b2tlbkNsYWltZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xhaW0gPSBhd2FpdCByZWFkSG9va1Rva2VuQ2xhaW0oY29uc3RyYWludFBhdGgpO1xuXG4gICAgICAgICAgICAvLyBDcmVhdGUgaG9va19jb25mbGljdCBldmVudCBpbnN0ZWFkIG9mIGhvb2tfY3JlYXRlZFxuICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHdvcmtmbG93IHRvIGNvbnRpbnVlIGFuZCBmYWlsIGdyYWNlZnVsbHkgd2hlbiB0aGUgaG9vayBpcyBhd2FpdGVkXG4gICAgICAgICAgICBjb25zdCBjb25mbGljdEV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19jb25mbGljdCcsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgdG9rZW46IGhvb2tEYXRhLnRva2VuLFxuICAgICAgICAgICAgICAgIC4uLihleGlzdGluZ0NsYWltXG4gICAgICAgICAgICAgICAgICA/IHsgY29uZmxpY3RpbmdSdW5JZDogZXhpc3RpbmdDbGFpbS5ydW5JZCB9XG4gICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGNvbmZsaWN0IGV2ZW50XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtldmVudElkfWA7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2V2ZW50cycsIGNvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgY29uZmxpY3RFdmVudFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPVxuICAgICAgICAgICAgICBwYXJhbXM/LnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnQgPSBzdHJpcEV2ZW50RGF0YVJlZnMoXG4gICAgICAgICAgICAgIGNvbmZsaWN0RXZlbnQsXG4gICAgICAgICAgICAgIHJlc29sdmVEYXRhXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBSZXR1cm4gRXZlbnRSZXN1bHQgd2l0aCBjb25mbGljdCBldmVudCAobm8gaG9vayBlbnRpdHkgY3JlYXRlZClcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGV2ZW50OiBmaWx0ZXJlZEV2ZW50LFxuICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIGhvb2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaG9vayA9IHtcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIGhvb2tJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgdG9rZW46IGhvb2tEYXRhLnRva2VuLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGhvb2tEYXRhLm1ldGFkYXRhLFxuICAgICAgICAgICAgb3duZXJJZDogJ2xvY2FsLW93bmVyJyxcbiAgICAgICAgICAgIHByb2plY3RJZDogJ2xvY2FsLXByb2plY3QnLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6ICdsb2NhbCcsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBzcGVjVmVyc2lvbiBmcm9tIHRoZSBldmVudCB0byB0aGUgaG9vayBlbnRpdHlcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGlzV2ViaG9vazogaG9va0RhdGEuaXNXZWJob29rID8/IGZhbHNlLFxuICAgICAgICAgICAgaXNTeXN0ZW06IGhvb2tEYXRhLmlzU3lzdGVtID8/IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnaG9va3MnLCBkYXRhLmNvcnJlbGF0aW9uSWQsIHRhZyksXG4gICAgICAgICAgICBob29rXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnKSB7XG4gICAgICAgICAgLy8gaG9va19kaXNwb3NlZDogRGVsZXRlcyBob29rIGVudGl0eSwgcmVqZWN0cyBkdXBsaWNhdGVzLlxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggZGlzcG9zaW5nIHRoZSBzYW1lIGhvb2sgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCBob29rTG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgID8gYCR7ZGF0YS5jb3JyZWxhdGlvbklkfS5kaXNwb3NlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke2RhdGEuY29ycmVsYXRpb25JZH0uZGlzcG9zZWRgO1xuICAgICAgICAgIGNvbnN0IGxvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgaG9va0xvY2tOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUobG9ja1BhdGgsICcnKTtcbiAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgSG9vayBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgZGlzcG9zZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBSZWFkIHRoZSBob29rIHRvIGdldCBpdHMgdG9rZW4gYmVmb3JlIGRlbGV0aW5nXG4gICAgICAgICAgY29uc3QgaG9va1BhdGggPSB0YWdnZWRQYXRoKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSG9vayA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBIb29rU2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgICAgICAgICAvLyBEZWxldGUgdGhlIHRva2VuIGNvbnN0cmFpbnQgZmlsZSB0byBmcmVlIHVwIHRoZSB0b2tlbiBmb3IgcmV1c2VcbiAgICAgICAgICAgIGNvbnN0IGRpc3Bvc2VkQ29uc3RyYWludFBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICAgICd0b2tlbnMnLFxuICAgICAgICAgICAgICBgJHtoYXNoVG9rZW4oZXhpc3RpbmdIb29rLnRva2VuKX0uanNvbmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKGRpc3Bvc2VkQ29uc3RyYWludFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKGhvb2tQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIC8vIHdhaXRfY3JlYXRlZDogQ3JlYXRlcyB3YWl0IGVudGl0eSB3aXRoIHN0YXR1cyAnd2FpdGluZycuXG4gICAgICAgICAgLy8gQXRvbWljIGNsYWltIG9uIGEgcGVyLShydW5JZCwgY29ycmVsYXRpb25JZCkgY29uc3RyYWludCBmaWxlXG4gICAgICAgICAgLy8gZW5zdXJlcyBkdXBsaWNhdGUgd2FpdF9jcmVhdGVkIGZyb20gY29uY3VycmVudCBpbnZvY2F0aW9uc1xuICAgICAgICAgIC8vIHN1cmZhY2VzIGFzIEVudGl0eUNvbmZsaWN0RXJyb3IgKHJlcGxhY2VzIGEgcHJpb3IgVE9DVE9VXG4gICAgICAgICAgLy8gcmVhZC10aGVuLWNoZWNrIHRoYXQgY291bGQgbGV0IGJvdGggd3JpdGVycyB0aHJvdWdoKS5cbiAgICAgICAgICBjb25zdCB3YWl0Q29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgY29uc3Qgd2FpdENyZWF0ZWRMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgPyBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jcmVhdGVkLiR7dGFnfWBcbiAgICAgICAgICAgIDogYCR7d2FpdENvbXBvc2l0ZUtleX0uY3JlYXRlZGA7XG4gICAgICAgICAgY29uc3Qgd2FpdENyZWF0ZWRMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ3dhaXRzJyxcbiAgICAgICAgICAgIHdhaXRDcmVhdGVkTG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHdhaXRDcmVhdGVkQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgd2FpdENyZWF0ZWRMb2NrUGF0aCxcbiAgICAgICAgICAgICcnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXdhaXRDcmVhdGVkQ2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXYWl0IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB3YWl0RGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIHJlc3VtZUF0PzogRGF0ZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHdhaXQgPSB7XG4gICAgICAgICAgICB3YWl0SWQ6IHdhaXRDb21wb3NpdGVLZXksXG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBzdGF0dXM6ICd3YWl0aW5nJyxcbiAgICAgICAgICAgIHJlc3VtZUF0OiB3YWl0RGF0YS5yZXN1bWVBdCxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnd2FpdHMnLCB3YWl0Q29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgd2FpdFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpIHtcbiAgICAgICAgICAvLyB3YWl0X2NvbXBsZXRlZDogVHJhbnNpdGlvbnMgd2FpdCB0byAnY29tcGxldGVkJywgcmVqZWN0cyBkdXBsaWNhdGVzLlxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggY29tcGxldGluZyB0aGUgc2FtZSB3YWl0IChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3Qgd2FpdENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgIGNvbnN0IHdhaXRMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgPyBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jb21wbGV0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jb21wbGV0ZWRgO1xuICAgICAgICAgIGNvbnN0IGxvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdExvY2tOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUobG9ja1BhdGgsICcnKTtcbiAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgV2FpdCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY29tcGxldGVkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdXYWl0ID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ3dhaXRzJyxcbiAgICAgICAgICAgIHdhaXRDb21wb3NpdGVLZXksXG4gICAgICAgICAgICBXYWl0U2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWV4aXN0aW5nV2FpdCkge1xuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGxvY2sgZmlsZSB3ZSBqdXN0IGNsYWltZWQg4oCUIHRoZSB3YWl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICAgIGF3YWl0IGZzLnVubGluayhsb2NrUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICAgICAgICAgICAgYFdhaXQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBub3QgZm91bmRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUaGUgbG9jayBmaWxlICh3cml0ZUV4Y2x1c2l2ZSBhYm92ZSkgYWxyZWFkeSBwcmV2ZW50cyBjb25jdXJyZW50XG4gICAgICAgICAgLy8gY29tcGxldGlvbnMg4oCUIG5vIGFkZGl0aW9uYWwgc3RhdHVzIGNoZWNrIG5lZWRlZC5cbiAgICAgICAgICB3YWl0ID0ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdXYWl0LFxuICAgICAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3dhaXRzJywgd2FpdENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgIHdhaXQsXG4gICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBob29rX3JlY2VpdmVkIGV2ZW50cyBhcmUgc3RvcmVkIGluIHRoZSBldmVudCBsb2cgYnV0IGRvbid0XG4gICAgICAgIC8vIG1vZGlmeSB0aGUgSG9vayBlbnRpdHkgKHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIHBheWxvYWQgZmllbGQpXG5cbiAgICAgICAgLy8gU3RvcmUgZXZlbnQgdXNpbmcgY29tcG9zaXRlIGtleSB7cnVuSWR9LXtldmVudElkfVxuICAgICAgICBjb25zdCBjb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtldmVudElkfWA7XG4gICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdldmVudHMnLCBjb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgZXZlbnRcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZEV2ZW50ID0gc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSk7XG5cbiAgICAgICAgLy8gRm9yIHJ1bl9zdGFydGVkOiBwcmVsb2FkIG9uZSBwYWdlIG9mIGV2ZW50cyBzbyB0aGUgcnVudGltZSBjYW4gc2tpcFxuICAgICAgICAvLyB0aGUgaW5pdGlhbCBldmVudHMubGlzdCBjYWxsIHdoZW4gaGFzTW9yZSBpcyBmYWxzZS5cbiAgICAgICAgbGV0IGV2ZW50czogRXZlbnRbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGhhc01vcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJyAmJiBydW4pIHtcbiAgICAgICAgICBjb25zdCBhbGxFdmVudHMgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICAgICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICAgICAgICAgIGZpbGVQcmVmaXg6IGAke2VmZmVjdGl2ZVJ1bklkfS1gLFxuICAgICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICAgICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICAgICAgICAgIGdldElkOiAoZSkgPT4gZS5ldmVudElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50cyA9IGFsbEV2ZW50cy5kYXRhO1xuICAgICAgICAgIGN1cnNvciA9IGFsbEV2ZW50cy5jdXJzb3I7XG4gICAgICAgICAgaGFzTW9yZSA9IGFsbEV2ZW50cy5oYXNNb3JlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIEV2ZW50UmVzdWx0IHdpdGggZXZlbnQgYW5kIGFueSBjcmVhdGVkL3VwZGF0ZWQgZW50aXR5XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXZlbnQ6IGZpbHRlcmVkRXZlbnQsXG4gICAgICAgICAgcnVuLFxuICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgaG9vayxcbiAgICAgICAgICB3YWl0LFxuICAgICAgICAgIGV2ZW50cyxcbiAgICAgICAgICBjdXJzb3IsXG4gICAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgfTtcbiAgICAgIH0gLy8gZW5kIGNyZWF0ZUltcGxcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0KHJ1bklkLCBldmVudElkLCBwYXJhbXMpIHtcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgncnVuSWQnLCBydW5JZCk7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2V2ZW50SWQnLCBldmVudElkKTtcbiAgICAgIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke3J1bklkfS0ke2V2ZW50SWR9YDtcbiAgICAgIGNvbnN0IGV2ZW50ID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgIGJhc2VkaXIsXG4gICAgICAgICdldmVudHMnLFxuICAgICAgICBjb21wb3NpdGVLZXksXG4gICAgICAgIEV2ZW50U2NoZW1hLFxuICAgICAgICB0YWdcbiAgICAgICk7XG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXZlbnQgJHtldmVudElkfSBpbiBydW4gJHtydW5JZH0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgcmV0dXJuIHN0cmlwRXZlbnREYXRhUmVmcyhldmVudCwgcmVzb2x2ZURhdGEpO1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0KHBhcmFtcykge1xuICAgICAgY29uc3QgeyBydW5JZCB9ID0gcGFyYW1zO1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zLnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgIGRpcmVjdG9yeTogcGF0aC5qb2luKGJhc2VkaXIsICdldmVudHMnKSxcbiAgICAgICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICAgICAgZmlsZVByZWZpeDogYCR7cnVuSWR9LWAsXG4gICAgICAgIC8vIEV2ZW50cyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIChvbGRlc3QgZmlyc3QpIGJ5IGRlZmF1bHQsXG4gICAgICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IGZvciBvdGhlciBsaXN0IGNhbGxzLlxuICAgICAgICBzb3J0T3JkZXI6IHBhcmFtcy5wYWdpbmF0aW9uPy5zb3J0T3JkZXIgPz8gJ2FzYycsXG4gICAgICAgIGxpbWl0OiBwYXJhbXMucGFnaW5hdGlvbj8ubGltaXQsXG4gICAgICAgIGN1cnNvcjogcGFyYW1zLnBhZ2luYXRpb24/LmN1cnNvcixcbiAgICAgICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICAgICAgZ2V0SWQ6IChldmVudCkgPT4gZXZlbnQuZXZlbnRJZCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiByZXNvbHZlRGF0YSBpcyBcIm5vbmVcIiwgcmVtb3ZlIGV2ZW50RGF0YSBmcm9tIGV2ZW50c1xuICAgICAgaWYgKHJlc29sdmVEYXRhID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGEubWFwKChldmVudCkgPT5cbiAgICAgICAgICAgIHN0cmlwRXZlbnREYXRhUmVmcyhldmVudCwgcmVzb2x2ZURhdGEpXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdEJ5Q29ycmVsYXRpb25JZChwYXJhbXMpIHtcbiAgICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSBwYXJhbXMuY29ycmVsYXRpb25JZDtcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnY29ycmVsYXRpb25JZCcsIGNvcnJlbGF0aW9uSWQpO1xuICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPSBwYXJhbXMucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICAvLyBObyBmaWxlUHJlZml4IC0gc2VhcmNoIGFsbCBldmVudHNcbiAgICAgICAgZmlsdGVyOiAoZXZlbnQpID0+IGV2ZW50LmNvcnJlbGF0aW9uSWQgPT09IGNvcnJlbGF0aW9uSWQsXG4gICAgICAgIC8vIEV2ZW50cyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIChvbGRlc3QgZmlyc3QpIGJ5IGRlZmF1bHQsXG4gICAgICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IGZvciBvdGhlciBsaXN0IGNhbGxzLlxuICAgICAgICBzb3J0T3JkZXI6IHBhcmFtcy5wYWdpbmF0aW9uPy5zb3J0T3JkZXIgPz8gJ2FzYycsXG4gICAgICAgIGxpbWl0OiBwYXJhbXMucGFnaW5hdGlvbj8ubGltaXQsXG4gICAgICAgIGN1cnNvcjogcGFyYW1zLnBhZ2luYXRpb24/LmN1cnNvcixcbiAgICAgICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICAgICAgZ2V0SWQ6IChldmVudCkgPT4gZXZlbnQuZXZlbnRJZCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiByZXNvbHZlRGF0YSBpcyBcIm5vbmVcIiwgcmVtb3ZlIGV2ZW50RGF0YSBmcm9tIGV2ZW50c1xuICAgICAgaWYgKHJlc29sdmVEYXRhID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGEubWFwKChldmVudCkgPT5cbiAgICAgICAgICAgIHN0cmlwRXZlbnREYXRhUmVmcyhldmVudCwgcmVzb2x2ZURhdGEpXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9O1xufVxuIl19
897
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9ldmVudHMtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBVzFCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLFVBQVUsRUFDVixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFlBQVksRUFDWixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixjQUFjLEVBQ2QsU0FBUyxHQUNWLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUs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QUFDLENBQUM7WUFFSCx5REFBeUQ7WUFDekQsSUFBSSxXQUFXLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzNCLE9BQU87b0JBQ0wsR0FBRyxNQUFNO29CQUNULElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzlCLGtCQUFrQixDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FDdkM7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgUnVuTm90U3VwcG9ydGVkRXJyb3IsXG4gIFRvb0Vhcmx5RXJyb3IsXG4gIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcixcbiAgV29ya2Zsb3dXb3JsZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHtcbiAgRXZlbnQsXG4gIEV2ZW50UmVzdWx0LFxuICBIb29rLFxuICBTZXJpYWxpemVkRGF0YSxcbiAgU3RlcCxcbiAgU3RvcmFnZSxcbiAgV2FpdCxcbiAgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBFdmVudFNjaGVtYSxcbiAgSG9va1NjaGVtYSxcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgcmVxdWlyZXNOZXdlcldvcmxkLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU3RlcFNjaGVtYSxcbiAgdmFsaWRhdGVVbGlkVGltZXN0YW1wLFxuICBXYWl0U2NoZW1hLFxuICBXb3JrZmxvd1J1blNjaGVtYSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OIH0gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCxcbiAgZGVsZXRlSlNPTixcbiAganNvblJlcGxhY2VyLFxuICBsaXN0SlNPTkZpbGVzLFxuICBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnksXG4gIHJlYWRKU09OLFxuICByZWFkSlNPTldpdGhGYWxsYmFjayxcbiAgcmVzb2x2ZVdpdGhpbkJhc2UsXG4gIHRhZ2dlZFBhdGgsXG4gIHdyaXRlRXhjbHVzaXZlLFxuICB3cml0ZUpTT04sXG59IGZyb20gJy4uL2ZzLmpzJztcbmltcG9ydCB7IHN0cmlwRXZlbnREYXRhUmVmcyB9IGZyb20gJy4vZmlsdGVycy5qcyc7XG5pbXBvcnQgeyBnZXRPYmplY3RDcmVhdGVkQXQsIGhhc2hUb2tlbiwgbW9ub3RvbmljVWxpZCB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBkZWxldGVBbGxIb29rc0ZvclJ1biB9IGZyb20gJy4vaG9va3Mtc3RvcmFnZS5qcyc7XG5pbXBvcnQgeyBoYW5kbGVMZWdhY3lFdmVudCB9IGZyb20gJy4vbGVnYWN5LmpzJztcbmltcG9ydCB7IHdpdGhSdW5GaWxlTG9jayB9IGZyb20gJy4vcnVucy1zdG9yYWdlLmpzJztcblxuLyoqXG4gKiBQZXItc3RlcCBpbi1wcm9jZXNzIGFzeW5jIG11dGV4LiBTZXJpYWxpemVzIGNvbmN1cnJlbnQgYGV2ZW50cy5jcmVhdGVgIGNhbGxzXG4gKiB0aGF0IHRhcmdldCB0aGUgc2FtZSBzdGVwLCBzbyB0aGF0IHRoZSBcImNoZWNrIHRlcm1pbmFsIHN0YXRlLCB0aGVuIHdyaXRlIHN0ZXBcbiAqIGVudGl0eSArIGV2ZW50XCIgc2VxdWVuY2UgaXMgYXRvbWljLiBXaXRob3V0IHRoaXMsIHR3byBjb25jdXJyZW50IHN0ZXBfc3RhcnRlZFxuICogY2FsbHMgY2FuIGJvdGggcGFzcyB0aGUgbm90LXRlcm1pbmFsIGNoZWNrIGFuZCBib3RoIHdyaXRlIHN0ZXBfc3RhcnRlZCBldmVudHNcbiAqIOKAlCBvciBhIHN0ZXBfc3RhcnRlZCBjYW4gbGFuZCBpbiB0aGUgbG9nIGFmdGVyIHN0ZXBfY29tcGxldGVkIGhhcyBhbHJlYWR5XG4gKiB3cml0dGVuLCBwcm9kdWNpbmcgdW5jb25zdW1lZCBldmVudHMgb24gcmVwbGF5LlxuICpcbiAqIER1cGxpY2F0ZSBzdGVwX3N0YXJ0ZWQgZXZlbnRzIGZvciBhIG5vbi10ZXJtaW5hbCBzdGVwIGFyZSBzdGlsbCBhbGxvd2VkXG4gKiAocmV0cmllcyBsZWdpdGltYXRlbHkgcmUtc3RhcnQgYSBzdGVwKSwgb25seSB3cml0ZXMgdG8gYW4gYWxyZWFkeS10ZXJtaW5hbFxuICogc3RlcCBhcmUgcmVqZWN0ZWQuXG4gKi9cbmNvbnN0IHN0ZXBMb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuXG5jb25zdCBIb29rVG9rZW5DbGFpbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgcnVuSWQ6IHouc3RyaW5nKCksXG59KTtcblxuYXN5bmMgZnVuY3Rpb24gcmVhZEhvb2tUb2tlbkNsYWltKFxuICBjb25zdHJhaW50UGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHouaW5mZXI8dHlwZW9mIEhvb2tUb2tlbkNsYWltU2NoZW1hPiB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVhZEpTT04oY29uc3RyYWludFBhdGgsIEhvb2tUb2tlbkNsYWltU2NoZW1hKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTeW50YXhFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIHouWm9kRXJyb3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiB3aXRoU3RlcExvY2s8VD4oa2V5OiBzdHJpbmcsIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHByZXYgPSBzdGVwTG9ja3MuZ2V0KGtleSk7XG4gIGNvbnN0IHRhc2tCb3g6IHsgdGFzaz86IFByb21pc2U8VD4gfSA9IHt9O1xuICBjb25zdCB0YXNrID0gKGFzeW5jICgpID0+IHtcbiAgICBpZiAocHJldikge1xuICAgICAgLy8gV2FpdCBmb3IgdGhlIHByZXZpb3VzIHRhc2sgdG8gc2V0dGxlOyBkb24ndCBpbmhlcml0IGl0cyBlcnJvcnMuXG4gICAgICBhd2FpdCBwcmV2LmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHN0ZXBMb2Nrcy5nZXQoa2V5KSA9PT0gdGFza0JveC50YXNrKSB7XG4gICAgICAgIHN0ZXBMb2Nrcy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pKCk7XG4gIHRhc2tCb3gudGFzayA9IHRhc2s7XG4gIHN0ZXBMb2Nrcy5zZXQoa2V5LCB0YXNrKTtcbiAgcmV0dXJuIHRhc2s7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhbGwgd2FpdHMgYXNzb2NpYXRlZCB3aXRoIGEgd29ya2Zsb3cgcnVuLlxuICogQ2FsbGVkIHdoZW4gYSBydW4gcmVhY2hlcyBhIHRlcm1pbmFsIHN0YXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVBbGxXYWl0c0ZvclJ1bihcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd2FpdHNEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgJ3dhaXRzJyk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgbGlzdEpTT05GaWxlcyh3YWl0c0Rpcik7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgLy8gZmlsZUlkcyBtYXkgY29udGFpbiB0YWcgc3VmZml4ZXMgKGUuZy4sIFwid3J1bl9BQkMtY29ycklkLnZpdGVzdC0wXCIpXG4gICAgLy8gYnV0IHN0YXJ0c1dpdGggc3RpbGwgbWF0Y2hlcyBjb3JyZWN0bHkgc2luY2UgdGhlIHRhZyBpcyBhIHN1ZmZpeC5cbiAgICBpZiAoZmlsZS5zdGFydHNXaXRoKGAke3J1bklkfS1gKSkge1xuICAgICAgY29uc3Qgd2FpdFBhdGggPSBwYXRoLmpvaW4od2FpdHNEaXIsIGAke2ZpbGV9Lmpzb25gKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUpTT04od2FpdFBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBlcnNpc3QgYSBsaWZlY3ljbGUtZHJpdmVuIHJ1biB1cGRhdGUgKHJ1bl9zdGFydGVkIC8gcnVuX2NvbXBsZXRlZCAvXG4gKiBydW5fZmFpbGVkIC8gcnVuX2NhbmNlbGxlZCkgdW5kZXIgdGhlIHNoYXJlZCBwZXItcnVuIGZpbGUgbG9jayxcbiAqIHJlLXJlYWRpbmcgdGhlIG9uLWRpc2sgcnVuIGluc2lkZSB0aGUgbG9jayBzbyBhbnkgYXR0cmlidXRlIHdyaXRlc1xuICogdGhhdCBsYW5kZWQgYmV0d2VlbiB0aGUgcHJlLXZhbGlkYXRpb24gYGN1cnJlbnRSdW5gIHJlYWQgYW5kIHRoaXNcbiAqIHdyaXRlIGFyZSBwcmVzZXJ2ZWQuIFdpdGhvdXQgdGhlIHJlLXJlYWQsIGFuIGBleHBlcmltZW50YWxTZXRBdHRyaWJ1dGVzYFxuICogY2FsbCBzYW5kd2ljaGVkIGJldHdlZW4gdGhlIGxpZmVjeWNsZSByZWFkIGFuZCB3cml0ZSB3b3VsZCBiZVxuICogc2lsZW50bHkgb3ZlcndyaXR0ZW4gYnkgdGhlIGxpZmVjeWNsZSB3cml0ZSdzIHN0YWxlIGF0dHJpYnV0ZSBzbmFwc2hvdC5cbiAqXG4gKiBgcHJvcG9zZWRgIGlzIHRoZSBmdWxseS1jb25zdHJ1Y3RlZCBydW4gcm93IHRoZSBjYWxsZXIgd2FudHMgdG9cbiAqIHdyaXRlICh3aXRoIHRoZSBjb3JyZWN0IGRpc2NyaW1pbmF0ZWQtdW5pb24gc3RhdHVzIGJyYW5jaCkuIE9ubHkgdGhlXG4gKiBgYXR0cmlidXRlc2AgZmllbGQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgZnJlc2hlc3QgdmVyc2lvbiBpbnNpZGUgdGhlXG4gKiBsb2NrLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jazxUIGV4dGVuZHMgV29ya2Zsb3dSdW4+KFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwcm9wb3NlZDogVFxuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiB3aXRoUnVuRmlsZUxvY2socnVuSWQsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmcmVzaCA9IGF3YWl0IHJlYWRKU09OKFxuICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIHJ1bklkLCB0YWcpLFxuICAgICAgV29ya2Zsb3dSdW5TY2hlbWFcbiAgICApO1xuICAgIGNvbnN0IG5leHQ6IFQgPSB7XG4gICAgICAuLi5wcm9wb3NlZCxcbiAgICAgIGF0dHJpYnV0ZXM6IGZyZXNoPy5hdHRyaWJ1dGVzID8/IHByb3Bvc2VkLmF0dHJpYnV0ZXMsXG4gICAgfTtcbiAgICBhd2FpdCB3cml0ZUpTT04odGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIHJ1bklkLCB0YWcpLCBuZXh0LCB7XG4gICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGV2ZW50cyBzdG9yYWdlIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBmaWxlc3lzdGVtLlxuICogSW1wbGVtZW50cyB0aGUgU3RvcmFnZVsnZXZlbnRzJ10gaW50ZXJmYWNlIHdpdGggY3JlYXRlLCBsaXN0LCBhbmQgbGlzdEJ5Q29ycmVsYXRpb25JZCBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRzU3RvcmFnZShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICB0YWc/OiBzdHJpbmdcbik6IFN0b3JhZ2VbJ2V2ZW50cyddIHtcbiAgcmV0dXJuIHtcbiAgICBhc3luYyBjcmVhdGUocnVuSWQsIGRhdGEsIHBhcmFtcyk6IFByb21pc2U8RXZlbnRSZXN1bHQ+IHtcbiAgICAgIC8vIFZhbGlkYXRlIHJlcXVlc3Qtc3VwcGxpZWQgSURzIGJlZm9yZSB0aGV5J3JlIGNvbmNhdGVuYXRlZCBpbnRvXG4gICAgICAvLyBmaWxlc3lzdGVtIHBhdGhzLiBUaGlzIGlzIHRoZSBwcmltYXJ5IGRlZmVuc2UgYWdhaW5zdCBwYXRoIHRyYXZlcnNhbFxuICAgICAgLy8gYXR0YWNrcyB3aGVyZSBhIGNsaWVudCBzdXBwbGllcyBydW5JZCAvIGNvcnJlbGF0aW9uSWQgdmFsdWVzIGxpa2VcbiAgICAgIC8vIFwiLi4vLi4vLi4vcGFja2FnZVwiIHRvIHJlYWQgb3Igd3JpdGUgZmlsZXMgb3V0c2lkZSB0aGUgc3RvcmFnZSByb290LlxuICAgICAgLy8gUnVuIGJlZm9yZSB0YWtpbmcgdGhlIHBlci1zdGVwIG11dGV4IHNvIG1hbGZvcm1lZCBpbnB1dHMgZmFpbCBmYXN0LlxuICAgICAgLy9cbiAgICAgIC8vIEVtcHR5IGBjb3JyZWxhdGlvbklkYCB2YWx1ZXMgYXJlIGFsc28gcmVqZWN0ZWQgaGVyZTogdGhlIGV2ZW50XG4gICAgICAvLyBzY2hlbWFzIG9ubHkgcmVxdWlyZSBgei5zdHJpbmcoKWAsIHNvIHdpdGhvdXQgdGhpcyBjaGVjayBhXG4gICAgICAvLyBzdGVwX2NyZWF0ZWQgLyBob29rX2NyZWF0ZWQgLyB3YWl0X2NyZWF0ZWQgcmVxdWVzdCB3aXRoXG4gICAgICAvLyBgY29ycmVsYXRpb25JZDogJydgIHdvdWxkIHNpbGVudGx5IGJlIHdyaXR0ZW4gdW5kZXIgYSBtYWxmb3JtZWRcbiAgICAgIC8vIGNvbXBvc2l0ZSBrZXkgbGlrZSBgJHtydW5JZH0tYC5cbiAgICAgIGlmIChydW5JZCAhPSBudWxsICYmIHJ1bklkICE9PSAnJykge1xuICAgICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgfVxuICAgICAgaWYgKCdjb3JyZWxhdGlvbklkJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLmNvcnJlbGF0aW9uSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnY29ycmVsYXRpb25JZCcsIGRhdGEuY29ycmVsYXRpb25JZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0ZXAgbGlmZWN5Y2xlIGV2ZW50cyBhcmUgc2VyaWFsaXplZCBwZXItc3RlcCB2aWEgYW4gaW4tcHJvY2VzcyBtdXRleFxuICAgICAgLy8gc28gdGhhdCB0aGUgXCJjaGVjayBzdGF0ZSwgdGhlbiB3cml0ZVwiIHNlcXVlbmNlIGluIHN0ZXBfc3RhcnRlZCAvXG4gICAgICAvLyBzdGVwX2NvbXBsZXRlZCAvIHN0ZXBfZmFpbGVkIC8gc3RlcF9yZXRyeWluZyBpcyBhdG9taWMuIHN0ZXBfY3JlYXRlZFxuICAgICAgLy8gaXMgYWxzbyBzZXJpYWxpemVkIHNvIGR1cGxpY2F0ZS1jcmVhdGUgcmFjZXMgZG9uJ3QgbGVhdmUgZXh0cmFcbiAgICAgIC8vIHN0ZXBfY3JlYXRlZCBldmVudHMgaW4gdGhlIGxvZy5cbiAgICAgIGNvbnN0IGlzU3RlcEV2ZW50ID1cbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJyB8fFxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJyB8fFxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnO1xuICAgICAgaWYgKGlzU3RlcEV2ZW50ICYmIHJ1bklkICYmIGRhdGEuY29ycmVsYXRpb25JZCkge1xuICAgICAgICBjb25zdCBsb2NrS2V5ID0gdGFnXG4gICAgICAgICAgPyBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LiR7dGFnfWBcbiAgICAgICAgICA6IGAke3J1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICByZXR1cm4gd2l0aFN0ZXBMb2NrKGxvY2tLZXksICgpID0+IGNyZWF0ZUltcGwoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlSW1wbCgpO1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGVJbXBsKCk6IFByb21pc2U8RXZlbnRSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgZXZlbnRJZCA9IGBldm50XyR7bW9ub3RvbmljVWxpZCgpfWA7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgLy8gRm9yIHJ1bl9jcmVhdGVkIGV2ZW50cywgdXNlIGNsaWVudC1wcm92aWRlZCBydW5JZCBvciBnZW5lcmF0ZSBvbmUgc2VydmVyLXNpZGVcbiAgICAgICAgbGV0IGVmZmVjdGl2ZVJ1bklkOiBzdHJpbmc7XG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyAmJiAoIXJ1bklkIHx8IHJ1bklkID09PSAnJykpIHtcbiAgICAgICAgICBlZmZlY3RpdmVSdW5JZCA9IGB3cnVuXyR7bW9ub3RvbmljVWxpZCgpfWA7XG4gICAgICAgIH0gZWxzZSBpZiAoIXJ1bklkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdydW5JZCBpcyByZXF1aXJlZCBmb3Igbm9uLXJ1bl9jcmVhdGVkIGV2ZW50cycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkID0gcnVuSWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBjbGllbnQtcHJvdmlkZWQgcnVuSWQgdGltZXN0YW1wIGlzIHdpdGhpbiBhY2NlcHRhYmxlIHRocmVzaG9sZFxuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgJiYgcnVuSWQgJiYgcnVuSWQgIT09ICcnKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdGVVbGlkVGltZXN0YW1wKFxuICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAnd3J1bl8nXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKHZhbGlkYXRpb25FcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3BlY1ZlcnNpb24gaXMgYWx3YXlzIHNlbnQgYnkgdGhlIHJ1bnRpbWUsIGJ1dCB3ZSBwcm92aWRlIGEgZmFsbGJhY2sgZm9yIHNhZmV0eVxuICAgICAgICBjb25zdCBlZmZlY3RpdmVTcGVjVmVyc2lvbiA9IGRhdGEuc3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0NVUlJFTlQ7XG5cbiAgICAgICAgLy8gSGVscGVyIHRvIGNoZWNrIGlmIHJ1biBpcyBpbiB0ZXJtaW5hbCBzdGF0ZVxuICAgICAgICBjb25zdCBpc1J1blRlcm1pbmFsID0gKHN0YXR1czogc3RyaW5nKSA9PlxuICAgICAgICAgIFsnY29tcGxldGVkJywgJ2ZhaWxlZCcsICdjYW5jZWxsZWQnXS5pbmNsdWRlcyhzdGF0dXMpO1xuXG4gICAgICAgIC8vIEhlbHBlciB0byBjaGVjayBpZiBzdGVwIGlzIGluIHRlcm1pbmFsIHN0YXRlXG4gICAgICAgIGNvbnN0IGlzU3RlcFRlcm1pbmFsID0gKHN0YXR1czogc3RyaW5nKSA9PlxuICAgICAgICAgIFsnY29tcGxldGVkJywgJ2ZhaWxlZCcsICdjYW5jZWxsZWQnXS5pbmNsdWRlcyhzdGF0dXMpO1xuXG4gICAgICAgIC8vIEdldCBjdXJyZW50IHJ1biBzdGF0ZSBmb3IgdmFsaWRhdGlvbiAoaWYgbm90IGNyZWF0aW5nIGEgbmV3IHJ1bilcbiAgICAgICAgLy8gU2tpcCBydW4gdmFsaWRhdGlvbiBmb3Igc3RlcF9jb21wbGV0ZWQgYW5kIHN0ZXBfcmV0cnlpbmcgLSB0aGV5IG9ubHkgb3BlcmF0ZVxuICAgICAgICAvLyBvbiBydW5uaW5nIHN0ZXBzLCBhbmQgcnVubmluZyBzdGVwcyBhcmUgYWx3YXlzIGFsbG93ZWQgdG8gbW9kaWZ5IHJlZ2FyZGxlc3NcbiAgICAgICAgLy8gb2YgcnVuIHN0YXRlLiBUaGlzIG9wdGltaXphdGlvbiBzYXZlcyBmaWxlc3lzdGVtIHJlYWRzIHBlciBzdGVwIGV2ZW50LlxuICAgICAgICBsZXQgY3VycmVudFJ1bjogV29ya2Zsb3dSdW4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3Qgc2tpcFJ1blZhbGlkYXRpb25FdmVudHMgPSBbJ3N0ZXBfY29tcGxldGVkJywgJ3N0ZXBfcmV0cnlpbmcnXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlICE9PSAncnVuX2NyZWF0ZWQnICYmXG4gICAgICAgICAgIXNraXBSdW5WYWxpZGF0aW9uRXZlbnRzLmluY2x1ZGVzKGRhdGEuZXZlbnRUeXBlKVxuICAgICAgICApIHtcbiAgICAgICAgICBjdXJyZW50UnVuID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBXb3JrZmxvd1J1blNjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBSZXNpbGllbnQgc3RhcnQ6IHJ1bl9zdGFydGVkIG9uIG5vbi1leGlzdGVudCBydW4gd2l0aCBldmVudERhdGFcbiAgICAgICAgICAvLyBjcmVhdGVzIHRoZSBydW4gZmlyc3QsIHNvIHRoZSBxdWV1ZSBjYW4gYm9vdHN0cmFwIGEgcnVuIHRoYXRcbiAgICAgICAgICAvLyBmYWlsZWQgdG8gY3JlYXRlIGR1cmluZyBzdGFydCgpLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmXG4gICAgICAgICAgICAhY3VycmVudFJ1biAmJlxuICAgICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZGF0YSAmJlxuICAgICAgICAgICAgZGF0YS5ldmVudERhdGFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bklucHV0RGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgICAgZGVwbG95bWVudElkPzogc3RyaW5nO1xuICAgICAgICAgICAgICB3b3JrZmxvd05hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgICAgIGlucHV0PzogYW55O1xuICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHJ1bklucHV0RGF0YS5kZXBsb3ltZW50SWQgJiZcbiAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLndvcmtmbG93TmFtZSAmJlxuICAgICAgICAgICAgICBydW5JbnB1dERhdGEuaW5wdXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIEF0b21pY2FsbHkgdHJ5IHRvIHB1Ymxpc2ggdGhlIHJ1biBlbnRpdHkgc28gb25seSB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgLy8gd3JpdGVyIHdpbnMsIHByZXZlbnRpbmcgYSBUT0NUT1UgcmFjZSB3aGVyZSBhIGNvbmN1cnJlbnRcbiAgICAgICAgICAgICAgLy8gcnVuX2NyZWF0ZWQgZnJvbSBzdGFydCgpIGNvdWxkIG92ZXJ3cml0ZSBhIHJ1biB0aGF0IHdhc1xuICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRyYW5zaXRpb25lZCB0byAncnVubmluZycuXG4gICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRSdW46IFdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bklucHV0RGF0YS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dERhdGEud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dERhdGEuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXREYXRhLmlucHV0LFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgY29uc3QgcnVuUGF0aCA9IHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBlZmZlY3RpdmVSdW5JZCwgdGFnKTtcbiAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgICAgIHJ1blBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY3JlYXRlZFJ1biwganNvblJlcGxhY2VyKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmIChjcmVhdGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY3JlYXRlZCB0aGUgcnVuIOKAlCBhbHNvIHdyaXRlIHRoZSBydW5fY3JlYXRlZCBldmVudC5cbiAgICAgICAgICAgICAgICBjb25zdCBydW5DcmVhdGVkRXZlbnRJZCA9IGBldm50XyR7bW9ub3RvbmljVWxpZCgpfWA7XG4gICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgIGV2ZW50SWQ6IHJ1bkNyZWF0ZWRFdmVudElkLFxuICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dERhdGEuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0RGF0YS53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBydW5JbnB1dERhdGEuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0RGF0YS5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtydW5DcmVhdGVkRXZlbnRJZH1gO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2V2ZW50cycsIGNyZWF0ZWRDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgICAgICBydW5DcmVhdGVkRXZlbnRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRSdW4gPSBjcmVhdGVkUnVuO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFJ1biBhbHJlYWR5IGV4aXN0cyAoY29uY3VycmVudCBydW5fY3JlYXRlZCB3b24gdGhlXG4gICAgICAgICAgICAgICAgLy8gcmFjZSkuIFJlLXJlYWQgaXQgc28gZG93bnN0cmVhbSBsb2dpYyBzZWVzIHRoZSByZWFsIHN0YXRlLlxuICAgICAgICAgICAgICAgIGN1cnJlbnRSdW4gPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAncnVucycsXG4gICAgICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgIFdvcmtmbG93UnVuU2NoZW1hLFxuICAgICAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJ1bl9mYWlsZWQgb24gYSBub24tZXhpc3RlbnQgcnVuIGlzIHJlamVjdGVkIHRvIG1hdGNoIHRoZVxuICAgICAgICAvLyBwb3N0Z3JlcyBhbmQgdmVyY2VsIHdvcmxkcywgd2hpY2ggYm90aCBzdXJmYWNlIHRoaXMgYXMgYVxuICAgICAgICAvLyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IgcmF0aGVyIHRoYW4gc2lsZW50bHkgcGVyc2lzdGluZyBhblxuICAgICAgICAvLyBldmVudCBmb3IgYSBydW4gdGhhdCB3YXMgbmV2ZXIgY3JlYXRlZC5cbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCcgJiYgIWN1cnJlbnRSdW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yKGVmZmVjdGl2ZVJ1bklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBWRVJTSU9OIENPTVBBVElCSUxJVFk6IENoZWNrIHJ1biBzcGVjIHZlcnNpb25cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIEZvciBldmVudHMgdGhhdCBoYXZlIGZldGNoZWQgdGhlIHJ1biwgY2hlY2sgdmVyc2lvbiBjb21wYXRpYmlsaXR5LlxuICAgICAgICAvLyBTa2lwIGZvciBydW5fY3JlYXRlZCAobm8gZXhpc3RpbmcgcnVuKSBhbmQgcnVudGltZSBldmVudHMgKHN0ZXBfY29tcGxldGVkLCBzdGVwX3JldHJ5aW5nKS5cbiAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiBydW4gcmVxdWlyZXMgYSBuZXdlciB3b3JsZCB2ZXJzaW9uXG4gICAgICAgICAgaWYgKHJlcXVpcmVzTmV3ZXJXb3JsZChjdXJyZW50UnVuLnNwZWNWZXJzaW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bk5vdFN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgICBjdXJyZW50UnVuLnNwZWNWZXJzaW9uISxcbiAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX0NVUlJFTlRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUm91dGUgdG8gbGVnYWN5IGhhbmRsZXIgZm9yIHByZS1ldmVudC1zb3VyY2luZyBydW5zXG4gICAgICAgICAgaWYgKGlzTGVnYWN5U3BlY1ZlcnNpb24oY3VycmVudFJ1bi5zcGVjVmVyc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVMZWdhY3lFdmVudChcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGN1cnJlbnRSdW4sXG4gICAgICAgICAgICAgIHBhcmFtc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gVkFMSURBVElPTjogVGVybWluYWwgc3RhdGUgYW5kIGV2ZW50IG9yZGVyaW5nIGNoZWNrc1xuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgICAvLyBSdW4gdGVybWluYWwgc3RhdGUgdmFsaWRhdGlvblxuICAgICAgICBpZiAoY3VycmVudFJ1biAmJiBpc1J1blRlcm1pbmFsKGN1cnJlbnRSdW4uc3RhdHVzKSkge1xuICAgICAgICAgIGNvbnN0IHJ1blRlcm1pbmFsRXZlbnRzID0gW1xuICAgICAgICAgICAgJ3J1bl9zdGFydGVkJyxcbiAgICAgICAgICAgICdydW5fY29tcGxldGVkJyxcbiAgICAgICAgICAgICdydW5fZmFpbGVkJyxcbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgLy8gSWRlbXBvdGVudCBvcGVyYXRpb246IHJ1bl9jYW5jZWxsZWQgb24gYWxyZWFkeSBjYW5jZWxsZWQgcnVuIGlzIGFsbG93ZWRcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnICYmXG4gICAgICAgICAgICBjdXJyZW50UnVuLnN0YXR1cyA9PT0gJ2NhbmNlbGxlZCdcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFJldHVybiBleGlzdGluZyBzdGF0ZSAoaWRlbXBvdGVudClcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2V2ZW50SWR9YDtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnZXZlbnRzJywgY29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBldmVudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVEYXRhID1cbiAgICAgICAgICAgICAgcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBldmVudDogc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSksXG4gICAgICAgICAgICAgIHJ1bjogY3VycmVudFJ1bixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRm9yIHJ1bl9zdGFydGVkIG9uIHRlcm1pbmFsIHJ1bnMsIHVzZSBSdW5FeHBpcmVkRXJyb3Igc28gdGhlXG4gICAgICAgICAgLy8gcnVudGltZSBrbm93cyB0byBleGl0IHdpdGhvdXQgcmV0cnlpbmcuXG4gICAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVuRXhwaXJlZEVycm9yKFxuICAgICAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHtlZmZlY3RpdmVSdW5JZH1cIiBpcyBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT3RoZXIgcnVuIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBub3QgYWxsb3dlZCBvbiB0ZXJtaW5hbCBydW5zXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcnVuVGVybWluYWxFdmVudHMuaW5jbHVkZXMoZGF0YS5ldmVudFR5cGUpIHx8XG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCB0cmFuc2l0aW9uIHJ1biBmcm9tIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ3JlYXRpbmcgbmV3IGVudGl0aWVzIG9uIHRlcm1pbmFsIHJ1bnMgaXMgbm90IGFsbG93ZWRcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcgfHxcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyB8fFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCBjcmVhdGUgbmV3IGVudGl0aWVzIG9uIHJ1biBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAtcmVsYXRlZCBldmVudCB2YWxpZGF0aW9uIChvcmRlcmluZyBhbmQgdGVybWluYWwgc3RhdGUpXG4gICAgICAgIC8vIFN0b3JlIGV4aXN0aW5nU3RlcCBzbyB3ZSBjYW4gcmV1c2UgaXQgbGF0ZXIgKGF2b2lkIGRvdWJsZSByZWFkKVxuICAgICAgICBsZXQgdmFsaWRhdGVkU3RlcDogU3RlcCB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCBzdGVwRXZlbnRzID0gW1xuICAgICAgICAgICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICAgICAgJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAnc3RlcF9yZXRyeWluZycsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChzdGVwRXZlbnRzLmluY2x1ZGVzKGRhdGEuZXZlbnRUeXBlKSAmJiBkYXRhLmNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgdmFsaWRhdGVkU3RlcCA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICBzdGVwQ29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgU3RlcFNjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBFdmVudCBvcmRlcmluZzogc3RlcCBtdXN0IGV4aXN0IGJlZm9yZSB0aGVzZSBldmVudHNcbiAgICAgICAgICBpZiAoIXZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IoXG4gICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgbm90IGZvdW5kYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdGVwIHRlcm1pbmFsIHN0YXRlIHZhbGlkYXRpb25cbiAgICAgICAgICBpZiAoaXNTdGVwVGVybWluYWwodmFsaWRhdGVkU3RlcC5zdGF0dXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7dmFsaWRhdGVkU3RlcC5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE9uIHRlcm1pbmFsIHJ1bnM6IG9ubHkgYWxsb3cgY29tcGxldGluZy9mYWlsaW5nIGluLXByb2dyZXNzIHN0ZXBzXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4gJiYgaXNSdW5UZXJtaW5hbChjdXJyZW50UnVuLnN0YXR1cykpIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBSdW5FeHBpcmVkRXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBtb2RpZnkgbm9uLXJ1bm5pbmcgc3RlcCBvbiBydW4gaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhvb2stcmVsYXRlZCBldmVudCB2YWxpZGF0aW9uIChvcmRlcmluZylcbiAgICAgICAgY29uc3QgaG9va0V2ZW50c1JlcXVpcmluZ0V4aXN0ZW5jZSA9IFsnaG9va19kaXNwb3NlZCcsICdob29rX3JlY2VpdmVkJ107XG4gICAgICAgIGlmIChcbiAgICAgICAgICBob29rRXZlbnRzUmVxdWlyaW5nRXhpc3RlbmNlLmluY2x1ZGVzKGRhdGEuZXZlbnRUeXBlKSAmJlxuICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0hvb2sgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgSG9va1NjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIWV4aXN0aW5nSG9vaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKGRhdGEuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICBldmVudElkLFxuICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgfTtcbiAgICAgICAgLy8gU3RyaXAgZXZlbnREYXRhIGZyb20gcnVuX3N0YXJ0ZWQg4oCUIGl0IGJlbG9uZ3Mgb24gcnVuX2NyZWF0ZWQgb25seS5cbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmICdldmVudERhdGEnIGluIGV2ZW50KSB7XG4gICAgICAgICAgZGVsZXRlIChldmVudCBhcyBhbnkpLmV2ZW50RGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIGVudGl0eSBjcmVhdGVkL3VwZGF0ZWQgZm9yIEV2ZW50UmVzdWx0XG4gICAgICAgIGxldCBydW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgc3RlcDogU3RlcCB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGhvb2s6IEhvb2sgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCB3YWl0OiBXYWl0IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIENyZWF0ZS91cGRhdGUgZW50aXR5IGJhc2VkIG9uIGV2ZW50IHR5cGUgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKVxuICAgICAgICAvLyBSdW4gbGlmZWN5Y2xlIGV2ZW50c1xuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnN0IHJ1bkRhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgaW5wdXQ6IFNlcmlhbGl6ZWREYXRhO1xuICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgfTtcbiAgICAgICAgICBydW4gPSB7XG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bkRhdGEuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bkRhdGEud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHNwZWNWZXJzaW9uIGZyb20gdGhlIGV2ZW50IHRvIHRoZSBydW4gZW50aXR5XG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5EYXRhLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICBpbnB1dDogcnVuRGF0YS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIEF0b21pY2FsbHkgcHVibGlzaCB0aGUgcnVuIGVudGl0eSBmaWxlIHdpdGhvdXQgb3ZlcndyaXRpbmcgYW5cbiAgICAgICAgICAvLyBleGlzdGluZyB3aW5uZXIuIFRoaXMgcHJldmVudHMgYSBUT0NUT1UgcmFjZSB3aXRoIHRoZSByZXNpbGllbnRcbiAgICAgICAgICAvLyBzdGFydCBwYXRoIChydW5fc3RhcnRlZCBvbiBub24tZXhpc3RlbnQgcnVuKSB0aGF0IGNvdWxkIHJlc3VsdCBpblxuICAgICAgICAgIC8vIGR1cGxpY2F0ZSBydW5fY3JlYXRlZCBldmVudHMgaW4gdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICBjb25zdCBydW5QYXRoID0gdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIHJ1blBhdGgsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShydW4sIGpzb25SZXBsYWNlciwgMilcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcpIHtcbiAgICAgICAgICAvLyBSZXVzZSBjdXJyZW50UnVuIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgICAvLyBJZiBhbHJlYWR5IHJ1bm5pbmcsIHJldHVybiB0aGUgcnVuIHdpdGhvdXQgaW5zZXJ0aW5nIGFcbiAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSBldmVudC4gIFRoaXMgbWFrZXMgcnVuX3N0YXJ0ZWQgaWRlbXBvdGVudCBmb3JcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMuICBXZSBvbWl0IHByZWxvYWRlZCBldmVudHMgaGVyZVxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGlzIGlzIGEgcmFyZSByYWNlLWNvbmRpdGlvbiBwYXRoIOKAlCB0aGUgcnVudGltZVxuICAgICAgICAgICAgLy8gZmFsbHMgYmFjayB0byBsb2FkV29ya2Zsb3dSdW5FdmVudHMoKS5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UnVuLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHJ1bjogY3VycmVudFJ1biB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydW4gPSBhd2FpdCB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBjdXJyZW50UnVuLnJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogY3VycmVudFJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjdXJyZW50UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogY3VycmVudFJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBjdXJyZW50UnVuLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGN1cnJlbnRSdW4uaW5wdXQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjdXJyZW50UnVuLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVkQXQ6IGN1cnJlbnRSdW4uZXhwaXJlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0ID8/IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBjdXJyZW50UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7IG91dHB1dD86IGFueSB9O1xuICAgICAgICAgIC8vIFJldXNlIGN1cnJlbnRSdW4gZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAgIHJ1biA9IGF3YWl0IHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGN1cnJlbnRSdW4ucnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBjdXJyZW50UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IGN1cnJlbnRSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBjdXJyZW50UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGN1cnJlbnRSdW4uZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogY3VycmVudFJ1bi5pbnB1dCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGN1cnJlbnRSdW4uY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogY3VycmVudFJ1bi5leHBpcmVkQXQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBjdXJyZW50UnVuLnN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogY29tcGxldGVkRGF0YS5vdXRwdXQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgY29uc3QgZmFpbGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgICAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIFNlcmlhbGl6ZWREYXRhIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAgICAgICAgICAgLy8gZGVoeWRyYXRlUnVuRXJyb3IuIFdlIHN0b3JlIGl0IHZlcmJhdGltIOKAlCBjb25zdW1lcnMgaHlkcmF0ZSBpdFxuICAgICAgICAgICAgLy8gdmlhIGh5ZHJhdGVSdW5FcnJvciB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZhaWxlZERhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgICBlcnJvckNvZGU6IGZhaWxlZERhdGEuZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogY3VycmVudFJ1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICBkZWxldGVBbGxIb29rc0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKSB7XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2NhbmNlbGxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gU3RlcCBsaWZlY3ljbGUgZXZlbnRzXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnICYmXG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZGF0YVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQ6IENyZWF0ZXMgc3RlcCBlbnRpdHkgd2l0aCBzdGF0dXMgJ3BlbmRpbmcnLCBhdHRlbXB0PTAsIGNyZWF0ZWRBdCBzZXQuXG4gICAgICAgICAgLy8gVHdvIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgd2l0aCBpZGVudGljYWwgY29ycmVsYXRpb25JZHMgKGUuZy4gdGhlXG4gICAgICAgICAgLy8gc25hcHNob3QgcnVudGltZSdzIGRldGVybWluaXN0aWMgY29ycmVsYXRpb25JZHMgYWNyb3NzIHJlcGxheXMpXG4gICAgICAgICAgLy8gbXVzdCBiZSBkZWR1cGVkIOKAlCBvdGhlcndpc2UgYm90aCB3cml0ZXMgc3VjY2VlZCBhbmQgdGhlIGV2ZW50IGxvZ1xuICAgICAgICAgIC8vIGVuZHMgdXAgd2l0aCBkdXBsaWNhdGUgc3RlcF9jcmVhdGVkIGVudHJpZXMuIFRoZSBvdXRlclxuICAgICAgICAgIC8vIHdpdGhTdGVwTG9jayBtdXRleCBzZXJpYWxpemVzIHdpdGhpbiBhIHNpbmdsZSBwcm9jZXNzOyB0aGlzXG4gICAgICAgICAgLy8gVGhlIGV4Y2x1c2l2ZSBjb25zdHJhaW50IGZpbGUgYWRkaXRpb25hbGx5IHByb3RlY3RzIGFnYWluc3RcbiAgICAgICAgICAvLyBjcm9zcy1wcm9jZXNzIHJhY2VzICh0d28gcG5wbSB3b3JrZXJzLCByZWRlbGl2ZXJlZCBxdWV1ZSBtZXNzYWdlcyxcbiAgICAgICAgICAvLyBldGMuKS4gVGhlIGxvc2VyIHRocm93cyBFbnRpdHlDb25mbGljdEVycm9yIHNvIHRoZSBydW50aW1lJ3NcbiAgICAgICAgICAvLyBleGlzdGluZyBjYXRjaCBwYXRoIGNhbiBzd2FsbG93IGl0IGFuZCBhdm9pZCBkb3VibGUtcXVldWluZyB0aGVcbiAgICAgICAgICAvLyBzdGVwLlxuICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkTG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgID8gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkLiR7dGFnfWBcbiAgICAgICAgICAgIDogYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkYDtcbiAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICBzdGVwQ3JlYXRlZExvY2tQYXRoLFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghc3RlcENyZWF0ZWRDbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFN0ZXAgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNyZWF0ZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzdGVwRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBpbnB1dDogYW55O1xuICAgICAgICAgIH07XG4gICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIHN0ZXBJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXBEYXRhLnN0ZXBOYW1lLFxuICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICBpbnB1dDogc3RlcERhdGEuaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhdHRlbXB0OiAwLFxuICAgICAgICAgICAgc3RhcnRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBzcGVjVmVyc2lvbiBmcm9tIHRoZSBldmVudCB0byB0aGUgc3RlcCBlbnRpdHlcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICBzdGVwXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcpIHtcbiAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQ6IEluY3JlbWVudHMgYXR0ZW1wdCwgc2V0cyBzdGF0dXMgdG8gJ3J1bm5pbmcnXG4gICAgICAgICAgLy8gU2V0cyBzdGFydGVkQXQgb25seSBvbiB0aGUgZmlyc3Qgc3RhcnQgKG5vdCB1cGRhdGVkIG9uIHJldHJpZXMpXG4gICAgICAgICAgLy8gUmV1c2UgdmFsaWRhdGVkU3RlcCBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcmV0cnlBZnRlciB0aW1lc3RhbXAgaGFzbid0IGJlZW4gcmVhY2hlZCB5ZXRcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdmFsaWRhdGVkU3RlcC5yZXRyeUFmdGVyICYmXG4gICAgICAgICAgICAgIHZhbGlkYXRlZFN0ZXAucmV0cnlBZnRlci5nZXRUaW1lKCkgPiBEYXRlLm5vdygpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb0Vhcmx5RXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBzdGFydCBzdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCI6IHJldHJ5QWZ0ZXIgdGltZXN0YW1wIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldGAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcmV0cnlBZnRlcjogTWF0aC5jZWlsKFxuICAgICAgICAgICAgICAgICAgICAodmFsaWRhdGVkU3RlcC5yZXRyeUFmdGVyLmdldFRpbWUoKSAtIERhdGUubm93KCkpIC8gMTAwMFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IGd1YXJkOiByZS1yZWFkIHRoZSBzdGVwIGVudGl0eSB0byBjaGVjayBpZiBpdFxuICAgICAgICAgICAgLy8gcmVhY2hlZCB0ZXJtaW5hbCBzdGF0ZSBiZXR3ZWVuIHRoZSB2YWxpZGF0aW9uIHJlYWQgYW5kIG5vdy5cbiAgICAgICAgICAgIC8vIFRoaXMgbmFycm93cyB0aGUgVE9DVE9VIHdpbmRvdyBidXQgZG9lcyBub3QgZnVsbHkgZWxpbWluYXRlIGl0XG4gICAgICAgICAgICAvLyAodGhlIGxvY2FsIHdvcmxkIGlzIHNpbmdsZS1wcm9jZXNzIC8gZGV2LW9ubHk7IHRoZSBwb3N0Z3Jlc1xuICAgICAgICAgICAgLy8gd29ybGQgdXNlcyBTUUwtbGV2ZWwgYXRvbWljIGd1YXJkcyBmb3IgcHJvZHVjdGlvbikuXG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBjb25zdCBmcmVzaFN0ZXAgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgc3RlcENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgICAgU3RlcFNjaGVtYSxcbiAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGZyZXNoU3RlcCAmJiBpc1N0ZXBUZXJtaW5hbChmcmVzaFN0ZXAuc3RhdHVzKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICBgQ2Fubm90IG1vZGlmeSBzdGVwIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtmcmVzaFN0ZXAuc3RhdHVzfVwiYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgLy8gT25seSBzZXQgc3RhcnRlZEF0IG9uIHRoZSBmaXJzdCBzdGFydFxuICAgICAgICAgICAgICBzdGFydGVkQXQ6IHZhbGlkYXRlZFN0ZXAuc3RhcnRlZEF0ID8/IG5vdyxcbiAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGF0dGVtcHQgY291bnRlciBvbiBldmVyeSBzdGFydFxuICAgICAgICAgICAgICBhdHRlbXB0OiB2YWxpZGF0ZWRTdGVwLmF0dGVtcHQgKyAxLFxuICAgICAgICAgICAgICAvLyBDbGVhciByZXRyeUFmdGVyIG5vdyB0aGF0IHRoZSBzdGVwIGhhcyBzdGFydGVkXG4gICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyBzdGVwX2NvbXBsZXRlZDogVGVybWluYWwgc3RhdGUgd2l0aCBvdXRwdXRcbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGNvbXBsZXRpbmcgdGhlIHNhbWUgc3RlcCAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7IHJlc3VsdDogYW55IH07XG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgID8gYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWwuJHt0YWd9YFxuICAgICAgICAgICAgICA6IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsYDtcbiAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIGxvY2tOYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKHRlcm1pbmFsTG9ja1BhdGgsICcnKTtcbiAgICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAnQ2Fubm90IG1vZGlmeSBzdGVwIGluIHRlcm1pbmFsIHN0YXRlJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgb3V0cHV0OiBjb21wbGV0ZWREYXRhLnJlc3VsdCxcbiAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyBzdGVwX2ZhaWxlZDogVGVybWluYWwgc3RhdGUgd2l0aCBlcnJvclxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggZmFpbGluZyB0aGUgc2FtZSBzdGVwIChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3QgZmFpbGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgID8gYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWwuJHt0YWd9YFxuICAgICAgICAgICAgICA6IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsYDtcbiAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIGxvY2tOYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKHRlcm1pbmFsTG9ja1BhdGgsICcnKTtcbiAgICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAnQ2Fubm90IG1vZGlmeSBzdGVwIGluIHRlcm1pbmFsIHN0YXRlJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIFNlcmlhbGl6ZWREYXRhIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAgICAgICAgICAgLy8gZGVoeWRyYXRlU3RlcEVycm9yLiBXZSBzdG9yZSBpdCB2ZXJiYXRpbSDigJQgY29uc3VtZXJzIGh5ZHJhdGUgaXRcbiAgICAgICAgICAgIC8vIHZpYSBoeWRyYXRlU3RlcEVycm9yIHRvIHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUuXG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICBlcnJvcjogZmFpbGVkRGF0YS5lcnJvciBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3JldHJ5aW5nJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gc3RlcF9yZXRyeWluZzogU2V0cyBzdGF0dXMgYmFjayB0byAncGVuZGluZycsIHJlY29yZHMgZXJyb3JcbiAgICAgICAgICAvLyBSZXVzZSB2YWxpZGF0ZWRTdGVwIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGNvbnN0IHJldHJ5RGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgICAgcmV0cnlBZnRlcj86IERhdGU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICAgIGVycm9yOiByZXRyeURhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgcmV0cnlBZnRlcjogcmV0cnlEYXRhLnJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAvLyBIb29rIGxpZmVjeWNsZSBldmVudHNcbiAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiZcbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBkYXRhXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGhvb2tEYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgdG9rZW46IHN0cmluZztcbiAgICAgICAgICAgIG1ldGFkYXRhPzogYW55O1xuICAgICAgICAgICAgaXNXZWJob29rPzogYm9vbGVhbjtcbiAgICAgICAgICAgIGlzU3lzdGVtPzogYm9vbGVhbjtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gQXRvbWljYWxseSBjbGFpbSB0aGUgdG9rZW4gdXNpbmcgYW4gZXhjbHVzaXZlLWNyZWF0ZSBjb25zdHJhaW50IGZpbGUuXG4gICAgICAgICAgLy8gVGhpcyBhdm9pZHMgdGhlIFRPQ1RPVSByYWNlIG9mIHRoZSBwcmV2aW91cyByZWFkLWFsbC10aGVuLWNoZWNrIGFwcHJvYWNoLlxuICAgICAgICAgIGNvbnN0IGNvbnN0cmFpbnRQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICAndG9rZW5zJyxcbiAgICAgICAgICAgIGAke2hhc2hUb2tlbihob29rRGF0YS50b2tlbil9Lmpzb25gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB0b2tlbkNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIGNvbnN0cmFpbnRQYXRoLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgIGhvb2tJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIXRva2VuQ2xhaW1lZCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdDbGFpbSA9IGF3YWl0IHJlYWRIb29rVG9rZW5DbGFpbShjb25zdHJhaW50UGF0aCk7XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBob29rX2NvbmZsaWN0IGV2ZW50IGluc3RlYWQgb2YgaG9va19jcmVhdGVkXG4gICAgICAgICAgICAvLyBUaGlzIGFsbG93cyB0aGUgd29ya2Zsb3cgdG8gY29udGludWUgYW5kIGZhaWwgZ3JhY2VmdWxseSB3aGVuIHRoZSBob29rIGlzIGF3YWl0ZWRcbiAgICAgICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdob29rX2NvbmZsaWN0JyxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgICAgLi4uKGV4aXN0aW5nQ2xhaW1cbiAgICAgICAgICAgICAgICAgID8geyBjb25mbGljdGluZ1J1bklkOiBleGlzdGluZ0NsYWltLnJ1bklkIH1cbiAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBTdG9yZSB0aGUgY29uZmxpY3QgZXZlbnRcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2V2ZW50SWR9YDtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnZXZlbnRzJywgY29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBjb25mbGljdEV2ZW50XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCByZXNvbHZlRGF0YSA9XG4gICAgICAgICAgICAgIHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRFdmVudCA9IHN0cmlwRXZlbnREYXRhUmVmcyhcbiAgICAgICAgICAgICAgY29uZmxpY3RFdmVudCxcbiAgICAgICAgICAgICAgcmVzb2x2ZURhdGFcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFJldHVybiBFdmVudFJlc3VsdCB3aXRoIGNvbmZsaWN0IGV2ZW50IChubyBob29rIGVudGl0eSBjcmVhdGVkKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZXZlbnQ6IGZpbHRlcmVkRXZlbnQsXG4gICAgICAgICAgICAgIHJ1bixcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgaG9vazogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBob29rID0ge1xuICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgaG9va0lkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICBtZXRhZGF0YTogaG9va0RhdGEubWV0YWRhdGEsXG4gICAgICAgICAgICBvd25lcklkOiAnbG9jYWwtb3duZXInLFxuICAgICAgICAgICAgcHJvamVjdElkOiAnbG9jYWwtcHJvamVjdCcsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogJ2xvY2FsJyxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHNwZWNWZXJzaW9uIGZyb20gdGhlIGV2ZW50IHRvIHRoZSBob29rIGVudGl0eVxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgaXNXZWJob29rOiBob29rRGF0YS5pc1dlYmhvb2sgPz8gZmFsc2UsXG4gICAgICAgICAgICBpc1N5c3RlbTogaG9va0RhdGEuaXNTeXN0ZW0gPz8gZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdob29rcycsIGRhdGEuY29ycmVsYXRpb25JZCwgdGFnKSxcbiAgICAgICAgICAgIGhvb2tcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCcpIHtcbiAgICAgICAgICAvLyBob29rX2Rpc3Bvc2VkOiBEZWxldGVzIGhvb2sgZW50aXR5LCByZWplY3RzIGR1cGxpY2F0ZXMuXG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBkaXNwb3NpbmcgdGhlIHNhbWUgaG9vayAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIGNvbnN0IGhvb2tMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgPyBgJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmRpc3Bvc2VkLiR7dGFnfWBcbiAgICAgICAgICAgIDogYCR7ZGF0YS5jb3JyZWxhdGlvbklkfS5kaXNwb3NlZGA7XG4gICAgICAgICAgY29uc3QgbG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICBob29rTG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShsb2NrUGF0aCwgJycpO1xuICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBIb29rIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBkaXNwb3NlZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJlYWQgdGhlIGhvb2sgdG8gZ2V0IGl0cyB0b2tlbiBiZWZvcmUgZGVsZXRpbmdcbiAgICAgICAgICBjb25zdCBob29rUGF0aCA9IHRhZ2dlZFBhdGgoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdIb29rID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIEhvb2tTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGlzdGluZ0hvb2spIHtcbiAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgdG9rZW4gY29uc3RyYWludCBmaWxlIHRvIGZyZWUgdXAgdGhlIHRva2VuIGZvciByZXVzZVxuICAgICAgICAgICAgY29uc3QgZGlzcG9zZWRDb25zdHJhaW50UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgICAgJ3Rva2VucycsXG4gICAgICAgICAgICAgIGAke2hhc2hUb2tlbihleGlzdGluZ0hvb2sudG9rZW4pfS5qc29uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oZGlzcG9zZWRDb25zdHJhaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oaG9va1BhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gd2FpdF9jcmVhdGVkOiBDcmVhdGVzIHdhaXQgZW50aXR5IHdpdGggc3RhdHVzICd3YWl0aW5nJy5cbiAgICAgICAgICAvLyBBdG9taWMgY2xhaW0gb24gYSBwZXItKHJ1bklkLCBjb3JyZWxhdGlvbklkKSBjb25zdHJhaW50IGZpbGVcbiAgICAgICAgICAvLyBlbnN1cmVzIGR1cGxpY2F0ZSB3YWl0X2NyZWF0ZWQgZnJvbSBjb25jdXJyZW50IGludm9jYXRpb25zXG4gICAgICAgICAgLy8gc3VyZmFjZXMgYXMgRW50aXR5Q29uZmxpY3RFcnJvciAocmVwbGFjZXMgYSBwcmlvciBUT0NUT1VcbiAgICAgICAgICAvLyByZWFkLXRoZW4tY2hlY2sgdGhhdCBjb3VsZCBsZXQgYm90aCB3cml0ZXJzIHRocm91Z2gpLlxuICAgICAgICAgIGNvbnN0IHdhaXRDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke3dhaXRDb21wb3NpdGVLZXl9LmNyZWF0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jcmVhdGVkYDtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdENyZWF0ZWRMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgd2FpdENyZWF0ZWRDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICB3YWl0Q3JlYXRlZExvY2tQYXRoLFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghd2FpdENyZWF0ZWRDbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFdhaXQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHdhaXREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgcmVzdW1lQXQ/OiBEYXRlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgd2FpdCA9IHtcbiAgICAgICAgICAgIHdhaXRJZDogd2FpdENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIHN0YXR1czogJ3dhaXRpbmcnLFxuICAgICAgICAgICAgcmVzdW1lQXQ6IHdhaXREYXRhLnJlc3VtZUF0LFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICd3YWl0cycsIHdhaXRDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICB3YWl0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJykge1xuICAgICAgICAgIC8vIHdhaXRfY29tcGxldGVkOiBUcmFuc2l0aW9ucyB3YWl0IHRvICdjb21wbGV0ZWQnLCByZWplY3RzIGR1cGxpY2F0ZXMuXG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBjb21wbGV0aW5nIHRoZSBzYW1lIHdhaXQgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCB3YWl0Q29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgY29uc3Qgd2FpdExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke3dhaXRDb21wb3NpdGVLZXl9LmNvbXBsZXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke3dhaXRDb21wb3NpdGVLZXl9LmNvbXBsZXRlZGA7XG4gICAgICAgICAgY29uc3QgbG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgICB3YWl0TG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShsb2NrUGF0aCwgJycpO1xuICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXYWl0IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjb21wbGV0ZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBleGlzdGluZ1dhaXQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIFdhaXRTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghZXhpc3RpbmdXYWl0KSB7XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgbG9jayBmaWxlIHdlIGp1c3QgY2xhaW1lZCDigJQgdGhlIHdhaXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2tQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICBgV2FpdCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRoZSBsb2NrIGZpbGUgKHdyaXRlRXhjbHVzaXZlIGFib3ZlKSBhbHJlYWR5IHByZXZlbnRzIGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBjb21wbGV0aW9ucyDigJQgbm8gYWRkaXRpb25hbCBzdGF0dXMgY2hlY2sgbmVlZGVkLlxuICAgICAgICAgIHdhaXQgPSB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ1dhaXQsXG4gICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnd2FpdHMnLCB3YWl0Q29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgd2FpdCxcbiAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IGhvb2tfcmVjZWl2ZWQgZXZlbnRzIGFyZSBzdG9yZWQgaW4gdGhlIGV2ZW50IGxvZyBidXQgZG9uJ3RcbiAgICAgICAgLy8gbW9kaWZ5IHRoZSBIb29rIGVudGl0eSAod2hpY2ggZG9lc24ndCBoYXZlIGEgcGF5bG9hZCBmaWVsZClcblxuICAgICAgICAvLyBTdG9yZSBldmVudCB1c2luZyBjb21wb3NpdGUga2V5IHtydW5JZH0te2V2ZW50SWR9XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2V2ZW50SWR9YDtcbiAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2V2ZW50cycsIGNvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICBldmVudFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnQgPSBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKTtcblxuICAgICAgICAvLyBGb3IgcnVuX3N0YXJ0ZWQ6IHByZWxvYWQgb25lIHBhZ2Ugb2YgZXZlbnRzIHNvIHRoZSBydW50aW1lIGNhbiBza2lwXG4gICAgICAgIC8vIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0IGNhbGwgd2hlbiBoYXNNb3JlIGlzIGZhbHNlLlxuICAgICAgICBsZXQgZXZlbnRzOiBFdmVudFtdIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaGFzTW9yZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmIHJ1bikge1xuICAgICAgICAgIGNvbnN0IGFsbEV2ZW50cyA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICAgICAgZmlsZVByZWZpeDogYCR7ZWZmZWN0aXZlUnVuSWR9LWAsXG4gICAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgICAgbGltaXQ6IDEwMDAsXG4gICAgICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICAgICAgZ2V0SWQ6IChlKSA9PiBlLmV2ZW50SWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnRzID0gYWxsRXZlbnRzLmRhdGE7XG4gICAgICAgICAgY3Vyc29yID0gYWxsRXZlbnRzLmN1cnNvcjtcbiAgICAgICAgICBoYXNNb3JlID0gYWxsRXZlbnRzLmhhc01vcmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gRXZlbnRSZXN1bHQgd2l0aCBldmVudCBhbmQgYW55IGNyZWF0ZWQvdXBkYXRlZCBlbnRpdHlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBldmVudDogZmlsdGVyZWRFdmVudCxcbiAgICAgICAgICBydW4sXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgICBob29rLFxuICAgICAgICAgIHdhaXQsXG4gICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlLFxuICAgICAgICB9O1xuICAgICAgfSAvLyBlbmQgY3JlYXRlSW1wbFxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQocnVuSWQsIGV2ZW50SWQsIHBhcmFtcykge1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnZXZlbnRJZCcsIGV2ZW50SWQpO1xuICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7cnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgYmFzZWRpcixcbiAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgIGNvbXBvc2l0ZUtleSxcbiAgICAgICAgRXZlbnRTY2hlbWEsXG4gICAgICAgIHRhZ1xuICAgICAgKTtcbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVudCAke2V2ZW50SWR9IGluIHJ1biAke3J1bklkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICByZXR1cm4gc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3QocGFyYW1zKSB7XG4gICAgICBjb25zdCB7IHJ1bklkIH0gPSBwYXJhbXM7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPSBwYXJhbXMucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICBmaWxlUHJlZml4OiBgJHtydW5JZH0tYCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0QnlDb3JyZWxhdGlvbklkKHBhcmFtcykge1xuICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHBhcmFtcy5jb3JyZWxhdGlvbklkO1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdjb3JyZWxhdGlvbklkJywgY29ycmVsYXRpb25JZCk7XG4gICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgIHNjaGVtYTogRXZlbnRTY2hlbWEsXG4gICAgICAgIC8vIE5vIGZpbGVQcmVmaXggLSBzZWFyY2ggYWxsIGV2ZW50c1xuICAgICAgICBmaWx0ZXI6IChldmVudCkgPT4gZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/world-local",
3
- "version": "5.0.0-beta.13",
3
+ "version": "5.0.0-beta.14",
4
4
  "description": "Local development World implementation for Workflow SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -23,7 +23,7 @@
23
23
  }
24
24
  },
25
25
  "dependencies": {
26
- "@vercel/queue": "0.2.1",
26
+ "@vercel/queue": "0.3.0",
27
27
  "async-sema": "3.1.1",
28
28
  "ulid": "~3.0.1",
29
29
  "undici": "7.26.0",