@tscircuit/eval 0.0.518 → 0.0.520

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lib/index.js CHANGED
@@ -1173,7 +1173,7 @@ ${ctx.logger.stringifyLogs()}`
1173
1173
  }
1174
1174
  };
1175
1175
 
1176
- // lib/eval/import-npm-package.ts
1176
+ // lib/eval/import-npm-package-from-cdn.ts
1177
1177
  import Debug4 from "debug";
1178
1178
  var debug4 = Debug4("tsci:eval:import-npm-package");
1179
1179
  function extractPackagePathFromJSDelivr(url) {
@@ -1183,21 +1183,10 @@ function extractPackagePathFromJSDelivr(url) {
1183
1183
  }
1184
1184
  return url;
1185
1185
  }
1186
- async function importNpmPackage({
1187
- importName,
1188
- depth = 0,
1189
- fromJsDelivr = false
1190
- }, ctx) {
1191
- debug4(`importing npm package: ${importName}`);
1192
- const { preSuppliedImports, fsMap } = ctx;
1186
+ async function importNpmPackageFromCdn({ importName, depth = 0 }, ctx) {
1187
+ debug4(`importing npm package from CDN: ${importName}`);
1188
+ const { preSuppliedImports } = ctx;
1193
1189
  if (preSuppliedImports[importName]) return;
1194
- if (!fromJsDelivr && !isPackageDeclaredInPackageJson(importName, fsMap)) {
1195
- throw new Error(
1196
- `Package "${importName}" is not declared in package.json. Add it to dependencies or devDependencies before importing.
1197
-
1198
- ${ctx.logger.stringifyLogs()}`
1199
- );
1200
- }
1201
1190
  const npmCdnUrl = `https://cdn.jsdelivr.net/npm/${importName}/+esm`;
1202
1191
  let finalUrl;
1203
1192
  const { content, error } = await globalThis.fetch(npmCdnUrl).then(async (res) => {
@@ -1220,8 +1209,7 @@ ${ctx.logger.stringifyLogs()}`
1220
1209
  for (const subImportName of importNames) {
1221
1210
  if (!preSuppliedImports[subImportName]) {
1222
1211
  await importEvalPath(subImportName, ctx, depth + 1, {
1223
- cwd,
1224
- fromJsDelivr: true
1212
+ cwd
1225
1213
  });
1226
1214
  }
1227
1215
  }
@@ -1304,11 +1292,8 @@ async function importEvalPath(importName, ctx, depth = 0, opts = {}) {
1304
1292
  ${ctx.logger.stringifyLogs()}`
1305
1293
  );
1306
1294
  }
1307
- ctx.logger.info(`importNpmPackage("${pkgName}")`);
1308
- await importNpmPackage(
1309
- { importName: pkgName, depth, fromJsDelivr: true },
1310
- ctx
1311
- );
1295
+ ctx.logger.info(`importNpmPackageFromCdn("${pkgName}")`);
1296
+ await importNpmPackageFromCdn({ importName: pkgName, depth }, ctx);
1312
1297
  const pkg = preSuppliedImports[pkgName];
1313
1298
  if (pkg) {
1314
1299
  preSuppliedImports[importName] = pkg;
@@ -1387,40 +1372,38 @@ ${ctx.logger.stringifyLogs()}`
1387
1372
  return importSnippet(importName, ctx, depth);
1388
1373
  }
1389
1374
  if (!importName.startsWith(".") && !importName.startsWith("/")) {
1390
- if (!opts.fromJsDelivr) {
1391
- if (!isPackageDeclaredInPackageJson(importName, ctx.fsMap)) {
1392
- throw new Error(
1393
- `Node module imported but not in package.json "${importName}"
1375
+ if (!isPackageDeclaredInPackageJson(importName, ctx.fsMap)) {
1376
+ throw new Error(
1377
+ `Node module imported but not in package.json "${importName}"
1394
1378
 
1395
1379
  ${ctx.logger.stringifyLogs()}`
1396
- );
1397
- }
1398
- const nodeModuleDir = getNodeModuleDirectory(importName, ctx.fsMap);
1399
- if (!nodeModuleDir && disableCdnLoading) {
1380
+ );
1381
+ }
1382
+ const nodeModuleDir = getNodeModuleDirectory(importName, ctx.fsMap);
1383
+ if (!nodeModuleDir && disableCdnLoading) {
1384
+ throw new Error(
1385
+ `Node module "${importName}" has no files in the node_modules directory
1386
+
1387
+ ${ctx.logger.stringifyLogs()}`
1388
+ );
1389
+ }
1390
+ if (nodeModuleDir) {
1391
+ const entrypoint = getPackageJsonEntrypoint(importName, ctx.fsMap);
1392
+ if (isTypeScriptEntrypoint(entrypoint)) {
1400
1393
  throw new Error(
1401
- `Node module "${importName}" has no files in the node_modules directory
1394
+ `Node module "${importName}" has a typescript entrypoint that is unsupported
1402
1395
 
1403
1396
  ${ctx.logger.stringifyLogs()}`
1404
1397
  );
1405
1398
  }
1406
- if (nodeModuleDir) {
1407
- const entrypoint = getPackageJsonEntrypoint(importName, ctx.fsMap);
1408
- if (isTypeScriptEntrypoint(entrypoint)) {
1399
+ if (entrypoint?.startsWith("dist/")) {
1400
+ if (isDistDirEmpty(importName, ctx.fsMap)) {
1409
1401
  throw new Error(
1410
- `Node module "${importName}" has a typescript entrypoint that is unsupported
1402
+ `Node module "${importName}" has no files in dist, did you forget to transpile?
1411
1403
 
1412
1404
  ${ctx.logger.stringifyLogs()}`
1413
1405
  );
1414
1406
  }
1415
- if (entrypoint && entrypoint.startsWith("dist/")) {
1416
- if (isDistDirEmpty(importName, ctx.fsMap)) {
1417
- throw new Error(
1418
- `Node module "${importName}" has no files in dist, did you forget to transpile?
1419
-
1420
- ${ctx.logger.stringifyLogs()}`
1421
- );
1422
- }
1423
- }
1424
1407
  }
1425
1408
  }
1426
1409
  if (disableCdnLoading) {
@@ -1430,11 +1413,8 @@ ${ctx.logger.stringifyLogs()}`
1430
1413
  ${ctx.logger.stringifyLogs()}`
1431
1414
  );
1432
1415
  }
1433
- ctx.logger.info(`importNpmPackage("${importName}")`);
1434
- return importNpmPackage(
1435
- { importName, depth, fromJsDelivr: opts.fromJsDelivr },
1436
- ctx
1437
- );
1416
+ ctx.logger.info(`importNpmPackageFromCdn("${importName}")`);
1417
+ return importNpmPackageFromCdn({ importName, depth }, ctx);
1438
1418
  }
1439
1419
  throw new Error(
1440
1420
  `Unresolved import "${importName}" ${opts.cwd ? `from directory "${opts.cwd}"` : ""}
@@ -2067,4 +2047,4 @@ export {
2067
2047
  runTscircuitCode,
2068
2048
  runTscircuitModule
2069
2049
  };
2070
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbGliL2V2YWwvZXhlY3V0aW9uLWNvbnRleHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1qbGMtcGFja2FnZS1mcm9tLWZvb3RwcmludGVyLXN0cmluZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2psYy1wYXJ0cy1lbmdpbmUudHMiLCAiLi4vLi4vbGliL2dldFBsYXRmb3JtQ29uZmlnLnRzIiwgIi4uLy4uL2xpYi91dGlscy9keW5hbWljYWxseS1sb2FkLWRlcGVuZGVuY3ktd2l0aC1jZG4tYmFja3VwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvbm9ybWFsaXplRnNNYXAudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci90c2NvbmZpZ1BhdGhzLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcmVzb2x2ZUZpbGVQYXRoLnRzIiwgIi4uLy4uL2xpYi91dGlscy9nZXQtaW1wb3J0cy1mcm9tLWNvZGUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vbGliL2V2YWwvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbG9jYWwtZmlsZS50cyIsICIuLi8uLi9saWIvc2hhcmVkL3N0YXRpYy1hc3NldC1leHRlbnNpb25zLnRzIiwgIi4uLy4uL2xpYi90cmFuc3BpbGUvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtc25pcHBldC50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vbGliL2V2YWwvZXh0cmFjdEJhc2VQYWNrYWdlTmFtZS50cyIsICIuLi8uLi9saWIvZXZhbC9pc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24udHMiLCAiLi4vLi4vbGliL2V2YWwvZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeS50cyIsICIuLi8uLi9saWIvZXZhbC9nZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQudHMiLCAiLi4vLi4vbGliL2V2YWwvaXNUeXBlU2NyaXB0RW50cnlwb2ludC50cyIsICIuLi8uLi9saWIvZXZhbC9pc0Rpc3REaXJFbXB0eS50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbnBtLXBhY2thZ2UudHMiLCAiLi4vLi4vbGliL2V2YWwvaW1wb3J0LWV2YWwtcGF0aC50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3J1bm5lci9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQudHMiLCAiLi4vLi4vbGliL3V0aWxzL2VuaGFuY2Utcm9vdC1jaXJjdWl0LWVycm9yLnRzIiwgIi4uLy4uL2xpYi9zaGFyZWQvb2JqLXBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9ydW5Uc2NpcmN1aXRDb2RlLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0TW9kdWxlLnRzIiwgIi4uLy4uL2xpYi93b3JrZXIudHMiLCAiLi4vLi4vbGliL2dldFBvc3NpYmxlRW50cnlwb2ludENvbXBvbmVudFBhdGhzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBSb290Q2lyY3VpdCB9IGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0IHR5cGUgeyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIH0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0ICogYXMgdHNjaXJjdWl0Q29yZSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgKiBhcyBSZWFjdEpzeFJ1bnRpbWUgZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdE1hdGhVdGlscyBmcm9tIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBnZXRQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJsaWIvZ2V0UGxhdGZvcm1Db25maWdcIlxuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZyB9IGZyb20gXCJsaWIvcnVubmVyL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0ICogYXMgdHNsaWIgZnJvbSBcInRzbGliXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmV4ZWN1dGlvbi1jb250ZXh0XCIpXG5cbmludGVyZmFjZSBTdG9yZWRMb2dnZXIge1xuICBpbmZvOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkXG4gIGdldExvZ3M6ICgpID0+IEFycmF5PHsgbXNnOiBzdHJpbmcgfT5cbiAgc3RyaW5naWZ5TG9nczogKCkgPT4gc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uQ29udGV4dCBleHRlbmRzIFdlYldvcmtlckNvbmZpZ3VyYXRpb24ge1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBlbnRyeXBvaW50OiBzdHJpbmdcbiAgcHJlU3VwcGxpZWRJbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIGNpcmN1aXQ6IFJvb3RDaXJjdWl0XG4gIGxvZ2dlcjogU3RvcmVkTG9nZ2VyXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbiAgaW1wb3J0U3RhY2s6IHN0cmluZ1tdXG4gIGN1cnJlbnRseUltcG9ydGluZzogU2V0PHN0cmluZz5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gIHdlYldvcmtlckNvbmZpZ3VyYXRpb246IFdlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIG9wdHM6IHtcbiAgICBuYW1lPzogc3RyaW5nXG4gICAgcGxhdGZvcm0/OiBQbGF0Zm9ybUNvbmZpZ1xuICAgIHByb2plY3RDb25maWc/OiBQYXJ0aWFsPFBsYXRmb3JtQ29uZmlnPlxuICAgIGRlYnVnTmFtZXNwYWNlPzogc3RyaW5nXG4gIH0gPSB7fSxcbik6IEV4ZWN1dGlvbkNvbnRleHQge1xuICBnbG9iYWxUaGlzLlJlYWN0ID0gUmVhY3RcblxuICBjb25zdCBiYXNlUGxhdGZvcm0gPSBvcHRzLnBsYXRmb3JtIHx8IGdldFBsYXRmb3JtQ29uZmlnKClcbiAgY29uc3QgcGxhdGZvcm0gPSBvcHRzLnByb2plY3RDb25maWdcbiAgICA/IHsgLi4uYmFzZVBsYXRmb3JtLCAuLi5vcHRzLnByb2plY3RDb25maWcgfVxuICAgIDogYmFzZVBsYXRmb3JtXG5cbiAgaWYgKHBsYXRmb3JtLnBhcnRzRW5naW5lRGlzYWJsZWQpIHtcbiAgICBwbGF0Zm9ybS5wYXJ0c0VuZ2luZSA9IHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgY2lyY3VpdCA9IG5ldyBSb290Q2lyY3VpdCh7XG4gICAgcGxhdGZvcm0sXG4gIH0pXG5cbiAgaWYgKG9wdHMubmFtZSkge1xuICAgIGNpcmN1aXQubmFtZSA9IG9wdHMubmFtZVxuICB9XG5cbiAgaWYgKG9wdHMuZGVidWdOYW1lc3BhY2UpIHtcbiAgICBjaXJjdWl0LmVuYWJsZURlYnVnKG9wdHMuZGVidWdOYW1lc3BhY2UpXG4gIH1cblxuICBjb25zdCBsb2dzOiBBcnJheTx7IG1zZzogc3RyaW5nIH0+ID0gW11cblxuICByZXR1cm4ge1xuICAgIGZzTWFwOiB7fSxcbiAgICBlbnRyeXBvaW50OiBcIlwiLFxuICAgIGxvZ2dlcjoge1xuICAgICAgaW5mbzogKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgICAgICBsb2dzLnB1c2goeyBtc2c6IG1lc3NhZ2UgfSlcbiAgICAgIH0sXG4gICAgICBnZXRMb2dzOiAoKSA9PiBsb2dzLFxuICAgICAgc3RyaW5naWZ5TG9nczogKCkgPT4gbG9ncy5tYXAoKGxvZykgPT4gbG9nLm1zZykuam9pbihcIlxcblwiKSxcbiAgICB9LFxuICAgIHByZVN1cHBsaWVkSW1wb3J0czoge1xuICAgICAgXCJAdHNjaXJjdWl0L2NvcmVcIjogdHNjaXJjdWl0Q29yZSxcbiAgICAgIHRzY2lyY3VpdDogdHNjaXJjdWl0Q29yZSxcbiAgICAgIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCI6IHRzY2lyY3VpdE1hdGhVdGlscyxcbiAgICAgIHJlYWN0OiBSZWFjdCxcbiAgICAgIFwicmVhY3QvanN4LXJ1bnRpbWVcIjogUmVhY3RKc3hSdW50aW1lLFxuICAgICAgZGVidWc6IERlYnVnLFxuICAgICAgdHNsaWIsXG5cbiAgICAgIC8vIFRoaXMgaXMgdXN1YWxseSB1c2VkIGFzIGEgdHlwZSBpbXBvcnQsIHdlIGNhbiByZW1vdmUgdGhlIHNoaW0gd2hlbiB3ZVxuICAgICAgLy8gaWdub3JlIHR5cGUgaW1wb3J0cyBpbiBnZXRJbXBvcnRzRnJvbUNvZGVcbiAgICAgIFwiQHRzY2lyY3VpdC9wcm9wc1wiOiB7fSxcbiAgICB9LFxuICAgIGNpcmN1aXQsXG4gICAgdHNDb25maWc6IG51bGwsXG4gICAgaW1wb3J0U3RhY2s6IFtdLFxuICAgIGN1cnJlbnRseUltcG9ydGluZzogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgLi4ud2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgfVxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIEtpQ2FkIGZvb3RwcmludCBzdHJpbmcgaW50byBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqIEZvciBub3csIHRoaXMgaXMgYSBzaW1wbGlmaWVkIGNvbnZlcnNpb24gdG8gYSBzdGFuZGFyZCBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwia2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljXCIgLT4gXCIwNjAzXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkID0gKFxuICBraWNhZEZvb3RwcmludDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8ga2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljIC0+IDA2MDNcbiAgbGV0IG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goLzpbUkNdXyhcXGR7NH0pXy8pXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgLy8ga2ljYWQ6UGFja2FnZV9TTzpTT0lDLThfMy45eDQuOW1tX1AxLjI3bW0gLT4gU09JQy04XG4gIC8vIGtpY2FkOlBhY2thZ2VfVE9fU09UX1NNRDpTT1QtMjMgLT4gU09ULTIzXG4gIG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goXG4gICAgLzooU09JQy1cXGQrfFNPVC1cXGQrfFNPRC1cXGQrfFNTT1AtXFxkK3xUU1NPUC1cXGQrfFFGUC1cXGQrfFFGTi1cXGQrKS8sXG4gIClcbiAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCAiLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiIGludG8gYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwiY2FwMDYwM1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nID0gKFxuICBmb290cHJpbnRlclN0cmluZzogc3RyaW5nLFxuKTogc3RyaW5nID0+IHtcbiAgaWYgKGZvb3RwcmludGVyU3RyaW5nLmluY2x1ZGVzKFwiY2FwXCIpKSB7XG4gICAgcmV0dXJuIGZvb3RwcmludGVyU3RyaW5nLnJlcGxhY2UoL2NhcC9nLCBcIlwiKVxuICB9XG4gIHJldHVybiBmb290cHJpbnRlclN0cmluZ1xufVxuIiwgImltcG9ydCB7IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkIH0gZnJvbSBcIi4vZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkXCJcbmltcG9ydCB7IGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcgfSBmcm9tIFwiLi9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmdcIlxuXG4vKipcbiAqIEdldCBhIEpMQy1jb21wYXRpYmxlIHBhY2thZ2UgbmFtZSBmcm9tIGEgZm9vdHByaW50IHN0cmluZywgd2hpY2ggY291bGQgYmVcbiAqIGEgS2lDYWQgZm9vdHByaW50IG9yIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiLlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjcGNiUGFja2FnZU5hbWUgPSAoXG4gIGZvb3RwcmludDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFmb290cHJpbnQpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoZm9vdHByaW50LnN0YXJ0c1dpdGgoXCJraWNhZDpcIikpIHtcbiAgICBjb25zdCBmb290cHJpbnRlclN0cmluZyA9IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkKGZvb3RwcmludClcbiAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmcpIHtcbiAgICAgIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludGVyU3RyaW5nKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bi1tYXRjaGVkIEtpQ2FkIHN0cmluZ3NcbiAgICByZXR1cm4gZm9vdHByaW50XG4gIH1cblxuICAvLyBOb3QgYSBLaUNhZCBzdHJpbmcsIGFzc3VtZSBpdCdzIGEgZm9vdHByaW50ZXIgc3RyaW5nXG4gIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBhcnRzRW5naW5lLCBTdXBwbGllclBhcnROdW1iZXJzIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgZ2V0SmxjcGNiUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55PigpXG5cbmNvbnN0IGdldEpsY1BhcnRzQ2FjaGVkID0gYXN5bmMgKG5hbWU6IGFueSwgcGFyYW1zOiBhbnkpID0+IHtcbiAgY29uc3QgcGFyYW1TdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAuLi5wYXJhbXMsXG4gICAganNvbjogXCJ0cnVlXCIsXG4gIH0pLnRvU3RyaW5nKClcbiAgaWYgKGNhY2hlLmhhcyhwYXJhbVN0cmluZykpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KHBhcmFtU3RyaW5nKVxuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYGh0dHBzOi8vamxjc2VhcmNoLnRzY2lyY3VpdC5jb20vJHtuYW1lfS9saXN0PyR7cGFyYW1TdHJpbmd9YCxcbiAgKVxuICBjb25zdCByZXNwb25zZUpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgY2FjaGUuc2V0KHBhcmFtU3RyaW5nLCByZXNwb25zZUpzb24pXG4gIHJldHVybiByZXNwb25zZUpzb25cbn1cblxuY29uc3Qgd2l0aEJhc2ljUGFydFByZWZlcmVuY2UgPSAocGFydHM6IGFueVtdIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGlmICghcGFydHMpIHJldHVybiBbXVxuICByZXR1cm4gWy4uLnBhcnRzXS5zb3J0KFxuICAgIChhLCBiKSA9PiBOdW1iZXIoYi5pc19iYXNpYyA/PyBmYWxzZSkgLSBOdW1iZXIoYS5pc19iYXNpYyA/PyBmYWxzZSksXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IGpsY1BhcnRzRW5naW5lOiBQYXJ0c0VuZ2luZSA9IHtcbiAgZmluZFBhcnQ6IGFzeW5jICh7XG4gICAgc291cmNlQ29tcG9uZW50LFxuICAgIGZvb3RwcmludGVyU3RyaW5nLFxuICB9KTogUHJvbWlzZTxTdXBwbGllclBhcnROdW1iZXJzPiA9PiB7XG4gICAgY29uc3QgamxjcGNiUGFja2FnZSA9IGdldEpsY3BjYlBhY2thZ2VOYW1lKGZvb3RwcmludGVyU3RyaW5nKVxuXG4gICAgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Jlc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzaXN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc2lzdG9yc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5yZXNpc3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNpc3RvcnMpXG4gICAgICAgICAgLm1hcCgocjogYW55KSA9PiBgQyR7ci5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2FwYWNpdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2FwYWNpdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjYXBhY2l0b3JzXCIsIHtcbiAgICAgICAgY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY2FwYWNpdG9ycylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9waW5faGVhZGVyXCJcbiAgICApIHtcbiAgICAgIGxldCBwaXRjaDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmc/LmluY2x1ZGVzKFwiX3BcIikpIHtcbiAgICAgICAgcGl0Y2ggPSBOdW1iZXIoZm9vdHByaW50ZXJTdHJpbmcuc3BsaXQoXCJfcFwiKVsxXSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXG4gICAgICAgIFwiaGVhZGVyc1wiLFxuICAgICAgICBwaXRjaFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShoZWFkZXJzKVxuICAgICAgICAgIC5tYXAoKGg6IGFueSkgPT4gYEMke2gubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3BvdGVudGlvbWV0ZXJcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3RlbnRpb21ldGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJwb3RlbnRpb21ldGVyc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5tYXhfcmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvdGVudGlvbWV0ZXJzKVxuICAgICAgICAgIC5tYXAoKHA6IGFueSkgPT4gYEMke3AubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Rpb2RlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgZGlvZGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImRpb2Rlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShkaW9kZXMpXG4gICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBgQyR7ZC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2hpcFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNoaXBzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNoaXBzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNoaXBzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3RyYW5zaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyB0cmFuc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJ0cmFuc2lzdG9yc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIHRyYW5zaXN0b3JfdHlwZTogc291cmNlQ29tcG9uZW50LnRyYW5zaXN0b3JfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHRyYW5zaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHQ6IGFueSkgPT4gYEMke3QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Bvd2VyX3NvdXJjZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHBvd2VyX3NvdXJjZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG93ZXJfc291cmNlc1wiLCB7XG4gICAgICAgIHZvbHRhZ2U6IHNvdXJjZUNvbXBvbmVudC52b2x0YWdlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocG93ZXJfc291cmNlcylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9pbmR1Y3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGluZHVjdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJpbmR1Y3RvcnNcIiwge1xuICAgICAgICBpbmR1Y3RhbmNlOiBzb3VyY2VDb21wb25lbnQuaW5kdWN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGluZHVjdG9ycylcbiAgICAgICAgICAubWFwKChpOiBhbnkpID0+IGBDJHtpLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jcnlzdGFsXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY3J5c3RhbHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY3J5c3RhbHNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIGxvYWRfY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5sb2FkX2NhcGFjaXRhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY3J5c3RhbHMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbW9zZmV0XCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbW9zZmV0cyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJtb3NmZXRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgICAgbW9zZmV0X21vZGU6IHNvdXJjZUNvbXBvbmVudC5tb3NmZXRfbW9kZSxcbiAgICAgICAgY2hhbm5lbF90eXBlOiBzb3VyY2VDb21wb25lbnQuY2hhbm5lbF90eXBlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UobW9zZmV0cylcbiAgICAgICAgICAubWFwKChtOiBhbnkpID0+IGBDJHttLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNvbmF0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNvbmF0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc29uYXRvcnNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNvbmF0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3N3aXRjaFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHN3aXRjaGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInN3aXRjaGVzXCIsIHtcbiAgICAgICAgc3dpdGNoX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50eXBlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2Uoc3dpdGNoZXMpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBgQyR7cy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbGVkXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbGVkcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJsZWRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGxlZHMpXG4gICAgICAgICAgLm1hcCgobDogYW55KSA9PiBgQyR7bC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfZnVzZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGZ1c2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImZ1c2VzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGZ1c2VzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9XG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZywgU3BpY2VFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBqbGNQYXJ0c0VuZ2luZSB9IGZyb20gXCJAdHNjaXJjdWl0L3BhcnRzLWVuZ2luZVwiXG5pbXBvcnQgeyBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbiB9IGZyb20gXCJraWNhZC1jb21wb25lbnQtY29udmVydGVyXCJcbmltcG9ydCB7IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwIH0gZnJvbSBcIi4vdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cFwiXG5jb25zdCBLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMID0gXCJodHRwczovL2tpY2FkLW1vZC1jYWNoZS50c2NpcmN1aXQuY29tXCJcblxubGV0IG5nc3BpY2VFbmdpbmVDYWNoZTogU3BpY2VFbmdpbmUgfCBudWxsID0gbnVsbFxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1Db25maWcgPSAoKTogUGxhdGZvcm1Db25maWcgPT4gKHtcbiAgcGFydHNFbmdpbmU6IGpsY1BhcnRzRW5naW5lLFxuICBzcGljZUVuZ2luZU1hcDoge1xuICAgIG5nc3BpY2U6IHtcbiAgICAgIHNpbXVsYXRlOiBhc3luYyAoc3BpY2U6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIW5nc3BpY2VFbmdpbmVDYWNoZSkge1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSA9XG4gICAgICAgICAgICBhd2FpdCBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cChcbiAgICAgICAgICAgICAgXCJAdHNjaXJjdWl0L25nc3BpY2Utc3BpY2UtZW5naW5lXCIsXG4gICAgICAgICAgICApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb3VsZCBub3QgbG9hZCBuZ3NwaWNlIGVuZ2luZSBmcm9tIGxvY2FsIG5vZGVfbW9kdWxlcyBvciBDRE4gZmFsbGJhY2suXCIsXG4gICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUpIHtcbiAgICAgICAgICAgIG5nc3BpY2VFbmdpbmVDYWNoZSA9IGF3YWl0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZ3NwaWNlRW5naW5lQ2FjaGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBsb2FkIG5nc3BpY2UgZW5naW5lIGZyb20gbG9jYWwgbm9kZV9tb2R1bGVzIG9yIENETiBmYWxsYmFjay5cIixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmdzcGljZUVuZ2luZUNhY2hlLnNpbXVsYXRlKHNwaWNlKVxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRMaWJyYXJ5TWFwOiB7XG4gICAga2ljYWQ6IGFzeW5jIChmb290cHJpbnROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMfS8ke2Zvb3RwcmludE5hbWV9YFxuICAgICAgY29uc3QgY2lyY3VpdEpzb25VcmwgPSBgJHtiYXNlVXJsfS5jaXJjdWl0Lmpzb25gXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjaXJjdWl0SnNvblVybClcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgIC8vIEZpbHRlciBwY2Jfc2lsa3NjcmVlbl90ZXh0IHRvIG9ubHkga2VlcCBlbnRyaWVzIHdpdGggdGV4dCA9PT0gXCJSRUYqKlwiXG4gICAgICAvLyBBcHBseSBmaWx0ZXJpbmcgb25seSB0byBlbGVtZW50cyBjb21pbmcgZnJvbSB0aGUga2ljYWRfbW9kX3NlcnZlciByZXNwb25zZVxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBBcnJheS5pc0FycmF5KHJhdylcbiAgICAgICAgPyByYXcuZmlsdGVyKChlbCkgPT5cbiAgICAgICAgICAgIGVsPy50eXBlID09PSBcInBjYl9zaWxrc2NyZWVuX3RleHRcIiA/IGVsPy50ZXh0ID09PSBcIlJFRioqXCIgOiB0cnVlLFxuICAgICAgICAgIClcbiAgICAgICAgOiByYXdcbiAgICAgIGNvbnN0IHdybFVybCA9IGAke2Jhc2VVcmx9LndybGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBmaWx0ZXJlZCxcbiAgICAgICAgY2FkTW9kZWw6IHsgd3JsVXJsLCBtb2RlbFVuaXRUb01tU2NhbGU6IDIuNTQgfSxcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRGaWxlUGFyc2VyTWFwOiB7XG4gICAga2ljYWRfbW9kOiB7XG4gICAgICBsb2FkRnJvbVVybDogYXN5bmMgKHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpY2FkQ29udGVudCA9IGF3YWl0IGZldGNoKHVybCkudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgICAgICBjb25zdCBraWNhZEpzb24gPSBhd2FpdCBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbihraWNhZENvbnRlbnQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9vdHByaW50Q2lyY3VpdEpzb246IEFycmF5LmlzQXJyYXkoa2ljYWRKc29uKVxuICAgICAgICAgICAgPyBraWNhZEpzb25cbiAgICAgICAgICAgIDogW2tpY2FkSnNvbl0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pXG4iLCAiZXhwb3J0IGNvbnN0IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwID0gYXN5bmMgKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBGaXJzdCwgdHJ5IHRvIGltcG9ydCB1c2luZyBOb2RlLmpzIHJlc29sdXRpb25cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQocGFja2FnZU5hbWUpXG4gICAgcmV0dXJuIG1vZHVsZS5kZWZhdWx0XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGxvYWQgJHtwYWNrYWdlTmFtZX0gbG9jYWxseSwgdHJ5aW5nIENETiBmYWxsYmFjay4uLmApXG4gICAgLy8gRmFsbGJhY2sgdG8gSnNEZWxpdnIgQ0ROIGZvciBicm93c2VyIGVudmlyb25tZW50c1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtwYWNrYWdlTmFtZX0vK2VzbWAsXG4gICAgICApXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCAke3BhY2thZ2VOYW1lfSBmcm9tIENETjogJHtyZXMuc3RhdHVzVGV4dH1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBjb2RlID0gYXdhaXQgcmVzLnRleHQoKVxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb2RlXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiB9KVxuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0OiBsb2FkZWRNb2R1bGUgfSA9IGF3YWl0IGltcG9ydCh1cmwpXG4gICAgICAgIHJldHVybiBsb2FkZWRNb2R1bGVcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNkbkVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDRE4gZmFsbGJhY2sgZm9yICR7cGFja2FnZU5hbWV9IGFsc28gZmFpbGVkOmAsIGNkbkVycm9yKVxuICAgICAgdGhyb3cgY2RuRXJyb3JcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZykge1xuICBsZXQgbm9ybUZpbGVQYXRoID0gZmlsZVBhdGhcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC50cmltKClcbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMilcbiAgfVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDEpXG4gIH1cbiAgcmV0dXJuIG5vcm1GaWxlUGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRnNNYXAoZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbZnNQYXRoLCBmaWxlQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKGZzUGF0aCldID0gZmlsZUNvbnRlbnRcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZEZzTWFwXG59XG4iLCAiLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiBhIHBhdGgsIHNpbWlsYXIgdG8gTm9kZS5qcyBwYXRoLmRpcm5hbWVcbiAqIFdvcmtzIG9uIGJvdGggVW5peCBhbmQgV2luZG93cyBwYXRoc1xuICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gZXh0cmFjdCB0aGUgZGlyZWN0b3J5IGZyb21cbiAqIEByZXR1cm5zIFRoZSBkaXJlY3RvcnkgcGFydCBvZiB0aGUgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlybmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXBhdGgpIHJldHVybiBcIi5cIlxuXG4gIC8vIE5vcm1hbGl6ZSBwYXRoIHNlcGFyYXRvcnMgdG8gZm9yd2FyZCBzbGFzaGVzXG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuXG4gIC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzXG4gIGNvbnN0IGNsZWFuUGF0aCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL1xcLyskLywgXCJcIilcblxuICAvLyBJZiB0aGVyZSBhcmUgbm8gc2xhc2hlcywgcmV0dXJuIFwiLlwiXG4gIGlmIChjbGVhblBhdGguaW5kZXhPZihcIi9cIikgPT09IC0xKSByZXR1cm4gXCIuXCJcblxuICAvLyBSZXR1cm4gZXZlcnl0aGluZyB1cCB0byB0aGUgbGFzdCBzbGFzaFxuICByZXR1cm4gY2xlYW5QYXRoLnN1YnN0cmluZygwLCBjbGVhblBhdGgubGFzdEluZGV4T2YoXCIvXCIpKSB8fCBcIi9cIlxufVxuIiwgImltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwiLi9kaXJuYW1lXCJcblxuLyoqXG4gKiBSZXNvbHZlIGFuIGltcG9ydFBhdGggcmVsYXRpdmUgdG8gYSBjd2QsIHN1cHBvcnRpbmcgLi4vLCAuLyBhbmQgYWJzb2x1dGUgcGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGg6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCBwYXJlbnREaXIgPSBkaXJuYW1lKGN3ZClcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDMpLCBwYXJlbnREaXIpXG4gIH1cbiAgLy8gSGFuZGxlIGN1cnJlbnQgZGlyZWN0b3J5XG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMiksIGN3ZClcbiAgfVxuICAvLyBIYW5kbGUgYWJzb2x1dGUgcGF0aFxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHJldHVybiBpbXBvcnRQYXRoLnNsaWNlKDEpXG4gIH1cbiAgLy8gSGFuZGxlIHJlbGF0aXZlIHBhdGhcbiAgcmV0dXJuIGAke2N3ZH0vJHtpbXBvcnRQYXRofWBcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcblxuZXhwb3J0IHR5cGUgVHNDb25maWcgPSB7XG4gIGNvbXBpbGVyT3B0aW9ucz86IHtcbiAgICBiYXNlVXJsPzogc3RyaW5nXG4gICAgcGF0aHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG4gIH1cbiAgZXh0ZW5kcz86IHN0cmluZyB8IHN0cmluZ1tdXG4gIGZpbGVzPzogc3RyaW5nW11cbiAgcmVmZXJlbmNlcz86IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICBpbmNsdWRlPzogc3RyaW5nW11cbiAgZXhjbHVkZT86IHN0cmluZ1tdXG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzQ29uZmlnKFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4pOiBUc0NvbmZpZyB8IG51bGwge1xuICBpZiAoQXJyYXkuaXNBcnJheShmc01hcE9yQWxsRmlsZVBhdGhzKSkgcmV0dXJuIG51bGxcbiAgY29uc3QgdHNjb25maWdDb250ZW50ID0gZnNNYXBPckFsbEZpbGVQYXRoc1tcInRzY29uZmlnLmpzb25cIl1cbiAgaWYgKCF0c2NvbmZpZ0NvbnRlbnQpIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IHRzY29uZmlnQ29udGVudC5yZXBsYWNlKFxuICAgICAgL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98XFwvXFwvLiovZyxcbiAgICAgIFwiXCIsXG4gICAgKSAvLyByZW1vdmUgY29tbWVudHNcblxuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc2FuaXRpemVkQ29udGVudCkgYXMgVHNDb25maWdcbiAgICByZXR1cm4gcGFyc2VkXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIHRzY29uZmlnLmpzb246ICR7ZS5tZXNzYWdlfWApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoVHNjb25maWdQYXRocyhvcHRzOiB7XG4gIGltcG9ydFBhdGg6IHN0cmluZ1xuICBub3JtYWxpemVkRmlsZVBhdGhNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICB0c2NvbmZpZ0Rpcj86IHN0cmluZ1xufSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSA9IG9wdHNcbiAgY29uc3QgcGF0aHMgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5wYXRoc1xuICBpZiAoIXBhdGhzKSByZXR1cm4gbnVsbFxuICBjb25zdCBiYXNlVXJsID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybCB8fCBcIi5cIlxuXG4gIGNvbnN0IHRyeVJlc29sdmVDYW5kaWRhdGUgPSAoY2FuZGlkYXRlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkQ2FuZGlkYXRlID0gbm9ybWFsaXplRmlsZVBhdGgoY2FuZGlkYXRlKVxuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRDYW5kaWRhdGUpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkQ2FuZGlkYXRlKSFcbiAgICB9XG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3Qgd2l0aEV4dCA9IGAke25vcm1hbGl6ZWRDYW5kaWRhdGV9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHdpdGhFeHQpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHdpdGhFeHQpIVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGhzKSkge1xuICAgIC8vIFN1cHBvcnQgcGF0dGVybnMgbGlrZSBcIkBzcmMvKlwiIG9yIFwidXRpbHMvKlwiIGFuZCBhbHNvIGV4YWN0IG1hdGNoZXMgd2l0aG91dCBcIipcIlxuICAgIGNvbnN0IGhhc1dpbGRjYXJkID0gYWxpYXMuaW5jbHVkZXMoXCIqXCIpXG4gICAgaWYgKGhhc1dpbGRjYXJkKSB7XG4gICAgICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gYWxpYXMuc3BsaXQoXCIqXCIpXG4gICAgICBpZiAoXG4gICAgICAgICFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSB8fFxuICAgICAgICAhaW1wb3J0UGF0aC5lbmRzV2l0aChzdWZmaXggfHwgXCJcIilcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3Qgc3Rhck1hdGNoID0gaW1wb3J0UGF0aC5zbGljZShcbiAgICAgICAgcHJlZml4Lmxlbmd0aCxcbiAgICAgICAgaW1wb3J0UGF0aC5sZW5ndGggLSAoc3VmZml4ID8gc3VmZml4Lmxlbmd0aCA6IDApLFxuICAgICAgKVxuICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHRhcmdldC5yZXBsYWNlKFwiKlwiLCBzdGFyTWF0Y2gpXG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgICAgYmFzZVVybCAmJiAhcmVwbGFjZWQuc3RhcnRzV2l0aChcIi4vXCIpICYmICFyZXBsYWNlZC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgPyBgJHtiYXNlVXJsfS8ke3JlcGxhY2VkfWBcbiAgICAgICAgICAgIDogcmVwbGFjZWRcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlSZXNvbHZlQ2FuZGlkYXRlKGNhbmRpZGF0ZSlcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGltcG9ydFBhdGggIT09IGFsaWFzKSBjb250aW51ZVxuICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPVxuICAgICAgICAgIGJhc2VVcmwgJiYgIXRhcmdldC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXRhcmdldC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgPyBgJHtiYXNlVXJsfS8ke3RhcmdldH1gXG4gICAgICAgICAgICA6IHRhcmdldFxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHRyeVJlc29sdmVDYW5kaWRhdGUoY2FuZGlkYXRlKVxuICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkUGF0aEZyb21CYXNlVXJsID0gcmVzb2x2ZVdpdGhCYXNlVXJsKHtcbiAgICBpbXBvcnRQYXRoLFxuICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICBleHRlbnNpb25zLFxuICAgIHRzQ29uZmlnLFxuICAgIHRzY29uZmlnRGlyLFxuICB9KVxuXG4gIGlmIChyZXNvbHZlZFBhdGhGcm9tQmFzZVVybCkgcmV0dXJuIHJlc29sdmVkUGF0aEZyb21CYXNlVXJsXG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoQmFzZVVybChvcHRzOiB7XG4gIGltcG9ydFBhdGg6IHN0cmluZ1xuICBub3JtYWxpemVkRmlsZVBhdGhNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICB0c2NvbmZpZ0Rpcj86IHN0cmluZ1xufSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSA9IG9wdHNcbiAgY29uc3QgYmFzZVVybCA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmxcbiAgaWYgKCFiYXNlVXJsKSByZXR1cm4gbnVsbFxuXG4gIC8vIFJlc29sdmUgYmFzZVVybCByZWxhdGl2ZSB0byB0c2NvbmZpZyBsb2NhdGlvblxuICBjb25zdCBiYXNlRGlyID0gdHNjb25maWdEaXIgfHwgXCIuXCJcbiAgbGV0IGZpbGVQYXRoVG9SZXNvbHZlID0gYCR7YmFzZURpcn0vJHtiYXNlVXJsfS8ke2ltcG9ydFBhdGh9YFxuICAvLyBDbGVhbiB1cCBtdWx0aXBsZSBzbGFzaGVzIGFuZCBsZWFkaW5nIGRvdHNcbiAgZmlsZVBhdGhUb1Jlc29sdmUgPSBmaWxlUGF0aFRvUmVzb2x2ZS5yZXBsYWNlKC9cXC8rL2csIFwiL1wiKSAvLyBSZXBsYWNlIG11bHRpcGxlIHNsYXNoZXMgd2l0aCBzaW5nbGUgc2xhc2hcbiAgZmlsZVBhdGhUb1Jlc29sdmUgPSBmaWxlUGF0aFRvUmVzb2x2ZS5yZXBsYWNlKC9cXC9cXC5cXC8vZywgXCIvXCIpIC8vIFJlcGxhY2UgLy4vIHdpdGggL1xuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aFRvUmVzb2x2ZSlcblxuICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkRmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZEZpbGVQYXRoKSFcbiAgfVxuXG4gIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCB3aXRoRXh0ID0gYCR7bm9ybWFsaXplZEZpbGVQYXRofS4ke2V4dH1gXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMod2l0aEV4dCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHdpdGhFeHQpIVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybihcbiAgaW1wb3J0UGF0aDogc3RyaW5nLFxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIGZhbHNlXG5cbiAgZm9yIChjb25zdCBbYWxpYXNdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGhzKSkge1xuICAgIGNvbnN0IGhhc1dpbGRjYXJkID0gYWxpYXMuaW5jbHVkZXMoXCIqXCIpXG4gICAgaWYgKGhhc1dpbGRjYXJkKSB7XG4gICAgICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gYWxpYXMuc3BsaXQoXCIqXCIpXG4gICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgJiYgaW1wb3J0UGF0aC5lbmRzV2l0aChzdWZmaXggfHwgXCJcIikpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGltcG9ydFBhdGggPT09IGFsaWFzKSByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgcmVzb2x2ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZVJlbGF0aXZlUGF0aFwiXG5pbXBvcnQge1xuICByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMsXG4gIHR5cGUgVHNDb25maWcsXG4gIHJlc29sdmVXaXRoQmFzZVVybCxcbn0gZnJvbSBcIi4vdHNjb25maWdQYXRoc1wiXG5cbmNvbnN0IEZJTEVfRVhURU5TSU9OUyA9IFtcbiAgXCJ0c3hcIixcbiAgXCJ0c1wiLFxuICBcImpzb25cIixcbiAgXCJqc1wiLFxuICBcImpzeFwiLFxuICBcIm9ialwiLFxuICBcImdsdGZcIixcbiAgXCJnbGJcIixcbiAgXCJzdGxcIixcbiAgXCJzdGVwXCIsXG4gIFwic3RwXCIsXG5dXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGggPSAoXG4gIHVua25vd25GaWxlUGF0aDogc3RyaW5nLFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4gIGN3ZD86IHN0cmluZyxcbiAgb3B0czogeyB0c0NvbmZpZz86IFRzQ29uZmlnIHwgbnVsbDsgdHNjb25maWdEaXI/OiBzdHJpbmcgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHRzQ29uZmlnID0gb3B0cy50c0NvbmZpZyA/PyBudWxsXG4gIGNvbnN0IGlzUmVsYXRpdmVJbXBvcnQgPVxuICAgIHVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgfHwgdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIilcbiAgY29uc3QgaGFzQmFzZVVybCA9ICEhdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybFxuXG4gIC8vIEhhbmRsZSBwYXJlbnQgZGlyZWN0b3J5IG5hdmlnYXRpb24gcHJvcGVybHlcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID1cbiAgICBjd2QgJiYgKGlzUmVsYXRpdmVJbXBvcnQgfHwgIWhhc0Jhc2VVcmwpXG4gICAgICA/IHJlc29sdmVSZWxhdGl2ZVBhdGgodW5rbm93bkZpbGVQYXRoLCBjd2QpXG4gICAgICA6IHVua25vd25GaWxlUGF0aFxuXG4gIGNvbnN0IGZpbGVQYXRocyA9IG5ldyBTZXQoXG4gICAgQXJyYXkuaXNBcnJheShmc01hcE9yQWxsRmlsZVBhdGhzKVxuICAgICAgPyBmc01hcE9yQWxsRmlsZVBhdGhzXG4gICAgICA6IE9iamVjdC5rZXlzKGZzTWFwT3JBbGxGaWxlUGF0aHMpLFxuICApXG5cbiAgaWYgKGZpbGVQYXRocy5oYXMocmVzb2x2ZWRQYXRoKSkge1xuICAgIHJldHVybiByZXNvbHZlZFBhdGhcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAuc2V0KG5vcm1hbGl6ZUZpbGVQYXRoKGZpbGVQYXRoKSwgZmlsZVBhdGgpXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkUmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplRmlsZVBhdGgocmVzb2x2ZWRQYXRoKVxuXG4gIC8vIFdoZW4gYmFzZVVybCBpcyBzZXQsIG5vbi1yZWxhdGl2ZSBpbXBvcnRzIHNob3VsZCBnbyB0aHJvdWdoIGJhc2VVcmwgcmVzb2x1dGlvblxuICBpZiAoaXNSZWxhdGl2ZUltcG9ydCB8fCAhaGFzQmFzZVVybCkge1xuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGgpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSFcbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggZm9yIGZpbGUgd2l0aCBhIHNldCBvZiBkaWZmZXJlbnQgZXh0ZW5zaW9uc1xuICAgIGZvciAoY29uc3QgZXh0IG9mIEZJTEVfRVhURU5TSU9OUykge1xuICAgICAgY29uc3QgcG9zc2libGVGaWxlUGF0aCA9IGAke25vcm1hbGl6ZWRSZXNvbHZlZFBhdGh9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHBvc3NpYmxlRmlsZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgdXNpbmcgdHNjb25maWcgXCJwYXRoc1wiIG1hcHBpbmcgd2hlbiB0aGUgaW1wb3J0IGlzIG5vbi1yZWxhdGl2ZVxuICBpZiAoIWlzUmVsYXRpdmVJbXBvcnQpIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tUGF0aHMgPSByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMoe1xuICAgICAgaW1wb3J0UGF0aDogdW5rbm93bkZpbGVQYXRoLFxuICAgICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgICAgZXh0ZW5zaW9uczogRklMRV9FWFRFTlNJT05TLFxuICAgICAgdHNDb25maWcsXG4gICAgICB0c2NvbmZpZ0Rpcjogb3B0cy50c2NvbmZpZ0RpcixcbiAgICB9KVxuICAgIGlmIChyZXNvbHZlZFBhdGhGcm9tUGF0aHMpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tUGF0aHNcblxuICAgIGNvbnN0IHJlc29sdmVkUGF0aEZyb21CYXNlVXJsID0gcmVzb2x2ZVdpdGhCYXNlVXJsKHtcbiAgICAgIGltcG9ydFBhdGg6IHVua25vd25GaWxlUGF0aCxcbiAgICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICAgIGV4dGVuc2lvbnM6IEZJTEVfRVhURU5TSU9OUyxcbiAgICAgIHRzQ29uZmlnLFxuICAgICAgdHNjb25maWdEaXI6IG9wdHMudHNjb25maWdEaXIsXG4gICAgfSlcbiAgICBpZiAocmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tQmFzZVVybFxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBhbiBhYnNvbHV0ZSBpbXBvcnQgKG9ubHkgaWYgbm8gYmFzZVVybCBpcyBjb25maWd1cmVkIGluIHRzY29uZmlnKVxuICAvLyBXaGVuIGJhc2VVcmwgaXMgc2V0LCBpbXBvcnRzIHNob3VsZCByZXNvbHZlIHZpYSBiYXNlVXJsIG9yIGZhaWwsIG5vdCBmYWxsIGJhY2sgdG8gYWJzb2x1dGUgcGF0aHNcbiAgaWYgKCFpc1JlbGF0aXZlSW1wb3J0ICYmICFoYXNCYXNlVXJsKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFVua25vd25GaWxlUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHVua25vd25GaWxlUGF0aClcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkVW5rbm93bkZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIEZJTEVfRVhURU5TSU9OUykge1xuICAgICAgY29uc3QgcG9zc2libGVGaWxlUGF0aCA9IGAke25vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGh9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHBvc3NpYmxlRmlsZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGhPclRocm93ID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGw7IHRzY29uZmlnRGlyPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKFxuICAgIHVua25vd25GaWxlUGF0aCxcbiAgICBmc01hcE9yQWxsRmlsZVBhdGhzLFxuICAgIGN3ZCxcbiAgICBvcHRzLFxuICApXG4gIGlmICghcmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGaWxlIG5vdCBmb3VuZCBcIiR7dW5rbm93bkZpbGVQYXRofVwiLCBhdmFpbGFibGUgcGF0aHM6XFxuXFxuJHtPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKS5qb2luKFwiLCBcIil9YCxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkRmlsZVBhdGhcbn1cbiIsICJleHBvcnQgY29uc3QgZ2V0SW1wb3J0c0Zyb21Db2RlID0gKGNvZGU6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgLy8gTWF0Y2ggYmFzaWMgaW1wb3J0IHBhdHRlcm5zIGluY2x1ZGluZyBjb21iaW5lZCBkZWZhdWx0IGFuZCBuYW1lc3BhY2UgaW1wb3J0c1xuICBjb25zdCBpbXBvcnRSZWdleCA9XG4gICAgL15cXHMqaW1wb3J0XFxzKyg/Oig/OltcXHdcXHNdKyxcXHMqKT8oPzpcXCpcXHMrYXNcXHMrW1xcd1xcc10rfFxce1tcXHNcXHcsXStcXH18XFx3KylcXHMrZnJvbVxccyopP1snXCJdKC4rPylbJ1wiXS9nbVxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGZ1bGxNYXRjaCA9IG1hdGNoWzBdXG4gICAgaWYgKC9eXFxzKmltcG9ydFxccyt0eXBlXFxiLy50ZXN0KGZ1bGxNYXRjaCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGltcG9ydHMucHVzaChtYXRjaFsxXSlcbiAgfVxuXG4gIC8vIE1hdGNoIHJlLWV4cG9ydHNcbiAgY29uc3QgcmVFeHBvcnRSZWdleCA9XG4gICAgL15cXHMqZXhwb3J0XFxzKyg/OnR5cGVcXHMrKT8oPzpcXCpcXHMrYXNcXHMrW1xcdyRdK3xcXCp8XFx7W159XStcXH0pXFxzK2Zyb21cXHMqWydcIl0oLis/KVsnXCJdL2dtXG4gIGxldCByZUV4cG9ydE1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgocmVFeHBvcnRNYXRjaCA9IHJlRXhwb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBmdWxsTWF0Y2ggPSByZUV4cG9ydE1hdGNoWzBdXG4gICAgaWYgKC9eXFxzKmV4cG9ydFxccyt0eXBlXFxiLy50ZXN0KGZ1bGxNYXRjaCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGltcG9ydHMucHVzaChyZUV4cG9ydE1hdGNoWzFdKVxuICB9XG5cbiAgcmV0dXJuIGltcG9ydHNcbn1cbiIsICJpbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcIi4vZGlybmFtZVwiXG5cbnR5cGUgRXhwb3J0VmFsdWUgPSBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PlxuXG5pbnRlcmZhY2UgUGFja2FnZUpzb24ge1xuICBtYWluPzogc3RyaW5nXG4gIG1vZHVsZT86IHN0cmluZ1xuICBleHBvcnRzPzogUmVjb3JkPHN0cmluZywgRXhwb3J0VmFsdWU+XG59XG5cbmludGVyZmFjZSBOb2RlUmVzb2x1dGlvbkNvbnRleHQge1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBleHRlbnNpb25zOiBzdHJpbmdbXVxuICBiYXNlUGF0aDogc3RyaW5nXG4gIG1vZHVsZVBhdGg6IHN0cmluZ1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KFxuICBtb2R1bGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogTm9kZVJlc29sdXRpb25Db250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICBmc01hcCxcbiAgICBleHRlbnNpb25zOiBbXCIuanNcIiwgXCIuanN4XCIsIFwiLnRzXCIsIFwiLnRzeFwiLCBcIi5qc29uXCJdLFxuICAgIGJhc2VQYXRoLFxuICAgIG1vZHVsZVBhdGgsXG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uKG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLCBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCkge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9L3BhY2thZ2UuanNvbmBcbiAgaWYgKCFjdHguZnNNYXBbcGFja2FnZUpzb25QYXRoXSkgcmV0dXJuIG51bGxcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjdHguZnNNYXBbcGFja2FnZUpzb25QYXRoXSkgYXMgUGFja2FnZUpzb25cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoXG4gIHBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKGN0eC5mc01hcFtwYXRoXSkgcmV0dXJuIHBhdGhcblxuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IHBhdGhXaXRoRXh0ID0gcGF0aC5yZXBsYWNlKC9cXC5qcyR8XFwuanN4JC8sIFwiXCIpICsgZXh0XG4gICAgaWYgKGN0eC5mc01hcFtwYXRoV2l0aEV4dF0pIHJldHVybiBwYXRoV2l0aEV4dFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFeHBvcnRQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgZXhwb3J0UGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBmdWxsRXhwb3J0UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vJHtleHBvcnRQYXRoLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKX1gXG4gIHJldHVybiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbEV4cG9ydFBhdGgsIGN0eClcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KGV4cG9ydFZhbHVlOiBFeHBvcnRWYWx1ZSk6IHN0cmluZyB8IG51bGwge1xuICBpZiAodHlwZW9mIGV4cG9ydFZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGV4cG9ydFZhbHVlXG4gIH1cblxuICAvLyBIYW5kbGUgY29uZGl0aW9uYWwgZXhwb3J0cyAtIHRyeSBjb21tb24gY29uZGl0aW9ucyBpbiBvcmRlciBvZiBwcmVmZXJlbmNlXG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBbXCJpbXBvcnRcIiwgXCJkZWZhdWx0XCIsIFwicmVxdWlyZVwiLCBcIm5vZGVcIiwgXCJicm93c2VyXCJdXG4gIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcbiAgICBpZiAoZXhwb3J0VmFsdWVbY29uZGl0aW9uXSkge1xuICAgICAgY29uc3QgY29uZGl0aW9uVmFsdWUgPSBleHBvcnRWYWx1ZVtjb25kaXRpb25dXG4gICAgICBpZiAodHlwZW9mIGNvbmRpdGlvblZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBjb25kaXRpb25WYWx1ZVxuICAgICAgfVxuICAgICAgLy8gUmVjdXJzaXZlbHkgaGFuZGxlIG5lc3RlZCBjb25kaXRpb25zXG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVDb25kaXRpb25hbEV4cG9ydChjb25kaXRpb25WYWx1ZSlcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFeHBvcnRzKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICByZW1haW5pbmdQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghcGFja2FnZUpzb24uZXhwb3J0cykgcmV0dXJuIG51bGxcblxuICAvLyBIYW5kbGUgZGVmYXVsdCBleHBvcnQgY29uZGl0aW9uICh3aGVuIG5vIHN1YnBhdGgpXG4gIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBwYWNrYWdlSnNvbi5leHBvcnRzW1wiLlwiXVxuICBpZiAocmVtYWluaW5nUGF0aCA9PT0gXCJcIiAmJiBkZWZhdWx0RXhwb3J0KSB7XG4gICAgY29uc3QgZXhwb3J0UGF0aCA9IHJlc29sdmVDb25kaXRpb25hbEV4cG9ydChkZWZhdWx0RXhwb3J0KVxuICAgIGlmIChleHBvcnRQYXRoKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVFeHBvcnRQYXRoKG5vZGVNb2R1bGVzUGF0aCwgZXhwb3J0UGF0aCwgY3R4KVxuICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgc3VicGF0aCBleHBvcnRzXG4gIGNvbnN0IHN1YnBhdGhFeHBvcnQgPSByZW1haW5pbmdQYXRoXG4gICAgPyBwYWNrYWdlSnNvbi5leHBvcnRzW2AuLyR7cmVtYWluaW5nUGF0aH1gXVxuICAgIDogbnVsbFxuICBpZiAoc3VicGF0aEV4cG9ydCkge1xuICAgIGNvbnN0IGV4cG9ydFBhdGggPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoc3VicGF0aEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHRvcC1sZXZlbCBjb25kaXRpb25hbCBleHBvcnRzIChsZWdhY3kgZm9ybWF0KVxuICBjb25zdCBpbXBvcnRFeHBvcnQgPSBwYWNrYWdlSnNvbi5leHBvcnRzLmltcG9ydFxuICBpZiAocmVtYWluaW5nUGF0aCA9PT0gXCJcIiAmJiBpbXBvcnRFeHBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGV4cG9ydFBhdGggPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoaW1wb3J0RXhwb3J0KVxuICAgIGlmIChleHBvcnRQYXRoKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVFeHBvcnRQYXRoKG5vZGVNb2R1bGVzUGF0aCwgZXhwb3J0UGF0aCwgY3R4KVxuICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBwYWNrYWdlSnNvbi5tb2R1bGUgfHwgcGFja2FnZUpzb24ubWFpbiB8fCBcImluZGV4LmpzXCJcbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZW50cnlQb2ludH1gXG4gIHJldHVybiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbFBhdGgsIGN0eClcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVJlbWFpbmluZ1BhdGgoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICByZW1haW5pbmdQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghcmVtYWluaW5nUGF0aCkge1xuICAgIC8vIFRyeSBpbmRleCBmaWxlcyBpbiB0aGUgbW9kdWxlIHJvb3RcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3QgaW5kZXhQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9pbmRleCR7ZXh0fWBcbiAgICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7cmVtYWluaW5nUGF0aH1gXG4gIGNvbnN0IGRpcmVjdE1hdGNoID0gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG4gIGlmIChkaXJlY3RNYXRjaCkgcmV0dXJuIGRpcmVjdE1hdGNoXG5cbiAgLy8gVHJ5IGluZGV4IGZpbGVzXG4gIGZvciAoY29uc3QgZXh0IG9mIGN0eC5leHRlbnNpb25zKSB7XG4gICAgY29uc3QgaW5kZXhQYXRoID0gYCR7ZnVsbFBhdGh9L2luZGV4JHtleHR9YFxuICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKFxuICBzZWFyY2hQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IG1vZHVsZVBhcnRzID0gY3R4Lm1vZHVsZVBhdGguc3BsaXQoXCIvXCIpXG4gIGNvbnN0IHNjb3BlID0gbW9kdWxlUGFydHNbMF0uc3RhcnRzV2l0aChcIkBcIilcbiAgICA/IG1vZHVsZVBhcnRzLnNsaWNlKDAsIDIpLmpvaW4oXCIvXCIpXG4gICAgOiBtb2R1bGVQYXJ0c1swXVxuICBjb25zdCByZW1haW5pbmdQYXRoID0gbW9kdWxlUGFydHMuc2xpY2Uoc2NvcGUuaW5jbHVkZXMoXCIvXCIpID8gMiA6IDEpLmpvaW4oXCIvXCIpXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aCA9IGAke3NlYXJjaFBhdGggPT09IFwiLlwiID8gXCJcIiA6IGAke3NlYXJjaFBhdGh9L2B9bm9kZV9tb2R1bGVzLyR7c2NvcGV9YFxuXG4gIC8vIFRyeSB0byBmaW5kIHBhY2thZ2UuanNvblxuICBjb25zdCBwYWNrYWdlSnNvbiA9IGZpbmRQYWNrYWdlSnNvbihub2RlTW9kdWxlc1BhdGgsIGN0eClcbiAgaWYgKHBhY2thZ2VKc29uKSB7XG4gICAgLy8gVHJ5IHJlc29sdmluZyB0aHJvdWdoIGV4cG9ydHMgZmllbGRcbiAgICBjb25zdCBleHBvcnRzUmVzb2x1dGlvbiA9IHJlc29sdmVQYWNrYWdlRXhwb3J0cyhcbiAgICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgcmVtYWluaW5nUGF0aCxcbiAgICAgIGN0eCxcbiAgICApXG4gICAgaWYgKGV4cG9ydHNSZXNvbHV0aW9uKSByZXR1cm4gZXhwb3J0c1Jlc29sdXRpb25cblxuICAgIC8vIFRyeSByZXNvbHZpbmcgdGhyb3VnaCBtYWluL21vZHVsZSBmaWVsZHNcbiAgICBjb25zdCBlbnRyeVBvaW50UmVzb2x1dGlvbiA9IHJlc29sdmVQYWNrYWdlRW50cnlQb2ludChcbiAgICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgY3R4LFxuICAgIClcbiAgICBpZiAoZW50cnlQb2ludFJlc29sdXRpb24pIHJldHVybiBlbnRyeVBvaW50UmVzb2x1dGlvblxuICB9XG5cbiAgLy8gVHJ5IHJlc29sdmluZyByZW1haW5pbmcgcGF0aFxuICBjb25zdCByZW1haW5pbmdQYXRoUmVzb2x1dGlvbiA9IHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICByZW1haW5pbmdQYXRoLFxuICAgIGN0eCxcbiAgKVxuICBpZiAocmVtYWluaW5nUGF0aFJlc29sdXRpb24pIHJldHVybiByZW1haW5pbmdQYXRoUmVzb2x1dGlvblxuXG4gIC8vIElmIG5vdCBmb3VuZCBhbmQgd2UgaGF2ZSBhIHBhcmVudCBkaXJlY3RvcnksIHRyeSB0aGVyZVxuICBjb25zdCBwYXJlbnRQYXRoID0gZGlybmFtZShzZWFyY2hQYXRoKVxuICBpZiAocGFyZW50UGF0aCAmJiBwYXJlbnRQYXRoICE9PSBzZWFyY2hQYXRoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKHBhcmVudFBhdGgsIGN0eClcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZShcbiAgbW9kdWxlUGF0aDogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBjdHggPSBjcmVhdGVDb250ZXh0KG1vZHVsZVBhdGgsIGZzTWFwLCBiYXNlUGF0aClcbiAgcmV0dXJuIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKGN0eC5iYXNlUGF0aCwgY3R4KVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBldmFsQ29tcGlsZWRKcyhcbiAgY29tcGlsZWRDb2RlOiBzdHJpbmcsXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PixcbiAgY3dkPzogc3RyaW5nLFxuKSB7XG4gIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X3JlcXVpcmUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgbGV0IHJlc29sdmVkRmlsZVBhdGggPSByZXNvbHZlRmlsZVBhdGgobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QpXG5cbiAgICBpZiAoIXJlc29sdmVkRmlsZVBhdGggJiYgIW5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiYgIW5hbWUuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgIHJlc29sdmVkRmlsZVBhdGggPSByZXNvbHZlTm9kZU1vZHVsZShuYW1lLCBwcmVTdXBwbGllZEltcG9ydHMsIGN3ZCB8fCBcIlwiKVxuICAgIH1cblxuICAgIGNvbnN0IGhhc1Jlc29sdmVkRmlsZVBhdGggPVxuICAgICAgcmVzb2x2ZWRGaWxlUGF0aCAmJiBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRGaWxlUGF0aF1cblxuICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW25hbWVdICYmICFoYXNSZXNvbHZlZEZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEltcG9ydCBcIiR7bmFtZX1cIiBub3QgZm91bmQgJHtjd2QgPyBgaW4gXCIke2N3ZH1cImAgOiBcIlwifWApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kID1cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSB8fCBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRGaWxlUGF0aCFdXG4gICAgcmV0dXJuIG5ldyBQcm94eShtb2QsIHtcbiAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKCEocHJvcCBpbiB0YXJnZXQpKSB7XG4gICAgICAgICAgaWYgKHByb3AgPT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmRlZmF1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhcmdldC5fX2VzTW9kdWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0YXJnZXRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcm9wID09PSBcIl9fZXNNb2R1bGVcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ29tcG9uZW50IFwiJHtTdHJpbmcocHJvcCl9XCIgaXMgbm90IGV4cG9ydGVkIGJ5IFwiJHtuYW1lfVwiYCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3AgYXMga2V5b2YgdHlwZW9mIHRhcmdldF1cbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGZ1bmN0aW9uQm9keSA9IGBcbiAgdmFyIGV4cG9ydHMgPSB7fTtcbiAgdmFyIHJlcXVpcmUgPSBnbG9iYWxUaGlzLl9fdHNjaXJjdWl0X3JlcXVpcmU7XG4gIHZhciBtb2R1bGUgPSB7IGV4cG9ydHMgfTtcbiAgdmFyIGNpcmN1aXQgPSBnbG9iYWxUaGlzLl9fdHNjaXJjdWl0X2NpcmN1aXQ7XG4gICR7Y29tcGlsZWRDb2RlfTtcbiAgcmV0dXJuIG1vZHVsZTtgLnRyaW0oKVxuICByZXR1cm4gRnVuY3Rpb24oZnVuY3Rpb25Cb2R5KS5jYWxsKGdsb2JhbFRoaXMpXG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcImxpYi91dGlscy9kaXJuYW1lXCJcbmltcG9ydCB7IGdldEltcG9ydHNGcm9tQ29kZSB9IGZyb20gXCJsaWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlXCJcbmltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCIuL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBpc1N0YXRpY0Fzc2V0UGF0aCB9IGZyb20gXCJsaWIvc2hhcmVkL3N0YXRpYy1hc3NldC1leHRlbnNpb25zXCJcbmltcG9ydCB7IHRyYW5zZm9ybVdpdGhTdWNyYXNlIH0gZnJvbSBcImxpYi90cmFuc3BpbGUvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZVwiXG5pbXBvcnQgeyBLaWNhZFRvQ2lyY3VpdEpzb25Db252ZXJ0ZXIgfSBmcm9tIFwia2ljYWQtdG8tY2lyY3VpdC1qc29uXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtbG9jYWwtZmlsZVwiKVxuXG5leHBvcnQgY29uc3QgaW1wb3J0TG9jYWxGaWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGRlYnVnKFwiaW1wb3J0TG9jYWxGaWxlIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgaW1wb3J0TmFtZSxcbiAgfSlcblxuICBjb25zdCB7IGZzTWFwLCBwcmVTdXBwbGllZEltcG9ydHMsIGltcG9ydFN0YWNrLCBjdXJyZW50bHlJbXBvcnRpbmcgfSA9IGN0eFxuXG4gIGNvbnN0IGZzUGF0aCA9IHJlc29sdmVGaWxlUGF0aE9yVGhyb3coaW1wb3J0TmFtZSwgZnNNYXAsIHVuZGVmaW5lZCwge1xuICAgIHRzQ29uZmlnOiBjdHgudHNDb25maWcsXG4gIH0pXG4gIGRlYnVnKFwiZnNQYXRoOlwiLCBmc1BhdGgpXG4gIGlmIChjdXJyZW50bHlJbXBvcnRpbmcuaGFzKGZzUGF0aCkpIHtcbiAgICBjb25zdCBjeWNsZVN0YXJ0SW5kZXggPSBpbXBvcnRTdGFjay5pbmRleE9mKGZzUGF0aClcbiAgICBjb25zdCBjeWNsZVBhdGggPVxuICAgICAgY3ljbGVTdGFydEluZGV4ID49IDBcbiAgICAgICAgPyBpbXBvcnRTdGFjay5zbGljZShjeWNsZVN0YXJ0SW5kZXgpLmNvbmNhdChmc1BhdGgpXG4gICAgICAgIDogWy4uLmltcG9ydFN0YWNrLCBmc1BhdGhdXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgd2hpbGUgaW1wb3J0aW5nIFwiJHtmc1BhdGh9XCIuIFRoZSBmb2xsb3dpbmcgaW1wb3J0IGNoYWluIGZvcm1zIGEgY3ljbGU6XFxuXFxuJHtjeWNsZVBhdGguam9pbihcbiAgICAgICAgXCIgLT4gXCIsXG4gICAgICApfWAsXG4gICAgKVxuICB9XG5cbiAgaWYgKCFjdHguZnNNYXBbZnNQYXRoXSkge1xuICAgIGRlYnVnKFwiZnNQYXRoIG5vdCBmb3VuZCBpbiBmc01hcDpcIiwgZnNQYXRoKVxuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBcIiR7ZnNQYXRofVwiIG5vdCBmb3VuZGApXG4gIH1cbiAgY29uc3QgZmlsZUNvbnRlbnQgPSBmc01hcFtmc1BhdGhdXG4gIGRlYnVnKFwiZmlsZUNvbnRlbnQ6XCIsIGZpbGVDb250ZW50Py5zbGljZSgwLCAxMDApKVxuICBjdXJyZW50bHlJbXBvcnRpbmcuYWRkKGZzUGF0aClcbiAgaW1wb3J0U3RhY2sucHVzaChmc1BhdGgpXG4gIHRyeSB7XG4gICAgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICBjb25zdCBqc29uRGF0YSA9IEpTT04ucGFyc2UoZmlsZUNvbnRlbnQpXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IHtcbiAgICAgICAgX19lc01vZHVsZTogdHJ1ZSxcbiAgICAgICAgZGVmYXVsdDoganNvbkRhdGEsXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIua2ljYWRfcGNiXCIpKSB7XG4gICAgICBjb25zdCBjb252ZXJ0ZXIgPSBuZXcgS2ljYWRUb0NpcmN1aXRKc29uQ29udmVydGVyKClcbiAgICAgIGNvbnZlcnRlci5hZGRGaWxlKGZzUGF0aCwgZmlsZUNvbnRlbnQpXG4gICAgICBjb252ZXJ0ZXIucnVuVW50aWxGaW5pc2hlZCgpXG4gICAgICBjb25zdCBjaXJjdWl0SnNvbiA9IGNvbnZlcnRlci5nZXRPdXRwdXQoKVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGNpcmN1aXRKc29uOiBjaXJjdWl0SnNvbixcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU3RhdGljQXNzZXRQYXRoKGZzUGF0aCkpIHtcbiAgICAgIGxldCBzdGF0aWNVcmw6IHN0cmluZ1xuXG4gICAgICBpZiAoZmlsZUNvbnRlbnQgPT09IFwiX19TVEFUSUNfQVNTRVRfX1wiKSB7XG4gICAgICAgIC8vIFBsYWNlaG9sZGVyOiB1c2UgcHJvamVjdEJhc2VVcmwgZm9yIHN0YXRpYyBmaWxlIGltcG9ydHNcbiAgICAgICAgY29uc3QgcGxhdGZvcm1Db25maWcgPSBjdHguY2lyY3VpdC5wbGF0Zm9ybVxuICAgICAgICBzdGF0aWNVcmwgPSBgJHtwbGF0Zm9ybUNvbmZpZz8ucHJvamVjdEJhc2VVcmwgPz8gXCJcIn0vJHtcbiAgICAgICAgICBmc1BhdGguc3RhcnRzV2l0aChcIi4vXCIpID8gZnNQYXRoLnNsaWNlKDIpIDogZnNQYXRoXG4gICAgICAgIH1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBY3R1YWwgZmlsZSBjb250ZW50OiBjcmVhdGUgYSBibG9iIFVSTFxuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2ZpbGVDb250ZW50XSwge1xuICAgICAgICAgIHR5cGU6IGZzUGF0aC5lbmRzV2l0aChcIi5raWNhZF9tb2RcIilcbiAgICAgICAgICAgID8gXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIDogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIixcbiAgICAgICAgfSlcbiAgICAgICAgc3RhdGljVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgfVxuXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IHtcbiAgICAgICAgX19lc01vZHVsZTogdHJ1ZSxcbiAgICAgICAgZGVmYXVsdDogc3RhdGljVXJsLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSB8fCBmc1BhdGguZW5kc1dpdGgoXCIudHNcIikpIHtcbiAgICAgIGNvbnN0IGltcG9ydE5hbWVzID0gZ2V0SW1wb3J0c0Zyb21Db2RlKGZpbGVDb250ZW50KVxuXG4gICAgICBmb3IgKGNvbnN0IGltcG9ydE5hbWUgb2YgaW1wb3J0TmFtZXMpIHtcbiAgICAgICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICAgICAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChpbXBvcnROYW1lLCBjdHgsIGRlcHRoICsgMSwge1xuICAgICAgICAgICAgY3dkOiBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZENvZGUgPSB0cmFuc2Zvcm1XaXRoU3VjcmFzZShmaWxlQ29udGVudCwgZnNQYXRoKVxuICAgICAgICBkZWJ1ZyhcImV2YWxDb21waWxlZEpzIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICAgICAgY29kZTogdHJhbnNmb3JtZWRDb2RlLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgZGlybmFtZTogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBpbXBvcnRSdW5SZXN1bHQgPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgICAgICB0cmFuc2Zvcm1lZENvZGUsXG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgICAgIGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgKVxuICAgICAgICBkZWJ1ZyhcImltcG9ydFJ1blJlc3VsdDpcIiwge1xuICAgICAgICAgIGZzUGF0aCxcbiAgICAgICAgICBpbXBvcnRSdW5SZXN1bHQsXG4gICAgICAgIH0pXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0gaW1wb3J0UnVuUmVzdWx0LmV4cG9ydHNcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFdmFsIGNvbXBpbGVkIGpzIGVycm9yIGZvciBcIiR7aW1wb3J0TmFtZX1cIjogJHtlcnJvci5tZXNzYWdlfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi5qc1wiKSB8fCBmc1BhdGguZW5kc1dpdGgoXCIubWpzXCIpKSB7XG4gICAgICAvLyBGb3IgLmpzLy5tanMgZmlsZXMsIGVzcGVjaWFsbHkgZnJvbSBub2RlX21vZHVsZXMsIHdlIG5lZWQgdG8gZXh0cmFjdCBhbmQgcmVzb2x2ZSBpbXBvcnRzIGZpcnN0XG4gICAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgICAgZm9yIChjb25zdCBpbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICAgIGN3ZDogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlbiB0cmFuc2Zvcm0gYW5kIGV2YWx1YXRlXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgICB0cmFuc2Zvcm1XaXRoU3VjcmFzZShmaWxlQ29udGVudCwgZnNQYXRoKSxcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgICApLmV4cG9ydHNcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5zdXBwb3J0ZWQgZmlsZSBleHRlbnNpb24gXCIke2ZzUGF0aC5zcGxpdChcIi5cIikucG9wKCl9XCIgZm9yIFwiJHtmc1BhdGh9XCJgLFxuICAgICAgKVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpbXBvcnRTdGFjay5wb3AoKVxuICAgIGN1cnJlbnRseUltcG9ydGluZy5kZWxldGUoZnNQYXRoKVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IFNUQVRJQ19BU1NFVF9FWFRFTlNJT05TID0gW1xuICBcIi5nbGJcIixcbiAgXCIua2ljYWRfbW9kXCIsXG4gIFwiLmdsdGZcIixcbiAgXCIub2JqXCIsXG4gIFwiLnN0bFwiLFxuICBcIi5zdGVwXCIsXG4gIFwiLnN0cFwiLFxuXVxuXG5leHBvcnQgY29uc3QgaXNTdGF0aWNBc3NldFBhdGggPSAocGF0aDogc3RyaW5nKSA9PlxuICBTVEFUSUNfQVNTRVRfRVhURU5TSU9OUy5zb21lKChleHQpID0+IHBhdGguZW5kc1dpdGgoZXh0KSlcbiIsICJpbXBvcnQgeyB0cmFuc2Zvcm0sIHR5cGUgVHJhbnNmb3JtIGFzIFN1Y3Jhc2VUcmFuc2Zvcm0gfSBmcm9tIFwic3VjcmFzZVwiXG5cbmNvbnN0IFRTX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFtcIi50c1wiLCBcIi50c3hcIiwgXCIubXRzXCIsIFwiLmN0c1wiXSlcbmNvbnN0IEpTWF9FWFRFTlNJT05TID0gbmV3IFNldChbXCIudHN4XCIsIFwiLmpzeFwiLCBcIi50c1wiXSlcbmNvbnN0IFRZUEVfU1RBUl9FWFBPUlRfUkVHRVggPVxuICAvXlxccypleHBvcnRcXHMrdHlwZVxccytcXCpcXHMrKD86YXNcXHMrW1xcdyRdK1xccyspP2Zyb21cXHMrWydcIl1bXidcIl0rWydcIl1cXHMqOz9cXHMqJC9naW1cblxuY29uc3Qgc3RyaXBUeXBlU3RhckV4cG9ydHMgPSAoY29kZTogc3RyaW5nKSA9PlxuICBjb2RlLnJlcGxhY2UoVFlQRV9TVEFSX0VYUE9SVF9SRUdFWCwgXCJcIilcblxuY29uc3Qgc3RyaXBRdWVyeUFuZEhhc2ggPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBxdWVyeUluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihcIj9cIilcbiAgY29uc3QgaGFzaEluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihcIiNcIilcblxuICBsZXQgZW5kSW5kZXggPSBmaWxlUGF0aC5sZW5ndGhcblxuICBpZiAocXVlcnlJbmRleCAhPT0gLTEgJiYgaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gTWF0aC5taW4ocXVlcnlJbmRleCwgaGFzaEluZGV4KVxuICB9IGVsc2UgaWYgKHF1ZXJ5SW5kZXggIT09IC0xKSB7XG4gICAgZW5kSW5kZXggPSBxdWVyeUluZGV4XG4gIH0gZWxzZSBpZiAoaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gaGFzaEluZGV4XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguc2xpY2UoMCwgZW5kSW5kZXgpXG59XG5cbmNvbnN0IGdldEV4dGVuc2lvbiA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gc3RyaXBRdWVyeUFuZEhhc2goZmlsZVBhdGgpXG4gIGNvbnN0IGxhc3REb3RJbmRleCA9IG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiLlwiKVxuXG4gIGlmIChsYXN0RG90SW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gTWF0aC5tYXgoXG4gICAgbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoXCIvXCIpLFxuICAgIG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiXFxcXFwiKSxcbiAgKVxuXG4gIGlmIChsYXN0U2xhc2hJbmRleCA+IGxhc3REb3RJbmRleCkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFBhdGguc2xpY2UobGFzdERvdEluZGV4KS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGdldFRyYW5zZm9ybXNGb3JGaWxlUGF0aCA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbihmaWxlUGF0aClcblxuICBjb25zdCB0cmFuc2Zvcm1zOiBTdWNyYXNlVHJhbnNmb3JtW10gPSBbXCJpbXBvcnRzXCJdXG5cbiAgaWYgKFRTX0VYVEVOU0lPTlMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICB0cmFuc2Zvcm1zLnVuc2hpZnQoXCJ0eXBlc2NyaXB0XCIpXG4gIH1cblxuICBpZiAoSlNYX0VYVEVOU0lPTlMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICB0cmFuc2Zvcm1zLnB1c2goXCJqc3hcIilcbiAgfVxuXG4gIHJldHVybiB0cmFuc2Zvcm1zXG59XG5cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1XaXRoU3VjcmFzZSA9IChjb2RlOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtcyA9IGdldFRyYW5zZm9ybXNGb3JGaWxlUGF0aChmaWxlUGF0aClcbiAgY29uc3Qgc2FuaXRpemVkQ29kZSA9IHN0cmlwVHlwZVN0YXJFeHBvcnRzKGNvZGUpXG4gIGNvbnN0IHsgY29kZTogdHJhbnNmb3JtZWRDb2RlIH0gPSB0cmFuc2Zvcm0oc2FuaXRpemVkQ29kZSwge1xuICAgIGZpbGVQYXRoLFxuICAgIHByb2R1Y3Rpb246IHRydWUsXG4gICAgdHJhbnNmb3JtcyxcbiAgfSlcblxuICByZXR1cm4gdHJhbnNmb3JtZWRDb2RlXG59XG4iLCAiaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFNuaXBwZXQoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pIHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuICBjb25zdCBmdWxsU25pcHBldE5hbWUgPSBpbXBvcnROYW1lLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikucmVwbGFjZShcIi5cIiwgXCIvXCIpXG5cbiAgY29uc3QgeyBjanMsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKGAke2N0eC5janNSZWdpc3RyeVVybH0vJHtmdWxsU25pcHBldE5hbWV9YClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiAoeyBjanM6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH0pKVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNqczogbnVsbCB9KSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgaW1wb3J0XCIsIGltcG9ydE5hbWUsIGVycm9yKVxuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgIGNqcyEsXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgKS5leHBvcnRzXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW1wb3J0aW5nIHNuaXBwZXRcIiwgZSlcbiAgfVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVOb2RlTW9kdWxlIH0gZnJvbSBcImxpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uIH0gZnJvbSBcIi4vaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uXCJcbmltcG9ydCB7IGdldE5vZGVNb2R1bGVEaXJlY3RvcnkgfSBmcm9tIFwiLi9nZXROb2RlTW9kdWxlRGlyZWN0b3J5XCJcbmltcG9ydCB7IGdldFBhY2thZ2VKc29uRW50cnlwb2ludCB9IGZyb20gXCIuL2dldFBhY2thZ2VKc29uRW50cnlwb2ludFwiXG5pbXBvcnQgeyBpc1R5cGVTY3JpcHRFbnRyeXBvaW50IH0gZnJvbSBcIi4vaXNUeXBlU2NyaXB0RW50cnlwb2ludFwiXG5pbXBvcnQgeyBpc0Rpc3REaXJFbXB0eSB9IGZyb20gXCIuL2lzRGlzdERpckVtcHR5XCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtbm9kZS1tb2R1bGVcIilcblxuZXhwb3J0IGNvbnN0IGltcG9ydE5vZGVNb2R1bGUgPSBhc3luYyAoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pID0+IHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMsIGZzTWFwIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBPbmx5IHJ1biB2YWxpZGF0aW9uIGlmIHBhY2thZ2UuanNvbiBleGlzdHMgKGNhbid0IHZhbGlkYXRlIHdpdGhvdXQgaXQpXG4gIGNvbnN0IGhhc1BhY2thZ2VKc29uID0gISFmc01hcFtcInBhY2thZ2UuanNvblwiXVxuXG4gIGlmIChoYXNQYWNrYWdlSnNvbikge1xuICAgIC8vIFN0ZXAgMTogQ2hlY2sgaWYgdGhlIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uXG4gICAgaWYgKCFpc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24oaW1wb3J0TmFtZSwgZnNNYXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBOb2RlIG1vZHVsZSBpbXBvcnRlZCBidXQgbm90IGluIHBhY2thZ2UuanNvbiBcIiR7aW1wb3J0TmFtZX1cIlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZE5vZGVNb2R1bGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LmZzTWFwLCBcIlwiKVxuXG4gIC8vIE9ubHkgcnVuIFN0ZXBzIDItNCBpZiBwYWNrYWdlIGV4aXN0cyBpbiBub2RlX21vZHVsZXMgKGFmdGVyIHJlc29sdmVyIGF0dGVtcHRzKVxuICBpZiAoaGFzUGFja2FnZUpzb24gJiYgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCkge1xuICAgIC8vIFN0ZXAgMjogQ2hlY2sgaWYgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBleGlzdHMgZm9yIHRoZSBwYWNrYWdlXG4gICAgY29uc3Qgbm9kZU1vZHVsZURpciA9IGdldE5vZGVNb2R1bGVEaXJlY3RvcnkoaW1wb3J0TmFtZSwgZnNNYXApXG4gICAgaWYgKCFub2RlTW9kdWxlRGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgbm8gZmlsZXMgaW4gdGhlIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnlcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gU3RlcCAzOiBDaGVjayBpZiBtYWluIGVudHJ5cG9pbnQgaXMgYSBUeXBlU2NyaXB0IGZpbGVcbiAgICBjb25zdCBlbnRyeXBvaW50ID0gZ2V0UGFja2FnZUpzb25FbnRyeXBvaW50KGltcG9ydE5hbWUsIGZzTWFwKVxuICAgIGlmIChpc1R5cGVTY3JpcHRFbnRyeXBvaW50KGVudHJ5cG9pbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgYSB0eXBlc2NyaXB0IGVudHJ5cG9pbnQgdGhhdCBpcyB1bnN1cHBvcnRlZFxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBTdGVwIDQ6IENoZWNrIGlmIGRpc3QgZGlyZWN0b3J5IGlzIGVtcHR5IHdoZW4gbWFpbiBwb2ludHMgdG8gZGlzdFxuICAgIGlmIChlbnRyeXBvaW50ICYmIGVudHJ5cG9pbnQuc3RhcnRzV2l0aChcImRpc3QvXCIpKSB7XG4gICAgICBpZiAoaXNEaXN0RGlyRW1wdHkoaW1wb3J0TmFtZSwgZnNNYXApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIG5vIGZpbGVzIGluIGRpc3QsIGRpZCB5b3UgZm9yZ2V0IHRvIHRyYW5zcGlsZT9cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIXJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGN0eC5jaXJjdWl0Py5wbGF0Zm9ybVxuICAgIGlmIChwbGF0Zm9ybT8ubm9kZU1vZHVsZXNSZXNvbHZlcikge1xuICAgICAgZGVidWcoYEF0dGVtcHRpbmcgdG8gcmVzb2x2ZSBcIiR7aW1wb3J0TmFtZX1cIiB1c2luZyBub2RlTW9kdWxlc1Jlc29sdmVyYClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBwbGF0Zm9ybS5ub2RlTW9kdWxlc1Jlc29sdmVyKGltcG9ydE5hbWUpXG5cbiAgICAgICAgaWYgKGZpbGVDb250ZW50KSB7XG4gICAgICAgICAgZGVidWcoYFN1Y2Nlc3NmdWxseSByZXNvbHZlZCBcIiR7aW1wb3J0TmFtZX1cIiB2aWEgbm9kZU1vZHVsZXNSZXNvbHZlcmApXG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHJlc29sdmVkIGNvbnRlbnQgdG8gZnNNYXAgd2l0aCBhIHN5bnRoZXRpYyBwYXRoXG4gICAgICAgICAgLy8gQWRkIC50cyBleHRlbnNpb24gdG8gZW5zdXJlIGl0J3MgdHJlYXRlZCBhcyBhIG1vZHVsZSBmaWxlXG4gICAgICAgICAgY29uc3Qgc3ludGhldGljUGF0aCA9IGBub2RlX21vZHVsZXMvJHtpbXBvcnROYW1lfS50c2BcbiAgICAgICAgICBjdHguZnNNYXBbc3ludGhldGljUGF0aF0gPSBmaWxlQ29udGVudFxuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBmaWxlIHVzaW5nIHRoZSBub3JtYWwgZmxvd1xuICAgICAgICAgIGF3YWl0IGltcG9ydExvY2FsRmlsZShzeW50aGV0aWNQYXRoLCBjdHgsIGRlcHRoKVxuXG4gICAgICAgICAgLy8gTWFwIHRoZSBpbXBvcnQgbmFtZSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlXG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcHJlU3VwcGxpZWRJbXBvcnRzW3N5bnRoZXRpY1BhdGhdXG5cbiAgICAgICAgICAvLyBBbHNvIG1hcCB3aXRob3V0IG5vZGVfbW9kdWxlcyBwcmVmaXhcbiAgICAgICAgICBjb25zdCB1bnByZWZpeGVkUGF0aCA9IHN5bnRoZXRpY1BhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWRQYXRoXSA9IHByZVN1cHBsaWVkSW1wb3J0c1tzeW50aGV0aWNQYXRoXVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBkZWJ1Zyhgbm9kZU1vZHVsZXNSZXNvbHZlciByZXR1cm5lZCBudWxsIGZvciBcIiR7aW1wb3J0TmFtZX1cImApXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBkZWJ1Zyhgbm9kZU1vZHVsZXNSZXNvbHZlciBmYWlsZWQgZm9yIFwiJHtpbXBvcnROYW1lfVwiOmAsIGVycm9yKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgbm90IGZvdW5kYClcbiAgfVxuXG4gIC8vIFVzZSBpbXBvcnRMb2NhbEZpbGUgdG8gaGFuZGxlIHRoZSBub2RlIG1vZHVsZVxuICBhd2FpdCBpbXBvcnRMb2NhbEZpbGUocmVzb2x2ZWROb2RlTW9kdWxlUGF0aCwgY3R4LCBkZXB0aClcblxuICAvLyBNYXAgdGhlIG9yaWdpbmFsIGltcG9ydCBuYW1lIHRvIHRoZSByZXNvbHZlZCBtb2R1bGUncyBleHBvcnRzXG4gIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gIC8vIE1hcCB3aXRob3V0IG5vZGVfbW9kdWxlcyBwcmVmaXggZm9yIGRpcmVjdCBpbXBvcnRzXG4gIGNvbnN0IHVucHJlZml4ZWRQYXRoID0gcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5yZXBsYWNlKC9ebm9kZV9tb2R1bGVzXFwvLywgXCJcIilcbiAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWRQYXRoXSA9XG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgLy8gSGFuZGxlIGluZGV4IGZpbGVzIHNwZWNpYWxseVxuICBpZiAoXG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC50c3hcIikgfHxcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LnRzXCIpIHx8XG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC5qc1wiKVxuICApIHtcbiAgICBjb25zdCBkaXJQYXRoID0gcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5yZXBsYWNlKC9cXC9pbmRleFxcLih0c3g/fGpzKSQvLCBcIlwiKVxuICAgIGNvbnN0IHVucHJlZml4ZWREaXJQYXRoID0gZGlyUGF0aC5yZXBsYWNlKC9ebm9kZV9tb2R1bGVzXFwvLywgXCJcIilcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZERpclBhdGhdID1cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gICAgLy8gSGFuZGxlIHNjb3BlZCBwYWNrYWdlc1xuICAgIGlmICh1bnByZWZpeGVkRGlyUGF0aC5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgICAgY29uc3Qgc2NvcGVQYXJ0cyA9IHVucHJlZml4ZWREaXJQYXRoLnNwbGl0KFwiL1wiKVxuICAgICAgaWYgKHNjb3BlUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVkTmFtZSA9IGAke3Njb3BlUGFydHNbMF19LyR7c2NvcGVQYXJ0c1sxXX1gXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tzY29wZWROYW1lXSA9XG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBFeHRyYWN0IHRoZSBiYXNlIHBhY2thZ2UgbmFtZSBmcm9tIGFuIGltcG9ydCBuYW1lXG4gKiBIYW5kbGVzIHNjb3BlZCBwYWNrYWdlcyBhbmQgc3VicGF0aHNcbiAqXG4gKiBFeGFtcGxlczpcbiAqIC0gXCJAc2NvcGUvcGFja2FnZS9zdWJwYXRoXCIgLT4gXCJAc2NvcGUvcGFja2FnZVwiXG4gKiAtIFwibG9kYXNoL2dldFwiIC0+IFwibG9kYXNoXCJcbiAqIC0gXCJyZWFjdFwiIC0+IFwicmVhY3RcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEJhc2VQYWNrYWdlTmFtZShpbXBvcnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgYmFzZVBhY2thZ2VOYW1lID0gaW1wb3J0TmFtZVxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgIC8vIFNjb3BlZCBwYWNrYWdlOiBAc2NvcGUvcGFja2FnZSBvciBAc2NvcGUvcGFja2FnZS9zdWJwYXRoXG4gICAgY29uc3QgcGFydHMgPSBpbXBvcnROYW1lLnNwbGl0KFwiL1wiKVxuICAgIGJhc2VQYWNrYWdlTmFtZSA9IHBhcnRzLmxlbmd0aCA+PSAyID8gYCR7cGFydHNbMF19LyR7cGFydHNbMV19YCA6IGltcG9ydE5hbWVcbiAgfSBlbHNlIHtcbiAgICAvLyBSZWd1bGFyIHBhY2thZ2U6IHBhY2thZ2Ugb3IgcGFja2FnZS9zdWJwYXRoXG4gICAgYmFzZVBhY2thZ2VOYW1lID0gaW1wb3J0TmFtZS5zcGxpdChcIi9cIilbMF1cbiAgfVxuICByZXR1cm4gYmFzZVBhY2thZ2VOYW1lXG59XG4iLCAiaW1wb3J0IHsgZXh0cmFjdEJhc2VQYWNrYWdlTmFtZSB9IGZyb20gXCIuL2V4dHJhY3RCYXNlUGFja2FnZU5hbWVcIlxuXG4vKipcbiAqIENoZWNrIGlmIGEgcGFja2FnZSBpcyBkZWNsYXJlZCBpbiBwYWNrYWdlLmpzb24gKGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBvciBwZWVyRGVwZW5kZW5jaWVzKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwYWNrYWdlSnNvbkNvbnRlbnQgPSBmc01hcFtcInBhY2thZ2UuanNvblwiXVxuICBpZiAoIXBhY2thZ2VKc29uQ29udGVudCkge1xuICAgIC8vIE5vIHBhY2thZ2UuanNvbiBtZWFucyB3ZSBjYW4ndCB2YWxpZGF0ZSAtIGFsbG93IHRoZSBpbXBvcnRcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Db250ZW50KVxuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fVxuICAgIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fVxuICAgIGNvbnN0IHBlZXJEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzIHx8IHt9XG5cbiAgICAvLyBFeHRyYWN0IHRoZSBiYXNlIHBhY2thZ2UgbmFtZSAoaGFuZGxlIHNjb3BlZCBwYWNrYWdlcyBhbmQgc3VicGF0aHMpXG4gICAgY29uc3QgYmFzZVBhY2thZ2VOYW1lID0gZXh0cmFjdEJhc2VQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSlcblxuICAgIHJldHVybiAoXG4gICAgICBiYXNlUGFja2FnZU5hbWUgaW4gZGVwZW5kZW5jaWVzIHx8XG4gICAgICBiYXNlUGFja2FnZU5hbWUgaW4gZGV2RGVwZW5kZW5jaWVzIHx8XG4gICAgICBiYXNlUGFja2FnZU5hbWUgaW4gcGVlckRlcGVuZGVuY2llc1xuICAgIClcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgd2UgY2FuJ3QgcGFyc2UgcGFja2FnZS5qc29uLCBhbGxvdyB0aGUgaW1wb3J0XG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuIiwgImltcG9ydCB7IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9leHRyYWN0QmFzZVBhY2thZ2VOYW1lXCJcblxuLyoqXG4gKiBDaGVjayBpZiBub2RlX21vZHVsZXMgZGlyZWN0b3J5IGV4aXN0cyBmb3IgdGhlIHBhY2thZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVNb2R1bGVEaXJlY3RvcnkoXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG4gIGNvbnN0IG5vZGVNb2R1bGVQYXRoID0gYG5vZGVfbW9kdWxlcy8ke2Jhc2VQYWNrYWdlTmFtZX1gXG5cbiAgLy8gQ2hlY2sgaWYgYW55IGZpbGVzIGV4aXN0IHVuZGVyIHRoaXMgcGF0aCBpbiBmc01hcFxuICBjb25zdCBoYXNGaWxlcyA9IE9iamVjdC5rZXlzKGZzTWFwKS5zb21lKFxuICAgIChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgobm9kZU1vZHVsZVBhdGggKyBcIi9cIikgfHwgcGF0aCA9PT0gbm9kZU1vZHVsZVBhdGgsXG4gIClcblxuICByZXR1cm4gaGFzRmlsZXMgPyBub2RlTW9kdWxlUGF0aCA6IG51bGxcbn1cbiIsICJpbXBvcnQgeyBleHRyYWN0QmFzZVBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZXh0cmFjdEJhc2VQYWNrYWdlTmFtZVwiXG5cbi8qKlxuICogR2V0IHRoZSBlbnRyeXBvaW50IGZyb20gcGFja2FnZS5qc29uICh0aGUgXCJtYWluXCIgb3IgXCJtb2R1bGVcIiBmaWVsZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2VKc29uRW50cnlwb2ludChcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgYmFzZVBhY2thZ2VOYW1lID0gZXh0cmFjdEJhc2VQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSlcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gYG5vZGVfbW9kdWxlcy8ke2Jhc2VQYWNrYWdlTmFtZX0vcGFja2FnZS5qc29uYFxuXG4gIGNvbnN0IHBhY2thZ2VKc29uQ29udGVudCA9IGZzTWFwW3BhY2thZ2VKc29uUGF0aF1cbiAgaWYgKCFwYWNrYWdlSnNvbkNvbnRlbnQpIHJldHVybiBudWxsXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Db250ZW50KVxuICAgIC8vIFRyeSBtYWluLCBtb2R1bGUsIG9yIGV4cG9ydHMgZmllbGQgKGluIG9yZGVyIG9mIHByZWZlcmVuY2UpXG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm1haW4gfHwgcGFja2FnZUpzb24ubW9kdWxlIHx8IG51bGxcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuIiwgIi8qKlxuICogQ2hlY2sgaWYgdGhlIGVudHJ5cG9pbnQgaXMgYSBUeXBlU2NyaXB0IGZpbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZVNjcmlwdEVudHJ5cG9pbnQoZW50cnlwb2ludDogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICBpZiAoIWVudHJ5cG9pbnQpIHJldHVybiBmYWxzZVxuICByZXR1cm4gZW50cnlwb2ludC5lbmRzV2l0aChcIi50c1wiKSB8fCBlbnRyeXBvaW50LmVuZHNXaXRoKFwiLnRzeFwiKVxufVxuIiwgImltcG9ydCB7IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9leHRyYWN0QmFzZVBhY2thZ2VOYW1lXCJcblxuLyoqXG4gKiBDaGVjayBpZiBkaXN0IGRpcmVjdG9yeSBleGlzdHMgYW5kIGhhcyBmaWxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEaXN0RGlyRW1wdHkoXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG4gIGNvbnN0IGRpc3RQYXRoID0gYG5vZGVfbW9kdWxlcy8ke2Jhc2VQYWNrYWdlTmFtZX0vZGlzdGBcblxuICAvLyBDaGVjayBpZiBhbnkgZmlsZXMgZXhpc3QgdW5kZXIgZGlzdC9cbiAgY29uc3QgaGFzRmlsZXMgPSBPYmplY3Qua2V5cyhmc01hcCkuc29tZSgocGF0aCkgPT5cbiAgICBwYXRoLnN0YXJ0c1dpdGgoZGlzdFBhdGggKyBcIi9cIiksXG4gIClcblxuICByZXR1cm4gIWhhc0ZpbGVzXG59XG4iLCAiaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwibGliL3V0aWxzL2Rpcm5hbWVcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCIuL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IHsgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UgfSBmcm9tIFwibGliL3RyYW5zcGlsZS90cmFuc2Zvcm0td2l0aC1zdWNyYXNlXCJcbmltcG9ydCB7IGlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbiB9IGZyb20gXCIuL2lzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvblwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LW5wbS1wYWNrYWdlXCIpXG5cbmZ1bmN0aW9uIGV4dHJhY3RQYWNrYWdlUGF0aEZyb21KU0RlbGl2cih1cmw6IHN0cmluZykge1xuICBjb25zdCBwcmVmaXggPSBcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vXCJcbiAgaWYgKHVybC5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICByZXR1cm4gdXJsLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKS5yZXBsYWNlKC9cXC9cXCtlc20kLywgXCJcIilcbiAgfVxuICByZXR1cm4gdXJsXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnROcG1QYWNrYWdlKFxuICB7XG4gICAgaW1wb3J0TmFtZSxcbiAgICBkZXB0aCA9IDAsXG4gICAgZnJvbUpzRGVsaXZyID0gZmFsc2UsXG4gIH06IHsgaW1wb3J0TmFtZTogc3RyaW5nOyBkZXB0aD86IG51bWJlcjsgZnJvbUpzRGVsaXZyPzogYm9vbGVhbiB9LFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4pIHtcbiAgZGVidWcoYGltcG9ydGluZyBucG0gcGFja2FnZTogJHtpbXBvcnROYW1lfWApXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzLCBmc01hcCB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkgcmV0dXJuXG5cbiAgLy8gQ2hlY2sgaWYgdGhlIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uIGJlZm9yZSBmZXRjaGluZyBmcm9tIGpzRGVsaXZyXG4gIC8vIFNraXAgdGhpcyBjaGVjayBmb3IgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgKHN1Yi1pbXBvcnRzIGZyb20ganNEZWxpdnIgcGFja2FnZXMpXG4gIGlmICghZnJvbUpzRGVsaXZyICYmICFpc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24oaW1wb3J0TmFtZSwgZnNNYXApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFBhY2thZ2UgXCIke2ltcG9ydE5hbWV9XCIgaXMgbm90IGRlY2xhcmVkIGluIHBhY2thZ2UuanNvbi4gYCArXG4gICAgICAgIGBBZGQgaXQgdG8gZGVwZW5kZW5jaWVzIG9yIGRldkRlcGVuZGVuY2llcyBiZWZvcmUgaW1wb3J0aW5nLlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICApXG4gIH1cblxuICBjb25zdCBucG1DZG5VcmwgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS8ke2ltcG9ydE5hbWV9Lytlc21gXG5cbiAgbGV0IGZpbmFsVXJsOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgY29uc3QgeyBjb250ZW50LCBlcnJvciB9ID0gYXdhaXQgZ2xvYmFsVGhpc1xuICAgIC5mZXRjaChucG1DZG5VcmwpXG4gICAgLnRoZW4oYXN5bmMgKHJlcykgPT4ge1xuICAgICAgZmluYWxVcmwgPSByZXMudXJsXG4gICAgICBpZiAoIXJlcy5vaylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmV0Y2ggXCIke2ltcG9ydE5hbWV9XCIgZnJvbSBqc2RlbGl2cjogJHtyZXMuc3RhdHVzVGV4dH1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH1cbiAgICB9KVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNvbnRlbnQ6IG51bGwgfSkpXG5cbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIG5wbSBpbXBvcnRcIiwgaW1wb3J0TmFtZSwgZXJyb3IpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxuXG4gIGNvbnN0IGZpbmFsSW1wb3J0TmFtZSA9IGV4dHJhY3RQYWNrYWdlUGF0aEZyb21KU0RlbGl2cihmaW5hbFVybCEpXG4gIGNvbnN0IGN3ZCA9IGRpcm5hbWUoZmluYWxJbXBvcnROYW1lKVxuXG4gIGNvbnN0IGltcG9ydE5hbWVzID0gZ2V0SW1wb3J0c0Zyb21Db2RlKGNvbnRlbnQhKVxuICBmb3IgKGNvbnN0IHN1YkltcG9ydE5hbWUgb2YgaW1wb3J0TmFtZXMpIHtcbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tzdWJJbXBvcnROYW1lXSkge1xuICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoc3ViSW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgY3dkLFxuICAgICAgICBmcm9tSnNEZWxpdnI6IHRydWUsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRyYW5zZm9ybWVkQ29kZSA9IHRyYW5zZm9ybVdpdGhTdWNyYXNlKFxuICAgIGNvbnRlbnQhLFxuICAgIGZpbmFsSW1wb3J0TmFtZSB8fCBpbXBvcnROYW1lLFxuICApXG4gIHRyeSB7XG4gICAgY29uc3QgZXhwb3J0cyA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgY3dkLFxuICAgICkuZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxJbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxVcmwhXSA9IGV4cG9ydHNcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV2YWwgbnBtIHBhY2thZ2UgZXJyb3IgZm9yIFwiJHtpbXBvcnROYW1lfVwiOiAke2UubWVzc2FnZX1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IHsgaW1wb3J0U25pcHBldCB9IGZyb20gXCIuL2ltcG9ydC1zbmlwcGV0XCJcbmltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROb2RlTW9kdWxlIH0gZnJvbSBcIi4vaW1wb3J0LW5vZGUtbW9kdWxlXCJcbmltcG9ydCB7IGltcG9ydE5wbVBhY2thZ2UgfSBmcm9tIFwiLi9pbXBvcnQtbnBtLXBhY2thZ2VcIlxuaW1wb3J0IHtcbiAgZ2V0VHNDb25maWcsXG4gIG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuLFxufSBmcm9tIFwibGliL3J1bm5lci90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uIH0gZnJvbSBcIi4vaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uXCJcbmltcG9ydCB7IGdldE5vZGVNb2R1bGVEaXJlY3RvcnkgfSBmcm9tIFwiLi9nZXROb2RlTW9kdWxlRGlyZWN0b3J5XCJcbmltcG9ydCB7IGdldFBhY2thZ2VKc29uRW50cnlwb2ludCB9IGZyb20gXCIuL2dldFBhY2thZ2VKc29uRW50cnlwb2ludFwiXG5pbXBvcnQgeyBpc1R5cGVTY3JpcHRFbnRyeXBvaW50IH0gZnJvbSBcIi4vaXNUeXBlU2NyaXB0RW50cnlwb2ludFwiXG5pbXBvcnQgeyBpc0Rpc3REaXJFbXB0eSB9IGZyb20gXCIuL2lzRGlzdERpckVtcHR5XCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtZXZhbC1wYXRoXCIpXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRFdmFsUGF0aChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbiAgb3B0czoge1xuICAgIGN3ZD86IHN0cmluZ1xuICAgIGZyb21Kc0RlbGl2cj86IGJvb2xlYW5cbiAgfSA9IHt9LFxuKSB7XG4gIGRlYnVnKFwiaW1wb3J0RXZhbFBhdGggY2FsbGVkIHdpdGg6XCIsIHtcbiAgICBpbXBvcnROYW1lLFxuICAgIGRlcHRoLFxuICAgIG9wdHMsXG4gIH0pXG4gIGN0eC5sb2dnZXIuaW5mbyhcbiAgICBgaW1wb3J0RXZhbFBhdGgoXCIke2ltcG9ydE5hbWV9XCIsIHtjd2Q6IFwiJHtvcHRzLmN3ZH1cIiwgZGVwdGg6ICR7ZGVwdGh9fSlgLFxuICApXG5cbiAgZGVidWcoYCR7XCIgIFwiLnJlcGVhdChkZXB0aCl9XHUyN0ExXHVGRTBGYCwgaW1wb3J0TmFtZSlcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuICBjb25zdCBkaXNhYmxlQ2RuTG9hZGluZyA9XG4gICAgY3R4LmRpc2FibGVDZG5Mb2FkaW5nIHx8IChnbG9iYWxUaGlzIGFzIGFueSkuX19ESVNBQkxFX0NETl9MT0FESU5HX19cblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzFdYClcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLi9cIikgJiYgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWUuc2xpY2UoMildKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzJdYClcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIEhhbmRsZSBzdWJwYXRoIGltcG9ydHMgZnJvbSBwcmVTdXBwbGllZEltcG9ydHMgKGUuZy4sIFwicmVhY3QvanN4LXJ1bnRpbWVcIilcbiAgLy8gSWYgdGhlIGJhc2UgcGFja2FnZSBpcyBpbiBwcmVTdXBwbGllZEltcG9ydHMsIHRyeSB0byBpbXBvcnQgZnJvbSB0aGUgYWN0dWFsIHBhY2thZ2VcbiAgaWYgKFxuICAgIGltcG9ydE5hbWUuaW5jbHVkZXMoXCIvXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiZcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL1wiKVxuICApIHtcbiAgICBjb25zdCBiYXNlUGtnID0gaW1wb3J0TmFtZS5zcGxpdChcIi9cIilbMF1cbiAgICBjb25zdCBpc1Njb3BlZCA9IGJhc2VQa2cuc3RhcnRzV2l0aChcIkBcIilcbiAgICBjb25zdCBwa2dOYW1lID0gaXNTY29wZWRcbiAgICAgID8gaW1wb3J0TmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMCwgMikuam9pbihcIi9cIilcbiAgICAgIDogYmFzZVBrZ1xuICAgIGNvbnN0IHN1YnBhdGggPSBpc1Njb3BlZFxuICAgICAgPyBpbXBvcnROYW1lLnNwbGl0KFwiL1wiKS5zbGljZSgyKS5qb2luKFwiL1wiKVxuICAgICAgOiBpbXBvcnROYW1lLnNwbGl0KFwiL1wiKS5zbGljZSgxKS5qb2luKFwiL1wiKVxuXG4gICAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1twa2dOYW1lXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVHJ5IHRvIGltcG9ydCB0aGUgc3VicGF0aCBmcm9tIHRoZSBhY3R1YWwgcGFja2FnZVxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGltcG9ydChgJHtwa2dOYW1lfS8ke3N1YnBhdGh9YClcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcmVzb2x2ZWRcbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgcmVzb2x2ZWQgZnJvbSBwcmVTdXBwbGllZEltcG9ydHMgYmFzZSBwYWNrYWdlIFwiJHtwa2dOYW1lfVwiYCxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHRoZSBkeW5hbWljIGltcG9ydCBmYWlscywgY29udGludWUgd2l0aCBub3JtYWwgcmVzb2x1dGlvblxuICAgICAgICBjdHgubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYEZhaWxlZCB0byByZXNvbHZlIFwiJHtpbXBvcnROYW1lfVwiIGZyb20gcHJlU3VwcGxpZWRJbXBvcnRzIHBhY2thZ2UgXCIke3BrZ05hbWV9XCIsIGZhbGxpbmcgYmFjayB0byBub3JtYWwgcmVzb2x1dGlvbmAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZGVwdGggPiAzMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNYXggZGVwdGggZm9yIGltcG9ydHMgcmVhY2hlZCAoMzApIEltcG9ydCBQYXRoOiAke2N0eC5pbXBvcnRTdGFjay5qb2luKFwiIC0+IFwiKX1gLFxuICAgIClcbiAgfVxuXG4gIGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIvbnBtL1wiKSkge1xuICAgIGNvbnN0IHBrZ05hbWUgPSBpbXBvcnROYW1lLnJlcGxhY2UoL15cXC9ucG1cXC8vLCBcIlwiKS5yZXBsYWNlKC9cXC9cXCtlc20kLywgXCJcIilcbiAgICBpZiAoZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBmaW5kIG1vZHVsZSBcIiR7cGtnTmFtZX1cIi4gVGhlIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgZW52aXJvbm1lbnQuXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5wbVBhY2thZ2UoXCIke3BrZ05hbWV9XCIpYClcbiAgICAvLyAvbnBtLyBwYXRocyBhcmUgYWx3YXlzIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIGZyb20ganNEZWxpdnJcbiAgICBhd2FpdCBpbXBvcnROcG1QYWNrYWdlKFxuICAgICAgeyBpbXBvcnROYW1lOiBwa2dOYW1lLCBkZXB0aCwgZnJvbUpzRGVsaXZyOiB0cnVlIH0sXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGNvbnN0IHBrZyA9IHByZVN1cHBsaWVkSW1wb3J0c1twa2dOYW1lXVxuICAgIGlmIChwa2cpIHtcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHBrZ1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIERldGVybWluZSB3aGVyZSB0c2NvbmZpZy5qc29uIGlzIGxvY2F0ZWRcbiAgbGV0IHRzY29uZmlnRGlyID0gXCIuXCJcbiAgbGV0IHRzQ29uZmlnVG9Vc2UgPSBjdHgudHNDb25maWdcbiAgaWYgKGN0eC50c0NvbmZpZyAmJiBvcHRzLmN3ZCkge1xuICAgIC8vIElmIGN3ZCBpcyBpbiBub2RlX21vZHVsZXMsIGZpbmQgdGhlIHBhY2thZ2Ugcm9vdFxuICAgIC8vIGUuZy4sIFwibm9kZV9tb2R1bGVzL2Fkb20tbGlicmFyeS9saWIvZ2VuZXJhdGVkXCIgLT4gXCJub2RlX21vZHVsZXMvYWRvbS1saWJyYXJ5XCJcbiAgICBjb25zdCBub2RlTW9kdWxlc01hdGNoID0gb3B0cy5jd2QubWF0Y2goL14obm9kZV9tb2R1bGVzXFwvW15cXC9dKykvKVxuICAgIGlmIChub2RlTW9kdWxlc01hdGNoKSB7XG4gICAgICB0c2NvbmZpZ0RpciA9IG5vZGVNb2R1bGVzTWF0Y2hbMV1cbiAgICAgIHRzQ29uZmlnVG9Vc2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGggPSByZXNvbHZlRmlsZVBhdGgoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QsXG4gICAgeyB0c0NvbmZpZzogdHNDb25maWdUb1VzZSwgdHNjb25maWdEaXIgfSxcbiAgKVxuICBpZiAocmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydExvY2FsRmlsZShcIiR7cmVzb2x2ZWRMb2NhbEltcG9ydFBhdGh9XCIpYClcbiAgICBhd2FpdCBpbXBvcnRMb2NhbEZpbGUocmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgsIGN0eCwgZGVwdGgpXG4gICAgLy8gTWFwIHRoZSBvcmlnaW5hbCBpbXBvcnQgbmFtZSAod2hpY2ggbWlnaHQgYmUgYSB0c2NvbmZpZyBwYXRoIGFsaWFzKSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlXG4gICAgaWYgKGltcG9ydE5hbWUgIT09IHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoKSB7XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPVxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGhdXG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyBtYXRjaGVzIGEgdHNjb25maWcgcGF0aCBwYXR0ZXJuIGJ1dCBmYWlsZWQgdG8gcmVzb2x2ZVxuICAvLyBJZiBzbywgdGhyb3cgYW4gZXJyb3IgaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgdG8gbnBtXG4gIGNvbnN0IHRzQ29uZmlnID0gY3R4LnRzQ29uZmlnID8/IGdldFRzQ29uZmlnKGN0eC5mc01hcClcbiAgaWYgKCFjdHgudHNDb25maWcgJiYgdHNDb25maWcpIHtcbiAgICBjdHgudHNDb25maWcgPSB0c0NvbmZpZ1xuICB9XG4gIGlmIChtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybihpbXBvcnROYW1lLCB0c0NvbmZpZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIG1hdGNoZXMgYSB0c2NvbmZpZyBwYXRoIGFsaWFzIGJ1dCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdG8gYW4gZXhpc3RpbmcgZmlsZSR7b3B0cy5jd2QgPyBgIGZyb20gZGlyZWN0b3J5IFwiJHtvcHRzLmN3ZH1cImAgOiBcIlwifVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICApXG4gIH1cblxuICAvLyBUcnkgdG8gcmVzb2x2ZSBmcm9tIG5vZGVfbW9kdWxlc1xuICBjb25zdCByZXNvbHZlZE5vZGVNb2R1bGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QgfHwgXCJcIixcbiAgKVxuICBpZiAocmVzb2x2ZWROb2RlTW9kdWxlUGF0aCkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aD1cIiR7cmVzb2x2ZWROb2RlTW9kdWxlUGF0aH1cImApXG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnROb2RlTW9kdWxlKFwiJHtpbXBvcnROYW1lfVwiKWApXG4gICAgcmV0dXJuIGltcG9ydE5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIC8vIElmIG5vdCBmb3VuZCBpbiBmc01hcCBidXQgbWlnaHQgYmUgYSBub2RlIG1vZHVsZSwgdHJ5IGltcG9ydE5vZGVNb2R1bGVcbiAgLy8gd2hpY2ggd2lsbCBhdHRlbXB0IHRvIHVzZSBub2RlTW9kdWxlc1Jlc29sdmVyIGlmIGNvbmZpZ3VyZWRcbiAgaWYgKFxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIikgJiZcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiQHRzY2kvXCIpXG4gICkge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gY3R4LmNpcmN1aXQ/LnBsYXRmb3JtXG4gICAgaWYgKHBsYXRmb3JtPy5ub2RlTW9kdWxlc1Jlc29sdmVyKSB7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oXG4gICAgICAgIGBpbXBvcnROb2RlTW9kdWxlKFwiJHtpbXBvcnROYW1lfVwiKSB2aWEgbm9kZU1vZHVsZXNSZXNvbHZlcmAsXG4gICAgICApXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBpbXBvcnROb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBub2RlTW9kdWxlc1Jlc29sdmVyIGZhaWxlZCBmb3IgXCIke2ltcG9ydE5hbWV9XCIsIGZhbGxpbmcgYmFjayB0byBucG0gQ0ROYCxcbiAgICAgICAgKVxuICAgICAgICBpZiAoZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiLiBUaGUgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBlbnZpcm9ubWVudCBhbmQgYXV0b21hdGljIG5wbSByZXNvbHV0aW9uIGlzIGRpc2FibGVkLlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnRTbmlwcGV0KFwiJHtpbXBvcnROYW1lfVwiKWApXG4gICAgcmV0dXJuIGltcG9ydFNuaXBwZXQoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIGlmICghaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJiAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIC8vIFZhbGlkYXRpb24gc3RlcHMgZm9yIG5vZGUgbW9kdWxlcyAoYmVmb3JlIGpzRGVsaXZyIGZhbGxiYWNrKVxuICAgIGlmICghb3B0cy5mcm9tSnNEZWxpdnIpIHtcbiAgICAgIC8vIFN0ZXAgMTogQ2hlY2sgaWYgcGFja2FnZSBpcyBkZWNsYXJlZCBpbiBwYWNrYWdlLmpzb25cbiAgICAgIGlmICghaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uKGltcG9ydE5hbWUsIGN0eC5mc01hcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBOb2RlIG1vZHVsZSBpbXBvcnRlZCBidXQgbm90IGluIHBhY2thZ2UuanNvbiBcIiR7aW1wb3J0TmFtZX1cIlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBTdGVwIDI6IENoZWNrIGlmIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnkgZXhpc3RzIChvbmx5IGlmIG5vdCBmb3VuZCBsb2NhbGx5IHlldClcbiAgICAgIC8vIE9ubHkgdmFsaWRhdGUgaWYgQ0ROIGxvYWRpbmcgaXMgZGlzYWJsZWQgKGkuZS4sIG5vIGZhbGxiYWNrIHRvIGpzRGVsaXZyIGF2YWlsYWJsZSlcbiAgICAgIGNvbnN0IG5vZGVNb2R1bGVEaXIgPSBnZXROb2RlTW9kdWxlRGlyZWN0b3J5KGltcG9ydE5hbWUsIGN0eC5mc01hcClcbiAgICAgIGlmICghbm9kZU1vZHVsZURpciAmJiBkaXNhYmxlQ2RuTG9hZGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBubyBmaWxlcyBpbiB0aGUgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBTdGVwIDM6IENoZWNrIGlmIG1haW4gZW50cnlwb2ludCBpcyBhIFR5cGVTY3JpcHQgZmlsZSAob25seSBpZiBkaXIgZXhpc3RzKVxuICAgICAgaWYgKG5vZGVNb2R1bGVEaXIpIHtcbiAgICAgICAgY29uc3QgZW50cnlwb2ludCA9IGdldFBhY2thZ2VKc29uRW50cnlwb2ludChpbXBvcnROYW1lLCBjdHguZnNNYXApXG4gICAgICAgIGlmIChpc1R5cGVTY3JpcHRFbnRyeXBvaW50KGVudHJ5cG9pbnQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBhIHR5cGVzY3JpcHQgZW50cnlwb2ludCB0aGF0IGlzIHVuc3VwcG9ydGVkXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNDogQ2hlY2sgaWYgZGlzdCBkaXJlY3RvcnkgaXMgZW1wdHkgd2hlbiBtYWluIHBvaW50cyB0byBkaXN0XG4gICAgICAgIGlmIChlbnRyeXBvaW50ICYmIGVudHJ5cG9pbnQuc3RhcnRzV2l0aChcImRpc3QvXCIpKSB7XG4gICAgICAgICAgaWYgKGlzRGlzdERpckVtcHR5KGltcG9ydE5hbWUsIGN0eC5mc01hcCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBubyBmaWxlcyBpbiBkaXN0LCBkaWQgeW91IGZvcmdldCB0byB0cmFuc3BpbGU/XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXNhYmxlQ2RuTG9hZGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiLiBUaGUgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBlbnZpcm9ubWVudC5cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0TnBtUGFja2FnZShcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnROcG1QYWNrYWdlKFxuICAgICAgeyBpbXBvcnROYW1lLCBkZXB0aCwgZnJvbUpzRGVsaXZyOiBvcHRzLmZyb21Kc0RlbGl2ciB9LFxuICAgICAgY3R4LFxuICAgIClcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgVW5yZXNvbHZlZCBpbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgJHtvcHRzLmN3ZCA/IGBmcm9tIGRpcmVjdG9yeSBcIiR7b3B0cy5jd2R9XCJgIDogXCJcIn1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gIClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgdHlwZSB7XG4gIENpcmN1aXRSdW5uZXJBcGksXG4gIENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxufSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCwgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwibGliL2V2YWxcIlxuaW1wb3J0IHsgbm9ybWFsaXplRnNNYXAgfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5pbXBvcnQgeyBnZXRUc0NvbmZpZyB9IGZyb20gXCIuL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0IHR5cGUgeyBSb290Q2lyY3VpdCB9IGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7IHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZCB9IGZyb20gXCIuL3NldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZFwiXG5pbXBvcnQgeyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IgfSBmcm9tIFwibGliL3V0aWxzL2VuaGFuY2Utcm9vdC1jaXJjdWl0LWVycm9yXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgc2V0VmFsdWVBdFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9vYmotcGF0aFwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6Q2lyY3VpdFJ1bm5lclwiKVxuXG5leHBvcnQgY2xhc3MgQ2lyY3VpdFJ1bm5lciBpbXBsZW1lbnRzIENpcmN1aXRSdW5uZXJBcGkge1xuICBfZXhlY3V0aW9uQ29udGV4dDogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRXhlY3V0aW9uQ29udGV4dD4gfCBudWxsID0gbnVsbFxuICBfY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb246IENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uID0ge1xuICAgIHNuaXBwZXRzQXBpQmFzZVVybDogXCJodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tXCIsXG4gICAgY2pzUmVnaXN0cnlVcmw6IFwiaHR0cHM6Ly9janMudHNjaXJjdWl0LmNvbVwiLFxuICAgIHZlcmJvc2U6IGZhbHNlLFxuICB9XG4gIF9ldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgKCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZClbXT4gPSB7fVxuICBfZGVidWdOYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb246IFBhcnRpYWw8Q2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24+ID0ge30pIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uKVxuICB9XG5cbiAgYXN5bmMgdmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBcIjAuMC4wXCJcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXaXRoRnNNYXAob2dPcHRzOiB7XG4gICAgZW50cnlwb2ludD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRzID0geyAuLi5vZ09wdHMgfVxuXG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIERlYnVnLmVuYWJsZShcInRzY2k6ZXZhbDoqXCIpXG4gICAgfVxuXG4gICAgZGVidWcoXCJleGVjdXRlV2l0aEZzTWFwIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgICBmc01hcEtleXM6IE9iamVjdC5rZXlzKG9wdHMuZnNNYXApLFxuICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgIH0pXG5cbiAgICBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQob3B0cylcblxuICAgIGRlYnVnKFwiZW50cnlwb2ludCBhZnRlciBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQ6XCIsIHtcbiAgICAgIGVudHJ5cG9pbnQ6IG9wdHMuZW50cnlwb2ludCxcbiAgICB9KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQgPSBvcHRzLmVudHJ5cG9pbnQhXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcCA9IG5vcm1hbGl6ZUZzTWFwKG9wdHMuZnNNYXApXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IGdldFRzQ29uZmlnKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXApXG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwW29wdHMuZW50cnlwb2ludCFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudHJ5cG9pbnQgXCIke29wdHMuZW50cnlwb2ludH1cIiBub3QgZm91bmRgKVxuICAgIH1cbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBjb25zdCBlbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IS5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gb3B0cy5lbnRyeXBvaW50XG4gICAgICA6IGAuLyR7b3B0cy5lbnRyeXBvaW50fWBcblxuICAgIGRlYnVnKFwiZmluYWwgZW50cnlwb2ludDpcIiwgZW50cnlwb2ludClcbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChlbnRyeXBvaW50ISwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUoY29kZTogc3RyaW5nLCBvcHRzOiB7IG5hbWU/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlIGNhbGxlZCB3aXRoIGNvZGUgbGVuZ3RoOlwiLFxuICAgICAgICBjb2RlLmxlbmd0aCxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtcImVudHJ5cG9pbnQudHN4XCJdID0gY29kZVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKFwiLi9lbnRyeXBvaW50LnRzeFwiLCB0aGlzLl9leGVjdXRpb25Db250ZXh0KVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUNvbXBvbmVudChjb21wb25lbnQ6IGFueSwgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlQ29tcG9uZW50IGNhbGxlZFwiKVxuICAgIH1cblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHBsYXRmb3JtOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgICAgcHJvamVjdENvbmZpZzogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgICAgZGVidWdOYW1lc3BhY2U6IHRoaXMuX2RlYnVnTmFtZXNwYWNlLFxuICAgICAgfSxcbiAgICApXG4gICAgdGhpcy5fYmluZEV2ZW50TGlzdGVuZXJzKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IG51bGxcblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgPyBjb21wb25lbnQoKSA6IGNvbXBvbmVudFxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5hZGQoZWxlbWVudCBhcyBhbnkpXG4gIH1cblxuICBvbihldmVudDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdID8/PSBbXVxuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XS5wdXNoKGNhbGxiYWNrKVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQ/LmNpcmN1aXQub24oZXZlbnQgYXMgYW55LCBjYWxsYmFjaylcbiAgfVxuXG4gIGFzeW5jIHJlbmRlclVudGlsU2V0dGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LnJlbmRlclVudGlsU2V0dGxlZCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDaXJjdWl0SnNvbigpOiBQcm9taXNlPEFueUNpcmN1aXRFbGVtZW50W10+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5nZXRDaXJjdWl0SnNvbigpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjbGVhckV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGlmICh0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0KSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgICAgY29uc3QgY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogPGV4cGxhbmF0aW9uPlxuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXI/OiAoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEZ1bmN0aW9uKSA9PiB2b2lkXG4gICAgICAgICAgfVxuICAgICAgICAgIGNpcmN1aXQucmVtb3ZlTGlzdGVuZXI/LihldmVudCwgbGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdXG4gICAgfVxuICB9XG5cbiAgYXN5bmMga2lsbCgpIHtcbiAgICAvLyBDbGVhbnVwIHJlc291cmNlc1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBudWxsXG4gIH1cblxuICBhc3luYyBzZXRTbmlwcGV0c0FwaUJhc2VVcmwoYmFzZVVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsID0gYmFzZVVybFxuICB9XG5cbiAgYXN5bmMgc2V0RGlzYWJsZUNkbkxvYWRpbmcoZGlzYWJsZTogYm9vbGVhbikge1xuICAgIDsodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24gYXMgYW55KS5kaXNhYmxlQ2RuTG9hZGluZyA9IGRpc2FibGVcbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnKHBsYXRmb3JtOiBQbGF0Zm9ybUNvbmZpZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0gcGxhdGZvcm1cbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnUHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0ge31cbiAgICB9XG4gICAgc2V0VmFsdWVBdFBhdGgodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sIHByb3BlcnR5LCB2YWx1ZSlcbiAgfVxuXG4gIGFzeW5jIHNldFByb2plY3RDb25maWcocHJvamVjdDogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz4pIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0gcHJvamVjdFxuICB9XG5cbiAgYXN5bmMgc2V0UHJvamVjdENvbmZpZ1Byb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcgPSB7fVxuICAgIH1cbiAgICBzZXRWYWx1ZUF0UGF0aChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICBwcm9wZXJ0eSxcbiAgICAgIHZhbHVlLFxuICAgIClcbiAgfVxuXG4gIGFzeW5jIGVuYWJsZURlYnVnKG5hbWVzcGFjZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVidWdOYW1lc3BhY2UgPSBuYW1lc3BhY2VcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgY29uc3QgY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyBhbnlcbiAgICAgIGNpcmN1aXQuZW5hYmxlRGVidWc/LihuYW1lc3BhY2UpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYmluZEV2ZW50TGlzdGVuZXJzKGNpcmN1aXQ6IFJvb3RDaXJjdWl0KSB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgY2lyY3VpdC5vbihldmVudCBhcyBhbnksIGxpc3RlbmVyIGFzIGFueSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGhPclRocm93IH0gZnJvbSBcIi4vcmVzb2x2ZUZpbGVQYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOnNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZFwiKVxuXG5leHBvcnQgY29uc3Qgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkID0gKG9wdHM6IHtcbiAgZW50cnlwb2ludD86IHN0cmluZ1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBtYWluQ29tcG9uZW50UGF0aD86IHN0cmluZ1xuICBtYWluQ29tcG9uZW50TmFtZT86IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIG1haW5Db21wb25lbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbn0pID0+IHtcbiAgaWYgKCFvcHRzLmVudHJ5cG9pbnQgJiYgIW9wdHMubWFpbkNvbXBvbmVudFBhdGgpIHtcbiAgICBpZiAoXCJpbmRleC50c3hcIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gXCJpbmRleC50c3hcIlxuICAgIH0gZWxzZSBpZiAoXCJpbmRleC50c1wiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBcImluZGV4LnRzXCJcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgT2JqZWN0LmtleXMob3B0cy5mc01hcCkuZmlsdGVyKChrKSA9PiBrLmVuZHNXaXRoKFwiLnRzeFwiKSkubGVuZ3RoID09PSAxXG4gICAgKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gT2JqZWN0LmtleXMob3B0cy5mc01hcClbMF1cbiAgICB9IGVsc2UgaWYgKFwidHNjaXJjdWl0LmNvbmZpZy5qc29uXCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgY29uc3QgY29uZmlnQ29udGVudCA9IG9wdHMuZnNNYXBbXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIl1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UoY29uZmlnQ29udGVudClcbiAgICAgICAgaWYgKGNvbmZpZy5tYWluRW50cnlwb2ludCkge1xuICAgICAgICAgIG9wdHMuZW50cnlwb2ludCA9IGNvbmZpZy5tYWluRW50cnlwb2ludFxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBwYXJzZSB0c2NpcmN1aXQuY29uZmlnLmpzb246XCIsIGUpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFaXRoZXIgZW50cnlwb2ludCBvciBtYWluQ29tcG9uZW50UGF0aCBtdXN0IGJlIHByb3ZpZGVkIChubyBpbmRleCBmaWxlLCBjb3VsZCBub3QgaW5mZXIgZW50cnlwb2ludClcIixcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBpZiAoIW9wdHMuZW50cnlwb2ludCAmJiBvcHRzLm1haW5Db21wb25lbnRQYXRoKSB7XG4gICAgb3B0cy5lbnRyeXBvaW50ID0gXCJlbnRyeXBvaW50LnRzeFwiXG4gICAgY29uc3QgbWFpbkNvbXBvbmVudENvZGUgPVxuICAgICAgb3B0cy5mc01hcFtyZXNvbHZlRmlsZVBhdGhPclRocm93KG9wdHMubWFpbkNvbXBvbmVudFBhdGgsIG9wdHMuZnNNYXApXVxuICAgIGlmICghbWFpbkNvbXBvbmVudENvZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1haW4gY29tcG9uZW50IHBhdGggXCIke29wdHMubWFpbkNvbXBvbmVudFBhdGh9XCIgbm90IGZvdW5kIGluIGZzTWFwLiBBdmFpbGFibGUgcGF0aHM6ICR7T2JqZWN0LmtleXMob3B0cy5mc01hcCkuam9pbihcIiwgXCIpfWAsXG4gICAgICApXG4gICAgfVxuICAgIG9wdHMuZnNNYXBbb3B0cy5lbnRyeXBvaW50XSA9IGBcbiAgICAgaW1wb3J0ICogYXMgVXNlckNvbXBvbmVudHMgZnJvbSBcIi4vJHtvcHRzLm1haW5Db21wb25lbnRQYXRofVwiO1xuICAgICAgICAgIFxuICAgICAgJHtcbiAgICAgICAgb3B0cy5tYWluQ29tcG9uZW50TmFtZVxuICAgICAgICAgID8gYFxuICAgICAgICBjb25zdCBDb21wb25lbnRUb1JlbmRlciA9IFVzZXJDb21wb25lbnRzW1wiJHtvcHRzLm1haW5Db21wb25lbnROYW1lfVwiXVxuICAgICAgICBgXG4gICAgICAgICAgOiBgY29uc3QgQ29tcG9uZW50VG9SZW5kZXIgPSBVc2VyQ29tcG9uZW50cy5kZWZhdWx0IHx8IFxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKFVzZXJDb21wb25lbnRzKVxuICAgICAgICAgIC5maWx0ZXIoKFtuYW1lXSkgPT4gIW5hbWUuc3RhcnRzV2l0aChcInVzZVwiKSlcbiAgICAgICAgICAubWFwKChbXywgY29tcG9uZW50XSkgPT4gY29tcG9uZW50KVswXSB8fCAoKCkgPT4gbnVsbCk7YFxuICAgICAgfVxuXG4gICAgICAgICAgICR7XG4gICAgICAgICAgICAgZGVidWcuZW5hYmxlZFxuICAgICAgICAgICAgICAgPyBgXG4gICAgIGNvbnNvbGUubG9nKHsgVXNlckNvbXBvbmVudHMgfSlcbiAgICAgY29uc29sZS5sb2coXCJDb21wb25lbnRUb1JlbmRlciBcIiArIENvbXBvbmVudFRvUmVuZGVyLnRvU3RyaW5nKCksICB7IENvbXBvbmVudFRvUmVuZGVyIH0pXG4gICAgIGBcbiAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICB9XG5cbiAgICAgIGNpcmN1aXQuYWRkKCAgICAgICBcbiAgICAgICAgICA8Q29tcG9uZW50VG9SZW5kZXIgJHtvcHRzLm1haW5Db21wb25lbnRQcm9wcyA/IGB7Li4uJHtKU09OLnN0cmluZ2lmeShvcHRzLm1haW5Db21wb25lbnRQcm9wcywgbnVsbCwgMil9fWAgOiBcIlwifSAvPiBcbiAgICAgICk7XG5gXG4gIH1cblxuICBpZiAoIW9wdHMubmFtZSAmJiBvcHRzLm1haW5Db21wb25lbnROYW1lKSB7XG4gICAgb3B0cy5uYW1lID0gb3B0cy5tYWluQ29tcG9uZW50TmFtZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvciA9IChcbiAgZXJyb3I6IHVua25vd24sXG4gIGVudHJ5cG9pbnQ/OiBzdHJpbmcsXG4pID0+IHtcbiAgaWYgKFxuICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICBlbnRyeXBvaW50ICYmXG4gICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIlJvb3RDaXJjdWl0IGhhcyBubyBjaGlsZHJlblwiKSAmJlxuICAgICFlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdcImVudHJ5cG9pbnRcIjonKVxuICApIHtcbiAgICBjb25zdCBlbnRyeXBvaW50TWVzc2FnZSA9IGVudHJ5cG9pbnQuc3RhcnRzV2l0aChcIi4vXCIpXG4gICAgICA/IGVudHJ5cG9pbnQuc2xpY2UoMilcbiAgICAgIDogZW50cnlwb2ludFxuICAgIGVycm9yLm1lc3NhZ2UgPSBgJHtlcnJvci5tZXNzYWdlfS4gXCJlbnRyeXBvaW50XCI6IFwiJHtlbnRyeXBvaW50TWVzc2FnZX1cIiBpcyBzZXQgaW4gdGhlIHJ1bm5lciBjb25maWd1cmF0aW9uLCBlbnRyeXBvaW50cyBtdXN0IGNvbnRhaW4gXCJjaXJjdWl0LmFkZCguLi4pXCIsIHlvdSBtaWdodCBiZSBsb29raW5nIHRvIHVzZSBtYWluQ29tcG9uZW50UGF0aCBpbnN0ZWFkIGlmIHlvdXIgZmlsZSBleHBvcnRzIGEgY29tcG9uZW50LmBcbiAgfVxuXG4gIHJldHVybiBlcnJvclxufVxuIiwgIi8qKlxuICogR2V0IGFsbCBwYXRocyBvZiBhbiBvYmplY3RcbiAqXG4gKiBnZXRPYmplY3RQYXRocyh7IGE6IHsgYjogMiwgYzogeyBkOiAzIH0gfSwgZTogNSB9KVxuICpcbiAqIC8vIE91dHB1dDogWydhLmInLCAnYS5jLmQnLCAnZSddXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYmplY3RQYXRocyhcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwcmVmaXggPSBcIlwiLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldXG4gICAgY29uc3QgcGF0aCA9IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrZXl9YCA6IGtleVxuXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHN1YlBhdGhzID0gZ2V0T2JqZWN0UGF0aHModmFsdWUsIHBhdGgpXG4gICAgICBwYXRocy5wdXNoKC4uLnN1YlBhdGhzKVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXRocy5wdXNoKHBhdGgpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhdGhzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUF0UGF0aChvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KFwiLlwiKVxuICBsZXQgY3VycmVudCA9IG9ialxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XVxuICB9XG4gIHJldHVybiBjdXJyZW50XG59XG4vKipcbiAqIFNldCBhIHZhbHVlIGF0IGEgcGF0aCBpbiBhbiBvYmplY3RcbiAqXG4gKiBzZXRWYWx1ZUF0UGF0aCh7IGE6IHsgYjogMiB9IH0sIFwiYS5jLmRcIiwgNSlcbiAqXG4gKiAvLyBPdXRwdXQ6IHsgYTogeyBiOiAyLCBjOiB7IGQ6IDUgfSB9IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbHVlQXRQYXRoKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IGFueSxcbikge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChcIi5cIilcbiAgbGV0IGN1cnJlbnQgPSBvYmpcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuXG4gICAgLy8gSWYgd2UncmUgYXQgdGhlIGxhc3Qga2V5LCBzZXQgdGhlIHZhbHVlLlxuICAgIGlmIChpID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IHZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBrZXkgZG9lc24ndCBleGlzdCBvciBpcyBub3QgYW4gb2JqZWN0IChhdm9pZCBvdmVyd3JpdGluZyBhcnJheXMpLCBjcmVhdGUgYSBuZXcgb2JqZWN0XG4gICAgICBpZiAoXG4gICAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSB8fFxuICAgICAgICB0eXBlb2YgY3VycmVudFtrZXldICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgIGN1cnJlbnRba2V5XSA9PT0gbnVsbCB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KGN1cnJlbnRba2V5XSlcbiAgICAgICkge1xuICAgICAgICBjdXJyZW50W2tleV0gPSB7fVxuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IENpcmN1aXRSdW5uZXIgfSBmcm9tIFwiLi9DaXJjdWl0UnVubmVyXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blRzY2lyY3VpdENvZGUoXG4gIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmcsXG4gIG9wdHM/OiBPbWl0PFBhcmFtZXRlcnM8Q2lyY3VpdFJ1bm5lcltcImV4ZWN1dGVXaXRoRnNNYXBcIl0+WzBdLCBcImZzTWFwXCI+LFxuKSB7XG4gIGlmIChcbiAgICB0eXBlb2YgZmlsZXN5c3RlbU9yQ29kZVN0cmluZyA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICFmaWxlc3lzdGVtT3JDb2RlU3RyaW5nLmluY2x1ZGVzKFwiZXhwb3J0XCIpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgXCJleHBvcnRcIiBrZXl3b3JkIHdhc24ndCBmb3VuZCBpbiB5b3VyIHByb3ZpZGVkIGNvZGUuIFlvdSBuZWVkIHRvIGV4cG9ydCBhIGNvbXBvbmVudCBpbiB5b3VyIGNvZGUsIGUuZy5cXG5cXG5leHBvcnQgZGVmYXVsdCAoKSA9PiAoXFxuICA8cmVzaXN0b3IgbmFtZT1cIlIxXCIgcmVzaXN0YW5jZT1cIjFrXCIgLz5cXG4pYCxcbiAgICApXG4gIH1cbiAgY29uc3QgZmlsZXN5c3RlbSA9XG4gICAgdHlwZW9mIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgPT09IFwic3RyaW5nXCJcbiAgICAgID8geyBcInVzZXItY29kZS50c3hcIjogZmlsZXN5c3RlbU9yQ29kZVN0cmluZyB9XG4gICAgICA6IGZpbGVzeXN0ZW1PckNvZGVTdHJpbmdcblxuICBjb25zdCBjaXJjdWl0UnVubmVyID0gbmV3IENpcmN1aXRSdW5uZXIoKVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIuZXhlY3V0ZVdpdGhGc01hcCh7XG4gICAgZnNNYXA6IGZpbGVzeXN0ZW0sXG4gICAgLi4ub3B0cyxcbiAgfSlcblxuICBhd2FpdCBjaXJjdWl0UnVubmVyLnJlbmRlclVudGlsU2V0dGxlZCgpXG5cbiAgcmV0dXJuIGF3YWl0IGNpcmN1aXRSdW5uZXIuZ2V0Q2lyY3VpdEpzb24oKVxufVxuIiwgImltcG9ydCB7IHJ1blRzY2lyY3VpdENvZGUgfSBmcm9tIFwiLi9ydW5Uc2NpcmN1aXRDb2RlXCJcblxuZXhwb3J0IGNvbnN0IHJ1blRzY2lyY3VpdE1vZHVsZSA9IGFzeW5jIChcbiAgbW9kdWxlOiBzdHJpbmcsXG4gIG9wdHM6IHsgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyBleHBvcnROYW1lPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBpZiAoIW1vZHVsZS5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgIG1vZHVsZSA9IGBAdHNjaS8ke21vZHVsZS5yZXBsYWNlKC9cXC8vLCBcIi5cIil9YFxuICB9XG4gIGNvbnN0IGNpcmN1aXRKc29uID0gYXdhaXQgcnVuVHNjaXJjdWl0Q29kZShcbiAgICB7XG4gICAgICAvLyBUT0RPIGhhbmRsZSBleHBvcnRzIHRoYXQgYXJlIG5vdCB0aGUgZGVmYXVsdCBleHBvcnQgYnkgc2Nhbm5pbmdcbiAgICAgIC8vIG90aGVyRXhwb3J0cyBmb3IgY29tcG9uZW50c1xuICAgICAgXCJ1c2VyLWNvZGUudHN4XCI6IGBcbiAgICBpbXBvcnQgTW9kdWxlLCAqIGFzIG90aGVyRXhwb3J0cyBmcm9tIFwiJHttb2R1bGV9XCI7XG5cbiAgICBsZXQgZXhwb3J0TmFtZSA9IFwiJHtvcHRzLmV4cG9ydE5hbWUgPz8gXCJcIn1cIlxuXG4gICAgaWYgKCghTW9kdWxlIHx8IHR5cGVvZiBNb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgJiYgIUJvb2xlYW4oZXhwb3J0TmFtZSkpIHtcbiAgICAgIGV4cG9ydE5hbWUgPSBPYmplY3Qua2V5cyhvdGhlckV4cG9ydHMpLmZpbHRlcihrZXkgPT4ga2V5WzBdID09PSBrZXlbMF0udG9VcHBlckNhc2UoKSAmJiB0eXBlb2Ygb3RoZXJFeHBvcnRzW2tleV0gPT09IFwiZnVuY3Rpb25cIilbMF1cbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gZXhwb3J0TmFtZSA/IG90aGVyRXhwb3J0c1tleHBvcnROYW1lXSA6IE1vZHVsZVxuXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXFxgTm8gZXhwb3J0IGZvdW5kIGZvciBtb2R1bGUgXCJcXCR7bW9kdWxlfVwiICh0cmllZCBcIlxcJHtleHBvcnROYW1lID8/IFwiZGVmYXVsdFwifVwiKVxcYClcbiAgICB9XG5cbiAgICBleHBvcnQgZGVmYXVsdCBkZWZhdWx0RXhwb3J0O1xuICAgIGAsXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWluQ29tcG9uZW50UHJvcHM6IG9wdHMucHJvcHMsXG4gICAgfSxcbiAgKVxuICByZXR1cm4gY2lyY3VpdEpzb25cbn1cbiIsICJpbXBvcnQgKiBhcyBDb21saW5rIGZyb20gXCJjb21saW5rXCJcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2luZGV4XCJcbmltcG9ydCB0eXBlIHtcbiAgSW50ZXJuYWxXZWJXb3JrZXJBcGksXG4gIFdlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIENpcmN1aXRXZWJXb3JrZXIsXG59IGZyb20gXCIuL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0RXZlbnROYW1lIH0gZnJvbSBcIi4vc2hhcmVkL3R5cGVzXCJcbmltcG9ydCB7IGdldE9iamVjdFBhdGhzLCBnZXRWYWx1ZUF0UGF0aCB9IGZyb20gXCIuL3NoYXJlZC9vYmotcGF0aFwiXG5cbmV4cG9ydCB0eXBlIHsgQ2lyY3VpdFdlYldvcmtlciwgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUjogQ2lyY3VpdFdlYldvcmtlciB8IHVuZGVmaW5lZFxuICB9XG4gIHZhciBUU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSOiBDaXJjdWl0V2ViV29ya2VyIHwgdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDaXJjdWl0V2ViV29ya2VyID0gYXN5bmMgKFxuICBjb25maWd1cmF0aW9uOiBQYXJ0aWFsPFdlYldvcmtlckNvbmZpZ3VyYXRpb24+LFxuKTogUHJvbWlzZTxDaXJjdWl0V2ViV29ya2VyPiA9PiB7XG4gIC8vIEtpbGwgZXhpc3RpbmcgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZSBpZiBwcmVzZW50XG4gIGNvbnN0IGV4aXN0aW5nV29ya2VyID0gZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSXG4gIGlmIChleGlzdGluZ1dvcmtlciAmJiB0eXBlb2YgZXhpc3RpbmdXb3JrZXIua2lsbCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbV29ya2VyXSBLaWxsaW5nIHByZXZpb3VzIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2UuLi5cIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4aXN0aW5nV29ya2VyLmtpbGwoKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiW1dvcmtlcl0gRXJyb3Iga2lsbGluZyBwcmV2aW91cyBnbG9iYWwgd29ya2VyIGluc3RhbmNlOlwiLFxuICAgICAgICAgIGUsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB0aGUga2V5IGlzIGNsZWFyZWQgZXZlbiBpZiBraWxsIHRocm93cyBhbiBlcnJvclxuICAgICAgaWYgKGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9PT0gZXhpc3RpbmdXb3JrZXIpIHtcbiAgICAgICAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJbV29ya2VyXSBDcmVhdGluZyBjaXJjdWl0IHdlYiB3b3JrZXIgd2l0aCBjb25maWc6XCIsXG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgIClcbiAgfVxuXG4gIGxldCB3b3JrZXJCbG9iVXJsID1cbiAgICBjb25maWd1cmF0aW9uLndlYldvcmtlckJsb2JVcmwgPz8gY29uZmlndXJhdGlvbi53ZWJXb3JrZXJVcmxcblxuICBpZiAoIXdvcmtlckJsb2JVcmwpIHtcbiAgICBjb25zdCBjZG5VcmwgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L2V2YWxAJHtjb25maWd1cmF0aW9uLmV2YWxWZXJzaW9uID8/IFwibGF0ZXN0XCJ9L2Rpc3Qvd2Vid29ya2VyL2VudHJ5cG9pbnQuanNgXG5cbiAgICBjb25zdCB3b3JrZXJCbG9iID0gYXdhaXQgZ2xvYmFsVGhpcy5mZXRjaChjZG5VcmwpLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSlcbiAgICB3b3JrZXJCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTCh3b3JrZXJCbG9iKVxuICB9XG5cbiAgY29uc3QgcmF3V29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJCbG9iVXJsLCB7IHR5cGU6IFwibW9kdWxlXCIgfSlcbiAgbGV0IHdvcmtlckluaXRFcnJvcjogYW55XG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKGV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIltXb3JrZXJdIEVycm9yIGluIHdvcmtlclwiLCBldmVudClcbiAgICB3b3JrZXJJbml0RXJyb3IgPSBldmVudFxuICB9KVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcInVuaGFuZGxlZHJlamVjdGlvblwiLCAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiW1dvcmtlcl0gVW5oYW5kbGVkIHJlamVjdGlvbiBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH0pXG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZWVycm9yXCIsIChldmVudCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbV29ya2VyXSBNZXNzYWdlIGVycm9yIGluIHdvcmtlclwiLCBldmVudClcbiAgfSlcbiAgY29uc3QgZWFybHlNZXNzYWdlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJbV29ya2VyXSBNZXNzYWdlIGluIHdvcmtlclwiLCBldmVudClcbiAgfVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZWFybHlNZXNzYWdlSGFuZGxlcilcblxuICAvLyBIYW5kbGUgZmV0Y2ggcmVxdWVzdHMgZnJvbSB0aGUgd29ya2VyXG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBhc3luYyAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhXG4gICAgaWYgKGRhdGE/LnR5cGUgIT09IFwid29ya2VyX2ZldGNoXCIpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2xvYmFsVGhpcy5mZXRjaChkYXRhLmlucHV0LCBkYXRhLmluaXQpXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgICByYXdXb3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICB0eXBlOiBcIndvcmtlcl9mZXRjaF9yZXN1bHRcIixcbiAgICAgICAgcmVxdWVzdElkOiBkYXRhLnJlcXVlc3RJZCxcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgaGVhZGVyczogKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgICB9KSgpLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgcmF3V29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJ3b3JrZXJfZmV0Y2hfcmVzdWx0XCIsXG4gICAgICAgIHJlcXVlc3RJZDogZGF0YS5yZXF1ZXN0SWQsXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIG5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIHN0YWNrOiBlcnIuc3RhY2ssXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfSlcblxuICBpZiAod29ya2VySW5pdEVycm9yKSB7XG4gICAgdGhyb3cgd29ya2VySW5pdEVycm9yXG4gIH1cblxuICBjb25zdCBjb21saW5rV29ya2VyID0gQ29tbGluay53cmFwPEludGVybmFsV2ViV29ya2VyQXBpPihyYXdXb3JrZXIpXG5cbiAgcmF3V29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGVhcmx5TWVzc2FnZUhhbmRsZXIpXG5cbiAgLy8gSGVscGVyIHRvIHNlcmlhbGl6ZSBSZWFjdCBlbGVtZW50cyBmb3IgY3Jvc3Mtd29ya2VyIGNvbW11bmljYXRpb25cbiAgZnVuY3Rpb24gc2VyaWFsaXplUmVhY3RFbGVtZW50KGVsZW1lbnQ6IGFueSk6IGFueSB7XG4gICAgaWYgKCFlbGVtZW50IHx8IHR5cGVvZiBlbGVtZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gZWxlbWVudFxuICAgIH1cblxuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgUmVhY3QgZWxlbWVudFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19pc1NlcmlhbGl6ZWRSZWFjdEVsZW1lbnQ6IHRydWUsXG4gICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgcHJvcHM6IHNlcmlhbGl6ZVByb3BzKGVsZW1lbnQucHJvcHMpLFxuICAgICAgICBrZXk6IGVsZW1lbnQua2V5LFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50XG4gIH1cblxuICBmdW5jdGlvbiBzZXJpYWxpemVQcm9wcyhwcm9wczogYW55KTogYW55IHtcbiAgICBpZiAoIXByb3BzIHx8IHR5cGVvZiBwcm9wcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHByb3BzXG4gICAgfVxuXG4gICAgY29uc3Qgc2VyaWFsaXplZDogYW55ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiY2hpbGRyZW5cIikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBzZXJpYWxpemVkLmNoaWxkcmVuID0gdmFsdWUubWFwKHNlcmlhbGl6ZVJlYWN0RWxlbWVudClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXJpYWxpemVkLmNoaWxkcmVuID0gc2VyaWFsaXplUmVhY3RFbGVtZW50KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJpYWxpemVkW2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZFxuICB9XG5cbiAgLy8gQ29uZGl0aW9uYWxseSBvdmVycmlkZSBnbG9iYWwgZmV0Y2ggaW5zaWRlIHRoZSB3b3JrZXIgdG8gcm91dGUgdGhyb3VnaCB0aGUgcGFyZW50XG4gIC8vIE9ubHkgZW5hYmxlIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgdmlhIGNvbmZpZ3VyYXRpb25cbiAgaWYgKGNvbmZpZ3VyYXRpb24uZW5hYmxlRmV0Y2hQcm94eSkge1xuICAgIHJhd1dvcmtlci5wb3N0TWVzc2FnZSh7IHR5cGU6IFwib3ZlcnJpZGVfZ2xvYmFsX2ZldGNoXCIgfSlcbiAgfVxuXG4gIGlmIChjb25maWd1cmF0aW9uLmRpc2FibGVDZG5Mb2FkaW5nKSB7XG4gICAgYXdhaXQgY29tbGlua1dvcmtlci5zZXREaXNhYmxlQ2RuTG9hZGluZyh0cnVlKVxuICB9XG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsKSB7XG4gICAgYXdhaXQgY29tbGlua1dvcmtlci5zZXRTbmlwcGV0c0FwaUJhc2VVcmwoY29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwpXG4gIH1cblxuICBjb25zdCBtYXliZVByb3h5ID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBDb21saW5rLnByb3h5KHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBpZiAoY29uZmlndXJhdGlvbi5wbGF0Zm9ybSkge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBnZXRPYmplY3RQYXRocyhjb25maWd1cmF0aW9uLnBsYXRmb3JtKSkge1xuICAgICAgYXdhaXQgY29tbGlua1dvcmtlclxuICAgICAgICAuc2V0UGxhdGZvcm1Db25maWdQcm9wZXJ0eShcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIG1heWJlUHJveHkoZ2V0VmFsdWVBdFBhdGgoY29uZmlndXJhdGlvbi5wbGF0Zm9ybSwgcGF0aCkpLFxuICAgICAgICApXG4gICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciBzZXR0aW5nIHBsYXRmb3JtIGNvbmZpZyBwcm9wZXJ0eSAke3BhdGh9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cbiAgaWYgKGNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZykge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBnZXRPYmplY3RQYXRocyhjb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpKSB7XG4gICAgICBhd2FpdCBjb21saW5rV29ya2VyXG4gICAgICAgIC5zZXRQcm9qZWN0Q29uZmlnUHJvcGVydHkoXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBtYXliZVByb3h5KGdldFZhbHVlQXRQYXRoKGNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZywgcGF0aCkpLFxuICAgICAgICApXG4gICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciBzZXR0aW5nIHByb2plY3QgY29uZmlnIHByb3BlcnR5ICR7cGF0aH06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWAsXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGxldCBpc1Rlcm1pbmF0ZWQgPSBmYWxzZVxuXG4gIC8vIENyZWF0ZSBhIHdyYXBwZXIgdGhhdCBoYW5kbGVzIGV2ZW50cyBkaXJlY3RseSB0aHJvdWdoIGNpcmN1aXQgaW5zdGFuY2VcbiAgY29uc3Qgd3JhcHBlcjogQ2lyY3VpdFdlYldvcmtlciA9IHtcbiAgICBjbGVhckV2ZW50TGlzdGVuZXJzOiBjb21saW5rV29ya2VyLmNsZWFyRXZlbnRMaXN0ZW5lcnMuYmluZChjb21saW5rV29ya2VyKSxcbiAgICBlbmFibGVEZWJ1ZzogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZW5hYmxlRGVidWdcIilcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmVuYWJsZURlYnVnLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIHZlcnNpb246IGNvbWxpbmtXb3JrZXIudmVyc2lvbi5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGV4ZWN1dGU6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVcIilcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGUuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgZXhlY3V0ZUNvbXBvbmVudDogYXN5bmMgKGNvbXBvbmVudDogYW55KSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVDb21wb25lbnRcIixcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBpdCdzIGEgZnVuY3Rpb24sIHBhc3MgaXQgYXMtaXMgKHdpbGwgYmUgcHJveGllZCBieSBDb21saW5rKVxuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlQ29tcG9uZW50LmJpbmQoY29tbGlua1dvcmtlcikoY29tcG9uZW50KVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBpdCdzIGEgUmVhY3QgZWxlbWVudCwgc2VyaWFsaXplIGl0IHRvIGEgcmVjb25zdHJ1Y3RhYmxlIGZvcm1hdFxuICAgICAgaWYgKGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmIGNvbXBvbmVudC50eXBlKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRFbGVtZW50ID0gc2VyaWFsaXplUmVhY3RFbGVtZW50KGNvbXBvbmVudClcbiAgICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZUNvbXBvbmVudC5iaW5kKGNvbWxpbmtXb3JrZXIpKFxuICAgICAgICAgIHNlcmlhbGl6ZWRFbGVtZW50LFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVDb21wb25lbnQuYmluZChjb21saW5rV29ya2VyKShjb21wb25lbnQpXG4gICAgfSxcbiAgICBleGVjdXRlV2l0aEZzTWFwOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlV2l0aEZzTWFwXCIsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVXaXRoRnNNYXAuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgcmVuZGVyVW50aWxTZXR0bGVkOiBjb21saW5rV29ya2VyLnJlbmRlclVudGlsU2V0dGxlZC5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGdldENpcmN1aXRKc29uOiBjb21saW5rV29ya2VyLmdldENpcmN1aXRKc29uLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgb246IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSA9PiB7XG4gICAgICBjb25zdCBwcm94aWVkQ2FsbGJhY2sgPSBDb21saW5rLnByb3h5KGNhbGxiYWNrKVxuICAgICAgY29tbGlua1dvcmtlci5vbihldmVudCBhcyBSb290Q2lyY3VpdEV2ZW50TmFtZSwgcHJveGllZENhbGxiYWNrKVxuICAgIH0sXG4gICAga2lsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29tbGlua1dvcmtlcltDb21saW5rLnJlbGVhc2VQcm94eV0oKVxuICAgICAgcmF3V29ya2VyLnRlcm1pbmF0ZSgpXG4gICAgICBpc1Rlcm1pbmF0ZWQgPSB0cnVlXG4gICAgICBpZiAoZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID09PSB3cmFwcGVyKSB7XG4gICAgICAgIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0sXG4gIH1cbiAgOyh3cmFwcGVyIGFzIGFueSkuX19yYXdXb3JrZXIgPSByYXdXb3JrZXJcbiAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gd3JhcHBlclxuICByZXR1cm4gd3JhcHBlclxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vcnVubmVyL25vcm1hbGl6ZUZzTWFwXCJcblxuZXhwb3J0IGNvbnN0IGdldFBvc3NpYmxlRW50cnlwb2ludENvbXBvbmVudFBhdGhzID0gKFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbcGF0aCwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKHBhdGgpXSA9IGNvbnRlbnRcbiAgfVxuXG4gIGNvbnN0IHBvc3NpYmxlID0gbmV3IFNldDxzdHJpbmc+KClcblxuICBpZiAoXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIiBpbiBub3JtYWxpemVkRnNNYXApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShub3JtYWxpemVkRnNNYXBbXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIl0pXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5tYWluRW50cnlwb2ludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBwb3NzaWJsZS5hZGQobm9ybWFsaXplRmlsZVBhdGgoY29uZmlnLm1haW5FbnRyeXBvaW50KSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuXG4gIGlmIChub3JtYWxpemVkRnNNYXBbXCJpbmRleC50c3hcIl0pIHBvc3NpYmxlLmFkZChcImluZGV4LnRzeFwiKVxuICBpZiAobm9ybWFsaXplZEZzTWFwW1wiaW5kZXgudHNcIl0pIHBvc3NpYmxlLmFkZChcImluZGV4LnRzXCIpXG5cbiAgY29uc3QgY2lyY3VpdEZpbGVzID0gT2JqZWN0LmtleXMobm9ybWFsaXplZEZzTWFwKS5maWx0ZXIoKGspID0+XG4gICAgay5lbmRzV2l0aChcIi5jaXJjdWl0LnRzeFwiKSxcbiAgKVxuICBmb3IgKGNvbnN0IGZpbGUgb2YgY2lyY3VpdEZpbGVzKSB7XG4gICAgcG9zc2libGUuYWRkKGZpbGUpXG4gIH1cblxuICBjb25zdCB0c3hGaWxlcyA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWRGc01hcCkuZmlsdGVyKChrKSA9PlxuICAgIGsuZW5kc1dpdGgoXCIudHN4XCIpLFxuICApXG4gIGlmICh0c3hGaWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICBwb3NzaWJsZS5hZGQodHN4RmlsZXNbMF0pXG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShwb3NzaWJsZSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLG1CQUFtQjtBQUU1QixZQUFZLG1CQUFtQjtBQUMvQixZQUFZLFdBQVc7QUFDdkIsWUFBWSxxQkFBcUI7QUFDakMsWUFBWSx3QkFBd0I7OztBQ0E3QixJQUFNLGdDQUFnQyxDQUMzQyxtQkFDdUI7QUFFdkIsTUFBSSxRQUFRLGVBQWUsTUFBTSxnQkFBZ0I7QUFDakQsTUFBSSxNQUFPLFFBQU8sTUFBTSxDQUFDO0FBSXpCLFVBQVEsZUFBZTtBQUFBLElBQ3JCO0FBQUEsRUFDRjtBQUNBLE1BQUksTUFBTyxRQUFPLE1BQU0sQ0FBQztBQUV6QixTQUFPO0FBQ1Q7OztBQ2hCTyxJQUFNLHFDQUFxQyxDQUNoRCxzQkFDVztBQUNYLE1BQUksa0JBQWtCLFNBQVMsS0FBSyxHQUFHO0FBQ3JDLFdBQU8sa0JBQWtCLFFBQVEsUUFBUSxFQUFFO0FBQUEsRUFDN0M7QUFDQSxTQUFPO0FBQ1Q7OztBQ0pPLElBQU0sdUJBQXVCLENBQ2xDLGNBQ3VCO0FBQ3ZCLE1BQUksQ0FBQyxVQUFXLFFBQU87QUFFdkIsTUFBSSxVQUFVLFdBQVcsUUFBUSxHQUFHO0FBQ2xDLFVBQU0sb0JBQW9CLDhCQUE4QixTQUFTO0FBQ2pFLFFBQUksbUJBQW1CO0FBQ3JCLGFBQU8sbUNBQW1DLGlCQUFpQjtBQUFBLElBQzdEO0FBR0EsV0FBTztBQUFBLEVBQ1Q7QUFHQSxTQUFPLG1DQUFtQyxTQUFTO0FBQ3JEOzs7QUNyQk8sSUFBTSxRQUFRLG9CQUFJ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QUFDMUQsTUFBSSxnQkFBZ0IsVUFBVSxFQUFHLFVBQVMsSUFBSSxVQUFVO0FBRXhELFFBQU0sZUFBZSxPQUFPLEtBQUssZUFBZSxFQUFFO0FBQUEsSUFBTyxDQUFDLE1BQ3hELEVBQUUsU0FBUyxjQUFjO0FBQUEsRUFDM0I7QUFDQSxhQUFXLFFBQVEsY0FBYztBQUMvQixhQUFTLElBQUksSUFBSTtBQUFBLEVBQ25CO0FBRUEsUUFBTSxXQUFXLE9BQU8sS0FBSyxlQUFlLEVBQUU7QUFBQSxJQUFPLENBQUMsTUFDcEQsRUFBRSxTQUFTLE1BQU07QUFBQSxFQUNuQjtBQUNBLE1BQUksU0FBUyxXQUFXLEdBQUc7QUFDekIsYUFBUyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0FBQUEsRUFDMUI7QUFFQSxTQUFPLE1BQU0sS0FBSyxRQUFRO0FBQzVCOyIsCiAgIm5hbWVzIjogWyJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJpbXBvcnROYW1lIiwgIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgInVucHJlZml4ZWRQYXRoIiwgIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIl0KfQo=
2050
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbGliL2V2YWwvZXhlY3V0aW9uLWNvbnRleHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1qbGMtcGFja2FnZS1mcm9tLWZvb3RwcmludGVyLXN0cmluZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2psYy1wYXJ0cy1lbmdpbmUudHMiLCAiLi4vLi4vbGliL2dldFBsYXRmb3JtQ29uZmlnLnRzIiwgIi4uLy4uL2xpYi91dGlscy9keW5hbWljYWxseS1sb2FkLWRlcGVuZGVuY3ktd2l0aC1jZG4tYmFja3VwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvbm9ybWFsaXplRnNNYXAudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci90c2NvbmZpZ1BhdGhzLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcmVzb2x2ZUZpbGVQYXRoLnRzIiwgIi4uLy4uL2xpYi91dGlscy9nZXQtaW1wb3J0cy1mcm9tLWNvZGUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vbGliL2V2YWwvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbG9jYWwtZmlsZS50cyIsICIuLi8uLi9saWIvc2hhcmVkL3N0YXRpYy1hc3NldC1leHRlbnNpb25zLnRzIiwgIi4uLy4uL2xpYi90cmFuc3BpbGUvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtc25pcHBldC50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vbGliL2V2YWwvZXh0cmFjdEJhc2VQYWNrYWdlTmFtZS50cyIsICIuLi8uLi9saWIvZXZhbC9pc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24udHMiLCAiLi4vLi4vbGliL2V2YWwvZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeS50cyIsICIuLi8uLi9saWIvZXZhbC9nZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQudHMiLCAiLi4vLi4vbGliL2V2YWwvaXNUeXBlU2NyaXB0RW50cnlwb2ludC50cyIsICIuLi8uLi9saWIvZXZhbC9pc0Rpc3REaXJFbXB0eS50cyIsICIuLi8uLi9saWIvZXZhbC9pbXBvcnQtbnBtLXBhY2thZ2UtZnJvbS1jZG4udHMiLCAiLi4vLi4vbGliL2V2YWwvaW1wb3J0LWV2YWwtcGF0aC50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3J1bm5lci9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQudHMiLCAiLi4vLi4vbGliL3V0aWxzL2VuaGFuY2Utcm9vdC1jaXJjdWl0LWVycm9yLnRzIiwgIi4uLy4uL2xpYi9zaGFyZWQvb2JqLXBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9ydW5Uc2NpcmN1aXRDb2RlLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0TW9kdWxlLnRzIiwgIi4uLy4uL2xpYi93b3JrZXIudHMiLCAiLi4vLi4vbGliL2dldFBvc3NpYmxlRW50cnlwb2ludENvbXBvbmVudFBhdGhzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBSb290Q2lyY3VpdCB9IGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0IHR5cGUgeyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIH0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0ICogYXMgdHNjaXJjdWl0Q29yZSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgKiBhcyBSZWFjdEpzeFJ1bnRpbWUgZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdE1hdGhVdGlscyBmcm9tIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBnZXRQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJsaWIvZ2V0UGxhdGZvcm1Db25maWdcIlxuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZyB9IGZyb20gXCJsaWIvcnVubmVyL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0ICogYXMgdHNsaWIgZnJvbSBcInRzbGliXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmV4ZWN1dGlvbi1jb250ZXh0XCIpXG5cbmludGVyZmFjZSBTdG9yZWRMb2dnZXIge1xuICBpbmZvOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkXG4gIGdldExvZ3M6ICgpID0+IEFycmF5PHsgbXNnOiBzdHJpbmcgfT5cbiAgc3RyaW5naWZ5TG9nczogKCkgPT4gc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uQ29udGV4dCBleHRlbmRzIFdlYldvcmtlckNvbmZpZ3VyYXRpb24ge1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBlbnRyeXBvaW50OiBzdHJpbmdcbiAgcHJlU3VwcGxpZWRJbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIGNpcmN1aXQ6IFJvb3RDaXJjdWl0XG4gIGxvZ2dlcjogU3RvcmVkTG9nZ2VyXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbiAgaW1wb3J0U3RhY2s6IHN0cmluZ1tdXG4gIGN1cnJlbnRseUltcG9ydGluZzogU2V0PHN0cmluZz5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gIHdlYldvcmtlckNvbmZpZ3VyYXRpb246IFdlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIG9wdHM6IHtcbiAgICBuYW1lPzogc3RyaW5nXG4gICAgcGxhdGZvcm0/OiBQbGF0Zm9ybUNvbmZpZ1xuICAgIHByb2plY3RDb25maWc/OiBQYXJ0aWFsPFBsYXRmb3JtQ29uZmlnPlxuICAgIGRlYnVnTmFtZXNwYWNlPzogc3RyaW5nXG4gIH0gPSB7fSxcbik6IEV4ZWN1dGlvbkNvbnRleHQge1xuICBnbG9iYWxUaGlzLlJlYWN0ID0gUmVhY3RcblxuICBjb25zdCBiYXNlUGxhdGZvcm0gPSBvcHRzLnBsYXRmb3JtIHx8IGdldFBsYXRmb3JtQ29uZmlnKClcbiAgY29uc3QgcGxhdGZvcm0gPSBvcHRzLnByb2plY3RDb25maWdcbiAgICA/IHsgLi4uYmFzZVBsYXRmb3JtLCAuLi5vcHRzLnByb2plY3RDb25maWcgfVxuICAgIDogYmFzZVBsYXRmb3JtXG5cbiAgaWYgKHBsYXRmb3JtLnBhcnRzRW5naW5lRGlzYWJsZWQpIHtcbiAgICBwbGF0Zm9ybS5wYXJ0c0VuZ2luZSA9IHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgY2lyY3VpdCA9IG5ldyBSb290Q2lyY3VpdCh7XG4gICAgcGxhdGZvcm0sXG4gIH0pXG5cbiAgaWYgKG9wdHMubmFtZSkge1xuICAgIGNpcmN1aXQubmFtZSA9IG9wdHMubmFtZVxuICB9XG5cbiAgaWYgKG9wdHMuZGVidWdOYW1lc3BhY2UpIHtcbiAgICBjaXJjdWl0LmVuYWJsZURlYnVnKG9wdHMuZGVidWdOYW1lc3BhY2UpXG4gIH1cblxuICBjb25zdCBsb2dzOiBBcnJheTx7IG1zZzogc3RyaW5nIH0+ID0gW11cblxuICByZXR1cm4ge1xuICAgIGZzTWFwOiB7fSxcbiAgICBlbnRyeXBvaW50OiBcIlwiLFxuICAgIGxvZ2dlcjoge1xuICAgICAgaW5mbzogKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgICAgICBsb2dzLnB1c2goeyBtc2c6IG1lc3NhZ2UgfSlcbiAgICAgIH0sXG4gICAgICBnZXRMb2dzOiAoKSA9PiBsb2dzLFxuICAgICAgc3RyaW5naWZ5TG9nczogKCkgPT4gbG9ncy5tYXAoKGxvZykgPT4gbG9nLm1zZykuam9pbihcIlxcblwiKSxcbiAgICB9LFxuICAgIHByZVN1cHBsaWVkSW1wb3J0czoge1xuICAgICAgXCJAdHNjaXJjdWl0L2NvcmVcIjogdHNjaXJjdWl0Q29yZSxcbiAgICAgIHRzY2lyY3VpdDogdHNjaXJjdWl0Q29yZSxcbiAgICAgIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCI6IHRzY2lyY3VpdE1hdGhVdGlscyxcbiAgICAgIHJlYWN0OiBSZWFjdCxcbiAgICAgIFwicmVhY3QvanN4LXJ1bnRpbWVcIjogUmVhY3RKc3hSdW50aW1lLFxuICAgICAgZGVidWc6IERlYnVnLFxuICAgICAgdHNsaWIsXG5cbiAgICAgIC8vIFRoaXMgaXMgdXN1YWxseSB1c2VkIGFzIGEgdHlwZSBpbXBvcnQsIHdlIGNhbiByZW1vdmUgdGhlIHNoaW0gd2hlbiB3ZVxuICAgICAgLy8gaWdub3JlIHR5cGUgaW1wb3J0cyBpbiBnZXRJbXBvcnRzRnJvbUNvZGVcbiAgICAgIFwiQHRzY2lyY3VpdC9wcm9wc1wiOiB7fSxcbiAgICB9LFxuICAgIGNpcmN1aXQsXG4gICAgdHNDb25maWc6IG51bGwsXG4gICAgaW1wb3J0U3RhY2s6IFtdLFxuICAgIGN1cnJlbnRseUltcG9ydGluZzogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgLi4ud2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgfVxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIEtpQ2FkIGZvb3RwcmludCBzdHJpbmcgaW50byBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqIEZvciBub3csIHRoaXMgaXMgYSBzaW1wbGlmaWVkIGNvbnZlcnNpb24gdG8gYSBzdGFuZGFyZCBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwia2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljXCIgLT4gXCIwNjAzXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkID0gKFxuICBraWNhZEZvb3RwcmludDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8ga2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljIC0+IDA2MDNcbiAgbGV0IG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goLzpbUkNdXyhcXGR7NH0pXy8pXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgLy8ga2ljYWQ6UGFja2FnZV9TTzpTT0lDLThfMy45eDQuOW1tX1AxLjI3bW0gLT4gU09JQy04XG4gIC8vIGtpY2FkOlBhY2thZ2VfVE9fU09UX1NNRDpTT1QtMjMgLT4gU09ULTIzXG4gIG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goXG4gICAgLzooU09JQy1cXGQrfFNPVC1cXGQrfFNPRC1cXGQrfFNTT1AtXFxkK3xUU1NPUC1cXGQrfFFGUC1cXGQrfFFGTi1cXGQrKS8sXG4gIClcbiAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCAiLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiIGludG8gYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwiY2FwMDYwM1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nID0gKFxuICBmb290cHJpbnRlclN0cmluZzogc3RyaW5nLFxuKTogc3RyaW5nID0+IHtcbiAgaWYgKGZvb3RwcmludGVyU3RyaW5nLmluY2x1ZGVzKFwiY2FwXCIpKSB7XG4gICAgcmV0dXJuIGZvb3RwcmludGVyU3RyaW5nLnJlcGxhY2UoL2NhcC9nLCBcIlwiKVxuICB9XG4gIHJldHVybiBmb290cHJpbnRlclN0cmluZ1xufVxuIiwgImltcG9ydCB7IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkIH0gZnJvbSBcIi4vZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkXCJcbmltcG9ydCB7IGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcgfSBmcm9tIFwiLi9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmdcIlxuXG4vKipcbiAqIEdldCBhIEpMQy1jb21wYXRpYmxlIHBhY2thZ2UgbmFtZSBmcm9tIGEgZm9vdHByaW50IHN0cmluZywgd2hpY2ggY291bGQgYmVcbiAqIGEgS2lDYWQgZm9vdHByaW50IG9yIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiLlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjcGNiUGFja2FnZU5hbWUgPSAoXG4gIGZvb3RwcmludDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFmb290cHJpbnQpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoZm9vdHByaW50LnN0YXJ0c1dpdGgoXCJraWNhZDpcIikpIHtcbiAgICBjb25zdCBmb290cHJpbnRlclN0cmluZyA9IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkKGZvb3RwcmludClcbiAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmcpIHtcbiAgICAgIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludGVyU3RyaW5nKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bi1tYXRjaGVkIEtpQ2FkIHN0cmluZ3NcbiAgICByZXR1cm4gZm9vdHByaW50XG4gIH1cblxuICAvLyBOb3QgYSBLaUNhZCBzdHJpbmcsIGFzc3VtZSBpdCdzIGEgZm9vdHByaW50ZXIgc3RyaW5nXG4gIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBhcnRzRW5naW5lLCBTdXBwbGllclBhcnROdW1iZXJzIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgZ2V0SmxjcGNiUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55PigpXG5cbmNvbnN0IGdldEpsY1BhcnRzQ2FjaGVkID0gYXN5bmMgKG5hbWU6IGFueSwgcGFyYW1zOiBhbnkpID0+IHtcbiAgY29uc3QgcGFyYW1TdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAuLi5wYXJhbXMsXG4gICAganNvbjogXCJ0cnVlXCIsXG4gIH0pLnRvU3RyaW5nKClcbiAgaWYgKGNhY2hlLmhhcyhwYXJhbVN0cmluZykpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KHBhcmFtU3RyaW5nKVxuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYGh0dHBzOi8vamxjc2VhcmNoLnRzY2lyY3VpdC5jb20vJHtuYW1lfS9saXN0PyR7cGFyYW1TdHJpbmd9YCxcbiAgKVxuICBjb25zdCByZXNwb25zZUpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgY2FjaGUuc2V0KHBhcmFtU3RyaW5nLCByZXNwb25zZUpzb24pXG4gIHJldHVybiByZXNwb25zZUpzb25cbn1cblxuY29uc3Qgd2l0aEJhc2ljUGFydFByZWZlcmVuY2UgPSAocGFydHM6IGFueVtdIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGlmICghcGFydHMpIHJldHVybiBbXVxuICByZXR1cm4gWy4uLnBhcnRzXS5zb3J0KFxuICAgIChhLCBiKSA9PiBOdW1iZXIoYi5pc19iYXNpYyA/PyBmYWxzZSkgLSBOdW1iZXIoYS5pc19iYXNpYyA/PyBmYWxzZSksXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IGpsY1BhcnRzRW5naW5lOiBQYXJ0c0VuZ2luZSA9IHtcbiAgZmluZFBhcnQ6IGFzeW5jICh7XG4gICAgc291cmNlQ29tcG9uZW50LFxuICAgIGZvb3RwcmludGVyU3RyaW5nLFxuICB9KTogUHJvbWlzZTxTdXBwbGllclBhcnROdW1iZXJzPiA9PiB7XG4gICAgY29uc3QgamxjcGNiUGFja2FnZSA9IGdldEpsY3BjYlBhY2thZ2VOYW1lKGZvb3RwcmludGVyU3RyaW5nKVxuXG4gICAgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Jlc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzaXN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc2lzdG9yc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5yZXNpc3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNpc3RvcnMpXG4gICAgICAgICAgLm1hcCgocjogYW55KSA9PiBgQyR7ci5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2FwYWNpdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2FwYWNpdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjYXBhY2l0b3JzXCIsIHtcbiAgICAgICAgY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY2FwYWNpdG9ycylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9waW5faGVhZGVyXCJcbiAgICApIHtcbiAgICAgIGxldCBwaXRjaDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmc/LmluY2x1ZGVzKFwiX3BcIikpIHtcbiAgICAgICAgcGl0Y2ggPSBOdW1iZXIoZm9vdHByaW50ZXJTdHJpbmcuc3BsaXQoXCJfcFwiKVsxXSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXG4gICAgICAgIFwiaGVhZGVyc1wiLFxuICAgICAgICBwaXRjaFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShoZWFkZXJzKVxuICAgICAgICAgIC5tYXAoKGg6IGFueSkgPT4gYEMke2gubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3BvdGVudGlvbWV0ZXJcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3RlbnRpb21ldGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJwb3RlbnRpb21ldGVyc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5tYXhfcmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvdGVudGlvbWV0ZXJzKVxuICAgICAgICAgIC5tYXAoKHA6IGFueSkgPT4gYEMke3AubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Rpb2RlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgZGlvZGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImRpb2Rlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShkaW9kZXMpXG4gICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBgQyR7ZC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2hpcFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNoaXBzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNoaXBzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNoaXBzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3RyYW5zaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyB0cmFuc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJ0cmFuc2lzdG9yc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIHRyYW5zaXN0b3JfdHlwZTogc291cmNlQ29tcG9uZW50LnRyYW5zaXN0b3JfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHRyYW5zaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHQ6IGFueSkgPT4gYEMke3QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Bvd2VyX3NvdXJjZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHBvd2VyX3NvdXJjZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG93ZXJfc291cmNlc1wiLCB7XG4gICAgICAgIHZvbHRhZ2U6IHNvdXJjZUNvbXBvbmVudC52b2x0YWdlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocG93ZXJfc291cmNlcylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9pbmR1Y3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGluZHVjdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJpbmR1Y3RvcnNcIiwge1xuICAgICAgICBpbmR1Y3RhbmNlOiBzb3VyY2VDb21wb25lbnQuaW5kdWN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGluZHVjdG9ycylcbiAgICAgICAgICAubWFwKChpOiBhbnkpID0+IGBDJHtpLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jcnlzdGFsXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY3J5c3RhbHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY3J5c3RhbHNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIGxvYWRfY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5sb2FkX2NhcGFjaXRhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY3J5c3RhbHMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbW9zZmV0XCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbW9zZmV0cyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJtb3NmZXRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgICAgbW9zZmV0X21vZGU6IHNvdXJjZUNvbXBvbmVudC5tb3NmZXRfbW9kZSxcbiAgICAgICAgY2hhbm5lbF90eXBlOiBzb3VyY2VDb21wb25lbnQuY2hhbm5lbF90eXBlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UobW9zZmV0cylcbiAgICAgICAgICAubWFwKChtOiBhbnkpID0+IGBDJHttLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNvbmF0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNvbmF0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc29uYXRvcnNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNvbmF0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3N3aXRjaFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHN3aXRjaGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInN3aXRjaGVzXCIsIHtcbiAgICAgICAgc3dpdGNoX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50eXBlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2Uoc3dpdGNoZXMpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBgQyR7cy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbGVkXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbGVkcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJsZWRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGxlZHMpXG4gICAgICAgICAgLm1hcCgobDogYW55KSA9PiBgQyR7bC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfZnVzZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGZ1c2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImZ1c2VzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGZ1c2VzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9XG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZywgU3BpY2VFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBqbGNQYXJ0c0VuZ2luZSB9IGZyb20gXCJAdHNjaXJjdWl0L3BhcnRzLWVuZ2luZVwiXG5pbXBvcnQgeyBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbiB9IGZyb20gXCJraWNhZC1jb21wb25lbnQtY29udmVydGVyXCJcbmltcG9ydCB7IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwIH0gZnJvbSBcIi4vdXRpbHMvZHluYW1pY2FsbHktbG9hZC1kZXBlbmRlbmN5LXdpdGgtY2RuLWJhY2t1cFwiXG5jb25zdCBLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMID0gXCJodHRwczovL2tpY2FkLW1vZC1jYWNoZS50c2NpcmN1aXQuY29tXCJcblxubGV0IG5nc3BpY2VFbmdpbmVDYWNoZTogU3BpY2VFbmdpbmUgfCBudWxsID0gbnVsbFxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1Db25maWcgPSAoKTogUGxhdGZvcm1Db25maWcgPT4gKHtcbiAgcGFydHNFbmdpbmU6IGpsY1BhcnRzRW5naW5lLFxuICBzcGljZUVuZ2luZU1hcDoge1xuICAgIG5nc3BpY2U6IHtcbiAgICAgIHNpbXVsYXRlOiBhc3luYyAoc3BpY2U6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIW5nc3BpY2VFbmdpbmVDYWNoZSkge1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSA9XG4gICAgICAgICAgICBhd2FpdCBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cChcbiAgICAgICAgICAgICAgXCJAdHNjaXJjdWl0L25nc3BpY2Utc3BpY2UtZW5naW5lXCIsXG4gICAgICAgICAgICApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb3VsZCBub3QgbG9hZCBuZ3NwaWNlIGVuZ2luZSBmcm9tIGxvY2FsIG5vZGVfbW9kdWxlcyBvciBDRE4gZmFsbGJhY2suXCIsXG4gICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUpIHtcbiAgICAgICAgICAgIG5nc3BpY2VFbmdpbmVDYWNoZSA9IGF3YWl0IGNyZWF0ZU5nc3BpY2VTcGljZUVuZ2luZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZ3NwaWNlRW5naW5lQ2FjaGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBsb2FkIG5nc3BpY2UgZW5naW5lIGZyb20gbG9jYWwgbm9kZV9tb2R1bGVzIG9yIENETiBmYWxsYmFjay5cIixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmdzcGljZUVuZ2luZUNhY2hlLnNpbXVsYXRlKHNwaWNlKVxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRMaWJyYXJ5TWFwOiB7XG4gICAga2ljYWQ6IGFzeW5jIChmb290cHJpbnROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMfS8ke2Zvb3RwcmludE5hbWV9YFxuICAgICAgY29uc3QgY2lyY3VpdEpzb25VcmwgPSBgJHtiYXNlVXJsfS5jaXJjdWl0Lmpzb25gXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjaXJjdWl0SnNvblVybClcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgIC8vIEZpbHRlciBwY2Jfc2lsa3NjcmVlbl90ZXh0IHRvIG9ubHkga2VlcCBlbnRyaWVzIHdpdGggdGV4dCA9PT0gXCJSRUYqKlwiXG4gICAgICAvLyBBcHBseSBmaWx0ZXJpbmcgb25seSB0byBlbGVtZW50cyBjb21pbmcgZnJvbSB0aGUga2ljYWRfbW9kX3NlcnZlciByZXNwb25zZVxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBBcnJheS5pc0FycmF5KHJhdylcbiAgICAgICAgPyByYXcuZmlsdGVyKChlbCkgPT5cbiAgICAgICAgICAgIGVsPy50eXBlID09PSBcInBjYl9zaWxrc2NyZWVuX3RleHRcIiA/IGVsPy50ZXh0ID09PSBcIlJFRioqXCIgOiB0cnVlLFxuICAgICAgICAgIClcbiAgICAgICAgOiByYXdcbiAgICAgIGNvbnN0IHdybFVybCA9IGAke2Jhc2VVcmx9LndybGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBmaWx0ZXJlZCxcbiAgICAgICAgY2FkTW9kZWw6IHsgd3JsVXJsLCBtb2RlbFVuaXRUb01tU2NhbGU6IDIuNTQgfSxcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRGaWxlUGFyc2VyTWFwOiB7XG4gICAga2ljYWRfbW9kOiB7XG4gICAgICBsb2FkRnJvbVVybDogYXN5bmMgKHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpY2FkQ29udGVudCA9IGF3YWl0IGZldGNoKHVybCkudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgICAgICBjb25zdCBraWNhZEpzb24gPSBhd2FpdCBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbihraWNhZENvbnRlbnQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9vdHByaW50Q2lyY3VpdEpzb246IEFycmF5LmlzQXJyYXkoa2ljYWRKc29uKVxuICAgICAgICAgICAgPyBraWNhZEpzb25cbiAgICAgICAgICAgIDogW2tpY2FkSnNvbl0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pXG4iLCAiZXhwb3J0IGNvbnN0IGR5bmFtaWNhbGx5TG9hZERlcGVuZGVuY3lXaXRoQ2RuQmFja3VwID0gYXN5bmMgKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBGaXJzdCwgdHJ5IHRvIGltcG9ydCB1c2luZyBOb2RlLmpzIHJlc29sdXRpb25cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQocGFja2FnZU5hbWUpXG4gICAgcmV0dXJuIG1vZHVsZS5kZWZhdWx0XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGxvYWQgJHtwYWNrYWdlTmFtZX0gbG9jYWxseSwgdHJ5aW5nIENETiBmYWxsYmFjay4uLmApXG4gICAgLy8gRmFsbGJhY2sgdG8gSnNEZWxpdnIgQ0ROIGZvciBicm93c2VyIGVudmlyb25tZW50c1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtwYWNrYWdlTmFtZX0vK2VzbWAsXG4gICAgICApXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCAke3BhY2thZ2VOYW1lfSBmcm9tIENETjogJHtyZXMuc3RhdHVzVGV4dH1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjb25zdCBjb2RlID0gYXdhaXQgcmVzLnRleHQoKVxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb2RlXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiB9KVxuICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0OiBsb2FkZWRNb2R1bGUgfSA9IGF3YWl0IGltcG9ydCh1cmwpXG4gICAgICAgIHJldHVybiBsb2FkZWRNb2R1bGVcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNkbkVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBDRE4gZmFsbGJhY2sgZm9yICR7cGFja2FnZU5hbWV9IGFsc28gZmFpbGVkOmAsIGNkbkVycm9yKVxuICAgICAgdGhyb3cgY2RuRXJyb3JcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZykge1xuICBsZXQgbm9ybUZpbGVQYXRoID0gZmlsZVBhdGhcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC50cmltKClcbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMilcbiAgfVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDEpXG4gIH1cbiAgcmV0dXJuIG5vcm1GaWxlUGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRnNNYXAoZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbZnNQYXRoLCBmaWxlQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKGZzUGF0aCldID0gZmlsZUNvbnRlbnRcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZEZzTWFwXG59XG4iLCAiLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiBhIHBhdGgsIHNpbWlsYXIgdG8gTm9kZS5qcyBwYXRoLmRpcm5hbWVcbiAqIFdvcmtzIG9uIGJvdGggVW5peCBhbmQgV2luZG93cyBwYXRoc1xuICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gZXh0cmFjdCB0aGUgZGlyZWN0b3J5IGZyb21cbiAqIEByZXR1cm5zIFRoZSBkaXJlY3RvcnkgcGFydCBvZiB0aGUgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlybmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXBhdGgpIHJldHVybiBcIi5cIlxuXG4gIC8vIE5vcm1hbGl6ZSBwYXRoIHNlcGFyYXRvcnMgdG8gZm9yd2FyZCBzbGFzaGVzXG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuXG4gIC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzXG4gIGNvbnN0IGNsZWFuUGF0aCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL1xcLyskLywgXCJcIilcblxuICAvLyBJZiB0aGVyZSBhcmUgbm8gc2xhc2hlcywgcmV0dXJuIFwiLlwiXG4gIGlmIChjbGVhblBhdGguaW5kZXhPZihcIi9cIikgPT09IC0xKSByZXR1cm4gXCIuXCJcblxuICAvLyBSZXR1cm4gZXZlcnl0aGluZyB1cCB0byB0aGUgbGFzdCBzbGFzaFxuICByZXR1cm4gY2xlYW5QYXRoLnN1YnN0cmluZygwLCBjbGVhblBhdGgubGFzdEluZGV4T2YoXCIvXCIpKSB8fCBcIi9cIlxufVxuIiwgImltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwiLi9kaXJuYW1lXCJcblxuLyoqXG4gKiBSZXNvbHZlIGFuIGltcG9ydFBhdGggcmVsYXRpdmUgdG8gYSBjd2QsIHN1cHBvcnRpbmcgLi4vLCAuLyBhbmQgYWJzb2x1dGUgcGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGg6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCBwYXJlbnREaXIgPSBkaXJuYW1lKGN3ZClcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDMpLCBwYXJlbnREaXIpXG4gIH1cbiAgLy8gSGFuZGxlIGN1cnJlbnQgZGlyZWN0b3J5XG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMiksIGN3ZClcbiAgfVxuICAvLyBIYW5kbGUgYWJzb2x1dGUgcGF0aFxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHJldHVybiBpbXBvcnRQYXRoLnNsaWNlKDEpXG4gIH1cbiAgLy8gSGFuZGxlIHJlbGF0aXZlIHBhdGhcbiAgcmV0dXJuIGAke2N3ZH0vJHtpbXBvcnRQYXRofWBcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcblxuZXhwb3J0IHR5cGUgVHNDb25maWcgPSB7XG4gIGNvbXBpbGVyT3B0aW9ucz86IHtcbiAgICBiYXNlVXJsPzogc3RyaW5nXG4gICAgcGF0aHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG4gIH1cbiAgZXh0ZW5kcz86IHN0cmluZyB8IHN0cmluZ1tdXG4gIGZpbGVzPzogc3RyaW5nW11cbiAgcmVmZXJlbmNlcz86IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICBpbmNsdWRlPzogc3RyaW5nW11cbiAgZXhjbHVkZT86IHN0cmluZ1tdXG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzQ29uZmlnKFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4pOiBUc0NvbmZpZyB8IG51bGwge1xuICBpZiAoQXJyYXkuaXNBcnJheShmc01hcE9yQWxsRmlsZVBhdGhzKSkgcmV0dXJuIG51bGxcbiAgY29uc3QgdHNjb25maWdDb250ZW50ID0gZnNNYXBPckFsbEZpbGVQYXRoc1tcInRzY29uZmlnLmpzb25cIl1cbiAgaWYgKCF0c2NvbmZpZ0NvbnRlbnQpIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IHRzY29uZmlnQ29udGVudC5yZXBsYWNlKFxuICAgICAgL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98XFwvXFwvLiovZyxcbiAgICAgIFwiXCIsXG4gICAgKSAvLyByZW1vdmUgY29tbWVudHNcblxuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc2FuaXRpemVkQ29udGVudCkgYXMgVHNDb25maWdcbiAgICByZXR1cm4gcGFyc2VkXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIHRzY29uZmlnLmpzb246ICR7ZS5tZXNzYWdlfWApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoVHNjb25maWdQYXRocyhvcHRzOiB7XG4gIGltcG9ydFBhdGg6IHN0cmluZ1xuICBub3JtYWxpemVkRmlsZVBhdGhNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICB0c2NvbmZpZ0Rpcj86IHN0cmluZ1xufSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSA9IG9wdHNcbiAgY29uc3QgcGF0aHMgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5wYXRoc1xuICBpZiAoIXBhdGhzKSByZXR1cm4gbnVsbFxuICBjb25zdCBiYXNlVXJsID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybCB8fCBcIi5cIlxuXG4gIGNvbnN0IHRyeVJlc29sdmVDYW5kaWRhdGUgPSAoY2FuZGlkYXRlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkQ2FuZGlkYXRlID0gbm9ybWFsaXplRmlsZVBhdGgoY2FuZGlkYXRlKVxuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRDYW5kaWRhdGUpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkQ2FuZGlkYXRlKSFcbiAgICB9XG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3Qgd2l0aEV4dCA9IGAke25vcm1hbGl6ZWRDYW5kaWRhdGV9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHdpdGhFeHQpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHdpdGhFeHQpIVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGhzKSkge1xuICAgIC8vIFN1cHBvcnQgcGF0dGVybnMgbGlrZSBcIkBzcmMvKlwiIG9yIFwidXRpbHMvKlwiIGFuZCBhbHNvIGV4YWN0IG1hdGNoZXMgd2l0aG91dCBcIipcIlxuICAgIGNvbnN0IGhhc1dpbGRjYXJkID0gYWxpYXMuaW5jbHVkZXMoXCIqXCIpXG4gICAgaWYgKGhhc1dpbGRjYXJkKSB7XG4gICAgICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gYWxpYXMuc3BsaXQoXCIqXCIpXG4gICAgICBpZiAoXG4gICAgICAgICFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSB8fFxuICAgICAgICAhaW1wb3J0UGF0aC5lbmRzV2l0aChzdWZmaXggfHwgXCJcIilcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3Qgc3Rhck1hdGNoID0gaW1wb3J0UGF0aC5zbGljZShcbiAgICAgICAgcHJlZml4Lmxlbmd0aCxcbiAgICAgICAgaW1wb3J0UGF0aC5sZW5ndGggLSAoc3VmZml4ID8gc3VmZml4Lmxlbmd0aCA6IDApLFxuICAgICAgKVxuICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHRhcmdldC5yZXBsYWNlKFwiKlwiLCBzdGFyTWF0Y2gpXG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgICAgYmFzZVVybCAmJiAhcmVwbGFjZWQuc3RhcnRzV2l0aChcIi4vXCIpICYmICFyZXBsYWNlZC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgPyBgJHtiYXNlVXJsfS8ke3JlcGxhY2VkfWBcbiAgICAgICAgICAgIDogcmVwbGFjZWRcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlSZXNvbHZlQ2FuZGlkYXRlKGNhbmRpZGF0ZSlcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGltcG9ydFBhdGggIT09IGFsaWFzKSBjb250aW51ZVxuICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPVxuICAgICAgICAgIGJhc2VVcmwgJiYgIXRhcmdldC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXRhcmdldC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgPyBgJHtiYXNlVXJsfS8ke3RhcmdldH1gXG4gICAgICAgICAgICA6IHRhcmdldFxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHRyeVJlc29sdmVDYW5kaWRhdGUoY2FuZGlkYXRlKVxuICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkUGF0aEZyb21CYXNlVXJsID0gcmVzb2x2ZVdpdGhCYXNlVXJsKHtcbiAgICBpbXBvcnRQYXRoLFxuICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICBleHRlbnNpb25zLFxuICAgIHRzQ29uZmlnLFxuICAgIHRzY29uZmlnRGlyLFxuICB9KVxuXG4gIGlmIChyZXNvbHZlZFBhdGhGcm9tQmFzZVVybCkgcmV0dXJuIHJlc29sdmVkUGF0aEZyb21CYXNlVXJsXG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoQmFzZVVybChvcHRzOiB7XG4gIGltcG9ydFBhdGg6IHN0cmluZ1xuICBub3JtYWxpemVkRmlsZVBhdGhNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICB0c2NvbmZpZ0Rpcj86IHN0cmluZ1xufSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSA9IG9wdHNcbiAgY29uc3QgYmFzZVVybCA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmxcbiAgaWYgKCFiYXNlVXJsKSByZXR1cm4gbnVsbFxuXG4gIC8vIFJlc29sdmUgYmFzZVVybCByZWxhdGl2ZSB0byB0c2NvbmZpZyBsb2NhdGlvblxuICBjb25zdCBiYXNlRGlyID0gdHNjb25maWdEaXIgfHwgXCIuXCJcbiAgbGV0IGZpbGVQYXRoVG9SZXNvbHZlID0gYCR7YmFzZURpcn0vJHtiYXNlVXJsfS8ke2ltcG9ydFBhdGh9YFxuICAvLyBDbGVhbiB1cCBtdWx0aXBsZSBzbGFzaGVzIGFuZCBsZWFkaW5nIGRvdHNcbiAgZmlsZVBhdGhUb1Jlc29sdmUgPSBmaWxlUGF0aFRvUmVzb2x2ZS5yZXBsYWNlKC9cXC8rL2csIFwiL1wiKSAvLyBSZXBsYWNlIG11bHRpcGxlIHNsYXNoZXMgd2l0aCBzaW5nbGUgc2xhc2hcbiAgZmlsZVBhdGhUb1Jlc29sdmUgPSBmaWxlUGF0aFRvUmVzb2x2ZS5yZXBsYWNlKC9cXC9cXC5cXC8vZywgXCIvXCIpIC8vIFJlcGxhY2UgLy4vIHdpdGggL1xuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aFRvUmVzb2x2ZSlcblxuICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkRmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZEZpbGVQYXRoKSFcbiAgfVxuXG4gIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCB3aXRoRXh0ID0gYCR7bm9ybWFsaXplZEZpbGVQYXRofS4ke2V4dH1gXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMod2l0aEV4dCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHdpdGhFeHQpIVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybihcbiAgaW1wb3J0UGF0aDogc3RyaW5nLFxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIGZhbHNlXG5cbiAgZm9yIChjb25zdCBbYWxpYXNdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGhzKSkge1xuICAgIGNvbnN0IGhhc1dpbGRjYXJkID0gYWxpYXMuaW5jbHVkZXMoXCIqXCIpXG4gICAgaWYgKGhhc1dpbGRjYXJkKSB7XG4gICAgICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gYWxpYXMuc3BsaXQoXCIqXCIpXG4gICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgJiYgaW1wb3J0UGF0aC5lbmRzV2l0aChzdWZmaXggfHwgXCJcIikpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGltcG9ydFBhdGggPT09IGFsaWFzKSByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgcmVzb2x2ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZVJlbGF0aXZlUGF0aFwiXG5pbXBvcnQge1xuICByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMsXG4gIHR5cGUgVHNDb25maWcsXG4gIHJlc29sdmVXaXRoQmFzZVVybCxcbn0gZnJvbSBcIi4vdHNjb25maWdQYXRoc1wiXG5cbmNvbnN0IEZJTEVfRVhURU5TSU9OUyA9IFtcbiAgXCJ0c3hcIixcbiAgXCJ0c1wiLFxuICBcImpzb25cIixcbiAgXCJqc1wiLFxuICBcImpzeFwiLFxuICBcIm9ialwiLFxuICBcImdsdGZcIixcbiAgXCJnbGJcIixcbiAgXCJzdGxcIixcbiAgXCJzdGVwXCIsXG4gIFwic3RwXCIsXG5dXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGggPSAoXG4gIHVua25vd25GaWxlUGF0aDogc3RyaW5nLFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4gIGN3ZD86IHN0cmluZyxcbiAgb3B0czogeyB0c0NvbmZpZz86IFRzQ29uZmlnIHwgbnVsbDsgdHNjb25maWdEaXI/OiBzdHJpbmcgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHRzQ29uZmlnID0gb3B0cy50c0NvbmZpZyA/PyBudWxsXG4gIGNvbnN0IGlzUmVsYXRpdmVJbXBvcnQgPVxuICAgIHVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgfHwgdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIilcbiAgY29uc3QgaGFzQmFzZVVybCA9ICEhdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybFxuXG4gIC8vIEhhbmRsZSBwYXJlbnQgZGlyZWN0b3J5IG5hdmlnYXRpb24gcHJvcGVybHlcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID1cbiAgICBjd2QgJiYgKGlzUmVsYXRpdmVJbXBvcnQgfHwgIWhhc0Jhc2VVcmwpXG4gICAgICA/IHJlc29sdmVSZWxhdGl2ZVBhdGgodW5rbm93bkZpbGVQYXRoLCBjd2QpXG4gICAgICA6IHVua25vd25GaWxlUGF0aFxuXG4gIGNvbnN0IGZpbGVQYXRocyA9IG5ldyBTZXQoXG4gICAgQXJyYXkuaXNBcnJheShmc01hcE9yQWxsRmlsZVBhdGhzKVxuICAgICAgPyBmc01hcE9yQWxsRmlsZVBhdGhzXG4gICAgICA6IE9iamVjdC5rZXlzKGZzTWFwT3JBbGxGaWxlUGF0aHMpLFxuICApXG5cbiAgaWYgKGZpbGVQYXRocy5oYXMocmVzb2x2ZWRQYXRoKSkge1xuICAgIHJldHVybiByZXNvbHZlZFBhdGhcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAuc2V0KG5vcm1hbGl6ZUZpbGVQYXRoKGZpbGVQYXRoKSwgZmlsZVBhdGgpXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkUmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplRmlsZVBhdGgocmVzb2x2ZWRQYXRoKVxuXG4gIC8vIFdoZW4gYmFzZVVybCBpcyBzZXQsIG5vbi1yZWxhdGl2ZSBpbXBvcnRzIHNob3VsZCBnbyB0aHJvdWdoIGJhc2VVcmwgcmVzb2x1dGlvblxuICBpZiAoaXNSZWxhdGl2ZUltcG9ydCB8fCAhaGFzQmFzZVVybCkge1xuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGgpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSFcbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggZm9yIGZpbGUgd2l0aCBhIHNldCBvZiBkaWZmZXJlbnQgZXh0ZW5zaW9uc1xuICAgIGZvciAoY29uc3QgZXh0IG9mIEZJTEVfRVhURU5TSU9OUykge1xuICAgICAgY29uc3QgcG9zc2libGVGaWxlUGF0aCA9IGAke25vcm1hbGl6ZWRSZXNvbHZlZFBhdGh9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHBvc3NpYmxlRmlsZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgdXNpbmcgdHNjb25maWcgXCJwYXRoc1wiIG1hcHBpbmcgd2hlbiB0aGUgaW1wb3J0IGlzIG5vbi1yZWxhdGl2ZVxuICBpZiAoIWlzUmVsYXRpdmVJbXBvcnQpIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tUGF0aHMgPSByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMoe1xuICAgICAgaW1wb3J0UGF0aDogdW5rbm93bkZpbGVQYXRoLFxuICAgICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgICAgZXh0ZW5zaW9uczogRklMRV9FWFRFTlNJT05TLFxuICAgICAgdHNDb25maWcsXG4gICAgICB0c2NvbmZpZ0Rpcjogb3B0cy50c2NvbmZpZ0RpcixcbiAgICB9KVxuICAgIGlmIChyZXNvbHZlZFBhdGhGcm9tUGF0aHMpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tUGF0aHNcblxuICAgIGNvbnN0IHJlc29sdmVkUGF0aEZyb21CYXNlVXJsID0gcmVzb2x2ZVdpdGhCYXNlVXJsKHtcbiAgICAgIGltcG9ydFBhdGg6IHVua25vd25GaWxlUGF0aCxcbiAgICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICAgIGV4dGVuc2lvbnM6IEZJTEVfRVhURU5TSU9OUyxcbiAgICAgIHRzQ29uZmlnLFxuICAgICAgdHNjb25maWdEaXI6IG9wdHMudHNjb25maWdEaXIsXG4gICAgfSlcbiAgICBpZiAocmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tQmFzZVVybFxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBhbiBhYnNvbHV0ZSBpbXBvcnQgKG9ubHkgaWYgbm8gYmFzZVVybCBpcyBjb25maWd1cmVkIGluIHRzY29uZmlnKVxuICAvLyBXaGVuIGJhc2VVcmwgaXMgc2V0LCBpbXBvcnRzIHNob3VsZCByZXNvbHZlIHZpYSBiYXNlVXJsIG9yIGZhaWwsIG5vdCBmYWxsIGJhY2sgdG8gYWJzb2x1dGUgcGF0aHNcbiAgaWYgKCFpc1JlbGF0aXZlSW1wb3J0ICYmICFoYXNCYXNlVXJsKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFVua25vd25GaWxlUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHVua25vd25GaWxlUGF0aClcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkVW5rbm93bkZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIEZJTEVfRVhURU5TSU9OUykge1xuICAgICAgY29uc3QgcG9zc2libGVGaWxlUGF0aCA9IGAke25vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGh9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHBvc3NpYmxlRmlsZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGhPclRocm93ID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGw7IHRzY29uZmlnRGlyPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKFxuICAgIHVua25vd25GaWxlUGF0aCxcbiAgICBmc01hcE9yQWxsRmlsZVBhdGhzLFxuICAgIGN3ZCxcbiAgICBvcHRzLFxuICApXG4gIGlmICghcmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGaWxlIG5vdCBmb3VuZCBcIiR7dW5rbm93bkZpbGVQYXRofVwiLCBhdmFpbGFibGUgcGF0aHM6XFxuXFxuJHtPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKS5qb2luKFwiLCBcIil9YCxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkRmlsZVBhdGhcbn1cbiIsICJleHBvcnQgY29uc3QgZ2V0SW1wb3J0c0Zyb21Db2RlID0gKGNvZGU6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgLy8gTWF0Y2ggYmFzaWMgaW1wb3J0IHBhdHRlcm5zIGluY2x1ZGluZyBjb21iaW5lZCBkZWZhdWx0IGFuZCBuYW1lc3BhY2UgaW1wb3J0c1xuICBjb25zdCBpbXBvcnRSZWdleCA9XG4gICAgL15cXHMqaW1wb3J0XFxzKyg/Oig/OltcXHdcXHNdKyxcXHMqKT8oPzpcXCpcXHMrYXNcXHMrW1xcd1xcc10rfFxce1tcXHNcXHcsXStcXH18XFx3KylcXHMrZnJvbVxccyopP1snXCJdKC4rPylbJ1wiXS9nbVxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGZ1bGxNYXRjaCA9IG1hdGNoWzBdXG4gICAgaWYgKC9eXFxzKmltcG9ydFxccyt0eXBlXFxiLy50ZXN0KGZ1bGxNYXRjaCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGltcG9ydHMucHVzaChtYXRjaFsxXSlcbiAgfVxuXG4gIC8vIE1hdGNoIHJlLWV4cG9ydHNcbiAgY29uc3QgcmVFeHBvcnRSZWdleCA9XG4gICAgL15cXHMqZXhwb3J0XFxzKyg/OnR5cGVcXHMrKT8oPzpcXCpcXHMrYXNcXHMrW1xcdyRdK3xcXCp8XFx7W159XStcXH0pXFxzK2Zyb21cXHMqWydcIl0oLis/KVsnXCJdL2dtXG4gIGxldCByZUV4cG9ydE1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgocmVFeHBvcnRNYXRjaCA9IHJlRXhwb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBmdWxsTWF0Y2ggPSByZUV4cG9ydE1hdGNoWzBdXG4gICAgaWYgKC9eXFxzKmV4cG9ydFxccyt0eXBlXFxiLy50ZXN0KGZ1bGxNYXRjaCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGltcG9ydHMucHVzaChyZUV4cG9ydE1hdGNoWzFdKVxuICB9XG5cbiAgcmV0dXJuIGltcG9ydHNcbn1cbiIsICJpbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcIi4vZGlybmFtZVwiXG5cbnR5cGUgRXhwb3J0VmFsdWUgPSBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PlxuXG5pbnRlcmZhY2UgUGFja2FnZUpzb24ge1xuICBtYWluPzogc3RyaW5nXG4gIG1vZHVsZT86IHN0cmluZ1xuICBleHBvcnRzPzogUmVjb3JkPHN0cmluZywgRXhwb3J0VmFsdWU+XG59XG5cbmludGVyZmFjZSBOb2RlUmVzb2x1dGlvbkNvbnRleHQge1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBleHRlbnNpb25zOiBzdHJpbmdbXVxuICBiYXNlUGF0aDogc3RyaW5nXG4gIG1vZHVsZVBhdGg6IHN0cmluZ1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KFxuICBtb2R1bGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogTm9kZVJlc29sdXRpb25Db250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICBmc01hcCxcbiAgICBleHRlbnNpb25zOiBbXCIuanNcIiwgXCIuanN4XCIsIFwiLnRzXCIsIFwiLnRzeFwiLCBcIi5qc29uXCJdLFxuICAgIGJhc2VQYXRoLFxuICAgIG1vZHVsZVBhdGgsXG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uKG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLCBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCkge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9L3BhY2thZ2UuanNvbmBcbiAgaWYgKCFjdHguZnNNYXBbcGFja2FnZUpzb25QYXRoXSkgcmV0dXJuIG51bGxcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjdHguZnNNYXBbcGFja2FnZUpzb25QYXRoXSkgYXMgUGFja2FnZUpzb25cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoXG4gIHBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKGN0eC5mc01hcFtwYXRoXSkgcmV0dXJuIHBhdGhcblxuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IHBhdGhXaXRoRXh0ID0gcGF0aC5yZXBsYWNlKC9cXC5qcyR8XFwuanN4JC8sIFwiXCIpICsgZXh0XG4gICAgaWYgKGN0eC5mc01hcFtwYXRoV2l0aEV4dF0pIHJldHVybiBwYXRoV2l0aEV4dFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFeHBvcnRQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgZXhwb3J0UGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBmdWxsRXhwb3J0UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vJHtleHBvcnRQYXRoLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKX1gXG4gIHJldHVybiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbEV4cG9ydFBhdGgsIGN0eClcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KGV4cG9ydFZhbHVlOiBFeHBvcnRWYWx1ZSk6IHN0cmluZyB8IG51bGwge1xuICBpZiAodHlwZW9mIGV4cG9ydFZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGV4cG9ydFZhbHVlXG4gIH1cblxuICAvLyBIYW5kbGUgY29uZGl0aW9uYWwgZXhwb3J0cyAtIHRyeSBjb21tb24gY29uZGl0aW9ucyBpbiBvcmRlciBvZiBwcmVmZXJlbmNlXG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBbXCJpbXBvcnRcIiwgXCJkZWZhdWx0XCIsIFwicmVxdWlyZVwiLCBcIm5vZGVcIiwgXCJicm93c2VyXCJdXG4gIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcbiAgICBpZiAoZXhwb3J0VmFsdWVbY29uZGl0aW9uXSkge1xuICAgICAgY29uc3QgY29uZGl0aW9uVmFsdWUgPSBleHBvcnRWYWx1ZVtjb25kaXRpb25dXG4gICAgICBpZiAodHlwZW9mIGNvbmRpdGlvblZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBjb25kaXRpb25WYWx1ZVxuICAgICAgfVxuICAgICAgLy8gUmVjdXJzaXZlbHkgaGFuZGxlIG5lc3RlZCBjb25kaXRpb25zXG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVDb25kaXRpb25hbEV4cG9ydChjb25kaXRpb25WYWx1ZSlcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFeHBvcnRzKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICByZW1haW5pbmdQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghcGFja2FnZUpzb24uZXhwb3J0cykgcmV0dXJuIG51bGxcblxuICAvLyBIYW5kbGUgZGVmYXVsdCBleHBvcnQgY29uZGl0aW9uICh3aGVuIG5vIHN1YnBhdGgpXG4gIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBwYWNrYWdlSnNvbi5leHBvcnRzW1wiLlwiXVxuICBpZiAocmVtYWluaW5nUGF0aCA9PT0gXCJcIiAmJiBkZWZhdWx0RXhwb3J0KSB7XG4gICAgY29uc3QgZXhwb3J0UGF0aCA9IHJlc29sdmVDb25kaXRpb25hbEV4cG9ydChkZWZhdWx0RXhwb3J0KVxuICAgIGlmIChleHBvcnRQYXRoKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVFeHBvcnRQYXRoKG5vZGVNb2R1bGVzUGF0aCwgZXhwb3J0UGF0aCwgY3R4KVxuICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgc3VicGF0aCBleHBvcnRzXG4gIGNvbnN0IHN1YnBhdGhFeHBvcnQgPSByZW1haW5pbmdQYXRoXG4gICAgPyBwYWNrYWdlSnNvbi5leHBvcnRzW2AuLyR7cmVtYWluaW5nUGF0aH1gXVxuICAgIDogbnVsbFxuICBpZiAoc3VicGF0aEV4cG9ydCkge1xuICAgIGNvbnN0IGV4cG9ydFBhdGggPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoc3VicGF0aEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHRvcC1sZXZlbCBjb25kaXRpb25hbCBleHBvcnRzIChsZWdhY3kgZm9ybWF0KVxuICBjb25zdCBpbXBvcnRFeHBvcnQgPSBwYWNrYWdlSnNvbi5leHBvcnRzLmltcG9ydFxuICBpZiAocmVtYWluaW5nUGF0aCA9PT0gXCJcIiAmJiBpbXBvcnRFeHBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGV4cG9ydFBhdGggPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoaW1wb3J0RXhwb3J0KVxuICAgIGlmIChleHBvcnRQYXRoKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVFeHBvcnRQYXRoKG5vZGVNb2R1bGVzUGF0aCwgZXhwb3J0UGF0aCwgY3R4KVxuICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBwYWNrYWdlSnNvbi5tb2R1bGUgfHwgcGFja2FnZUpzb24ubWFpbiB8fCBcImluZGV4LmpzXCJcbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZW50cnlQb2ludH1gXG4gIHJldHVybiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbFBhdGgsIGN0eClcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVJlbWFpbmluZ1BhdGgoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICByZW1haW5pbmdQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghcmVtYWluaW5nUGF0aCkge1xuICAgIC8vIFRyeSBpbmRleCBmaWxlcyBpbiB0aGUgbW9kdWxlIHJvb3RcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3QgaW5kZXhQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9pbmRleCR7ZXh0fWBcbiAgICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7cmVtYWluaW5nUGF0aH1gXG4gIGNvbnN0IGRpcmVjdE1hdGNoID0gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG4gIGlmIChkaXJlY3RNYXRjaCkgcmV0dXJuIGRpcmVjdE1hdGNoXG5cbiAgLy8gVHJ5IGluZGV4IGZpbGVzXG4gIGZvciAoY29uc3QgZXh0IG9mIGN0eC5leHRlbnNpb25zKSB7XG4gICAgY29uc3QgaW5kZXhQYXRoID0gYCR7ZnVsbFBhdGh9L2luZGV4JHtleHR9YFxuICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKFxuICBzZWFyY2hQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IG1vZHVsZVBhcnRzID0gY3R4Lm1vZHVsZVBhdGguc3BsaXQoXCIvXCIpXG4gIGNvbnN0IHNjb3BlID0gbW9kdWxlUGFydHNbMF0uc3RhcnRzV2l0aChcIkBcIilcbiAgICA/IG1vZHVsZVBhcnRzLnNsaWNlKDAsIDIpLmpvaW4oXCIvXCIpXG4gICAgOiBtb2R1bGVQYXJ0c1swXVxuICBjb25zdCByZW1haW5pbmdQYXRoID0gbW9kdWxlUGFydHMuc2xpY2Uoc2NvcGUuaW5jbHVkZXMoXCIvXCIpID8gMiA6IDEpLmpvaW4oXCIvXCIpXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aCA9IGAke3NlYXJjaFBhdGggPT09IFwiLlwiID8gXCJcIiA6IGAke3NlYXJjaFBhdGh9L2B9bm9kZV9tb2R1bGVzLyR7c2NvcGV9YFxuXG4gIC8vIFRyeSB0byBmaW5kIHBhY2thZ2UuanNvblxuICBjb25zdCBwYWNrYWdlSnNvbiA9IGZpbmRQYWNrYWdlSnNvbihub2RlTW9kdWxlc1BhdGgsIGN0eClcbiAgaWYgKHBhY2thZ2VKc29uKSB7XG4gICAgLy8gVHJ5IHJlc29sdmluZyB0aHJvdWdoIGV4cG9ydHMgZmllbGRcbiAgICBjb25zdCBleHBvcnRzUmVzb2x1dGlvbiA9IHJlc29sdmVQYWNrYWdlRXhwb3J0cyhcbiAgICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgcmVtYWluaW5nUGF0aCxcbiAgICAgIGN0eCxcbiAgICApXG4gICAgaWYgKGV4cG9ydHNSZXNvbHV0aW9uKSByZXR1cm4gZXhwb3J0c1Jlc29sdXRpb25cblxuICAgIC8vIFRyeSByZXNvbHZpbmcgdGhyb3VnaCBtYWluL21vZHVsZSBmaWVsZHNcbiAgICBjb25zdCBlbnRyeVBvaW50UmVzb2x1dGlvbiA9IHJlc29sdmVQYWNrYWdlRW50cnlQb2ludChcbiAgICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgY3R4LFxuICAgIClcbiAgICBpZiAoZW50cnlQb2ludFJlc29sdXRpb24pIHJldHVybiBlbnRyeVBvaW50UmVzb2x1dGlvblxuICB9XG5cbiAgLy8gVHJ5IHJlc29sdmluZyByZW1haW5pbmcgcGF0aFxuICBjb25zdCByZW1haW5pbmdQYXRoUmVzb2x1dGlvbiA9IHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICByZW1haW5pbmdQYXRoLFxuICAgIGN0eCxcbiAgKVxuICBpZiAocmVtYWluaW5nUGF0aFJlc29sdXRpb24pIHJldHVybiByZW1haW5pbmdQYXRoUmVzb2x1dGlvblxuXG4gIC8vIElmIG5vdCBmb3VuZCBhbmQgd2UgaGF2ZSBhIHBhcmVudCBkaXJlY3RvcnksIHRyeSB0aGVyZVxuICBjb25zdCBwYXJlbnRQYXRoID0gZGlybmFtZShzZWFyY2hQYXRoKVxuICBpZiAocGFyZW50UGF0aCAmJiBwYXJlbnRQYXRoICE9PSBzZWFyY2hQYXRoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKHBhcmVudFBhdGgsIGN0eClcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZShcbiAgbW9kdWxlUGF0aDogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBjdHggPSBjcmVhdGVDb250ZXh0KG1vZHVsZVBhdGgsIGZzTWFwLCBiYXNlUGF0aClcbiAgcmV0dXJuIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKGN0eC5iYXNlUGF0aCwgY3R4KVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBldmFsQ29tcGlsZWRKcyhcbiAgY29tcGlsZWRDb2RlOiBzdHJpbmcsXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PixcbiAgY3dkPzogc3RyaW5nLFxuKSB7XG4gIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X3JlcXVpcmUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgbGV0IHJlc29sdmVkRmlsZVBhdGggPSByZXNvbHZlRmlsZVBhdGgobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QpXG5cbiAgICBpZiAoIXJlc29sdmVkRmlsZVBhdGggJiYgIW5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiYgIW5hbWUuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgIHJlc29sdmVkRmlsZVBhdGggPSByZXNvbHZlTm9kZU1vZHVsZShuYW1lLCBwcmVTdXBwbGllZEltcG9ydHMsIGN3ZCB8fCBcIlwiKVxuICAgIH1cblxuICAgIGNvbnN0IGhhc1Jlc29sdmVkRmlsZVBhdGggPVxuICAgICAgcmVzb2x2ZWRGaWxlUGF0aCAmJiBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRGaWxlUGF0aF1cblxuICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW25hbWVdICYmICFoYXNSZXNvbHZlZEZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEltcG9ydCBcIiR7bmFtZX1cIiBub3QgZm91bmQgJHtjd2QgPyBgaW4gXCIke2N3ZH1cImAgOiBcIlwifWApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kID1cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSB8fCBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRGaWxlUGF0aCFdXG4gICAgcmV0dXJuIG5ldyBQcm94eShtb2QsIHtcbiAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKCEocHJvcCBpbiB0YXJnZXQpKSB7XG4gICAgICAgICAgaWYgKHByb3AgPT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmRlZmF1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhcmdldC5fX2VzTW9kdWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0YXJnZXRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcm9wID09PSBcIl9fZXNNb2R1bGVcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ29tcG9uZW50IFwiJHtTdHJpbmcocHJvcCl9XCIgaXMgbm90IGV4cG9ydGVkIGJ5IFwiJHtuYW1lfVwiYCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3AgYXMga2V5b2YgdHlwZW9mIHRhcmdldF1cbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGZ1bmN0aW9uQm9keSA9IGBcbiAgdmFyIGV4cG9ydHMgPSB7fTtcbiAgdmFyIHJlcXVpcmUgPSBnbG9iYWxUaGlzLl9fdHNjaXJjdWl0X3JlcXVpcmU7XG4gIHZhciBtb2R1bGUgPSB7IGV4cG9ydHMgfTtcbiAgdmFyIGNpcmN1aXQgPSBnbG9iYWxUaGlzLl9fdHNjaXJjdWl0X2NpcmN1aXQ7XG4gICR7Y29tcGlsZWRDb2RlfTtcbiAgcmV0dXJuIG1vZHVsZTtgLnRyaW0oKVxuICByZXR1cm4gRnVuY3Rpb24oZnVuY3Rpb25Cb2R5KS5jYWxsKGdsb2JhbFRoaXMpXG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcImxpYi91dGlscy9kaXJuYW1lXCJcbmltcG9ydCB7IGdldEltcG9ydHNGcm9tQ29kZSB9IGZyb20gXCJsaWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlXCJcbmltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCIuL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBpc1N0YXRpY0Fzc2V0UGF0aCB9IGZyb20gXCJsaWIvc2hhcmVkL3N0YXRpYy1hc3NldC1leHRlbnNpb25zXCJcbmltcG9ydCB7IHRyYW5zZm9ybVdpdGhTdWNyYXNlIH0gZnJvbSBcImxpYi90cmFuc3BpbGUvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZVwiXG5pbXBvcnQgeyBLaWNhZFRvQ2lyY3VpdEpzb25Db252ZXJ0ZXIgfSBmcm9tIFwia2ljYWQtdG8tY2lyY3VpdC1qc29uXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtbG9jYWwtZmlsZVwiKVxuXG5leHBvcnQgY29uc3QgaW1wb3J0TG9jYWxGaWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGRlYnVnKFwiaW1wb3J0TG9jYWxGaWxlIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgaW1wb3J0TmFtZSxcbiAgfSlcblxuICBjb25zdCB7IGZzTWFwLCBwcmVTdXBwbGllZEltcG9ydHMsIGltcG9ydFN0YWNrLCBjdXJyZW50bHlJbXBvcnRpbmcgfSA9IGN0eFxuXG4gIGNvbnN0IGZzUGF0aCA9IHJlc29sdmVGaWxlUGF0aE9yVGhyb3coaW1wb3J0TmFtZSwgZnNNYXAsIHVuZGVmaW5lZCwge1xuICAgIHRzQ29uZmlnOiBjdHgudHNDb25maWcsXG4gIH0pXG4gIGRlYnVnKFwiZnNQYXRoOlwiLCBmc1BhdGgpXG4gIGlmIChjdXJyZW50bHlJbXBvcnRpbmcuaGFzKGZzUGF0aCkpIHtcbiAgICBjb25zdCBjeWNsZVN0YXJ0SW5kZXggPSBpbXBvcnRTdGFjay5pbmRleE9mKGZzUGF0aClcbiAgICBjb25zdCBjeWNsZVBhdGggPVxuICAgICAgY3ljbGVTdGFydEluZGV4ID49IDBcbiAgICAgICAgPyBpbXBvcnRTdGFjay5zbGljZShjeWNsZVN0YXJ0SW5kZXgpLmNvbmNhdChmc1BhdGgpXG4gICAgICAgIDogWy4uLmltcG9ydFN0YWNrLCBmc1BhdGhdXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgd2hpbGUgaW1wb3J0aW5nIFwiJHtmc1BhdGh9XCIuIFRoZSBmb2xsb3dpbmcgaW1wb3J0IGNoYWluIGZvcm1zIGEgY3ljbGU6XFxuXFxuJHtjeWNsZVBhdGguam9pbihcbiAgICAgICAgXCIgLT4gXCIsXG4gICAgICApfWAsXG4gICAgKVxuICB9XG5cbiAgaWYgKCFjdHguZnNNYXBbZnNQYXRoXSkge1xuICAgIGRlYnVnKFwiZnNQYXRoIG5vdCBmb3VuZCBpbiBmc01hcDpcIiwgZnNQYXRoKVxuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBcIiR7ZnNQYXRofVwiIG5vdCBmb3VuZGApXG4gIH1cbiAgY29uc3QgZmlsZUNvbnRlbnQgPSBmc01hcFtmc1BhdGhdXG4gIGRlYnVnKFwiZmlsZUNvbnRlbnQ6XCIsIGZpbGVDb250ZW50Py5zbGljZSgwLCAxMDApKVxuICBjdXJyZW50bHlJbXBvcnRpbmcuYWRkKGZzUGF0aClcbiAgaW1wb3J0U3RhY2sucHVzaChmc1BhdGgpXG4gIHRyeSB7XG4gICAgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICBjb25zdCBqc29uRGF0YSA9IEpTT04ucGFyc2UoZmlsZUNvbnRlbnQpXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IHtcbiAgICAgICAgX19lc01vZHVsZTogdHJ1ZSxcbiAgICAgICAgZGVmYXVsdDoganNvbkRhdGEsXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIua2ljYWRfcGNiXCIpKSB7XG4gICAgICBjb25zdCBjb252ZXJ0ZXIgPSBuZXcgS2ljYWRUb0NpcmN1aXRKc29uQ29udmVydGVyKClcbiAgICAgIGNvbnZlcnRlci5hZGRGaWxlKGZzUGF0aCwgZmlsZUNvbnRlbnQpXG4gICAgICBjb252ZXJ0ZXIucnVuVW50aWxGaW5pc2hlZCgpXG4gICAgICBjb25zdCBjaXJjdWl0SnNvbiA9IGNvbnZlcnRlci5nZXRPdXRwdXQoKVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGNpcmN1aXRKc29uOiBjaXJjdWl0SnNvbixcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU3RhdGljQXNzZXRQYXRoKGZzUGF0aCkpIHtcbiAgICAgIGxldCBzdGF0aWNVcmw6IHN0cmluZ1xuXG4gICAgICBpZiAoZmlsZUNvbnRlbnQgPT09IFwiX19TVEFUSUNfQVNTRVRfX1wiKSB7XG4gICAgICAgIC8vIFBsYWNlaG9sZGVyOiB1c2UgcHJvamVjdEJhc2VVcmwgZm9yIHN0YXRpYyBmaWxlIGltcG9ydHNcbiAgICAgICAgY29uc3QgcGxhdGZvcm1Db25maWcgPSBjdHguY2lyY3VpdC5wbGF0Zm9ybVxuICAgICAgICBzdGF0aWNVcmwgPSBgJHtwbGF0Zm9ybUNvbmZpZz8ucHJvamVjdEJhc2VVcmwgPz8gXCJcIn0vJHtcbiAgICAgICAgICBmc1BhdGguc3RhcnRzV2l0aChcIi4vXCIpID8gZnNQYXRoLnNsaWNlKDIpIDogZnNQYXRoXG4gICAgICAgIH1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBY3R1YWwgZmlsZSBjb250ZW50OiBjcmVhdGUgYSBibG9iIFVSTFxuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2ZpbGVDb250ZW50XSwge1xuICAgICAgICAgIHR5cGU6IGZzUGF0aC5lbmRzV2l0aChcIi5raWNhZF9tb2RcIilcbiAgICAgICAgICAgID8gXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIDogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIixcbiAgICAgICAgfSlcbiAgICAgICAgc3RhdGljVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgfVxuXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IHtcbiAgICAgICAgX19lc01vZHVsZTogdHJ1ZSxcbiAgICAgICAgZGVmYXVsdDogc3RhdGljVXJsLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSB8fCBmc1BhdGguZW5kc1dpdGgoXCIudHNcIikpIHtcbiAgICAgIGNvbnN0IGltcG9ydE5hbWVzID0gZ2V0SW1wb3J0c0Zyb21Db2RlKGZpbGVDb250ZW50KVxuXG4gICAgICBmb3IgKGNvbnN0IGltcG9ydE5hbWUgb2YgaW1wb3J0TmFtZXMpIHtcbiAgICAgICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICAgICAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChpbXBvcnROYW1lLCBjdHgsIGRlcHRoICsgMSwge1xuICAgICAgICAgICAgY3dkOiBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZENvZGUgPSB0cmFuc2Zvcm1XaXRoU3VjcmFzZShmaWxlQ29udGVudCwgZnNQYXRoKVxuICAgICAgICBkZWJ1ZyhcImV2YWxDb21waWxlZEpzIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICAgICAgY29kZTogdHJhbnNmb3JtZWRDb2RlLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgZGlybmFtZTogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBpbXBvcnRSdW5SZXN1bHQgPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgICAgICB0cmFuc2Zvcm1lZENvZGUsXG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgICAgIGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgKVxuICAgICAgICBkZWJ1ZyhcImltcG9ydFJ1blJlc3VsdDpcIiwge1xuICAgICAgICAgIGZzUGF0aCxcbiAgICAgICAgICBpbXBvcnRSdW5SZXN1bHQsXG4gICAgICAgIH0pXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0gaW1wb3J0UnVuUmVzdWx0LmV4cG9ydHNcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFdmFsIGNvbXBpbGVkIGpzIGVycm9yIGZvciBcIiR7aW1wb3J0TmFtZX1cIjogJHtlcnJvci5tZXNzYWdlfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi5qc1wiKSB8fCBmc1BhdGguZW5kc1dpdGgoXCIubWpzXCIpKSB7XG4gICAgICAvLyBGb3IgLmpzLy5tanMgZmlsZXMsIGVzcGVjaWFsbHkgZnJvbSBub2RlX21vZHVsZXMsIHdlIG5lZWQgdG8gZXh0cmFjdCBhbmQgcmVzb2x2ZSBpbXBvcnRzIGZpcnN0XG4gICAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgICAgZm9yIChjb25zdCBpbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICAgIGN3ZDogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlbiB0cmFuc2Zvcm0gYW5kIGV2YWx1YXRlXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgICB0cmFuc2Zvcm1XaXRoU3VjcmFzZShmaWxlQ29udGVudCwgZnNQYXRoKSxcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgICApLmV4cG9ydHNcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5zdXBwb3J0ZWQgZmlsZSBleHRlbnNpb24gXCIke2ZzUGF0aC5zcGxpdChcIi5cIikucG9wKCl9XCIgZm9yIFwiJHtmc1BhdGh9XCJgLFxuICAgICAgKVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpbXBvcnRTdGFjay5wb3AoKVxuICAgIGN1cnJlbnRseUltcG9ydGluZy5kZWxldGUoZnNQYXRoKVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IFNUQVRJQ19BU1NFVF9FWFRFTlNJT05TID0gW1xuICBcIi5nbGJcIixcbiAgXCIua2ljYWRfbW9kXCIsXG4gIFwiLmdsdGZcIixcbiAgXCIub2JqXCIsXG4gIFwiLnN0bFwiLFxuICBcIi5zdGVwXCIsXG4gIFwiLnN0cFwiLFxuXVxuXG5leHBvcnQgY29uc3QgaXNTdGF0aWNBc3NldFBhdGggPSAocGF0aDogc3RyaW5nKSA9PlxuICBTVEFUSUNfQVNTRVRfRVhURU5TSU9OUy5zb21lKChleHQpID0+IHBhdGguZW5kc1dpdGgoZXh0KSlcbiIsICJpbXBvcnQgeyB0cmFuc2Zvcm0sIHR5cGUgVHJhbnNmb3JtIGFzIFN1Y3Jhc2VUcmFuc2Zvcm0gfSBmcm9tIFwic3VjcmFzZVwiXG5cbmNvbnN0IFRTX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFtcIi50c1wiLCBcIi50c3hcIiwgXCIubXRzXCIsIFwiLmN0c1wiXSlcbmNvbnN0IEpTWF9FWFRFTlNJT05TID0gbmV3IFNldChbXCIudHN4XCIsIFwiLmpzeFwiLCBcIi50c1wiXSlcbmNvbnN0IFRZUEVfU1RBUl9FWFBPUlRfUkVHRVggPVxuICAvXlxccypleHBvcnRcXHMrdHlwZVxccytcXCpcXHMrKD86YXNcXHMrW1xcdyRdK1xccyspP2Zyb21cXHMrWydcIl1bXidcIl0rWydcIl1cXHMqOz9cXHMqJC9naW1cblxuY29uc3Qgc3RyaXBUeXBlU3RhckV4cG9ydHMgPSAoY29kZTogc3RyaW5nKSA9PlxuICBjb2RlLnJlcGxhY2UoVFlQRV9TVEFSX0VYUE9SVF9SRUdFWCwgXCJcIilcblxuY29uc3Qgc3RyaXBRdWVyeUFuZEhhc2ggPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBxdWVyeUluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihcIj9cIilcbiAgY29uc3QgaGFzaEluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihcIiNcIilcblxuICBsZXQgZW5kSW5kZXggPSBmaWxlUGF0aC5sZW5ndGhcblxuICBpZiAocXVlcnlJbmRleCAhPT0gLTEgJiYgaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gTWF0aC5taW4ocXVlcnlJbmRleCwgaGFzaEluZGV4KVxuICB9IGVsc2UgaWYgKHF1ZXJ5SW5kZXggIT09IC0xKSB7XG4gICAgZW5kSW5kZXggPSBxdWVyeUluZGV4XG4gIH0gZWxzZSBpZiAoaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gaGFzaEluZGV4XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguc2xpY2UoMCwgZW5kSW5kZXgpXG59XG5cbmNvbnN0IGdldEV4dGVuc2lvbiA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gc3RyaXBRdWVyeUFuZEhhc2goZmlsZVBhdGgpXG4gIGNvbnN0IGxhc3REb3RJbmRleCA9IG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiLlwiKVxuXG4gIGlmIChsYXN0RG90SW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gTWF0aC5tYXgoXG4gICAgbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoXCIvXCIpLFxuICAgIG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiXFxcXFwiKSxcbiAgKVxuXG4gIGlmIChsYXN0U2xhc2hJbmRleCA+IGxhc3REb3RJbmRleCkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFBhdGguc2xpY2UobGFzdERvdEluZGV4KS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGdldFRyYW5zZm9ybXNGb3JGaWxlUGF0aCA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbihmaWxlUGF0aClcblxuICBjb25zdCB0cmFuc2Zvcm1zOiBTdWNyYXNlVHJhbnNmb3JtW10gPSBbXCJpbXBvcnRzXCJdXG5cbiAgaWYgKFRTX0VYVEVOU0lPTlMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICB0cmFuc2Zvcm1zLnVuc2hpZnQoXCJ0eXBlc2NyaXB0XCIpXG4gIH1cblxuICBpZiAoSlNYX0VYVEVOU0lPTlMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICB0cmFuc2Zvcm1zLnB1c2goXCJqc3hcIilcbiAgfVxuXG4gIHJldHVybiB0cmFuc2Zvcm1zXG59XG5cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1XaXRoU3VjcmFzZSA9IChjb2RlOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtcyA9IGdldFRyYW5zZm9ybXNGb3JGaWxlUGF0aChmaWxlUGF0aClcbiAgY29uc3Qgc2FuaXRpemVkQ29kZSA9IHN0cmlwVHlwZVN0YXJFeHBvcnRzKGNvZGUpXG4gIGNvbnN0IHsgY29kZTogdHJhbnNmb3JtZWRDb2RlIH0gPSB0cmFuc2Zvcm0oc2FuaXRpemVkQ29kZSwge1xuICAgIGZpbGVQYXRoLFxuICAgIHByb2R1Y3Rpb246IHRydWUsXG4gICAgdHJhbnNmb3JtcyxcbiAgfSlcblxuICByZXR1cm4gdHJhbnNmb3JtZWRDb2RlXG59XG4iLCAiaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFNuaXBwZXQoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pIHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuICBjb25zdCBmdWxsU25pcHBldE5hbWUgPSBpbXBvcnROYW1lLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikucmVwbGFjZShcIi5cIiwgXCIvXCIpXG5cbiAgY29uc3QgeyBjanMsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKGAke2N0eC5janNSZWdpc3RyeVVybH0vJHtmdWxsU25pcHBldE5hbWV9YClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiAoeyBjanM6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH0pKVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNqczogbnVsbCB9KSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgaW1wb3J0XCIsIGltcG9ydE5hbWUsIGVycm9yKVxuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgIGNqcyEsXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgKS5leHBvcnRzXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW1wb3J0aW5nIHNuaXBwZXRcIiwgZSlcbiAgfVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVOb2RlTW9kdWxlIH0gZnJvbSBcImxpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uIH0gZnJvbSBcIi4vaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uXCJcbmltcG9ydCB7IGdldE5vZGVNb2R1bGVEaXJlY3RvcnkgfSBmcm9tIFwiLi9nZXROb2RlTW9kdWxlRGlyZWN0b3J5XCJcbmltcG9ydCB7IGdldFBhY2thZ2VKc29uRW50cnlwb2ludCB9IGZyb20gXCIuL2dldFBhY2thZ2VKc29uRW50cnlwb2ludFwiXG5pbXBvcnQgeyBpc1R5cGVTY3JpcHRFbnRyeXBvaW50IH0gZnJvbSBcIi4vaXNUeXBlU2NyaXB0RW50cnlwb2ludFwiXG5pbXBvcnQgeyBpc0Rpc3REaXJFbXB0eSB9IGZyb20gXCIuL2lzRGlzdERpckVtcHR5XCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtbm9kZS1tb2R1bGVcIilcblxuZXhwb3J0IGNvbnN0IGltcG9ydE5vZGVNb2R1bGUgPSBhc3luYyAoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pID0+IHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMsIGZzTWFwIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBPbmx5IHJ1biB2YWxpZGF0aW9uIGlmIHBhY2thZ2UuanNvbiBleGlzdHMgKGNhbid0IHZhbGlkYXRlIHdpdGhvdXQgaXQpXG4gIGNvbnN0IGhhc1BhY2thZ2VKc29uID0gISFmc01hcFtcInBhY2thZ2UuanNvblwiXVxuXG4gIGlmIChoYXNQYWNrYWdlSnNvbikge1xuICAgIC8vIFN0ZXAgMTogQ2hlY2sgaWYgdGhlIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uXG4gICAgaWYgKCFpc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24oaW1wb3J0TmFtZSwgZnNNYXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBOb2RlIG1vZHVsZSBpbXBvcnRlZCBidXQgbm90IGluIHBhY2thZ2UuanNvbiBcIiR7aW1wb3J0TmFtZX1cIlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZE5vZGVNb2R1bGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LmZzTWFwLCBcIlwiKVxuXG4gIC8vIE9ubHkgcnVuIFN0ZXBzIDItNCBpZiBwYWNrYWdlIGV4aXN0cyBpbiBub2RlX21vZHVsZXMgKGFmdGVyIHJlc29sdmVyIGF0dGVtcHRzKVxuICBpZiAoaGFzUGFja2FnZUpzb24gJiYgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCkge1xuICAgIC8vIFN0ZXAgMjogQ2hlY2sgaWYgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBleGlzdHMgZm9yIHRoZSBwYWNrYWdlXG4gICAgY29uc3Qgbm9kZU1vZHVsZURpciA9IGdldE5vZGVNb2R1bGVEaXJlY3RvcnkoaW1wb3J0TmFtZSwgZnNNYXApXG4gICAgaWYgKCFub2RlTW9kdWxlRGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgbm8gZmlsZXMgaW4gdGhlIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnlcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gU3RlcCAzOiBDaGVjayBpZiBtYWluIGVudHJ5cG9pbnQgaXMgYSBUeXBlU2NyaXB0IGZpbGVcbiAgICBjb25zdCBlbnRyeXBvaW50ID0gZ2V0UGFja2FnZUpzb25FbnRyeXBvaW50KGltcG9ydE5hbWUsIGZzTWFwKVxuICAgIGlmIChpc1R5cGVTY3JpcHRFbnRyeXBvaW50KGVudHJ5cG9pbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgYSB0eXBlc2NyaXB0IGVudHJ5cG9pbnQgdGhhdCBpcyB1bnN1cHBvcnRlZFxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBTdGVwIDQ6IENoZWNrIGlmIGRpc3QgZGlyZWN0b3J5IGlzIGVtcHR5IHdoZW4gbWFpbiBwb2ludHMgdG8gZGlzdFxuICAgIGlmIChlbnRyeXBvaW50ICYmIGVudHJ5cG9pbnQuc3RhcnRzV2l0aChcImRpc3QvXCIpKSB7XG4gICAgICBpZiAoaXNEaXN0RGlyRW1wdHkoaW1wb3J0TmFtZSwgZnNNYXApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIG5vIGZpbGVzIGluIGRpc3QsIGRpZCB5b3UgZm9yZ2V0IHRvIHRyYW5zcGlsZT9cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIXJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGN0eC5jaXJjdWl0Py5wbGF0Zm9ybVxuICAgIGlmIChwbGF0Zm9ybT8ubm9kZU1vZHVsZXNSZXNvbHZlcikge1xuICAgICAgZGVidWcoYEF0dGVtcHRpbmcgdG8gcmVzb2x2ZSBcIiR7aW1wb3J0TmFtZX1cIiB1c2luZyBub2RlTW9kdWxlc1Jlc29sdmVyYClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBwbGF0Zm9ybS5ub2RlTW9kdWxlc1Jlc29sdmVyKGltcG9ydE5hbWUpXG5cbiAgICAgICAgaWYgKGZpbGVDb250ZW50KSB7XG4gICAgICAgICAgZGVidWcoYFN1Y2Nlc3NmdWxseSByZXNvbHZlZCBcIiR7aW1wb3J0TmFtZX1cIiB2aWEgbm9kZU1vZHVsZXNSZXNvbHZlcmApXG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHJlc29sdmVkIGNvbnRlbnQgdG8gZnNNYXAgd2l0aCBhIHN5bnRoZXRpYyBwYXRoXG4gICAgICAgICAgLy8gQWRkIC50cyBleHRlbnNpb24gdG8gZW5zdXJlIGl0J3MgdHJlYXRlZCBhcyBhIG1vZHVsZSBmaWxlXG4gICAgICAgICAgY29uc3Qgc3ludGhldGljUGF0aCA9IGBub2RlX21vZHVsZXMvJHtpbXBvcnROYW1lfS50c2BcbiAgICAgICAgICBjdHguZnNNYXBbc3ludGhldGljUGF0aF0gPSBmaWxlQ29udGVudFxuXG4gICAgICAgICAgLy8gSW1wb3J0IHRoZSBmaWxlIHVzaW5nIHRoZSBub3JtYWwgZmxvd1xuICAgICAgICAgIGF3YWl0IGltcG9ydExvY2FsRmlsZShzeW50aGV0aWNQYXRoLCBjdHgsIGRlcHRoKVxuXG4gICAgICAgICAgLy8gTWFwIHRoZSBpbXBvcnQgbmFtZSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlXG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcHJlU3VwcGxpZWRJbXBvcnRzW3N5bnRoZXRpY1BhdGhdXG5cbiAgICAgICAgICAvLyBBbHNvIG1hcCB3aXRob3V0IG5vZGVfbW9kdWxlcyBwcmVmaXhcbiAgICAgICAgICBjb25zdCB1bnByZWZpeGVkUGF0aCA9IHN5bnRoZXRpY1BhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWRQYXRoXSA9IHByZVN1cHBsaWVkSW1wb3J0c1tzeW50aGV0aWNQYXRoXVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBkZWJ1Zyhgbm9kZU1vZHVsZXNSZXNvbHZlciByZXR1cm5lZCBudWxsIGZvciBcIiR7aW1wb3J0TmFtZX1cImApXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBkZWJ1Zyhgbm9kZU1vZHVsZXNSZXNvbHZlciBmYWlsZWQgZm9yIFwiJHtpbXBvcnROYW1lfVwiOmAsIGVycm9yKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgbm90IGZvdW5kYClcbiAgfVxuXG4gIC8vIFVzZSBpbXBvcnRMb2NhbEZpbGUgdG8gaGFuZGxlIHRoZSBub2RlIG1vZHVsZVxuICBhd2FpdCBpbXBvcnRMb2NhbEZpbGUocmVzb2x2ZWROb2RlTW9kdWxlUGF0aCwgY3R4LCBkZXB0aClcblxuICAvLyBNYXAgdGhlIG9yaWdpbmFsIGltcG9ydCBuYW1lIHRvIHRoZSByZXNvbHZlZCBtb2R1bGUncyBleHBvcnRzXG4gIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gIC8vIE1hcCB3aXRob3V0IG5vZGVfbW9kdWxlcyBwcmVmaXggZm9yIGRpcmVjdCBpbXBvcnRzXG4gIGNvbnN0IHVucHJlZml4ZWRQYXRoID0gcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5yZXBsYWNlKC9ebm9kZV9tb2R1bGVzXFwvLywgXCJcIilcbiAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWRQYXRoXSA9XG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgLy8gSGFuZGxlIGluZGV4IGZpbGVzIHNwZWNpYWxseVxuICBpZiAoXG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC50c3hcIikgfHxcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LnRzXCIpIHx8XG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC5qc1wiKVxuICApIHtcbiAgICBjb25zdCBkaXJQYXRoID0gcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5yZXBsYWNlKC9cXC9pbmRleFxcLih0c3g/fGpzKSQvLCBcIlwiKVxuICAgIGNvbnN0IHVucHJlZml4ZWREaXJQYXRoID0gZGlyUGF0aC5yZXBsYWNlKC9ebm9kZV9tb2R1bGVzXFwvLywgXCJcIilcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZERpclBhdGhdID1cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gICAgLy8gSGFuZGxlIHNjb3BlZCBwYWNrYWdlc1xuICAgIGlmICh1bnByZWZpeGVkRGlyUGF0aC5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgICAgY29uc3Qgc2NvcGVQYXJ0cyA9IHVucHJlZml4ZWREaXJQYXRoLnNwbGl0KFwiL1wiKVxuICAgICAgaWYgKHNjb3BlUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVkTmFtZSA9IGAke3Njb3BlUGFydHNbMF19LyR7c2NvcGVQYXJ0c1sxXX1gXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tzY29wZWROYW1lXSA9XG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBFeHRyYWN0IHRoZSBiYXNlIHBhY2thZ2UgbmFtZSBmcm9tIGFuIGltcG9ydCBuYW1lXG4gKiBIYW5kbGVzIHNjb3BlZCBwYWNrYWdlcyBhbmQgc3VicGF0aHNcbiAqXG4gKiBFeGFtcGxlczpcbiAqIC0gXCJAc2NvcGUvcGFja2FnZS9zdWJwYXRoXCIgLT4gXCJAc2NvcGUvcGFja2FnZVwiXG4gKiAtIFwibG9kYXNoL2dldFwiIC0+IFwibG9kYXNoXCJcbiAqIC0gXCJyZWFjdFwiIC0+IFwicmVhY3RcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEJhc2VQYWNrYWdlTmFtZShpbXBvcnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgYmFzZVBhY2thZ2VOYW1lID0gaW1wb3J0TmFtZVxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgIC8vIFNjb3BlZCBwYWNrYWdlOiBAc2NvcGUvcGFja2FnZSBvciBAc2NvcGUvcGFja2FnZS9zdWJwYXRoXG4gICAgY29uc3QgcGFydHMgPSBpbXBvcnROYW1lLnNwbGl0KFwiL1wiKVxuICAgIGJhc2VQYWNrYWdlTmFtZSA9IHBhcnRzLmxlbmd0aCA+PSAyID8gYCR7cGFydHNbMF19LyR7cGFydHNbMV19YCA6IGltcG9ydE5hbWVcbiAgfSBlbHNlIHtcbiAgICAvLyBSZWd1bGFyIHBhY2thZ2U6IHBhY2thZ2Ugb3IgcGFja2FnZS9zdWJwYXRoXG4gICAgYmFzZVBhY2thZ2VOYW1lID0gaW1wb3J0TmFtZS5zcGxpdChcIi9cIilbMF1cbiAgfVxuICByZXR1cm4gYmFzZVBhY2thZ2VOYW1lXG59XG4iLCAiaW1wb3J0IHsgZXh0cmFjdEJhc2VQYWNrYWdlTmFtZSB9IGZyb20gXCIuL2V4dHJhY3RCYXNlUGFja2FnZU5hbWVcIlxuXG4vKipcbiAqIENoZWNrIGlmIGEgcGFja2FnZSBpcyBkZWNsYXJlZCBpbiBwYWNrYWdlLmpzb24gKGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBvciBwZWVyRGVwZW5kZW5jaWVzKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwYWNrYWdlSnNvbkNvbnRlbnQgPSBmc01hcFtcInBhY2thZ2UuanNvblwiXVxuICBpZiAoIXBhY2thZ2VKc29uQ29udGVudCkge1xuICAgIC8vIE5vIHBhY2thZ2UuanNvbiBtZWFucyB3ZSBjYW4ndCB2YWxpZGF0ZSAtIGFsbG93IHRoZSBpbXBvcnRcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Db250ZW50KVxuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyB8fCB7fVxuICAgIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fVxuICAgIGNvbnN0IHBlZXJEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzIHx8IHt9XG5cbiAgICAvLyBFeHRyYWN0IHRoZSBiYXNlIHBhY2thZ2UgbmFtZSAoaGFuZGxlIHNjb3BlZCBwYWNrYWdlcyBhbmQgc3VicGF0aHMpXG4gICAgY29uc3QgYmFzZVBhY2thZ2VOYW1lID0gZXh0cmFjdEJhc2VQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSlcblxuICAgIHJldHVybiAoXG4gICAgICBiYXNlUGFja2FnZU5hbWUgaW4gZGVwZW5kZW5jaWVzIHx8XG4gICAgICBiYXNlUGFja2FnZU5hbWUgaW4gZGV2RGVwZW5kZW5jaWVzIHx8XG4gICAgICBiYXNlUGFja2FnZU5hbWUgaW4gcGVlckRlcGVuZGVuY2llc1xuICAgIClcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgd2UgY2FuJ3QgcGFyc2UgcGFja2FnZS5qc29uLCBhbGxvdyB0aGUgaW1wb3J0XG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuIiwgImltcG9ydCB7IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9leHRyYWN0QmFzZVBhY2thZ2VOYW1lXCJcblxuLyoqXG4gKiBDaGVjayBpZiBub2RlX21vZHVsZXMgZGlyZWN0b3J5IGV4aXN0cyBmb3IgdGhlIHBhY2thZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVNb2R1bGVEaXJlY3RvcnkoXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG4gIGNvbnN0IG5vZGVNb2R1bGVQYXRoID0gYG5vZGVfbW9kdWxlcy8ke2Jhc2VQYWNrYWdlTmFtZX1gXG5cbiAgLy8gQ2hlY2sgaWYgYW55IGZpbGVzIGV4aXN0IHVuZGVyIHRoaXMgcGF0aCBpbiBmc01hcFxuICBjb25zdCBoYXNGaWxlcyA9IE9iamVjdC5rZXlzKGZzTWFwKS5zb21lKFxuICAgIChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgobm9kZU1vZHVsZVBhdGggKyBcIi9cIikgfHwgcGF0aCA9PT0gbm9kZU1vZHVsZVBhdGgsXG4gIClcblxuICByZXR1cm4gaGFzRmlsZXMgPyBub2RlTW9kdWxlUGF0aCA6IG51bGxcbn1cbiIsICJpbXBvcnQgeyBleHRyYWN0QmFzZVBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZXh0cmFjdEJhc2VQYWNrYWdlTmFtZVwiXG5cbi8qKlxuICogR2V0IHRoZSBlbnRyeXBvaW50IGZyb20gcGFja2FnZS5qc29uICh0aGUgXCJtYWluXCIgb3IgXCJtb2R1bGVcIiBmaWVsZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2VKc29uRW50cnlwb2ludChcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgYmFzZVBhY2thZ2VOYW1lID0gZXh0cmFjdEJhc2VQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSlcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gYG5vZGVfbW9kdWxlcy8ke2Jhc2VQYWNrYWdlTmFtZX0vcGFja2FnZS5qc29uYFxuXG4gIGNvbnN0IHBhY2thZ2VKc29uQ29udGVudCA9IGZzTWFwW3BhY2thZ2VKc29uUGF0aF1cbiAgaWYgKCFwYWNrYWdlSnNvbkNvbnRlbnQpIHJldHVybiBudWxsXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Db250ZW50KVxuICAgIC8vIFRyeSBtYWluLCBtb2R1bGUsIG9yIGV4cG9ydHMgZmllbGQgKGluIG9yZGVyIG9mIHByZWZlcmVuY2UpXG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm1haW4gfHwgcGFja2FnZUpzb24ubW9kdWxlIHx8IG51bGxcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuIiwgIi8qKlxuICogQ2hlY2sgaWYgdGhlIGVudHJ5cG9pbnQgaXMgYSBUeXBlU2NyaXB0IGZpbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZVNjcmlwdEVudHJ5cG9pbnQoZW50cnlwb2ludDogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICBpZiAoIWVudHJ5cG9pbnQpIHJldHVybiBmYWxzZVxuICByZXR1cm4gZW50cnlwb2ludC5lbmRzV2l0aChcIi50c1wiKSB8fCBlbnRyeXBvaW50LmVuZHNXaXRoKFwiLnRzeFwiKVxufVxuIiwgImltcG9ydCB7IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9leHRyYWN0QmFzZVBhY2thZ2VOYW1lXCJcblxuLyoqXG4gKiBDaGVjayBpZiBkaXN0IGRpcmVjdG9yeSBleGlzdHMgYW5kIGhhcyBmaWxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEaXN0RGlyRW1wdHkoXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG4gIGNvbnN0IGRpc3RQYXRoID0gYG5vZGVfbW9kdWxlcy8ke2Jhc2VQYWNrYWdlTmFtZX0vZGlzdGBcblxuICAvLyBDaGVjayBpZiBhbnkgZmlsZXMgZXhpc3QgdW5kZXIgZGlzdC9cbiAgY29uc3QgaGFzRmlsZXMgPSBPYmplY3Qua2V5cyhmc01hcCkuc29tZSgocGF0aCkgPT5cbiAgICBwYXRoLnN0YXJ0c1dpdGgoZGlzdFBhdGggKyBcIi9cIiksXG4gIClcblxuICByZXR1cm4gIWhhc0ZpbGVzXG59XG4iLCAiaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwibGliL3V0aWxzL2Rpcm5hbWVcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCIuL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IHsgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UgfSBmcm9tIFwibGliL3RyYW5zcGlsZS90cmFuc2Zvcm0td2l0aC1zdWNyYXNlXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtbnBtLXBhY2thZ2VcIilcblxuZnVuY3Rpb24gZXh0cmFjdFBhY2thZ2VQYXRoRnJvbUpTRGVsaXZyKHVybDogc3RyaW5nKSB7XG4gIGNvbnN0IHByZWZpeCA9IFwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9cIlxuICBpZiAodXJsLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgIHJldHVybiB1cmwuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpLnJlcGxhY2UoL1xcL1xcK2VzbSQvLCBcIlwiKVxuICB9XG4gIHJldHVybiB1cmxcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydE5wbVBhY2thZ2VGcm9tQ2RuKFxuICB7IGltcG9ydE5hbWUsIGRlcHRoID0gMCB9OiB7IGltcG9ydE5hbWU6IHN0cmluZzsgZGVwdGg/OiBudW1iZXIgfSxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuKSB7XG4gIGRlYnVnKGBpbXBvcnRpbmcgbnBtIHBhY2thZ2UgZnJvbSBDRE46ICR7aW1wb3J0TmFtZX1gKVxuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkgcmV0dXJuXG5cbiAgY29uc3QgbnBtQ2RuVXJsID0gYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtpbXBvcnROYW1lfS8rZXNtYFxuXG4gIGxldCBmaW5hbFVybDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIGNvbnN0IHsgY29udGVudCwgZXJyb3IgfSA9IGF3YWl0IGdsb2JhbFRoaXNcbiAgICAuZmV0Y2gobnBtQ2RuVXJsKVxuICAgIC50aGVuKGFzeW5jIChyZXMpID0+IHtcbiAgICAgIGZpbmFsVXJsID0gcmVzLnVybFxuICAgICAgaWYgKCFyZXMub2spXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZldGNoIFwiJHtpbXBvcnROYW1lfVwiIGZyb20ganNkZWxpdnI6ICR7cmVzLnN0YXR1c1RleHR9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICApXG4gICAgICByZXR1cm4geyBjb250ZW50OiBhd2FpdCByZXMudGV4dCgpLCBlcnJvcjogbnVsbCB9XG4gICAgfSlcbiAgICAuY2F0Y2goKGUpID0+ICh7IGVycm9yOiBlLCBjb250ZW50OiBudWxsIH0pKVxuXG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBucG0gaW1wb3J0XCIsIGltcG9ydE5hbWUsIGVycm9yKVxuICAgIHRocm93IGVycm9yXG4gIH1cblxuICBjb25zdCBmaW5hbEltcG9ydE5hbWUgPSBleHRyYWN0UGFja2FnZVBhdGhGcm9tSlNEZWxpdnIoZmluYWxVcmwhKVxuICBjb25zdCBjd2QgPSBkaXJuYW1lKGZpbmFsSW1wb3J0TmFtZSlcblxuICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShjb250ZW50ISlcbiAgZm9yIChjb25zdCBzdWJJbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbc3ViSW1wb3J0TmFtZV0pIHtcbiAgICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKHN1YkltcG9ydE5hbWUsIGN0eCwgZGVwdGggKyAxLCB7XG4gICAgICAgIGN3ZCxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgY29uc3QgdHJhbnNmb3JtZWRDb2RlID0gdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoXG4gICAgY29udGVudCEsXG4gICAgZmluYWxJbXBvcnROYW1lIHx8IGltcG9ydE5hbWUsXG4gIClcbiAgdHJ5IHtcbiAgICBjb25zdCBleHBvcnRzID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICB0cmFuc2Zvcm1lZENvZGUsXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICBjd2QsXG4gICAgKS5leHBvcnRzXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmaW5hbEltcG9ydE5hbWVdID0gZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmaW5hbFVybCFdID0gZXhwb3J0c1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRXZhbCBucG0gcGFja2FnZSBlcnJvciBmb3IgXCIke2ltcG9ydE5hbWV9XCI6ICR7ZS5tZXNzYWdlfVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICApXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRMb2NhbEZpbGUgfSBmcm9tIFwiLi9pbXBvcnQtbG9jYWwtZmlsZVwiXG5pbXBvcnQgeyBpbXBvcnRTbmlwcGV0IH0gZnJvbSBcIi4vaW1wb3J0LXNuaXBwZXRcIlxuaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoIH0gZnJvbSBcImxpYi9ydW5uZXIvcmVzb2x2ZUZpbGVQYXRoXCJcbmltcG9ydCB7IHJlc29sdmVOb2RlTW9kdWxlIH0gZnJvbSBcImxpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlXCJcbmltcG9ydCB7IGltcG9ydE5vZGVNb2R1bGUgfSBmcm9tIFwiLi9pbXBvcnQtbm9kZS1tb2R1bGVcIlxuaW1wb3J0IHsgaW1wb3J0TnBtUGFja2FnZUZyb21DZG4gfSBmcm9tIFwiLi9pbXBvcnQtbnBtLXBhY2thZ2UtZnJvbS1jZG5cIlxuaW1wb3J0IHtcbiAgZ2V0VHNDb25maWcsXG4gIG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuLFxufSBmcm9tIFwibGliL3J1bm5lci90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uIH0gZnJvbSBcIi4vaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uXCJcbmltcG9ydCB7IGdldE5vZGVNb2R1bGVEaXJlY3RvcnkgfSBmcm9tIFwiLi9nZXROb2RlTW9kdWxlRGlyZWN0b3J5XCJcbmltcG9ydCB7IGdldFBhY2thZ2VKc29uRW50cnlwb2ludCB9IGZyb20gXCIuL2dldFBhY2thZ2VKc29uRW50cnlwb2ludFwiXG5pbXBvcnQgeyBpc1R5cGVTY3JpcHRFbnRyeXBvaW50IH0gZnJvbSBcIi4vaXNUeXBlU2NyaXB0RW50cnlwb2ludFwiXG5pbXBvcnQgeyBpc0Rpc3REaXJFbXB0eSB9IGZyb20gXCIuL2lzRGlzdERpckVtcHR5XCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtZXZhbC1wYXRoXCIpXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRFdmFsUGF0aChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbiAgb3B0czoge1xuICAgIGN3ZD86IHN0cmluZ1xuICB9ID0ge30sXG4pIHtcbiAgZGVidWcoXCJpbXBvcnRFdmFsUGF0aCBjYWxsZWQgd2l0aDpcIiwge1xuICAgIGltcG9ydE5hbWUsXG4gICAgZGVwdGgsXG4gICAgb3B0cyxcbiAgfSlcbiAgY3R4LmxvZ2dlci5pbmZvKFxuICAgIGBpbXBvcnRFdmFsUGF0aChcIiR7aW1wb3J0TmFtZX1cIiwge2N3ZDogXCIke29wdHMuY3dkfVwiLCBkZXB0aDogJHtkZXB0aH19KWAsXG4gIClcblxuICBkZWJ1ZyhgJHtcIiAgXCIucmVwZWF0KGRlcHRoKX1cdTI3QTFcdUZFMEZgLCBpbXBvcnROYW1lKVxuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG4gIGNvbnN0IGRpc2FibGVDZG5Mb2FkaW5nID1cbiAgICBjdHguZGlzYWJsZUNkbkxvYWRpbmcgfHwgKGdsb2JhbFRoaXMgYXMgYW55KS5fX0RJU0FCTEVfQ0ROX0xPQURJTkdfX1xuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYEltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiBpbiBwcmVTdXBwbGllZEltcG9ydHNbMV1gKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZS5zbGljZSgyKV0pIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYEltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiBpbiBwcmVTdXBwbGllZEltcG9ydHNbMl1gKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gSGFuZGxlIHN1YnBhdGggaW1wb3J0cyBmcm9tIHByZVN1cHBsaWVkSW1wb3J0cyAoZS5nLiwgXCJyZWFjdC9qc3gtcnVudGltZVwiKVxuICAvLyBJZiB0aGUgYmFzZSBwYWNrYWdlIGlzIGluIHByZVN1cHBsaWVkSW1wb3J0cywgdHJ5IHRvIGltcG9ydCBmcm9tIHRoZSBhY3R1YWwgcGFja2FnZVxuICBpZiAoXG4gICAgaW1wb3J0TmFtZS5pbmNsdWRlcyhcIi9cIikgJiZcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJlxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIvXCIpXG4gICkge1xuICAgIGNvbnN0IGJhc2VQa2cgPSBpbXBvcnROYW1lLnNwbGl0KFwiL1wiKVswXVxuICAgIGNvbnN0IGlzU2NvcGVkID0gYmFzZVBrZy5zdGFydHNXaXRoKFwiQFwiKVxuICAgIGNvbnN0IHBrZ05hbWUgPSBpc1Njb3BlZFxuICAgICAgPyBpbXBvcnROYW1lLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAyKS5qb2luKFwiL1wiKVxuICAgICAgOiBiYXNlUGtnXG4gICAgY29uc3Qgc3VicGF0aCA9IGlzU2NvcGVkXG4gICAgICA/IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpLnNsaWNlKDIpLmpvaW4oXCIvXCIpXG4gICAgICA6IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpLnNsaWNlKDEpLmpvaW4oXCIvXCIpXG5cbiAgICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW3BrZ05hbWVdKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUcnkgdG8gaW1wb3J0IHRoZSBzdWJwYXRoIGZyb20gdGhlIGFjdHVhbCBwYWNrYWdlXG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgaW1wb3J0KGAke3BrZ05hbWV9LyR7c3VicGF0aH1gKVxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSByZXNvbHZlZFxuICAgICAgICBjdHgubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYEltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiByZXNvbHZlZCBmcm9tIHByZVN1cHBsaWVkSW1wb3J0cyBiYXNlIHBhY2thZ2UgXCIke3BrZ05hbWV9XCJgLFxuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgdGhlIGR5bmFtaWMgaW1wb3J0IGZhaWxzLCBjb250aW51ZSB3aXRoIG5vcm1hbCByZXNvbHV0aW9uXG4gICAgICAgIGN0eC5sb2dnZXIuaW5mbyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHJlc29sdmUgXCIke2ltcG9ydE5hbWV9XCIgZnJvbSBwcmVTdXBwbGllZEltcG9ydHMgcGFja2FnZSBcIiR7cGtnTmFtZX1cIiwgZmFsbGluZyBiYWNrIHRvIG5vcm1hbCByZXNvbHV0aW9uYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChkZXB0aCA+IDMwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1heCBkZXB0aCBmb3IgaW1wb3J0cyByZWFjaGVkICgzMCkgSW1wb3J0IFBhdGg6ICR7Y3R4LmltcG9ydFN0YWNrLmpvaW4oXCIgLT4gXCIpfWAsXG4gICAgKVxuICB9XG5cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9ucG0vXCIpKSB7XG4gICAgY29uc3QgcGtnTmFtZSA9IGltcG9ydE5hbWUucmVwbGFjZSgvXlxcL25wbVxcLy8sIFwiXCIpLnJlcGxhY2UoL1xcL1xcK2VzbSQvLCBcIlwiKVxuICAgIGlmIChkaXNhYmxlQ2RuTG9hZGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlIFwiJHtwa2dOYW1lfVwiLiBUaGUgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBlbnZpcm9ubWVudC5cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0TnBtUGFja2FnZUZyb21DZG4oXCIke3BrZ05hbWV9XCIpYClcbiAgICBhd2FpdCBpbXBvcnROcG1QYWNrYWdlRnJvbUNkbih7IGltcG9ydE5hbWU6IHBrZ05hbWUsIGRlcHRoIH0sIGN0eClcbiAgICBjb25zdCBwa2cgPSBwcmVTdXBwbGllZEltcG9ydHNbcGtnTmFtZV1cbiAgICBpZiAocGtnKSB7XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwa2dcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBEZXRlcm1pbmUgd2hlcmUgdHNjb25maWcuanNvbiBpcyBsb2NhdGVkXG4gIGxldCB0c2NvbmZpZ0RpciA9IFwiLlwiXG4gIGxldCB0c0NvbmZpZ1RvVXNlID0gY3R4LnRzQ29uZmlnXG4gIGlmIChjdHgudHNDb25maWcgJiYgb3B0cy5jd2QpIHtcbiAgICAvLyBJZiBjd2QgaXMgaW4gbm9kZV9tb2R1bGVzLCBmaW5kIHRoZSBwYWNrYWdlIHJvb3RcbiAgICAvLyBlLmcuLCBcIm5vZGVfbW9kdWxlcy9hZG9tLWxpYnJhcnkvbGliL2dlbmVyYXRlZFwiIC0+IFwibm9kZV9tb2R1bGVzL2Fkb20tbGlicmFyeVwiXG4gICAgY29uc3Qgbm9kZU1vZHVsZXNNYXRjaCA9IG9wdHMuY3dkLm1hdGNoKC9eKG5vZGVfbW9kdWxlc1xcL1teXFwvXSspLylcbiAgICBpZiAobm9kZU1vZHVsZXNNYXRjaCkge1xuICAgICAgdHNjb25maWdEaXIgPSBub2RlTW9kdWxlc01hdGNoWzFdXG4gICAgICB0c0NvbmZpZ1RvVXNlID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKFxuICAgIGltcG9ydE5hbWUsXG4gICAgY3R4LmZzTWFwLFxuICAgIG9wdHMuY3dkLFxuICAgIHsgdHNDb25maWc6IHRzQ29uZmlnVG9Vc2UsIHRzY29uZmlnRGlyIH0sXG4gIClcbiAgaWYgKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnRMb2NhbEZpbGUoXCIke3Jlc29sdmVkTG9jYWxJbXBvcnRQYXRofVwiKWApXG4gICAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoLCBjdHgsIGRlcHRoKVxuICAgIC8vIE1hcCB0aGUgb3JpZ2luYWwgaW1wb3J0IG5hbWUgKHdoaWNoIG1pZ2h0IGJlIGEgdHNjb25maWcgcGF0aCBhbGlhcykgdG8gdGhlIHJlc29sdmVkIG1vZHVsZVxuICAgIGlmIChpbXBvcnROYW1lICE9PSByZXNvbHZlZExvY2FsSW1wb3J0UGF0aCkge1xuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID1cbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTG9jYWxJbXBvcnRQYXRoXVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoaXMgbWF0Y2hlcyBhIHRzY29uZmlnIHBhdGggcGF0dGVybiBidXQgZmFpbGVkIHRvIHJlc29sdmVcbiAgLy8gSWYgc28sIHRocm93IGFuIGVycm9yIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIG5wbVxuICBjb25zdCB0c0NvbmZpZyA9IGN0eC50c0NvbmZpZyA/PyBnZXRUc0NvbmZpZyhjdHguZnNNYXApXG4gIGlmICghY3R4LnRzQ29uZmlnICYmIHRzQ29uZmlnKSB7XG4gICAgY3R4LnRzQ29uZmlnID0gdHNDb25maWdcbiAgfVxuICBpZiAobWF0Y2hlc1RzY29uZmlnUGF0aFBhdHRlcm4oaW1wb3J0TmFtZSwgdHNDb25maWcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiBtYXRjaGVzIGEgdHNjb25maWcgcGF0aCBhbGlhcyBidXQgY291bGQgbm90IGJlIHJlc29sdmVkIHRvIGFuIGV4aXN0aW5nIGZpbGUke29wdHMuY3dkID8gYCBmcm9tIGRpcmVjdG9yeSBcIiR7b3B0cy5jd2R9XCJgIDogXCJcIn1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG5cbiAgLy8gVHJ5IHRvIHJlc29sdmUgZnJvbSBub2RlX21vZHVsZXNcbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKFxuICAgIGltcG9ydE5hbWUsXG4gICAgY3R4LmZzTWFwLFxuICAgIG9wdHMuY3dkIHx8IFwiXCIsXG4gIClcbiAgaWYgKHJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYHJlc29sdmVkTm9kZU1vZHVsZVBhdGg9XCIke3Jlc29sdmVkTm9kZU1vZHVsZVBhdGh9XCJgKVxuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0Tm9kZU1vZHVsZShcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnROb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICAvLyBJZiBub3QgZm91bmQgaW4gZnNNYXAgYnV0IG1pZ2h0IGJlIGEgbm9kZSBtb2R1bGUsIHRyeSBpbXBvcnROb2RlTW9kdWxlXG4gIC8vIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byB1c2Ugbm9kZU1vZHVsZXNSZXNvbHZlciBpZiBjb25maWd1cmVkXG4gIGlmIChcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJlxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIvXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkB0c2NpL1wiKVxuICApIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGN0eC5jaXJjdWl0Py5wbGF0Zm9ybVxuICAgIGlmIChwbGF0Zm9ybT8ubm9kZU1vZHVsZXNSZXNvbHZlcikge1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICBgaW1wb3J0Tm9kZU1vZHVsZShcIiR7aW1wb3J0TmFtZX1cIikgdmlhIG5vZGVNb2R1bGVzUmVzb2x2ZXJgLFxuICAgICAgKVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgaW1wb3J0Tm9kZU1vZHVsZShpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGN0eC5sb2dnZXIuaW5mbyhcbiAgICAgICAgICBgbm9kZU1vZHVsZXNSZXNvbHZlciBmYWlsZWQgZm9yIFwiJHtpbXBvcnROYW1lfVwiLCBmYWxsaW5nIGJhY2sgdG8gbnBtIENETmAsXG4gICAgICAgIClcbiAgICAgICAgaWYgKGRpc2FibGVDZG5Mb2FkaW5nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBmaW5kIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIi4gVGhlIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgZW52aXJvbm1lbnQgYW5kIGF1dG9tYXRpYyBucG0gcmVzb2x1dGlvbiBpcyBkaXNhYmxlZC5cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0U25pcHBldChcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnRTbmlwcGV0KGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICBpZiAoIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiYgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAvLyBTdGVwIDE6IENoZWNrIGlmIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uXG4gICAgaWYgKCFpc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24oaW1wb3J0TmFtZSwgY3R4LmZzTWFwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgaW1wb3J0ZWQgYnV0IG5vdCBpbiBwYWNrYWdlLmpzb24gXCIke2ltcG9ydE5hbWV9XCJcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gU3RlcCAyOiBDaGVjayBpZiBub2RlX21vZHVsZXMgZGlyZWN0b3J5IGV4aXN0cyAob25seSBpZiBub3QgZm91bmQgbG9jYWxseSB5ZXQpXG4gICAgLy8gT25seSB2YWxpZGF0ZSBpZiBDRE4gbG9hZGluZyBpcyBkaXNhYmxlZCAoaS5lLiwgbm8gZmFsbGJhY2sgdG8ganNEZWxpdnIgYXZhaWxhYmxlKVxuICAgIGNvbnN0IG5vZGVNb2R1bGVEaXIgPSBnZXROb2RlTW9kdWxlRGlyZWN0b3J5KGltcG9ydE5hbWUsIGN0eC5mc01hcClcbiAgICBpZiAoIW5vZGVNb2R1bGVEaXIgJiYgZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBubyBmaWxlcyBpbiB0aGUgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBTdGVwIDM6IENoZWNrIGlmIG1haW4gZW50cnlwb2ludCBpcyBhIFR5cGVTY3JpcHQgZmlsZSAob25seSBpZiBkaXIgZXhpc3RzKVxuICAgIGlmIChub2RlTW9kdWxlRGlyKSB7XG4gICAgICBjb25zdCBlbnRyeXBvaW50ID0gZ2V0UGFja2FnZUpzb25FbnRyeXBvaW50KGltcG9ydE5hbWUsIGN0eC5mc01hcClcbiAgICAgIGlmIChpc1R5cGVTY3JpcHRFbnRyeXBvaW50KGVudHJ5cG9pbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIGEgdHlwZXNjcmlwdCBlbnRyeXBvaW50IHRoYXQgaXMgdW5zdXBwb3J0ZWRcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCA0OiBDaGVjayBpZiBkaXN0IGRpcmVjdG9yeSBpcyBlbXB0eSB3aGVuIG1haW4gcG9pbnRzIHRvIGRpc3RcbiAgICAgIGlmIChlbnRyeXBvaW50Py5zdGFydHNXaXRoKFwiZGlzdC9cIikpIHtcbiAgICAgICAgaWYgKGlzRGlzdERpckVtcHR5KGltcG9ydE5hbWUsIGN0eC5mc01hcCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIG5vIGZpbGVzIGluIGRpc3QsIGRpZCB5b3UgZm9yZ2V0IHRvIHRyYW5zcGlsZT9cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVDZG5Mb2FkaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgZmluZCBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIuIFRoZSBwYWNrYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGxvY2FsIGVudmlyb25tZW50LlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnROcG1QYWNrYWdlRnJvbUNkbihcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnROcG1QYWNrYWdlRnJvbUNkbih7IGltcG9ydE5hbWUsIGRlcHRoIH0sIGN0eClcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgVW5yZXNvbHZlZCBpbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgJHtvcHRzLmN3ZCA/IGBmcm9tIGRpcmVjdG9yeSBcIiR7b3B0cy5jd2R9XCJgIDogXCJcIn1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gIClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgdHlwZSB7XG4gIENpcmN1aXRSdW5uZXJBcGksXG4gIENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxufSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCwgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwibGliL2V2YWxcIlxuaW1wb3J0IHsgbm9ybWFsaXplRnNNYXAgfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5pbXBvcnQgeyBnZXRUc0NvbmZpZyB9IGZyb20gXCIuL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0IHR5cGUgeyBSb290Q2lyY3VpdCB9IGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7IHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZCB9IGZyb20gXCIuL3NldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZFwiXG5pbXBvcnQgeyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IgfSBmcm9tIFwibGliL3V0aWxzL2VuaGFuY2Utcm9vdC1jaXJjdWl0LWVycm9yXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgc2V0VmFsdWVBdFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9vYmotcGF0aFwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6Q2lyY3VpdFJ1bm5lclwiKVxuXG5leHBvcnQgY2xhc3MgQ2lyY3VpdFJ1bm5lciBpbXBsZW1lbnRzIENpcmN1aXRSdW5uZXJBcGkge1xuICBfZXhlY3V0aW9uQ29udGV4dDogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRXhlY3V0aW9uQ29udGV4dD4gfCBudWxsID0gbnVsbFxuICBfY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb246IENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uID0ge1xuICAgIHNuaXBwZXRzQXBpQmFzZVVybDogXCJodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tXCIsXG4gICAgY2pzUmVnaXN0cnlVcmw6IFwiaHR0cHM6Ly9janMudHNjaXJjdWl0LmNvbVwiLFxuICAgIHZlcmJvc2U6IGZhbHNlLFxuICB9XG4gIF9ldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgKCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZClbXT4gPSB7fVxuICBfZGVidWdOYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb246IFBhcnRpYWw8Q2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24+ID0ge30pIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uKVxuICB9XG5cbiAgYXN5bmMgdmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBcIjAuMC4wXCJcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXaXRoRnNNYXAob2dPcHRzOiB7XG4gICAgZW50cnlwb2ludD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRzID0geyAuLi5vZ09wdHMgfVxuXG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIERlYnVnLmVuYWJsZShcInRzY2k6ZXZhbDoqXCIpXG4gICAgfVxuXG4gICAgZGVidWcoXCJleGVjdXRlV2l0aEZzTWFwIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgICBmc01hcEtleXM6IE9iamVjdC5rZXlzKG9wdHMuZnNNYXApLFxuICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgIH0pXG5cbiAgICBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQob3B0cylcblxuICAgIGRlYnVnKFwiZW50cnlwb2ludCBhZnRlciBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQ6XCIsIHtcbiAgICAgIGVudHJ5cG9pbnQ6IG9wdHMuZW50cnlwb2ludCxcbiAgICB9KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQgPSBvcHRzLmVudHJ5cG9pbnQhXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcCA9IG5vcm1hbGl6ZUZzTWFwKG9wdHMuZnNNYXApXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IGdldFRzQ29uZmlnKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXApXG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwW29wdHMuZW50cnlwb2ludCFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudHJ5cG9pbnQgXCIke29wdHMuZW50cnlwb2ludH1cIiBub3QgZm91bmRgKVxuICAgIH1cbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBjb25zdCBlbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IS5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gb3B0cy5lbnRyeXBvaW50XG4gICAgICA6IGAuLyR7b3B0cy5lbnRyeXBvaW50fWBcblxuICAgIGRlYnVnKFwiZmluYWwgZW50cnlwb2ludDpcIiwgZW50cnlwb2ludClcbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChlbnRyeXBvaW50ISwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUoY29kZTogc3RyaW5nLCBvcHRzOiB7IG5hbWU/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlIGNhbGxlZCB3aXRoIGNvZGUgbGVuZ3RoOlwiLFxuICAgICAgICBjb2RlLmxlbmd0aCxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtcImVudHJ5cG9pbnQudHN4XCJdID0gY29kZVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKFwiLi9lbnRyeXBvaW50LnRzeFwiLCB0aGlzLl9leGVjdXRpb25Db250ZXh0KVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUNvbXBvbmVudChjb21wb25lbnQ6IGFueSwgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlQ29tcG9uZW50IGNhbGxlZFwiKVxuICAgIH1cblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHBsYXRmb3JtOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgICAgcHJvamVjdENvbmZpZzogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgICAgZGVidWdOYW1lc3BhY2U6IHRoaXMuX2RlYnVnTmFtZXNwYWNlLFxuICAgICAgfSxcbiAgICApXG4gICAgdGhpcy5fYmluZEV2ZW50TGlzdGVuZXJzKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IG51bGxcblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgPyBjb21wb25lbnQoKSA6IGNvbXBvbmVudFxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5hZGQoZWxlbWVudCBhcyBhbnkpXG4gIH1cblxuICBvbihldmVudDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdID8/PSBbXVxuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XS5wdXNoKGNhbGxiYWNrKVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQ/LmNpcmN1aXQub24oZXZlbnQgYXMgYW55LCBjYWxsYmFjaylcbiAgfVxuXG4gIGFzeW5jIHJlbmRlclVudGlsU2V0dGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LnJlbmRlclVudGlsU2V0dGxlZCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDaXJjdWl0SnNvbigpOiBQcm9taXNlPEFueUNpcmN1aXRFbGVtZW50W10+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5nZXRDaXJjdWl0SnNvbigpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjbGVhckV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGlmICh0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0KSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgICAgY29uc3QgY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogPGV4cGxhbmF0aW9uPlxuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXI/OiAoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEZ1bmN0aW9uKSA9PiB2b2lkXG4gICAgICAgICAgfVxuICAgICAgICAgIGNpcmN1aXQucmVtb3ZlTGlzdGVuZXI/LihldmVudCwgbGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdXG4gICAgfVxuICB9XG5cbiAgYXN5bmMga2lsbCgpIHtcbiAgICAvLyBDbGVhbnVwIHJlc291cmNlc1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBudWxsXG4gIH1cblxuICBhc3luYyBzZXRTbmlwcGV0c0FwaUJhc2VVcmwoYmFzZVVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsID0gYmFzZVVybFxuICB9XG5cbiAgYXN5bmMgc2V0RGlzYWJsZUNkbkxvYWRpbmcoZGlzYWJsZTogYm9vbGVhbikge1xuICAgIDsodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24gYXMgYW55KS5kaXNhYmxlQ2RuTG9hZGluZyA9IGRpc2FibGVcbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnKHBsYXRmb3JtOiBQbGF0Zm9ybUNvbmZpZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0gcGxhdGZvcm1cbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnUHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0ge31cbiAgICB9XG4gICAgc2V0VmFsdWVBdFBhdGgodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sIHByb3BlcnR5LCB2YWx1ZSlcbiAgfVxuXG4gIGFzeW5jIHNldFByb2plY3RDb25maWcocHJvamVjdDogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz4pIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0gcHJvamVjdFxuICB9XG5cbiAgYXN5bmMgc2V0UHJvamVjdENvbmZpZ1Byb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcgPSB7fVxuICAgIH1cbiAgICBzZXRWYWx1ZUF0UGF0aChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICBwcm9wZXJ0eSxcbiAgICAgIHZhbHVlLFxuICAgIClcbiAgfVxuXG4gIGFzeW5jIGVuYWJsZURlYnVnKG5hbWVzcGFjZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVidWdOYW1lc3BhY2UgPSBuYW1lc3BhY2VcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgY29uc3QgY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyBhbnlcbiAgICAgIGNpcmN1aXQuZW5hYmxlRGVidWc/LihuYW1lc3BhY2UpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYmluZEV2ZW50TGlzdGVuZXJzKGNpcmN1aXQ6IFJvb3RDaXJjdWl0KSB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgY2lyY3VpdC5vbihldmVudCBhcyBhbnksIGxpc3RlbmVyIGFzIGFueSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGhPclRocm93IH0gZnJvbSBcIi4vcmVzb2x2ZUZpbGVQYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOnNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZFwiKVxuXG5leHBvcnQgY29uc3Qgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkID0gKG9wdHM6IHtcbiAgZW50cnlwb2ludD86IHN0cmluZ1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBtYWluQ29tcG9uZW50UGF0aD86IHN0cmluZ1xuICBtYWluQ29tcG9uZW50TmFtZT86IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIG1haW5Db21wb25lbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbn0pID0+IHtcbiAgaWYgKCFvcHRzLmVudHJ5cG9pbnQgJiYgIW9wdHMubWFpbkNvbXBvbmVudFBhdGgpIHtcbiAgICBpZiAoXCJpbmRleC50c3hcIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gXCJpbmRleC50c3hcIlxuICAgIH0gZWxzZSBpZiAoXCJpbmRleC50c1wiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBcImluZGV4LnRzXCJcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgT2JqZWN0LmtleXMob3B0cy5mc01hcCkuZmlsdGVyKChrKSA9PiBrLmVuZHNXaXRoKFwiLnRzeFwiKSkubGVuZ3RoID09PSAxXG4gICAgKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gT2JqZWN0LmtleXMob3B0cy5mc01hcClbMF1cbiAgICB9IGVsc2UgaWYgKFwidHNjaXJjdWl0LmNvbmZpZy5qc29uXCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgY29uc3QgY29uZmlnQ29udGVudCA9IG9wdHMuZnNNYXBbXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIl1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UoY29uZmlnQ29udGVudClcbiAgICAgICAgaWYgKGNvbmZpZy5tYWluRW50cnlwb2ludCkge1xuICAgICAgICAgIG9wdHMuZW50cnlwb2ludCA9IGNvbmZpZy5tYWluRW50cnlwb2ludFxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBwYXJzZSB0c2NpcmN1aXQuY29uZmlnLmpzb246XCIsIGUpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFaXRoZXIgZW50cnlwb2ludCBvciBtYWluQ29tcG9uZW50UGF0aCBtdXN0IGJlIHByb3ZpZGVkIChubyBpbmRleCBmaWxlLCBjb3VsZCBub3QgaW5mZXIgZW50cnlwb2ludClcIixcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBpZiAoIW9wdHMuZW50cnlwb2ludCAmJiBvcHRzLm1haW5Db21wb25lbnRQYXRoKSB7XG4gICAgb3B0cy5lbnRyeXBvaW50ID0gXCJlbnRyeXBvaW50LnRzeFwiXG4gICAgY29uc3QgbWFpbkNvbXBvbmVudENvZGUgPVxuICAgICAgb3B0cy5mc01hcFtyZXNvbHZlRmlsZVBhdGhPclRocm93KG9wdHMubWFpbkNvbXBvbmVudFBhdGgsIG9wdHMuZnNNYXApXVxuICAgIGlmICghbWFpbkNvbXBvbmVudENvZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1haW4gY29tcG9uZW50IHBhdGggXCIke29wdHMubWFpbkNvbXBvbmVudFBhdGh9XCIgbm90IGZvdW5kIGluIGZzTWFwLiBBdmFpbGFibGUgcGF0aHM6ICR7T2JqZWN0LmtleXMob3B0cy5mc01hcCkuam9pbihcIiwgXCIpfWAsXG4gICAgICApXG4gICAgfVxuICAgIG9wdHMuZnNNYXBbb3B0cy5lbnRyeXBvaW50XSA9IGBcbiAgICAgaW1wb3J0ICogYXMgVXNlckNvbXBvbmVudHMgZnJvbSBcIi4vJHtvcHRzLm1haW5Db21wb25lbnRQYXRofVwiO1xuICAgICAgICAgIFxuICAgICAgJHtcbiAgICAgICAgb3B0cy5tYWluQ29tcG9uZW50TmFtZVxuICAgICAgICAgID8gYFxuICAgICAgICBjb25zdCBDb21wb25lbnRUb1JlbmRlciA9IFVzZXJDb21wb25lbnRzW1wiJHtvcHRzLm1haW5Db21wb25lbnROYW1lfVwiXVxuICAgICAgICBgXG4gICAgICAgICAgOiBgY29uc3QgQ29tcG9uZW50VG9SZW5kZXIgPSBVc2VyQ29tcG9uZW50cy5kZWZhdWx0IHx8IFxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKFVzZXJDb21wb25lbnRzKVxuICAgICAgICAgIC5maWx0ZXIoKFtuYW1lXSkgPT4gIW5hbWUuc3RhcnRzV2l0aChcInVzZVwiKSlcbiAgICAgICAgICAubWFwKChbXywgY29tcG9uZW50XSkgPT4gY29tcG9uZW50KVswXSB8fCAoKCkgPT4gbnVsbCk7YFxuICAgICAgfVxuXG4gICAgICAgICAgICR7XG4gICAgICAgICAgICAgZGVidWcuZW5hYmxlZFxuICAgICAgICAgICAgICAgPyBgXG4gICAgIGNvbnNvbGUubG9nKHsgVXNlckNvbXBvbmVudHMgfSlcbiAgICAgY29uc29sZS5sb2coXCJDb21wb25lbnRUb1JlbmRlciBcIiArIENvbXBvbmVudFRvUmVuZGVyLnRvU3RyaW5nKCksICB7IENvbXBvbmVudFRvUmVuZGVyIH0pXG4gICAgIGBcbiAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICB9XG5cbiAgICAgIGNpcmN1aXQuYWRkKCAgICAgICBcbiAgICAgICAgICA8Q29tcG9uZW50VG9SZW5kZXIgJHtvcHRzLm1haW5Db21wb25lbnRQcm9wcyA/IGB7Li4uJHtKU09OLnN0cmluZ2lmeShvcHRzLm1haW5Db21wb25lbnRQcm9wcywgbnVsbCwgMil9fWAgOiBcIlwifSAvPiBcbiAgICAgICk7XG5gXG4gIH1cblxuICBpZiAoIW9wdHMubmFtZSAmJiBvcHRzLm1haW5Db21wb25lbnROYW1lKSB7XG4gICAgb3B0cy5uYW1lID0gb3B0cy5tYWluQ29tcG9uZW50TmFtZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvciA9IChcbiAgZXJyb3I6IHVua25vd24sXG4gIGVudHJ5cG9pbnQ/OiBzdHJpbmcsXG4pID0+IHtcbiAgaWYgKFxuICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICBlbnRyeXBvaW50ICYmXG4gICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIlJvb3RDaXJjdWl0IGhhcyBubyBjaGlsZHJlblwiKSAmJlxuICAgICFlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdcImVudHJ5cG9pbnRcIjonKVxuICApIHtcbiAgICBjb25zdCBlbnRyeXBvaW50TWVzc2FnZSA9IGVudHJ5cG9pbnQuc3RhcnRzV2l0aChcIi4vXCIpXG4gICAgICA/IGVudHJ5cG9pbnQuc2xpY2UoMilcbiAgICAgIDogZW50cnlwb2ludFxuICAgIGVycm9yLm1lc3NhZ2UgPSBgJHtlcnJvci5tZXNzYWdlfS4gXCJlbnRyeXBvaW50XCI6IFwiJHtlbnRyeXBvaW50TWVzc2FnZX1cIiBpcyBzZXQgaW4gdGhlIHJ1bm5lciBjb25maWd1cmF0aW9uLCBlbnRyeXBvaW50cyBtdXN0IGNvbnRhaW4gXCJjaXJjdWl0LmFkZCguLi4pXCIsIHlvdSBtaWdodCBiZSBsb29raW5nIHRvIHVzZSBtYWluQ29tcG9uZW50UGF0aCBpbnN0ZWFkIGlmIHlvdXIgZmlsZSBleHBvcnRzIGEgY29tcG9uZW50LmBcbiAgfVxuXG4gIHJldHVybiBlcnJvclxufVxuIiwgIi8qKlxuICogR2V0IGFsbCBwYXRocyBvZiBhbiBvYmplY3RcbiAqXG4gKiBnZXRPYmplY3RQYXRocyh7IGE6IHsgYjogMiwgYzogeyBkOiAzIH0gfSwgZTogNSB9KVxuICpcbiAqIC8vIE91dHB1dDogWydhLmInLCAnYS5jLmQnLCAnZSddXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYmplY3RQYXRocyhcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwcmVmaXggPSBcIlwiLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldXG4gICAgY29uc3QgcGF0aCA9IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrZXl9YCA6IGtleVxuXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHN1YlBhdGhzID0gZ2V0T2JqZWN0UGF0aHModmFsdWUsIHBhdGgpXG4gICAgICBwYXRocy5wdXNoKC4uLnN1YlBhdGhzKVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXRocy5wdXNoKHBhdGgpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhdGhzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUF0UGF0aChvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KFwiLlwiKVxuICBsZXQgY3VycmVudCA9IG9ialxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XVxuICB9XG4gIHJldHVybiBjdXJyZW50XG59XG4vKipcbiAqIFNldCBhIHZhbHVlIGF0IGEgcGF0aCBpbiBhbiBvYmplY3RcbiAqXG4gKiBzZXRWYWx1ZUF0UGF0aCh7IGE6IHsgYjogMiB9IH0sIFwiYS5jLmRcIiwgNSlcbiAqXG4gKiAvLyBPdXRwdXQ6IHsgYTogeyBiOiAyLCBjOiB7IGQ6IDUgfSB9IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbHVlQXRQYXRoKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IGFueSxcbikge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChcIi5cIilcbiAgbGV0IGN1cnJlbnQgPSBvYmpcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuXG4gICAgLy8gSWYgd2UncmUgYXQgdGhlIGxhc3Qga2V5LCBzZXQgdGhlIHZhbHVlLlxuICAgIGlmIChpID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IHZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBrZXkgZG9lc24ndCBleGlzdCBvciBpcyBub3QgYW4gb2JqZWN0IChhdm9pZCBvdmVyd3JpdGluZyBhcnJheXMpLCBjcmVhdGUgYSBuZXcgb2JqZWN0XG4gICAgICBpZiAoXG4gICAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSB8fFxuICAgICAgICB0eXBlb2YgY3VycmVudFtrZXldICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgIGN1cnJlbnRba2V5XSA9PT0gbnVsbCB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KGN1cnJlbnRba2V5XSlcbiAgICAgICkge1xuICAgICAgICBjdXJyZW50W2tleV0gPSB7fVxuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IENpcmN1aXRSdW5uZXIgfSBmcm9tIFwiLi9DaXJjdWl0UnVubmVyXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blRzY2lyY3VpdENvZGUoXG4gIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmcsXG4gIG9wdHM/OiBPbWl0PFBhcmFtZXRlcnM8Q2lyY3VpdFJ1bm5lcltcImV4ZWN1dGVXaXRoRnNNYXBcIl0+WzBdLCBcImZzTWFwXCI+LFxuKSB7XG4gIGlmIChcbiAgICB0eXBlb2YgZmlsZXN5c3RlbU9yQ29kZVN0cmluZyA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICFmaWxlc3lzdGVtT3JDb2RlU3RyaW5nLmluY2x1ZGVzKFwiZXhwb3J0XCIpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgXCJleHBvcnRcIiBrZXl3b3JkIHdhc24ndCBmb3VuZCBpbiB5b3VyIHByb3ZpZGVkIGNvZGUuIFlvdSBuZWVkIHRvIGV4cG9ydCBhIGNvbXBvbmVudCBpbiB5b3VyIGNvZGUsIGUuZy5cXG5cXG5leHBvcnQgZGVmYXVsdCAoKSA9PiAoXFxuICA8cmVzaXN0b3IgbmFtZT1cIlIxXCIgcmVzaXN0YW5jZT1cIjFrXCIgLz5cXG4pYCxcbiAgICApXG4gIH1cbiAgY29uc3QgZmlsZXN5c3RlbSA9XG4gICAgdHlwZW9mIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgPT09IFwic3RyaW5nXCJcbiAgICAgID8geyBcInVzZXItY29kZS50c3hcIjogZmlsZXN5c3RlbU9yQ29kZVN0cmluZyB9XG4gICAgICA6IGZpbGVzeXN0ZW1PckNvZGVTdHJpbmdcblxuICBjb25zdCBjaXJjdWl0UnVubmVyID0gbmV3IENpcmN1aXRSdW5uZXIoKVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIuZXhlY3V0ZVdpdGhGc01hcCh7XG4gICAgZnNNYXA6IGZpbGVzeXN0ZW0sXG4gICAgLi4ub3B0cyxcbiAgfSlcblxuICBhd2FpdCBjaXJjdWl0UnVubmVyLnJlbmRlclVudGlsU2V0dGxlZCgpXG5cbiAgcmV0dXJuIGF3YWl0IGNpcmN1aXRSdW5uZXIuZ2V0Q2lyY3VpdEpzb24oKVxufVxuIiwgImltcG9ydCB7IHJ1blRzY2lyY3VpdENvZGUgfSBmcm9tIFwiLi9ydW5Uc2NpcmN1aXRDb2RlXCJcblxuZXhwb3J0IGNvbnN0IHJ1blRzY2lyY3VpdE1vZHVsZSA9IGFzeW5jIChcbiAgbW9kdWxlOiBzdHJpbmcsXG4gIG9wdHM6IHsgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyBleHBvcnROYW1lPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBpZiAoIW1vZHVsZS5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgIG1vZHVsZSA9IGBAdHNjaS8ke21vZHVsZS5yZXBsYWNlKC9cXC8vLCBcIi5cIil9YFxuICB9XG4gIGNvbnN0IGNpcmN1aXRKc29uID0gYXdhaXQgcnVuVHNjaXJjdWl0Q29kZShcbiAgICB7XG4gICAgICAvLyBUT0RPIGhhbmRsZSBleHBvcnRzIHRoYXQgYXJlIG5vdCB0aGUgZGVmYXVsdCBleHBvcnQgYnkgc2Nhbm5pbmdcbiAgICAgIC8vIG90aGVyRXhwb3J0cyBmb3IgY29tcG9uZW50c1xuICAgICAgXCJ1c2VyLWNvZGUudHN4XCI6IGBcbiAgICBpbXBvcnQgTW9kdWxlLCAqIGFzIG90aGVyRXhwb3J0cyBmcm9tIFwiJHttb2R1bGV9XCI7XG5cbiAgICBsZXQgZXhwb3J0TmFtZSA9IFwiJHtvcHRzLmV4cG9ydE5hbWUgPz8gXCJcIn1cIlxuXG4gICAgaWYgKCghTW9kdWxlIHx8IHR5cGVvZiBNb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgJiYgIUJvb2xlYW4oZXhwb3J0TmFtZSkpIHtcbiAgICAgIGV4cG9ydE5hbWUgPSBPYmplY3Qua2V5cyhvdGhlckV4cG9ydHMpLmZpbHRlcihrZXkgPT4ga2V5WzBdID09PSBrZXlbMF0udG9VcHBlckNhc2UoKSAmJiB0eXBlb2Ygb3RoZXJFeHBvcnRzW2tleV0gPT09IFwiZnVuY3Rpb25cIilbMF1cbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gZXhwb3J0TmFtZSA/IG90aGVyRXhwb3J0c1tleHBvcnROYW1lXSA6IE1vZHVsZVxuXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXFxgTm8gZXhwb3J0IGZvdW5kIGZvciBtb2R1bGUgXCJcXCR7bW9kdWxlfVwiICh0cmllZCBcIlxcJHtleHBvcnROYW1lID8/IFwiZGVmYXVsdFwifVwiKVxcYClcbiAgICB9XG5cbiAgICBleHBvcnQgZGVmYXVsdCBkZWZhdWx0RXhwb3J0O1xuICAgIGAsXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWluQ29tcG9uZW50UHJvcHM6IG9wdHMucHJvcHMsXG4gICAgfSxcbiAgKVxuICByZXR1cm4gY2lyY3VpdEpzb25cbn1cbiIsICJpbXBvcnQgKiBhcyBDb21saW5rIGZyb20gXCJjb21saW5rXCJcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2luZGV4XCJcbmltcG9ydCB0eXBlIHtcbiAgSW50ZXJuYWxXZWJXb3JrZXJBcGksXG4gIFdlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIENpcmN1aXRXZWJXb3JrZXIsXG59IGZyb20gXCIuL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0RXZlbnROYW1lIH0gZnJvbSBcIi4vc2hhcmVkL3R5cGVzXCJcbmltcG9ydCB7IGdldE9iamVjdFBhdGhzLCBnZXRWYWx1ZUF0UGF0aCB9IGZyb20gXCIuL3NoYXJlZC9vYmotcGF0aFwiXG5cbmV4cG9ydCB0eXBlIHsgQ2lyY3VpdFdlYldvcmtlciwgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUjogQ2lyY3VpdFdlYldvcmtlciB8IHVuZGVmaW5lZFxuICB9XG4gIHZhciBUU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSOiBDaXJjdWl0V2ViV29ya2VyIHwgdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDaXJjdWl0V2ViV29ya2VyID0gYXN5bmMgKFxuICBjb25maWd1cmF0aW9uOiBQYXJ0aWFsPFdlYldvcmtlckNvbmZpZ3VyYXRpb24+LFxuKTogUHJvbWlzZTxDaXJjdWl0V2ViV29ya2VyPiA9PiB7XG4gIC8vIEtpbGwgZXhpc3RpbmcgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZSBpZiBwcmVzZW50XG4gIGNvbnN0IGV4aXN0aW5nV29ya2VyID0gZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSXG4gIGlmIChleGlzdGluZ1dvcmtlciAmJiB0eXBlb2YgZXhpc3RpbmdXb3JrZXIua2lsbCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbV29ya2VyXSBLaWxsaW5nIHByZXZpb3VzIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2UuLi5cIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4aXN0aW5nV29ya2VyLmtpbGwoKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiW1dvcmtlcl0gRXJyb3Iga2lsbGluZyBwcmV2aW91cyBnbG9iYWwgd29ya2VyIGluc3RhbmNlOlwiLFxuICAgICAgICAgIGUsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB0aGUga2V5IGlzIGNsZWFyZWQgZXZlbiBpZiBraWxsIHRocm93cyBhbiBlcnJvclxuICAgICAgaWYgKGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9PT0gZXhpc3RpbmdXb3JrZXIpIHtcbiAgICAgICAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJbV29ya2VyXSBDcmVhdGluZyBjaXJjdWl0IHdlYiB3b3JrZXIgd2l0aCBjb25maWc6XCIsXG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgIClcbiAgfVxuXG4gIGxldCB3b3JrZXJCbG9iVXJsID1cbiAgICBjb25maWd1cmF0aW9uLndlYldvcmtlckJsb2JVcmwgPz8gY29uZmlndXJhdGlvbi53ZWJXb3JrZXJVcmxcblxuICBpZiAoIXdvcmtlckJsb2JVcmwpIHtcbiAgICBjb25zdCBjZG5VcmwgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L2V2YWxAJHtjb25maWd1cmF0aW9uLmV2YWxWZXJzaW9uID8/IFwibGF0ZXN0XCJ9L2Rpc3Qvd2Vid29ya2VyL2VudHJ5cG9pbnQuanNgXG5cbiAgICBjb25zdCB3b3JrZXJCbG9iID0gYXdhaXQgZ2xvYmFsVGhpcy5mZXRjaChjZG5VcmwpLnRoZW4oKHJlcykgPT4gcmVzLmJsb2IoKSlcbiAgICB3b3JrZXJCbG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTCh3b3JrZXJCbG9iKVxuICB9XG5cbiAgY29uc3QgcmF3V29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJCbG9iVXJsLCB7IHR5cGU6IFwibW9kdWxlXCIgfSlcbiAgbGV0IHdvcmtlckluaXRFcnJvcjogYW55XG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKGV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIltXb3JrZXJdIEVycm9yIGluIHdvcmtlclwiLCBldmVudClcbiAgICB3b3JrZXJJbml0RXJyb3IgPSBldmVudFxuICB9KVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcInVuaGFuZGxlZHJlamVjdGlvblwiLCAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiW1dvcmtlcl0gVW5oYW5kbGVkIHJlamVjdGlvbiBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH0pXG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZWVycm9yXCIsIChldmVudCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbV29ya2VyXSBNZXNzYWdlIGVycm9yIGluIHdvcmtlclwiLCBldmVudClcbiAgfSlcbiAgY29uc3QgZWFybHlNZXNzYWdlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5sb2coXCJbV29ya2VyXSBNZXNzYWdlIGluIHdvcmtlclwiLCBldmVudClcbiAgfVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZWFybHlNZXNzYWdlSGFuZGxlcilcblxuICAvLyBIYW5kbGUgZmV0Y2ggcmVxdWVzdHMgZnJvbSB0aGUgd29ya2VyXG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBhc3luYyAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhXG4gICAgaWYgKGRhdGE/LnR5cGUgIT09IFwid29ya2VyX2ZldGNoXCIpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2xvYmFsVGhpcy5mZXRjaChkYXRhLmlucHV0LCBkYXRhLmluaXQpXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgICByYXdXb3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICB0eXBlOiBcIndvcmtlcl9mZXRjaF9yZXN1bHRcIixcbiAgICAgICAgcmVxdWVzdElkOiBkYXRhLnJlcXVlc3RJZCxcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgaGVhZGVyczogKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgICB9KSgpLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgcmF3V29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJ3b3JrZXJfZmV0Y2hfcmVzdWx0XCIsXG4gICAgICAgIHJlcXVlc3RJZDogZGF0YS5yZXF1ZXN0SWQsXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIG5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIHN0YWNrOiBlcnIuc3RhY2ssXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfSlcblxuICBpZiAod29ya2VySW5pdEVycm9yKSB7XG4gICAgdGhyb3cgd29ya2VySW5pdEVycm9yXG4gIH1cblxuICBjb25zdCBjb21saW5rV29ya2VyID0gQ29tbGluay53cmFwPEludGVybmFsV2ViV29ya2VyQXBpPihyYXdXb3JrZXIpXG5cbiAgcmF3V29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGVhcmx5TWVzc2FnZUhhbmRsZXIpXG5cbiAgLy8gSGVscGVyIHRvIHNlcmlhbGl6ZSBSZWFjdCBlbGVtZW50cyBmb3IgY3Jvc3Mtd29ya2VyIGNvbW11bmljYXRpb25cbiAgZnVuY3Rpb24gc2VyaWFsaXplUmVhY3RFbGVtZW50KGVsZW1lbnQ6IGFueSk6IGFueSB7XG4gICAgaWYgKCFlbGVtZW50IHx8IHR5cGVvZiBlbGVtZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gZWxlbWVudFxuICAgIH1cblxuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgUmVhY3QgZWxlbWVudFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19pc1NlcmlhbGl6ZWRSZWFjdEVsZW1lbnQ6IHRydWUsXG4gICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgcHJvcHM6IHNlcmlhbGl6ZVByb3BzKGVsZW1lbnQucHJvcHMpLFxuICAgICAgICBrZXk6IGVsZW1lbnQua2V5LFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50XG4gIH1cblxuICBmdW5jdGlvbiBzZXJpYWxpemVQcm9wcyhwcm9wczogYW55KTogYW55IHtcbiAgICBpZiAoIXByb3BzIHx8IHR5cGVvZiBwcm9wcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHByb3BzXG4gICAgfVxuXG4gICAgY29uc3Qgc2VyaWFsaXplZDogYW55ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiY2hpbGRyZW5cIikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBzZXJpYWxpemVkLmNoaWxkcmVuID0gdmFsdWUubWFwKHNlcmlhbGl6ZVJlYWN0RWxlbWVudClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXJpYWxpemVkLmNoaWxkcmVuID0gc2VyaWFsaXplUmVhY3RFbGVtZW50KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJpYWxpemVkW2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZFxuICB9XG5cbiAgLy8gQ29uZGl0aW9uYWxseSBvdmVycmlkZSBnbG9iYWwgZmV0Y2ggaW5zaWRlIHRoZSB3b3JrZXIgdG8gcm91dGUgdGhyb3VnaCB0aGUgcGFyZW50XG4gIC8vIE9ubHkgZW5hYmxlIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgdmlhIGNvbmZpZ3VyYXRpb25cbiAgaWYgKGNvbmZpZ3VyYXRpb24uZW5hYmxlRmV0Y2hQcm94eSkge1xuICAgIHJhd1dvcmtlci5wb3N0TWVzc2FnZSh7IHR5cGU6IFwib3ZlcnJpZGVfZ2xvYmFsX2ZldGNoXCIgfSlcbiAgfVxuXG4gIGlmIChjb25maWd1cmF0aW9uLmRpc2FibGVDZG5Mb2FkaW5nKSB7XG4gICAgYXdhaXQgY29tbGlua1dvcmtlci5zZXREaXNhYmxlQ2RuTG9hZGluZyh0cnVlKVxuICB9XG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsKSB7XG4gICAgYXdhaXQgY29tbGlua1dvcmtlci5zZXRTbmlwcGV0c0FwaUJhc2VVcmwoY29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwpXG4gIH1cblxuICBjb25zdCBtYXliZVByb3h5ID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBDb21saW5rLnByb3h5KHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBpZiAoY29uZmlndXJhdGlvbi5wbGF0Zm9ybSkge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBnZXRPYmplY3RQYXRocyhjb25maWd1cmF0aW9uLnBsYXRmb3JtKSkge1xuICAgICAgYXdhaXQgY29tbGlua1dvcmtlclxuICAgICAgICAuc2V0UGxhdGZvcm1Db25maWdQcm9wZXJ0eShcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIG1heWJlUHJveHkoZ2V0VmFsdWVBdFBhdGgoY29uZmlndXJhdGlvbi5wbGF0Zm9ybSwgcGF0aCkpLFxuICAgICAgICApXG4gICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciBzZXR0aW5nIHBsYXRmb3JtIGNvbmZpZyBwcm9wZXJ0eSAke3BhdGh9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cbiAgaWYgKGNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZykge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBnZXRPYmplY3RQYXRocyhjb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpKSB7XG4gICAgICBhd2FpdCBjb21saW5rV29ya2VyXG4gICAgICAgIC5zZXRQcm9qZWN0Q29uZmlnUHJvcGVydHkoXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBtYXliZVByb3h5KGdldFZhbHVlQXRQYXRoKGNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZywgcGF0aCkpLFxuICAgICAgICApXG4gICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciBzZXR0aW5nIHByb2plY3QgY29uZmlnIHByb3BlcnR5ICR7cGF0aH06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWAsXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGxldCBpc1Rlcm1pbmF0ZWQgPSBmYWxzZVxuXG4gIC8vIENyZWF0ZSBhIHdyYXBwZXIgdGhhdCBoYW5kbGVzIGV2ZW50cyBkaXJlY3RseSB0aHJvdWdoIGNpcmN1aXQgaW5zdGFuY2VcbiAgY29uc3Qgd3JhcHBlcjogQ2lyY3VpdFdlYldvcmtlciA9IHtcbiAgICBjbGVhckV2ZW50TGlzdGVuZXJzOiBjb21saW5rV29ya2VyLmNsZWFyRXZlbnRMaXN0ZW5lcnMuYmluZChjb21saW5rV29ya2VyKSxcbiAgICBlbmFibGVEZWJ1ZzogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZW5hYmxlRGVidWdcIilcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmVuYWJsZURlYnVnLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIHZlcnNpb246IGNvbWxpbmtXb3JrZXIudmVyc2lvbi5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGV4ZWN1dGU6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVcIilcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGUuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgZXhlY3V0ZUNvbXBvbmVudDogYXN5bmMgKGNvbXBvbmVudDogYW55KSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVDb21wb25lbnRcIixcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBpdCdzIGEgZnVuY3Rpb24sIHBhc3MgaXQgYXMtaXMgKHdpbGwgYmUgcHJveGllZCBieSBDb21saW5rKVxuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlQ29tcG9uZW50LmJpbmQoY29tbGlua1dvcmtlcikoY29tcG9uZW50KVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBpdCdzIGEgUmVhY3QgZWxlbWVudCwgc2VyaWFsaXplIGl0IHRvIGEgcmVjb25zdHJ1Y3RhYmxlIGZvcm1hdFxuICAgICAgaWYgKGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmIGNvbXBvbmVudC50eXBlKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRFbGVtZW50ID0gc2VyaWFsaXplUmVhY3RFbGVtZW50KGNvbXBvbmVudClcbiAgICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZUNvbXBvbmVudC5iaW5kKGNvbWxpbmtXb3JrZXIpKFxuICAgICAgICAgIHNlcmlhbGl6ZWRFbGVtZW50LFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVDb21wb25lbnQuYmluZChjb21saW5rV29ya2VyKShjb21wb25lbnQpXG4gICAgfSxcbiAgICBleGVjdXRlV2l0aEZzTWFwOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlV2l0aEZzTWFwXCIsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVXaXRoRnNNYXAuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgcmVuZGVyVW50aWxTZXR0bGVkOiBjb21saW5rV29ya2VyLnJlbmRlclVudGlsU2V0dGxlZC5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGdldENpcmN1aXRKc29uOiBjb21saW5rV29ya2VyLmdldENpcmN1aXRKc29uLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgb246IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSA9PiB7XG4gICAgICBjb25zdCBwcm94aWVkQ2FsbGJhY2sgPSBDb21saW5rLnByb3h5KGNhbGxiYWNrKVxuICAgICAgY29tbGlua1dvcmtlci5vbihldmVudCBhcyBSb290Q2lyY3VpdEV2ZW50TmFtZSwgcHJveGllZENhbGxiYWNrKVxuICAgIH0sXG4gICAga2lsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29tbGlua1dvcmtlcltDb21saW5rLnJlbGVhc2VQcm94eV0oKVxuICAgICAgcmF3V29ya2VyLnRlcm1pbmF0ZSgpXG4gICAgICBpc1Rlcm1pbmF0ZWQgPSB0cnVlXG4gICAgICBpZiAoZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID09PSB3cmFwcGVyKSB7XG4gICAgICAgIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0sXG4gIH1cbiAgOyh3cmFwcGVyIGFzIGFueSkuX19yYXdXb3JrZXIgPSByYXdXb3JrZXJcbiAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gd3JhcHBlclxuICByZXR1cm4gd3JhcHBlclxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vcnVubmVyL25vcm1hbGl6ZUZzTWFwXCJcblxuZXhwb3J0IGNvbnN0IGdldFBvc3NpYmxlRW50cnlwb2ludENvbXBvbmVudFBhdGhzID0gKFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbcGF0aCwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKHBhdGgpXSA9IGNvbnRlbnRcbiAgfVxuXG4gIGNvbnN0IHBvc3NpYmxlID0gbmV3IFNldDxzdHJpbmc+KClcblxuICBpZiAoXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIiBpbiBub3JtYWxpemVkRnNNYXApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShub3JtYWxpemVkRnNNYXBbXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIl0pXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5tYWluRW50cnlwb2ludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBwb3NzaWJsZS5hZGQobm9ybWFsaXplRmlsZVBhdGgoY29uZmlnLm1haW5FbnRyeXBvaW50KSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuXG4gIGlmIChub3JtYWxpemVkRnNNYXBbXCJpbmRleC50c3hcIl0pIHBvc3NpYmxlLmFkZChcImluZGV4LnRzeFwiKVxuICBpZiAobm9ybWFsaXplZEZzTWFwW1wiaW5kZXgudHNcIl0pIHBvc3NpYmxlLmFkZChcImluZGV4LnRzXCIpXG5cbiAgY29uc3QgY2lyY3VpdEZpbGVzID0gT2JqZWN0LmtleXMobm9ybWFsaXplZEZzTWFwKS5maWx0ZXIoKGspID0+XG4gICAgay5lbmRzV2l0aChcIi5jaXJjdWl0LnRzeFwiKSxcbiAgKVxuICBmb3IgKGNvbnN0IGZpbGUgb2YgY2lyY3VpdEZpbGVzKSB7XG4gICAgcG9zc2libGUuYWRkKGZpbGUpXG4gIH1cblxuICBjb25zdCB0c3hGaWxlcyA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWRGc01hcCkuZmlsdGVyKChrKSA9PlxuICAgIGsuZW5kc1dpdGgoXCIudHN4XCIpLFxuICApXG4gIGlmICh0c3hGaWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICBwb3NzaWJsZS5hZGQodHN4RmlsZXNbMF0pXG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShwb3NzaWJsZSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLG1CQUFtQjtBQUU1QixZQUFZLG1CQUFtQjtBQUMvQixZQUFZLFdBQVc7QUFDdkIsWUFBWSxxQkFBcUI7QUFDakMsWUFBWSx3QkFBd0I7OztBQ0E3QixJQUFNLGdDQUFnQyxDQUMzQyxtQkFDdUI7QUFFdkIsTUFBSSxRQUFRLGVBQWUsTUFBTSxnQkFBZ0I7QUFDakQsTUFBSSxNQUFPLFFBQU8sTUFBTSxDQUFDO0FBSXpCLFVBQVEsZUFBZTtBQUFBLElBQ3JCO0FBQUEsRUFDRjtBQUNBLE1BQUksTUFBTyxRQUFPLE1BQU0sQ0FBQztBQUV6QixTQUFPO0FBQ1Q7OztBQ2hCTyxJQUFNLHFDQUFxQyxDQUNoRCxzQkFDVztBQUNYLE1BQUksa0JBQWtCLFNBQVMsS0FBSyxHQUFHO0FBQ3JDLFdBQU8sa0JBQWtCLFFBQVEsUUFBUSxFQUFFO0FBQUEsRUFDN0M7QUFDQSxTQUFPO0FBQ1Q7OztBQ0pPLElBQU0sdUJBQXVCLENBQ2xDLGNBQ3VCO0FBQ3ZCLE1BQUksQ0FBQyxVQUFXLFFBQU87QUFFdkIsTUFBSSxVQUFVLFdBQVcsUUFBUSxHQUFHO0FBQ2xDLFVBQU0sb0JBQW9CLDhCQUE4QixTQUFTO0FBQ2pFLFFBQUksbUJBQW1CO0FBQ3JCLGFBQU8sbUNBQW1DLGlCQUFpQjtBQUFBLElBQzdEO0FBR0EsV0FBTztBQUFBLEVBQ1Q7QUFHQSxTQUFPLG1DQUFtQyxTQUFTO0FBQ3JEOzs7QUNyQk8sSUFBTSxRQUFRLG9CQUFJLElBQWlCO0FBRTFDLElBQU0sb0JBQW9CLE9BQU8sTUFBVyxXQUFnQjtBQUMxRCxRQUFNLGNBQWMs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VTtBQUNwQixxQkFBZTtBQUNmLFVBQUksV0FBVyxvQ0FBb0MsU0FBUztBQUMxRCxtQkFBVyxrQ0FBa0M7QUFBQSxNQUMvQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0MsRUFBQyxRQUFnQixjQUFjO0FBQ2hDLGFBQVcsa0NBQWtDO0FBQzdDLFNBQU87QUFDVDs7O0FDclJPLElBQU0sc0NBQXNDLENBQ2pELFVBQ2E7QUFDYixRQUFNLGtCQUEwQyxDQUFDO0FBQ2pELGFBQVcsQ0FBQyxNQUFNLE9BQU8sS0FBSyxPQUFPLFFBQVEsS0FBSyxHQUFHO0FBQ25ELG9CQUFnQixrQkFBa0IsSUFBSSxDQUFDLElBQUk7QUFBQSxFQUM3QztBQUVBLFFBQU0sV0FBVyxvQkFBSSxJQUFZO0FBRWpDLE1BQUksMkJBQTJCLGlCQUFpQjtBQUM5QyxRQUFJO0FBQ0YsWUFBTSxTQUFTLEtBQUssTUFBTSxnQkFBZ0IsdUJBQXVCLENBQUM7QUFDbEUsVUFBSSxPQUFPLE9BQU8sbUJBQW1CLFVBQVU7QUFDN0MsaUJBQVMsSUFBSSxrQkFBa0IsT0FBTyxjQUFjLENBQUM7QUFBQSxNQUN2RDtBQUFBLElBQ0YsUUFBUTtBQUFBLElBRVI7QUFBQSxFQUNGO0FBRUEsTUFBSSxnQkFBZ0IsV0FBVyxFQUFHLFVBQVMsSUFBSSxXQUFXO0FBQzFELE1BQUksZ0JBQWdCLFVBQVUsRUFBRyxVQUFTLElBQUksVUFBVTtBQUV4RCxRQUFNLGVBQWUsT0FBTyxLQUFLLGVBQWUsRUFBRTtBQUFBLElBQU8sQ0FBQyxNQUN4RCxFQUFFLFNBQVMsY0FBYztBQUFBLEVBQzNCO0FBQ0EsYUFBVyxRQUFRLGNBQWM7QUFDL0IsYUFBUyxJQUFJLElBQUk7QUFBQSxFQUNuQjtBQUVBLFFBQU0sV0FBVyxPQUFPLEtBQUssZUFBZSxFQUFFO0FBQUEsSUFBTyxDQUFDLE1BQ3BELEVBQUUsU0FBUyxNQUFNO0FBQUEsRUFDbkI7QUFDQSxNQUFJLFNBQVMsV0FBVyxHQUFHO0FBQ3pCLGFBQVMsSUFBSSxTQUFTLENBQUMsQ0FBQztBQUFBLEVBQzFCO0FBRUEsU0FBTyxNQUFNLEtBQUssUUFBUTtBQUM1QjsiLAogICJuYW1lcyI6IFsiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiaW1wb3J0TmFtZSIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJ1bnByZWZpeGVkUGF0aCIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyJdCn0K