oci-cdk-test 0.0.9 → 0.0.11

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.
@@ -334,7 +334,7 @@ const query = 'search "' + scope + '" | sort by datetime desc | limit 50';
334
334
  const r = spawnSync('oci', ['logging-search', 'search-logs', '--search-query', query, '--time-start', timeStart, '--time-end', timeEnd], { stdio: 'inherit' });
335
335
  process.exit(r.status ?? 1);
336
336
  `;
337
- /** Ensure tail-function-logs.js exists in projectDir; remove legacy scripts and write fresh file. Returns path. */
337
+ /** Ensure tail-function-logs.js exists in projectDir; remove legacy scripts and write fresh file based on scripts/tail-function-log.js. Returns path. */
338
338
  function ensureTailFunctionLogsScript(projectDir) {
339
339
  const p = path.join(projectDir, 'tail-function-logs.js');
340
340
  const sh = path.join(projectDir, 'tail-function-logs.sh');
@@ -354,7 +354,17 @@ function ensureTailFunctionLogsScript(projectDir) {
354
354
  catch {
355
355
  // ignore cleanup errors
356
356
  }
357
- fs.writeFileSync(p, TAIL_FUNCTION_LOGS_SCRIPT, 'utf8');
357
+ try {
358
+ const templatePath = path.join(__dirname, '..', 'scripts', 'tail-function-log.js');
359
+ if (!fs.existsSync(templatePath)) {
360
+ throw new Error('missing scripts/tail-function-log.js in ocdk package');
361
+ }
362
+ const content = fs.readFileSync(templatePath, 'utf8');
363
+ fs.writeFileSync(p, content, 'utf8');
364
+ }
365
+ catch {
366
+ // If we cannot read the template for some reason, leave the script absent.
367
+ }
358
368
  return p;
359
369
  }
360
370
  /** Read tenancy and region from OCI CLI config. Default file: ~/.oci/config, default profile: DEFAULT. */
@@ -591,4 +601,4 @@ async function getOciConfig() {
591
601
  backend: backendConfig,
592
602
  };
593
603
  }
594
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbmZpZy9vY2ktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkVILGtDQUVDO0FBR0Qsd0NBS0M7QUFzWkQsb0NBd0ZDO0FBbmtCRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixtREFBcUM7QUFDckMsaUVBQW1EO0FBMENuRCxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQ2xEO0lBQ0UsTUFBTSxFQUFFO1FBQ047WUFDRSxJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUNuQyxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsVUFBVSxFQUFFLGdCQUFnQjtnQkFDNUIsb0JBQW9CLEVBQUUsRUFBRTthQUN6QjtTQUNGO0tBQ0Y7Q0FDRixFQUNELElBQUksRUFDSixDQUFDLENBQ0YsQ0FBQztBQUVGLHFJQUFxSTtBQUN4SCxRQUFBLG1CQUFtQixHQUEyQjtJQUN6RCxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLO0lBQzNGLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLO0lBQ3JGLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLO0lBQ3ZGLFlBQVksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixF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QUFDLFNBQVMsQ0FBQztJQUNoQixJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDdEIsNEJBQTRCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsT0FBTztRQUNMLGFBQWE7UUFDYixpQkFBaUIsRUFBRSxpQkFBaUIsSUFBSSxTQUFTO1FBQ2pELFNBQVM7UUFDVCxNQUFNO1FBQ04sU0FBUztRQUNULGVBQWUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLFVBQVUsQ0FBQyxlQUFlLElBQUksRUFBRTtRQUN0RixZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxVQUFVLENBQUMsWUFBWSxJQUFJLEVBQUU7UUFDNUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsSUFBSSxFQUFFLElBQUksU0FBUztRQUN2RSxpQkFBaUIsRUFBRSxpQkFBaUIsSUFBSSxTQUFTO1FBQ2pELFFBQVE7UUFDUixPQUFPLEVBQUUsT0FBTyxJQUFJLFNBQVM7UUFDN0IsaUJBQWlCO1FBQ2pCLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLElBQUksU0FBUztRQUNyRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsSUFBSSxTQUFTO1FBQy9DLHNCQUFzQixFQUFFLHNCQUFzQixJQUFJLFNBQVM7UUFDM0QsY0FBYztRQUNkLHVCQUF1QixFQUFFLHVCQUF1QixJQUFJLFNBQVM7UUFDN0QsT0FBTyxFQUFFLGFBQWE7S0FDdkIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9DSSBDb25maWd1cmF0aW9uXG4gKlxuICogU2V0IHRoZXNlIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgdXBkYXRlIGRlZmF1bHRzOlxuICogLSBPQ0lfQ09NUEFSVE1FTlRfSURcbiAqIC0gT0NJX1RFTkFOQ1lfSURcbiAqIC0gT0NJX1JFR0lPTlxuICogLSBPQ0lfTkFNRVNQQUNFIChpZiB1bnNldCwgb2J0YWluZWQgdmlhIE9DSSBTREsgZ2V0TmFtZXNwYWNlKVxuICogLSBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCAoZm9yIE9DSVI7IG11c3QgYmUgbm9uLXJvb3QgZm9yIGZ1bGwgc3RhY2spXG4gKiAtIE9DSV9GVU5DVElPTl9BUFBfTkFNRSAoRnVuY3Rpb25zIGFwcGxpY2F0aW9uIG5hbWU7IGRlZmF1bHQgZW1wdHkpXG4gKiAtIE9DSV9GVU5DVElPTl9OQU1FIChGdW5jdGlvbiBuYW1lOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fSEFORExFUiAoSmF2YSBGREsgQ01EIGhhbmRsZXIsIGUuZy4gY29tLmV4YW1wbGUuSGFuZGxlcjo6aGFuZGxlUmVxdWVzdDsgZnJvbSBmdW5jLnlhbWwgY21kL2hhbmRsZXIgaWYgdW5zZXQpXG4gKiAtIE9DSV9GVU5DVElPTl9KQVJfUEFUSCAoUGF0aCB0byBKQVIgb3IgcHJvamVjdCBkaXIgZm9yIGZ1bmN0aW9uIGltYWdlOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fTUVNT1JZX01CIChmdW5jdGlvbiBtZW1vcnkgaW4gTUI7IGZyb20gZnVuYy55YW1sIG1lbW9yeSBpZiB1bnNldClcbiAqIC0gT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUyAoZnVuY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzOyBmcm9tIGZ1bmMueWFtbCB0aW1lb3V0IGlmIHVuc2V0KVxuICogLSBPQ0lfRlVOQ1RJT05fQ09ORklHIChKU09OIG9iamVjdCBzdHJpbmcgZm9yIGZ1bmN0aW9uIGNvbmZpZy9lbnY7IG1lcmdlZCB3aXRoIGZ1bmMueWFtbCBjb25maWcpXG4gKiAtIE9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTiAocGF0aCB0byBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHNwZWMgSlNPTjsgZGVmYXVsdCBwcm9qZWN0IHJvb3Qgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uKVxuICogLSBPQ0RLX1BST0pFQ1RfRElSIChzZXQgYnkgb2NkayBDTEkgdG8gY2FsbGVyIGN3ZDsgdXNlZCB0byBkaXNjb3ZlciBmdW5jLnlhbWwgYW5kIHRhcmdldC8pXG4gKiAtIE9DSV9TVEFURV9CVUNLRVQgKGZvciByZW1vdGUgc3RhdGUpXG4gKiAtIE9DSV9TVEFURV9CQUNLRU5EX1RZUEUgKG9jaXxodHRwfGxvY2FsKVxuICpcbiAqIFdoZW4gT0NES19QUk9KRUNUX0RJUiBpcyBzZXQgKGUuZy4gcnVubmluZyBgbnB4IG9jZGsgZGVwbG95YCBmcm9tIGEgSmF2YSBwcm9qZWN0KSwgY29uZmlnXG4gKiBkaXNjb3ZlcnMgZWl0aGVyIHRhcmdldC8qLmphciBvciBwb20ueG1sK3NyYy8gKGFuZCBvcHRpb25hbGx5IGZ1bmMueWFtbCBuYW1lLCB2ZXJzaW9uLCBjbWQvaGFuZGxlcikuXG4gKiBObyBEb2NrZXJmaWxlIGlzIHJlcXVpcmVk4oCUdGhlIHN0YWNrIGdlbmVyYXRlcyBvbmUgaW4gbG9jYWwtZXhlYyAoZXhjbHVkaW5nIG5vZGVfbW9kdWxlcyB2aWEgLmRvY2tlcmlnbm9yZSksXG4gKiB0aGVuIGJ1aWxkcywgdGFncyAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiksIGFuZCBwdXNoZXMgdG8gT0NJUi5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgY29tbW9uIGZyb20gJ29jaS1jb21tb24nO1xuaW1wb3J0ICogYXMgb2JqZWN0c3RvcmFnZSBmcm9tICdvY2ktb2JqZWN0c3RvcmFnZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2NpQmFja2VuZENvbmZpZyB7XG4gIHR5cGU6ICdvY2knIHwgJ2h0dHAnIHwgJ2xvY2FsJztcbiAgYnVja2V0Pzogc3RyaW5nO1xuICBrZXk/OiBzdHJpbmc7XG4gIGFkZHJlc3M/OiBzdHJpbmc7XG4gIHVwZGF0ZU1ldGhvZD86IHN0cmluZztcbiAgbG9ja0FkZHJlc3M/OiBzdHJpbmc7XG4gIHVubG9ja0FkZHJlc3M/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2NpQ29uZmlnIHtcbiAgY29tcGFydG1lbnRJZDogc3RyaW5nO1xuICBvY2lyQ29tcGFydG1lbnRJZD86IHN0cmluZztcbiAgdGVuYW5jeUlkOiBzdHJpbmc7XG4gIHJlZ2lvbjogc3RyaW5nO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgZnVuY3Rpb25BcHBOYW1lOiBzdHJpbmc7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICAvKiogUGF0aCB0byBKQVIgb3IgRG9ja2VyZmlsZSBjb250ZXh0IGZvciBmdW5jdGlvbiBpbWFnZTsgZW1wdHkgPSBubyBidWlsZC9kZXBsb3kuICovXG4gIGZ1bmN0aW9uSmFyUGF0aD86IHN0cmluZztcbiAgLyoqIFBhdGggdG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGFyZ2V0LyAoZGlzY292ZXJlZDsgRG9ja2VyZmlsZSBpcyBnZW5lcmF0ZWQgaW4gbG9jYWwtZXhlYykuICovXG4gIGRvY2tlckNvbnRleHRQYXRoPzogc3RyaW5nO1xuICAvKiogSW1hZ2UgdGFnIGZvciBPQ0lSIChmcm9tIGZ1bmMueWFtbCB2ZXJzaW9uIG9yIE9DSV9JTUFHRV9UQUc7IGRlZmF1bHQgJ2xhdGVzdCcpLiAqL1xuICBpbWFnZVRhZz86IHN0cmluZztcbiAgLyoqIEphdmEgRkRLIENNRCBoYW5kbGVyIChmcm9tIGZ1bmMueWFtbCBjbWQvaGFuZGxlciBvciBPQ0lfRlVOQ1RJT05fSEFORExFUjsgZGVmYXVsdCBiZWxvdykuICovXG4gIGhhbmRsZXI/OiBzdHJpbmc7XG4gIC8qKiBXaGVuIHRydWUsIGRlcGxveSB1c2VzIGEgdGhpbiBEb2NrZXJmaWxlIChDT1BZIHRhcmdldC8qLmphciBvbmx5KTsgZnVsbCBNYXZlbiBidWlsZCBvbmx5IGluIHJlZGVwbG95OmZ1bmN0aW9uLiAqL1xuICB1c2VUaGluRG9ja2VyZmlsZT86IGJvb2xlYW47XG4gIG9jaXJSZXBvc2l0b3J5TmFtZT86IHN0cmluZztcbiAgLyoqIEZ1bmN0aW9uIG1lbW9yeSBpbiBNQiAoMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCwgMzA3MikuIEZyb20gZnVuYy55YW1sIG1lbW9yeSBvciBPQ0lfRlVOQ1RJT05fTUVNT1JZX01CLiAqL1xuICBmdW5jdGlvbk1lbW9yeU1iPzogc3RyaW5nO1xuICAvKiogRnVuY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzICgx4oCTMzAwKS4gRnJvbSBmdW5jLnlhbWwgdGltZW91dCBvciBPQ0lfRlVOQ1RJT05fVElNRU9VVF9TRUNPTkRTLiAqL1xuICBmdW5jdGlvblRpbWVvdXRTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogRnVuY3Rpb24gY29uZmlnL2VudiBrZXktdmFsdWUuIEZyb20gZnVuYy55YW1sIGNvbmZpZyBvciBPQ0lfRlVOQ1RJT05fQ09ORklHIChKU09OIG9iamVjdCBzdHJpbmcpLiAqL1xuICBmdW5jdGlvbkNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBQYXRoIHRvIEFQSSBHYXRld2F5IGRlcGxveW1lbnQgc3BlYyBKU09OIChyb3V0ZXMpLiBVc2UgT0NJX0FQSUdBVEVXQVlfREVQTE9ZTUVOVF9KU09OIG9yIGRlZmF1bHQgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uIGluIHByb2plY3Qgcm9vdC4gKi9cbiAgYXBpR3dEZXBsb3ltZW50SnNvblBhdGg/OiBzdHJpbmc7XG4gIGJhY2tlbmQ/OiBPY2lCYWNrZW5kQ29uZmlnO1xufVxuXG5jb25zdCBERUZBVUxUX0FQSUdXX0RFUExPWU1FTlRfSlNPTiA9IEpTT04uc3RyaW5naWZ5KFxuICB7XG4gICAgcm91dGVzOiBbXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICcve3BhdGgqfScsXG4gICAgICAgIG1ldGhvZHM6IFsnR0VUJywgJ1BPU1QnLCAnT1BUSU9OUyddLFxuICAgICAgICBiYWNrZW5kOiB7XG4gICAgICAgICAgdHlwZTogJ09SQUNMRV9GVU5DVElPTlNfQkFDS0VORCcsXG4gICAgICAgICAgZnVuY3Rpb25JZDogJyR7ZnVuY3Rpb25faWR9JyxcbiAgICAgICAgICByZWFkVGltZW91dEluU2Vjb25kczogMzAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gIG51bGwsXG4gIDJcbik7XG5cbi8qKiBPQ0lSIHNob3J0IHJlZ2lvbiBrZXlzIChlLmcuIGV1LWZyYW5rZnVydC0xIC0+IGZyYSkuIFVzZWQgc28gbG9naW4sIGJ1aWxkLCBwdXNoIGFuZCBmdW5jdGlvbiBpbWFnZSBhbGwgdXNlIHNhbWUgcmVnaXN0cnkgaG9zdC4gKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fVE9fT0NJUl9IT1NUOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnZXUtZnJhbmtmdXJ0LTEnOiAnZnJhJywgJ3VzLXBob2VuaXgtMSc6ICdwaHgnLCAndXMtYXNoYnVybi0xJzogJ2lhZCcsICd1ay1sb25kb24tMSc6ICdsaHInLFxuICAnYXAtdG9reW8tMSc6ICducnQnLCAnYXAtbXVtYmFpLTEnOiAnYm9tJywgJ2FwLXNlb3VsLTEnOiAnaWNuJywgJ2NhLXRvcm9udG8tMSc6ICd5eXonLFxuICAnc2Etc2FvcGF1bG8tMSc6ICdncnUnLCAnYXAtc3lkbmV5LTEnOiAnc3lkJywgJ2V1LXp1cmljaC0xJzogJ3pyaCcsICdtZS1kdWJhaS0xJzogJ2R4YicsXG4gICdhcC1vc2FrYS0xJzogJ2tpeCcsICdldS1hbXN0ZXJkYW0tMSc6ICdhbXMnLCAnYXAtc2luZ2Fwb3JlLTEnOiAnc2luJywgJ2FwLWh5ZGVyYWJhZC0xJzogJ2h5ZCcsXG4gICdldS1taWxhbi0xJzogJ214cCcsICdzYS1zYW50aWFnby0xJzogJ3NjbCcsICdhcC1tZWxib3VybmUtMSc6ICdtZWwnLCAnZXUtc3RvY2tob2xtLTEnOiAnYXJuJyxcbiAgJ21lLWplZGRhaC0xJzogJ2plZCcsICdhZi1qb2hhbm5lc2J1cmctMSc6ICdqbmInLCAnaWwtamVydXNhbGVtLTEnOiAndGx2JywgJ214LXF1ZXJldGFyby0xJzogJ3FybycsXG4gICdldS1tYXJzZWlsbGUtMSc6ICdtcnMnLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9jaXJIb3N0S2V5KHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFJFR0lPTl9UT19PQ0lSX0hPU1RbcmVnaW9uXSA/PyByZWdpb247XG59XG5cbi8qKiBGdWxsIE9DSVIgaW1hZ2UgVVJMIGZvciB0aGUgZnVuY3Rpb24gKHJlZ2lzdHJ5L25hbWVzcGFjZS9yZXBvOnRhZykuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2NpSW1hZ2VVcmwoY29uZmlnOiBPY2lDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCByZWdpc3RyeSA9IGAke29jaXJIb3N0S2V5KGNvbmZpZy5yZWdpb24pfS5vY2lyLmlvYDtcbiAgY29uc3QgcmVwbyA9IGNvbmZpZy5vY2lyUmVwb3NpdG9yeU5hbWUgfHwgY29uZmlnLmZ1bmN0aW9uTmFtZSB8fCAnb2NpLWZ1bmN0aW9uJztcbiAgY29uc3QgdGFnID0gY29uZmlnLmltYWdlVGFnIHx8ICdsYXRlc3QnO1xuICByZXR1cm4gYCR7cmVnaXN0cnl9LyR7Y29uZmlnLm5hbWVzcGFjZX0vJHtyZXBvfToke3RhZ31gO1xufVxuXG4vKipcbiAqIFRyeSB0byByZWFkIGZ1bmN0aW9uIG5hbWUgZnJvbSBmdW5jLnlhbWwgKE9DSSBGdW5jdGlvbnMgZm9ybWF0KS5cbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBcIm5hbWU6XCIgbGluZSwgdHJpbW1lZC5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxOYW1lKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccypuYW1lOlxccypbXCInXT8oW15cIidcXHNcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAobSkgcmV0dXJuIG1bMV0udHJpbSgpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBjbWQvaGFuZGxlciBmcm9tIGZ1bmMueWFtbCAoT0NJL0ZuIGZvcm1hdCkuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBcImNtZDpcIiBvciBcImhhbmRsZXI6XCIgbGluZSwgdHJpbW1lZDsgdXNlZCBhcyBEb2NrZXIgQ01EIGZvciBKYXZhIEZESy5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxIYW5kbGVyKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBjbWRNYXRjaCA9IGNvbnRlbnQubWF0Y2goL15cXHMqY21kOlxccypbXCInXT8oW15cIidcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAoY21kTWF0Y2gpIHJldHVybiBjbWRNYXRjaFsxXS50cmltKCk7XG4gICAgICBjb25zdCBoYW5kbGVyTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eXFxzKmhhbmRsZXI6XFxzKltcIiddPyhbXlwiJ1xcbl0rKVtcIiddPy9tKTtcbiAgICAgIGlmIChoYW5kbGVyTWF0Y2gpIHJldHVybiBoYW5kbGVyTWF0Y2hbMV0udHJpbSgpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCB2ZXJzaW9uIGZyb20gZnVuYy55YW1sICh1c2VkIGFzIE9DSVIgaW1hZ2UgdGFnKS5cbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBcInZlcnNpb246XCIgbGluZSwgdHJpbW1lZDsgc2FuaXRpemVkIGZvciBEb2NrZXIgdGFnIChhLXpBLVowLTlfLi0pLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbFZlcnNpb24ocHJvamVjdERpcjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnZnVuYy55YW1sJyk7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG0gPSBjb250ZW50Lm1hdGNoKC9eXFxzKnZlcnNpb246XFxzKltcIiddPyhbXlwiJ1xcc1xcbl0rKVtcIiddPy9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IG1bMV0udHJpbSgpO1xuICAgICAgICBjb25zdCBzYW5pdGl6ZWQgPSByYXcucmVwbGFjZSgvW15hLXpBLVowLTlfLi1dL2csICctJykucmVwbGFjZSgvLSsvZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG4gICAgICAgIHJldHVybiBzYW5pdGl6ZWQgfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuY29uc3QgVkFMSURfTUVNT1JZX01CID0gbmV3IFNldChbMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCwgMzA3Ml0pO1xuXG4vKipcbiAqIFRyeSB0byByZWFkIG1lbW9yeSAoTUIpIGZyb20gZnVuYy55YW1sLiBPQ0kgYWxsb3dzIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzIuXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgaWYgcHJlc2VudCBhbmQgdmFsaWQ7IG90aGVyd2lzZSB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sTWVtb3J5KHByb2plY3REaXI6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyptZW1vcnk6XFxzKihcXGQrKVxccyokL20pO1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KG1bMV0sIDEwKTtcbiAgICAgICAgaWYgKFZBTElEX01FTU9SWV9NQi5oYXMobikpIHJldHVybiBuO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCB0aW1lb3V0IChzZWNvbmRzKSBmcm9tIGZ1bmMueWFtbC4gT0NJIG1heCBpcyAzMDAuXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgaWYgcHJlc2VudCBhbmQgaW4gcmFuZ2UgMeKAkzMwMDsgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxUaW1lb3V0KHByb2plY3REaXI6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyp0aW1lb3V0OlxccyooXFxkKylcXHMqJC9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChtWzFdLCAxMCk7XG4gICAgICAgIGlmIChuID49IDEgJiYgbiA8PSAzMDApIHJldHVybiBuO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBjb25maWcgKGtleS12YWx1ZSBlbnYpIGZyb20gZnVuYy55YW1sLiBFeHBlY3RzIGEgdG9wLWxldmVsIFwiY29uZmlnOlwiIGJsb2NrIHdpdGgga2V5OiB2YWx1ZSBsaW5lcy5cbiAqIFJldHVybnMgYSByZWNvcmQgb2Ygc3RyaW5nIGtleXMgYW5kIHN0cmluZyB2YWx1ZXM7IGVtcHR5IGlmIG5vbmUgb3IgcGFyc2UgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sQ29uZmlnKHByb2plY3REaXI6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIGxldCBpbkNvbmZpZyA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbmZpZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWQgPT09ICdjb25maWc6JyB8fCAvXmNvbmZpZ1xccyo6XFxzKiQvLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgICAgaW5Db25maWcgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpbkNvbmZpZykge1xuICAgICAgICBpZiAodHJpbW1lZCAhPT0gJycgJiYgIWxpbmUuc3RhcnRzV2l0aCgnICcpICYmICFsaW5lLnN0YXJ0c1dpdGgoJ1xcdCcpKSBicmVhaztcbiAgICAgICAgY29uc3Qga3YgPSBsaW5lLm1hdGNoKC9eXFxzKyhbYS16QS1aX11bYS16QS1aMC05Xy1dKilcXHMqOlxccyooLiopJC8pO1xuICAgICAgICBpZiAoa3YpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBrdlsxXS50cmltKCk7XG4gICAgICAgICAgbGV0IHZhbCA9IGt2WzJdLnRyaW0oKTtcbiAgICAgICAgICBpZiAoKHZhbC5zdGFydHNXaXRoKCdcIicpICYmIHZhbC5lbmRzV2l0aCgnXCInKSkgfHwgKHZhbC5zdGFydHNXaXRoKFwiJ1wiKSAmJiB2YWwuZW5kc1dpdGgoXCInXCIpKSkge1xuICAgICAgICAgICAgdmFsID0gdmFsLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uZmlnW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykubGVuZ3RoID8gY29uZmlnIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBFbnN1cmUgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uIGV4aXN0cyBpbiBwcm9qZWN0RGlyOyB3cml0ZSBkZWZhdWx0IGlmIG1pc3NpbmcuIFJldHVybnMgcGF0aC4gKi9cbmZ1bmN0aW9uIGVuc3VyZURlZmF1bHRBcGlHd0RlcGxveW1lbnRKc29uKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ29jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHAsIERFRkFVTFRfQVBJR1dfREVQTE9ZTUVOVF9KU09OLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiBwO1xufVxuXG5jb25zdCBUQUlMX0ZVTkNUSU9OX0xPR1NfU0NSSVBUID0gYCMhL3Vzci9iaW4vZW52IG5vZGVcbi8qKlxuICogVGFpbCBPQ0kgRnVuY3Rpb25zIGV4ZWN1dGlvbiBsb2dzLiBHZW5lcmF0ZWQgYnkgT0NESy5cbiAqIFJ1biBmcm9tIHByb2plY3Qgcm9vdCBhZnRlciBkZXBsb3kuIFJlcXVpcmVzOiBPQ0kgQ0xJLCBPQ0lfQ09NUEFSVE1FTlRfSUQuXG4gKiBMb2cgSURzOiBmcm9tIC5vY2RrLW91dHB1dHMuanNvbiAoY3JlYXRlZCBvbiBkZXBsb3kpLCBvciBwYXNzIGZvciB0ZXN0aW5nOlxuICogICBPQ0lfTE9HX0dST1VQX0lEPW9jaWQxLi4uIE9DSV9FWEVDVVRJT05fTE9HX0lEPW9jaWQxLi4uIG5vZGUgdGFpbC1mdW5jdGlvbi1sb2dzLmpzXG4gKi9cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCB7IHNwYXduU3luYyB9ID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpO1xuXG5jb25zdCBkaXIgPSBwcm9jZXNzLmVudi5PQ0RLX1BST0pFQ1RfRElSIHx8IF9fZGlybmFtZTtcbmNvbnN0IG91dHB1dHNQYXRoID0gcGF0aC5qb2luKGRpciwgJy5vY2RrLW91dHB1dHMuanNvbicpO1xuY29uc3QgY29tcElkID0gcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEIHx8IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9PQ0lEO1xuaWYgKCFjb21wSWQpIHtcbiAgY29uc29sZS5lcnJvcignU2V0IE9DSV9DT01QQVJUTUVOVF9JRCAob3IgT0NJX0NPTVBBUlRNRU5UX09DSUQpLicpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5sZXQgbG9nR3JvdXBJZCA9IChwcm9jZXNzLmVudi5PQ0lfTE9HX0dST1VQX0lEIHx8ICcnKS50cmltKCk7XG5sZXQgZXhlY3V0aW9uTG9nSWQgPSAocHJvY2Vzcy5lbnYuT0NJX0VYRUNVVElPTl9MT0dfSUQgfHwgJycpLnRyaW0oKTtcbmlmICghbG9nR3JvdXBJZCB8fCAhZXhlY3V0aW9uTG9nSWQpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dHNQYXRoKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1J1biBkZXBsb3kgZmlyc3QgdG8gY3JlYXRlIC5vY2RrLW91dHB1dHMuanNvbiwgb3Igc2V0IE9DSV9MT0dfR1JPVVBfSUQgYW5kIE9DSV9FWEVDVVRJT05fTE9HX0lEIGZvciB0ZXN0aW5nLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBsZXQgb3V0O1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhvdXRwdXRzUGF0aCwgJ3V0ZjgnKS5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKS50cmltKCk7XG4gICAgY29uc3QgZmlyc3QgPSByYXcuaW5kZXhPZigneycpO1xuICAgIGNvbnN0IGxhc3QgPSByYXcubGFzdEluZGV4T2YoJ30nKTtcbiAgICBpZiAoZmlyc3QgPT09IC0xIHx8IGxhc3QgPD0gZmlyc3QpIHRocm93IG5ldyBFcnJvcignTm8gSlNPTicpO1xuICAgIG91dCA9IEpTT04ucGFyc2UocmF3LnNsaWNlKGZpcnN0LCBsYXN0ICsgMSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcignSW52YWxpZCBvciBtaXNzaW5nIC5vY2RrLW91dHB1dHMuanNvbi4gUnVuIGRlcGxveSBmaXJzdC4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgZnVuY3Rpb24gZmluZE91dHB1dHMob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICAgIGlmIChvYmoubG9nX2dyb3VwX2lkICE9IG51bGwgfHwgb2JqLmV4ZWN1dGlvbl9sb2dfaWQgIT0gbnVsbCB8fCBvYmoubG9nR3JvdXBJZCAhPSBudWxsIHx8IG9iai5leGVjdXRpb25Mb2dJZCAhPSBudWxsKSByZXR1cm4gb2JqO1xuICAgIGlmIChvYmoub3V0cHV0cyAmJiB0eXBlb2Ygb2JqLm91dHB1dHMgPT09ICdvYmplY3QnKSByZXR1cm4gZmluZE91dHB1dHMob2JqLm91dHB1dHMpIHx8IG9iai5vdXRwdXRzO1xuICAgIGZvciAoY29uc3QgdiBvZiBPYmplY3QudmFsdWVzKG9iaikpIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gZmluZE91dHB1dHModik7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZnVuY3Rpb24gdmFsKG8sIGspIHtcbiAgICBsZXQgdiA9IG9ba107XG4gICAgaWYgKHYgPT0gbnVsbCkgdiA9IG9bay5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgYykgPT4gYy50b1VwcGVyQ2FzZSgpKV07XG4gICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSByZXR1cm4gdi50cmltKCk7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9IG51bGwgJiYgJ3ZhbHVlJyBpbiB2KSByZXR1cm4gU3RyaW5nKHYudmFsdWUpLnRyaW0oKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRCeVN1YnN0cmluZyhvLCBzdWIpIHtcbiAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhvKS5maW5kKGZ1bmN0aW9uKGspIHsgcmV0dXJuIGsudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzdWIpOyB9KTtcbiAgICByZXR1cm4ga2V5ID8gdmFsKG8sIGtleSkgOiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgb3V0cHV0cyA9IGZpbmRPdXRwdXRzKG91dCkgfHwgb3V0O1xuICBsb2dHcm91cElkID0gdmFsKG91dHB1dHMsICdsb2dfZ3JvdXBfaWQnKSB8fCB2YWwob3V0cHV0cywgJ2xvZ0dyb3VwSWQnKSB8fCBmaW5kQnlTdWJzdHJpbmcob3V0cHV0cywgJ2xvZ19ncm91cCcpO1xuICBleGVjdXRpb25Mb2dJZCA9IHZhbChvdXRwdXRzLCAnZXhlY3V0aW9uX2xvZ19pZCcpIHx8IHZhbChvdXRwdXRzLCAnZXhlY3V0aW9uTG9nSWQnKSB8fCBmaW5kQnlTdWJzdHJpbmcob3V0cHV0cywgJ2V4ZWN1dGlvbl9sb2cnKTtcbiAgaWYgKCFsb2dHcm91cElkIHx8ICFleGVjdXRpb25Mb2dJZCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2xvZ19ncm91cF9pZCBvciBleGVjdXRpb25fbG9nX2lkIG1pc3NpbmcgaW4gLm9jZGstb3V0cHV0cy5qc29uJyk7XG4gICAgY29uc29sZS5lcnJvcignVG9wLWxldmVsIGtleXM6ICcgKyBPYmplY3Qua2V5cyhvdXQpLmpvaW4oJywgJykpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ091dHB1dHMga2V5czogJyArIE9iamVjdC5rZXlzKG91dHB1dHMpLmpvaW4oJywgJykpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1NhbXBsZTogJyArIEpTT04uc3RyaW5naWZ5KG91dCkuc2xpY2UoMCwgNDAwKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5jb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gMTAgKiA2MCAqIDEwMDApO1xuY29uc3QgdGltZVN0YXJ0ID0gc3RhcnQudG9JU09TdHJpbmcoKTtcbmNvbnN0IHRpbWVFbmQgPSBub3cudG9JU09TdHJpbmcoKTtcbmNvbnN0IHNjb3BlID0gY29tcElkICsgJy8nICsgbG9nR3JvdXBJZCArICcvJyArIGV4ZWN1dGlvbkxvZ0lkO1xuY29uc3QgcXVlcnkgPSAnc2VhcmNoIFwiJyArIHNjb3BlICsgJ1wiIHwgc29ydCBieSBkYXRldGltZSBkZXNjIHwgbGltaXQgNTAnO1xuY29uc3QgciA9IHNwYXduU3luYygnb2NpJywgWydsb2dnaW5nLXNlYXJjaCcsICdzZWFyY2gtbG9ncycsICctLXNlYXJjaC1xdWVyeScsIHF1ZXJ5LCAnLS10aW1lLXN0YXJ0JywgdGltZVN0YXJ0LCAnLS10aW1lLWVuZCcsIHRpbWVFbmRdLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG5wcm9jZXNzLmV4aXQoci5zdGF0dXMgPz8gMSk7XG5gO1xuXG4vKiogRW5zdXJlIHRhaWwtZnVuY3Rpb24tbG9ncy5qcyBleGlzdHMgaW4gcHJvamVjdERpcjsgcmVtb3ZlIGxlZ2FjeSBzY3JpcHRzIGFuZCB3cml0ZSBmcmVzaCBmaWxlLiBSZXR1cm5zIHBhdGguICovXG5mdW5jdGlvbiBlbnN1cmVUYWlsRnVuY3Rpb25Mb2dzU2NyaXB0KHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3RhaWwtZnVuY3Rpb24tbG9ncy5qcycpO1xuICBjb25zdCBzaCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAndGFpbC1mdW5jdGlvbi1sb2dzLnNoJyk7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoc2gpKSB7XG4gICAgICBmcy51bmxpbmtTeW5jKHNoKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZSBjbGVhbnVwIGVycm9yc1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmMocCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgfVxuICBmcy53cml0ZUZpbGVTeW5jKHAsIFRBSUxfRlVOQ1RJT05fTE9HU19TQ1JJUFQsICd1dGY4Jyk7XG4gIHJldHVybiBwO1xufVxuXG4vKiogUmVhZCB0ZW5hbmN5IGFuZCByZWdpb24gZnJvbSBPQ0kgQ0xJIGNvbmZpZy4gRGVmYXVsdCBmaWxlOiB+Ly5vY2kvY29uZmlnLCBkZWZhdWx0IHByb2ZpbGU6IERFRkFVTFQuICovXG5mdW5jdGlvbiByZWFkVGVuYW5jeUFuZFJlZ2lvbkZyb21DbGlDb25maWcoKTogeyB0ZW5hbmN5Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfSB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5PQ0lfQ09ORklHX0ZJTEUgfHwgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5vY2knLCAnY29uZmlnJyk7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5PQ0lfQ0xJX1BST0ZJTEUgfHwgJ0RFRkFVTFQnO1xuICB0cnkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkgcmV0dXJuIHt9O1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgbGV0IGluUHJvZmlsZSA9IGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdDogeyB0ZW5hbmN5Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnWycpICYmIHRyaW1tZWQuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICBpblByb2ZpbGUgPSB0cmltbWVkLnNsaWNlKDEsIC0xKSA9PT0gcHJvZmlsZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWluUHJvZmlsZSkgY29udGludWU7XG4gICAgICBjb25zdCBlcSA9IHRyaW1tZWQuaW5kZXhPZignPScpO1xuICAgICAgaWYgKGVxIDw9IDApIGNvbnRpbnVlO1xuICAgICAgY29uc3Qga2V5ID0gdHJpbW1lZC5zbGljZSgwLCBlcSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRyaW1tZWQuc2xpY2UoZXEgKyAxKS50cmltKCk7XG4gICAgICBpZiAoa2V5ID09PSAndGVuYW5jeScpIHJlc3VsdC50ZW5hbmN5ID0gdmFsdWU7XG4gICAgICBpZiAoa2V5ID09PSAncmVnaW9uJykgcmVzdWx0LnJlZ2lvbiA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqIEdldCBvYmplY3Qgc3RvcmFnZSBuYW1lc3BhY2UgdmlhIE9DSSBTREsgKHNhbWUgYXMgXCJvY2kgb3MgbnMgZ2V0XCIpLiBVc2VzIH4vLm9jaS9jb25maWcsIERFRkFVTFQgcHJvZmlsZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE5hbWVzcGFjZUZyb21PY2lTZGsoY29tcGFydG1lbnRJZDogc3RyaW5nLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5PQ0lfQ09ORklHX0ZJTEUgfHwgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5vY2knLCAnY29uZmlnJyk7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5PQ0lfQ0xJX1BST0ZJTEUgfHwgJ0RFRkFVTFQnO1xuICB0cnkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGNvbW1vbi5Db25maWdGaWxlQXV0aGVudGljYXRpb25EZXRhaWxzUHJvdmlkZXIoY29uZmlnUGF0aCwgcHJvZmlsZSk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IG9iamVjdHN0b3JhZ2UuT2JqZWN0U3RvcmFnZUNsaWVudCh7IGF1dGhlbnRpY2F0aW9uRGV0YWlsc1Byb3ZpZGVyOiBwcm92aWRlciB9KTtcbiAgICBjbGllbnQucmVnaW9uSWQgPSByZWdpb247XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0TmFtZXNwYWNlKHtcbiAgICAgIGNvbXBhcnRtZW50SWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnZhbHVlPy50cmltKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5kIGEgSkFSIHVuZGVyIHRhcmdldC8gKHByZWZlciBvbmUgbWF0Y2hpbmcgbmFtZSwgZWxzZSBmaXJzdCAuamFyKS5cbiAqL1xuZnVuY3Rpb24gZmluZEphckluVGFyZ2V0KHByb2plY3REaXI6IHN0cmluZywgZnVuY3Rpb25OYW1lPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGFyZ2V0RGlyID0gcGF0aC5qb2luKHByb2plY3REaXIsICd0YXJnZXQnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldERpcikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyh0YXJnZXREaXIpO1xuICAgIGNvbnN0IGphcnMgPSBmaWxlcy5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoJy5qYXInKSAmJiAhZi5lbmRzV2l0aCgnLXNvdXJjZXMuamFyJykpO1xuICAgIGlmIChqYXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoZnVuY3Rpb25OYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGphcnMuZmluZCgoaikgPT4gai50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZ1bmN0aW9uTmFtZS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICBpZiAobWF0Y2gpIHJldHVybiBwYXRoLmpvaW4odGFyZ2V0RGlyLCBtYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLmpvaW4odGFyZ2V0RGlyLCBqYXJzWzBdKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogVHJ1ZSBpZiBwcm9qZWN0IGhhcyBwb20ueG1sIGFuZCBzcmMvIChNYXZlbiBzb3VyY2UgbGF5b3V0IGZvciBidWlsZC1mcm9tLXNvdXJjZSBEb2NrZXJmaWxlKS4gKi9cbmZ1bmN0aW9uIGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcG9tID0gcGF0aC5qb2luKHByb2plY3REaXIsICdwb20ueG1sJyk7XG4gIGNvbnN0IHNyYyA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnc3JjJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocG9tKSAmJiBmcy5leGlzdHNTeW5jKHNyYykgJiYgZnMuc3RhdFN5bmMoc3JjKS5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzY292ZXJGcm9tRnVuY1lhbWxBbmRUYXJnZXQoKToge1xuICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZT86IHN0cmluZztcbiAgZG9ja2VyQ29udGV4dFBhdGg/OiBzdHJpbmc7XG4gIGltYWdlVGFnPzogc3RyaW5nO1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICB1c2VUaGluRG9ja2VyZmlsZT86IGJvb2xlYW47XG4gIG1lbW9yeU1iPzogbnVtYmVyO1xuICB0aW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn0ge1xuICBsZXQgcHJvamVjdERpciA9IHByb2Nlc3MuZW52Lk9DREtfUFJPSkVDVF9ESVI/LnRyaW0oKTtcbiAgaWYgKCFwcm9qZWN0RGlyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5vY2RrLXByb2plY3QtZGlyJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgcHJvamVjdERpciA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpLnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfVxuICBpZiAoIXByb2plY3REaXIgJiYgcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkpIHtcbiAgICBjb25zdCBwID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSC50cmltKCkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBwcm9qZWN0RGlyID0gZnMuc3RhdFN5bmMocCkuaXNEaXJlY3RvcnkoKSA/IHAgOiBwYXRoLmRpcm5hbWUocCk7XG4gIH1cbiAgaWYgKCFwcm9qZWN0RGlyKSBwcm9qZWN0RGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgcHJvamVjdERpciA9IHByb2plY3REaXIgPyBwYXRoLnJlc29sdmUocHJvamVjdERpcikgOiAnJztcbiAgaWYgKCFwcm9qZWN0RGlyIHx8ICFmcy5leGlzdHNTeW5jKHByb2plY3REaXIpKSByZXR1cm4ge307XG5cbiAgY29uc3QgbmFtZUZyb21ZYW1sID0gZ2V0RnVuY1lhbWxOYW1lKHByb2plY3REaXIpO1xuICBjb25zdCBqYXJQYXRoID0gZmluZEphckluVGFyZ2V0KHByb2plY3REaXIsIG5hbWVGcm9tWWFtbCB8fCB1bmRlZmluZWQpO1xuICBjb25zdCBoYXNTb3VyY2UgPSBoYXNQb21BbmRTcmMocHJvamVjdERpcik7XG4gIGlmICghamFyUGF0aCAmJiAhaGFzU291cmNlKSByZXR1cm4ge307XG5cbiAgY29uc3QgZnVuY3Rpb25OYW1lID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX05BTUU/LnRyaW0oKSB8fCBuYW1lRnJvbVlhbWwgfHwgcGF0aC5iYXNlbmFtZShwcm9qZWN0RGlyKSB8fCAnb2NpLWZ1bmN0aW9uJztcbiAgY29uc3QgaW1hZ2VUYWcgPSBwcm9jZXNzLmVudi5PQ0lfSU1BR0VfVEFHPy50cmltKCkgfHwgZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXIpO1xuICBjb25zdCBoYW5kbGVyID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0hBTkRMRVI/LnRyaW0oKSB8fCBnZXRGdW5jWWFtbEhhbmRsZXIocHJvamVjdERpcik7XG4gIGNvbnN0IHVzZVRoaW5Eb2NrZXJmaWxlID0gISFqYXJQYXRoO1xuICBjb25zdCBtZW1vcnlNYiA9IGdldEZ1bmNZYW1sTWVtb3J5KHByb2plY3REaXIpO1xuICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IGdldEZ1bmNZYW1sVGltZW91dChwcm9qZWN0RGlyKTtcbiAgY29uc3QgY29uZmlnID0gZ2V0RnVuY1lhbWxDb25maWcocHJvamVjdERpcik7XG5cbiAgcmV0dXJuIHtcbiAgICBmdW5jdGlvbk5hbWUsXG4gICAgZnVuY3Rpb25BcHBOYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fQVBQX05BTUU/LnRyaW0oKSB8fCBmdW5jdGlvbk5hbWUsXG4gICAgZG9ja2VyQ29udGV4dFBhdGg6IHBhdGgucmVzb2x2ZShwcm9qZWN0RGlyKSxcbiAgICBpbWFnZVRhZzogaW1hZ2VUYWcgfHwgdW5kZWZpbmVkLFxuICAgIGhhbmRsZXI6IGhhbmRsZXIgfHwgdW5kZWZpbmVkLFxuICAgIHVzZVRoaW5Eb2NrZXJmaWxlLFxuICAgIG1lbW9yeU1iLFxuICAgIHRpbWVvdXRTZWNvbmRzLFxuICAgIGNvbmZpZyxcbiAgfTtcbn1cblxuY29uc3QgYmFja2VuZFR5cGUgPSAocHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0JBQ0tFTkRfVFlQRSB8fCAnbG9jYWwnKSBhcyAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG5cbmNvbnN0IGJhY2tlbmRDb25maWc6IE9jaUJhY2tlbmRDb25maWcgfCB1bmRlZmluZWQgPSBiYWNrZW5kVHlwZSA9PT0gJ2xvY2FsJ1xuICA/IHVuZGVmaW5lZFxuICA6IGJhY2tlbmRUeXBlID09PSAnb2NpJ1xuICAgID8ge1xuICAgICAgICB0eXBlOiAnb2NpJyxcbiAgICAgICAgYnVja2V0OiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfQlVDS0VUIHx8ICd0Zi1zdGF0ZScsXG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0tFWSB8fCAnZnVuY3Rpb24tc3RhY2svdGVycmFmb3JtLnRmc3RhdGUnLFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICB0eXBlOiAnaHR0cCcsXG4gICAgICAgIGFkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX0FERFJFU1MgfHwgJycsXG4gICAgICAgIHVwZGF0ZU1ldGhvZDogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfVVBEQVRFX01FVEhPRCB8fCAnUFVUJyxcbiAgICAgICAgbG9ja0FkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX0xPQ0tfQUREUkVTUyxcbiAgICAgICAgdW5sb2NrQWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfVU5MT0NLX0FERFJFU1MsXG4gICAgICB9O1xuXG4vKipcbiAqIExvYWQgT0NJIGNvbmZpZyBmcm9tIGVudiBhbmQgQ0xJIGNvbmZpZy4gV2hlbiBPQ0lfTkFNRVNQQUNFIGlzIHVuc2V0LCBmZXRjaGVzIGl0IHZpYSBPQ0kgU0RLIChnZXROYW1lc3BhY2UpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T2NpQ29uZmlnKCk6IFByb21pc2U8T2NpQ29uZmlnPiB7XG4gIGNvbnN0IGNsaUNvbmZpZyA9IHJlYWRUZW5hbmN5QW5kUmVnaW9uRnJvbUNsaUNvbmZpZygpO1xuICBjb25zdCBjb21wYXJ0bWVudElkID0gcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEPy50cmltKCkgfHwgJ29jaWQxLmNvbXBhcnRtZW50Lm9jMS4uYWFhYWFhYS4uLic7XG4gIGNvbnN0IG9jaXJDb21wYXJ0bWVudElkID0gcHJvY2Vzcy5lbnYuT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCBjb21wYXJ0bWVudElkO1xuICBjb25zdCB0ZW5hbmN5SWQgPSBwcm9jZXNzLmVudi5PQ0lfVEVOQU5DWV9JRD8udHJpbSgpIHx8IGNsaUNvbmZpZy50ZW5hbmN5Py50cmltKCkgfHwgJ29jaWQxLnRlbmFuY3kub2MxLi5hYWFhYWFhLi4uJztcbiAgY29uc3QgcmVnaW9uID0gcHJvY2Vzcy5lbnYuT0NJX1JFR0lPTj8udHJpbSgpIHx8IGNsaUNvbmZpZy5yZWdpb24/LnRyaW0oKSB8fCAnZXUtZnJhbmtmdXJ0LTEnO1xuXG4gIGlmICghb2NpckNvbXBhcnRtZW50SWQgfHwgb2NpckNvbXBhcnRtZW50SWQuaW5jbHVkZXMoJ3Jvb3QnKSkge1xuICAgIGNvbnNvbGUud2Fybign4pqg77iPICBXQVJOSU5HOiBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCBub3Qgc2V0IG9yIHNldCB0byByb290IGNvbXBhcnRtZW50LicpO1xuICAgIGNvbnNvbGUud2FybignICAgUGxlYXNlIHNldCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCB0byB5b3VyIGhvbWUgY29tcGFydG1lbnQgT0NJRC4nKTtcbiAgICBjb25zb2xlLndhcm4oJyAgIEV4YW1wbGU6IGV4cG9ydCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRD1cIm9jaWQxLmNvbXBhcnRtZW50Lm9jMS4uYWFhYWFhYS4uLlwiJyk7XG4gIH1cblxuICBsZXQgbmFtZXNwYWNlID0gcHJvY2Vzcy5lbnYuT0NJX05BTUVTUEFDRT8udHJpbSgpO1xuICBpZiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2UgPT09ICd5b3VyLW5hbWVzcGFjZScpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGdldE5hbWVzcGFjZUZyb21PY2lTZGsoY29tcGFydG1lbnRJZCwgcmVnaW9uKTtcbiAgICBpZiAocmVzb2x2ZWQpIG5hbWVzcGFjZSA9IHJlc29sdmVkO1xuICAgIGVsc2UgaWYgKCFuYW1lc3BhY2UpIG5hbWVzcGFjZSA9ICd5b3VyLW5hbWVzcGFjZSc7XG4gICAgaWYgKG5hbWVzcGFjZSA9PT0gJ3lvdXItbmFtZXNwYWNlJykge1xuICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gIE9DSV9OQU1FU1BBQ0Ugbm90IHNldCBhbmQgU0RLIGNvdWxkIG5vdCByZXNvbHZlIGl0LiBTZXQgT0NJX05BTUVTUEFDRSBvciBydW4gXCJvY2kgc2V0dXAgY29uZmlnXCIuJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGlzY292ZXJlZCA9IGRpc2NvdmVyRnJvbUZ1bmNZYW1sQW5kVGFyZ2V0KCk7XG5cbiAgY29uc3QgaW1hZ2VUYWcgPSBwcm9jZXNzLmVudi5PQ0lfSU1BR0VfVEFHPy50cmltKCkgfHwgZGlzY292ZXJlZC5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcblxuICBsZXQgZG9ja2VyQ29udGV4dFBhdGggPSBkaXNjb3ZlcmVkLmRvY2tlckNvbnRleHRQYXRoO1xuICBpZiAoIWRvY2tlckNvbnRleHRQYXRoICYmIHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpKSB7XG4gICAgY29uc3QgcCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEgudHJpbSgpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgZG9ja2VyQ29udGV4dFBhdGggPSBmcy5zdGF0U3luYyhwKS5pc0RpcmVjdG9yeSgpID8gcCA6IHBhdGguZGlybmFtZShwKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZXIgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSEFORExFUj8udHJpbSgpIHx8IGRpc2NvdmVyZWQuaGFuZGxlcjtcbiAgY29uc3QgdXNlVGhpbkRvY2tlcmZpbGUgPSBkaXNjb3ZlcmVkLnVzZVRoaW5Eb2NrZXJmaWxlID8/IGZhbHNlO1xuXG4gIGNvbnN0IG1lbW9yeUVudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9NRU1PUllfTUI/LnRyaW0oKTtcbiAgY29uc3QgZnVuY3Rpb25NZW1vcnlNYiA9IG1lbW9yeUVudlxuICAgID8gU3RyaW5nKHBhcnNlSW50KG1lbW9yeUVudiwgMTApKVxuICAgIDogKGRpc2NvdmVyZWQubWVtb3J5TWIgIT0gbnVsbCA/IFN0cmluZyhkaXNjb3ZlcmVkLm1lbW9yeU1iKSA6IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdGltZW91dEVudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFM/LnRyaW0oKTtcbiAgY29uc3QgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA9IHRpbWVvdXRFbnZcbiAgICA/IHBhcnNlSW50KHRpbWVvdXRFbnYsIDEwKVxuICAgIDogZGlzY292ZXJlZC50aW1lb3V0U2Vjb25kcztcblxuICBsZXQgZnVuY3Rpb25Db25maWcgPSBkaXNjb3ZlcmVkLmNvbmZpZztcbiAgY29uc3QgY29uZmlnRW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0NPTkZJRz8udHJpbSgpO1xuICBpZiAoY29uZmlnRW52KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29uZmlnRW52KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgZnVuY3Rpb25Db25maWcgPSB7IC4uLmZ1bmN0aW9uQ29uZmlnLCAuLi5wYXJzZWQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIEpTT05cbiAgICB9XG4gIH1cbiAgaWYgKGZ1bmN0aW9uQ29uZmlnICYmIE9iamVjdC5rZXlzKGZ1bmN0aW9uQ29uZmlnKS5sZW5ndGggPT09IDApIGZ1bmN0aW9uQ29uZmlnID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFwaUd3RGVwbG95bWVudEpzb25FbnYgPSBwcm9jZXNzLmVudi5PQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04/LnRyaW0oKTtcbiAgY29uc3QgYXBpR3dEZXBsb3ltZW50SnNvblBhdGggPSBhcGlHd0RlcGxveW1lbnRKc29uRW52XG4gICAgPyBwYXRoLnJlc29sdmUoYXBpR3dEZXBsb3ltZW50SnNvbkVudilcbiAgICA6IGRvY2tlckNvbnRleHRQYXRoXG4gICAgICA/IGVuc3VyZURlZmF1bHRBcGlHd0RlcGxveW1lbnRKc29uKGRvY2tlckNvbnRleHRQYXRoKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChkb2NrZXJDb250ZXh0UGF0aCkge1xuICAgIGVuc3VyZVRhaWxGdW5jdGlvbkxvZ3NTY3JpcHQoZG9ja2VyQ29udGV4dFBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wYXJ0bWVudElkLFxuICAgIG9jaXJDb21wYXJ0bWVudElkOiBvY2lyQ29tcGFydG1lbnRJZCB8fCB1bmRlZmluZWQsXG4gICAgdGVuYW5jeUlkLFxuICAgIHJlZ2lvbixcbiAgICBuYW1lc3BhY2UsXG4gICAgZnVuY3Rpb25BcHBOYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fQVBQX05BTUUgPz8gZGlzY292ZXJlZC5mdW5jdGlvbkFwcE5hbWUgPz8gJycsXG4gICAgZnVuY3Rpb25OYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fTkFNRSA/PyBkaXNjb3ZlcmVkLmZ1bmN0aW9uTmFtZSA/PyAnJyxcbiAgICBmdW5jdGlvbkphclBhdGg6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpIHx8IHVuZGVmaW5lZCxcbiAgICBkb2NrZXJDb250ZXh0UGF0aDogZG9ja2VyQ29udGV4dFBhdGggfHwgdW5kZWZpbmVkLFxuICAgIGltYWdlVGFnLFxuICAgIGhhbmRsZXI6IGhhbmRsZXIgfHwgdW5kZWZpbmVkLFxuICAgIHVzZVRoaW5Eb2NrZXJmaWxlLFxuICAgIG9jaXJSZXBvc2l0b3J5TmFtZTogcHJvY2Vzcy5lbnYuT0NJX09DSVJfUkVQT1NJVE9SWV9OQU1FIHx8IHVuZGVmaW5lZCxcbiAgICBmdW5jdGlvbk1lbW9yeU1iOiBmdW5jdGlvbk1lbW9yeU1iIHx8IHVuZGVmaW5lZCxcbiAgICBmdW5jdGlvblRpbWVvdXRTZWNvbmRzOiBmdW5jdGlvblRpbWVvdXRTZWNvbmRzID8/IHVuZGVmaW5lZCxcbiAgICBmdW5jdGlvbkNvbmZpZyxcbiAgICBhcGlHd0RlcGxveW1lbnRKc29uUGF0aDogYXBpR3dEZXBsb3ltZW50SnNvblBhdGggfHwgdW5kZWZpbmVkLFxuICAgIGJhY2tlbmQ6IGJhY2tlbmRDb25maWcsXG4gIH07XG59XG4iXX0=
604
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbmZpZy9vY2ktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkVILGtDQUVDO0FBR0Qsd0NBS0M7QUErWkQsb0NBd0ZDO0FBNWtCRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixtREFBcUM7QUFDckMsaUVBQW1EO0FBMENuRCxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQ2xEO0lBQ0UsTUFBTSxFQUFFO1FBQ047WUFDRSxJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUNuQyxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsVUFBVSxFQUFFLGdCQUFnQjtnQkFDNUIsb0JBQW9CLEVBQUUsRUFBRTthQUN6QjtTQUNGO0tBQ0Y7Q0FDRixFQUNELElBQUksRUFDSixDQUFDLENBQ0YsQ0FBQztBQUVGLHFJQUFxSTtBQUN4SCxRQUFBLG1CQUFtQixHQUEyQjtJQUN6RCxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLO0lBQzNGLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLO0lBQ3JGLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLO0lBQ3ZGLFlBQVksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixF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QixFQUFFLHNCQUFzQixJQUFJLFNBQVM7UUFDM0QsY0FBYztRQUNkLHVCQUF1QixFQUFFLHVCQUF1QixJQUFJLFNBQVM7UUFDN0QsT0FBTyxFQUFFLGFBQWE7S0FDdkIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9DSSBDb25maWd1cmF0aW9uXG4gKlxuICogU2V0IHRoZXNlIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgdXBkYXRlIGRlZmF1bHRzOlxuICogLSBPQ0lfQ09NUEFSVE1FTlRfSURcbiAqIC0gT0NJX1RFTkFOQ1lfSURcbiAqIC0gT0NJX1JFR0lPTlxuICogLSBPQ0lfTkFNRVNQQUNFIChpZiB1bnNldCwgb2J0YWluZWQgdmlhIE9DSSBTREsgZ2V0TmFtZXNwYWNlKVxuICogLSBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCAoZm9yIE9DSVI7IG11c3QgYmUgbm9uLXJvb3QgZm9yIGZ1bGwgc3RhY2spXG4gKiAtIE9DSV9GVU5DVElPTl9BUFBfTkFNRSAoRnVuY3Rpb25zIGFwcGxpY2F0aW9uIG5hbWU7IGRlZmF1bHQgZW1wdHkpXG4gKiAtIE9DSV9GVU5DVElPTl9OQU1FIChGdW5jdGlvbiBuYW1lOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fSEFORExFUiAoSmF2YSBGREsgQ01EIGhhbmRsZXIsIGUuZy4gY29tLmV4YW1wbGUuSGFuZGxlcjo6aGFuZGxlUmVxdWVzdDsgZnJvbSBmdW5jLnlhbWwgY21kL2hhbmRsZXIgaWYgdW5zZXQpXG4gKiAtIE9DSV9GVU5DVElPTl9KQVJfUEFUSCAoUGF0aCB0byBKQVIgb3IgcHJvamVjdCBkaXIgZm9yIGZ1bmN0aW9uIGltYWdlOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fTUVNT1JZX01CIChmdW5jdGlvbiBtZW1vcnkgaW4gTUI7IGZyb20gZnVuYy55YW1sIG1lbW9yeSBpZiB1bnNldClcbiAqIC0gT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUyAoZnVuY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzOyBmcm9tIGZ1bmMueWFtbCB0aW1lb3V0IGlmIHVuc2V0KVxuICogLSBPQ0lfRlVOQ1RJT05fQ09ORklHIChKU09OIG9iamVjdCBzdHJpbmcgZm9yIGZ1bmN0aW9uIGNvbmZpZy9lbnY7IG1lcmdlZCB3aXRoIGZ1bmMueWFtbCBjb25maWcpXG4gKiAtIE9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTiAocGF0aCB0byBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHNwZWMgSlNPTjsgZGVmYXVsdCBwcm9qZWN0IHJvb3Qgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uKVxuICogLSBPQ0RLX1BST0pFQ1RfRElSIChzZXQgYnkgb2NkayBDTEkgdG8gY2FsbGVyIGN3ZDsgdXNlZCB0byBkaXNjb3ZlciBmdW5jLnlhbWwgYW5kIHRhcmdldC8pXG4gKiAtIE9DSV9TVEFURV9CVUNLRVQgKGZvciByZW1vdGUgc3RhdGUpXG4gKiAtIE9DSV9TVEFURV9CQUNLRU5EX1RZUEUgKG9jaXxodHRwfGxvY2FsKVxuICpcbiAqIFdoZW4gT0NES19QUk9KRUNUX0RJUiBpcyBzZXQgKGUuZy4gcnVubmluZyBgbnB4IG9jZGsgZGVwbG95YCBmcm9tIGEgSmF2YSBwcm9qZWN0KSwgY29uZmlnXG4gKiBkaXNjb3ZlcnMgZWl0aGVyIHRhcmdldC8qLmphciBvciBwb20ueG1sK3NyYy8gKGFuZCBvcHRpb25hbGx5IGZ1bmMueWFtbCBuYW1lLCB2ZXJzaW9uLCBjbWQvaGFuZGxlcikuXG4gKiBObyBEb2NrZXJmaWxlIGlzIHJlcXVpcmVk4oCUdGhlIHN0YWNrIGdlbmVyYXRlcyBvbmUgaW4gbG9jYWwtZXhlYyAoZXhjbHVkaW5nIG5vZGVfbW9kdWxlcyB2aWEgLmRvY2tlcmlnbm9yZSksXG4gKiB0aGVuIGJ1aWxkcywgdGFncyAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiksIGFuZCBwdXNoZXMgdG8gT0NJUi5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgY29tbW9uIGZyb20gJ29jaS1jb21tb24nO1xuaW1wb3J0ICogYXMgb2JqZWN0c3RvcmFnZSBmcm9tICdvY2ktb2JqZWN0c3RvcmFnZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2NpQmFja2VuZENvbmZpZyB7XG4gIHR5cGU6ICdvY2knIHwgJ2h0dHAnIHwgJ2xvY2FsJztcbiAgYnVja2V0Pzogc3RyaW5nO1xuICBrZXk/OiBzdHJpbmc7XG4gIGFkZHJlc3M/OiBzdHJpbmc7XG4gIHVwZGF0ZU1ldGhvZD86IHN0cmluZztcbiAgbG9ja0FkZHJlc3M/OiBzdHJpbmc7XG4gIHVubG9ja0FkZHJlc3M/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2NpQ29uZmlnIHtcbiAgY29tcGFydG1lbnRJZDogc3RyaW5nO1xuICBvY2lyQ29tcGFydG1lbnRJZD86IHN0cmluZztcbiAgdGVuYW5jeUlkOiBzdHJpbmc7XG4gIHJlZ2lvbjogc3RyaW5nO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgZnVuY3Rpb25BcHBOYW1lOiBzdHJpbmc7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICAvKiogUGF0aCB0byBKQVIgb3IgRG9ja2VyZmlsZSBjb250ZXh0IGZvciBmdW5jdGlvbiBpbWFnZTsgZW1wdHkgPSBubyBidWlsZC9kZXBsb3kuICovXG4gIGZ1bmN0aW9uSmFyUGF0aD86IHN0cmluZztcbiAgLyoqIFBhdGggdG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGFyZ2V0LyAoZGlzY292ZXJlZDsgRG9ja2VyZmlsZSBpcyBnZW5lcmF0ZWQgaW4gbG9jYWwtZXhlYykuICovXG4gIGRvY2tlckNvbnRleHRQYXRoPzogc3RyaW5nO1xuICAvKiogSW1hZ2UgdGFnIGZvciBPQ0lSIChmcm9tIGZ1bmMueWFtbCB2ZXJzaW9uIG9yIE9DSV9JTUFHRV9UQUc7IGRlZmF1bHQgJ2xhdGVzdCcpLiAqL1xuICBpbWFnZVRhZz86IHN0cmluZztcbiAgLyoqIEphdmEgRkRLIENNRCBoYW5kbGVyIChmcm9tIGZ1bmMueWFtbCBjbWQvaGFuZGxlciBvciBPQ0lfRlVOQ1RJT05fSEFORExFUjsgZGVmYXVsdCBiZWxvdykuICovXG4gIGhhbmRsZXI/OiBzdHJpbmc7XG4gIC8qKiBXaGVuIHRydWUsIGRlcGxveSB1c2VzIGEgdGhpbiBEb2NrZXJmaWxlIChDT1BZIHRhcmdldC8qLmphciBvbmx5KTsgZnVsbCBNYXZlbiBidWlsZCBvbmx5IGluIHJlZGVwbG95OmZ1bmN0aW9uLiAqL1xuICB1c2VUaGluRG9ja2VyZmlsZT86IGJvb2xlYW47XG4gIG9jaXJSZXBvc2l0b3J5TmFtZT86IHN0cmluZztcbiAgLyoqIEZ1bmN0aW9uIG1lbW9yeSBpbiBNQiAoMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCwgMzA3MikuIEZyb20gZnVuYy55YW1sIG1lbW9yeSBvciBPQ0lfRlVOQ1RJT05fTUVNT1JZX01CLiAqL1xuICBmdW5jdGlvbk1lbW9yeU1iPzogc3RyaW5nO1xuICAvKiogRnVuY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzICgx4oCTMzAwKS4gRnJvbSBmdW5jLnlhbWwgdGltZW91dCBvciBPQ0lfRlVOQ1RJT05fVElNRU9VVF9TRUNPTkRTLiAqL1xuICBmdW5jdGlvblRpbWVvdXRTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogRnVuY3Rpb24gY29uZmlnL2VudiBrZXktdmFsdWUuIEZyb20gZnVuYy55YW1sIGNvbmZpZyBvciBPQ0lfRlVOQ1RJT05fQ09ORklHIChKU09OIG9iamVjdCBzdHJpbmcpLiAqL1xuICBmdW5jdGlvbkNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBQYXRoIHRvIEFQSSBHYXRld2F5IGRlcGxveW1lbnQgc3BlYyBKU09OIChyb3V0ZXMpLiBVc2UgT0NJX0FQSUdBVEVXQVlfREVQTE9ZTUVOVF9KU09OIG9yIGRlZmF1bHQgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uIGluIHByb2plY3Qgcm9vdC4gKi9cbiAgYXBpR3dEZXBsb3ltZW50SnNvblBhdGg/OiBzdHJpbmc7XG4gIGJhY2tlbmQ/OiBPY2lCYWNrZW5kQ29uZmlnO1xufVxuXG5jb25zdCBERUZBVUxUX0FQSUdXX0RFUExPWU1FTlRfSlNPTiA9IEpTT04uc3RyaW5naWZ5KFxuICB7XG4gICAgcm91dGVzOiBbXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICcve3BhdGgqfScsXG4gICAgICAgIG1ldGhvZHM6IFsnR0VUJywgJ1BPU1QnLCAnT1BUSU9OUyddLFxuICAgICAgICBiYWNrZW5kOiB7XG4gICAgICAgICAgdHlwZTogJ09SQUNMRV9GVU5DVElPTlNfQkFDS0VORCcsXG4gICAgICAgICAgZnVuY3Rpb25JZDogJyR7ZnVuY3Rpb25faWR9JyxcbiAgICAgICAgICByZWFkVGltZW91dEluU2Vjb25kczogMzAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gIG51bGwsXG4gIDJcbik7XG5cbi8qKiBPQ0lSIHNob3J0IHJlZ2lvbiBrZXlzIChlLmcuIGV1LWZyYW5rZnVydC0xIC0+IGZyYSkuIFVzZWQgc28gbG9naW4sIGJ1aWxkLCBwdXNoIGFuZCBmdW5jdGlvbiBpbWFnZSBhbGwgdXNlIHNhbWUgcmVnaXN0cnkgaG9zdC4gKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fVE9fT0NJUl9IT1NUOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnZXUtZnJhbmtmdXJ0LTEnOiAnZnJhJywgJ3VzLXBob2VuaXgtMSc6ICdwaHgnLCAndXMtYXNoYnVybi0xJzogJ2lhZCcsICd1ay1sb25kb24tMSc6ICdsaHInLFxuICAnYXAtdG9reW8tMSc6ICducnQnLCAnYXAtbXVtYmFpLTEnOiAnYm9tJywgJ2FwLXNlb3VsLTEnOiAnaWNuJywgJ2NhLXRvcm9udG8tMSc6ICd5eXonLFxuICAnc2Etc2FvcGF1bG8tMSc6ICdncnUnLCAnYXAtc3lkbmV5LTEnOiAnc3lkJywgJ2V1LXp1cmljaC0xJzogJ3pyaCcsICdtZS1kdWJhaS0xJzogJ2R4YicsXG4gICdhcC1vc2FrYS0xJzogJ2tpeCcsICdldS1hbXN0ZXJkYW0tMSc6ICdhbXMnLCAnYXAtc2luZ2Fwb3JlLTEnOiAnc2luJywgJ2FwLWh5ZGVyYWJhZC0xJzogJ2h5ZCcsXG4gICdldS1taWxhbi0xJzogJ214cCcsICdzYS1zYW50aWFnby0xJzogJ3NjbCcsICdhcC1tZWxib3VybmUtMSc6ICdtZWwnLCAnZXUtc3RvY2tob2xtLTEnOiAnYXJuJyxcbiAgJ21lLWplZGRhaC0xJzogJ2plZCcsICdhZi1qb2hhbm5lc2J1cmctMSc6ICdqbmInLCAnaWwtamVydXNhbGVtLTEnOiAndGx2JywgJ214LXF1ZXJldGFyby0xJzogJ3FybycsXG4gICdldS1tYXJzZWlsbGUtMSc6ICdtcnMnLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9jaXJIb3N0S2V5KHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFJFR0lPTl9UT19PQ0lSX0hPU1RbcmVnaW9uXSA/PyByZWdpb247XG59XG5cbi8qKiBGdWxsIE9DSVIgaW1hZ2UgVVJMIGZvciB0aGUgZnVuY3Rpb24gKHJlZ2lzdHJ5L25hbWVzcGFjZS9yZXBvOnRhZykuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2NpSW1hZ2VVcmwoY29uZmlnOiBPY2lDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCByZWdpc3RyeSA9IGAke29jaXJIb3N0S2V5KGNvbmZpZy5yZWdpb24pfS5vY2lyLmlvYDtcbiAgY29uc3QgcmVwbyA9IGNvbmZpZy5vY2lyUmVwb3NpdG9yeU5hbWUgfHwgY29uZmlnLmZ1bmN0aW9uTmFtZSB8fCAnb2NpLWZ1bmN0aW9uJztcbiAgY29uc3QgdGFnID0gY29uZmlnLmltYWdlVGFnIHx8ICdsYXRlc3QnO1xuICByZXR1cm4gYCR7cmVnaXN0cnl9LyR7Y29uZmlnLm5hbWVzcGFjZX0vJHtyZXBvfToke3RhZ31gO1xufVxuXG4vKipcbiAqIFRyeSB0byByZWFkIGZ1bmN0aW9uIG5hbWUgZnJvbSBmdW5jLnlhbWwgKE9DSSBGdW5jdGlvbnMgZm9ybWF0KS5cbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBcIm5hbWU6XCIgbGluZSwgdHJpbW1lZC5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxOYW1lKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccypuYW1lOlxccypbXCInXT8oW15cIidcXHNcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAobSkgcmV0dXJuIG1bMV0udHJpbSgpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBjbWQvaGFuZGxlciBmcm9tIGZ1bmMueWFtbCAoT0NJL0ZuIGZvcm1hdCkuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBcImNtZDpcIiBvciBcImhhbmRsZXI6XCIgbGluZSwgdHJpbW1lZDsgdXNlZCBhcyBEb2NrZXIgQ01EIGZvciBKYXZhIEZESy5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxIYW5kbGVyKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBjbWRNYXRjaCA9IGNvbnRlbnQubWF0Y2goL15cXHMqY21kOlxccypbXCInXT8oW15cIidcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAoY21kTWF0Y2gpIHJldHVybiBjbWRNYXRjaFsxXS50cmltKCk7XG4gICAgICBjb25zdCBoYW5kbGVyTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eXFxzKmhhbmRsZXI6XFxzKltcIiddPyhbXlwiJ1xcbl0rKVtcIiddPy9tKTtcbiAgICAgIGlmIChoYW5kbGVyTWF0Y2gpIHJldHVybiBoYW5kbGVyTWF0Y2hbMV0udHJpbSgpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCB2ZXJzaW9uIGZyb20gZnVuYy55YW1sICh1c2VkIGFzIE9DSVIgaW1hZ2UgdGFnKS5cbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBcInZlcnNpb246XCIgbGluZSwgdHJpbW1lZDsgc2FuaXRpemVkIGZvciBEb2NrZXIgdGFnIChhLXpBLVowLTlfLi0pLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbFZlcnNpb24ocHJvamVjdERpcjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnZnVuYy55YW1sJyk7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG0gPSBjb250ZW50Lm1hdGNoKC9eXFxzKnZlcnNpb246XFxzKltcIiddPyhbXlwiJ1xcc1xcbl0rKVtcIiddPy9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IG1bMV0udHJpbSgpO1xuICAgICAgICBjb25zdCBzYW5pdGl6ZWQgPSByYXcucmVwbGFjZSgvW15hLXpBLVowLTlfLi1dL2csICctJykucmVwbGFjZSgvLSsvZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG4gICAgICAgIHJldHVybiBzYW5pdGl6ZWQgfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuY29uc3QgVkFMSURfTUVNT1JZX01CID0gbmV3IFNldChbMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCwgMzA3Ml0pO1xuXG4vKipcbiAqIFRyeSB0byByZWFkIG1lbW9yeSAoTUIpIGZyb20gZnVuYy55YW1sLiBPQ0kgYWxsb3dzIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzIuXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgaWYgcHJlc2VudCBhbmQgdmFsaWQ7IG90aGVyd2lzZSB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sTWVtb3J5KHByb2plY3REaXI6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyptZW1vcnk6XFxzKihcXGQrKVxccyokL20pO1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KG1bMV0sIDEwKTtcbiAgICAgICAgaWYgKFZBTElEX01FTU9SWV9NQi5oYXMobikpIHJldHVybiBuO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCB0aW1lb3V0IChzZWNvbmRzKSBmcm9tIGZ1bmMueWFtbC4gT0NJIG1heCBpcyAzMDAuXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgaWYgcHJlc2VudCBhbmQgaW4gcmFuZ2UgMeKAkzMwMDsgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxUaW1lb3V0KHByb2plY3REaXI6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyp0aW1lb3V0OlxccyooXFxkKylcXHMqJC9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChtWzFdLCAxMCk7XG4gICAgICAgIGlmIChuID49IDEgJiYgbiA8PSAzMDApIHJldHVybiBuO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBjb25maWcgKGtleS12YWx1ZSBlbnYpIGZyb20gZnVuYy55YW1sLiBFeHBlY3RzIGEgdG9wLWxldmVsIFwiY29uZmlnOlwiIGJsb2NrIHdpdGgga2V5OiB2YWx1ZSBsaW5lcy5cbiAqIFJldHVybnMgYSByZWNvcmQgb2Ygc3RyaW5nIGtleXMgYW5kIHN0cmluZyB2YWx1ZXM7IGVtcHR5IGlmIG5vbmUgb3IgcGFyc2UgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sQ29uZmlnKHByb2plY3REaXI6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIGxldCBpbkNvbmZpZyA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbmZpZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWQgPT09ICdjb25maWc6JyB8fCAvXmNvbmZpZ1xccyo6XFxzKiQvLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgICAgaW5Db25maWcgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpbkNvbmZpZykge1xuICAgICAgICBpZiAodHJpbW1lZCAhPT0gJycgJiYgIWxpbmUuc3RhcnRzV2l0aCgnICcpICYmICFsaW5lLnN0YXJ0c1dpdGgoJ1xcdCcpKSBicmVhaztcbiAgICAgICAgY29uc3Qga3YgPSBsaW5lLm1hdGNoKC9eXFxzKyhbYS16QS1aX11bYS16QS1aMC05Xy1dKilcXHMqOlxccyooLiopJC8pO1xuICAgICAgICBpZiAoa3YpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBrdlsxXS50cmltKCk7XG4gICAgICAgICAgbGV0IHZhbCA9IGt2WzJdLnRyaW0oKTtcbiAgICAgICAgICBpZiAoKHZhbC5zdGFydHNXaXRoKCdcIicpICYmIHZhbC5lbmRzV2l0aCgnXCInKSkgfHwgKHZhbC5zdGFydHNXaXRoKFwiJ1wiKSAmJiB2YWwuZW5kc1dpdGgoXCInXCIpKSkge1xuICAgICAgICAgICAgdmFsID0gdmFsLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uZmlnW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykubGVuZ3RoID8gY29uZmlnIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBFbnN1cmUgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uIGV4aXN0cyBpbiBwcm9qZWN0RGlyOyB3cml0ZSBkZWZhdWx0IGlmIG1pc3NpbmcuIFJldHVybnMgcGF0aC4gKi9cbmZ1bmN0aW9uIGVuc3VyZURlZmF1bHRBcGlHd0RlcGxveW1lbnRKc29uKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ29jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHAsIERFRkFVTFRfQVBJR1dfREVQTE9ZTUVOVF9KU09OLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiBwO1xufVxuXG5jb25zdCBUQUlMX0ZVTkNUSU9OX0xPR1NfU0NSSVBUID0gYCMhL3Vzci9iaW4vZW52IG5vZGVcbi8qKlxuICogVGFpbCBPQ0kgRnVuY3Rpb25zIGV4ZWN1dGlvbiBsb2dzLiBHZW5lcmF0ZWQgYnkgT0NESy5cbiAqIFJ1biBmcm9tIHByb2plY3Qgcm9vdCBhZnRlciBkZXBsb3kuIFJlcXVpcmVzOiBPQ0kgQ0xJLCBPQ0lfQ09NUEFSVE1FTlRfSUQuXG4gKiBMb2cgSURzOiBmcm9tIC5vY2RrLW91dHB1dHMuanNvbiAoY3JlYXRlZCBvbiBkZXBsb3kpLCBvciBwYXNzIGZvciB0ZXN0aW5nOlxuICogICBPQ0lfTE9HX0dST1VQX0lEPW9jaWQxLi4uIE9DSV9FWEVDVVRJT05fTE9HX0lEPW9jaWQxLi4uIG5vZGUgdGFpbC1mdW5jdGlvbi1sb2dzLmpzXG4gKi9cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCB7IHNwYXduU3luYyB9ID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpO1xuXG5jb25zdCBkaXIgPSBwcm9jZXNzLmVudi5PQ0RLX1BST0pFQ1RfRElSIHx8IF9fZGlybmFtZTtcbmNvbnN0IG91dHB1dHNQYXRoID0gcGF0aC5qb2luKGRpciwgJy5vY2RrLW91dHB1dHMuanNvbicpO1xuY29uc3QgY29tcElkID0gcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEIHx8IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9PQ0lEO1xuaWYgKCFjb21wSWQpIHtcbiAgY29uc29sZS5lcnJvcignU2V0IE9DSV9DT01QQVJUTUVOVF9JRCAob3IgT0NJX0NPTVBBUlRNRU5UX09DSUQpLicpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5sZXQgbG9nR3JvdXBJZCA9IChwcm9jZXNzLmVudi5PQ0lfTE9HX0dST1VQX0lEIHx8ICcnKS50cmltKCk7XG5sZXQgZXhlY3V0aW9uTG9nSWQgPSAocHJvY2Vzcy5lbnYuT0NJX0VYRUNVVElPTl9MT0dfSUQgfHwgJycpLnRyaW0oKTtcbmlmICghbG9nR3JvdXBJZCB8fCAhZXhlY3V0aW9uTG9nSWQpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dHNQYXRoKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1J1biBkZXBsb3kgZmlyc3QgdG8gY3JlYXRlIC5vY2RrLW91dHB1dHMuanNvbiwgb3Igc2V0IE9DSV9MT0dfR1JPVVBfSUQgYW5kIE9DSV9FWEVDVVRJT05fTE9HX0lEIGZvciB0ZXN0aW5nLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBsZXQgb3V0O1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhvdXRwdXRzUGF0aCwgJ3V0ZjgnKS5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKS50cmltKCk7XG4gICAgY29uc3QgZmlyc3QgPSByYXcuaW5kZXhPZigneycpO1xuICAgIGNvbnN0IGxhc3QgPSByYXcubGFzdEluZGV4T2YoJ30nKTtcbiAgICBpZiAoZmlyc3QgPT09IC0xIHx8IGxhc3QgPD0gZmlyc3QpIHRocm93IG5ldyBFcnJvcignTm8gSlNPTicpO1xuICAgIG91dCA9IEpTT04ucGFyc2UocmF3LnNsaWNlKGZpcnN0LCBsYXN0ICsgMSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcignSW52YWxpZCBvciBtaXNzaW5nIC5vY2RrLW91dHB1dHMuanNvbi4gUnVuIGRlcGxveSBmaXJzdC4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgZnVuY3Rpb24gZmluZE91dHB1dHMob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICAgIGlmIChvYmoubG9nX2dyb3VwX2lkICE9IG51bGwgfHwgb2JqLmV4ZWN1dGlvbl9sb2dfaWQgIT0gbnVsbCB8fCBvYmoubG9nR3JvdXBJZCAhPSBudWxsIHx8IG9iai5leGVjdXRpb25Mb2dJZCAhPSBudWxsKSByZXR1cm4gb2JqO1xuICAgIGlmIChvYmoub3V0cHV0cyAmJiB0eXBlb2Ygb2JqLm91dHB1dHMgPT09ICdvYmplY3QnKSByZXR1cm4gZmluZE91dHB1dHMob2JqLm91dHB1dHMpIHx8IG9iai5vdXRwdXRzO1xuICAgIGZvciAoY29uc3QgdiBvZiBPYmplY3QudmFsdWVzKG9iaikpIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gZmluZE91dHB1dHModik7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZnVuY3Rpb24gdmFsKG8sIGspIHtcbiAgICBsZXQgdiA9IG9ba107XG4gICAgaWYgKHYgPT0gbnVsbCkgdiA9IG9bay5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgYykgPT4gYy50b1VwcGVyQ2FzZSgpKV07XG4gICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSByZXR1cm4gdi50cmltKCk7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9IG51bGwgJiYgJ3ZhbHVlJyBpbiB2KSByZXR1cm4gU3RyaW5nKHYudmFsdWUpLnRyaW0oKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRCeVN1YnN0cmluZyhvLCBzdWIpIHtcbiAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhvKS5maW5kKGZ1bmN0aW9uKGspIHsgcmV0dXJuIGsudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzdWIpOyB9KTtcbiAgICByZXR1cm4ga2V5ID8gdmFsKG8sIGtleSkgOiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgb3V0cHV0cyA9IGZpbmRPdXRwdXRzKG91dCkgfHwgb3V0O1xuICBsb2dHcm91cElkID0gdmFsKG91dHB1dHMsICdsb2dfZ3JvdXBfaWQnKSB8fCB2YWwob3V0cHV0cywgJ2xvZ0dyb3VwSWQnKSB8fCBmaW5kQnlTdWJzdHJpbmcob3V0cHV0cywgJ2xvZ19ncm91cCcpO1xuICBleGVjdXRpb25Mb2dJZCA9IHZhbChvdXRwdXRzLCAnZXhlY3V0aW9uX2xvZ19pZCcpIHx8IHZhbChvdXRwdXRzLCAnZXhlY3V0aW9uTG9nSWQnKSB8fCBmaW5kQnlTdWJzdHJpbmcob3V0cHV0cywgJ2V4ZWN1dGlvbl9sb2cnKTtcbiAgaWYgKCFsb2dHcm91cElkIHx8ICFleGVjdXRpb25Mb2dJZCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2xvZ19ncm91cF9pZCBvciBleGVjdXRpb25fbG9nX2lkIG1pc3NpbmcgaW4gLm9jZGstb3V0cHV0cy5qc29uJyk7XG4gICAgY29uc29sZS5lcnJvcignVG9wLWxldmVsIGtleXM6ICcgKyBPYmplY3Qua2V5cyhvdXQpLmpvaW4oJywgJykpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ091dHB1dHMga2V5czogJyArIE9iamVjdC5rZXlzKG91dHB1dHMpLmpvaW4oJywgJykpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1NhbXBsZTogJyArIEpTT04uc3RyaW5naWZ5KG91dCkuc2xpY2UoMCwgNDAwKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5jb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gMTAgKiA2MCAqIDEwMDApO1xuY29uc3QgdGltZVN0YXJ0ID0gc3RhcnQudG9JU09TdHJpbmcoKTtcbmNvbnN0IHRpbWVFbmQgPSBub3cudG9JU09TdHJpbmcoKTtcbmNvbnN0IHNjb3BlID0gY29tcElkICsgJy8nICsgbG9nR3JvdXBJZCArICcvJyArIGV4ZWN1dGlvbkxvZ0lkO1xuY29uc3QgcXVlcnkgPSAnc2VhcmNoIFwiJyArIHNjb3BlICsgJ1wiIHwgc29ydCBieSBkYXRldGltZSBkZXNjIHwgbGltaXQgNTAnO1xuY29uc3QgciA9IHNwYXduU3luYygnb2NpJywgWydsb2dnaW5nLXNlYXJjaCcsICdzZWFyY2gtbG9ncycsICctLXNlYXJjaC1xdWVyeScsIHF1ZXJ5LCAnLS10aW1lLXN0YXJ0JywgdGltZVN0YXJ0LCAnLS10aW1lLWVuZCcsIHRpbWVFbmRdLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG5wcm9jZXNzLmV4aXQoci5zdGF0dXMgPz8gMSk7XG5gO1xuXG4vKiogRW5zdXJlIHRhaWwtZnVuY3Rpb24tbG9ncy5qcyBleGlzdHMgaW4gcHJvamVjdERpcjsgcmVtb3ZlIGxlZ2FjeSBzY3JpcHRzIGFuZCB3cml0ZSBmcmVzaCBmaWxlIGJhc2VkIG9uIHNjcmlwdHMvdGFpbC1mdW5jdGlvbi1sb2cuanMuIFJldHVybnMgcGF0aC4gKi9cbmZ1bmN0aW9uIGVuc3VyZVRhaWxGdW5jdGlvbkxvZ3NTY3JpcHQocHJvamVjdERpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAndGFpbC1mdW5jdGlvbi1sb2dzLmpzJyk7XG4gIGNvbnN0IHNoID0gcGF0aC5qb2luKHByb2plY3REaXIsICd0YWlsLWZ1bmN0aW9uLWxvZ3Muc2gnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzaCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmMoc2gpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlIGNsZWFudXAgZXJyb3JzXG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgZnMudW5saW5rU3luYyhwKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZSBjbGVhbnVwIGVycm9yc1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ3NjcmlwdHMnLCAndGFpbC1mdW5jdGlvbi1sb2cuanMnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHNjcmlwdHMvdGFpbC1mdW5jdGlvbi1sb2cuanMgaW4gb2NkayBwYWNrYWdlJyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCAndXRmOCcpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocCwgY29udGVudCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgd2UgY2Fubm90IHJlYWQgdGhlIHRlbXBsYXRlIGZvciBzb21lIHJlYXNvbiwgbGVhdmUgdGhlIHNjcmlwdCBhYnNlbnQuXG4gIH1cbiAgcmV0dXJuIHA7XG59XG5cbi8qKiBSZWFkIHRlbmFuY3kgYW5kIHJlZ2lvbiBmcm9tIE9DSSBDTEkgY29uZmlnLiBEZWZhdWx0IGZpbGU6IH4vLm9jaS9jb25maWcsIGRlZmF1bHQgcHJvZmlsZTogREVGQVVMVC4gKi9cbmZ1bmN0aW9uIHJlYWRUZW5hbmN5QW5kUmVnaW9uRnJvbUNsaUNvbmZpZygpOiB7IHRlbmFuY3k/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZyB9IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHByb2Nlc3MuZW52Lk9DSV9DT05GSUdfRklMRSB8fCBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm9jaScsICdjb25maWcnKTtcbiAgY29uc3QgcHJvZmlsZSA9IHByb2Nlc3MuZW52Lk9DSV9DTElfUFJPRklMRSB8fCAnREVGQVVMVCc7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSByZXR1cm4ge307XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBsZXQgaW5Qcm9maWxlID0gZmFsc2U7XG4gICAgY29uc3QgcmVzdWx0OiB7IHRlbmFuY3k/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZyB9ID0ge307XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCdbJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXScpKSB7XG4gICAgICAgIGluUHJvZmlsZSA9IHRyaW1tZWQuc2xpY2UoMSwgLTEpID09PSBwcm9maWxlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghaW5Qcm9maWxlKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVxID0gdHJpbW1lZC5pbmRleE9mKCc9Jyk7XG4gICAgICBpZiAoZXEgPD0gMCkgY29udGludWU7XG4gICAgICBjb25zdCBrZXkgPSB0cmltbWVkLnNsaWNlKDAsIGVxKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdHJpbW1lZC5zbGljZShlcSArIDEpLnRyaW0oKTtcbiAgICAgIGlmIChrZXkgPT09ICd0ZW5hbmN5JykgcmVzdWx0LnRlbmFuY3kgPSB2YWx1ZTtcbiAgICAgIGlmIChrZXkgPT09ICdyZWdpb24nKSByZXN1bHQucmVnaW9uID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKiogR2V0IG9iamVjdCBzdG9yYWdlIG5hbWVzcGFjZSB2aWEgT0NJIFNESyAoc2FtZSBhcyBcIm9jaSBvcyBucyBnZXRcIikuIFVzZXMgfi8ub2NpL2NvbmZpZywgREVGQVVMVCBwcm9maWxlLiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlRnJvbU9jaVNkayhjb21wYXJ0bWVudElkOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHByb2Nlc3MuZW52Lk9DSV9DT05GSUdfRklMRSB8fCBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm9jaScsICdjb25maWcnKTtcbiAgY29uc3QgcHJvZmlsZSA9IHByb2Nlc3MuZW52Lk9DSV9DTElfUFJPRklMRSB8fCAnREVGQVVMVCc7XG4gIHRyeSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgY29tbW9uLkNvbmZpZ0ZpbGVBdXRoZW50aWNhdGlvbkRldGFpbHNQcm92aWRlcihjb25maWdQYXRoLCBwcm9maWxlKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgb2JqZWN0c3RvcmFnZS5PYmplY3RTdG9yYWdlQ2xpZW50KHsgYXV0aGVudGljYXRpb25EZXRhaWxzUHJvdmlkZXI6IHByb3ZpZGVyIH0pO1xuICAgIGNsaWVudC5yZWdpb25JZCA9IHJlZ2lvbjtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXROYW1lc3BhY2Uoe1xuICAgICAgY29tcGFydG1lbnRJZCxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UudmFsdWU/LnRyaW0oKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEZpbmQgYSBKQVIgdW5kZXIgdGFyZ2V0LyAocHJlZmVyIG9uZSBtYXRjaGluZyBuYW1lLCBlbHNlIGZpcnN0IC5qYXIpLlxuICovXG5mdW5jdGlvbiBmaW5kSmFySW5UYXJnZXQocHJvamVjdERpcjogc3RyaW5nLCBmdW5jdGlvbk5hbWU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YXJnZXREaXIgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3RhcmdldCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0RGlyKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRhcmdldERpcik7XG4gICAgY29uc3QgamFycyA9IGZpbGVzLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aCgnLmphcicpICYmICFmLmVuZHNXaXRoKCctc291cmNlcy5qYXInKSk7XG4gICAgaWYgKGphcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChmdW5jdGlvbk5hbWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gamFycy5maW5kKChqKSA9PiBqLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZnVuY3Rpb25OYW1lLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgIGlmIChtYXRjaCkgcmV0dXJuIHBhdGguam9pbih0YXJnZXREaXIsIG1hdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbih0YXJnZXREaXIsIGphcnNbMF0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBUcnVlIGlmIHByb2plY3QgaGFzIHBvbS54bWwgYW5kIHNyYy8gKE1hdmVuIHNvdXJjZSBsYXlvdXQgZm9yIGJ1aWxkLWZyb20tc291cmNlIERvY2tlcmZpbGUpLiAqL1xuZnVuY3Rpb24gaGFzUG9tQW5kU3JjKHByb2plY3REaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwb20gPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3BvbS54bWwnKTtcbiAgY29uc3Qgc3JjID0gcGF0aC5qb2luKHByb2plY3REaXIsICdzcmMnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwb20pICYmIGZzLmV4aXN0c1N5bmMoc3JjKSAmJiBmcy5zdGF0U3luYyhzcmMpLmlzRGlyZWN0b3J5KCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNjb3ZlckZyb21GdW5jWWFtbEFuZFRhcmdldCgpOiB7XG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgZnVuY3Rpb25BcHBOYW1lPzogc3RyaW5nO1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIGhhbmRsZXI/OiBzdHJpbmc7XG4gIHVzZVRoaW5Eb2NrZXJmaWxlPzogYm9vbGVhbjtcbiAgbWVtb3J5TWI/OiBudW1iZXI7XG4gIHRpbWVvdXRTZWNvbmRzPzogbnVtYmVyO1xuICBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufSB7XG4gIGxldCBwcm9qZWN0RGlyID0gcHJvY2Vzcy5lbnYuT0NES19QUk9KRUNUX0RJUj8udHJpbSgpO1xuICBpZiAoIXByb2plY3REaXIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLm9jZGstcHJvamVjdC1kaXInKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBwcm9qZWN0RGlyID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4JykudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9XG4gIGlmICghcHJvamVjdERpciAmJiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEg/LnRyaW0oKSkge1xuICAgIGNvbnN0IHAgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRILnRyaW0oKSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHByb2plY3REaXIgPSBmcy5zdGF0U3luYyhwKS5pc0RpcmVjdG9yeSgpID8gcCA6IHBhdGguZGlybmFtZShwKTtcbiAgfVxuICBpZiAoIXByb2plY3REaXIpIHByb2plY3REaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICBwcm9qZWN0RGlyID0gcHJvamVjdERpciA/IHBhdGgucmVzb2x2ZShwcm9qZWN0RGlyKSA6ICcnO1xuICBpZiAoIXByb2plY3REaXIgfHwgIWZzLmV4aXN0c1N5bmMocHJvamVjdERpcikpIHJldHVybiB7fTtcblxuICBjb25zdCBuYW1lRnJvbVlhbWwgPSBnZXRGdW5jWWFtbE5hbWUocHJvamVjdERpcik7XG4gIGNvbnN0IGphclBhdGggPSBmaW5kSmFySW5UYXJnZXQocHJvamVjdERpciwgbmFtZUZyb21ZYW1sIHx8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGhhc1NvdXJjZSA9IGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyKTtcbiAgaWYgKCFqYXJQYXRoICYmICFoYXNTb3VyY2UpIHJldHVybiB7fTtcblxuICBjb25zdCBmdW5jdGlvbk5hbWUgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fTkFNRT8udHJpbSgpIHx8IG5hbWVGcm9tWWFtbCB8fCBwYXRoLmJhc2VuYW1lKHByb2plY3REaXIpIHx8ICdvY2ktZnVuY3Rpb24nO1xuICBjb25zdCBpbWFnZVRhZyA9IHByb2Nlc3MuZW52Lk9DSV9JTUFHRV9UQUc/LnRyaW0oKSB8fCBnZXRGdW5jWWFtbFZlcnNpb24ocHJvamVjdERpcik7XG4gIGNvbnN0IGhhbmRsZXIgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSEFORExFUj8udHJpbSgpIHx8IGdldEZ1bmNZYW1sSGFuZGxlcihwcm9qZWN0RGlyKTtcbiAgY29uc3QgdXNlVGhpbkRvY2tlcmZpbGUgPSAhIWphclBhdGg7XG4gIGNvbnN0IG1lbW9yeU1iID0gZ2V0RnVuY1lhbWxNZW1vcnkocHJvamVjdERpcik7XG4gIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gZ2V0RnVuY1lhbWxUaW1lb3V0KHByb2plY3REaXIpO1xuICBjb25zdCBjb25maWcgPSBnZXRGdW5jWWFtbENvbmZpZyhwcm9qZWN0RGlyKTtcblxuICByZXR1cm4ge1xuICAgIGZ1bmN0aW9uTmFtZSxcbiAgICBmdW5jdGlvbkFwcE5hbWU6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9BUFBfTkFNRT8udHJpbSgpIHx8IGZ1bmN0aW9uTmFtZSxcbiAgICBkb2NrZXJDb250ZXh0UGF0aDogcGF0aC5yZXNvbHZlKHByb2plY3REaXIpLFxuICAgIGltYWdlVGFnOiBpbWFnZVRhZyB8fCB1bmRlZmluZWQsXG4gICAgaGFuZGxlcjogaGFuZGxlciB8fCB1bmRlZmluZWQsXG4gICAgdXNlVGhpbkRvY2tlcmZpbGUsXG4gICAgbWVtb3J5TWIsXG4gICAgdGltZW91dFNlY29uZHMsXG4gICAgY29uZmlnLFxuICB9O1xufVxuXG5jb25zdCBiYWNrZW5kVHlwZSA9IChwcm9jZXNzLmVudi5PQ0lfU1RBVEVfQkFDS0VORF9UWVBFIHx8ICdsb2NhbCcpIGFzICdvY2knIHwgJ2h0dHAnIHwgJ2xvY2FsJztcblxuY29uc3QgYmFja2VuZENvbmZpZzogT2NpQmFja2VuZENvbmZpZyB8IHVuZGVmaW5lZCA9IGJhY2tlbmRUeXBlID09PSAnbG9jYWwnXG4gID8gdW5kZWZpbmVkXG4gIDogYmFja2VuZFR5cGUgPT09ICdvY2knXG4gICAgPyB7XG4gICAgICAgIHR5cGU6ICdvY2knLFxuICAgICAgICBidWNrZXQ6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9CVUNLRVQgfHwgJ3RmLXN0YXRlJyxcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfS0VZIHx8ICdmdW5jdGlvbi1zdGFjay90ZXJyYWZvcm0udGZzdGF0ZScsXG4gICAgICB9XG4gICAgOiB7XG4gICAgICAgIHR5cGU6ICdodHRwJyxcbiAgICAgICAgYWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfQUREUkVTUyB8fCAnJyxcbiAgICAgICAgdXBkYXRlTWV0aG9kOiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfSFRUUF9VUERBVEVfTUVUSE9EIHx8ICdQVVQnLFxuICAgICAgICBsb2NrQWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfTE9DS19BRERSRVNTLFxuICAgICAgICB1bmxvY2tBZGRyZXNzOiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfSFRUUF9VTkxPQ0tfQUREUkVTUyxcbiAgICAgIH07XG5cbi8qKlxuICogTG9hZCBPQ0kgY29uZmlnIGZyb20gZW52IGFuZCBDTEkgY29uZmlnLiBXaGVuIE9DSV9OQU1FU1BBQ0UgaXMgdW5zZXQsIGZldGNoZXMgaXQgdmlhIE9DSSBTREsgKGdldE5hbWVzcGFjZSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPY2lDb25maWcoKTogUHJvbWlzZTxPY2lDb25maWc+IHtcbiAgY29uc3QgY2xpQ29uZmlnID0gcmVhZFRlbmFuY3lBbmRSZWdpb25Gcm9tQ2xpQ29uZmlnKCk7XG4gIGNvbnN0IGNvbXBhcnRtZW50SWQgPSBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCAnb2NpZDEuY29tcGFydG1lbnQub2MxLi5hYWFhYWFhLi4uJztcbiAgY29uc3Qgb2NpckNvbXBhcnRtZW50SWQgPSBwcm9jZXNzLmVudi5PQ0lfT0NJUl9DT01QQVJUTUVOVF9JRD8udHJpbSgpIHx8IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9JRD8udHJpbSgpIHx8IGNvbXBhcnRtZW50SWQ7XG4gIGNvbnN0IHRlbmFuY3lJZCA9IHByb2Nlc3MuZW52Lk9DSV9URU5BTkNZX0lEPy50cmltKCkgfHwgY2xpQ29uZmlnLnRlbmFuY3k/LnRyaW0oKSB8fCAnb2NpZDEudGVuYW5jeS5vYzEuLmFhYWFhYWEuLi4nO1xuICBjb25zdCByZWdpb24gPSBwcm9jZXNzLmVudi5PQ0lfUkVHSU9OPy50cmltKCkgfHwgY2xpQ29uZmlnLnJlZ2lvbj8udHJpbSgpIHx8ICdldS1mcmFua2Z1cnQtMSc7XG5cbiAgaWYgKCFvY2lyQ29tcGFydG1lbnRJZCB8fCBvY2lyQ29tcGFydG1lbnRJZC5pbmNsdWRlcygncm9vdCcpKSB7XG4gICAgY29uc29sZS53YXJuKCfimqDvuI8gIFdBUk5JTkc6IE9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEIG5vdCBzZXQgb3Igc2V0IHRvIHJvb3QgY29tcGFydG1lbnQuJyk7XG4gICAgY29uc29sZS53YXJuKCcgICBQbGVhc2Ugc2V0IE9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEIHRvIHlvdXIgaG9tZSBjb21wYXJ0bWVudCBPQ0lELicpO1xuICAgIGNvbnNvbGUud2FybignICAgRXhhbXBsZTogZXhwb3J0IE9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEPVwib2NpZDEuY29tcGFydG1lbnQub2MxLi5hYWFhYWFhLi4uXCInKTtcbiAgfVxuXG4gIGxldCBuYW1lc3BhY2UgPSBwcm9jZXNzLmVudi5PQ0lfTkFNRVNQQUNFPy50cmltKCk7XG4gIGlmICghbmFtZXNwYWNlIHx8IG5hbWVzcGFjZSA9PT0gJ3lvdXItbmFtZXNwYWNlJykge1xuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgZ2V0TmFtZXNwYWNlRnJvbU9jaVNkayhjb21wYXJ0bWVudElkLCByZWdpb24pO1xuICAgIGlmIChyZXNvbHZlZCkgbmFtZXNwYWNlID0gcmVzb2x2ZWQ7XG4gICAgZWxzZSBpZiAoIW5hbWVzcGFjZSkgbmFtZXNwYWNlID0gJ3lvdXItbmFtZXNwYWNlJztcbiAgICBpZiAobmFtZXNwYWNlID09PSAneW91ci1uYW1lc3BhY2UnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyAgT0NJX05BTUVTUEFDRSBub3Qgc2V0IGFuZCBTREsgY291bGQgbm90IHJlc29sdmUgaXQuIFNldCBPQ0lfTkFNRVNQQUNFIG9yIHJ1biBcIm9jaSBzZXR1cCBjb25maWdcIi4nKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkaXNjb3ZlcmVkID0gZGlzY292ZXJGcm9tRnVuY1lhbWxBbmRUYXJnZXQoKTtcblxuICBjb25zdCBpbWFnZVRhZyA9IHByb2Nlc3MuZW52Lk9DSV9JTUFHRV9UQUc/LnRyaW0oKSB8fCBkaXNjb3ZlcmVkLmltYWdlVGFnIHx8ICdsYXRlc3QnO1xuXG4gIGxldCBkb2NrZXJDb250ZXh0UGF0aCA9IGRpc2NvdmVyZWQuZG9ja2VyQ29udGV4dFBhdGg7XG4gIGlmICghZG9ja2VyQ29udGV4dFBhdGggJiYgcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkpIHtcbiAgICBjb25zdCBwID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSC50cmltKCkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBkb2NrZXJDb250ZXh0UGF0aCA9IGZzLnN0YXRTeW5jKHApLmlzRGlyZWN0b3J5KCkgPyBwIDogcGF0aC5kaXJuYW1lKHApO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlciA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9IQU5ETEVSPy50cmltKCkgfHwgZGlzY292ZXJlZC5oYW5kbGVyO1xuICBjb25zdCB1c2VUaGluRG9ja2VyZmlsZSA9IGRpc2NvdmVyZWQudXNlVGhpbkRvY2tlcmZpbGUgPz8gZmFsc2U7XG5cbiAgY29uc3QgbWVtb3J5RW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX01FTU9SWV9NQj8udHJpbSgpO1xuICBjb25zdCBmdW5jdGlvbk1lbW9yeU1iID0gbWVtb3J5RW52XG4gICAgPyBTdHJpbmcocGFyc2VJbnQobWVtb3J5RW52LCAxMCkpXG4gICAgOiAoZGlzY292ZXJlZC5tZW1vcnlNYiAhPSBudWxsID8gU3RyaW5nKGRpc2NvdmVyZWQubWVtb3J5TWIpIDogdW5kZWZpbmVkKTtcblxuICBjb25zdCB0aW1lb3V0RW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUz8udHJpbSgpO1xuICBjb25zdCBmdW5jdGlvblRpbWVvdXRTZWNvbmRzID0gdGltZW91dEVudlxuICAgID8gcGFyc2VJbnQodGltZW91dEVudiwgMTApXG4gICAgOiBkaXNjb3ZlcmVkLnRpbWVvdXRTZWNvbmRzO1xuXG4gIGxldCBmdW5jdGlvbkNvbmZpZyA9IGRpc2NvdmVyZWQuY29uZmlnO1xuICBjb25zdCBjb25maWdFbnYgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fQ09ORklHPy50cmltKCk7XG4gIGlmIChjb25maWdFbnYpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb25maWdFbnYpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICBmdW5jdGlvbkNvbmZpZyA9IHsgLi4uZnVuY3Rpb25Db25maWcsIC4uLnBhcnNlZCB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIGludmFsaWQgSlNPTlxuICAgIH1cbiAgfVxuICBpZiAoZnVuY3Rpb25Db25maWcgJiYgT2JqZWN0LmtleXMoZnVuY3Rpb25Db25maWcpLmxlbmd0aCA9PT0gMCkgZnVuY3Rpb25Db25maWcgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYXBpR3dEZXBsb3ltZW50SnNvbkVudiA9IHByb2Nlc3MuZW52Lk9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTj8udHJpbSgpO1xuICBjb25zdCBhcGlHd0RlcGxveW1lbnRKc29uUGF0aCA9IGFwaUd3RGVwbG95bWVudEpzb25FbnZcbiAgICA/IHBhdGgucmVzb2x2ZShhcGlHd0RlcGxveW1lbnRKc29uRW52KVxuICAgIDogZG9ja2VyQ29udGV4dFBhdGhcbiAgICAgID8gZW5zdXJlRGVmYXVsdEFwaUd3RGVwbG95bWVudEpzb24oZG9ja2VyQ29udGV4dFBhdGgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKGRvY2tlckNvbnRleHRQYXRoKSB7XG4gICAgZW5zdXJlVGFpbEZ1bmN0aW9uTG9nc1NjcmlwdChkb2NrZXJDb250ZXh0UGF0aCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbXBhcnRtZW50SWQsXG4gICAgb2NpckNvbXBhcnRtZW50SWQ6IG9jaXJDb21wYXJ0bWVudElkIHx8IHVuZGVmaW5lZCxcbiAgICB0ZW5hbmN5SWQsXG4gICAgcmVnaW9uLFxuICAgIG5hbWVzcGFjZSxcbiAgICBmdW5jdGlvbkFwcE5hbWU6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9BUFBfTkFNRSA/PyBkaXNjb3ZlcmVkLmZ1bmN0aW9uQXBwTmFtZSA/PyAnJyxcbiAgICBmdW5jdGlvbk5hbWU6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9OQU1FID8/IGRpc2NvdmVyZWQuZnVuY3Rpb25OYW1lID8/ICcnLFxuICAgIGZ1bmN0aW9uSmFyUGF0aDogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkgfHwgdW5kZWZpbmVkLFxuICAgIGRvY2tlckNvbnRleHRQYXRoOiBkb2NrZXJDb250ZXh0UGF0aCB8fCB1bmRlZmluZWQsXG4gICAgaW1hZ2VUYWcsXG4gICAgaGFuZGxlcjogaGFuZGxlciB8fCB1bmRlZmluZWQsXG4gICAgdXNlVGhpbkRvY2tlcmZpbGUsXG4gICAgb2NpclJlcG9zaXRvcnlOYW1lOiBwcm9jZXNzLmVudi5PQ0lfT0NJUl9SRVBPU0lUT1JZX05BTUUgfHwgdW5kZWZpbmVkLFxuICAgIGZ1bmN0aW9uTWVtb3J5TWI6IGZ1bmN0aW9uTWVtb3J5TWIgfHwgdW5kZWZpbmVkLFxuICAgIGZ1bmN0aW9uVGltZW91dFNlY29uZHM6IGZ1bmN0aW9uVGltZW91dFNlY29uZHMgPz8gdW5kZWZpbmVkLFxuICAgIGZ1bmN0aW9uQ29uZmlnLFxuICAgIGFwaUd3RGVwbG95bWVudEpzb25QYXRoOiBhcGlHd0RlcGxveW1lbnRKc29uUGF0aCB8fCB1bmRlZmluZWQsXG4gICAgYmFja2VuZDogYmFja2VuZENvbmZpZyxcbiAgfTtcbn1cbiJdfQ==
@@ -341,7 +341,7 @@ const r = spawnSync('oci', ['logging-search', 'search-logs', '--search-query', q
341
341
  process.exit(r.status ?? 1);
342
342
  `;
343
343
 
344
- /** Ensure tail-function-logs.js exists in projectDir; remove legacy scripts and write fresh file. Returns path. */
344
+ /** Ensure tail-function-logs.js exists in projectDir; remove legacy scripts and write fresh file based on scripts/tail-function-log.js. Returns path. */
345
345
  function ensureTailFunctionLogsScript(projectDir: string): string {
346
346
  const p = path.join(projectDir, 'tail-function-logs.js');
347
347
  const sh = path.join(projectDir, 'tail-function-logs.sh');
@@ -359,7 +359,16 @@ function ensureTailFunctionLogsScript(projectDir: string): string {
359
359
  } catch {
360
360
  // ignore cleanup errors
361
361
  }
362
- fs.writeFileSync(p, TAIL_FUNCTION_LOGS_SCRIPT, 'utf8');
362
+ try {
363
+ const templatePath = path.join(__dirname, '..', 'scripts', 'tail-function-log.js');
364
+ if (!fs.existsSync(templatePath)) {
365
+ throw new Error('missing scripts/tail-function-log.js in ocdk package');
366
+ }
367
+ const content = fs.readFileSync(templatePath, 'utf8');
368
+ fs.writeFileSync(p, content, 'utf8');
369
+ } catch {
370
+ // If we cannot read the template for some reason, leave the script absent.
371
+ }
363
372
  return p;
364
373
  }
365
374
 
@@ -334,7 +334,7 @@ const query = 'search "' + scope + '" | sort by datetime desc | limit 50';
334
334
  const r = spawnSync('oci', ['logging-search', 'search-logs', '--search-query', query, '--time-start', timeStart, '--time-end', timeEnd], { stdio: 'inherit' });
335
335
  process.exit(r.status ?? 1);
336
336
  `;
337
- /** Ensure tail-function-logs.js exists in projectDir; remove legacy scripts and write fresh file. Returns path. */
337
+ /** Ensure tail-function-logs.js exists in projectDir; remove legacy scripts and write fresh file based on scripts/tail-function-log.js. Returns path. */
338
338
  function ensureTailFunctionLogsScript(projectDir) {
339
339
  const p = path.join(projectDir, 'tail-function-logs.js');
340
340
  const sh = path.join(projectDir, 'tail-function-logs.sh');
@@ -354,7 +354,17 @@ function ensureTailFunctionLogsScript(projectDir) {
354
354
  catch {
355
355
  // ignore cleanup errors
356
356
  }
357
- fs.writeFileSync(p, TAIL_FUNCTION_LOGS_SCRIPT, 'utf8');
357
+ try {
358
+ const templatePath = path.join(__dirname, '..', 'scripts', 'tail-function-log.js');
359
+ if (!fs.existsSync(templatePath)) {
360
+ throw new Error('missing scripts/tail-function-log.js in ocdk package');
361
+ }
362
+ const content = fs.readFileSync(templatePath, 'utf8');
363
+ fs.writeFileSync(p, content, 'utf8');
364
+ }
365
+ catch {
366
+ // If we cannot read the template for some reason, leave the script absent.
367
+ }
358
368
  return p;
359
369
  }
360
370
  /** Read tenancy and region from OCI CLI config. Default file: ~/.oci/config, default profile: DEFAULT. */
@@ -591,4 +601,4 @@ async function getOciConfig() {
591
601
  backend: backendConfig,
592
602
  };
593
603
  }
594
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbmZpZy9vY2ktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkVILGtDQUVDO0FBR0Qsd0NBS0M7QUFzWkQsb0NBd0ZDO0FBbmtCRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixtREFBcUM7QUFDckMsaUVBQW1EO0FBMENuRCxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQ2xEO0lBQ0UsTUFBTSxFQUFFO1FBQ047WUFDRSxJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUNuQyxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsVUFBVSxFQUFFLGdCQUFnQjtnQkFDNUIsb0JBQW9CLEVBQUUsRUFBRTthQUN6QjtTQUNGO0tBQ0Y7Q0FDRixFQUNELElBQUksRUFDSixDQUFDLENBQ0YsQ0FBQztBQUVGLHFJQUFxSTtBQUN4SCxRQUFBLG1CQUFtQixHQUEyQjtJQUN6RCxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLO0lBQzNGLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLO0lBQ3JGLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLO0lBQ3ZGLFlBQVksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixF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QUFDLFNBQVMsQ0FBQztJQUNoQixJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDdEIsNEJBQTRCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsT0FBTztRQUNMLGFBQWE7UUFDYixpQkFBaUIsRUFBRSxpQkFBaUIsSUFBSSxTQUFTO1FBQ2pELFNBQVM7UUFDVCxNQUFNO1FBQ04sU0FBUztRQUNULGVBQWUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLFVBQVUsQ0FBQyxlQUFlLElBQUksRUFBRTtRQUN0RixZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxVQUFVLENBQUMsWUFBWSxJQUFJLEVBQUU7UUFDNUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsSUFBSSxFQUFFLElBQUksU0FBUztRQUN2RSxpQkFBaUIsRUFBRSxpQkFBaUIsSUFBSSxTQUFTO1FBQ2pELFFBQVE7UUFDUixPQUFPLEVBQUUsT0FBTyxJQUFJLFNBQVM7UUFDN0IsaUJBQWlCO1FBQ2pCLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLElBQUksU0FBUztRQUNyRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsSUFBSSxTQUFTO1FBQy9DLHNCQUFzQixFQUFFLHNCQUFzQixJQUFJLFNBQVM7UUFDM0QsY0FBYztRQUNkLHVCQUF1QixFQUFFLHVCQUF1QixJQUFJLFNBQVM7UUFDN0QsT0FBTyxFQUFFLGFBQWE7S0FDdkIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9DSSBDb25maWd1cmF0aW9uXG4gKlxuICogU2V0IHRoZXNlIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgdXBkYXRlIGRlZmF1bHRzOlxuICogLSBPQ0lfQ09NUEFSVE1FTlRfSURcbiAqIC0gT0NJX1RFTkFOQ1lfSURcbiAqIC0gT0NJX1JFR0lPTlxuICogLSBPQ0lfTkFNRVNQQUNFIChpZiB1bnNldCwgb2J0YWluZWQgdmlhIE9DSSBTREsgZ2V0TmFtZXNwYWNlKVxuICogLSBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCAoZm9yIE9DSVI7IG11c3QgYmUgbm9uLXJvb3QgZm9yIGZ1bGwgc3RhY2spXG4gKiAtIE9DSV9GVU5DVElPTl9BUFBfTkFNRSAoRnVuY3Rpb25zIGFwcGxpY2F0aW9uIG5hbWU7IGRlZmF1bHQgZW1wdHkpXG4gKiAtIE9DSV9GVU5DVElPTl9OQU1FIChGdW5jdGlvbiBuYW1lOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fSEFORExFUiAoSmF2YSBGREsgQ01EIGhhbmRsZXIsIGUuZy4gY29tLmV4YW1wbGUuSGFuZGxlcjo6aGFuZGxlUmVxdWVzdDsgZnJvbSBmdW5jLnlhbWwgY21kL2hhbmRsZXIgaWYgdW5zZXQpXG4gKiAtIE9DSV9GVU5DVElPTl9KQVJfUEFUSCAoUGF0aCB0byBKQVIgb3IgcHJvamVjdCBkaXIgZm9yIGZ1bmN0aW9uIGltYWdlOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fTUVNT1JZX01CIChmdW5jdGlvbiBtZW1vcnkgaW4gTUI7IGZyb20gZnVuYy55YW1sIG1lbW9yeSBpZiB1bnNldClcbiAqIC0gT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUyAoZnVuY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzOyBmcm9tIGZ1bmMueWFtbCB0aW1lb3V0IGlmIHVuc2V0KVxuICogLSBPQ0lfRlVOQ1RJT05fQ09ORklHIChKU09OIG9iamVjdCBzdHJpbmcgZm9yIGZ1bmN0aW9uIGNvbmZpZy9lbnY7IG1lcmdlZCB3aXRoIGZ1bmMueWFtbCBjb25maWcpXG4gKiAtIE9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTiAocGF0aCB0byBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHNwZWMgSlNPTjsgZGVmYXVsdCBwcm9qZWN0IHJvb3Qgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uKVxuICogLSBPQ0RLX1BST0pFQ1RfRElSIChzZXQgYnkgb2NkayBDTEkgdG8gY2FsbGVyIGN3ZDsgdXNlZCB0byBkaXNjb3ZlciBmdW5jLnlhbWwgYW5kIHRhcmdldC8pXG4gKiAtIE9DSV9TVEFURV9CVUNLRVQgKGZvciByZW1vdGUgc3RhdGUpXG4gKiAtIE9DSV9TVEFURV9CQUNLRU5EX1RZUEUgKG9jaXxodHRwfGxvY2FsKVxuICpcbiAqIFdoZW4gT0NES19QUk9KRUNUX0RJUiBpcyBzZXQgKGUuZy4gcnVubmluZyBgbnB4IG9jZGsgZGVwbG95YCBmcm9tIGEgSmF2YSBwcm9qZWN0KSwgY29uZmlnXG4gKiBkaXNjb3ZlcnMgZWl0aGVyIHRhcmdldC8qLmphciBvciBwb20ueG1sK3NyYy8gKGFuZCBvcHRpb25hbGx5IGZ1bmMueWFtbCBuYW1lLCB2ZXJzaW9uLCBjbWQvaGFuZGxlcikuXG4gKiBObyBEb2NrZXJmaWxlIGlzIHJlcXVpcmVk4oCUdGhlIHN0YWNrIGdlbmVyYXRlcyBvbmUgaW4gbG9jYWwtZXhlYyAoZXhjbHVkaW5nIG5vZGVfbW9kdWxlcyB2aWEgLmRvY2tlcmlnbm9yZSksXG4gKiB0aGVuIGJ1aWxkcywgdGFncyAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiksIGFuZCBwdXNoZXMgdG8gT0NJUi5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgY29tbW9uIGZyb20gJ29jaS1jb21tb24nO1xuaW1wb3J0ICogYXMgb2JqZWN0c3RvcmFnZSBmcm9tICdvY2ktb2JqZWN0c3RvcmFnZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2NpQmFja2VuZENvbmZpZyB7XG4gIHR5cGU6ICdvY2knIHwgJ2h0dHAnIHwgJ2xvY2FsJztcbiAgYnVja2V0Pzogc3RyaW5nO1xuICBrZXk/OiBzdHJpbmc7XG4gIGFkZHJlc3M/OiBzdHJpbmc7XG4gIHVwZGF0ZU1ldGhvZD86IHN0cmluZztcbiAgbG9ja0FkZHJlc3M/OiBzdHJpbmc7XG4gIHVubG9ja0FkZHJlc3M/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2NpQ29uZmlnIHtcbiAgY29tcGFydG1lbnRJZDogc3RyaW5nO1xuICBvY2lyQ29tcGFydG1lbnRJZD86IHN0cmluZztcbiAgdGVuYW5jeUlkOiBzdHJpbmc7XG4gIHJlZ2lvbjogc3RyaW5nO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgZnVuY3Rpb25BcHBOYW1lOiBzdHJpbmc7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICAvKiogUGF0aCB0byBKQVIgb3IgRG9ja2VyZmlsZSBjb250ZXh0IGZvciBmdW5jdGlvbiBpbWFnZTsgZW1wdHkgPSBubyBidWlsZC9kZXBsb3kuICovXG4gIGZ1bmN0aW9uSmFyUGF0aD86IHN0cmluZztcbiAgLyoqIFBhdGggdG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGFyZ2V0LyAoZGlzY292ZXJlZDsgRG9ja2VyZmlsZSBpcyBnZW5lcmF0ZWQgaW4gbG9jYWwtZXhlYykuICovXG4gIGRvY2tlckNvbnRleHRQYXRoPzogc3RyaW5nO1xuICAvKiogSW1hZ2UgdGFnIGZvciBPQ0lSIChmcm9tIGZ1bmMueWFtbCB2ZXJzaW9uIG9yIE9DSV9JTUFHRV9UQUc7IGRlZmF1bHQgJ2xhdGVzdCcpLiAqL1xuICBpbWFnZVRhZz86IHN0cmluZztcbiAgLyoqIEphdmEgRkRLIENNRCBoYW5kbGVyIChmcm9tIGZ1bmMueWFtbCBjbWQvaGFuZGxlciBvciBPQ0lfRlVOQ1RJT05fSEFORExFUjsgZGVmYXVsdCBiZWxvdykuICovXG4gIGhhbmRsZXI/OiBzdHJpbmc7XG4gIC8qKiBXaGVuIHRydWUsIGRlcGxveSB1c2VzIGEgdGhpbiBEb2NrZXJmaWxlIChDT1BZIHRhcmdldC8qLmphciBvbmx5KTsgZnVsbCBNYXZlbiBidWlsZCBvbmx5IGluIHJlZGVwbG95OmZ1bmN0aW9uLiAqL1xuICB1c2VUaGluRG9ja2VyZmlsZT86IGJvb2xlYW47XG4gIG9jaXJSZXBvc2l0b3J5TmFtZT86IHN0cmluZztcbiAgLyoqIEZ1bmN0aW9uIG1lbW9yeSBpbiBNQiAoMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCwgMzA3MikuIEZyb20gZnVuYy55YW1sIG1lbW9yeSBvciBPQ0lfRlVOQ1RJT05fTUVNT1JZX01CLiAqL1xuICBmdW5jdGlvbk1lbW9yeU1iPzogc3RyaW5nO1xuICAvKiogRnVuY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzICgx4oCTMzAwKS4gRnJvbSBmdW5jLnlhbWwgdGltZW91dCBvciBPQ0lfRlVOQ1RJT05fVElNRU9VVF9TRUNPTkRTLiAqL1xuICBmdW5jdGlvblRpbWVvdXRTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogRnVuY3Rpb24gY29uZmlnL2VudiBrZXktdmFsdWUuIEZyb20gZnVuYy55YW1sIGNvbmZpZyBvciBPQ0lfRlVOQ1RJT05fQ09ORklHIChKU09OIG9iamVjdCBzdHJpbmcpLiAqL1xuICBmdW5jdGlvbkNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBQYXRoIHRvIEFQSSBHYXRld2F5IGRlcGxveW1lbnQgc3BlYyBKU09OIChyb3V0ZXMpLiBVc2UgT0NJX0FQSUdBVEVXQVlfREVQTE9ZTUVOVF9KU09OIG9yIGRlZmF1bHQgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uIGluIHByb2plY3Qgcm9vdC4gKi9cbiAgYXBpR3dEZXBsb3ltZW50SnNvblBhdGg/OiBzdHJpbmc7XG4gIGJhY2tlbmQ/OiBPY2lCYWNrZW5kQ29uZmlnO1xufVxuXG5jb25zdCBERUZBVUxUX0FQSUdXX0RFUExPWU1FTlRfSlNPTiA9IEpTT04uc3RyaW5naWZ5KFxuICB7XG4gICAgcm91dGVzOiBbXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICcve3BhdGgqfScsXG4gICAgICAgIG1ldGhvZHM6IFsnR0VUJywgJ1BPU1QnLCAnT1BUSU9OUyddLFxuICAgICAgICBiYWNrZW5kOiB7XG4gICAgICAgICAgdHlwZTogJ09SQUNMRV9GVU5DVElPTlNfQkFDS0VORCcsXG4gICAgICAgICAgZnVuY3Rpb25JZDogJyR7ZnVuY3Rpb25faWR9JyxcbiAgICAgICAgICByZWFkVGltZW91dEluU2Vjb25kczogMzAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gIG51bGwsXG4gIDJcbik7XG5cbi8qKiBPQ0lSIHNob3J0IHJlZ2lvbiBrZXlzIChlLmcuIGV1LWZyYW5rZnVydC0xIC0+IGZyYSkuIFVzZWQgc28gbG9naW4sIGJ1aWxkLCBwdXNoIGFuZCBmdW5jdGlvbiBpbWFnZSBhbGwgdXNlIHNhbWUgcmVnaXN0cnkgaG9zdC4gKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fVE9fT0NJUl9IT1NUOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnZXUtZnJhbmtmdXJ0LTEnOiAnZnJhJywgJ3VzLXBob2VuaXgtMSc6ICdwaHgnLCAndXMtYXNoYnVybi0xJzogJ2lhZCcsICd1ay1sb25kb24tMSc6ICdsaHInLFxuICAnYXAtdG9reW8tMSc6ICducnQnLCAnYXAtbXVtYmFpLTEnOiAnYm9tJywgJ2FwLXNlb3VsLTEnOiAnaWNuJywgJ2NhLXRvcm9udG8tMSc6ICd5eXonLFxuICAnc2Etc2FvcGF1bG8tMSc6ICdncnUnLCAnYXAtc3lkbmV5LTEnOiAnc3lkJywgJ2V1LXp1cmljaC0xJzogJ3pyaCcsICdtZS1kdWJhaS0xJzogJ2R4YicsXG4gICdhcC1vc2FrYS0xJzogJ2tpeCcsICdldS1hbXN0ZXJkYW0tMSc6ICdhbXMnLCAnYXAtc2luZ2Fwb3JlLTEnOiAnc2luJywgJ2FwLWh5ZGVyYWJhZC0xJzogJ2h5ZCcsXG4gICdldS1taWxhbi0xJzogJ214cCcsICdzYS1zYW50aWFnby0xJzogJ3NjbCcsICdhcC1tZWxib3VybmUtMSc6ICdtZWwnLCAnZXUtc3RvY2tob2xtLTEnOiAnYXJuJyxcbiAgJ21lLWplZGRhaC0xJzogJ2plZCcsICdhZi1qb2hhbm5lc2J1cmctMSc6ICdqbmInLCAnaWwtamVydXNhbGVtLTEnOiAndGx2JywgJ214LXF1ZXJldGFyby0xJzogJ3FybycsXG4gICdldS1tYXJzZWlsbGUtMSc6ICdtcnMnLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9jaXJIb3N0S2V5KHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFJFR0lPTl9UT19PQ0lSX0hPU1RbcmVnaW9uXSA/PyByZWdpb247XG59XG5cbi8qKiBGdWxsIE9DSVIgaW1hZ2UgVVJMIGZvciB0aGUgZnVuY3Rpb24gKHJlZ2lzdHJ5L25hbWVzcGFjZS9yZXBvOnRhZykuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2NpSW1hZ2VVcmwoY29uZmlnOiBPY2lDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCByZWdpc3RyeSA9IGAke29jaXJIb3N0S2V5KGNvbmZpZy5yZWdpb24pfS5vY2lyLmlvYDtcbiAgY29uc3QgcmVwbyA9IGNvbmZpZy5vY2lyUmVwb3NpdG9yeU5hbWUgfHwgY29uZmlnLmZ1bmN0aW9uTmFtZSB8fCAnb2NpLWZ1bmN0aW9uJztcbiAgY29uc3QgdGFnID0gY29uZmlnLmltYWdlVGFnIHx8ICdsYXRlc3QnO1xuICByZXR1cm4gYCR7cmVnaXN0cnl9LyR7Y29uZmlnLm5hbWVzcGFjZX0vJHtyZXBvfToke3RhZ31gO1xufVxuXG4vKipcbiAqIFRyeSB0byByZWFkIGZ1bmN0aW9uIG5hbWUgZnJvbSBmdW5jLnlhbWwgKE9DSSBGdW5jdGlvbnMgZm9ybWF0KS5cbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBcIm5hbWU6XCIgbGluZSwgdHJpbW1lZC5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxOYW1lKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccypuYW1lOlxccypbXCInXT8oW15cIidcXHNcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAobSkgcmV0dXJuIG1bMV0udHJpbSgpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBjbWQvaGFuZGxlciBmcm9tIGZ1bmMueWFtbCAoT0NJL0ZuIGZvcm1hdCkuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBcImNtZDpcIiBvciBcImhhbmRsZXI6XCIgbGluZSwgdHJpbW1lZDsgdXNlZCBhcyBEb2NrZXIgQ01EIGZvciBKYXZhIEZESy5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxIYW5kbGVyKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBjbWRNYXRjaCA9IGNvbnRlbnQubWF0Y2goL15cXHMqY21kOlxccypbXCInXT8oW15cIidcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAoY21kTWF0Y2gpIHJldHVybiBjbWRNYXRjaFsxXS50cmltKCk7XG4gICAgICBjb25zdCBoYW5kbGVyTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eXFxzKmhhbmRsZXI6XFxzKltcIiddPyhbXlwiJ1xcbl0rKVtcIiddPy9tKTtcbiAgICAgIGlmIChoYW5kbGVyTWF0Y2gpIHJldHVybiBoYW5kbGVyTWF0Y2hbMV0udHJpbSgpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCB2ZXJzaW9uIGZyb20gZnVuYy55YW1sICh1c2VkIGFzIE9DSVIgaW1hZ2UgdGFnKS5cbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBcInZlcnNpb246XCIgbGluZSwgdHJpbW1lZDsgc2FuaXRpemVkIGZvciBEb2NrZXIgdGFnIChhLXpBLVowLTlfLi0pLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbFZlcnNpb24ocHJvamVjdERpcjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnZnVuYy55YW1sJyk7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG0gPSBjb250ZW50Lm1hdGNoKC9eXFxzKnZlcnNpb246XFxzKltcIiddPyhbXlwiJ1xcc1xcbl0rKVtcIiddPy9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IG1bMV0udHJpbSgpO1xuICAgICAgICBjb25zdCBzYW5pdGl6ZWQgPSByYXcucmVwbGFjZSgvW15hLXpBLVowLTlfLi1dL2csICctJykucmVwbGFjZSgvLSsvZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG4gICAgICAgIHJldHVybiBzYW5pdGl6ZWQgfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuY29uc3QgVkFMSURfTUVNT1JZX01CID0gbmV3IFNldChbMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCwgMzA3Ml0pO1xuXG4vKipcbiAqIFRyeSB0byByZWFkIG1lbW9yeSAoTUIpIGZyb20gZnVuYy55YW1sLiBPQ0kgYWxsb3dzIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzIuXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgaWYgcHJlc2VudCBhbmQgdmFsaWQ7IG90aGVyd2lzZSB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sTWVtb3J5KHByb2plY3REaXI6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyptZW1vcnk6XFxzKihcXGQrKVxccyokL20pO1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KG1bMV0sIDEwKTtcbiAgICAgICAgaWYgKFZBTElEX01FTU9SWV9NQi5oYXMobikpIHJldHVybiBuO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCB0aW1lb3V0IChzZWNvbmRzKSBmcm9tIGZ1bmMueWFtbC4gT0NJIG1heCBpcyAzMDAuXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgaWYgcHJlc2VudCBhbmQgaW4gcmFuZ2UgMeKAkzMwMDsgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxUaW1lb3V0KHByb2plY3REaXI6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyp0aW1lb3V0OlxccyooXFxkKylcXHMqJC9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChtWzFdLCAxMCk7XG4gICAgICAgIGlmIChuID49IDEgJiYgbiA8PSAzMDApIHJldHVybiBuO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBjb25maWcgKGtleS12YWx1ZSBlbnYpIGZyb20gZnVuYy55YW1sLiBFeHBlY3RzIGEgdG9wLWxldmVsIFwiY29uZmlnOlwiIGJsb2NrIHdpdGgga2V5OiB2YWx1ZSBsaW5lcy5cbiAqIFJldHVybnMgYSByZWNvcmQgb2Ygc3RyaW5nIGtleXMgYW5kIHN0cmluZyB2YWx1ZXM7IGVtcHR5IGlmIG5vbmUgb3IgcGFyc2UgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sQ29uZmlnKHByb2plY3REaXI6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIGxldCBpbkNvbmZpZyA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbmZpZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWQgPT09ICdjb25maWc6JyB8fCAvXmNvbmZpZ1xccyo6XFxzKiQvLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgICAgaW5Db25maWcgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpbkNvbmZpZykge1xuICAgICAgICBpZiAodHJpbW1lZCAhPT0gJycgJiYgIWxpbmUuc3RhcnRzV2l0aCgnICcpICYmICFsaW5lLnN0YXJ0c1dpdGgoJ1xcdCcpKSBicmVhaztcbiAgICAgICAgY29uc3Qga3YgPSBsaW5lLm1hdGNoKC9eXFxzKyhbYS16QS1aX11bYS16QS1aMC05Xy1dKilcXHMqOlxccyooLiopJC8pO1xuICAgICAgICBpZiAoa3YpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBrdlsxXS50cmltKCk7XG4gICAgICAgICAgbGV0IHZhbCA9IGt2WzJdLnRyaW0oKTtcbiAgICAgICAgICBpZiAoKHZhbC5zdGFydHNXaXRoKCdcIicpICYmIHZhbC5lbmRzV2l0aCgnXCInKSkgfHwgKHZhbC5zdGFydHNXaXRoKFwiJ1wiKSAmJiB2YWwuZW5kc1dpdGgoXCInXCIpKSkge1xuICAgICAgICAgICAgdmFsID0gdmFsLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uZmlnW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykubGVuZ3RoID8gY29uZmlnIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBFbnN1cmUgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uIGV4aXN0cyBpbiBwcm9qZWN0RGlyOyB3cml0ZSBkZWZhdWx0IGlmIG1pc3NpbmcuIFJldHVybnMgcGF0aC4gKi9cbmZ1bmN0aW9uIGVuc3VyZURlZmF1bHRBcGlHd0RlcGxveW1lbnRKc29uKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ29jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHAsIERFRkFVTFRfQVBJR1dfREVQTE9ZTUVOVF9KU09OLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiBwO1xufVxuXG5jb25zdCBUQUlMX0ZVTkNUSU9OX0xPR1NfU0NSSVBUID0gYCMhL3Vzci9iaW4vZW52IG5vZGVcbi8qKlxuICogVGFpbCBPQ0kgRnVuY3Rpb25zIGV4ZWN1dGlvbiBsb2dzLiBHZW5lcmF0ZWQgYnkgT0NESy5cbiAqIFJ1biBmcm9tIHByb2plY3Qgcm9vdCBhZnRlciBkZXBsb3kuIFJlcXVpcmVzOiBPQ0kgQ0xJLCBPQ0lfQ09NUEFSVE1FTlRfSUQuXG4gKiBMb2cgSURzOiBmcm9tIC5vY2RrLW91dHB1dHMuanNvbiAoY3JlYXRlZCBvbiBkZXBsb3kpLCBvciBwYXNzIGZvciB0ZXN0aW5nOlxuICogICBPQ0lfTE9HX0dST1VQX0lEPW9jaWQxLi4uIE9DSV9FWEVDVVRJT05fTE9HX0lEPW9jaWQxLi4uIG5vZGUgdGFpbC1mdW5jdGlvbi1sb2dzLmpzXG4gKi9cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCB7IHNwYXduU3luYyB9ID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpO1xuXG5jb25zdCBkaXIgPSBwcm9jZXNzLmVudi5PQ0RLX1BST0pFQ1RfRElSIHx8IF9fZGlybmFtZTtcbmNvbnN0IG91dHB1dHNQYXRoID0gcGF0aC5qb2luKGRpciwgJy5vY2RrLW91dHB1dHMuanNvbicpO1xuY29uc3QgY29tcElkID0gcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEIHx8IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9PQ0lEO1xuaWYgKCFjb21wSWQpIHtcbiAgY29uc29sZS5lcnJvcignU2V0IE9DSV9DT01QQVJUTUVOVF9JRCAob3IgT0NJX0NPTVBBUlRNRU5UX09DSUQpLicpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5sZXQgbG9nR3JvdXBJZCA9IChwcm9jZXNzLmVudi5PQ0lfTE9HX0dST1VQX0lEIHx8ICcnKS50cmltKCk7XG5sZXQgZXhlY3V0aW9uTG9nSWQgPSAocHJvY2Vzcy5lbnYuT0NJX0VYRUNVVElPTl9MT0dfSUQgfHwgJycpLnRyaW0oKTtcbmlmICghbG9nR3JvdXBJZCB8fCAhZXhlY3V0aW9uTG9nSWQpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dHNQYXRoKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1J1biBkZXBsb3kgZmlyc3QgdG8gY3JlYXRlIC5vY2RrLW91dHB1dHMuanNvbiwgb3Igc2V0IE9DSV9MT0dfR1JPVVBfSUQgYW5kIE9DSV9FWEVDVVRJT05fTE9HX0lEIGZvciB0ZXN0aW5nLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBsZXQgb3V0O1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhvdXRwdXRzUGF0aCwgJ3V0ZjgnKS5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKS50cmltKCk7XG4gICAgY29uc3QgZmlyc3QgPSByYXcuaW5kZXhPZigneycpO1xuICAgIGNvbnN0IGxhc3QgPSByYXcubGFzdEluZGV4T2YoJ30nKTtcbiAgICBpZiAoZmlyc3QgPT09IC0xIHx8IGxhc3QgPD0gZmlyc3QpIHRocm93IG5ldyBFcnJvcignTm8gSlNPTicpO1xuICAgIG91dCA9IEpTT04ucGFyc2UocmF3LnNsaWNlKGZpcnN0LCBsYXN0ICsgMSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcignSW52YWxpZCBvciBtaXNzaW5nIC5vY2RrLW91dHB1dHMuanNvbi4gUnVuIGRlcGxveSBmaXJzdC4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgZnVuY3Rpb24gZmluZE91dHB1dHMob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICAgIGlmIChvYmoubG9nX2dyb3VwX2lkICE9IG51bGwgfHwgb2JqLmV4ZWN1dGlvbl9sb2dfaWQgIT0gbnVsbCB8fCBvYmoubG9nR3JvdXBJZCAhPSBudWxsIHx8IG9iai5leGVjdXRpb25Mb2dJZCAhPSBudWxsKSByZXR1cm4gb2JqO1xuICAgIGlmIChvYmoub3V0cHV0cyAmJiB0eXBlb2Ygb2JqLm91dHB1dHMgPT09ICdvYmplY3QnKSByZXR1cm4gZmluZE91dHB1dHMob2JqLm91dHB1dHMpIHx8IG9iai5vdXRwdXRzO1xuICAgIGZvciAoY29uc3QgdiBvZiBPYmplY3QudmFsdWVzKG9iaikpIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gZmluZE91dHB1dHModik7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZnVuY3Rpb24gdmFsKG8sIGspIHtcbiAgICBsZXQgdiA9IG9ba107XG4gICAgaWYgKHYgPT0gbnVsbCkgdiA9IG9bay5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgYykgPT4gYy50b1VwcGVyQ2FzZSgpKV07XG4gICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSByZXR1cm4gdi50cmltKCk7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9IG51bGwgJiYgJ3ZhbHVlJyBpbiB2KSByZXR1cm4gU3RyaW5nKHYudmFsdWUpLnRyaW0oKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRCeVN1YnN0cmluZyhvLCBzdWIpIHtcbiAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhvKS5maW5kKGZ1bmN0aW9uKGspIHsgcmV0dXJuIGsudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzdWIpOyB9KTtcbiAgICByZXR1cm4ga2V5ID8gdmFsKG8sIGtleSkgOiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgb3V0cHV0cyA9IGZpbmRPdXRwdXRzKG91dCkgfHwgb3V0O1xuICBsb2dHcm91cElkID0gdmFsKG91dHB1dHMsICdsb2dfZ3JvdXBfaWQnKSB8fCB2YWwob3V0cHV0cywgJ2xvZ0dyb3VwSWQnKSB8fCBmaW5kQnlTdWJzdHJpbmcob3V0cHV0cywgJ2xvZ19ncm91cCcpO1xuICBleGVjdXRpb25Mb2dJZCA9IHZhbChvdXRwdXRzLCAnZXhlY3V0aW9uX2xvZ19pZCcpIHx8IHZhbChvdXRwdXRzLCAnZXhlY3V0aW9uTG9nSWQnKSB8fCBmaW5kQnlTdWJzdHJpbmcob3V0cHV0cywgJ2V4ZWN1dGlvbl9sb2cnKTtcbiAgaWYgKCFsb2dHcm91cElkIHx8ICFleGVjdXRpb25Mb2dJZCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2xvZ19ncm91cF9pZCBvciBleGVjdXRpb25fbG9nX2lkIG1pc3NpbmcgaW4gLm9jZGstb3V0cHV0cy5qc29uJyk7XG4gICAgY29uc29sZS5lcnJvcignVG9wLWxldmVsIGtleXM6ICcgKyBPYmplY3Qua2V5cyhvdXQpLmpvaW4oJywgJykpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ091dHB1dHMga2V5czogJyArIE9iamVjdC5rZXlzKG91dHB1dHMpLmpvaW4oJywgJykpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1NhbXBsZTogJyArIEpTT04uc3RyaW5naWZ5KG91dCkuc2xpY2UoMCwgNDAwKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5jb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gMTAgKiA2MCAqIDEwMDApO1xuY29uc3QgdGltZVN0YXJ0ID0gc3RhcnQudG9JU09TdHJpbmcoKTtcbmNvbnN0IHRpbWVFbmQgPSBub3cudG9JU09TdHJpbmcoKTtcbmNvbnN0IHNjb3BlID0gY29tcElkICsgJy8nICsgbG9nR3JvdXBJZCArICcvJyArIGV4ZWN1dGlvbkxvZ0lkO1xuY29uc3QgcXVlcnkgPSAnc2VhcmNoIFwiJyArIHNjb3BlICsgJ1wiIHwgc29ydCBieSBkYXRldGltZSBkZXNjIHwgbGltaXQgNTAnO1xuY29uc3QgciA9IHNwYXduU3luYygnb2NpJywgWydsb2dnaW5nLXNlYXJjaCcsICdzZWFyY2gtbG9ncycsICctLXNlYXJjaC1xdWVyeScsIHF1ZXJ5LCAnLS10aW1lLXN0YXJ0JywgdGltZVN0YXJ0LCAnLS10aW1lLWVuZCcsIHRpbWVFbmRdLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG5wcm9jZXNzLmV4aXQoci5zdGF0dXMgPz8gMSk7XG5gO1xuXG4vKiogRW5zdXJlIHRhaWwtZnVuY3Rpb24tbG9ncy5qcyBleGlzdHMgaW4gcHJvamVjdERpcjsgcmVtb3ZlIGxlZ2FjeSBzY3JpcHRzIGFuZCB3cml0ZSBmcmVzaCBmaWxlLiBSZXR1cm5zIHBhdGguICovXG5mdW5jdGlvbiBlbnN1cmVUYWlsRnVuY3Rpb25Mb2dzU2NyaXB0KHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3RhaWwtZnVuY3Rpb24tbG9ncy5qcycpO1xuICBjb25zdCBzaCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAndGFpbC1mdW5jdGlvbi1sb2dzLnNoJyk7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoc2gpKSB7XG4gICAgICBmcy51bmxpbmtTeW5jKHNoKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZSBjbGVhbnVwIGVycm9yc1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmMocCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgfVxuICBmcy53cml0ZUZpbGVTeW5jKHAsIFRBSUxfRlVOQ1RJT05fTE9HU19TQ1JJUFQsICd1dGY4Jyk7XG4gIHJldHVybiBwO1xufVxuXG4vKiogUmVhZCB0ZW5hbmN5IGFuZCByZWdpb24gZnJvbSBPQ0kgQ0xJIGNvbmZpZy4gRGVmYXVsdCBmaWxlOiB+Ly5vY2kvY29uZmlnLCBkZWZhdWx0IHByb2ZpbGU6IERFRkFVTFQuICovXG5mdW5jdGlvbiByZWFkVGVuYW5jeUFuZFJlZ2lvbkZyb21DbGlDb25maWcoKTogeyB0ZW5hbmN5Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfSB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5PQ0lfQ09ORklHX0ZJTEUgfHwgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5vY2knLCAnY29uZmlnJyk7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5PQ0lfQ0xJX1BST0ZJTEUgfHwgJ0RFRkFVTFQnO1xuICB0cnkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkgcmV0dXJuIHt9O1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgbGV0IGluUHJvZmlsZSA9IGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdDogeyB0ZW5hbmN5Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnWycpICYmIHRyaW1tZWQuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICBpblByb2ZpbGUgPSB0cmltbWVkLnNsaWNlKDEsIC0xKSA9PT0gcHJvZmlsZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWluUHJvZmlsZSkgY29udGludWU7XG4gICAgICBjb25zdCBlcSA9IHRyaW1tZWQuaW5kZXhPZignPScpO1xuICAgICAgaWYgKGVxIDw9IDApIGNvbnRpbnVlO1xuICAgICAgY29uc3Qga2V5ID0gdHJpbW1lZC5zbGljZSgwLCBlcSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRyaW1tZWQuc2xpY2UoZXEgKyAxKS50cmltKCk7XG4gICAgICBpZiAoa2V5ID09PSAndGVuYW5jeScpIHJlc3VsdC50ZW5hbmN5ID0gdmFsdWU7XG4gICAgICBpZiAoa2V5ID09PSAncmVnaW9uJykgcmVzdWx0LnJlZ2lvbiA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqIEdldCBvYmplY3Qgc3RvcmFnZSBuYW1lc3BhY2UgdmlhIE9DSSBTREsgKHNhbWUgYXMgXCJvY2kgb3MgbnMgZ2V0XCIpLiBVc2VzIH4vLm9jaS9jb25maWcsIERFRkFVTFQgcHJvZmlsZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE5hbWVzcGFjZUZyb21PY2lTZGsoY29tcGFydG1lbnRJZDogc3RyaW5nLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5PQ0lfQ09ORklHX0ZJTEUgfHwgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5vY2knLCAnY29uZmlnJyk7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5PQ0lfQ0xJX1BST0ZJTEUgfHwgJ0RFRkFVTFQnO1xuICB0cnkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGNvbW1vbi5Db25maWdGaWxlQXV0aGVudGljYXRpb25EZXRhaWxzUHJvdmlkZXIoY29uZmlnUGF0aCwgcHJvZmlsZSk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IG9iamVjdHN0b3JhZ2UuT2JqZWN0U3RvcmFnZUNsaWVudCh7IGF1dGhlbnRpY2F0aW9uRGV0YWlsc1Byb3ZpZGVyOiBwcm92aWRlciB9KTtcbiAgICBjbGllbnQucmVnaW9uSWQgPSByZWdpb247XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0TmFtZXNwYWNlKHtcbiAgICAgIGNvbXBhcnRtZW50SWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnZhbHVlPy50cmltKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5kIGEgSkFSIHVuZGVyIHRhcmdldC8gKHByZWZlciBvbmUgbWF0Y2hpbmcgbmFtZSwgZWxzZSBmaXJzdCAuamFyKS5cbiAqL1xuZnVuY3Rpb24gZmluZEphckluVGFyZ2V0KHByb2plY3REaXI6IHN0cmluZywgZnVuY3Rpb25OYW1lPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGFyZ2V0RGlyID0gcGF0aC5qb2luKHByb2plY3REaXIsICd0YXJnZXQnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldERpcikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyh0YXJnZXREaXIpO1xuICAgIGNvbnN0IGphcnMgPSBmaWxlcy5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoJy5qYXInKSAmJiAhZi5lbmRzV2l0aCgnLXNvdXJjZXMuamFyJykpO1xuICAgIGlmIChqYXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoZnVuY3Rpb25OYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGphcnMuZmluZCgoaikgPT4gai50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZ1bmN0aW9uTmFtZS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICBpZiAobWF0Y2gpIHJldHVybiBwYXRoLmpvaW4odGFyZ2V0RGlyLCBtYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLmpvaW4odGFyZ2V0RGlyLCBqYXJzWzBdKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogVHJ1ZSBpZiBwcm9qZWN0IGhhcyBwb20ueG1sIGFuZCBzcmMvIChNYXZlbiBzb3VyY2UgbGF5b3V0IGZvciBidWlsZC1mcm9tLXNvdXJjZSBEb2NrZXJmaWxlKS4gKi9cbmZ1bmN0aW9uIGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcG9tID0gcGF0aC5qb2luKHByb2plY3REaXIsICdwb20ueG1sJyk7XG4gIGNvbnN0IHNyYyA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnc3JjJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocG9tKSAmJiBmcy5leGlzdHNTeW5jKHNyYykgJiYgZnMuc3RhdFN5bmMoc3JjKS5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzY292ZXJGcm9tRnVuY1lhbWxBbmRUYXJnZXQoKToge1xuICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZT86IHN0cmluZztcbiAgZG9ja2VyQ29udGV4dFBhdGg/OiBzdHJpbmc7XG4gIGltYWdlVGFnPzogc3RyaW5nO1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICB1c2VUaGluRG9ja2VyZmlsZT86IGJvb2xlYW47XG4gIG1lbW9yeU1iPzogbnVtYmVyO1xuICB0aW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn0ge1xuICBsZXQgcHJvamVjdERpciA9IHByb2Nlc3MuZW52Lk9DREtfUFJPSkVDVF9ESVI/LnRyaW0oKTtcbiAgaWYgKCFwcm9qZWN0RGlyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5vY2RrLXByb2plY3QtZGlyJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgcHJvamVjdERpciA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpLnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfVxuICBpZiAoIXByb2plY3REaXIgJiYgcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkpIHtcbiAgICBjb25zdCBwID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSC50cmltKCkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBwcm9qZWN0RGlyID0gZnMuc3RhdFN5bmMocCkuaXNEaXJlY3RvcnkoKSA/IHAgOiBwYXRoLmRpcm5hbWUocCk7XG4gIH1cbiAgaWYgKCFwcm9qZWN0RGlyKSBwcm9qZWN0RGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgcHJvamVjdERpciA9IHByb2plY3REaXIgPyBwYXRoLnJlc29sdmUocHJvamVjdERpcikgOiAnJztcbiAgaWYgKCFwcm9qZWN0RGlyIHx8ICFmcy5leGlzdHNTeW5jKHByb2plY3REaXIpKSByZXR1cm4ge307XG5cbiAgY29uc3QgbmFtZUZyb21ZYW1sID0gZ2V0RnVuY1lhbWxOYW1lKHByb2plY3REaXIpO1xuICBjb25zdCBqYXJQYXRoID0gZmluZEphckluVGFyZ2V0KHByb2plY3REaXIsIG5hbWVGcm9tWWFtbCB8fCB1bmRlZmluZWQpO1xuICBjb25zdCBoYXNTb3VyY2UgPSBoYXNQb21BbmRTcmMocHJvamVjdERpcik7XG4gIGlmICghamFyUGF0aCAmJiAhaGFzU291cmNlKSByZXR1cm4ge307XG5cbiAgY29uc3QgZnVuY3Rpb25OYW1lID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX05BTUU/LnRyaW0oKSB8fCBuYW1lRnJvbVlhbWwgfHwgcGF0aC5iYXNlbmFtZShwcm9qZWN0RGlyKSB8fCAnb2NpLWZ1bmN0aW9uJztcbiAgY29uc3QgaW1hZ2VUYWcgPSBwcm9jZXNzLmVudi5PQ0lfSU1BR0VfVEFHPy50cmltKCkgfHwgZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXIpO1xuICBjb25zdCBoYW5kbGVyID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0hBTkRMRVI/LnRyaW0oKSB8fCBnZXRGdW5jWWFtbEhhbmRsZXIocHJvamVjdERpcik7XG4gIGNvbnN0IHVzZVRoaW5Eb2NrZXJmaWxlID0gISFqYXJQYXRoO1xuICBjb25zdCBtZW1vcnlNYiA9IGdldEZ1bmNZYW1sTWVtb3J5KHByb2plY3REaXIpO1xuICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IGdldEZ1bmNZYW1sVGltZW91dChwcm9qZWN0RGlyKTtcbiAgY29uc3QgY29uZmlnID0gZ2V0RnVuY1lhbWxDb25maWcocHJvamVjdERpcik7XG5cbiAgcmV0dXJuIHtcbiAgICBmdW5jdGlvbk5hbWUsXG4gICAgZnVuY3Rpb25BcHBOYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fQVBQX05BTUU/LnRyaW0oKSB8fCBmdW5jdGlvbk5hbWUsXG4gICAgZG9ja2VyQ29udGV4dFBhdGg6IHBhdGgucmVzb2x2ZShwcm9qZWN0RGlyKSxcbiAgICBpbWFnZVRhZzogaW1hZ2VUYWcgfHwgdW5kZWZpbmVkLFxuICAgIGhhbmRsZXI6IGhhbmRsZXIgfHwgdW5kZWZpbmVkLFxuICAgIHVzZVRoaW5Eb2NrZXJmaWxlLFxuICAgIG1lbW9yeU1iLFxuICAgIHRpbWVvdXRTZWNvbmRzLFxuICAgIGNvbmZpZyxcbiAgfTtcbn1cblxuY29uc3QgYmFja2VuZFR5cGUgPSAocHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0JBQ0tFTkRfVFlQRSB8fCAnbG9jYWwnKSBhcyAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG5cbmNvbnN0IGJhY2tlbmRDb25maWc6IE9jaUJhY2tlbmRDb25maWcgfCB1bmRlZmluZWQgPSBiYWNrZW5kVHlwZSA9PT0gJ2xvY2FsJ1xuICA/IHVuZGVmaW5lZFxuICA6IGJhY2tlbmRUeXBlID09PSAnb2NpJ1xuICAgID8ge1xuICAgICAgICB0eXBlOiAnb2NpJyxcbiAgICAgICAgYnVja2V0OiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfQlVDS0VUIHx8ICd0Zi1zdGF0ZScsXG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0tFWSB8fCAnZnVuY3Rpb24tc3RhY2svdGVycmFmb3JtLnRmc3RhdGUnLFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICB0eXBlOiAnaHR0cCcsXG4gICAgICAgIGFkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX0FERFJFU1MgfHwgJycsXG4gICAgICAgIHVwZGF0ZU1ldGhvZDogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfVVBEQVRFX01FVEhPRCB8fCAnUFVUJyxcbiAgICAgICAgbG9ja0FkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX0xPQ0tfQUREUkVTUyxcbiAgICAgICAgdW5sb2NrQWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfVU5MT0NLX0FERFJFU1MsXG4gICAgICB9O1xuXG4vKipcbiAqIExvYWQgT0NJIGNvbmZpZyBmcm9tIGVudiBhbmQgQ0xJIGNvbmZpZy4gV2hlbiBPQ0lfTkFNRVNQQUNFIGlzIHVuc2V0LCBmZXRjaGVzIGl0IHZpYSBPQ0kgU0RLIChnZXROYW1lc3BhY2UpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T2NpQ29uZmlnKCk6IFByb21pc2U8T2NpQ29uZmlnPiB7XG4gIGNvbnN0IGNsaUNvbmZpZyA9IHJlYWRUZW5hbmN5QW5kUmVnaW9uRnJvbUNsaUNvbmZpZygpO1xuICBjb25zdCBjb21wYXJ0bWVudElkID0gcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEPy50cmltKCkgfHwgJ29jaWQxLmNvbXBhcnRtZW50Lm9jMS4uYWFhYWFhYS4uLic7XG4gIGNvbnN0IG9jaXJDb21wYXJ0bWVudElkID0gcHJvY2Vzcy5lbnYuT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCBjb21wYXJ0bWVudElkO1xuICBjb25zdCB0ZW5hbmN5SWQgPSBwcm9jZXNzLmVudi5PQ0lfVEVOQU5DWV9JRD8udHJpbSgpIHx8IGNsaUNvbmZpZy50ZW5hbmN5Py50cmltKCkgfHwgJ29jaWQxLnRlbmFuY3kub2MxLi5hYWFhYWFhLi4uJztcbiAgY29uc3QgcmVnaW9uID0gcHJvY2Vzcy5lbnYuT0NJX1JFR0lPTj8udHJpbSgpIHx8IGNsaUNvbmZpZy5yZWdpb24/LnRyaW0oKSB8fCAnZXUtZnJhbmtmdXJ0LTEnO1xuXG4gIGlmICghb2NpckNvbXBhcnRtZW50SWQgfHwgb2NpckNvbXBhcnRtZW50SWQuaW5jbHVkZXMoJ3Jvb3QnKSkge1xuICAgIGNvbnNvbGUud2Fybign4pqg77iPICBXQVJOSU5HOiBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCBub3Qgc2V0IG9yIHNldCB0byByb290IGNvbXBhcnRtZW50LicpO1xuICAgIGNvbnNvbGUud2FybignICAgUGxlYXNlIHNldCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCB0byB5b3VyIGhvbWUgY29tcGFydG1lbnQgT0NJRC4nKTtcbiAgICBjb25zb2xlLndhcm4oJyAgIEV4YW1wbGU6IGV4cG9ydCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRD1cIm9jaWQxLmNvbXBhcnRtZW50Lm9jMS4uYWFhYWFhYS4uLlwiJyk7XG4gIH1cblxuICBsZXQgbmFtZXNwYWNlID0gcHJvY2Vzcy5lbnYuT0NJX05BTUVTUEFDRT8udHJpbSgpO1xuICBpZiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2UgPT09ICd5b3VyLW5hbWVzcGFjZScpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGdldE5hbWVzcGFjZUZyb21PY2lTZGsoY29tcGFydG1lbnRJZCwgcmVnaW9uKTtcbiAgICBpZiAocmVzb2x2ZWQpIG5hbWVzcGFjZSA9IHJlc29sdmVkO1xuICAgIGVsc2UgaWYgKCFuYW1lc3BhY2UpIG5hbWVzcGFjZSA9ICd5b3VyLW5hbWVzcGFjZSc7XG4gICAgaWYgKG5hbWVzcGFjZSA9PT0gJ3lvdXItbmFtZXNwYWNlJykge1xuICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gIE9DSV9OQU1FU1BBQ0Ugbm90IHNldCBhbmQgU0RLIGNvdWxkIG5vdCByZXNvbHZlIGl0LiBTZXQgT0NJX05BTUVTUEFDRSBvciBydW4gXCJvY2kgc2V0dXAgY29uZmlnXCIuJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGlzY292ZXJlZCA9IGRpc2NvdmVyRnJvbUZ1bmNZYW1sQW5kVGFyZ2V0KCk7XG5cbiAgY29uc3QgaW1hZ2VUYWcgPSBwcm9jZXNzLmVudi5PQ0lfSU1BR0VfVEFHPy50cmltKCkgfHwgZGlzY292ZXJlZC5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcblxuICBsZXQgZG9ja2VyQ29udGV4dFBhdGggPSBkaXNjb3ZlcmVkLmRvY2tlckNvbnRleHRQYXRoO1xuICBpZiAoIWRvY2tlckNvbnRleHRQYXRoICYmIHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpKSB7XG4gICAgY29uc3QgcCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEgudHJpbSgpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgZG9ja2VyQ29udGV4dFBhdGggPSBmcy5zdGF0U3luYyhwKS5pc0RpcmVjdG9yeSgpID8gcCA6IHBhdGguZGlybmFtZShwKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZXIgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSEFORExFUj8udHJpbSgpIHx8IGRpc2NvdmVyZWQuaGFuZGxlcjtcbiAgY29uc3QgdXNlVGhpbkRvY2tlcmZpbGUgPSBkaXNjb3ZlcmVkLnVzZVRoaW5Eb2NrZXJmaWxlID8/IGZhbHNlO1xuXG4gIGNvbnN0IG1lbW9yeUVudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9NRU1PUllfTUI/LnRyaW0oKTtcbiAgY29uc3QgZnVuY3Rpb25NZW1vcnlNYiA9IG1lbW9yeUVudlxuICAgID8gU3RyaW5nKHBhcnNlSW50KG1lbW9yeUVudiwgMTApKVxuICAgIDogKGRpc2NvdmVyZWQubWVtb3J5TWIgIT0gbnVsbCA/IFN0cmluZyhkaXNjb3ZlcmVkLm1lbW9yeU1iKSA6IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdGltZW91dEVudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFM/LnRyaW0oKTtcbiAgY29uc3QgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA9IHRpbWVvdXRFbnZcbiAgICA/IHBhcnNlSW50KHRpbWVvdXRFbnYsIDEwKVxuICAgIDogZGlzY292ZXJlZC50aW1lb3V0U2Vjb25kcztcblxuICBsZXQgZnVuY3Rpb25Db25maWcgPSBkaXNjb3ZlcmVkLmNvbmZpZztcbiAgY29uc3QgY29uZmlnRW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0NPTkZJRz8udHJpbSgpO1xuICBpZiAoY29uZmlnRW52KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29uZmlnRW52KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgZnVuY3Rpb25Db25maWcgPSB7IC4uLmZ1bmN0aW9uQ29uZmlnLCAuLi5wYXJzZWQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIEpTT05cbiAgICB9XG4gIH1cbiAgaWYgKGZ1bmN0aW9uQ29uZmlnICYmIE9iamVjdC5rZXlzKGZ1bmN0aW9uQ29uZmlnKS5sZW5ndGggPT09IDApIGZ1bmN0aW9uQ29uZmlnID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFwaUd3RGVwbG95bWVudEpzb25FbnYgPSBwcm9jZXNzLmVudi5PQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04/LnRyaW0oKTtcbiAgY29uc3QgYXBpR3dEZXBsb3ltZW50SnNvblBhdGggPSBhcGlHd0RlcGxveW1lbnRKc29uRW52XG4gICAgPyBwYXRoLnJlc29sdmUoYXBpR3dEZXBsb3ltZW50SnNvbkVudilcbiAgICA6IGRvY2tlckNvbnRleHRQYXRoXG4gICAgICA/IGVuc3VyZURlZmF1bHRBcGlHd0RlcGxveW1lbnRKc29uKGRvY2tlckNvbnRleHRQYXRoKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChkb2NrZXJDb250ZXh0UGF0aCkge1xuICAgIGVuc3VyZVRhaWxGdW5jdGlvbkxvZ3NTY3JpcHQoZG9ja2VyQ29udGV4dFBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wYXJ0bWVudElkLFxuICAgIG9jaXJDb21wYXJ0bWVudElkOiBvY2lyQ29tcGFydG1lbnRJZCB8fCB1bmRlZmluZWQsXG4gICAgdGVuYW5jeUlkLFxuICAgIHJlZ2lvbixcbiAgICBuYW1lc3BhY2UsXG4gICAgZnVuY3Rpb25BcHBOYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fQVBQX05BTUUgPz8gZGlzY292ZXJlZC5mdW5jdGlvbkFwcE5hbWUgPz8gJycsXG4gICAgZnVuY3Rpb25OYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fTkFNRSA/PyBkaXNjb3ZlcmVkLmZ1bmN0aW9uTmFtZSA/PyAnJyxcbiAgICBmdW5jdGlvbkphclBhdGg6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpIHx8IHVuZGVmaW5lZCxcbiAgICBkb2NrZXJDb250ZXh0UGF0aDogZG9ja2VyQ29udGV4dFBhdGggfHwgdW5kZWZpbmVkLFxuICAgIGltYWdlVGFnLFxuICAgIGhhbmRsZXI6IGhhbmRsZXIgfHwgdW5kZWZpbmVkLFxuICAgIHVzZVRoaW5Eb2NrZXJmaWxlLFxuICAgIG9jaXJSZXBvc2l0b3J5TmFtZTogcHJvY2Vzcy5lbnYuT0NJX09DSVJfUkVQT1NJVE9SWV9OQU1FIHx8IHVuZGVmaW5lZCxcbiAgICBmdW5jdGlvbk1lbW9yeU1iOiBmdW5jdGlvbk1lbW9yeU1iIHx8IHVuZGVmaW5lZCxcbiAgICBmdW5jdGlvblRpbWVvdXRTZWNvbmRzOiBmdW5jdGlvblRpbWVvdXRTZWNvbmRzID8/IHVuZGVmaW5lZCxcbiAgICBmdW5jdGlvbkNvbmZpZyxcbiAgICBhcGlHd0RlcGxveW1lbnRKc29uUGF0aDogYXBpR3dEZXBsb3ltZW50SnNvblBhdGggfHwgdW5kZWZpbmVkLFxuICAgIGJhY2tlbmQ6IGJhY2tlbmRDb25maWcsXG4gIH07XG59XG4iXX0=
604
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbmZpZy9vY2ktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkVILGtDQUVDO0FBR0Qsd0NBS0M7QUErWkQsb0NBd0ZDO0FBNWtCRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixtREFBcUM7QUFDckMsaUVBQW1EO0FBMENuRCxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQ2xEO0lBQ0UsTUFBTSxFQUFFO1FBQ047WUFDRSxJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUNuQyxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsVUFBVSxFQUFFLGdCQUFnQjtnQkFDNUIsb0JBQW9CLEVBQUUsRUFBRTthQUN6QjtTQUNGO0tBQ0Y7Q0FDRixFQUNELElBQUksRUFDSixDQUFDLENBQ0YsQ0FBQztBQUVGLHFJQUFxSTtBQUN4SCxRQUFBLG1CQUFtQixHQUEyQjtJQUN6RCxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLO0lBQzNGLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLO0lBQ3JGLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLO0lBQ3ZGLFlBQVksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixF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QixFQUFFLHNCQUFzQixJQUFJLFNBQVM7UUFDM0QsY0FBYztRQUNkLHVCQUF1QixFQUFFLHVCQUF1QixJQUFJLFNBQVM7UUFDN0QsT0FBTyxFQUFFLGFBQWE7S0FDdkIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9DSSBDb25maWd1cmF0aW9uXG4gKlxuICogU2V0IHRoZXNlIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgdXBkYXRlIGRlZmF1bHRzOlxuICogLSBPQ0lfQ09NUEFSVE1FTlRfSURcbiAqIC0gT0NJX1RFTkFOQ1lfSURcbiAqIC0gT0NJX1JFR0lPTlxuICogLSBPQ0lfTkFNRVNQQUNFIChpZiB1bnNldCwgb2J0YWluZWQgdmlhIE9DSSBTREsgZ2V0TmFtZXNwYWNlKVxuICogLSBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCAoZm9yIE9DSVI7IG11c3QgYmUgbm9uLXJvb3QgZm9yIGZ1bGwgc3RhY2spXG4gKiAtIE9DSV9GVU5DVElPTl9BUFBfTkFNRSAoRnVuY3Rpb25zIGFwcGxpY2F0aW9uIG5hbWU7IGRlZmF1bHQgZW1wdHkpXG4gKiAtIE9DSV9GVU5DVElPTl9OQU1FIChGdW5jdGlvbiBuYW1lOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fSEFORExFUiAoSmF2YSBGREsgQ01EIGhhbmRsZXIsIGUuZy4gY29tLmV4YW1wbGUuSGFuZGxlcjo6aGFuZGxlUmVxdWVzdDsgZnJvbSBmdW5jLnlhbWwgY21kL2hhbmRsZXIgaWYgdW5zZXQpXG4gKiAtIE9DSV9GVU5DVElPTl9KQVJfUEFUSCAoUGF0aCB0byBKQVIgb3IgcHJvamVjdCBkaXIgZm9yIGZ1bmN0aW9uIGltYWdlOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fTUVNT1JZX01CIChmdW5jdGlvbiBtZW1vcnkgaW4gTUI7IGZyb20gZnVuYy55YW1sIG1lbW9yeSBpZiB1bnNldClcbiAqIC0gT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUyAoZnVuY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzOyBmcm9tIGZ1bmMueWFtbCB0aW1lb3V0IGlmIHVuc2V0KVxuICogLSBPQ0lfRlVOQ1RJT05fQ09ORklHIChKU09OIG9iamVjdCBzdHJpbmcgZm9yIGZ1bmN0aW9uIGNvbmZpZy9lbnY7IG1lcmdlZCB3aXRoIGZ1bmMueWFtbCBjb25maWcpXG4gKiAtIE9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTiAocGF0aCB0byBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHNwZWMgSlNPTjsgZGVmYXVsdCBwcm9qZWN0IHJvb3Qgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uKVxuICogLSBPQ0RLX1BST0pFQ1RfRElSIChzZXQgYnkgb2NkayBDTEkgdG8gY2FsbGVyIGN3ZDsgdXNlZCB0byBkaXNjb3ZlciBmdW5jLnlhbWwgYW5kIHRhcmdldC8pXG4gKiAtIE9DSV9TVEFURV9CVUNLRVQgKGZvciByZW1vdGUgc3RhdGUpXG4gKiAtIE9DSV9TVEFURV9CQUNLRU5EX1RZUEUgKG9jaXxodHRwfGxvY2FsKVxuICpcbiAqIFdoZW4gT0NES19QUk9KRUNUX0RJUiBpcyBzZXQgKGUuZy4gcnVubmluZyBgbnB4IG9jZGsgZGVwbG95YCBmcm9tIGEgSmF2YSBwcm9qZWN0KSwgY29uZmlnXG4gKiBkaXNjb3ZlcnMgZWl0aGVyIHRhcmdldC8qLmphciBvciBwb20ueG1sK3NyYy8gKGFuZCBvcHRpb25hbGx5IGZ1bmMueWFtbCBuYW1lLCB2ZXJzaW9uLCBjbWQvaGFuZGxlcikuXG4gKiBObyBEb2NrZXJmaWxlIGlzIHJlcXVpcmVk4oCUdGhlIHN0YWNrIGdlbmVyYXRlcyBvbmUgaW4gbG9jYWwtZXhlYyAoZXhjbHVkaW5nIG5vZGVfbW9kdWxlcyB2aWEgLmRvY2tlcmlnbm9yZSksXG4gKiB0aGVuIGJ1aWxkcywgdGFncyAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiksIGFuZCBwdXNoZXMgdG8gT0NJUi5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgY29tbW9uIGZyb20gJ29jaS1jb21tb24nO1xuaW1wb3J0ICogYXMgb2JqZWN0c3RvcmFnZSBmcm9tICdvY2ktb2JqZWN0c3RvcmFnZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2NpQmFja2VuZENvbmZpZyB7XG4gIHR5cGU6ICdvY2knIHwgJ2h0dHAnIHwgJ2xvY2FsJztcbiAgYnVja2V0Pzogc3RyaW5nO1xuICBrZXk/OiBzdHJpbmc7XG4gIGFkZHJlc3M/OiBzdHJpbmc7XG4gIHVwZGF0ZU1ldGhvZD86IHN0cmluZztcbiAgbG9ja0FkZHJlc3M/OiBzdHJpbmc7XG4gIHVubG9ja0FkZHJlc3M/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2NpQ29uZmlnIHtcbiAgY29tcGFydG1lbnRJZDogc3RyaW5nO1xuICBvY2lyQ29tcGFydG1lbnRJZD86IHN0cmluZztcbiAgdGVuYW5jeUlkOiBzdHJpbmc7XG4gIHJlZ2lvbjogc3RyaW5nO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgZnVuY3Rpb25BcHBOYW1lOiBzdHJpbmc7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICAvKiogUGF0aCB0byBKQVIgb3IgRG9ja2VyZmlsZSBjb250ZXh0IGZvciBmdW5jdGlvbiBpbWFnZTsgZW1wdHkgPSBubyBidWlsZC9kZXBsb3kuICovXG4gIGZ1bmN0aW9uSmFyUGF0aD86IHN0cmluZztcbiAgLyoqIFBhdGggdG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGFyZ2V0LyAoZGlzY292ZXJlZDsgRG9ja2VyZmlsZSBpcyBnZW5lcmF0ZWQgaW4gbG9jYWwtZXhlYykuICovXG4gIGRvY2tlckNvbnRleHRQYXRoPzogc3RyaW5nO1xuICAvKiogSW1hZ2UgdGFnIGZvciBPQ0lSIChmcm9tIGZ1bmMueWFtbCB2ZXJzaW9uIG9yIE9DSV9JTUFHRV9UQUc7IGRlZmF1bHQgJ2xhdGVzdCcpLiAqL1xuICBpbWFnZVRhZz86IHN0cmluZztcbiAgLyoqIEphdmEgRkRLIENNRCBoYW5kbGVyIChmcm9tIGZ1bmMueWFtbCBjbWQvaGFuZGxlciBvciBPQ0lfRlVOQ1RJT05fSEFORExFUjsgZGVmYXVsdCBiZWxvdykuICovXG4gIGhhbmRsZXI/OiBzdHJpbmc7XG4gIC8qKiBXaGVuIHRydWUsIGRlcGxveSB1c2VzIGEgdGhpbiBEb2NrZXJmaWxlIChDT1BZIHRhcmdldC8qLmphciBvbmx5KTsgZnVsbCBNYXZlbiBidWlsZCBvbmx5IGluIHJlZGVwbG95OmZ1bmN0aW9uLiAqL1xuICB1c2VUaGluRG9ja2VyZmlsZT86IGJvb2xlYW47XG4gIG9jaXJSZXBvc2l0b3J5TmFtZT86IHN0cmluZztcbiAgLyoqIEZ1bmN0aW9uIG1lbW9yeSBpbiBNQiAoMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCwgMzA3MikuIEZyb20gZnVuYy55YW1sIG1lbW9yeSBvciBPQ0lfRlVOQ1RJT05fTUVNT1JZX01CLiAqL1xuICBmdW5jdGlvbk1lbW9yeU1iPzogc3RyaW5nO1xuICAvKiogRnVuY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzICgx4oCTMzAwKS4gRnJvbSBmdW5jLnlhbWwgdGltZW91dCBvciBPQ0lfRlVOQ1RJT05fVElNRU9VVF9TRUNPTkRTLiAqL1xuICBmdW5jdGlvblRpbWVvdXRTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogRnVuY3Rpb24gY29uZmlnL2VudiBrZXktdmFsdWUuIEZyb20gZnVuYy55YW1sIGNvbmZpZyBvciBPQ0lfRlVOQ1RJT05fQ09ORklHIChKU09OIG9iamVjdCBzdHJpbmcpLiAqL1xuICBmdW5jdGlvbkNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBQYXRoIHRvIEFQSSBHYXRld2F5IGRlcGxveW1lbnQgc3BlYyBKU09OIChyb3V0ZXMpLiBVc2UgT0NJX0FQSUdBVEVXQVlfREVQTE9ZTUVOVF9KU09OIG9yIGRlZmF1bHQgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uIGluIHByb2plY3Qgcm9vdC4gKi9cbiAgYXBpR3dEZXBsb3ltZW50SnNvblBhdGg/OiBzdHJpbmc7XG4gIGJhY2tlbmQ/OiBPY2lCYWNrZW5kQ29uZmlnO1xufVxuXG5jb25zdCBERUZBVUxUX0FQSUdXX0RFUExPWU1FTlRfSlNPTiA9IEpTT04uc3RyaW5naWZ5KFxuICB7XG4gICAgcm91dGVzOiBbXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICcve3BhdGgqfScsXG4gICAgICAgIG1ldGhvZHM6IFsnR0VUJywgJ1BPU1QnLCAnT1BUSU9OUyddLFxuICAgICAgICBiYWNrZW5kOiB7XG4gICAgICAgICAgdHlwZTogJ09SQUNMRV9GVU5DVElPTlNfQkFDS0VORCcsXG4gICAgICAgICAgZnVuY3Rpb25JZDogJyR7ZnVuY3Rpb25faWR9JyxcbiAgICAgICAgICByZWFkVGltZW91dEluU2Vjb25kczogMzAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gIG51bGwsXG4gIDJcbik7XG5cbi8qKiBPQ0lSIHNob3J0IHJlZ2lvbiBrZXlzIChlLmcuIGV1LWZyYW5rZnVydC0xIC0+IGZyYSkuIFVzZWQgc28gbG9naW4sIGJ1aWxkLCBwdXNoIGFuZCBmdW5jdGlvbiBpbWFnZSBhbGwgdXNlIHNhbWUgcmVnaXN0cnkgaG9zdC4gKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fVE9fT0NJUl9IT1NUOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnZXUtZnJhbmtmdXJ0LTEnOiAnZnJhJywgJ3VzLXBob2VuaXgtMSc6ICdwaHgnLCAndXMtYXNoYnVybi0xJzogJ2lhZCcsICd1ay1sb25kb24tMSc6ICdsaHInLFxuICAnYXAtdG9reW8tMSc6ICducnQnLCAnYXAtbXVtYmFpLTEnOiAnYm9tJywgJ2FwLXNlb3VsLTEnOiAnaWNuJywgJ2NhLXRvcm9udG8tMSc6ICd5eXonLFxuICAnc2Etc2FvcGF1bG8tMSc6ICdncnUnLCAnYXAtc3lkbmV5LTEnOiAnc3lkJywgJ2V1LXp1cmljaC0xJzogJ3pyaCcsICdtZS1kdWJhaS0xJzogJ2R4YicsXG4gICdhcC1vc2FrYS0xJzogJ2tpeCcsICdldS1hbXN0ZXJkYW0tMSc6ICdhbXMnLCAnYXAtc2luZ2Fwb3JlLTEnOiAnc2luJywgJ2FwLWh5ZGVyYWJhZC0xJzogJ2h5ZCcsXG4gICdldS1taWxhbi0xJzogJ214cCcsICdzYS1zYW50aWFnby0xJzogJ3NjbCcsICdhcC1tZWxib3VybmUtMSc6ICdtZWwnLCAnZXUtc3RvY2tob2xtLTEnOiAnYXJuJyxcbiAgJ21lLWplZGRhaC0xJzogJ2plZCcsICdhZi1qb2hhbm5lc2J1cmctMSc6ICdqbmInLCAnaWwtamVydXNhbGVtLTEnOiAndGx2JywgJ214LXF1ZXJldGFyby0xJzogJ3FybycsXG4gICdldS1tYXJzZWlsbGUtMSc6ICdtcnMnLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9jaXJIb3N0S2V5KHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFJFR0lPTl9UT19PQ0lSX0hPU1RbcmVnaW9uXSA/PyByZWdpb247XG59XG5cbi8qKiBGdWxsIE9DSVIgaW1hZ2UgVVJMIGZvciB0aGUgZnVuY3Rpb24gKHJlZ2lzdHJ5L25hbWVzcGFjZS9yZXBvOnRhZykuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2NpSW1hZ2VVcmwoY29uZmlnOiBPY2lDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCByZWdpc3RyeSA9IGAke29jaXJIb3N0S2V5KGNvbmZpZy5yZWdpb24pfS5vY2lyLmlvYDtcbiAgY29uc3QgcmVwbyA9IGNvbmZpZy5vY2lyUmVwb3NpdG9yeU5hbWUgfHwgY29uZmlnLmZ1bmN0aW9uTmFtZSB8fCAnb2NpLWZ1bmN0aW9uJztcbiAgY29uc3QgdGFnID0gY29uZmlnLmltYWdlVGFnIHx8ICdsYXRlc3QnO1xuICByZXR1cm4gYCR7cmVnaXN0cnl9LyR7Y29uZmlnLm5hbWVzcGFjZX0vJHtyZXBvfToke3RhZ31gO1xufVxuXG4vKipcbiAqIFRyeSB0byByZWFkIGZ1bmN0aW9uIG5hbWUgZnJvbSBmdW5jLnlhbWwgKE9DSSBGdW5jdGlvbnMgZm9ybWF0KS5cbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBcIm5hbWU6XCIgbGluZSwgdHJpbW1lZC5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxOYW1lKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccypuYW1lOlxccypbXCInXT8oW15cIidcXHNcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAobSkgcmV0dXJuIG1bMV0udHJpbSgpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBjbWQvaGFuZGxlciBmcm9tIGZ1bmMueWFtbCAoT0NJL0ZuIGZvcm1hdCkuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBcImNtZDpcIiBvciBcImhhbmRsZXI6XCIgbGluZSwgdHJpbW1lZDsgdXNlZCBhcyBEb2NrZXIgQ01EIGZvciBKYXZhIEZESy5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxIYW5kbGVyKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBjbWRNYXRjaCA9IGNvbnRlbnQubWF0Y2goL15cXHMqY21kOlxccypbXCInXT8oW15cIidcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAoY21kTWF0Y2gpIHJldHVybiBjbWRNYXRjaFsxXS50cmltKCk7XG4gICAgICBjb25zdCBoYW5kbGVyTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eXFxzKmhhbmRsZXI6XFxzKltcIiddPyhbXlwiJ1xcbl0rKVtcIiddPy9tKTtcbiAgICAgIGlmIChoYW5kbGVyTWF0Y2gpIHJldHVybiBoYW5kbGVyTWF0Y2hbMV0udHJpbSgpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCB2ZXJzaW9uIGZyb20gZnVuYy55YW1sICh1c2VkIGFzIE9DSVIgaW1hZ2UgdGFnKS5cbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBcInZlcnNpb246XCIgbGluZSwgdHJpbW1lZDsgc2FuaXRpemVkIGZvciBEb2NrZXIgdGFnIChhLXpBLVowLTlfLi0pLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbFZlcnNpb24ocHJvamVjdERpcjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnZnVuYy55YW1sJyk7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG0gPSBjb250ZW50Lm1hdGNoKC9eXFxzKnZlcnNpb246XFxzKltcIiddPyhbXlwiJ1xcc1xcbl0rKVtcIiddPy9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IG1bMV0udHJpbSgpO1xuICAgICAgICBjb25zdCBzYW5pdGl6ZWQgPSByYXcucmVwbGFjZSgvW15hLXpBLVowLTlfLi1dL2csICctJykucmVwbGFjZSgvLSsvZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG4gICAgICAgIHJldHVybiBzYW5pdGl6ZWQgfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuY29uc3QgVkFMSURfTUVNT1JZX01CID0gbmV3IFNldChbMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCwgMzA3Ml0pO1xuXG4vKipcbiAqIFRyeSB0byByZWFkIG1lbW9yeSAoTUIpIGZyb20gZnVuYy55YW1sLiBPQ0kgYWxsb3dzIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzIuXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgaWYgcHJlc2VudCBhbmQgdmFsaWQ7IG90aGVyd2lzZSB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sTWVtb3J5KHByb2plY3REaXI6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyptZW1vcnk6XFxzKihcXGQrKVxccyokL20pO1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgY29uc3QgbiA9IHBhcnNlSW50KG1bMV0sIDEwKTtcbiAgICAgICAgaWYgKFZBTElEX01FTU9SWV9NQi5oYXMobikpIHJldHVybiBuO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCB0aW1lb3V0IChzZWNvbmRzKSBmcm9tIGZ1bmMueWFtbC4gT0NJIG1heCBpcyAzMDAuXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgaWYgcHJlc2VudCBhbmQgaW4gcmFuZ2UgMeKAkzMwMDsgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxUaW1lb3V0KHByb2plY3REaXI6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyp0aW1lb3V0OlxccyooXFxkKylcXHMqJC9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChtWzFdLCAxMCk7XG4gICAgICAgIGlmIChuID49IDEgJiYgbiA8PSAzMDApIHJldHVybiBuO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBjb25maWcgKGtleS12YWx1ZSBlbnYpIGZyb20gZnVuYy55YW1sLiBFeHBlY3RzIGEgdG9wLWxldmVsIFwiY29uZmlnOlwiIGJsb2NrIHdpdGgga2V5OiB2YWx1ZSBsaW5lcy5cbiAqIFJldHVybnMgYSByZWNvcmQgb2Ygc3RyaW5nIGtleXMgYW5kIHN0cmluZyB2YWx1ZXM7IGVtcHR5IGlmIG5vbmUgb3IgcGFyc2UgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sQ29uZmlnKHByb2plY3REaXI6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIGxldCBpbkNvbmZpZyA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbmZpZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWQgPT09ICdjb25maWc6JyB8fCAvXmNvbmZpZ1xccyo6XFxzKiQvLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgICAgaW5Db25maWcgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpbkNvbmZpZykge1xuICAgICAgICBpZiAodHJpbW1lZCAhPT0gJycgJiYgIWxpbmUuc3RhcnRzV2l0aCgnICcpICYmICFsaW5lLnN0YXJ0c1dpdGgoJ1xcdCcpKSBicmVhaztcbiAgICAgICAgY29uc3Qga3YgPSBsaW5lLm1hdGNoKC9eXFxzKyhbYS16QS1aX11bYS16QS1aMC05Xy1dKilcXHMqOlxccyooLiopJC8pO1xuICAgICAgICBpZiAoa3YpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBrdlsxXS50cmltKCk7XG4gICAgICAgICAgbGV0IHZhbCA9IGt2WzJdLnRyaW0oKTtcbiAgICAgICAgICBpZiAoKHZhbC5zdGFydHNXaXRoKCdcIicpICYmIHZhbC5lbmRzV2l0aCgnXCInKSkgfHwgKHZhbC5zdGFydHNXaXRoKFwiJ1wiKSAmJiB2YWwuZW5kc1dpdGgoXCInXCIpKSkge1xuICAgICAgICAgICAgdmFsID0gdmFsLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uZmlnW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykubGVuZ3RoID8gY29uZmlnIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBFbnN1cmUgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uIGV4aXN0cyBpbiBwcm9qZWN0RGlyOyB3cml0ZSBkZWZhdWx0IGlmIG1pc3NpbmcuIFJldHVybnMgcGF0aC4gKi9cbmZ1bmN0aW9uIGVuc3VyZURlZmF1bHRBcGlHd0RlcGxveW1lbnRKc29uKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ29jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHAsIERFRkFVTFRfQVBJR1dfREVQTE9ZTUVOVF9KU09OLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiBwO1xufVxuXG5jb25zdCBUQUlMX0ZVTkNUSU9OX0xPR1NfU0NSSVBUID0gYCMhL3Vzci9iaW4vZW52IG5vZGVcbi8qKlxuICogVGFpbCBPQ0kgRnVuY3Rpb25zIGV4ZWN1dGlvbiBsb2dzLiBHZW5lcmF0ZWQgYnkgT0NESy5cbiAqIFJ1biBmcm9tIHByb2plY3Qgcm9vdCBhZnRlciBkZXBsb3kuIFJlcXVpcmVzOiBPQ0kgQ0xJLCBPQ0lfQ09NUEFSVE1FTlRfSUQuXG4gKiBMb2cgSURzOiBmcm9tIC5vY2RrLW91dHB1dHMuanNvbiAoY3JlYXRlZCBvbiBkZXBsb3kpLCBvciBwYXNzIGZvciB0ZXN0aW5nOlxuICogICBPQ0lfTE9HX0dST1VQX0lEPW9jaWQxLi4uIE9DSV9FWEVDVVRJT05fTE9HX0lEPW9jaWQxLi4uIG5vZGUgdGFpbC1mdW5jdGlvbi1sb2dzLmpzXG4gKi9cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCB7IHNwYXduU3luYyB9ID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpO1xuXG5jb25zdCBkaXIgPSBwcm9jZXNzLmVudi5PQ0RLX1BST0pFQ1RfRElSIHx8IF9fZGlybmFtZTtcbmNvbnN0IG91dHB1dHNQYXRoID0gcGF0aC5qb2luKGRpciwgJy5vY2RrLW91dHB1dHMuanNvbicpO1xuY29uc3QgY29tcElkID0gcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEIHx8IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9PQ0lEO1xuaWYgKCFjb21wSWQpIHtcbiAgY29uc29sZS5lcnJvcignU2V0IE9DSV9DT01QQVJUTUVOVF9JRCAob3IgT0NJX0NPTVBBUlRNRU5UX09DSUQpLicpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5sZXQgbG9nR3JvdXBJZCA9IChwcm9jZXNzLmVudi5PQ0lfTE9HX0dST1VQX0lEIHx8ICcnKS50cmltKCk7XG5sZXQgZXhlY3V0aW9uTG9nSWQgPSAocHJvY2Vzcy5lbnYuT0NJX0VYRUNVVElPTl9MT0dfSUQgfHwgJycpLnRyaW0oKTtcbmlmICghbG9nR3JvdXBJZCB8fCAhZXhlY3V0aW9uTG9nSWQpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dHNQYXRoKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1J1biBkZXBsb3kgZmlyc3QgdG8gY3JlYXRlIC5vY2RrLW91dHB1dHMuanNvbiwgb3Igc2V0IE9DSV9MT0dfR1JPVVBfSUQgYW5kIE9DSV9FWEVDVVRJT05fTE9HX0lEIGZvciB0ZXN0aW5nLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBsZXQgb3V0O1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhvdXRwdXRzUGF0aCwgJ3V0ZjgnKS5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKS50cmltKCk7XG4gICAgY29uc3QgZmlyc3QgPSByYXcuaW5kZXhPZigneycpO1xuICAgIGNvbnN0IGxhc3QgPSByYXcubGFzdEluZGV4T2YoJ30nKTtcbiAgICBpZiAoZmlyc3QgPT09IC0xIHx8IGxhc3QgPD0gZmlyc3QpIHRocm93IG5ldyBFcnJvcignTm8gSlNPTicpO1xuICAgIG91dCA9IEpTT04ucGFyc2UocmF3LnNsaWNlKGZpcnN0LCBsYXN0ICsgMSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcignSW52YWxpZCBvciBtaXNzaW5nIC5vY2RrLW91dHB1dHMuanNvbi4gUnVuIGRlcGxveSBmaXJzdC4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgZnVuY3Rpb24gZmluZE91dHB1dHMob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICAgIGlmIChvYmoubG9nX2dyb3VwX2lkICE9IG51bGwgfHwgb2JqLmV4ZWN1dGlvbl9sb2dfaWQgIT0gbnVsbCB8fCBvYmoubG9nR3JvdXBJZCAhPSBudWxsIHx8IG9iai5leGVjdXRpb25Mb2dJZCAhPSBudWxsKSByZXR1cm4gb2JqO1xuICAgIGlmIChvYmoub3V0cHV0cyAmJiB0eXBlb2Ygb2JqLm91dHB1dHMgPT09ICdvYmplY3QnKSByZXR1cm4gZmluZE91dHB1dHMob2JqLm91dHB1dHMpIHx8IG9iai5vdXRwdXRzO1xuICAgIGZvciAoY29uc3QgdiBvZiBPYmplY3QudmFsdWVzKG9iaikpIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gZmluZE91dHB1dHModik7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZnVuY3Rpb24gdmFsKG8sIGspIHtcbiAgICBsZXQgdiA9IG9ba107XG4gICAgaWYgKHYgPT0gbnVsbCkgdiA9IG9bay5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgYykgPT4gYy50b1VwcGVyQ2FzZSgpKV07XG4gICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSByZXR1cm4gdi50cmltKCk7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9IG51bGwgJiYgJ3ZhbHVlJyBpbiB2KSByZXR1cm4gU3RyaW5nKHYudmFsdWUpLnRyaW0oKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRCeVN1YnN0cmluZyhvLCBzdWIpIHtcbiAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhvKS5maW5kKGZ1bmN0aW9uKGspIHsgcmV0dXJuIGsudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzdWIpOyB9KTtcbiAgICByZXR1cm4ga2V5ID8gdmFsKG8sIGtleSkgOiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgb3V0cHV0cyA9IGZpbmRPdXRwdXRzKG91dCkgfHwgb3V0O1xuICBsb2dHcm91cElkID0gdmFsKG91dHB1dHMsICdsb2dfZ3JvdXBfaWQnKSB8fCB2YWwob3V0cHV0cywgJ2xvZ0dyb3VwSWQnKSB8fCBmaW5kQnlTdWJzdHJpbmcob3V0cHV0cywgJ2xvZ19ncm91cCcpO1xuICBleGVjdXRpb25Mb2dJZCA9IHZhbChvdXRwdXRzLCAnZXhlY3V0aW9uX2xvZ19pZCcpIHx8IHZhbChvdXRwdXRzLCAnZXhlY3V0aW9uTG9nSWQnKSB8fCBmaW5kQnlTdWJzdHJpbmcob3V0cHV0cywgJ2V4ZWN1dGlvbl9sb2cnKTtcbiAgaWYgKCFsb2dHcm91cElkIHx8ICFleGVjdXRpb25Mb2dJZCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2xvZ19ncm91cF9pZCBvciBleGVjdXRpb25fbG9nX2lkIG1pc3NpbmcgaW4gLm9jZGstb3V0cHV0cy5qc29uJyk7XG4gICAgY29uc29sZS5lcnJvcignVG9wLWxldmVsIGtleXM6ICcgKyBPYmplY3Qua2V5cyhvdXQpLmpvaW4oJywgJykpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ091dHB1dHMga2V5czogJyArIE9iamVjdC5rZXlzKG91dHB1dHMpLmpvaW4oJywgJykpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1NhbXBsZTogJyArIEpTT04uc3RyaW5naWZ5KG91dCkuc2xpY2UoMCwgNDAwKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5jb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gMTAgKiA2MCAqIDEwMDApO1xuY29uc3QgdGltZVN0YXJ0ID0gc3RhcnQudG9JU09TdHJpbmcoKTtcbmNvbnN0IHRpbWVFbmQgPSBub3cudG9JU09TdHJpbmcoKTtcbmNvbnN0IHNjb3BlID0gY29tcElkICsgJy8nICsgbG9nR3JvdXBJZCArICcvJyArIGV4ZWN1dGlvbkxvZ0lkO1xuY29uc3QgcXVlcnkgPSAnc2VhcmNoIFwiJyArIHNjb3BlICsgJ1wiIHwgc29ydCBieSBkYXRldGltZSBkZXNjIHwgbGltaXQgNTAnO1xuY29uc3QgciA9IHNwYXduU3luYygnb2NpJywgWydsb2dnaW5nLXNlYXJjaCcsICdzZWFyY2gtbG9ncycsICctLXNlYXJjaC1xdWVyeScsIHF1ZXJ5LCAnLS10aW1lLXN0YXJ0JywgdGltZVN0YXJ0LCAnLS10aW1lLWVuZCcsIHRpbWVFbmRdLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG5wcm9jZXNzLmV4aXQoci5zdGF0dXMgPz8gMSk7XG5gO1xuXG4vKiogRW5zdXJlIHRhaWwtZnVuY3Rpb24tbG9ncy5qcyBleGlzdHMgaW4gcHJvamVjdERpcjsgcmVtb3ZlIGxlZ2FjeSBzY3JpcHRzIGFuZCB3cml0ZSBmcmVzaCBmaWxlIGJhc2VkIG9uIHNjcmlwdHMvdGFpbC1mdW5jdGlvbi1sb2cuanMuIFJldHVybnMgcGF0aC4gKi9cbmZ1bmN0aW9uIGVuc3VyZVRhaWxGdW5jdGlvbkxvZ3NTY3JpcHQocHJvamVjdERpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAndGFpbC1mdW5jdGlvbi1sb2dzLmpzJyk7XG4gIGNvbnN0IHNoID0gcGF0aC5qb2luKHByb2plY3REaXIsICd0YWlsLWZ1bmN0aW9uLWxvZ3Muc2gnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzaCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmMoc2gpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlIGNsZWFudXAgZXJyb3JzXG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgZnMudW5saW5rU3luYyhwKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZSBjbGVhbnVwIGVycm9yc1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ3NjcmlwdHMnLCAndGFpbC1mdW5jdGlvbi1sb2cuanMnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHNjcmlwdHMvdGFpbC1mdW5jdGlvbi1sb2cuanMgaW4gb2NkayBwYWNrYWdlJyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCAndXRmOCcpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocCwgY29udGVudCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgd2UgY2Fubm90IHJlYWQgdGhlIHRlbXBsYXRlIGZvciBzb21lIHJlYXNvbiwgbGVhdmUgdGhlIHNjcmlwdCBhYnNlbnQuXG4gIH1cbiAgcmV0dXJuIHA7XG59XG5cbi8qKiBSZWFkIHRlbmFuY3kgYW5kIHJlZ2lvbiBmcm9tIE9DSSBDTEkgY29uZmlnLiBEZWZhdWx0IGZpbGU6IH4vLm9jaS9jb25maWcsIGRlZmF1bHQgcHJvZmlsZTogREVGQVVMVC4gKi9cbmZ1bmN0aW9uIHJlYWRUZW5hbmN5QW5kUmVnaW9uRnJvbUNsaUNvbmZpZygpOiB7IHRlbmFuY3k/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZyB9IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHByb2Nlc3MuZW52Lk9DSV9DT05GSUdfRklMRSB8fCBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm9jaScsICdjb25maWcnKTtcbiAgY29uc3QgcHJvZmlsZSA9IHByb2Nlc3MuZW52Lk9DSV9DTElfUFJPRklMRSB8fCAnREVGQVVMVCc7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSByZXR1cm4ge307XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBsZXQgaW5Qcm9maWxlID0gZmFsc2U7XG4gICAgY29uc3QgcmVzdWx0OiB7IHRlbmFuY3k/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZyB9ID0ge307XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCdbJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXScpKSB7XG4gICAgICAgIGluUHJvZmlsZSA9IHRyaW1tZWQuc2xpY2UoMSwgLTEpID09PSBwcm9maWxlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghaW5Qcm9maWxlKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVxID0gdHJpbW1lZC5pbmRleE9mKCc9Jyk7XG4gICAgICBpZiAoZXEgPD0gMCkgY29udGludWU7XG4gICAgICBjb25zdCBrZXkgPSB0cmltbWVkLnNsaWNlKDAsIGVxKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdHJpbW1lZC5zbGljZShlcSArIDEpLnRyaW0oKTtcbiAgICAgIGlmIChrZXkgPT09ICd0ZW5hbmN5JykgcmVzdWx0LnRlbmFuY3kgPSB2YWx1ZTtcbiAgICAgIGlmIChrZXkgPT09ICdyZWdpb24nKSByZXN1bHQucmVnaW9uID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKiogR2V0IG9iamVjdCBzdG9yYWdlIG5hbWVzcGFjZSB2aWEgT0NJIFNESyAoc2FtZSBhcyBcIm9jaSBvcyBucyBnZXRcIikuIFVzZXMgfi8ub2NpL2NvbmZpZywgREVGQVVMVCBwcm9maWxlLiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlRnJvbU9jaVNkayhjb21wYXJ0bWVudElkOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHByb2Nlc3MuZW52Lk9DSV9DT05GSUdfRklMRSB8fCBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm9jaScsICdjb25maWcnKTtcbiAgY29uc3QgcHJvZmlsZSA9IHByb2Nlc3MuZW52Lk9DSV9DTElfUFJPRklMRSB8fCAnREVGQVVMVCc7XG4gIHRyeSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgY29tbW9uLkNvbmZpZ0ZpbGVBdXRoZW50aWNhdGlvbkRldGFpbHNQcm92aWRlcihjb25maWdQYXRoLCBwcm9maWxlKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgb2JqZWN0c3RvcmFnZS5PYmplY3RTdG9yYWdlQ2xpZW50KHsgYXV0aGVudGljYXRpb25EZXRhaWxzUHJvdmlkZXI6IHByb3ZpZGVyIH0pO1xuICAgIGNsaWVudC5yZWdpb25JZCA9IHJlZ2lvbjtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXROYW1lc3BhY2Uoe1xuICAgICAgY29tcGFydG1lbnRJZCxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UudmFsdWU/LnRyaW0oKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEZpbmQgYSBKQVIgdW5kZXIgdGFyZ2V0LyAocHJlZmVyIG9uZSBtYXRjaGluZyBuYW1lLCBlbHNlIGZpcnN0IC5qYXIpLlxuICovXG5mdW5jdGlvbiBmaW5kSmFySW5UYXJnZXQocHJvamVjdERpcjogc3RyaW5nLCBmdW5jdGlvbk5hbWU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YXJnZXREaXIgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3RhcmdldCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0RGlyKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRhcmdldERpcik7XG4gICAgY29uc3QgamFycyA9IGZpbGVzLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aCgnLmphcicpICYmICFmLmVuZHNXaXRoKCctc291cmNlcy5qYXInKSk7XG4gICAgaWYgKGphcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChmdW5jdGlvbk5hbWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gamFycy5maW5kKChqKSA9PiBqLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZnVuY3Rpb25OYW1lLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgIGlmIChtYXRjaCkgcmV0dXJuIHBhdGguam9pbih0YXJnZXREaXIsIG1hdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbih0YXJnZXREaXIsIGphcnNbMF0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBUcnVlIGlmIHByb2plY3QgaGFzIHBvbS54bWwgYW5kIHNyYy8gKE1hdmVuIHNvdXJjZSBsYXlvdXQgZm9yIGJ1aWxkLWZyb20tc291cmNlIERvY2tlcmZpbGUpLiAqL1xuZnVuY3Rpb24gaGFzUG9tQW5kU3JjKHByb2plY3REaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwb20gPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3BvbS54bWwnKTtcbiAgY29uc3Qgc3JjID0gcGF0aC5qb2luKHByb2plY3REaXIsICdzcmMnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwb20pICYmIGZzLmV4aXN0c1N5bmMoc3JjKSAmJiBmcy5zdGF0U3luYyhzcmMpLmlzRGlyZWN0b3J5KCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNjb3ZlckZyb21GdW5jWWFtbEFuZFRhcmdldCgpOiB7XG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgZnVuY3Rpb25BcHBOYW1lPzogc3RyaW5nO1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIGhhbmRsZXI/OiBzdHJpbmc7XG4gIHVzZVRoaW5Eb2NrZXJmaWxlPzogYm9vbGVhbjtcbiAgbWVtb3J5TWI/OiBudW1iZXI7XG4gIHRpbWVvdXRTZWNvbmRzPzogbnVtYmVyO1xuICBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufSB7XG4gIGxldCBwcm9qZWN0RGlyID0gcHJvY2Vzcy5lbnYuT0NES19QUk9KRUNUX0RJUj8udHJpbSgpO1xuICBpZiAoIXByb2plY3REaXIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLm9jZGstcHJvamVjdC1kaXInKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBwcm9qZWN0RGlyID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4JykudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9XG4gIGlmICghcHJvamVjdERpciAmJiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEg/LnRyaW0oKSkge1xuICAgIGNvbnN0IHAgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRILnRyaW0oKSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHByb2plY3REaXIgPSBmcy5zdGF0U3luYyhwKS5pc0RpcmVjdG9yeSgpID8gcCA6IHBhdGguZGlybmFtZShwKTtcbiAgfVxuICBpZiAoIXByb2plY3REaXIpIHByb2plY3REaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICBwcm9qZWN0RGlyID0gcHJvamVjdERpciA/IHBhdGgucmVzb2x2ZShwcm9qZWN0RGlyKSA6ICcnO1xuICBpZiAoIXByb2plY3REaXIgfHwgIWZzLmV4aXN0c1N5bmMocHJvamVjdERpcikpIHJldHVybiB7fTtcblxuICBjb25zdCBuYW1lRnJvbVlhbWwgPSBnZXRGdW5jWWFtbE5hbWUocHJvamVjdERpcik7XG4gIGNvbnN0IGphclBhdGggPSBmaW5kSmFySW5UYXJnZXQocHJvamVjdERpciwgbmFtZUZyb21ZYW1sIHx8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGhhc1NvdXJjZSA9IGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyKTtcbiAgaWYgKCFqYXJQYXRoICYmICFoYXNTb3VyY2UpIHJldHVybiB7fTtcblxuICBjb25zdCBmdW5jdGlvbk5hbWUgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fTkFNRT8udHJpbSgpIHx8IG5hbWVGcm9tWWFtbCB8fCBwYXRoLmJhc2VuYW1lKHByb2plY3REaXIpIHx8ICdvY2ktZnVuY3Rpb24nO1xuICBjb25zdCBpbWFnZVRhZyA9IHByb2Nlc3MuZW52Lk9DSV9JTUFHRV9UQUc/LnRyaW0oKSB8fCBnZXRGdW5jWWFtbFZlcnNpb24ocHJvamVjdERpcik7XG4gIGNvbnN0IGhhbmRsZXIgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSEFORExFUj8udHJpbSgpIHx8IGdldEZ1bmNZYW1sSGFuZGxlcihwcm9qZWN0RGlyKTtcbiAgY29uc3QgdXNlVGhpbkRvY2tlcmZpbGUgPSAhIWphclBhdGg7XG4gIGNvbnN0IG1lbW9yeU1iID0gZ2V0RnVuY1lhbWxNZW1vcnkocHJvamVjdERpcik7XG4gIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gZ2V0RnVuY1lhbWxUaW1lb3V0KHByb2plY3REaXIpO1xuICBjb25zdCBjb25maWcgPSBnZXRGdW5jWWFtbENvbmZpZyhwcm9qZWN0RGlyKTtcblxuICByZXR1cm4ge1xuICAgIGZ1bmN0aW9uTmFtZSxcbiAgICBmdW5jdGlvbkFwcE5hbWU6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9BUFBfTkFNRT8udHJpbSgpIHx8IGZ1bmN0aW9uTmFtZSxcbiAgICBkb2NrZXJDb250ZXh0UGF0aDogcGF0aC5yZXNvbHZlKHByb2plY3REaXIpLFxuICAgIGltYWdlVGFnOiBpbWFnZVRhZyB8fCB1bmRlZmluZWQsXG4gICAgaGFuZGxlcjogaGFuZGxlciB8fCB1bmRlZmluZWQsXG4gICAgdXNlVGhpbkRvY2tlcmZpbGUsXG4gICAgbWVtb3J5TWIsXG4gICAgdGltZW91dFNlY29uZHMsXG4gICAgY29uZmlnLFxuICB9O1xufVxuXG5jb25zdCBiYWNrZW5kVHlwZSA9IChwcm9jZXNzLmVudi5PQ0lfU1RBVEVfQkFDS0VORF9UWVBFIHx8ICdsb2NhbCcpIGFzICdvY2knIHwgJ2h0dHAnIHwgJ2xvY2FsJztcblxuY29uc3QgYmFja2VuZENvbmZpZzogT2NpQmFja2VuZENvbmZpZyB8IHVuZGVmaW5lZCA9IGJhY2tlbmRUeXBlID09PSAnbG9jYWwnXG4gID8gdW5kZWZpbmVkXG4gIDogYmFja2VuZFR5cGUgPT09ICdvY2knXG4gICAgPyB7XG4gICAgICAgIHR5cGU6ICdvY2knLFxuICAgICAgICBidWNrZXQ6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9CVUNLRVQgfHwgJ3RmLXN0YXRlJyxcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfS0VZIHx8ICdmdW5jdGlvbi1zdGFjay90ZXJyYWZvcm0udGZzdGF0ZScsXG4gICAgICB9XG4gICAgOiB7XG4gICAgICAgIHR5cGU6ICdodHRwJyxcbiAgICAgICAgYWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfQUREUkVTUyB8fCAnJyxcbiAgICAgICAgdXBkYXRlTWV0aG9kOiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfSFRUUF9VUERBVEVfTUVUSE9EIHx8ICdQVVQnLFxuICAgICAgICBsb2NrQWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfTE9DS19BRERSRVNTLFxuICAgICAgICB1bmxvY2tBZGRyZXNzOiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfSFRUUF9VTkxPQ0tfQUREUkVTUyxcbiAgICAgIH07XG5cbi8qKlxuICogTG9hZCBPQ0kgY29uZmlnIGZyb20gZW52IGFuZCBDTEkgY29uZmlnLiBXaGVuIE9DSV9OQU1FU1BBQ0UgaXMgdW5zZXQsIGZldGNoZXMgaXQgdmlhIE9DSSBTREsgKGdldE5hbWVzcGFjZSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPY2lDb25maWcoKTogUHJvbWlzZTxPY2lDb25maWc+IHtcbiAgY29uc3QgY2xpQ29uZmlnID0gcmVhZFRlbmFuY3lBbmRSZWdpb25Gcm9tQ2xpQ29uZmlnKCk7XG4gIGNvbnN0IGNvbXBhcnRtZW50SWQgPSBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCAnb2NpZDEuY29tcGFydG1lbnQub2MxLi5hYWFhYWFhLi4uJztcbiAgY29uc3Qgb2NpckNvbXBhcnRtZW50SWQgPSBwcm9jZXNzLmVudi5PQ0lfT0NJUl9DT01QQVJUTUVOVF9JRD8udHJpbSgpIHx8IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9JRD8udHJpbSgpIHx8IGNvbXBhcnRtZW50SWQ7XG4gIGNvbnN0IHRlbmFuY3lJZCA9IHByb2Nlc3MuZW52Lk9DSV9URU5BTkNZX0lEPy50cmltKCkgfHwgY2xpQ29uZmlnLnRlbmFuY3k/LnRyaW0oKSB8fCAnb2NpZDEudGVuYW5jeS5vYzEuLmFhYWFhYWEuLi4nO1xuICBjb25zdCByZWdpb24gPSBwcm9jZXNzLmVudi5PQ0lfUkVHSU9OPy50cmltKCkgfHwgY2xpQ29uZmlnLnJlZ2lvbj8udHJpbSgpIHx8ICdldS1mcmFua2Z1cnQtMSc7XG5cbiAgaWYgKCFvY2lyQ29tcGFydG1lbnRJZCB8fCBvY2lyQ29tcGFydG1lbnRJZC5pbmNsdWRlcygncm9vdCcpKSB7XG4gICAgY29uc29sZS53YXJuKCfimqDvuI8gIFdBUk5JTkc6IE9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEIG5vdCBzZXQgb3Igc2V0IHRvIHJvb3QgY29tcGFydG1lbnQuJyk7XG4gICAgY29uc29sZS53YXJuKCcgICBQbGVhc2Ugc2V0IE9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEIHRvIHlvdXIgaG9tZSBjb21wYXJ0bWVudCBPQ0lELicpO1xuICAgIGNvbnNvbGUud2FybignICAgRXhhbXBsZTogZXhwb3J0IE9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEPVwib2NpZDEuY29tcGFydG1lbnQub2MxLi5hYWFhYWFhLi4uXCInKTtcbiAgfVxuXG4gIGxldCBuYW1lc3BhY2UgPSBwcm9jZXNzLmVudi5PQ0lfTkFNRVNQQUNFPy50cmltKCk7XG4gIGlmICghbmFtZXNwYWNlIHx8IG5hbWVzcGFjZSA9PT0gJ3lvdXItbmFtZXNwYWNlJykge1xuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgZ2V0TmFtZXNwYWNlRnJvbU9jaVNkayhjb21wYXJ0bWVudElkLCByZWdpb24pO1xuICAgIGlmIChyZXNvbHZlZCkgbmFtZXNwYWNlID0gcmVzb2x2ZWQ7XG4gICAgZWxzZSBpZiAoIW5hbWVzcGFjZSkgbmFtZXNwYWNlID0gJ3lvdXItbmFtZXNwYWNlJztcbiAgICBpZiAobmFtZXNwYWNlID09PSAneW91ci1uYW1lc3BhY2UnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyAgT0NJX05BTUVTUEFDRSBub3Qgc2V0IGFuZCBTREsgY291bGQgbm90IHJlc29sdmUgaXQuIFNldCBPQ0lfTkFNRVNQQUNFIG9yIHJ1biBcIm9jaSBzZXR1cCBjb25maWdcIi4nKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkaXNjb3ZlcmVkID0gZGlzY292ZXJGcm9tRnVuY1lhbWxBbmRUYXJnZXQoKTtcblxuICBjb25zdCBpbWFnZVRhZyA9IHByb2Nlc3MuZW52Lk9DSV9JTUFHRV9UQUc/LnRyaW0oKSB8fCBkaXNjb3ZlcmVkLmltYWdlVGFnIHx8ICdsYXRlc3QnO1xuXG4gIGxldCBkb2NrZXJDb250ZXh0UGF0aCA9IGRpc2NvdmVyZWQuZG9ja2VyQ29udGV4dFBhdGg7XG4gIGlmICghZG9ja2VyQ29udGV4dFBhdGggJiYgcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkpIHtcbiAgICBjb25zdCBwID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSC50cmltKCkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBkb2NrZXJDb250ZXh0UGF0aCA9IGZzLnN0YXRTeW5jKHApLmlzRGlyZWN0b3J5KCkgPyBwIDogcGF0aC5kaXJuYW1lKHApO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlciA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9IQU5ETEVSPy50cmltKCkgfHwgZGlzY292ZXJlZC5oYW5kbGVyO1xuICBjb25zdCB1c2VUaGluRG9ja2VyZmlsZSA9IGRpc2NvdmVyZWQudXNlVGhpbkRvY2tlcmZpbGUgPz8gZmFsc2U7XG5cbiAgY29uc3QgbWVtb3J5RW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX01FTU9SWV9NQj8udHJpbSgpO1xuICBjb25zdCBmdW5jdGlvbk1lbW9yeU1iID0gbWVtb3J5RW52XG4gICAgPyBTdHJpbmcocGFyc2VJbnQobWVtb3J5RW52LCAxMCkpXG4gICAgOiAoZGlzY292ZXJlZC5tZW1vcnlNYiAhPSBudWxsID8gU3RyaW5nKGRpc2NvdmVyZWQubWVtb3J5TWIpIDogdW5kZWZpbmVkKTtcblxuICBjb25zdCB0aW1lb3V0RW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUz8udHJpbSgpO1xuICBjb25zdCBmdW5jdGlvblRpbWVvdXRTZWNvbmRzID0gdGltZW91dEVudlxuICAgID8gcGFyc2VJbnQodGltZW91dEVudiwgMTApXG4gICAgOiBkaXNjb3ZlcmVkLnRpbWVvdXRTZWNvbmRzO1xuXG4gIGxldCBmdW5jdGlvbkNvbmZpZyA9IGRpc2NvdmVyZWQuY29uZmlnO1xuICBjb25zdCBjb25maWdFbnYgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fQ09ORklHPy50cmltKCk7XG4gIGlmIChjb25maWdFbnYpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb25maWdFbnYpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICBmdW5jdGlvbkNvbmZpZyA9IHsgLi4uZnVuY3Rpb25Db25maWcsIC4uLnBhcnNlZCB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIGludmFsaWQgSlNPTlxuICAgIH1cbiAgfVxuICBpZiAoZnVuY3Rpb25Db25maWcgJiYgT2JqZWN0LmtleXMoZnVuY3Rpb25Db25maWcpLmxlbmd0aCA9PT0gMCkgZnVuY3Rpb25Db25maWcgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYXBpR3dEZXBsb3ltZW50SnNvbkVudiA9IHByb2Nlc3MuZW52Lk9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTj8udHJpbSgpO1xuICBjb25zdCBhcGlHd0RlcGxveW1lbnRKc29uUGF0aCA9IGFwaUd3RGVwbG95bWVudEpzb25FbnZcbiAgICA/IHBhdGgucmVzb2x2ZShhcGlHd0RlcGxveW1lbnRKc29uRW52KVxuICAgIDogZG9ja2VyQ29udGV4dFBhdGhcbiAgICAgID8gZW5zdXJlRGVmYXVsdEFwaUd3RGVwbG95bWVudEpzb24oZG9ja2VyQ29udGV4dFBhdGgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKGRvY2tlckNvbnRleHRQYXRoKSB7XG4gICAgZW5zdXJlVGFpbEZ1bmN0aW9uTG9nc1NjcmlwdChkb2NrZXJDb250ZXh0UGF0aCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbXBhcnRtZW50SWQsXG4gICAgb2NpckNvbXBhcnRtZW50SWQ6IG9jaXJDb21wYXJ0bWVudElkIHx8IHVuZGVmaW5lZCxcbiAgICB0ZW5hbmN5SWQsXG4gICAgcmVnaW9uLFxuICAgIG5hbWVzcGFjZSxcbiAgICBmdW5jdGlvbkFwcE5hbWU6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9BUFBfTkFNRSA/PyBkaXNjb3ZlcmVkLmZ1bmN0aW9uQXBwTmFtZSA/PyAnJyxcbiAgICBmdW5jdGlvbk5hbWU6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9OQU1FID8/IGRpc2NvdmVyZWQuZnVuY3Rpb25OYW1lID8/ICcnLFxuICAgIGZ1bmN0aW9uSmFyUGF0aDogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkgfHwgdW5kZWZpbmVkLFxuICAgIGRvY2tlckNvbnRleHRQYXRoOiBkb2NrZXJDb250ZXh0UGF0aCB8fCB1bmRlZmluZWQsXG4gICAgaW1hZ2VUYWcsXG4gICAgaGFuZGxlcjogaGFuZGxlciB8fCB1bmRlZmluZWQsXG4gICAgdXNlVGhpbkRvY2tlcmZpbGUsXG4gICAgb2NpclJlcG9zaXRvcnlOYW1lOiBwcm9jZXNzLmVudi5PQ0lfT0NJUl9SRVBPU0lUT1JZX05BTUUgfHwgdW5kZWZpbmVkLFxuICAgIGZ1bmN0aW9uTWVtb3J5TWI6IGZ1bmN0aW9uTWVtb3J5TWIgfHwgdW5kZWZpbmVkLFxuICAgIGZ1bmN0aW9uVGltZW91dFNlY29uZHM6IGZ1bmN0aW9uVGltZW91dFNlY29uZHMgPz8gdW5kZWZpbmVkLFxuICAgIGZ1bmN0aW9uQ29uZmlnLFxuICAgIGFwaUd3RGVwbG95bWVudEpzb25QYXRoOiBhcGlHd0RlcGxveW1lbnRKc29uUGF0aCB8fCB1bmRlZmluZWQsXG4gICAgYmFja2VuZDogYmFja2VuZENvbmZpZyxcbiAgfTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oci-cdk-test",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "description": "OCI CDK stack for OCI Functions, API Gateway, and related infrastructure",
5
5
  "main": "lib/index.js",
6
6
  "bin": {
@@ -44,6 +44,7 @@
44
44
  "lib",
45
45
  ".gen",
46
46
  "config",
47
+ "scripts",
47
48
  "cdktf.json",
48
49
  "ocdk.json"
49
50
  ],
@@ -0,0 +1,251 @@
1
+ // Tail OCI logs using OCI_EXECUTION_LOG_ID and OCI_LOG_GROUP_ID env vars.
2
+ // Prints only the log lines (no metadata), similar to `tail -f`.
3
+
4
+ const logging = require('oci-logging');
5
+ const loggingsearch = require('oci-loggingsearch');
6
+ const common = require('oci-common');
7
+
8
+ // These may be replaced by OCDK at deploy time for a given project.
9
+ // In the published package they are empty; env vars are then required.
10
+ const DEFAULT_EXECUTION_LOG_ID = '';
11
+ const DEFAULT_LOG_GROUP_ID = '';
12
+
13
+ /**
14
+ * Pull log entries for a given log OCID, optionally scoped by log group ID.
15
+ * This is a minimal version of the previous helper, inlined here so we only
16
+ * need this single script for tailing.
17
+ */
18
+ async function pullLogsWithLogAndGroupId({
19
+ logOcid,
20
+ tail = 10,
21
+ logGroupId: logGroupIdFromQuery = null,
22
+ loggingManagementClient,
23
+ logSearchClient
24
+ }) {
25
+ const resolvedLogOcid =
26
+ logOcid ||
27
+ process.env.OCI_EXECUTION_LOG_ID ||
28
+ process.env.LOG_OCID ||
29
+ DEFAULT_EXECUTION_LOG_ID;
30
+
31
+ const resolvedLogGroupIdFromEnv =
32
+ logGroupIdFromQuery != null && logGroupIdFromQuery !== ''
33
+ ? logGroupIdFromQuery
34
+ : (
35
+ process.env.OCI_LOG_GROUP_ID ||
36
+ process.env.LOG_GROUP_OCID ||
37
+ process.env.LOG_GROUP_ID ||
38
+ DEFAULT_LOG_GROUP_ID ||
39
+ null
40
+ );
41
+
42
+ if (!resolvedLogOcid) {
43
+ throw new Error('logOcid is required (either parameter or OCI_EXECUTION_LOG_ID / LOG_OCID env var)');
44
+ }
45
+ if (!loggingManagementClient || !logSearchClient) {
46
+ throw new Error('loggingManagementClient and logSearchClient are required');
47
+ }
48
+
49
+ let log = null;
50
+ let logGroupIdToUse = resolvedLogGroupIdFromEnv || null;
51
+ let compartmentId = null;
52
+
53
+ if (logGroupIdToUse) {
54
+ try {
55
+ const getLogRequest = {
56
+ logGroupId: logGroupIdToUse,
57
+ logId: resolvedLogOcid
58
+ };
59
+ const logResponse = await loggingManagementClient.getLog(getLogRequest);
60
+ log = logResponse.log;
61
+ if (log) {
62
+ compartmentId = log.compartmentId || null;
63
+ if (log.logGroupId) {
64
+ logGroupIdToUse = log.logGroupId;
65
+ }
66
+ }
67
+ } catch (getLogError) {
68
+ console.error('Error in getLog call (tail_logs):', getLogError.message || getLogError);
69
+ }
70
+ }
71
+
72
+ if (!logGroupIdToUse && log && log.logGroupId) {
73
+ logGroupIdToUse = log.logGroupId;
74
+ }
75
+
76
+ if (!logGroupIdToUse) {
77
+ logGroupIdToUse = null;
78
+ }
79
+
80
+ const timeStart = new Date(Date.now() - 24 * 60 * 60 * 1000);
81
+ const timeEnd = new Date();
82
+
83
+ let searchQuery = '';
84
+
85
+ if (compartmentId && logGroupIdToUse && resolvedLogOcid) {
86
+ searchQuery = `search "${compartmentId}/${logGroupIdToUse}/${resolvedLogOcid}" | sort by datetime desc`;
87
+ } else if (compartmentId && logGroupIdToUse) {
88
+ searchQuery = `search "${compartmentId}/${logGroupIdToUse}" | sort by datetime desc`;
89
+ } else if (logGroupIdToUse) {
90
+ searchQuery = `search "${logGroupIdToUse}" | sort by datetime desc`;
91
+ } else if (compartmentId && resolvedLogOcid) {
92
+ searchQuery = `search "${compartmentId}" | where oracle.logid = "${resolvedLogOcid}" | sort by datetime desc`;
93
+ } else if (resolvedLogOcid) {
94
+ searchQuery = `search * | where oracle.logid = "${resolvedLogOcid}" | sort by datetime desc`;
95
+ } else {
96
+ throw new Error('Missing required information: need log OCID at minimum');
97
+ }
98
+
99
+ const searchLogsDetails = {
100
+ timeStart,
101
+ timeEnd,
102
+ searchQuery,
103
+ isReturnFieldInfo: false
104
+ };
105
+
106
+ const searchLogsRequest = {
107
+ searchLogsDetails,
108
+ limit: tail
109
+ };
110
+
111
+ const searchResponse = await logSearchClient.searchLogs(searchLogsRequest);
112
+ const logEntries = searchResponse.searchResponse?.results || [];
113
+
114
+ let entriesToProcess = logEntries;
115
+ if (!searchQuery.includes(`/${resolvedLogOcid}"`)) {
116
+ entriesToProcess = logEntries.filter(entry => {
117
+ const entryLogId =
118
+ entry.data?.logContent?.oracle?.logid ||
119
+ entry.logContent?.oracle?.logid ||
120
+ entry.oracle?.logid;
121
+ return entryLogId === resolvedLogOcid;
122
+ });
123
+ }
124
+
125
+ // Map each entry to a { timestamp, message } pair using data from the log.
126
+ const lines = entriesToProcess.map(entry => {
127
+ const logData = entry.data?.logContent || entry.logContent || entry;
128
+
129
+ // Try to extract a timestamp from common locations in the OCI response.
130
+ let ts =
131
+ entry.time ||
132
+ entry.datetime ||
133
+ entry.data?.datetime ||
134
+ entry.data?.time ||
135
+ logData.time ||
136
+ logData.datetime;
137
+
138
+ if (ts instanceof Date) {
139
+ ts = ts.toISOString();
140
+ } else if (typeof ts === 'number') {
141
+ ts = new Date(ts).toISOString();
142
+ } else if (!ts) {
143
+ ts = new Date().toISOString();
144
+ }
145
+
146
+ // Extract a human-readable message/content string.
147
+ let message;
148
+ if (logData.data?.message) message = logData.data.message;
149
+ else if (logData.data?.data?.message) message = logData.data.data.message;
150
+ else if (logData.message) message = logData.message;
151
+ else if (typeof logData.data === 'string') message = logData.data;
152
+ else if (entry.data?.message) message = entry.data.message;
153
+ else if (entry.message) message = entry.message;
154
+ else if (entry.content) message = entry.content;
155
+ else message = JSON.stringify(logData, null, 2);
156
+
157
+ return { timestamp: String(ts), message: String(message) };
158
+ });
159
+
160
+ return {
161
+ lines,
162
+ entries: entriesToProcess,
163
+ searchQuery,
164
+ compartmentId,
165
+ logGroupId: logGroupIdToUse
166
+ };
167
+ }
168
+
169
+ async function main() {
170
+ const configurationFilePath =
171
+ process.env.OCI_CONFIG_FILE || '~/.oci/config';
172
+ const profile =
173
+ process.env.OCI_CLI_PROFILE || process.env.OCI_CONFIG_PROFILE || 'DEFAULT';
174
+
175
+ const provider = new common.ConfigFileAuthenticationDetailsProvider(
176
+ configurationFilePath,
177
+ profile
178
+ );
179
+
180
+ const loggingManagementClient = new logging.LoggingManagementClient({
181
+ authenticationDetailsProvider: provider
182
+ });
183
+
184
+ const logSearchClient = new loggingsearch.LogSearchClient({
185
+ authenticationDetailsProvider: provider
186
+ });
187
+
188
+ const tail =
189
+ parseInt(process.env.OCI_LOG_TAIL || process.argv[2] || '50', 10) || 50;
190
+ const intervalMs =
191
+ parseInt(process.env.OCI_LOG_INTERVAL_MS || '5000', 10) || 5000;
192
+
193
+ const effectiveExecutionLogId =
194
+ process.env.OCI_EXECUTION_LOG_ID ||
195
+ process.env.LOG_OCID ||
196
+ DEFAULT_EXECUTION_LOG_ID;
197
+ const effectiveLogGroupId =
198
+ process.env.OCI_LOG_GROUP_ID ||
199
+ process.env.LOG_GROUP_OCID ||
200
+ process.env.LOG_GROUP_ID ||
201
+ DEFAULT_LOG_GROUP_ID;
202
+
203
+ if (!effectiveExecutionLogId) {
204
+ console.error(
205
+ 'Missing log OCID. Set OCI_EXECUTION_LOG_ID (or LOG_OCID), or configure a default for this project.'
206
+ );
207
+ process.exit(1);
208
+ }
209
+ if (!effectiveLogGroupId) {
210
+ console.error(
211
+ 'Missing log group OCID. Set OCI_LOG_GROUP_ID (or LOG_GROUP_OCID / LOG_GROUP_ID), or configure a default for this project.'
212
+ );
213
+ process.exit(1);
214
+ }
215
+
216
+ // Keep track of which log lines we've already printed (by timestamp+message)
217
+ const seenKeys = new Set();
218
+
219
+ // eslint-disable-next-line no-constant-condition
220
+ while (true) {
221
+ try {
222
+ const result = await pullLogsWithLogAndGroupId({
223
+ tail,
224
+ loggingManagementClient,
225
+ logSearchClient
226
+ });
227
+
228
+ const lines = result.lines || [];
229
+
230
+ // Results are newest-first from the search query; print in chronological order.
231
+ for (let i = lines.length - 1; i >= 0; i -= 1) {
232
+ const { timestamp, message } = lines[i];
233
+ const key = `${timestamp}|${message}`;
234
+ if (seenKeys.has(key)) continue;
235
+ seenKeys.add(key);
236
+ console.log(`${timestamp} ${message}`);
237
+ }
238
+ } catch (err) {
239
+ console.error('Error while tailing logs:', err.message || err);
240
+ }
241
+
242
+ await new Promise(resolve => setTimeout(resolve, intervalMs));
243
+ }
244
+ }
245
+
246
+ if (require.main === module) {
247
+ main().catch(err => {
248
+ console.error('Fatal error in tail_logs:', err);
249
+ process.exit(1);
250
+ });
251
+ }