@howlil/ez-agents 5.0.0 → 5.0.2

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.
@@ -11,7 +11,7 @@ import { fileURLToPath } from "url";
11
11
  // package.json
12
12
  var package_default = {
13
13
  name: "@howlil/ez-agents",
14
- version: "5.0.0",
14
+ version: "5.0.2",
15
15
  description: "EZ Agents \u2014 Meta-prompting with multi-model support (Qwen, Kimi, OpenAI)",
16
16
  type: "module",
17
17
  sideEffects: false,
@@ -2079,7 +2079,16 @@ function install(isGlobal, runtime = "claude") {
2079
2079
  const isQwen = runtime === "qwen";
2080
2080
  const isKimi = runtime === "kimi";
2081
2081
  const dirName = getDirName(runtime);
2082
- const src = path.join(__dirname, "..");
2082
+ let pkgRoot = path.join(__dirname, "..");
2083
+ while (!fs.existsSync(path.join(pkgRoot, "package.json"))) {
2084
+ const parent = path.dirname(pkgRoot);
2085
+ if (parent === pkgRoot) {
2086
+ pkgRoot = path.join(__dirname, "..");
2087
+ break;
2088
+ }
2089
+ pkgRoot = parent;
2090
+ }
2091
+ const src = pkgRoot;
2083
2092
  const targetDir = isGlobal ? getGlobalDir(runtime, explicitConfigDir) : path.join(process.cwd(), dirName);
2084
2093
  const locationLabel = isGlobal ? targetDir.replace(os.homedir(), "~") : targetDir.replace(process.cwd(), ".");
2085
2094
  const pathPrefix = isGlobal ? `${targetDir.replace(/\\/g, "/").replace(os.homedir().replace(/\\/g, "/"), "~")}/` : `./${dirName}/`;
@@ -2694,4 +2703,4 @@ if (hasGlobal && hasLocal) {
2694
2703
  export {
2695
2704
  testExports
2696
2705
  };
2697
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vYmluL2luc3RhbGwudHMiLCAiLi4vLi4vcGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXHJcblxyXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XHJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcclxuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSAncmVhZGxpbmUnO1xyXG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcclxuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ3VybCc7XHJcblxyXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xyXG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoX19maWxlbmFtZSk7XHJcblxyXG4vLyBDb2xvcnNcclxuY29uc3QgY3lhbiA9ICdcXHgxYlszNm0nO1xyXG5jb25zdCBncmVlbiA9ICdcXHgxYlszMm0nO1xyXG5jb25zdCB5ZWxsb3cgPSAnXFx4MWJbMzNtJztcclxuY29uc3QgZGltID0gJ1xceDFiWzJtJztcclxuY29uc3QgcmVzZXQgPSAnXFx4MWJbMG0nO1xyXG5cclxuLy8gQ29kZXggY29uZmlnLnRvbWwgY29uc3RhbnRzXHJcbmNvbnN0IEVaX0NPREVYX01BUktFUiA9ICcjIEVaX0FnZW50cyBBZ2VudCBDb25maWd1cmF0aW9uIFxcdTIwMTQgbWFuYWdlZCBieSBlei1hZ2VudHMgaW5zdGFsbGVyJztcclxuXHJcbi8vIENvcGlsb3QgaW5zdHJ1Y3Rpb25zIG1hcmtlciBjb25zdGFudHNcclxuY29uc3QgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfTUFSS0VSID0gJzwhLS0gRVpfQUdFTlRTIENvbmZpZ3VyYXRpb24gXFx1MjAxNCBtYW5hZ2VkIGJ5IGV6LWFnZW50cyBpbnN0YWxsZXIgLS0+JztcclxuY29uc3QgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfQ0xPU0VfTUFSS0VSID0gJzwhLS0gL0VaX0FHRU5UUyBDb25maWd1cmF0aW9uIC0tPic7XHJcbi8vIExlZ2FjeSBtYXJrZXJzIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBpbnN0YWxscy5cclxuY29uc3QgTEVHQUNZX0VaX0NPUElMT1RfSU5TVFJVQ1RJT05TX01BUktFUiA9ICc8IS0tIEVaX0FnZW50cyBDb25maWd1cmF0aW9uIFxcdTIwMTQgbWFuYWdlZCBieSBlei1hZ2VudHMgaW5zdGFsbGVyIC0tPic7XHJcbmNvbnN0IExFR0FDWV9FWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19DTE9TRV9NQVJLRVIgPSAnPCEtLSAvRVpfQWdlbnRzIENvbmZpZ3VyYXRpb24gLS0+JztcclxuXHJcbmNvbnN0IENPREVYX0FHRU5UX1NBTkRCT1ggPSB7XHJcbiAgJ2V6LWV4ZWN1dG9yJzogJ3dvcmtzcGFjZS13cml0ZScsXHJcbiAgJ2V6LXBsYW5uZXInOiAnd29ya3NwYWNlLXdyaXRlJyxcclxuICAnZXotcGhhc2UtcmVzZWFyY2hlcic6ICd3b3Jrc3BhY2Utd3JpdGUnLFxyXG4gICdlei1wcm9qZWN0LXJlc2VhcmNoZXInOiAnd29ya3NwYWNlLXdyaXRlJyxcclxuICAnZXotcmVzZWFyY2gtc3ludGhlc2l6ZXInOiAnd29ya3NwYWNlLXdyaXRlJyxcclxuICAnZXotdmVyaWZpZXInOiAnd29ya3NwYWNlLXdyaXRlJyxcclxuICAnZXotY29kZWJhc2UtbWFwcGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXHJcbiAgJ2V6LXJvYWRtYXBwZXInOiAnd29ya3NwYWNlLXdyaXRlJyxcclxuICAnZXotZGVidWdnZXInOiAnd29ya3NwYWNlLXdyaXRlJyxcclxuICAnZXotcGxhbi1jaGVja2VyJzogJ3JlYWQtb25seScsXHJcbiAgJ2V6LWludGVncmF0aW9uLWNoZWNrZXInOiAncmVhZC1vbmx5JyxcclxufTtcclxuXHJcbi8vIENvcGlsb3QgdG9vbCBuYW1lIG1hcHBpbmcgXHUyMDE0IENsYXVkZSBDb2RlIHRvb2xzIHRvIEdpdEh1YiBDb3BpbG90IHRvb2xzXHJcbi8vIFRvb2wgbWFwcGluZyBhcHBsaWVzIE9OTFkgdG8gYWdlbnRzLCBOT1QgdG8gc2tpbGxzIChwZXIgQ09OVEVYVC5tZCBkZWNpc2lvbilcclxuY29uc3QgY2xhdWRlVG9Db3BpbG90VG9vbHMgPSB7XHJcbiAgUmVhZDogJ3JlYWQnLFxyXG4gIFdyaXRlOiAnZWRpdCcsXHJcbiAgRWRpdDogJ2VkaXQnLFxyXG4gIEJhc2g6ICdleGVjdXRlJyxcclxuICBHcmVwOiAnc2VhcmNoJyxcclxuICBHbG9iOiAnc2VhcmNoJyxcclxuICBUYXNrOiAnYWdlbnQnLFxyXG4gIFdlYlNlYXJjaDogJ3dlYicsXHJcbiAgV2ViRmV0Y2g6ICd3ZWInLFxyXG4gIFRvZG9Xcml0ZTogJ3RvZG8nLFxyXG4gIEFza1VzZXJRdWVzdGlvbjogJ2Fza191c2VyJyxcclxuICBTbGFzaENvbW1hbmQ6ICdza2lsbCcsXHJcbn07XHJcblxyXG4vLyBHZXQgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxyXG5pbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbicgd2l0aCB7IHR5cGU6ICdqc29uJyB9O1xyXG5cclxuLy8gUGFyc2UgYXJnc1xyXG5jb25zdCBhcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpO1xyXG5jb25zdCBoYXNHbG9iYWwgPSBhcmdzLmluY2x1ZGVzKCctLWdsb2JhbCcpIHx8IGFyZ3MuaW5jbHVkZXMoJy1nJyk7XHJcbmNvbnN0IGhhc0xvY2FsID0gYXJncy5pbmNsdWRlcygnLS1sb2NhbCcpIHx8IGFyZ3MuaW5jbHVkZXMoJy1sJyk7XHJcbmNvbnN0IGhhc09wZW5jb2RlID0gYXJncy5pbmNsdWRlcygnLS1vcGVuY29kZScpO1xyXG5jb25zdCBoYXNDbGF1ZGUgPSBhcmdzLmluY2x1ZGVzKCctLWNsYXVkZScpO1xyXG5jb25zdCBoYXNHZW1pbmkgPSBhcmdzLmluY2x1ZGVzKCctLWdlbWluaScpO1xyXG5jb25zdCBoYXNDb2RleCA9IGFyZ3MuaW5jbHVkZXMoJy0tY29kZXgnKTtcclxuY29uc3QgaGFzQ29waWxvdCA9IGFyZ3MuaW5jbHVkZXMoJy0tY29waWxvdCcpO1xyXG5jb25zdCBoYXNRd2VuID0gYXJncy5pbmNsdWRlcygnLS1xd2VuJyk7XHJcbmNvbnN0IGhhc0tpbWkgPSBhcmdzLmluY2x1ZGVzKCctLWtpbWknKTtcclxuY29uc3QgaGFzQm90aCA9IGFyZ3MuaW5jbHVkZXMoJy0tYm90aCcpOyAvLyBMZWdhY3kgZmxhZywga2VlcHMgd29ya2luZ1xyXG5jb25zdCBoYXNBbGwgPSBhcmdzLmluY2x1ZGVzKCctLWFsbCcpO1xyXG5jb25zdCBoYXNVbmluc3RhbGwgPSBhcmdzLmluY2x1ZGVzKCctLXVuaW5zdGFsbCcpIHx8IGFyZ3MuaW5jbHVkZXMoJy11Jyk7XHJcblxyXG4vLyBSdW50aW1lIHNlbGVjdGlvbiAtIGNhbiBiZSBzZXQgYnkgZmxhZ3Mgb3IgaW50ZXJhY3RpdmUgcHJvbXB0XHJcbmxldCBzZWxlY3RlZFJ1bnRpbWVzOiBzdHJpbmdbXSA9IFtdO1xyXG5pZiAoaGFzQWxsKSB7XHJcbiAgc2VsZWN0ZWRSdW50aW1lcyA9IFsnY2xhdWRlJywgJ29wZW5jb2RlJywgJ2dlbWluaScsICdjb2RleCcsICdjb3BpbG90JywgJ3F3ZW4nLCAna2ltaSddO1xyXG59IGVsc2UgaWYgKGhhc0JvdGgpIHtcclxuICBzZWxlY3RlZFJ1bnRpbWVzID0gWydjbGF1ZGUnLCAnb3BlbmNvZGUnXTtcclxufSBlbHNlIHtcclxuICBpZiAoaGFzT3BlbmNvZGUpIHNlbGVjdGVkUnVudGltZXMucHVzaCgnb3BlbmNvZGUnKTtcclxuICBpZiAoaGFzQ2xhdWRlKSBzZWxlY3RlZFJ1bnRpbWVzLnB1c2goJ2NsYXVkZScpO1xyXG4gIGlmIChoYXNHZW1pbmkpIHNlbGVjdGVkUnVudGltZXMucHVzaCgnZ2VtaW5pJyk7XHJcbiAgaWYgKGhhc0NvZGV4KSBzZWxlY3RlZFJ1bnRpbWVzLnB1c2goJ2NvZGV4Jyk7XHJcbiAgaWYgKGhhc0NvcGlsb3QpIHNlbGVjdGVkUnVudGltZXMucHVzaCgnY29waWxvdCcpO1xyXG4gIGlmIChoYXNRd2VuKSBzZWxlY3RlZFJ1bnRpbWVzLnB1c2goJ3F3ZW4nKTtcclxuICBpZiAoaGFzS2ltaSkgc2VsZWN0ZWRSdW50aW1lcy5wdXNoKCdraW1pJyk7XHJcbn1cclxuXHJcbi8vIFdTTCArIFdpbmRvd3MgTm9kZS5qcyBkZXRlY3Rpb25cclxuLy8gV2hlbiBXaW5kb3dzLW5hdGl2ZSBOb2RlIHJ1bnMgb24gV1NMLCBvcy5ob21lZGlyKCkgYW5kIHBhdGguam9pbigpIHByb2R1Y2VcclxuLy8gYmFja3NsYXNoIHBhdGhzIHRoYXQgZG9uJ3QgcmVzb2x2ZSBjb3JyZWN0bHkgb24gdGhlIExpbnV4IGZpbGVzeXN0ZW0uXHJcbmlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XHJcbiAgbGV0IGlzV1NMID0gZmFsc2U7XHJcbiAgdHJ5IHtcclxuICAgIGlmIChwcm9jZXNzLmVudi5XU0xfRElTVFJPX05BTUUpIHtcclxuICAgICAgaXNXU0wgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChmcy5leGlzdHNTeW5jKCcvcHJvYy92ZXJzaW9uJykpIHtcclxuICAgICAgY29uc3QgcHJvY1ZlcnNpb24gPSBmcy5yZWFkRmlsZVN5bmMoJy9wcm9jL3ZlcnNpb24nLCAndXRmOCcpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGlmIChwcm9jVmVyc2lvbi5pbmNsdWRlcygnbWljcm9zb2Z0JykgfHwgcHJvY1ZlcnNpb24uaW5jbHVkZXMoJ3dzbCcpKSB7XHJcbiAgICAgICAgaXNXU0wgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBjYXRjaCB7XHJcbiAgICAvLyBJZ25vcmUgcmVhZCBlcnJvcnMgXHUyMDE0IG5vdCBXU0xcclxuICB9XHJcblxyXG4gIGlmIChpc1dTTCkge1xyXG4gICAgY29uc29sZS5lcnJvcihgXHJcbiR7eWVsbG93fVx1MjZBMCBEZXRlY3RlZCBXU0wgd2l0aCBXaW5kb3dzLW5hdGl2ZSBOb2RlLmpzLiR7cmVzZXR9XHJcblxyXG5UaGlzIGNhdXNlcyBwYXRoIHJlc29sdXRpb24gaXNzdWVzIHRoYXQgcHJldmVudCBjb3JyZWN0IGluc3RhbGxhdGlvbi5cclxuUGxlYXNlIGluc3RhbGwgYSBMaW51eC1uYXRpdmUgTm9kZS5qcyBpbnNpZGUgV1NMOlxyXG5cclxuICBjdXJsIC1mc1NMIGh0dHBzOi8vZm5tLnZlcmNlbC5hcHAvaW5zdGFsbCB8IGJhc2hcclxuICBmbm0gaW5zdGFsbCAtLWx0c1xyXG5cclxuVGhlbiByZS1ydW46IG5weCBlei1hZ2VudHNcclxuYCk7XHJcbiAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCBhIHBhdGhQcmVmaXggKHdoaWNoIHVzZXMgYWJzb2x1dGUgcGF0aHMgZm9yIGdsb2JhbCBpbnN0YWxscykgdG8gYVxyXG4gKiAkSE9NRS1yZWxhdGl2ZSBmb3JtIGZvciByZXBsYWNpbmcgJEhPTUUvLmNsYXVkZS8gcmVmZXJlbmNlcyBpbiBiYXNoIGNvZGUgYmxvY2tzLlxyXG4gKiBQcmVzZXJ2ZXMgJEhPTUUgYXMgYSBzaGVsbCB2YXJpYWJsZSBzbyBwYXRocyByZW1haW4gcG9ydGFibGUgYWNyb3NzIG1hY2hpbmVzLlxyXG4gKi9cclxuZnVuY3Rpb24gdG9Ib21lUHJlZml4KHBhdGhQcmVmaXg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgaG9tZSA9IG9zLmhvbWVkaXIoKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGhQcmVmaXgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xyXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoaG9tZSkpIHtcclxuICAgIHJldHVybiAnJEhPTUUnICsgbm9ybWFsaXplZC5zbGljZShob21lLmxlbmd0aCk7XHJcbiAgfVxyXG4gIC8vIENvbnZlcnQgdGlsZGUtYmFzZWQgcGF0aHMgdG8gJEhPTUUtYmFzZWQgcGF0aHMgZm9yIGJhc2ggY29kZSBibG9ja3NcclxuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKCd+LycpKSB7XHJcbiAgICByZXR1cm4gJyRIT01FJyArIG5vcm1hbGl6ZWQuc2xpY2UoMSk7XHJcbiAgfVxyXG4gIC8vIEZvciByZWxhdGl2ZSBwYXRocyBvciBwYXRocyBub3QgdW5kZXIgJEhPTUUsIHJldHVybiBhcy1pc1xyXG4gIHJldHVybiBub3JtYWxpemVkO1xyXG59XHJcblxyXG4vLyBIZWxwZXIgdG8gZ2V0IGRpcmVjdG9yeSBuYW1lIGZvciBhIHJ1bnRpbWUgKHVzZWQgZm9yIGxvY2FsL3Byb2plY3QgaW5zdGFsbHMpXHJcbmZ1bmN0aW9uIGdldERpck5hbWUocnVudGltZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICBpZiAocnVudGltZSA9PT0gJ2NvcGlsb3QnKSByZXR1cm4gJy5naXRodWInO1xyXG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSByZXR1cm4gJy5vcGVuY29kZSc7XHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSByZXR1cm4gJy5nZW1pbmknO1xyXG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSByZXR1cm4gJy5jb2RleCc7XHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcmV0dXJuICcucXdlbic7XHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdraW1pJykgcmV0dXJuICcua2ltaSc7XHJcbiAgcmV0dXJuICcuY2xhdWRlJztcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgY29uZmlnIGRpcmVjdG9yeSBwYXRoIHJlbGF0aXZlIHRvIGhvbWUgZGlyZWN0b3J5IGZvciBhIHJ1bnRpbWVcclxuICogVXNlZCBmb3IgdGVtcGxhdGluZyBob29rcyB0aGF0IHVzZSBwYXRoLmpvaW4oaG9tZURpciwgJzxjb25maWdEaXI+JywgLi4uKVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gcnVudGltZSAtICdjbGF1ZGUnLCAnb3BlbmNvZGUnLCAnZ2VtaW5pJywgJ2NvZGV4JywgJ2NvcGlsb3QnLCBvciAncXdlbidcclxuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDb25maWdEaXJGcm9tSG9tZShydW50aW1lOiBzdHJpbmcsIGlzR2xvYmFsOiBib29sZWFuKTogc3RyaW5nIHtcclxuICBpZiAoIWlzR2xvYmFsKSB7XHJcbiAgICAvLyBMb2NhbCBpbnN0YWxscyB1c2UgdGhlIHNhbWUgZGlyIG5hbWUgcGF0dGVyblxyXG4gICAgcmV0dXJuIGAnJHtnZXREaXJOYW1lKHJ1bnRpbWUpfSdgO1xyXG4gIH1cclxuICAvLyBHbG9iYWwgaW5zdGFsbHMgLSBPcGVuQ29kZSB1c2VzIFhERyBwYXRoIHN0cnVjdHVyZVxyXG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHJldHVybiBcIicuY29waWxvdCdcIjtcclxuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJykge1xyXG4gICAgLy8gT3BlbkNvZGU6IH4vLmNvbmZpZy9vcGVuY29kZSAtPiAnLmNvbmZpZycsICdvcGVuY29kZSdcclxuICAgIC8vIFJldHVybiBhcyBjb21tYS1zZXBhcmF0ZWQgZm9yIHBhdGguam9pbigpIHJlcGxhY2VtZW50XHJcbiAgICByZXR1cm4gXCInLmNvbmZpZycsICdvcGVuY29kZSdcIjtcclxuICB9XHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSByZXR1cm4gXCInLmdlbWluaSdcIjtcclxuICBpZiAocnVudGltZSA9PT0gJ2NvZGV4JykgcmV0dXJuIFwiJy5jb2RleCdcIjtcclxuICBpZiAocnVudGltZSA9PT0gJ3F3ZW4nKSByZXR1cm4gXCInLnF3ZW4nXCI7XHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdraW1pJykgcmV0dXJuIFwiJy5raW1pJ1wiO1xyXG4gIHJldHVybiBcIicuY2xhdWRlJ1wiO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBnbG9iYWwgY29uZmlnIGRpcmVjdG9yeSBmb3IgT3BlbkNvZGVcclxuICogT3BlbkNvZGUgZm9sbG93cyBYREcgQmFzZSBEaXJlY3Rvcnkgc3BlYyBhbmQgdXNlcyB+Ly5jb25maWcvb3BlbmNvZGUvXHJcbiAqIFByaW9yaXR5OiBPUEVOQ09ERV9DT05GSUdfRElSID4gZGlybmFtZShPUEVOQ09ERV9DT05GSUcpID4gWERHX0NPTkZJR19IT01FL29wZW5jb2RlID4gfi8uY29uZmlnL29wZW5jb2RlXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRPcGVuY29kZUdsb2JhbERpcigpIHtcclxuICAvLyAxLiBFeHBsaWNpdCBPUEVOQ09ERV9DT05GSUdfRElSIGVudiB2YXJcclxuICBpZiAocHJvY2Vzcy5lbnYuT1BFTkNPREVfQ09ORklHX0RJUikge1xyXG4gICAgcmV0dXJuIGV4cGFuZFRpbGRlKHByb2Nlc3MuZW52Lk9QRU5DT0RFX0NPTkZJR19ESVIpO1xyXG4gIH1cclxuICBcclxuICAvLyAyLiBPUEVOQ09ERV9DT05GSUcgZW52IHZhciAodXNlIGl0cyBkaXJlY3RvcnkpXHJcbiAgaWYgKHByb2Nlc3MuZW52Lk9QRU5DT0RFX0NPTkZJRykge1xyXG4gICAgcmV0dXJuIHBhdGguZGlybmFtZShleHBhbmRUaWxkZShwcm9jZXNzLmVudi5PUEVOQ09ERV9DT05GSUcpKTtcclxuICB9XHJcbiAgXHJcbiAgLy8gMy4gWERHX0NPTkZJR19IT01FL29wZW5jb2RlXHJcbiAgaWYgKHByb2Nlc3MuZW52LlhER19DT05GSUdfSE9NRSkge1xyXG4gICAgcmV0dXJuIHBhdGguam9pbihleHBhbmRUaWxkZShwcm9jZXNzLmVudi5YREdfQ09ORklHX0hPTUUpLCAnb3BlbmNvZGUnKTtcclxuICB9XHJcbiAgXHJcbiAgLy8gNC4gRGVmYXVsdDogfi8uY29uZmlnL29wZW5jb2RlIChYREcgZGVmYXVsdClcclxuICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jb25maWcnLCAnb3BlbmNvZGUnKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgZ2xvYmFsIGNvbmZpZyBkaXJlY3RvcnkgZm9yIGEgcnVudGltZVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gcnVudGltZSAtICdjbGF1ZGUnLCAnb3BlbmNvZGUnLCAnZ2VtaW5pJywgJ2NvZGV4Jywgb3IgJ2NvcGlsb3QnXHJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGV4cGxpY2l0RGlyIC0gRXhwbGljaXQgZGlyZWN0b3J5IGZyb20gLS1jb25maWctZGlyIGZsYWdcclxuICovXHJcbmZ1bmN0aW9uIGdldEdsb2JhbERpcihydW50aW1lOiBzdHJpbmcsIGV4cGxpY2l0RGlyOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB7XHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdvcGVuY29kZScpIHtcclxuICAgIC8vIEZvciBPcGVuQ29kZSwgLS1jb25maWctZGlyIG92ZXJyaWRlcyBlbnYgdmFyc1xyXG4gICAgaWYgKGV4cGxpY2l0RGlyKSB7XHJcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShleHBsaWNpdERpcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ2V0T3BlbmNvZGVHbG9iYWxEaXIoKTtcclxuICB9XHJcbiAgXHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSB7XHJcbiAgICAvLyBHZW1pbmk6IC0tY29uZmlnLWRpciA+IEdFTUlOSV9DT05GSUdfRElSID4gfi8uZ2VtaW5pXHJcbiAgICBpZiAoZXhwbGljaXREaXIpIHtcclxuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcclxuICAgIH1cclxuICAgIGlmIChwcm9jZXNzLmVudi5HRU1JTklfQ09ORklHX0RJUikge1xyXG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuR0VNSU5JX0NPTkZJR19ESVIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuZ2VtaW5pJyk7XHJcbiAgfVxyXG5cclxuICBpZiAocnVudGltZSA9PT0gJ2NvZGV4Jykge1xyXG4gICAgLy8gQ29kZXg6IC0tY29uZmlnLWRpciA+IENPREVYX0hPTUUgPiB+Ly5jb2RleFxyXG4gICAgaWYgKGV4cGxpY2l0RGlyKSB7XHJcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShleHBsaWNpdERpcik7XHJcbiAgICB9XHJcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ09ERVhfSE9NRSkge1xyXG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuQ09ERVhfSE9NRSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jb2RleCcpO1xyXG4gIH1cclxuXHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb3BpbG90Jykge1xyXG4gICAgLy8gQ29waWxvdDogLS1jb25maWctZGlyID4gQ09QSUxPVF9DT05GSUdfRElSID4gfi8uY29waWxvdFxyXG4gICAgaWYgKGV4cGxpY2l0RGlyKSB7XHJcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShleHBsaWNpdERpcik7XHJcbiAgICB9XHJcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ09QSUxPVF9DT05GSUdfRElSKSB7XHJcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShwcm9jZXNzLmVudi5DT1BJTE9UX0NPTkZJR19ESVIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29waWxvdCcpO1xyXG4gIH1cclxuXHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykge1xyXG4gICAgLy8gUXdlbiBDb2RlOiAtLWNvbmZpZy1kaXIgPiBRV0VOX0NPTkZJR19ESVIgPiB+Ly5xd2VuXHJcbiAgICBpZiAoZXhwbGljaXREaXIpIHtcclxuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcclxuICAgIH1cclxuICAgIGlmIChwcm9jZXNzLmVudi5RV0VOX0NPTkZJR19ESVIpIHtcclxuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKHByb2Nlc3MuZW52LlFXRU5fQ09ORklHX0RJUik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5xd2VuJyk7XHJcbiAgfVxyXG5cclxuICBpZiAocnVudGltZSA9PT0gJ2tpbWknKSB7XHJcbiAgICAvLyBLaW1pIENvZGU6IC0tY29uZmlnLWRpciA+IEtJTUlfQ09ORklHX0RJUiA+IH4vLmtpbWlcclxuICAgIGlmIChleHBsaWNpdERpcikge1xyXG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUoZXhwbGljaXREaXIpO1xyXG4gICAgfVxyXG4gICAgaWYgKHByb2Nlc3MuZW52LktJTUlfQ09ORklHX0RJUikge1xyXG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuS0lNSV9DT05GSUdfRElSKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmtpbWknKTtcclxuICB9XHJcblxyXG4gIC8vIENsYXVkZSBDb2RlOiAtLWNvbmZpZy1kaXIgPiBDTEFVREVfQ09ORklHX0RJUiA+IH4vLmNsYXVkZVxyXG4gIGlmIChleHBsaWNpdERpcikge1xyXG4gICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcclxuICB9XHJcbiAgaWYgKHByb2Nlc3MuZW52LkNMQVVERV9DT05GSUdfRElSKSB7XHJcbiAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuQ0xBVURFX0NPTkZJR19ESVIpO1xyXG4gIH1cclxuICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jbGF1ZGUnKTtcclxufVxyXG5cclxuY29uc3QgYmFubmVyID0gJ1xcbicgK1xyXG4gIGN5YW4gKyAnICBcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1NTdcdTI1ODhcdTI1ODhcdTI1NTcgIFx1MjU4OFx1MjU4OFx1MjU1N1xcbicgK1xyXG4gICcgIFx1MjU4OFx1MjU4OFx1MjU1NFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1RFx1MjU1QVx1MjU4OFx1MjU4OFx1MjU1N1x1MjU4OFx1MjU4OFx1MjU1NFx1MjU1RFxcbicgK1xyXG4gICcgIFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU1NyAgIFx1MjU1QVx1MjU4OFx1MjU4OFx1MjU4OFx1MjU1NFx1MjU1RCBcXG4nICtcclxuICAnICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NTBcdTI1NTBcdTI1NUQgICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1ODhcdTI1ODhcdTI1NTcgXFxuJyArXHJcbiAgJyAgXHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTU3XHUyNTg4XHUyNTg4XHUyNTU0XHUyNTVEXHUyNTVBXHUyNTg4XHUyNTg4XHUyNTU3XFxuJyArXHJcbiAgJyAgXHUyNTVBXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTVEXHUyNTVBXHUyNTUwXHUyNTVEIFx1MjU1QVx1MjU1MFx1MjU1RCcgKyByZXNldCArICdcXG4nICtcclxuICAnXFxuJyArXHJcbiAgJyAgRVpfQWdlbnRzICcgKyBkaW0gKyAndicgKyBwa2cudmVyc2lvbiArIHJlc2V0ICsgJ1xcbicgK1xyXG4gICcgIE11bHRpLU1vZGVsIEVkaXRpb24nICsgcmVzZXQgKyAnXFxuJyArXHJcbiAgJyAgQSBtZXRhLXByb21wdGluZywgY29udGV4dCBlbmdpbmVlcmluZyBhbmQgc3BlYy1kcml2ZW5cXG4nICtcclxuICAnICBkZXZlbG9wbWVudCBzeXN0ZW0gZm9yIENsYXVkZSBDb2RlLCBPcGVuQ29kZSwgR2VtaW5pLCBDb2RleCwgQ29waWxvdCxcXG4nICtcclxuICAnICBRd2VuIENvZGUsIEtpbWkgQ29kZSwgd2l0aCBtdWx0aS1tb2RlbCBzdXBwb3J0LlxcbicgK1xyXG4gICcgIE9yaWdpbmFsIGJ5IFRcdTAwQzJDSEVTIHwgTXVsdGktTW9kZWwgRm9yayBieSBAaG93bGlsLlxcbic7XHJcblxyXG5cclxuLy8gUGFyc2UgLS1jb25maWctZGlyIGFyZ3VtZW50XHJcbmZ1bmN0aW9uIHBhcnNlQ29uZmlnRGlyQXJnKCkge1xyXG4gIGNvbnN0IGNvbmZpZ0RpckluZGV4ID0gYXJncy5maW5kSW5kZXgoYXJnID0+IGFyZyA9PT0gJy0tY29uZmlnLWRpcicgfHwgYXJnID09PSAnLWMnKTtcclxuICBpZiAoY29uZmlnRGlySW5kZXggIT09IC0xKSB7XHJcbiAgICBjb25zdCBuZXh0QXJnID0gYXJnc1tjb25maWdEaXJJbmRleCArIDFdO1xyXG4gICAgLy8gRXJyb3IgaWYgLS1jb25maWctZGlyIGlzIHByb3ZpZGVkIHdpdGhvdXQgYSB2YWx1ZSBvciBuZXh0IGFyZyBpcyBhbm90aGVyIGZsYWdcclxuICAgIGlmICghbmV4dEFyZyB8fCBuZXh0QXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fS0tY29uZmlnLWRpciByZXF1aXJlcyBhIHBhdGggYXJndW1lbnQke3Jlc2V0fWApO1xyXG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dEFyZztcclxuICB9XHJcbiAgLy8gQWxzbyBoYW5kbGUgLS1jb25maWctZGlyPXZhbHVlIGZvcm1hdFxyXG4gIGNvbnN0IGNvbmZpZ0RpckFyZyA9IGFyZ3MuZmluZChhcmcgPT4gYXJnLnN0YXJ0c1dpdGgoJy0tY29uZmlnLWRpcj0nKSB8fCBhcmcuc3RhcnRzV2l0aCgnLWM9JykpO1xyXG4gIGlmIChjb25maWdEaXJBcmcpIHtcclxuICAgIGNvbnN0IHZhbHVlID0gY29uZmlnRGlyQXJnLnNwbGl0KCc9JylbMV07XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9LS1jb25maWctZGlyIHJlcXVpcmVzIGEgbm9uLWVtcHR5IHBhdGgke3Jlc2V0fWApO1xyXG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG4gIHJldHVybiBudWxsO1xyXG59XHJcbmNvbnN0IGV4cGxpY2l0Q29uZmlnRGlyID0gcGFyc2VDb25maWdEaXJBcmcoKTtcclxuY29uc3QgaGFzSGVscCA9IGFyZ3MuaW5jbHVkZXMoJy0taGVscCcpIHx8IGFyZ3MuaW5jbHVkZXMoJy1oJyk7XHJcbmNvbnN0IGhhc1ZlcnNpb24gPSBhcmdzLmluY2x1ZGVzKCctLXZlcnNpb24nKSB8fCBhcmdzLmluY2x1ZGVzKCctdicpO1xyXG5jb25zdCBmb3JjZVN0YXR1c2xpbmUgPSBhcmdzLmluY2x1ZGVzKCctLWZvcmNlLXN0YXR1c2xpbmUnKTtcclxuXHJcbi8vIFNob3cgdmVyc2lvbiBpZiByZXF1ZXN0ZWQgKHNraXAgYmFubmVyLCBqdXN0IG91dHB1dCB2ZXJzaW9uKVxyXG5pZiAoaGFzVmVyc2lvbikge1xyXG4gIGNvbnNvbGUubG9nKHBrZy52ZXJzaW9uKTtcclxuICBwcm9jZXNzLmV4aXQoMCk7XHJcbn1cclxuXHJcbmNvbnNvbGUubG9nKGJhbm5lcik7XHJcblxyXG5pZiAoaGFzVW5pbnN0YWxsKSB7XHJcbiAgY29uc29sZS5sb2coJyAgTW9kZTogVW5pbnN0YWxsXFxuJyk7XHJcbn1cclxuXHJcbi8vIFNob3cgaGVscCBpZiByZXF1ZXN0ZWRcclxuaWYgKGhhc0hlbHApIHtcclxuICBjb25zb2xlLmxvZyhgICAke3llbGxvd31Vc2FnZToke3Jlc2V0fSBucHggZXotYWdlbnRzIFtvcHRpb25zXVxcblxcbiAgJHt5ZWxsb3d9T3B0aW9uczoke3Jlc2V0fVxcbiAgICAke2N5YW59LWcsIC0tZ2xvYmFsJHtyZXNldH0gICAgICAgICAgICAgIEluc3RhbGwgZ2xvYmFsbHkgKHRvIGNvbmZpZyBkaXJlY3RvcnkpXFxuICAgICR7Y3lhbn0tbCwgLS1sb2NhbCR7cmVzZXR9ICAgICAgICAgICAgICAgSW5zdGFsbCBsb2NhbGx5ICh0byBjdXJyZW50IGRpcmVjdG9yeSlcXG4gICAgJHtjeWFufS0tY2xhdWRlJHtyZXNldH0gICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBDbGF1ZGUgQ29kZSBvbmx5XFxuICAgICR7Y3lhbn0tLW9wZW5jb2RlJHtyZXNldH0gICAgICAgICAgICAgICAgSW5zdGFsbCBmb3IgT3BlbkNvZGUgb25seVxcbiAgICAke2N5YW59LS1nZW1pbmkke3Jlc2V0fSAgICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIEdlbWluaSBvbmx5XFxuICAgICR7Y3lhbn0tLWNvZGV4JHtyZXNldH0gICAgICAgICAgICAgICAgICAgSW5zdGFsbCBmb3IgQ29kZXggb25seVxcbiAgICAke2N5YW59LS1jb3BpbG90JHtyZXNldH0gICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIENvcGlsb3Qgb25seVxcbiAgICAke2N5YW59LS1xd2VuJHtyZXNldH0gICAgICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIFF3ZW4gQ29kZSBvbmx5XFxuICAgICR7Y3lhbn0tLWtpbWkke3Jlc2V0fSAgICAgICAgICAgICAgICAgICAgSW5zdGFsbCBmb3IgS2ltaSBDb2RlIG9ubHlcXG4gICAgJHtjeWFufS0tYWxsJHtyZXNldH0gICAgICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBhbGwgcnVudGltZXNcXG4gICAgJHtjeWFufS11LCAtLXVuaW5zdGFsbCR7cmVzZXR9ICAgICAgICAgICBVbmluc3RhbGwgRVpfQWdlbnRzIChyZW1vdmUgYWxsIEVaX0FnZW50cyBmaWxlcylcXG4gICAgJHtjeWFufS1jLCAtLWNvbmZpZy1kaXIgPHBhdGg+JHtyZXNldH0gICBTcGVjaWZ5IGN1c3RvbSBjb25maWcgZGlyZWN0b3J5XFxuICAgICR7Y3lhbn0tdiwgLS12ZXJzaW9uJHtyZXNldH0gICAgICAgICAgICAgU2hvdyB2ZXJzaW9uIG51bWJlclxcbiAgICAke2N5YW59LWgsIC0taGVscCR7cmVzZXR9ICAgICAgICAgICAgICAgIFNob3cgdGhpcyBoZWxwIG1lc3NhZ2VcXG4gICAgJHtjeWFufS0tZm9yY2Utc3RhdHVzbGluZSR7cmVzZXR9ICAgICAgICBSZXBsYWNlIGV4aXN0aW5nIHN0YXR1c2xpbmUgY29uZmlnXFxuXFxuICAke3llbGxvd31FeGFtcGxlczoke3Jlc2V0fVxcbiAgICAke2RpbX0jIEludGVyYWN0aXZlIGluc3RhbGwgKHByb21wdHMgZm9yIHJ1bnRpbWUgYW5kIGxvY2F0aW9uKSR7cmVzZXR9XFxuICAgIG5weCBlei1hZ2VudHNcXG5cXG4gICAgJHtkaW19IyBJbnN0YWxsIGZvciBDbGF1ZGUgQ29kZSBnbG9iYWxseSR7cmVzZXR9XFxuICAgIG5weCBlei1hZ2VudHMgLS1jbGF1ZGUgLS1nbG9iYWxcXG5cXG4gICAgJHtkaW19IyBJbnN0YWxsIGZvciBRd2VuIENvZGUgZ2xvYmFsbHkke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzIC0tcXdlbiAtLWdsb2JhbFxcblxcbiAgICAke2RpbX0jIEluc3RhbGwgZm9yIEtpbWkgQ29kZSBnbG9iYWxseSR7cmVzZXR9XFxuICAgIG5weCBlei1hZ2VudHMgLS1raW1pIC0tZ2xvYmFsXFxuXFxuICAgICR7ZGltfSMgSW5zdGFsbCBmb3IgYWxsIHJ1bnRpbWVzIGdsb2JhbGx5JHtyZXNldH1cXG4gICAgbnB4IGV6LWFnZW50cyAtLWFsbCAtLWdsb2JhbFxcblxcbiAgICAke2RpbX0jIFVuaW5zdGFsbCBFWl9BZ2VudHMgZ2xvYmFsbHkke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzIC0tYWxsIC0tZ2xvYmFsIC0tdW5pbnN0YWxsXFxuXFxuICAgICR7ZGltfSMgU2hvdyB2ZXJzaW9uJHtyZXNldH1cXG4gICAgbnB4IGV6LWFnZW50cyAtLXZlcnNpb25cXG5cXG4gICR7eWVsbG93fU5vdGVzOiR7cmVzZXR9XFxuICAgIFRoZSAtLWNvbmZpZy1kaXIgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIG11bHRpcGxlIGNvbmZpZ3VyYXRpb25zLlxcbiAgICBJdCB0YWtlcyBwcmlvcml0eSBvdmVyIENMQVVERV9DT05GSUdfRElSIC8gR0VNSU5JX0NPTkZJR19ESVIgLyBDT0RFWF9IT01FIC8gQ09QSUxPVF9DT05GSUdfRElSIC8gUVdFTl9DT05GSUdfRElSIC8gS0lNSV9DT05GSUdfRElSIGVudmlyb25tZW50IHZhcmlhYmxlcy5cXG5cXG4gICR7eWVsbG93fU1vZGVsIFByb3ZpZGVyczoke3Jlc2V0fVxcbiAgICBPcGVuQUkgYW5kIEFudGhyb3BpYyBhcmUgbW9kZWwgcHJvdmlkZXJzIGNvbmZpZ3VyZWQgaW4gc2V0dGluZ3MuanNvbixcXG4gICAgbm90IHNlcGFyYXRlIENMSSBydW50aW1lcy4gU2VlIFJFQURNRS5tZCBmb3IgbW9kZWwgY29uZmlndXJhdGlvbi5cXG5gKTtcclxuICBwcm9jZXNzLmV4aXQoMCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHBhbmQgfiB0byBob21lIGRpcmVjdG9yeSAoc2hlbGwgZG9lc24ndCBleHBhbmQgaW4gZW52IHZhcnMgcGFzc2VkIHRvIG5vZGUpXHJcbiAqL1xyXG5mdW5jdGlvbiBleHBhbmRUaWxkZShmaWxlUGF0aCkge1xyXG4gIGlmIChmaWxlUGF0aCAmJiBmaWxlUGF0aC5zdGFydHNXaXRoKCd+LycpKSB7XHJcbiAgICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgZmlsZVBhdGguc2xpY2UoMikpO1xyXG4gIH1cclxuICByZXR1cm4gZmlsZVBhdGg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZCBhIGhvb2sgY29tbWFuZCBwYXRoIHVzaW5nIGZvcndhcmQgc2xhc2hlcyBmb3IgY3Jvc3MtcGxhdGZvcm0gY29tcGF0aWJpbGl0eS5cclxuICogT24gV2luZG93cywgJEhPTUUgaXMgbm90IGV4cGFuZGVkIGJ5IGNtZC5leGUvUG93ZXJTaGVsbCwgc28gd2UgdXNlIHRoZSBhY3R1YWwgcGF0aC5cclxuICovXHJcbmZ1bmN0aW9uIGJ1aWxkSG9va0NvbW1hbmQoY29uZmlnRGlyLCBob29rTmFtZSkge1xyXG4gIC8vIFVzZSBmb3J3YXJkIHNsYXNoZXMgZm9yIE5vZGUuanMgY29tcGF0aWJpbGl0eSBvbiBhbGwgcGxhdGZvcm1zXHJcbiAgY29uc3QgaG9va3NQYXRoID0gY29uZmlnRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKSArICcvaG9va3MvJyArIGhvb2tOYW1lO1xyXG4gIHJldHVybiBgbm9kZSBcIiR7aG9va3NQYXRofVwiYDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlYWQgYW5kIHBhcnNlIHNldHRpbmdzLmpzb24sIHJldHVybmluZyBlbXB0eSBvYmplY3QgaWYgaXQgZG9lc24ndCBleGlzdFxyXG4gKi9cclxuZnVuY3Rpb24gcmVhZFNldHRpbmdzKHNldHRpbmdzUGF0aCkge1xyXG4gIGlmIChmcy5leGlzdHNTeW5jKHNldHRpbmdzUGF0aCkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhzZXR0aW5nc1BhdGgsICd1dGY4JykpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB7fTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFdyaXRlIHNldHRpbmdzLmpzb24gd2l0aCBwcm9wZXIgZm9ybWF0dGluZ1xyXG4gKi9cclxuZnVuY3Rpb24gd3JpdGVTZXR0aW5ncyhzZXR0aW5nc1BhdGgsIHNldHRpbmdzKSB7XHJcbiAgZnMud3JpdGVGaWxlU3luYyhzZXR0aW5nc1BhdGgsIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCBudWxsLCAyKSArICdcXG4nKTtcclxufVxyXG5cclxuLy8gQ2FjaGUgZm9yIGF0dHJpYnV0aW9uIHNldHRpbmdzIChwb3B1bGF0ZWQgb25jZSBwZXIgcnVudGltZSBkdXJpbmcgaW5zdGFsbClcclxuY29uc3QgYXR0cmlidXRpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nPigpO1xyXG5cclxuLyoqXHJcbiAqIEdldCBjb21taXQgYXR0cmlidXRpb24gc2V0dGluZyBmb3IgYSBydW50aW1lXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCBvciAnY29waWxvdCdcclxuICogQHJldHVybnMge251bGx8dW5kZWZpbmVkfHN0cmluZ30gbnVsbCA9IHJlbW92ZSwgdW5kZWZpbmVkID0ga2VlcCBkZWZhdWx0LCBzdHJpbmcgPSBjdXN0b21cclxuICovXHJcbmZ1bmN0aW9uIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWU6IHN0cmluZyk6IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcge1xyXG4gIC8vIFJldHVybiBjYWNoZWQgdmFsdWUgaWYgYXZhaWxhYmxlXHJcbiAgaWYgKGF0dHJpYnV0aW9uQ2FjaGUuaGFzKHJ1bnRpbWUpKSB7XHJcbiAgICByZXR1cm4gYXR0cmlidXRpb25DYWNoZS5nZXQocnVudGltZSk7XHJcbiAgfVxyXG5cclxuICBsZXQgcmVzdWx0OiBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nO1xyXG5cclxuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJykge1xyXG4gICAgY29uc3QgY29uZmlnID0gcmVhZFNldHRpbmdzKHBhdGguam9pbihnZXRHbG9iYWxEaXIoJ29wZW5jb2RlJywgbnVsbCksICdvcGVuY29kZS5qc29uJykpO1xyXG4gICAgcmVzdWx0ID0gY29uZmlnLmRpc2FibGVfYWlfYXR0cmlidXRpb24gPT09IHRydWUgPyBudWxsIDogdW5kZWZpbmVkO1xyXG4gIH0gZWxzZSBpZiAocnVudGltZSA9PT0gJ2dlbWluaScpIHtcclxuICAgIC8vIEdlbWluaTogY2hlY2sgZ2VtaW5pIHNldHRpbmdzLmpzb24gZm9yIGF0dHJpYnV0aW9uIGNvbmZpZ1xyXG4gICAgY29uc3Qgc2V0dGluZ3MgPSByZWFkU2V0dGluZ3MocGF0aC5qb2luKGdldEdsb2JhbERpcignZ2VtaW5pJywgZXhwbGljaXRDb25maWdEaXIpLCAnc2V0dGluZ3MuanNvbicpKTtcclxuICAgIGlmICghc2V0dGluZ3MuYXR0cmlidXRpb24gfHwgc2V0dGluZ3MuYXR0cmlidXRpb24uY29tbWl0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xyXG4gICAgfSBlbHNlIGlmIChzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQgPT09ICcnKSB7XHJcbiAgICAgIHJlc3VsdCA9IG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSBzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQ7XHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChydW50aW1lID09PSAnY2xhdWRlJykge1xyXG4gICAgLy8gQ2xhdWRlIENvZGVcclxuICAgIGNvbnN0IHNldHRpbmdzID0gcmVhZFNldHRpbmdzKHBhdGguam9pbihnZXRHbG9iYWxEaXIoJ2NsYXVkZScsIGV4cGxpY2l0Q29uZmlnRGlyKSwgJ3NldHRpbmdzLmpzb24nKSk7XHJcbiAgICBpZiAoIXNldHRpbmdzLmF0dHJpYnV0aW9uIHx8IHNldHRpbmdzLmF0dHJpYnV0aW9uLmNvbW1pdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MuYXR0cmlidXRpb24uY29tbWl0ID09PSAnJykge1xyXG4gICAgICByZXN1bHQgPSBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gc2V0dGluZ3MuYXR0cmlidXRpb24uY29tbWl0O1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBDb2RleCBhbmQgQ29waWxvdCBjdXJyZW50bHkgaGF2ZSBubyBhdHRyaWJ1dGlvbiBzZXR0aW5nIGVxdWl2YWxlbnRcclxuICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8vIENhY2hlIGFuZCByZXR1cm5cclxuICBhdHRyaWJ1dGlvbkNhY2hlLnNldChydW50aW1lLCByZXN1bHQpO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcm9jZXNzIENvLUF1dGhvcmVkLUJ5IGxpbmVzIGJhc2VkIG9uIGF0dHJpYnV0aW9uIHNldHRpbmdcclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBGaWxlIGNvbnRlbnQgdG8gcHJvY2Vzc1xyXG4gKiBAcGFyYW0ge251bGx8dW5kZWZpbmVkfHN0cmluZ30gYXR0cmlidXRpb24gLSBudWxsPXJlbW92ZSwgdW5kZWZpbmVkPWtlZXAsIHN0cmluZz1yZXBsYWNlXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFByb2Nlc3NlZCBjb250ZW50XHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudDogc3RyaW5nLCBhdHRyaWJ1dGlvbjogbnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgaWYgKGF0dHJpYnV0aW9uID09PSBudWxsKSB7XHJcbiAgICAvLyBSZW1vdmUgQ28tQXV0aG9yZWQtQnkgbGluZXMgYW5kIHRoZSBwcmVjZWRpbmcgYmxhbmsgbGluZVxyXG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvKFxccj9cXG4pezJ9Q28tQXV0aG9yZWQtQnk6LiokL2dpbSwgJycpO1xyXG4gIH1cclxuICBpZiAoYXR0cmlidXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgfVxyXG4gIC8vIFJlcGxhY2Ugd2l0aCBjdXN0b20gYXR0cmlidXRpb24gKGVzY2FwZSAkIHRvIHByZXZlbnQgYmFja3JlZmVyZW5jZSBpbmplY3Rpb24pXHJcbiAgY29uc3Qgc2FmZUF0dHJpYnV0aW9uID0gYXR0cmlidXRpb24ucmVwbGFjZSgvXFwkL2csICckJCQkJyk7XHJcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvQ28tQXV0aG9yZWQtQnk6LiokL2dpbSwgYENvLUF1dGhvcmVkLUJ5OiAke3NhZmVBdHRyaWJ1dGlvbn1gKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnQgQ2xhdWRlIENvZGUgZnJvbnRtYXR0ZXIgdG8gb3BlbmNvZGUgZm9ybWF0XHJcbiAqIC0gQ29udmVydHMgJ2FsbG93ZWQtdG9vbHM6JyBhcnJheSB0byAncGVybWlzc2lvbjonIG9iamVjdFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIE1hcmtkb3duIGZpbGUgY29udGVudCB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcclxuICogQHJldHVybnMge3N0cmluZ30gLSBDb250ZW50IHdpdGggY29udmVydGVkIGZyb250bWF0dGVyXHJcbiAqL1xyXG4vLyBDb2xvciBuYW1lIHRvIGhleCBtYXBwaW5nIGZvciBvcGVuY29kZSBjb21wYXRpYmlsaXR5XHJcbmNvbnN0IGNvbG9yTmFtZVRvSGV4ID0ge1xyXG4gIGN5YW46ICcjMDBGRkZGJyxcclxuICByZWQ6ICcjRkYwMDAwJyxcclxuICBncmVlbjogJyMwMEZGMDAnLFxyXG4gIGJsdWU6ICcjMDAwMEZGJyxcclxuICB5ZWxsb3c6ICcjRkZGRjAwJyxcclxuICBtYWdlbnRhOiAnI0ZGMDBGRicsXHJcbiAgb3JhbmdlOiAnI0ZGQTUwMCcsXHJcbiAgcHVycGxlOiAnIzgwMDA4MCcsXHJcbiAgcGluazogJyNGRkMwQ0InLFxyXG4gIHdoaXRlOiAnI0ZGRkZGRicsXHJcbiAgYmxhY2s6ICcjMDAwMDAwJyxcclxuICBncmF5OiAnIzgwODA4MCcsXHJcbiAgZ3JleTogJyM4MDgwODAnLFxyXG59O1xyXG5cclxuLy8gVG9vbCBuYW1lIG1hcHBpbmcgZnJvbSBDbGF1ZGUgQ29kZSB0byBPcGVuQ29kZVxyXG4vLyBPcGVuQ29kZSB1c2VzIGxvd2VyY2FzZSB0b29sIG5hbWVzOyBzcGVjaWFsIG1hcHBpbmdzIGZvciByZW5hbWVkIHRvb2xzXHJcbmNvbnN0IGNsYXVkZVRvT3BlbmNvZGVUb29scyA9IHtcclxuICBBc2tVc2VyUXVlc3Rpb246ICdxdWVzdGlvbicsXHJcbiAgU2xhc2hDb21tYW5kOiAnc2tpbGwnLFxyXG4gIFRvZG9Xcml0ZTogJ3RvZG93cml0ZScsXHJcbiAgV2ViRmV0Y2g6ICd3ZWJmZXRjaCcsXHJcbiAgV2ViU2VhcmNoOiAnd2Vic2VhcmNoJywgIC8vIFBsdWdpbi9NQ1AgLSBrZWVwIGZvciBjb21wYXRpYmlsaXR5XHJcbn07XHJcblxyXG4vLyBUb29sIG5hbWUgbWFwcGluZyBmcm9tIENsYXVkZSBDb2RlIHRvIEdlbWluaSBDTElcclxuLy8gR2VtaW5pIENMSSB1c2VzIHNuYWtlX2Nhc2UgYnVpbHQtaW4gdG9vbCBuYW1lc1xyXG5jb25zdCBjbGF1ZGVUb0dlbWluaVRvb2xzID0ge1xyXG4gIFJlYWQ6ICdyZWFkX2ZpbGUnLFxyXG4gIFdyaXRlOiAnd3JpdGVfZmlsZScsXHJcbiAgRWRpdDogJ3JlcGxhY2UnLFxyXG4gIEJhc2g6ICdydW5fc2hlbGxfY29tbWFuZCcsXHJcbiAgR2xvYjogJ2dsb2InLFxyXG4gIEdyZXA6ICdzZWFyY2hfZmlsZV9jb250ZW50JyxcclxuICBXZWJTZWFyY2g6ICdnb29nbGVfd2ViX3NlYXJjaCcsXHJcbiAgV2ViRmV0Y2g6ICd3ZWJfZmV0Y2gnLFxyXG4gIFRvZG9Xcml0ZTogJ3dyaXRlX3RvZG9zJyxcclxuICBBc2tVc2VyUXVlc3Rpb246ICdhc2tfdXNlcicsXHJcbn07XHJcblxyXG4vKipcclxuICogQ29udmVydCBhIENsYXVkZSBDb2RlIHRvb2wgbmFtZSB0byBPcGVuQ29kZSBmb3JtYXRcclxuICogLSBBcHBsaWVzIHNwZWNpYWwgbWFwcGluZ3MgKEFza1VzZXJRdWVzdGlvbiAtPiBxdWVzdGlvbiwgZXRjLilcclxuICogLSBDb252ZXJ0cyB0byBsb3dlcmNhc2UgKGV4Y2VwdCBNQ1AgdG9vbHMgd2hpY2gga2VlcCB0aGVpciBmb3JtYXQpXHJcbiAqL1xyXG5mdW5jdGlvbiBjb252ZXJ0VG9vbE5hbWUoY2xhdWRlVG9vbCkge1xyXG4gIC8vIENoZWNrIGZvciBzcGVjaWFsIG1hcHBpbmcgZmlyc3RcclxuICBpZiAoY2xhdWRlVG9PcGVuY29kZVRvb2xzW2NsYXVkZVRvb2xdKSB7XHJcbiAgICByZXR1cm4gY2xhdWRlVG9PcGVuY29kZVRvb2xzW2NsYXVkZVRvb2xdO1xyXG4gIH1cclxuICAvLyBNQ1AgdG9vbHMgKG1jcF9fKikga2VlcCB0aGVpciBmb3JtYXRcclxuICBpZiAoY2xhdWRlVG9vbC5zdGFydHNXaXRoKCdtY3BfXycpKSB7XHJcbiAgICByZXR1cm4gY2xhdWRlVG9vbDtcclxuICB9XHJcbiAgLy8gRGVmYXVsdDogY29udmVydCB0byBsb3dlcmNhc2VcclxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCBhIENsYXVkZSBDb2RlIHRvb2wgbmFtZSB0byBHZW1pbmkgQ0xJIGZvcm1hdFxyXG4gKiAtIEFwcGxpZXMgQ2xhdWRlXHUyMTkyR2VtaW5pIG1hcHBpbmcgKFJlYWRcdTIxOTJyZWFkX2ZpbGUsIEJhc2hcdTIxOTJydW5fc2hlbGxfY29tbWFuZCwgZXRjLilcclxuICogLSBGaWx0ZXJzIG91dCBNQ1AgdG9vbHMgKG1jcF9fKikgXHUyMDE0IHRoZXkgYXJlIGF1dG8tZGlzY292ZXJlZCBhdCBydW50aW1lIGluIEdlbWluaVxyXG4gKiAtIEZpbHRlcnMgb3V0IFRhc2sgXHUyMDE0IGFnZW50cyBhcmUgYXV0by1yZWdpc3RlcmVkIGFzIHRvb2xzIGluIEdlbWluaVxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9IEdlbWluaSB0b29sIG5hbWUsIG9yIG51bGwgaWYgdG9vbCBzaG91bGQgYmUgZXhjbHVkZWRcclxuICovXHJcbmZ1bmN0aW9uIGNvbnZlcnRHZW1pbmlUb29sTmFtZShjbGF1ZGVUb29sKSB7XHJcbiAgLy8gTUNQIHRvb2xzOiBleGNsdWRlIFx1MjAxNCBhdXRvLWRpc2NvdmVyZWQgZnJvbSBtY3BTZXJ2ZXJzIGNvbmZpZyBhdCBydW50aW1lXHJcbiAgaWYgKGNsYXVkZVRvb2wuc3RhcnRzV2l0aCgnbWNwX18nKSkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIC8vIFRhc2s6IGV4Y2x1ZGUgXHUyMDE0IGFnZW50cyBhcmUgYXV0by1yZWdpc3RlcmVkIGFzIGNhbGxhYmxlIHRvb2xzXHJcbiAgaWYgKGNsYXVkZVRvb2wgPT09ICdUYXNrJykge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIC8vIENoZWNrIGZvciBleHBsaWNpdCBtYXBwaW5nXHJcbiAgaWYgKGNsYXVkZVRvR2VtaW5pVG9vbHNbY2xhdWRlVG9vbF0pIHtcclxuICAgIHJldHVybiBjbGF1ZGVUb0dlbWluaVRvb2xzW2NsYXVkZVRvb2xdO1xyXG4gIH1cclxuICAvLyBEZWZhdWx0OiBsb3dlcmNhc2VcclxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCBhIENsYXVkZSBDb2RlIHRvb2wgbmFtZSB0byBHaXRIdWIgQ29waWxvdCBmb3JtYXQuXHJcbiAqIC0gQXBwbGllcyBleHBsaWNpdCBtYXBwaW5nIGZyb20gY2xhdWRlVG9Db3BpbG90VG9vbHNcclxuICogLSBIYW5kbGVzIG1jcF9fY29udGV4dDdfXyogcHJlZml4IFx1MjE5MiBpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8qXHJcbiAqIC0gRmFsbHMgYmFjayB0byBsb3dlcmNhc2UgZm9yIHVua25vd24gdG9vbHNcclxuICovXHJcbmZ1bmN0aW9uIGNvbnZlcnRDb3BpbG90VG9vbE5hbWUoY2xhdWRlVG9vbCkge1xyXG4gIC8vIG1jcF9fY29udGV4dDdfXyogd2lsZGNhcmQgXHUyMTkyIGlvLmdpdGh1Yi51cHN0YXNoL2NvbnRleHQ3LypcclxuICBpZiAoY2xhdWRlVG9vbC5zdGFydHNXaXRoKCdtY3BfX2NvbnRleHQ3X18nKSkge1xyXG4gICAgcmV0dXJuICdpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8nICsgY2xhdWRlVG9vbC5zbGljZSgnbWNwX19jb250ZXh0N19fJy5sZW5ndGgpO1xyXG4gIH1cclxuICAvLyBDaGVjayBleHBsaWNpdCBtYXBwaW5nXHJcbiAgaWYgKGNsYXVkZVRvQ29waWxvdFRvb2xzW2NsYXVkZVRvb2xdKSB7XHJcbiAgICByZXR1cm4gY2xhdWRlVG9Db3BpbG90VG9vbHNbY2xhdWRlVG9vbF07XHJcbiAgfVxyXG4gIC8vIERlZmF1bHQ6IGxvd2VyY2FzZVxyXG4gIHJldHVybiBjbGF1ZGVUb29sLnRvTG93ZXJDYXNlKCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBseSBDb3BpbG90LXNwZWNpZmljIGNvbnRlbnQgY29udmVyc2lvbiBcdTIwMTQgQ09OVi0wNiAocGF0aHMpICsgQ09OVi0wNyAoY29tbWFuZCBuYW1lcykuXHJcbiAqIFBhdGggbWFwcGluZ3MgZGVwZW5kIG9uIGluc3RhbGwgbW9kZTpcclxuICogICBHbG9iYWw6IH4vLmNsYXVkZS8gXHUyMTkyIH4vLmNvcGlsb3QvLCAuLy5jbGF1ZGUvIFx1MjE5MiAuLy5naXRodWIvXHJcbiAqICAgTG9jYWw6ICB+Ly5jbGF1ZGUvIFx1MjE5MiAuLy5naXRodWIvLCAuLy5jbGF1ZGUvIFx1MjE5MiAuLy5naXRodWIvXHJcbiAqIEFwcGxpZWQgdG8gQUxMIENvcGlsb3QgY29udGVudCAoc2tpbGxzLCBhZ2VudHMsIGVuZ2luZSBmaWxlcykuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gU291cmNlIGNvbnRlbnQgdG8gY29udmVydFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0dsb2JhbD1mYWxzZV0gLSBXaGV0aGVyIHRoaXMgaXMgYSBnbG9iYWwgaW5zdGFsbFxyXG4gKi9cclxuZnVuY3Rpb24gY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQoY29udGVudCwgaXNHbG9iYWwgPSBmYWxzZSkge1xyXG4gIGxldCBjID0gY29udGVudDtcclxuICAvLyBDT05WLTA2OiBQYXRoIHJlcGxhY2VtZW50IFx1MjAxNCBtb3N0IHNwZWNpZmljIGZpcnN0IHRvIGF2b2lkIHN1YnN0cmluZyBtYXRjaGVzXHJcbiAgaWYgKGlzR2xvYmFsKSB7XHJcbiAgICBjID0gYy5yZXBsYWNlKC9cXCRIT01FXFwvXFwuY2xhdWRlXFwvL2csICckSE9NRS8uY29waWxvdC8nKTtcclxuICAgIGMgPSBjLnJlcGxhY2UoL35cXC9cXC5jbGF1ZGVcXC8vZywgJ34vLmNvcGlsb3QvJyk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGMgPSBjLnJlcGxhY2UoL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZywgJy5naXRodWIvJyk7XHJcbiAgICBjID0gYy5yZXBsYWNlKC9+XFwvXFwuY2xhdWRlXFwvL2csICcuZ2l0aHViLycpO1xyXG4gIH1cclxuICBjID0gYy5yZXBsYWNlKC9cXC5cXC9cXC5jbGF1ZGVcXC8vZywgJy4vLmdpdGh1Yi8nKTtcclxuICBjID0gYy5yZXBsYWNlKC9cXC5jbGF1ZGVcXC8vZywgJy5naXRodWIvJyk7XHJcbiAgLy8gQ09OVi0wNzogQ29tbWFuZCBuYW1lIGNvbnZlcnNpb24gKGFsbCBlejogcmVmZXJlbmNlcyBcdTIxOTIgZXotKVxyXG4gIGMgPSBjLnJlcGxhY2UoL2V6Oi9nLCAnZXotJyk7XHJcbiAgcmV0dXJuIGM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0IGEgQ2xhdWRlIGNvbW1hbmQgKC5tZCkgdG8gYSBDb3BpbG90IHNraWxsIChTS0lMTC5tZCkuXHJcbiAqIFRyYW5zZm9ybXMgZnJvbnRtYXR0ZXIgb25seSBcdTIwMTQgYm9keSBwYXNzZXMgdGhyb3VnaCB3aXRoIENPTlYtMDYvMDcgYXBwbGllZC5cclxuICogU2tpbGxzIGtlZXAgb3JpZ2luYWwgdG9vbCBuYW1lcyAobm8gbWFwcGluZykgcGVyIENPTlRFWFQubWQgZGVjaXNpb24uXHJcbiAqL1xyXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlQ29tbWFuZFRvQ29waWxvdFNraWxsKGNvbnRlbnQsIHNraWxsTmFtZSwgaXNHbG9iYWwgPSBmYWxzZSkge1xyXG4gIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsKTtcclxuICBjb25zdCB7IGZyb250bWF0dGVyLCBib2R5IH0gPSBleHRyYWN0RnJvbnRtYXR0ZXJBbmRCb2R5KGNvbnZlcnRlZCk7XHJcbiAgaWYgKCFmcm9udG1hdHRlcikgcmV0dXJuIGNvbnZlcnRlZDtcclxuXHJcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2Rlc2NyaXB0aW9uJykgfHwgJyc7XHJcbiAgY29uc3QgYXJndW1lbnRIaW50ID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdhcmd1bWVudC1oaW50Jyk7XHJcbiAgY29uc3QgYWdlbnQgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2FnZW50Jyk7XHJcblxyXG4gIC8vIENPTlYtMDI6IEV4dHJhY3QgYWxsb3dlZC10b29scyBZQU1MIG11bHRpbGluZSBsaXN0IFx1MjE5MiBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nXHJcbiAgY29uc3QgdG9vbHNNYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKC9eYWxsb3dlZC10b29sczpcXHMqXFxuKCg/OlxccystXFxzKy4rXFxuPykqKS9tKTtcclxuICBsZXQgdG9vbHNMaW5lID0gJyc7XHJcbiAgaWYgKHRvb2xzTWF0Y2gpIHtcclxuICAgIGNvbnN0IHRvb2xzID0gdG9vbHNNYXRjaFsxXS5tYXRjaCgvXlxccystXFxzKyguKykvZ20pO1xyXG4gICAgaWYgKHRvb2xzKSB7XHJcbiAgICAgIHRvb2xzTGluZSA9IHRvb2xzLm1hcCh0ID0+IHQucmVwbGFjZSgvXlxccystXFxzKy8sICcnKS50cmltKCkpLmpvaW4oJywgJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSZWNvbnN0cnVjdCBmcm9udG1hdHRlciBpbiBDb3BpbG90IGZvcm1hdFxyXG4gIGxldCBmbSA9IGAtLS1cXG5uYW1lOiAke3NraWxsTmFtZX1cXG5kZXNjcmlwdGlvbjogJHtkZXNjcmlwdGlvbn1cXG5gO1xyXG4gIGlmIChhcmd1bWVudEhpbnQpIGZtICs9IGBhcmd1bWVudC1oaW50OiAke3lhbWxRdW90ZShhcmd1bWVudEhpbnQpfVxcbmA7XHJcbiAgaWYgKGFnZW50KSBmbSArPSBgYWdlbnQ6ICR7YWdlbnR9XFxuYDtcclxuICBpZiAodG9vbHNMaW5lKSBmbSArPSBgYWxsb3dlZC10b29sczogJHt0b29sc0xpbmV9XFxuYDtcclxuICBmbSArPSAnLS0tJztcclxuXHJcbiAgcmV0dXJuIGAke2ZtfVxcbiR7Ym9keX1gO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCBhIENsYXVkZSBhZ2VudCAoLm1kKSB0byBhIENvcGlsb3QgYWdlbnQgKC5hZ2VudC5tZCkuXHJcbiAqIEFwcGxpZXMgdG9vbCBtYXBwaW5nICsgZGVkdXBsaWNhdGlvbiwgZm9ybWF0cyB0b29scyBhcyBKU09OIGFycmF5LlxyXG4gKiBDT05WLTA0OiBKU09OIGFycmF5IGZvcm1hdC4gQ09OVi0wNTogVG9vbCBuYW1lIG1hcHBpbmcuXHJcbiAqL1xyXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvcGlsb3RBZ2VudChjb250ZW50LCBpc0dsb2JhbCA9IGZhbHNlKSB7XHJcbiAgY29uc3QgY29udmVydGVkID0gY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQoY29udGVudCwgaXNHbG9iYWwpO1xyXG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIsIGJvZHkgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udmVydGVkKTtcclxuICBpZiAoIWZyb250bWF0dGVyKSByZXR1cm4gY29udmVydGVkO1xyXG5cclxuICBjb25zdCBuYW1lID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICduYW1lJykgfHwgJ3Vua25vd24nO1xyXG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xyXG4gIGNvbnN0IGNvbG9yID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdjb2xvcicpO1xyXG4gIGNvbnN0IHRvb2xzUmF3ID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICd0b29scycpIHx8ICcnO1xyXG5cclxuICAvLyBDT05WLTA0ICsgQ09OVi0wNTogTWFwIHRvb2xzLCBkZWR1cGxpY2F0ZSwgZm9ybWF0IGFzIEpTT04gYXJyYXlcclxuICBjb25zdCBjbGF1ZGVUb29scyA9IHRvb2xzUmF3LnNwbGl0KCcsJykubWFwKHQgPT4gdC50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcclxuICBjb25zdCBtYXBwZWRUb29scyA9IGNsYXVkZVRvb2xzLm1hcCh0ID0+IGNvbnZlcnRDb3BpbG90VG9vbE5hbWUodCkpO1xyXG4gIGNvbnN0IHVuaXF1ZVRvb2xzID0gWy4uLm5ldyBTZXQobWFwcGVkVG9vbHMpXTtcclxuICBjb25zdCB0b29sc0FycmF5ID0gdW5pcXVlVG9vbHMubGVuZ3RoID4gMFxyXG4gICAgPyBcIlsnXCIgKyB1bmlxdWVUb29scy5qb2luKFwiJywgJ1wiKSArIFwiJ11cIlxyXG4gICAgOiAnW10nO1xyXG5cclxuICAvLyBSZWNvbnN0cnVjdCBmcm9udG1hdHRlciBpbiBDb3BpbG90IGZvcm1hdFxyXG4gIGxldCBmbSA9IGAtLS1cXG5uYW1lOiAke25hbWV9XFxuZGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259XFxudG9vbHM6ICR7dG9vbHNBcnJheX1cXG5gO1xyXG4gIGlmIChjb2xvcikgZm0gKz0gYGNvbG9yOiAke2NvbG9yfVxcbmA7XHJcbiAgZm0gKz0gJy0tLSc7XHJcblxyXG4gIHJldHVybiBgJHtmbX1cXG4ke2JvZHl9YDtcclxufVxyXG5cclxuZnVuY3Rpb24gdG9TaW5nbGVMaW5lKHZhbHVlKSB7XHJcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHlhbWxRdW90ZSh2YWx1ZSkge1xyXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCkge1xyXG4gIGlmICghY29udGVudC5zdGFydHNXaXRoKCctLS0nKSkge1xyXG4gICAgcmV0dXJuIHsgZnJvbnRtYXR0ZXI6IG51bGwsIGJvZHk6IGNvbnRlbnQgfTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGVuZEluZGV4ID0gY29udGVudC5pbmRleE9mKCctLS0nLCAzKTtcclxuICBpZiAoZW5kSW5kZXggPT09IC0xKSB7XHJcbiAgICByZXR1cm4geyBmcm9udG1hdHRlcjogbnVsbCwgYm9keTogY29udGVudCB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGZyb250bWF0dGVyOiBjb250ZW50LnN1YnN0cmluZygzLCBlbmRJbmRleCkudHJpbSgpLFxyXG4gICAgYm9keTogY29udGVudC5zdWJzdHJpbmcoZW5kSW5kZXggKyAzKSxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgZmllbGROYW1lKSB7XHJcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtmaWVsZE5hbWV9OlxcXFxzKiguKykkYCwgJ20nKTtcclxuICBjb25zdCBtYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKHJlZ2V4KTtcclxuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcclxuICByZXR1cm4gbWF0Y2hbMV0udHJpbSgpLnJlcGxhY2UoL15bJ1wiXXxbJ1wiXSQvZywgJycpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb252ZXJ0U2xhc2hDb21tYW5kc1RvQ29kZXhTa2lsbE1lbnRpb25zKGNvbnRlbnQpIHtcclxuICBsZXQgY29udmVydGVkID0gY29udGVudC5yZXBsYWNlKC9cXC9lejooW2EtejAtOS1dKykvZ2ksIChfLCBjb21tYW5kTmFtZSkgPT4ge1xyXG4gICAgcmV0dXJuIGAkZXotJHtTdHJpbmcoY29tbWFuZE5hbWUpLnRvTG93ZXJDYXNlKCl9YDtcclxuICB9KTtcclxuICBjb252ZXJ0ZWQgPSBjb252ZXJ0ZWQucmVwbGFjZSgvXFwvZXotaGVscFxcYi9nLCAnJGV6LWhlbHAnKTtcclxuICByZXR1cm4gY29udmVydGVkO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlVG9Db2RleE1hcmtkb3duKGNvbnRlbnQpIHtcclxuICBsZXQgY29udmVydGVkID0gY29udmVydFNsYXNoQ29tbWFuZHNUb0NvZGV4U2tpbGxNZW50aW9ucyhjb250ZW50KTtcclxuICBjb252ZXJ0ZWQgPSBjb252ZXJ0ZWQucmVwbGFjZSgvXFwkQVJHVU1FTlRTXFxiL2csICd7e0VaX0FSR1N9fScpO1xyXG4gIHJldHVybiBjb252ZXJ0ZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldENvZGV4U2tpbGxBZGFwdGVySGVhZGVyKHNraWxsTmFtZSkge1xyXG4gIGNvbnN0IGludm9jYXRpb24gPSBgJCR7c2tpbGxOYW1lfWA7XHJcbiAgcmV0dXJuIGA8Y29kZXhfc2tpbGxfYWRhcHRlcj5cclxuIyMgQS4gU2tpbGwgSW52b2NhdGlvblxyXG4tIFRoaXMgc2tpbGwgaXMgaW52b2tlZCBieSBtZW50aW9uaW5nIFxcYCR7aW52b2NhdGlvbn1cXGAuXHJcbi0gVHJlYXQgYWxsIHVzZXIgdGV4dCBhZnRlciBcXGAke2ludm9jYXRpb259XFxgIGFzIFxcYHt7RVpfQVJHU319XFxgLlxyXG4tIElmIG5vIGFyZ3VtZW50cyBhcmUgcHJlc2VudCwgdHJlYXQgXFxge3tFWl9BUkdTfX1cXGAgYXMgZW1wdHkuXHJcblxyXG4jIyBCLiBBc2tVc2VyUXVlc3Rpb24gXHUyMTkyIHJlcXVlc3RfdXNlcl9pbnB1dCBNYXBwaW5nXHJcbkVaX0FnZW50cyB3b3JrZmxvd3MgdXNlIFxcYEFza1VzZXJRdWVzdGlvblxcYCAoQ2xhdWRlIENvZGUgc3ludGF4KS4gVHJhbnNsYXRlIHRvIENvZGV4IFxcYHJlcXVlc3RfdXNlcl9pbnB1dFxcYDpcclxuXHJcblBhcmFtZXRlciBtYXBwaW5nOlxyXG4tIFxcYGhlYWRlclxcYCBcdTIxOTIgXFxgaGVhZGVyXFxgXHJcbi0gXFxgcXVlc3Rpb25cXGAgXHUyMTkyIFxcYHF1ZXN0aW9uXFxgXHJcbi0gT3B0aW9ucyBmb3JtYXR0ZWQgYXMgXFxgXCJMYWJlbFwiIFx1MjAxNCBkZXNjcmlwdGlvblxcYCBcdTIxOTIgXFxge2xhYmVsOiBcIkxhYmVsXCIsIGRlc2NyaXB0aW9uOiBcImRlc2NyaXB0aW9uXCJ9XFxgXHJcbi0gR2VuZXJhdGUgXFxgaWRcXGAgZnJvbSBoZWFkZXI6IGxvd2VyY2FzZSwgcmVwbGFjZSBzcGFjZXMgd2l0aCB1bmRlcnNjb3Jlc1xyXG5cclxuQmF0Y2hlZCBjYWxsczpcclxuLSBcXGBBc2tVc2VyUXVlc3Rpb24oW3ExLCBxMl0pXFxgIFx1MjE5MiBzaW5nbGUgXFxgcmVxdWVzdF91c2VyX2lucHV0XFxgIHdpdGggbXVsdGlwbGUgZW50cmllcyBpbiBcXGBxdWVzdGlvbnNbXVxcYFxyXG5cclxuTXVsdGktc2VsZWN0IHdvcmthcm91bmQ6XHJcbi0gQ29kZXggaGFzIG5vIFxcYG11bHRpU2VsZWN0XFxgLiBVc2Ugc2VxdWVudGlhbCBzaW5nbGUtc2VsZWN0cywgb3IgcHJlc2VudCBhIG51bWJlcmVkIGZyZWVmb3JtIGxpc3QgYXNraW5nIHRoZSB1c2VyIHRvIGVudGVyIGNvbW1hLXNlcGFyYXRlZCBudW1iZXJzLlxyXG5cclxuRXhlY3V0ZSBtb2RlIGZhbGxiYWNrOlxyXG4tIFdoZW4gXFxgcmVxdWVzdF91c2VyX2lucHV0XFxgIGlzIHJlamVjdGVkIChFeGVjdXRlIG1vZGUpLCBwcmVzZW50IGEgcGxhaW4tdGV4dCBudW1iZXJlZCBsaXN0IGFuZCBwaWNrIGEgcmVhc29uYWJsZSBkZWZhdWx0LlxyXG5cclxuIyMgQy4gVGFzaygpIFx1MjE5MiBzcGF3bl9hZ2VudCBNYXBwaW5nXHJcbkVaX0FnZW50cyB3b3JrZmxvd3MgdXNlIFxcYFRhc2soLi4uKVxcYCAoQ2xhdWRlIENvZGUgc3ludGF4KS4gVHJhbnNsYXRlIHRvIENvZGV4IGNvbGxhYm9yYXRpb24gdG9vbHM6XHJcblxyXG5EaXJlY3QgbWFwcGluZzpcclxuLSBcXGBUYXNrKHN1YmFnZW50X3R5cGU9XCJYXCIsIHByb21wdD1cIllcIilcXGAgXHUyMTkyIFxcYHNwYXduX2FnZW50KGFnZW50X3R5cGU9XCJYXCIsIG1lc3NhZ2U9XCJZXCIpXFxgXHJcbi0gXFxgVGFzayhtb2RlbD1cIi4uLlwiKVxcYCBcdTIxOTIgb21pdCAoQ29kZXggdXNlcyBwZXItcm9sZSBjb25maWcsIG5vdCBpbmxpbmUgbW9kZWwgc2VsZWN0aW9uKVxyXG4tIFxcYGZvcmtfY29udGV4dDogZmFsc2VcXGAgYnkgZGVmYXVsdCBcdTIwMTQgRVpfQWdlbnRzIGFnZW50cyBsb2FkIHRoZWlyIG93biBjb250ZXh0IHZpYSBcXGA8ZmlsZXNfdG9fcmVhZD5cXGAgYmxvY2tzXHJcblxyXG5QYXJhbGxlbCBmYW4tb3V0OlxyXG4tIFNwYXduIG11bHRpcGxlIGFnZW50cyBcdTIxOTIgY29sbGVjdCBhZ2VudCBJRHMgXHUyMTkyIFxcYHdhaXQoaWRzKVxcYCBmb3IgYWxsIHRvIGNvbXBsZXRlXHJcblxyXG5SZXN1bHQgcGFyc2luZzpcclxuLSBMb29rIGZvciBzdHJ1Y3R1cmVkIG1hcmtlcnMgaW4gYWdlbnQgb3V0cHV0OiBcXGBDSEVDS1BPSU5UXFxgLCBcXGBQTEFOIENPTVBMRVRFXFxgLCBcXGBTVU1NQVJZXFxgLCBldGMuXHJcbi0gXFxgY2xvc2VfYWdlbnQoaWQpXFxgIGFmdGVyIGNvbGxlY3RpbmcgcmVzdWx0cyBmcm9tIGVhY2ggYWdlbnRcclxuPC9jb2RleF9za2lsbF9hZGFwdGVyPmA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db2RleFNraWxsKGNvbnRlbnQsIHNraWxsTmFtZSkge1xyXG4gIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRDbGF1ZGVUb0NvZGV4TWFya2Rvd24oY29udGVudCk7XHJcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb252ZXJ0ZWQpO1xyXG4gIGxldCBkZXNjcmlwdGlvbiA9IGBSdW4gRVpfQWdlbnRzIHdvcmtmbG93ICR7c2tpbGxOYW1lfS5gO1xyXG4gIGlmIChmcm9udG1hdHRlcikge1xyXG4gICAgY29uc3QgbWF5YmVEZXNjcmlwdGlvbiA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnZGVzY3JpcHRpb24nKTtcclxuICAgIGlmIChtYXliZURlc2NyaXB0aW9uKSB7XHJcbiAgICAgIGRlc2NyaXB0aW9uID0gbWF5YmVEZXNjcmlwdGlvbjtcclxuICAgIH1cclxuICB9XHJcbiAgZGVzY3JpcHRpb24gPSB0b1NpbmdsZUxpbmUoZGVzY3JpcHRpb24pO1xyXG4gIGNvbnN0IHNob3J0RGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5sZW5ndGggPiAxODAgPyBgJHtkZXNjcmlwdGlvbi5zbGljZSgwLCAxNzcpfS4uLmAgOiBkZXNjcmlwdGlvbjtcclxuICBjb25zdCBhZGFwdGVyID0gZ2V0Q29kZXhTa2lsbEFkYXB0ZXJIZWFkZXIoc2tpbGxOYW1lKTtcclxuXHJcbiAgcmV0dXJuIGAtLS1cXG5uYW1lOiAke3lhbWxRdW90ZShza2lsbE5hbWUpfVxcbmRlc2NyaXB0aW9uOiAke3lhbWxRdW90ZShkZXNjcmlwdGlvbil9XFxubWV0YWRhdGE6XFxuICBzaG9ydC1kZXNjcmlwdGlvbjogJHt5YW1sUXVvdGUoc2hvcnREZXNjcmlwdGlvbil9XFxuLS0tXFxuXFxuJHthZGFwdGVyfVxcblxcbiR7Ym9keS50cmltU3RhcnQoKX1gO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlVG9Rd2VuQWdlbnQoY29udGVudCkge1xyXG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIsIGJvZHkgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XHJcbiAgaWYgKCFmcm9udG1hdHRlcikgcmV0dXJuIGNvbnRlbnQ7XHJcblxyXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XHJcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2Rlc2NyaXB0aW9uJykgfHwgJyc7XHJcblxyXG4gIC8vIFF3ZW4gQ29kZSB1c2VzIHNpbXBsZSBtYXJrZG93bi4gV2UnbGwgcHV0IG5hbWUgYW5kIGRlc2NyaXB0aW9uIGluIHRoZSBib2R5LlxyXG4gIHJldHVybiBgIyBBZ2VudDogJHtuYW1lfVxcblxcbiR7ZGVzY3JpcHRpb259XFxuXFxuJHtib2R5LnRyaW1TdGFydCgpfWA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0tpbWlTa2lsbChjb250ZW50LCBza2lsbE5hbWUpIHtcclxuICBjb25zdCB7IGZyb250bWF0dGVyLCBib2R5IH0gPSBleHRyYWN0RnJvbnRtYXR0ZXJBbmRCb2R5KGNvbnRlbnQpO1xyXG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb250ZW50O1xyXG5cclxuICBjb25zdCBkZXNjcmlwdGlvbiA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnZGVzY3JpcHRpb24nKSB8fCAnJztcclxuXHJcbiAgLy8gUmVjb25zdHJ1Y3QgYXMgc2ltcGxlIE1hcmtkb3duXHJcbiAgcmV0dXJuIGAjIFNraWxsOiAke3NraWxsTmFtZX1cXG5cXG4ke2Rlc2NyaXB0aW9ufVxcblxcbiR7Ym9keS50cmltU3RhcnQoKX1gO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlVG9LaW1pQWdlbnQoY29udGVudCkge1xyXG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIsIGJvZHkgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XHJcbiAgaWYgKCFmcm9udG1hdHRlcikgcmV0dXJuIGNvbnRlbnQ7XHJcblxyXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XHJcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2Rlc2NyaXB0aW9uJykgfHwgJyc7XHJcblxyXG4gIC8vIEtpbWkgQ29kZSB1c2VzIHNpbXBsZSBtYXJrZG93blxyXG4gIHJldHVybiBgIyBBZ2VudDogJHtuYW1lfVxcblxcbiR7ZGVzY3JpcHRpb259XFxuXFxuJHtib2R5LnRyaW1TdGFydCgpfWA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0IGEgQ2xhdWRlIGNvbW1hbmQgKC5tZCkgdG8gYSBRd2VuIHNraWxsIChTS0lMTC5tZCkuXHJcbiAqIFN0cmlwcyBmcm9udG1hdHRlciBhbmQgZm9ybWF0cyBhcyBzaW1wbGUgTWFya2Rvd24uXHJcbiAqL1xyXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlVG9Rd2VuU2tpbGwoY29udGVudCwgc2tpbGxOYW1lKSB7XHJcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb250ZW50KTtcclxuICBpZiAoIWZyb250bWF0dGVyKSByZXR1cm4gY29udGVudDtcclxuXHJcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2Rlc2NyaXB0aW9uJykgfHwgJyc7XHJcblxyXG4gIC8vIFJlY29uc3RydWN0IGFzIHNpbXBsZSBNYXJrZG93blxyXG4gIHJldHVybiBgIyBTa2lsbDogJHtza2lsbE5hbWV9XFxuXFxuJHtkZXNjcmlwdGlvbn1cXG5cXG4ke2JvZHkudHJpbVN0YXJ0KCl9YDtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnQgQ2xhdWRlIENvZGUgYWdlbnQgbWFya2Rvd24gdG8gQ29kZXggYWdlbnQgZm9ybWF0LlxyXG4gKiBBcHBsaWVzIGJhc2UgbWFya2Rvd24gY29udmVyc2lvbnMsIHRoZW4gYWRkcyBhIDxjb2RleF9hZ2VudF9yb2xlPiBoZWFkZXJcclxuICogYW5kIGNsZWFucyB1cCBmcm9udG1hdHRlciAocmVtb3ZlcyB0b29scy9jb2xvciBmaWVsZHMpLlxyXG4gKi9cclxuZnVuY3Rpb24gY29udmVydENsYXVkZUFnZW50VG9Db2RleEFnZW50KGNvbnRlbnQpIHtcclxuICBsZXQgY29udmVydGVkID0gY29udmVydENsYXVkZVRvQ29kZXhNYXJrZG93bihjb250ZW50KTtcclxuXHJcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb252ZXJ0ZWQpO1xyXG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb252ZXJ0ZWQ7XHJcblxyXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XHJcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2Rlc2NyaXB0aW9uJykgfHwgJyc7XHJcbiAgY29uc3QgdG9vbHMgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ3Rvb2xzJykgfHwgJyc7XHJcblxyXG4gIGNvbnN0IHJvbGVIZWFkZXIgPSBgPGNvZGV4X2FnZW50X3JvbGU+XHJcbnJvbGU6ICR7bmFtZX1cclxudG9vbHM6ICR7dG9vbHN9XHJcbnB1cnBvc2U6ICR7dG9TaW5nbGVMaW5lKGRlc2NyaXB0aW9uKX1cclxuPC9jb2RleF9hZ2VudF9yb2xlPmA7XHJcblxyXG4gIGNvbnN0IGNsZWFuRnJvbnRtYXR0ZXIgPSBgLS0tXFxubmFtZTogJHt5YW1sUXVvdGUobmFtZSl9XFxuZGVzY3JpcHRpb246ICR7eWFtbFF1b3RlKHRvU2luZ2xlTGluZShkZXNjcmlwdGlvbikpfVxcbi0tLWA7XHJcblxyXG4gIHJldHVybiBgJHtjbGVhbkZyb250bWF0dGVyfVxcblxcbiR7cm9sZUhlYWRlcn1cXG4ke2JvZHl9YDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIGEgcGVyLWFnZW50IC50b21sIGNvbmZpZyBmaWxlIGZvciBDb2RleC5cclxuICogU2V0cyBzYW5kYm94X21vZGUgYW5kIGRldmVsb3Blcl9pbnN0cnVjdGlvbnMgZnJvbSB0aGUgYWdlbnQgbWFya2Rvd24gYm9keS5cclxuICovXHJcbmZ1bmN0aW9uIGdlbmVyYXRlQ29kZXhBZ2VudFRvbWwoYWdlbnROYW1lLCBhZ2VudENvbnRlbnQpIHtcclxuICBjb25zdCBzYW5kYm94TW9kZSA9IENPREVYX0FHRU5UX1NBTkRCT1hbYWdlbnROYW1lXSB8fCAncmVhZC1vbmx5JztcclxuICBjb25zdCB7IGJvZHkgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoYWdlbnRDb250ZW50KTtcclxuICBjb25zdCBpbnN0cnVjdGlvbnMgPSBib2R5LnRyaW0oKTtcclxuXHJcbiAgY29uc3QgbGluZXMgPSBbXHJcbiAgICBgc2FuZGJveF9tb2RlID0gXCIke3NhbmRib3hNb2RlfVwiYCxcclxuICAgIC8vIEFnZW50IHByb21wdHMgY29udGFpbiByYXcgYmFja3NsYXNoZXMgaW4gcmVnZXhlcyBhbmQgc2hlbGwgc25pcHBldHMuXHJcbiAgICAvLyBUT01MIGxpdGVyYWwgbXVsdGlsaW5lIHN0cmluZ3MgcHJlc2VydmUgdGhlbSB3aXRob3V0IGVzY2FwZSBwYXJzaW5nLlxyXG4gICAgYGRldmVsb3Blcl9pbnN0cnVjdGlvbnMgPSAnJydgLFxyXG4gICAgaW5zdHJ1Y3Rpb25zLFxyXG4gICAgYCcnJ2AsXHJcbiAgXTtcclxuICByZXR1cm4gbGluZXMuam9pbignXFxuJykgKyAnXFxuJztcclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIHRoZSBFWl9BZ2VudHMgY29uZmlnIGJsb2NrIGZvciBDb2RleCBjb25maWcudG9tbC5cclxuICogQHBhcmFtIHtBcnJheTx7bmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nfT59IGFnZW50c1xyXG4gKi9cclxuZnVuY3Rpb24gZ2VuZXJhdGVDb2RleENvbmZpZ0Jsb2NrKGFnZW50cykge1xyXG4gIGNvbnN0IGxpbmVzID0gW1xyXG4gICAgRVpfQ09ERVhfTUFSS0VSLFxyXG4gICAgJycsXHJcbiAgXTtcclxuXHJcbiAgZm9yIChjb25zdCB7IG5hbWUsIGRlc2NyaXB0aW9uIH0gb2YgYWdlbnRzKSB7XHJcbiAgICBsaW5lcy5wdXNoKGBbYWdlbnRzLiR7bmFtZX1dYCk7XHJcbiAgICBsaW5lcy5wdXNoKGBkZXNjcmlwdGlvbiA9ICR7SlNPTi5zdHJpbmdpZnkoZGVzY3JpcHRpb24pfWApO1xyXG4gICAgbGluZXMucHVzaChgY29uZmlnX2ZpbGUgPSBcImFnZW50cy8ke25hbWV9LnRvbWxcImApO1xyXG4gICAgbGluZXMucHVzaCgnJyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTdHJpcCBFWl9BZ2VudHMgc2VjdGlvbnMgZnJvbSBDb2RleCBjb25maWcudG9tbCBjb250ZW50LlxyXG4gKiBSZXR1cm5zIGNsZWFuZWQgY29udGVudCwgb3IgbnVsbCBpZiBmaWxlIHdvdWxkIGJlIGVtcHR5LlxyXG4gKi9cclxuZnVuY3Rpb24gc3RyaXBFekFnZW50c0Zyb21Db2RleENvbmZpZyhjb250ZW50KSB7XHJcbiAgY29uc3QgbWFya2VySW5kZXggPSBjb250ZW50LmluZGV4T2YoRVpfQ09ERVhfTUFSS0VSKTtcclxuXHJcbiAgaWYgKG1hcmtlckluZGV4ICE9PSAtMSkge1xyXG4gICAgLy8gSGFzIEVaX0FnZW50cyBtYXJrZXIgXHUyMDE0IHJlbW92ZSBldmVyeXRoaW5nIGZyb20gbWFya2VyIHRvIEVPRlxyXG4gICAgbGV0IGJlZm9yZSA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIG1hcmtlckluZGV4KS50cmltRW5kKCk7XHJcbiAgICAvLyBBbHNvIHN0cmlwIEVaLWluamVjdGVkIGZlYXR1cmUga2V5cyBhYm92ZSB0aGUgbWFya2VyIChDYXNlIDMgaW5qZWN0KVxyXG4gICAgYmVmb3JlID0gYmVmb3JlLnJlcGxhY2UoL15tdWx0aV9hZ2VudFxccyo9XFxzKnRydWVcXHMqXFxuPy9tLCAnJyk7XHJcbiAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXmRlZmF1bHRfbW9kZV9yZXF1ZXN0X3VzZXJfaW5wdXRcXHMqPVxccyp0cnVlXFxzKlxcbj8vbSwgJycpO1xyXG4gICAgYmVmb3JlID0gYmVmb3JlLnJlcGxhY2UoL15cXFtmZWF0dXJlc1xcXVxccypcXG4oPz1cXFt8JCkvbSwgJycpO1xyXG4gICAgYmVmb3JlID0gYmVmb3JlLnJlcGxhY2UoL1xcbnszLH0vZywgJ1xcblxcbicpLnRyaW0oKTtcclxuICAgIGlmICghYmVmb3JlKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiBiZWZvcmUgKyAnXFxuJztcclxuICB9XHJcblxyXG4gIC8vIE5vIG1hcmtlciBidXQgbWF5IGhhdmUgRVotaW5qZWN0ZWQgZmVhdHVyZSBrZXlzXHJcbiAgbGV0IGNsZWFuZWQgPSBjb250ZW50O1xyXG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL15tdWx0aV9hZ2VudFxccyo9XFxzKnRydWVcXHMqXFxuPy9tLCAnJyk7XHJcbiAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvXmRlZmF1bHRfbW9kZV9yZXF1ZXN0X3VzZXJfaW5wdXRcXHMqPVxccyp0cnVlXFxzKlxcbj8vbSwgJycpO1xyXG5cclxuICAvLyBSZW1vdmUgW2FnZW50cy5lei0qXSBzZWN0aW9ucyAoZnJvbSBoZWFkZXIgdG8gbmV4dCBzZWN0aW9uIG9yIEVPRilcclxuICBjbGVhbmVkID0gY2xlYW5lZC5yZXBsYWNlKC9eXFxbYWdlbnRzXFwuZXotW15cXF1dK1xcXVxcbig/Oig/IVxcWylbXlxcbl0qXFxuPykqL2dtLCAnJyk7XHJcblxyXG4gIC8vIFJlbW92ZSBbZmVhdHVyZXNdIHNlY3Rpb24gaWYgbm93IGVtcHR5IChvbmx5IGhlYWRlciwgbm8ga2V5cyBiZWZvcmUgbmV4dCBzZWN0aW9uKVxyXG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL15cXFtmZWF0dXJlc1xcXVxccypcXG4oPz1cXFt8JCkvbSwgJycpO1xyXG5cclxuICAvLyBSZW1vdmUgW2FnZW50c10gc2VjdGlvbiBpZiBub3cgZW1wdHlcclxuICBjbGVhbmVkID0gY2xlYW5lZC5yZXBsYWNlKC9eXFxbYWdlbnRzXFxdXFxzKlxcbig/PVxcW3wkKS9tLCAnJyk7XHJcblxyXG4gIC8vIENsZWFuIHVwIGV4Y2Vzc2l2ZSBibGFuayBsaW5lc1xyXG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL1xcbnszLH0vZywgJ1xcblxcbicpLnRyaW0oKTtcclxuXHJcbiAgaWYgKCFjbGVhbmVkKSByZXR1cm4gbnVsbDtcclxuICByZXR1cm4gY2xlYW5lZCArICdcXG4nO1xyXG59XHJcblxyXG4vKipcclxuICogTWVyZ2UgRVpfQWdlbnRzIGNvbmZpZyBibG9jayBpbnRvIGFuIGV4aXN0aW5nIG9yIG5ldyBjb25maWcudG9tbC5cclxuICogVGhyZWUgY2FzZXM6IG5ldyBmaWxlLCBleGlzdGluZyB3aXRoIEVaX0FnZW50cyBtYXJrZXIsIGV4aXN0aW5nIHdpdGhvdXQgbWFya2VyLlxyXG4gKi9cclxuZnVuY3Rpb24gbWVyZ2VDb2RleENvbmZpZyhjb25maWdQYXRoLCBFWl9BZ2VudHNCbG9jaykge1xyXG4gIC8vIENhc2UgMTogTm8gY29uZmlnLnRvbWwgXHUyMDE0IGNyZWF0ZSBmcmVzaFxyXG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xyXG4gICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBFWl9BZ2VudHNCbG9jayArICdcXG4nKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGNvbnN0IGV4aXN0aW5nID0gZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XHJcbiAgY29uc3QgbWFya2VySW5kZXggPSBleGlzdGluZy5pbmRleE9mKEVaX0NPREVYX01BUktFUik7XHJcblxyXG4gIC8vIENhc2UgMjogSGFzIEVaX0FnZW50cyBtYXJrZXIgXHUyMDE0IHRydW5jYXRlIGFuZCByZS1hcHBlbmRcclxuICBpZiAobWFya2VySW5kZXggIT09IC0xKSB7XHJcbiAgICBsZXQgYmVmb3JlID0gZXhpc3Rpbmcuc3Vic3RyaW5nKDAsIG1hcmtlckluZGV4KS50cmltRW5kKCk7XHJcbiAgICBpZiAoYmVmb3JlKSB7XHJcbiAgICAgIC8vIFN0cmlwIGFueSBFWi1tYW5hZ2VkIHNlY3Rpb25zIHRoYXQgbGVha2VkIGFib3ZlIHRoZSBtYXJrZXIgZnJvbSBwcmV2aW91cyBpbnN0YWxsc1xyXG4gICAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXlxcW2FnZW50c1xcLmV6LVteXFxdXStcXF1cXG4oPzooPyFcXFspW15cXG5dKlxcbj8pKi9nbSwgJycpO1xyXG4gICAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXlxcW2FnZW50c1xcXVxcbig/Oig/IVxcWylbXlxcbl0qXFxuPykqL20sICcnKTtcclxuICAgICAgYmVmb3JlID0gYmVmb3JlLnJlcGxhY2UoL1xcbnszLH0vZywgJ1xcblxcbicpLnRyaW1FbmQoKTtcclxuXHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgYmVmb3JlICsgJ1xcblxcbicgKyBFWl9BZ2VudHNCbG9jayArICdcXG4nKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgRVpfQWdlbnRzQmxvY2sgKyAnXFxuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICAvLyBDYXNlIDM6IE5vIG1hcmtlciBcdTIwMTQgYXBwZW5kIEVaX0FnZW50cyBibG9ja1xyXG4gIGxldCBjb250ZW50ID0gZXhpc3Rpbmc7XHJcbiAgY29udGVudCA9IGNvbnRlbnQudHJpbUVuZCgpICsgJ1xcblxcbicgKyBFWl9BZ2VudHNCbG9jayArICdcXG4nO1xyXG5cclxuICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGNvbnRlbnQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmaW5kQ29waWxvdEluc3RydWN0aW9uc01hcmtlclBhaXIoY29udGVudDogc3RyaW5nKTogeyBvcGVuSW5kZXg6IG51bWJlcjsgY2xvc2VJbmRleDogbnVtYmVyOyBjbG9zZU1hcmtlcjogc3RyaW5nIH0gfCBudWxsIHtcclxuICBjb25zdCBtYXJrZXJQYWlyczogW3N0cmluZywgc3RyaW5nXVtdID0gW1xyXG4gICAgW0VaX0NPUElMT1RfSU5TVFJVQ1RJT05TX01BUktFUiwgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfQ0xPU0VfTUFSS0VSXSxcclxuICAgIFtMRUdBQ1lfRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfTUFSS0VSLCBMRUdBQ1lfRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfQ0xPU0VfTUFSS0VSXSxcclxuICBdO1xyXG5cclxuICBmb3IgKGNvbnN0IFtvcGVuTWFya2VyLCBjbG9zZU1hcmtlcl0gb2YgbWFya2VyUGFpcnMpIHtcclxuICAgIGNvbnN0IG9wZW5JbmRleCA9IGNvbnRlbnQuaW5kZXhPZihvcGVuTWFya2VyKTtcclxuICAgIGNvbnN0IGNsb3NlSW5kZXggPSBjb250ZW50LmluZGV4T2YoY2xvc2VNYXJrZXIpO1xyXG4gICAgaWYgKG9wZW5JbmRleCAhPT0gLTEgJiYgY2xvc2VJbmRleCAhPT0gLTEgJiYgY2xvc2VJbmRleCA+PSBvcGVuSW5kZXgpIHtcclxuICAgICAgcmV0dXJuIHsgb3BlbkluZGV4LCBjbG9zZUluZGV4LCBjbG9zZU1hcmtlciB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBNZXJnZSBFWl9BZ2VudHMgaW5zdHJ1Y3Rpb25zIGludG8gY29waWxvdC1pbnN0cnVjdGlvbnMubWQuXHJcbiAqIFRocmVlIGNhc2VzOiBuZXcgZmlsZSwgZXhpc3Rpbmcgd2l0aCBtYXJrZXJzLCBleGlzdGluZyB3aXRob3V0IG1hcmtlcnMuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCAtIEZ1bGwgcGF0aCB0byBjb3BpbG90LWluc3RydWN0aW9ucy5tZFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gRVpfQWdlbnRzQ29udGVudCAtIFRlbXBsYXRlIGNvbnRlbnQgKHdpdGhvdXQgbWFya2VycylcclxuICovXHJcbmZ1bmN0aW9uIG1lcmdlQ29waWxvdEluc3RydWN0aW9ucyhmaWxlUGF0aCwgRVpfQWdlbnRzQ29udGVudCkge1xyXG4gIGNvbnN0IEVaX0FnZW50c0Jsb2NrID0gRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfTUFSS0VSICsgJ1xcbicgK1xyXG4gICAgRVpfQWdlbnRzQ29udGVudC50cmltKCkgKyAnXFxuJyArXHJcbiAgICBFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19DTE9TRV9NQVJLRVI7XHJcblxyXG4gIC8vIENhc2UgMTogTm8gZmlsZSBcdTIwMTQgY3JlYXRlIGZyZXNoXHJcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xyXG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgRVpfQWdlbnRzQmxvY2sgKyAnXFxuJyk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcclxuICBjb25zdCBtYXJrZXJNYXRjaCA9IGZpbmRDb3BpbG90SW5zdHJ1Y3Rpb25zTWFya2VyUGFpcihleGlzdGluZyk7XHJcblxyXG4gIC8vIENhc2UgMjogSGFzIEVaX0FnZW50cyBtYXJrZXJzIFx1MjAxNCByZXBsYWNlIGJldHdlZW4gbWFya2Vyc1xyXG4gIGlmIChtYXJrZXJNYXRjaCkge1xyXG4gICAgY29uc3QgYmVmb3JlID0gZXhpc3Rpbmcuc3Vic3RyaW5nKDAsIG1hcmtlck1hdGNoLm9wZW5JbmRleCkudHJpbUVuZCgpO1xyXG4gICAgY29uc3QgYWZ0ZXIgPSBleGlzdGluZy5zdWJzdHJpbmcobWFya2VyTWF0Y2guY2xvc2VJbmRleCArIG1hcmtlck1hdGNoLmNsb3NlTWFya2VyLmxlbmd0aCkudHJpbVN0YXJ0KCk7XHJcbiAgICBsZXQgbmV3Q29udGVudCA9ICcnO1xyXG4gICAgaWYgKGJlZm9yZSkgbmV3Q29udGVudCArPSBiZWZvcmUgKyAnXFxuXFxuJztcclxuICAgIG5ld0NvbnRlbnQgKz0gRVpfQWdlbnRzQmxvY2s7XHJcbiAgICBpZiAoYWZ0ZXIpIG5ld0NvbnRlbnQgKz0gJ1xcblxcbicgKyBhZnRlcjtcclxuICAgIG5ld0NvbnRlbnQgKz0gJ1xcbic7XHJcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIC8vIENhc2UgMzogTm8gbWFya2VycyBcdTIwMTQgYXBwZW5kIGF0IGVuZFxyXG4gIGNvbnN0IGNvbnRlbnQgPSBleGlzdGluZy50cmltRW5kKCkgKyAnXFxuXFxuJyArIEVaX0FnZW50c0Jsb2NrICsgJ1xcbic7XHJcbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgY29udGVudCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTdHJpcCBFWl9BZ2VudHMgc2VjdGlvbiBmcm9tIGNvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kIGNvbnRlbnQuXHJcbiAqIFJldHVybnMgY2xlYW5lZCBjb250ZW50LCBvciBudWxsIGlmIGZpbGUgc2hvdWxkIGJlIGRlbGV0ZWQgKHdhcyBFWi1vbmx5KS5cclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBGaWxlIGNvbnRlbnRcclxuICogQHJldHVybnMge3N0cmluZ3xudWxsfSAtIENsZWFuZWQgY29udGVudCBvciBudWxsIGlmIGVtcHR5XHJcbiAqL1xyXG5mdW5jdGlvbiBzdHJpcEV6QWdlbnRzRnJvbUNvcGlsb3RJbnN0cnVjdGlvbnMoY29udGVudCkge1xyXG4gIGNvbnN0IG1hcmtlck1hdGNoID0gZmluZENvcGlsb3RJbnN0cnVjdGlvbnNNYXJrZXJQYWlyKGNvbnRlbnQpO1xyXG5cclxuICBpZiAobWFya2VyTWF0Y2gpIHtcclxuICAgIGNvbnN0IGJlZm9yZSA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIG1hcmtlck1hdGNoLm9wZW5JbmRleCkudHJpbUVuZCgpO1xyXG4gICAgY29uc3QgYWZ0ZXIgPSBjb250ZW50LnN1YnN0cmluZyhtYXJrZXJNYXRjaC5jbG9zZUluZGV4ICsgbWFya2VyTWF0Y2guY2xvc2VNYXJrZXIubGVuZ3RoKS50cmltU3RhcnQoKTtcclxuICAgIGNvbnN0IGNsZWFuZWQgPSAoYmVmb3JlICsgKGJlZm9yZSAmJiBhZnRlciA/ICdcXG5cXG4nIDogJycpICsgYWZ0ZXIpLnRyaW0oKTtcclxuICAgIGlmICghY2xlYW5lZCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gY2xlYW5lZCArICdcXG4nO1xyXG4gIH1cclxuXHJcbiAgLy8gTm8gbWFya2VycyBmb3VuZCBcdTIwMTQgbm90aGluZyB0byBzdHJpcFxyXG4gIHJldHVybiBjb250ZW50O1xyXG59XHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgY29uZmlnLnRvbWwgYW5kIHBlci1hZ2VudCAudG9tbCBmaWxlcyBmb3IgQ29kZXguXHJcbiAqIFJlYWRzIGFnZW50IC5tZCBmaWxlcyBmcm9tIHNvdXJjZSwgZXh0cmFjdHMgbWV0YWRhdGEsIHdyaXRlcyAudG9tbCBjb25maWdzLlxyXG4gKi9cclxuZnVuY3Rpb24gaW5zdGFsbENvZGV4Q29uZmlnKHRhcmdldERpcjogc3RyaW5nLCBhZ2VudHNTcmM6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb25maWcudG9tbCcpO1xyXG4gIGNvbnN0IGFnZW50c1RvbWxEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnYWdlbnRzJyk7XHJcbiAgZnMubWtkaXJTeW5jKGFnZW50c1RvbWxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG5cclxuICBjb25zdCBhZ2VudEVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhhZ2VudHNTcmMpLmZpbHRlcihmID0+IGYuc3RhcnRzV2l0aCgnZXotJykgJiYgZi5lbmRzV2l0aCgnLm1kJykpO1xyXG4gIGNvbnN0IGFnZW50czogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfT4gPSBbXTtcclxuXHJcbiAgLy8gQ29tcHV0ZSB0aGUgQ29kZXggcGF0aFByZWZpeCBmb3IgcmVwbGFjaW5nIC5jbGF1ZGUgcGF0aHNcclxuICAvLyBVc2UgdGlsZGUtYmFzZWQgcGF0aCB0byBhdm9pZCBiYWtpbmcgYWJzb2x1dGUgcGF0aHMgaW50byB0ZW1wbGF0ZXNcclxuICBjb25zdCBjb2RleFBhdGhQcmVmaXggPSBgJHt0YXJnZXREaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpLnJlcGxhY2Uob3MuaG9tZWRpcigpLnJlcGxhY2UoL1xcXFwvZywgJy8nKSwgJ34nKX0vYDtcclxuXHJcbiAgZm9yIChjb25zdCBmaWxlIG9mIGFnZW50RW50cmllcykge1xyXG4gICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGFnZW50c1NyYywgZmlsZSksICd1dGY4Jyk7XHJcbiAgICAvLyBSZXBsYWNlIC5jbGF1ZGUgcGF0aHMgYmVmb3JlIGdlbmVyYXRpbmcgVE9NTCAoc291cmNlIGZpbGVzIHVzZSB+Ly5jbGF1ZGUgYW5kICRIT01FLy5jbGF1ZGUpXHJcbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9+XFwvXFwuY2xhdWRlXFwvL2csIGNvZGV4UGF0aFByZWZpeCk7XHJcbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9cXCRIT01FXFwvXFwuY2xhdWRlXFwvL2csIHRvSG9tZVByZWZpeChjb2RleFBhdGhQcmVmaXgpKTtcclxuICAgIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XHJcbiAgICBjb25zdCBuYW1lID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICduYW1lJykgfHwgZmlsZS5yZXBsYWNlKCcubWQnLCAnJyk7XHJcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnZGVzY3JpcHRpb24nKSB8fCAnJztcclxuXHJcbiAgICBhZ2VudHMucHVzaCh7IG5hbWUsIGRlc2NyaXB0aW9uOiB0b1NpbmdsZUxpbmUoZGVzY3JpcHRpb24pIH0pO1xyXG5cclxuICAgIGNvbnN0IHRvbWxDb250ZW50ID0gZ2VuZXJhdGVDb2RleEFnZW50VG9tbChuYW1lLCBjb250ZW50KTtcclxuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGFnZW50c1RvbWxEaXIsIGAke25hbWV9LnRvbWxgKSwgdG9tbENvbnRlbnQpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgRVpfQWdlbnRzQmxvY2sgPSBnZW5lcmF0ZUNvZGV4Q29uZmlnQmxvY2soYWdlbnRzKTtcclxuICBtZXJnZUNvZGV4Q29uZmlnKGNvbmZpZ1BhdGgsIEVaX0FnZW50c0Jsb2NrKTtcclxuXHJcbiAgcmV0dXJuIGFnZW50cy5sZW5ndGg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTdHJpcCBIVE1MIDxzdWI+IHRhZ3MgZm9yIEdlbWluaSBDTEkgb3V0cHV0XHJcbiAqIFRlcm1pbmFscyBkb24ndCBzdXBwb3J0IHN1YnNjcmlwdCBcdTIwMTQgR2VtaW5pIHJlbmRlcnMgdGhlc2UgYXMgcmF3IEhUTUwuXHJcbiAqIENvbnZlcnRzIDxzdWI+dGV4dDwvc3ViPiB0byBpdGFsaWMgKih0ZXh0KSogZm9yIHJlYWRhYmxlIHRlcm1pbmFsIG91dHB1dC5cclxuICovXHJcbmZ1bmN0aW9uIHN0cmlwU3ViVGFncyhjb250ZW50KSB7XHJcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvPHN1Yj4oLio/KTxcXC9zdWI+L2csICcqKCQxKSonKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnQgQ2xhdWRlIENvZGUgYWdlbnQgZnJvbnRtYXR0ZXIgdG8gR2VtaW5pIENMSSBmb3JtYXRcclxuICogR2VtaW5pIGFnZW50cyB1c2UgLm1kIGZpbGVzIHdpdGggWUFNTCBmcm9udG1hdHRlciwgc2FtZSBhcyBDbGF1ZGUsXHJcbiAqIGJ1dCB3aXRoIGRpZmZlcmVudCBmaWVsZCBuYW1lcyBhbmQgZm9ybWF0czpcclxuICogLSB0b29sczogbXVzdCBiZSBhIFlBTUwgYXJyYXkgKG5vdCBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nKVxyXG4gKiAtIHRvb2wgbmFtZXM6IG11c3QgdXNlIEdlbWluaSBidWlsdC1pbiBuYW1lcyAocmVhZF9maWxlLCBub3QgUmVhZClcclxuICogLSBjb2xvcjogbXVzdCBiZSByZW1vdmVkIChjYXVzZXMgdmFsaWRhdGlvbiBlcnJvcilcclxuICogLSBza2lsbHM6IG11c3QgYmUgcmVtb3ZlZCAoY2F1c2VzIHZhbGlkYXRpb24gZXJyb3IpXHJcbiAqIC0gbWNwX18qIHRvb2xzOiBtdXN0IGJlIGV4Y2x1ZGVkIChhdXRvLWRpc2NvdmVyZWQgYXQgcnVudGltZSlcclxuICovXHJcbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0dlbWluaUFnZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgaWYgKCFjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpKSByZXR1cm4gY29udGVudDtcclxuXHJcbiAgY29uc3QgZW5kSW5kZXggPSBjb250ZW50LmluZGV4T2YoJy0tLScsIDMpO1xyXG4gIGlmIChlbmRJbmRleCA9PT0gLTEpIHJldHVybiBjb250ZW50O1xyXG5cclxuICBjb25zdCBmcm9udG1hdHRlciA9IGNvbnRlbnQuc3Vic3RyaW5nKDMsIGVuZEluZGV4KS50cmltKCk7XHJcbiAgY29uc3QgYm9keSA9IGNvbnRlbnQuc3Vic3RyaW5nKGVuZEluZGV4ICsgMyk7XHJcblxyXG4gIGNvbnN0IGxpbmVzID0gZnJvbnRtYXR0ZXIuc3BsaXQoJ1xcbicpO1xyXG4gIGNvbnN0IG5ld0xpbmVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGxldCBpbkFsbG93ZWRUb29scyA9IGZhbHNlO1xyXG4gIGxldCBpblNraXBwZWRBcnJheUZpZWxkID0gZmFsc2U7XHJcbiAgY29uc3QgdG9vbHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xyXG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xyXG5cclxuICAgIGlmIChpblNraXBwZWRBcnJheUZpZWxkKSB7XHJcbiAgICAgIGlmICghdHJpbW1lZCB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoJy0gJykpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBpblNraXBwZWRBcnJheUZpZWxkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udmVydCBhbGxvd2VkLXRvb2xzIFlBTUwgYXJyYXkgdG8gdG9vbHMgbGlzdFxyXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnYWxsb3dlZC10b29sczonKSkge1xyXG4gICAgICBpbkFsbG93ZWRUb29scyA9IHRydWU7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBpbmxpbmUgdG9vbHM6IGZpZWxkIChjb21tYS1zZXBhcmF0ZWQgc3RyaW5nKVxyXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgndG9vbHM6JykpIHtcclxuICAgICAgY29uc3QgdG9vbHNWYWx1ZSA9IHRyaW1tZWQuc3Vic3RyaW5nKDYpLnRyaW0oKTtcclxuICAgICAgaWYgKHRvb2xzVmFsdWUpIHtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSB0b29sc1ZhbHVlLnNwbGl0KCcsJykubWFwKHQgPT4gdC50cmltKCkpLmZpbHRlcih0ID0+IHQpO1xyXG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBwYXJzZWQpIHtcclxuICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IGNvbnZlcnRHZW1pbmlUb29sTmFtZSh0KTtcclxuICAgICAgICAgIGlmIChtYXBwZWQpIHRvb2xzLnB1c2gobWFwcGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gdG9vbHM6IHdpdGggbm8gdmFsdWUgbWVhbnMgWUFNTCBhcnJheSBmb2xsb3dzXHJcbiAgICAgICAgaW5BbGxvd2VkVG9vbHMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN0cmlwIGNvbG9yIGZpZWxkIChub3Qgc3VwcG9ydGVkIGJ5IEdlbWluaSBDTEksIGNhdXNlcyB2YWxpZGF0aW9uIGVycm9yKVxyXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnY29sb3I6JykpIGNvbnRpbnVlO1xyXG5cclxuICAgIC8vIFN0cmlwIHNraWxscyBmaWVsZCAobm90IHN1cHBvcnRlZCBieSBHZW1pbmkgQ0xJLCBjYXVzZXMgdmFsaWRhdGlvbiBlcnJvcilcclxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ3NraWxsczonKSkge1xyXG4gICAgICBpblNraXBwZWRBcnJheUZpZWxkID0gdHJ1ZTtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29sbGVjdCBhbGxvd2VkLXRvb2xzL3Rvb2xzIGFycmF5IGl0ZW1zXHJcbiAgICBpZiAoaW5BbGxvd2VkVG9vbHMpIHtcclxuICAgICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnLSAnKSkge1xyXG4gICAgICAgIGNvbnN0IG1hcHBlZCA9IGNvbnZlcnRHZW1pbmlUb29sTmFtZSh0cmltbWVkLnN1YnN0cmluZygyKS50cmltKCkpO1xyXG4gICAgICAgIGlmIChtYXBwZWQpIHRvb2xzLnB1c2gobWFwcGVkKTtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfSBlbHNlIGlmICh0cmltbWVkICYmICF0cmltbWVkLnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgIGluQWxsb3dlZFRvb2xzID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWluQWxsb3dlZFRvb2xzKSB7XHJcbiAgICAgIG5ld0xpbmVzLnB1c2gobGluZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBBZGQgdG9vbHMgYXMgWUFNTCBhcnJheSAoR2VtaW5pIHJlcXVpcmVzIGFycmF5IGZvcm1hdClcclxuICBpZiAodG9vbHMubGVuZ3RoID4gMCkge1xyXG4gICAgbmV3TGluZXMucHVzaCgndG9vbHM6Jyk7XHJcbiAgICBmb3IgKGNvbnN0IHRvb2wgb2YgdG9vbHMpIHtcclxuICAgICAgbmV3TGluZXMucHVzaChgICAtICR7dG9vbH1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IG5ld0Zyb250bWF0dGVyID0gbmV3TGluZXMuam9pbignXFxuJykudHJpbSgpO1xyXG5cclxuICAvLyBFc2NhcGUgJHtWQVJ9IHBhdHRlcm5zIGluIGFnZW50IGJvZHkgZm9yIEdlbWluaSBDTEkgY29tcGF0aWJpbGl0eS5cclxuICAvLyBHZW1pbmkncyB0ZW1wbGF0ZVN0cmluZygpIHRyZWF0cyBhbGwgJHt3b3JkfSBwYXR0ZXJucyBhcyB0ZW1wbGF0ZSB2YXJpYWJsZXNcclxuICAvLyBhbmQgdGhyb3dzIFwiVGVtcGxhdGUgdmFsaWRhdGlvbiBmYWlsZWQ6IE1pc3NpbmcgcmVxdWlyZWQgaW5wdXQgcGFyYW1ldGVyc1wiXHJcbiAgLy8gd2hlbiB0aGV5IGNhbid0IGJlIHJlc29sdmVkLiBFWl9BZ2VudHMgYWdlbnRzIHVzZSAke1BIQVNFfSwgJHtQTEFOfSwgZXRjLiBhc1xyXG4gIC8vIHNoZWxsIHZhcmlhYmxlcyBpbiBiYXNoIGNvZGUgYmxvY2tzIFx1MjAxNCBjb252ZXJ0IHRvICRWQVIgKG5vIGJyYWNlcykgd2hpY2hcclxuICAvLyBpcyBlcXVpdmFsZW50IGJhc2ggYW5kIGludmlzaWJsZSB0byBHZW1pbmkncyAvXFwkXFx7KFxcdyspXFx9L2cgcmVnZXguXHJcbiAgY29uc3QgZXNjYXBlZEJvZHkgPSBib2R5LnJlcGxhY2UoL1xcJFxceyhcXHcrKVxcfS9nLCAnJCQkMScpO1xyXG5cclxuICByZXR1cm4gYC0tLVxcbiR7bmV3RnJvbnRtYXR0ZXJ9XFxuLS0tJHtzdHJpcFN1YlRhZ3MoZXNjYXBlZEJvZHkpfWA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb09wZW5jb2RlRnJvbnRtYXR0ZXIoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAvLyBSZXBsYWNlIHRvb2wgbmFtZSByZWZlcmVuY2VzIGluIGNvbnRlbnQgKGFwcGxpZXMgdG8gYWxsIGZpbGVzKVxyXG4gIGxldCBjb252ZXJ0ZWRDb250ZW50ID0gY29udGVudDtcclxuICBjb252ZXJ0ZWRDb250ZW50ID0gY29udmVydGVkQ29udGVudC5yZXBsYWNlKC9cXGJBc2tVc2VyUXVlc3Rpb25cXGIvZywgJ3F1ZXN0aW9uJyk7XHJcbiAgY29udmVydGVkQ29udGVudCA9IGNvbnZlcnRlZENvbnRlbnQucmVwbGFjZSgvXFxiU2xhc2hDb21tYW5kXFxiL2csICdza2lsbCcpO1xyXG4gIGNvbnZlcnRlZENvbnRlbnQgPSBjb252ZXJ0ZWRDb250ZW50LnJlcGxhY2UoL1xcYlRvZG9Xcml0ZVxcYi9nLCAndG9kb3dyaXRlJyk7XHJcbiAgLy8gUmVwbGFjZSAvZXo6Y29tbWFuZCB3aXRoIC9lei1jb21tYW5kIGZvciBvcGVuY29kZSAoZmxhdCBjb21tYW5kIHN0cnVjdHVyZSlcclxuICBjb252ZXJ0ZWRDb250ZW50ID0gY29udmVydGVkQ29udGVudC5yZXBsYWNlKC9cXC9lejovZywgJy9lei0nKTtcclxuICAvLyBSZXBsYWNlIH4vLmNsYXVkZSBhbmQgJEhPTUUvLmNsYXVkZSB3aXRoIE9wZW5Db2RlJ3MgY29uZmlnIGxvY2F0aW9uXHJcbiAgY29udmVydGVkQ29udGVudCA9IGNvbnZlcnRlZENvbnRlbnQucmVwbGFjZSgvflxcL1xcLmNsYXVkZVxcYi9nLCAnfi8uY29uZmlnL29wZW5jb2RlJyk7XHJcbiAgY29udmVydGVkQ29udGVudCA9IGNvbnZlcnRlZENvbnRlbnQucmVwbGFjZSgvXFwkSE9NRVxcL1xcLmNsYXVkZVxcYi9nLCAnJEhPTUUvLmNvbmZpZy9vcGVuY29kZScpO1xyXG4gIC8vIFJlcGxhY2UgZ2VuZXJhbC1wdXJwb3NlIHN1YmFnZW50IHR5cGUgd2l0aCBPcGVuQ29kZSdzIGVxdWl2YWxlbnQgXCJnZW5lcmFsXCJcclxuICBjb252ZXJ0ZWRDb250ZW50ID0gY29udmVydGVkQ29udGVudC5yZXBsYWNlKC9zdWJhZ2VudF90eXBlPVwiZ2VuZXJhbC1wdXJwb3NlXCIvZywgJ3N1YmFnZW50X3R5cGU9XCJnZW5lcmFsXCInKTtcclxuXHJcbiAgLy8gQ2hlY2sgaWYgY29udGVudCBoYXMgZnJvbnRtYXR0ZXJcclxuICBpZiAoIWNvbnZlcnRlZENvbnRlbnQuc3RhcnRzV2l0aCgnLS0tJykpIHtcclxuICAgIHJldHVybiBjb252ZXJ0ZWRDb250ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8gRmluZCB0aGUgZW5kIG9mIGZyb250bWF0dGVyXHJcbiAgY29uc3QgZW5kSW5kZXggPSBjb252ZXJ0ZWRDb250ZW50LmluZGV4T2YoJy0tLScsIDMpO1xyXG4gIGlmIChlbmRJbmRleCA9PT0gLTEpIHtcclxuICAgIHJldHVybiBjb252ZXJ0ZWRDb250ZW50O1xyXG4gIH1cclxuXHJcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBjb252ZXJ0ZWRDb250ZW50LnN1YnN0cmluZygzLCBlbmRJbmRleCkudHJpbSgpO1xyXG4gIGNvbnN0IGJvZHkgPSBjb252ZXJ0ZWRDb250ZW50LnN1YnN0cmluZyhlbmRJbmRleCArIDMpO1xyXG5cclxuICAvLyBQYXJzZSBmcm9udG1hdHRlciBsaW5lIGJ5IGxpbmUgKHNpbXBsZSBZQU1MIHBhcnNpbmcpXHJcbiAgY29uc3QgbGluZXMgPSBmcm9udG1hdHRlci5zcGxpdCgnXFxuJyk7XHJcbiAgY29uc3QgbmV3TGluZXM6IHN0cmluZ1tdID0gW107XHJcbiAgbGV0IGluQWxsb3dlZFRvb2xzID0gZmFsc2U7XHJcbiAgY29uc3QgYWxsb3dlZFRvb2xzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcclxuICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcclxuXHJcbiAgICAvLyBEZXRlY3Qgc3RhcnQgb2YgYWxsb3dlZC10b29scyBhcnJheVxyXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnYWxsb3dlZC10b29sczonKSkge1xyXG4gICAgICBpbkFsbG93ZWRUb29scyA9IHRydWU7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERldGVjdCBpbmxpbmUgdG9vbHM6IGZpZWxkIChjb21tYS1zZXBhcmF0ZWQgc3RyaW5nKVxyXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgndG9vbHM6JykpIHtcclxuICAgICAgY29uc3QgdG9vbHNWYWx1ZSA9IHRyaW1tZWQuc3Vic3RyaW5nKDYpLnRyaW0oKTtcclxuICAgICAgaWYgKHRvb2xzVmFsdWUpIHtcclxuICAgICAgICAvLyBQYXJzZSBjb21tYS1zZXBhcmF0ZWQgdG9vbHNcclxuICAgICAgICBjb25zdCB0b29scyA9IHRvb2xzVmFsdWUuc3BsaXQoJywnKS5tYXAodCA9PiB0LnRyaW0oKSkuZmlsdGVyKHQgPT4gdCk7XHJcbiAgICAgICAgYWxsb3dlZFRvb2xzLnB1c2goLi4udG9vbHMpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbW92ZSBuYW1lOiBmaWVsZCAtIG9wZW5jb2RlIHVzZXMgZmlsZW5hbWUgZm9yIGNvbW1hbmQgbmFtZVxyXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnbmFtZTonKSkge1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb252ZXJ0IGNvbG9yIG5hbWVzIHRvIGhleCBmb3Igb3BlbmNvZGVcclxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ2NvbG9yOicpKSB7XHJcbiAgICAgIGNvbnN0IGNvbG9yVmFsdWUgPSB0cmltbWVkLnN1YnN0cmluZyg2KS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3QgaGV4Q29sb3IgPSBjb2xvck5hbWVUb0hleFtjb2xvclZhbHVlXTtcclxuICAgICAgaWYgKGhleENvbG9yKSB7XHJcbiAgICAgICAgbmV3TGluZXMucHVzaChgY29sb3I6IFwiJHtoZXhDb2xvcn1cImApO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvbG9yVmFsdWUuc3RhcnRzV2l0aCgnIycpKSB7XHJcbiAgICAgICAgLy8gVmFsaWRhdGUgaGV4IGNvbG9yIGZvcm1hdCAoI1JHQiBvciAjUlJHR0JCKVxyXG4gICAgICAgIGlmICgvXiNbMC05YS1mXXszfSR8XiNbMC05YS1mXXs2fSQvaS50ZXN0KGNvbG9yVmFsdWUpKSB7XHJcbiAgICAgICAgICAvLyBBbHJlYWR5IGhleCBhbmQgdmFsaWQsIGtlZXAgYXMgaXNcclxuICAgICAgICAgIG5ld0xpbmVzLnB1c2gobGluZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNraXAgaW52YWxpZCBoZXggY29sb3JzXHJcbiAgICAgIH1cclxuICAgICAgLy8gU2tpcCB1bmtub3duIGNvbG9yIG5hbWVzXHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbGxlY3QgYWxsb3dlZC10b29scyBpdGVtc1xyXG4gICAgaWYgKGluQWxsb3dlZFRvb2xzKSB7XHJcbiAgICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJy0gJykpIHtcclxuICAgICAgICBhbGxvd2VkVG9vbHMucHVzaCh0cmltbWVkLnN1YnN0cmluZygyKS50cmltKCkpO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWQgJiYgIXRyaW1tZWQuc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgLy8gRW5kIG9mIGFycmF5LCBuZXcgZmllbGQgc3RhcnRlZFxyXG4gICAgICAgIGluQWxsb3dlZFRvb2xzID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBLZWVwIG90aGVyIGZpZWxkcyAoaW5jbHVkaW5nIG5hbWU6IHdoaWNoIG9wZW5jb2RlIGlnbm9yZXMpXHJcbiAgICBpZiAoIWluQWxsb3dlZFRvb2xzKSB7XHJcbiAgICAgIG5ld0xpbmVzLnB1c2gobGluZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBBZGQgdG9vbHMgb2JqZWN0IGlmIHdlIGhhZCBhbGxvd2VkLXRvb2xzIG9yIHRvb2xzXHJcbiAgaWYgKGFsbG93ZWRUb29scy5sZW5ndGggPiAwKSB7XHJcbiAgICBuZXdMaW5lcy5wdXNoKCd0b29sczonKTtcclxuICAgIGZvciAoY29uc3QgdG9vbCBvZiBhbGxvd2VkVG9vbHMpIHtcclxuICAgICAgbmV3TGluZXMucHVzaChgICAke2NvbnZlcnRUb29sTmFtZSh0b29sKX06IHRydWVgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFJlYnVpbGQgZnJvbnRtYXR0ZXIgKGJvZHkgYWxyZWFkeSBoYXMgdG9vbCBuYW1lcyBjb252ZXJ0ZWQpXHJcbiAgY29uc3QgbmV3RnJvbnRtYXR0ZXIgPSBuZXdMaW5lcy5qb2luKCdcXG4nKS50cmltKCk7XHJcbiAgcmV0dXJuIGAtLS1cXG4ke25ld0Zyb250bWF0dGVyfVxcbi0tLSR7Ym9keX1gO1xyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydCBDbGF1ZGUgQ29kZSBtYXJrZG93biBjb21tYW5kIHRvIEdlbWluaSBUT01MIGZvcm1hdFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIE1hcmtkb3duIGZpbGUgY29udGVudCB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcclxuICogQHJldHVybnMge3N0cmluZ30gLSBUT01MIGNvbnRlbnRcclxuICovXHJcbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0dlbWluaVRvbWwoY29udGVudCkge1xyXG4gIC8vIENoZWNrIGlmIGNvbnRlbnQgaGFzIGZyb250bWF0dGVyXHJcbiAgaWYgKCFjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpKSB7XHJcbiAgICByZXR1cm4gYHByb21wdCA9ICR7SlNPTi5zdHJpbmdpZnkoY29udGVudCl9XFxuYDtcclxuICB9XHJcblxyXG4gIGNvbnN0IGVuZEluZGV4ID0gY29udGVudC5pbmRleE9mKCctLS0nLCAzKTtcclxuICBpZiAoZW5kSW5kZXggPT09IC0xKSB7XHJcbiAgICByZXR1cm4gYHByb21wdCA9ICR7SlNPTi5zdHJpbmdpZnkoY29udGVudCl9XFxuYDtcclxuICB9XHJcblxyXG4gIGNvbnN0IGZyb250bWF0dGVyID0gY29udGVudC5zdWJzdHJpbmcoMywgZW5kSW5kZXgpLnRyaW0oKTtcclxuICBjb25zdCBib2R5ID0gY29udGVudC5zdWJzdHJpbmcoZW5kSW5kZXggKyAzKS50cmltKCk7XHJcbiAgXHJcbiAgLy8gRXh0cmFjdCBkZXNjcmlwdGlvbiBmcm9tIGZyb250bWF0dGVyXHJcbiAgbGV0IGRlc2NyaXB0aW9uID0gJyc7XHJcbiAgY29uc3QgbGluZXMgPSBmcm9udG1hdHRlci5zcGxpdCgnXFxuJyk7XHJcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XHJcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XHJcbiAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCdkZXNjcmlwdGlvbjonKSkge1xyXG4gICAgICBkZXNjcmlwdGlvbiA9IHRyaW1tZWQuc3Vic3RyaW5nKDEyKS50cmltKCk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ29uc3RydWN0IFRPTUxcclxuICBsZXQgdG9tbCA9ICcnO1xyXG4gIGlmIChkZXNjcmlwdGlvbikge1xyXG4gICAgdG9tbCArPSBgZGVzY3JpcHRpb24gPSAke0pTT04uc3RyaW5naWZ5KGRlc2NyaXB0aW9uKX1cXG5gO1xyXG4gIH1cclxuICBcclxuICB0b21sICs9IGBwcm9tcHQgPSAke0pTT04uc3RyaW5naWZ5KGJvZHkpfVxcbmA7XHJcbiAgXHJcbiAgcmV0dXJuIHRvbWw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb3B5IGNvbW1hbmRzIHRvIGEgZmxhdCBzdHJ1Y3R1cmUgZm9yIE9wZW5Db2RlXHJcbiAqIE9wZW5Db2RlIGV4cGVjdHM6IGNvbW1hbmQvZXotaGVscC5tZCAoaW52b2tlZCBhcyAvZXotaGVscClcclxuICogU291cmNlIHN0cnVjdHVyZTogY29tbWFuZHMvZXovaGVscC5tZFxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjRGlyIC0gU291cmNlIGRpcmVjdG9yeSAoZS5nLiwgY29tbWFuZHMvZXovKVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdERpciAtIERlc3RpbmF0aW9uIGRpcmVjdG9yeSAoZS5nLiwgY29tbWFuZC8pXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXggLSBQcmVmaXggZm9yIGZpbGVuYW1lcyAoZS5nLiwgJ2V6JylcclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhQcmVmaXggLSBQYXRoIHByZWZpeCBmb3IgZmlsZSByZWZlcmVuY2VzXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gVGFyZ2V0IHJ1bnRpbWUgKCdjbGF1ZGUnIG9yICdvcGVuY29kZScpXHJcbiAqL1xyXG5mdW5jdGlvbiBjb3B5RmxhdHRlbmVkQ29tbWFuZHMoc3JjRGlyLCBkZXN0RGlyLCBwcmVmaXgsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpIHtcclxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc3JjRGlyKSkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8gUmVtb3ZlIG9sZCBlei0qLm1kIGZpbGVzIGJlZm9yZSBjb3B5aW5nIG5ldyBvbmVzXHJcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGVzdERpcikpIHtcclxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyhkZXN0RGlyKSkge1xyXG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKGAke3ByZWZpeH0tYCkgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcclxuICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihkZXN0RGlyLCBmaWxlKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgZnMubWtkaXJTeW5jKGRlc3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHNyY0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xyXG5cclxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcclxuICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oc3JjRGlyLCBlbnRyeS5uYW1lKTtcclxuXHJcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAvLyBSZWN1cnNlIGludG8gc3ViZGlyZWN0b3JpZXMsIGFkZGluZyB0byBwcmVmaXhcclxuICAgICAgLy8gZS5nLiwgY29tbWFuZHMvZXovZGVidWcvc3RhcnQubWQgLT4gY29tbWFuZC9lei1kZWJ1Zy1zdGFydC5tZFxyXG4gICAgICBjb3B5RmxhdHRlbmVkQ29tbWFuZHMoc3JjUGF0aCwgZGVzdERpciwgYCR7cHJlZml4fS0ke2VudHJ5Lm5hbWV9YCwgcGF0aFByZWZpeCwgcnVudGltZSk7XHJcbiAgICB9IGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XHJcbiAgICAgIC8vIEZsYXR0ZW46IGhlbHAubWQgLT4gZXotaGVscC5tZFxyXG4gICAgICBjb25zdCBiYXNlTmFtZSA9IGVudHJ5Lm5hbWUucmVwbGFjZSgnLm1kJywgJycpO1xyXG4gICAgICBjb25zdCBkZXN0TmFtZSA9IGAke3ByZWZpeH0tJHtiYXNlTmFtZX0ubWRgO1xyXG4gICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkZXN0RGlyLCBkZXN0TmFtZSk7XHJcblxyXG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcmNQYXRoLCAndXRmOCcpO1xyXG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XHJcbiAgICAgIGNvbnN0IGdsb2JhbENsYXVkZUhvbWVSZWdleCA9IC9cXCRIT01FXFwvXFwuY2xhdWRlXFwvL2c7XHJcbiAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XHJcbiAgICAgIGNvbnN0IG9wZW5jb2RlRGlyUmVnZXggPSAvflxcL1xcLm9wZW5jb2RlXFwvL2c7XHJcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xyXG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcclxuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShsb2NhbENsYXVkZVJlZ2V4LCBgLi8ke2dldERpck5hbWUocnVudGltZSl9L2ApO1xyXG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKG9wZW5jb2RlRGlyUmVnZXgsIHBhdGhQcmVmaXgpO1xyXG4gICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcclxuICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb09wZW5jb2RlRnJvbnRtYXR0ZXIoY29udGVudCk7XHJcblxyXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb3B5IEVaIEFnZW50cyBza2lsbHMgdG8gZ2xvYmFsIHNraWxscyBkaXJlY3RvcnlcclxuICogU2tpbGxzIGFyZSBpbnN0YWxsZWQgdG8gJEhPTUUvLnNraWxscy9lei1hZ2VudHMvIGZvciB1bml2ZXJzYWwgYWNjZXNzXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNEaXIgLSBTb3VyY2UgZGlyZWN0b3J5IChlei1hZ2VudHMgcm9vdClcclxuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gUnVudGltZSBpZGVudGlmaWVyXHJcbiAqL1xyXG5mdW5jdGlvbiBjb3B5U2tpbGxzKHNyY0Rpcjogc3RyaW5nLCBpc0dsb2JhbDogYm9vbGVhbiwgcnVudGltZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgLy8gT25seSBpbnN0YWxsIHNraWxscyBmb3IgZ2xvYmFsIGluc3RhbGxzXHJcbiAgaWYgKCFpc0dsb2JhbCkge1xyXG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gU2tpcHBpbmcgc2tpbGxzIChsb2NhbCBpbnN0YWxsKWApO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgaG9tZURpciA9IG9zLmhvbWVkaXIoKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcbiAgY29uc3Qgc2tpbGxzRGVzdERpciA9IHBhdGgucG9zaXguam9pbihob21lRGlyLCAnLnNraWxscycsICdlei1hZ2VudHMnKTtcclxuICBjb25zdCBzcmNTa2lsbHNEaXIgPSBwYXRoLmpvaW4oc3JjRGlyLCAnc2tpbGxzJyk7XHJcblxyXG4gIGNvbnNvbGUubG9nKGAgIEluc3RhbGxpbmcgc2tpbGxzIHRvICR7Y3lhbn0ke3NraWxsc0Rlc3REaXJ9JHtyZXNldH0uLi5gKTtcclxuXHJcbiAgLy8gQ3JlYXRlIHNraWxscyBkaXJlY3RvcnlcclxuICBmcy5ta2RpclN5bmMoc2tpbGxzRGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcblxyXG4gIC8vIENvcHkgYWxsIHNraWxscyBmcm9tIHNvdXJjZVxyXG4gIGlmIChmcy5leGlzdHNTeW5jKHNyY1NraWxsc0RpcikpIHtcclxuICAgIGZzLmNwU3luYyhzcmNTa2lsbHNEaXIsIHNraWxsc0Rlc3REaXIsIHtcclxuICAgICAgcmVjdXJzaXZlOiB0cnVlLFxyXG4gICAgICBmb3JjZTogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQ291bnQgaW5zdGFsbGVkIHNraWxsc1xyXG4gICAgbGV0IHNraWxsQ291bnQgPSAwO1xyXG4gICAgY29uc3QgY2F0ZWdvcmllcyA9IFsnc3RhY2snLCAnYXJjaGl0ZWN0dXJlJywgJ2RvbWFpbicsICdvcGVyYXRpb25hbCcsICdnb3Zlcm5hbmNlJywgJ3Rlc3RpbmcnLCAnb2JzZXJ2YWJpbGl0eScsICdkZXZvcHMnLCAnc2VjdXJpdHknLCAnYWknLCAnZGF0YScsICdwcm9kdWN0J107XHJcblxyXG4gICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBjYXRlZ29yaWVzKSB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3J5UGF0aCA9IHBhdGguam9pbihza2lsbHNEZXN0RGlyLCBjYXRlZ29yeSk7XHJcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNhdGVnb3J5UGF0aCkpIHtcclxuICAgICAgICBjb25zdCBza2lsbHMgPSBmcy5yZWFkZGlyU3luYyhjYXRlZ29yeVBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxyXG4gICAgICAgICAgLmZpbHRlcihkID0+IGQuaXNEaXJlY3RvcnkoKSkubGVuZ3RoO1xyXG4gICAgICAgIHNraWxsQ291bnQgKz0gc2tpbGxzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgJHtza2lsbENvdW50fSBza2lsbHMgdG8gJHtza2lsbHNEZXN0RGlyfWApO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBTa2lsbHMgZGlyZWN0b3J5IG5vdCBmb3VuZDogJHtzcmNTa2lsbHNEaXJ9YCk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBsaXN0Q29kZXhTa2lsbE5hbWVzKHNraWxsc0RpciwgcHJlZml4ID0gJ2V6LScpIHtcclxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2tpbGxzRGlyKSkgcmV0dXJuIFtdO1xyXG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcclxuICByZXR1cm4gZW50cmllc1xyXG4gICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKVxyXG4gICAgLmZpbHRlcihlbnRyeSA9PiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihza2lsbHNEaXIsIGVudHJ5Lm5hbWUsICdTS0lMTC5tZCcpKSlcclxuICAgIC5tYXAoZW50cnkgPT4gZW50cnkubmFtZSlcclxuICAgIC5zb3J0KCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvcHlDb21tYW5kc0FzQ29kZXhTa2lsbHMoc3JjRGlyLCBza2lsbHNEaXIsIHByZWZpeCwgcGF0aFByZWZpeCwgcnVudGltZSkge1xyXG4gIGlmICghZnMuZXhpc3RzU3luYyhzcmNEaXIpKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBmcy5ta2RpclN5bmMoc2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgLy8gUmVtb3ZlIHByZXZpb3VzIEVaIENvZGV4IHNraWxscyB0byBhdm9pZCBzdGFsZSBjb21tYW5kIHNraWxscy5cclxuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRkaXJTeW5jKHNraWxsc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xyXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZXhpc3RpbmcpIHtcclxuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChgJHtwcmVmaXh9LWApKSB7XHJcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oc2tpbGxzRGlyLCBlbnRyeS5uYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWN1cnNlKGN1cnJlbnRTcmNEaXIsIGN1cnJlbnRQcmVmaXgpIHtcclxuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhjdXJyZW50U3JjRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XHJcblxyXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XHJcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oY3VycmVudFNyY0RpciwgZW50cnkubmFtZSk7XHJcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XHJcbiAgICAgICAgcmVjdXJzZShzcmNQYXRoLCBgJHtjdXJyZW50UHJlZml4fS0ke2VudHJ5Lm5hbWV9YCk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgYmFzZU5hbWUgPSBlbnRyeS5uYW1lLnJlcGxhY2UoJy5tZCcsICcnKTtcclxuICAgICAgY29uc3Qgc2tpbGxOYW1lID0gYCR7Y3VycmVudFByZWZpeH0tJHtiYXNlTmFtZX1gO1xyXG4gICAgICBjb25zdCBza2lsbERpciA9IHBhdGguam9pbihza2lsbHNEaXIsIHNraWxsTmFtZSk7XHJcbiAgICAgIGZzLm1rZGlyU3luYyhza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcblxyXG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcmNQYXRoLCAndXRmOCcpO1xyXG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XHJcbiAgICAgIGNvbnN0IGdsb2JhbENsYXVkZUhvbWVSZWdleCA9IC9cXCRIT01FXFwvXFwuY2xhdWRlXFwvL2c7XHJcbiAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XHJcbiAgICAgIGNvbnN0IGNvZGV4RGlyUmVnZXggPSAvflxcL1xcLmNvZGV4XFwvL2c7XHJcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xyXG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcclxuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShsb2NhbENsYXVkZVJlZ2V4LCBgLi8ke2dldERpck5hbWUocnVudGltZSl9L2ApO1xyXG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGNvZGV4RGlyUmVnZXgsIHBhdGhQcmVmaXgpO1xyXG4gICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcclxuICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db2RleFNraWxsKGNvbnRlbnQsIHNraWxsTmFtZSk7XHJcblxyXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihza2lsbERpciwgJ1NLSUxMLm1kJyksIGNvbnRlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVjdXJzZShzcmNEaXIsIHByZWZpeCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb3B5IENsYXVkZSBjb21tYW5kcyBhcyBDb3BpbG90IHNraWxscyBcdTIwMTQgb25lIGZvbGRlciBwZXIgc2tpbGwgd2l0aCBTS0lMTC5tZC5cclxuICogQXBwbGllcyBDT05WLTAxIChzdHJ1Y3R1cmUpLCBDT05WLTAyIChhbGxvd2VkLXRvb2xzKSwgQ09OVi0wNiAocGF0aHMpLCBDT05WLTA3IChjb21tYW5kIG5hbWVzKS5cclxuICovXHJcbmZ1bmN0aW9uIGNvcHlDb21tYW5kc0FzQ29waWxvdFNraWxscyhzcmNEaXIsIHNraWxsc0RpciwgcHJlZml4LCBpc0dsb2JhbCA9IGZhbHNlKSB7XHJcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNyY0RpcikpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGZzLm1rZGlyU3luYyhza2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAvLyBSZW1vdmUgcHJldmlvdXMgRVogQ29waWxvdCBza2lsbHNcclxuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRkaXJTeW5jKHNraWxsc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xyXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZXhpc3RpbmcpIHtcclxuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChgJHtwcmVmaXh9LWApKSB7XHJcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oc2tpbGxzRGlyLCBlbnRyeS5uYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWN1cnNlKGN1cnJlbnRTcmNEaXIsIGN1cnJlbnRQcmVmaXgpIHtcclxuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhjdXJyZW50U3JjRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XHJcblxyXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XHJcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oY3VycmVudFNyY0RpciwgZW50cnkubmFtZSk7XHJcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XHJcbiAgICAgICAgcmVjdXJzZShzcmNQYXRoLCBgJHtjdXJyZW50UHJlZml4fS0ke2VudHJ5Lm5hbWV9YCk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgYmFzZU5hbWUgPSBlbnRyeS5uYW1lLnJlcGxhY2UoJy5tZCcsICcnKTtcclxuICAgICAgY29uc3Qgc2tpbGxOYW1lID0gYCR7Y3VycmVudFByZWZpeH0tJHtiYXNlTmFtZX1gO1xyXG4gICAgICBjb25zdCBza2lsbERpciA9IHBhdGguam9pbihza2lsbHNEaXIsIHNraWxsTmFtZSk7XHJcbiAgICAgIGZzLm1rZGlyU3luYyhza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcblxyXG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcmNQYXRoLCAndXRmOCcpO1xyXG4gICAgICBjb250ZW50ID0gY29udmVydENsYXVkZUNvbW1hbmRUb0NvcGlsb3RTa2lsbChjb250ZW50LCBza2lsbE5hbWUsIGlzR2xvYmFsKTtcclxuICAgICAgY29udGVudCA9IHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50LCBnZXRDb21taXRBdHRyaWJ1dGlvbignY29waWxvdCcpKTtcclxuXHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHNraWxsRGlyLCAnU0tJTEwubWQnKSwgY29udGVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWN1cnNlKHNyY0RpciwgcHJlZml4KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvcHkgQ2xhdWRlIGNvbW1hbmRzIGFzIEtpbWkgQ29kZSBza2lsbHMgXHUyMDE0IG9uZSBmb2xkZXIgcGVyIHNraWxsIHdpdGggU0tJTEwubWQuXHJcbiAqL1xyXG5mdW5jdGlvbiBjb3B5Q29tbWFuZHNBc0tpbWlTa2lsbHMoc3JjRGlyLCBza2lsbHNEaXIsIHByZWZpeCwgcGF0aFByZWZpeCwgcnVudGltZSkge1xyXG4gIGlmICghZnMuZXhpc3RzU3luYyhzcmNEaXIpKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBmcy5ta2RpclN5bmMoc2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgLy8gUmVtb3ZlIHByZXZpb3VzIEVaIEtpbWkgc2tpbGxzXHJcbiAgY29uc3QgZXhpc3RpbmcgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcclxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGV4aXN0aW5nKSB7XHJcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSAmJiBlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoYCR7cHJlZml4fS1gKSkge1xyXG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHNraWxsc0RpciwgZW50cnkubmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcmVjdXJzZShjdXJyZW50U3JjRGlyLCBjdXJyZW50UHJlZml4KSB7XHJcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoY3VycmVudFNyY0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xyXG5cclxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xyXG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKGN1cnJlbnRTcmNEaXIsIGVudHJ5Lm5hbWUpO1xyXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAgIHJlY3Vyc2Uoc3JjUGF0aCwgYCR7Y3VycmVudFByZWZpeH0tJHtlbnRyeS5uYW1lfWApO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZW50cnkubmFtZS5yZXBsYWNlKCcubWQnLCAnJyk7XHJcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGAke2N1cnJlbnRQcmVmaXh9LSR7YmFzZU5hbWV9YDtcclxuICAgICAgY29uc3Qgc2tpbGxEaXIgPSBwYXRoLmpvaW4oc2tpbGxzRGlyLCBza2lsbE5hbWUpO1xyXG4gICAgICBmcy5ta2RpclN5bmMoc2tpbGxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3JjUGF0aCwgJ3V0ZjgnKTtcclxuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xyXG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVIb21lUmVnZXggPSAvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nO1xyXG4gICAgICBjb25zdCBsb2NhbENsYXVkZVJlZ2V4ID0gL1xcLlxcL1xcLmNsYXVkZVxcLy9nO1xyXG4gICAgICBjb25zdCBraW1pRGlyUmVnZXggPSAvflxcL1xcLmtpbWlcXC8vZztcclxuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVSZWdleCwgcGF0aFByZWZpeCk7XHJcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4LCB0b0hvbWVQcmVmaXgocGF0aFByZWZpeCkpO1xyXG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGxvY2FsQ2xhdWRlUmVnZXgsIGAuLyR7Z2V0RGlyTmFtZShydW50aW1lKX0vYCk7XHJcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2Uoa2ltaURpclJlZ2V4LCBwYXRoUHJlZml4KTtcclxuICAgICAgY29udGVudCA9IHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50LCBnZXRDb21taXRBdHRyaWJ1dGlvbihydW50aW1lKSk7XHJcbiAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9LaW1pU2tpbGwoY29udGVudCwgc2tpbGxOYW1lKTtcclxuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oc2tpbGxEaXIsICdTS0lMTC5tZCcpLCBjb250ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlY3Vyc2Uoc3JjRGlyLCBwcmVmaXgpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgUXdlbiBDb2RlIGNvbW1hbmRzIFx1MjAxNCBmbGF0IHN0cnVjdHVyZSBpbiBjb21tYW5kcy9lei8uXHJcbiAqIFF3ZW4gQ29kZSB1c2VzIH4vLnF3ZW4vY29tbWFuZHMvZXovKi5tZCAobGlrZSBDbGF1ZGUgQ29kZSB+Ly5jbGF1ZGUvY29tbWFuZHMvZXovKVxyXG4gKi9cclxuZnVuY3Rpb24gY29weUNvbW1hbmRzQXNRd2VuQ29tbWFuZHMoc3JjRGlyLCBjb21tYW5kc0RpciwgcHJlZml4LCBwYXRoUHJlZml4LCBydW50aW1lKSB7XHJcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNyY0RpcikpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGZzLm1rZGlyU3luYyhjb21tYW5kc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcblxyXG4gIC8vIFJlbW92ZSBwcmV2aW91cyBFWiBRd2VuIGNvbW1hbmRzXHJcbiAgY29uc3QgZXhpc3RpbmcgPSBmcy5yZWFkZGlyU3luYyhjb21tYW5kc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xyXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZXhpc3RpbmcpIHtcclxuICAgIGlmIChlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoYCR7cHJlZml4fS1gKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xyXG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKGNvbW1hbmRzRGlyLCBlbnRyeS5uYW1lKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWN1cnNlKGN1cnJlbnRTcmNEaXIsIGN1cnJlbnRQcmVmaXgpIHtcclxuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhjdXJyZW50U3JjRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XHJcblxyXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XHJcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oY3VycmVudFNyY0RpciwgZW50cnkubmFtZSk7XHJcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XHJcbiAgICAgICAgcmVjdXJzZShzcmNQYXRoLCBgJHtjdXJyZW50UHJlZml4fS0ke2VudHJ5Lm5hbWV9YCk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgYmFzZU5hbWUgPSBlbnRyeS5uYW1lLnJlcGxhY2UoJy5tZCcsICcnKTtcclxuICAgICAgY29uc3QgY29tbWFuZE5hbWUgPSBgJHtjdXJyZW50UHJlZml4fS0ke2Jhc2VOYW1lfWA7XHJcbiAgICAgIGNvbnN0IGNvbW1hbmRGaWxlID0gcGF0aC5qb2luKGNvbW1hbmRzRGlyLCBgJHtjb21tYW5kTmFtZX0ubWRgKTtcclxuXHJcbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XHJcbiAgICAgIGNvbnN0IGdsb2JhbENsYXVkZVJlZ2V4ID0gL35cXC9cXC5jbGF1ZGVcXC8vZztcclxuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4ID0gL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZztcclxuICAgICAgY29uc3QgbG9jYWxDbGF1ZGVSZWdleCA9IC9cXC5cXC9cXC5jbGF1ZGVcXC8vZztcclxuICAgICAgY29uc3QgcXdlbkRpclJlZ2V4ID0gL35cXC9cXC5xd2VuXFwvL2c7XHJcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xyXG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcclxuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShsb2NhbENsYXVkZVJlZ2V4LCBgLi8ke2dldERpck5hbWUocnVudGltZSl9L2ApO1xyXG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKHF3ZW5EaXJSZWdleCwgcGF0aFByZWZpeCk7XHJcbiAgICAgIGNvbnRlbnQgPSBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudCwgZ2V0Q29tbWl0QXR0cmlidXRpb24ocnVudGltZSkpO1xyXG4gICAgICBcclxuICAgICAgLy8gUXdlbiBDb2RlIHVzZXMgc2ltcGxlIG1hcmtkb3duIGNvbW1hbmRzIChubyBTS0lMTC5tZCB3cmFwcGVyKVxyXG4gICAgICAvLyBKdXN0IGNvcHkgdGhlIGNvbnRlbnQgYXMtaXMgd2l0aCBwYXRoIHJlcGxhY2VtZW50c1xyXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGNvbW1hbmRGaWxlLCBjb250ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlY3Vyc2Uoc3JjRGlyLCBwcmVmaXgpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgUXdlbiBDb2RlIHNraWxscyBcdTIwMTQgb25lIGZvbGRlciBwZXIgc2tpbGwgd2l0aCBTS0lMTC5tZC5cclxuICogUXdlbiBDb2RlIHVzZXMgdGhlIHNhbWUgc2tpbGxzLyBzdHJ1Y3R1cmUgYXMgQ29kZXggYnV0IHdpdGggc2ltcGxlciBmb3JtYXQgKG5vIGFkYXB0ZXJzIG5lZWRlZCkuXHJcbiAqIEBkZXByZWNhdGVkIFVzZSBjb3B5Q29tbWFuZHNBc1F3ZW5Db21tYW5kcyBpbnN0ZWFkIC0gUXdlbiBDb2RlIHVzZXMgY29tbWFuZHMvZXovIG5vdCBza2lsbHMvXHJcbiAqL1xyXG5mdW5jdGlvbiBjb3B5Q29tbWFuZHNBc1F3ZW5Ta2lsbHMoc3JjRGlyLCBza2lsbHNEaXIsIHByZWZpeCwgcGF0aFByZWZpeCwgcnVudGltZSkge1xyXG4gIGlmICghZnMuZXhpc3RzU3luYyhzcmNEaXIpKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBmcy5ta2RpclN5bmMoc2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgLy8gUmVtb3ZlIHByZXZpb3VzIEVaIFF3ZW4gc2tpbGxzXHJcbiAgY29uc3QgZXhpc3RpbmcgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcclxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGV4aXN0aW5nKSB7XHJcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSAmJiBlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoYCR7cHJlZml4fS1gKSkge1xyXG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHNraWxsc0RpciwgZW50cnkubmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcmVjdXJzZShjdXJyZW50U3JjRGlyLCBjdXJyZW50UHJlZml4KSB7XHJcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoY3VycmVudFNyY0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xyXG5cclxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xyXG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKGN1cnJlbnRTcmNEaXIsIGVudHJ5Lm5hbWUpO1xyXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAgIHJlY3Vyc2Uoc3JjUGF0aCwgYCR7Y3VycmVudFByZWZpeH0tJHtlbnRyeS5uYW1lfWApO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZW50cnkubmFtZS5yZXBsYWNlKCcubWQnLCAnJyk7XHJcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGAke2N1cnJlbnRQcmVmaXh9LSR7YmFzZU5hbWV9YDtcclxuICAgICAgY29uc3Qgc2tpbGxEaXIgPSBwYXRoLmpvaW4oc2tpbGxzRGlyLCBza2lsbE5hbWUpO1xyXG4gICAgICBmcy5ta2RpclN5bmMoc2tpbGxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3JjUGF0aCwgJ3V0ZjgnKTtcclxuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xyXG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVIb21lUmVnZXggPSAvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nO1xyXG4gICAgICBjb25zdCBsb2NhbENsYXVkZVJlZ2V4ID0gL1xcLlxcL1xcLmNsYXVkZVxcLy9nO1xyXG4gICAgICBjb25zdCBxd2VuRGlyUmVnZXggPSAvflxcL1xcLnF3ZW5cXC8vZztcclxuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVSZWdleCwgcGF0aFByZWZpeCk7XHJcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4LCB0b0hvbWVQcmVmaXgocGF0aFByZWZpeCkpO1xyXG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGxvY2FsQ2xhdWRlUmVnZXgsIGAuLyR7Z2V0RGlyTmFtZShydW50aW1lKX0vYCk7XHJcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UocXdlbkRpclJlZ2V4LCBwYXRoUHJlZml4KTtcclxuICAgICAgY29udGVudCA9IHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50LCBnZXRDb21taXRBdHRyaWJ1dGlvbihydW50aW1lKSk7XHJcbiAgICAgIC8vIFF3ZW4gQ29kZSB1c2VzIHNpbXBsZSBtYXJrZG93biBza2lsbHMgd2l0aG91dCBmcm9udG1hdHRlciBhZGFwdGVyc1xyXG4gICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvUXdlblNraWxsKGNvbnRlbnQsIHNraWxsTmFtZSk7XHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHNraWxsRGlyLCAnU0tJTEwubWQnKSwgY29udGVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWN1cnNlKHNyY0RpciwgcHJlZml4KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlY3Vyc2l2ZWx5IGNvcHkgZGlyZWN0b3J5LCByZXBsYWNpbmcgcGF0aHMgaW4gLm1kIGZpbGVzXHJcbiAqIERlbGV0ZXMgZXhpc3RpbmcgZGVzdERpciBmaXJzdCB0byByZW1vdmUgb3JwaGFuZWQgZmlsZXMgZnJvbSBwcmV2aW91cyB2ZXJzaW9uc1xyXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjRGlyIC0gU291cmNlIGRpcmVjdG9yeVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdERpciAtIERlc3RpbmF0aW9uIGRpcmVjdG9yeVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFByZWZpeCAtIFBhdGggcHJlZml4IGZvciBmaWxlIHJlZmVyZW5jZXNcclxuICogQHBhcmFtIHtzdHJpbmd9IHJ1bnRpbWUgLSBUYXJnZXQgcnVudGltZSAoJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnKVxyXG4gKi9cclxuZnVuY3Rpb24gY29weVdpdGhQYXRoUmVwbGFjZW1lbnQoc3JjRGlyLCBkZXN0RGlyLCBwYXRoUHJlZml4LCBydW50aW1lLCBpc0NvbW1hbmQgPSBmYWxzZSwgaXNHbG9iYWwgPSBmYWxzZSkge1xyXG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xyXG4gIGNvbnN0IGlzQ29kZXggPSBydW50aW1lID09PSAnY29kZXgnO1xyXG4gIGNvbnN0IGlzQ29waWxvdCA9IHJ1bnRpbWUgPT09ICdjb3BpbG90JztcclxuICBjb25zdCBkaXJOYW1lID0gZ2V0RGlyTmFtZShydW50aW1lKTtcclxuXHJcbiAgLy8gQ2xlYW4gaW5zdGFsbDogcmVtb3ZlIGV4aXN0aW5nIGRlc3RpbmF0aW9uIHRvIHByZXZlbnQgb3JwaGFuZWQgZmlsZXNcclxuICBpZiAoZnMuZXhpc3RzU3luYyhkZXN0RGlyKSkge1xyXG4gICAgZnMucm1TeW5jKGRlc3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG4gIH1cclxuICBmcy5ta2RpclN5bmMoZGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcblxyXG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhzcmNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcclxuXHJcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XHJcbiAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKHNyY0RpciwgZW50cnkubmFtZSk7XHJcbiAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkZXN0RGlyLCBlbnRyeS5uYW1lKTtcclxuXHJcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICBjb3B5V2l0aFBhdGhSZXBsYWNlbWVudChzcmNQYXRoLCBkZXN0UGF0aCwgcGF0aFByZWZpeCwgcnVudGltZSwgaXNDb21tYW5kLCBpc0dsb2JhbCk7XHJcbiAgICB9IGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XHJcbiAgICAgIC8vIFJlcGxhY2Ugfi8uY2xhdWRlLyBhbmQgJEhPTUUvLmNsYXVkZS8gYW5kIC4vLmNsYXVkZS8gd2l0aCBydW50aW1lLWFwcHJvcHJpYXRlIHBhdGhzXHJcbiAgICAgIC8vIFNraXAgZ2VuZXJpYyByZXBsYWNlbWVudCBmb3IgQ29waWxvdCBcdTIwMTQgY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQgaGFuZGxlcyBhbGwgcGF0aHNcclxuICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3JjUGF0aCwgJ3V0ZjgnKTtcclxuICAgICAgaWYgKCFpc0NvcGlsb3QpIHtcclxuICAgICAgICBjb25zdCBnbG9iYWxDbGF1ZGVSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XHJcbiAgICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4ID0gL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZztcclxuICAgICAgICBjb25zdCBsb2NhbENsYXVkZVJlZ2V4ID0gL1xcLlxcL1xcLmNsYXVkZVxcLy9nO1xyXG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xyXG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4LCB0b0hvbWVQcmVmaXgocGF0aFByZWZpeCkpO1xyXG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UobG9jYWxDbGF1ZGVSZWdleCwgYC4vJHtkaXJOYW1lfS9gKTtcclxuICAgICAgfVxyXG4gICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcclxuXHJcbiAgICAgIC8vIENvbnZlcnQgZnJvbnRtYXR0ZXIgZm9yIG9wZW5jb2RlIGNvbXBhdGliaWxpdHlcclxuICAgICAgaWYgKGlzT3BlbmNvZGUpIHtcclxuICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvT3BlbmNvZGVGcm9udG1hdHRlcihjb250ZW50KTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcclxuICAgICAgfSBlbHNlIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykge1xyXG4gICAgICAgIGlmIChpc0NvbW1hbmQpIHtcclxuICAgICAgICAgIC8vIENvbnZlcnQgdG8gVE9NTCBmb3IgR2VtaW5pIChzdHJpcCA8c3ViPiB0YWdzIFx1MjAxNCB0ZXJtaW5hbHMgY2FuJ3QgcmVuZGVyIHN1YnNjcmlwdClcclxuICAgICAgICAgIGNvbnRlbnQgPSBzdHJpcFN1YlRhZ3MoY29udGVudCk7XHJcbiAgICAgICAgICBjb25zdCB0b21sQ29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb0dlbWluaVRvbWwoY29udGVudCk7XHJcbiAgICAgICAgICAvLyBSZXBsYWNlIGV4dGVuc2lvbiB3aXRoIC50b21sXHJcbiAgICAgICAgICBjb25zdCB0b21sUGF0aCA9IGRlc3RQYXRoLnJlcGxhY2UoL1xcLm1kJC8sICcudG9tbCcpO1xyXG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0b21sUGF0aCwgdG9tbENvbnRlbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoaXNDb2RleCkge1xyXG4gICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9Db2RleE1hcmtkb3duKGNvbnRlbnQpO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZGVzdFBhdGgsIGNvbnRlbnQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xyXG4gICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9Db3BpbG90Q29udGVudChjb250ZW50LCBpc0dsb2JhbCk7XHJcbiAgICAgICAgY29udGVudCA9IHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50LCBnZXRDb21taXRBdHRyaWJ1dGlvbihydW50aW1lKSk7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoaXNDb3BpbG90ICYmIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcuY2pzJykgfHwgZW50cnkubmFtZS5lbmRzV2l0aCgnLmpzJykpKSB7XHJcbiAgICAgIC8vIENvcGlsb3Q6IGFsc28gdHJhbnNmb3JtIC5janMvLmpzIGZpbGVzIGZvciBDT05WLTA2IGFuZCBDT05WLTA3XHJcbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XHJcbiAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9Db3BpbG90Q29udGVudChjb250ZW50LCBpc0dsb2JhbCk7XHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoZGVzdFBhdGgsIGNvbnRlbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZnMuY29weUZpbGVTeW5jKHNyY1BhdGgsIGRlc3RQYXRoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbGVhbiB1cCBvcnBoYW5lZCBmaWxlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zXHJcbiAqL1xyXG5mdW5jdGlvbiBjbGVhbnVwT3JwaGFuZWRGaWxlcyhjb25maWdEaXIpIHtcclxuICBjb25zdCBvcnBoYW5lZEZpbGVzID0gW1xyXG4gICAgJ2hvb2tzL2V6LW5vdGlmeS5zaCcsICAvLyBSZW1vdmVkIGluIHYxLjYueFxyXG4gICAgJ2hvb2tzL3N0YXR1c2xpbmUuanMnLCAgLy8gUmVuYW1lZCB0byBlei1zdGF0dXNsaW5lLmpzIGluIHYxLjkuMFxyXG4gIF07XHJcblxyXG4gIGZvciAoY29uc3QgcmVsUGF0aCBvZiBvcnBoYW5lZEZpbGVzKSB7XHJcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIHJlbFBhdGgpO1xyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZnVsbFBhdGgpKSB7XHJcbiAgICAgIGZzLnVubGlua1N5bmMoZnVsbFBhdGgpO1xyXG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgb3JwaGFuZWQgJHtyZWxQYXRofWApO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENsZWFuIHVwIG9ycGhhbmVkIGhvb2sgcmVnaXN0cmF0aW9ucyBmcm9tIHNldHRpbmdzLmpzb25cclxuICovXHJcbmZ1bmN0aW9uIGNsZWFudXBPcnBoYW5lZEhvb2tzKHNldHRpbmdzKSB7XHJcbiAgY29uc3Qgb3JwaGFuZWRIb29rUGF0dGVybnMgPSBbXHJcbiAgICAnZXotbm90aWZ5LnNoJywgIC8vIFJlbW92ZWQgaW4gdjEuNi54XHJcbiAgICAnaG9va3Mvc3RhdHVzbGluZS5qcycsICAvLyBSZW5hbWVkIHRvIGV6LXN0YXR1c2xpbmUuanMgaW4gdjEuOS4wXHJcbiAgICAnZXotaW50ZWwtaW5kZXguanMnLCAgLy8gUmVtb3ZlZCBpbiB2MS45LjJcclxuICAgICdlei1pbnRlbC1zZXNzaW9uLmpzJywgIC8vIFJlbW92ZWQgaW4gdjEuOS4yXHJcbiAgICAnZXotaW50ZWwtcHJ1bmUuanMnLCAgLy8gUmVtb3ZlZCBpbiB2MS45LjJcclxuICBdO1xyXG5cclxuICBsZXQgY2xlYW5lZEhvb2tzID0gZmFsc2U7XHJcblxyXG4gIC8vIENoZWNrIGFsbCBob29rIGV2ZW50IHR5cGVzIChTdG9wLCBTZXNzaW9uU3RhcnQsIGV0Yy4pXHJcbiAgaWYgKHNldHRpbmdzLmhvb2tzKSB7XHJcbiAgICBmb3IgKGNvbnN0IGV2ZW50VHlwZSBvZiBPYmplY3Qua2V5cyhzZXR0aW5ncy5ob29rcykpIHtcclxuICAgICAgY29uc3QgaG9va0VudHJpZXMgPSBzZXR0aW5ncy5ob29rc1tldmVudFR5cGVdO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShob29rRW50cmllcykpIHtcclxuICAgICAgICAvLyBGaWx0ZXIgb3V0IGVudHJpZXMgdGhhdCBjb250YWluIG9ycGhhbmVkIGhvb2tzXHJcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBob29rRW50cmllcy5maWx0ZXIoZW50cnkgPT4ge1xyXG4gICAgICAgICAgaWYgKGVudHJ5Lmhvb2tzICYmIEFycmF5LmlzQXJyYXkoZW50cnkuaG9va3MpKSB7XHJcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGFueSBob29rIGluIHRoaXMgZW50cnkgbWF0Y2hlcyBvcnBoYW5lZCBwYXR0ZXJuc1xyXG4gICAgICAgICAgICBjb25zdCBoYXNPcnBoYW5lZCA9IGVudHJ5Lmhvb2tzLnNvbWUoaCA9PlxyXG4gICAgICAgICAgICAgIGguY29tbWFuZCAmJiBvcnBoYW5lZEhvb2tQYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gaC5jb21tYW5kLmluY2x1ZGVzKHBhdHRlcm4pKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoaGFzT3JwaGFuZWQpIHtcclxuICAgICAgICAgICAgICBjbGVhbmVkSG9va3MgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIFJlbW92ZSB0aGlzIGVudHJ5XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB0cnVlOyAgLy8gS2VlcCB0aGlzIGVudHJ5XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc2V0dGluZ3MuaG9va3NbZXZlbnRUeXBlXSA9IGZpbHRlcmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAoY2xlYW5lZEhvb2tzKSB7XHJcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgb3JwaGFuZWQgaG9vayByZWdpc3RyYXRpb25zYCk7XHJcbiAgfVxyXG5cclxuICAvLyBGaXggIzMzMDogVXBkYXRlIHN0YXR1c0xpbmUgaWYgaXQgcG9pbnRzIHRvIG9sZCBzdGF0dXNsaW5lLmpzIHBhdGhcclxuICAvLyBPbmx5IG1hdGNoIHRoZSBzcGVjaWZpYyBvbGQgcGF0aCBwYXR0ZXJuIChob29rcy9zdGF0dXNsaW5lLmpzKSxcclxuICAvLyBub3QgdGhpcmQtcGFydHkgc3RhdHVzbGluZSBzY3JpcHRzIHRoYXQgaGFwcGVuIHRvIGNvbnRhaW4gJ3N0YXR1c2xpbmUuanMnXHJcbiAgaWYgKHNldHRpbmdzLnN0YXR1c0xpbmUgJiYgc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kICYmXHJcbiAgICAgIC9ob29rc1tcXC9cXFxcXXN0YXR1c2xpbmVcXC5qcy8udGVzdChzZXR0aW5ncy5zdGF0dXNMaW5lLmNvbW1hbmQpKSB7XHJcbiAgICBzZXR0aW5ncy5zdGF0dXNMaW5lLmNvbW1hbmQgPSBzZXR0aW5ncy5zdGF0dXNMaW5lLmNvbW1hbmQucmVwbGFjZShcclxuICAgICAgL2hvb2tzKFtcXC9cXFxcXSlzdGF0dXNsaW5lXFwuanMvLFxyXG4gICAgICAnaG9va3MkMWV6LXN0YXR1c2xpbmUuanMnXHJcbiAgICApO1xyXG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBVcGRhdGVkIHN0YXR1c2xpbmUgcGF0aCAoaG9va3Mvc3RhdHVzbGluZS5qcyBcdTIxOTIgaG9va3MvZXotc3RhdHVzbGluZS5qcylgKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBzZXR0aW5ncztcclxufVxyXG5cclxuLyoqXHJcbiAqIFVuaW5zdGFsbCBFWl9BZ2VudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBmb3IgYSBzcGVjaWZpYyBydW50aW1lXHJcbiAqIFJlbW92ZXMgb25seSBFWi1zcGVjaWZpYyBmaWxlcy9kaXJlY3RvcmllcywgcHJlc2VydmVzIHVzZXIgY29udGVudFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzR2xvYmFsIC0gV2hldGhlciB0byB1bmluc3RhbGwgZnJvbSBnbG9iYWwgb3IgbG9jYWxcclxuICogQHBhcmFtIHtzdHJpbmd9IHJ1bnRpbWUgLSBUYXJnZXQgcnVudGltZSAoJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCAnY29waWxvdCcpXHJcbiAqL1xyXG5mdW5jdGlvbiB1bmluc3RhbGwoaXNHbG9iYWwsIHJ1bnRpbWUgPSAnY2xhdWRlJykge1xyXG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xyXG4gIGNvbnN0IGlzQ29kZXggPSBydW50aW1lID09PSAnY29kZXgnO1xyXG4gIGNvbnN0IGlzQ29waWxvdCA9IHJ1bnRpbWUgPT09ICdjb3BpbG90JztcclxuICBjb25zdCBpc1F3ZW4gPSBydW50aW1lID09PSAncXdlbic7XHJcbiAgY29uc3QgaXNLaW1pID0gcnVudGltZSA9PT0gJ2tpbWknO1xyXG4gIGNvbnN0IGRpck5hbWUgPSBnZXREaXJOYW1lKHJ1bnRpbWUpO1xyXG5cclxuICAvLyBHZXQgdGhlIHRhcmdldCBkaXJlY3RvcnkgYmFzZWQgb24gcnVudGltZSBhbmQgaW5zdGFsbCB0eXBlXHJcbiAgY29uc3QgdGFyZ2V0RGlyID0gaXNHbG9iYWxcclxuICAgID8gZ2V0R2xvYmFsRGlyKHJ1bnRpbWUsIGV4cGxpY2l0Q29uZmlnRGlyKVxyXG4gICAgOiBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZGlyTmFtZSk7XHJcblxyXG4gIGNvbnN0IGxvY2F0aW9uTGFiZWwgPSBpc0dsb2JhbFxyXG4gICAgPyB0YXJnZXREaXIucmVwbGFjZShvcy5ob21lZGlyKCksICd+JylcclxuICAgIDogdGFyZ2V0RGlyLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJy4nKTtcclxuXHJcbiAgbGV0IHJ1bnRpbWVMYWJlbCA9ICdDbGF1ZGUgQ29kZSc7XHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdvcGVuY29kZScpIHJ1bnRpbWVMYWJlbCA9ICdPcGVuQ29kZSc7XHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSBydW50aW1lTGFiZWwgPSAnR2VtaW5pJztcclxuICBpZiAocnVudGltZSA9PT0gJ2NvZGV4JykgcnVudGltZUxhYmVsID0gJ0NvZGV4JztcclxuICBpZiAocnVudGltZSA9PT0gJ2NvcGlsb3QnKSBydW50aW1lTGFiZWwgPSAnQ29waWxvdCc7XHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcnVudGltZUxhYmVsID0gJ1F3ZW4gQ29kZSc7XHJcblxyXG4gIGNvbnNvbGUubG9nKGAgIFVuaW5zdGFsbGluZyBFWl9BZ2VudHMgZnJvbSAke2N5YW59JHtydW50aW1lTGFiZWx9JHtyZXNldH0gYXQgJHtjeWFufSR7bG9jYXRpb25MYWJlbH0ke3Jlc2V0fVxcbmApO1xyXG5cclxuICAvLyBDaGVjayBpZiB0YXJnZXQgZGlyZWN0b3J5IGV4aXN0c1xyXG4gIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXREaXIpKSB7XHJcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6ICR7bG9jYXRpb25MYWJlbH1gKTtcclxuICAgIGNvbnNvbGUubG9nKGAgIE5vdGhpbmcgdG8gdW5pbnN0YWxsLlxcbmApO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgbGV0IHJlbW92ZWRDb3VudCA9IDA7XHJcblxyXG4gIC8vIDEuIFJlbW92ZSBFWiBjb21tYW5kcy9za2lsbHNcclxuICBpZiAoaXNPcGVuY29kZSkge1xyXG4gICAgLy8gT3BlbkNvZGU6IHJlbW92ZSBjb21tYW5kL2V6LSoubWQgZmlsZXNcclxuICAgIGNvbnN0IGNvbW1hbmREaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnY29tbWFuZCcpO1xyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29tbWFuZERpcikpIHtcclxuICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhjb21tYW5kRGlyKTtcclxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcbiAgICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcclxuICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGNvbW1hbmREaXIsIGZpbGUpKTtcclxuICAgICAgICAgIHJlbW92ZWRDb3VudCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgRVpfQWdlbnRzIGNvbW1hbmRzIGZyb20gY29tbWFuZC9gKTtcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKGlzQ29kZXggfHwgaXNRd2VuIHx8IGlzS2ltaSkge1xyXG4gICAgLy8gQ29kZXgvUXdlbi9LaW1pOiByZW1vdmUgc2tpbGxzL2V6LSovU0tJTEwubWQgc2tpbGwgZGlyZWN0b3JpZXNcclxuICAgIGNvbnN0IHNraWxsc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdza2lsbHMnKTtcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNraWxsc0RpcikpIHtcclxuICAgICAgbGV0IHNraWxsQ291bnQgPSAwO1xyXG4gICAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoc2tpbGxzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XHJcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xyXG4gICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnZXotJykpIHtcclxuICAgICAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oc2tpbGxzRGlyLCBlbnRyeS5uYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICBza2lsbENvdW50Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChza2lsbENvdW50ID4gMCkge1xyXG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xyXG4gICAgICAgIGxldCBydW50aW1lTGFiZWwgPSAnQ29kZXgnO1xyXG4gICAgICAgIGlmIChpc1F3ZW4pIHJ1bnRpbWVMYWJlbCA9ICdRd2VuIENvZGUnO1xyXG4gICAgICAgIGlmIChpc0tpbWkpIHJ1bnRpbWVMYWJlbCA9ICdLaW1pIENvZGUnO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCAke3NraWxsQ291bnR9ICR7cnVudGltZUxhYmVsfSBza2lsbHNgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc0NvZGV4KSB7XHJcbiAgICAgIC8vIENvZGV4OiByZW1vdmUgRVogYWdlbnQgLnRvbWwgY29uZmlnIGZpbGVzXHJcbiAgICAgIGNvbnN0IGNvZGV4QWdlbnRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2FnZW50cycpO1xyXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhjb2RleEFnZW50c0RpcikpIHtcclxuICAgICAgICBjb25zdCB0b21sRmlsZXMgPSBmcy5yZWFkZGlyU3luYyhjb2RleEFnZW50c0Rpcik7XHJcbiAgICAgICAgbGV0IHRvbWxDb3VudCA9IDA7XHJcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIHRvbWxGaWxlcykge1xyXG4gICAgICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLnRvbWwnKSkge1xyXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihjb2RleEFnZW50c0RpciwgZmlsZSkpO1xyXG4gICAgICAgICAgICB0b21sQ291bnQrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRvbWxDb3VudCA+IDApIHtcclxuICAgICAgICAgIHJlbW92ZWRDb3VudCsrO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkICR7dG9tbENvdW50fSBhZ2VudCAudG9tbCBjb25maWdzYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDb2RleDogY2xlYW4gRVogc2VjdGlvbnMgZnJvbSBjb25maWcudG9tbFxyXG4gICAgICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbmZpZy50b21sJyk7XHJcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpO1xyXG4gICAgICAgIGNvbnN0IGNsZWFuZWQgPSBzdHJpcEV6QWdlbnRzRnJvbUNvZGV4Q29uZmlnKGNvbnRlbnQpO1xyXG4gICAgICAgIGlmIChjbGVhbmVkID09PSBudWxsKSB7XHJcbiAgICAgICAgICAvLyBGaWxlIGlzIGVtcHR5IGFmdGVyIHN0cmlwcGluZyBcdTIwMTQgZGVsZXRlIGl0XHJcbiAgICAgICAgICBmcy51bmxpbmtTeW5jKGNvbmZpZ1BhdGgpO1xyXG4gICAgICAgICAgcmVtb3ZlZENvdW50Kys7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgY29uZmlnLnRvbWwgKHdhcyBFWi1vbmx5KWApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY2xlYW5lZCAhPT0gY29udGVudCkge1xyXG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBjbGVhbmVkKTtcclxuICAgICAgICAgIHJlbW92ZWRDb3VudCsrO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDbGVhbmVkIEVaX0FnZW50cyBzZWN0aW9ucyBmcm9tIGNvbmZpZy50b21sYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChpc0NvcGlsb3QpIHtcclxuICAgIC8vIENvcGlsb3Q6IHJlbW92ZSBza2lsbHMvZXotKi8gZGlyZWN0b3JpZXMgKHNhbWUgbGF5b3V0IGFzIENvZGV4IHNraWxscylcclxuICAgIGNvbnN0IHNraWxsc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdza2lsbHMnKTtcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNraWxsc0RpcikpIHtcclxuICAgICAgbGV0IHNraWxsQ291bnQgPSAwO1xyXG4gICAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoc2tpbGxzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XHJcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xyXG4gICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnZXotJykpIHtcclxuICAgICAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oc2tpbGxzRGlyLCBlbnRyeS5uYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICBza2lsbENvdW50Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChza2lsbENvdW50ID4gMCkge1xyXG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCAke3NraWxsQ291bnR9IENvcGlsb3Qgc2tpbGxzYCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDb3BpbG90OiBjbGVhbiBFWiBzZWN0aW9uIGZyb20gY29waWxvdC1pbnN0cnVjdGlvbnMubWRcclxuICAgIGNvbnN0IGluc3RydWN0aW9uc1BhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnY29waWxvdC1pbnN0cnVjdGlvbnMubWQnKTtcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKGluc3RydWN0aW9uc1BhdGgpKSB7XHJcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoaW5zdHJ1Y3Rpb25zUGF0aCwgJ3V0ZjgnKTtcclxuICAgICAgY29uc3QgY2xlYW5lZCA9IHN0cmlwRXpBZ2VudHNGcm9tQ29waWxvdEluc3RydWN0aW9ucyhjb250ZW50KTtcclxuICAgICAgaWYgKGNsZWFuZWQgPT09IG51bGwpIHtcclxuICAgICAgICBmcy51bmxpbmtTeW5jKGluc3RydWN0aW9uc1BhdGgpO1xyXG4gICAgICAgIHJlbW92ZWRDb3VudCsrO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBjb3BpbG90LWluc3RydWN0aW9ucy5tZCAod2FzIEVaLW9ubHkpYCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY2xlYW5lZCAhPT0gY29udGVudCkge1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoaW5zdHJ1Y3Rpb25zUGF0aCwgY2xlYW5lZCk7XHJcbiAgICAgICAgcmVtb3ZlZENvdW50Kys7XHJcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDbGVhbmVkIEVaX0FnZW50cyBzZWN0aW9uIGZyb20gY29waWxvdC1pbnN0cnVjdGlvbnMubWRgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBlekNvbW1hbmRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbW1hbmRzJywgJ2V6Jyk7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhlekNvbW1hbmRzRGlyKSkge1xyXG4gICAgICBmcy5ybVN5bmMoZXpDb21tYW5kc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcbiAgICAgIHJlbW92ZWRDb3VudCsrO1xyXG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgY29tbWFuZHMvZXovYCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAyLiBSZW1vdmUgZXotYWdlbnRzIGRpcmVjdG9yeVxyXG4gIGNvbnN0IGV6RGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2V6LWFnZW50cycpO1xyXG4gIGlmIChmcy5leGlzdHNTeW5jKGV6RGlyKSkge1xyXG4gICAgZnMucm1TeW5jKGV6RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcclxuICAgIHJlbW92ZWRDb3VudCsrO1xyXG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIGV6LWFnZW50cy9gKTtcclxuICB9XHJcblxyXG4gIC8vIDMuIFJlbW92ZSBFWl9BZ2VudHMgYWdlbnRzIChlei0qLm1kIGZpbGVzIG9ubHkpXHJcbiAgY29uc3QgYWdlbnRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2FnZW50cycpO1xyXG4gIGlmIChmcy5leGlzdHNTeW5jKGFnZW50c0RpcikpIHtcclxuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoYWdlbnRzRGlyKTtcclxuICAgIGxldCBhZ2VudENvdW50ID0gMDtcclxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCdlei0nKSAmJiBmaWxlLmVuZHNXaXRoKCcubWQnKSkge1xyXG4gICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGFnZW50c0RpciwgZmlsZSkpO1xyXG4gICAgICAgIGFnZW50Q291bnQrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGFnZW50Q291bnQgPiAwKSB7XHJcbiAgICAgIHJlbW92ZWRDb3VudCsrO1xyXG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgJHthZ2VudENvdW50fSBFWl9BZ2VudHMgYWdlbnRzYCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyA0LiBSZW1vdmUgRVogaG9va3NcclxuICBjb25zdCBob29rc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdob29rcycpO1xyXG4gIGlmIChmcy5leGlzdHNTeW5jKGhvb2tzRGlyKSkge1xyXG4gICAgY29uc3QgZXpIb29rcyA9IFsnZXotc3RhdHVzbGluZS5qcycsICdlei1jaGVjay11cGRhdGUuanMnLCAnZXotY2hlY2stdXBkYXRlLnNoJywgJ2V6LWNvbnRleHQtbW9uaXRvci5qcyddO1xyXG4gICAgbGV0IGhvb2tDb3VudCA9IDA7XHJcbiAgICBmb3IgKGNvbnN0IGhvb2sgb2YgZXpIb29rcykge1xyXG4gICAgICBjb25zdCBob29rUGF0aCA9IHBhdGguam9pbihob29rc0RpciwgaG9vayk7XHJcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGhvb2tQYXRoKSkge1xyXG4gICAgICAgIGZzLnVubGlua1N5bmMoaG9va1BhdGgpO1xyXG4gICAgICAgIGhvb2tDb3VudCsrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoaG9va0NvdW50ID4gMCkge1xyXG4gICAgICByZW1vdmVkQ291bnQrKztcclxuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkICR7aG9va0NvdW50fSBFWiBob29rc2ApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gNS4gUmVtb3ZlIEVaIHBhY2thZ2UuanNvbiAoQ29tbW9uSlMgbW9kZSBtYXJrZXIpXHJcbiAgY29uc3QgcGtnSnNvblBhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAncGFja2FnZS5qc29uJyk7XHJcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGtnSnNvblBhdGgpKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBrZ0pzb25QYXRoLCAndXRmOCcpLnRyaW0oKTtcclxuICAgICAgLy8gT25seSByZW1vdmUgaWYgaXQncyBvdXIgbWluaW1hbCBDb21tb25KUyBtYXJrZXJcclxuICAgICAgaWYgKGNvbnRlbnQgPT09ICd7XCJ0eXBlXCI6XCJjb21tb25qc1wifScpIHtcclxuICAgICAgICBmcy51bmxpbmtTeW5jKHBrZ0pzb25QYXRoKTtcclxuICAgICAgICByZW1vdmVkQ291bnQrKztcclxuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgRVogcGFja2FnZS5qc29uYCk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gSWdub3JlIHJlYWQgZXJyb3JzXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyA2LiBDbGVhbiB1cCBzZXR0aW5ncy5qc29uIChyZW1vdmUgRVogaG9va3MgYW5kIHN0YXR1c2xpbmUpXHJcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NldHRpbmdzLmpzb24nKTtcclxuICBpZiAoZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSB7XHJcbiAgICBsZXQgc2V0dGluZ3MgPSByZWFkU2V0dGluZ3Moc2V0dGluZ3NQYXRoKTtcclxuICAgIGxldCBzZXR0aW5nc01vZGlmaWVkID0gZmFsc2U7XHJcblxyXG4gICAgLy8gUmVtb3ZlIEVaIHN0YXR1c2xpbmUgaWYgaXQgcmVmZXJlbmNlcyBvdXIgaG9va1xyXG4gICAgaWYgKHNldHRpbmdzLnN0YXR1c0xpbmUgJiYgc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kICYmXHJcbiAgICAgICAgc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kLmluY2x1ZGVzKCdlei1zdGF0dXNsaW5lJykpIHtcclxuICAgICAgZGVsZXRlIHNldHRpbmdzLnN0YXR1c0xpbmU7XHJcbiAgICAgIHNldHRpbmdzTW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgRVogc3RhdHVzbGluZSBmcm9tIHNldHRpbmdzYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlIEVaIGhvb2tzIGZyb20gU2Vzc2lvblN0YXJ0XHJcbiAgICBpZiAoc2V0dGluZ3MuaG9va3MgJiYgc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0KSB7XHJcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5sZW5ndGg7XHJcbiAgICAgIHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydCA9IHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5maWx0ZXIoZW50cnkgPT4ge1xyXG4gICAgICAgIGlmIChlbnRyeS5ob29rcyAmJiBBcnJheS5pc0FycmF5KGVudHJ5Lmhvb2tzKSkge1xyXG4gICAgICAgICAgLy8gRmlsdGVyIG91dCBFWiBob29rc1xyXG4gICAgICAgICAgY29uc3QgaGFzRXpIb29rID0gZW50cnkuaG9va3Muc29tZShoID0+XHJcbiAgICAgICAgICAgIGguY29tbWFuZCAmJiAoaC5jb21tYW5kLmluY2x1ZGVzKCdlei1jaGVjay11cGRhdGUnKSB8fCBoLmNvbW1hbmQuaW5jbHVkZXMoJ2V6LXN0YXR1c2xpbmUnKSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm4gIWhhc0V6SG9vaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0Lmxlbmd0aCA8IGJlZm9yZSkge1xyXG4gICAgICAgIHNldHRpbmdzTW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBFWiBob29rcyBmcm9tIHNldHRpbmdzYCk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQ2xlYW4gdXAgZW1wdHkgYXJyYXlcclxuICAgICAgaWYgKHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBkZWxldGUgc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlIEVaIGhvb2tzIGZyb20gUG9zdFRvb2xVc2UgYW5kIEFmdGVyVG9vbCAoR2VtaW5pIHVzZXMgQWZ0ZXJUb29sKVxyXG4gICAgZm9yIChjb25zdCBldmVudE5hbWUgb2YgWydQb3N0VG9vbFVzZScsICdBZnRlclRvb2wnXSkge1xyXG4gICAgICBpZiAoc2V0dGluZ3MuaG9va3MgJiYgc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXSkge1xyXG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IHNldHRpbmdzLmhvb2tzW2V2ZW50TmFtZV0ubGVuZ3RoO1xyXG4gICAgICAgIHNldHRpbmdzLmhvb2tzW2V2ZW50TmFtZV0gPSBzZXR0aW5ncy5ob29rc1tldmVudE5hbWVdLmZpbHRlcihlbnRyeSA9PiB7XHJcbiAgICAgICAgICBpZiAoZW50cnkuaG9va3MgJiYgQXJyYXkuaXNBcnJheShlbnRyeS5ob29rcykpIHtcclxuICAgICAgICAgICAgY29uc3QgaGFzRXpIb29rID0gZW50cnkuaG9va3Muc29tZShoID0+XHJcbiAgICAgICAgICAgICAgaC5jb21tYW5kICYmIGguY29tbWFuZC5pbmNsdWRlcygnZXotY29udGV4dC1tb25pdG9yJylcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcmV0dXJuICFoYXNFekhvb2s7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXS5sZW5ndGggPCBiZWZvcmUpIHtcclxuICAgICAgICAgIHNldHRpbmdzTW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIGNvbnRleHQgbW9uaXRvciBob29rIGZyb20gc2V0dGluZ3NgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNldHRpbmdzLmhvb2tzW2V2ZW50TmFtZV0ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBkZWxldGUgc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDbGVhbiB1cCBlbXB0eSBob29rcyBvYmplY3RcclxuICAgIGlmIChzZXR0aW5ncy5ob29rcyAmJiBPYmplY3Qua2V5cyhzZXR0aW5ncy5ob29rcykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5ob29rcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2V0dGluZ3NNb2RpZmllZCkge1xyXG4gICAgICB3cml0ZVNldHRpbmdzKHNldHRpbmdzUGF0aCwgc2V0dGluZ3MpO1xyXG4gICAgICByZW1vdmVkQ291bnQrKztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIDYuIEZvciBPcGVuQ29kZSwgY2xlYW4gdXAgcGVybWlzc2lvbnMgZnJvbSBvcGVuY29kZS5qc29uXHJcbiAgaWYgKGlzT3BlbmNvZGUpIHtcclxuICAgIC8vIEZvciBsb2NhbCB1bmluc3RhbGxzLCBjbGVhbiB1cCAuLy5vcGVuY29kZS9vcGVuY29kZS5qc29uXHJcbiAgICAvLyBGb3IgZ2xvYmFsIHVuaW5zdGFsbHMsIGNsZWFuIHVwIH4vLmNvbmZpZy9vcGVuY29kZS9vcGVuY29kZS5qc29uXHJcbiAgICBjb25zdCBvcGVuY29kZUNvbmZpZ0RpciA9IGlzR2xvYmFsXHJcbiAgICAgID8gZ2V0T3BlbmNvZGVHbG9iYWxEaXIoKVxyXG4gICAgICA6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLm9wZW5jb2RlJyk7XHJcbiAgICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKG9wZW5jb2RlQ29uZmlnRGlyLCAnb3BlbmNvZGUuanNvbicpO1xyXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKTtcclxuICAgICAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gUmVtb3ZlIEVaIHBlcm1pc3Npb24gZW50cmllc1xyXG4gICAgICAgIGlmIChjb25maWcucGVybWlzc2lvbikge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBwZXJtVHlwZSBvZiBbJ3JlYWQnLCAnZXh0ZXJuYWxfZGlyZWN0b3J5J10pIHtcclxuICAgICAgICAgICAgaWYgKGNvbmZpZy5wZXJtaXNzaW9uW3Blcm1UeXBlXSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV0pO1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ2V6LWFnZW50cycpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV1ba2V5XTtcclxuICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvLyBDbGVhbiB1cCBlbXB0eSBvYmplY3RzXHJcbiAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbmZpZy5wZXJtaXNzaW9uW3Blcm1UeXBlXSkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgY29uZmlnLnBlcm1pc3Npb25bcGVybVR5cGVdO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbmZpZy5wZXJtaXNzaW9uKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5wZXJtaXNzaW9uO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1vZGlmaWVkKSB7XHJcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMikgKyAnXFxuJyk7XHJcbiAgICAgICAgICByZW1vdmVkQ291bnQrKztcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBFWiBwZXJtaXNzaW9ucyBmcm9tIG9wZW5jb2RlLmpzb25gKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBJZ25vcmUgSlNPTiBwYXJzZSBlcnJvcnNcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKHJlbW92ZWRDb3VudCA9PT0gMCkge1xyXG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gTm8gRVpfQWdlbnRzIGZpbGVzIGZvdW5kIHRvIHJlbW92ZS5gKTtcclxuICB9XHJcblxyXG4gIGNvbnNvbGUubG9nKGBcclxuICAke2dyZWVufURvbmUhJHtyZXNldH0gRVpfQWdlbnRzIGhhcyBiZWVuIHVuaW5zdGFsbGVkIGZyb20gJHtydW50aW1lTGFiZWx9LlxyXG4gIFlvdXIgb3RoZXIgZmlsZXMgYW5kIHNldHRpbmdzIGhhdmUgYmVlbiBwcmVzZXJ2ZWQuXHJcbmApO1xyXG59XHJcblxyXG4vKipcclxuICogUGFyc2UgSlNPTkMgKEpTT04gd2l0aCBDb21tZW50cykgYnkgc3RyaXBwaW5nIGNvbW1lbnRzIGFuZCB0cmFpbGluZyBjb21tYXMuXHJcbiAqIE9wZW5Db2RlIHN1cHBvcnRzIEpTT05DIGZvcm1hdCB2aWEganNvbmMtcGFyc2VyLCBzbyB1c2VycyBtYXkgaGF2ZSBjb21tZW50cy5cclxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGlubGluZSBwYXJzZXIgdG8gYXZvaWQgYWRkaW5nIGRlcGVuZGVuY2llcy5cclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlSnNvbmMoY29udGVudCkge1xyXG4gIC8vIFN0cmlwIEJPTSBpZiBwcmVzZW50XHJcbiAgaWYgKGNvbnRlbnQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XHJcbiAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcclxuICB9XHJcblxyXG4gIC8vIFJlbW92ZSBzaW5nbGUtbGluZSBhbmQgYmxvY2sgY29tbWVudHMgd2hpbGUgcHJlc2VydmluZyBzdHJpbmdzXHJcbiAgbGV0IHJlc3VsdCA9ICcnO1xyXG4gIGxldCBpblN0cmluZyA9IGZhbHNlO1xyXG4gIGxldCBpID0gMDtcclxuICB3aGlsZSAoaSA8IGNvbnRlbnQubGVuZ3RoKSB7XHJcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpXTtcclxuICAgIGNvbnN0IG5leHQgPSBjb250ZW50W2kgKyAxXTtcclxuXHJcbiAgICBpZiAoaW5TdHJpbmcpIHtcclxuICAgICAgcmVzdWx0ICs9IGNoYXI7XHJcbiAgICAgIC8vIEhhbmRsZSBlc2NhcGUgc2VxdWVuY2VzXHJcbiAgICAgIGlmIChjaGFyID09PSAnXFxcXCcgJiYgaSArIDEgPCBjb250ZW50Lmxlbmd0aCkge1xyXG4gICAgICAgIHJlc3VsdCArPSBuZXh0O1xyXG4gICAgICAgIGkgKz0gMjtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xyXG4gICAgICAgIGluU3RyaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaSsrO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGNoYXIgPT09ICdcIicpIHtcclxuICAgICAgICBpblN0cmluZyA9IHRydWU7XHJcbiAgICAgICAgcmVzdWx0ICs9IGNoYXI7XHJcbiAgICAgICAgaSsrO1xyXG4gICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICcvJyAmJiBuZXh0ID09PSAnLycpIHtcclxuICAgICAgICAvLyBTa2lwIHNpbmdsZS1saW5lIGNvbW1lbnQgdW50aWwgZW5kIG9mIGxpbmVcclxuICAgICAgICB3aGlsZSAoaSA8IGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbaV0gIT09ICdcXG4nKSB7XHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICcvJyAmJiBuZXh0ID09PSAnKicpIHtcclxuICAgICAgICAvLyBTa2lwIGJsb2NrIGNvbW1lbnRcclxuICAgICAgICBpICs9IDI7XHJcbiAgICAgICAgd2hpbGUgKGkgPCBjb250ZW50Lmxlbmd0aCAtIDEgJiYgIShjb250ZW50W2ldID09PSAnKicgJiYgY29udGVudFtpICsgMV0gPT09ICcvJykpIHtcclxuICAgICAgICAgIGkrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaSArPSAyOyAvLyBTa2lwIGNsb3NpbmcgKi9cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQgKz0gY2hhcjtcclxuICAgICAgICBpKys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYXMgYmVmb3JlIH0gb3IgXVxyXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8sKFxccypbfVxcXV0pL2csICckMScpO1xyXG5cclxuICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpO1xyXG59XHJcblxyXG4vKipcclxuICogQ29uZmlndXJlIE9wZW5Db2RlIHBlcm1pc3Npb25zIHRvIGFsbG93IHJlYWRpbmcgRVogcmVmZXJlbmNlIGRvY3NcclxuICogVGhpcyBwcmV2ZW50cyBwZXJtaXNzaW9uIHByb21wdHMgd2hlbiBFWiBhY2Nlc3NlcyB0aGUgZXotYWdlbnRzIGRpcmVjdG9yeVxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzR2xvYmFsIC0gV2hldGhlciB0aGlzIGlzIGEgZ2xvYmFsIG9yIGxvY2FsIGluc3RhbGxcclxuICovXHJcbmZ1bmN0aW9uIGNvbmZpZ3VyZU9wZW5jb2RlUGVybWlzc2lvbnMoaXNHbG9iYWwgPSB0cnVlKSB7XHJcbiAgLy8gRm9yIGxvY2FsIGluc3RhbGxzLCB1c2UgLi8ub3BlbmNvZGUvb3BlbmNvZGUuanNvblxyXG4gIC8vIEZvciBnbG9iYWwgaW5zdGFsbHMsIHVzZSB+Ly5jb25maWcvb3BlbmNvZGUvb3BlbmNvZGUuanNvblxyXG4gIGNvbnN0IG9wZW5jb2RlQ29uZmlnRGlyID0gaXNHbG9iYWxcclxuICAgID8gZ2V0T3BlbmNvZGVHbG9iYWxEaXIoKVxyXG4gICAgOiBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5vcGVuY29kZScpO1xyXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ob3BlbmNvZGVDb25maWdEaXIsICdvcGVuY29kZS5qc29uJyk7XHJcblxyXG4gIC8vIEVuc3VyZSBjb25maWcgZGlyZWN0b3J5IGV4aXN0c1xyXG4gIGZzLm1rZGlyU3luYyhvcGVuY29kZUNvbmZpZ0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcblxyXG4gIC8vIFJlYWQgZXhpc3RpbmcgY29uZmlnIG9yIGNyZWF0ZSBlbXB0eSBvYmplY3RcclxuICBsZXQgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG4gIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XHJcbiAgICAgIGNvbmZpZyA9IHBhcnNlSnNvbmMoY29udGVudCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIENhbm5vdCBwYXJzZSAtIERPIE5PVCBvdmVyd3JpdGUgdXNlcidzIGNvbmZpZ1xyXG4gICAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBDb3VsZCBub3QgcGFyc2Ugb3BlbmNvZGUuanNvbiAtIHNraXBwaW5nIHBlcm1pc3Npb24gY29uZmlnYCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtkaW19UmVhc29uOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfSR7cmVzZXR9YCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtkaW19WW91ciBjb25maWcgd2FzIE5PVCBtb2RpZmllZC4gRml4IHRoZSBzeW50YXggbWFudWFsbHkgaWYgbmVlZGVkLiR7cmVzZXR9YCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEVuc3VyZSBwZXJtaXNzaW9uIHN0cnVjdHVyZSBleGlzdHNcclxuICBpZiAoIWNvbmZpZy5wZXJtaXNzaW9uKSB7XHJcbiAgICBjb25maWcucGVybWlzc2lvbiA9IHt9O1xyXG4gIH1cclxuXHJcbiAgLy8gQnVpbGQgdGhlIEVaIHBhdGggdXNpbmcgdGhlIGFjdHVhbCBjb25maWcgZGlyZWN0b3J5XHJcbiAgLy8gVXNlIH4gc2hvcnRoYW5kIGlmIGl0J3MgaW4gdGhlIGRlZmF1bHQgbG9jYXRpb24sIG90aGVyd2lzZSB1c2UgZnVsbCBwYXRoXHJcbiAgY29uc3QgZGVmYXVsdENvbmZpZ0RpciA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ29wZW5jb2RlJyk7XHJcbiAgY29uc3QgZXpQYXRoID0gb3BlbmNvZGVDb25maWdEaXIgPT09IGRlZmF1bHRDb25maWdEaXJcclxuICAgID8gJ34vLmNvbmZpZy9vcGVuY29kZS9lei1hZ2VudHMvKidcclxuICAgIDogYCR7b3BlbmNvZGVDb25maWdEaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpfS9lei1hZ2VudHMvKmA7XHJcblxyXG4gIGxldCBtb2RpZmllZCA9IGZhbHNlO1xyXG5cclxuICAvLyBDb25maWd1cmUgcmVhZCBwZXJtaXNzaW9uXHJcbiAgY29uc3QgcGVybWlzc2lvbiA9IGNvbmZpZy5wZXJtaXNzaW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHx8IHt9O1xyXG4gIGNvbmZpZy5wZXJtaXNzaW9uID0gcGVybWlzc2lvbjtcclxuICBpZiAoIXBlcm1pc3Npb24ucmVhZCB8fCB0eXBlb2YgcGVybWlzc2lvbi5yZWFkICE9PSAnb2JqZWN0Jykge1xyXG4gICAgcGVybWlzc2lvbi5yZWFkID0ge307XHJcbiAgfVxyXG4gIGNvbnN0IHJlYWRQZXJtID0gcGVybWlzc2lvbi5yZWFkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gIGlmIChyZWFkUGVybVtlelBhdGhdICE9PSAnYWxsb3cnKSB7XHJcbiAgICByZWFkUGVybVtlelBhdGhdID0gJ2FsbG93JztcclxuICAgIG1vZGlmaWVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIENvbmZpZ3VyZSBleHRlcm5hbF9kaXJlY3RvcnkgcGVybWlzc2lvbiAodGhlIHNhZmV0eSBndWFyZCBmb3IgcGF0aHMgb3V0c2lkZSBwcm9qZWN0KVxyXG4gIGlmICghcGVybWlzc2lvbi5leHRlcm5hbF9kaXJlY3RvcnkgfHwgdHlwZW9mIHBlcm1pc3Npb24uZXh0ZXJuYWxfZGlyZWN0b3J5ICE9PSAnb2JqZWN0Jykge1xyXG4gICAgcGVybWlzc2lvbi5leHRlcm5hbF9kaXJlY3RvcnkgPSB7fTtcclxuICB9XHJcbiAgY29uc3QgZXh0RGlyUGVybSA9IHBlcm1pc3Npb24uZXh0ZXJuYWxfZGlyZWN0b3J5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gIGlmIChleHREaXJQZXJtW2V6UGF0aF0gIT09ICdhbGxvdycpIHtcclxuICAgIGV4dERpclBlcm1bZXpQYXRoXSA9ICdhbGxvdyc7XHJcbiAgICBtb2RpZmllZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBpZiAoIW1vZGlmaWVkKSB7XHJcbiAgICByZXR1cm47IC8vIEFscmVhZHkgY29uZmlndXJlZFxyXG4gIH1cclxuXHJcbiAgLy8gV3JpdGUgY29uZmlnIGJhY2tcclxuICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMikgKyAnXFxuJyk7XHJcbiAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDb25maWd1cmVkIHJlYWQgcGVybWlzc2lvbiBmb3IgRVpfQWdlbnRzIGRvY3NgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFZlcmlmeSBhIGRpcmVjdG9yeSBleGlzdHMgYW5kIGNvbnRhaW5zIGZpbGVzXHJcbiAqL1xyXG5mdW5jdGlvbiB2ZXJpZnlJbnN0YWxsZWQoZGlyUGF0aCwgZGVzY3JpcHRpb24pIHtcclxuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9XHUyNzE3JHtyZXNldH0gRmFpbGVkIHRvIGluc3RhbGwgJHtkZXNjcmlwdGlvbn06IGRpcmVjdG9yeSBub3QgY3JlYXRlZGApO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgpO1xyXG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9XHUyNzE3JHtyZXNldH0gRmFpbGVkIHRvIGluc3RhbGwgJHtkZXNjcmlwdGlvbn06IGRpcmVjdG9yeSBpcyBlbXB0eWApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd31cdTI3MTcke3Jlc2V0fSBGYWlsZWQgdG8gaW5zdGFsbCAke2Rlc2NyaXB0aW9ufTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBWZXJpZnkgYSBmaWxlIGV4aXN0c1xyXG4gKi9cclxuZnVuY3Rpb24gdmVyaWZ5RmlsZUluc3RhbGxlZChmaWxlUGF0aCwgZGVzY3JpcHRpb24pIHtcclxuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fVx1MjcxNyR7cmVzZXR9IEZhaWxlZCB0byBpbnN0YWxsICR7ZGVzY3JpcHRpb259OiBmaWxlIG5vdCBjcmVhdGVkYCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG4vKipcclxuICogSW5zdGFsbCB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBmb3IgYSBzcGVjaWZpYyBydW50aW1lXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNHbG9iYWwgLSBXaGV0aGVyIHRvIGluc3RhbGwgZ2xvYmFsbHkgb3IgbG9jYWxseVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gcnVudGltZSAtIFRhcmdldCBydW50aW1lICgnY2xhdWRlJywgJ29wZW5jb2RlJywgJ2dlbWluaScsICdjb2RleCcpXHJcbiAqL1xyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcbi8vIExvY2FsIFBhdGNoIFBlcnNpc3RlbmNlXHJcbi8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxyXG5cclxuY29uc3QgUEFUQ0hFU19ESVJfTkFNRSA9ICdlei1sb2NhbC1wYXRjaGVzJztcclxuY29uc3QgTUFOSUZFU1RfTkFNRSA9ICdlei1maWxlLW1hbmlmZXN0Lmpzb24nO1xyXG5cclxuLyoqXHJcbiAqIENvbXB1dGUgU0hBMjU2IGhhc2ggb2YgZmlsZSBjb250ZW50c1xyXG4gKi9cclxuZnVuY3Rpb24gZmlsZUhhc2goZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCk7XHJcbiAgLy8gQ29udmVydCB0byBVaW50OEFycmF5IHRvIHNhdGlzZnkgQmluYXJ5TGlrZSB0eXBlIHJlcXVpcmVtZW50XHJcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUobmV3IFVpbnQ4QXJyYXkoY29udGVudCkpLmRpZ2VzdCgnaGV4Jyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZWN1cnNpdmVseSBjb2xsZWN0IGFsbCBmaWxlcyBpbiBkaXIgd2l0aCB0aGVpciBoYXNoZXNcclxuICovXHJcbmZ1bmN0aW9uIGdlbmVyYXRlTWFuaWZlc3QoZGlyOiBzdHJpbmcsIGJhc2VEaXI/OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICBpZiAoIWJhc2VEaXIpIGJhc2VEaXIgPSBkaXI7XHJcbiAgY29uc3QgbWFuaWZlc3Q6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcclxuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkgcmV0dXJuIG1hbmlmZXN0O1xyXG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcclxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgZW50cnkubmFtZSk7XHJcbiAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShiYXNlRGlyLCBmdWxsUGF0aCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xyXG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcclxuICAgICAgT2JqZWN0LmFzc2lnbihtYW5pZmVzdCwgZ2VuZXJhdGVNYW5pZmVzdChmdWxsUGF0aCwgYmFzZURpcikpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbWFuaWZlc3RbcmVsUGF0aF0gPSBmaWxlSGFzaChmdWxsUGF0aCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBtYW5pZmVzdDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFdyaXRlIGZpbGUgbWFuaWZlc3QgYWZ0ZXIgaW5zdGFsbGF0aW9uIGZvciBmdXR1cmUgbW9kaWZpY2F0aW9uIGRldGVjdGlvblxyXG4gKi9cclxuZnVuY3Rpb24gd3JpdGVNYW5pZmVzdChjb25maWdEaXI6IHN0cmluZywgcnVudGltZSA9ICdjbGF1ZGUnKSB7XHJcbiAgY29uc3QgaXNPcGVuY29kZSA9IHJ1bnRpbWUgPT09ICdvcGVuY29kZSc7XHJcbiAgY29uc3QgaXNDb2RleCA9IHJ1bnRpbWUgPT09ICdjb2RleCc7XHJcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xyXG4gIGNvbnN0IGV6RGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgJ2V6LWFnZW50cycpO1xyXG4gIGNvbnN0IGNvbW1hbmRzRGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgJ2NvbW1hbmRzJywgJ2V6Jyk7XHJcbiAgY29uc3Qgb3BlbmNvZGVDb21tYW5kRGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgJ2NvbW1hbmQnKTtcclxuICBjb25zdCBjb2RleFNraWxsc0RpciA9IHBhdGguam9pbihjb25maWdEaXIsICdza2lsbHMnKTtcclxuICBjb25zdCBhZ2VudHNEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCAnYWdlbnRzJyk7XHJcbiAgY29uc3QgbWFuaWZlc3QgPSB7IHZlcnNpb246IHBrZy52ZXJzaW9uLCB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgZmlsZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfTtcclxuXHJcbiAgY29uc3QgZXpIYXNoZXMgPSBnZW5lcmF0ZU1hbmlmZXN0KGV6RGlyKTtcclxuICBmb3IgKGNvbnN0IFtyZWwsIGhhc2hdIG9mIE9iamVjdC5lbnRyaWVzKGV6SGFzaGVzKSkge1xyXG4gICAgbWFuaWZlc3QuZmlsZXNbJ2V6LWFnZW50cy8nICsgcmVsXSA9IGhhc2g7XHJcbiAgfVxyXG4gIGlmICghaXNPcGVuY29kZSAmJiAhaXNDb2RleCAmJiAhaXNDb3BpbG90ICYmIGZzLmV4aXN0c1N5bmMoY29tbWFuZHNEaXIpKSB7XHJcbiAgICBjb25zdCBjbWRIYXNoZXMgPSBnZW5lcmF0ZU1hbmlmZXN0KGNvbW1hbmRzRGlyKTtcclxuICAgIGZvciAoY29uc3QgW3JlbCwgaGFzaF0gb2YgT2JqZWN0LmVudHJpZXMoY21kSGFzaGVzKSkge1xyXG4gICAgICBtYW5pZmVzdC5maWxlc1snY29tbWFuZHMvZXovJyArIHJlbF0gPSBoYXNoO1xyXG4gICAgfVxyXG4gIH1cclxuICBpZiAoaXNPcGVuY29kZSAmJiBmcy5leGlzdHNTeW5jKG9wZW5jb2RlQ29tbWFuZERpcikpIHtcclxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyhvcGVuY29kZUNvbW1hbmREaXIpKSB7XHJcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ2V6LScpICYmIGZpbGUuZW5kc1dpdGgoJy5tZCcpKSB7XHJcbiAgICAgICAgbWFuaWZlc3QuZmlsZXNbJ2NvbW1hbmQvJyArIGZpbGVdID0gZmlsZUhhc2gocGF0aC5qb2luKG9wZW5jb2RlQ29tbWFuZERpciwgZmlsZSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmICgoaXNDb2RleCB8fCBpc0NvcGlsb3QpICYmIGZzLmV4aXN0c1N5bmMoY29kZXhTa2lsbHNEaXIpKSB7XHJcbiAgICBmb3IgKGNvbnN0IHNraWxsTmFtZSBvZiBsaXN0Q29kZXhTa2lsbE5hbWVzKGNvZGV4U2tpbGxzRGlyKSkge1xyXG4gICAgICBjb25zdCBza2lsbFJvb3QgPSBwYXRoLmpvaW4oY29kZXhTa2lsbHNEaXIsIHNraWxsTmFtZSk7XHJcbiAgICAgIGNvbnN0IHNraWxsSGFzaGVzID0gZ2VuZXJhdGVNYW5pZmVzdChza2lsbFJvb3QpO1xyXG4gICAgICBmb3IgKGNvbnN0IFtyZWwsIGhhc2hdIG9mIE9iamVjdC5lbnRyaWVzKHNraWxsSGFzaGVzKSkge1xyXG4gICAgICAgIG1hbmlmZXN0LmZpbGVzW2Bza2lsbHMvJHtza2lsbE5hbWV9LyR7cmVsfWBdID0gaGFzaDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBpZiAoZnMuZXhpc3RzU3luYyhhZ2VudHNEaXIpKSB7XHJcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoYWdlbnRzRGlyKSkge1xyXG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCdlei0nKSAmJiBmaWxlLmVuZHNXaXRoKCcubWQnKSkge1xyXG4gICAgICAgIG1hbmlmZXN0LmZpbGVzWydhZ2VudHMvJyArIGZpbGVdID0gZmlsZUhhc2gocGF0aC5qb2luKGFnZW50c0RpciwgZmlsZSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihjb25maWdEaXIsIE1BTklGRVNUX05BTUUpLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMikpO1xyXG4gIHJldHVybiBtYW5pZmVzdDtcclxufVxyXG5cclxuLyoqXHJcbiAqIERldGVjdCB1c2VyLW1vZGlmaWVkIEVaX0FnZW50cyBmaWxlcyBieSBjb21wYXJpbmcgYWdhaW5zdCBpbnN0YWxsIG1hbmlmZXN0LlxyXG4gKiBCYWNrcyB1cCBtb2RpZmllZCBmaWxlcyB0byBlei1sb2NhbC1wYXRjaGVzLyBmb3IgcmVhcHBseSBhZnRlciB1cGRhdGUuXHJcbiAqL1xyXG5mdW5jdGlvbiBzYXZlTG9jYWxQYXRjaGVzKGNvbmZpZ0Rpcikge1xyXG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIE1BTklGRVNUX05BTUUpO1xyXG4gIGlmICghZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSByZXR1cm4gW107XHJcblxyXG4gIGxldCBtYW5pZmVzdDtcclxuICB0cnkgeyBtYW5pZmVzdCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSk7IH0gY2F0Y2ggeyByZXR1cm4gW107IH1cclxuXHJcbiAgY29uc3QgcGF0Y2hlc0RpciA9IHBhdGguam9pbihjb25maWdEaXIsIFBBVENIRVNfRElSX05BTUUpO1xyXG4gIGNvbnN0IG1vZGlmaWVkOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBmb3IgKGNvbnN0IFtyZWxQYXRoLCBvcmlnaW5hbEhhc2hdIG9mIE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0LmZpbGVzIHx8IHt9KSkge1xyXG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCByZWxQYXRoKTtcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhmdWxsUGF0aCkpIGNvbnRpbnVlO1xyXG4gICAgY29uc3QgY3VycmVudEhhc2ggPSBmaWxlSGFzaChmdWxsUGF0aCk7XHJcbiAgICBpZiAoY3VycmVudEhhc2ggIT09IG9yaWdpbmFsSGFzaCkge1xyXG4gICAgICBjb25zdCBiYWNrdXBQYXRoID0gcGF0aC5qb2luKHBhdGNoZXNEaXIsIHJlbFBhdGgpO1xyXG4gICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKGJhY2t1cFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgZnMuY29weUZpbGVTeW5jKGZ1bGxQYXRoLCBiYWNrdXBQYXRoKTtcclxuICAgICAgbW9kaWZpZWQucHVzaChyZWxQYXRoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChtb2RpZmllZC5sZW5ndGggPiAwKSB7XHJcbiAgICBjb25zdCBtZXRhID0ge1xyXG4gICAgICBiYWNrZWRfdXBfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgZnJvbV92ZXJzaW9uOiBtYW5pZmVzdC52ZXJzaW9uLFxyXG4gICAgICBmaWxlczogbW9kaWZpZWRcclxuICAgIH07XHJcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwYXRjaGVzRGlyLCAnYmFja3VwLW1ldGEuanNvbicpLCBKU09OLnN0cmluZ2lmeShtZXRhLCBudWxsLCAyKSk7XHJcbiAgICBjb25zb2xlLmxvZygnICAnICsgeWVsbG93ICsgJ2knICsgcmVzZXQgKyAnICBGb3VuZCAnICsgbW9kaWZpZWQubGVuZ3RoICsgJyBsb2NhbGx5IG1vZGlmaWVkIEVaIGZpbGUocykgXHUyMDE0IGJhY2tlZCB1cCB0byAnICsgUEFUQ0hFU19ESVJfTkFNRSArICcvJyk7XHJcbiAgICBmb3IgKGNvbnN0IGYgb2YgbW9kaWZpZWQpIHtcclxuICAgICAgY29uc29sZS5sb2coJyAgICAgJyArIGRpbSArIGYgKyByZXNldCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBtb2RpZmllZDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFmdGVyIGluc3RhbGwsIHJlcG9ydCBiYWNrZWQtdXAgcGF0Y2hlcyBmb3IgdXNlciB0byByZWFwcGx5LlxyXG4gKi9cclxuZnVuY3Rpb24gcmVwb3J0TG9jYWxQYXRjaGVzKGNvbmZpZ0RpciwgcnVudGltZSA9ICdjbGF1ZGUnKSB7XHJcbiAgY29uc3QgcGF0Y2hlc0RpciA9IHBhdGguam9pbihjb25maWdEaXIsIFBBVENIRVNfRElSX05BTUUpO1xyXG4gIGNvbnN0IG1ldGFQYXRoID0gcGF0aC5qb2luKHBhdGNoZXNEaXIsICdiYWNrdXAtbWV0YS5qc29uJyk7XHJcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1ldGFQYXRoKSkgcmV0dXJuIFtdO1xyXG5cclxuICBsZXQgbWV0YTtcclxuICB0cnkgeyBtZXRhID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWV0YVBhdGgsICd1dGY4JykpOyB9IGNhdGNoIHsgcmV0dXJuIFtdOyB9XHJcblxyXG4gIGlmIChtZXRhLmZpbGVzICYmIG1ldGEuZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgY29uc3QgcmVhcHBseUNvbW1hbmQgPSAocnVudGltZSA9PT0gJ29wZW5jb2RlJyB8fCBydW50aW1lID09PSAnY29waWxvdCcpXHJcbiAgICAgID8gJy9lei1yZWFwcGx5LXBhdGNoZXMnXHJcbiAgICAgIDogcnVudGltZSA9PT0gJ2NvZGV4J1xyXG4gICAgICAgID8gJyRlei1yZWFwcGx5LXBhdGNoZXMnXHJcbiAgICAgICAgOiAnL2V6OnJlYXBwbHktcGF0Y2hlcyc7XHJcbiAgICBjb25zb2xlLmxvZygnJyk7XHJcbiAgICBjb25zb2xlLmxvZygnICAnICsgeWVsbG93ICsgJ0xvY2FsIHBhdGNoZXMgZGV0ZWN0ZWQnICsgcmVzZXQgKyAnIChmcm9tIHYnICsgbWV0YS5mcm9tX3ZlcnNpb24gKyAnKTonKTtcclxuICAgIGZvciAoY29uc3QgZiBvZiBtZXRhLmZpbGVzKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCcgICAgICcgKyBjeWFuICsgZiArIHJlc2V0KTtcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKCcnKTtcclxuICAgIGNvbnNvbGUubG9nKCcgIFlvdXIgbW9kaWZpY2F0aW9ucyBhcmUgc2F2ZWQgaW4gJyArIGN5YW4gKyBQQVRDSEVTX0RJUl9OQU1FICsgJy8nICsgcmVzZXQpO1xyXG4gICAgY29uc29sZS5sb2coJyAgUnVuICcgKyBjeWFuICsgcmVhcHBseUNvbW1hbmQgKyByZXNldCArICcgdG8gbWVyZ2UgdGhlbSBpbnRvIHRoZSBuZXcgdmVyc2lvbi4nKTtcclxuICAgIGNvbnNvbGUubG9nKCcgIE9yIG1hbnVhbGx5IGNvbXBhcmUgYW5kIG1lcmdlIHRoZSBmaWxlcy4nKTtcclxuICAgIGNvbnNvbGUubG9nKCcnKTtcclxuICB9XHJcbiAgcmV0dXJuIG1ldGEuZmlsZXMgfHwgW107XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluc3RhbGwoaXNHbG9iYWw6IGJvb2xlYW4sIHJ1bnRpbWUgPSAnY2xhdWRlJyk6IHsgc2V0dGluZ3NQYXRoOiBzdHJpbmcgfCBudWxsOyBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsOyBzdGF0dXNsaW5lQ29tbWFuZDogc3RyaW5nIHwgbnVsbDsgcnVudGltZTogc3RyaW5nIH0ge1xyXG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xyXG4gIGNvbnN0IGlzR2VtaW5pID0gcnVudGltZSA9PT0gJ2dlbWluaSc7XHJcbiAgY29uc3QgaXNDb2RleCA9IHJ1bnRpbWUgPT09ICdjb2RleCc7XHJcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xyXG4gIGNvbnN0IGlzUXdlbiA9IHJ1bnRpbWUgPT09ICdxd2VuJztcclxuICBjb25zdCBpc0tpbWkgPSBydW50aW1lID09PSAna2ltaSc7XHJcbiAgY29uc3QgZGlyTmFtZSA9IGdldERpck5hbWUocnVudGltZSk7XHJcbiAgY29uc3Qgc3JjID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJyk7XHJcblxyXG4gIC8vIEdldCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBiYXNlZCBvbiBydW50aW1lIGFuZCBpbnN0YWxsIHR5cGVcclxuICBjb25zdCB0YXJnZXREaXIgPSBpc0dsb2JhbFxyXG4gICAgPyBnZXRHbG9iYWxEaXIocnVudGltZSwgZXhwbGljaXRDb25maWdEaXIpXHJcbiAgICA6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBkaXJOYW1lKTtcclxuXHJcbiAgY29uc3QgbG9jYXRpb25MYWJlbCA9IGlzR2xvYmFsXHJcbiAgICA/IHRhcmdldERpci5yZXBsYWNlKG9zLmhvbWVkaXIoKSwgJ34nKVxyXG4gICAgOiB0YXJnZXREaXIucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnLicpO1xyXG5cclxuICAvLyBQYXRoIHByZWZpeCBmb3IgZmlsZSByZWZlcmVuY2VzIGluIG1hcmtkb3duIGNvbnRlbnRcclxuICAvLyBGb3IgZ2xvYmFsIGluc3RhbGxzOiB1c2UgdGlsZGUtYmFzZWQgcGF0aCAofi8uY2xhdWRlLykgdG8gYXZvaWQgYmFraW5nXHJcbiAgLy8gYWJzb2x1dGUgcGF0aHMgKGNvbnRhaW5pbmcgT1MgdXNlcm5hbWUpIGludG8gdGVtcGxhdGVzXHJcbiAgLy8gRm9yIGxvY2FsIGluc3RhbGxzOiB1c2UgcmVsYXRpdmVcclxuICBjb25zdCBwYXRoUHJlZml4ID0gaXNHbG9iYWxcclxuICAgID8gYCR7dGFyZ2V0RGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKS5yZXBsYWNlKG9zLmhvbWVkaXIoKS5yZXBsYWNlKC9cXFxcL2csICcvJyksICd+Jyl9L2BcclxuICAgIDogYC4vJHtkaXJOYW1lfS9gO1xyXG5cclxuICBsZXQgcnVudGltZUxhYmVsID0gJ0NsYXVkZSBDb2RlJztcclxuICBpZiAoaXNPcGVuY29kZSkgcnVudGltZUxhYmVsID0gJ09wZW5Db2RlJztcclxuICBpZiAoaXNHZW1pbmkpIHJ1bnRpbWVMYWJlbCA9ICdHZW1pbmknO1xyXG4gIGlmIChpc0NvZGV4KSBydW50aW1lTGFiZWwgPSAnQ29kZXgnO1xyXG4gIGlmIChpc0NvcGlsb3QpIHJ1bnRpbWVMYWJlbCA9ICdDb3BpbG90JztcclxuICBpZiAoaXNRd2VuKSBydW50aW1lTGFiZWwgPSAnUXdlbiBDb2RlJztcclxuICBpZiAoaXNLaW1pKSBydW50aW1lTGFiZWwgPSAnS2ltaSBDb2RlJztcclxuXHJcbiAgY29uc29sZS5sb2coYCAgSW5zdGFsbGluZyBmb3IgJHtjeWFufSR7cnVudGltZUxhYmVsfSR7cmVzZXR9IHRvICR7Y3lhbn0ke2xvY2F0aW9uTGFiZWx9JHtyZXNldH1cXG5gKTtcclxuXHJcbiAgLy8gVHJhY2sgaW5zdGFsbGF0aW9uIGZhaWx1cmVzXHJcbiAgY29uc3QgZmFpbHVyZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIC8vIFNhdmUgYW55IGxvY2FsbHkgbW9kaWZpZWQgRVpfQWdlbnRzIGZpbGVzIGJlZm9yZSB0aGV5IGdldCB3aXBlZFxyXG4gIHNhdmVMb2NhbFBhdGNoZXModGFyZ2V0RGlyKTtcclxuXHJcbiAgLy8gQ2xlYW4gdXAgb3JwaGFuZWQgZmlsZXMgZnJvbSBwcmV2aW91cyB2ZXJzaW9uc1xyXG4gIGNsZWFudXBPcnBoYW5lZEZpbGVzKHRhcmdldERpcik7XHJcblxyXG4gIC8vIE9wZW5Db2RlIHVzZXMgY29tbWFuZC8gKGZsYXQpLCBDb2RleC9Db3BpbG90L1F3ZW4gdXNlIHNraWxscy8sIENsYXVkZS9HZW1pbmkgdXNlIGNvbW1hbmRzL2V6L1xyXG4gIGlmIChpc09wZW5jb2RlKSB7XHJcbiAgICAvLyBPcGVuQ29kZTogZmxhdCBzdHJ1Y3R1cmUgaW4gY29tbWFuZC8gZGlyZWN0b3J5XHJcbiAgICBjb25zdCBjb21tYW5kRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbW1hbmQnKTtcclxuICAgIGZzLm1rZGlyU3luYyhjb21tYW5kRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICAvLyBDb3B5IGNvbW1hbmRzL2V6LyoubWQgYXMgY29tbWFuZC9lei0qLm1kIChmbGF0dGVuIHN0cnVjdHVyZSlcclxuICAgIGNvbnN0IGV6U3JjID0gcGF0aC5qb2luKHNyYywgJ2NvbW1hbmRzJywgJ2V6Jyk7XHJcbiAgICBjb3B5RmxhdHRlbmVkQ29tbWFuZHMoZXpTcmMsIGNvbW1hbmREaXIsICdleicsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpO1xyXG4gICAgaWYgKHZlcmlmeUluc3RhbGxlZChjb21tYW5kRGlyLCAnY29tbWFuZC9lei0qJykpIHtcclxuICAgICAgY29uc3QgY291bnQgPSBmcy5yZWFkZGlyU3luYyhjb21tYW5kRGlyKS5maWx0ZXIoZiA9PiBmLnN0YXJ0c1dpdGgoJ2V6LScpKS5sZW5ndGg7XHJcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkICR7Y291bnR9IGNvbW1hbmRzIHRvIGNvbW1hbmQvYCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmYWlsdXJlcy5wdXNoKCdjb21tYW5kL2V6LSonKTtcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKGlzQ29kZXggfHwgaXNLaW1pKSB7XHJcbiAgICAvLyBDb2RleCwgS2ltaTogc2tpbGxzIHN0cnVjdHVyZSBpbiBza2lsbHMvIGRpcmVjdG9yeVxyXG4gICAgY29uc3Qgc2tpbGxzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NraWxscycpO1xyXG4gICAgY29uc3QgZXpTcmMgPSBwYXRoLmpvaW4oc3JjLCAnY29tbWFuZHMnLCAnZXonKTtcclxuICAgIGlmIChpc0tpbWkpIHtcclxuICAgICAgY29weUNvbW1hbmRzQXNLaW1pU2tpbGxzKGV6U3JjLCBza2lsbHNEaXIsICdleicsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29weUNvbW1hbmRzQXNDb2RleFNraWxscyhlelNyYywgc2tpbGxzRGlyLCAnZXonLCBwYXRoUHJlZml4LCBydW50aW1lKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGluc3RhbGxlZFNraWxsTmFtZXMgPSBsaXN0Q29kZXhTa2lsbE5hbWVzKHNraWxsc0Rpcik7XHJcbiAgICBpZiAoaW5zdGFsbGVkU2tpbGxOYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkICR7aW5zdGFsbGVkU2tpbGxOYW1lcy5sZW5ndGh9IHNraWxscyB0byBza2lsbHMvYCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmYWlsdXJlcy5wdXNoKCdza2lsbHMvZXotKicpO1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAoaXNRd2VuKSB7XHJcbiAgICAvLyBRd2VuIENvZGU6IGNvbW1hbmRzIHN0cnVjdHVyZSBpbiBjb21tYW5kcy9lei8gZGlyZWN0b3J5IChsaWtlIENsYXVkZSBDb2RlL0dlbWluaSlcclxuICAgIC8vIFF3ZW4gQ29kZSB1c2VzIH4vLnF3ZW4vY29tbWFuZHMvZXovKi5tZCwgTk9UIH4vLnF3ZW4vc2tpbGxzL1xyXG4gICAgY29uc3QgY29tbWFuZHNEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnY29tbWFuZHMnKTtcclxuICAgIGNvbnN0IGV6Q29tbWFuZHNEaXIgPSBwYXRoLmpvaW4oY29tbWFuZHNEaXIsICdleicpO1xyXG4gICAgZnMubWtkaXJTeW5jKGV6Q29tbWFuZHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG4gICAgXHJcbiAgICBjb25zdCBlelNyYyA9IHBhdGguam9pbihzcmMsICdjb21tYW5kcycsICdleicpO1xyXG4gICAgY29weUNvbW1hbmRzQXNRd2VuQ29tbWFuZHMoZXpTcmMsIGV6Q29tbWFuZHNEaXIsICdleicsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpO1xyXG4gICAgXHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhlekNvbW1hbmRzRGlyKSkge1xyXG4gICAgICBjb25zdCBjb3VudCA9IGZzLnJlYWRkaXJTeW5jKGV6Q29tbWFuZHNEaXIpLmZpbHRlcihmID0+IGYuZW5kc1dpdGgoJy5tZCcpKS5sZW5ndGg7XHJcbiAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCAke2NvdW50fSBjb21tYW5kcyB0byBjb21tYW5kcy9lei9gKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmYWlsdXJlcy5wdXNoKCdjb21tYW5kcy9lei8qLm1kJyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZhaWx1cmVzLnB1c2goJ2NvbW1hbmRzL2V6LyoubWQnKTtcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xyXG4gICAgY29uc3Qgc2tpbGxzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NraWxscycpO1xyXG4gICAgY29uc3QgZXpTcmMgPSBwYXRoLmpvaW4oc3JjLCAnY29tbWFuZHMnLCAnZXonKTtcclxuICAgIGNvcHlDb21tYW5kc0FzQ29waWxvdFNraWxscyhlelNyYywgc2tpbGxzRGlyLCAnZXonLCBpc0dsb2JhbCk7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhza2lsbHNEaXIpKSB7XHJcbiAgICAgIGNvbnN0IGNvdW50ID0gZnMucmVhZGRpclN5bmMoc2tpbGxzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcclxuICAgICAgICAuZmlsdGVyKGUgPT4gZS5pc0RpcmVjdG9yeSgpICYmIGUubmFtZS5zdGFydHNXaXRoKCdlei0nKSkubGVuZ3RoO1xyXG4gICAgICBpZiAoY291bnQgPiAwKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgJHtjb3VudH0gc2tpbGxzIHRvIHNraWxscy9gKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmYWlsdXJlcy5wdXNoKCdza2lsbHMvZXotKicpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmYWlsdXJlcy5wdXNoKCdza2lsbHMvZXotKicpO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBDbGF1ZGUgQ29kZSAmIEdlbWluaTogbmVzdGVkIHN0cnVjdHVyZSBpbiBjb21tYW5kcy8gZGlyZWN0b3J5XHJcbiAgICBjb25zdCBjb21tYW5kc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kcycpO1xyXG4gICAgZnMubWtkaXJTeW5jKGNvbW1hbmRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICBjb25zdCBlelNyYyA9IHBhdGguam9pbihzcmMsICdjb21tYW5kcycsICdleicpO1xyXG4gICAgY29uc3QgZXpEZXN0ID0gcGF0aC5qb2luKGNvbW1hbmRzRGlyLCAnZXonKTtcclxuICAgIGNvcHlXaXRoUGF0aFJlcGxhY2VtZW50KGV6U3JjLCBlekRlc3QsIHBhdGhQcmVmaXgsIHJ1bnRpbWUsIHRydWUsIGlzR2xvYmFsKTtcclxuICAgIGlmICh2ZXJpZnlJbnN0YWxsZWQoZXpEZXN0LCAnY29tbWFuZHMvZXonKSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCBjb21tYW5kcy9lemApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZmFpbHVyZXMucHVzaCgnY29tbWFuZHMvZXonKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENvcHkgZXotYWdlbnRzIHNraWxsIHdpdGggcGF0aCByZXBsYWNlbWVudFxyXG4gIGNvbnN0IHNraWxsU3JjID0gcGF0aC5qb2luKHNyYywgJ2V6LWFnZW50cycpO1xyXG4gIGNvbnN0IHNraWxsRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdlei1hZ2VudHMnKTtcclxuICBjb3B5V2l0aFBhdGhSZXBsYWNlbWVudChza2lsbFNyYywgc2tpbGxEZXN0LCBwYXRoUHJlZml4LCBydW50aW1lLCBmYWxzZSwgaXNHbG9iYWwpO1xyXG4gIGlmICh2ZXJpZnlJbnN0YWxsZWQoc2tpbGxEZXN0LCAnZXotYWdlbnRzJykpIHtcclxuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkIGV6LWFnZW50c2ApO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBmYWlsdXJlcy5wdXNoKCdlei1hZ2VudHMnKTtcclxuICB9XHJcblxyXG4gIC8vIENvcHkgRVogQWdlbnRzIHNraWxscyB0byBnbG9iYWwgZGlyZWN0b3J5ICgkSE9NRS8uc2tpbGxzL2V6LWFnZW50cy8pXHJcbiAgY29weVNraWxscyhzcmMsIGlzR2xvYmFsLCBydW50aW1lKTtcclxuXHJcbiAgLy8gQ29weSBhZ2VudHMgdG8gYWdlbnRzIGRpcmVjdG9yeVxyXG4gIGNvbnN0IGFnZW50c1NyYyA9IHBhdGguam9pbihzcmMsICdhZ2VudHMnKTtcclxuICBpZiAoZnMuZXhpc3RzU3luYyhhZ2VudHNTcmMpKSB7XHJcbiAgICBjb25zdCBhZ2VudHNEZXN0ID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2FnZW50cycpO1xyXG4gICAgZnMubWtkaXJTeW5jKGFnZW50c0Rlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgIC8vIFJlbW92ZSBvbGQgRVpfQWdlbnRzIGFnZW50cyAoZXotKi5tZCkgYmVmb3JlIGNvcHlpbmcgbmV3IG9uZXNcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKGFnZW50c0Rlc3QpKSB7XHJcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyhhZ2VudHNEZXN0KSkge1xyXG4gICAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ2V6LScpICYmIGZpbGUuZW5kc1dpdGgoJy5tZCcpKSB7XHJcbiAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihhZ2VudHNEZXN0LCBmaWxlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29weSBuZXcgYWdlbnRzXHJcbiAgICBjb25zdCBhZ2VudEVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhhZ2VudHNTcmMsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcclxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgYWdlbnRFbnRyaWVzKSB7XHJcbiAgICAgIGlmIChlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xyXG4gICAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihhZ2VudHNTcmMsIGVudHJ5Lm5hbWUpLCAndXRmOCcpO1xyXG4gICAgICAgIC8vIFJlcGxhY2Ugfi8uY2xhdWRlLyBhbmQgJEhPTUUvLmNsYXVkZS8gYXMgdGhleSBhcmUgdGhlIHNvdXJjZSBvZiB0cnV0aCBpbiB0aGUgcmVwb1xyXG4gICAgICAgIGNvbnN0IGRpclJlZ2V4ID0gL35cXC9cXC5jbGF1ZGVcXC8vZztcclxuICAgICAgICBjb25zdCBob21lRGlyUmVnZXggPSAvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nO1xyXG4gICAgICAgIGlmICghaXNDb3BpbG90KSB7XHJcbiAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGRpclJlZ2V4LCBwYXRoUHJlZml4KTtcclxuICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoaG9tZURpclJlZ2V4LCB0b0hvbWVQcmVmaXgocGF0aFByZWZpeCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcclxuICAgICAgICAvLyBDb252ZXJ0IGZyb250bWF0dGVyIGZvciBydW50aW1lIGNvbXBhdGliaWxpdHlcclxuICAgICAgICBpZiAoaXNPcGVuY29kZSkge1xyXG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb09wZW5jb2RlRnJvbnRtYXR0ZXIoY29udGVudCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc0dlbWluaSkge1xyXG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb0dlbWluaUFnZW50KGNvbnRlbnQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXNDb2RleCkge1xyXG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVBZ2VudFRvQ29kZXhBZ2VudChjb250ZW50KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xyXG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVBZ2VudFRvQ29waWxvdEFnZW50KGNvbnRlbnQsIGlzR2xvYmFsKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGlzUXdlbikge1xyXG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb1F3ZW5BZ2VudChjb250ZW50KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGlzS2ltaSkge1xyXG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb0tpbWlBZ2VudChjb250ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGVzdE5hbWUgPSBpc0NvcGlsb3QgPyBlbnRyeS5uYW1lLnJlcGxhY2UoJy5tZCcsICcuYWdlbnQubWQnKSA6IGVudHJ5Lm5hbWU7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oYWdlbnRzRGVzdCwgZGVzdE5hbWUpLCBjb250ZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHZlcmlmeUluc3RhbGxlZChhZ2VudHNEZXN0LCAnYWdlbnRzJykpIHtcclxuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgYWdlbnRzYCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmYWlsdXJlcy5wdXNoKCdhZ2VudHMnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENvcHkgQ0hBTkdFTE9HLm1kXHJcbiAgY29uc3QgY2hhbmdlbG9nU3JjID0gcGF0aC5qb2luKHNyYywgJ0NIQU5HRUxPRy5tZCcpO1xyXG4gIGNvbnN0IGNoYW5nZWxvZ0Rlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnZXotYWdlbnRzJywgJ0NIQU5HRUxPRy5tZCcpO1xyXG4gIGlmIChmcy5leGlzdHNTeW5jKGNoYW5nZWxvZ1NyYykpIHtcclxuICAgIGZzLmNvcHlGaWxlU3luYyhjaGFuZ2Vsb2dTcmMsIGNoYW5nZWxvZ0Rlc3QpO1xyXG4gICAgaWYgKHZlcmlmeUZpbGVJbnN0YWxsZWQoY2hhbmdlbG9nRGVzdCwgJ0NIQU5HRUxPRy5tZCcpKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkIENIQU5HRUxPRy5tZGApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZmFpbHVyZXMucHVzaCgnQ0hBTkdFTE9HLm1kJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBXcml0ZSBWRVJTSU9OIGZpbGVcclxuICBjb25zdCB2ZXJzaW9uRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdlei1hZ2VudHMnLCAnVkVSU0lPTicpO1xyXG4gIGZzLndyaXRlRmlsZVN5bmModmVyc2lvbkRlc3QsIHBrZy52ZXJzaW9uKTtcclxuICBpZiAodmVyaWZ5RmlsZUluc3RhbGxlZCh2ZXJzaW9uRGVzdCwgJ1ZFUlNJT04nKSkge1xyXG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBXcm90ZSBWRVJTSU9OICgke3BrZy52ZXJzaW9ufSlgKTtcclxuICB9IGVsc2Uge1xyXG4gICAgZmFpbHVyZXMucHVzaCgnVkVSU0lPTicpO1xyXG4gIH1cclxuXHJcbiAgaWYgKCFpc0NvZGV4ICYmICFpc0NvcGlsb3QgJiYgIWlzUXdlbiAmJiAhaXNLaW1pKSB7XHJcbiAgICAvLyBXcml0ZSBwYWNrYWdlLmpzb24gdG8gZm9yY2UgQ29tbW9uSlMgbW9kZSBmb3IgRVogc2NyaXB0c1xyXG4gICAgLy8gUHJldmVudHMgXCJyZXF1aXJlIGlzIG5vdCBkZWZpbmVkXCIgZXJyb3JzIHdoZW4gcHJvamVjdCBoYXMgXCJ0eXBlXCI6IFwibW9kdWxlXCJcclxuICAgIC8vIE5vZGUuanMgd2Fsa3MgdXAgbG9va2luZyBmb3IgcGFja2FnZS5qc29uIC0gdGhpcyBzdG9wcyBpbmhlcml0YW5jZSBmcm9tIHByb2plY3RcclxuICAgIGNvbnN0IHBrZ0pzb25EZXN0ID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3BhY2thZ2UuanNvbicpO1xyXG4gICAgZnMud3JpdGVGaWxlU3luYyhwa2dKc29uRGVzdCwgJ3tcInR5cGVcIjpcImNvbW1vbmpzXCJ9XFxuJyk7XHJcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFdyb3RlIHBhY2thZ2UuanNvbiAoQ29tbW9uSlMgbW9kZSlgKTtcclxuXHJcbiAgICAvLyBDb3B5IGhvb2tzIGZyb20gZGlzdC8gKGJ1bmRsZWQgd2l0aCBkZXBlbmRlbmNpZXMpXHJcbiAgICAvLyBUZW1wbGF0ZSBwYXRocyBmb3IgdGhlIHRhcmdldCBydW50aW1lIChyZXBsYWNlcyAnLmNsYXVkZScgd2l0aCBjb3JyZWN0IGNvbmZpZyBkaXIpXHJcbiAgICBjb25zdCBob29rc1NyYyA9IHBhdGguam9pbihzcmMsICdob29rcycsICdkaXN0Jyk7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhob29rc1NyYykpIHtcclxuICAgICAgY29uc3QgaG9va3NEZXN0ID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2hvb2tzJyk7XHJcbiAgICAgIGZzLm1rZGlyU3luYyhob29rc0Rlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG4gICAgICBjb25zdCBob29rRW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGhvb2tzU3JjKTtcclxuICAgICAgY29uc3QgY29uZmlnRGlyUmVwbGFjZW1lbnQgPSBnZXRDb25maWdEaXJGcm9tSG9tZShydW50aW1lLCBpc0dsb2JhbCk7XHJcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgaG9va0VudHJpZXMpIHtcclxuICAgICAgICBjb25zdCBzcmNGaWxlID0gcGF0aC5qb2luKGhvb2tzU3JjLCBlbnRyeSk7XHJcbiAgICAgICAgaWYgKGZzLnN0YXRTeW5jKHNyY0ZpbGUpLmlzRmlsZSgpKSB7XHJcbiAgICAgICAgICBjb25zdCBkZXN0RmlsZSA9IHBhdGguam9pbihob29rc0Rlc3QsIGVudHJ5KTtcclxuICAgICAgICAgIC8vIFRlbXBsYXRlIC5qcyBmaWxlcyB0byByZXBsYWNlICcuY2xhdWRlJyB3aXRoIHJ1bnRpbWUtc3BlY2lmaWMgY29uZmlnIGRpclxyXG4gICAgICAgICAgaWYgKGVudHJ5LmVuZHNXaXRoKCcuanMnKSkge1xyXG4gICAgICAgICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcmNGaWxlLCAndXRmOCcpO1xyXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC8nXFwuY2xhdWRlJy9nLCBjb25maWdEaXJSZXBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZGVzdEZpbGUsIGNvbnRlbnQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKHNyY0ZpbGUsIGRlc3RGaWxlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZlcmlmeUluc3RhbGxlZChob29rc0Rlc3QsICdob29rcycpKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgaG9va3MgKGJ1bmRsZWQpYCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZmFpbHVyZXMucHVzaCgnaG9va3MnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKGZhaWx1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoYFxcbiAgJHt5ZWxsb3d9SW5zdGFsbGF0aW9uIGluY29tcGxldGUhJHtyZXNldH0gRmFpbGVkOiAke2ZhaWx1cmVzLmpvaW4oJywgJyl9YCk7XHJcbiAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgfVxyXG5cclxuICAvLyBXcml0ZSBmaWxlIG1hbmlmZXN0IGZvciBmdXR1cmUgbW9kaWZpY2F0aW9uIGRldGVjdGlvblxyXG4gIHdyaXRlTWFuaWZlc3QodGFyZ2V0RGlyLCBydW50aW1lKTtcclxuICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFdyb3RlIGZpbGUgbWFuaWZlc3QgKCR7TUFOSUZFU1RfTkFNRX0pYCk7XHJcblxyXG4gIC8vIFJlcG9ydCBhbnkgYmFja2VkLXVwIGxvY2FsIHBhdGNoZXNcclxuICByZXBvcnRMb2NhbFBhdGNoZXModGFyZ2V0RGlyLCBydW50aW1lKTtcclxuXHJcbiAgLy8gVmVyaWZ5IG5vIGxlYWtlZCAuY2xhdWRlIHBhdGhzIGluIG5vbi1DbGF1ZGUgcnVudGltZXNcclxuICBpZiAocnVudGltZSAhPT0gJ2NsYXVkZScpIHtcclxuICAgIGNvbnN0IGxlYWtlZFBhdGhzOiBBcnJheTx7IGZpbGU6IHN0cmluZzsgY291bnQ6IG51bWJlciB9PiA9IFtdO1xyXG4gICAgZnVuY3Rpb24gc2NhbkZvckxlYWtlZFBhdGhzKGRpcjogc3RyaW5nKSB7XHJcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSByZXR1cm47XHJcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcclxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XHJcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcclxuICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAgICAgc2NhbkZvckxlYWtlZFBhdGhzKGZ1bGxQYXRoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKChlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSB8fCBlbnRyeS5uYW1lLmVuZHNXaXRoKCcudG9tbCcpKSAmJiBlbnRyeS5uYW1lICE9PSAnQ0hBTkdFTE9HLm1kJykge1xyXG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsUGF0aCwgJ3V0ZjgnKTtcclxuICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBjb250ZW50Lm1hdGNoKC8oPzp+fFxcJEhPTUUpXFwvXFwuY2xhdWRlXFxiL2cpO1xyXG4gICAgICAgICAgaWYgKG1hdGNoZXMpIHtcclxuICAgICAgICAgICAgbGVha2VkUGF0aHMucHVzaCh7IGZpbGU6IGZ1bGxQYXRoLnJlcGxhY2UodGFyZ2V0RGlyICsgJy8nLCAnJyksIGNvdW50OiBtYXRjaGVzLmxlbmd0aCB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHNjYW5Gb3JMZWFrZWRQYXRocyh0YXJnZXREaXIpO1xyXG4gICAgaWYgKGxlYWtlZFBhdGhzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgdG90YWxMZWFrcyA9IGxlYWtlZFBhdGhzLnJlZHVjZSgoc3VtLCBsKSA9PiBzdW0gKyBsLmNvdW50LCAwKTtcclxuICAgICAgY29uc29sZS53YXJuKGBcXG4gICR7eWVsbG93fVx1MjZBMCR7cmVzZXR9ICBGb3VuZCAke3RvdGFsTGVha3N9IHVucmVwbGFjZWQgLmNsYXVkZSBwYXRoIHJlZmVyZW5jZShzKSBpbiAke2xlYWtlZFBhdGhzLmxlbmd0aH0gZmlsZShzKTpgKTtcclxuICAgICAgZm9yIChjb25zdCBsZWFrIG9mIGxlYWtlZFBhdGhzLnNsaWNlKDAsIDUpKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGAgICAgICR7ZGltfSR7bGVhay5maWxlfSR7cmVzZXR9ICgke2xlYWsuY291bnR9KWApO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChsZWFrZWRQYXRocy5sZW5ndGggPiA1KSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGAgICAgICR7ZGltfS4uLiBhbmQgJHtsZWFrZWRQYXRocy5sZW5ndGggLSA1fSBtb3JlIGZpbGUocykke3Jlc2V0fWApO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUud2FybihgICAke2RpbX1UaGVzZSBwYXRocyBtYXkgbm90IHJlc29sdmUgY29ycmVjdGx5IGZvciAke3J1bnRpbWVMYWJlbH0uJHtyZXNldH1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChpc0NvZGV4KSB7XHJcbiAgICAvLyBHZW5lcmF0ZSBDb2RleCBjb25maWcudG9tbCBhbmQgcGVyLWFnZW50IC50b21sIGZpbGVzXHJcbiAgICBjb25zdCBhZ2VudENvdW50ID0gaW5zdGFsbENvZGV4Q29uZmlnKHRhcmdldERpciwgYWdlbnRzU3JjKTtcclxuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gR2VuZXJhdGVkIGNvbmZpZy50b21sIHdpdGggJHthZ2VudENvdW50fSBhZ2VudCByb2xlc2ApO1xyXG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBHZW5lcmF0ZWQgJHthZ2VudENvdW50fSBhZ2VudCAudG9tbCBjb25maWcgZmlsZXNgKTtcclxuICAgIHJldHVybiB7IHNldHRpbmdzUGF0aDogbnVsbCwgc2V0dGluZ3M6IG51bGwsIHN0YXR1c2xpbmVDb21tYW5kOiBudWxsLCBydW50aW1lIH07XHJcbiAgfVxyXG5cclxuICBpZiAoaXNDb3BpbG90KSB7XHJcbiAgICAvLyBHZW5lcmF0ZSBjb3BpbG90LWluc3RydWN0aW9ucy5tZFxyXG4gICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2V6LWFnZW50cycsICd0ZW1wbGF0ZXMnLCAnY29waWxvdC1pbnN0cnVjdGlvbnMubWQnKTtcclxuICAgIGNvbnN0IGluc3RydWN0aW9uc1BhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnY29waWxvdC1pbnN0cnVjdGlvbnMubWQnKTtcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcclxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCAndXRmOCcpO1xyXG4gICAgICBtZXJnZUNvcGlsb3RJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zUGF0aCwgdGVtcGxhdGUpO1xyXG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEdlbmVyYXRlZCBjb3BpbG90LWluc3RydWN0aW9ucy5tZGApO1xyXG4gICAgfVxyXG4gICAgLy8gQ29waWxvdDogbm8gc2V0dGluZ3MuanNvbiwgbm8gaG9va3MsIG5vIHN0YXR1c2xpbmUgKGxpa2UgQ29kZXgpXHJcbiAgICByZXR1cm4geyBzZXR0aW5nc1BhdGg6IG51bGwsIHNldHRpbmdzOiBudWxsLCBzdGF0dXNsaW5lQ29tbWFuZDogbnVsbCwgcnVudGltZSB9O1xyXG4gIH1cclxuXHJcbiAgaWYgKGlzUXdlbiB8fCBpc0tpbWkpIHtcclxuICAgIC8vIFF3ZW4vS2ltaTogbm8gc2V0dGluZ3MuanNvbiBob29rcywgbm8gc3RhdHVzbGluZSAobGlrZSBDb2RleC9Db3BpbG90KVxyXG4gICAgLy8gU2tpbGxzIGFyZSBpbnN0YWxsZWQgZGlyZWN0bHkgaW4gc2tpbGxzL2V6LSovU0tJTEwubWRcclxuICAgIHJldHVybiB7IHNldHRpbmdzUGF0aDogbnVsbCwgc2V0dGluZ3M6IG51bGwsIHN0YXR1c2xpbmVDb21tYW5kOiBudWxsLCBydW50aW1lIH07XHJcbiAgfVxyXG5cclxuICAvLyBDb25maWd1cmUgc3RhdHVzbGluZSBhbmQgaG9va3MgaW4gc2V0dGluZ3MuanNvblxyXG4gIC8vIEdlbWluaSB1c2VzIEFmdGVyVG9vbCBpbnN0ZWFkIG9mIFBvc3RUb29sVXNlIGZvciBwb3N0LXRvb2wgaG9va3NcclxuICBjb25zdCBwb3N0VG9vbEV2ZW50ID0gcnVudGltZSA9PT0gJ2dlbWluaScgPyAnQWZ0ZXJUb29sJyA6ICdQb3N0VG9vbFVzZSc7XHJcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NldHRpbmdzLmpzb24nKTtcclxuICBjb25zdCBzZXR0aW5ncyA9IGNsZWFudXBPcnBoYW5lZEhvb2tzKHJlYWRTZXR0aW5ncyhzZXR0aW5nc1BhdGgpKTtcclxuICBjb25zdCBzdGF0dXNsaW5lQ29tbWFuZCA9IGlzR2xvYmFsXHJcbiAgICA/IGJ1aWxkSG9va0NvbW1hbmQodGFyZ2V0RGlyLCAnZXotc3RhdHVzbGluZS5qcycpXHJcbiAgICA6ICdub2RlICcgKyBkaXJOYW1lICsgJy9ob29rcy9lei1zdGF0dXNsaW5lLmpzJztcclxuICBjb25zdCB1cGRhdGVDaGVja0NvbW1hbmQgPSBpc0dsb2JhbFxyXG4gICAgPyBidWlsZEhvb2tDb21tYW5kKHRhcmdldERpciwgJ2V6LWNoZWNrLXVwZGF0ZS5qcycpXHJcbiAgICA6ICdub2RlICcgKyBkaXJOYW1lICsgJy9ob29rcy9lei1jaGVjay11cGRhdGUuanMnO1xyXG4gIGNvbnN0IGNvbnRleHRNb25pdG9yQ29tbWFuZCA9IGlzR2xvYmFsXHJcbiAgICA/IGJ1aWxkSG9va0NvbW1hbmQodGFyZ2V0RGlyLCAnZXotY29udGV4dC1tb25pdG9yLmpzJylcclxuICAgIDogJ25vZGUgJyArIGRpck5hbWUgKyAnL2hvb2tzL2V6LWNvbnRleHQtbW9uaXRvci5qcyc7XHJcblxyXG4gIC8vIEVuYWJsZSBleHBlcmltZW50YWwgYWdlbnRzIGZvciBHZW1pbmkgQ0xJIChyZXF1aXJlZCBmb3IgY3VzdG9tIHN1Yi1hZ2VudHMpXHJcbiAgaWYgKGlzR2VtaW5pKSB7XHJcbiAgICBpZiAoIXNldHRpbmdzLmV4cGVyaW1lbnRhbCkge1xyXG4gICAgICBzZXR0aW5ncy5leHBlcmltZW50YWwgPSB7fTtcclxuICAgIH1cclxuICAgIGlmICghc2V0dGluZ3MuZXhwZXJpbWVudGFsLmVuYWJsZUFnZW50cykge1xyXG4gICAgICBzZXR0aW5ncy5leHBlcmltZW50YWwuZW5hYmxlQWdlbnRzID0gdHJ1ZTtcclxuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBFbmFibGVkIGV4cGVyaW1lbnRhbCBhZ2VudHNgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENvbmZpZ3VyZSBTZXNzaW9uU3RhcnQgaG9vayBmb3IgdXBkYXRlIGNoZWNraW5nIChza2lwIGZvciBvcGVuY29kZSlcclxuICBpZiAoIWlzT3BlbmNvZGUpIHtcclxuICAgIGlmICghc2V0dGluZ3MuaG9va3MpIHtcclxuICAgICAgc2V0dGluZ3MuaG9va3MgPSB7fTtcclxuICAgIH1cclxuICAgIGlmICghc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0KSB7XHJcbiAgICAgIHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydCA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhhc0V6VXBkYXRlSG9vayA9IHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5zb21lKGVudHJ5ID0+XHJcbiAgICAgIGVudHJ5Lmhvb2tzICYmIGVudHJ5Lmhvb2tzLnNvbWUoaCA9PiBoLmNvbW1hbmQgJiYgaC5jb21tYW5kLmluY2x1ZGVzKCdlei1jaGVjay11cGRhdGUnKSlcclxuICAgICk7XHJcblxyXG4gICAgaWYgKCFoYXNFelVwZGF0ZUhvb2spIHtcclxuICAgICAgc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0LnB1c2goe1xyXG4gICAgICAgIGhvb2tzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdjb21tYW5kJyxcclxuICAgICAgICAgICAgY29tbWFuZDogdXBkYXRlQ2hlY2tDb21tYW5kXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9KTtcclxuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDb25maWd1cmVkIHVwZGF0ZSBjaGVjayBob29rYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29uZmlndXJlIHBvc3QtdG9vbCBob29rIGZvciBjb250ZXh0IHdpbmRvdyBtb25pdG9yaW5nXHJcbiAgICBpZiAoIXNldHRpbmdzLmhvb2tzW3Bvc3RUb29sRXZlbnRdKSB7XHJcbiAgICAgIHNldHRpbmdzLmhvb2tzW3Bvc3RUb29sRXZlbnRdID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaGFzQ29udGV4dE1vbml0b3JIb29rID0gc2V0dGluZ3MuaG9va3NbcG9zdFRvb2xFdmVudF0uc29tZShlbnRyeSA9PlxyXG4gICAgICBlbnRyeS5ob29rcyAmJiBlbnRyeS5ob29rcy5zb21lKGggPT4gaC5jb21tYW5kICYmIGguY29tbWFuZC5pbmNsdWRlcygnZXotY29udGV4dC1tb25pdG9yJykpXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghaGFzQ29udGV4dE1vbml0b3JIb29rKSB7XHJcbiAgICAgIHNldHRpbmdzLmhvb2tzW3Bvc3RUb29sRXZlbnRdLnB1c2goe1xyXG4gICAgICAgIGhvb2tzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdjb21tYW5kJyxcclxuICAgICAgICAgICAgY29tbWFuZDogY29udGV4dE1vbml0b3JDb21tYW5kXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9KTtcclxuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDb25maWd1cmVkIGNvbnRleHQgd2luZG93IG1vbml0b3IgaG9va2ApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHsgc2V0dGluZ3NQYXRoLCBzZXR0aW5ncywgc3RhdHVzbGluZUNvbW1hbmQsIHJ1bnRpbWUgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGx5IHN0YXR1c2xpbmUgY29uZmlnLCB0aGVuIHByaW50IGNvbXBsZXRpb24gbWVzc2FnZVxyXG4gKi9cclxuZnVuY3Rpb24gZmluaXNoSW5zdGFsbChzZXR0aW5nc1BhdGgsIHNldHRpbmdzLCBzdGF0dXNsaW5lQ29tbWFuZCwgc2hvdWxkSW5zdGFsbFN0YXR1c2xpbmUsIHJ1bnRpbWUgPSAnY2xhdWRlJywgaXNHbG9iYWwgPSB0cnVlKSB7XHJcbiAgY29uc3QgaXNPcGVuY29kZSA9IHJ1bnRpbWUgPT09ICdvcGVuY29kZSc7XHJcbiAgY29uc3QgaXNDb2RleCA9IHJ1bnRpbWUgPT09ICdjb2RleCc7XHJcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xyXG4gIGNvbnN0IGlzUXdlbiA9IHJ1bnRpbWUgPT09ICdxd2VuJztcclxuICBjb25zdCBpc0tpbWkgPSBydW50aW1lID09PSAna2ltaSc7XHJcblxyXG4gIGlmIChzaG91bGRJbnN0YWxsU3RhdHVzbGluZSAmJiAhaXNPcGVuY29kZSAmJiAhaXNDb2RleCAmJiAhaXNDb3BpbG90ICYmICFpc1F3ZW4gJiYgIWlzS2ltaSkge1xyXG4gICAgc2V0dGluZ3Muc3RhdHVzTGluZSA9IHtcclxuICAgICAgdHlwZTogJ2NvbW1hbmQnLFxyXG4gICAgICBjb21tYW5kOiBzdGF0dXNsaW5lQ29tbWFuZFxyXG4gICAgfTtcclxuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gQ29uZmlndXJlZCBzdGF0dXNsaW5lYCk7XHJcbiAgfVxyXG5cclxuICAvLyBXcml0ZSBzZXR0aW5ncyB3aGVuIHJ1bnRpbWUgc3VwcG9ydHMgc2V0dGluZ3MuanNvblxyXG4gIGlmICghaXNDb2RleCAmJiAhaXNDb3BpbG90ICYmICFpc1F3ZW4gJiYgIWlzS2ltaSkge1xyXG4gICAgd3JpdGVTZXR0aW5ncyhzZXR0aW5nc1BhdGgsIHNldHRpbmdzKTtcclxuICB9XHJcblxyXG4gIC8vIENvbmZpZ3VyZSBPcGVuQ29kZSBwZXJtaXNzaW9uc1xyXG4gIGlmIChpc09wZW5jb2RlKSB7XHJcbiAgICBjb25maWd1cmVPcGVuY29kZVBlcm1pc3Npb25zKGlzR2xvYmFsKTtcclxuICB9XHJcblxyXG4gIGxldCBwcm9ncmFtID0gJ0NsYXVkZSBDb2RlJztcclxuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJykgcHJvZ3JhbSA9ICdPcGVuQ29kZSc7XHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSBwcm9ncmFtID0gJ0dlbWluaSc7XHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb2RleCcpIHByb2dyYW0gPSAnQ29kZXgnO1xyXG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHByb2dyYW0gPSAnQ29waWxvdCc7XHJcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcHJvZ3JhbSA9ICdRd2VuIENvZGUnO1xyXG4gIGlmIChydW50aW1lID09PSAna2ltaScpIHByb2dyYW0gPSAnS2ltaSBDb2RlJztcclxuXHJcbiAgbGV0IGNvbW1hbmQgPSAnL2V6Om5ldy1wcm9qZWN0JztcclxuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJyB8fCBydW50aW1lID09PSAnZ2VtaW5pJyB8fCBydW50aW1lID09PSAnY29waWxvdCcgfHwgcnVudGltZSA9PT0gJ3F3ZW4nIHx8IHJ1bnRpbWUgPT09ICdraW1pJykgY29tbWFuZCA9ICcvZXotbmV3LXByb2plY3QnO1xyXG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSBjb21tYW5kID0gJyRlei1uZXctcHJvamVjdCc7XHJcbiAgY29uc29sZS5sb2coYFxyXG4gICR7Z3JlZW59RG9uZSEke3Jlc2V0fSBPcGVuIGEgYmxhbmsgZGlyZWN0b3J5IGluICR7cHJvZ3JhbX0gYW5kIHJ1biAke2N5YW59JHtjb21tYW5kfSR7cmVzZXR9LlxyXG5cclxuICAke2N5YW59Sm9pbiB0aGUgY29tbXVuaXR5OiR7cmVzZXR9IGh0dHBzOi8vZGlzY29yZC5nZy9lei1hZ2VudHNcclxuYCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIYW5kbGUgc3RhdHVzbGluZSBjb25maWd1cmF0aW9uIHdpdGggb3B0aW9uYWwgcHJvbXB0XHJcbiAqL1xyXG5mdW5jdGlvbiBoYW5kbGVTdGF0dXNsaW5lKHNldHRpbmdzLCBpc0ludGVyYWN0aXZlLCBjYWxsYmFjaykge1xyXG4gIGNvbnN0IGhhc0V4aXN0aW5nID0gc2V0dGluZ3Muc3RhdHVzTGluZSAhPSBudWxsO1xyXG5cclxuICBpZiAoIWhhc0V4aXN0aW5nKSB7XHJcbiAgICBjYWxsYmFjayh0cnVlKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGlmIChmb3JjZVN0YXR1c2xpbmUpIHtcclxuICAgIGNhbGxiYWNrKHRydWUpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgaWYgKCFpc0ludGVyYWN0aXZlKSB7XHJcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBTa2lwcGluZyBzdGF0dXNsaW5lIChhbHJlYWR5IGNvbmZpZ3VyZWQpYCk7XHJcbiAgICBjb25zb2xlLmxvZyhgICAgIFVzZSAke2N5YW59LS1mb3JjZS1zdGF0dXNsaW5lJHtyZXNldH0gdG8gcmVwbGFjZVxcbmApO1xyXG4gICAgY2FsbGJhY2soZmFsc2UpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgZXhpc3RpbmdDbWQgPSBzZXR0aW5ncy5zdGF0dXNMaW5lLmNvbW1hbmQgfHwgc2V0dGluZ3Muc3RhdHVzTGluZS51cmwgfHwgJyhjdXN0b20pJztcclxuXHJcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xyXG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXHJcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0XHJcbiAgfSk7XHJcblxyXG4gIGNvbnNvbGUubG9nKGBcclxuICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBFeGlzdGluZyBzdGF0dXNsaW5lIGRldGVjdGVkXFxuXHJcbiAgWW91ciBjdXJyZW50IHN0YXR1c2xpbmU6XHJcbiAgICAke2RpbX1jb21tYW5kOiAke2V4aXN0aW5nQ21kfSR7cmVzZXR9XHJcblxyXG4gIEVaX0FnZW50cyBpbmNsdWRlcyBhIHN0YXR1c2xpbmUgc2hvd2luZzpcclxuICAgIFx1MjAyMiBNb2RlbCBuYW1lXHJcbiAgICBcdTIwMjIgQ3VycmVudCB0YXNrIChmcm9tIHRvZG8gbGlzdClcclxuICAgIFx1MjAyMiBDb250ZXh0IHdpbmRvdyB1c2FnZSAoY29sb3ItY29kZWQpXHJcblxyXG4gICR7Y3lhbn0xJHtyZXNldH0pIEtlZXAgZXhpc3RpbmdcclxuICAke2N5YW59MiR7cmVzZXR9KSBSZXBsYWNlIHdpdGggRVpfQWdlbnRzIHN0YXR1c2xpbmVcclxuYCk7XHJcblxyXG4gIHJsLnF1ZXN0aW9uKGAgIENob2ljZSAke2RpbX1bMV0ke3Jlc2V0fTogYCwgKGFuc3dlcikgPT4ge1xyXG4gICAgcmwuY2xvc2UoKTtcclxuICAgIGNvbnN0IGNob2ljZSA9IGFuc3dlci50cmltKCkgfHwgJzEnO1xyXG4gICAgY2FsbGJhY2soY2hvaWNlID09PSAnMicpO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogUHJvbXB0IGZvciBydW50aW1lIHNlbGVjdGlvblxyXG4gKi9cclxuZnVuY3Rpb24gcHJvbXB0UnVudGltZShjYWxsYmFjaykge1xyXG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcclxuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxyXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dFxyXG4gIH0pO1xyXG5cclxuICBsZXQgYW5zd2VyZWQgPSBmYWxzZTtcclxuXHJcbiAgcmwub24oJ2Nsb3NlJywgKCkgPT4ge1xyXG4gICAgaWYgKCFhbnN3ZXJlZCkge1xyXG4gICAgICBhbnN3ZXJlZCA9IHRydWU7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBcXG4gICR7eWVsbG93fUluc3RhbGxhdGlvbiBjYW5jZWxsZWQke3Jlc2V0fVxcbmApO1xyXG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnNvbGUubG9nKGAgICR7eWVsbG93fVdoaWNoIHJ1bnRpbWUocykgd291bGQgeW91IGxpa2UgdG8gaW5zdGFsbCBmb3I/JHtyZXNldH1cXG5cXG4gICR7Y3lhbn0xJHtyZXNldH0pIENsYXVkZSBDb2RlICR7ZGltfSh+Ly5jbGF1ZGUpJHtyZXNldH1cclxuICAke2N5YW59MiR7cmVzZXR9KSBPcGVuQ29kZSAgICAke2RpbX0ofi8uY29uZmlnL29wZW5jb2RlKSR7cmVzZXR9IC0gb3BlbiBzb3VyY2UsIGZyZWUgbW9kZWxzXHJcbiAgJHtjeWFufTMke3Jlc2V0fSkgR2VtaW5pICAgICAgJHtkaW19KH4vLmdlbWluaSkke3Jlc2V0fVxyXG4gICR7Y3lhbn00JHtyZXNldH0pIENvZGV4ICAgICAgICR7ZGltfSh+Ly5jb2RleCkke3Jlc2V0fVxyXG4gICR7Y3lhbn01JHtyZXNldH0pIENvcGlsb3QgICAgICR7ZGltfSh+Ly5jb3BpbG90KSR7cmVzZXR9XHJcbiAgJHtjeWFufTYke3Jlc2V0fSkgUXdlbiBDb2RlICAgJHtkaW19KH4vLnF3ZW4pJHtyZXNldH0gLSBBbGliYWJhIFF3ZW4gb2ZmaWNpYWwgQ0xJXHJcbiAgJHtjeWFufTcke3Jlc2V0fSkgS2ltaSBDb2RlICAgJHtkaW19KH4vLmtpbWkpJHtyZXNldH0gLSBNb29uc2hvdCBLaW1pIG9mZmljaWFsIENMSVxyXG4gICR7Y3lhbn04JHtyZXNldH0pIEFsbCAke2RpbX0oYWxsIDcgcnVudGltZXMgYWJvdmUpJHtyZXNldH1cclxuXHJcbiAgJHtkaW19Tm90ZTogT3BlbkFJIGFuZCBBbnRocm9waWMgYXJlIG1vZGVsIHByb3ZpZGVycyBjb25maWd1cmVkIHdpdGhpbiBlYWNoIHJ1bnRpbWUncyBzZXR0aW5ncyxcclxuICBub3Qgc2VwYXJhdGUgQ0xJIHJ1bnRpbWVzLiBTZWUgUkVBRE1FLm1kIGZvciBtb2RlbCBjb25maWd1cmF0aW9uLiR7cmVzZXR9XHJcbmApO1xyXG5cclxuICBybC5xdWVzdGlvbihgICBDaG9pY2UgJHtkaW19WzFdJHtyZXNldH06IGAsIChhbnN3ZXIpID0+IHtcclxuICAgIGFuc3dlcmVkID0gdHJ1ZTtcclxuICAgIHJsLmNsb3NlKCk7XHJcbiAgICBjb25zdCBjaG9pY2UgPSBhbnN3ZXIudHJpbSgpIHx8ICcxJztcclxuICAgIGlmIChjaG9pY2UgPT09ICc4Jykge1xyXG4gICAgICBjYWxsYmFjayhbJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCAnY29waWxvdCcsICdxd2VuJywgJ2tpbWknXSk7XHJcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzcnKSB7XHJcbiAgICAgIGNhbGxiYWNrKFsna2ltaSddKTtcclxuICAgIH0gZWxzZSBpZiAoY2hvaWNlID09PSAnNicpIHtcclxuICAgICAgY2FsbGJhY2soWydxd2VuJ10pO1xyXG4gICAgfSBlbHNlIGlmIChjaG9pY2UgPT09ICc1Jykge1xyXG4gICAgICBjYWxsYmFjayhbJ2NvcGlsb3QnXSk7XHJcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzQnKSB7XHJcbiAgICAgIGNhbGxiYWNrKFsnY29kZXgnXSk7XHJcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzMnKSB7XHJcbiAgICAgIGNhbGxiYWNrKFsnZ2VtaW5pJ10pO1xyXG4gICAgfSBlbHNlIGlmIChjaG9pY2UgPT09ICcyJykge1xyXG4gICAgICBjYWxsYmFjayhbJ29wZW5jb2RlJ10pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2FsbGJhY2soWydjbGF1ZGUnXSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcm9tcHQgZm9yIGluc3RhbGwgbG9jYXRpb25cclxuICovXHJcbmZ1bmN0aW9uIHByb21wdExvY2F0aW9uKHJ1bnRpbWVzKSB7XHJcbiAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XHJcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31Ob24taW50ZXJhY3RpdmUgdGVybWluYWwgZGV0ZWN0ZWQsIGRlZmF1bHRpbmcgdG8gZ2xvYmFsIGluc3RhbGwke3Jlc2V0fVxcbmApO1xyXG4gICAgaW5zdGFsbEFsbFJ1bnRpbWVzKHJ1bnRpbWVzLCB0cnVlLCBmYWxzZSk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XHJcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcclxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXRcclxuICB9KTtcclxuXHJcbiAgbGV0IGFuc3dlcmVkID0gZmFsc2U7XHJcblxyXG4gIHJsLm9uKCdjbG9zZScsICgpID0+IHtcclxuICAgIGlmICghYW5zd2VyZWQpIHtcclxuICAgICAgYW5zd2VyZWQgPSB0cnVlO1xyXG4gICAgICBjb25zb2xlLmxvZyhgXFxuICAke3llbGxvd31JbnN0YWxsYXRpb24gY2FuY2VsbGVkJHtyZXNldH1cXG5gKTtcclxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBjb25zdCBwYXRoRXhhbXBsZXMgPSBydW50aW1lcy5tYXAociA9PiB7XHJcbiAgICBjb25zdCBnbG9iYWxQYXRoID0gZ2V0R2xvYmFsRGlyKHIsIGV4cGxpY2l0Q29uZmlnRGlyKTtcclxuICAgIHJldHVybiBnbG9iYWxQYXRoLnJlcGxhY2Uob3MuaG9tZWRpcigpLCAnficpO1xyXG4gIH0pLmpvaW4oJywgJyk7XHJcblxyXG4gIGNvbnN0IGxvY2FsRXhhbXBsZXMgPSBydW50aW1lcy5tYXAociA9PiBgLi8ke2dldERpck5hbWUocil9YCkuam9pbignLCAnKTtcclxuXHJcbiAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9V2hlcmUgd291bGQgeW91IGxpa2UgdG8gaW5zdGFsbD8ke3Jlc2V0fVxcblxcbiAgJHtjeWFufTEke3Jlc2V0fSkgR2xvYmFsICR7ZGltfSgke3BhdGhFeGFtcGxlc30pJHtyZXNldH0gLSBhdmFpbGFibGUgaW4gYWxsIHByb2plY3RzXHJcbiAgJHtjeWFufTIke3Jlc2V0fSkgTG9jYWwgICR7ZGltfSgke2xvY2FsRXhhbXBsZXN9KSR7cmVzZXR9IC0gdGhpcyBwcm9qZWN0IG9ubHlcclxuYCk7XHJcblxyXG4gIHJsLnF1ZXN0aW9uKGAgIENob2ljZSAke2RpbX1bMV0ke3Jlc2V0fTogYCwgKGFuc3dlcikgPT4ge1xyXG4gICAgYW5zd2VyZWQgPSB0cnVlO1xyXG4gICAgcmwuY2xvc2UoKTtcclxuICAgIGNvbnN0IGNob2ljZSA9IGFuc3dlci50cmltKCkgfHwgJzEnO1xyXG4gICAgY29uc3QgaXNHbG9iYWwgPSBjaG9pY2UgIT09ICcyJztcclxuICAgIGluc3RhbGxBbGxSdW50aW1lcyhydW50aW1lcywgaXNHbG9iYWwsIHRydWUpO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogSW5zdGFsbCBFWl9BZ2VudHMgZm9yIGFsbCBzZWxlY3RlZCBydW50aW1lc1xyXG4gKi9cclxuZnVuY3Rpb24gaW5zdGFsbEFsbFJ1bnRpbWVzKHJ1bnRpbWVzOiBzdHJpbmdbXSwgaXNHbG9iYWw6IGJvb2xlYW4sIGlzSW50ZXJhY3RpdmU6IGJvb2xlYW4pIHtcclxuICBjb25zdCByZXN1bHRzOiBBcnJheTx7IHNldHRpbmdzUGF0aDogc3RyaW5nIHwgbnVsbDsgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDsgc3RhdHVzbGluZUNvbW1hbmQ6IHN0cmluZyB8IG51bGw7IHJ1bnRpbWU6IHN0cmluZyB9PiA9IFtdO1xyXG5cclxuICBmb3IgKGNvbnN0IHJ1bnRpbWUgb2YgcnVudGltZXMpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGluc3RhbGwoaXNHbG9iYWwsIHJ1bnRpbWUpO1xyXG4gICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBzdGF0dXNsaW5lUnVudGltZXMgPSBbJ2NsYXVkZScsICdnZW1pbmknXTtcclxuICBjb25zdCBzdGF0dXNsaW5lUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKHIgPT4gc3RhdHVzbGluZVJ1bnRpbWVzLmluY2x1ZGVzKHIucnVudGltZSkpO1xyXG5cclxuICAvLyBIYW5kbGUgc3RhdHVzbGluZSBwZXItcnVudGltZSB0byBhdm9pZCBjb25mbGljdHNcclxuICAvLyBFYWNoIHJ1bnRpbWUgd2l0aCBzZXR0aW5ncy5qc29uIGdldHMgaXRzIG93biBzdGF0dXNsaW5lIHByb21wdFxyXG4gIGNvbnN0IGZpbmFsaXplUGVyUnVudGltZSA9IChydW50aW1lUmVzdWx0OiB7IHNldHRpbmdzUGF0aDogc3RyaW5nIHwgbnVsbDsgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDsgc3RhdHVzbGluZUNvbW1hbmQ6IHN0cmluZyB8IG51bGw7IHJ1bnRpbWU6IHN0cmluZyB9LCBzaG91bGRJbnN0YWxsU3RhdHVzbGluZTogYm9vbGVhbikgPT4ge1xyXG4gICAgY29uc3QgdXNlU3RhdHVzbGluZSA9IHN0YXR1c2xpbmVSdW50aW1lcy5pbmNsdWRlcyhydW50aW1lUmVzdWx0LnJ1bnRpbWUpICYmIHNob3VsZEluc3RhbGxTdGF0dXNsaW5lO1xyXG4gICAgZmluaXNoSW5zdGFsbChcclxuICAgICAgcnVudGltZVJlc3VsdC5zZXR0aW5nc1BhdGgsXHJcbiAgICAgIHJ1bnRpbWVSZXN1bHQuc2V0dGluZ3MsXHJcbiAgICAgIHJ1bnRpbWVSZXN1bHQuc3RhdHVzbGluZUNvbW1hbmQsXHJcbiAgICAgIHVzZVN0YXR1c2xpbmUsXHJcbiAgICAgIHJ1bnRpbWVSZXN1bHQucnVudGltZSxcclxuICAgICAgaXNHbG9iYWxcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgaWYgKHN0YXR1c2xpbmVSZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgLy8gTm8gcnVudGltZXMgc3VwcG9ydCBzdGF0dXNsaW5lIC0gZmluYWxpemUgYWxsIHdpdGhvdXQgc3RhdHVzbGluZVxyXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xyXG4gICAgICBmaW5hbGl6ZVBlclJ1bnRpbWUocmVzdWx0LCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChzdGF0dXNsaW5lUmVzdWx0cy5sZW5ndGggPT09IDEpIHtcclxuICAgIC8vIFNpbmdsZSBydW50aW1lIHdpdGggc3RhdHVzbGluZSBzdXBwb3J0IC0gcHJvbXB0IG9uY2VcclxuICAgIGNvbnN0IHNpbmdsZVJlc3VsdCA9IHN0YXR1c2xpbmVSZXN1bHRzWzBdO1xyXG4gICAgaWYgKHNpbmdsZVJlc3VsdCkge1xyXG4gICAgICBoYW5kbGVTdGF0dXNsaW5lKHNpbmdsZVJlc3VsdC5zZXR0aW5ncywgaXNJbnRlcmFjdGl2ZSwgKHNob3VsZEluc3RhbGwpID0+IHtcclxuICAgICAgICBmaW5hbGl6ZVBlclJ1bnRpbWUoc2luZ2xlUmVzdWx0LCBzaG91bGRJbnN0YWxsKTtcclxuICAgICAgICAvLyBGaW5hbGl6ZSBvdGhlciBydW50aW1lcyB3aXRob3V0IHN0YXR1c2xpbmVcclxuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XHJcbiAgICAgICAgICBpZiAoIXN0YXR1c2xpbmVSdW50aW1lcy5pbmNsdWRlcyhyZXN1bHQucnVudGltZSkpIHtcclxuICAgICAgICAgICAgZmluYWxpemVQZXJSdW50aW1lKHJlc3VsdCwgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIE11bHRpcGxlIHJ1bnRpbWVzIHdpdGggc3RhdHVzbGluZSBzdXBwb3J0IC0gcHJvbXB0IGZvciBlYWNoXHJcbiAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcclxuICAgIGNvbnN0IHN0YXR1c2xpbmVDaG9pY2VzID0gbmV3IEFycmF5KHN0YXR1c2xpbmVSZXN1bHRzLmxlbmd0aCkuZmlsbChmYWxzZSk7XHJcblxyXG4gICAgY29uc3QgcHJvbXB0TmV4dFN0YXR1c2xpbmUgPSAoKSA9PiB7XHJcbiAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gc3RhdHVzbGluZVJlc3VsdHMubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gQWxsIHN0YXR1c2xpbmUgcHJvbXB0cyBkb25lIC0gZmluYWxpemUgYWxsIHJ1bnRpbWVzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzW2ldO1xyXG4gICAgICAgICAgaWYgKCFyZXN1bHQpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgY29uc3Qgc3RhdHVzbGluZUluZGV4ID0gc3RhdHVzbGluZVJlc3VsdHMuZmluZEluZGV4KHIgPT4gci5ydW50aW1lID09PSByZXN1bHQucnVudGltZSk7XHJcbiAgICAgICAgICBjb25zdCBzaG91bGRJbnN0YWxsID0gc3RhdHVzbGluZUluZGV4ICE9PSAtMSA/IHN0YXR1c2xpbmVDaG9pY2VzW3N0YXR1c2xpbmVJbmRleF0gOiBmYWxzZTtcclxuICAgICAgICAgIGZpbmFsaXplUGVyUnVudGltZShyZXN1bHQsIHNob3VsZEluc3RhbGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGN1cnJlbnRSZXN1bHQgPSBzdGF0dXNsaW5lUmVzdWx0c1tjdXJyZW50SW5kZXhdO1xyXG4gICAgICBpZiAoY3VycmVudFJlc3VsdCkge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSdW50aW1lSW5kZXggPSBjdXJyZW50SW5kZXg7XHJcbiAgICAgICAgaGFuZGxlU3RhdHVzbGluZShjdXJyZW50UmVzdWx0LnNldHRpbmdzLCBpc0ludGVyYWN0aXZlLCAoc2hvdWxkSW5zdGFsbCkgPT4ge1xyXG4gICAgICAgICAgc3RhdHVzbGluZUNob2ljZXNbY3VycmVudFJ1bnRpbWVJbmRleF0gPSBzaG91bGRJbnN0YWxsO1xyXG4gICAgICAgICAgY3VycmVudEluZGV4Kys7XHJcbiAgICAgICAgICBwcm9tcHROZXh0U3RhdHVzbGluZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHByb21wdE5leHRTdGF0dXNsaW5lKCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBUZXN0LW9ubHkgZXhwb3J0cyBcdTIwMTQgc2tpcCBtYWluIGxvZ2ljIHdoZW4gbG9hZGVkIGFzIGEgbW9kdWxlIGZvciB0ZXN0aW5nXHJcbmNvbnN0IHRlc3RFeHBvcnRzID0ge1xyXG4gICAgZ2V0Q29kZXhTa2lsbEFkYXB0ZXJIZWFkZXIsXHJcbiAgICBjb252ZXJ0Q2xhdWRlVG9HZW1pbmlBZ2VudCxcclxuICAgIGNvbnZlcnRDbGF1ZGVBZ2VudFRvQ29kZXhBZ2VudCxcclxuICAgIGdlbmVyYXRlQ29kZXhBZ2VudFRvbWwsXHJcbiAgICBnZW5lcmF0ZUNvZGV4Q29uZmlnQmxvY2ssXHJcbiAgICBzdHJpcEV6QWdlbnRzRnJvbUNvZGV4Q29uZmlnLFxyXG4gICAgbWVyZ2VDb2RleENvbmZpZyxcclxuICAgIGluc3RhbGxDb2RleENvbmZpZyxcclxuICAgIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db2RleFNraWxsLFxyXG4gICAgRVpfQ09ERVhfTUFSS0VSLFxyXG4gICAgQ09ERVhfQUdFTlRfU0FOREJPWCxcclxuICAgIGdldERpck5hbWUsXHJcbiAgICBnZXRHbG9iYWxEaXIsXHJcbiAgICBnZXRDb25maWdEaXJGcm9tSG9tZSxcclxuICAgIGNsYXVkZVRvQ29waWxvdFRvb2xzLFxyXG4gICAgY29udmVydENvcGlsb3RUb29sTmFtZSxcclxuICAgIGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50LFxyXG4gICAgY29udmVydENsYXVkZUNvbW1hbmRUb0NvcGlsb3RTa2lsbCxcclxuICAgIGNvbnZlcnRDbGF1ZGVBZ2VudFRvQ29waWxvdEFnZW50LFxyXG4gICAgY29weUNvbW1hbmRzQXNDb3BpbG90U2tpbGxzLFxyXG4gICAgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfTUFSS0VSLFxyXG4gICAgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfQ0xPU0VfTUFSS0VSLFxyXG4gICAgbWVyZ2VDb3BpbG90SW5zdHJ1Y3Rpb25zLFxyXG4gICAgc3RyaXBFekFnZW50c0Zyb21Db3BpbG90SW5zdHJ1Y3Rpb25zLFxyXG4gICAgd3JpdGVNYW5pZmVzdCxcclxuICAgIHJlcG9ydExvY2FsUGF0Y2hlcyxcclxuICAgIGNvbnZlcnRDbGF1ZGVUb1F3ZW5Ta2lsbCxcclxuICAgIGNvbnZlcnRDbGF1ZGVUb1F3ZW5BZ2VudCxcclxuICAgIGNvbnZlcnRDbGF1ZGVUb0tpbWlTa2lsbCxcclxuICAgIGNvbnZlcnRDbGF1ZGVUb0tpbWlBZ2VudCxcclxuICB9O1xyXG5cclxuLy8gTWFpbiBsb2dpY1xyXG5pZiAoaGFzR2xvYmFsICYmIGhhc0xvY2FsKSB7XHJcbiAgY29uc29sZS5lcnJvcihgICAke3llbGxvd31DYW5ub3Qgc3BlY2lmeSBib3RoIC0tZ2xvYmFsIGFuZCAtLWxvY2FsJHtyZXNldH1gKTtcclxuICBwcm9jZXNzLmV4aXQoMSk7XHJcbn0gZWxzZSBpZiAoZXhwbGljaXRDb25maWdEaXIgJiYgaGFzTG9jYWwpIHtcclxuICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fUNhbm5vdCB1c2UgLS1jb25maWctZGlyIHdpdGggLS1sb2NhbCR7cmVzZXR9YCk7XHJcbiAgcHJvY2Vzcy5leGl0KDEpO1xyXG59IGVsc2UgaWYgKGhhc1VuaW5zdGFsbCkge1xyXG4gIGlmICghaGFzR2xvYmFsICYmICFoYXNMb2NhbCkge1xyXG4gICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd30tLXVuaW5zdGFsbCByZXF1aXJlcyAtLWdsb2JhbCBvciAtLWxvY2FsJHtyZXNldH1gKTtcclxuICAgIHByb2Nlc3MuZXhpdCgxKTtcclxuICB9XHJcbiAgY29uc3QgcnVudGltZXMgPSBzZWxlY3RlZFJ1bnRpbWVzLmxlbmd0aCA+IDAgPyBzZWxlY3RlZFJ1bnRpbWVzIDogWydjbGF1ZGUnXTtcclxuICBmb3IgKGNvbnN0IHJ1bnRpbWUgb2YgcnVudGltZXMpIHtcclxuICAgIHVuaW5zdGFsbChoYXNHbG9iYWwsIHJ1bnRpbWUpO1xyXG4gIH1cclxufSBlbHNlIGlmIChzZWxlY3RlZFJ1bnRpbWVzLmxlbmd0aCA+IDApIHtcclxuICBpZiAoIWhhc0dsb2JhbCAmJiAhaGFzTG9jYWwpIHtcclxuICAgIHByb21wdExvY2F0aW9uKHNlbGVjdGVkUnVudGltZXMpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBpbnN0YWxsQWxsUnVudGltZXMoc2VsZWN0ZWRSdW50aW1lcywgaGFzR2xvYmFsLCBmYWxzZSk7XHJcbiAgfVxyXG59IGVsc2UgaWYgKGhhc0dsb2JhbCB8fCBoYXNMb2NhbCkge1xyXG4gIC8vIERlZmF1bHQgdG8gQ2xhdWRlIGlmIG5vIHJ1bnRpbWUgc3BlY2lmaWVkIGJ1dCBsb2NhdGlvbiBpc1xyXG4gIGluc3RhbGxBbGxSdW50aW1lcyhbJ2NsYXVkZSddLCBoYXNHbG9iYWwsIGZhbHNlKTtcclxufSBlbHNlIHtcclxuICAvLyBJbnRlcmFjdGl2ZVxyXG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xyXG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9Tm9uLWludGVyYWN0aXZlIHRlcm1pbmFsIGRldGVjdGVkLCBkZWZhdWx0aW5nIHRvIENsYXVkZSBDb2RlIGdsb2JhbCBpbnN0YWxsJHtyZXNldH1cXG5gKTtcclxuICAgIGluc3RhbGxBbGxSdW50aW1lcyhbJ2NsYXVkZSddLCB0cnVlLCBmYWxzZSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHByb21wdFJ1bnRpbWUoKHJ1bnRpbWVzKSA9PiB7XHJcbiAgICAgIHByb21wdExvY2F0aW9uKHJ1bnRpbWVzKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuLy8gRXhwb3J0IGZvciB0ZXN0aW5nXHJcbmV4cG9ydCB7IHRlc3RFeHBvcnRzIH07XHJcbiIsICJ7XG4gIFwibmFtZVwiOiBcIkBob3dsaWwvZXotYWdlbnRzXCIsXG4gIFwidmVyc2lvblwiOiBcIjUuMC4wXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJFWiBBZ2VudHMgXHUyMDE0IE1ldGEtcHJvbXB0aW5nIHdpdGggbXVsdGktbW9kZWwgc3VwcG9ydCAoUXdlbiwgS2ltaSwgT3BlbkFJKVwiLFxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcbiAgXCJzaWRlRWZmZWN0c1wiOiBmYWxzZSxcbiAgXCJiaW5cIjoge1xuICAgIFwiZXotYWdlbnRzXCI6IFwiZGlzdC9iaW4vaW5zdGFsbC5qc1wiLFxuICAgIFwiZXotYWdlbnRzLXVwZGF0ZVwiOiBcImRpc3QvYmluL3VwZGF0ZS5qc1wiXG4gIH0sXG4gIFwiZXhwb3J0c1wiOiB7XG4gICAgXCIuXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2ZhY3Rvcmllc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9mYWN0b3JpZXMvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbGliL2ZhY3Rvcmllcy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vc3RyYXRlZ2llc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9zdHJhdGVnaWVzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9zdHJhdGVnaWVzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9hZGFwdGVyc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9hZGFwdGVycy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvYWRhcHRlcnMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL29ic2VydmVyXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL29ic2VydmVyL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9vYnNlcnZlci9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vZGVjb3JhdG9yc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9kZWNvcmF0b3JzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9kZWNvcmF0b3JzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9mYWNhZGVzXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL2ZhY2FkZXMvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbGliL2ZhY2FkZXMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2NvbW1hbmRzXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL2NvbW1hbmRzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9jb21tYW5kcy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vc2VydmljZXNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvc2VydmljZXMvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbGliL3NlcnZpY2VzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9yZXBvc2l0b3JpZXNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvcmVwb3NpdG9yaWVzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9yZXBvc2l0b3JpZXMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2ZwXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL2ZwL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9mcC9pbmRleC5qc1wiXG4gICAgfVxuICB9LFxuICBcIm1haW5cIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9pbmRleC5kLnRzXCIsXG4gIFwiZmlsZXNcIjogW1xuICAgIFwiZGlzdFwiLFxuICAgIFwiY29tbWFuZHNcIixcbiAgICBcImV6LWFnZW50c1wiLFxuICAgIFwiYWdlbnRzXCIsXG4gICAgXCJob29rcy9kaXN0XCIsXG4gICAgXCJzY3JpcHRzXCJcbiAgXSxcbiAgXCJrZXl3b3Jkc1wiOiBbXG4gICAgXCJjbGF1ZGVcIixcbiAgICBcImNsYXVkZS1jb2RlXCIsXG4gICAgXCJhaVwiLFxuICAgIFwibWV0YS1wcm9tcHRpbmdcIixcbiAgICBcImNvbnRleHQtZW5naW5lZXJpbmdcIixcbiAgICBcInNwZWMtZHJpdmVuLWRldmVsb3BtZW50XCIsXG4gICAgXCJnZW1pbmlcIixcbiAgICBcImdlbWluaS1jbGlcIixcbiAgICBcImNvZGV4XCIsXG4gICAgXCJjb2RleC1jbGlcIixcbiAgICBcImV6LWFnZW50c1wiLFxuICAgIFwiYWdlbnQtb3JjaGVzdHJhdGlvblwiXG4gIF0sXG4gIFwiYXV0aG9yXCI6IFwiVFx1MDBDMkNIRVNcIixcbiAgXCJsaWNlbnNlXCI6IFwiTUlUXCIsXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXQraHR0cHM6Ly9naXRodWIuY29tL2hvd2xpbC9lei1hZ2VudHMuZ2l0XCJcbiAgfSxcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ob3dsaWwvZXotYWdlbnRzXCIsXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vaG93bGlsL2V6LWFnZW50cy9pc3N1ZXNcIlxuICB9LFxuICBcImVuZ2luZXNcIjoge1xuICAgIFwibm9kZVwiOiBcIj49MTYuNy4wXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHR5cGVzL21pY3JvbWF0Y2hcIjogXCI0LjAuMFwiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCIyMC4wLjBcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luXCI6IFwiOC41Ny4yXCIsXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyXCI6IFwiOC41Ny4yXCIsXG4gICAgXCJjOFwiOiBcIjExLjAuMFwiLFxuICAgIFwiY29tcGxleGl0eS1yZXBvcnRcIjogXCIyLjAuMC1hbHBoYVwiLFxuICAgIFwiZGVwZW5kZW5jeS1jcnVpc2VyXCI6IFwiMTcuMy45XCIsXG4gICAgXCJlc2xpbnRcIjogXCI4LjU3LjBcIixcbiAgICBcImVzbGludC1wbHVnaW4tY29tcGxleGl0eVwiOiBcIjEuMC4yXCIsXG4gICAgXCJlc2xpbnQtcGx1Z2luLXNvbmFyanNcIjogXCI0LjAuMlwiLFxuICAgIFwiZXNsaW50LXBsdWdpbi10c2RvY1wiOiBcIjAuNS4yXCIsXG4gICAgXCJleHBlY3QtdHlwZVwiOiBcIjEuMy4wXCIsXG4gICAgXCJmYXN0LWNoZWNrXCI6IFwiMy4wLjBcIixcbiAgICBcImdsb2JcIjogXCIxMy4wLjZcIixcbiAgICBcImh1c2t5XCI6IFwiOS4xLjdcIixcbiAgICBcImpzLXlhbWxcIjogXCI0LjEuMVwiLFxuICAgIFwianNjcGRcIjogXCI0LjAuOFwiLFxuICAgIFwianNkb2NcIjogXCI0LjAuMlwiLFxuICAgIFwiazZcIjogXCIwLjAuMFwiLFxuICAgIFwibGludC1zdGFnZWRcIjogXCIxNS41LjJcIixcbiAgICBcIm1hZGdlXCI6IFwiOC4wLjBcIixcbiAgICBcIm1hcmtkb3dubGludFwiOiBcIjAuNDAuMFwiLFxuICAgIFwidHMtbW9ycGhcIjogXCIyNy4wLjJcIixcbiAgICBcInRzLW5vZGVcIjogXCIxMC45LjBcIixcbiAgICBcInRzLXBydW5lXCI6IFwiMC4xMC4zXCIsXG4gICAgXCJ0c3VwXCI6IFwiOC4wLjBcIixcbiAgICBcInR5cGVkb2NcIjogXCIwLjI4LjE4XCIsXG4gICAgXCJ0eXBlZG9jLXBsdWdpbi1taXNzaW5nLWV4cG9ydHNcIjogXCI0LjEuMlwiLFxuICAgIFwidHlwZXNjcmlwdFwiOiBcIjUuNC41XCIsXG4gICAgXCJ2aXRlc3RcIjogXCI0LjEuMFwiXG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJidWlsZFwiOiBcInRzdXBcIixcbiAgICBcImJ1aWxkOndhdGNoXCI6IFwidHN1cCAtLXdhdGNoXCIsXG4gICAgXCJ0eXBlY2hlY2tcIjogXCJ0c2MgLS1ub0VtaXRcIixcbiAgICBcInR5cGVjaGVjazpzdHJpY3RcIjogXCJ0c2MgLS1ub0VtaXQgLS1zdHJpY3RcIixcbiAgICBcImRldlwiOiBcInRzeCBiaW4vaW5zdGFsbC50c1wiLFxuICAgIFwibGludFwiOiBcImVzbGludCAuIC0tZXh0IC50cyAtLW1heC13YXJuaW5ncz0wXCIsXG4gICAgXCJsaW50OmZpeFwiOiBcImVzbGludCAuIC0tZXh0IC50cyAtLWZpeFwiLFxuICAgIFwiYnVpbGQ6aG9va3NcIjogXCJub2RlIGRpc3Qvc2NyaXB0cy9idWlsZC1ob29rcy5qc1wiLFxuICAgIFwicHJlcHVibGlzaE9ubHlcIjogXCJucG0gcnVuIGJ1aWxkICYmIG5wbSBydW4gYnVpbGQ6aG9va3NcIixcbiAgICBcInRlc3RcIjogXCJ0c3ggc2NyaXB0cy9ydW4tdGVzdHMudHNcIixcbiAgICBcInRlc3Q6Y292ZXJhZ2VcIjogXCJjOCAtLWNoZWNrLWNvdmVyYWdlIC0tbGluZXMgNzAgLS1yZXBvcnRlciB0ZXh0IC0taW5jbHVkZSAnYmluL2xpYi8qKi8qLnRzJyAtLWV4Y2x1ZGUgJ3Rlc3RzLyoqJyAtLWFsbCB0c3ggc2NyaXB0cy9ydW4tdGVzdHMudHNcIixcbiAgICBcInRlc3Q6YTExeVwiOiBcIm5vZGUgdGVzdHMvYWNjZXNzaWJpbGl0eS9ydW4tYTExeS10ZXN0cy5janNcIixcbiAgICBcInRlc3Q6cXdlbjpjb2RlXCI6IFwic2ggdGVzdHMvc3RhZ2luZy9xd2VuLWNvZGUtYmF0dGxlLWZ1bGwuc2hcIixcbiAgICBcInRlc3Q6cXdlbjpjb2RlOnNpbXBsZVwiOiBcInNoIHRlc3RzL3N0YWdpbmcvcXdlbi1jb2RlLXNpbXBsZS10ZXN0LnNoXCIsXG4gICAgXCJ0ZXN0OnF3ZW46Y29kZTplZGdlXCI6IFwic2ggdGVzdHMvc3RhZ2luZy9xd2VuLWNvZGUtZWRnZS1jYXNlcy5zaFwiLFxuICAgIFwidGVzdDpkb2NrZXI6cXdlbjpjb2RlXCI6IFwiZG9ja2VyLWNvbXBvc2UgLWYgZG9ja2VyLWNvbXBvc2Uuc3RhZ2luZy55bWwgdXAgLS1idWlsZCBlei1hZ2VudHMtcXdlbi1jb2RlLWJhdHRsZVwiLFxuICAgIFwidGVzdDpkb2NrZXI6cXdlbjplZGdlXCI6IFwiZG9ja2VyLWNvbXBvc2UgLWYgZG9ja2VyLWNvbXBvc2Uuc3RhZ2luZy55bWwgdXAgLS1idWlsZCBlei1hZ2VudHMtcXdlbi1jb2RlLWVkZ2UtY2FzZXNcIixcbiAgICBcInRlc3Q6ZG9ja2VyOmFsbFwiOiBcImRvY2tlci1jb21wb3NlIC1mIGRvY2tlci1jb21wb3NlLnN0YWdpbmcueW1sIHVwIC0tYnVpbGQgLS1hYm9ydC1vbi1jb250YWluZXItZXhpdFwiLFxuICAgIFwiaW5zdGFsbDpwcm9kdWN0aW9uXCI6IFwibm9kZSAtLWxvYWRlciB0cy1ub2RlL2VzbSBzY3JpcHRzL2luc3RhbGwtcHJvZHVjdGlvbi50c1wiLFxuICAgIFwiaW5zdGFsbDpwcm9kdWN0aW9uOmxhdGVzdFwiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy9pbnN0YWxsLXByb2R1Y3Rpb24udHMgbGF0ZXN0XCIsXG4gICAgXCJpbnN0YWxsOnByb2R1Y3Rpb246djRcIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvaW5zdGFsbC1wcm9kdWN0aW9uLnRzIDQuMC4wXCIsXG4gICAgXCJ2YWxpZGF0ZTp0b2tlblwiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy92YWxpZGF0ZS10b2tlbi50c1wiLFxuICAgIFwic2VjdXJpdHk6c2NhblwiOiBcIm5wbSBhdWRpdCAtLWF1ZGl0LWxldmVsPW1vZGVyYXRlXCIsXG4gICAgXCJkb2NzOmdlbmVyYXRlXCI6IFwianNkb2MgLWMganNkb2MuanNvbiAtciBiaW4vIGV6LWFnZW50cy9iaW4vbGliL1wiLFxuICAgIFwiZG9jczphcGlcIjogXCJ0eXBlZG9jXCIsXG4gICAgXCJhbmFseXplOmR1cGxpY2F0ZXNcIjogXCJqc2NwZCAtLWNvbmZpZyAuanNjcGQuanNvblwiLFxuICAgIFwiY2hlY2s6ZHVwbGljYXRlc1wiOiBcImpzY3BkIC0tY29uZmlnIC5qc2NwZC5qc29uXCIsXG4gICAgXCJjaGVjazpjb21wbGV4aXR5XCI6IFwibm9kZSAtLWxvYWRlciB0cy1ub2RlL2VzbSBzY3JpcHRzL2NoZWNrLWNvbXBsZXhpdHkudHNcIixcbiAgICBcImNoZWNrOnRzZG9jXCI6IFwibm9kZSAtLWxvYWRlciB0cy1ub2RlL2VzbSBzY3JpcHRzL2NoZWNrLXRzZG9jLWNvdmVyYWdlLnRzXCIsXG4gICAgXCJ0ZXN0OnBhY2thZ2VcIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvdGVzdC1wYWNrYWdlLWRvY2tlci50c1wiLFxuICAgIFwiY2hlY2s6Y291cGxpbmdcIjogXCJtYWRnZSAtLWNpcmN1bGFyIGJpbi9saWIvXCIsXG4gICAgXCJjaGVjazphYnN0cmFjdGlvbnNcIjogXCJ0cy1wcnVuZVwiLFxuICAgIFwiY2hlY2s6YWxsLW1ldHJpY3NcIjogXCJucG0gcnVuIGxpbnQgJiYgbnBtIHJ1biBjaGVjazpkdXBsaWNhdGVzICYmIG5wbSBydW4gY2hlY2s6Y291cGxpbmdcIixcbiAgICBcInByZXBhcmVcIjogXCJodXNreVwiLFxuICAgIFwiZ2F0ZXM6bG9jYWxcIjogXCJub2RlIGV6LWFnZW50cy9iaW4vbGliL2dhdGUtZXhlY3V0b3IuY2pzIC0tY2kgLS1jYWNoZVwiLFxuICAgIFwiZ2F0ZXM6c3RhdHVzXCI6IFwibm9kZSBlei1hZ2VudHMvYmluL2xpYi9nYXRlLWV4ZWN1dG9yLmNqcyAtLXN0YXR1c1wiLFxuICAgIFwiZ2F0ZXM6c3RhdHNcIjogXCJub2RlIGV6LWFnZW50cy9iaW4vbGliL2dhdGUtZXhlY3V0b3IuY2pzIC0tc3RhdHNcIixcbiAgICBcImRlcHM6YXVkaXRcIjogXCJ0c3ggYmluL2RlcGVuZGVuY3ktYXVkaXQudHNcIixcbiAgICBcImRlcHM6YXVkaXQ6anNvblwiOiBcInRzeCBiaW4vZGVwZW5kZW5jeS1hdWRpdC50cyAtLWpzb25cIixcbiAgICBcImRlcHM6Y2hlY2tcIjogXCJ0c3ggYmluL2RlcGVuZGVuY3ktYXVkaXQudHMgLS1xdWlldFwiXG4gIH0sXG4gIFwibGludC1zdGFnZWRcIjoge1xuICAgIFwiKi50c1wiOiBbXG4gICAgICBcIm5vZGUgLS10ZXN0XCJcbiAgICBdLFxuICAgIFwiKi5tZFwiOiBbXG4gICAgICBcInRzeCBzY3JpcHRzL3J1bi10ZXN0cy50c1wiXG4gICAgXVxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJtaWNyb21hdGNoXCI6IFwiNC4wLjVcIixcbiAgICBcInRpa3Rva2VuXCI6IFwiMS4wLjIyXCIsXG4gICAgXCJ6b2RcIjogXCI0LjMuNlwiXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7OztBQUVBLFlBQVksUUFBUTtBQUNwQixZQUFZLFVBQVU7QUFDdEIsWUFBWSxRQUFRO0FBQ3BCLFlBQVksY0FBYztBQUMxQixZQUFZLFlBQVk7QUFDeEIsU0FBUyxxQkFBcUI7OztBQ1A5QjtBQUFBLEVBQ0UsTUFBUTtBQUFBLEVBQ1IsU0FBVztBQUFBLEVBQ1gsYUFBZTtBQUFBLEVBQ2YsTUFBUTtBQUFBLEVBQ1IsYUFBZTtBQUFBLEVBQ2YsS0FBTztBQUFBLElBQ0wsYUFBYTtBQUFBLElBQ2Isb0JBQW9CO0FBQUEsRUFDdEI7QUFBQSxFQUNBLFNBQVc7QUFBQSxJQUNULEtBQUs7QUFBQSxNQUNILE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxJQUNaO0FBQUEsSUFDQSxlQUFlO0FBQUEsTUFDYixPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsSUFDWjtBQUFBLElBQ0EsZ0JBQWdCO0FBQUEsTUFDZCxPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsSUFDWjtBQUFBLElBQ0EsY0FB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
2706
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vYmluL2luc3RhbGwudHMiLCAiLi4vLi4vcGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tICdyZWFkbGluZSc7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuXG4vLyBDb2xvcnNcbmNvbnN0IGN5YW4gPSAnXFx4MWJbMzZtJztcbmNvbnN0IGdyZWVuID0gJ1xceDFiWzMybSc7XG5jb25zdCB5ZWxsb3cgPSAnXFx4MWJbMzNtJztcbmNvbnN0IGRpbSA9ICdcXHgxYlsybSc7XG5jb25zdCByZXNldCA9ICdcXHgxYlswbSc7XG5cbi8vIENvZGV4IGNvbmZpZy50b21sIGNvbnN0YW50c1xuY29uc3QgRVpfQ09ERVhfTUFSS0VSID0gJyMgRVpfQWdlbnRzIEFnZW50IENvbmZpZ3VyYXRpb24gXFx1MjAxNCBtYW5hZ2VkIGJ5IGV6LWFnZW50cyBpbnN0YWxsZXInO1xuXG4vLyBDb3BpbG90IGluc3RydWN0aW9ucyBtYXJrZXIgY29uc3RhbnRzXG5jb25zdCBFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIgPSAnPCEtLSBFWl9BR0VOVFMgQ29uZmlndXJhdGlvbiBcXHUyMDE0IG1hbmFnZWQgYnkgZXotYWdlbnRzIGluc3RhbGxlciAtLT4nO1xuY29uc3QgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfQ0xPU0VfTUFSS0VSID0gJzwhLS0gL0VaX0FHRU5UUyBDb25maWd1cmF0aW9uIC0tPic7XG4vLyBMZWdhY3kgbWFya2VycyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgaW5zdGFsbHMuXG5jb25zdCBMRUdBQ1lfRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfTUFSS0VSID0gJzwhLS0gRVpfQWdlbnRzIENvbmZpZ3VyYXRpb24gXFx1MjAxNCBtYW5hZ2VkIGJ5IGV6LWFnZW50cyBpbnN0YWxsZXIgLS0+JztcbmNvbnN0IExFR0FDWV9FWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19DTE9TRV9NQVJLRVIgPSAnPCEtLSAvRVpfQWdlbnRzIENvbmZpZ3VyYXRpb24gLS0+JztcblxuY29uc3QgQ09ERVhfQUdFTlRfU0FOREJPWCA9IHtcbiAgJ2V6LWV4ZWN1dG9yJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1wbGFubmVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1waGFzZS1yZXNlYXJjaGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1wcm9qZWN0LXJlc2VhcmNoZXInOiAnd29ya3NwYWNlLXdyaXRlJyxcbiAgJ2V6LXJlc2VhcmNoLXN5bnRoZXNpemVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei12ZXJpZmllcic6ICd3b3Jrc3BhY2Utd3JpdGUnLFxuICAnZXotY29kZWJhc2UtbWFwcGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1yb2FkbWFwcGVyJzogJ3dvcmtzcGFjZS13cml0ZScsXG4gICdlei1kZWJ1Z2dlcic6ICd3b3Jrc3BhY2Utd3JpdGUnLFxuICAnZXotcGxhbi1jaGVja2VyJzogJ3JlYWQtb25seScsXG4gICdlei1pbnRlZ3JhdGlvbi1jaGVja2VyJzogJ3JlYWQtb25seScsXG59O1xuXG4vLyBDb3BpbG90IHRvb2wgbmFtZSBtYXBwaW5nIFx1MjAxNCBDbGF1ZGUgQ29kZSB0b29scyB0byBHaXRIdWIgQ29waWxvdCB0b29sc1xuLy8gVG9vbCBtYXBwaW5nIGFwcGxpZXMgT05MWSB0byBhZ2VudHMsIE5PVCB0byBza2lsbHMgKHBlciBDT05URVhULm1kIGRlY2lzaW9uKVxuY29uc3QgY2xhdWRlVG9Db3BpbG90VG9vbHMgPSB7XG4gIFJlYWQ6ICdyZWFkJyxcbiAgV3JpdGU6ICdlZGl0JyxcbiAgRWRpdDogJ2VkaXQnLFxuICBCYXNoOiAnZXhlY3V0ZScsXG4gIEdyZXA6ICdzZWFyY2gnLFxuICBHbG9iOiAnc2VhcmNoJyxcbiAgVGFzazogJ2FnZW50JyxcbiAgV2ViU2VhcmNoOiAnd2ViJyxcbiAgV2ViRmV0Y2g6ICd3ZWInLFxuICBUb2RvV3JpdGU6ICd0b2RvJyxcbiAgQXNrVXNlclF1ZXN0aW9uOiAnYXNrX3VzZXInLFxuICBTbGFzaENvbW1hbmQ6ICdza2lsbCcsXG59O1xuXG4vLyBHZXQgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfTtcblxuLy8gUGFyc2UgYXJnc1xuY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbmNvbnN0IGhhc0dsb2JhbCA9IGFyZ3MuaW5jbHVkZXMoJy0tZ2xvYmFsJykgfHwgYXJncy5pbmNsdWRlcygnLWcnKTtcbmNvbnN0IGhhc0xvY2FsID0gYXJncy5pbmNsdWRlcygnLS1sb2NhbCcpIHx8IGFyZ3MuaW5jbHVkZXMoJy1sJyk7XG5jb25zdCBoYXNPcGVuY29kZSA9IGFyZ3MuaW5jbHVkZXMoJy0tb3BlbmNvZGUnKTtcbmNvbnN0IGhhc0NsYXVkZSA9IGFyZ3MuaW5jbHVkZXMoJy0tY2xhdWRlJyk7XG5jb25zdCBoYXNHZW1pbmkgPSBhcmdzLmluY2x1ZGVzKCctLWdlbWluaScpO1xuY29uc3QgaGFzQ29kZXggPSBhcmdzLmluY2x1ZGVzKCctLWNvZGV4Jyk7XG5jb25zdCBoYXNDb3BpbG90ID0gYXJncy5pbmNsdWRlcygnLS1jb3BpbG90Jyk7XG5jb25zdCBoYXNRd2VuID0gYXJncy5pbmNsdWRlcygnLS1xd2VuJyk7XG5jb25zdCBoYXNLaW1pID0gYXJncy5pbmNsdWRlcygnLS1raW1pJyk7XG5jb25zdCBoYXNCb3RoID0gYXJncy5pbmNsdWRlcygnLS1ib3RoJyk7IC8vIExlZ2FjeSBmbGFnLCBrZWVwcyB3b3JraW5nXG5jb25zdCBoYXNBbGwgPSBhcmdzLmluY2x1ZGVzKCctLWFsbCcpO1xuY29uc3QgaGFzVW5pbnN0YWxsID0gYXJncy5pbmNsdWRlcygnLS11bmluc3RhbGwnKSB8fCBhcmdzLmluY2x1ZGVzKCctdScpO1xuXG4vLyBSdW50aW1lIHNlbGVjdGlvbiAtIGNhbiBiZSBzZXQgYnkgZmxhZ3Mgb3IgaW50ZXJhY3RpdmUgcHJvbXB0XG5sZXQgc2VsZWN0ZWRSdW50aW1lczogc3RyaW5nW10gPSBbXTtcbmlmIChoYXNBbGwpIHtcbiAgc2VsZWN0ZWRSdW50aW1lcyA9IFsnY2xhdWRlJywgJ29wZW5jb2RlJywgJ2dlbWluaScsICdjb2RleCcsICdjb3BpbG90JywgJ3F3ZW4nLCAna2ltaSddO1xufSBlbHNlIGlmIChoYXNCb3RoKSB7XG4gIHNlbGVjdGVkUnVudGltZXMgPSBbJ2NsYXVkZScsICdvcGVuY29kZSddO1xufSBlbHNlIHtcbiAgaWYgKGhhc09wZW5jb2RlKSBzZWxlY3RlZFJ1bnRpbWVzLnB1c2goJ29wZW5jb2RlJyk7XG4gIGlmIChoYXNDbGF1ZGUpIHNlbGVjdGVkUnVudGltZXMucHVzaCgnY2xhdWRlJyk7XG4gIGlmIChoYXNHZW1pbmkpIHNlbGVjdGVkUnVudGltZXMucHVzaCgnZ2VtaW5pJyk7XG4gIGlmIChoYXNDb2RleCkgc2VsZWN0ZWRSdW50aW1lcy5wdXNoKCdjb2RleCcpO1xuICBpZiAoaGFzQ29waWxvdCkgc2VsZWN0ZWRSdW50aW1lcy5wdXNoKCdjb3BpbG90Jyk7XG4gIGlmIChoYXNRd2VuKSBzZWxlY3RlZFJ1bnRpbWVzLnB1c2goJ3F3ZW4nKTtcbiAgaWYgKGhhc0tpbWkpIHNlbGVjdGVkUnVudGltZXMucHVzaCgna2ltaScpO1xufVxuXG4vLyBXU0wgKyBXaW5kb3dzIE5vZGUuanMgZGV0ZWN0aW9uXG4vLyBXaGVuIFdpbmRvd3MtbmF0aXZlIE5vZGUgcnVucyBvbiBXU0wsIG9zLmhvbWVkaXIoKSBhbmQgcGF0aC5qb2luKCkgcHJvZHVjZVxuLy8gYmFja3NsYXNoIHBhdGhzIHRoYXQgZG9uJ3QgcmVzb2x2ZSBjb3JyZWN0bHkgb24gdGhlIExpbnV4IGZpbGVzeXN0ZW0uXG5pZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICBsZXQgaXNXU0wgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuV1NMX0RJU1RST19OQU1FKSB7XG4gICAgICBpc1dTTCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChmcy5leGlzdHNTeW5jKCcvcHJvYy92ZXJzaW9uJykpIHtcbiAgICAgIGNvbnN0IHByb2NWZXJzaW9uID0gZnMucmVhZEZpbGVTeW5jKCcvcHJvYy92ZXJzaW9uJywgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHByb2NWZXJzaW9uLmluY2x1ZGVzKCdtaWNyb3NvZnQnKSB8fCBwcm9jVmVyc2lvbi5pbmNsdWRlcygnd3NsJykpIHtcbiAgICAgICAgaXNXU0wgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gSWdub3JlIHJlYWQgZXJyb3JzIFx1MjAxNCBub3QgV1NMXG4gIH1cblxuICBpZiAoaXNXU0wpIHtcbiAgICBjb25zb2xlLmVycm9yKGBcbiR7eWVsbG93fVx1MjZBMCBEZXRlY3RlZCBXU0wgd2l0aCBXaW5kb3dzLW5hdGl2ZSBOb2RlLmpzLiR7cmVzZXR9XG5cblRoaXMgY2F1c2VzIHBhdGggcmVzb2x1dGlvbiBpc3N1ZXMgdGhhdCBwcmV2ZW50IGNvcnJlY3QgaW5zdGFsbGF0aW9uLlxuUGxlYXNlIGluc3RhbGwgYSBMaW51eC1uYXRpdmUgTm9kZS5qcyBpbnNpZGUgV1NMOlxuXG4gIGN1cmwgLWZzU0wgaHR0cHM6Ly9mbm0udmVyY2VsLmFwcC9pbnN0YWxsIHwgYmFzaFxuICBmbm0gaW5zdGFsbCAtLWx0c1xuXG5UaGVuIHJlLXJ1bjogbnB4IGV6LWFnZW50c1xuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIHBhdGhQcmVmaXggKHdoaWNoIHVzZXMgYWJzb2x1dGUgcGF0aHMgZm9yIGdsb2JhbCBpbnN0YWxscykgdG8gYVxuICogJEhPTUUtcmVsYXRpdmUgZm9ybSBmb3IgcmVwbGFjaW5nICRIT01FLy5jbGF1ZGUvIHJlZmVyZW5jZXMgaW4gYmFzaCBjb2RlIGJsb2Nrcy5cbiAqIFByZXNlcnZlcyAkSE9NRSBhcyBhIHNoZWxsIHZhcmlhYmxlIHNvIHBhdGhzIHJlbWFpbiBwb3J0YWJsZSBhY3Jvc3MgbWFjaGluZXMuXG4gKi9cbmZ1bmN0aW9uIHRvSG9tZVByZWZpeChwYXRoUHJlZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBob21lID0gb3MuaG9tZWRpcigpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGhQcmVmaXgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKGhvbWUpKSB7XG4gICAgcmV0dXJuICckSE9NRScgKyBub3JtYWxpemVkLnNsaWNlKGhvbWUubGVuZ3RoKTtcbiAgfVxuICAvLyBDb252ZXJ0IHRpbGRlLWJhc2VkIHBhdGhzIHRvICRIT01FLWJhc2VkIHBhdGhzIGZvciBiYXNoIGNvZGUgYmxvY2tzXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJ34vJykpIHtcbiAgICByZXR1cm4gJyRIT01FJyArIG5vcm1hbGl6ZWQuc2xpY2UoMSk7XG4gIH1cbiAgLy8gRm9yIHJlbGF0aXZlIHBhdGhzIG9yIHBhdGhzIG5vdCB1bmRlciAkSE9NRSwgcmV0dXJuIGFzLWlzXG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vLyBIZWxwZXIgdG8gZ2V0IGRpcmVjdG9yeSBuYW1lIGZvciBhIHJ1bnRpbWUgKHVzZWQgZm9yIGxvY2FsL3Byb2plY3QgaW5zdGFsbHMpXG5mdW5jdGlvbiBnZXREaXJOYW1lKHJ1bnRpbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHJldHVybiAnLmdpdGh1Yic7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSByZXR1cm4gJy5vcGVuY29kZSc7XG4gIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykgcmV0dXJuICcuZ2VtaW5pJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb2RleCcpIHJldHVybiAnLmNvZGV4JztcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcmV0dXJuICcucXdlbic7XG4gIGlmIChydW50aW1lID09PSAna2ltaScpIHJldHVybiAnLmtpbWknO1xuICByZXR1cm4gJy5jbGF1ZGUnO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY29uZmlnIGRpcmVjdG9yeSBwYXRoIHJlbGF0aXZlIHRvIGhvbWUgZGlyZWN0b3J5IGZvciBhIHJ1bnRpbWVcbiAqIFVzZWQgZm9yIHRlbXBsYXRpbmcgaG9va3MgdGhhdCB1c2UgcGF0aC5qb2luKGhvbWVEaXIsICc8Y29uZmlnRGlyPicsIC4uLilcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCAnY29waWxvdCcsIG9yICdxd2VuJ1xuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXG4gKi9cbmZ1bmN0aW9uIGdldENvbmZpZ0RpckZyb21Ib21lKHJ1bnRpbWU6IHN0cmluZywgaXNHbG9iYWw6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoIWlzR2xvYmFsKSB7XG4gICAgLy8gTG9jYWwgaW5zdGFsbHMgdXNlIHRoZSBzYW1lIGRpciBuYW1lIHBhdHRlcm5cbiAgICByZXR1cm4gYCcke2dldERpck5hbWUocnVudGltZSl9J2A7XG4gIH1cbiAgLy8gR2xvYmFsIGluc3RhbGxzIC0gT3BlbkNvZGUgdXNlcyBYREcgcGF0aCBzdHJ1Y3R1cmVcbiAgaWYgKHJ1bnRpbWUgPT09ICdjb3BpbG90JykgcmV0dXJuIFwiJy5jb3BpbG90J1wiO1xuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJykge1xuICAgIC8vIE9wZW5Db2RlOiB+Ly5jb25maWcvb3BlbmNvZGUgLT4gJy5jb25maWcnLCAnb3BlbmNvZGUnXG4gICAgLy8gUmV0dXJuIGFzIGNvbW1hLXNlcGFyYXRlZCBmb3IgcGF0aC5qb2luKCkgcmVwbGFjZW1lbnRcbiAgICByZXR1cm4gXCInLmNvbmZpZycsICdvcGVuY29kZSdcIjtcbiAgfVxuICBpZiAocnVudGltZSA9PT0gJ2dlbWluaScpIHJldHVybiBcIicuZ2VtaW5pJ1wiO1xuICBpZiAocnVudGltZSA9PT0gJ2NvZGV4JykgcmV0dXJuIFwiJy5jb2RleCdcIjtcbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykgcmV0dXJuIFwiJy5xd2VuJ1wiO1xuICBpZiAocnVudGltZSA9PT0gJ2tpbWknKSByZXR1cm4gXCInLmtpbWknXCI7XG4gIHJldHVybiBcIicuY2xhdWRlJ1wiO1xufVxuXG4vKipcbiAqIEdldCB0aGUgZ2xvYmFsIGNvbmZpZyBkaXJlY3RvcnkgZm9yIE9wZW5Db2RlXG4gKiBPcGVuQ29kZSBmb2xsb3dzIFhERyBCYXNlIERpcmVjdG9yeSBzcGVjIGFuZCB1c2VzIH4vLmNvbmZpZy9vcGVuY29kZS9cbiAqIFByaW9yaXR5OiBPUEVOQ09ERV9DT05GSUdfRElSID4gZGlybmFtZShPUEVOQ09ERV9DT05GSUcpID4gWERHX0NPTkZJR19IT01FL29wZW5jb2RlID4gfi8uY29uZmlnL29wZW5jb2RlXG4gKi9cbmZ1bmN0aW9uIGdldE9wZW5jb2RlR2xvYmFsRGlyKCkge1xuICAvLyAxLiBFeHBsaWNpdCBPUEVOQ09ERV9DT05GSUdfRElSIGVudiB2YXJcbiAgaWYgKHByb2Nlc3MuZW52Lk9QRU5DT0RFX0NPTkZJR19ESVIpIHtcbiAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuT1BFTkNPREVfQ09ORklHX0RJUik7XG4gIH1cbiAgXG4gIC8vIDIuIE9QRU5DT0RFX0NPTkZJRyBlbnYgdmFyICh1c2UgaXRzIGRpcmVjdG9yeSlcbiAgaWYgKHByb2Nlc3MuZW52Lk9QRU5DT0RFX0NPTkZJRykge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUoZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuT1BFTkNPREVfQ09ORklHKSk7XG4gIH1cbiAgXG4gIC8vIDMuIFhER19DT05GSUdfSE9NRS9vcGVuY29kZVxuICBpZiAocHJvY2Vzcy5lbnYuWERHX0NPTkZJR19IT01FKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihleHBhbmRUaWxkZShwcm9jZXNzLmVudi5YREdfQ09ORklHX0hPTUUpLCAnb3BlbmNvZGUnKTtcbiAgfVxuICBcbiAgLy8gNC4gRGVmYXVsdDogfi8uY29uZmlnL29wZW5jb2RlIChYREcgZGVmYXVsdClcbiAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ29wZW5jb2RlJyk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBnbG9iYWwgY29uZmlnIGRpcmVjdG9yeSBmb3IgYSBydW50aW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gcnVudGltZSAtICdjbGF1ZGUnLCAnb3BlbmNvZGUnLCAnZ2VtaW5pJywgJ2NvZGV4Jywgb3IgJ2NvcGlsb3QnXG4gKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBleHBsaWNpdERpciAtIEV4cGxpY2l0IGRpcmVjdG9yeSBmcm9tIC0tY29uZmlnLWRpciBmbGFnXG4gKi9cbmZ1bmN0aW9uIGdldEdsb2JhbERpcihydW50aW1lOiBzdHJpbmcsIGV4cGxpY2l0RGlyOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSB7XG4gICAgLy8gRm9yIE9wZW5Db2RlLCAtLWNvbmZpZy1kaXIgb3ZlcnJpZGVzIGVudiB2YXJzXG4gICAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUoZXhwbGljaXREaXIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0T3BlbmNvZGVHbG9iYWxEaXIoKTtcbiAgfVxuICBcbiAgaWYgKHJ1bnRpbWUgPT09ICdnZW1pbmknKSB7XG4gICAgLy8gR2VtaW5pOiAtLWNvbmZpZy1kaXIgPiBHRU1JTklfQ09ORklHX0RJUiA+IH4vLmdlbWluaVxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkdFTUlOSV9DT05GSUdfRElSKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuR0VNSU5JX0NPTkZJR19ESVIpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5nZW1pbmknKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSB7XG4gICAgLy8gQ29kZXg6IC0tY29uZmlnLWRpciA+IENPREVYX0hPTUUgPiB+Ly5jb2RleFxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkNPREVYX0hPTUUpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShwcm9jZXNzLmVudi5DT0RFWF9IT01FKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29kZXgnKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHtcbiAgICAvLyBDb3BpbG90OiAtLWNvbmZpZy1kaXIgPiBDT1BJTE9UX0NPTkZJR19ESVIgPiB+Ly5jb3BpbG90XG4gICAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUoZXhwbGljaXREaXIpO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuQ09QSUxPVF9DT05GSUdfRElSKSB7XG4gICAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuQ09QSUxPVF9DT05GSUdfRElSKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29waWxvdCcpO1xuICB9XG5cbiAgaWYgKHJ1bnRpbWUgPT09ICdxd2VuJykge1xuICAgIC8vIFF3ZW4gQ29kZTogLS1jb25maWctZGlyID4gUVdFTl9DT05GSUdfRElSID4gfi8ucXdlblxuICAgIGlmIChleHBsaWNpdERpcikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LlFXRU5fQ09ORklHX0RJUikge1xuICAgICAgcmV0dXJuIGV4cGFuZFRpbGRlKHByb2Nlc3MuZW52LlFXRU5fQ09ORklHX0RJUik7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLnF3ZW4nKTtcbiAgfVxuXG4gIGlmIChydW50aW1lID09PSAna2ltaScpIHtcbiAgICAvLyBLaW1pIENvZGU6IC0tY29uZmlnLWRpciA+IEtJTUlfQ09ORklHX0RJUiA+IH4vLmtpbWlcbiAgICBpZiAoZXhwbGljaXREaXIpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShleHBsaWNpdERpcik7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5LSU1JX0NPTkZJR19ESVIpIHtcbiAgICAgIHJldHVybiBleHBhbmRUaWxkZShwcm9jZXNzLmVudi5LSU1JX0NPTkZJR19ESVIpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5raW1pJyk7XG4gIH1cblxuICAvLyBDbGF1ZGUgQ29kZTogLS1jb25maWctZGlyID4gQ0xBVURFX0NPTkZJR19ESVIgPiB+Ly5jbGF1ZGVcbiAgaWYgKGV4cGxpY2l0RGlyKSB7XG4gICAgcmV0dXJuIGV4cGFuZFRpbGRlKGV4cGxpY2l0RGlyKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuQ0xBVURFX0NPTkZJR19ESVIpIHtcbiAgICByZXR1cm4gZXhwYW5kVGlsZGUocHJvY2Vzcy5lbnYuQ0xBVURFX0NPTkZJR19ESVIpO1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNsYXVkZScpO1xufVxuXG5jb25zdCBiYW5uZXIgPSAnXFxuJyArXG4gIGN5YW4gKyAnICBcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1ODhcdTI1NTdcdTI1ODhcdTI1ODhcdTI1NTcgIFx1MjU4OFx1MjU4OFx1MjU1N1xcbicgK1xuICAnICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NURcdTI1NUFcdTI1ODhcdTI1ODhcdTI1NTdcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NURcXG4nICtcbiAgJyAgXHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTg4XHUyNTU3ICAgXHUyNTVBXHUyNTg4XHUyNTg4XHUyNTg4XHUyNTU0XHUyNTVEIFxcbicgK1xuICAnICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1NTBcdTI1NTBcdTI1NUQgICBcdTI1ODhcdTI1ODhcdTI1NTRcdTI1ODhcdTI1ODhcdTI1NTcgXFxuJyArXG4gICcgIFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU4OFx1MjU1N1x1MjU4OFx1MjU4OFx1MjU1NFx1MjU1RFx1MjU1QVx1MjU4OFx1MjU4OFx1MjU1N1xcbicgK1xuICAnICBcdTI1NUFcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NURcdTI1NUFcdTI1NTBcdTI1NUQgXHUyNTVBXHUyNTUwXHUyNTVEJyArIHJlc2V0ICsgJ1xcbicgK1xuICAnXFxuJyArXG4gICcgIEVaX0FnZW50cyAnICsgZGltICsgJ3YnICsgcGtnLnZlcnNpb24gKyByZXNldCArICdcXG4nICtcbiAgJyAgTXVsdGktTW9kZWwgRWRpdGlvbicgKyByZXNldCArICdcXG4nICtcbiAgJyAgQSBtZXRhLXByb21wdGluZywgY29udGV4dCBlbmdpbmVlcmluZyBhbmQgc3BlYy1kcml2ZW5cXG4nICtcbiAgJyAgZGV2ZWxvcG1lbnQgc3lzdGVtIGZvciBDbGF1ZGUgQ29kZSwgT3BlbkNvZGUsIEdlbWluaSwgQ29kZXgsIENvcGlsb3QsXFxuJyArXG4gICcgIFF3ZW4gQ29kZSwgS2ltaSBDb2RlLCB3aXRoIG11bHRpLW1vZGVsIHN1cHBvcnQuXFxuJyArXG4gICcgIE9yaWdpbmFsIGJ5IFRcdTAwQzJDSEVTIHwgTXVsdGktTW9kZWwgRm9yayBieSBAaG93bGlsLlxcbic7XG5cblxuLy8gUGFyc2UgLS1jb25maWctZGlyIGFyZ3VtZW50XG5mdW5jdGlvbiBwYXJzZUNvbmZpZ0RpckFyZygpIHtcbiAgY29uc3QgY29uZmlnRGlySW5kZXggPSBhcmdzLmZpbmRJbmRleChhcmcgPT4gYXJnID09PSAnLS1jb25maWctZGlyJyB8fCBhcmcgPT09ICctYycpO1xuICBpZiAoY29uZmlnRGlySW5kZXggIT09IC0xKSB7XG4gICAgY29uc3QgbmV4dEFyZyA9IGFyZ3NbY29uZmlnRGlySW5kZXggKyAxXTtcbiAgICAvLyBFcnJvciBpZiAtLWNvbmZpZy1kaXIgaXMgcHJvdmlkZWQgd2l0aG91dCBhIHZhbHVlIG9yIG5leHQgYXJnIGlzIGFub3RoZXIgZmxhZ1xuICAgIGlmICghbmV4dEFyZyB8fCBuZXh0QXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd30tLWNvbmZpZy1kaXIgcmVxdWlyZXMgYSBwYXRoIGFyZ3VtZW50JHtyZXNldH1gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRBcmc7XG4gIH1cbiAgLy8gQWxzbyBoYW5kbGUgLS1jb25maWctZGlyPXZhbHVlIGZvcm1hdFxuICBjb25zdCBjb25maWdEaXJBcmcgPSBhcmdzLmZpbmQoYXJnID0+IGFyZy5zdGFydHNXaXRoKCctLWNvbmZpZy1kaXI9JykgfHwgYXJnLnN0YXJ0c1dpdGgoJy1jPScpKTtcbiAgaWYgKGNvbmZpZ0RpckFyZykge1xuICAgIGNvbnN0IHZhbHVlID0gY29uZmlnRGlyQXJnLnNwbGl0KCc9JylbMV07XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd30tLWNvbmZpZy1kaXIgcmVxdWlyZXMgYSBub24tZW1wdHkgcGF0aCR7cmVzZXR9YCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmNvbnN0IGV4cGxpY2l0Q29uZmlnRGlyID0gcGFyc2VDb25maWdEaXJBcmcoKTtcbmNvbnN0IGhhc0hlbHAgPSBhcmdzLmluY2x1ZGVzKCctLWhlbHAnKSB8fCBhcmdzLmluY2x1ZGVzKCctaCcpO1xuY29uc3QgaGFzVmVyc2lvbiA9IGFyZ3MuaW5jbHVkZXMoJy0tdmVyc2lvbicpIHx8IGFyZ3MuaW5jbHVkZXMoJy12Jyk7XG5jb25zdCBmb3JjZVN0YXR1c2xpbmUgPSBhcmdzLmluY2x1ZGVzKCctLWZvcmNlLXN0YXR1c2xpbmUnKTtcblxuLy8gU2hvdyB2ZXJzaW9uIGlmIHJlcXVlc3RlZCAoc2tpcCBiYW5uZXIsIGp1c3Qgb3V0cHV0IHZlcnNpb24pXG5pZiAoaGFzVmVyc2lvbikge1xuICBjb25zb2xlLmxvZyhwa2cudmVyc2lvbik7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuY29uc29sZS5sb2coYmFubmVyKTtcblxuaWYgKGhhc1VuaW5zdGFsbCkge1xuICBjb25zb2xlLmxvZygnICBNb2RlOiBVbmluc3RhbGxcXG4nKTtcbn1cblxuLy8gU2hvdyBoZWxwIGlmIHJlcXVlc3RlZFxuaWYgKGhhc0hlbHApIHtcbiAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9VXNhZ2U6JHtyZXNldH0gbnB4IGV6LWFnZW50cyBbb3B0aW9uc11cXG5cXG4gICR7eWVsbG93fU9wdGlvbnM6JHtyZXNldH1cXG4gICAgJHtjeWFufS1nLCAtLWdsb2JhbCR7cmVzZXR9ICAgICAgICAgICAgICBJbnN0YWxsIGdsb2JhbGx5ICh0byBjb25maWcgZGlyZWN0b3J5KVxcbiAgICAke2N5YW59LWwsIC0tbG9jYWwke3Jlc2V0fSAgICAgICAgICAgICAgIEluc3RhbGwgbG9jYWxseSAodG8gY3VycmVudCBkaXJlY3RvcnkpXFxuICAgICR7Y3lhbn0tLWNsYXVkZSR7cmVzZXR9ICAgICAgICAgICAgICAgICAgSW5zdGFsbCBmb3IgQ2xhdWRlIENvZGUgb25seVxcbiAgICAke2N5YW59LS1vcGVuY29kZSR7cmVzZXR9ICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIE9wZW5Db2RlIG9ubHlcXG4gICAgJHtjeWFufS0tZ2VtaW5pJHtyZXNldH0gICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBHZW1pbmkgb25seVxcbiAgICAke2N5YW59LS1jb2RleCR7cmVzZXR9ICAgICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIENvZGV4IG9ubHlcXG4gICAgJHtjeWFufS0tY29waWxvdCR7cmVzZXR9ICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBDb3BpbG90IG9ubHlcXG4gICAgJHtjeWFufS0tcXdlbiR7cmVzZXR9ICAgICAgICAgICAgICAgICAgICBJbnN0YWxsIGZvciBRd2VuIENvZGUgb25seVxcbiAgICAke2N5YW59LS1raW1pJHtyZXNldH0gICAgICAgICAgICAgICAgICAgIEluc3RhbGwgZm9yIEtpbWkgQ29kZSBvbmx5XFxuICAgICR7Y3lhbn0tLWFsbCR7cmVzZXR9ICAgICAgICAgICAgICAgICAgICAgSW5zdGFsbCBmb3IgYWxsIHJ1bnRpbWVzXFxuICAgICR7Y3lhbn0tdSwgLS11bmluc3RhbGwke3Jlc2V0fSAgICAgICAgICAgVW5pbnN0YWxsIEVaX0FnZW50cyAocmVtb3ZlIGFsbCBFWl9BZ2VudHMgZmlsZXMpXFxuICAgICR7Y3lhbn0tYywgLS1jb25maWctZGlyIDxwYXRoPiR7cmVzZXR9ICAgU3BlY2lmeSBjdXN0b20gY29uZmlnIGRpcmVjdG9yeVxcbiAgICAke2N5YW59LXYsIC0tdmVyc2lvbiR7cmVzZXR9ICAgICAgICAgICAgIFNob3cgdmVyc2lvbiBudW1iZXJcXG4gICAgJHtjeWFufS1oLCAtLWhlbHAke3Jlc2V0fSAgICAgICAgICAgICAgICBTaG93IHRoaXMgaGVscCBtZXNzYWdlXFxuICAgICR7Y3lhbn0tLWZvcmNlLXN0YXR1c2xpbmUke3Jlc2V0fSAgICAgICAgUmVwbGFjZSBleGlzdGluZyBzdGF0dXNsaW5lIGNvbmZpZ1xcblxcbiAgJHt5ZWxsb3d9RXhhbXBsZXM6JHtyZXNldH1cXG4gICAgJHtkaW19IyBJbnRlcmFjdGl2ZSBpbnN0YWxsIChwcm9tcHRzIGZvciBydW50aW1lIGFuZCBsb2NhdGlvbikke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzXFxuXFxuICAgICR7ZGltfSMgSW5zdGFsbCBmb3IgQ2xhdWRlIENvZGUgZ2xvYmFsbHkke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzIC0tY2xhdWRlIC0tZ2xvYmFsXFxuXFxuICAgICR7ZGltfSMgSW5zdGFsbCBmb3IgUXdlbiBDb2RlIGdsb2JhbGx5JHtyZXNldH1cXG4gICAgbnB4IGV6LWFnZW50cyAtLXF3ZW4gLS1nbG9iYWxcXG5cXG4gICAgJHtkaW19IyBJbnN0YWxsIGZvciBLaW1pIENvZGUgZ2xvYmFsbHkke3Jlc2V0fVxcbiAgICBucHggZXotYWdlbnRzIC0ta2ltaSAtLWdsb2JhbFxcblxcbiAgICAke2RpbX0jIEluc3RhbGwgZm9yIGFsbCBydW50aW1lcyBnbG9iYWxseSR7cmVzZXR9XFxuICAgIG5weCBlei1hZ2VudHMgLS1hbGwgLS1nbG9iYWxcXG5cXG4gICAgJHtkaW19IyBVbmluc3RhbGwgRVpfQWdlbnRzIGdsb2JhbGx5JHtyZXNldH1cXG4gICAgbnB4IGV6LWFnZW50cyAtLWFsbCAtLWdsb2JhbCAtLXVuaW5zdGFsbFxcblxcbiAgICAke2RpbX0jIFNob3cgdmVyc2lvbiR7cmVzZXR9XFxuICAgIG5weCBlei1hZ2VudHMgLS12ZXJzaW9uXFxuXFxuICAke3llbGxvd31Ob3Rlczoke3Jlc2V0fVxcbiAgICBUaGUgLS1jb25maWctZGlyIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBjb25maWd1cmF0aW9ucy5cXG4gICAgSXQgdGFrZXMgcHJpb3JpdHkgb3ZlciBDTEFVREVfQ09ORklHX0RJUiAvIEdFTUlOSV9DT05GSUdfRElSIC8gQ09ERVhfSE9NRSAvIENPUElMT1RfQ09ORklHX0RJUiAvIFFXRU5fQ09ORklHX0RJUiAvIEtJTUlfQ09ORklHX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXFxuXFxuICAke3llbGxvd31Nb2RlbCBQcm92aWRlcnM6JHtyZXNldH1cXG4gICAgT3BlbkFJIGFuZCBBbnRocm9waWMgYXJlIG1vZGVsIHByb3ZpZGVycyBjb25maWd1cmVkIGluIHNldHRpbmdzLmpzb24sXFxuICAgIG5vdCBzZXBhcmF0ZSBDTEkgcnVudGltZXMuIFNlZSBSRUFETUUubWQgZm9yIG1vZGVsIGNvbmZpZ3VyYXRpb24uXFxuYCk7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgfiB0byBob21lIGRpcmVjdG9yeSAoc2hlbGwgZG9lc24ndCBleHBhbmQgaW4gZW52IHZhcnMgcGFzc2VkIHRvIG5vZGUpXG4gKi9cbmZ1bmN0aW9uIGV4cGFuZFRpbGRlKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aCAmJiBmaWxlUGF0aC5zdGFydHNXaXRoKCd+LycpKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihvcy5ob21lZGlyKCksIGZpbGVQYXRoLnNsaWNlKDIpKTtcbiAgfVxuICByZXR1cm4gZmlsZVBhdGg7XG59XG5cbi8qKlxuICogQnVpbGQgYSBob29rIGNvbW1hbmQgcGF0aCB1c2luZyBmb3J3YXJkIHNsYXNoZXMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhdGliaWxpdHkuXG4gKiBPbiBXaW5kb3dzLCAkSE9NRSBpcyBub3QgZXhwYW5kZWQgYnkgY21kLmV4ZS9Qb3dlclNoZWxsLCBzbyB3ZSB1c2UgdGhlIGFjdHVhbCBwYXRoLlxuICovXG5mdW5jdGlvbiBidWlsZEhvb2tDb21tYW5kKGNvbmZpZ0RpciwgaG9va05hbWUpIHtcbiAgLy8gVXNlIGZvcndhcmQgc2xhc2hlcyBmb3IgTm9kZS5qcyBjb21wYXRpYmlsaXR5IG9uIGFsbCBwbGF0Zm9ybXNcbiAgY29uc3QgaG9va3NQYXRoID0gY29uZmlnRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKSArICcvaG9va3MvJyArIGhvb2tOYW1lO1xuICByZXR1cm4gYG5vZGUgXCIke2hvb2tzUGF0aH1cImA7XG59XG5cbi8qKlxuICogUmVhZCBhbmQgcGFyc2Ugc2V0dGluZ3MuanNvbiwgcmV0dXJuaW5nIGVtcHR5IG9iamVjdCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gKi9cbmZ1bmN0aW9uIHJlYWRTZXR0aW5ncyhzZXR0aW5nc1BhdGgpIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBXcml0ZSBzZXR0aW5ncy5qc29uIHdpdGggcHJvcGVyIGZvcm1hdHRpbmdcbiAqL1xuZnVuY3Rpb24gd3JpdGVTZXR0aW5ncyhzZXR0aW5nc1BhdGgsIHNldHRpbmdzKSB7XG4gIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgbnVsbCwgMikgKyAnXFxuJyk7XG59XG5cbi8vIENhY2hlIGZvciBhdHRyaWJ1dGlvbiBzZXR0aW5ncyAocG9wdWxhdGVkIG9uY2UgcGVyIHJ1bnRpbWUgZHVyaW5nIGluc3RhbGwpXG5jb25zdCBhdHRyaWJ1dGlvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmc+KCk7XG5cbi8qKlxuICogR2V0IGNvbW1pdCBhdHRyaWJ1dGlvbiBzZXR0aW5nIGZvciBhIHJ1bnRpbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCBvciAnY29waWxvdCdcbiAqIEByZXR1cm5zIHtudWxsfHVuZGVmaW5lZHxzdHJpbmd9IG51bGwgPSByZW1vdmUsIHVuZGVmaW5lZCA9IGtlZXAgZGVmYXVsdCwgc3RyaW5nID0gY3VzdG9tXG4gKi9cbmZ1bmN0aW9uIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWU6IHN0cmluZyk6IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcge1xuICAvLyBSZXR1cm4gY2FjaGVkIHZhbHVlIGlmIGF2YWlsYWJsZVxuICBpZiAoYXR0cmlidXRpb25DYWNoZS5oYXMocnVudGltZSkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRpb25DYWNoZS5nZXQocnVudGltZSk7XG4gIH1cblxuICBsZXQgcmVzdWx0OiBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nO1xuXG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnKSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVhZFNldHRpbmdzKHBhdGguam9pbihnZXRHbG9iYWxEaXIoJ29wZW5jb2RlJywgbnVsbCksICdvcGVuY29kZS5qc29uJykpO1xuICAgIHJlc3VsdCA9IGNvbmZpZy5kaXNhYmxlX2FpX2F0dHJpYnV0aW9uID09PSB0cnVlID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykge1xuICAgIC8vIEdlbWluaTogY2hlY2sgZ2VtaW5pIHNldHRpbmdzLmpzb24gZm9yIGF0dHJpYnV0aW9uIGNvbmZpZ1xuICAgIGNvbnN0IHNldHRpbmdzID0gcmVhZFNldHRpbmdzKHBhdGguam9pbihnZXRHbG9iYWxEaXIoJ2dlbWluaScsIGV4cGxpY2l0Q29uZmlnRGlyKSwgJ3NldHRpbmdzLmpzb24nKSk7XG4gICAgaWYgKCFzZXR0aW5ncy5hdHRyaWJ1dGlvbiB8fCBzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MuYXR0cmlidXRpb24uY29tbWl0ID09PSAnJykge1xuICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc2V0dGluZ3MuYXR0cmlidXRpb24uY29tbWl0O1xuICAgIH1cbiAgfSBlbHNlIGlmIChydW50aW1lID09PSAnY2xhdWRlJykge1xuICAgIC8vIENsYXVkZSBDb2RlXG4gICAgY29uc3Qgc2V0dGluZ3MgPSByZWFkU2V0dGluZ3MocGF0aC5qb2luKGdldEdsb2JhbERpcignY2xhdWRlJywgZXhwbGljaXRDb25maWdEaXIpLCAnc2V0dGluZ3MuanNvbicpKTtcbiAgICBpZiAoIXNldHRpbmdzLmF0dHJpYnV0aW9uIHx8IHNldHRpbmdzLmF0dHJpYnV0aW9uLmNvbW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQgPT09ICcnKSB7XG4gICAgICByZXN1bHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBzZXR0aW5ncy5hdHRyaWJ1dGlvbi5jb21taXQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIENvZGV4IGFuZCBDb3BpbG90IGN1cnJlbnRseSBoYXZlIG5vIGF0dHJpYnV0aW9uIHNldHRpbmcgZXF1aXZhbGVudFxuICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIENhY2hlIGFuZCByZXR1cm5cbiAgYXR0cmlidXRpb25DYWNoZS5zZXQocnVudGltZSwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIENvLUF1dGhvcmVkLUJ5IGxpbmVzIGJhc2VkIG9uIGF0dHJpYnV0aW9uIHNldHRpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gRmlsZSBjb250ZW50IHRvIHByb2Nlc3NcbiAqIEBwYXJhbSB7bnVsbHx1bmRlZmluZWR8c3RyaW5nfSBhdHRyaWJ1dGlvbiAtIG51bGw9cmVtb3ZlLCB1bmRlZmluZWQ9a2VlcCwgc3RyaW5nPXJlcGxhY2VcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFByb2Nlc3NlZCBjb250ZW50XG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50OiBzdHJpbmcsIGF0dHJpYnV0aW9uOiBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGF0dHJpYnV0aW9uID09PSBudWxsKSB7XG4gICAgLy8gUmVtb3ZlIENvLUF1dGhvcmVkLUJ5IGxpbmVzIGFuZCB0aGUgcHJlY2VkaW5nIGJsYW5rIGxpbmVcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKC8oXFxyP1xcbil7Mn1Dby1BdXRob3JlZC1CeTouKiQvZ2ltLCAnJyk7XG4gIH1cbiAgaWYgKGF0dHJpYnV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICAvLyBSZXBsYWNlIHdpdGggY3VzdG9tIGF0dHJpYnV0aW9uIChlc2NhcGUgJCB0byBwcmV2ZW50IGJhY2tyZWZlcmVuY2UgaW5qZWN0aW9uKVxuICBjb25zdCBzYWZlQXR0cmlidXRpb24gPSBhdHRyaWJ1dGlvbi5yZXBsYWNlKC9cXCQvZywgJyQkJCQnKTtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvQ28tQXV0aG9yZWQtQnk6LiokL2dpbSwgYENvLUF1dGhvcmVkLUJ5OiAke3NhZmVBdHRyaWJ1dGlvbn1gKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENsYXVkZSBDb2RlIGZyb250bWF0dGVyIHRvIG9wZW5jb2RlIGZvcm1hdFxuICogLSBDb252ZXJ0cyAnYWxsb3dlZC10b29sczonIGFycmF5IHRvICdwZXJtaXNzaW9uOicgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIE1hcmtkb3duIGZpbGUgY29udGVudCB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ29udGVudCB3aXRoIGNvbnZlcnRlZCBmcm9udG1hdHRlclxuICovXG4vLyBDb2xvciBuYW1lIHRvIGhleCBtYXBwaW5nIGZvciBvcGVuY29kZSBjb21wYXRpYmlsaXR5XG5jb25zdCBjb2xvck5hbWVUb0hleCA9IHtcbiAgY3lhbjogJyMwMEZGRkYnLFxuICByZWQ6ICcjRkYwMDAwJyxcbiAgZ3JlZW46ICcjMDBGRjAwJyxcbiAgYmx1ZTogJyMwMDAwRkYnLFxuICB5ZWxsb3c6ICcjRkZGRjAwJyxcbiAgbWFnZW50YTogJyNGRjAwRkYnLFxuICBvcmFuZ2U6ICcjRkZBNTAwJyxcbiAgcHVycGxlOiAnIzgwMDA4MCcsXG4gIHBpbms6ICcjRkZDMENCJyxcbiAgd2hpdGU6ICcjRkZGRkZGJyxcbiAgYmxhY2s6ICcjMDAwMDAwJyxcbiAgZ3JheTogJyM4MDgwODAnLFxuICBncmV5OiAnIzgwODA4MCcsXG59O1xuXG4vLyBUb29sIG5hbWUgbWFwcGluZyBmcm9tIENsYXVkZSBDb2RlIHRvIE9wZW5Db2RlXG4vLyBPcGVuQ29kZSB1c2VzIGxvd2VyY2FzZSB0b29sIG5hbWVzOyBzcGVjaWFsIG1hcHBpbmdzIGZvciByZW5hbWVkIHRvb2xzXG5jb25zdCBjbGF1ZGVUb09wZW5jb2RlVG9vbHMgPSB7XG4gIEFza1VzZXJRdWVzdGlvbjogJ3F1ZXN0aW9uJyxcbiAgU2xhc2hDb21tYW5kOiAnc2tpbGwnLFxuICBUb2RvV3JpdGU6ICd0b2Rvd3JpdGUnLFxuICBXZWJGZXRjaDogJ3dlYmZldGNoJyxcbiAgV2ViU2VhcmNoOiAnd2Vic2VhcmNoJywgIC8vIFBsdWdpbi9NQ1AgLSBrZWVwIGZvciBjb21wYXRpYmlsaXR5XG59O1xuXG4vLyBUb29sIG5hbWUgbWFwcGluZyBmcm9tIENsYXVkZSBDb2RlIHRvIEdlbWluaSBDTElcbi8vIEdlbWluaSBDTEkgdXNlcyBzbmFrZV9jYXNlIGJ1aWx0LWluIHRvb2wgbmFtZXNcbmNvbnN0IGNsYXVkZVRvR2VtaW5pVG9vbHMgPSB7XG4gIFJlYWQ6ICdyZWFkX2ZpbGUnLFxuICBXcml0ZTogJ3dyaXRlX2ZpbGUnLFxuICBFZGl0OiAncmVwbGFjZScsXG4gIEJhc2g6ICdydW5fc2hlbGxfY29tbWFuZCcsXG4gIEdsb2I6ICdnbG9iJyxcbiAgR3JlcDogJ3NlYXJjaF9maWxlX2NvbnRlbnQnLFxuICBXZWJTZWFyY2g6ICdnb29nbGVfd2ViX3NlYXJjaCcsXG4gIFdlYkZldGNoOiAnd2ViX2ZldGNoJyxcbiAgVG9kb1dyaXRlOiAnd3JpdGVfdG9kb3MnLFxuICBBc2tVc2VyUXVlc3Rpb246ICdhc2tfdXNlcicsXG59O1xuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gT3BlbkNvZGUgZm9ybWF0XG4gKiAtIEFwcGxpZXMgc3BlY2lhbCBtYXBwaW5ncyAoQXNrVXNlclF1ZXN0aW9uIC0+IHF1ZXN0aW9uLCBldGMuKVxuICogLSBDb252ZXJ0cyB0byBsb3dlcmNhc2UgKGV4Y2VwdCBNQ1AgdG9vbHMgd2hpY2gga2VlcCB0aGVpciBmb3JtYXQpXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUb29sTmFtZShjbGF1ZGVUb29sKSB7XG4gIC8vIENoZWNrIGZvciBzcGVjaWFsIG1hcHBpbmcgZmlyc3RcbiAgaWYgKGNsYXVkZVRvT3BlbmNvZGVUb29sc1tjbGF1ZGVUb29sXSkge1xuICAgIHJldHVybiBjbGF1ZGVUb09wZW5jb2RlVG9vbHNbY2xhdWRlVG9vbF07XG4gIH1cbiAgLy8gTUNQIHRvb2xzIChtY3BfXyopIGtlZXAgdGhlaXIgZm9ybWF0XG4gIGlmIChjbGF1ZGVUb29sLnN0YXJ0c1dpdGgoJ21jcF9fJykpIHtcbiAgICByZXR1cm4gY2xhdWRlVG9vbDtcbiAgfVxuICAvLyBEZWZhdWx0OiBjb252ZXJ0IHRvIGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gR2VtaW5pIENMSSBmb3JtYXRcbiAqIC0gQXBwbGllcyBDbGF1ZGVcdTIxOTJHZW1pbmkgbWFwcGluZyAoUmVhZFx1MjE5MnJlYWRfZmlsZSwgQmFzaFx1MjE5MnJ1bl9zaGVsbF9jb21tYW5kLCBldGMuKVxuICogLSBGaWx0ZXJzIG91dCBNQ1AgdG9vbHMgKG1jcF9fKikgXHUyMDE0IHRoZXkgYXJlIGF1dG8tZGlzY292ZXJlZCBhdCBydW50aW1lIGluIEdlbWluaVxuICogLSBGaWx0ZXJzIG91dCBUYXNrIFx1MjAxNCBhZ2VudHMgYXJlIGF1dG8tcmVnaXN0ZXJlZCBhcyB0b29scyBpbiBHZW1pbmlcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gR2VtaW5pIHRvb2wgbmFtZSwgb3IgbnVsbCBpZiB0b29sIHNob3VsZCBiZSBleGNsdWRlZFxuICovXG5mdW5jdGlvbiBjb252ZXJ0R2VtaW5pVG9vbE5hbWUoY2xhdWRlVG9vbCkge1xuICAvLyBNQ1AgdG9vbHM6IGV4Y2x1ZGUgXHUyMDE0IGF1dG8tZGlzY292ZXJlZCBmcm9tIG1jcFNlcnZlcnMgY29uZmlnIGF0IHJ1bnRpbWVcbiAgaWYgKGNsYXVkZVRvb2wuc3RhcnRzV2l0aCgnbWNwX18nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIFRhc2s6IGV4Y2x1ZGUgXHUyMDE0IGFnZW50cyBhcmUgYXV0by1yZWdpc3RlcmVkIGFzIGNhbGxhYmxlIHRvb2xzXG4gIGlmIChjbGF1ZGVUb29sID09PSAnVGFzaycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBDaGVjayBmb3IgZXhwbGljaXQgbWFwcGluZ1xuICBpZiAoY2xhdWRlVG9HZW1pbmlUb29sc1tjbGF1ZGVUb29sXSkge1xuICAgIHJldHVybiBjbGF1ZGVUb0dlbWluaVRvb2xzW2NsYXVkZVRvb2xdO1xuICB9XG4gIC8vIERlZmF1bHQ6IGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgQ29kZSB0b29sIG5hbWUgdG8gR2l0SHViIENvcGlsb3QgZm9ybWF0LlxuICogLSBBcHBsaWVzIGV4cGxpY2l0IG1hcHBpbmcgZnJvbSBjbGF1ZGVUb0NvcGlsb3RUb29sc1xuICogLSBIYW5kbGVzIG1jcF9fY29udGV4dDdfXyogcHJlZml4IFx1MjE5MiBpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8qXG4gKiAtIEZhbGxzIGJhY2sgdG8gbG93ZXJjYXNlIGZvciB1bmtub3duIHRvb2xzXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDb3BpbG90VG9vbE5hbWUoY2xhdWRlVG9vbCkge1xuICAvLyBtY3BfX2NvbnRleHQ3X18qIHdpbGRjYXJkIFx1MjE5MiBpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8qXG4gIGlmIChjbGF1ZGVUb29sLnN0YXJ0c1dpdGgoJ21jcF9fY29udGV4dDdfXycpKSB7XG4gICAgcmV0dXJuICdpby5naXRodWIudXBzdGFzaC9jb250ZXh0Ny8nICsgY2xhdWRlVG9vbC5zbGljZSgnbWNwX19jb250ZXh0N19fJy5sZW5ndGgpO1xuICB9XG4gIC8vIENoZWNrIGV4cGxpY2l0IG1hcHBpbmdcbiAgaWYgKGNsYXVkZVRvQ29waWxvdFRvb2xzW2NsYXVkZVRvb2xdKSB7XG4gICAgcmV0dXJuIGNsYXVkZVRvQ29waWxvdFRvb2xzW2NsYXVkZVRvb2xdO1xuICB9XG4gIC8vIERlZmF1bHQ6IGxvd2VyY2FzZVxuICByZXR1cm4gY2xhdWRlVG9vbC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEFwcGx5IENvcGlsb3Qtc3BlY2lmaWMgY29udGVudCBjb252ZXJzaW9uIFx1MjAxNCBDT05WLTA2IChwYXRocykgKyBDT05WLTA3IChjb21tYW5kIG5hbWVzKS5cbiAqIFBhdGggbWFwcGluZ3MgZGVwZW5kIG9uIGluc3RhbGwgbW9kZTpcbiAqICAgR2xvYmFsOiB+Ly5jbGF1ZGUvIFx1MjE5MiB+Ly5jb3BpbG90LywgLi8uY2xhdWRlLyBcdTIxOTIgLi8uZ2l0aHViL1xuICogICBMb2NhbDogIH4vLmNsYXVkZS8gXHUyMTkyIC4vLmdpdGh1Yi8sIC4vLmNsYXVkZS8gXHUyMTkyIC4vLmdpdGh1Yi9cbiAqIEFwcGxpZWQgdG8gQUxMIENvcGlsb3QgY29udGVudCAoc2tpbGxzLCBhZ2VudHMsIGVuZ2luZSBmaWxlcykuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIFNvdXJjZSBjb250ZW50IHRvIGNvbnZlcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzR2xvYmFsPWZhbHNlXSAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsID0gZmFsc2UpIHtcbiAgbGV0IGMgPSBjb250ZW50O1xuICAvLyBDT05WLTA2OiBQYXRoIHJlcGxhY2VtZW50IFx1MjAxNCBtb3N0IHNwZWNpZmljIGZpcnN0IHRvIGF2b2lkIHN1YnN0cmluZyBtYXRjaGVzXG4gIGlmIChpc0dsb2JhbCkge1xuICAgIGMgPSBjLnJlcGxhY2UoL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZywgJyRIT01FLy5jb3BpbG90LycpO1xuICAgIGMgPSBjLnJlcGxhY2UoL35cXC9cXC5jbGF1ZGVcXC8vZywgJ34vLmNvcGlsb3QvJyk7XG4gIH0gZWxzZSB7XG4gICAgYyA9IGMucmVwbGFjZSgvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nLCAnLmdpdGh1Yi8nKTtcbiAgICBjID0gYy5yZXBsYWNlKC9+XFwvXFwuY2xhdWRlXFwvL2csICcuZ2l0aHViLycpO1xuICB9XG4gIGMgPSBjLnJlcGxhY2UoL1xcLlxcL1xcLmNsYXVkZVxcLy9nLCAnLi8uZ2l0aHViLycpO1xuICBjID0gYy5yZXBsYWNlKC9cXC5jbGF1ZGVcXC8vZywgJy5naXRodWIvJyk7XG4gIC8vIENPTlYtMDc6IENvbW1hbmQgbmFtZSBjb252ZXJzaW9uIChhbGwgZXo6IHJlZmVyZW5jZXMgXHUyMTkyIGV6LSlcbiAgYyA9IGMucmVwbGFjZSgvZXo6L2csICdlei0nKTtcbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQ29udmVydCBhIENsYXVkZSBjb21tYW5kICgubWQpIHRvIGEgQ29waWxvdCBza2lsbCAoU0tJTEwubWQpLlxuICogVHJhbnNmb3JtcyBmcm9udG1hdHRlciBvbmx5IFx1MjAxNCBib2R5IHBhc3NlcyB0aHJvdWdoIHdpdGggQ09OVi0wNi8wNyBhcHBsaWVkLlxuICogU2tpbGxzIGtlZXAgb3JpZ2luYWwgdG9vbCBuYW1lcyAobm8gbWFwcGluZykgcGVyIENPTlRFWFQubWQgZGVjaXNpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db3BpbG90U2tpbGwoY29udGVudCwgc2tpbGxOYW1lLCBpc0dsb2JhbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsKTtcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb252ZXJ0ZWQpO1xuICBpZiAoIWZyb250bWF0dGVyKSByZXR1cm4gY29udmVydGVkO1xuXG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuICBjb25zdCBhcmd1bWVudEhpbnQgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2FyZ3VtZW50LWhpbnQnKTtcbiAgY29uc3QgYWdlbnQgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2FnZW50Jyk7XG5cbiAgLy8gQ09OVi0wMjogRXh0cmFjdCBhbGxvd2VkLXRvb2xzIFlBTUwgbXVsdGlsaW5lIGxpc3QgXHUyMTkyIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmdcbiAgY29uc3QgdG9vbHNNYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKC9eYWxsb3dlZC10b29sczpcXHMqXFxuKCg/OlxccystXFxzKy4rXFxuPykqKS9tKTtcbiAgbGV0IHRvb2xzTGluZSA9ICcnO1xuICBpZiAodG9vbHNNYXRjaCkge1xuICAgIGNvbnN0IHRvb2xzID0gdG9vbHNNYXRjaFsxXS5tYXRjaCgvXlxccystXFxzKyguKykvZ20pO1xuICAgIGlmICh0b29scykge1xuICAgICAgdG9vbHNMaW5lID0gdG9vbHMubWFwKHQgPT4gdC5yZXBsYWNlKC9eXFxzKy1cXHMrLywgJycpLnRyaW0oKSkuam9pbignLCAnKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWNvbnN0cnVjdCBmcm9udG1hdHRlciBpbiBDb3BpbG90IGZvcm1hdFxuICBsZXQgZm0gPSBgLS0tXFxubmFtZTogJHtza2lsbE5hbWV9XFxuZGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259XFxuYDtcbiAgaWYgKGFyZ3VtZW50SGludCkgZm0gKz0gYGFyZ3VtZW50LWhpbnQ6ICR7eWFtbFF1b3RlKGFyZ3VtZW50SGludCl9XFxuYDtcbiAgaWYgKGFnZW50KSBmbSArPSBgYWdlbnQ6ICR7YWdlbnR9XFxuYDtcbiAgaWYgKHRvb2xzTGluZSkgZm0gKz0gYGFsbG93ZWQtdG9vbHM6ICR7dG9vbHNMaW5lfVxcbmA7XG4gIGZtICs9ICctLS0nO1xuXG4gIHJldHVybiBgJHtmbX1cXG4ke2JvZHl9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgQ2xhdWRlIGFnZW50ICgubWQpIHRvIGEgQ29waWxvdCBhZ2VudCAoLmFnZW50Lm1kKS5cbiAqIEFwcGxpZXMgdG9vbCBtYXBwaW5nICsgZGVkdXBsaWNhdGlvbiwgZm9ybWF0cyB0b29scyBhcyBKU09OIGFycmF5LlxuICogQ09OVi0wNDogSlNPTiBhcnJheSBmb3JtYXQuIENPTlYtMDU6IFRvb2wgbmFtZSBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvcGlsb3RBZ2VudChjb250ZW50LCBpc0dsb2JhbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50KGNvbnRlbnQsIGlzR2xvYmFsKTtcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb252ZXJ0ZWQpO1xuICBpZiAoIWZyb250bWF0dGVyKSByZXR1cm4gY29udmVydGVkO1xuXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuICBjb25zdCBjb2xvciA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnY29sb3InKTtcbiAgY29uc3QgdG9vbHNSYXcgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ3Rvb2xzJykgfHwgJyc7XG5cbiAgLy8gQ09OVi0wNCArIENPTlYtMDU6IE1hcCB0b29scywgZGVkdXBsaWNhdGUsIGZvcm1hdCBhcyBKU09OIGFycmF5XG4gIGNvbnN0IGNsYXVkZVRvb2xzID0gdG9vbHNSYXcuc3BsaXQoJywnKS5tYXAodCA9PiB0LnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBtYXBwZWRUb29scyA9IGNsYXVkZVRvb2xzLm1hcCh0ID0+IGNvbnZlcnRDb3BpbG90VG9vbE5hbWUodCkpO1xuICBjb25zdCB1bmlxdWVUb29scyA9IFsuLi5uZXcgU2V0KG1hcHBlZFRvb2xzKV07XG4gIGNvbnN0IHRvb2xzQXJyYXkgPSB1bmlxdWVUb29scy5sZW5ndGggPiAwXG4gICAgPyBcIlsnXCIgKyB1bmlxdWVUb29scy5qb2luKFwiJywgJ1wiKSArIFwiJ11cIlxuICAgIDogJ1tdJztcblxuICAvLyBSZWNvbnN0cnVjdCBmcm9udG1hdHRlciBpbiBDb3BpbG90IGZvcm1hdFxuICBsZXQgZm0gPSBgLS0tXFxubmFtZTogJHtuYW1lfVxcbmRlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufVxcbnRvb2xzOiAke3Rvb2xzQXJyYXl9XFxuYDtcbiAgaWYgKGNvbG9yKSBmbSArPSBgY29sb3I6ICR7Y29sb3J9XFxuYDtcbiAgZm0gKz0gJy0tLSc7XG5cbiAgcmV0dXJuIGAke2ZtfVxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiB0b1NpbmdsZUxpbmUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG59XG5cbmZ1bmN0aW9uIHlhbWxRdW90ZSh2YWx1ZSkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RnJvbnRtYXR0ZXJBbmRCb2R5KGNvbnRlbnQpIHtcbiAgaWYgKCFjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpKSB7XG4gICAgcmV0dXJuIHsgZnJvbnRtYXR0ZXI6IG51bGwsIGJvZHk6IGNvbnRlbnQgfTtcbiAgfVxuXG4gIGNvbnN0IGVuZEluZGV4ID0gY29udGVudC5pbmRleE9mKCctLS0nLCAzKTtcbiAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiB7IGZyb250bWF0dGVyOiBudWxsLCBib2R5OiBjb250ZW50IH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZyb250bWF0dGVyOiBjb250ZW50LnN1YnN0cmluZygzLCBlbmRJbmRleCkudHJpbSgpLFxuICAgIGJvZHk6IGNvbnRlbnQuc3Vic3RyaW5nKGVuZEluZGV4ICsgMyksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCBmaWVsZE5hbWUpIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtmaWVsZE5hbWV9OlxcXFxzKiguKykkYCwgJ20nKTtcbiAgY29uc3QgbWF0Y2ggPSBmcm9udG1hdHRlci5tYXRjaChyZWdleCk7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuICByZXR1cm4gbWF0Y2hbMV0udHJpbSgpLnJlcGxhY2UoL15bJ1wiXXxbJ1wiXSQvZywgJycpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0U2xhc2hDb21tYW5kc1RvQ29kZXhTa2lsbE1lbnRpb25zKGNvbnRlbnQpIHtcbiAgbGV0IGNvbnZlcnRlZCA9IGNvbnRlbnQucmVwbGFjZSgvXFwvZXo6KFthLXowLTktXSspL2dpLCAoXywgY29tbWFuZE5hbWUpID0+IHtcbiAgICByZXR1cm4gYCRlei0ke1N0cmluZyhjb21tYW5kTmFtZSkudG9Mb3dlckNhc2UoKX1gO1xuICB9KTtcbiAgY29udmVydGVkID0gY29udmVydGVkLnJlcGxhY2UoL1xcL2V6LWhlbHBcXGIvZywgJyRlei1oZWxwJyk7XG4gIHJldHVybiBjb252ZXJ0ZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0NvZGV4TWFya2Rvd24oY29udGVudCkge1xuICBsZXQgY29udmVydGVkID0gY29udmVydFNsYXNoQ29tbWFuZHNUb0NvZGV4U2tpbGxNZW50aW9ucyhjb250ZW50KTtcbiAgY29udmVydGVkID0gY29udmVydGVkLnJlcGxhY2UoL1xcJEFSR1VNRU5UU1xcYi9nLCAne3tFWl9BUkdTfX0nKTtcbiAgcmV0dXJuIGNvbnZlcnRlZDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29kZXhTa2lsbEFkYXB0ZXJIZWFkZXIoc2tpbGxOYW1lKSB7XG4gIGNvbnN0IGludm9jYXRpb24gPSBgJCR7c2tpbGxOYW1lfWA7XG4gIHJldHVybiBgPGNvZGV4X3NraWxsX2FkYXB0ZXI+XG4jIyBBLiBTa2lsbCBJbnZvY2F0aW9uXG4tIFRoaXMgc2tpbGwgaXMgaW52b2tlZCBieSBtZW50aW9uaW5nIFxcYCR7aW52b2NhdGlvbn1cXGAuXG4tIFRyZWF0IGFsbCB1c2VyIHRleHQgYWZ0ZXIgXFxgJHtpbnZvY2F0aW9ufVxcYCBhcyBcXGB7e0VaX0FSR1N9fVxcYC5cbi0gSWYgbm8gYXJndW1lbnRzIGFyZSBwcmVzZW50LCB0cmVhdCBcXGB7e0VaX0FSR1N9fVxcYCBhcyBlbXB0eS5cblxuIyMgQi4gQXNrVXNlclF1ZXN0aW9uIFx1MjE5MiByZXF1ZXN0X3VzZXJfaW5wdXQgTWFwcGluZ1xuRVpfQWdlbnRzIHdvcmtmbG93cyB1c2UgXFxgQXNrVXNlclF1ZXN0aW9uXFxgIChDbGF1ZGUgQ29kZSBzeW50YXgpLiBUcmFuc2xhdGUgdG8gQ29kZXggXFxgcmVxdWVzdF91c2VyX2lucHV0XFxgOlxuXG5QYXJhbWV0ZXIgbWFwcGluZzpcbi0gXFxgaGVhZGVyXFxgIFx1MjE5MiBcXGBoZWFkZXJcXGBcbi0gXFxgcXVlc3Rpb25cXGAgXHUyMTkyIFxcYHF1ZXN0aW9uXFxgXG4tIE9wdGlvbnMgZm9ybWF0dGVkIGFzIFxcYFwiTGFiZWxcIiBcdTIwMTQgZGVzY3JpcHRpb25cXGAgXHUyMTkyIFxcYHtsYWJlbDogXCJMYWJlbFwiLCBkZXNjcmlwdGlvbjogXCJkZXNjcmlwdGlvblwifVxcYFxuLSBHZW5lcmF0ZSBcXGBpZFxcYCBmcm9tIGhlYWRlcjogbG93ZXJjYXNlLCByZXBsYWNlIHNwYWNlcyB3aXRoIHVuZGVyc2NvcmVzXG5cbkJhdGNoZWQgY2FsbHM6XG4tIFxcYEFza1VzZXJRdWVzdGlvbihbcTEsIHEyXSlcXGAgXHUyMTkyIHNpbmdsZSBcXGByZXF1ZXN0X3VzZXJfaW5wdXRcXGAgd2l0aCBtdWx0aXBsZSBlbnRyaWVzIGluIFxcYHF1ZXN0aW9uc1tdXFxgXG5cbk11bHRpLXNlbGVjdCB3b3JrYXJvdW5kOlxuLSBDb2RleCBoYXMgbm8gXFxgbXVsdGlTZWxlY3RcXGAuIFVzZSBzZXF1ZW50aWFsIHNpbmdsZS1zZWxlY3RzLCBvciBwcmVzZW50IGEgbnVtYmVyZWQgZnJlZWZvcm0gbGlzdCBhc2tpbmcgdGhlIHVzZXIgdG8gZW50ZXIgY29tbWEtc2VwYXJhdGVkIG51bWJlcnMuXG5cbkV4ZWN1dGUgbW9kZSBmYWxsYmFjazpcbi0gV2hlbiBcXGByZXF1ZXN0X3VzZXJfaW5wdXRcXGAgaXMgcmVqZWN0ZWQgKEV4ZWN1dGUgbW9kZSksIHByZXNlbnQgYSBwbGFpbi10ZXh0IG51bWJlcmVkIGxpc3QgYW5kIHBpY2sgYSByZWFzb25hYmxlIGRlZmF1bHQuXG5cbiMjIEMuIFRhc2soKSBcdTIxOTIgc3Bhd25fYWdlbnQgTWFwcGluZ1xuRVpfQWdlbnRzIHdvcmtmbG93cyB1c2UgXFxgVGFzayguLi4pXFxgIChDbGF1ZGUgQ29kZSBzeW50YXgpLiBUcmFuc2xhdGUgdG8gQ29kZXggY29sbGFib3JhdGlvbiB0b29sczpcblxuRGlyZWN0IG1hcHBpbmc6XG4tIFxcYFRhc2soc3ViYWdlbnRfdHlwZT1cIlhcIiwgcHJvbXB0PVwiWVwiKVxcYCBcdTIxOTIgXFxgc3Bhd25fYWdlbnQoYWdlbnRfdHlwZT1cIlhcIiwgbWVzc2FnZT1cIllcIilcXGBcbi0gXFxgVGFzayhtb2RlbD1cIi4uLlwiKVxcYCBcdTIxOTIgb21pdCAoQ29kZXggdXNlcyBwZXItcm9sZSBjb25maWcsIG5vdCBpbmxpbmUgbW9kZWwgc2VsZWN0aW9uKVxuLSBcXGBmb3JrX2NvbnRleHQ6IGZhbHNlXFxgIGJ5IGRlZmF1bHQgXHUyMDE0IEVaX0FnZW50cyBhZ2VudHMgbG9hZCB0aGVpciBvd24gY29udGV4dCB2aWEgXFxgPGZpbGVzX3RvX3JlYWQ+XFxgIGJsb2Nrc1xuXG5QYXJhbGxlbCBmYW4tb3V0OlxuLSBTcGF3biBtdWx0aXBsZSBhZ2VudHMgXHUyMTkyIGNvbGxlY3QgYWdlbnQgSURzIFx1MjE5MiBcXGB3YWl0KGlkcylcXGAgZm9yIGFsbCB0byBjb21wbGV0ZVxuXG5SZXN1bHQgcGFyc2luZzpcbi0gTG9vayBmb3Igc3RydWN0dXJlZCBtYXJrZXJzIGluIGFnZW50IG91dHB1dDogXFxgQ0hFQ0tQT0lOVFxcYCwgXFxgUExBTiBDT01QTEVURVxcYCwgXFxgU1VNTUFSWVxcYCwgZXRjLlxuLSBcXGBjbG9zZV9hZ2VudChpZClcXGAgYWZ0ZXIgY29sbGVjdGluZyByZXN1bHRzIGZyb20gZWFjaCBhZ2VudFxuPC9jb2RleF9za2lsbF9hZGFwdGVyPmA7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db2RleFNraWxsKGNvbnRlbnQsIHNraWxsTmFtZSkge1xuICBjb25zdCBjb252ZXJ0ZWQgPSBjb252ZXJ0Q2xhdWRlVG9Db2RleE1hcmtkb3duKGNvbnRlbnQpO1xuICBjb25zdCB7IGZyb250bWF0dGVyLCBib2R5IH0gPSBleHRyYWN0RnJvbnRtYXR0ZXJBbmRCb2R5KGNvbnZlcnRlZCk7XG4gIGxldCBkZXNjcmlwdGlvbiA9IGBSdW4gRVpfQWdlbnRzIHdvcmtmbG93ICR7c2tpbGxOYW1lfS5gO1xuICBpZiAoZnJvbnRtYXR0ZXIpIHtcbiAgICBjb25zdCBtYXliZURlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpO1xuICAgIGlmIChtYXliZURlc2NyaXB0aW9uKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IG1heWJlRGVzY3JpcHRpb247XG4gICAgfVxuICB9XG4gIGRlc2NyaXB0aW9uID0gdG9TaW5nbGVMaW5lKGRlc2NyaXB0aW9uKTtcbiAgY29uc3Qgc2hvcnREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLmxlbmd0aCA+IDE4MCA/IGAke2Rlc2NyaXB0aW9uLnNsaWNlKDAsIDE3Nyl9Li4uYCA6IGRlc2NyaXB0aW9uO1xuICBjb25zdCBhZGFwdGVyID0gZ2V0Q29kZXhTa2lsbEFkYXB0ZXJIZWFkZXIoc2tpbGxOYW1lKTtcblxuICByZXR1cm4gYC0tLVxcbm5hbWU6ICR7eWFtbFF1b3RlKHNraWxsTmFtZSl9XFxuZGVzY3JpcHRpb246ICR7eWFtbFF1b3RlKGRlc2NyaXB0aW9uKX1cXG5tZXRhZGF0YTpcXG4gIHNob3J0LWRlc2NyaXB0aW9uOiAke3lhbWxRdW90ZShzaG9ydERlc2NyaXB0aW9uKX1cXG4tLS1cXG5cXG4ke2FkYXB0ZXJ9XFxuXFxuJHtib2R5LnRyaW1TdGFydCgpfWA7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb1F3ZW5BZ2VudChjb250ZW50KSB7XG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIsIGJvZHkgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb250ZW50O1xuXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuXG4gIC8vIFF3ZW4gQ29kZSB1c2VzIHNpbXBsZSBtYXJrZG93bi4gV2UnbGwgcHV0IG5hbWUgYW5kIGRlc2NyaXB0aW9uIGluIHRoZSBib2R5LlxuICByZXR1cm4gYCMgQWdlbnQ6ICR7bmFtZX1cXG5cXG4ke2Rlc2NyaXB0aW9ufVxcblxcbiR7Ym9keS50cmltU3RhcnQoKX1gO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlVG9LaW1pU2tpbGwoY29udGVudCwgc2tpbGxOYW1lKSB7XG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIsIGJvZHkgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb250ZW50O1xuXG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuXG4gIC8vIFJlY29uc3RydWN0IGFzIHNpbXBsZSBNYXJrZG93blxuICByZXR1cm4gYCMgU2tpbGw6ICR7c2tpbGxOYW1lfVxcblxcbiR7ZGVzY3JpcHRpb259XFxuXFxuJHtib2R5LnRyaW1TdGFydCgpfWA7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0tpbWlBZ2VudChjb250ZW50KSB7XG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIsIGJvZHkgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb250ZW50O1xuXG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ25hbWUnKSB8fCAndW5rbm93bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuXG4gIC8vIEtpbWkgQ29kZSB1c2VzIHNpbXBsZSBtYXJrZG93blxuICByZXR1cm4gYCMgQWdlbnQ6ICR7bmFtZX1cXG5cXG4ke2Rlc2NyaXB0aW9ufVxcblxcbiR7Ym9keS50cmltU3RhcnQoKX1gO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbGF1ZGUgY29tbWFuZCAoLm1kKSB0byBhIFF3ZW4gc2tpbGwgKFNLSUxMLm1kKS5cbiAqIFN0cmlwcyBmcm9udG1hdHRlciBhbmQgZm9ybWF0cyBhcyBzaW1wbGUgTWFya2Rvd24uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb1F3ZW5Ta2lsbChjb250ZW50LCBza2lsbE5hbWUpIHtcbiAgY29uc3QgeyBmcm9udG1hdHRlciwgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShjb250ZW50KTtcbiAgaWYgKCFmcm9udG1hdHRlcikgcmV0dXJuIGNvbnRlbnQ7XG5cbiAgY29uc3QgZGVzY3JpcHRpb24gPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2Rlc2NyaXB0aW9uJykgfHwgJyc7XG5cbiAgLy8gUmVjb25zdHJ1Y3QgYXMgc2ltcGxlIE1hcmtkb3duXG4gIHJldHVybiBgIyBTa2lsbDogJHtza2lsbE5hbWV9XFxuXFxuJHtkZXNjcmlwdGlvbn1cXG5cXG4ke2JvZHkudHJpbVN0YXJ0KCl9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENsYXVkZSBDb2RlIGFnZW50IG1hcmtkb3duIHRvIENvZGV4IGFnZW50IGZvcm1hdC5cbiAqIEFwcGxpZXMgYmFzZSBtYXJrZG93biBjb252ZXJzaW9ucywgdGhlbiBhZGRzIGEgPGNvZGV4X2FnZW50X3JvbGU+IGhlYWRlclxuICogYW5kIGNsZWFucyB1cCBmcm9udG1hdHRlciAocmVtb3ZlcyB0b29scy9jb2xvciBmaWVsZHMpLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvZGV4QWdlbnQoY29udGVudCkge1xuICBsZXQgY29udmVydGVkID0gY29udmVydENsYXVkZVRvQ29kZXhNYXJrZG93bihjb250ZW50KTtcblxuICBjb25zdCB7IGZyb250bWF0dGVyLCBib2R5IH0gPSBleHRyYWN0RnJvbnRtYXR0ZXJBbmRCb2R5KGNvbnZlcnRlZCk7XG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBjb252ZXJ0ZWQ7XG5cbiAgY29uc3QgbmFtZSA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnbmFtZScpIHx8ICd1bmtub3duJztcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBleHRyYWN0RnJvbnRtYXR0ZXJGaWVsZChmcm9udG1hdHRlciwgJ2Rlc2NyaXB0aW9uJykgfHwgJyc7XG4gIGNvbnN0IHRvb2xzID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICd0b29scycpIHx8ICcnO1xuXG4gIGNvbnN0IHJvbGVIZWFkZXIgPSBgPGNvZGV4X2FnZW50X3JvbGU+XG5yb2xlOiAke25hbWV9XG50b29sczogJHt0b29sc31cbnB1cnBvc2U6ICR7dG9TaW5nbGVMaW5lKGRlc2NyaXB0aW9uKX1cbjwvY29kZXhfYWdlbnRfcm9sZT5gO1xuXG4gIGNvbnN0IGNsZWFuRnJvbnRtYXR0ZXIgPSBgLS0tXFxubmFtZTogJHt5YW1sUXVvdGUobmFtZSl9XFxuZGVzY3JpcHRpb246ICR7eWFtbFF1b3RlKHRvU2luZ2xlTGluZShkZXNjcmlwdGlvbikpfVxcbi0tLWA7XG5cbiAgcmV0dXJuIGAke2NsZWFuRnJvbnRtYXR0ZXJ9XFxuXFxuJHtyb2xlSGVhZGVyfVxcbiR7Ym9keX1gO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgcGVyLWFnZW50IC50b21sIGNvbmZpZyBmaWxlIGZvciBDb2RleC5cbiAqIFNldHMgc2FuZGJveF9tb2RlIGFuZCBkZXZlbG9wZXJfaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGFnZW50IG1hcmtkb3duIGJvZHkuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQ29kZXhBZ2VudFRvbWwoYWdlbnROYW1lLCBhZ2VudENvbnRlbnQpIHtcbiAgY29uc3Qgc2FuZGJveE1vZGUgPSBDT0RFWF9BR0VOVF9TQU5EQk9YW2FnZW50TmFtZV0gfHwgJ3JlYWQtb25seSc7XG4gIGNvbnN0IHsgYm9keSB9ID0gZXh0cmFjdEZyb250bWF0dGVyQW5kQm9keShhZ2VudENvbnRlbnQpO1xuICBjb25zdCBpbnN0cnVjdGlvbnMgPSBib2R5LnRyaW0oKTtcblxuICBjb25zdCBsaW5lcyA9IFtcbiAgICBgc2FuZGJveF9tb2RlID0gXCIke3NhbmRib3hNb2RlfVwiYCxcbiAgICAvLyBBZ2VudCBwcm9tcHRzIGNvbnRhaW4gcmF3IGJhY2tzbGFzaGVzIGluIHJlZ2V4ZXMgYW5kIHNoZWxsIHNuaXBwZXRzLlxuICAgIC8vIFRPTUwgbGl0ZXJhbCBtdWx0aWxpbmUgc3RyaW5ncyBwcmVzZXJ2ZSB0aGVtIHdpdGhvdXQgZXNjYXBlIHBhcnNpbmcuXG4gICAgYGRldmVsb3Blcl9pbnN0cnVjdGlvbnMgPSAnJydgLFxuICAgIGluc3RydWN0aW9ucyxcbiAgICBgJycnYCxcbiAgXTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbic7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIEVaX0FnZW50cyBjb25maWcgYmxvY2sgZm9yIENvZGV4IGNvbmZpZy50b21sLlxuICogQHBhcmFtIHtBcnJheTx7bmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nfT59IGFnZW50c1xuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUNvZGV4Q29uZmlnQmxvY2soYWdlbnRzKSB7XG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIEVaX0NPREVYX01BUktFUixcbiAgICAnJyxcbiAgXTtcblxuICBmb3IgKGNvbnN0IHsgbmFtZSwgZGVzY3JpcHRpb24gfSBvZiBhZ2VudHMpIHtcbiAgICBsaW5lcy5wdXNoKGBbYWdlbnRzLiR7bmFtZX1dYCk7XG4gICAgbGluZXMucHVzaChgZGVzY3JpcHRpb24gPSAke0pTT04uc3RyaW5naWZ5KGRlc2NyaXB0aW9uKX1gKTtcbiAgICBsaW5lcy5wdXNoKGBjb25maWdfZmlsZSA9IFwiYWdlbnRzLyR7bmFtZX0udG9tbFwiYCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogU3RyaXAgRVpfQWdlbnRzIHNlY3Rpb25zIGZyb20gQ29kZXggY29uZmlnLnRvbWwgY29udGVudC5cbiAqIFJldHVybnMgY2xlYW5lZCBjb250ZW50LCBvciBudWxsIGlmIGZpbGUgd291bGQgYmUgZW1wdHkuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwRXpBZ2VudHNGcm9tQ29kZXhDb25maWcoY29udGVudCkge1xuICBjb25zdCBtYXJrZXJJbmRleCA9IGNvbnRlbnQuaW5kZXhPZihFWl9DT0RFWF9NQVJLRVIpO1xuXG4gIGlmIChtYXJrZXJJbmRleCAhPT0gLTEpIHtcbiAgICAvLyBIYXMgRVpfQWdlbnRzIG1hcmtlciBcdTIwMTQgcmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSBtYXJrZXIgdG8gRU9GXG4gICAgbGV0IGJlZm9yZSA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIG1hcmtlckluZGV4KS50cmltRW5kKCk7XG4gICAgLy8gQWxzbyBzdHJpcCBFWi1pbmplY3RlZCBmZWF0dXJlIGtleXMgYWJvdmUgdGhlIG1hcmtlciAoQ2FzZSAzIGluamVjdClcbiAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXm11bHRpX2FnZW50XFxzKj1cXHMqdHJ1ZVxccypcXG4/L20sICcnKTtcbiAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXmRlZmF1bHRfbW9kZV9yZXF1ZXN0X3VzZXJfaW5wdXRcXHMqPVxccyp0cnVlXFxzKlxcbj8vbSwgJycpO1xuICAgIGJlZm9yZSA9IGJlZm9yZS5yZXBsYWNlKC9eXFxbZmVhdHVyZXNcXF1cXHMqXFxuKD89XFxbfCQpL20sICcnKTtcbiAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXFxuezMsfS9nLCAnXFxuXFxuJykudHJpbSgpO1xuICAgIGlmICghYmVmb3JlKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYmVmb3JlICsgJ1xcbic7XG4gIH1cblxuICAvLyBObyBtYXJrZXIgYnV0IG1heSBoYXZlIEVaLWluamVjdGVkIGZlYXR1cmUga2V5c1xuICBsZXQgY2xlYW5lZCA9IGNvbnRlbnQ7XG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL15tdWx0aV9hZ2VudFxccyo9XFxzKnRydWVcXHMqXFxuPy9tLCAnJyk7XG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL15kZWZhdWx0X21vZGVfcmVxdWVzdF91c2VyX2lucHV0XFxzKj1cXHMqdHJ1ZVxccypcXG4/L20sICcnKTtcblxuICAvLyBSZW1vdmUgW2FnZW50cy5lei0qXSBzZWN0aW9ucyAoZnJvbSBoZWFkZXIgdG8gbmV4dCBzZWN0aW9uIG9yIEVPRilcbiAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvXlxcW2FnZW50c1xcLmV6LVteXFxdXStcXF1cXG4oPzooPyFcXFspW15cXG5dKlxcbj8pKi9nbSwgJycpO1xuXG4gIC8vIFJlbW92ZSBbZmVhdHVyZXNdIHNlY3Rpb24gaWYgbm93IGVtcHR5IChvbmx5IGhlYWRlciwgbm8ga2V5cyBiZWZvcmUgbmV4dCBzZWN0aW9uKVxuICBjbGVhbmVkID0gY2xlYW5lZC5yZXBsYWNlKC9eXFxbZmVhdHVyZXNcXF1cXHMqXFxuKD89XFxbfCQpL20sICcnKTtcblxuICAvLyBSZW1vdmUgW2FnZW50c10gc2VjdGlvbiBpZiBub3cgZW1wdHlcbiAgY2xlYW5lZCA9IGNsZWFuZWQucmVwbGFjZSgvXlxcW2FnZW50c1xcXVxccypcXG4oPz1cXFt8JCkvbSwgJycpO1xuXG4gIC8vIENsZWFuIHVwIGV4Y2Vzc2l2ZSBibGFuayBsaW5lc1xuICBjbGVhbmVkID0gY2xlYW5lZC5yZXBsYWNlKC9cXG57Myx9L2csICdcXG5cXG4nKS50cmltKCk7XG5cbiAgaWYgKCFjbGVhbmVkKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGNsZWFuZWQgKyAnXFxuJztcbn1cblxuLyoqXG4gKiBNZXJnZSBFWl9BZ2VudHMgY29uZmlnIGJsb2NrIGludG8gYW4gZXhpc3Rpbmcgb3IgbmV3IGNvbmZpZy50b21sLlxuICogVGhyZWUgY2FzZXM6IG5ldyBmaWxlLCBleGlzdGluZyB3aXRoIEVaX0FnZW50cyBtYXJrZXIsIGV4aXN0aW5nIHdpdGhvdXQgbWFya2VyLlxuICovXG5mdW5jdGlvbiBtZXJnZUNvZGV4Q29uZmlnKGNvbmZpZ1BhdGgsIEVaX0FnZW50c0Jsb2NrKSB7XG4gIC8vIENhc2UgMTogTm8gY29uZmlnLnRvbWwgXHUyMDE0IGNyZWF0ZSBmcmVzaFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEVaX0FnZW50c0Jsb2NrICsgJ1xcbicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nID0gZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IG1hcmtlckluZGV4ID0gZXhpc3RpbmcuaW5kZXhPZihFWl9DT0RFWF9NQVJLRVIpO1xuXG4gIC8vIENhc2UgMjogSGFzIEVaX0FnZW50cyBtYXJrZXIgXHUyMDE0IHRydW5jYXRlIGFuZCByZS1hcHBlbmRcbiAgaWYgKG1hcmtlckluZGV4ICE9PSAtMSkge1xuICAgIGxldCBiZWZvcmUgPSBleGlzdGluZy5zdWJzdHJpbmcoMCwgbWFya2VySW5kZXgpLnRyaW1FbmQoKTtcbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICAvLyBTdHJpcCBhbnkgRVotbWFuYWdlZCBzZWN0aW9ucyB0aGF0IGxlYWtlZCBhYm92ZSB0aGUgbWFya2VyIGZyb20gcHJldmlvdXMgaW5zdGFsbHNcbiAgICAgIGJlZm9yZSA9IGJlZm9yZS5yZXBsYWNlKC9eXFxbYWdlbnRzXFwuZXotW15cXF1dK1xcXVxcbig/Oig/IVxcWylbXlxcbl0qXFxuPykqL2dtLCAnJyk7XG4gICAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXlxcW2FnZW50c1xcXVxcbig/Oig/IVxcWylbXlxcbl0qXFxuPykqL20sICcnKTtcbiAgICAgIGJlZm9yZSA9IGJlZm9yZS5yZXBsYWNlKC9cXG57Myx9L2csICdcXG5cXG4nKS50cmltRW5kKCk7XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgYmVmb3JlICsgJ1xcblxcbicgKyBFWl9BZ2VudHNCbG9jayArICdcXG4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBFWl9BZ2VudHNCbG9jayArICdcXG4nKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ2FzZSAzOiBObyBtYXJrZXIgXHUyMDE0IGFwcGVuZCBFWl9BZ2VudHMgYmxvY2tcbiAgbGV0IGNvbnRlbnQgPSBleGlzdGluZztcbiAgY29udGVudCA9IGNvbnRlbnQudHJpbUVuZCgpICsgJ1xcblxcbicgKyBFWl9BZ2VudHNCbG9jayArICdcXG4nO1xuXG4gIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgY29udGVudCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRDb3BpbG90SW5zdHJ1Y3Rpb25zTWFya2VyUGFpcihjb250ZW50OiBzdHJpbmcpOiB7IG9wZW5JbmRleDogbnVtYmVyOyBjbG9zZUluZGV4OiBudW1iZXI7IGNsb3NlTWFya2VyOiBzdHJpbmcgfSB8IG51bGwge1xuICBjb25zdCBtYXJrZXJQYWlyczogW3N0cmluZywgc3RyaW5nXVtdID0gW1xuICAgIFtFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIsIEVaX0NPUElMT1RfSU5TVFJVQ1RJT05TX0NMT1NFX01BUktFUl0sXG4gICAgW0xFR0FDWV9FWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIsIExFR0FDWV9FWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19DTE9TRV9NQVJLRVJdLFxuICBdO1xuXG4gIGZvciAoY29uc3QgW29wZW5NYXJrZXIsIGNsb3NlTWFya2VyXSBvZiBtYXJrZXJQYWlycykge1xuICAgIGNvbnN0IG9wZW5JbmRleCA9IGNvbnRlbnQuaW5kZXhPZihvcGVuTWFya2VyKTtcbiAgICBjb25zdCBjbG9zZUluZGV4ID0gY29udGVudC5pbmRleE9mKGNsb3NlTWFya2VyKTtcbiAgICBpZiAob3BlbkluZGV4ICE9PSAtMSAmJiBjbG9zZUluZGV4ICE9PSAtMSAmJiBjbG9zZUluZGV4ID49IG9wZW5JbmRleCkge1xuICAgICAgcmV0dXJuIHsgb3BlbkluZGV4LCBjbG9zZUluZGV4LCBjbG9zZU1hcmtlciB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIE1lcmdlIEVaX0FnZW50cyBpbnN0cnVjdGlvbnMgaW50byBjb3BpbG90LWluc3RydWN0aW9ucy5tZC5cbiAqIFRocmVlIGNhc2VzOiBuZXcgZmlsZSwgZXhpc3Rpbmcgd2l0aCBtYXJrZXJzLCBleGlzdGluZyB3aXRob3V0IG1hcmtlcnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggLSBGdWxsIHBhdGggdG8gY29waWxvdC1pbnN0cnVjdGlvbnMubWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBFWl9BZ2VudHNDb250ZW50IC0gVGVtcGxhdGUgY29udGVudCAod2l0aG91dCBtYXJrZXJzKVxuICovXG5mdW5jdGlvbiBtZXJnZUNvcGlsb3RJbnN0cnVjdGlvbnMoZmlsZVBhdGgsIEVaX0FnZW50c0NvbnRlbnQpIHtcbiAgY29uc3QgRVpfQWdlbnRzQmxvY2sgPSBFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19NQVJLRVIgKyAnXFxuJyArXG4gICAgRVpfQWdlbnRzQ29udGVudC50cmltKCkgKyAnXFxuJyArXG4gICAgRVpfQ09QSUxPVF9JTlNUUlVDVElPTlNfQ0xPU0VfTUFSS0VSO1xuXG4gIC8vIENhc2UgMTogTm8gZmlsZSBcdTIwMTQgY3JlYXRlIGZyZXNoXG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBFWl9BZ2VudHNCbG9jayArICdcXG4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgbWFya2VyTWF0Y2ggPSBmaW5kQ29waWxvdEluc3RydWN0aW9uc01hcmtlclBhaXIoZXhpc3RpbmcpO1xuXG4gIC8vIENhc2UgMjogSGFzIEVaX0FnZW50cyBtYXJrZXJzIFx1MjAxNCByZXBsYWNlIGJldHdlZW4gbWFya2Vyc1xuICBpZiAobWFya2VyTWF0Y2gpIHtcbiAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5zdWJzdHJpbmcoMCwgbWFya2VyTWF0Y2gub3BlbkluZGV4KS50cmltRW5kKCk7XG4gICAgY29uc3QgYWZ0ZXIgPSBleGlzdGluZy5zdWJzdHJpbmcobWFya2VyTWF0Y2guY2xvc2VJbmRleCArIG1hcmtlck1hdGNoLmNsb3NlTWFya2VyLmxlbmd0aCkudHJpbVN0YXJ0KCk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSAnJztcbiAgICBpZiAoYmVmb3JlKSBuZXdDb250ZW50ICs9IGJlZm9yZSArICdcXG5cXG4nO1xuICAgIG5ld0NvbnRlbnQgKz0gRVpfQWdlbnRzQmxvY2s7XG4gICAgaWYgKGFmdGVyKSBuZXdDb250ZW50ICs9ICdcXG5cXG4nICsgYWZ0ZXI7XG4gICAgbmV3Q29udGVudCArPSAnXFxuJztcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDYXNlIDM6IE5vIG1hcmtlcnMgXHUyMDE0IGFwcGVuZCBhdCBlbmRcbiAgY29uc3QgY29udGVudCA9IGV4aXN0aW5nLnRyaW1FbmQoKSArICdcXG5cXG4nICsgRVpfQWdlbnRzQmxvY2sgKyAnXFxuJztcbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgY29udGVudCk7XG59XG5cbi8qKlxuICogU3RyaXAgRVpfQWdlbnRzIHNlY3Rpb24gZnJvbSBjb3BpbG90LWluc3RydWN0aW9ucy5tZCBjb250ZW50LlxuICogUmV0dXJucyBjbGVhbmVkIGNvbnRlbnQsIG9yIG51bGwgaWYgZmlsZSBzaG91bGQgYmUgZGVsZXRlZCAod2FzIEVaLW9ubHkpLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBGaWxlIGNvbnRlbnRcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gLSBDbGVhbmVkIGNvbnRlbnQgb3IgbnVsbCBpZiBlbXB0eVxuICovXG5mdW5jdGlvbiBzdHJpcEV6QWdlbnRzRnJvbUNvcGlsb3RJbnN0cnVjdGlvbnMoY29udGVudCkge1xuICBjb25zdCBtYXJrZXJNYXRjaCA9IGZpbmRDb3BpbG90SW5zdHJ1Y3Rpb25zTWFya2VyUGFpcihjb250ZW50KTtcblxuICBpZiAobWFya2VyTWF0Y2gpIHtcbiAgICBjb25zdCBiZWZvcmUgPSBjb250ZW50LnN1YnN0cmluZygwLCBtYXJrZXJNYXRjaC5vcGVuSW5kZXgpLnRyaW1FbmQoKTtcbiAgICBjb25zdCBhZnRlciA9IGNvbnRlbnQuc3Vic3RyaW5nKG1hcmtlck1hdGNoLmNsb3NlSW5kZXggKyBtYXJrZXJNYXRjaC5jbG9zZU1hcmtlci5sZW5ndGgpLnRyaW1TdGFydCgpO1xuICAgIGNvbnN0IGNsZWFuZWQgPSAoYmVmb3JlICsgKGJlZm9yZSAmJiBhZnRlciA/ICdcXG5cXG4nIDogJycpICsgYWZ0ZXIpLnRyaW0oKTtcbiAgICBpZiAoIWNsZWFuZWQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBjbGVhbmVkICsgJ1xcbic7XG4gIH1cblxuICAvLyBObyBtYXJrZXJzIGZvdW5kIFx1MjAxNCBub3RoaW5nIHRvIHN0cmlwXG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGNvbmZpZy50b21sIGFuZCBwZXItYWdlbnQgLnRvbWwgZmlsZXMgZm9yIENvZGV4LlxuICogUmVhZHMgYWdlbnQgLm1kIGZpbGVzIGZyb20gc291cmNlLCBleHRyYWN0cyBtZXRhZGF0YSwgd3JpdGVzIC50b21sIGNvbmZpZ3MuXG4gKi9cbmZ1bmN0aW9uIGluc3RhbGxDb2RleENvbmZpZyh0YXJnZXREaXI6IHN0cmluZywgYWdlbnRzU3JjOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvbmZpZy50b21sJyk7XG4gIGNvbnN0IGFnZW50c1RvbWxEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnYWdlbnRzJyk7XG4gIGZzLm1rZGlyU3luYyhhZ2VudHNUb21sRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBhZ2VudEVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhhZ2VudHNTcmMpLmZpbHRlcihmID0+IGYuc3RhcnRzV2l0aCgnZXotJykgJiYgZi5lbmRzV2l0aCgnLm1kJykpO1xuICBjb25zdCBhZ2VudHM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0+ID0gW107XG5cbiAgLy8gQ29tcHV0ZSB0aGUgQ29kZXggcGF0aFByZWZpeCBmb3IgcmVwbGFjaW5nIC5jbGF1ZGUgcGF0aHNcbiAgLy8gVXNlIHRpbGRlLWJhc2VkIHBhdGggdG8gYXZvaWQgYmFraW5nIGFic29sdXRlIHBhdGhzIGludG8gdGVtcGxhdGVzXG4gIGNvbnN0IGNvZGV4UGF0aFByZWZpeCA9IGAke3RhcmdldERpci5yZXBsYWNlKC9cXFxcL2csICcvJykucmVwbGFjZShvcy5ob21lZGlyKCkucmVwbGFjZSgvXFxcXC9nLCAnLycpLCAnficpfS9gO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhZ2VudEVudHJpZXMpIHtcbiAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oYWdlbnRzU3JjLCBmaWxlKSwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIC5jbGF1ZGUgcGF0aHMgYmVmb3JlIGdlbmVyYXRpbmcgVE9NTCAoc291cmNlIGZpbGVzIHVzZSB+Ly5jbGF1ZGUgYW5kICRIT01FLy5jbGF1ZGUpXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvflxcL1xcLmNsYXVkZVxcLy9nLCBjb2RleFBhdGhQcmVmaXgpO1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZywgdG9Ib21lUHJlZml4KGNvZGV4UGF0aFByZWZpeCkpO1xuICAgIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IGV4dHJhY3RGcm9udG1hdHRlckFuZEJvZHkoY29udGVudCk7XG4gICAgY29uc3QgbmFtZSA9IGV4dHJhY3RGcm9udG1hdHRlckZpZWxkKGZyb250bWF0dGVyLCAnbmFtZScpIHx8IGZpbGUucmVwbGFjZSgnLm1kJywgJycpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZXh0cmFjdEZyb250bWF0dGVyRmllbGQoZnJvbnRtYXR0ZXIsICdkZXNjcmlwdGlvbicpIHx8ICcnO1xuXG4gICAgYWdlbnRzLnB1c2goeyBuYW1lLCBkZXNjcmlwdGlvbjogdG9TaW5nbGVMaW5lKGRlc2NyaXB0aW9uKSB9KTtcblxuICAgIGNvbnN0IHRvbWxDb250ZW50ID0gZ2VuZXJhdGVDb2RleEFnZW50VG9tbChuYW1lLCBjb250ZW50KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihhZ2VudHNUb21sRGlyLCBgJHtuYW1lfS50b21sYCksIHRvbWxDb250ZW50KTtcbiAgfVxuXG4gIGNvbnN0IEVaX0FnZW50c0Jsb2NrID0gZ2VuZXJhdGVDb2RleENvbmZpZ0Jsb2NrKGFnZW50cyk7XG4gIG1lcmdlQ29kZXhDb25maWcoY29uZmlnUGF0aCwgRVpfQWdlbnRzQmxvY2spO1xuXG4gIHJldHVybiBhZ2VudHMubGVuZ3RoO1xufVxuXG4vKipcbiAqIFN0cmlwIEhUTUwgPHN1Yj4gdGFncyBmb3IgR2VtaW5pIENMSSBvdXRwdXRcbiAqIFRlcm1pbmFscyBkb24ndCBzdXBwb3J0IHN1YnNjcmlwdCBcdTIwMTQgR2VtaW5pIHJlbmRlcnMgdGhlc2UgYXMgcmF3IEhUTUwuXG4gKiBDb252ZXJ0cyA8c3ViPnRleHQ8L3N1Yj4gdG8gaXRhbGljICoodGV4dCkqIGZvciByZWFkYWJsZSB0ZXJtaW5hbCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwU3ViVGFncyhjb250ZW50KSB7XG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UoLzxzdWI+KC4qPyk8XFwvc3ViPi9nLCAnKigkMSkqJyk7XG59XG5cbi8qKlxuICogQ29udmVydCBDbGF1ZGUgQ29kZSBhZ2VudCBmcm9udG1hdHRlciB0byBHZW1pbmkgQ0xJIGZvcm1hdFxuICogR2VtaW5pIGFnZW50cyB1c2UgLm1kIGZpbGVzIHdpdGggWUFNTCBmcm9udG1hdHRlciwgc2FtZSBhcyBDbGF1ZGUsXG4gKiBidXQgd2l0aCBkaWZmZXJlbnQgZmllbGQgbmFtZXMgYW5kIGZvcm1hdHM6XG4gKiAtIHRvb2xzOiBtdXN0IGJlIGEgWUFNTCBhcnJheSAobm90IGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcpXG4gKiAtIHRvb2wgbmFtZXM6IG11c3QgdXNlIEdlbWluaSBidWlsdC1pbiBuYW1lcyAocmVhZF9maWxlLCBub3QgUmVhZClcbiAqIC0gY29sb3I6IG11c3QgYmUgcmVtb3ZlZCAoY2F1c2VzIHZhbGlkYXRpb24gZXJyb3IpXG4gKiAtIHNraWxsczogbXVzdCBiZSByZW1vdmVkIChjYXVzZXMgdmFsaWRhdGlvbiBlcnJvcilcbiAqIC0gbWNwX18qIHRvb2xzOiBtdXN0IGJlIGV4Y2x1ZGVkIChhdXRvLWRpc2NvdmVyZWQgYXQgcnVudGltZSlcbiAqL1xuZnVuY3Rpb24gY29udmVydENsYXVkZVRvR2VtaW5pQWdlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50LnN0YXJ0c1dpdGgoJy0tLScpKSByZXR1cm4gY29udGVudDtcblxuICBjb25zdCBlbmRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZignLS0tJywgMyk7XG4gIGlmIChlbmRJbmRleCA9PT0gLTEpIHJldHVybiBjb250ZW50O1xuXG4gIGNvbnN0IGZyb250bWF0dGVyID0gY29udGVudC5zdWJzdHJpbmcoMywgZW5kSW5kZXgpLnRyaW0oKTtcbiAgY29uc3QgYm9keSA9IGNvbnRlbnQuc3Vic3RyaW5nKGVuZEluZGV4ICsgMyk7XG5cbiAgY29uc3QgbGluZXMgPSBmcm9udG1hdHRlci5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IG5ld0xpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaW5BbGxvd2VkVG9vbHMgPSBmYWxzZTtcbiAgbGV0IGluU2tpcHBlZEFycmF5RmllbGQgPSBmYWxzZTtcbiAgY29uc3QgdG9vbHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuXG4gICAgaWYgKGluU2tpcHBlZEFycmF5RmllbGQpIHtcbiAgICAgIGlmICghdHJpbW1lZCB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoJy0gJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpblNraXBwZWRBcnJheUZpZWxkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBhbGxvd2VkLXRvb2xzIFlBTUwgYXJyYXkgdG8gdG9vbHMgbGlzdFxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ2FsbG93ZWQtdG9vbHM6JykpIHtcbiAgICAgIGluQWxsb3dlZFRvb2xzID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbmxpbmUgdG9vbHM6IGZpZWxkIChjb21tYS1zZXBhcmF0ZWQgc3RyaW5nKVxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ3Rvb2xzOicpKSB7XG4gICAgICBjb25zdCB0b29sc1ZhbHVlID0gdHJpbW1lZC5zdWJzdHJpbmcoNikudHJpbSgpO1xuICAgICAgaWYgKHRvb2xzVmFsdWUpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gdG9vbHNWYWx1ZS5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKS5maWx0ZXIodCA9PiB0KTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHBhcnNlZCkge1xuICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IGNvbnZlcnRHZW1pbmlUb29sTmFtZSh0KTtcbiAgICAgICAgICBpZiAobWFwcGVkKSB0b29scy5wdXNoKG1hcHBlZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRvb2xzOiB3aXRoIG5vIHZhbHVlIG1lYW5zIFlBTUwgYXJyYXkgZm9sbG93c1xuICAgICAgICBpbkFsbG93ZWRUb29scyA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBTdHJpcCBjb2xvciBmaWVsZCAobm90IHN1cHBvcnRlZCBieSBHZW1pbmkgQ0xJLCBjYXVzZXMgdmFsaWRhdGlvbiBlcnJvcilcbiAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCdjb2xvcjonKSkgY29udGludWU7XG5cbiAgICAvLyBTdHJpcCBza2lsbHMgZmllbGQgKG5vdCBzdXBwb3J0ZWQgYnkgR2VtaW5pIENMSSwgY2F1c2VzIHZhbGlkYXRpb24gZXJyb3IpXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnc2tpbGxzOicpKSB7XG4gICAgICBpblNraXBwZWRBcnJheUZpZWxkID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3QgYWxsb3dlZC10b29scy90b29scyBhcnJheSBpdGVtc1xuICAgIGlmIChpbkFsbG93ZWRUb29scykge1xuICAgICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnLSAnKSkge1xuICAgICAgICBjb25zdCBtYXBwZWQgPSBjb252ZXJ0R2VtaW5pVG9vbE5hbWUodHJpbW1lZC5zdWJzdHJpbmcoMikudHJpbSgpKTtcbiAgICAgICAgaWYgKG1hcHBlZCkgdG9vbHMucHVzaChtYXBwZWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAodHJpbW1lZCAmJiAhdHJpbW1lZC5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgaW5BbGxvd2VkVG9vbHMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWluQWxsb3dlZFRvb2xzKSB7XG4gICAgICBuZXdMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB0b29scyBhcyBZQU1MIGFycmF5IChHZW1pbmkgcmVxdWlyZXMgYXJyYXkgZm9ybWF0KVxuICBpZiAodG9vbHMubGVuZ3RoID4gMCkge1xuICAgIG5ld0xpbmVzLnB1c2goJ3Rvb2xzOicpO1xuICAgIGZvciAoY29uc3QgdG9vbCBvZiB0b29scykge1xuICAgICAgbmV3TGluZXMucHVzaChgICAtICR7dG9vbH1gKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXdGcm9udG1hdHRlciA9IG5ld0xpbmVzLmpvaW4oJ1xcbicpLnRyaW0oKTtcblxuICAvLyBFc2NhcGUgJHtWQVJ9IHBhdHRlcm5zIGluIGFnZW50IGJvZHkgZm9yIEdlbWluaSBDTEkgY29tcGF0aWJpbGl0eS5cbiAgLy8gR2VtaW5pJ3MgdGVtcGxhdGVTdHJpbmcoKSB0cmVhdHMgYWxsICR7d29yZH0gcGF0dGVybnMgYXMgdGVtcGxhdGUgdmFyaWFibGVzXG4gIC8vIGFuZCB0aHJvd3MgXCJUZW1wbGF0ZSB2YWxpZGF0aW9uIGZhaWxlZDogTWlzc2luZyByZXF1aXJlZCBpbnB1dCBwYXJhbWV0ZXJzXCJcbiAgLy8gd2hlbiB0aGV5IGNhbid0IGJlIHJlc29sdmVkLiBFWl9BZ2VudHMgYWdlbnRzIHVzZSAke1BIQVNFfSwgJHtQTEFOfSwgZXRjLiBhc1xuICAvLyBzaGVsbCB2YXJpYWJsZXMgaW4gYmFzaCBjb2RlIGJsb2NrcyBcdTIwMTQgY29udmVydCB0byAkVkFSIChubyBicmFjZXMpIHdoaWNoXG4gIC8vIGlzIGVxdWl2YWxlbnQgYmFzaCBhbmQgaW52aXNpYmxlIHRvIEdlbWluaSdzIC9cXCRcXHsoXFx3KylcXH0vZyByZWdleC5cbiAgY29uc3QgZXNjYXBlZEJvZHkgPSBib2R5LnJlcGxhY2UoL1xcJFxceyhcXHcrKVxcfS9nLCAnJCQkMScpO1xuXG4gIHJldHVybiBgLS0tXFxuJHtuZXdGcm9udG1hdHRlcn1cXG4tLS0ke3N0cmlwU3ViVGFncyhlc2NhcGVkQm9keSl9YDtcbn1cblxuZnVuY3Rpb24gY29udmVydENsYXVkZVRvT3BlbmNvZGVGcm9udG1hdHRlcihjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZXBsYWNlIHRvb2wgbmFtZSByZWZlcmVuY2VzIGluIGNvbnRlbnQgKGFwcGxpZXMgdG8gYWxsIGZpbGVzKVxuICBsZXQgY29udmVydGVkQ29udGVudCA9IGNvbnRlbnQ7XG4gIGNvbnZlcnRlZENvbnRlbnQgPSBjb252ZXJ0ZWRDb250ZW50LnJlcGxhY2UoL1xcYkFza1VzZXJRdWVzdGlvblxcYi9nLCAncXVlc3Rpb24nKTtcbiAgY29udmVydGVkQ29udGVudCA9IGNvbnZlcnRlZENvbnRlbnQucmVwbGFjZSgvXFxiU2xhc2hDb21tYW5kXFxiL2csICdza2lsbCcpO1xuICBjb252ZXJ0ZWRDb250ZW50ID0gY29udmVydGVkQ29udGVudC5yZXBsYWNlKC9cXGJUb2RvV3JpdGVcXGIvZywgJ3RvZG93cml0ZScpO1xuICAvLyBSZXBsYWNlIC9lejpjb21tYW5kIHdpdGggL2V6LWNvbW1hbmQgZm9yIG9wZW5jb2RlIChmbGF0IGNvbW1hbmQgc3RydWN0dXJlKVxuICBjb252ZXJ0ZWRDb250ZW50ID0gY29udmVydGVkQ29udGVudC5yZXBsYWNlKC9cXC9lejovZywgJy9lei0nKTtcbiAgLy8gUmVwbGFjZSB+Ly5jbGF1ZGUgYW5kICRIT01FLy5jbGF1ZGUgd2l0aCBPcGVuQ29kZSdzIGNvbmZpZyBsb2NhdGlvblxuICBjb252ZXJ0ZWRDb250ZW50ID0gY29udmVydGVkQ29udGVudC5yZXBsYWNlKC9+XFwvXFwuY2xhdWRlXFxiL2csICd+Ly5jb25maWcvb3BlbmNvZGUnKTtcbiAgY29udmVydGVkQ29udGVudCA9IGNvbnZlcnRlZENvbnRlbnQucmVwbGFjZSgvXFwkSE9NRVxcL1xcLmNsYXVkZVxcYi9nLCAnJEhPTUUvLmNvbmZpZy9vcGVuY29kZScpO1xuICAvLyBSZXBsYWNlIGdlbmVyYWwtcHVycG9zZSBzdWJhZ2VudCB0eXBlIHdpdGggT3BlbkNvZGUncyBlcXVpdmFsZW50IFwiZ2VuZXJhbFwiXG4gIGNvbnZlcnRlZENvbnRlbnQgPSBjb252ZXJ0ZWRDb250ZW50LnJlcGxhY2UoL3N1YmFnZW50X3R5cGU9XCJnZW5lcmFsLXB1cnBvc2VcIi9nLCAnc3ViYWdlbnRfdHlwZT1cImdlbmVyYWxcIicpO1xuXG4gIC8vIENoZWNrIGlmIGNvbnRlbnQgaGFzIGZyb250bWF0dGVyXG4gIGlmICghY29udmVydGVkQ29udGVudC5zdGFydHNXaXRoKCctLS0nKSkge1xuICAgIHJldHVybiBjb252ZXJ0ZWRDb250ZW50O1xuICB9XG5cbiAgLy8gRmluZCB0aGUgZW5kIG9mIGZyb250bWF0dGVyXG4gIGNvbnN0IGVuZEluZGV4ID0gY29udmVydGVkQ29udGVudC5pbmRleE9mKCctLS0nLCAzKTtcbiAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBjb252ZXJ0ZWRDb250ZW50O1xuICB9XG5cbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBjb252ZXJ0ZWRDb250ZW50LnN1YnN0cmluZygzLCBlbmRJbmRleCkudHJpbSgpO1xuICBjb25zdCBib2R5ID0gY29udmVydGVkQ29udGVudC5zdWJzdHJpbmcoZW5kSW5kZXggKyAzKTtcblxuICAvLyBQYXJzZSBmcm9udG1hdHRlciBsaW5lIGJ5IGxpbmUgKHNpbXBsZSBZQU1MIHBhcnNpbmcpXG4gIGNvbnN0IGxpbmVzID0gZnJvbnRtYXR0ZXIuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBuZXdMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGluQWxsb3dlZFRvb2xzID0gZmFsc2U7XG4gIGNvbnN0IGFsbG93ZWRUb29sczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG5cbiAgICAvLyBEZXRlY3Qgc3RhcnQgb2YgYWxsb3dlZC10b29scyBhcnJheVxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ2FsbG93ZWQtdG9vbHM6JykpIHtcbiAgICAgIGluQWxsb3dlZFRvb2xzID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERldGVjdCBpbmxpbmUgdG9vbHM6IGZpZWxkIChjb21tYS1zZXBhcmF0ZWQgc3RyaW5nKVxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ3Rvb2xzOicpKSB7XG4gICAgICBjb25zdCB0b29sc1ZhbHVlID0gdHJpbW1lZC5zdWJzdHJpbmcoNikudHJpbSgpO1xuICAgICAgaWYgKHRvb2xzVmFsdWUpIHtcbiAgICAgICAgLy8gUGFyc2UgY29tbWEtc2VwYXJhdGVkIHRvb2xzXG4gICAgICAgIGNvbnN0IHRvb2xzID0gdG9vbHNWYWx1ZS5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKS5maWx0ZXIodCA9PiB0KTtcbiAgICAgICAgYWxsb3dlZFRvb2xzLnB1c2goLi4udG9vbHMpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIG5hbWU6IGZpZWxkIC0gb3BlbmNvZGUgdXNlcyBmaWxlbmFtZSBmb3IgY29tbWFuZCBuYW1lXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnbmFtZTonKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBjb2xvciBuYW1lcyB0byBoZXggZm9yIG9wZW5jb2RlXG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnY29sb3I6JykpIHtcbiAgICAgIGNvbnN0IGNvbG9yVmFsdWUgPSB0cmltbWVkLnN1YnN0cmluZyg2KS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGhleENvbG9yID0gY29sb3JOYW1lVG9IZXhbY29sb3JWYWx1ZV07XG4gICAgICBpZiAoaGV4Q29sb3IpIHtcbiAgICAgICAgbmV3TGluZXMucHVzaChgY29sb3I6IFwiJHtoZXhDb2xvcn1cImApO1xuICAgICAgfSBlbHNlIGlmIChjb2xvclZhbHVlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICAvLyBWYWxpZGF0ZSBoZXggY29sb3IgZm9ybWF0ICgjUkdCIG9yICNSUkdHQkIpXG4gICAgICAgIGlmICgvXiNbMC05YS1mXXszfSR8XiNbMC05YS1mXXs2fSQvaS50ZXN0KGNvbG9yVmFsdWUpKSB7XG4gICAgICAgICAgLy8gQWxyZWFkeSBoZXggYW5kIHZhbGlkLCBrZWVwIGFzIGlzXG4gICAgICAgICAgbmV3TGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTa2lwIGludmFsaWQgaGV4IGNvbG9yc1xuICAgICAgfVxuICAgICAgLy8gU2tpcCB1bmtub3duIGNvbG9yIG5hbWVzXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBDb2xsZWN0IGFsbG93ZWQtdG9vbHMgaXRlbXNcbiAgICBpZiAoaW5BbGxvd2VkVG9vbHMpIHtcbiAgICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJy0gJykpIHtcbiAgICAgICAgYWxsb3dlZFRvb2xzLnB1c2godHJpbW1lZC5zdWJzdHJpbmcoMikudHJpbSgpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWQgJiYgIXRyaW1tZWQuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIC8vIEVuZCBvZiBhcnJheSwgbmV3IGZpZWxkIHN0YXJ0ZWRcbiAgICAgICAgaW5BbGxvd2VkVG9vbHMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBLZWVwIG90aGVyIGZpZWxkcyAoaW5jbHVkaW5nIG5hbWU6IHdoaWNoIG9wZW5jb2RlIGlnbm9yZXMpXG4gICAgaWYgKCFpbkFsbG93ZWRUb29scykge1xuICAgICAgbmV3TGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgdG9vbHMgb2JqZWN0IGlmIHdlIGhhZCBhbGxvd2VkLXRvb2xzIG9yIHRvb2xzXG4gIGlmIChhbGxvd2VkVG9vbHMubGVuZ3RoID4gMCkge1xuICAgIG5ld0xpbmVzLnB1c2goJ3Rvb2xzOicpO1xuICAgIGZvciAoY29uc3QgdG9vbCBvZiBhbGxvd2VkVG9vbHMpIHtcbiAgICAgIG5ld0xpbmVzLnB1c2goYCAgJHtjb252ZXJ0VG9vbE5hbWUodG9vbCl9OiB0cnVlYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVidWlsZCBmcm9udG1hdHRlciAoYm9keSBhbHJlYWR5IGhhcyB0b29sIG5hbWVzIGNvbnZlcnRlZClcbiAgY29uc3QgbmV3RnJvbnRtYXR0ZXIgPSBuZXdMaW5lcy5qb2luKCdcXG4nKS50cmltKCk7XG4gIHJldHVybiBgLS0tXFxuJHtuZXdGcm9udG1hdHRlcn1cXG4tLS0ke2JvZHl9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENsYXVkZSBDb2RlIG1hcmtkb3duIGNvbW1hbmQgdG8gR2VtaW5pIFRPTUwgZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIE1hcmtkb3duIGZpbGUgY29udGVudCB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVE9NTCBjb250ZW50XG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRDbGF1ZGVUb0dlbWluaVRvbWwoY29udGVudCkge1xuICAvLyBDaGVjayBpZiBjb250ZW50IGhhcyBmcm9udG1hdHRlclxuICBpZiAoIWNvbnRlbnQuc3RhcnRzV2l0aCgnLS0tJykpIHtcbiAgICByZXR1cm4gYHByb21wdCA9ICR7SlNPTi5zdHJpbmdpZnkoY29udGVudCl9XFxuYDtcbiAgfVxuXG4gIGNvbnN0IGVuZEluZGV4ID0gY29udGVudC5pbmRleE9mKCctLS0nLCAzKTtcbiAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBgcHJvbXB0ID0gJHtKU09OLnN0cmluZ2lmeShjb250ZW50KX1cXG5gO1xuICB9XG5cbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBjb250ZW50LnN1YnN0cmluZygzLCBlbmRJbmRleCkudHJpbSgpO1xuICBjb25zdCBib2R5ID0gY29udGVudC5zdWJzdHJpbmcoZW5kSW5kZXggKyAzKS50cmltKCk7XG4gIFxuICAvLyBFeHRyYWN0IGRlc2NyaXB0aW9uIGZyb20gZnJvbnRtYXR0ZXJcbiAgbGV0IGRlc2NyaXB0aW9uID0gJyc7XG4gIGNvbnN0IGxpbmVzID0gZnJvbnRtYXR0ZXIuc3BsaXQoJ1xcbicpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnZGVzY3JpcHRpb246JykpIHtcbiAgICAgIGRlc2NyaXB0aW9uID0gdHJpbW1lZC5zdWJzdHJpbmcoMTIpLnRyaW0oKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbnN0cnVjdCBUT01MXG4gIGxldCB0b21sID0gJyc7XG4gIGlmIChkZXNjcmlwdGlvbikge1xuICAgIHRvbWwgKz0gYGRlc2NyaXB0aW9uID0gJHtKU09OLnN0cmluZ2lmeShkZXNjcmlwdGlvbil9XFxuYDtcbiAgfVxuICBcbiAgdG9tbCArPSBgcHJvbXB0ID0gJHtKU09OLnN0cmluZ2lmeShib2R5KX1cXG5gO1xuICBcbiAgcmV0dXJuIHRvbWw7XG59XG5cbi8qKlxuICogQ29weSBjb21tYW5kcyB0byBhIGZsYXQgc3RydWN0dXJlIGZvciBPcGVuQ29kZVxuICogT3BlbkNvZGUgZXhwZWN0czogY29tbWFuZC9lei1oZWxwLm1kIChpbnZva2VkIGFzIC9lei1oZWxwKVxuICogU291cmNlIHN0cnVjdHVyZTogY29tbWFuZHMvZXovaGVscC5tZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNEaXIgLSBTb3VyY2UgZGlyZWN0b3J5IChlLmcuLCBjb21tYW5kcy9lei8pXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdERpciAtIERlc3RpbmF0aW9uIGRpcmVjdG9yeSAoZS5nLiwgY29tbWFuZC8pXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IC0gUHJlZml4IGZvciBmaWxlbmFtZXMgKGUuZy4sICdleicpXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFByZWZpeCAtIFBhdGggcHJlZml4IGZvciBmaWxlIHJlZmVyZW5jZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gVGFyZ2V0IHJ1bnRpbWUgKCdjbGF1ZGUnIG9yICdvcGVuY29kZScpXG4gKi9cbmZ1bmN0aW9uIGNvcHlGbGF0dGVuZWRDb21tYW5kcyhzcmNEaXIsIGRlc3REaXIsIHByZWZpeCwgcGF0aFByZWZpeCwgcnVudGltZSkge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc3JjRGlyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJlbW92ZSBvbGQgZXotKi5tZCBmaWxlcyBiZWZvcmUgY29weWluZyBuZXcgb25lc1xuICBpZiAoZnMuZXhpc3RzU3luYyhkZXN0RGlyKSkge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyhkZXN0RGlyKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aChgJHtwcmVmaXh9LWApICYmIGZpbGUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGRlc3REaXIsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZnMubWtkaXJTeW5jKGRlc3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHNyY0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oc3JjRGlyLCBlbnRyeS5uYW1lKTtcblxuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAvLyBSZWN1cnNlIGludG8gc3ViZGlyZWN0b3JpZXMsIGFkZGluZyB0byBwcmVmaXhcbiAgICAgIC8vIGUuZy4sIGNvbW1hbmRzL2V6L2RlYnVnL3N0YXJ0Lm1kIC0+IGNvbW1hbmQvZXotZGVidWctc3RhcnQubWRcbiAgICAgIGNvcHlGbGF0dGVuZWRDb21tYW5kcyhzcmNQYXRoLCBkZXN0RGlyLCBgJHtwcmVmaXh9LSR7ZW50cnkubmFtZX1gLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAvLyBGbGF0dGVuOiBoZWxwLm1kIC0+IGV6LWhlbHAubWRcbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZW50cnkubmFtZS5yZXBsYWNlKCcubWQnLCAnJyk7XG4gICAgICBjb25zdCBkZXN0TmFtZSA9IGAke3ByZWZpeH0tJHtiYXNlTmFtZX0ubWRgO1xuICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdERpciwgZGVzdE5hbWUpO1xuXG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcmNQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4ID0gL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBvcGVuY29kZURpclJlZ2V4ID0gL35cXC9cXC5vcGVuY29kZVxcLy9nO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UobG9jYWxDbGF1ZGVSZWdleCwgYC4vJHtnZXREaXJOYW1lKHJ1bnRpbWUpfS9gKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2Uob3BlbmNvZGVEaXJSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9PcGVuY29kZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb3B5IEVaIEFnZW50cyBza2lsbHMgdG8gZ2xvYmFsIHNraWxscyBkaXJlY3RvcnlcbiAqIFNraWxscyBhcmUgaW5zdGFsbGVkIHRvICRIT01FLy5za2lsbHMvZXotYWdlbnRzLyBmb3IgdW5pdmVyc2FsIGFjY2Vzc1xuICogQHBhcmFtIHtzdHJpbmd9IHNyY0RpciAtIFNvdXJjZSBkaXJlY3RvcnkgKGV6LWFnZW50cyByb290KVxuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBpbnN0YWxsXG4gKiBAcGFyYW0ge3N0cmluZ30gcnVudGltZSAtIFJ1bnRpbWUgaWRlbnRpZmllclxuICovXG5mdW5jdGlvbiBjb3B5U2tpbGxzKHNyY0Rpcjogc3RyaW5nLCBpc0dsb2JhbDogYm9vbGVhbiwgcnVudGltZTogc3RyaW5nKTogdm9pZCB7XG4gIC8vIE9ubHkgaW5zdGFsbCBza2lsbHMgZm9yIGdsb2JhbCBpbnN0YWxsc1xuICBpZiAoIWlzR2xvYmFsKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gU2tpcHBpbmcgc2tpbGxzIChsb2NhbCBpbnN0YWxsKWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGhvbWVEaXIgPSBvcy5ob21lZGlyKCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICBjb25zdCBza2lsbHNEZXN0RGlyID0gcGF0aC5wb3NpeC5qb2luKGhvbWVEaXIsICcuc2tpbGxzJywgJ2V6LWFnZW50cycpO1xuICBjb25zdCBzcmNTa2lsbHNEaXIgPSBwYXRoLmpvaW4oc3JjRGlyLCAnc2tpbGxzJyk7XG5cbiAgY29uc29sZS5sb2coYCAgSW5zdGFsbGluZyBza2lsbHMgdG8gJHtjeWFufSR7c2tpbGxzRGVzdERpcn0ke3Jlc2V0fS4uLmApO1xuXG4gIC8vIENyZWF0ZSBza2lsbHMgZGlyZWN0b3J5XG4gIGZzLm1rZGlyU3luYyhza2lsbHNEZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBDb3B5IGFsbCBza2lsbHMgZnJvbSBzb3VyY2VcbiAgaWYgKGZzLmV4aXN0c1N5bmMoc3JjU2tpbGxzRGlyKSkge1xuICAgIGZzLmNwU3luYyhzcmNTa2lsbHNEaXIsIHNraWxsc0Rlc3REaXIsIHtcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIGZvcmNlOiB0cnVlXG4gICAgfSk7XG5cbiAgICAvLyBDb3VudCBpbnN0YWxsZWQgc2tpbGxzXG4gICAgbGV0IHNraWxsQ291bnQgPSAwO1xuICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbJ3N0YWNrJywgJ2FyY2hpdGVjdHVyZScsICdkb21haW4nLCAnb3BlcmF0aW9uYWwnLCAnZ292ZXJuYW5jZScsICd0ZXN0aW5nJywgJ29ic2VydmFiaWxpdHknLCAnZGV2b3BzJywgJ3NlY3VyaXR5JywgJ2FpJywgJ2RhdGEnLCAncHJvZHVjdCddO1xuXG4gICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBjYXRlZ29yaWVzKSB7XG4gICAgICBjb25zdCBjYXRlZ29yeVBhdGggPSBwYXRoLmpvaW4oc2tpbGxzRGVzdERpciwgY2F0ZWdvcnkpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY2F0ZWdvcnlQYXRoKSkge1xuICAgICAgICBjb25zdCBza2lsbHMgPSBmcy5yZWFkZGlyU3luYyhjYXRlZ29yeVBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgICAgICAgIC5maWx0ZXIoZCA9PiBkLmlzRGlyZWN0b3J5KCkpLmxlbmd0aDtcbiAgICAgICAgc2tpbGxDb3VudCArPSBza2lsbHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgJHtza2lsbENvdW50fSBza2lsbHMgdG8gJHtza2lsbHNEZXN0RGlyfWApO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKGAgICR7eWVsbG93fVx1MjZBMCR7cmVzZXR9IFNraWxscyBkaXJlY3Rvcnkgbm90IGZvdW5kOiAke3NyY1NraWxsc0Rpcn1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsaXN0Q29kZXhTa2lsbE5hbWVzKHNraWxsc0RpciwgcHJlZml4ID0gJ2V6LScpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNraWxsc0RpcikpIHJldHVybiBbXTtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHNraWxsc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSAmJiBlbnRyeS5uYW1lLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAuZmlsdGVyKGVudHJ5ID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHNraWxsc0RpciwgZW50cnkubmFtZSwgJ1NLSUxMLm1kJykpKVxuICAgIC5tYXAoZW50cnkgPT4gZW50cnkubmFtZSlcbiAgICAuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb3B5Q29tbWFuZHNBc0NvZGV4U2tpbGxzKHNyY0Rpciwgc2tpbGxzRGlyLCBwcmVmaXgsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNyY0RpcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmcy5ta2RpclN5bmMoc2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZW1vdmUgcHJldmlvdXMgRVogQ29kZXggc2tpbGxzIHRvIGF2b2lkIHN0YWxlIGNvbW1hbmQgc2tpbGxzLlxuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRkaXJTeW5jKHNraWxsc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGV4aXN0aW5nKSB7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkubmFtZS5zdGFydHNXaXRoKGAke3ByZWZpeH0tYCkpIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oc2tpbGxzRGlyLCBlbnRyeS5uYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjdXJzZShjdXJyZW50U3JjRGlyLCBjdXJyZW50UHJlZml4KSB7XG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGN1cnJlbnRTcmNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihjdXJyZW50U3JjRGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHJlY3Vyc2Uoc3JjUGF0aCwgYCR7Y3VycmVudFByZWZpeH0tJHtlbnRyeS5uYW1lfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFzZU5hbWUgPSBlbnRyeS5uYW1lLnJlcGxhY2UoJy5tZCcsICcnKTtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGAke2N1cnJlbnRQcmVmaXh9LSR7YmFzZU5hbWV9YDtcbiAgICAgIGNvbnN0IHNraWxsRGlyID0gcGF0aC5qb2luKHNraWxsc0Rpciwgc2tpbGxOYW1lKTtcbiAgICAgIGZzLm1rZGlyU3luYyhza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVIb21lUmVnZXggPSAvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgbG9jYWxDbGF1ZGVSZWdleCA9IC9cXC5cXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IGNvZGV4RGlyUmVnZXggPSAvflxcL1xcLmNvZGV4XFwvL2c7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZVJlZ2V4LCBwYXRoUHJlZml4KTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4LCB0b0hvbWVQcmVmaXgocGF0aFByZWZpeCkpO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShsb2NhbENsYXVkZVJlZ2V4LCBgLi8ke2dldERpck5hbWUocnVudGltZSl9L2ApO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShjb2RleERpclJlZ2V4LCBwYXRoUHJlZml4KTtcbiAgICAgIGNvbnRlbnQgPSBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudCwgZ2V0Q29tbWl0QXR0cmlidXRpb24ocnVudGltZSkpO1xuICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db2RleFNraWxsKGNvbnRlbnQsIHNraWxsTmFtZSk7XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHNraWxsRGlyLCAnU0tJTEwubWQnKSwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmVjdXJzZShzcmNEaXIsIHByZWZpeCk7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgQ29waWxvdCBza2lsbHMgXHUyMDE0IG9uZSBmb2xkZXIgcGVyIHNraWxsIHdpdGggU0tJTEwubWQuXG4gKiBBcHBsaWVzIENPTlYtMDEgKHN0cnVjdHVyZSksIENPTlYtMDIgKGFsbG93ZWQtdG9vbHMpLCBDT05WLTA2IChwYXRocyksIENPTlYtMDcgKGNvbW1hbmQgbmFtZXMpLlxuICovXG5mdW5jdGlvbiBjb3B5Q29tbWFuZHNBc0NvcGlsb3RTa2lsbHMoc3JjRGlyLCBza2lsbHNEaXIsIHByZWZpeCwgaXNHbG9iYWwgPSBmYWxzZSkge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc3JjRGlyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZzLm1rZGlyU3luYyhza2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIC8vIFJlbW92ZSBwcmV2aW91cyBFWiBDb3BpbG90IHNraWxsc1xuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRkaXJTeW5jKHNraWxsc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGV4aXN0aW5nKSB7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkubmFtZS5zdGFydHNXaXRoKGAke3ByZWZpeH0tYCkpIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oc2tpbGxzRGlyLCBlbnRyeS5uYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjdXJzZShjdXJyZW50U3JjRGlyLCBjdXJyZW50UHJlZml4KSB7XG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGN1cnJlbnRTcmNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihjdXJyZW50U3JjRGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHJlY3Vyc2Uoc3JjUGF0aCwgYCR7Y3VycmVudFByZWZpeH0tJHtlbnRyeS5uYW1lfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmFzZU5hbWUgPSBlbnRyeS5uYW1lLnJlcGxhY2UoJy5tZCcsICcnKTtcbiAgICAgIGNvbnN0IHNraWxsTmFtZSA9IGAke2N1cnJlbnRQcmVmaXh9LSR7YmFzZU5hbWV9YDtcbiAgICAgIGNvbnN0IHNraWxsRGlyID0gcGF0aC5qb2luKHNraWxsc0Rpciwgc2tpbGxOYW1lKTtcbiAgICAgIGZzLm1rZGlyU3luYyhza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb250ZW50ID0gY29udmVydENsYXVkZUNvbW1hbmRUb0NvcGlsb3RTa2lsbChjb250ZW50LCBza2lsbE5hbWUsIGlzR2xvYmFsKTtcbiAgICAgIGNvbnRlbnQgPSBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudCwgZ2V0Q29tbWl0QXR0cmlidXRpb24oJ2NvcGlsb3QnKSk7XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHNraWxsRGlyLCAnU0tJTEwubWQnKSwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmVjdXJzZShzcmNEaXIsIHByZWZpeCk7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgS2ltaSBDb2RlIHNraWxscyBcdTIwMTQgb25lIGZvbGRlciBwZXIgc2tpbGwgd2l0aCBTS0lMTC5tZC5cbiAqL1xuZnVuY3Rpb24gY29weUNvbW1hbmRzQXNLaW1pU2tpbGxzKHNyY0Rpciwgc2tpbGxzRGlyLCBwcmVmaXgsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNyY0RpcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmcy5ta2RpclN5bmMoc2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZW1vdmUgcHJldmlvdXMgRVogS2ltaSBza2lsbHNcbiAgY29uc3QgZXhpc3RpbmcgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBleGlzdGluZykge1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChgJHtwcmVmaXh9LWApKSB7XG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHNraWxsc0RpciwgZW50cnkubmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2UoY3VycmVudFNyY0RpciwgY3VycmVudFByZWZpeCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhjdXJyZW50U3JjRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oY3VycmVudFNyY0RpciwgZW50cnkubmFtZSk7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICByZWN1cnNlKHNyY1BhdGgsIGAke2N1cnJlbnRQcmVmaXh9LSR7ZW50cnkubmFtZX1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZW50cnkubmFtZS5yZXBsYWNlKCcubWQnLCAnJyk7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBgJHtjdXJyZW50UHJlZml4fS0ke2Jhc2VOYW1lfWA7XG4gICAgICBjb25zdCBza2lsbERpciA9IHBhdGguam9pbihza2lsbHNEaXIsIHNraWxsTmFtZSk7XG4gICAgICBmcy5ta2RpclN5bmMoc2tpbGxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcmNQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4ID0gL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBraW1pRGlyUmVnZXggPSAvflxcL1xcLmtpbWlcXC8vZztcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVIb21lUmVnZXgsIHRvSG9tZVByZWZpeChwYXRoUHJlZml4KSk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGxvY2FsQ2xhdWRlUmVnZXgsIGAuLyR7Z2V0RGlyTmFtZShydW50aW1lKX0vYCk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGtpbWlEaXJSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9LaW1pU2tpbGwoY29udGVudCwgc2tpbGxOYW1lKTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHNraWxsRGlyLCAnU0tJTEwubWQnKSwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmVjdXJzZShzcmNEaXIsIHByZWZpeCk7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgUXdlbiBDb2RlIGNvbW1hbmRzIFx1MjAxNCBmbGF0IHN0cnVjdHVyZSBpbiBjb21tYW5kcy9lei8uXG4gKiBRd2VuIENvZGUgdXNlcyB+Ly5xd2VuL2NvbW1hbmRzL2V6LyoubWQgKGxpa2UgQ2xhdWRlIENvZGUgfi8uY2xhdWRlL2NvbW1hbmRzL2V6LylcbiAqL1xuZnVuY3Rpb24gY29weUNvbW1hbmRzQXNRd2VuQ29tbWFuZHMoc3JjRGlyLCBjb21tYW5kc0RpciwgcHJlZml4LCBwYXRoUHJlZml4LCBydW50aW1lKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzcmNEaXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZnMubWtkaXJTeW5jKGNvbW1hbmRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZW1vdmUgcHJldmlvdXMgRVogUXdlbiBjb21tYW5kc1xuICBjb25zdCBleGlzdGluZyA9IGZzLnJlYWRkaXJTeW5jKGNvbW1hbmRzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZXhpc3RpbmcpIHtcbiAgICBpZiAoZW50cnkuaXNGaWxlKCkgJiYgZW50cnkubmFtZS5zdGFydHNXaXRoKGAke3ByZWZpeH0tYCkgJiYgZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oY29tbWFuZHNEaXIsIGVudHJ5Lm5hbWUpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWN1cnNlKGN1cnJlbnRTcmNEaXIsIGN1cnJlbnRQcmVmaXgpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoY3VycmVudFNyY0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKGN1cnJlbnRTcmNEaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcmVjdXJzZShzcmNQYXRoLCBgJHtjdXJyZW50UHJlZml4fS0ke2VudHJ5Lm5hbWV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlTmFtZSA9IGVudHJ5Lm5hbWUucmVwbGFjZSgnLm1kJywgJycpO1xuICAgICAgY29uc3QgY29tbWFuZE5hbWUgPSBgJHtjdXJyZW50UHJlZml4fS0ke2Jhc2VOYW1lfWA7XG4gICAgICBjb25zdCBjb21tYW5kRmlsZSA9IHBhdGguam9pbihjb21tYW5kc0RpciwgYCR7Y29tbWFuZE5hbWV9Lm1kYCk7XG5cbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBnbG9iYWxDbGF1ZGVIb21lUmVnZXggPSAvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgbG9jYWxDbGF1ZGVSZWdleCA9IC9cXC5cXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IHF3ZW5EaXJSZWdleCA9IC9+XFwvXFwucXdlblxcLy9nO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UobG9jYWxDbGF1ZGVSZWdleCwgYC4vJHtnZXREaXJOYW1lKHJ1bnRpbWUpfS9gKTtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UocXdlbkRpclJlZ2V4LCBwYXRoUHJlZml4KTtcbiAgICAgIGNvbnRlbnQgPSBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudCwgZ2V0Q29tbWl0QXR0cmlidXRpb24ocnVudGltZSkpO1xuICAgICAgXG4gICAgICAvLyBRd2VuIENvZGUgdXNlcyBzaW1wbGUgbWFya2Rvd24gY29tbWFuZHMgKG5vIFNLSUxMLm1kIHdyYXBwZXIpXG4gICAgICAvLyBKdXN0IGNvcHkgdGhlIGNvbnRlbnQgYXMtaXMgd2l0aCBwYXRoIHJlcGxhY2VtZW50c1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhjb21tYW5kRmlsZSwgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmVjdXJzZShzcmNEaXIsIHByZWZpeCk7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgY29tbWFuZHMgYXMgUXdlbiBDb2RlIHNraWxscyBcdTIwMTQgb25lIGZvbGRlciBwZXIgc2tpbGwgd2l0aCBTS0lMTC5tZC5cbiAqIFF3ZW4gQ29kZSB1c2VzIHRoZSBzYW1lIHNraWxscy8gc3RydWN0dXJlIGFzIENvZGV4IGJ1dCB3aXRoIHNpbXBsZXIgZm9ybWF0IChubyBhZGFwdGVycyBuZWVkZWQpLlxuICogQGRlcHJlY2F0ZWQgVXNlIGNvcHlDb21tYW5kc0FzUXdlbkNvbW1hbmRzIGluc3RlYWQgLSBRd2VuIENvZGUgdXNlcyBjb21tYW5kcy9lei8gbm90IHNraWxscy9cbiAqL1xuZnVuY3Rpb24gY29weUNvbW1hbmRzQXNRd2VuU2tpbGxzKHNyY0Rpciwgc2tpbGxzRGlyLCBwcmVmaXgsIHBhdGhQcmVmaXgsIHJ1bnRpbWUpIHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNyY0RpcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmcy5ta2RpclN5bmMoc2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAvLyBSZW1vdmUgcHJldmlvdXMgRVogUXdlbiBza2lsbHNcbiAgY29uc3QgZXhpc3RpbmcgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBleGlzdGluZykge1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChgJHtwcmVmaXh9LWApKSB7XG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHNraWxsc0RpciwgZW50cnkubmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2UoY3VycmVudFNyY0RpciwgY3VycmVudFByZWZpeCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhjdXJyZW50U3JjRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oY3VycmVudFNyY0RpciwgZW50cnkubmFtZSk7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICByZWN1cnNlKHNyY1BhdGgsIGAke2N1cnJlbnRQcmVmaXh9LSR7ZW50cnkubmFtZX1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VOYW1lID0gZW50cnkubmFtZS5yZXBsYWNlKCcubWQnLCAnJyk7XG4gICAgICBjb25zdCBza2lsbE5hbWUgPSBgJHtjdXJyZW50UHJlZml4fS0ke2Jhc2VOYW1lfWA7XG4gICAgICBjb25zdCBza2lsbERpciA9IHBhdGguam9pbihza2lsbHNEaXIsIHNraWxsTmFtZSk7XG4gICAgICBmcy5ta2RpclN5bmMoc2tpbGxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcmNQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgY29uc3QgZ2xvYmFsQ2xhdWRlSG9tZVJlZ2V4ID0gL1xcJEhPTUVcXC9cXC5jbGF1ZGVcXC8vZztcbiAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICBjb25zdCBxd2VuRGlyUmVnZXggPSAvflxcL1xcLnF3ZW5cXC8vZztcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShnbG9iYWxDbGF1ZGVIb21lUmVnZXgsIHRvSG9tZVByZWZpeChwYXRoUHJlZml4KSk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGxvY2FsQ2xhdWRlUmVnZXgsIGAuLyR7Z2V0RGlyTmFtZShydW50aW1lKX0vYCk7XG4gICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKHF3ZW5EaXJSZWdleCwgcGF0aFByZWZpeCk7XG4gICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgIC8vIFF3ZW4gQ29kZSB1c2VzIHNpbXBsZSBtYXJrZG93biBza2lsbHMgd2l0aG91dCBmcm9udG1hdHRlciBhZGFwdGVyc1xuICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb1F3ZW5Ta2lsbChjb250ZW50LCBza2lsbE5hbWUpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oc2tpbGxEaXIsICdTS0lMTC5tZCcpLCBjb250ZW50KTtcbiAgICB9XG4gIH1cblxuICByZWN1cnNlKHNyY0RpciwgcHJlZml4KTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb3B5IGRpcmVjdG9yeSwgcmVwbGFjaW5nIHBhdGhzIGluIC5tZCBmaWxlc1xuICogRGVsZXRlcyBleGlzdGluZyBkZXN0RGlyIGZpcnN0IHRvIHJlbW92ZSBvcnBoYW5lZCBmaWxlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjRGlyIC0gU291cmNlIGRpcmVjdG9yeVxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3REaXIgLSBEZXN0aW5hdGlvbiBkaXJlY3RvcnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoUHJlZml4IC0gUGF0aCBwcmVmaXggZm9yIGZpbGUgcmVmZXJlbmNlc1xuICogQHBhcmFtIHtzdHJpbmd9IHJ1bnRpbWUgLSBUYXJnZXQgcnVudGltZSAoJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnKVxuICovXG5mdW5jdGlvbiBjb3B5V2l0aFBhdGhSZXBsYWNlbWVudChzcmNEaXIsIGRlc3REaXIsIHBhdGhQcmVmaXgsIHJ1bnRpbWUsIGlzQ29tbWFuZCA9IGZhbHNlLCBpc0dsb2JhbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xuICBjb25zdCBpc0NvZGV4ID0gcnVudGltZSA9PT0gJ2NvZGV4JztcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xuICBjb25zdCBkaXJOYW1lID0gZ2V0RGlyTmFtZShydW50aW1lKTtcblxuICAvLyBDbGVhbiBpbnN0YWxsOiByZW1vdmUgZXhpc3RpbmcgZGVzdGluYXRpb24gdG8gcHJldmVudCBvcnBoYW5lZCBmaWxlc1xuICBpZiAoZnMuZXhpc3RzU3luYyhkZXN0RGlyKSkge1xuICAgIGZzLnJtU3luYyhkZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuICBmcy5ta2RpclN5bmMoZGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHNyY0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oc3JjRGlyLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkZXN0RGlyLCBlbnRyeS5uYW1lKTtcblxuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb3B5V2l0aFBhdGhSZXBsYWNlbWVudChzcmNQYXRoLCBkZXN0UGF0aCwgcGF0aFByZWZpeCwgcnVudGltZSwgaXNDb21tYW5kLCBpc0dsb2JhbCk7XG4gICAgfSBlbHNlIGlmIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgLy8gUmVwbGFjZSB+Ly5jbGF1ZGUvIGFuZCAkSE9NRS8uY2xhdWRlLyBhbmQgLi8uY2xhdWRlLyB3aXRoIHJ1bnRpbWUtYXBwcm9wcmlhdGUgcGF0aHNcbiAgICAgIC8vIFNraXAgZ2VuZXJpYyByZXBsYWNlbWVudCBmb3IgQ29waWxvdCBcdTIwMTQgY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQgaGFuZGxlcyBhbGwgcGF0aHNcbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoIWlzQ29waWxvdCkge1xuICAgICAgICBjb25zdCBnbG9iYWxDbGF1ZGVSZWdleCA9IC9+XFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnN0IGdsb2JhbENsYXVkZUhvbWVSZWdleCA9IC9cXCRIT01FXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnN0IGxvY2FsQ2xhdWRlUmVnZXggPSAvXFwuXFwvXFwuY2xhdWRlXFwvL2c7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZ2xvYmFsQ2xhdWRlUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGdsb2JhbENsYXVkZUhvbWVSZWdleCwgdG9Ib21lUHJlZml4KHBhdGhQcmVmaXgpKTtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShsb2NhbENsYXVkZVJlZ2V4LCBgLi8ke2Rpck5hbWV9L2ApO1xuICAgICAgfVxuICAgICAgY29udGVudCA9IHByb2Nlc3NBdHRyaWJ1dGlvbihjb250ZW50LCBnZXRDb21taXRBdHRyaWJ1dGlvbihydW50aW1lKSk7XG5cbiAgICAgIC8vIENvbnZlcnQgZnJvbnRtYXR0ZXIgZm9yIG9wZW5jb2RlIGNvbXBhdGliaWxpdHlcbiAgICAgIGlmIChpc09wZW5jb2RlKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9PcGVuY29kZUZyb250bWF0dGVyKGNvbnRlbnQpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcbiAgICAgIH0gZWxzZSBpZiAocnVudGltZSA9PT0gJ2dlbWluaScpIHtcbiAgICAgICAgaWYgKGlzQ29tbWFuZCkge1xuICAgICAgICAgIC8vIENvbnZlcnQgdG8gVE9NTCBmb3IgR2VtaW5pIChzdHJpcCA8c3ViPiB0YWdzIFx1MjAxNCB0ZXJtaW5hbHMgY2FuJ3QgcmVuZGVyIHN1YnNjcmlwdClcbiAgICAgICAgICBjb250ZW50ID0gc3RyaXBTdWJUYWdzKGNvbnRlbnQpO1xuICAgICAgICAgIGNvbnN0IHRvbWxDb250ZW50ID0gY29udmVydENsYXVkZVRvR2VtaW5pVG9tbChjb250ZW50KTtcbiAgICAgICAgICAvLyBSZXBsYWNlIGV4dGVuc2lvbiB3aXRoIC50b21sXG4gICAgICAgICAgY29uc3QgdG9tbFBhdGggPSBkZXN0UGF0aC5yZXBsYWNlKC9cXC5tZCQvLCAnLnRvbWwnKTtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRvbWxQYXRoLCB0b21sQ29udGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb2RleCkge1xuICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29kZXhNYXJrZG93bihjb250ZW50KTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCkge1xuICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQoY29udGVudCwgaXNHbG9iYWwpO1xuICAgICAgICBjb250ZW50ID0gcHJvY2Vzc0F0dHJpYnV0aW9uKGNvbnRlbnQsIGdldENvbW1pdEF0dHJpYnV0aW9uKHJ1bnRpbWUpKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQ29waWxvdCAmJiAoZW50cnkubmFtZS5lbmRzV2l0aCgnLmNqcycpIHx8IGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5qcycpKSkge1xuICAgICAgLy8gQ29waWxvdDogYWxzbyB0cmFuc2Zvcm0gLmNqcy8uanMgZmlsZXMgZm9yIENPTlYtMDYgYW5kIENPTlYtMDdcbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvQ29waWxvdENvbnRlbnQoY29udGVudCwgaXNHbG9iYWwpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmNQYXRoLCBkZXN0UGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2xlYW4gdXAgb3JwaGFuZWQgZmlsZXMgZnJvbSBwcmV2aW91cyB2ZXJzaW9uc1xuICovXG5mdW5jdGlvbiBjbGVhbnVwT3JwaGFuZWRGaWxlcyhjb25maWdEaXIpIHtcbiAgY29uc3Qgb3JwaGFuZWRGaWxlcyA9IFtcbiAgICAnaG9va3MvZXotbm90aWZ5LnNoJywgIC8vIFJlbW92ZWQgaW4gdjEuNi54XG4gICAgJ2hvb2tzL3N0YXR1c2xpbmUuanMnLCAgLy8gUmVuYW1lZCB0byBlei1zdGF0dXNsaW5lLmpzIGluIHYxLjkuMFxuICBdO1xuXG4gIGZvciAoY29uc3QgcmVsUGF0aCBvZiBvcnBoYW5lZEZpbGVzKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCByZWxQYXRoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmdWxsUGF0aCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmMoZnVsbFBhdGgpO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIG9ycGhhbmVkICR7cmVsUGF0aH1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDbGVhbiB1cCBvcnBoYW5lZCBob29rIHJlZ2lzdHJhdGlvbnMgZnJvbSBzZXR0aW5ncy5qc29uXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBPcnBoYW5lZEhvb2tzKHNldHRpbmdzKSB7XG4gIGNvbnN0IG9ycGhhbmVkSG9va1BhdHRlcm5zID0gW1xuICAgICdlei1ub3RpZnkuc2gnLCAgLy8gUmVtb3ZlZCBpbiB2MS42LnhcbiAgICAnaG9va3Mvc3RhdHVzbGluZS5qcycsICAvLyBSZW5hbWVkIHRvIGV6LXN0YXR1c2xpbmUuanMgaW4gdjEuOS4wXG4gICAgJ2V6LWludGVsLWluZGV4LmpzJywgIC8vIFJlbW92ZWQgaW4gdjEuOS4yXG4gICAgJ2V6LWludGVsLXNlc3Npb24uanMnLCAgLy8gUmVtb3ZlZCBpbiB2MS45LjJcbiAgICAnZXotaW50ZWwtcHJ1bmUuanMnLCAgLy8gUmVtb3ZlZCBpbiB2MS45LjJcbiAgXTtcblxuICBsZXQgY2xlYW5lZEhvb2tzID0gZmFsc2U7XG5cbiAgLy8gQ2hlY2sgYWxsIGhvb2sgZXZlbnQgdHlwZXMgKFN0b3AsIFNlc3Npb25TdGFydCwgZXRjLilcbiAgaWYgKHNldHRpbmdzLmhvb2tzKSB7XG4gICAgZm9yIChjb25zdCBldmVudFR5cGUgb2YgT2JqZWN0LmtleXMoc2V0dGluZ3MuaG9va3MpKSB7XG4gICAgICBjb25zdCBob29rRW50cmllcyA9IHNldHRpbmdzLmhvb2tzW2V2ZW50VHlwZV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShob29rRW50cmllcykpIHtcbiAgICAgICAgLy8gRmlsdGVyIG91dCBlbnRyaWVzIHRoYXQgY29udGFpbiBvcnBoYW5lZCBob29rc1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IGhvb2tFbnRyaWVzLmZpbHRlcihlbnRyeSA9PiB7XG4gICAgICAgICAgaWYgKGVudHJ5Lmhvb2tzICYmIEFycmF5LmlzQXJyYXkoZW50cnkuaG9va3MpKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBhbnkgaG9vayBpbiB0aGlzIGVudHJ5IG1hdGNoZXMgb3JwaGFuZWQgcGF0dGVybnNcbiAgICAgICAgICAgIGNvbnN0IGhhc09ycGhhbmVkID0gZW50cnkuaG9va3Muc29tZShoID0+XG4gICAgICAgICAgICAgIGguY29tbWFuZCAmJiBvcnBoYW5lZEhvb2tQYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gaC5jb21tYW5kLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChoYXNPcnBoYW5lZCkge1xuICAgICAgICAgICAgICBjbGVhbmVkSG9va3MgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBSZW1vdmUgdGhpcyBlbnRyeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEtlZXAgdGhpcyBlbnRyeVxuICAgICAgICB9KTtcbiAgICAgICAgc2V0dGluZ3MuaG9va3NbZXZlbnRUeXBlXSA9IGZpbHRlcmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjbGVhbmVkSG9va3MpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgb3JwaGFuZWQgaG9vayByZWdpc3RyYXRpb25zYCk7XG4gIH1cblxuICAvLyBGaXggIzMzMDogVXBkYXRlIHN0YXR1c0xpbmUgaWYgaXQgcG9pbnRzIHRvIG9sZCBzdGF0dXNsaW5lLmpzIHBhdGhcbiAgLy8gT25seSBtYXRjaCB0aGUgc3BlY2lmaWMgb2xkIHBhdGggcGF0dGVybiAoaG9va3Mvc3RhdHVzbGluZS5qcyksXG4gIC8vIG5vdCB0aGlyZC1wYXJ0eSBzdGF0dXNsaW5lIHNjcmlwdHMgdGhhdCBoYXBwZW4gdG8gY29udGFpbiAnc3RhdHVzbGluZS5qcydcbiAgaWYgKHNldHRpbmdzLnN0YXR1c0xpbmUgJiYgc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kICYmXG4gICAgICAvaG9va3NbXFwvXFxcXF1zdGF0dXNsaW5lXFwuanMvLnRlc3Qoc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kKSkge1xuICAgIHNldHRpbmdzLnN0YXR1c0xpbmUuY29tbWFuZCA9IHNldHRpbmdzLnN0YXR1c0xpbmUuY29tbWFuZC5yZXBsYWNlKFxuICAgICAgL2hvb2tzKFtcXC9cXFxcXSlzdGF0dXNsaW5lXFwuanMvLFxuICAgICAgJ2hvb2tzJDFlei1zdGF0dXNsaW5lLmpzJ1xuICAgICk7XG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBVcGRhdGVkIHN0YXR1c2xpbmUgcGF0aCAoaG9va3Mvc3RhdHVzbGluZS5qcyBcdTIxOTIgaG9va3MvZXotc3RhdHVzbGluZS5qcylgKTtcbiAgfVxuXG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuLyoqXG4gKiBVbmluc3RhbGwgRVpfQWdlbnRzIGZyb20gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZm9yIGEgc3BlY2lmaWMgcnVudGltZVxuICogUmVtb3ZlcyBvbmx5IEVaLXNwZWNpZmljIGZpbGVzL2RpcmVjdG9yaWVzLCBwcmVzZXJ2ZXMgdXNlciBjb250ZW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzR2xvYmFsIC0gV2hldGhlciB0byB1bmluc3RhbGwgZnJvbSBnbG9iYWwgb3IgbG9jYWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBydW50aW1lIC0gVGFyZ2V0IHJ1bnRpbWUgKCdjbGF1ZGUnLCAnb3BlbmNvZGUnLCAnZ2VtaW5pJywgJ2NvZGV4JywgJ2NvcGlsb3QnKVxuICovXG5mdW5jdGlvbiB1bmluc3RhbGwoaXNHbG9iYWwsIHJ1bnRpbWUgPSAnY2xhdWRlJykge1xuICBjb25zdCBpc09wZW5jb2RlID0gcnVudGltZSA9PT0gJ29wZW5jb2RlJztcbiAgY29uc3QgaXNDb2RleCA9IHJ1bnRpbWUgPT09ICdjb2RleCc7XG4gIGNvbnN0IGlzQ29waWxvdCA9IHJ1bnRpbWUgPT09ICdjb3BpbG90JztcbiAgY29uc3QgaXNRd2VuID0gcnVudGltZSA9PT0gJ3F3ZW4nO1xuICBjb25zdCBpc0tpbWkgPSBydW50aW1lID09PSAna2ltaSc7XG4gIGNvbnN0IGRpck5hbWUgPSBnZXREaXJOYW1lKHJ1bnRpbWUpO1xuXG4gIC8vIEdldCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBiYXNlZCBvbiBydW50aW1lIGFuZCBpbnN0YWxsIHR5cGVcbiAgY29uc3QgdGFyZ2V0RGlyID0gaXNHbG9iYWxcbiAgICA/IGdldEdsb2JhbERpcihydW50aW1lLCBleHBsaWNpdENvbmZpZ0RpcilcbiAgICA6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBkaXJOYW1lKTtcblxuICBjb25zdCBsb2NhdGlvbkxhYmVsID0gaXNHbG9iYWxcbiAgICA/IHRhcmdldERpci5yZXBsYWNlKG9zLmhvbWVkaXIoKSwgJ34nKVxuICAgIDogdGFyZ2V0RGlyLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJy4nKTtcblxuICBsZXQgcnVudGltZUxhYmVsID0gJ0NsYXVkZSBDb2RlJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdvcGVuY29kZScpIHJ1bnRpbWVMYWJlbCA9ICdPcGVuQ29kZSc7XG4gIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykgcnVudGltZUxhYmVsID0gJ0dlbWluaSc7XG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSBydW50aW1lTGFiZWwgPSAnQ29kZXgnO1xuICBpZiAocnVudGltZSA9PT0gJ2NvcGlsb3QnKSBydW50aW1lTGFiZWwgPSAnQ29waWxvdCc7XG4gIGlmIChydW50aW1lID09PSAncXdlbicpIHJ1bnRpbWVMYWJlbCA9ICdRd2VuIENvZGUnO1xuXG4gIGNvbnNvbGUubG9nKGAgIFVuaW5zdGFsbGluZyBFWl9BZ2VudHMgZnJvbSAke2N5YW59JHtydW50aW1lTGFiZWx9JHtyZXNldH0gYXQgJHtjeWFufSR7bG9jYXRpb25MYWJlbH0ke3Jlc2V0fVxcbmApO1xuXG4gIC8vIENoZWNrIGlmIHRhcmdldCBkaXJlY3RvcnkgZXhpc3RzXG4gIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXREaXIpKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0OiAke2xvY2F0aW9uTGFiZWx9YCk7XG4gICAgY29uc29sZS5sb2coYCAgTm90aGluZyB0byB1bmluc3RhbGwuXFxuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHJlbW92ZWRDb3VudCA9IDA7XG5cbiAgLy8gMS4gUmVtb3ZlIEVaIGNvbW1hbmRzL3NraWxsc1xuICBpZiAoaXNPcGVuY29kZSkge1xuICAgIC8vIE9wZW5Db2RlOiByZW1vdmUgY29tbWFuZC9lei0qLm1kIGZpbGVzXG4gICAgY29uc3QgY29tbWFuZERpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29tbWFuZERpcikpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoY29tbWFuZERpcik7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihjb21tYW5kRGlyLCBmaWxlKSk7XG4gICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBFWl9BZ2VudHMgY29tbWFuZHMgZnJvbSBjb21tYW5kL2ApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0NvZGV4IHx8IGlzUXdlbiB8fCBpc0tpbWkpIHtcbiAgICAvLyBDb2RleC9Rd2VuL0tpbWk6IHJlbW92ZSBza2lsbHMvZXotKi9TS0lMTC5tZCBza2lsbCBkaXJlY3Rvcmllc1xuICAgIGNvbnN0IHNraWxsc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdza2lsbHMnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhza2lsbHNEaXIpKSB7XG4gICAgICBsZXQgc2tpbGxDb3VudCA9IDA7XG4gICAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoc2tpbGxzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkubmFtZS5zdGFydHNXaXRoKCdlei0nKSkge1xuICAgICAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4oc2tpbGxzRGlyLCBlbnRyeS5uYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgc2tpbGxDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc2tpbGxDb3VudCA+IDApIHtcbiAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgIGxldCBydW50aW1lTGFiZWwgPSAnQ29kZXgnO1xuICAgICAgICBpZiAoaXNRd2VuKSBydW50aW1lTGFiZWwgPSAnUXdlbiBDb2RlJztcbiAgICAgICAgaWYgKGlzS2ltaSkgcnVudGltZUxhYmVsID0gJ0tpbWkgQ29kZSc7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCAke3NraWxsQ291bnR9ICR7cnVudGltZUxhYmVsfSBza2lsbHNgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNDb2RleCkge1xuICAgICAgLy8gQ29kZXg6IHJlbW92ZSBFWiBhZ2VudCAudG9tbCBjb25maWcgZmlsZXNcbiAgICAgIGNvbnN0IGNvZGV4QWdlbnRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2FnZW50cycpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY29kZXhBZ2VudHNEaXIpKSB7XG4gICAgICAgIGNvbnN0IHRvbWxGaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGNvZGV4QWdlbnRzRGlyKTtcbiAgICAgICAgbGV0IHRvbWxDb3VudCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiB0b21sRmlsZXMpIHtcbiAgICAgICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCdlei0nKSAmJiBmaWxlLmVuZHNXaXRoKCcudG9tbCcpKSB7XG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihjb2RleEFnZW50c0RpciwgZmlsZSkpO1xuICAgICAgICAgICAgdG9tbENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0b21sQ291bnQgPiAwKSB7XG4gICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkICR7dG9tbENvdW50fSBhZ2VudCAudG9tbCBjb25maWdzYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ29kZXg6IGNsZWFuIEVaIHNlY3Rpb25zIGZyb20gY29uZmlnLnRvbWxcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnY29uZmlnLnRvbWwnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgY29uc3QgY2xlYW5lZCA9IHN0cmlwRXpBZ2VudHNGcm9tQ29kZXhDb25maWcoY29udGVudCk7XG4gICAgICAgIGlmIChjbGVhbmVkID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gRmlsZSBpcyBlbXB0eSBhZnRlciBzdHJpcHBpbmcgXHUyMDE0IGRlbGV0ZSBpdFxuICAgICAgICAgIGZzLnVubGlua1N5bmMoY29uZmlnUGF0aCk7XG4gICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIGNvbmZpZy50b21sICh3YXMgRVotb25seSlgKTtcbiAgICAgICAgfSBlbHNlIGlmIChjbGVhbmVkICE9PSBjb250ZW50KSB7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBjbGVhbmVkKTtcbiAgICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENsZWFuZWQgRVpfQWdlbnRzIHNlY3Rpb25zIGZyb20gY29uZmlnLnRvbWxgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc0NvcGlsb3QpIHtcbiAgICAvLyBDb3BpbG90OiByZW1vdmUgc2tpbGxzL2V6LSovIGRpcmVjdG9yaWVzIChzYW1lIGxheW91dCBhcyBDb2RleCBza2lsbHMpXG4gICAgY29uc3Qgc2tpbGxzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NraWxscycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHNraWxsc0RpcikpIHtcbiAgICAgIGxldCBza2lsbENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhza2lsbHNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSAmJiBlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJ2V6LScpKSB7XG4gICAgICAgICAgZnMucm1TeW5jKHBhdGguam9pbihza2lsbHNEaXIsIGVudHJ5Lm5hbWUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBza2lsbENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChza2lsbENvdW50ID4gMCkge1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkICR7c2tpbGxDb3VudH0gQ29waWxvdCBza2lsbHNgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb3BpbG90OiBjbGVhbiBFWiBzZWN0aW9uIGZyb20gY29waWxvdC1pbnN0cnVjdGlvbnMubWRcbiAgICBjb25zdCBpbnN0cnVjdGlvbnNQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2NvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoaW5zdHJ1Y3Rpb25zUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoaW5zdHJ1Y3Rpb25zUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGNsZWFuZWQgPSBzdHJpcEV6QWdlbnRzRnJvbUNvcGlsb3RJbnN0cnVjdGlvbnMoY29udGVudCk7XG4gICAgICBpZiAoY2xlYW5lZCA9PT0gbnVsbCkge1xuICAgICAgICBmcy51bmxpbmtTeW5jKGluc3RydWN0aW9uc1BhdGgpO1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIGNvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kICh3YXMgRVotb25seSlgKTtcbiAgICAgIH0gZWxzZSBpZiAoY2xlYW5lZCAhPT0gY29udGVudCkge1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGluc3RydWN0aW9uc1BhdGgsIGNsZWFuZWQpO1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDbGVhbmVkIEVaX0FnZW50cyBzZWN0aW9uIGZyb20gY29waWxvdC1pbnN0cnVjdGlvbnMubWRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZXpDb21tYW5kc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kcycsICdleicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGV6Q29tbWFuZHNEaXIpKSB7XG4gICAgICBmcy5ybVN5bmMoZXpDb21tYW5kc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBjb21tYW5kcy9lei9gKTtcbiAgICB9XG4gIH1cblxuICAvLyAyLiBSZW1vdmUgZXotYWdlbnRzIGRpcmVjdG9yeVxuICBjb25zdCBlekRpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdlei1hZ2VudHMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZXpEaXIpKSB7XG4gICAgZnMucm1TeW5jKGV6RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkQ291bnQrKztcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgZXotYWdlbnRzL2ApO1xuICB9XG5cbiAgLy8gMy4gUmVtb3ZlIEVaX0FnZW50cyBhZ2VudHMgKGV6LSoubWQgZmlsZXMgb25seSlcbiAgY29uc3QgYWdlbnRzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2FnZW50cycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhhZ2VudHNEaXIpKSB7XG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhhZ2VudHNEaXIpO1xuICAgIGxldCBhZ2VudENvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ2V6LScpICYmIGZpbGUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKGFnZW50c0RpciwgZmlsZSkpO1xuICAgICAgICBhZ2VudENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhZ2VudENvdW50ID4gMCkge1xuICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgJHthZ2VudENvdW50fSBFWl9BZ2VudHMgYWdlbnRzYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gNC4gUmVtb3ZlIEVaIGhvb2tzXG4gIGNvbnN0IGhvb2tzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2hvb2tzJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGhvb2tzRGlyKSkge1xuICAgIGNvbnN0IGV6SG9va3MgPSBbJ2V6LXN0YXR1c2xpbmUuanMnLCAnZXotY2hlY2stdXBkYXRlLmpzJywgJ2V6LWNoZWNrLXVwZGF0ZS5zaCcsICdlei1jb250ZXh0LW1vbml0b3IuanMnXTtcbiAgICBsZXQgaG9va0NvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGhvb2sgb2YgZXpIb29rcykge1xuICAgICAgY29uc3QgaG9va1BhdGggPSBwYXRoLmpvaW4oaG9va3NEaXIsIGhvb2spO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoaG9va1BhdGgpKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMoaG9va1BhdGgpO1xuICAgICAgICBob29rQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhvb2tDb3VudCA+IDApIHtcbiAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkICR7aG9va0NvdW50fSBFWiBob29rc2ApO1xuICAgIH1cbiAgfVxuXG4gIC8vIDUuIFJlbW92ZSBFWiBwYWNrYWdlLmpzb24gKENvbW1vbkpTIG1vZGUgbWFya2VyKVxuICBjb25zdCBwa2dKc29uUGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGtnSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGtnSnNvblBhdGgsICd1dGY4JykudHJpbSgpO1xuICAgICAgLy8gT25seSByZW1vdmUgaWYgaXQncyBvdXIgbWluaW1hbCBDb21tb25KUyBtYXJrZXJcbiAgICAgIGlmIChjb250ZW50ID09PSAne1widHlwZVwiOlwiY29tbW9uanNcIn0nKSB7XG4gICAgICAgIGZzLnVubGlua1N5bmMocGtnSnNvblBhdGgpO1xuICAgICAgICByZW1vdmVkQ291bnQrKztcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIEVaIHBhY2thZ2UuanNvbmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElnbm9yZSByZWFkIGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8vIDYuIENsZWFuIHVwIHNldHRpbmdzLmpzb24gKHJlbW92ZSBFWiBob29rcyBhbmQgc3RhdHVzbGluZSlcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NldHRpbmdzLmpzb24nKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkge1xuICAgIGxldCBzZXR0aW5ncyA9IHJlYWRTZXR0aW5ncyhzZXR0aW5nc1BhdGgpO1xuICAgIGxldCBzZXR0aW5nc01vZGlmaWVkID0gZmFsc2U7XG5cbiAgICAvLyBSZW1vdmUgRVogc3RhdHVzbGluZSBpZiBpdCByZWZlcmVuY2VzIG91ciBob29rXG4gICAgaWYgKHNldHRpbmdzLnN0YXR1c0xpbmUgJiYgc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kICYmXG4gICAgICAgIHNldHRpbmdzLnN0YXR1c0xpbmUuY29tbWFuZC5pbmNsdWRlcygnZXotc3RhdHVzbGluZScpKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3Muc3RhdHVzTGluZTtcbiAgICAgIHNldHRpbmdzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIEVaIHN0YXR1c2xpbmUgZnJvbSBzZXR0aW5nc2ApO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBFWiBob29rcyBmcm9tIFNlc3Npb25TdGFydFxuICAgIGlmIChzZXR0aW5ncy5ob29rcyAmJiBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5sZW5ndGg7XG4gICAgICBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQgPSBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQuZmlsdGVyKGVudHJ5ID0+IHtcbiAgICAgICAgaWYgKGVudHJ5Lmhvb2tzICYmIEFycmF5LmlzQXJyYXkoZW50cnkuaG9va3MpKSB7XG4gICAgICAgICAgLy8gRmlsdGVyIG91dCBFWiBob29rc1xuICAgICAgICAgIGNvbnN0IGhhc0V6SG9vayA9IGVudHJ5Lmhvb2tzLnNvbWUoaCA9PlxuICAgICAgICAgICAgaC5jb21tYW5kICYmIChoLmNvbW1hbmQuaW5jbHVkZXMoJ2V6LWNoZWNrLXVwZGF0ZScpIHx8IGguY29tbWFuZC5pbmNsdWRlcygnZXotc3RhdHVzbGluZScpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuICFoYXNFekhvb2s7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcbiAgICAgIGlmIChzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQubGVuZ3RoIDwgYmVmb3JlKSB7XG4gICAgICAgIHNldHRpbmdzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFJlbW92ZWQgRVogaG9va3MgZnJvbSBzZXR0aW5nc2ApO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYW4gdXAgZW1wdHkgYXJyYXlcbiAgICAgIGlmIChzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5ncy5ob29rcy5TZXNzaW9uU3RhcnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIEVaIGhvb2tzIGZyb20gUG9zdFRvb2xVc2UgYW5kIEFmdGVyVG9vbCAoR2VtaW5pIHVzZXMgQWZ0ZXJUb29sKVxuICAgIGZvciAoY29uc3QgZXZlbnROYW1lIG9mIFsnUG9zdFRvb2xVc2UnLCAnQWZ0ZXJUb29sJ10pIHtcbiAgICAgIGlmIChzZXR0aW5ncy5ob29rcyAmJiBzZXR0aW5ncy5ob29rc1tldmVudE5hbWVdKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IHNldHRpbmdzLmhvb2tzW2V2ZW50TmFtZV0ubGVuZ3RoO1xuICAgICAgICBzZXR0aW5ncy5ob29rc1tldmVudE5hbWVdID0gc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXS5maWx0ZXIoZW50cnkgPT4ge1xuICAgICAgICAgIGlmIChlbnRyeS5ob29rcyAmJiBBcnJheS5pc0FycmF5KGVudHJ5Lmhvb2tzKSkge1xuICAgICAgICAgICAgY29uc3QgaGFzRXpIb29rID0gZW50cnkuaG9va3Muc29tZShoID0+XG4gICAgICAgICAgICAgIGguY29tbWFuZCAmJiBoLmNvbW1hbmQuaW5jbHVkZXMoJ2V6LWNvbnRleHQtbW9uaXRvcicpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuICFoYXNFekhvb2s7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNldHRpbmdzLmhvb2tzW2V2ZW50TmFtZV0ubGVuZ3RoIDwgYmVmb3JlKSB7XG4gICAgICAgICAgc2V0dGluZ3NNb2RpZmllZCA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBSZW1vdmVkIGNvbnRleHQgbW9uaXRvciBob29rIGZyb20gc2V0dGluZ3NgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBkZWxldGUgc2V0dGluZ3MuaG9va3NbZXZlbnROYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIGVtcHR5IGhvb2tzIG9iamVjdFxuICAgIGlmIChzZXR0aW5ncy5ob29rcyAmJiBPYmplY3Qua2V5cyhzZXR0aW5ncy5ob29rcykubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaG9va3M7XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzTW9kaWZpZWQpIHtcbiAgICAgIHdyaXRlU2V0dGluZ3Moc2V0dGluZ3NQYXRoLCBzZXR0aW5ncyk7XG4gICAgICByZW1vdmVkQ291bnQrKztcbiAgICB9XG4gIH1cblxuICAvLyA2LiBGb3IgT3BlbkNvZGUsIGNsZWFuIHVwIHBlcm1pc3Npb25zIGZyb20gb3BlbmNvZGUuanNvblxuICBpZiAoaXNPcGVuY29kZSkge1xuICAgIC8vIEZvciBsb2NhbCB1bmluc3RhbGxzLCBjbGVhbiB1cCAuLy5vcGVuY29kZS9vcGVuY29kZS5qc29uXG4gICAgLy8gRm9yIGdsb2JhbCB1bmluc3RhbGxzLCBjbGVhbiB1cCB+Ly5jb25maWcvb3BlbmNvZGUvb3BlbmNvZGUuanNvblxuICAgIGNvbnN0IG9wZW5jb2RlQ29uZmlnRGlyID0gaXNHbG9iYWxcbiAgICAgID8gZ2V0T3BlbmNvZGVHbG9iYWxEaXIoKVxuICAgICAgOiBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5vcGVuY29kZScpO1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ob3BlbmNvZGVDb25maWdEaXIsICdvcGVuY29kZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgICAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBSZW1vdmUgRVogcGVybWlzc2lvbiBlbnRyaWVzXG4gICAgICAgIGlmIChjb25maWcucGVybWlzc2lvbikge1xuICAgICAgICAgIGZvciAoY29uc3QgcGVybVR5cGUgb2YgWydyZWFkJywgJ2V4dGVybmFsX2RpcmVjdG9yeSddKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLnBlcm1pc3Npb25bcGVybVR5cGVdKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV0pO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnZXotYWdlbnRzJykpIHtcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb25maWcucGVybWlzc2lvbltwZXJtVHlwZV1ba2V5XTtcbiAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgZW1wdHkgb2JqZWN0c1xuICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlnLnBlcm1pc3Npb25bcGVybVR5cGVdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29uZmlnLnBlcm1pc3Npb25bcGVybVR5cGVdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhjb25maWcucGVybWlzc2lvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLnBlcm1pc3Npb247XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vZGlmaWVkKSB7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpICsgJ1xcbicpO1xuICAgICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gUmVtb3ZlZCBFWiBwZXJtaXNzaW9ucyBmcm9tIG9wZW5jb2RlLmpzb25gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZ25vcmUgSlNPTiBwYXJzZSBlcnJvcnNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocmVtb3ZlZENvdW50ID09PSAwKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gTm8gRVpfQWdlbnRzIGZpbGVzIGZvdW5kIHRvIHJlbW92ZS5gKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBcbiAgJHtncmVlbn1Eb25lISR7cmVzZXR9IEVaX0FnZW50cyBoYXMgYmVlbiB1bmluc3RhbGxlZCBmcm9tICR7cnVudGltZUxhYmVsfS5cbiAgWW91ciBvdGhlciBmaWxlcyBhbmQgc2V0dGluZ3MgaGF2ZSBiZWVuIHByZXNlcnZlZC5cbmApO1xufVxuXG4vKipcbiAqIFBhcnNlIEpTT05DIChKU09OIHdpdGggQ29tbWVudHMpIGJ5IHN0cmlwcGluZyBjb21tZW50cyBhbmQgdHJhaWxpbmcgY29tbWFzLlxuICogT3BlbkNvZGUgc3VwcG9ydHMgSlNPTkMgZm9ybWF0IHZpYSBqc29uYy1wYXJzZXIsIHNvIHVzZXJzIG1heSBoYXZlIGNvbW1lbnRzLlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGlubGluZSBwYXJzZXIgdG8gYXZvaWQgYWRkaW5nIGRlcGVuZGVuY2llcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VKc29uYyhjb250ZW50KSB7XG4gIC8vIFN0cmlwIEJPTSBpZiBwcmVzZW50XG4gIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHNpbmdsZS1saW5lIGFuZCBibG9jayBjb21tZW50cyB3aGlsZSBwcmVzZXJ2aW5nIHN0cmluZ3NcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgaW5TdHJpbmcgPSBmYWxzZTtcbiAgbGV0IGkgPSAwO1xuICB3aGlsZSAoaSA8IGNvbnRlbnQubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaV07XG4gICAgY29uc3QgbmV4dCA9IGNvbnRlbnRbaSArIDFdO1xuXG4gICAgaWYgKGluU3RyaW5nKSB7XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIC8vIEhhbmRsZSBlc2NhcGUgc2VxdWVuY2VzXG4gICAgICBpZiAoY2hhciA9PT0gJ1xcXFwnICYmIGkgKyAxIDwgY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0ICs9IG5leHQ7XG4gICAgICAgIGkgKz0gMjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICBpblN0cmluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICBpblN0cmluZyA9IHRydWU7XG4gICAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgICAgICBpKys7XG4gICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICcvJyAmJiBuZXh0ID09PSAnLycpIHtcbiAgICAgICAgLy8gU2tpcCBzaW5nbGUtbGluZSBjb21tZW50IHVudGlsIGVuZCBvZiBsaW5lXG4gICAgICAgIHdoaWxlIChpIDwgY29udGVudC5sZW5ndGggJiYgY29udGVudFtpXSAhPT0gJ1xcbicpIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJy8nICYmIG5leHQgPT09ICcqJykge1xuICAgICAgICAvLyBTa2lwIGJsb2NrIGNvbW1lbnRcbiAgICAgICAgaSArPSAyO1xuICAgICAgICB3aGlsZSAoaSA8IGNvbnRlbnQubGVuZ3RoIC0gMSAmJiAhKGNvbnRlbnRbaV0gPT09ICcqJyAmJiBjb250ZW50W2kgKyAxXSA9PT0gJy8nKSkge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBpICs9IDI7IC8vIFNraXAgY2xvc2luZyAqL1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgdHJhaWxpbmcgY29tbWFzIGJlZm9yZSB9IG9yIF1cbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLywoXFxzKlt9XFxdXSkvZywgJyQxJyk7XG5cbiAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmUgT3BlbkNvZGUgcGVybWlzc2lvbnMgdG8gYWxsb3cgcmVhZGluZyBFWiByZWZlcmVuY2UgZG9jc1xuICogVGhpcyBwcmV2ZW50cyBwZXJtaXNzaW9uIHByb21wdHMgd2hlbiBFWiBhY2Nlc3NlcyB0aGUgZXotYWdlbnRzIGRpcmVjdG9yeVxuICogQHBhcmFtIHtib29sZWFufSBpc0dsb2JhbCAtIFdoZXRoZXIgdGhpcyBpcyBhIGdsb2JhbCBvciBsb2NhbCBpbnN0YWxsXG4gKi9cbmZ1bmN0aW9uIGNvbmZpZ3VyZU9wZW5jb2RlUGVybWlzc2lvbnMoaXNHbG9iYWwgPSB0cnVlKSB7XG4gIC8vIEZvciBsb2NhbCBpbnN0YWxscywgdXNlIC4vLm9wZW5jb2RlL29wZW5jb2RlLmpzb25cbiAgLy8gRm9yIGdsb2JhbCBpbnN0YWxscywgdXNlIH4vLmNvbmZpZy9vcGVuY29kZS9vcGVuY29kZS5qc29uXG4gIGNvbnN0IG9wZW5jb2RlQ29uZmlnRGlyID0gaXNHbG9iYWxcbiAgICA/IGdldE9wZW5jb2RlR2xvYmFsRGlyKClcbiAgICA6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLm9wZW5jb2RlJyk7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4ob3BlbmNvZGVDb25maWdEaXIsICdvcGVuY29kZS5qc29uJyk7XG5cbiAgLy8gRW5zdXJlIGNvbmZpZyBkaXJlY3RvcnkgZXhpc3RzXG4gIGZzLm1rZGlyU3luYyhvcGVuY29kZUNvbmZpZ0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgLy8gUmVhZCBleGlzdGluZyBjb25maWcgb3IgY3JlYXRlIGVtcHR5IG9iamVjdFxuICBsZXQgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XG4gICAgICBjb25maWcgPSBwYXJzZUpzb25jKGNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENhbm5vdCBwYXJzZSAtIERPIE5PVCBvdmVyd3JpdGUgdXNlcidzIGNvbmZpZ1xuICAgICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gQ291bGQgbm90IHBhcnNlIG9wZW5jb2RlLmpzb24gLSBza2lwcGluZyBwZXJtaXNzaW9uIGNvbmZpZ2ApO1xuICAgICAgY29uc29sZS5sb2coYCAgICAke2RpbX1SZWFzb246ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9JHtyZXNldH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtkaW19WW91ciBjb25maWcgd2FzIE5PVCBtb2RpZmllZC4gRml4IHRoZSBzeW50YXggbWFudWFsbHkgaWYgbmVlZGVkLiR7cmVzZXR9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLy8gRW5zdXJlIHBlcm1pc3Npb24gc3RydWN0dXJlIGV4aXN0c1xuICBpZiAoIWNvbmZpZy5wZXJtaXNzaW9uKSB7XG4gICAgY29uZmlnLnBlcm1pc3Npb24gPSB7fTtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSBFWiBwYXRoIHVzaW5nIHRoZSBhY3R1YWwgY29uZmlnIGRpcmVjdG9yeVxuICAvLyBVc2UgfiBzaG9ydGhhbmQgaWYgaXQncyBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbiwgb3RoZXJ3aXNlIHVzZSBmdWxsIHBhdGhcbiAgY29uc3QgZGVmYXVsdENvbmZpZ0RpciA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ29wZW5jb2RlJyk7XG4gIGNvbnN0IGV6UGF0aCA9IG9wZW5jb2RlQ29uZmlnRGlyID09PSBkZWZhdWx0Q29uZmlnRGlyXG4gICAgPyAnfi8uY29uZmlnL29wZW5jb2RlL2V6LWFnZW50cy8qJ1xuICAgIDogYCR7b3BlbmNvZGVDb25maWdEaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpfS9lei1hZ2VudHMvKmA7XG5cbiAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XG5cbiAgLy8gQ29uZmlndXJlIHJlYWQgcGVybWlzc2lvblxuICBjb25zdCBwZXJtaXNzaW9uID0gY29uZmlnLnBlcm1pc3Npb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfHwge307XG4gIGNvbmZpZy5wZXJtaXNzaW9uID0gcGVybWlzc2lvbjtcbiAgaWYgKCFwZXJtaXNzaW9uLnJlYWQgfHwgdHlwZW9mIHBlcm1pc3Npb24ucmVhZCAhPT0gJ29iamVjdCcpIHtcbiAgICBwZXJtaXNzaW9uLnJlYWQgPSB7fTtcbiAgfVxuICBjb25zdCByZWFkUGVybSA9IHBlcm1pc3Npb24ucmVhZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKHJlYWRQZXJtW2V6UGF0aF0gIT09ICdhbGxvdycpIHtcbiAgICByZWFkUGVybVtlelBhdGhdID0gJ2FsbG93JztcbiAgICBtb2RpZmllZCA9IHRydWU7XG4gIH1cblxuICAvLyBDb25maWd1cmUgZXh0ZXJuYWxfZGlyZWN0b3J5IHBlcm1pc3Npb24gKHRoZSBzYWZldHkgZ3VhcmQgZm9yIHBhdGhzIG91dHNpZGUgcHJvamVjdClcbiAgaWYgKCFwZXJtaXNzaW9uLmV4dGVybmFsX2RpcmVjdG9yeSB8fCB0eXBlb2YgcGVybWlzc2lvbi5leHRlcm5hbF9kaXJlY3RvcnkgIT09ICdvYmplY3QnKSB7XG4gICAgcGVybWlzc2lvbi5leHRlcm5hbF9kaXJlY3RvcnkgPSB7fTtcbiAgfVxuICBjb25zdCBleHREaXJQZXJtID0gcGVybWlzc2lvbi5leHRlcm5hbF9kaXJlY3RvcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChleHREaXJQZXJtW2V6UGF0aF0gIT09ICdhbGxvdycpIHtcbiAgICBleHREaXJQZXJtW2V6UGF0aF0gPSAnYWxsb3cnO1xuICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICghbW9kaWZpZWQpIHtcbiAgICByZXR1cm47IC8vIEFscmVhZHkgY29uZmlndXJlZFxuICB9XG5cbiAgLy8gV3JpdGUgY29uZmlnIGJhY2tcbiAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpICsgJ1xcbicpO1xuICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENvbmZpZ3VyZWQgcmVhZCBwZXJtaXNzaW9uIGZvciBFWl9BZ2VudHMgZG9jc2ApO1xufVxuXG4vKipcbiAqIFZlcmlmeSBhIGRpcmVjdG9yeSBleGlzdHMgYW5kIGNvbnRhaW5zIGZpbGVzXG4gKi9cbmZ1bmN0aW9uIHZlcmlmeUluc3RhbGxlZChkaXJQYXRoLCBkZXNjcmlwdGlvbikge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fVx1MjcxNyR7cmVzZXR9IEZhaWxlZCB0byBpbnN0YWxsICR7ZGVzY3JpcHRpb259OiBkaXJlY3Rvcnkgbm90IGNyZWF0ZWRgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoZGlyUGF0aCk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fVx1MjcxNyR7cmVzZXR9IEZhaWxlZCB0byBpbnN0YWxsICR7ZGVzY3JpcHRpb259OiBkaXJlY3RvcnkgaXMgZW1wdHlgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fVx1MjcxNyR7cmVzZXR9IEZhaWxlZCB0byBpbnN0YWxsICR7ZGVzY3JpcHRpb259OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBWZXJpZnkgYSBmaWxlIGV4aXN0c1xuICovXG5mdW5jdGlvbiB2ZXJpZnlGaWxlSW5zdGFsbGVkKGZpbGVQYXRoLCBkZXNjcmlwdGlvbikge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgY29uc29sZS5lcnJvcihgICAke3llbGxvd31cdTI3MTcke3Jlc2V0fSBGYWlsZWQgdG8gaW5zdGFsbCAke2Rlc2NyaXB0aW9ufTogZmlsZSBub3QgY3JlYXRlZGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGZvciBhIHNwZWNpZmljIHJ1bnRpbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNHbG9iYWwgLSBXaGV0aGVyIHRvIGluc3RhbGwgZ2xvYmFsbHkgb3IgbG9jYWxseVxuICogQHBhcmFtIHtzdHJpbmd9IHJ1bnRpbWUgLSBUYXJnZXQgcnVudGltZSAoJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnKVxuICovXG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gTG9jYWwgUGF0Y2ggUGVyc2lzdGVuY2Vcbi8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5jb25zdCBQQVRDSEVTX0RJUl9OQU1FID0gJ2V6LWxvY2FsLXBhdGNoZXMnO1xuY29uc3QgTUFOSUZFU1RfTkFNRSA9ICdlei1maWxlLW1hbmlmZXN0Lmpzb24nO1xuXG4vKipcbiAqIENvbXB1dGUgU0hBMjU2IGhhc2ggb2YgZmlsZSBjb250ZW50c1xuICovXG5mdW5jdGlvbiBmaWxlSGFzaChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCk7XG4gIC8vIENvbnZlcnQgdG8gVWludDhBcnJheSB0byBzYXRpc2Z5IEJpbmFyeUxpa2UgdHlwZSByZXF1aXJlbWVudFxuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShuZXcgVWludDhBcnJheShjb250ZW50KSkuZGlnZXN0KCdoZXgnKTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb2xsZWN0IGFsbCBmaWxlcyBpbiBkaXIgd2l0aCB0aGVpciBoYXNoZXNcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVNYW5pZmVzdChkaXI6IHN0cmluZywgYmFzZURpcj86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoIWJhc2VEaXIpIGJhc2VEaXIgPSBkaXI7XG4gIGNvbnN0IG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSByZXR1cm4gbWFuaWZlc3Q7XG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShiYXNlRGlyLCBmdWxsUGF0aCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG1hbmlmZXN0LCBnZW5lcmF0ZU1hbmlmZXN0KGZ1bGxQYXRoLCBiYXNlRGlyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0W3JlbFBhdGhdID0gZmlsZUhhc2goZnVsbFBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWFuaWZlc3Q7XG59XG5cbi8qKlxuICogV3JpdGUgZmlsZSBtYW5pZmVzdCBhZnRlciBpbnN0YWxsYXRpb24gZm9yIGZ1dHVyZSBtb2RpZmljYXRpb24gZGV0ZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHdyaXRlTWFuaWZlc3QoY29uZmlnRGlyOiBzdHJpbmcsIHJ1bnRpbWUgPSAnY2xhdWRlJykge1xuICBjb25zdCBpc09wZW5jb2RlID0gcnVudGltZSA9PT0gJ29wZW5jb2RlJztcbiAgY29uc3QgaXNDb2RleCA9IHJ1bnRpbWUgPT09ICdjb2RleCc7XG4gIGNvbnN0IGlzQ29waWxvdCA9IHJ1bnRpbWUgPT09ICdjb3BpbG90JztcbiAgY29uc3QgZXpEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCAnZXotYWdlbnRzJyk7XG4gIGNvbnN0IGNvbW1hbmRzRGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gIGNvbnN0IG9wZW5jb2RlQ29tbWFuZERpciA9IHBhdGguam9pbihjb25maWdEaXIsICdjb21tYW5kJyk7XG4gIGNvbnN0IGNvZGV4U2tpbGxzRGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgJ3NraWxscycpO1xuICBjb25zdCBhZ2VudHNEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCAnYWdlbnRzJyk7XG4gIGNvbnN0IG1hbmlmZXN0ID0geyB2ZXJzaW9uOiBwa2cudmVyc2lvbiwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksIGZpbGVzOiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH07XG5cbiAgY29uc3QgZXpIYXNoZXMgPSBnZW5lcmF0ZU1hbmlmZXN0KGV6RGlyKTtcbiAgZm9yIChjb25zdCBbcmVsLCBoYXNoXSBvZiBPYmplY3QuZW50cmllcyhlekhhc2hlcykpIHtcbiAgICBtYW5pZmVzdC5maWxlc1snZXotYWdlbnRzLycgKyByZWxdID0gaGFzaDtcbiAgfVxuICBpZiAoIWlzT3BlbmNvZGUgJiYgIWlzQ29kZXggJiYgIWlzQ29waWxvdCAmJiBmcy5leGlzdHNTeW5jKGNvbW1hbmRzRGlyKSkge1xuICAgIGNvbnN0IGNtZEhhc2hlcyA9IGdlbmVyYXRlTWFuaWZlc3QoY29tbWFuZHNEaXIpO1xuICAgIGZvciAoY29uc3QgW3JlbCwgaGFzaF0gb2YgT2JqZWN0LmVudHJpZXMoY21kSGFzaGVzKSkge1xuICAgICAgbWFuaWZlc3QuZmlsZXNbJ2NvbW1hbmRzL2V6LycgKyByZWxdID0gaGFzaDtcbiAgICB9XG4gIH1cbiAgaWYgKGlzT3BlbmNvZGUgJiYgZnMuZXhpc3RzU3luYyhvcGVuY29kZUNvbW1hbmREaXIpKSB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZzLnJlYWRkaXJTeW5jKG9wZW5jb2RlQ29tbWFuZERpcikpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ2V6LScpICYmIGZpbGUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIG1hbmlmZXN0LmZpbGVzWydjb21tYW5kLycgKyBmaWxlXSA9IGZpbGVIYXNoKHBhdGguam9pbihvcGVuY29kZUNvbW1hbmREaXIsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKChpc0NvZGV4IHx8IGlzQ29waWxvdCkgJiYgZnMuZXhpc3RzU3luYyhjb2RleFNraWxsc0RpcikpIHtcbiAgICBmb3IgKGNvbnN0IHNraWxsTmFtZSBvZiBsaXN0Q29kZXhTa2lsbE5hbWVzKGNvZGV4U2tpbGxzRGlyKSkge1xuICAgICAgY29uc3Qgc2tpbGxSb290ID0gcGF0aC5qb2luKGNvZGV4U2tpbGxzRGlyLCBza2lsbE5hbWUpO1xuICAgICAgY29uc3Qgc2tpbGxIYXNoZXMgPSBnZW5lcmF0ZU1hbmlmZXN0KHNraWxsUm9vdCk7XG4gICAgICBmb3IgKGNvbnN0IFtyZWwsIGhhc2hdIG9mIE9iamVjdC5lbnRyaWVzKHNraWxsSGFzaGVzKSkge1xuICAgICAgICBtYW5pZmVzdC5maWxlc1tgc2tpbGxzLyR7c2tpbGxOYW1lfS8ke3JlbH1gXSA9IGhhc2g7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChmcy5leGlzdHNTeW5jKGFnZW50c0RpcikpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoYWdlbnRzRGlyKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgbWFuaWZlc3QuZmlsZXNbJ2FnZW50cy8nICsgZmlsZV0gPSBmaWxlSGFzaChwYXRoLmpvaW4oYWdlbnRzRGlyLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oY29uZmlnRGlyLCBNQU5JRkVTVF9OQU1FKSwgSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QsIG51bGwsIDIpKTtcbiAgcmV0dXJuIG1hbmlmZXN0O1xufVxuXG4vKipcbiAqIERldGVjdCB1c2VyLW1vZGlmaWVkIEVaX0FnZW50cyBmaWxlcyBieSBjb21wYXJpbmcgYWdhaW5zdCBpbnN0YWxsIG1hbmlmZXN0LlxuICogQmFja3MgdXAgbW9kaWZpZWQgZmlsZXMgdG8gZXotbG9jYWwtcGF0Y2hlcy8gZm9yIHJlYXBwbHkgYWZ0ZXIgdXBkYXRlLlxuICovXG5mdW5jdGlvbiBzYXZlTG9jYWxQYXRjaGVzKGNvbmZpZ0Rpcikge1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBNQU5JRkVTVF9OQU1FKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHJldHVybiBbXTtcblxuICBsZXQgbWFuaWZlc3Q7XG4gIHRyeSB7IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKTsgfSBjYXRjaCB7IHJldHVybiBbXTsgfVxuXG4gIGNvbnN0IHBhdGNoZXNEaXIgPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBQQVRDSEVTX0RJUl9OQU1FKTtcbiAgY29uc3QgbW9kaWZpZWQ6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbcmVsUGF0aCwgb3JpZ2luYWxIYXNoXSBvZiBPYmplY3QuZW50cmllcyhtYW5pZmVzdC5maWxlcyB8fCB7fSkpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIHJlbFBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmdWxsUGF0aCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGN1cnJlbnRIYXNoID0gZmlsZUhhc2goZnVsbFBhdGgpO1xuICAgIGlmIChjdXJyZW50SGFzaCAhPT0gb3JpZ2luYWxIYXNoKSB7XG4gICAgICBjb25zdCBiYWNrdXBQYXRoID0gcGF0aC5qb2luKHBhdGNoZXNEaXIsIHJlbFBhdGgpO1xuICAgICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShiYWNrdXBQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBmcy5jb3B5RmlsZVN5bmMoZnVsbFBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgbW9kaWZpZWQucHVzaChyZWxQYXRoKTtcbiAgICB9XG4gIH1cblxuICBpZiAobW9kaWZpZWQubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG1ldGEgPSB7XG4gICAgICBiYWNrZWRfdXBfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGZyb21fdmVyc2lvbjogbWFuaWZlc3QudmVyc2lvbixcbiAgICAgIGZpbGVzOiBtb2RpZmllZFxuICAgIH07XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocGF0Y2hlc0RpciwgJ2JhY2t1cC1tZXRhLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkobWV0YSwgbnVsbCwgMikpO1xuICAgIGNvbnNvbGUubG9nKCcgICcgKyB5ZWxsb3cgKyAnaScgKyByZXNldCArICcgIEZvdW5kICcgKyBtb2RpZmllZC5sZW5ndGggKyAnIGxvY2FsbHkgbW9kaWZpZWQgRVogZmlsZShzKSBcdTIwMTQgYmFja2VkIHVwIHRvICcgKyBQQVRDSEVTX0RJUl9OQU1FICsgJy8nKTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgbW9kaWZpZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcgICAgICcgKyBkaW0gKyBmICsgcmVzZXQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbW9kaWZpZWQ7XG59XG5cbi8qKlxuICogQWZ0ZXIgaW5zdGFsbCwgcmVwb3J0IGJhY2tlZC11cCBwYXRjaGVzIGZvciB1c2VyIHRvIHJlYXBwbHkuXG4gKi9cbmZ1bmN0aW9uIHJlcG9ydExvY2FsUGF0Y2hlcyhjb25maWdEaXIsIHJ1bnRpbWUgPSAnY2xhdWRlJykge1xuICBjb25zdCBwYXRjaGVzRGlyID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgUEFUQ0hFU19ESVJfTkFNRSk7XG4gIGNvbnN0IG1ldGFQYXRoID0gcGF0aC5qb2luKHBhdGNoZXNEaXIsICdiYWNrdXAtbWV0YS5qc29uJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhtZXRhUGF0aCkpIHJldHVybiBbXTtcblxuICBsZXQgbWV0YTtcbiAgdHJ5IHsgbWV0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1ldGFQYXRoLCAndXRmOCcpKTsgfSBjYXRjaCB7IHJldHVybiBbXTsgfVxuXG4gIGlmIChtZXRhLmZpbGVzICYmIG1ldGEuZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHJlYXBwbHlDb21tYW5kID0gKHJ1bnRpbWUgPT09ICdvcGVuY29kZScgfHwgcnVudGltZSA9PT0gJ2NvcGlsb3QnKVxuICAgICAgPyAnL2V6LXJlYXBwbHktcGF0Y2hlcydcbiAgICAgIDogcnVudGltZSA9PT0gJ2NvZGV4J1xuICAgICAgICA/ICckZXotcmVhcHBseS1wYXRjaGVzJ1xuICAgICAgICA6ICcvZXo6cmVhcHBseS1wYXRjaGVzJztcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgY29uc29sZS5sb2coJyAgJyArIHllbGxvdyArICdMb2NhbCBwYXRjaGVzIGRldGVjdGVkJyArIHJlc2V0ICsgJyAoZnJvbSB2JyArIG1ldGEuZnJvbV92ZXJzaW9uICsgJyk6Jyk7XG4gICAgZm9yIChjb25zdCBmIG9mIG1ldGEuZmlsZXMpIHtcbiAgICAgIGNvbnNvbGUubG9nKCcgICAgICcgKyBjeWFuICsgZiArIHJlc2V0KTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJycpO1xuICAgIGNvbnNvbGUubG9nKCcgIFlvdXIgbW9kaWZpY2F0aW9ucyBhcmUgc2F2ZWQgaW4gJyArIGN5YW4gKyBQQVRDSEVTX0RJUl9OQU1FICsgJy8nICsgcmVzZXQpO1xuICAgIGNvbnNvbGUubG9nKCcgIFJ1biAnICsgY3lhbiArIHJlYXBwbHlDb21tYW5kICsgcmVzZXQgKyAnIHRvIG1lcmdlIHRoZW0gaW50byB0aGUgbmV3IHZlcnNpb24uJyk7XG4gICAgY29uc29sZS5sb2coJyAgT3IgbWFudWFsbHkgY29tcGFyZSBhbmQgbWVyZ2UgdGhlIGZpbGVzLicpO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfVxuICByZXR1cm4gbWV0YS5maWxlcyB8fCBbXTtcbn1cblxuZnVuY3Rpb24gaW5zdGFsbChpc0dsb2JhbDogYm9vbGVhbiwgcnVudGltZSA9ICdjbGF1ZGUnKTogeyBzZXR0aW5nc1BhdGg6IHN0cmluZyB8IG51bGw7IHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7IHN0YXR1c2xpbmVDb21tYW5kOiBzdHJpbmcgfCBudWxsOyBydW50aW1lOiBzdHJpbmcgfSB7XG4gIGNvbnN0IGlzT3BlbmNvZGUgPSBydW50aW1lID09PSAnb3BlbmNvZGUnO1xuICBjb25zdCBpc0dlbWluaSA9IHJ1bnRpbWUgPT09ICdnZW1pbmknO1xuICBjb25zdCBpc0NvZGV4ID0gcnVudGltZSA9PT0gJ2NvZGV4JztcbiAgY29uc3QgaXNDb3BpbG90ID0gcnVudGltZSA9PT0gJ2NvcGlsb3QnO1xuICBjb25zdCBpc1F3ZW4gPSBydW50aW1lID09PSAncXdlbic7XG4gIGNvbnN0IGlzS2ltaSA9IHJ1bnRpbWUgPT09ICdraW1pJztcbiAgY29uc3QgZGlyTmFtZSA9IGdldERpck5hbWUocnVudGltZSk7XG4gIFxuICAvLyBSZXNvbHZlIHBhY2thZ2Ugcm9vdCBieSBmaW5kaW5nIGRpcmVjdG9yeSBjb250YWluaW5nIHBhY2thZ2UuanNvblxuICAvLyBUaGlzIHdvcmtzIHdoZXRoZXIgcnVubmluZyBmcm9tIGRpc3QvYmluLyAoaW5zdGFsbGVkKSBvciBiaW4vIChkZXZlbG9wbWVudClcbiAgbGV0IHBrZ1Jvb3QgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwa2dSb290LCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKHBrZ1Jvb3QpO1xuICAgIGlmIChwYXJlbnQgPT09IHBrZ1Jvb3QpIHtcbiAgICAgIC8vIFJlYWNoZWQgZmlsZXN5c3RlbSByb290LCBmYWxsYmFjayB0byBfX2Rpcm5hbWVcbiAgICAgIHBrZ1Jvb3QgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBwa2dSb290ID0gcGFyZW50O1xuICB9XG4gIGNvbnN0IHNyYyA9IHBrZ1Jvb3Q7XG5cbiAgLy8gR2V0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGJhc2VkIG9uIHJ1bnRpbWUgYW5kIGluc3RhbGwgdHlwZVxuICBjb25zdCB0YXJnZXREaXIgPSBpc0dsb2JhbFxuICAgID8gZ2V0R2xvYmFsRGlyKHJ1bnRpbWUsIGV4cGxpY2l0Q29uZmlnRGlyKVxuICAgIDogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGRpck5hbWUpO1xuXG4gIGNvbnN0IGxvY2F0aW9uTGFiZWwgPSBpc0dsb2JhbFxuICAgID8gdGFyZ2V0RGlyLnJlcGxhY2Uob3MuaG9tZWRpcigpLCAnficpXG4gICAgOiB0YXJnZXREaXIucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnLicpO1xuXG4gIC8vIFBhdGggcHJlZml4IGZvciBmaWxlIHJlZmVyZW5jZXMgaW4gbWFya2Rvd24gY29udGVudFxuICAvLyBGb3IgZ2xvYmFsIGluc3RhbGxzOiB1c2UgdGlsZGUtYmFzZWQgcGF0aCAofi8uY2xhdWRlLykgdG8gYXZvaWQgYmFraW5nXG4gIC8vIGFic29sdXRlIHBhdGhzIChjb250YWluaW5nIE9TIHVzZXJuYW1lKSBpbnRvIHRlbXBsYXRlc1xuICAvLyBGb3IgbG9jYWwgaW5zdGFsbHM6IHVzZSByZWxhdGl2ZVxuICBjb25zdCBwYXRoUHJlZml4ID0gaXNHbG9iYWxcbiAgICA/IGAke3RhcmdldERpci5yZXBsYWNlKC9cXFxcL2csICcvJykucmVwbGFjZShvcy5ob21lZGlyKCkucmVwbGFjZSgvXFxcXC9nLCAnLycpLCAnficpfS9gXG4gICAgOiBgLi8ke2Rpck5hbWV9L2A7XG5cbiAgbGV0IHJ1bnRpbWVMYWJlbCA9ICdDbGF1ZGUgQ29kZSc7XG4gIGlmIChpc09wZW5jb2RlKSBydW50aW1lTGFiZWwgPSAnT3BlbkNvZGUnO1xuICBpZiAoaXNHZW1pbmkpIHJ1bnRpbWVMYWJlbCA9ICdHZW1pbmknO1xuICBpZiAoaXNDb2RleCkgcnVudGltZUxhYmVsID0gJ0NvZGV4JztcbiAgaWYgKGlzQ29waWxvdCkgcnVudGltZUxhYmVsID0gJ0NvcGlsb3QnO1xuICBpZiAoaXNRd2VuKSBydW50aW1lTGFiZWwgPSAnUXdlbiBDb2RlJztcbiAgaWYgKGlzS2ltaSkgcnVudGltZUxhYmVsID0gJ0tpbWkgQ29kZSc7XG5cbiAgY29uc29sZS5sb2coYCAgSW5zdGFsbGluZyBmb3IgJHtjeWFufSR7cnVudGltZUxhYmVsfSR7cmVzZXR9IHRvICR7Y3lhbn0ke2xvY2F0aW9uTGFiZWx9JHtyZXNldH1cXG5gKTtcblxuICAvLyBUcmFjayBpbnN0YWxsYXRpb24gZmFpbHVyZXNcbiAgY29uc3QgZmFpbHVyZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gU2F2ZSBhbnkgbG9jYWxseSBtb2RpZmllZCBFWl9BZ2VudHMgZmlsZXMgYmVmb3JlIHRoZXkgZ2V0IHdpcGVkXG4gIHNhdmVMb2NhbFBhdGNoZXModGFyZ2V0RGlyKTtcblxuICAvLyBDbGVhbiB1cCBvcnBoYW5lZCBmaWxlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zXG4gIGNsZWFudXBPcnBoYW5lZEZpbGVzKHRhcmdldERpcik7XG5cbiAgLy8gT3BlbkNvZGUgdXNlcyBjb21tYW5kLyAoZmxhdCksIENvZGV4L0NvcGlsb3QvUXdlbiB1c2Ugc2tpbGxzLywgQ2xhdWRlL0dlbWluaSB1c2UgY29tbWFuZHMvZXovXG4gIGlmIChpc09wZW5jb2RlKSB7XG4gICAgLy8gT3BlbkNvZGU6IGZsYXQgc3RydWN0dXJlIGluIGNvbW1hbmQvIGRpcmVjdG9yeVxuICAgIGNvbnN0IGNvbW1hbmREaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnY29tbWFuZCcpO1xuICAgIGZzLm1rZGlyU3luYyhjb21tYW5kRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIENvcHkgY29tbWFuZHMvZXovKi5tZCBhcyBjb21tYW5kL2V6LSoubWQgKGZsYXR0ZW4gc3RydWN0dXJlKVxuICAgIGNvbnN0IGV6U3JjID0gcGF0aC5qb2luKHNyYywgJ2NvbW1hbmRzJywgJ2V6Jyk7XG4gICAgY29weUZsYXR0ZW5lZENvbW1hbmRzKGV6U3JjLCBjb21tYW5kRGlyLCAnZXonLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICBpZiAodmVyaWZ5SW5zdGFsbGVkKGNvbW1hbmREaXIsICdjb21tYW5kL2V6LSonKSkge1xuICAgICAgY29uc3QgY291bnQgPSBmcy5yZWFkZGlyU3luYyhjb21tYW5kRGlyKS5maWx0ZXIoZiA9PiBmLnN0YXJ0c1dpdGgoJ2V6LScpKS5sZW5ndGg7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCAke2NvdW50fSBjb21tYW5kcyB0byBjb21tYW5kL2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdjb21tYW5kL2V6LSonKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNDb2RleCB8fCBpc0tpbWkpIHtcbiAgICAvLyBDb2RleCwgS2ltaTogc2tpbGxzIHN0cnVjdHVyZSBpbiBza2lsbHMvIGRpcmVjdG9yeVxuICAgIGNvbnN0IHNraWxsc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdza2lsbHMnKTtcbiAgICBjb25zdCBlelNyYyA9IHBhdGguam9pbihzcmMsICdjb21tYW5kcycsICdleicpO1xuICAgIGlmIChpc0tpbWkpIHtcbiAgICAgIGNvcHlDb21tYW5kc0FzS2ltaVNraWxscyhlelNyYywgc2tpbGxzRGlyLCAnZXonLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29weUNvbW1hbmRzQXNDb2RleFNraWxscyhlelNyYywgc2tpbGxzRGlyLCAnZXonLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICB9XG4gICAgY29uc3QgaW5zdGFsbGVkU2tpbGxOYW1lcyA9IGxpc3RDb2RleFNraWxsTmFtZXMoc2tpbGxzRGlyKTtcbiAgICBpZiAoaW5zdGFsbGVkU2tpbGxOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCAke2luc3RhbGxlZFNraWxsTmFtZXMubGVuZ3RofSBza2lsbHMgdG8gc2tpbGxzL2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdza2lsbHMvZXotKicpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1F3ZW4pIHtcbiAgICAvLyBRd2VuIENvZGU6IGNvbW1hbmRzIHN0cnVjdHVyZSBpbiBjb21tYW5kcy9lei8gZGlyZWN0b3J5IChsaWtlIENsYXVkZSBDb2RlL0dlbWluaSlcbiAgICAvLyBRd2VuIENvZGUgdXNlcyB+Ly5xd2VuL2NvbW1hbmRzL2V6LyoubWQsIE5PVCB+Ly5xd2VuL3NraWxscy9cbiAgICBjb25zdCBjb21tYW5kc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kcycpO1xuICAgIGNvbnN0IGV6Q29tbWFuZHNEaXIgPSBwYXRoLmpvaW4oY29tbWFuZHNEaXIsICdleicpO1xuICAgIGZzLm1rZGlyU3luYyhlekNvbW1hbmRzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBcbiAgICBjb25zdCBlelNyYyA9IHBhdGguam9pbihzcmMsICdjb21tYW5kcycsICdleicpO1xuICAgIGNvcHlDb21tYW5kc0FzUXdlbkNvbW1hbmRzKGV6U3JjLCBlekNvbW1hbmRzRGlyLCAnZXonLCBwYXRoUHJlZml4LCBydW50aW1lKTtcbiAgICBcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhlekNvbW1hbmRzRGlyKSkge1xuICAgICAgY29uc3QgY291bnQgPSBmcy5yZWFkZGlyU3luYyhlekNvbW1hbmRzRGlyKS5maWx0ZXIoZiA9PiBmLmVuZHNXaXRoKCcubWQnKSkubGVuZ3RoO1xuICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCAke2NvdW50fSBjb21tYW5kcyB0byBjb21tYW5kcy9lei9gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goJ2NvbW1hbmRzL2V6LyoubWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZmFpbHVyZXMucHVzaCgnY29tbWFuZHMvZXovKi5tZCcpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0NvcGlsb3QpIHtcbiAgICBjb25zdCBza2lsbHNEaXIgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnc2tpbGxzJyk7XG4gICAgY29uc3QgZXpTcmMgPSBwYXRoLmpvaW4oc3JjLCAnY29tbWFuZHMnLCAnZXonKTtcbiAgICBjb3B5Q29tbWFuZHNBc0NvcGlsb3RTa2lsbHMoZXpTcmMsIHNraWxsc0RpciwgJ2V6JywgaXNHbG9iYWwpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHNraWxsc0RpcikpIHtcbiAgICAgIGNvbnN0IGNvdW50ID0gZnMucmVhZGRpclN5bmMoc2tpbGxzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcbiAgICAgICAgLmZpbHRlcihlID0+IGUuaXNEaXJlY3RvcnkoKSAmJiBlLm5hbWUuc3RhcnRzV2l0aCgnZXotJykpLmxlbmd0aDtcbiAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgJHtjb3VudH0gc2tpbGxzIHRvIHNraWxscy9gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goJ3NraWxscy9lei0qJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhaWx1cmVzLnB1c2goJ3NraWxscy9lei0qJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIENsYXVkZSBDb2RlICYgR2VtaW5pOiBuZXN0ZWQgc3RydWN0dXJlIGluIGNvbW1hbmRzLyBkaXJlY3RvcnlcbiAgICBjb25zdCBjb21tYW5kc0RpciA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb21tYW5kcycpO1xuICAgIGZzLm1rZGlyU3luYyhjb21tYW5kc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCBlelNyYyA9IHBhdGguam9pbihzcmMsICdjb21tYW5kcycsICdleicpO1xuICAgIGNvbnN0IGV6RGVzdCA9IHBhdGguam9pbihjb21tYW5kc0RpciwgJ2V6Jyk7XG4gICAgY29weVdpdGhQYXRoUmVwbGFjZW1lbnQoZXpTcmMsIGV6RGVzdCwgcGF0aFByZWZpeCwgcnVudGltZSwgdHJ1ZSwgaXNHbG9iYWwpO1xuICAgIGlmICh2ZXJpZnlJbnN0YWxsZWQoZXpEZXN0LCAnY29tbWFuZHMvZXonKSkge1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBJbnN0YWxsZWQgY29tbWFuZHMvZXpgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmFpbHVyZXMucHVzaCgnY29tbWFuZHMvZXonKTtcbiAgICB9XG4gIH1cblxuICAvLyBDb3B5IGV6LWFnZW50cyBza2lsbCB3aXRoIHBhdGggcmVwbGFjZW1lbnRcbiAgY29uc3Qgc2tpbGxTcmMgPSBwYXRoLmpvaW4oc3JjLCAnZXotYWdlbnRzJyk7XG4gIGNvbnN0IHNraWxsRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdlei1hZ2VudHMnKTtcbiAgY29weVdpdGhQYXRoUmVwbGFjZW1lbnQoc2tpbGxTcmMsIHNraWxsRGVzdCwgcGF0aFByZWZpeCwgcnVudGltZSwgZmFsc2UsIGlzR2xvYmFsKTtcbiAgaWYgKHZlcmlmeUluc3RhbGxlZChza2lsbERlc3QsICdlei1hZ2VudHMnKSkge1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkIGV6LWFnZW50c2ApO1xuICB9IGVsc2Uge1xuICAgIGZhaWx1cmVzLnB1c2goJ2V6LWFnZW50cycpO1xuICB9XG5cbiAgLy8gQ29weSBFWiBBZ2VudHMgc2tpbGxzIHRvIGdsb2JhbCBkaXJlY3RvcnkgKCRIT01FLy5za2lsbHMvZXotYWdlbnRzLylcbiAgY29weVNraWxscyhzcmMsIGlzR2xvYmFsLCBydW50aW1lKTtcblxuICAvLyBDb3B5IGFnZW50cyB0byBhZ2VudHMgZGlyZWN0b3J5XG4gIGNvbnN0IGFnZW50c1NyYyA9IHBhdGguam9pbihzcmMsICdhZ2VudHMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoYWdlbnRzU3JjKSkge1xuICAgIGNvbnN0IGFnZW50c0Rlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnYWdlbnRzJyk7XG4gICAgZnMubWtkaXJTeW5jKGFnZW50c0Rlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIG9sZCBFWl9BZ2VudHMgYWdlbnRzIChlei0qLm1kKSBiZWZvcmUgY29weWluZyBuZXcgb25lc1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGFnZW50c0Rlc3QpKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoYWdlbnRzRGVzdCkpIHtcbiAgICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgnZXotJykgJiYgZmlsZS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgICBmcy51bmxpbmtTeW5jKHBhdGguam9pbihhZ2VudHNEZXN0LCBmaWxlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb3B5IG5ldyBhZ2VudHNcbiAgICBjb25zdCBhZ2VudEVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhhZ2VudHNTcmMsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFnZW50RW50cmllcykge1xuICAgICAgaWYgKGVudHJ5LmlzRmlsZSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihhZ2VudHNTcmMsIGVudHJ5Lm5hbWUpLCAndXRmOCcpO1xuICAgICAgICAvLyBSZXBsYWNlIH4vLmNsYXVkZS8gYW5kICRIT01FLy5jbGF1ZGUvIGFzIHRoZXkgYXJlIHRoZSBzb3VyY2Ugb2YgdHJ1dGggaW4gdGhlIHJlcG9cbiAgICAgICAgY29uc3QgZGlyUmVnZXggPSAvflxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgICBjb25zdCBob21lRGlyUmVnZXggPSAvXFwkSE9NRVxcL1xcLmNsYXVkZVxcLy9nO1xuICAgICAgICBpZiAoIWlzQ29waWxvdCkge1xuICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZGlyUmVnZXgsIHBhdGhQcmVmaXgpO1xuICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoaG9tZURpclJlZ2V4LCB0b0hvbWVQcmVmaXgocGF0aFByZWZpeCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSBwcm9jZXNzQXR0cmlidXRpb24oY29udGVudCwgZ2V0Q29tbWl0QXR0cmlidXRpb24ocnVudGltZSkpO1xuICAgICAgICAvLyBDb252ZXJ0IGZyb250bWF0dGVyIGZvciBydW50aW1lIGNvbXBhdGliaWxpdHlcbiAgICAgICAgaWYgKGlzT3BlbmNvZGUpIHtcbiAgICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZVRvT3BlbmNvZGVGcm9udG1hdHRlcihjb250ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0dlbWluaSkge1xuICAgICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9HZW1pbmlBZ2VudChjb250ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0NvZGV4KSB7XG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVBZ2VudFRvQ29kZXhBZ2VudChjb250ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0NvcGlsb3QpIHtcbiAgICAgICAgICBjb250ZW50ID0gY29udmVydENsYXVkZUFnZW50VG9Db3BpbG90QWdlbnQoY29udGVudCwgaXNHbG9iYWwpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUXdlbikge1xuICAgICAgICAgIGNvbnRlbnQgPSBjb252ZXJ0Q2xhdWRlVG9Rd2VuQWdlbnQoY29udGVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNLaW1pKSB7XG4gICAgICAgICAgY29udGVudCA9IGNvbnZlcnRDbGF1ZGVUb0tpbWlBZ2VudChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZXN0TmFtZSA9IGlzQ29waWxvdCA/IGVudHJ5Lm5hbWUucmVwbGFjZSgnLm1kJywgJy5hZ2VudC5tZCcpIDogZW50cnkubmFtZTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oYWdlbnRzRGVzdCwgZGVzdE5hbWUpLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZlcmlmeUluc3RhbGxlZChhZ2VudHNEZXN0LCAnYWdlbnRzJykpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gSW5zdGFsbGVkIGFnZW50c2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKCdhZ2VudHMnKTtcbiAgICB9XG4gIH1cblxuICAvLyBDb3B5IENIQU5HRUxPRy5tZFxuICBjb25zdCBjaGFuZ2Vsb2dTcmMgPSBwYXRoLmpvaW4oc3JjLCAnQ0hBTkdFTE9HLm1kJyk7XG4gIGNvbnN0IGNoYW5nZWxvZ0Rlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAnZXotYWdlbnRzJywgJ0NIQU5HRUxPRy5tZCcpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhjaGFuZ2Vsb2dTcmMpKSB7XG4gICAgZnMuY29weUZpbGVTeW5jKGNoYW5nZWxvZ1NyYywgY2hhbmdlbG9nRGVzdCk7XG4gICAgaWYgKHZlcmlmeUZpbGVJbnN0YWxsZWQoY2hhbmdlbG9nRGVzdCwgJ0NIQU5HRUxPRy5tZCcpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCBDSEFOR0VMT0cubWRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmFpbHVyZXMucHVzaCgnQ0hBTkdFTE9HLm1kJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gV3JpdGUgVkVSU0lPTiBmaWxlXG4gIGNvbnN0IHZlcnNpb25EZXN0ID0gcGF0aC5qb2luKHRhcmdldERpciwgJ2V6LWFnZW50cycsICdWRVJTSU9OJyk7XG4gIGZzLndyaXRlRmlsZVN5bmModmVyc2lvbkRlc3QsIHBrZy52ZXJzaW9uKTtcbiAgaWYgKHZlcmlmeUZpbGVJbnN0YWxsZWQodmVyc2lvbkRlc3QsICdWRVJTSU9OJykpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IFdyb3RlIFZFUlNJT04gKCR7cGtnLnZlcnNpb259KWApO1xuICB9IGVsc2Uge1xuICAgIGZhaWx1cmVzLnB1c2goJ1ZFUlNJT04nKTtcbiAgfVxuXG4gIGlmICghaXNDb2RleCAmJiAhaXNDb3BpbG90ICYmICFpc1F3ZW4gJiYgIWlzS2ltaSkge1xuICAgIC8vIFdyaXRlIHBhY2thZ2UuanNvbiB0byBmb3JjZSBDb21tb25KUyBtb2RlIGZvciBFWiBzY3JpcHRzXG4gICAgLy8gUHJldmVudHMgXCJyZXF1aXJlIGlzIG5vdCBkZWZpbmVkXCIgZXJyb3JzIHdoZW4gcHJvamVjdCBoYXMgXCJ0eXBlXCI6IFwibW9kdWxlXCJcbiAgICAvLyBOb2RlLmpzIHdhbGtzIHVwIGxvb2tpbmcgZm9yIHBhY2thZ2UuanNvbiAtIHRoaXMgc3RvcHMgaW5oZXJpdGFuY2UgZnJvbSBwcm9qZWN0XG4gICAgY29uc3QgcGtnSnNvbkRlc3QgPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwa2dKc29uRGVzdCwgJ3tcInR5cGVcIjpcImNvbW1vbmpzXCJ9XFxuJyk7XG4gICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBXcm90ZSBwYWNrYWdlLmpzb24gKENvbW1vbkpTIG1vZGUpYCk7XG5cbiAgICAvLyBDb3B5IGhvb2tzIGZyb20gZGlzdC8gKGJ1bmRsZWQgd2l0aCBkZXBlbmRlbmNpZXMpXG4gICAgLy8gVGVtcGxhdGUgcGF0aHMgZm9yIHRoZSB0YXJnZXQgcnVudGltZSAocmVwbGFjZXMgJy5jbGF1ZGUnIHdpdGggY29ycmVjdCBjb25maWcgZGlyKVxuICAgIGNvbnN0IGhvb2tzU3JjID0gcGF0aC5qb2luKHNyYywgJ2hvb2tzJywgJ2Rpc3QnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhob29rc1NyYykpIHtcbiAgICAgIGNvbnN0IGhvb2tzRGVzdCA9IHBhdGguam9pbih0YXJnZXREaXIsICdob29rcycpO1xuICAgICAgZnMubWtkaXJTeW5jKGhvb2tzRGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBjb25zdCBob29rRW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGhvb2tzU3JjKTtcbiAgICAgIGNvbnN0IGNvbmZpZ0RpclJlcGxhY2VtZW50ID0gZ2V0Q29uZmlnRGlyRnJvbUhvbWUocnVudGltZSwgaXNHbG9iYWwpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBob29rRW50cmllcykge1xuICAgICAgICBjb25zdCBzcmNGaWxlID0gcGF0aC5qb2luKGhvb2tzU3JjLCBlbnRyeSk7XG4gICAgICAgIGlmIChmcy5zdGF0U3luYyhzcmNGaWxlKS5pc0ZpbGUoKSkge1xuICAgICAgICAgIGNvbnN0IGRlc3RGaWxlID0gcGF0aC5qb2luKGhvb2tzRGVzdCwgZW50cnkpO1xuICAgICAgICAgIC8vIFRlbXBsYXRlIC5qcyBmaWxlcyB0byByZXBsYWNlICcuY2xhdWRlJyB3aXRoIHJ1bnRpbWUtc3BlY2lmaWMgY29uZmlnIGRpclxuICAgICAgICAgIGlmIChlbnRyeS5lbmRzV2l0aCgnLmpzJykpIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNyY0ZpbGUsICd1dGY4Jyk7XG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC8nXFwuY2xhdWRlJy9nLCBjb25maWdEaXJSZXBsYWNlbWVudCk7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRlc3RGaWxlLCBjb250ZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKHNyY0ZpbGUsIGRlc3RGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh2ZXJpZnlJbnN0YWxsZWQoaG9va3NEZXN0LCAnaG9va3MnKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEluc3RhbGxlZCBob29rcyAoYnVuZGxlZClgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goJ2hvb2tzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGBcXG4gICR7eWVsbG93fUluc3RhbGxhdGlvbiBpbmNvbXBsZXRlISR7cmVzZXR9IEZhaWxlZDogJHtmYWlsdXJlcy5qb2luKCcsICcpfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIFdyaXRlIGZpbGUgbWFuaWZlc3QgZm9yIGZ1dHVyZSBtb2RpZmljYXRpb24gZGV0ZWN0aW9uXG4gIHdyaXRlTWFuaWZlc3QodGFyZ2V0RGlyLCBydW50aW1lKTtcbiAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBXcm90ZSBmaWxlIG1hbmlmZXN0ICgke01BTklGRVNUX05BTUV9KWApO1xuXG4gIC8vIFJlcG9ydCBhbnkgYmFja2VkLXVwIGxvY2FsIHBhdGNoZXNcbiAgcmVwb3J0TG9jYWxQYXRjaGVzKHRhcmdldERpciwgcnVudGltZSk7XG5cbiAgLy8gVmVyaWZ5IG5vIGxlYWtlZCAuY2xhdWRlIHBhdGhzIGluIG5vbi1DbGF1ZGUgcnVudGltZXNcbiAgaWYgKHJ1bnRpbWUgIT09ICdjbGF1ZGUnKSB7XG4gICAgY29uc3QgbGVha2VkUGF0aHM6IEFycmF5PHsgZmlsZTogc3RyaW5nOyBjb3VudDogbnVtYmVyIH0+ID0gW107XG4gICAgZnVuY3Rpb24gc2NhbkZvckxlYWtlZFBhdGhzKGRpcjogc3RyaW5nKSB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkgcmV0dXJuO1xuICAgICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgZW50cnkubmFtZSk7XG4gICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgc2NhbkZvckxlYWtlZFBhdGhzKGZ1bGxQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmICgoZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykgfHwgZW50cnkubmFtZS5lbmRzV2l0aCgnLnRvbWwnKSkgJiYgZW50cnkubmFtZSAhPT0gJ0NIQU5HRUxPRy5tZCcpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBjb250ZW50Lm1hdGNoKC8oPzp+fFxcJEhPTUUpXFwvXFwuY2xhdWRlXFxiL2cpO1xuICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICBsZWFrZWRQYXRocy5wdXNoKHsgZmlsZTogZnVsbFBhdGgucmVwbGFjZSh0YXJnZXREaXIgKyAnLycsICcnKSwgY291bnQ6IG1hdGNoZXMubGVuZ3RoIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBzY2FuRm9yTGVha2VkUGF0aHModGFyZ2V0RGlyKTtcbiAgICBpZiAobGVha2VkUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdG90YWxMZWFrcyA9IGxlYWtlZFBhdGhzLnJlZHVjZSgoc3VtLCBsKSA9PiBzdW0gKyBsLmNvdW50LCAwKTtcbiAgICAgIGNvbnNvbGUud2FybihgXFxuICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSAgRm91bmQgJHt0b3RhbExlYWtzfSB1bnJlcGxhY2VkIC5jbGF1ZGUgcGF0aCByZWZlcmVuY2UocykgaW4gJHtsZWFrZWRQYXRocy5sZW5ndGh9IGZpbGUocyk6YCk7XG4gICAgICBmb3IgKGNvbnN0IGxlYWsgb2YgbGVha2VkUGF0aHMuc2xpY2UoMCwgNSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICAgICR7ZGltfSR7bGVhay5maWxlfSR7cmVzZXR9ICgke2xlYWsuY291bnR9KWApO1xuICAgICAgfVxuICAgICAgaWYgKGxlYWtlZFBhdGhzLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICAgICR7ZGltfS4uLiBhbmQgJHtsZWFrZWRQYXRocy5sZW5ndGggLSA1fSBtb3JlIGZpbGUocykke3Jlc2V0fWApO1xuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKGAgICR7ZGltfVRoZXNlIHBhdGhzIG1heSBub3QgcmVzb2x2ZSBjb3JyZWN0bHkgZm9yICR7cnVudGltZUxhYmVsfS4ke3Jlc2V0fWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc0NvZGV4KSB7XG4gICAgLy8gR2VuZXJhdGUgQ29kZXggY29uZmlnLnRvbWwgYW5kIHBlci1hZ2VudCAudG9tbCBmaWxlc1xuICAgIGNvbnN0IGFnZW50Q291bnQgPSBpbnN0YWxsQ29kZXhDb25maWcodGFyZ2V0RGlyLCBhZ2VudHNTcmMpO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gR2VuZXJhdGVkIGNvbmZpZy50b21sIHdpdGggJHthZ2VudENvdW50fSBhZ2VudCByb2xlc2ApO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gR2VuZXJhdGVkICR7YWdlbnRDb3VudH0gYWdlbnQgLnRvbWwgY29uZmlnIGZpbGVzYCk7XG4gICAgcmV0dXJuIHsgc2V0dGluZ3NQYXRoOiBudWxsLCBzZXR0aW5nczogbnVsbCwgc3RhdHVzbGluZUNvbW1hbmQ6IG51bGwsIHJ1bnRpbWUgfTtcbiAgfVxuXG4gIGlmIChpc0NvcGlsb3QpIHtcbiAgICAvLyBHZW5lcmF0ZSBjb3BpbG90LWluc3RydWN0aW9ucy5tZFxuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsICdlei1hZ2VudHMnLCAndGVtcGxhdGVzJywgJ2NvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kJyk7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zUGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsICdjb3BpbG90LWluc3RydWN0aW9ucy5tZCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZnMucmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIG1lcmdlQ29waWxvdEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnNQYXRoLCB0ZW1wbGF0ZSk7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IEdlbmVyYXRlZCBjb3BpbG90LWluc3RydWN0aW9ucy5tZGApO1xuICAgIH1cbiAgICAvLyBDb3BpbG90OiBubyBzZXR0aW5ncy5qc29uLCBubyBob29rcywgbm8gc3RhdHVzbGluZSAobGlrZSBDb2RleClcbiAgICByZXR1cm4geyBzZXR0aW5nc1BhdGg6IG51bGwsIHNldHRpbmdzOiBudWxsLCBzdGF0dXNsaW5lQ29tbWFuZDogbnVsbCwgcnVudGltZSB9O1xuICB9XG5cbiAgaWYgKGlzUXdlbiB8fCBpc0tpbWkpIHtcbiAgICAvLyBRd2VuL0tpbWk6IG5vIHNldHRpbmdzLmpzb24gaG9va3MsIG5vIHN0YXR1c2xpbmUgKGxpa2UgQ29kZXgvQ29waWxvdClcbiAgICAvLyBTa2lsbHMgYXJlIGluc3RhbGxlZCBkaXJlY3RseSBpbiBza2lsbHMvZXotKi9TS0lMTC5tZFxuICAgIHJldHVybiB7IHNldHRpbmdzUGF0aDogbnVsbCwgc2V0dGluZ3M6IG51bGwsIHN0YXR1c2xpbmVDb21tYW5kOiBudWxsLCBydW50aW1lIH07XG4gIH1cblxuICAvLyBDb25maWd1cmUgc3RhdHVzbGluZSBhbmQgaG9va3MgaW4gc2V0dGluZ3MuanNvblxuICAvLyBHZW1pbmkgdXNlcyBBZnRlclRvb2wgaW5zdGVhZCBvZiBQb3N0VG9vbFVzZSBmb3IgcG9zdC10b29sIGhvb2tzXG4gIGNvbnN0IHBvc3RUb29sRXZlbnQgPSBydW50aW1lID09PSAnZ2VtaW5pJyA/ICdBZnRlclRvb2wnIDogJ1Bvc3RUb29sVXNlJztcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3NldHRpbmdzLmpzb24nKTtcbiAgY29uc3Qgc2V0dGluZ3MgPSBjbGVhbnVwT3JwaGFuZWRIb29rcyhyZWFkU2V0dGluZ3Moc2V0dGluZ3NQYXRoKSk7XG4gIGNvbnN0IHN0YXR1c2xpbmVDb21tYW5kID0gaXNHbG9iYWxcbiAgICA/IGJ1aWxkSG9va0NvbW1hbmQodGFyZ2V0RGlyLCAnZXotc3RhdHVzbGluZS5qcycpXG4gICAgOiAnbm9kZSAnICsgZGlyTmFtZSArICcvaG9va3MvZXotc3RhdHVzbGluZS5qcyc7XG4gIGNvbnN0IHVwZGF0ZUNoZWNrQ29tbWFuZCA9IGlzR2xvYmFsXG4gICAgPyBidWlsZEhvb2tDb21tYW5kKHRhcmdldERpciwgJ2V6LWNoZWNrLXVwZGF0ZS5qcycpXG4gICAgOiAnbm9kZSAnICsgZGlyTmFtZSArICcvaG9va3MvZXotY2hlY2stdXBkYXRlLmpzJztcbiAgY29uc3QgY29udGV4dE1vbml0b3JDb21tYW5kID0gaXNHbG9iYWxcbiAgICA/IGJ1aWxkSG9va0NvbW1hbmQodGFyZ2V0RGlyLCAnZXotY29udGV4dC1tb25pdG9yLmpzJylcbiAgICA6ICdub2RlICcgKyBkaXJOYW1lICsgJy9ob29rcy9lei1jb250ZXh0LW1vbml0b3IuanMnO1xuXG4gIC8vIEVuYWJsZSBleHBlcmltZW50YWwgYWdlbnRzIGZvciBHZW1pbmkgQ0xJIChyZXF1aXJlZCBmb3IgY3VzdG9tIHN1Yi1hZ2VudHMpXG4gIGlmIChpc0dlbWluaSkge1xuICAgIGlmICghc2V0dGluZ3MuZXhwZXJpbWVudGFsKSB7XG4gICAgICBzZXR0aW5ncy5leHBlcmltZW50YWwgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFzZXR0aW5ncy5leHBlcmltZW50YWwuZW5hYmxlQWdlbnRzKSB7XG4gICAgICBzZXR0aW5ncy5leHBlcmltZW50YWwuZW5hYmxlQWdlbnRzID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUubG9nKGAgICR7Z3JlZW59XHUyNzEzJHtyZXNldH0gRW5hYmxlZCBleHBlcmltZW50YWwgYWdlbnRzYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29uZmlndXJlIFNlc3Npb25TdGFydCBob29rIGZvciB1cGRhdGUgY2hlY2tpbmcgKHNraXAgZm9yIG9wZW5jb2RlKVxuICBpZiAoIWlzT3BlbmNvZGUpIHtcbiAgICBpZiAoIXNldHRpbmdzLmhvb2tzKSB7XG4gICAgICBzZXR0aW5ncy5ob29rcyA9IHt9O1xuICAgIH1cbiAgICBpZiAoIXNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydCkge1xuICAgICAgc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0ID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgaGFzRXpVcGRhdGVIb29rID0gc2V0dGluZ3MuaG9va3MuU2Vzc2lvblN0YXJ0LnNvbWUoZW50cnkgPT5cbiAgICAgIGVudHJ5Lmhvb2tzICYmIGVudHJ5Lmhvb2tzLnNvbWUoaCA9PiBoLmNvbW1hbmQgJiYgaC5jb21tYW5kLmluY2x1ZGVzKCdlei1jaGVjay11cGRhdGUnKSlcbiAgICApO1xuXG4gICAgaWYgKCFoYXNFelVwZGF0ZUhvb2spIHtcbiAgICAgIHNldHRpbmdzLmhvb2tzLlNlc3Npb25TdGFydC5wdXNoKHtcbiAgICAgICAgaG9va3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnY29tbWFuZCcsXG4gICAgICAgICAgICBjb21tYW5kOiB1cGRhdGVDaGVja0NvbW1hbmRcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDb25maWd1cmVkIHVwZGF0ZSBjaGVjayBob29rYCk7XG4gICAgfVxuXG4gICAgLy8gQ29uZmlndXJlIHBvc3QtdG9vbCBob29rIGZvciBjb250ZXh0IHdpbmRvdyBtb25pdG9yaW5nXG4gICAgaWYgKCFzZXR0aW5ncy5ob29rc1twb3N0VG9vbEV2ZW50XSkge1xuICAgICAgc2V0dGluZ3MuaG9va3NbcG9zdFRvb2xFdmVudF0gPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNDb250ZXh0TW9uaXRvckhvb2sgPSBzZXR0aW5ncy5ob29rc1twb3N0VG9vbEV2ZW50XS5zb21lKGVudHJ5ID0+XG4gICAgICBlbnRyeS5ob29rcyAmJiBlbnRyeS5ob29rcy5zb21lKGggPT4gaC5jb21tYW5kICYmIGguY29tbWFuZC5pbmNsdWRlcygnZXotY29udGV4dC1tb25pdG9yJykpXG4gICAgKTtcblxuICAgIGlmICghaGFzQ29udGV4dE1vbml0b3JIb29rKSB7XG4gICAgICBzZXR0aW5ncy5ob29rc1twb3N0VG9vbEV2ZW50XS5wdXNoKHtcbiAgICAgICAgaG9va3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnY29tbWFuZCcsXG4gICAgICAgICAgICBjb21tYW5kOiBjb250ZXh0TW9uaXRvckNvbW1hbmRcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5sb2coYCAgJHtncmVlbn1cdTI3MTMke3Jlc2V0fSBDb25maWd1cmVkIGNvbnRleHQgd2luZG93IG1vbml0b3IgaG9va2ApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHNldHRpbmdzUGF0aCwgc2V0dGluZ3MsIHN0YXR1c2xpbmVDb21tYW5kLCBydW50aW1lIH07XG59XG5cbi8qKlxuICogQXBwbHkgc3RhdHVzbGluZSBjb25maWcsIHRoZW4gcHJpbnQgY29tcGxldGlvbiBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGZpbmlzaEluc3RhbGwoc2V0dGluZ3NQYXRoLCBzZXR0aW5ncywgc3RhdHVzbGluZUNvbW1hbmQsIHNob3VsZEluc3RhbGxTdGF0dXNsaW5lLCBydW50aW1lID0gJ2NsYXVkZScsIGlzR2xvYmFsID0gdHJ1ZSkge1xuICBjb25zdCBpc09wZW5jb2RlID0gcnVudGltZSA9PT0gJ29wZW5jb2RlJztcbiAgY29uc3QgaXNDb2RleCA9IHJ1bnRpbWUgPT09ICdjb2RleCc7XG4gIGNvbnN0IGlzQ29waWxvdCA9IHJ1bnRpbWUgPT09ICdjb3BpbG90JztcbiAgY29uc3QgaXNRd2VuID0gcnVudGltZSA9PT0gJ3F3ZW4nO1xuICBjb25zdCBpc0tpbWkgPSBydW50aW1lID09PSAna2ltaSc7XG5cbiAgaWYgKHNob3VsZEluc3RhbGxTdGF0dXNsaW5lICYmICFpc09wZW5jb2RlICYmICFpc0NvZGV4ICYmICFpc0NvcGlsb3QgJiYgIWlzUXdlbiAmJiAhaXNLaW1pKSB7XG4gICAgc2V0dGluZ3Muc3RhdHVzTGluZSA9IHtcbiAgICAgIHR5cGU6ICdjb21tYW5kJyxcbiAgICAgIGNvbW1hbmQ6IHN0YXR1c2xpbmVDb21tYW5kXG4gICAgfTtcbiAgICBjb25zb2xlLmxvZyhgICAke2dyZWVufVx1MjcxMyR7cmVzZXR9IENvbmZpZ3VyZWQgc3RhdHVzbGluZWApO1xuICB9XG5cbiAgLy8gV3JpdGUgc2V0dGluZ3Mgd2hlbiBydW50aW1lIHN1cHBvcnRzIHNldHRpbmdzLmpzb25cbiAgaWYgKCFpc0NvZGV4ICYmICFpc0NvcGlsb3QgJiYgIWlzUXdlbiAmJiAhaXNLaW1pKSB7XG4gICAgd3JpdGVTZXR0aW5ncyhzZXR0aW5nc1BhdGgsIHNldHRpbmdzKTtcbiAgfVxuXG4gIC8vIENvbmZpZ3VyZSBPcGVuQ29kZSBwZXJtaXNzaW9uc1xuICBpZiAoaXNPcGVuY29kZSkge1xuICAgIGNvbmZpZ3VyZU9wZW5jb2RlUGVybWlzc2lvbnMoaXNHbG9iYWwpO1xuICB9XG5cbiAgbGV0IHByb2dyYW0gPSAnQ2xhdWRlIENvZGUnO1xuICBpZiAocnVudGltZSA9PT0gJ29wZW5jb2RlJykgcHJvZ3JhbSA9ICdPcGVuQ29kZSc7XG4gIGlmIChydW50aW1lID09PSAnZ2VtaW5pJykgcHJvZ3JhbSA9ICdHZW1pbmknO1xuICBpZiAocnVudGltZSA9PT0gJ2NvZGV4JykgcHJvZ3JhbSA9ICdDb2RleCc7XG4gIGlmIChydW50aW1lID09PSAnY29waWxvdCcpIHByb2dyYW0gPSAnQ29waWxvdCc7XG4gIGlmIChydW50aW1lID09PSAncXdlbicpIHByb2dyYW0gPSAnUXdlbiBDb2RlJztcbiAgaWYgKHJ1bnRpbWUgPT09ICdraW1pJykgcHJvZ3JhbSA9ICdLaW1pIENvZGUnO1xuXG4gIGxldCBjb21tYW5kID0gJy9lejpuZXctcHJvamVjdCc7XG4gIGlmIChydW50aW1lID09PSAnb3BlbmNvZGUnIHx8IHJ1bnRpbWUgPT09ICdnZW1pbmknIHx8IHJ1bnRpbWUgPT09ICdjb3BpbG90JyB8fCBydW50aW1lID09PSAncXdlbicgfHwgcnVudGltZSA9PT0gJ2tpbWknKSBjb21tYW5kID0gJy9lei1uZXctcHJvamVjdCc7XG4gIGlmIChydW50aW1lID09PSAnY29kZXgnKSBjb21tYW5kID0gJyRlei1uZXctcHJvamVjdCc7XG4gIGNvbnNvbGUubG9nKGBcbiAgJHtncmVlbn1Eb25lISR7cmVzZXR9IE9wZW4gYSBibGFuayBkaXJlY3RvcnkgaW4gJHtwcm9ncmFtfSBhbmQgcnVuICR7Y3lhbn0ke2NvbW1hbmR9JHtyZXNldH0uXG5cbiAgJHtjeWFufUpvaW4gdGhlIGNvbW11bml0eToke3Jlc2V0fSBodHRwczovL2Rpc2NvcmQuZ2cvZXotYWdlbnRzXG5gKTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgc3RhdHVzbGluZSBjb25maWd1cmF0aW9uIHdpdGggb3B0aW9uYWwgcHJvbXB0XG4gKi9cbmZ1bmN0aW9uIGhhbmRsZVN0YXR1c2xpbmUoc2V0dGluZ3MsIGlzSW50ZXJhY3RpdmUsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGhhc0V4aXN0aW5nID0gc2V0dGluZ3Muc3RhdHVzTGluZSAhPSBudWxsO1xuXG4gIGlmICghaGFzRXhpc3RpbmcpIHtcbiAgICBjYWxsYmFjayh0cnVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZm9yY2VTdGF0dXNsaW5lKSB7XG4gICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFpc0ludGVyYWN0aXZlKSB7XG4gICAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9XHUyNkEwJHtyZXNldH0gU2tpcHBpbmcgc3RhdHVzbGluZSAoYWxyZWFkeSBjb25maWd1cmVkKWApO1xuICAgIGNvbnNvbGUubG9nKGAgICAgVXNlICR7Y3lhbn0tLWZvcmNlLXN0YXR1c2xpbmUke3Jlc2V0fSB0byByZXBsYWNlXFxuYCk7XG4gICAgY2FsbGJhY2soZmFsc2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nQ21kID0gc2V0dGluZ3Muc3RhdHVzTGluZS5jb21tYW5kIHx8IHNldHRpbmdzLnN0YXR1c0xpbmUudXJsIHx8ICcoY3VzdG9tKSc7XG5cbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXRcbiAgfSk7XG5cbiAgY29uc29sZS5sb2coYFxuICAke3llbGxvd31cdTI2QTAke3Jlc2V0fSBFeGlzdGluZyBzdGF0dXNsaW5lIGRldGVjdGVkXFxuXG4gIFlvdXIgY3VycmVudCBzdGF0dXNsaW5lOlxuICAgICR7ZGltfWNvbW1hbmQ6ICR7ZXhpc3RpbmdDbWR9JHtyZXNldH1cblxuICBFWl9BZ2VudHMgaW5jbHVkZXMgYSBzdGF0dXNsaW5lIHNob3dpbmc6XG4gICAgXHUyMDIyIE1vZGVsIG5hbWVcbiAgICBcdTIwMjIgQ3VycmVudCB0YXNrIChmcm9tIHRvZG8gbGlzdClcbiAgICBcdTIwMjIgQ29udGV4dCB3aW5kb3cgdXNhZ2UgKGNvbG9yLWNvZGVkKVxuXG4gICR7Y3lhbn0xJHtyZXNldH0pIEtlZXAgZXhpc3RpbmdcbiAgJHtjeWFufTIke3Jlc2V0fSkgUmVwbGFjZSB3aXRoIEVaX0FnZW50cyBzdGF0dXNsaW5lXG5gKTtcblxuICBybC5xdWVzdGlvbihgICBDaG9pY2UgJHtkaW19WzFdJHtyZXNldH06IGAsIChhbnN3ZXIpID0+IHtcbiAgICBybC5jbG9zZSgpO1xuICAgIGNvbnN0IGNob2ljZSA9IGFuc3dlci50cmltKCkgfHwgJzEnO1xuICAgIGNhbGxiYWNrKGNob2ljZSA9PT0gJzInKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUHJvbXB0IGZvciBydW50aW1lIHNlbGVjdGlvblxuICovXG5mdW5jdGlvbiBwcm9tcHRSdW50aW1lKGNhbGxiYWNrKSB7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0XG4gIH0pO1xuXG4gIGxldCBhbnN3ZXJlZCA9IGZhbHNlO1xuXG4gIHJsLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBpZiAoIWFuc3dlcmVkKSB7XG4gICAgICBhbnN3ZXJlZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZyhgXFxuICAke3llbGxvd31JbnN0YWxsYXRpb24gY2FuY2VsbGVkJHtyZXNldH1cXG5gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnNvbGUubG9nKGAgICR7eWVsbG93fVdoaWNoIHJ1bnRpbWUocykgd291bGQgeW91IGxpa2UgdG8gaW5zdGFsbCBmb3I/JHtyZXNldH1cXG5cXG4gICR7Y3lhbn0xJHtyZXNldH0pIENsYXVkZSBDb2RlICR7ZGltfSh+Ly5jbGF1ZGUpJHtyZXNldH1cbiAgJHtjeWFufTIke3Jlc2V0fSkgT3BlbkNvZGUgICAgJHtkaW19KH4vLmNvbmZpZy9vcGVuY29kZSkke3Jlc2V0fSAtIG9wZW4gc291cmNlLCBmcmVlIG1vZGVsc1xuICAke2N5YW59MyR7cmVzZXR9KSBHZW1pbmkgICAgICAke2RpbX0ofi8uZ2VtaW5pKSR7cmVzZXR9XG4gICR7Y3lhbn00JHtyZXNldH0pIENvZGV4ICAgICAgICR7ZGltfSh+Ly5jb2RleCkke3Jlc2V0fVxuICAke2N5YW59NSR7cmVzZXR9KSBDb3BpbG90ICAgICAke2RpbX0ofi8uY29waWxvdCkke3Jlc2V0fVxuICAke2N5YW59NiR7cmVzZXR9KSBRd2VuIENvZGUgICAke2RpbX0ofi8ucXdlbikke3Jlc2V0fSAtIEFsaWJhYmEgUXdlbiBvZmZpY2lhbCBDTElcbiAgJHtjeWFufTcke3Jlc2V0fSkgS2ltaSBDb2RlICAgJHtkaW19KH4vLmtpbWkpJHtyZXNldH0gLSBNb29uc2hvdCBLaW1pIG9mZmljaWFsIENMSVxuICAke2N5YW59OCR7cmVzZXR9KSBBbGwgJHtkaW19KGFsbCA3IHJ1bnRpbWVzIGFib3ZlKSR7cmVzZXR9XG5cbiAgJHtkaW19Tm90ZTogT3BlbkFJIGFuZCBBbnRocm9waWMgYXJlIG1vZGVsIHByb3ZpZGVycyBjb25maWd1cmVkIHdpdGhpbiBlYWNoIHJ1bnRpbWUncyBzZXR0aW5ncyxcbiAgbm90IHNlcGFyYXRlIENMSSBydW50aW1lcy4gU2VlIFJFQURNRS5tZCBmb3IgbW9kZWwgY29uZmlndXJhdGlvbi4ke3Jlc2V0fVxuYCk7XG5cbiAgcmwucXVlc3Rpb24oYCAgQ2hvaWNlICR7ZGltfVsxXSR7cmVzZXR9OiBgLCAoYW5zd2VyKSA9PiB7XG4gICAgYW5zd2VyZWQgPSB0cnVlO1xuICAgIHJsLmNsb3NlKCk7XG4gICAgY29uc3QgY2hvaWNlID0gYW5zd2VyLnRyaW0oKSB8fCAnMSc7XG4gICAgaWYgKGNob2ljZSA9PT0gJzgnKSB7XG4gICAgICBjYWxsYmFjayhbJ2NsYXVkZScsICdvcGVuY29kZScsICdnZW1pbmknLCAnY29kZXgnLCAnY29waWxvdCcsICdxd2VuJywgJ2tpbWknXSk7XG4gICAgfSBlbHNlIGlmIChjaG9pY2UgPT09ICc3Jykge1xuICAgICAgY2FsbGJhY2soWydraW1pJ10pO1xuICAgIH0gZWxzZSBpZiAoY2hvaWNlID09PSAnNicpIHtcbiAgICAgIGNhbGxiYWNrKFsncXdlbiddKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzUnKSB7XG4gICAgICBjYWxsYmFjayhbJ2NvcGlsb3QnXSk7XG4gICAgfSBlbHNlIGlmIChjaG9pY2UgPT09ICc0Jykge1xuICAgICAgY2FsbGJhY2soWydjb2RleCddKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzMnKSB7XG4gICAgICBjYWxsYmFjayhbJ2dlbWluaSddKTtcbiAgICB9IGVsc2UgaWYgKGNob2ljZSA9PT0gJzInKSB7XG4gICAgICBjYWxsYmFjayhbJ29wZW5jb2RlJ10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayhbJ2NsYXVkZSddKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFByb21wdCBmb3IgaW5zdGFsbCBsb2NhdGlvblxuICovXG5mdW5jdGlvbiBwcm9tcHRMb2NhdGlvbihydW50aW1lcykge1xuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31Ob24taW50ZXJhY3RpdmUgdGVybWluYWwgZGV0ZWN0ZWQsIGRlZmF1bHRpbmcgdG8gZ2xvYmFsIGluc3RhbGwke3Jlc2V0fVxcbmApO1xuICAgIGluc3RhbGxBbGxSdW50aW1lcyhydW50aW1lcywgdHJ1ZSwgZmFsc2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0XG4gIH0pO1xuXG4gIGxldCBhbnN3ZXJlZCA9IGZhbHNlO1xuXG4gIHJsLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBpZiAoIWFuc3dlcmVkKSB7XG4gICAgICBhbnN3ZXJlZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZyhgXFxuICAke3llbGxvd31JbnN0YWxsYXRpb24gY2FuY2VsbGVkJHtyZXNldH1cXG5gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHBhdGhFeGFtcGxlcyA9IHJ1bnRpbWVzLm1hcChyID0+IHtcbiAgICBjb25zdCBnbG9iYWxQYXRoID0gZ2V0R2xvYmFsRGlyKHIsIGV4cGxpY2l0Q29uZmlnRGlyKTtcbiAgICByZXR1cm4gZ2xvYmFsUGF0aC5yZXBsYWNlKG9zLmhvbWVkaXIoKSwgJ34nKTtcbiAgfSkuam9pbignLCAnKTtcblxuICBjb25zdCBsb2NhbEV4YW1wbGVzID0gcnVudGltZXMubWFwKHIgPT4gYC4vJHtnZXREaXJOYW1lKHIpfWApLmpvaW4oJywgJyk7XG5cbiAgY29uc29sZS5sb2coYCAgJHt5ZWxsb3d9V2hlcmUgd291bGQgeW91IGxpa2UgdG8gaW5zdGFsbD8ke3Jlc2V0fVxcblxcbiAgJHtjeWFufTEke3Jlc2V0fSkgR2xvYmFsICR7ZGltfSgke3BhdGhFeGFtcGxlc30pJHtyZXNldH0gLSBhdmFpbGFibGUgaW4gYWxsIHByb2plY3RzXG4gICR7Y3lhbn0yJHtyZXNldH0pIExvY2FsICAke2RpbX0oJHtsb2NhbEV4YW1wbGVzfSkke3Jlc2V0fSAtIHRoaXMgcHJvamVjdCBvbmx5XG5gKTtcblxuICBybC5xdWVzdGlvbihgICBDaG9pY2UgJHtkaW19WzFdJHtyZXNldH06IGAsIChhbnN3ZXIpID0+IHtcbiAgICBhbnN3ZXJlZCA9IHRydWU7XG4gICAgcmwuY2xvc2UoKTtcbiAgICBjb25zdCBjaG9pY2UgPSBhbnN3ZXIudHJpbSgpIHx8ICcxJztcbiAgICBjb25zdCBpc0dsb2JhbCA9IGNob2ljZSAhPT0gJzInO1xuICAgIGluc3RhbGxBbGxSdW50aW1lcyhydW50aW1lcywgaXNHbG9iYWwsIHRydWUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIEVaX0FnZW50cyBmb3IgYWxsIHNlbGVjdGVkIHJ1bnRpbWVzXG4gKi9cbmZ1bmN0aW9uIGluc3RhbGxBbGxSdW50aW1lcyhydW50aW1lczogc3RyaW5nW10sIGlzR2xvYmFsOiBib29sZWFuLCBpc0ludGVyYWN0aXZlOiBib29sZWFuKSB7XG4gIGNvbnN0IHJlc3VsdHM6IEFycmF5PHsgc2V0dGluZ3NQYXRoOiBzdHJpbmcgfCBudWxsOyBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsOyBzdGF0dXNsaW5lQ29tbWFuZDogc3RyaW5nIHwgbnVsbDsgcnVudGltZTogc3RyaW5nIH0+ID0gW107XG5cbiAgZm9yIChjb25zdCBydW50aW1lIG9mIHJ1bnRpbWVzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gaW5zdGFsbChpc0dsb2JhbCwgcnVudGltZSk7XG4gICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gIH1cblxuICBjb25zdCBzdGF0dXNsaW5lUnVudGltZXMgPSBbJ2NsYXVkZScsICdnZW1pbmknXTtcbiAgY29uc3Qgc3RhdHVzbGluZVJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcihyID0+IHN0YXR1c2xpbmVSdW50aW1lcy5pbmNsdWRlcyhyLnJ1bnRpbWUpKTtcblxuICAvLyBIYW5kbGUgc3RhdHVzbGluZSBwZXItcnVudGltZSB0byBhdm9pZCBjb25mbGljdHNcbiAgLy8gRWFjaCBydW50aW1lIHdpdGggc2V0dGluZ3MuanNvbiBnZXRzIGl0cyBvd24gc3RhdHVzbGluZSBwcm9tcHRcbiAgY29uc3QgZmluYWxpemVQZXJSdW50aW1lID0gKHJ1bnRpbWVSZXN1bHQ6IHsgc2V0dGluZ3NQYXRoOiBzdHJpbmcgfCBudWxsOyBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsOyBzdGF0dXNsaW5lQ29tbWFuZDogc3RyaW5nIHwgbnVsbDsgcnVudGltZTogc3RyaW5nIH0sIHNob3VsZEluc3RhbGxTdGF0dXNsaW5lOiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgdXNlU3RhdHVzbGluZSA9IHN0YXR1c2xpbmVSdW50aW1lcy5pbmNsdWRlcyhydW50aW1lUmVzdWx0LnJ1bnRpbWUpICYmIHNob3VsZEluc3RhbGxTdGF0dXNsaW5lO1xuICAgIGZpbmlzaEluc3RhbGwoXG4gICAgICBydW50aW1lUmVzdWx0LnNldHRpbmdzUGF0aCxcbiAgICAgIHJ1bnRpbWVSZXN1bHQuc2V0dGluZ3MsXG4gICAgICBydW50aW1lUmVzdWx0LnN0YXR1c2xpbmVDb21tYW5kLFxuICAgICAgdXNlU3RhdHVzbGluZSxcbiAgICAgIHJ1bnRpbWVSZXN1bHQucnVudGltZSxcbiAgICAgIGlzR2xvYmFsXG4gICAgKTtcbiAgfTtcblxuICBpZiAoc3RhdHVzbGluZVJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gTm8gcnVudGltZXMgc3VwcG9ydCBzdGF0dXNsaW5lIC0gZmluYWxpemUgYWxsIHdpdGhvdXQgc3RhdHVzbGluZVxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIGZpbmFsaXplUGVyUnVudGltZShyZXN1bHQsIGZhbHNlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RhdHVzbGluZVJlc3VsdHMubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gU2luZ2xlIHJ1bnRpbWUgd2l0aCBzdGF0dXNsaW5lIHN1cHBvcnQgLSBwcm9tcHQgb25jZVxuICAgIGNvbnN0IHNpbmdsZVJlc3VsdCA9IHN0YXR1c2xpbmVSZXN1bHRzWzBdO1xuICAgIGlmIChzaW5nbGVSZXN1bHQpIHtcbiAgICAgIGhhbmRsZVN0YXR1c2xpbmUoc2luZ2xlUmVzdWx0LnNldHRpbmdzLCBpc0ludGVyYWN0aXZlLCAoc2hvdWxkSW5zdGFsbCkgPT4ge1xuICAgICAgICBmaW5hbGl6ZVBlclJ1bnRpbWUoc2luZ2xlUmVzdWx0LCBzaG91bGRJbnN0YWxsKTtcbiAgICAgICAgLy8gRmluYWxpemUgb3RoZXIgcnVudGltZXMgd2l0aG91dCBzdGF0dXNsaW5lXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICBpZiAoIXN0YXR1c2xpbmVSdW50aW1lcy5pbmNsdWRlcyhyZXN1bHQucnVudGltZSkpIHtcbiAgICAgICAgICAgIGZpbmFsaXplUGVyUnVudGltZShyZXN1bHQsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBNdWx0aXBsZSBydW50aW1lcyB3aXRoIHN0YXR1c2xpbmUgc3VwcG9ydCAtIHByb21wdCBmb3IgZWFjaFxuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICAgIGNvbnN0IHN0YXR1c2xpbmVDaG9pY2VzID0gbmV3IEFycmF5KHN0YXR1c2xpbmVSZXN1bHRzLmxlbmd0aCkuZmlsbChmYWxzZSk7XG5cbiAgICBjb25zdCBwcm9tcHROZXh0U3RhdHVzbGluZSA9ICgpID0+IHtcbiAgICAgIGlmIChjdXJyZW50SW5kZXggPj0gc3RhdHVzbGluZVJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIEFsbCBzdGF0dXNsaW5lIHByb21wdHMgZG9uZSAtIGZpbmFsaXplIGFsbCBydW50aW1lc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzW2ldO1xuICAgICAgICAgIGlmICghcmVzdWx0KSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBzdGF0dXNsaW5lSW5kZXggPSBzdGF0dXNsaW5lUmVzdWx0cy5maW5kSW5kZXgociA9PiByLnJ1bnRpbWUgPT09IHJlc3VsdC5ydW50aW1lKTtcbiAgICAgICAgICBjb25zdCBzaG91bGRJbnN0YWxsID0gc3RhdHVzbGluZUluZGV4ICE9PSAtMSA/IHN0YXR1c2xpbmVDaG9pY2VzW3N0YXR1c2xpbmVJbmRleF0gOiBmYWxzZTtcbiAgICAgICAgICBmaW5hbGl6ZVBlclJ1bnRpbWUocmVzdWx0LCBzaG91bGRJbnN0YWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRSZXN1bHQgPSBzdGF0dXNsaW5lUmVzdWx0c1tjdXJyZW50SW5kZXhdO1xuICAgICAgaWYgKGN1cnJlbnRSZXN1bHQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFJ1bnRpbWVJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICAgICAgaGFuZGxlU3RhdHVzbGluZShjdXJyZW50UmVzdWx0LnNldHRpbmdzLCBpc0ludGVyYWN0aXZlLCAoc2hvdWxkSW5zdGFsbCkgPT4ge1xuICAgICAgICAgIHN0YXR1c2xpbmVDaG9pY2VzW2N1cnJlbnRSdW50aW1lSW5kZXhdID0gc2hvdWxkSW5zdGFsbDtcbiAgICAgICAgICBjdXJyZW50SW5kZXgrKztcbiAgICAgICAgICBwcm9tcHROZXh0U3RhdHVzbGluZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvbXB0TmV4dFN0YXR1c2xpbmUoKTtcbiAgfVxufVxuXG4vLyBUZXN0LW9ubHkgZXhwb3J0cyBcdTIwMTQgc2tpcCBtYWluIGxvZ2ljIHdoZW4gbG9hZGVkIGFzIGEgbW9kdWxlIGZvciB0ZXN0aW5nXG5jb25zdCB0ZXN0RXhwb3J0cyA9IHtcbiAgICBnZXRDb2RleFNraWxsQWRhcHRlckhlYWRlcixcbiAgICBjb252ZXJ0Q2xhdWRlVG9HZW1pbmlBZ2VudCxcbiAgICBjb252ZXJ0Q2xhdWRlQWdlbnRUb0NvZGV4QWdlbnQsXG4gICAgZ2VuZXJhdGVDb2RleEFnZW50VG9tbCxcbiAgICBnZW5lcmF0ZUNvZGV4Q29uZmlnQmxvY2ssXG4gICAgc3RyaXBFekFnZW50c0Zyb21Db2RleENvbmZpZyxcbiAgICBtZXJnZUNvZGV4Q29uZmlnLFxuICAgIGluc3RhbGxDb2RleENvbmZpZyxcbiAgICBjb252ZXJ0Q2xhdWRlQ29tbWFuZFRvQ29kZXhTa2lsbCxcbiAgICBFWl9DT0RFWF9NQVJLRVIsXG4gICAgQ09ERVhfQUdFTlRfU0FOREJPWCxcbiAgICBnZXREaXJOYW1lLFxuICAgIGdldEdsb2JhbERpcixcbiAgICBnZXRDb25maWdEaXJGcm9tSG9tZSxcbiAgICBjbGF1ZGVUb0NvcGlsb3RUb29scyxcbiAgICBjb252ZXJ0Q29waWxvdFRvb2xOYW1lLFxuICAgIGNvbnZlcnRDbGF1ZGVUb0NvcGlsb3RDb250ZW50LFxuICAgIGNvbnZlcnRDbGF1ZGVDb21tYW5kVG9Db3BpbG90U2tpbGwsXG4gICAgY29udmVydENsYXVkZUFnZW50VG9Db3BpbG90QWdlbnQsXG4gICAgY29weUNvbW1hbmRzQXNDb3BpbG90U2tpbGxzLFxuICAgIEVaX0NPUElMT1RfSU5TVFJVQ1RJT05TX01BUktFUixcbiAgICBFWl9DT1BJTE9UX0lOU1RSVUNUSU9OU19DTE9TRV9NQVJLRVIsXG4gICAgbWVyZ2VDb3BpbG90SW5zdHJ1Y3Rpb25zLFxuICAgIHN0cmlwRXpBZ2VudHNGcm9tQ29waWxvdEluc3RydWN0aW9ucyxcbiAgICB3cml0ZU1hbmlmZXN0LFxuICAgIHJlcG9ydExvY2FsUGF0Y2hlcyxcbiAgICBjb252ZXJ0Q2xhdWRlVG9Rd2VuU2tpbGwsXG4gICAgY29udmVydENsYXVkZVRvUXdlbkFnZW50LFxuICAgIGNvbnZlcnRDbGF1ZGVUb0tpbWlTa2lsbCxcbiAgICBjb252ZXJ0Q2xhdWRlVG9LaW1pQWdlbnQsXG4gIH07XG5cbi8vIE1haW4gbG9naWNcbmlmIChoYXNHbG9iYWwgJiYgaGFzTG9jYWwpIHtcbiAgY29uc29sZS5lcnJvcihgICAke3llbGxvd31DYW5ub3Qgc3BlY2lmeSBib3RoIC0tZ2xvYmFsIGFuZCAtLWxvY2FsJHtyZXNldH1gKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSBlbHNlIGlmIChleHBsaWNpdENvbmZpZ0RpciAmJiBoYXNMb2NhbCkge1xuICBjb25zb2xlLmVycm9yKGAgICR7eWVsbG93fUNhbm5vdCB1c2UgLS1jb25maWctZGlyIHdpdGggLS1sb2NhbCR7cmVzZXR9YCk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0gZWxzZSBpZiAoaGFzVW5pbnN0YWxsKSB7XG4gIGlmICghaGFzR2xvYmFsICYmICFoYXNMb2NhbCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCAgJHt5ZWxsb3d9LS11bmluc3RhbGwgcmVxdWlyZXMgLS1nbG9iYWwgb3IgLS1sb2NhbCR7cmVzZXR9YCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIGNvbnN0IHJ1bnRpbWVzID0gc2VsZWN0ZWRSdW50aW1lcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRSdW50aW1lcyA6IFsnY2xhdWRlJ107XG4gIGZvciAoY29uc3QgcnVudGltZSBvZiBydW50aW1lcykge1xuICAgIHVuaW5zdGFsbChoYXNHbG9iYWwsIHJ1bnRpbWUpO1xuICB9XG59IGVsc2UgaWYgKHNlbGVjdGVkUnVudGltZXMubGVuZ3RoID4gMCkge1xuICBpZiAoIWhhc0dsb2JhbCAmJiAhaGFzTG9jYWwpIHtcbiAgICBwcm9tcHRMb2NhdGlvbihzZWxlY3RlZFJ1bnRpbWVzKTtcbiAgfSBlbHNlIHtcbiAgICBpbnN0YWxsQWxsUnVudGltZXMoc2VsZWN0ZWRSdW50aW1lcywgaGFzR2xvYmFsLCBmYWxzZSk7XG4gIH1cbn0gZWxzZSBpZiAoaGFzR2xvYmFsIHx8IGhhc0xvY2FsKSB7XG4gIC8vIERlZmF1bHQgdG8gQ2xhdWRlIGlmIG5vIHJ1bnRpbWUgc3BlY2lmaWVkIGJ1dCBsb2NhdGlvbiBpc1xuICBpbnN0YWxsQWxsUnVudGltZXMoWydjbGF1ZGUnXSwgaGFzR2xvYmFsLCBmYWxzZSk7XG59IGVsc2Uge1xuICAvLyBJbnRlcmFjdGl2ZVxuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBjb25zb2xlLmxvZyhgICAke3llbGxvd31Ob24taW50ZXJhY3RpdmUgdGVybWluYWwgZGV0ZWN0ZWQsIGRlZmF1bHRpbmcgdG8gQ2xhdWRlIENvZGUgZ2xvYmFsIGluc3RhbGwke3Jlc2V0fVxcbmApO1xuICAgIGluc3RhbGxBbGxSdW50aW1lcyhbJ2NsYXVkZSddLCB0cnVlLCBmYWxzZSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvbXB0UnVudGltZSgocnVudGltZXMpID0+IHtcbiAgICAgIHByb21wdExvY2F0aW9uKHJ1bnRpbWVzKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBFeHBvcnQgZm9yIHRlc3RpbmdcbmV4cG9ydCB7IHRlc3RFeHBvcnRzIH07XG4iLCAie1xuICBcIm5hbWVcIjogXCJAaG93bGlsL2V6LWFnZW50c1wiLFxuICBcInZlcnNpb25cIjogXCI1LjAuMlwiLFxuICBcImRlc2NyaXB0aW9uXCI6IFwiRVogQWdlbnRzIFx1MjAxNCBNZXRhLXByb21wdGluZyB3aXRoIG11bHRpLW1vZGVsIHN1cHBvcnQgKFF3ZW4sIEtpbWksIE9wZW5BSSlcIixcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwic2lkZUVmZmVjdHNcIjogZmFsc2UsXG4gIFwiYmluXCI6IHtcbiAgICBcImV6LWFnZW50c1wiOiBcImRpc3QvYmluL2luc3RhbGwuanNcIixcbiAgICBcImV6LWFnZW50cy11cGRhdGVcIjogXCJkaXN0L2Jpbi91cGRhdGUuanNcIlxuICB9LFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9mYWN0b3JpZXNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvZmFjdG9yaWVzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9mYWN0b3JpZXMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL3N0cmF0ZWdpZXNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvc3RyYXRlZ2llcy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvc3RyYXRlZ2llcy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vYWRhcHRlcnNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvYWRhcHRlcnMvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbGliL2FkYXB0ZXJzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9vYnNlcnZlclwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9vYnNlcnZlci9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvb2JzZXJ2ZXIvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2RlY29yYXRvcnNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWIvZGVjb3JhdG9ycy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvZGVjb3JhdG9ycy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vZmFjYWRlc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9mYWNhZGVzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9mYWNhZGVzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9jb21tYW5kc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9jb21tYW5kcy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvY29tbWFuZHMvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL3NlcnZpY2VzXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL3NlcnZpY2VzL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpYi9zZXJ2aWNlcy9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vcmVwb3NpdG9yaWVzXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGliL3JlcG9zaXRvcmllcy9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvcmVwb3NpdG9yaWVzL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9mcFwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpYi9mcC9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWIvZnAvaW5kZXguanNcIlxuICAgIH1cbiAgfSxcbiAgXCJtYWluXCI6IFwiLi9kaXN0L2luZGV4LmpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImRpc3RcIixcbiAgICBcImNvbW1hbmRzXCIsXG4gICAgXCJlei1hZ2VudHNcIixcbiAgICBcImFnZW50c1wiLFxuICAgIFwiaG9va3MvZGlzdFwiLFxuICAgIFwic2NyaXB0c1wiXG4gIF0sXG4gIFwia2V5d29yZHNcIjogW1xuICAgIFwiY2xhdWRlXCIsXG4gICAgXCJjbGF1ZGUtY29kZVwiLFxuICAgIFwiYWlcIixcbiAgICBcIm1ldGEtcHJvbXB0aW5nXCIsXG4gICAgXCJjb250ZXh0LWVuZ2luZWVyaW5nXCIsXG4gICAgXCJzcGVjLWRyaXZlbi1kZXZlbG9wbWVudFwiLFxuICAgIFwiZ2VtaW5pXCIsXG4gICAgXCJnZW1pbmktY2xpXCIsXG4gICAgXCJjb2RleFwiLFxuICAgIFwiY29kZXgtY2xpXCIsXG4gICAgXCJlei1hZ2VudHNcIixcbiAgICBcImFnZW50LW9yY2hlc3RyYXRpb25cIlxuICBdLFxuICBcImF1dGhvclwiOiBcIlRcdTAwQzJDSEVTXCIsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9ob3dsaWwvZXotYWdlbnRzLmdpdFwiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vaG93bGlsL2V6LWFnZW50c1wiLFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2hvd2xpbC9lei1hZ2VudHMvaXNzdWVzXCJcbiAgfSxcbiAgXCJlbmdpbmVzXCI6IHtcbiAgICBcIm5vZGVcIjogXCI+PTE2LjcuMFwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB0eXBlcy9taWNyb21hdGNoXCI6IFwiNC4wLjBcIixcbiAgICBcIkB0eXBlcy9ub2RlXCI6IFwiMjAuMC4wXCIsXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpblwiOiBcIjguNTcuMlwiLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlclwiOiBcIjguNTcuMlwiLFxuICAgIFwiYzhcIjogXCIxMS4wLjBcIixcbiAgICBcImNvbXBsZXhpdHktcmVwb3J0XCI6IFwiMi4wLjAtYWxwaGFcIixcbiAgICBcImRlcGVuZGVuY3ktY3J1aXNlclwiOiBcIjE3LjMuOVwiLFxuICAgIFwiZXNsaW50XCI6IFwiOC41Ny4wXCIsXG4gICAgXCJlc2xpbnQtcGx1Z2luLWNvbXBsZXhpdHlcIjogXCIxLjAuMlwiLFxuICAgIFwiZXNsaW50LXBsdWdpbi1zb25hcmpzXCI6IFwiNC4wLjJcIixcbiAgICBcImVzbGludC1wbHVnaW4tdHNkb2NcIjogXCIwLjUuMlwiLFxuICAgIFwiZXhwZWN0LXR5cGVcIjogXCIxLjMuMFwiLFxuICAgIFwiZmFzdC1jaGVja1wiOiBcIjMuMC4wXCIsXG4gICAgXCJnbG9iXCI6IFwiMTMuMC42XCIsXG4gICAgXCJodXNreVwiOiBcIjkuMS43XCIsXG4gICAgXCJqcy15YW1sXCI6IFwiNC4xLjFcIixcbiAgICBcImpzY3BkXCI6IFwiNC4wLjhcIixcbiAgICBcImpzZG9jXCI6IFwiNC4wLjJcIixcbiAgICBcIms2XCI6IFwiMC4wLjBcIixcbiAgICBcImxpbnQtc3RhZ2VkXCI6IFwiMTUuNS4yXCIsXG4gICAgXCJtYWRnZVwiOiBcIjguMC4wXCIsXG4gICAgXCJtYXJrZG93bmxpbnRcIjogXCIwLjQwLjBcIixcbiAgICBcInRzLW1vcnBoXCI6IFwiMjcuMC4yXCIsXG4gICAgXCJ0cy1ub2RlXCI6IFwiMTAuOS4wXCIsXG4gICAgXCJ0cy1wcnVuZVwiOiBcIjAuMTAuM1wiLFxuICAgIFwidHN1cFwiOiBcIjguMC4wXCIsXG4gICAgXCJ0eXBlZG9jXCI6IFwiMC4yOC4xOFwiLFxuICAgIFwidHlwZWRvYy1wbHVnaW4tbWlzc2luZy1leHBvcnRzXCI6IFwiNC4xLjJcIixcbiAgICBcInR5cGVzY3JpcHRcIjogXCI1LjQuNVwiLFxuICAgIFwidml0ZXN0XCI6IFwiNC4xLjBcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiYnVpbGRcIjogXCJ0c3VwXCIsXG4gICAgXCJidWlsZDp3YXRjaFwiOiBcInRzdXAgLS13YXRjaFwiLFxuICAgIFwidHlwZWNoZWNrXCI6IFwidHNjIC0tbm9FbWl0XCIsXG4gICAgXCJ0eXBlY2hlY2s6c3RyaWN0XCI6IFwidHNjIC0tbm9FbWl0IC0tc3RyaWN0XCIsXG4gICAgXCJkZXZcIjogXCJ0c3ggYmluL2luc3RhbGwudHNcIixcbiAgICBcImxpbnRcIjogXCJlc2xpbnQgLiAtLWV4dCAudHMgLS1tYXgtd2FybmluZ3M9MFwiLFxuICAgIFwibGludDpmaXhcIjogXCJlc2xpbnQgLiAtLWV4dCAudHMgLS1maXhcIixcbiAgICBcImJ1aWxkOmhvb2tzXCI6IFwibm9kZSBkaXN0L3NjcmlwdHMvYnVpbGQtaG9va3MuanNcIixcbiAgICBcInByZXB1Ymxpc2hPbmx5XCI6IFwibnBtIHJ1biBidWlsZCAmJiBucG0gcnVuIGJ1aWxkOmhvb2tzXCIsXG4gICAgXCJ0ZXN0XCI6IFwidHN4IHNjcmlwdHMvcnVuLXRlc3RzLnRzXCIsXG4gICAgXCJ0ZXN0OmNvdmVyYWdlXCI6IFwiYzggLS1jaGVjay1jb3ZlcmFnZSAtLWxpbmVzIDcwIC0tcmVwb3J0ZXIgdGV4dCAtLWluY2x1ZGUgJ2Jpbi9saWIvKiovKi50cycgLS1leGNsdWRlICd0ZXN0cy8qKicgLS1hbGwgdHN4IHNjcmlwdHMvcnVuLXRlc3RzLnRzXCIsXG4gICAgXCJ0ZXN0OmExMXlcIjogXCJub2RlIHRlc3RzL2FjY2Vzc2liaWxpdHkvcnVuLWExMXktdGVzdHMuY2pzXCIsXG4gICAgXCJ0ZXN0OnF3ZW46Y29kZVwiOiBcInNoIHRlc3RzL3N0YWdpbmcvcXdlbi1jb2RlLWJhdHRsZS1mdWxsLnNoXCIsXG4gICAgXCJ0ZXN0OnF3ZW46Y29kZTpzaW1wbGVcIjogXCJzaCB0ZXN0cy9zdGFnaW5nL3F3ZW4tY29kZS1zaW1wbGUtdGVzdC5zaFwiLFxuICAgIFwidGVzdDpxd2VuOmNvZGU6ZWRnZVwiOiBcInNoIHRlc3RzL3N0YWdpbmcvcXdlbi1jb2RlLWVkZ2UtY2FzZXMuc2hcIixcbiAgICBcInRlc3Q6ZG9ja2VyOnF3ZW46Y29kZVwiOiBcImRvY2tlci1jb21wb3NlIC1mIGRvY2tlci1jb21wb3NlLnN0YWdpbmcueW1sIHVwIC0tYnVpbGQgZXotYWdlbnRzLXF3ZW4tY29kZS1iYXR0bGVcIixcbiAgICBcInRlc3Q6ZG9ja2VyOnF3ZW46ZWRnZVwiOiBcImRvY2tlci1jb21wb3NlIC1mIGRvY2tlci1jb21wb3NlLnN0YWdpbmcueW1sIHVwIC0tYnVpbGQgZXotYWdlbnRzLXF3ZW4tY29kZS1lZGdlLWNhc2VzXCIsXG4gICAgXCJ0ZXN0OmRvY2tlcjphbGxcIjogXCJkb2NrZXItY29tcG9zZSAtZiBkb2NrZXItY29tcG9zZS5zdGFnaW5nLnltbCB1cCAtLWJ1aWxkIC0tYWJvcnQtb24tY29udGFpbmVyLWV4aXRcIixcbiAgICBcImluc3RhbGw6cHJvZHVjdGlvblwiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy9pbnN0YWxsLXByb2R1Y3Rpb24udHNcIixcbiAgICBcImluc3RhbGw6cHJvZHVjdGlvbjpsYXRlc3RcIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvaW5zdGFsbC1wcm9kdWN0aW9uLnRzIGxhdGVzdFwiLFxuICAgIFwiaW5zdGFsbDpwcm9kdWN0aW9uOnY0XCI6IFwibm9kZSAtLWxvYWRlciB0cy1ub2RlL2VzbSBzY3JpcHRzL2luc3RhbGwtcHJvZHVjdGlvbi50cyA0LjAuMFwiLFxuICAgIFwidmFsaWRhdGU6dG9rZW5cIjogXCJub2RlIC0tbG9hZGVyIHRzLW5vZGUvZXNtIHNjcmlwdHMvdmFsaWRhdGUtdG9rZW4udHNcIixcbiAgICBcInNlY3VyaXR5OnNjYW5cIjogXCJucG0gYXVkaXQgLS1hdWRpdC1sZXZlbD1tb2RlcmF0ZVwiLFxuICAgIFwiZG9jczpnZW5lcmF0ZVwiOiBcImpzZG9jIC1jIGpzZG9jLmpzb24gLXIgYmluLyBlei1hZ2VudHMvYmluL2xpYi9cIixcbiAgICBcImRvY3M6YXBpXCI6IFwidHlwZWRvY1wiLFxuICAgIFwiYW5hbHl6ZTpkdXBsaWNhdGVzXCI6IFwianNjcGQgLS1jb25maWcgLmpzY3BkLmpzb25cIixcbiAgICBcImNoZWNrOmR1cGxpY2F0ZXNcIjogXCJqc2NwZCAtLWNvbmZpZyAuanNjcGQuanNvblwiLFxuICAgIFwiY2hlY2s6Y29tcGxleGl0eVwiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy9jaGVjay1jb21wbGV4aXR5LnRzXCIsXG4gICAgXCJjaGVjazp0c2RvY1wiOiBcIm5vZGUgLS1sb2FkZXIgdHMtbm9kZS9lc20gc2NyaXB0cy9jaGVjay10c2RvYy1jb3ZlcmFnZS50c1wiLFxuICAgIFwidGVzdDpwYWNrYWdlXCI6IFwibm9kZSAtLWxvYWRlciB0cy1ub2RlL2VzbSBzY3JpcHRzL3Rlc3QtcGFja2FnZS1kb2NrZXIudHNcIixcbiAgICBcImNoZWNrOmNvdXBsaW5nXCI6IFwibWFkZ2UgLS1jaXJjdWxhciBiaW4vbGliL1wiLFxuICAgIFwiY2hlY2s6YWJzdHJhY3Rpb25zXCI6IFwidHMtcHJ1bmVcIixcbiAgICBcImNoZWNrOmFsbC1tZXRyaWNzXCI6IFwibnBtIHJ1biBsaW50ICYmIG5wbSBydW4gY2hlY2s6ZHVwbGljYXRlcyAmJiBucG0gcnVuIGNoZWNrOmNvdXBsaW5nXCIsXG4gICAgXCJwcmVwYXJlXCI6IFwiaHVza3lcIixcbiAgICBcImdhdGVzOmxvY2FsXCI6IFwibm9kZSBlei1hZ2VudHMvYmluL2xpYi9nYXRlLWV4ZWN1dG9yLmNqcyAtLWNpIC0tY2FjaGVcIixcbiAgICBcImdhdGVzOnN0YXR1c1wiOiBcIm5vZGUgZXotYWdlbnRzL2Jpbi9saWIvZ2F0ZS1leGVjdXRvci5janMgLS1zdGF0dXNcIixcbiAgICBcImdhdGVzOnN0YXRzXCI6IFwibm9kZSBlei1hZ2VudHMvYmluL2xpYi9nYXRlLWV4ZWN1dG9yLmNqcyAtLXN0YXRzXCIsXG4gICAgXCJkZXBzOmF1ZGl0XCI6IFwidHN4IGJpbi9kZXBlbmRlbmN5LWF1ZGl0LnRzXCIsXG4gICAgXCJkZXBzOmF1ZGl0Ompzb25cIjogXCJ0c3ggYmluL2RlcGVuZGVuY3ktYXVkaXQudHMgLS1qc29uXCIsXG4gICAgXCJkZXBzOmNoZWNrXCI6IFwidHN4IGJpbi9kZXBlbmRlbmN5LWF1ZGl0LnRzIC0tcXVpZXRcIlxuICB9LFxuICBcImxpbnQtc3RhZ2VkXCI6IHtcbiAgICBcIioudHNcIjogW1xuICAgICAgXCJub2RlIC0tdGVzdFwiXG4gICAgXSxcbiAgICBcIioubWRcIjogW1xuICAgICAgXCJ0c3ggc2NyaXB0cy9ydW4tdGVzdHMudHNcIlxuICAgIF1cbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwibWljcm9tYXRjaFwiOiBcIjQuMC41XCIsXG4gICAgXCJ0aWt0b2tlblwiOiBcIjEuMC4yMlwiLFxuICAgIFwiem9kXCI6IFwiNC4zLjZcIlxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFFQSxZQUFZLFFBQVE7QUFDcEIsWUFBWSxVQUFVO0FBQ3RCLFlBQVksUUFBUTtBQUNwQixZQUFZLGNBQWM7QUFDMUIsWUFBWSxZQUFZO0FBQ3hCLFNBQVMscUJBQXFCOzs7QUNQOUI7QUFBQSxFQUNFLE1BQVE7QUFBQSxFQUNSLFNBQVc7QUFBQSxFQUNYLGFBQWU7QUFBQSxFQUNmLE1BQVE7QUFBQSxFQUNSLGFBQWU7QUFBQSxFQUNmLEtBQU87QUFBQSxJQUNMLGFBQWE7QUFBQSxJQUNiLG9CQUFvQjtBQUFBLEVBQ3RCO0FBQUEsRUFD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LElBQU0sY0FBYztBQUFBLEVBQ2hCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUdGLElBQUksYUFBYSxVQUFVO0FBQ3pCLFVBQVEsTUFBTSxLQUFLLE1BQU0sMkNBQTJDLEtBQUssRUFBRTtBQUMzRSxVQUFRLEtBQUssQ0FBQztBQUNoQixXQUFXLHFCQUFxQixVQUFVO0FBQ3hDLFVBQVEsTUFBTSxLQUFLLE1BQU0sdUNBQXVDLEtBQUssRUFBRTtBQUN2RSxVQUFRLEtBQUssQ0FBQztBQUNoQixXQUFXLGNBQWM7QUFDdkIsTUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVO0FBQzNCLFlBQVEsTUFBTSxLQUFLLE1BQU0sMkNBQTJDLEtBQUssRUFBRTtBQUMzRSxZQUFRLEtBQUssQ0FBQztBQUFBLEVBQ2hCO0FBQ0EsUUFBTSxXQUFXLGlCQUFpQixTQUFTLElBQUksbUJBQW1CLENBQUMsUUFBUTtBQUMzRSxhQUFXLFdBQVcsVUFBVTtBQUM5QixjQUFVLFdBQVcsT0FBTztBQUFBLEVBQzlCO0FBQ0YsV0FBVyxpQkFBaUIsU0FBUyxHQUFHO0FBQ3RDLE1BQUksQ0FBQyxhQUFhLENBQUMsVUFBVTtBQUMzQixtQkFBZSxnQkFBZ0I7QUFBQSxFQUNqQyxPQUFPO0FBQ0wsdUJBQW1CLGtCQUFrQixXQUFXLEtBQUs7QUFBQSxFQUN2RDtBQUNGLFdBQVcsYUFBYSxVQUFVO0FBRWhDLHFCQUFtQixDQUFDLFFBQVEsR0FBRyxXQUFXLEtBQUs7QUFDakQsT0FBTztBQUVMLE1BQUksQ0FBQyxRQUFRLE1BQU0sT0FBTztBQUN4QixZQUFRLElBQUksS0FBSyxNQUFNLDhFQUE4RSxLQUFLO0FBQUEsQ0FBSTtBQUM5Ryx1QkFBbUIsQ0FBQyxRQUFRLEdBQUcsTUFBTSxLQUFLO0FBQUEsRUFDNUMsT0FBTztBQUNMLGtCQUFjLENBQUMsYUFBYTtBQUMxQixxQkFBZSxRQUFRO0FBQUEsSUFDekIsQ0FBQztBQUFBLEVBQ0g7QUFDRjsiLAogICJuYW1lcyI6IFsicnVudGltZUxhYmVsIiwgInNjYW5Gb3JMZWFrZWRQYXRocyJdCn0K