@tscircuit/cli 0.1.32 → 0.1.34

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.
@@ -4,6 +4,10 @@ import webWorkerBundleUrl from "@tscircuit/eval/blob-url"
4
4
  import { getVirtualFileSystemFromDirPath } from "make-vfs"
5
5
  import path from "node:path"
6
6
  import fs from "node:fs"
7
+ import {
8
+ convertCircuitJsonToSchematicSvg,
9
+ convertCircuitJsonToPcbSvg,
10
+ } from "circuit-to-svg"
7
11
 
8
12
  const ALLOWED_FORMATS = [
9
13
  "json",
@@ -75,13 +79,25 @@ circuit.add(<MyCircuit />)
75
79
  await worker.renderUntilSettled()
76
80
 
77
81
  const circuitJson = await worker.getCircuitJson()
78
-
79
82
  const outputPath = path.join(
80
83
  projectDir,
81
84
  `${output}${OUTPUT_EXTENSIONS[format as Format]}`,
82
85
  )
83
86
 
84
- fs.writeFileSync(outputPath, JSON.stringify(circuitJson))
87
+ let outputContent: string
88
+
89
+ switch (format) {
90
+ case "schematic-svg":
91
+ outputContent = convertCircuitJsonToSchematicSvg(circuitJson)
92
+ break
93
+ case "pcb-svg":
94
+ outputContent = convertCircuitJsonToPcbSvg(circuitJson)
95
+ break
96
+ default:
97
+ outputContent = JSON.stringify(circuitJson)
98
+ }
99
+
100
+ fs.writeFileSync(outputPath, outputContent)
85
101
 
86
102
  console.log(`Exported to ${outputPath}`)
87
103
 
package/dist/main.js CHANGED
@@ -251,7 +251,7 @@ var package_default = {
251
251
  name: "@tscircuit/cli",
252
252
  main: "dist/main.js",
253
253
  type: "module",
254
- version: "0.1.31",
254
+ version: "0.1.33",
255
255
  bin: {
256
256
  tsci: "./dist/main.js"
257
257
  },
@@ -283,7 +283,9 @@ var package_default = {
283
283
  "@tscircuit/eval": "^0.0.96",
284
284
  "@tscircuit/file-server": "^0.0.13",
285
285
  "@tscircuit/runframe": "^0.0.167",
286
+ "bun-match-svg": "^0.0.9",
286
287
  chokidar: "4.0.1",
288
+ "circuit-to-svg": "^0.0.101",
287
289
  commander: "^12.1.0",
288
290
  configstore: "^7.0.0",
289
291
  cosmiconfig: "^9.0.0",
@@ -335,7 +337,9 @@ var createHttpServer = async (port = 3020) => {
335
337
  res.end(content);
336
338
  return;
337
339
  } catch (error) {
338
- console.error("Error serving standalone.min.js:", error);
340
+ console.info(
341
+ "Local runframe standalone not found, falling back to the production version."
342
+ );
339
343
  }
340
344
  res.writeHead(302, {
341
345
  Location: `https://cdn.jsdelivr.net/npm/@tscircuit/runframe@${package_default.dependencies["@tscircuit/runframe"].replace(/^[^0-9]+/, "")}/dist/standalone.min.js`
@@ -1069,6 +1073,10 @@ import webWorkerBundleUrl from "@tscircuit/eval/blob-url";
1069
1073
  import { getVirtualFileSystemFromDirPath } from "make-vfs";
1070
1074
  import path12 from "node:path";
1071
1075
  import fs13 from "node:fs";
1076
+ import {
1077
+ convertCircuitJsonToSchematicSvg,
1078
+ convertCircuitJsonToPcbSvg
1079
+ } from "circuit-to-svg";
1072
1080
  var ALLOWED_FORMATS = [
1073
1081
  "json",
1074
1082
  "circuit-json",
@@ -1127,7 +1135,18 @@ circuit.add(<MyCircuit />)
1127
1135
  projectDir,
1128
1136
  `${output}${OUTPUT_EXTENSIONS[format]}`
1129
1137
  );
1130
- fs13.writeFileSync(outputPath, JSON.stringify(circuitJson));
1138
+ let outputContent;
1139
+ switch (format) {
1140
+ case "schematic-svg":
1141
+ outputContent = convertCircuitJsonToSchematicSvg(circuitJson);
1142
+ break;
1143
+ case "pcb-svg":
1144
+ outputContent = convertCircuitJsonToPcbSvg(circuitJson);
1145
+ break;
1146
+ default:
1147
+ outputContent = JSON.stringify(circuitJson);
1148
+ }
1149
+ fs13.writeFileSync(outputPath, outputContent);
1131
1150
  console.log(`Exported to ${outputPath}`);
1132
1151
  process.exit(0);
1133
1152
  });
@@ -1195,4 +1214,4 @@ if (process.argv.length === 2) {
1195
1214
  export {
1196
1215
  program
1197
1216
  };
1198
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2luaXQvcmVnaXN0ZXIudHMiLCAiLi4vbGliL3NoYXJlZC9kZXRlY3QtcGtnLW1hbmFnZXIudHMiLCAiLi4vbGliL3NoYXJlZC9zZXR1cC10c2NpLXBhY2thZ2VzLnRzIiwgIi4uL2xpYi9zaGFyZWQvZ2VuZXJhdGUtdHMtY29uZmlnLnRzIiwgIi4uL2xpYi9zaGFyZWQvd3JpdGUtZmlsZS1pZi1ub3QtZXhpc3RzLnRzIiwgIi4uL2xpYi9zaGFyZWQvZ2VuZXJhdGUtZ2l0aWdub3JlLWZpbGUudHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldC50cyIsICIuLi9jbGkvZGV2L0RldlNlcnZlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXIudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL2xpYi9zaXRlL2dldEluZGV4LnRzIiwgIi4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyLnRzIiwgIi4uL2xpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2ZpbmRJbXBvcnRzSW5TbmlwcGV0LnRzIiwgIi4uL2xpYi9jbGktY29uZmlnL2luZGV4LnRzIiwgIi4uL2xpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5LnRzIiwgIi4uL2xpYi9zaGFyZWQvcHVzaC1zbmlwcGV0LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ2luL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9hdXRoL2xvZ291dC9yZWdpc3Rlci50cyIsICIuLi9jbGkvYXV0aC9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jb25maWcvcHJpbnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Nsb25lL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9leHBvcnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvcHJpbnQtdG9rZW4vcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9wdXNoL3JlZ2lzdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyByZWdpc3RlckluaXQgfSBmcm9tIFwiLi9pbml0L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGV2IH0gZnJvbSBcIi4vZGV2L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aExvZ2luIH0gZnJvbSBcIi4vYXV0aC9sb2dpbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dvdXQgfSBmcm9tIFwiLi9hdXRoL2xvZ291dC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGggfSBmcm9tIFwiLi9hdXRoL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnUHJpbnQgfSBmcm9tIFwiLi9jb25maWcvcHJpbnQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDbG9uZSB9IGZyb20gXCIuL2Nsb25lL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHBlcmZlY3RDbGkgfSBmcm9tIFwicGVyZmVjdC1jbGlcIlxuaW1wb3J0IHBrZyBmcm9tIFwiLi4vcGFja2FnZS5qc29uXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5pbXBvcnQgeyByZWdpc3RlckV4cG9ydCB9IGZyb20gXCIuL2V4cG9ydC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhQcmludFRva2VuIH0gZnJvbSBcIi4vYXV0aC9wcmludC10b2tlbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhTZXRUb2tlbiB9IGZyb20gXCIuL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyUHVzaCB9IGZyb20gXCIuL3B1c2gvcmVnaXN0ZXJcIlxuXG5leHBvcnQgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcblxucHJvZ3JhbVxuICAubmFtZShcInRzY2lcIilcbiAgLmRlc2NyaXB0aW9uKFwiQ0xJIGZvciBkZXZlbG9waW5nIHRzY2lyY3VpdCBzbmlwcGV0c1wiKVxuICAvLyBIQUNLOiBhdCBidWlsZCB0aW1lIHRoZSB2ZXJzaW9uIGlzIG9sZCwgd2UgbmVlZCB0b1xuICAvLyBmaXggdGhpcyBhdCBzb21lIHBvaW50Li4uXG4gIC52ZXJzaW9uKHNlbXZlci5pbmMocGtnLnZlcnNpb24sIFwicGF0Y2hcIikgPz8gcGtnLnZlcnNpb24pXG5cbnJlZ2lzdGVySW5pdChwcm9ncmFtKVxuXG5yZWdpc3RlckRldihwcm9ncmFtKVxucmVnaXN0ZXJDbG9uZShwcm9ncmFtKVxucmVnaXN0ZXJQdXNoKHByb2dyYW0pXG5cbnJlZ2lzdGVyQXV0aChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoTG9naW4ocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aExvZ291dChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoUHJpbnRUb2tlbihwcm9ncmFtKVxucmVnaXN0ZXJBdXRoU2V0VG9rZW4ocHJvZ3JhbSlcblxucmVnaXN0ZXJDb25maWcocHJvZ3JhbSlcbnJlZ2lzdGVyQ29uZmlnUHJpbnQocHJvZ3JhbSlcblxucmVnaXN0ZXJFeHBvcnQocHJvZ3JhbSlcblxuaWYgKHByb2Nlc3MuYXJndi5sZW5ndGggPT09IDIpIHtcbiAgcGVyZmVjdENsaShwcm9ncmFtLCBwcm9jZXNzLmFyZ3YpXG59IGVsc2Uge1xuICBwcm9ncmFtLnBhcnNlKClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBzZXR1cFRzY2lQcm9qZWN0IH0gZnJvbSBcImxpYi9zaGFyZWQvc2V0dXAtdHNjaS1wYWNrYWdlc1wiXG5pbXBvcnQgeyBnZW5lcmF0ZVRzQ29uZmlnIH0gZnJvbSBcImxpYi9zaGFyZWQvZ2VuZXJhdGUtdHMtY29uZmlnXCJcbmltcG9ydCB7IHdyaXRlRmlsZUlmTm90RXhpc3RzIH0gZnJvbSBcImxpYi9zaGFyZWQvd3JpdGUtZmlsZS1pZi1ub3QtZXhpc3RzXCJcbmltcG9ydCB7IGdlbmVyYXRlR2l0SWdub3JlRmlsZSB9IGZyb20gXCJsaWIvc2hhcmVkL2dlbmVyYXRlLWdpdGlnbm9yZS1maWxlXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVySW5pdCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImluaXRcIilcbiAgICAuZGVzY3JpcHRpb24oXG4gICAgICBcIkluaXRpYWxpemUgYSBuZXcgVFNDaXJjdWl0IHByb2plY3QgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgKG9yIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5vbmUgaXMgcHJvdmlkZWQpXCIsXG4gICAgKVxuICAgIC5hcmd1bWVudChcbiAgICAgIFwiW2RpcmVjdG9yeV1cIixcbiAgICAgIFwiRGlyZWN0b3J5IG5hbWUgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IGRpcmVjdG9yeSlcIixcbiAgICApXG4gICAgLmFjdGlvbigoZGlyZWN0b3J5Pzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBwcm9qZWN0RGlyID0gZGlyZWN0b3J5XG4gICAgICAgID8gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGRpcmVjdG9yeSlcbiAgICAgICAgOiBwcm9jZXNzLmN3ZCgpXG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgZnMubWtkaXJTeW5jKHByb2plY3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgIC8vIENyZWF0ZSBlc3NlbnRpYWwgcHJvamVjdCBmaWxlc1xuICAgICAgd3JpdGVGaWxlSWZOb3RFeGlzdHMoXG4gICAgICAgIHBhdGguam9pbihwcm9qZWN0RGlyLCBcImluZGV4LnRzeFwiKSxcbiAgICAgICAgYFxuaW1wb3J0IFwiQHRzY2lyY3VpdC9jb3JlXCI7XG5cbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcbiAgPGJvYXJkIHdpZHRoPVwiMTBtbVwiIGhlaWdodD1cIjEwbW1cIj5cbiAgICA8cmVzaXN0b3IgcmVzaXN0YW5jZT1cIjFrXCIgZm9vdHByaW50PVwiMDQwMlwiIG5hbWU9XCJSMVwiIHNjaFg9ezN9IHBjYlg9ezN9IC8+XG4gICAgPGNhcGFjaXRvciBjYXBhY2l0YW5jZT1cIjEwMDBwRlwiIGZvb3RwcmludD1cIjA0MDJcIiBuYW1lPVwiQzFcIiBzY2hYPXstM30gcGNiWD17LTN9IC8+XG4gICAgPHRyYWNlIGZyb209XCIuUjEgPiAucGluMVwiIHRvPVwiLkMxID4gLnBpbjFcIiAvPlxuICA8L2JvYXJkPlxuKTtcbmAsXG4gICAgICApXG5cbiAgICAgIHdyaXRlRmlsZUlmTm90RXhpc3RzKFxuICAgICAgICBwYXRoLmpvaW4ocHJvamVjdERpciwgXCIubnBtcmNcIiksXG4gICAgICAgIGBcbkB0c2NpOnJlZ2lzdHJ5PWh0dHBzOi8vbnBtLnRzY2lyY3VpdC5jb21cbmAsXG4gICAgICApXG5cbiAgICAgIC8vIFNldHVwIHByb2plY3QgZGVwZW5kZW5jaWVzXG4gICAgICB0cnkge1xuICAgICAgICBzZXR1cFRzY2lQcm9qZWN0KHByb2plY3REaXIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzOlwiLCBlcnJvcilcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIHRzY29uZmlnLmpzb25cbiAgICAgIGdlbmVyYXRlVHNDb25maWcocHJvamVjdERpcilcbiAgICAgIC8vIENyZWF0ZSAuZ2l0aWdub3JlIGZpbGVcbiAgICAgIGdlbmVyYXRlR2l0SWdub3JlRmlsZShwcm9qZWN0RGlyKVxuXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGBcdUQ4M0NcdURGODkgSW5pdGlhbGl6YXRpb24gY29tcGxldGUhIFJ1biAke2RpcmVjdG9yeSA/IGBcImNkICR7ZGlyZWN0b3J5fVwiICYgYCA6IFwiXCJ9XCJ0c2NpIGRldlwiIHRvIHN0YXJ0IGRldmVsb3BpbmcuYCxcbiAgICAgIClcbiAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gXCJmc1wiXG5cbi8vIERldGVjdCB0aGUgcGFja2FnZSBtYW5hZ2VyIGJlaW5nIHVzZWQgaW4gdGhlIHByb2plY3RcbmV4cG9ydCBjb25zdCBkZXRlY3RQYWNrYWdlTWFuYWdlciA9ICgpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB1c2VyQWdlbnQgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX3VzZXJfYWdlbnQgfHwgXCJcIlxuICBpZiAodXNlckFnZW50LnN0YXJ0c1dpdGgoXCJ5YXJuXCIpKSByZXR1cm4gXCJ5YXJuXCJcbiAgaWYgKHVzZXJBZ2VudC5zdGFydHNXaXRoKFwicG5wbVwiKSkgcmV0dXJuIFwicG5wbVwiXG4gIGlmICh1c2VyQWdlbnQuc3RhcnRzV2l0aChcImJ1blwiKSkgcmV0dXJuIFwiYnVuXCJcblxuICBpZiAoZnMuZXhpc3RzU3luYyhcInlhcm4ubG9ja1wiKSkgcmV0dXJuIFwieWFyblwiXG4gIGlmIChmcy5leGlzdHNTeW5jKFwicG5wbS1sb2NrLnlhbWxcIikpIHJldHVybiBcInBucG1cIlxuICBpZiAoZnMuZXhpc3RzU3luYyhcImJ1bi5sb2NrYlwiKSkgcmV0dXJuIFwiYnVuXCJcblxuICByZXR1cm4gXCJucG1cIiAvLyBEZWZhdWx0IHRvIG5wbVxufVxuIiwgImltcG9ydCB7IGRldGVjdFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vZGV0ZWN0LXBrZy1tYW5hZ2VyXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFRzY2lQcm9qZWN0KFxuICBkaXJlY3RvcnkgPSBwcm9jZXNzLmN3ZCgpLFxuICBkZXBlbmRlbmNpZXMgPSBbXCJAdHlwZXMvcmVhY3RcIiwgXCJAdHNjaXJjdWl0L2NvcmVcIl0sXG4pIHtcbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoLnJlc29sdmUoZGlyZWN0b3J5KVxuICBpZiAoIWZzLmV4aXN0c1N5bmMocHJvamVjdFBhdGgpKSB7XG4gICAgZnMubWtkaXJTeW5jKHByb2plY3RQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICB9XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gZGV0ZWN0UGFja2FnZU1hbmFnZXIoKVxuXG4gIGNvbnNvbGUubG9nKGBJbml0aWFsaXppbmcgcHJvamVjdCBpbiAke3Byb2plY3RQYXRofS4uLmApXG4gIHByb2Nlc3MuY2hkaXIocHJvamVjdFBhdGgpXG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKFwicGFja2FnZS5qc29uXCIpKSB7XG4gICAgY29uc3QgaW5pdENvbW1hbmQgPVxuICAgICAgcGFja2FnZU1hbmFnZXIgPT09IFwieWFyblwiXG4gICAgICAgID8gXCJ5YXJuIGluaXQgLXlcIlxuICAgICAgICA6IHBhY2thZ2VNYW5hZ2VyID09PSBcInBucG1cIlxuICAgICAgICAgID8gXCJwbnBtIGluaXRcIlxuICAgICAgICAgIDogcGFja2FnZU1hbmFnZXIgPT09IFwiYnVuXCJcbiAgICAgICAgICAgID8gXCJidW4gaW5pdCAteVwiXG4gICAgICAgICAgICA6IFwibnBtIGluaXQgLXlcIlxuXG4gICAgZXhlY1N5bmMoaW5pdENvbW1hbmQsIHsgc3RkaW86IFwiaW5oZXJpdFwiIH0pXG4gICAgY29uc29sZS5sb2coXCJQcm9qZWN0IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS5cIilcbiAgfVxuXG4gIC8vIFJlYWQgYW5kIG1vZGlmeSBwYWNrYWdlLmpzb25cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCBcInBhY2thZ2UuanNvblwiKVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgXCJ1dGYtOFwiKSlcblxuICAvLyBSZW1vdmUgdW53YW50ZWQgZmllbGRzXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5rZXl3b3Jkc1xuICBkZWxldGUgcGFja2FnZUpzb24uYXV0aG9yXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5tYWluXG5cbiAgZnMud3JpdGVGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCBudWxsLCAyKSlcbiAgY29uc29sZS5sb2coXCJVcGRhdGVkIHBhY2thZ2UuanNvbiB0byByZW1vdmUgdW5uZWNlc3NhcnkgZmllbGRzLlwiKVxuXG4gIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuLi5cIilcbiAgICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9XG4gICAgICBwYWNrYWdlTWFuYWdlciA9PT0gXCJ5YXJuXCJcbiAgICAgICAgPyBgeWFybiBhZGQgLUQgJHtkZXBlbmRlbmNpZXMuam9pbihcIiBcIil9YFxuICAgICAgICA6IHBhY2thZ2VNYW5hZ2VyID09PSBcInBucG1cIlxuICAgICAgICAgID8gYHBucG0gYWRkIC1EICR7ZGVwZW5kZW5jaWVzLmpvaW4oXCIgXCIpfWBcbiAgICAgICAgICA6IHBhY2thZ2VNYW5hZ2VyID09PSBcImJ1blwiXG4gICAgICAgICAgICA/IGBidW4gYWRkIC1EICR7ZGVwZW5kZW5jaWVzLmpvaW4oXCIgXCIpfWBcbiAgICAgICAgICAgIDogYG5wbSBpbnN0YWxsIC1EICR7ZGVwZW5kZW5jaWVzLmpvaW4oXCIgXCIpfWBcblxuICAgIGV4ZWNTeW5jKGluc3RhbGxDb21tYW5kLCB7IHN0ZGlvOiBcImluaGVyaXRcIiB9KVxuICAgIGNvbnNvbGUubG9nKFwiRGVwZW5kZW5jaWVzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHkuXCIpXG4gIH1cblxuICByZXR1cm4gcGFja2FnZUpzb24ubmFtZSB8fCBcInVua25vd25cIlxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgd3JpdGVGaWxlSWZOb3RFeGlzdHMgfSBmcm9tIFwiLi93cml0ZS1maWxlLWlmLW5vdC1leGlzdHNcIlxuXG4vLyBHZW5lcmF0ZSBhIFJlYWN0LWNvbXBhdGlibGUgdHNjb25maWcuanNvblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlVHNDb25maWcgPSAoZGlyOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgdHNjb25maWdQYXRoID0gcGF0aC5qb2luKGRpciwgXCJ0c2NvbmZpZy5qc29uXCIpXG4gIGNvbnN0IHRzY29uZmlnQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KFxuICAgIHtcbiAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICB0YXJnZXQ6IFwiRVM2XCIsXG4gICAgICAgIG1vZHVsZTogXCJFU05leHRcIixcbiAgICAgICAganN4OiBcInJlYWN0LWpzeFwiLFxuICAgICAgICBvdXREaXI6IFwiZGlzdFwiLFxuICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSxcbiAgICAgICAgbW9kdWxlUmVzb2x1dGlvbjogXCJub2RlXCIsXG4gICAgICAgIHNraXBMaWJDaGVjazogdHJ1ZSxcbiAgICAgICAgZm9yY2VDb25zaXN0ZW50Q2FzaW5nSW5GaWxlTmFtZXM6IHRydWUsXG4gICAgICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLFxuICAgICAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsXG4gICAgICAgIGV4cGVyaW1lbnRhbERlY29yYXRvcnM6IHRydWUsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbnVsbCxcbiAgICAyLFxuICApXG4gIHdyaXRlRmlsZUlmTm90RXhpc3RzKHRzY29uZmlnUGF0aCwgdHNjb25maWdDb250ZW50KVxufVxuIiwgImltcG9ydCBmcyBmcm9tIFwiZnNcIlxuXG5leHBvcnQgY29uc3Qgd3JpdGVGaWxlSWZOb3RFeGlzdHMgPSAoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKSA9PiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb250ZW50LnRyaW1TdGFydCgpLCBcInV0Zi04XCIpXG4gICAgY29uc29sZS5pbmZvKGBDcmVhdGVkOiAke2ZpbGVQYXRofWApXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwcGVkOiAke2ZpbGVQYXRofSBhbHJlYWR5IGV4aXN0c2ApXG4gIH1cbn1cbiIsICJpbXBvcnQgeyB3cml0ZUZpbGVJZk5vdEV4aXN0cyB9IGZyb20gXCIuL3dyaXRlLWZpbGUtaWYtbm90LWV4aXN0c1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlR2l0SWdub3JlRmlsZSA9IChkaXI6IHN0cmluZykgPT4ge1xuICBjb25zdCBnaXRpZ25vcmVQYXRoID0gcGF0aC5qb2luKGRpciwgXCIuZ2l0aWdub3JlXCIpXG4gIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSBgIyBEZXBlbmRlbmNpZXNcbm5vZGVfbW9kdWxlcy9cblxuIyBCdWlsZCBvdXRwdXRcbmRpc3QvXG5idWlsZC9cblxuIyBFbnZpcm9ubWVudCB2YXJpYWJsZXNcbi5lbnZcbi5lbnYubG9jYWxcbi5lbnYuKi5sb2NhbFxuXG4jIElERSBmaWxlc1xuLnZzY29kZS9cbi5pZGVhL1xuKi5zd3Bcbiouc3dvXG5cbiMgT1MgZmlsZXNcbi5EU19TdG9yZVxuVGh1bWJzLmRiXG5cbiMgRGVidWcgbG9nc1xubnBtLWRlYnVnLmxvZypcbnlhcm4tZGVidWcubG9nKlxueWFybi1lcnJvci5sb2cqXG5gXG5cbiAgICB3cml0ZUZpbGVJZk5vdEV4aXN0cyhnaXRpZ25vcmVQYXRoLCBnaXRpZ25vcmVDb250ZW50KVxufSIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHsgY3JlYXRlSHR0cFNlcnZlciB9IGZyb20gXCJsaWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXJcIlxuaW1wb3J0IHsgZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzIH0gZnJvbSBcImxpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2dldExvY2FsRmlsZURlcGVuZGVuY2llc1wiXG5pbXBvcnQgeyBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldCB9IGZyb20gXCIuLi8uLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldFwiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcIi4uLy4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5pbXBvcnQgeyBEZXZTZXJ2ZXIgfSBmcm9tIFwiLi9EZXZTZXJ2ZXJcIlxuaW1wb3J0ICogYXMgbmV0IGZyb20gXCJub2RlOm5ldFwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckRldiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImRldlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IGRldmVsb3BtZW50IHNlcnZlciBmb3IgYSBzbmlwcGV0XCIpXG4gICAgLmFyZ3VtZW50KFwiW2ZpbGVdXCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1wLCAtLXBvcnQgPG51bWJlcj5cIiwgXCJQb3J0IHRvIHJ1biBzZXJ2ZXIgb25cIiwgXCIzMDIwXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRpb25zOiB7IHBvcnQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICBsZXQgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydClcblxuICAgICAgY29uc3QgaXNQb3J0QXZhaWxhYmxlID0gKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCBzZXJ2ZXIgPSBuZXQuY3JlYXRlU2VydmVyKClcbiAgICAgICAgICBzZXJ2ZXIub25jZShcImVycm9yXCIsICgpID0+IHJlc29sdmUoZmFsc2UpKVxuICAgICAgICAgIHNlcnZlci5vbmNlKFwibGlzdGVuaW5nXCIsICgpID0+IHtcbiAgICAgICAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiByZXNvbHZlKHRydWUpKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgc2VydmVyLmxpc3Rlbihwb3J0KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoIShhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCkpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBQb3J0ICR7cG9ydH0gaXMgaW4gdXNlLCB0cnlpbmcgcG9ydCAke3BvcnQgKyAxfS4uLmApXG4gICAgICAgIHBvcnQgKz0gMVxuICAgICAgfVxuXG4gICAgICBsZXQgYWJzb2x1dGVQYXRoOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpXG4gICAgICAgIGlmICghYWJzb2x1dGVQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogT25seSAudHN4IGZpbGVzIGFyZSBzdXBwb3J0ZWRcIilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZW50cnlwb2ludFBhdGggPSBwYXRoLnJlc29sdmUoXCJpbmRleC50c3hcIilcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZW50cnlwb2ludFBhdGgpKSB7XG4gICAgICAgICAgYWJzb2x1dGVQYXRoID0gZW50cnlwb2ludFBhdGhcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIGZpbGUgcHJvdmlkZWQuIFVzaW5nICdpbmRleC50c3gnIGFzIHRoZSBlbnRyeXBvaW50LlwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgXCJObyBlbnRyeXBvaW50IGZvdW5kLiBSdW4gJ3RzY2kgaW5pdCcgdG8gYm9vdHN0cmFwIGEgYmFzaWMgcHJvamVjdC5cIixcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZURpciA9IHBhdGguZGlybmFtZShhYnNvbHV0ZVBhdGgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyB0eXBlcyBmb3IgaW1wb3J0ZWQgc25pcHBldHMuLi5cIilcbiAgICAgICAgYXdhaXQgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoYWJzb2x1dGVQYXRoKVxuICAgICAgICBjb25zb2xlLmxvZyhcIlR5cGVzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHlcIilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBpbnN0YWxsIHR5cGVzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VydmVyID0gbmV3IERldlNlcnZlcih7XG4gICAgICAgIHBvcnQsXG4gICAgICAgIGNvbXBvbmVudEZpbGVQYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCBzZXJ2ZXIuc3RhcnQoKVxuICAgICAgYXdhaXQgc2VydmVyLmFkZEVudHJ5cG9pbnQoKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcblxuaW50ZXJmYWNlIFNuaXBwZXRBcGlSZXNwb25zZSB7XG4gIHNuaXBwZXQ6IHtcbiAgICBkdHM6IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChzbmlwcGV0UGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc25pcHBldFBhdGgsIFwidXRmLThcIilcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgc25pcHBldFBhdGgsXG4gICAgY29udGVudCxcbiAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgIHRydWUsXG4gIClcblxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogdHMuTm9kZSkge1xuICAgIGlmICh0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBub2RlLm1vZHVsZVNwZWNpZmllclxuICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAmJiB0cy5pc1N0cmluZ0xpdGVyYWwobW9kdWxlU3BlY2lmaWVyKSkge1xuICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gbW9kdWxlU3BlY2lmaWVyLnRleHRcbiAgICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgICAgICAgIGltcG9ydHMucHVzaChpbXBvcnRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdClcbiAgfVxuXG4gIHZpc2l0KHNvdXJjZUZpbGUpXG5cbiAgbGV0IHByb2plY3RSb290ID0gcGF0aC5kaXJuYW1lKHNuaXBwZXRQYXRoKVxuICB3aGlsZSAocHJvamVjdFJvb3QgIT09IHBhdGgucGFyc2UocHJvamVjdFJvb3QpLnJvb3QpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdFJvb3QsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgcHJvamVjdFJvb3QgPSBwYXRoLmRpcm5hbWUocHJvamVjdFJvb3QpXG4gIH1cblxuICBmb3IgKGNvbnN0IGltcG9ydFBhdGggb2YgaW1wb3J0cykge1xuICAgIGNvbnN0IFtvd25lciwgbmFtZV0gPSBpbXBvcnRQYXRoLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikuc3BsaXQoXCIuXCIpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGBodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tL3NuaXBwZXRzL2dldD9vd25lcl9uYW1lPSR7b3duZXJ9JnVuc2NvcGVkX25hbWU9JHtuYW1lfWAsXG4gICAgICApXG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gZmV0Y2ggdHlwZXMgZm9yICR7aW1wb3J0UGF0aH1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhOiBTbmlwcGV0QXBpUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgaWYgKGRhdGEuc25pcHBldC5kdHMpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZURpciA9IHBhdGguam9pbihcbiAgICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgICAgIFwiQHRzY2lcIixcbiAgICAgICAgICBgJHtvd25lcn0uJHtuYW1lfWAsXG4gICAgICAgIClcbiAgICAgICAgZnMubWtkaXJTeW5jKHBhY2thZ2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZURpciwgXCJpbmRleC5kLnRzXCIpLCBkYXRhLnNuaXBwZXQuZHRzKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEVycm9yIGZldGNoaW5nIHR5cGVzIGZvciAke2ltcG9ydFBhdGh9OmAsIGVycm9yKVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBreSBmcm9tIFwia3lcIlxuaW1wb3J0IHR5cGUgeyBGaWxlU2VydmVyUm91dGVzIH0gZnJvbSBcImxpYi9maWxlLXNlcnZlci9GaWxlU2VydmVyUm91dGVzXCJcbmltcG9ydCB7IGNyZWF0ZUh0dHBTZXJ2ZXIgfSBmcm9tIFwibGliL3NlcnZlci9jcmVhdGVIdHRwU2VydmVyXCJcbmltcG9ydCB7IEV2ZW50c1dhdGNoZXIgfSBmcm9tIFwibGliL3NlcnZlci9FdmVudHNXYXRjaGVyXCJcbmltcG9ydCB0eXBlIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgdHlwZSB7IFR5cGVkS3lJbnN0YW5jZSB9IGZyb20gXCJ0eXBlZC1reVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgdHlwZSB7IEZpbGVVcGRhdGVkRXZlbnQgfSBmcm9tIFwibGliL2ZpbGUtc2VydmVyL0ZpbGVTZXJ2ZXJFdmVudFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0IHsgRmlsZXN5c3RlbVR5cGVzSGFuZGxlciB9IGZyb20gXCJsaWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyXCJcbmltcG9ydCB7IHB1c2hTbmlwcGV0IH0gZnJvbSBcImxpYi9zaGFyZWQvcHVzaC1zbmlwcGV0XCJcblxuZXhwb3J0IGNsYXNzIERldlNlcnZlciB7XG4gIHBvcnQ6IG51bWJlclxuICAvKipcbiAgICogVGhlIHBhdGggdG8gYSBjb21wb25lbnQgdGhhdCBleHBvcnRzIGEgPGJvYXJkIC8+IG9yIDxncm91cCAvPiBjb21wb25lbnRcbiAgICovXG4gIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcblxuICBwcm9qZWN0RGlyOiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIEhUVFAgc2VydmVyIHRoYXQgaG9zdHMgdGhlIGZpbGUgc2VydmVyIGFuZCBldmVudCBidXMuIFlvdSBjYW4gdXNlXG4gICAqIGZzS3kgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIvZXZlbnQgYnVzXG4gICAqL1xuICBodHRwU2VydmVyPzogaHR0cC5TZXJ2ZXJcbiAgLyoqXG4gICAqIFdhdGNoZXMgZm9yIGV2ZW50cyBvbiB0aGUgZXZlbnQgYnVzIGJ5IHBvbGxpbmcgYGFwaS9ldmVudHMvbGlzdGBcbiAgICovXG4gIGV2ZW50c1dhdGNoZXI/OiBFdmVudHNXYXRjaGVyXG4gIC8qKlxuICAgKiBBIGt5IGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIgYW5kXG4gICAqIGV2ZW50IGJ1c1xuICAgKi9cbiAgZnNLeTogVHlwZWRLeUluc3RhbmNlPGtleW9mIEZpbGVTZXJ2ZXJSb3V0ZXMsIEZpbGVTZXJ2ZXJSb3V0ZXM+XG4gIC8qKlxuICAgKiBBIGNob2tpZGFyIGluc3RhbmNlIHRoYXQgd2F0Y2hlcyB0aGUgcHJvamVjdCBkaXJlY3RvcnkgZm9yIGZpbGUgY2hhbmdlc1xuICAgKi9cbiAgZmlsZXN5c3RlbVdhdGNoZXI/OiBjaG9raWRhci5GU1dhdGNoZXJcblxuICBwcml2YXRlIHR5cGVzSGFuZGxlcj86IEZpbGVzeXN0ZW1UeXBlc0hhbmRsZXJcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgcG9ydCxcbiAgICBjb21wb25lbnRGaWxlUGF0aCxcbiAgfToge1xuICAgIHBvcnQ6IG51bWJlclxuICAgIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcbiAgfSkge1xuICAgIHRoaXMucG9ydCA9IHBvcnRcbiAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoID0gY29tcG9uZW50RmlsZVBhdGhcbiAgICB0aGlzLnByb2plY3REaXIgPSBwYXRoLmRpcm5hbWUoY29tcG9uZW50RmlsZVBhdGgpXG4gICAgdGhpcy5mc0t5ID0ga3kuY3JlYXRlKHtcbiAgICAgIHByZWZpeFVybDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWAsXG4gICAgfSkgYXMgYW55XG4gICAgdGhpcy50eXBlc0hhbmRsZXIgPSBuZXcgRmlsZXN5c3RlbVR5cGVzSGFuZGxlcih0aGlzLnByb2plY3REaXIpXG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBjb25zdCB7IHNlcnZlciB9ID0gYXdhaXQgY3JlYXRlSHR0cFNlcnZlcih0aGlzLnBvcnQpXG4gICAgdGhpcy5odHRwU2VydmVyID0gc2VydmVyXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIgPSBuZXcgRXZlbnRzV2F0Y2hlcihgaHR0cDovL2xvY2FsaG9zdDoke3RoaXMucG9ydH1gKVxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5zdGFydCgpXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIub24oXG4gICAgICBcIkZJTEVfVVBEQVRFRFwiLFxuICAgICAgdGhpcy5oYW5kbGVGaWxlVXBkYXRlZEV2ZW50RnJvbVNlcnZlci5iaW5kKHRoaXMpLFxuICAgIClcblxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5vbihcbiAgICAgIFwiUkVRVUVTVF9UT19TQVZFX1NOSVBQRVRcIixcbiAgICAgIHRoaXMuc2F2ZVNuaXBwZXQuYmluZCh0aGlzKSxcbiAgICApXG5cbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyID0gY2hva2lkYXIud2F0Y2godGhpcy5wcm9qZWN0RGlyLCB7XG4gICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICB9KVxuXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImNoYW5nZVwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImFkZFwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG5cbiAgICB0aGlzLnVwc2VydEluaXRpYWxGaWxlcygpXG5cbiAgICB0aGlzLnR5cGVzSGFuZGxlcj8uaGFuZGxlSW5pdGlhbFR5cGVEZXBlbmRlbmNpZXModGhpcy5jb21wb25lbnRGaWxlUGF0aClcbiAgfVxuXG4gIGFzeW5jIGFkZEVudHJ5cG9pbnQoKSB7XG4gICAgY29uc3QgcmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICB0aGlzLnByb2plY3REaXIsXG4gICAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoLFxuICAgIClcbiAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAganNvbjoge1xuICAgICAgICBmaWxlX3BhdGg6IFwiZW50cnlwb2ludC50c3hcIixcbiAgICAgICAgdGV4dF9jb250ZW50OiBgXG5pbXBvcnQgTXlDaXJjdWl0IGZyb20gXCIuLyR7cmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aH1cIlxuXG5jaXJjdWl0LmFkZCg8TXlDaXJjdWl0IC8+KVxuYCxcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVVcGRhdGVkRXZlbnRGcm9tU2VydmVyKGV2OiBGaWxlVXBkYXRlZEV2ZW50KSB7XG4gICAgaWYgKGV2LmluaXRpYXRvciA9PT0gXCJmaWxlc3lzdGVtX2NoYW5nZVwiKSByZXR1cm5cblxuICAgIGlmIChldi5maWxlX3BhdGggPT09IFwibWFudWFsLWVkaXRzLmpzb25cIikge1xuICAgICAgY29uc29sZS5sb2coXCJNYW51YWwgZWRpdHMgdXBkYXRlZCwgdXBkYXRpbmcgb24gZmlsZXN5c3RlbS4uLlwiKVxuICAgICAgY29uc3QgeyBmaWxlIH0gPSBhd2FpdCB0aGlzLmZzS3lcbiAgICAgICAgLmdldChcImFwaS9maWxlcy9nZXRcIiwge1xuICAgICAgICAgIHNlYXJjaFBhcmFtczogeyBmaWxlX3BhdGg6IGV2LmZpbGVfcGF0aCB9LFxuICAgICAgICB9KVxuICAgICAgICAuanNvbigpXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBcIm1hbnVhbC1lZGl0cy5qc29uXCIpLFxuICAgICAgICBmaWxlLnRleHRfY29udGVudCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlZE9uRmlsZXN5c3RlbShhYnNvbHV0ZUZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLnByb2plY3REaXIsIGFic29sdXRlRmlsZVBhdGgpXG4gICAgLy8gV2UndmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQgdXBzZXJ0aW5nIG1hbnVhbCBlZGl0cyBmcm9tIGZpbGVzeXN0ZW0gY2hhbmdlc1xuICAgIC8vIGJlY2F1c2UgaXQgY2FuIGJlIGVkaXRlZCBieSB0aGUgYnJvd3NlclxuICAgIGlmIChyZWxhdGl2ZUZpbGVQYXRoLmluY2x1ZGVzKFwibWFudWFsLWVkaXRzLmpzb25cIikpIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy50eXBlc0hhbmRsZXI/LmhhbmRsZUZpbGVUeXBlRGVwZW5kZW5jaWVzKGFic29sdXRlRmlsZVBhdGgpXG5cbiAgICBjb25zb2xlLmxvZyhgJHtyZWxhdGl2ZUZpbGVQYXRofSBzYXZlZC4gQXBwbHlpbmcgY2hhbmdlcy4uLmApXG4gICAgYXdhaXQgdGhpcy5mc0t5XG4gICAgICAucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiByZWxhdGl2ZUZpbGVQYXRoLFxuICAgICAgICAgIHRleHRfY29udGVudDogZnMucmVhZEZpbGVTeW5jKGFic29sdXRlRmlsZVBhdGgsIFwidXRmLThcIiksXG4gICAgICAgICAgaW5pdGlhdG9yOiBcImZpbGVzeXN0ZW1fY2hhbmdlXCIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmpzb24oKVxuICB9XG5cbiAgYXN5bmMgdXBzZXJ0SW5pdGlhbEZpbGVzKCkge1xuICAgIC8vIFNjYW4gcHJvamVjdCBkaXJlY3RvcnkgZm9yIGFsbCBmaWxlcyBhbmQgdXBzZXJ0IHRoZW1cbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyh0aGlzLnByb2plY3REaXIpXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBmaWxlTmFtZSkpLmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKHRoaXMucHJvamVjdERpciwgZmlsZU5hbWUpLFxuICAgICAgICBcInV0Zi04XCIsXG4gICAgICApXG4gICAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiBmaWxlTmFtZSxcbiAgICAgICAgICB0ZXh0X2NvbnRlbnQ6IGZpbGVDb250ZW50LFxuICAgICAgICAgIGluaXRpYXRvcjogXCJmaWxlc3lzdGVtX2NoYW5nZVwiLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVTbmlwcGV0KCkge1xuICAgIGNvbnN0IHBvc3RFdmVudCA9IGFzeW5jIChcbiAgICAgIGV2ZW50OiBcIkZBSUxFRF9UT19TQVZFX1NOSVBQRVRcIiB8IFwiU05JUFBFVF9TQVZFRFwiLFxuICAgICkgPT5cbiAgICAgIHRoaXMuZnNLeS5wb3N0KFwiYXBpL2V2ZW50cy9jcmVhdGVcIiwge1xuICAgICAgICBqc29uOiB7IGV2ZW50X3R5cGU6IGV2ZW50IH0sXG4gICAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgICB9KVxuXG4gICAgYXdhaXQgcHVzaFNuaXBwZXQoe1xuICAgICAgZmlsZVBhdGg6IHRoaXMuY29tcG9uZW50RmlsZVBhdGgsXG4gICAgICBvbkV4aXQ6IChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gc2F2ZSBzbmlwcGV0XCIsIGUpXG4gICAgICAgIHBvc3RFdmVudChcIkZBSUxFRF9UT19TQVZFX1NOSVBQRVRcIilcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHNhdmUgc25pcHBldFwiLCBlKVxuICAgICAgICBwb3N0RXZlbnQoXCJGQUlMRURfVE9fU0FWRV9TTklQUEVUXCIpXG4gICAgICB9LFxuICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgIHBvc3RFdmVudChcIlNOSVBQRVRfU0FWRURcIilcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5odHRwU2VydmVyPy5jbG9zZSgpXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyPy5zdG9wKClcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZ2V0Tm9kZUhhbmRsZXIgfSBmcm9tIFwid2ludGVyc3BlYy9hZGFwdGVycy9ub2RlXCJcbmltcG9ydCBwa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiXG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB3aW50ZXJzcGVjQnVuZGxlIGZyb20gXCJAdHNjaXJjdWl0L2ZpbGUtc2VydmVyL2Rpc3QvYnVuZGxlLmpzXCJcbmltcG9ydCB7IGdldEluZGV4IH0gZnJvbSBcIi4uL3NpdGUvZ2V0SW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY3JlYXRlSHR0cFNlcnZlciA9IGFzeW5jIChwb3J0ID0gMzAyMCkgPT4ge1xuICBjb25zdCBmaWxlU2VydmVySGFuZGxlciA9IGdldE5vZGVIYW5kbGVyKHdpbnRlcnNwZWNCdW5kbGUgYXMgYW55LCB7fSlcblxuICBjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwhLCBgaHR0cDovLyR7cmVxLmhlYWRlcnMuaG9zdH1gKVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvc3RhbmRhbG9uZS5taW4uanNcIikge1xuICAgICAgY29uc3Qgc3RhbmRhbG9uZUZpbGVQYXRoID1cbiAgICAgICAgcHJvY2Vzcy5lbnYuUlVORlJBTUVfU1RBTkRBTE9ORV9GSUxFX1BBVEggfHxcbiAgICAgICAgcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWUvZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiLFxuICAgICAgICApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3RhbmRhbG9uZUZpbGVQYXRoLCBcInV0ZjhcIilcbiAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgfSlcbiAgICAgICAgcmVzLmVuZChjb250ZW50KVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzZXJ2aW5nIHN0YW5kYWxvbmUubWluLmpzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgcmVzLndyaXRlSGVhZCgzMDIsIHtcbiAgICAgICAgTG9jYXRpb246IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B0c2NpcmN1aXQvcnVuZnJhbWVAJHtwa2cuZGVwZW5kZW5jaWVzW1wiQHRzY2lyY3VpdC9ydW5mcmFtZVwiXS5yZXBsYWNlKC9eW14wLTldKy8sIFwiXCIpfS9kaXN0L3N0YW5kYWxvbmUubWluLmpzYCxcbiAgICAgIH0pXG4gICAgICByZXMuZW5kKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh1cmwucGF0aG5hbWUgPT09IFwiL1wiKSB7XG4gICAgICBjb25zdCBodG1sID0gYXdhaXQgZ2V0SW5kZXgoKVxuICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHsgXCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L2h0bWxcIiB9KVxuICAgICAgcmVzLmVuZChodG1sKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVybC5wYXRobmFtZS5zdGFydHNXaXRoKFwiL2FwaS9cIikpIHtcbiAgICAgIHJlcS51cmwgPSByZXEudXJsIS5yZXBsYWNlKFwiL2FwaS9cIiwgXCIvXCIpXG4gICAgICBmaWxlU2VydmVySGFuZGxlcihyZXEsIHJlcylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJlcy53cml0ZUhlYWQoNDA0KVxuICAgIHJlcy5lbmQoXCJOb3QgZm91bmRcIilcbiAgfSlcblxuICByZXR1cm4gbmV3IFByb21pc2U8eyBzZXJ2ZXI6IGh0dHAuU2VydmVyIH0+KChyZXNvbHZlKSA9PiB7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgU2VydmVyIHJ1bm5pbmcgYXQgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YClcbiAgICAgIHJlc29sdmUoeyBzZXJ2ZXIgfSlcbiAgICB9KVxuICB9KVxufVxuIiwgIntcbiAgXCJuYW1lXCI6IFwiQHRzY2lyY3VpdC9jbGlcIixcbiAgXCJtYWluXCI6IFwiZGlzdC9tYWluLmpzXCIsXG4gIFwidHlwZVwiOiBcIm1vZHVsZVwiLFxuICBcInZlcnNpb25cIjogXCIwLjEuMzFcIixcbiAgXCJiaW5cIjoge1xuICAgIFwidHNjaVwiOiBcIi4vZGlzdC9tYWluLmpzXCJcbiAgfSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcInN0YXJ0XCI6IFwiYnVuIHJ1biBkZXZcIixcbiAgICBcImRldlwiOiBcImJ1biAtLWhvdCAuL2NsaS9tYWluLnRzIGRldiAuL2V4YW1wbGUtZGlyL3NuaXBwZXQxLWJhc2ljLnRzeFwiLFxuICAgIFwiYnVpbGRcIjogXCJ0c3VwLW5vZGUgY2xpL21haW4udHMgLS1mb3JtYXQgZXNtIC0tc291cmNlbWFwIGlubGluZVwiLFxuICAgIFwiZm9ybWF0XCI6IFwiYmlvbWUgZm9ybWF0IC0td3JpdGUgLlwiLFxuICAgIFwiZm9ybWF0OmNoZWNrXCI6IFwiYmlvbWUgZm9ybWF0IC5cIixcbiAgICBcImNsaVwiOiBcImJ1biAuL2NsaS9tYWluLnRzXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGJpb21lanMvYmlvbWVcIjogXCJeMS45LjRcIixcbiAgICBcIkB0c2NpcmN1aXQvY29yZVwiOiBcIl4wLjAuMjQ5XCIsXG4gICAgXCJAdHNjaXJjdWl0L2Zha2Utc25pcHBldHNcIjogXCJeMC4wLjVcIixcbiAgICBcIkB0eXBlcy9idW5cIjogXCJeMS4xLjE1XCIsXG4gICAgXCJAdHlwZXMvY29uZmlnc3RvcmVcIjogXCJeNi4wLjJcIixcbiAgICBcIkB0eXBlcy9yZWFjdFwiOiBcIl4xOS4wLjhcIixcbiAgICBcIkB0eXBlcy9zZW12ZXJcIjogXCJeNy41LjhcIixcbiAgICBcImdldC1wb3J0XCI6IFwiXjcuMS4wXCIsXG4gICAgXCJ0ZW1weVwiOiBcIl4zLjEuMFwiLFxuICAgIFwidHN1cFwiOiBcIl44LjMuNVwiLFxuICAgIFwidHlwZWQta3lcIjogXCJeMC4wLjRcIlxuICB9LFxuICBcInBlZXJEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwidHlwZXNjcmlwdFwiOiBcIl41LjAuMFwiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB0c2NpcmN1aXQvZXZhbFwiOiBcIl4wLjAuOTZcIixcbiAgICBcIkB0c2NpcmN1aXQvZmlsZS1zZXJ2ZXJcIjogXCJeMC4wLjEzXCIsXG4gICAgXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCI6IFwiXjAuMC4xNjdcIixcbiAgICBcImNob2tpZGFyXCI6IFwiNC4wLjFcIixcbiAgICBcImNvbW1hbmRlclwiOiBcIl4xMi4xLjBcIixcbiAgICBcImNvbmZpZ3N0b3JlXCI6IFwiXjcuMC4wXCIsXG4gICAgXCJjb3NtaWNvbmZpZ1wiOiBcIl45LjAuMFwiLFxuICAgIFwiZGVsYXlcIjogXCJeNi4wLjBcIixcbiAgICBcImp3dC1kZWNvZGVcIjogXCJeNC4wLjBcIixcbiAgICBcImt5XCI6IFwiXjEuNy40XCIsXG4gICAgXCJtYWtlLXZmc1wiOiBcIl4xLjAuMTVcIixcbiAgICBcInBlcmZlY3QtY2xpXCI6IFwiXjEuMC4yMFwiLFxuICAgIFwicmVkYXhpb3NcIjogXCJeMC41LjFcIixcbiAgICBcInNlbXZlclwiOiBcIl43LjYuM1wiXG4gIH1cbn1cbiIsICJpbXBvcnQgcGtnIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIlxuXG5leHBvcnQgY29uc3QgZ2V0SW5kZXggPSBhc3luYyAoKSA9PiB7XG4gIHJldHVybiBgPGh0bWw+XG4gICAgPGhlYWQ+XG4gICAgPC9oZWFkPlxuICAgIDxib2R5PlxuICAgICAgPHNjcmlwdCBzcmM9XCJodHRwczovL2Nkbi50YWlsd2luZGNzcy5jb21cIj48L3NjcmlwdD5cbiAgICAgIDxkaXYgaWQ9XCJyb290XCI+bG9hZGluZy4uLjwvZGl2PlxuICAgICAgPHNjcmlwdD5cbiAgICAgIGdsb2JhbFRoaXMucHJvY2VzcyA9IHsgZW52OiB7IE5PREVfRU5WOiBcInByb2R1Y3Rpb25cIiB9IH1cbiAgICAgIDwvc2NyaXB0PlxuICAgICAgPHNjcmlwdCBzcmM9XCIvc3RhbmRhbG9uZS5taW4uanNcIj48L3NjcmlwdD5cbiAgICA8L2JvZHk+XG4gIDwvaHRtbD5gXG59XG5cbi8vIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L3J1bmZyYW1lQCR7cGtnLmRlcGVuZGVuY2llc1tcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIl0ucmVwbGFjZSgvXlteMC05XSsvLCBcIlwiKX0vZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiPjwvc2NyaXB0PlxuIiwgImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudHNcIlxuXG5pbnRlcmZhY2UgRXZlbnQge1xuICBldmVudF9pZDogc3RyaW5nXG4gIGNyZWF0ZWRfYXQ6IHN0cmluZ1xuICBldmVudF90eXBlOiBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmludGVyZmFjZSBFdmVudHNSZXNwb25zZSB7XG4gIGV2ZW50X2xpc3Q6IEV2ZW50W11cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50c1dhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBwcml2YXRlIGxhc3RQb2xsVGltZTogc3RyaW5nXG4gIHByaXZhdGUgcG9sbEludGVydmFsOiBudW1iZXJcbiAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmdcbiAgcHJpdmF0ZSBwb2xsaW5nID0gZmFsc2VcbiAgcHJpdmF0ZSB0aW1lb3V0SWQ/OiBOb2RlSlMuVGltZW91dFxuXG4gIGNvbnN0cnVjdG9yKGJhc2VVcmwgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiLCBwb2xsSW50ZXJ2YWwgPSAxMDAwKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmxcbiAgICB0aGlzLnBvbGxJbnRlcnZhbCA9IHBvbGxJbnRlcnZhbFxuICAgIHRoaXMubGFzdFBvbGxUaW1lID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5wb2xsaW5nKSByZXR1cm5cbiAgICB0aGlzLnBvbGxpbmcgPSB0cnVlXG4gICAgYXdhaXQgdGhpcy5wb2xsKClcbiAgfVxuXG4gIHN0b3AoKSB7XG4gICAgdGhpcy5wb2xsaW5nID0gZmFsc2VcbiAgICBpZiAodGhpcy50aW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBvbGwoKSB7XG4gICAgaWYgKCF0aGlzLnBvbGxpbmcpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGAke3RoaXMuYmFzZVVybH0vYXBpL2V2ZW50cy9saXN0P3NpbmNlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubGFzdFBvbGxUaW1lKX1gLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhOiBFdmVudHNSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICAvLyBVcGRhdGUgbGFzdCBwb2xsIHRpbWUgdG8gbGF0ZXN0IGV2ZW50IG9yIGN1cnJlbnQgdGltZVxuICAgICAgY29uc3QgbGF0ZXN0RXZlbnQgPSBkYXRhLmV2ZW50X2xpc3RbZGF0YS5ldmVudF9saXN0Lmxlbmd0aCAtIDFdXG4gICAgICB0aGlzLmxhc3RQb2xsVGltZSA9IGxhdGVzdEV2ZW50XG4gICAgICAgID8gbGF0ZXN0RXZlbnQuY3JlYXRlZF9hdFxuICAgICAgICA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuXG4gICAgICAvLyBFbWl0IGV2ZW50cyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyXG4gICAgICBkYXRhLmV2ZW50X2xpc3QuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KGV2ZW50LmV2ZW50X3R5cGUsIGV2ZW50KVxuICAgICAgICB0aGlzLmVtaXQoXCIqXCIsIGV2ZW50KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyb3IpXG4gICAgfVxuICAgIC8vIFNjaGVkdWxlIG5leHQgcG9sbFxuICAgIHRoaXMudGltZW91dElkID0gZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KFxuICAgICAgKCkgPT4gdGhpcy5wb2xsKCksXG4gICAgICB0aGlzLnBvbGxJbnRlcnZhbCxcbiAgICApIGFzIHVua25vd24gYXMgTm9kZUpTLlRpbWVvdXRcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBmaW5kSW1wb3J0c0luU25pcHBldCB9IGZyb20gXCIuL2ZpbmRJbXBvcnRzSW5TbmlwcGV0XCJcbmltcG9ydCB7IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0IH0gZnJvbSBcIi4vaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXRcIlxuXG5leHBvcnQgY2xhc3MgRmlsZXN5c3RlbVR5cGVzSGFuZGxlciB7XG4gIHByaXZhdGUgcHJvamVjdFJvb3Q6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxEaXI6IHN0cmluZykge1xuICAgIHRoaXMucHJvamVjdFJvb3QgPSB0aGlzLmZpbmRQcm9qZWN0Um9vdChpbml0aWFsRGlyKVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlSW5pdGlhbFR5cGVEZXBlbmRlbmNpZXMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIGNvbnNvbGUubG9nKFwiQ2hlY2tpbmcgaW5pdGlhbCB0eXBlIGRlcGVuZGVuY2llcy4uLlwiKVxuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuYXJlVHlwZXNJbnN0YWxsZWQoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyBtaXNzaW5nIGluaXRpYWwgdHlwZXMuLi5cIilcbiAgICAgICAgYXdhaXQgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkVycm9yIGhhbmRsaW5nIGluaXRpYWwgdHlwZSBkZXBlbmRlbmNpZXM6XCIsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVUeXBlRGVwZW5kZW5jaWVzKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmFyZVR5cGVzSW5zdGFsbGVkKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkluc3RhbGxpbmcgbWlzc2luZyBmaWxlIHR5cGVzLi4uXCIpXG4gICAgICAgIGF3YWl0IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KGZpbGVQYXRoKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gdmVyaWZ5IHR5cGVzOlwiLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFyZVR5cGVzSW5zdGFsbGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbXBvcnRzID0gZmluZEltcG9ydHNJblNuaXBwZXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIGltcG9ydHMuZXZlcnkoKGltcCkgPT4gdGhpcy5jaGVja1R5cGVFeGlzdHMoaW1wKSlcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tUeXBlRXhpc3RzKGltcG9ydFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3QgcGF0aFdpdGhvdXRQcmVmaXggPSBpbXBvcnRQYXRoLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIilcbiAgICBjb25zdCBbb3duZXIsIG5hbWVdID0gcGF0aFdpdGhvdXRQcmVmaXguc3BsaXQoXCIuXCIpXG5cbiAgICBjb25zdCB0eXBlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIHRoaXMucHJvamVjdFJvb3QsXG4gICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgXCJAdHNjaVwiLFxuICAgICAgYCR7b3duZXJ9LiR7bmFtZX1gLFxuICAgICAgXCJpbmRleC5kLnRzXCIsXG4gICAgKVxuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmModHlwZVBhdGgpXG4gIH1cblxuICBwcml2YXRlIGZpbmRQcm9qZWN0Um9vdChzdGFydERpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcm9vdCA9IHBhdGgucmVzb2x2ZShzdGFydERpcilcbiAgICB3aGlsZSAocm9vdCAhPT0gcGF0aC5wYXJzZShyb290KS5yb290KSB7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICAgIHJldHVybiByb290XG4gICAgICB9XG4gICAgICByb290ID0gcGF0aC5kaXJuYW1lKHJvb3QpXG4gICAgfVxuICAgIHJldHVybiBzdGFydERpclxuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIlxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEltcG9ydHNJblNuaXBwZXQoc25pcHBldFBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzbmlwcGV0UGF0aCwgXCJ1dGYtOFwiKVxuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBzbmlwcGV0UGF0aCxcbiAgICBjb250ZW50LFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgKVxuXG4gIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW11cblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiB0cy5Ob2RlKSB7XG4gICAgaWYgKHRzLmlzSW1wb3J0RGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVNwZWNpZmllciA9IG5vZGUubW9kdWxlU3BlY2lmaWVyXG4gICAgICBpZiAobW9kdWxlU3BlY2lmaWVyICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydFBhdGggPSBtb2R1bGVTcGVjaWZpZXIudGV4dFxuICAgICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgICAgICAgaW1wb3J0cy5wdXNoKGltcG9ydFBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KVxuICB9XG5cbiAgdmlzaXQoc291cmNlRmlsZSlcblxuICByZXR1cm4gaW1wb3J0c1xufVxuIiwgImltcG9ydCBDb25maWdzdG9yZSBmcm9tIFwiY29uZmlnc3RvcmVcIlxuaW1wb3J0IHR5cGUgeyBUeXBlZENvbmZpZ3N0b3JlIH0gZnJvbSBcIi4vVHlwZWRDb25maWdTdG9yZVwiXG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tIFwiand0LWRlY29kZVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpQ29uZmlnIHtcbiAgc2Vzc2lvblRva2VuPzogc3RyaW5nXG4gIGdpdGh1YlVzZXJuYW1lPzogc3RyaW5nXG4gIHJlZ2lzdHJ5QXBpVXJsPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBjbGlDb25maWc6IFR5cGVkQ29uZmlnc3RvcmU8Q2xpQ29uZmlnPiA9IG5ldyBDb25maWdzdG9yZShcbiAgXCJ0c2NpcmN1aXRcIixcbilcblxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb25Ub2tlbiA9ICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gIGNsaUNvbmZpZy5zZXQoXCJzZXNzaW9uVG9rZW5cIiwgdG9rZW4pXG4gIGNvbnN0IGRlY29kZWQgPSBqd3REZWNvZGU8e1xuICAgIGdpdGh1Yl91c2VybmFtZTogc3RyaW5nXG4gIH0+KHRva2VuKVxuICBjbGlDb25maWcuc2V0KFwiZ2l0aHViVXNlcm5hbWVcIiwgZGVjb2RlZC5naXRodWJfdXNlcm5hbWUpXG59XG5cbmV4cG9ydCBjb25zdCBjbGVhclNlc3Npb24gPSAoKSA9PiB7XG4gIGNsaUNvbmZpZy5kZWxldGUoXCJzZXNzaW9uVG9rZW5cIilcbiAgY2xpQ29uZmlnLmRlbGV0ZShcImdpdGh1YlVzZXJuYW1lXCIpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRSZWdpc3RyeUFwaVVybCA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gY2xpQ29uZmlnLmdldChcInJlZ2lzdHJ5QXBpVXJsXCIpID8/IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiXG59XG4iLCAiaW1wb3J0IHsgZ2V0UmVnaXN0cnlBcGlVcmwgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGt5LCB7IHR5cGUgQWZ0ZXJSZXNwb25zZUhvb2sgfSBmcm9tIFwia3lcIlxuXG5leHBvcnQgY29uc3QgcHJldHR5UmVzcG9uc2VFcnJvckhvb2s6IEFmdGVyUmVzcG9uc2VIb29rID0gYXN5bmMgKFxuICBfcmVxdWVzdCxcbiAgX29wdGlvbnMsXG4gIHJlc3BvbnNlLFxuKSA9PiB7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXJyb3JEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGQUlMIFske3Jlc3BvbnNlLnN0YXR1c31dOiAke19yZXF1ZXN0Lm1ldGhvZH0gJHtcbiAgICAgICAgICBuZXcgVVJMKF9yZXF1ZXN0LnVybCkucGF0aG5hbWVcbiAgICAgICAgfSBcXG5cXG4gJHtKU09OLnN0cmluZ2lmeShlcnJvckRhdGEsIG51bGwsIDIpfWAsXG4gICAgICApXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy9pZ25vcmUsIGFsbG93IHRoZSBlcnJvciB0byBiZSB0aHJvd25cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEt5ID0gKCkgPT4ge1xuICByZXR1cm4ga3kuY3JlYXRlKHtcbiAgICBwcmVmaXhVcmw6IGdldFJlZ2lzdHJ5QXBpVXJsKCksXG4gICAgaG9va3M6IHtcbiAgICAgIGFmdGVyUmVzcG9uc2U6IFtwcmV0dHlSZXNwb25zZUVycm9ySG9va10sXG4gICAgfSxcbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IHsgZ2V0S3kgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9nZXQta3lcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5cbnR5cGUgUHVzaE9wdGlvbnMgPSB7XG4gIGZpbGVQYXRoPzogc3RyaW5nXG4gIG9uRXhpdD86IChjb2RlOiBudW1iZXIpID0+IHZvaWRcbiAgb25FcnJvcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbiAgb25TdWNjZXNzPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgcHVzaFNuaXBwZXQgPSBhc3luYyAoe1xuICBmaWxlUGF0aCxcbiAgb25FeGl0ID0gKGNvZGUpID0+IHByb2Nlc3MuZXhpdChjb2RlKSxcbiAgb25FcnJvciA9IChtZXNzYWdlKSA9PiBjb25zb2xlLmVycm9yKG1lc3NhZ2UpLFxuICBvblN1Y2Nlc3MgPSAobWVzc2FnZSkgPT4gY29uc29sZS5sb2cobWVzc2FnZSksXG59OiBQdXNoT3B0aW9ucykgPT4ge1xuICBjb25zdCBzZXNzaW9uVG9rZW4gPSBjbGlDb25maWcuZ2V0KFwic2Vzc2lvblRva2VuXCIpXG4gIGlmICghc2Vzc2lvblRva2VuKSB7XG4gICAgb25FcnJvcihcIllvdSBuZWVkIHRvIGxvZyBpbiB0byBzYXZlIHNuaXBwZXQuXCIpXG4gICAgcmV0dXJuIG9uRXhpdCgxKVxuICB9XG5cbiAgbGV0IHNuaXBwZXRGaWxlUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgaWYgKGZpbGVQYXRoKSB7XG4gICAgc25pcHBldEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRlZmF1bHRFbnRyeXBvaW50ID0gcGF0aC5yZXNvbHZlKFwiaW5kZXgudHN4XCIpXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGVmYXVsdEVudHJ5cG9pbnQpKSB7XG4gICAgICBzbmlwcGV0RmlsZVBhdGggPSBkZWZhdWx0RW50cnlwb2ludFxuICAgICAgb25TdWNjZXNzKFwiTm8gZmlsZSBwcm92aWRlZC4gVXNpbmcgJ2luZGV4LnRzeCcgYXMgdGhlIGVudHJ5cG9pbnQuXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9uRXJyb3IoXG4gICAgICAgIFwiTm8gZW50cnlwb2ludCBmb3VuZC4gUnVuICd0c2NpIGluaXQnIHRvIGJvb3RzdHJhcCBhIGJhc2ljIHByb2plY3QuXCIsXG4gICAgICApXG4gICAgICByZXR1cm4gb25FeGl0KDEpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgIHBhdGguam9pbihwYXRoLmRpcm5hbWUoc25pcHBldEZpbGVQYXRoKSwgXCJwYWNrYWdlLmpzb25cIiksXG4gIClcbiAgbGV0IHBhY2thZ2VKc29uOiB7IG5hbWU/OiBzdHJpbmc7IGF1dGhvcj86IHN0cmluZzsgdmVyc2lvbj86IHN0cmluZyB9ID0ge31cbiAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCkudG9TdHJpbmcoKSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIG9uRXJyb3IoXCJJbnZhbGlkIHBhY2thZ2UuanNvbiBwcm92aWRlZFwiKVxuICAgICAgcmV0dXJuIG9uRXhpdCgxKVxuICAgIH1cbiAgfVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyhzbmlwcGV0RmlsZVBhdGgpKSB7XG4gICAgb25FcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7c25pcHBldEZpbGVQYXRofWApXG4gICAgcmV0dXJuIG9uRXhpdCgxKVxuICB9XG5cbiAgY29uc3Qga3kgPSBnZXRLeSgpXG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gKFxuICAgIHBhY2thZ2VKc29uLm5hbWUgPz8gcGF0aC5wYXJzZShzbmlwcGV0RmlsZVBhdGgpLm5hbWVcbiAgKS5yZXBsYWNlKC9eQC8sIFwiXCIpXG4gIGNvbnN0IHBhY2thZ2VBdXRob3IgPVxuICAgIHBhY2thZ2VKc29uLmF1dGhvcj8uc3BsaXQoXCIgXCIpWzBdID8/IGNsaUNvbmZpZy5nZXQoXCJnaXRodWJVc2VybmFtZVwiKVxuICBjb25zdCBwYWNrYWdlSWRlbnRpZmllciA9IGAke3BhY2thZ2VBdXRob3J9LyR7cGFja2FnZU5hbWV9YFxuXG4gIGxldCBwYWNrYWdlVmVyc2lvbiA9XG4gICAgcGFja2FnZUpzb24udmVyc2lvbiA/P1xuICAgIChhd2FpdCBreVxuICAgICAgLnBvc3Q8e1xuICAgICAgICBlcnJvcj86IHsgZXJyb3JfY29kZTogc3RyaW5nIH1cbiAgICAgICAgcGFja2FnZV9yZWxlYXNlcz86IHsgdmVyc2lvbjogc3RyaW5nOyBpc19sYXRlc3Q6IGJvb2xlYW4gfVtdXG4gICAgICB9PihcInBhY2thZ2VfcmVsZWFzZXMvbGlzdFwiLCB7XG4gICAgICAgIGpzb246IHsgcGFja2FnZV9uYW1lOiBwYWNrYWdlSWRlbnRpZmllciB9LFxuICAgICAgfSlcbiAgICAgIC5qc29uKClcbiAgICAgIC50aGVuKFxuICAgICAgICAocmVzcG9uc2UpID0+XG4gICAgICAgICAgcmVzcG9uc2UucGFja2FnZV9yZWxlYXNlcz8uW3Jlc3BvbnNlLnBhY2thZ2VfcmVsZWFzZXMubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgID8udmVyc2lvbixcbiAgICAgIClcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgb25FcnJvcihcIkZhaWxlZCB0byByZXRyaWV2ZSBsYXRlc3QgcGFja2FnZSB2ZXJzaW9uOlwiICsgZXJyb3IpXG4gICAgICAgIHJldHVybiBvbkV4aXQoMSlcbiAgICAgIH0pKVxuXG4gIGlmICghcGFja2FnZVZlcnNpb24pIHtcbiAgICBvbkVycm9yKFwiRmFpbGVkIHRvIHJldHJpZXZlIHBhY2thZ2UgdmVyc2lvbi5cIilcbiAgICByZXR1cm4gb25FeGl0KDEpXG4gIH1cblxuICBjb25zdCB1cGRhdGVQYWNrYWdlSnNvblZlcnNpb24gPSAobmV3VmVyc2lvbj86IHN0cmluZykgPT4ge1xuICAgIGlmIChwYWNrYWdlSnNvbi52ZXJzaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYWNrYWdlSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbiA/PyBgJHtwYWNrYWdlVmVyc2lvbn1gXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgbnVsbCwgMikpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvbkVycm9yKFwiRmFpbGVkIHRvIHVwZGF0ZSBwYWNrYWdlLmpzb24gdmVyc2lvbjpcIiArIGVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRvZXNQYWNrYWdlRXhpc3QgPSBhd2FpdCBreVxuICAgIC5wb3N0PHsgZXJyb3I/OiB7IGVycm9yX2NvZGU6IHN0cmluZyB9IH0+KFwicGFja2FnZXMvZ2V0XCIsIHtcbiAgICAgIGpzb246IHsgbmFtZTogcGFja2FnZUlkZW50aWZpZXIgfSxcbiAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgfSlcbiAgICAuanNvbigpXG4gICAgLnRoZW4oKHJlc3BvbnNlKSA9PiAhKHJlc3BvbnNlLmVycm9yPy5lcnJvcl9jb2RlID09PSBcInBhY2thZ2Vfbm90X2ZvdW5kXCIpKVxuXG4gIGlmICghZG9lc1BhY2thZ2VFeGlzdCkge1xuICAgIGF3YWl0IGt5XG4gICAgICAucG9zdChcInBhY2thZ2VzL2NyZWF0ZVwiLCB7XG4gICAgICAgIGpzb246IHsgbmFtZTogcGFja2FnZUlkZW50aWZpZXIgfSxcbiAgICAgICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2Vzc2lvblRva2VufWAgfSxcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIG9uRXJyb3IoXCJFcnJvciBjcmVhdGluZyBwYWNrYWdlOlwiICsgZXJyb3IpXG4gICAgICAgIHJldHVybiBvbkV4aXQoMSlcbiAgICAgIH0pXG4gIH1cblxuICBjb25zdCBkb2VzUmVsZWFzZUV4aXN0ID0gYXdhaXQga3lcbiAgICAucG9zdDx7XG4gICAgICBlcnJvcj86IHsgZXJyb3JfY29kZTogc3RyaW5nIH1cbiAgICAgIHBhY2thZ2VfcmVsZWFzZT86IHsgdmVyc2lvbjogc3RyaW5nIH1cbiAgICB9PihcInBhY2thZ2VfcmVsZWFzZXMvZ2V0XCIsIHtcbiAgICAgIGpzb246IHtcbiAgICAgICAgcGFja2FnZV9uYW1lX3dpdGhfdmVyc2lvbjogYCR7cGFja2FnZUlkZW50aWZpZXJ9QCR7cGFja2FnZVZlcnNpb259YCxcbiAgICAgIH0sXG4gICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgIH0pXG4gICAgLmpzb24oKVxuICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLnBhY2thZ2VfcmVsZWFzZT8udmVyc2lvbikge1xuICAgICAgICBwYWNrYWdlVmVyc2lvbiA9IHJlc3BvbnNlLnBhY2thZ2VfcmVsZWFzZS52ZXJzaW9uXG4gICAgICAgIHVwZGF0ZVBhY2thZ2VKc29uVmVyc2lvbihyZXNwb25zZS5wYWNrYWdlX3JlbGVhc2UudmVyc2lvbilcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiAhKHJlc3BvbnNlLmVycm9yPy5lcnJvcl9jb2RlID09PSBcInBhY2thZ2VfcmVsZWFzZV9ub3RfZm91bmRcIilcbiAgICB9KVxuXG4gIGlmIChkb2VzUmVsZWFzZUV4aXN0KSB7XG4gICAgY29uc3QgYnVtcGVkVmVyc2lvbiA9IHNlbXZlci5pbmMocGFja2FnZVZlcnNpb24sIFwicGF0Y2hcIikhXG4gICAgb25TdWNjZXNzKFxuICAgICAgYEluY3JlbWVudGluZyBQYWNrYWdlIFZlcnNpb24gJHtwYWNrYWdlVmVyc2lvbn0gLT4gJHtidW1wZWRWZXJzaW9ufWAsXG4gICAgKVxuICAgIHBhY2thZ2VWZXJzaW9uID0gYnVtcGVkVmVyc2lvblxuICAgIHVwZGF0ZVBhY2thZ2VKc29uVmVyc2lvbihwYWNrYWdlVmVyc2lvbilcbiAgfVxuXG4gIGF3YWl0IGt5XG4gICAgLnBvc3QoXCJwYWNrYWdlX3JlbGVhc2VzL2NyZWF0ZVwiLCB7XG4gICAgICBqc29uOiB7XG4gICAgICAgIHBhY2thZ2VfbmFtZV93aXRoX3ZlcnNpb246IGAke3BhY2thZ2VJZGVudGlmaWVyfUAke3BhY2thZ2VWZXJzaW9ufWAsXG4gICAgICB9LFxuICAgICAgdGhyb3dIdHRwRXJyb3JzOiBmYWxzZSxcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIG9uRXJyb3IoXCJFcnJvciBjcmVhdGluZyByZWxlYXNlOlwiICsgZXJyb3IpXG4gICAgICByZXR1cm4gb25FeGl0KDEpXG4gICAgfSlcblxuICBvblN1Y2Nlc3MoXCJcXG5cIilcblxuICBjb25zdCBkaXJlY3RvcnlGaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHBhdGguZGlybmFtZShzbmlwcGV0RmlsZVBhdGgpKVxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZGlyZWN0b3J5RmlsZXMpIHtcbiAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGUpLnJlcGxhY2UoXCIuXCIsIFwiXCIpXG4gICAgaWYgKCFbXCJqc29uXCIsIFwidHN4XCIsIFwidHNcIl0uaW5jbHVkZXMoZmlsZUV4dGVuc2lvbikpIGNvbnRpbnVlXG4gICAgY29uc3QgZmlsZUNvbnRlbnQgPVxuICAgICAgZnNcbiAgICAgICAgLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHNuaXBwZXRGaWxlUGF0aCksIGZpbGUpKVxuICAgICAgICAudG9TdHJpbmcoKSA/PyBcIlwiXG4gICAgYXdhaXQga3lcbiAgICAgIC5wb3N0KFwicGFja2FnZV9maWxlcy9jcmVhdGVcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiBmaWxlLFxuICAgICAgICAgIGNvbnRlbnRfdGV4dDogZmlsZUNvbnRlbnQsXG4gICAgICAgICAgcGFja2FnZV9uYW1lX3dpdGhfdmVyc2lvbjogYCR7cGFja2FnZUlkZW50aWZpZXJ9QCR7cGFja2FnZVZlcnNpb259YCxcbiAgICAgICAgfSxcbiAgICAgICAgdGhyb3dIdHRwRXJyb3JzOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIG9uU3VjY2VzcyhgVXBsb2FkZWQgZmlsZSAke2ZpbGV9IHRvIHRoZSByZWdpc3RyeS5gKVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgb25FcnJvcihgRXJyb3IgdXBsb2FkaW5nIGZpbGUgJHtmaWxlfTpgICsgZXJyb3IpXG4gICAgICB9KVxuICB9XG5cbiAgb25TdWNjZXNzKFxuICAgIFtcbiAgICAgIGBcXG5cdUQ4M0NcdURGODkgU3VjY2Vzc2Z1bGx5IHB1c2hlZCBwYWNrYWdlICR7cGFja2FnZUlkZW50aWZpZXJ9QCR7cGFja2FnZVZlcnNpb259IHRvIHRoZSByZWdpc3RyeSEke0J1bi5jb2xvcihcImJsdWVcIiwgXCJhbnNpXCIpfWAsXG4gICAgICBgaHR0cHM6Ly90c2NpcmN1aXQuY29tLyR7cGFja2FnZUlkZW50aWZpZXJ9IFxceDFiWzBtYCxcbiAgICBdLmpvaW4oXCIgXCIpLFxuICApXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBzZXRTZXNzaW9uVG9rZW4gfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGRlbGF5IGZyb20gXCJkZWxheVwiXG5pbXBvcnQgeyBnZXRLeSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2dldC1reVwiXG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50UmVzcG9uc2UgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9lbmRwb2ludC10eXBlc1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dpbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIC8vIERlZmluZSB0aGUgbG9naW4gYWN0aW9uIG9uY2UgdG8gc2hhcmUgYmV0d2VlbiBib3RoIGNvbW1hbmRzXG4gIGNvbnN0IGxvZ2luQWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuXG4gICAgY29uc3QgeyBsb2dpbl9wYWdlIH0gPSBhd2FpdCBreVxuICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvY3JlYXRlXCJdPihcbiAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2NyZWF0ZVwiLFxuICAgICAgICB7XG4gICAgICAgICAganNvbjoge30sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAuanNvbigpXG5cbiAgICBjb25zb2xlLmxvZyhcIlBsZWFzZSB2aXNpdCB0aGUgZm9sbG93aW5nIFVSTCB0byBsb2cgaW46XCIpXG4gICAgY29uc29sZS5sb2cobG9naW5fcGFnZS51cmwpXG5cbiAgICAvLyBXYWl0IHVudGlsIHdlIHJlY2VpdmUgY29uZmlybWF0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHsgbG9naW5fcGFnZTogbmV3X2xvZ2luX3BhZ2UgfSA9IGF3YWl0IGt5XG4gICAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2dldFwiXT4oXG4gICAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2dldFwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgLmpzb24oKVxuXG4gICAgICBpZiAobmV3X2xvZ2luX3BhZ2Uud2FzX2xvZ2luX3N1Y2Nlc3NmdWwpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJMb2dnZWQgaW4hIEdlbmVyYXRpbmcgdG9rZW4uLi5cIilcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld19sb2dpbl9wYWdlLmlzX2V4cGlyZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9naW4gcGFnZSBleHBpcmVkXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRlbGF5KDEwMDApXG4gICAgfVxuXG4gICAgY29uc3QgeyBzZXNzaW9uIH0gPSBhd2FpdCBreVxuICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvZXhjaGFuZ2VfZm9yX2NsaV9zZXNzaW9uXCJdPihcbiAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiLFxuICAgICAgICB7XG4gICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIC5qc29uKClcblxuICAgIHNldFNlc3Npb25Ub2tlbihzZXNzaW9uLnRva2VuKVxuICAgIGNvbnNvbGUubG9nKFwiXFxuUmVhZHkgdG8gdXNlIVwiKVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGF1dGggbG9naW4gc3ViY29tbWFuZFxuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJsb2dpblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkF1dGhlbnRpY2F0ZSBDTEksIGxvZ2luIHRvIHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dpbkFjdGlvbilcblxuICAvLyBSZWdpc3RlciB0aGUgdG9wLWxldmVsIGxvZ2luIGNvbW1hbmQgYXMgYW4gYWxpYXNcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwibG9naW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJMb2dpbiB0byB0c2NpcmN1aXQgcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ2luQWN0aW9uKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY2xlYXJTZXNzaW9uIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aExvZ291dCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIGNvbnN0IGxvZ291dEFjdGlvbiA9ICgpID0+IHtcbiAgICBjbGVhclNlc3Npb24oKVxuICAgIGNvbnNvbGUubG9nKFwiWW91IGhhdmUgYmVlbiBsb2dnZWQgb3V0IVwiKVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGF1dGggbG9nb3V0IHN1YmNvbW1hbmRcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwibG9nb3V0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiTG9nb3V0IGZyb20gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ291dEFjdGlvbilcblxuICAvLyBSZWdpc3RlciB0aGUgdG9wLWxldmVsIGxvZ291dCBjb21tYW5kIGFzIGFuIGFsaWFzXG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImxvZ291dFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkxvZ291dCBmcm9tIHRzY2lyY3VpdCByZWdpc3RyeVwiKVxuICAgIC5hY3Rpb24obG9nb3V0QWN0aW9uKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kKFwiYXV0aFwiKS5kZXNjcmlwdGlvbihcIkxvZ2luL2xvZ291dFwiKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJDb25maWcgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmQoXCJjb25maWdcIikuZGVzY3JpcHRpb24oXCJNYW5hZ2UgdHNjaXJjdWl0IENMSSBjb25maWd1cmF0aW9uXCIpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJDb25maWdQcmludCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiY29uZmlnXCIpIVxuICAgIC5jb21tYW5kKFwicHJpbnRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJQcmludCB0aGUgY3VycmVudCBjb25maWdcIilcbiAgICAuYWN0aW9uKCgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGNsaUNvbmZpZy5hbGwsIG51bGwsIDIpKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBnZXRLeSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2dldC1reVwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgc2V0dXBUc2NpUHJvamVjdCB9IGZyb20gXCJsaWIvc2hhcmVkL3NldHVwLXRzY2ktcGFja2FnZXNcIlxuaW1wb3J0IHsgZ2VuZXJhdGVUc0NvbmZpZyB9IGZyb20gXCJsaWIvc2hhcmVkL2dlbmVyYXRlLXRzLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNsb25lID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiY2xvbmVcIilcbiAgICAuZGVzY3JpcHRpb24oXCJDbG9uZSBhIHNuaXBwZXQgZnJvbSB0aGUgcmVnaXN0cnlcIilcbiAgICAuYXJndW1lbnQoXCI8c25pcHBldD5cIiwgXCJTbmlwcGV0IHRvIGNsb25lIChlLmcuIGF1dGhvci9zbmlwcGV0TmFtZSlcIilcbiAgICAuYWN0aW9uKGFzeW5jIChzbmlwcGV0UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaCA9IHNuaXBwZXRQYXRoLm1hdGNoKC9eKD86QHRzY2lcXC8pPyhbXi8uXSspWy8uXSguKykkLylcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkludmFsaWQgc25pcHBldCBwYXRoLiBVc2UgZm9ybWF0OiBhdXRob3Ivc25pcHBldE5hbWUsIGF1dGhvci5zbmlwcGV0TmFtZSwgb3IgQHRzY2kvYXV0aG9yLnNuaXBwZXROYW1lXCIsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFssIGF1dGhvciwgc25pcHBldE5hbWVdID0gbWF0Y2hcbiAgICAgIGNvbnNvbGUubG9nKGBDbG9uaW5nICR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfS4uLmApXG5cbiAgICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuICAgICAgbGV0IHBhY2thZ2VGaWxlTGlzdFxuICAgICAgdHJ5IHtcbiAgICAgICAgcGFja2FnZUZpbGVMaXN0ID0gYXdhaXQga3lcbiAgICAgICAgICAucG9zdDx7IHBhY2thZ2VfZmlsZXM6IEFycmF5PHsgZmlsZV9wYXRoOiBzdHJpbmcgfT4gfT4oXG4gICAgICAgICAgICBcInBhY2thZ2VfZmlsZXMvbGlzdFwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBgJHthdXRob3J9LyR7c25pcHBldE5hbWV9YCxcbiAgICAgICAgICAgICAgICB1c2VfbGF0ZXN0X3ZlcnNpb246IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICAuanNvbigpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiRmFpbGVkIHRvIGZldGNoIHBhY2thZ2UgZmlsZXM6XCIsXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShgJHthdXRob3J9LiR7c25pcHBldE5hbWV9YClcbiAgICAgIGZzLm1rZGlyU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVJbmZvIG9mIHBhY2thZ2VGaWxlTGlzdC5wYWNrYWdlX2ZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZUluZm8uZmlsZV9wYXRoLnJlcGxhY2UoL15cXC98ZGlzdFxcLy9nLCBcIlwiKVxuICAgICAgICBpZiAoIWZpbGVQYXRoKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGVQYXRoKVxuICAgICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQga3lcbiAgICAgICAgICAgIC5wb3N0PHsgcGFja2FnZV9maWxlOiB7IGNvbnRlbnRfdGV4dDogc3RyaW5nIH0gfT4oXG4gICAgICAgICAgICAgIFwicGFja2FnZV9maWxlcy9nZXRcIixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogYCR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfWAsXG4gICAgICAgICAgICAgICAgICBmaWxlX3BhdGg6IGZpbGVJbmZvLmZpbGVfcGF0aCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgICAgbGV0IGZpbGVUZXh0ID0gZmlsZUNvbnRlbnQucGFja2FnZV9maWxlLmNvbnRlbnRfdGV4dFxuXG4gICAgICAgICAgLy8gRW5zdXJlIGFsbCAudHN4IGZpbGVzIGNvbnRhaW4gXCJpbXBvcnQgJ0B0c2NpcmN1aXQvY29yZSc7XCJcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aChcIi50c3hcIikgJiZcbiAgICAgICAgICAgICFmaWxlVGV4dC5pbmNsdWRlcyhcIkB0c2NpcmN1aXQvY29yZVwiKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlsZVRleHQgPSBgaW1wb3J0IFwiQHRzY2lyY3VpdC9jb3JlXCI7XFxuXFxuJHtmaWxlVGV4dH1gXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgZmlsZVRleHQpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFNraXBwaW5nICR7ZmlsZVBhdGh9IGR1ZSB0byBlcnJvcjpgLFxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKGRpclBhdGgsIFwiLm5wbXJjXCIpLFxuICAgICAgICBcIkB0c2NpOnJlZ2lzdHJ5PWh0dHBzOi8vbnBtLnRzY2lyY3VpdC5jb21cIixcbiAgICAgIClcblxuICAgICAgZ2VuZXJhdGVUc0NvbmZpZyhkaXJQYXRoKVxuICAgICAgc2V0dXBUc2NpUHJvamVjdChkaXJQYXRoKVxuXG4gICAgICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IGNsb25lZCB0byAke2RpclBhdGh9L2ApXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFJ1biBcImNkICR7cGF0aC5kaXJuYW1lKGRpclBhdGgpfSAmJiB0c2NpIGRldlwiIHRvIHN0YXJ0IGRldmVsb3BpbmcuYCxcbiAgICAgIClcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY3JlYXRlQ2lyY3VpdFdlYldvcmtlciB9IGZyb20gXCJAdHNjaXJjdWl0L2V2YWxcIlxuaW1wb3J0IHdlYldvcmtlckJ1bmRsZVVybCBmcm9tIFwiQHRzY2lyY3VpdC9ldmFsL2Jsb2ItdXJsXCJcbmltcG9ydCB7IGdldFZpcnR1YWxGaWxlU3lzdGVtRnJvbURpclBhdGggfSBmcm9tIFwibWFrZS12ZnNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuXG5jb25zdCBBTExPV0VEX0ZPUk1BVFMgPSBbXG4gIFwianNvblwiLFxuICBcImNpcmN1aXQtanNvblwiLFxuICBcInNjaGVtYXRpYy1zdmdcIixcbiAgXCJwY2Itc3ZnXCIsXG4gIFwiZ2VyYmVyc1wiLFxuICBcInJlYWRhYmxlLW5ldGxpc3RcIixcbiAgXCJnbHRmXCIsXG4gIFwic3BlY2N0cmEtZHNuXCIsXG5dIGFzIGNvbnN0XG5cbnR5cGUgRm9ybWF0ID0gKHR5cGVvZiBBTExPV0VEX0ZPUk1BVFMpW251bWJlcl1cblxuY29uc3QgT1VUUFVUX0VYVEVOU0lPTlMgPSB7XG4gIGpzb246IFwiLmNpcmN1aXQuanNvblwiLFxuICBcImNpcmN1aXQtanNvblwiOiBcIi5jaXJjdWl0Lmpzb25cIixcbiAgXCJzY2hlbWF0aWMtc3ZnXCI6IFwiLXNjaGVtYXRpYy5zdmdcIixcbiAgXCJwY2Itc3ZnXCI6IFwiLXBjYi5zdmdcIixcbiAgZ2VyYmVyczogXCItZ2VyYmVycy56aXBcIixcbiAgXCJyZWFkYWJsZS1uZXRsaXN0XCI6IFwiLXJlYWRhYmxlLm5ldGxpc3RcIixcbiAgZ2x0ZjogXCIuZ2x0ZlwiLFxuICBcInNwZWNjdHJhLWRzblwiOiBcIi5kc25cIixcbn1cblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyRXhwb3J0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiZXhwb3J0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiRXhwb3J0IHRzY2lyY3VpdCBjb2RlIHRvIHZhcmlvdXMgZm9ybWF0c1wiKVxuICAgIC5hcmd1bWVudChcIjxmaWxlPlwiLCBcIlBhdGggdG8gdGhlIHNuaXBwZXQgZmlsZVwiKVxuICAgIC5vcHRpb24oXCItZiwgLS1mb3JtYXQgPGZvcm1hdD5cIiwgXCJPdXRwdXQgZm9ybWF0XCIpXG4gICAgLm9wdGlvbihcIi1vLCAtLW91dHB1dCA8cGF0aD5cIiwgXCJPdXRwdXQgZmlsZSBwYXRoXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZSwgb3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgeyBmb3JtYXQgPSBcImNpcmN1aXQtanNvblwiIH0gPSBvcHRpb25zXG4gICAgICBsZXQgeyBvdXRwdXQgfSA9IG9wdGlvbnNcbiAgICAgIGlmICghQUxMT1dFRF9GT1JNQVRTLmluY2x1ZGVzKGZvcm1hdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGZvcm1hdDogJHtmb3JtYXR9XFxuU3VwcG9ydGVkIGZvcm1hdHM6ICR7QUxMT1dFRF9GT1JNQVRTLmpvaW4oXCIsXCIpfWAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKCFvdXRwdXQpIHtcbiAgICAgICAgb3V0cHV0ID0gcGF0aC5iYXNlbmFtZShmaWxlKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCBcIlwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCBjcmVhdGVDaXJjdWl0V2ViV29ya2VyKHtcbiAgICAgICAgd2ViV29ya2VyVXJsOiB3ZWJXb3JrZXJCdW5kbGVVcmwsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBwcm9qZWN0RGlyID0gcGF0aC5kaXJuYW1lKGZpbGUpXG5cbiAgICAgIGNvbnN0IHJlbGF0aXZlQ29tcG9uZW50UGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdERpciwgZmlsZSlcblxuICAgICAgYXdhaXQgd29ya2VyLmV4ZWN1dGVXaXRoRnNNYXAoe1xuICAgICAgICBlbnRyeXBvaW50OiBcImVudHJ5cG9pbnQudHN4XCIsXG4gICAgICAgIGZzTWFwOiB7XG4gICAgICAgICAgLi4uKChhd2FpdCBnZXRWaXJ0dWFsRmlsZVN5c3RlbUZyb21EaXJQYXRoKHtcbiAgICAgICAgICAgIGRpclBhdGg6IHByb2plY3REaXIsXG4gICAgICAgICAgICBjb250ZW50Rm9ybWF0OiBcInN0cmluZ1wiLFxuICAgICAgICAgIH0pKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSxcbiAgICAgICAgICBcImVudHJ5cG9pbnQudHN4XCI6IGBcbmltcG9ydCBNeUNpcmN1aXQgZnJvbSBcIi4vJHtyZWxhdGl2ZUNvbXBvbmVudFBhdGh9XCJcblxuY2lyY3VpdC5hZGQoPE15Q2lyY3VpdCAvPilcbiAgICAgICAgYCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHdvcmtlci5yZW5kZXJVbnRpbFNldHRsZWQoKVxuXG4gICAgICBjb25zdCBjaXJjdWl0SnNvbiA9IGF3YWl0IHdvcmtlci5nZXRDaXJjdWl0SnNvbigpXG5cbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIHByb2plY3REaXIsXG4gICAgICAgIGAke291dHB1dH0ke09VVFBVVF9FWFRFTlNJT05TW2Zvcm1hdCBhcyBGb3JtYXRdfWAsXG4gICAgICApXG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgSlNPTi5zdHJpbmdpZnkoY2lyY3VpdEpzb24pKVxuXG4gICAgICBjb25zb2xlLmxvZyhgRXhwb3J0ZWQgdG8gJHtvdXRwdXRQYXRofWApXG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoUHJpbnRUb2tlbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcInByaW50LXRva2VuXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUHJpbnRzIHlvdXIgYXV0aCB0b2tlblwiKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBjbGlDb25maWcuZ2V0KFwic2Vzc2lvblRva2VuXCIpXG4gICAgICBpZiAoIXRva2VuKSByZXR1cm4gY29uc29sZS5sb2coXCJZb3UgbmVlZCB0byBsb2cgaW4gdG8gYWNjZXNzIHRoaXMuXCIpXG4gICAgICBjb25zb2xlLmxvZyhcIllvdXIgVG9rZW46XFxuXCIsIHRva2VuKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBzZXRTZXNzaW9uVG9rZW4gfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5mdW5jdGlvbiB2YWxpZGF0ZUpXVExlbmd0aCh0b2tlbjogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gdG9rZW4uc3BsaXQoXCIuXCIpXG5cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMyAmJiBwYXJ0cy5ldmVyeSgocGFydCkgPT4gcGFydC5sZW5ndGggPiAwKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhTZXRUb2tlbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcInNldC10b2tlblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkV4cGxpY2l0bHkgc2V0IHlvdXIgYXV0aCB0b2tlblwiKVxuICAgIC5hcmd1bWVudChcIjx0b2tlbj5cIiwgXCJOZXcgdG9rZW4gdG8gbWFudWFsbHkgY29uZmlndXJlXCIpXG4gICAgLmFjdGlvbigodG9rZW4pID0+IHtcbiAgICAgIGlmICghdmFsaWRhdGVKV1RMZW5ndGgodG9rZW4pKVxuICAgICAgICByZXR1cm4gY29uc29sZS5sb2coXCJJbnZhbGlkIHRva2VuIHByb3ZpZGVkXCIpXG4gICAgICBzZXRTZXNzaW9uVG9rZW4odG9rZW4pXG4gICAgICBjb25zb2xlLmxvZyhcIlRva2VuIG1hbnVhbGx5IHVwZGF0ZWQuXCIpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgeyBwdXNoU25pcHBldCB9IGZyb20gXCJsaWIvc2hhcmVkL3B1c2gtc25pcHBldFwiXG5pbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyUHVzaCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcInB1c2hcIilcbiAgICAuZGVzY3JpcHRpb24oXCJTYXZlIHNuaXBwZXQgY29kZSB0byBSZWdpc3RyeSBBUElcIilcbiAgICAuYXJndW1lbnQoXCJbZmlsZV1cIiwgXCJQYXRoIHRvIHRoZSBzbmlwcGV0IGZpbGVcIilcbiAgICAuYWN0aW9uKGFzeW5jIChmaWxlUGF0aD86IHN0cmluZykgPT4ge1xuICAgICAgYXdhaXQgcHVzaFNuaXBwZXQoe1xuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgb25FeGl0OiAoY29kZSkgPT4gcHJvY2Vzcy5leGl0KGNvZGUpLFxuICAgICAgICBvbkVycm9yOiAobWVzc2FnZSkgPT4gY29uc29sZS5lcnJvcihtZXNzYWdlKSxcbiAgICAgICAgb25TdWNjZXNzOiAobWVzc2FnZSkgPT4gY29uc29sZS5sb2cobWVzc2FnZSksXG4gICAgICB9KVxuICAgIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFDQSxTQUFTLGVBQWU7OztBQ0F4QixZQUFZQSxTQUFRO0FBQ3BCLFlBQVlDLFdBQVU7OztBQ0Z0QixPQUFPLFFBQVE7QUFHUixJQUFNLHVCQUF1QixNQUFjO0FBQ2hELFFBQU0sWUFBWSxRQUFRLElBQUkseUJBQXlCO0FBQ3ZELE1BQUksVUFBVSxXQUFXLE1BQU0sRUFBRyxRQUFPO0FBQ3pDLE1BQUksVUFBVSxXQUFXLE1BQU0sRUFBRyxRQUFPO0FBQ3pDLE1BQUksVUFBVSxXQUFXLEtBQUssRUFBRyxRQUFPO0FBRXhDLE1BQUksR0FBRyxXQUFXLFdBQVcsRUFBRyxRQUFPO0FBQ3ZDLE1BQUksR0FBRyxXQUFXLGdCQUFnQixFQUFHLFFBQU87QUFDNUMsTUFBSSxHQUFHLFdBQVcsV0FBVyxFQUFHLFFBQU87QUFFdkMsU0FBTztBQUNU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YSxPQUFPO0FBRXBCLGFBQWEsT0FBTztBQUNwQixrQkFBa0IsT0FBTztBQUN6QixtQkFBbUIsT0FBTztBQUMxQix1QkFBdUIsT0FBTztBQUM5QixxQkFBcUIsT0FBTztBQUU1QixlQUFlLE9BQU87QUFDdEIsb0JBQW9CLE9BQU87QUFFM0IsZUFBZSxPQUFPO0FBRXRCLElBQUksUUFBUSxLQUFLLFdBQVcsR0FBRztBQUM3QixhQUFXLFNBQVMsUUFBUSxJQUFJO0FBQ2xDLE9BQU87QUFDTCxVQUFRLE1BQU07QUFDaEI7IiwKICAibmFtZXMiOiBbImZzIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgInBhdGgiLCAicHJvZ3JhbSIsICJwYXRoIiwgImZzIiwgImZzIiwgInBhdGgiLCAia3kiLCAiZnMiLCAicGF0aCIsICJyZXNvbHZlIiwgInBhdGgiLCAiZnMiLCAiZnMiLCAicGF0aCIsICJmcyIsICJ0cyIsICJmcyIsICJwYXRoIiwgImt5IiwgInBhdGgiLCAia3kiLCAiZnMiLCAicHJvZ3JhbSIsICJwb3J0IiwgInJlc29sdmUiLCAic2VydmVyIiwgInByb2dyYW0iLCAia3kiLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJmcyIsICJwYXRoIiwgInByb2dyYW0iLCAia3kiLCAic2VtdmVyIiwgInBhdGgiLCAiZnMiLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJzZW12ZXIiXQp9Cg==
1217
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2luaXQvcmVnaXN0ZXIudHMiLCAiLi4vbGliL3NoYXJlZC9kZXRlY3QtcGtnLW1hbmFnZXIudHMiLCAiLi4vbGliL3NoYXJlZC9zZXR1cC10c2NpLXBhY2thZ2VzLnRzIiwgIi4uL2xpYi9zaGFyZWQvZ2VuZXJhdGUtdHMtY29uZmlnLnRzIiwgIi4uL2xpYi9zaGFyZWQvd3JpdGUtZmlsZS1pZi1ub3QtZXhpc3RzLnRzIiwgIi4uL2xpYi9zaGFyZWQvZ2VuZXJhdGUtZ2l0aWdub3JlLWZpbGUudHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldC50cyIsICIuLi9jbGkvZGV2L0RldlNlcnZlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXIudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL2xpYi9zaXRlL2dldEluZGV4LnRzIiwgIi4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyLnRzIiwgIi4uL2xpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2ZpbmRJbXBvcnRzSW5TbmlwcGV0LnRzIiwgIi4uL2xpYi9jbGktY29uZmlnL2luZGV4LnRzIiwgIi4uL2xpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5LnRzIiwgIi4uL2xpYi9zaGFyZWQvcHVzaC1zbmlwcGV0LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ2luL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9hdXRoL2xvZ291dC9yZWdpc3Rlci50cyIsICIuLi9jbGkvYXV0aC9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jb25maWcvcHJpbnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Nsb25lL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9leHBvcnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvcHJpbnQtdG9rZW4vcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9wdXNoL3JlZ2lzdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyByZWdpc3RlckluaXQgfSBmcm9tIFwiLi9pbml0L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGV2IH0gZnJvbSBcIi4vZGV2L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aExvZ2luIH0gZnJvbSBcIi4vYXV0aC9sb2dpbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dvdXQgfSBmcm9tIFwiLi9hdXRoL2xvZ291dC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGggfSBmcm9tIFwiLi9hdXRoL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnUHJpbnQgfSBmcm9tIFwiLi9jb25maWcvcHJpbnQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDbG9uZSB9IGZyb20gXCIuL2Nsb25lL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHBlcmZlY3RDbGkgfSBmcm9tIFwicGVyZmVjdC1jbGlcIlxuaW1wb3J0IHBrZyBmcm9tIFwiLi4vcGFja2FnZS5qc29uXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5pbXBvcnQgeyByZWdpc3RlckV4cG9ydCB9IGZyb20gXCIuL2V4cG9ydC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhQcmludFRva2VuIH0gZnJvbSBcIi4vYXV0aC9wcmludC10b2tlbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhTZXRUb2tlbiB9IGZyb20gXCIuL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyUHVzaCB9IGZyb20gXCIuL3B1c2gvcmVnaXN0ZXJcIlxuXG5leHBvcnQgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcblxucHJvZ3JhbVxuICAubmFtZShcInRzY2lcIilcbiAgLmRlc2NyaXB0aW9uKFwiQ0xJIGZvciBkZXZlbG9waW5nIHRzY2lyY3VpdCBzbmlwcGV0c1wiKVxuICAvLyBIQUNLOiBhdCBidWlsZCB0aW1lIHRoZSB2ZXJzaW9uIGlzIG9sZCwgd2UgbmVlZCB0b1xuICAvLyBmaXggdGhpcyBhdCBzb21lIHBvaW50Li4uXG4gIC52ZXJzaW9uKHNlbXZlci5pbmMocGtnLnZlcnNpb24sIFwicGF0Y2hcIikgPz8gcGtnLnZlcnNpb24pXG5cbnJlZ2lzdGVySW5pdChwcm9ncmFtKVxuXG5yZWdpc3RlckRldihwcm9ncmFtKVxucmVnaXN0ZXJDbG9uZShwcm9ncmFtKVxucmVnaXN0ZXJQdXNoKHByb2dyYW0pXG5cbnJlZ2lzdGVyQXV0aChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoTG9naW4ocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aExvZ291dChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoUHJpbnRUb2tlbihwcm9ncmFtKVxucmVnaXN0ZXJBdXRoU2V0VG9rZW4ocHJvZ3JhbSlcblxucmVnaXN0ZXJDb25maWcocHJvZ3JhbSlcbnJlZ2lzdGVyQ29uZmlnUHJpbnQocHJvZ3JhbSlcblxucmVnaXN0ZXJFeHBvcnQocHJvZ3JhbSlcblxuaWYgKHByb2Nlc3MuYXJndi5sZW5ndGggPT09IDIpIHtcbiAgcGVyZmVjdENsaShwcm9ncmFtLCBwcm9jZXNzLmFyZ3YpXG59IGVsc2Uge1xuICBwcm9ncmFtLnBhcnNlKClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBzZXR1cFRzY2lQcm9qZWN0IH0gZnJvbSBcImxpYi9zaGFyZWQvc2V0dXAtdHNjaS1wYWNrYWdlc1wiXG5pbXBvcnQgeyBnZW5lcmF0ZVRzQ29uZmlnIH0gZnJvbSBcImxpYi9zaGFyZWQvZ2VuZXJhdGUtdHMtY29uZmlnXCJcbmltcG9ydCB7IHdyaXRlRmlsZUlmTm90RXhpc3RzIH0gZnJvbSBcImxpYi9zaGFyZWQvd3JpdGUtZmlsZS1pZi1ub3QtZXhpc3RzXCJcbmltcG9ydCB7IGdlbmVyYXRlR2l0SWdub3JlRmlsZSB9IGZyb20gXCJsaWIvc2hhcmVkL2dlbmVyYXRlLWdpdGlnbm9yZS1maWxlXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVySW5pdCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImluaXRcIilcbiAgICAuZGVzY3JpcHRpb24oXG4gICAgICBcIkluaXRpYWxpemUgYSBuZXcgVFNDaXJjdWl0IHByb2plY3QgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgKG9yIGN1cnJlbnQgZGlyZWN0b3J5IGlmIG5vbmUgaXMgcHJvdmlkZWQpXCIsXG4gICAgKVxuICAgIC5hcmd1bWVudChcbiAgICAgIFwiW2RpcmVjdG9yeV1cIixcbiAgICAgIFwiRGlyZWN0b3J5IG5hbWUgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byBjdXJyZW50IGRpcmVjdG9yeSlcIixcbiAgICApXG4gICAgLmFjdGlvbigoZGlyZWN0b3J5Pzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBwcm9qZWN0RGlyID0gZGlyZWN0b3J5XG4gICAgICAgID8gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGRpcmVjdG9yeSlcbiAgICAgICAgOiBwcm9jZXNzLmN3ZCgpXG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgZnMubWtkaXJTeW5jKHByb2plY3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgIC8vIENyZWF0ZSBlc3NlbnRpYWwgcHJvamVjdCBmaWxlc1xuICAgICAgd3JpdGVGaWxlSWZOb3RFeGlzdHMoXG4gICAgICAgIHBhdGguam9pbihwcm9qZWN0RGlyLCBcImluZGV4LnRzeFwiKSxcbiAgICAgICAgYFxuaW1wb3J0IFwiQHRzY2lyY3VpdC9jb3JlXCI7XG5cbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcbiAgPGJvYXJkIHdpZHRoPVwiMTBtbVwiIGhlaWdodD1cIjEwbW1cIj5cbiAgICA8cmVzaXN0b3IgcmVzaXN0YW5jZT1cIjFrXCIgZm9vdHByaW50PVwiMDQwMlwiIG5hbWU9XCJSMVwiIHNjaFg9ezN9IHBjYlg9ezN9IC8+XG4gICAgPGNhcGFjaXRvciBjYXBhY2l0YW5jZT1cIjEwMDBwRlwiIGZvb3RwcmludD1cIjA0MDJcIiBuYW1lPVwiQzFcIiBzY2hYPXstM30gcGNiWD17LTN9IC8+XG4gICAgPHRyYWNlIGZyb209XCIuUjEgPiAucGluMVwiIHRvPVwiLkMxID4gLnBpbjFcIiAvPlxuICA8L2JvYXJkPlxuKTtcbmAsXG4gICAgICApXG5cbiAgICAgIHdyaXRlRmlsZUlmTm90RXhpc3RzKFxuICAgICAgICBwYXRoLmpvaW4ocHJvamVjdERpciwgXCIubnBtcmNcIiksXG4gICAgICAgIGBcbkB0c2NpOnJlZ2lzdHJ5PWh0dHBzOi8vbnBtLnRzY2lyY3VpdC5jb21cbmAsXG4gICAgICApXG5cbiAgICAgIC8vIFNldHVwIHByb2plY3QgZGVwZW5kZW5jaWVzXG4gICAgICB0cnkge1xuICAgICAgICBzZXR1cFRzY2lQcm9qZWN0KHByb2plY3REaXIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzOlwiLCBlcnJvcilcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIHRzY29uZmlnLmpzb25cbiAgICAgIGdlbmVyYXRlVHNDb25maWcocHJvamVjdERpcilcbiAgICAgIC8vIENyZWF0ZSAuZ2l0aWdub3JlIGZpbGVcbiAgICAgIGdlbmVyYXRlR2l0SWdub3JlRmlsZShwcm9qZWN0RGlyKVxuXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGBcdUQ4M0NcdURGODkgSW5pdGlhbGl6YXRpb24gY29tcGxldGUhIFJ1biAke2RpcmVjdG9yeSA/IGBcImNkICR7ZGlyZWN0b3J5fVwiICYgYCA6IFwiXCJ9XCJ0c2NpIGRldlwiIHRvIHN0YXJ0IGRldmVsb3BpbmcuYCxcbiAgICAgIClcbiAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gXCJmc1wiXG5cbi8vIERldGVjdCB0aGUgcGFja2FnZSBtYW5hZ2VyIGJlaW5nIHVzZWQgaW4gdGhlIHByb2plY3RcbmV4cG9ydCBjb25zdCBkZXRlY3RQYWNrYWdlTWFuYWdlciA9ICgpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB1c2VyQWdlbnQgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX3VzZXJfYWdlbnQgfHwgXCJcIlxuICBpZiAodXNlckFnZW50LnN0YXJ0c1dpdGgoXCJ5YXJuXCIpKSByZXR1cm4gXCJ5YXJuXCJcbiAgaWYgKHVzZXJBZ2VudC5zdGFydHNXaXRoKFwicG5wbVwiKSkgcmV0dXJuIFwicG5wbVwiXG4gIGlmICh1c2VyQWdlbnQuc3RhcnRzV2l0aChcImJ1blwiKSkgcmV0dXJuIFwiYnVuXCJcblxuICBpZiAoZnMuZXhpc3RzU3luYyhcInlhcm4ubG9ja1wiKSkgcmV0dXJuIFwieWFyblwiXG4gIGlmIChmcy5leGlzdHNTeW5jKFwicG5wbS1sb2NrLnlhbWxcIikpIHJldHVybiBcInBucG1cIlxuICBpZiAoZnMuZXhpc3RzU3luYyhcImJ1bi5sb2NrYlwiKSkgcmV0dXJuIFwiYnVuXCJcblxuICByZXR1cm4gXCJucG1cIiAvLyBEZWZhdWx0IHRvIG5wbVxufVxuIiwgImltcG9ydCB7IGRldGVjdFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vZGV0ZWN0LXBrZy1tYW5hZ2VyXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFRzY2lQcm9qZWN0KFxuICBkaXJlY3RvcnkgPSBwcm9jZXNzLmN3ZCgpLFxuICBkZXBlbmRlbmNpZXMgPSBbXCJAdHlwZXMvcmVhY3RcIiwgXCJAdHNjaXJjdWl0L2NvcmVcIl0sXG4pIHtcbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoLnJlc29sdmUoZGlyZWN0b3J5KVxuICBpZiAoIWZzLmV4aXN0c1N5bmMocHJvamVjdFBhdGgpKSB7XG4gICAgZnMubWtkaXJTeW5jKHByb2plY3RQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICB9XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gZGV0ZWN0UGFja2FnZU1hbmFnZXIoKVxuXG4gIGNvbnNvbGUubG9nKGBJbml0aWFsaXppbmcgcHJvamVjdCBpbiAke3Byb2plY3RQYXRofS4uLmApXG4gIHByb2Nlc3MuY2hkaXIocHJvamVjdFBhdGgpXG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKFwicGFja2FnZS5qc29uXCIpKSB7XG4gICAgY29uc3QgaW5pdENvbW1hbmQgPVxuICAgICAgcGFja2FnZU1hbmFnZXIgPT09IFwieWFyblwiXG4gICAgICAgID8gXCJ5YXJuIGluaXQgLXlcIlxuICAgICAgICA6IHBhY2thZ2VNYW5hZ2VyID09PSBcInBucG1cIlxuICAgICAgICAgID8gXCJwbnBtIGluaXRcIlxuICAgICAgICAgIDogcGFja2FnZU1hbmFnZXIgPT09IFwiYnVuXCJcbiAgICAgICAgICAgID8gXCJidW4gaW5pdCAteVwiXG4gICAgICAgICAgICA6IFwibnBtIGluaXQgLXlcIlxuXG4gICAgZXhlY1N5bmMoaW5pdENvbW1hbmQsIHsgc3RkaW86IFwiaW5oZXJpdFwiIH0pXG4gICAgY29uc29sZS5sb2coXCJQcm9qZWN0IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS5cIilcbiAgfVxuXG4gIC8vIFJlYWQgYW5kIG1vZGlmeSBwYWNrYWdlLmpzb25cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCBcInBhY2thZ2UuanNvblwiKVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgXCJ1dGYtOFwiKSlcblxuICAvLyBSZW1vdmUgdW53YW50ZWQgZmllbGRzXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5rZXl3b3Jkc1xuICBkZWxldGUgcGFja2FnZUpzb24uYXV0aG9yXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5tYWluXG5cbiAgZnMud3JpdGVGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCBudWxsLCAyKSlcbiAgY29uc29sZS5sb2coXCJVcGRhdGVkIHBhY2thZ2UuanNvbiB0byByZW1vdmUgdW5uZWNlc3NhcnkgZmllbGRzLlwiKVxuXG4gIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuLi5cIilcbiAgICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9XG4gICAgICBwYWNrYWdlTWFuYWdlciA9PT0gXCJ5YXJuXCJcbiAgICAgICAgPyBgeWFybiBhZGQgLUQgJHtkZXBlbmRlbmNpZXMuam9pbihcIiBcIil9YFxuICAgICAgICA6IHBhY2thZ2VNYW5hZ2VyID09PSBcInBucG1cIlxuICAgICAgICAgID8gYHBucG0gYWRkIC1EICR7ZGVwZW5kZW5jaWVzLmpvaW4oXCIgXCIpfWBcbiAgICAgICAgICA6IHBhY2thZ2VNYW5hZ2VyID09PSBcImJ1blwiXG4gICAgICAgICAgICA/IGBidW4gYWRkIC1EICR7ZGVwZW5kZW5jaWVzLmpvaW4oXCIgXCIpfWBcbiAgICAgICAgICAgIDogYG5wbSBpbnN0YWxsIC1EICR7ZGVwZW5kZW5jaWVzLmpvaW4oXCIgXCIpfWBcblxuICAgIGV4ZWNTeW5jKGluc3RhbGxDb21tYW5kLCB7IHN0ZGlvOiBcImluaGVyaXRcIiB9KVxuICAgIGNvbnNvbGUubG9nKFwiRGVwZW5kZW5jaWVzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHkuXCIpXG4gIH1cblxuICByZXR1cm4gcGFja2FnZUpzb24ubmFtZSB8fCBcInVua25vd25cIlxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgd3JpdGVGaWxlSWZOb3RFeGlzdHMgfSBmcm9tIFwiLi93cml0ZS1maWxlLWlmLW5vdC1leGlzdHNcIlxuXG4vLyBHZW5lcmF0ZSBhIFJlYWN0LWNvbXBhdGlibGUgdHNjb25maWcuanNvblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlVHNDb25maWcgPSAoZGlyOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgdHNjb25maWdQYXRoID0gcGF0aC5qb2luKGRpciwgXCJ0c2NvbmZpZy5qc29uXCIpXG4gIGNvbnN0IHRzY29uZmlnQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KFxuICAgIHtcbiAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICB0YXJnZXQ6IFwiRVM2XCIsXG4gICAgICAgIG1vZHVsZTogXCJFU05leHRcIixcbiAgICAgICAganN4OiBcInJlYWN0LWpzeFwiLFxuICAgICAgICBvdXREaXI6IFwiZGlzdFwiLFxuICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSxcbiAgICAgICAgbW9kdWxlUmVzb2x1dGlvbjogXCJub2RlXCIsXG4gICAgICAgIHNraXBMaWJDaGVjazogdHJ1ZSxcbiAgICAgICAgZm9yY2VDb25zaXN0ZW50Q2FzaW5nSW5GaWxlTmFtZXM6IHRydWUsXG4gICAgICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLFxuICAgICAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsXG4gICAgICAgIGV4cGVyaW1lbnRhbERlY29yYXRvcnM6IHRydWUsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbnVsbCxcbiAgICAyLFxuICApXG4gIHdyaXRlRmlsZUlmTm90RXhpc3RzKHRzY29uZmlnUGF0aCwgdHNjb25maWdDb250ZW50KVxufVxuIiwgImltcG9ydCBmcyBmcm9tIFwiZnNcIlxuXG5leHBvcnQgY29uc3Qgd3JpdGVGaWxlSWZOb3RFeGlzdHMgPSAoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKSA9PiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb250ZW50LnRyaW1TdGFydCgpLCBcInV0Zi04XCIpXG4gICAgY29uc29sZS5pbmZvKGBDcmVhdGVkOiAke2ZpbGVQYXRofWApXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwcGVkOiAke2ZpbGVQYXRofSBhbHJlYWR5IGV4aXN0c2ApXG4gIH1cbn1cbiIsICJpbXBvcnQgeyB3cml0ZUZpbGVJZk5vdEV4aXN0cyB9IGZyb20gXCIuL3dyaXRlLWZpbGUtaWYtbm90LWV4aXN0c1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlR2l0SWdub3JlRmlsZSA9IChkaXI6IHN0cmluZykgPT4ge1xuICBjb25zdCBnaXRpZ25vcmVQYXRoID0gcGF0aC5qb2luKGRpciwgXCIuZ2l0aWdub3JlXCIpXG4gIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSBgIyBEZXBlbmRlbmNpZXNcbm5vZGVfbW9kdWxlcy9cblxuIyBCdWlsZCBvdXRwdXRcbmRpc3QvXG5idWlsZC9cblxuIyBFbnZpcm9ubWVudCB2YXJpYWJsZXNcbi5lbnZcbi5lbnYubG9jYWxcbi5lbnYuKi5sb2NhbFxuXG4jIElERSBmaWxlc1xuLnZzY29kZS9cbi5pZGVhL1xuKi5zd3Bcbiouc3dvXG5cbiMgT1MgZmlsZXNcbi5EU19TdG9yZVxuVGh1bWJzLmRiXG5cbiMgRGVidWcgbG9nc1xubnBtLWRlYnVnLmxvZypcbnlhcm4tZGVidWcubG9nKlxueWFybi1lcnJvci5sb2cqXG5gXG5cbiAgd3JpdGVGaWxlSWZOb3RFeGlzdHMoZ2l0aWdub3JlUGF0aCwgZ2l0aWdub3JlQ29udGVudClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHsgY3JlYXRlSHR0cFNlcnZlciB9IGZyb20gXCJsaWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXJcIlxuaW1wb3J0IHsgZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzIH0gZnJvbSBcImxpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2dldExvY2FsRmlsZURlcGVuZGVuY2llc1wiXG5pbXBvcnQgeyBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldCB9IGZyb20gXCIuLi8uLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldFwiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcIi4uLy4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5pbXBvcnQgeyBEZXZTZXJ2ZXIgfSBmcm9tIFwiLi9EZXZTZXJ2ZXJcIlxuaW1wb3J0ICogYXMgbmV0IGZyb20gXCJub2RlOm5ldFwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckRldiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImRldlwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlN0YXJ0IGRldmVsb3BtZW50IHNlcnZlciBmb3IgYSBzbmlwcGV0XCIpXG4gICAgLmFyZ3VtZW50KFwiW2ZpbGVdXCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1wLCAtLXBvcnQgPG51bWJlcj5cIiwgXCJQb3J0IHRvIHJ1biBzZXJ2ZXIgb25cIiwgXCIzMDIwXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZTogc3RyaW5nLCBvcHRpb25zOiB7IHBvcnQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICBsZXQgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydClcblxuICAgICAgY29uc3QgaXNQb3J0QXZhaWxhYmxlID0gKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCBzZXJ2ZXIgPSBuZXQuY3JlYXRlU2VydmVyKClcbiAgICAgICAgICBzZXJ2ZXIub25jZShcImVycm9yXCIsICgpID0+IHJlc29sdmUoZmFsc2UpKVxuICAgICAgICAgIHNlcnZlci5vbmNlKFwibGlzdGVuaW5nXCIsICgpID0+IHtcbiAgICAgICAgICAgIHNlcnZlci5jbG9zZSgoKSA9PiByZXNvbHZlKHRydWUpKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgc2VydmVyLmxpc3Rlbihwb3J0KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoIShhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCkpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBQb3J0ICR7cG9ydH0gaXMgaW4gdXNlLCB0cnlpbmcgcG9ydCAke3BvcnQgKyAxfS4uLmApXG4gICAgICAgIHBvcnQgKz0gMVxuICAgICAgfVxuXG4gICAgICBsZXQgYWJzb2x1dGVQYXRoOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpXG4gICAgICAgIGlmICghYWJzb2x1dGVQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogT25seSAudHN4IGZpbGVzIGFyZSBzdXBwb3J0ZWRcIilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZW50cnlwb2ludFBhdGggPSBwYXRoLnJlc29sdmUoXCJpbmRleC50c3hcIilcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZW50cnlwb2ludFBhdGgpKSB7XG4gICAgICAgICAgYWJzb2x1dGVQYXRoID0gZW50cnlwb2ludFBhdGhcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIGZpbGUgcHJvdmlkZWQuIFVzaW5nICdpbmRleC50c3gnIGFzIHRoZSBlbnRyeXBvaW50LlwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgXCJObyBlbnRyeXBvaW50IGZvdW5kLiBSdW4gJ3RzY2kgaW5pdCcgdG8gYm9vdHN0cmFwIGEgYmFzaWMgcHJvamVjdC5cIixcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZURpciA9IHBhdGguZGlybmFtZShhYnNvbHV0ZVBhdGgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyB0eXBlcyBmb3IgaW1wb3J0ZWQgc25pcHBldHMuLi5cIilcbiAgICAgICAgYXdhaXQgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoYWJzb2x1dGVQYXRoKVxuICAgICAgICBjb25zb2xlLmxvZyhcIlR5cGVzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHlcIilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBpbnN0YWxsIHR5cGVzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VydmVyID0gbmV3IERldlNlcnZlcih7XG4gICAgICAgIHBvcnQsXG4gICAgICAgIGNvbXBvbmVudEZpbGVQYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCBzZXJ2ZXIuc3RhcnQoKVxuICAgICAgYXdhaXQgc2VydmVyLmFkZEVudHJ5cG9pbnQoKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcblxuaW50ZXJmYWNlIFNuaXBwZXRBcGlSZXNwb25zZSB7XG4gIHNuaXBwZXQ6IHtcbiAgICBkdHM6IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChzbmlwcGV0UGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc25pcHBldFBhdGgsIFwidXRmLThcIilcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgc25pcHBldFBhdGgsXG4gICAgY29udGVudCxcbiAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgIHRydWUsXG4gIClcblxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogdHMuTm9kZSkge1xuICAgIGlmICh0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBub2RlLm1vZHVsZVNwZWNpZmllclxuICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAmJiB0cy5pc1N0cmluZ0xpdGVyYWwobW9kdWxlU3BlY2lmaWVyKSkge1xuICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gbW9kdWxlU3BlY2lmaWVyLnRleHRcbiAgICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgICAgICAgIGltcG9ydHMucHVzaChpbXBvcnRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdClcbiAgfVxuXG4gIHZpc2l0KHNvdXJjZUZpbGUpXG5cbiAgbGV0IHByb2plY3RSb290ID0gcGF0aC5kaXJuYW1lKHNuaXBwZXRQYXRoKVxuICB3aGlsZSAocHJvamVjdFJvb3QgIT09IHBhdGgucGFyc2UocHJvamVjdFJvb3QpLnJvb3QpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdFJvb3QsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgcHJvamVjdFJvb3QgPSBwYXRoLmRpcm5hbWUocHJvamVjdFJvb3QpXG4gIH1cblxuICBmb3IgKGNvbnN0IGltcG9ydFBhdGggb2YgaW1wb3J0cykge1xuICAgIGNvbnN0IFtvd25lciwgbmFtZV0gPSBpbXBvcnRQYXRoLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikuc3BsaXQoXCIuXCIpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGBodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tL3NuaXBwZXRzL2dldD9vd25lcl9uYW1lPSR7b3duZXJ9JnVuc2NvcGVkX25hbWU9JHtuYW1lfWAsXG4gICAgICApXG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gZmV0Y2ggdHlwZXMgZm9yICR7aW1wb3J0UGF0aH1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhOiBTbmlwcGV0QXBpUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgaWYgKGRhdGEuc25pcHBldC5kdHMpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZURpciA9IHBhdGguam9pbihcbiAgICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgICAgIFwiQHRzY2lcIixcbiAgICAgICAgICBgJHtvd25lcn0uJHtuYW1lfWAsXG4gICAgICAgIClcbiAgICAgICAgZnMubWtkaXJTeW5jKHBhY2thZ2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZURpciwgXCJpbmRleC5kLnRzXCIpLCBkYXRhLnNuaXBwZXQuZHRzKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEVycm9yIGZldGNoaW5nIHR5cGVzIGZvciAke2ltcG9ydFBhdGh9OmAsIGVycm9yKVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBreSBmcm9tIFwia3lcIlxuaW1wb3J0IHR5cGUgeyBGaWxlU2VydmVyUm91dGVzIH0gZnJvbSBcImxpYi9maWxlLXNlcnZlci9GaWxlU2VydmVyUm91dGVzXCJcbmltcG9ydCB7IGNyZWF0ZUh0dHBTZXJ2ZXIgfSBmcm9tIFwibGliL3NlcnZlci9jcmVhdGVIdHRwU2VydmVyXCJcbmltcG9ydCB7IEV2ZW50c1dhdGNoZXIgfSBmcm9tIFwibGliL3NlcnZlci9FdmVudHNXYXRjaGVyXCJcbmltcG9ydCB0eXBlIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgdHlwZSB7IFR5cGVkS3lJbnN0YW5jZSB9IGZyb20gXCJ0eXBlZC1reVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgdHlwZSB7IEZpbGVVcGRhdGVkRXZlbnQgfSBmcm9tIFwibGliL2ZpbGUtc2VydmVyL0ZpbGVTZXJ2ZXJFdmVudFwiXG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0IHsgRmlsZXN5c3RlbVR5cGVzSGFuZGxlciB9IGZyb20gXCJsaWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyXCJcbmltcG9ydCB7IHB1c2hTbmlwcGV0IH0gZnJvbSBcImxpYi9zaGFyZWQvcHVzaC1zbmlwcGV0XCJcblxuZXhwb3J0IGNsYXNzIERldlNlcnZlciB7XG4gIHBvcnQ6IG51bWJlclxuICAvKipcbiAgICogVGhlIHBhdGggdG8gYSBjb21wb25lbnQgdGhhdCBleHBvcnRzIGEgPGJvYXJkIC8+IG9yIDxncm91cCAvPiBjb21wb25lbnRcbiAgICovXG4gIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcblxuICBwcm9qZWN0RGlyOiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIEhUVFAgc2VydmVyIHRoYXQgaG9zdHMgdGhlIGZpbGUgc2VydmVyIGFuZCBldmVudCBidXMuIFlvdSBjYW4gdXNlXG4gICAqIGZzS3kgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIvZXZlbnQgYnVzXG4gICAqL1xuICBodHRwU2VydmVyPzogaHR0cC5TZXJ2ZXJcbiAgLyoqXG4gICAqIFdhdGNoZXMgZm9yIGV2ZW50cyBvbiB0aGUgZXZlbnQgYnVzIGJ5IHBvbGxpbmcgYGFwaS9ldmVudHMvbGlzdGBcbiAgICovXG4gIGV2ZW50c1dhdGNoZXI/OiBFdmVudHNXYXRjaGVyXG4gIC8qKlxuICAgKiBBIGt5IGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZmlsZSBzZXJ2ZXIgYW5kXG4gICAqIGV2ZW50IGJ1c1xuICAgKi9cbiAgZnNLeTogVHlwZWRLeUluc3RhbmNlPGtleW9mIEZpbGVTZXJ2ZXJSb3V0ZXMsIEZpbGVTZXJ2ZXJSb3V0ZXM+XG4gIC8qKlxuICAgKiBBIGNob2tpZGFyIGluc3RhbmNlIHRoYXQgd2F0Y2hlcyB0aGUgcHJvamVjdCBkaXJlY3RvcnkgZm9yIGZpbGUgY2hhbmdlc1xuICAgKi9cbiAgZmlsZXN5c3RlbVdhdGNoZXI/OiBjaG9raWRhci5GU1dhdGNoZXJcblxuICBwcml2YXRlIHR5cGVzSGFuZGxlcj86IEZpbGVzeXN0ZW1UeXBlc0hhbmRsZXJcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgcG9ydCxcbiAgICBjb21wb25lbnRGaWxlUGF0aCxcbiAgfToge1xuICAgIHBvcnQ6IG51bWJlclxuICAgIGNvbXBvbmVudEZpbGVQYXRoOiBzdHJpbmdcbiAgfSkge1xuICAgIHRoaXMucG9ydCA9IHBvcnRcbiAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoID0gY29tcG9uZW50RmlsZVBhdGhcbiAgICB0aGlzLnByb2plY3REaXIgPSBwYXRoLmRpcm5hbWUoY29tcG9uZW50RmlsZVBhdGgpXG4gICAgdGhpcy5mc0t5ID0ga3kuY3JlYXRlKHtcbiAgICAgIHByZWZpeFVybDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWAsXG4gICAgfSkgYXMgYW55XG4gICAgdGhpcy50eXBlc0hhbmRsZXIgPSBuZXcgRmlsZXN5c3RlbVR5cGVzSGFuZGxlcih0aGlzLnByb2plY3REaXIpXG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBjb25zdCB7IHNlcnZlciB9ID0gYXdhaXQgY3JlYXRlSHR0cFNlcnZlcih0aGlzLnBvcnQpXG4gICAgdGhpcy5odHRwU2VydmVyID0gc2VydmVyXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIgPSBuZXcgRXZlbnRzV2F0Y2hlcihgaHR0cDovL2xvY2FsaG9zdDoke3RoaXMucG9ydH1gKVxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5zdGFydCgpXG5cbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIub24oXG4gICAgICBcIkZJTEVfVVBEQVRFRFwiLFxuICAgICAgdGhpcy5oYW5kbGVGaWxlVXBkYXRlZEV2ZW50RnJvbVNlcnZlci5iaW5kKHRoaXMpLFxuICAgIClcblxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5vbihcbiAgICAgIFwiUkVRVUVTVF9UT19TQVZFX1NOSVBQRVRcIixcbiAgICAgIHRoaXMuc2F2ZVNuaXBwZXQuYmluZCh0aGlzKSxcbiAgICApXG5cbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyID0gY2hva2lkYXIud2F0Y2godGhpcy5wcm9qZWN0RGlyLCB7XG4gICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICB9KVxuXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImNoYW5nZVwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImFkZFwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG5cbiAgICB0aGlzLnVwc2VydEluaXRpYWxGaWxlcygpXG5cbiAgICB0aGlzLnR5cGVzSGFuZGxlcj8uaGFuZGxlSW5pdGlhbFR5cGVEZXBlbmRlbmNpZXModGhpcy5jb21wb25lbnRGaWxlUGF0aClcbiAgfVxuXG4gIGFzeW5jIGFkZEVudHJ5cG9pbnQoKSB7XG4gICAgY29uc3QgcmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICB0aGlzLnByb2plY3REaXIsXG4gICAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoLFxuICAgIClcbiAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAganNvbjoge1xuICAgICAgICBmaWxlX3BhdGg6IFwiZW50cnlwb2ludC50c3hcIixcbiAgICAgICAgdGV4dF9jb250ZW50OiBgXG5pbXBvcnQgTXlDaXJjdWl0IGZyb20gXCIuLyR7cmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aH1cIlxuXG5jaXJjdWl0LmFkZCg8TXlDaXJjdWl0IC8+KVxuYCxcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVVcGRhdGVkRXZlbnRGcm9tU2VydmVyKGV2OiBGaWxlVXBkYXRlZEV2ZW50KSB7XG4gICAgaWYgKGV2LmluaXRpYXRvciA9PT0gXCJmaWxlc3lzdGVtX2NoYW5nZVwiKSByZXR1cm5cblxuICAgIGlmIChldi5maWxlX3BhdGggPT09IFwibWFudWFsLWVkaXRzLmpzb25cIikge1xuICAgICAgY29uc29sZS5sb2coXCJNYW51YWwgZWRpdHMgdXBkYXRlZCwgdXBkYXRpbmcgb24gZmlsZXN5c3RlbS4uLlwiKVxuICAgICAgY29uc3QgeyBmaWxlIH0gPSBhd2FpdCB0aGlzLmZzS3lcbiAgICAgICAgLmdldChcImFwaS9maWxlcy9nZXRcIiwge1xuICAgICAgICAgIHNlYXJjaFBhcmFtczogeyBmaWxlX3BhdGg6IGV2LmZpbGVfcGF0aCB9LFxuICAgICAgICB9KVxuICAgICAgICAuanNvbigpXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBcIm1hbnVhbC1lZGl0cy5qc29uXCIpLFxuICAgICAgICBmaWxlLnRleHRfY29udGVudCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlZE9uRmlsZXN5c3RlbShhYnNvbHV0ZUZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLnByb2plY3REaXIsIGFic29sdXRlRmlsZVBhdGgpXG4gICAgLy8gV2UndmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQgdXBzZXJ0aW5nIG1hbnVhbCBlZGl0cyBmcm9tIGZpbGVzeXN0ZW0gY2hhbmdlc1xuICAgIC8vIGJlY2F1c2UgaXQgY2FuIGJlIGVkaXRlZCBieSB0aGUgYnJvd3NlclxuICAgIGlmIChyZWxhdGl2ZUZpbGVQYXRoLmluY2x1ZGVzKFwibWFudWFsLWVkaXRzLmpzb25cIikpIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy50eXBlc0hhbmRsZXI/LmhhbmRsZUZpbGVUeXBlRGVwZW5kZW5jaWVzKGFic29sdXRlRmlsZVBhdGgpXG5cbiAgICBjb25zb2xlLmxvZyhgJHtyZWxhdGl2ZUZpbGVQYXRofSBzYXZlZC4gQXBwbHlpbmcgY2hhbmdlcy4uLmApXG4gICAgYXdhaXQgdGhpcy5mc0t5XG4gICAgICAucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiByZWxhdGl2ZUZpbGVQYXRoLFxuICAgICAgICAgIHRleHRfY29udGVudDogZnMucmVhZEZpbGVTeW5jKGFic29sdXRlRmlsZVBhdGgsIFwidXRmLThcIiksXG4gICAgICAgICAgaW5pdGlhdG9yOiBcImZpbGVzeXN0ZW1fY2hhbmdlXCIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmpzb24oKVxuICB9XG5cbiAgYXN5bmMgdXBzZXJ0SW5pdGlhbEZpbGVzKCkge1xuICAgIC8vIFNjYW4gcHJvamVjdCBkaXJlY3RvcnkgZm9yIGFsbCBmaWxlcyBhbmQgdXBzZXJ0IHRoZW1cbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyh0aGlzLnByb2plY3REaXIpXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBmaWxlTmFtZSkpLmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKHRoaXMucHJvamVjdERpciwgZmlsZU5hbWUpLFxuICAgICAgICBcInV0Zi04XCIsXG4gICAgICApXG4gICAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiBmaWxlTmFtZSxcbiAgICAgICAgICB0ZXh0X2NvbnRlbnQ6IGZpbGVDb250ZW50LFxuICAgICAgICAgIGluaXRpYXRvcjogXCJmaWxlc3lzdGVtX2NoYW5nZVwiLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVTbmlwcGV0KCkge1xuICAgIGNvbnN0IHBvc3RFdmVudCA9IGFzeW5jIChcbiAgICAgIGV2ZW50OiBcIkZBSUxFRF9UT19TQVZFX1NOSVBQRVRcIiB8IFwiU05JUFBFVF9TQVZFRFwiLFxuICAgICkgPT5cbiAgICAgIHRoaXMuZnNLeS5wb3N0KFwiYXBpL2V2ZW50cy9jcmVhdGVcIiwge1xuICAgICAgICBqc29uOiB7IGV2ZW50X3R5cGU6IGV2ZW50IH0sXG4gICAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgICB9KVxuXG4gICAgYXdhaXQgcHVzaFNuaXBwZXQoe1xuICAgICAgZmlsZVBhdGg6IHRoaXMuY29tcG9uZW50RmlsZVBhdGgsXG4gICAgICBvbkV4aXQ6IChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gc2F2ZSBzbmlwcGV0XCIsIGUpXG4gICAgICAgIHBvc3RFdmVudChcIkZBSUxFRF9UT19TQVZFX1NOSVBQRVRcIilcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHNhdmUgc25pcHBldFwiLCBlKVxuICAgICAgICBwb3N0RXZlbnQoXCJGQUlMRURfVE9fU0FWRV9TTklQUEVUXCIpXG4gICAgICB9LFxuICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgIHBvc3RFdmVudChcIlNOSVBQRVRfU0FWRURcIilcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5odHRwU2VydmVyPy5jbG9zZSgpXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyPy5zdG9wKClcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZ2V0Tm9kZUhhbmRsZXIgfSBmcm9tIFwid2ludGVyc3BlYy9hZGFwdGVycy9ub2RlXCJcbmltcG9ydCBwa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiXG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB3aW50ZXJzcGVjQnVuZGxlIGZyb20gXCJAdHNjaXJjdWl0L2ZpbGUtc2VydmVyL2Rpc3QvYnVuZGxlLmpzXCJcbmltcG9ydCB7IGdldEluZGV4IH0gZnJvbSBcIi4uL3NpdGUvZ2V0SW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY3JlYXRlSHR0cFNlcnZlciA9IGFzeW5jIChwb3J0ID0gMzAyMCkgPT4ge1xuICBjb25zdCBmaWxlU2VydmVySGFuZGxlciA9IGdldE5vZGVIYW5kbGVyKHdpbnRlcnNwZWNCdW5kbGUgYXMgYW55LCB7fSlcblxuICBjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwhLCBgaHR0cDovLyR7cmVxLmhlYWRlcnMuaG9zdH1gKVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvc3RhbmRhbG9uZS5taW4uanNcIikge1xuICAgICAgY29uc3Qgc3RhbmRhbG9uZUZpbGVQYXRoID1cbiAgICAgICAgcHJvY2Vzcy5lbnYuUlVORlJBTUVfU1RBTkRBTE9ORV9GSUxFX1BBVEggfHxcbiAgICAgICAgcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWUvZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiLFxuICAgICAgICApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3RhbmRhbG9uZUZpbGVQYXRoLCBcInV0ZjhcIilcbiAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgfSlcbiAgICAgICAgcmVzLmVuZChjb250ZW50KVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBcIkxvY2FsIHJ1bmZyYW1lIHN0YW5kYWxvbmUgbm90IGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gdmVyc2lvbi5cIixcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICByZXMud3JpdGVIZWFkKDMwMiwge1xuICAgICAgICBMb2NhdGlvbjogYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ydW5mcmFtZUAke3BrZy5kZXBlbmRlbmNpZXNbXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCJdLnJlcGxhY2UoL15bXjAtOV0rLywgXCJcIil9L2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNgLFxuICAgICAgfSlcbiAgICAgIHJlcy5lbmQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvXCIpIHtcbiAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCBnZXRJbmRleCgpXG4gICAgICByZXMud3JpdGVIZWFkKDIwMCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvaHRtbFwiIH0pXG4gICAgICByZXMuZW5kKGh0bWwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvYXBpL1wiKSkge1xuICAgICAgcmVxLnVybCA9IHJlcS51cmwhLnJlcGxhY2UoXCIvYXBpL1wiLCBcIi9cIilcbiAgICAgIGZpbGVTZXJ2ZXJIYW5kbGVyKHJlcSwgcmVzKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmVzLndyaXRlSGVhZCg0MDQpXG4gICAgcmVzLmVuZChcIk5vdCBmb3VuZFwiKVxuICB9KVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTx7IHNlcnZlcjogaHR0cC5TZXJ2ZXIgfT4oKHJlc29sdmUpID0+IHtcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGBTZXJ2ZXIgcnVubmluZyBhdCBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKVxuICAgICAgcmVzb2x2ZSh7IHNlcnZlciB9KVxuICAgIH0pXG4gIH0pXG59XG4iLCAie1xuICBcIm5hbWVcIjogXCJAdHNjaXJjdWl0L2NsaVwiLFxuICBcIm1haW5cIjogXCJkaXN0L21haW4uanNcIixcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwidmVyc2lvblwiOiBcIjAuMS4zM1wiLFxuICBcImJpblwiOiB7XG4gICAgXCJ0c2NpXCI6IFwiLi9kaXN0L21haW4uanNcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwic3RhcnRcIjogXCJidW4gcnVuIGRldlwiLFxuICAgIFwiZGV2XCI6IFwiYnVuIC0taG90IC4vY2xpL21haW4udHMgZGV2IC4vZXhhbXBsZS1kaXIvc25pcHBldDEtYmFzaWMudHN4XCIsXG4gICAgXCJidWlsZFwiOiBcInRzdXAtbm9kZSBjbGkvbWFpbi50cyAtLWZvcm1hdCBlc20gLS1zb3VyY2VtYXAgaW5saW5lXCIsXG4gICAgXCJmb3JtYXRcIjogXCJiaW9tZSBmb3JtYXQgLS13cml0ZSAuXCIsXG4gICAgXCJmb3JtYXQ6Y2hlY2tcIjogXCJiaW9tZSBmb3JtYXQgLlwiLFxuICAgIFwiY2xpXCI6IFwiYnVuIC4vY2xpL21haW4udHNcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYmlvbWVqcy9iaW9tZVwiOiBcIl4xLjkuNFwiLFxuICAgIFwiQHRzY2lyY3VpdC9jb3JlXCI6IFwiXjAuMC4yNDlcIixcbiAgICBcIkB0c2NpcmN1aXQvZmFrZS1zbmlwcGV0c1wiOiBcIl4wLjAuNVwiLFxuICAgIFwiQHR5cGVzL2J1blwiOiBcIl4xLjEuMTVcIixcbiAgICBcIkB0eXBlcy9jb25maWdzdG9yZVwiOiBcIl42LjAuMlwiLFxuICAgIFwiQHR5cGVzL3JlYWN0XCI6IFwiXjE5LjAuOFwiLFxuICAgIFwiQHR5cGVzL3NlbXZlclwiOiBcIl43LjUuOFwiLFxuICAgIFwiZ2V0LXBvcnRcIjogXCJeNy4xLjBcIixcbiAgICBcInRlbXB5XCI6IFwiXjMuMS4wXCIsXG4gICAgXCJ0c3VwXCI6IFwiXjguMy41XCIsXG4gICAgXCJ0eXBlZC1reVwiOiBcIl4wLjAuNFwiXG4gIH0sXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuMC4wXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHRzY2lyY3VpdC9ldmFsXCI6IFwiXjAuMC45NlwiLFxuICAgIFwiQHRzY2lyY3VpdC9maWxlLXNlcnZlclwiOiBcIl4wLjAuMTNcIixcbiAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIjogXCJeMC4wLjE2N1wiLFxuICAgIFwiYnVuLW1hdGNoLXN2Z1wiOiBcIl4wLjAuOVwiLFxuICAgIFwiY2hva2lkYXJcIjogXCI0LjAuMVwiLFxuICAgIFwiY2lyY3VpdC10by1zdmdcIjogXCJeMC4wLjEwMVwiLFxuICAgIFwiY29tbWFuZGVyXCI6IFwiXjEyLjEuMFwiLFxuICAgIFwiY29uZmlnc3RvcmVcIjogXCJeNy4wLjBcIixcbiAgICBcImNvc21pY29uZmlnXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJkZWxheVwiOiBcIl42LjAuMFwiLFxuICAgIFwiand0LWRlY29kZVwiOiBcIl40LjAuMFwiLFxuICAgIFwia3lcIjogXCJeMS43LjRcIixcbiAgICBcIm1ha2UtdmZzXCI6IFwiXjEuMC4xNVwiLFxuICAgIFwicGVyZmVjdC1jbGlcIjogXCJeMS4wLjIwXCIsXG4gICAgXCJyZWRheGlvc1wiOiBcIl4wLjUuMVwiLFxuICAgIFwic2VtdmVyXCI6IFwiXjcuNi4zXCJcbiAgfVxufVxuIiwgImltcG9ydCBwa2cgZnJvbSBcIi4uLy4uL3BhY2thZ2UuanNvblwiXG5cbmV4cG9ydCBjb25zdCBnZXRJbmRleCA9IGFzeW5jICgpID0+IHtcbiAgcmV0dXJuIGA8aHRtbD5cbiAgICA8aGVhZD5cbiAgICA8L2hlYWQ+XG4gICAgPGJvZHk+XG4gICAgICA8c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuLnRhaWx3aW5kY3NzLmNvbVwiPjwvc2NyaXB0PlxuICAgICAgPGRpdiBpZD1cInJvb3RcIj5sb2FkaW5nLi4uPC9kaXY+XG4gICAgICA8c2NyaXB0PlxuICAgICAgZ2xvYmFsVGhpcy5wcm9jZXNzID0geyBlbnY6IHsgTk9ERV9FTlY6IFwicHJvZHVjdGlvblwiIH0gfVxuICAgICAgPC9zY3JpcHQ+XG4gICAgICA8c2NyaXB0IHNyYz1cIi9zdGFuZGFsb25lLm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgIDwvYm9keT5cbiAgPC9odG1sPmBcbn1cblxuLy8gPHNjcmlwdCBzcmM9XCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B0c2NpcmN1aXQvcnVuZnJhbWVAJHtwa2cuZGVwZW5kZW5jaWVzW1wiQHRzY2lyY3VpdC9ydW5mcmFtZVwiXS5yZXBsYWNlKC9eW14wLTldKy8sIFwiXCIpfS9kaXN0L3N0YW5kYWxvbmUubWluLmpzXCI+PC9zY3JpcHQ+XG4iLCAiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50c1wiXG5cbmludGVyZmFjZSBFdmVudCB7XG4gIGV2ZW50X2lkOiBzdHJpbmdcbiAgY3JlYXRlZF9hdDogc3RyaW5nXG4gIGV2ZW50X3R5cGU6IHN0cmluZ1xuICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuaW50ZXJmYWNlIEV2ZW50c1Jlc3BvbnNlIHtcbiAgZXZlbnRfbGlzdDogRXZlbnRbXVxufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRzV2F0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHByaXZhdGUgbGFzdFBvbGxUaW1lOiBzdHJpbmdcbiAgcHJpdmF0ZSBwb2xsSW50ZXJ2YWw6IG51bWJlclxuICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZ1xuICBwcml2YXRlIHBvbGxpbmcgPSBmYWxzZVxuICBwcml2YXRlIHRpbWVvdXRJZD86IE5vZGVKUy5UaW1lb3V0XG5cbiAgY29uc3RydWN0b3IoYmFzZVVybCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwXCIsIHBvbGxJbnRlcnZhbCA9IDEwMDApIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybFxuICAgIHRoaXMucG9sbEludGVydmFsID0gcG9sbEludGVydmFsXG4gICAgdGhpcy5sYXN0UG9sbFRpbWUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLnBvbGxpbmcpIHJldHVyblxuICAgIHRoaXMucG9sbGluZyA9IHRydWVcbiAgICBhd2FpdCB0aGlzLnBvbGwoKVxuICB9XG5cbiAgc3RvcCgpIHtcbiAgICB0aGlzLnBvbGxpbmcgPSBmYWxzZVxuICAgIGlmICh0aGlzLnRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcG9sbCgpIHtcbiAgICBpZiAoIXRoaXMucG9sbGluZykgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYCR7dGhpcy5iYXNlVXJsfS9hcGkvZXZlbnRzL2xpc3Q/c2luY2U9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5sYXN0UG9sbFRpbWUpfWAsXG4gICAgICApXG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGE6IEV2ZW50c1Jlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIC8vIFVwZGF0ZSBsYXN0IHBvbGwgdGltZSB0byBsYXRlc3QgZXZlbnQgb3IgY3VycmVudCB0aW1lXG4gICAgICBjb25zdCBsYXRlc3RFdmVudCA9IGRhdGEuZXZlbnRfbGlzdFtkYXRhLmV2ZW50X2xpc3QubGVuZ3RoIC0gMV1cbiAgICAgIHRoaXMubGFzdFBvbGxUaW1lID0gbGF0ZXN0RXZlbnRcbiAgICAgICAgPyBsYXRlc3RFdmVudC5jcmVhdGVkX2F0XG4gICAgICAgIDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG5cbiAgICAgIC8vIEVtaXQgZXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXJcbiAgICAgIGRhdGEuZXZlbnRfbGlzdC5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoZXZlbnQuZXZlbnRfdHlwZSwgZXZlbnQpXG4gICAgICAgIHRoaXMuZW1pdChcIipcIiwgZXZlbnQpXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnJvcilcbiAgICB9XG4gICAgLy8gU2NoZWR1bGUgbmV4dCBwb2xsXG4gICAgdGhpcy50aW1lb3V0SWQgPSBnbG9iYWxUaGlzLnNldFRpbWVvdXQoXG4gICAgICAoKSA9PiB0aGlzLnBvbGwoKSxcbiAgICAgIHRoaXMucG9sbEludGVydmFsLFxuICAgICkgYXMgdW5rbm93biBhcyBOb2RlSlMuVGltZW91dFxuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGZpbmRJbXBvcnRzSW5TbmlwcGV0IH0gZnJvbSBcIi4vZmluZEltcG9ydHNJblNuaXBwZXRcIlxuaW1wb3J0IHsgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQgfSBmcm9tIFwiLi9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldFwiXG5cbmV4cG9ydCBjbGFzcyBGaWxlc3lzdGVtVHlwZXNIYW5kbGVyIHtcbiAgcHJpdmF0ZSBwcm9qZWN0Um9vdDogc3RyaW5nXG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbERpcjogc3RyaW5nKSB7XG4gICAgdGhpcy5wcm9qZWN0Um9vdCA9IHRoaXMuZmluZFByb2plY3RSb290KGluaXRpYWxEaXIpXG4gIH1cblxuICBhc3luYyBoYW5kbGVJbml0aWFsVHlwZURlcGVuZGVuY2llcyhmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc29sZS5sb2coXCJDaGVja2luZyBpbml0aWFsIHR5cGUgZGVwZW5kZW5jaWVzLi4uXCIpXG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5hcmVUeXBlc0luc3RhbGxlZChmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIG1pc3NpbmcgaW5pdGlhbCB0eXBlcy4uLlwiKVxuICAgICAgICBhd2FpdCBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChmaWxlUGF0aClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiRXJyb3IgaGFuZGxpbmcgaW5pdGlhbCB0eXBlIGRlcGVuZGVuY2llczpcIiwgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlRmlsZVR5cGVEZXBlbmRlbmNpZXMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuYXJlVHlwZXNJbnN0YWxsZWQoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyBtaXNzaW5nIGZpbGUgdHlwZXMuLi5cIilcbiAgICAgICAgYXdhaXQgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byB2ZXJpZnkgdHlwZXM6XCIsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXJlVHlwZXNJbnN0YWxsZWQoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGltcG9ydHMgPSBmaW5kSW1wb3J0c0luU25pcHBldChmaWxlUGF0aClcbiAgICByZXR1cm4gaW1wb3J0cy5ldmVyeSgoaW1wKSA9PiB0aGlzLmNoZWNrVHlwZUV4aXN0cyhpbXApKVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1R5cGVFeGlzdHMoaW1wb3J0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBwYXRoV2l0aG91dFByZWZpeCA9IGltcG9ydFBhdGgucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKVxuICAgIGNvbnN0IFtvd25lciwgbmFtZV0gPSBwYXRoV2l0aG91dFByZWZpeC5zcGxpdChcIi5cIilcblxuICAgIGNvbnN0IHR5cGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgdGhpcy5wcm9qZWN0Um9vdCxcbiAgICAgIFwibm9kZV9tb2R1bGVzXCIsXG4gICAgICBcIkB0c2NpXCIsXG4gICAgICBgJHtvd25lcn0uJHtuYW1lfWAsXG4gICAgICBcImluZGV4LmQudHNcIixcbiAgICApXG5cbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyh0eXBlUGF0aClcbiAgfVxuXG4gIHByaXZhdGUgZmluZFByb2plY3RSb290KHN0YXJ0RGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByb290ID0gcGF0aC5yZXNvbHZlKHN0YXJ0RGlyKVxuICAgIHdoaWxlIChyb290ICE9PSBwYXRoLnBhcnNlKHJvb3QpLnJvb3QpIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290LCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgICAgcmV0dXJuIHJvb3RcbiAgICAgIH1cbiAgICAgIHJvb3QgPSBwYXRoLmRpcm5hbWUocm9vdClcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0RGlyXG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kSW1wb3J0c0luU25pcHBldChzbmlwcGV0UGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNuaXBwZXRQYXRoLCBcInV0Zi04XCIpXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIHNuaXBwZXRQYXRoLFxuICAgIGNvbnRlbnQsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICApXG5cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IHRzLk5vZGUpIHtcbiAgICBpZiAodHMuaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gbm9kZS5tb2R1bGVTcGVjaWZpZXJcbiAgICAgIGlmIChtb2R1bGVTcGVjaWZpZXIgJiYgdHMuaXNTdHJpbmdMaXRlcmFsKG1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IG1vZHVsZVNwZWNpZmllci50ZXh0XG4gICAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHtcbiAgICAgICAgICBpbXBvcnRzLnB1c2goaW1wb3J0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpXG4gIH1cblxuICB2aXNpdChzb3VyY2VGaWxlKVxuXG4gIHJldHVybiBpbXBvcnRzXG59XG4iLCAiaW1wb3J0IENvbmZpZ3N0b3JlIGZyb20gXCJjb25maWdzdG9yZVwiXG5pbXBvcnQgdHlwZSB7IFR5cGVkQ29uZmlnc3RvcmUgfSBmcm9tIFwiLi9UeXBlZENvbmZpZ1N0b3JlXCJcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gXCJqd3QtZGVjb2RlXCJcblxuZXhwb3J0IGludGVyZmFjZSBDbGlDb25maWcge1xuICBzZXNzaW9uVG9rZW4/OiBzdHJpbmdcbiAgZ2l0aHViVXNlcm5hbWU/OiBzdHJpbmdcbiAgcmVnaXN0cnlBcGlVcmw/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IGNsaUNvbmZpZzogVHlwZWRDb25maWdzdG9yZTxDbGlDb25maWc+ID0gbmV3IENvbmZpZ3N0b3JlKFxuICBcInRzY2lyY3VpdFwiLFxuKVxuXG5leHBvcnQgY29uc3Qgc2V0U2Vzc2lvblRva2VuID0gKHRva2VuOiBzdHJpbmcpID0+IHtcbiAgY2xpQ29uZmlnLnNldChcInNlc3Npb25Ub2tlblwiLCB0b2tlbilcbiAgY29uc3QgZGVjb2RlZCA9IGp3dERlY29kZTx7XG4gICAgZ2l0aHViX3VzZXJuYW1lOiBzdHJpbmdcbiAgfT4odG9rZW4pXG4gIGNsaUNvbmZpZy5zZXQoXCJnaXRodWJVc2VybmFtZVwiLCBkZWNvZGVkLmdpdGh1Yl91c2VybmFtZSlcbn1cblxuZXhwb3J0IGNvbnN0IGNsZWFyU2Vzc2lvbiA9ICgpID0+IHtcbiAgY2xpQ29uZmlnLmRlbGV0ZShcInNlc3Npb25Ub2tlblwiKVxuICBjbGlDb25maWcuZGVsZXRlKFwiZ2l0aHViVXNlcm5hbWVcIilcbn1cblxuZXhwb3J0IGNvbnN0IGdldFJlZ2lzdHJ5QXBpVXJsID0gKCk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBjbGlDb25maWcuZ2V0KFwicmVnaXN0cnlBcGlVcmxcIikgPz8gXCJodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tXCJcbn1cbiIsICJpbXBvcnQgeyBnZXRSZWdpc3RyeUFwaVVybCB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5pbXBvcnQga3ksIHsgdHlwZSBBZnRlclJlc3BvbnNlSG9vayB9IGZyb20gXCJreVwiXG5cbmV4cG9ydCBjb25zdCBwcmV0dHlSZXNwb25zZUVycm9ySG9vazogQWZ0ZXJSZXNwb25zZUhvb2sgPSBhc3luYyAoXG4gIF9yZXF1ZXN0LFxuICBfb3B0aW9ucyxcbiAgcmVzcG9uc2UsXG4pID0+IHtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlcnJvckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZBSUwgWyR7cmVzcG9uc2Uuc3RhdHVzfV06ICR7X3JlcXVlc3QubWV0aG9kfSAke1xuICAgICAgICAgIG5ldyBVUkwoX3JlcXVlc3QudXJsKS5wYXRobmFtZVxuICAgICAgICB9IFxcblxcbiAke0pTT04uc3RyaW5naWZ5KGVycm9yRGF0YSwgbnVsbCwgMil9YCxcbiAgICAgIClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvL2lnbm9yZSwgYWxsb3cgdGhlIGVycm9yIHRvIGJlIHRocm93blxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0S3kgPSAoKSA9PiB7XG4gIHJldHVybiBreS5jcmVhdGUoe1xuICAgIHByZWZpeFVybDogZ2V0UmVnaXN0cnlBcGlVcmwoKSxcbiAgICBob29rczoge1xuICAgICAgYWZ0ZXJSZXNwb25zZTogW3ByZXR0eVJlc3BvbnNlRXJyb3JIb29rXSxcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB7IGNsaUNvbmZpZyB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5pbXBvcnQgeyBnZXRLeSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2dldC1reVwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHNlbXZlciBmcm9tIFwic2VtdmVyXCJcblxudHlwZSBQdXNoT3B0aW9ucyA9IHtcbiAgZmlsZVBhdGg/OiBzdHJpbmdcbiAgb25FeGl0PzogKGNvZGU6IG51bWJlcikgPT4gdm9pZFxuICBvbkVycm9yPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxuICBvblN1Y2Nlc3M/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBjb25zdCBwdXNoU25pcHBldCA9IGFzeW5jICh7XG4gIGZpbGVQYXRoLFxuICBvbkV4aXQgPSAoY29kZSkgPT4gcHJvY2Vzcy5leGl0KGNvZGUpLFxuICBvbkVycm9yID0gKG1lc3NhZ2UpID0+IGNvbnNvbGUuZXJyb3IobWVzc2FnZSksXG4gIG9uU3VjY2VzcyA9IChtZXNzYWdlKSA9PiBjb25zb2xlLmxvZyhtZXNzYWdlKSxcbn06IFB1c2hPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHNlc3Npb25Ub2tlbiA9IGNsaUNvbmZpZy5nZXQoXCJzZXNzaW9uVG9rZW5cIilcbiAgaWYgKCFzZXNzaW9uVG9rZW4pIHtcbiAgICBvbkVycm9yKFwiWW91IG5lZWQgdG8gbG9nIGluIHRvIHNhdmUgc25pcHBldC5cIilcbiAgICByZXR1cm4gb25FeGl0KDEpXG4gIH1cblxuICBsZXQgc25pcHBldEZpbGVQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBpZiAoZmlsZVBhdGgpIHtcbiAgICBzbmlwcGV0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGVmYXVsdEVudHJ5cG9pbnQgPSBwYXRoLnJlc29sdmUoXCJpbmRleC50c3hcIilcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkZWZhdWx0RW50cnlwb2ludCkpIHtcbiAgICAgIHNuaXBwZXRGaWxlUGF0aCA9IGRlZmF1bHRFbnRyeXBvaW50XG4gICAgICBvblN1Y2Nlc3MoXCJObyBmaWxlIHByb3ZpZGVkLiBVc2luZyAnaW5kZXgudHN4JyBhcyB0aGUgZW50cnlwb2ludC5cIilcbiAgICB9IGVsc2Uge1xuICAgICAgb25FcnJvcihcbiAgICAgICAgXCJObyBlbnRyeXBvaW50IGZvdW5kLiBSdW4gJ3RzY2kgaW5pdCcgdG8gYm9vdHN0cmFwIGEgYmFzaWMgcHJvamVjdC5cIixcbiAgICAgIClcbiAgICAgIHJldHVybiBvbkV4aXQoMSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgcGF0aC5qb2luKHBhdGguZGlybmFtZShzbmlwcGV0RmlsZVBhdGgpLCBcInBhY2thZ2UuanNvblwiKSxcbiAgKVxuICBsZXQgcGFja2FnZUpzb246IHsgbmFtZT86IHN0cmluZzsgYXV0aG9yPzogc3RyaW5nOyB2ZXJzaW9uPzogc3RyaW5nIH0gPSB7fVxuICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoKS50b1N0cmluZygpKVxuICAgIH0gY2F0Y2gge1xuICAgICAgb25FcnJvcihcIkludmFsaWQgcGFja2FnZS5qc29uIHByb3ZpZGVkXCIpXG4gICAgICByZXR1cm4gb25FeGl0KDEpXG4gICAgfVxuICB9XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNuaXBwZXRGaWxlUGF0aCkpIHtcbiAgICBvbkVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtzbmlwcGV0RmlsZVBhdGh9YClcbiAgICByZXR1cm4gb25FeGl0KDEpXG4gIH1cblxuICBjb25zdCBreSA9IGdldEt5KClcbiAgY29uc3QgcGFja2FnZU5hbWUgPSAoXG4gICAgcGFja2FnZUpzb24ubmFtZSA/PyBwYXRoLnBhcnNlKHNuaXBwZXRGaWxlUGF0aCkubmFtZVxuICApLnJlcGxhY2UoL15ALywgXCJcIilcbiAgY29uc3QgcGFja2FnZUF1dGhvciA9XG4gICAgcGFja2FnZUpzb24uYXV0aG9yPy5zcGxpdChcIiBcIilbMF0gPz8gY2xpQ29uZmlnLmdldChcImdpdGh1YlVzZXJuYW1lXCIpXG4gIGNvbnN0IHBhY2thZ2VJZGVudGlmaWVyID0gYCR7cGFja2FnZUF1dGhvcn0vJHtwYWNrYWdlTmFtZX1gXG5cbiAgbGV0IHBhY2thZ2VWZXJzaW9uID1cbiAgICBwYWNrYWdlSnNvbi52ZXJzaW9uID8/XG4gICAgKGF3YWl0IGt5XG4gICAgICAucG9zdDx7XG4gICAgICAgIGVycm9yPzogeyBlcnJvcl9jb2RlOiBzdHJpbmcgfVxuICAgICAgICBwYWNrYWdlX3JlbGVhc2VzPzogeyB2ZXJzaW9uOiBzdHJpbmc7IGlzX2xhdGVzdDogYm9vbGVhbiB9W11cbiAgICAgIH0+KFwicGFja2FnZV9yZWxlYXNlcy9saXN0XCIsIHtcbiAgICAgICAganNvbjogeyBwYWNrYWdlX25hbWU6IHBhY2thZ2VJZGVudGlmaWVyIH0sXG4gICAgICB9KVxuICAgICAgLmpzb24oKVxuICAgICAgLnRoZW4oXG4gICAgICAgIChyZXNwb25zZSkgPT5cbiAgICAgICAgICByZXNwb25zZS5wYWNrYWdlX3JlbGVhc2VzPy5bcmVzcG9uc2UucGFja2FnZV9yZWxlYXNlcy5sZW5ndGggLSAxXVxuICAgICAgICAgICAgPy52ZXJzaW9uLFxuICAgICAgKVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBvbkVycm9yKFwiRmFpbGVkIHRvIHJldHJpZXZlIGxhdGVzdCBwYWNrYWdlIHZlcnNpb246XCIgKyBlcnJvcilcbiAgICAgICAgcmV0dXJuIG9uRXhpdCgxKVxuICAgICAgfSkpXG5cbiAgaWYgKCFwYWNrYWdlVmVyc2lvbikge1xuICAgIG9uRXJyb3IoXCJGYWlsZWQgdG8gcmV0cmlldmUgcGFja2FnZSB2ZXJzaW9uLlwiKVxuICAgIHJldHVybiBvbkV4aXQoMSlcbiAgfVxuXG4gIGNvbnN0IHVwZGF0ZVBhY2thZ2VKc29uVmVyc2lvbiA9IChuZXdWZXJzaW9uPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHBhY2thZ2VKc29uLnZlcnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhY2thZ2VKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uID8/IGAke3BhY2thZ2VWZXJzaW9ufWBcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCBudWxsLCAyKSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG9uRXJyb3IoXCJGYWlsZWQgdG8gdXBkYXRlIHBhY2thZ2UuanNvbiB2ZXJzaW9uOlwiICsgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZG9lc1BhY2thZ2VFeGlzdCA9IGF3YWl0IGt5XG4gICAgLnBvc3Q8eyBlcnJvcj86IHsgZXJyb3JfY29kZTogc3RyaW5nIH0gfT4oXCJwYWNrYWdlcy9nZXRcIiwge1xuICAgICAganNvbjogeyBuYW1lOiBwYWNrYWdlSWRlbnRpZmllciB9LFxuICAgICAgdGhyb3dIdHRwRXJyb3JzOiBmYWxzZSxcbiAgICB9KVxuICAgIC5qc29uKClcbiAgICAudGhlbigocmVzcG9uc2UpID0+ICEocmVzcG9uc2UuZXJyb3I/LmVycm9yX2NvZGUgPT09IFwicGFja2FnZV9ub3RfZm91bmRcIikpXG5cbiAgaWYgKCFkb2VzUGFja2FnZUV4aXN0KSB7XG4gICAgYXdhaXQga3lcbiAgICAgIC5wb3N0KFwicGFja2FnZXMvY3JlYXRlXCIsIHtcbiAgICAgICAganNvbjogeyBuYW1lOiBwYWNrYWdlSWRlbnRpZmllciB9LFxuICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzZXNzaW9uVG9rZW59YCB9LFxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgb25FcnJvcihcIkVycm9yIGNyZWF0aW5nIHBhY2thZ2U6XCIgKyBlcnJvcilcbiAgICAgICAgcmV0dXJuIG9uRXhpdCgxKVxuICAgICAgfSlcbiAgfVxuXG4gIGNvbnN0IGRvZXNSZWxlYXNlRXhpc3QgPSBhd2FpdCBreVxuICAgIC5wb3N0PHtcbiAgICAgIGVycm9yPzogeyBlcnJvcl9jb2RlOiBzdHJpbmcgfVxuICAgICAgcGFja2FnZV9yZWxlYXNlPzogeyB2ZXJzaW9uOiBzdHJpbmcgfVxuICAgIH0+KFwicGFja2FnZV9yZWxlYXNlcy9nZXRcIiwge1xuICAgICAganNvbjoge1xuICAgICAgICBwYWNrYWdlX25hbWVfd2l0aF92ZXJzaW9uOiBgJHtwYWNrYWdlSWRlbnRpZmllcn1AJHtwYWNrYWdlVmVyc2lvbn1gLFxuICAgICAgfSxcbiAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgfSlcbiAgICAuanNvbigpXG4gICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UucGFja2FnZV9yZWxlYXNlPy52ZXJzaW9uKSB7XG4gICAgICAgIHBhY2thZ2VWZXJzaW9uID0gcmVzcG9uc2UucGFja2FnZV9yZWxlYXNlLnZlcnNpb25cbiAgICAgICAgdXBkYXRlUGFja2FnZUpzb25WZXJzaW9uKHJlc3BvbnNlLnBhY2thZ2VfcmVsZWFzZS52ZXJzaW9uKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuICEocmVzcG9uc2UuZXJyb3I/LmVycm9yX2NvZGUgPT09IFwicGFja2FnZV9yZWxlYXNlX25vdF9mb3VuZFwiKVxuICAgIH0pXG5cbiAgaWYgKGRvZXNSZWxlYXNlRXhpc3QpIHtcbiAgICBjb25zdCBidW1wZWRWZXJzaW9uID0gc2VtdmVyLmluYyhwYWNrYWdlVmVyc2lvbiwgXCJwYXRjaFwiKSFcbiAgICBvblN1Y2Nlc3MoXG4gICAgICBgSW5jcmVtZW50aW5nIFBhY2thZ2UgVmVyc2lvbiAke3BhY2thZ2VWZXJzaW9ufSAtPiAke2J1bXBlZFZlcnNpb259YCxcbiAgICApXG4gICAgcGFja2FnZVZlcnNpb24gPSBidW1wZWRWZXJzaW9uXG4gICAgdXBkYXRlUGFja2FnZUpzb25WZXJzaW9uKHBhY2thZ2VWZXJzaW9uKVxuICB9XG5cbiAgYXdhaXQga3lcbiAgICAucG9zdChcInBhY2thZ2VfcmVsZWFzZXMvY3JlYXRlXCIsIHtcbiAgICAgIGpzb246IHtcbiAgICAgICAgcGFja2FnZV9uYW1lX3dpdGhfdmVyc2lvbjogYCR7cGFja2FnZUlkZW50aWZpZXJ9QCR7cGFja2FnZVZlcnNpb259YCxcbiAgICAgIH0sXG4gICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgb25FcnJvcihcIkVycm9yIGNyZWF0aW5nIHJlbGVhc2U6XCIgKyBlcnJvcilcbiAgICAgIHJldHVybiBvbkV4aXQoMSlcbiAgICB9KVxuXG4gIG9uU3VjY2VzcyhcIlxcblwiKVxuXG4gIGNvbnN0IGRpcmVjdG9yeUZpbGVzID0gZnMucmVhZGRpclN5bmMocGF0aC5kaXJuYW1lKHNuaXBwZXRGaWxlUGF0aCkpXG4gIGZvciAoY29uc3QgZmlsZSBvZiBkaXJlY3RvcnlGaWxlcykge1xuICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZSkucmVwbGFjZShcIi5cIiwgXCJcIilcbiAgICBpZiAoIVtcImpzb25cIiwgXCJ0c3hcIiwgXCJ0c1wiXS5pbmNsdWRlcyhmaWxlRXh0ZW5zaW9uKSkgY29udGludWVcbiAgICBjb25zdCBmaWxlQ29udGVudCA9XG4gICAgICBmc1xuICAgICAgICAucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUoc25pcHBldEZpbGVQYXRoKSwgZmlsZSkpXG4gICAgICAgIC50b1N0cmluZygpID8/IFwiXCJcbiAgICBhd2FpdCBreVxuICAgICAgLnBvc3QoXCJwYWNrYWdlX2ZpbGVzL2NyZWF0ZVwiLCB7XG4gICAgICAgIGpzb246IHtcbiAgICAgICAgICBmaWxlX3BhdGg6IGZpbGUsXG4gICAgICAgICAgY29udGVudF90ZXh0OiBmaWxlQ29udGVudCxcbiAgICAgICAgICBwYWNrYWdlX25hbWVfd2l0aF92ZXJzaW9uOiBgJHtwYWNrYWdlSWRlbnRpZmllcn1AJHtwYWNrYWdlVmVyc2lvbn1gLFxuICAgICAgICB9LFxuICAgICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgb25TdWNjZXNzKGBVcGxvYWRlZCBmaWxlICR7ZmlsZX0gdG8gdGhlIHJlZ2lzdHJ5LmApXG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBvbkVycm9yKGBFcnJvciB1cGxvYWRpbmcgZmlsZSAke2ZpbGV9OmAgKyBlcnJvcilcbiAgICAgIH0pXG4gIH1cblxuICBvblN1Y2Nlc3MoXG4gICAgW1xuICAgICAgYFxcblx1RDgzQ1x1REY4OSBTdWNjZXNzZnVsbHkgcHVzaGVkIHBhY2thZ2UgJHtwYWNrYWdlSWRlbnRpZmllcn1AJHtwYWNrYWdlVmVyc2lvbn0gdG8gdGhlIHJlZ2lzdHJ5ISR7QnVuLmNvbG9yKFwiYmx1ZVwiLCBcImFuc2lcIil9YCxcbiAgICAgIGBodHRwczovL3RzY2lyY3VpdC5jb20vJHtwYWNrYWdlSWRlbnRpZmllcn0gXFx4MWJbMG1gLFxuICAgIF0uam9pbihcIiBcIiksXG4gIClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IHNldFNlc3Npb25Ub2tlbiB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5pbXBvcnQgZGVsYXkgZnJvbSBcImRlbGF5XCJcbmltcG9ydCB7IGdldEt5IH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5XCJcbmltcG9ydCB0eXBlIHsgRW5kcG9pbnRSZXNwb25zZSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2VuZHBvaW50LXR5cGVzXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aExvZ2luID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgLy8gRGVmaW5lIHRoZSBsb2dpbiBhY3Rpb24gb25jZSB0byBzaGFyZSBiZXR3ZWVuIGJvdGggY29tbWFuZHNcbiAgY29uc3QgbG9naW5BY3Rpb24gPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qga3kgPSBnZXRLeSgpXG5cbiAgICBjb25zdCB7IGxvZ2luX3BhZ2UgfSA9IGF3YWl0IGt5XG4gICAgICAucG9zdDxFbmRwb2ludFJlc3BvbnNlW1wic2Vzc2lvbnMvbG9naW5fcGFnZS9jcmVhdGVcIl0+KFxuICAgICAgICBcInNlc3Npb25zL2xvZ2luX3BhZ2UvY3JlYXRlXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBqc29uOiB7fSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIC5qc29uKClcblxuICAgIGNvbnNvbGUubG9nKFwiUGxlYXNlIHZpc2l0IHRoZSBmb2xsb3dpbmcgVVJMIHRvIGxvZyBpbjpcIilcbiAgICBjb25zb2xlLmxvZyhsb2dpbl9wYWdlLnVybClcblxuICAgIC8vIFdhaXQgdW50aWwgd2UgcmVjZWl2ZSBjb25maXJtYXRpb25cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgeyBsb2dpbl9wYWdlOiBuZXdfbG9naW5fcGFnZSB9ID0gYXdhaXQga3lcbiAgICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvZ2V0XCJdPihcbiAgICAgICAgICBcInNlc3Npb25zL2xvZ2luX3BhZ2UvZ2V0XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICBsb2dpbl9wYWdlX2lkOiBsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfaWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9naW5fcGFnZS5sb2dpbl9wYWdlX2F1dGhfdG9rZW59YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICAuanNvbigpXG5cbiAgICAgIGlmIChuZXdfbG9naW5fcGFnZS53YXNfbG9naW5fc3VjY2Vzc2Z1bCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkxvZ2dlZCBpbiEgR2VuZXJhdGluZyB0b2tlbi4uLlwiKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3X2xvZ2luX3BhZ2UuaXNfZXhwaXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2dpbiBwYWdlIGV4cGlyZWRcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGVsYXkoMTAwMClcbiAgICB9XG5cbiAgICBjb25zdCB7IHNlc3Npb24gfSA9IGF3YWl0IGt5XG4gICAgICAucG9zdDxFbmRwb2ludFJlc3BvbnNlW1wic2Vzc2lvbnMvbG9naW5fcGFnZS9leGNoYW5nZV9mb3JfY2xpX3Nlc3Npb25cIl0+KFxuICAgICAgICBcInNlc3Npb25zL2xvZ2luX3BhZ2UvZXhjaGFuZ2VfZm9yX2NsaV9zZXNzaW9uXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICBsb2dpbl9wYWdlX2lkOiBsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9naW5fcGFnZS5sb2dpbl9wYWdlX2F1dGhfdG9rZW59YCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgKVxuICAgICAgLmpzb24oKVxuXG4gICAgc2V0U2Vzc2lvblRva2VuKHNlc3Npb24udG9rZW4pXG4gICAgY29uc29sZS5sb2coXCJcXG5SZWFkeSB0byB1c2UhXCIpXG4gIH1cblxuICAvLyBSZWdpc3RlciB0aGUgYXV0aCBsb2dpbiBzdWJjb21tYW5kXG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcImxvZ2luXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiQXV0aGVudGljYXRlIENMSSwgbG9naW4gdG8gcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ2luQWN0aW9uKVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSB0b3AtbGV2ZWwgbG9naW4gY29tbWFuZCBhcyBhbiBhbGlhc1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJsb2dpblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkxvZ2luIHRvIHRzY2lyY3VpdCByZWdpc3RyeVwiKVxuICAgIC5hY3Rpb24obG9naW5BY3Rpb24pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGVhclNlc3Npb24gfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoTG9nb3V0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgY29uc3QgbG9nb3V0QWN0aW9uID0gKCkgPT4ge1xuICAgIGNsZWFyU2Vzc2lvbigpXG4gICAgY29uc29sZS5sb2coXCJZb3UgaGF2ZSBiZWVuIGxvZ2dlZCBvdXQhXCIpXG4gIH1cblxuICAvLyBSZWdpc3RlciB0aGUgYXV0aCBsb2dvdXQgc3ViY29tbWFuZFxuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJsb2dvdXRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJMb2dvdXQgZnJvbSByZWdpc3RyeVwiKVxuICAgIC5hY3Rpb24obG9nb3V0QWN0aW9uKVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSB0b3AtbGV2ZWwgbG9nb3V0IGNvbW1hbmQgYXMgYW4gYWxpYXNcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwibG9nb3V0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiTG9nb3V0IGZyb20gdHNjaXJjdWl0IHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dvdXRBY3Rpb24pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGggPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmQoXCJhdXRoXCIpLmRlc2NyaXB0aW9uKFwiTG9naW4vbG9nb3V0XCIpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZyA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZChcImNvbmZpZ1wiKS5kZXNjcmlwdGlvbihcIk1hbmFnZSB0c2NpcmN1aXQgQ0xJIGNvbmZpZ3VyYXRpb25cIilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNsaUNvbmZpZyB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZ1ByaW50ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJjb25maWdcIikhXG4gICAgLmNvbW1hbmQoXCJwcmludFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlByaW50IHRoZSBjdXJyZW50IGNvbmZpZ1wiKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoY2xpQ29uZmlnLmFsbCwgbnVsbCwgMikpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGdldEt5IH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5XCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBzZXR1cFRzY2lQcm9qZWN0IH0gZnJvbSBcImxpYi9zaGFyZWQvc2V0dXAtdHNjaS1wYWNrYWdlc1wiXG5pbXBvcnQgeyBnZW5lcmF0ZVRzQ29uZmlnIH0gZnJvbSBcImxpYi9zaGFyZWQvZ2VuZXJhdGUtdHMtY29uZmlnXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ2xvbmUgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJjbG9uZVwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkNsb25lIGEgc25pcHBldCBmcm9tIHRoZSByZWdpc3RyeVwiKVxuICAgIC5hcmd1bWVudChcIjxzbmlwcGV0PlwiLCBcIlNuaXBwZXQgdG8gY2xvbmUgKGUuZy4gYXV0aG9yL3NuaXBwZXROYW1lKVwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKHNuaXBwZXRQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc25pcHBldFBhdGgubWF0Y2goL14oPzpAdHNjaVxcLyk/KFteLy5dKylbLy5dKC4rKSQvKVxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiSW52YWxpZCBzbmlwcGV0IHBhdGguIFVzZSBmb3JtYXQ6IGF1dGhvci9zbmlwcGV0TmFtZSwgYXV0aG9yLnNuaXBwZXROYW1lLCBvciBAdHNjaS9hdXRob3Iuc25pcHBldE5hbWVcIixcbiAgICAgICAgKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgWywgYXV0aG9yLCBzbmlwcGV0TmFtZV0gPSBtYXRjaFxuICAgICAgY29uc29sZS5sb2coYENsb25pbmcgJHthdXRob3J9LyR7c25pcHBldE5hbWV9Li4uYClcblxuICAgICAgY29uc3Qga3kgPSBnZXRLeSgpXG4gICAgICBsZXQgcGFja2FnZUZpbGVMaXN0XG4gICAgICB0cnkge1xuICAgICAgICBwYWNrYWdlRmlsZUxpc3QgPSBhd2FpdCBreVxuICAgICAgICAgIC5wb3N0PHsgcGFja2FnZV9maWxlczogQXJyYXk8eyBmaWxlX3BhdGg6IHN0cmluZyB9PiB9PihcbiAgICAgICAgICAgIFwicGFja2FnZV9maWxlcy9saXN0XCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICAgIHVzZV9sYXRlc3RfdmVyc2lvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICAgIC5qc29uKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJGYWlsZWQgdG8gZmV0Y2ggcGFja2FnZSBmaWxlczpcIixcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yLFxuICAgICAgICApXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGAke2F1dGhvcn0uJHtzbmlwcGV0TmFtZX1gKVxuICAgICAgZnMubWtkaXJTeW5jKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG5cbiAgICAgIGZvciAoY29uc3QgZmlsZUluZm8gb2YgcGFja2FnZUZpbGVMaXN0LnBhY2thZ2VfZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBmaWxlSW5mby5maWxlX3BhdGgucmVwbGFjZSgvXlxcL3xkaXN0XFwvL2csIFwiXCIpXG4gICAgICAgIGlmICghZmlsZVBhdGgpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZVBhdGgpXG4gICAgICAgIGZzLm1rZGlyU3luYyhwYXRoLmRpcm5hbWUoZnVsbFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBreVxuICAgICAgICAgICAgLnBvc3Q8eyBwYWNrYWdlX2ZpbGU6IHsgY29udGVudF90ZXh0OiBzdHJpbmcgfSB9PihcbiAgICAgICAgICAgICAgXCJwYWNrYWdlX2ZpbGVzL2dldFwiLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBgJHthdXRob3J9LyR7c25pcHBldE5hbWV9YCxcbiAgICAgICAgICAgICAgICAgIGZpbGVfcGF0aDogZmlsZUluZm8uZmlsZV9wYXRoLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuanNvbigpXG5cbiAgICAgICAgICBsZXQgZmlsZVRleHQgPSBmaWxlQ29udGVudC5wYWNrYWdlX2ZpbGUuY29udGVudF90ZXh0XG5cbiAgICAgICAgICAvLyBFbnN1cmUgYWxsIC50c3ggZmlsZXMgY29udGFpbiBcImltcG9ydCAnQHRzY2lyY3VpdC9jb3JlJztcIlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSAmJlxuICAgICAgICAgICAgIWZpbGVUZXh0LmluY2x1ZGVzKFwiQHRzY2lyY3VpdC9jb3JlXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmaWxlVGV4dCA9IGBpbXBvcnQgXCJAdHNjaXJjdWl0L2NvcmVcIjtcXG5cXG4ke2ZpbGVUZXh0fWBcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZ1bGxQYXRoLCBmaWxlVGV4dClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgU2tpcHBpbmcgJHtmaWxlUGF0aH0gZHVlIHRvIGVycm9yOmAsXG4gICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4oZGlyUGF0aCwgXCIubnBtcmNcIiksXG4gICAgICAgIFwiQHRzY2k6cmVnaXN0cnk9aHR0cHM6Ly9ucG0udHNjaXJjdWl0LmNvbVwiLFxuICAgICAgKVxuXG4gICAgICBnZW5lcmF0ZVRzQ29uZmlnKGRpclBhdGgpXG4gICAgICBzZXR1cFRzY2lQcm9qZWN0KGRpclBhdGgpXG5cbiAgICAgIGNvbnNvbGUubG9nKGBTdWNjZXNzZnVsbHkgY2xvbmVkIHRvICR7ZGlyUGF0aH0vYClcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgUnVuIFwiY2QgJHtwYXRoLmRpcm5hbWUoZGlyUGF0aCl9ICYmIHRzY2kgZGV2XCIgdG8gc3RhcnQgZGV2ZWxvcGluZy5gLFxuICAgICAgKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjcmVhdGVDaXJjdWl0V2ViV29ya2VyIH0gZnJvbSBcIkB0c2NpcmN1aXQvZXZhbFwiXG5pbXBvcnQgd2ViV29ya2VyQnVuZGxlVXJsIGZyb20gXCJAdHNjaXJjdWl0L2V2YWwvYmxvYi11cmxcIlxuaW1wb3J0IHsgZ2V0VmlydHVhbEZpbGVTeXN0ZW1Gcm9tRGlyUGF0aCB9IGZyb20gXCJtYWtlLXZmc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQge1xuICBjb252ZXJ0Q2lyY3VpdEpzb25Ub1NjaGVtYXRpY1N2ZyxcbiAgY29udmVydENpcmN1aXRKc29uVG9QY2JTdmcsXG59IGZyb20gXCJjaXJjdWl0LXRvLXN2Z1wiXG5cbmNvbnN0IEFMTE9XRURfRk9STUFUUyA9IFtcbiAgXCJqc29uXCIsXG4gIFwiY2lyY3VpdC1qc29uXCIsXG4gIFwic2NoZW1hdGljLXN2Z1wiLFxuICBcInBjYi1zdmdcIixcbiAgXCJnZXJiZXJzXCIsXG4gIFwicmVhZGFibGUtbmV0bGlzdFwiLFxuICBcImdsdGZcIixcbiAgXCJzcGVjY3RyYS1kc25cIixcbl0gYXMgY29uc3RcblxudHlwZSBGb3JtYXQgPSAodHlwZW9mIEFMTE9XRURfRk9STUFUUylbbnVtYmVyXVxuXG5jb25zdCBPVVRQVVRfRVhURU5TSU9OUyA9IHtcbiAganNvbjogXCIuY2lyY3VpdC5qc29uXCIsXG4gIFwiY2lyY3VpdC1qc29uXCI6IFwiLmNpcmN1aXQuanNvblwiLFxuICBcInNjaGVtYXRpYy1zdmdcIjogXCItc2NoZW1hdGljLnN2Z1wiLFxuICBcInBjYi1zdmdcIjogXCItcGNiLnN2Z1wiLFxuICBnZXJiZXJzOiBcIi1nZXJiZXJzLnppcFwiLFxuICBcInJlYWRhYmxlLW5ldGxpc3RcIjogXCItcmVhZGFibGUubmV0bGlzdFwiLFxuICBnbHRmOiBcIi5nbHRmXCIsXG4gIFwic3BlY2N0cmEtZHNuXCI6IFwiLmRzblwiLFxufVxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJFeHBvcnQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJleHBvcnRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJFeHBvcnQgdHNjaXJjdWl0IGNvZGUgdG8gdmFyaW91cyBmb3JtYXRzXCIpXG4gICAgLmFyZ3VtZW50KFwiPGZpbGU+XCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi1mLCAtLWZvcm1hdCA8Zm9ybWF0PlwiLCBcIk91dHB1dCBmb3JtYXRcIilcbiAgICAub3B0aW9uKFwiLW8sIC0tb3V0cHV0IDxwYXRoPlwiLCBcIk91dHB1dCBmaWxlIHBhdGhcIilcbiAgICAuYWN0aW9uKGFzeW5jIChmaWxlLCBvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCB7IGZvcm1hdCA9IFwiY2lyY3VpdC1qc29uXCIgfSA9IG9wdGlvbnNcbiAgICAgIGxldCB7IG91dHB1dCB9ID0gb3B0aW9uc1xuICAgICAgaWYgKCFBTExPV0VEX0ZPUk1BVFMuaW5jbHVkZXMoZm9ybWF0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgZm9ybWF0OiAke2Zvcm1hdH1cXG5TdXBwb3J0ZWQgZm9ybWF0czogJHtBTExPV0VEX0ZPUk1BVFMuam9pbihcIixcIil9YCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoIW91dHB1dCkge1xuICAgICAgICBvdXRwdXQgPSBwYXRoLmJhc2VuYW1lKGZpbGUpLnJlcGxhY2UoL1xcLlteLl0rJC8sIFwiXCIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IGNyZWF0ZUNpcmN1aXRXZWJXb3JrZXIoe1xuICAgICAgICB3ZWJXb3JrZXJVcmw6IHdlYldvcmtlckJ1bmRsZVVybCxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLmRpcm5hbWUoZmlsZSlcblxuICAgICAgY29uc3QgcmVsYXRpdmVDb21wb25lbnRQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0RGlyLCBmaWxlKVxuXG4gICAgICBhd2FpdCB3b3JrZXIuZXhlY3V0ZVdpdGhGc01hcCh7XG4gICAgICAgIGVudHJ5cG9pbnQ6IFwiZW50cnlwb2ludC50c3hcIixcbiAgICAgICAgZnNNYXA6IHtcbiAgICAgICAgICAuLi4oKGF3YWl0IGdldFZpcnR1YWxGaWxlU3lzdGVtRnJvbURpclBhdGgoe1xuICAgICAgICAgICAgZGlyUGF0aDogcHJvamVjdERpcixcbiAgICAgICAgICAgIGNvbnRlbnRGb3JtYXQ6IFwic3RyaW5nXCIsXG4gICAgICAgICAgfSkpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pLFxuICAgICAgICAgIFwiZW50cnlwb2ludC50c3hcIjogYFxuaW1wb3J0IE15Q2lyY3VpdCBmcm9tIFwiLi8ke3JlbGF0aXZlQ29tcG9uZW50UGF0aH1cIlxuXG5jaXJjdWl0LmFkZCg8TXlDaXJjdWl0IC8+KVxuICAgICAgICBgLFxuICAgICAgICB9LFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgd29ya2VyLnJlbmRlclVudGlsU2V0dGxlZCgpXG5cbiAgICAgIGNvbnN0IGNpcmN1aXRKc29uID0gYXdhaXQgd29ya2VyLmdldENpcmN1aXRKc29uKClcbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIHByb2plY3REaXIsXG4gICAgICAgIGAke291dHB1dH0ke09VVFBVVF9FWFRFTlNJT05TW2Zvcm1hdCBhcyBGb3JtYXRdfWAsXG4gICAgICApXG5cbiAgICAgIGxldCBvdXRwdXRDb250ZW50OiBzdHJpbmdcblxuICAgICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgICAgY2FzZSBcInNjaGVtYXRpYy1zdmdcIjpcbiAgICAgICAgICBvdXRwdXRDb250ZW50ID0gY29udmVydENpcmN1aXRKc29uVG9TY2hlbWF0aWNTdmcoY2lyY3VpdEpzb24pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBcInBjYi1zdmdcIjpcbiAgICAgICAgICBvdXRwdXRDb250ZW50ID0gY29udmVydENpcmN1aXRKc29uVG9QY2JTdmcoY2lyY3VpdEpzb24pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBvdXRwdXRDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoY2lyY3VpdEpzb24pXG4gICAgICB9XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgb3V0cHV0Q29udGVudClcblxuICAgICAgY29uc29sZS5sb2coYEV4cG9ydGVkIHRvICR7b3V0cHV0UGF0aH1gKVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMClcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY2xpQ29uZmlnIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aFByaW50VG9rZW4gPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJwcmludC10b2tlblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlByaW50cyB5b3VyIGF1dGggdG9rZW5cIilcbiAgICAuYWN0aW9uKCgpID0+IHtcbiAgICAgIGNvbnN0IHRva2VuID0gY2xpQ29uZmlnLmdldChcInNlc3Npb25Ub2tlblwiKVxuICAgICAgaWYgKCF0b2tlbikgcmV0dXJuIGNvbnNvbGUubG9nKFwiWW91IG5lZWQgdG8gbG9nIGluIHRvIGFjY2VzcyB0aGlzLlwiKVxuICAgICAgY29uc29sZS5sb2coXCJZb3VyIFRva2VuOlxcblwiLCB0b2tlbilcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgc2V0U2Vzc2lvblRva2VuIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZnVuY3Rpb24gdmFsaWRhdGVKV1RMZW5ndGgodG9rZW46IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHRva2VuLnNwbGl0KFwiLlwiKVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDMgJiYgcGFydHMuZXZlcnkoKHBhcnQpID0+IHBhcnQubGVuZ3RoID4gMCkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoU2V0VG9rZW4gPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJzZXQtdG9rZW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJFeHBsaWNpdGx5IHNldCB5b3VyIGF1dGggdG9rZW5cIilcbiAgICAuYXJndW1lbnQoXCI8dG9rZW4+XCIsIFwiTmV3IHRva2VuIHRvIG1hbnVhbGx5IGNvbmZpZ3VyZVwiKVxuICAgIC5hY3Rpb24oKHRva2VuKSA9PiB7XG4gICAgICBpZiAoIXZhbGlkYXRlSldUTGVuZ3RoKHRva2VuKSlcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKFwiSW52YWxpZCB0b2tlbiBwcm92aWRlZFwiKVxuICAgICAgc2V0U2Vzc2lvblRva2VuKHRva2VuKVxuICAgICAgY29uc29sZS5sb2coXCJUb2tlbiBtYW51YWxseSB1cGRhdGVkLlwiKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHsgcHVzaFNuaXBwZXQgfSBmcm9tIFwibGliL3NoYXJlZC9wdXNoLXNuaXBwZXRcIlxuaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlclB1c2ggPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJwdXNoXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU2F2ZSBzbmlwcGV0IGNvZGUgdG8gUmVnaXN0cnkgQVBJXCIpXG4gICAgLmFyZ3VtZW50KFwiW2ZpbGVdXCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICAgIGF3YWl0IHB1c2hTbmlwcGV0KHtcbiAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIG9uRXhpdDogKGNvZGUpID0+IHByb2Nlc3MuZXhpdChjb2RlKSxcbiAgICAgICAgb25FcnJvcjogKG1lc3NhZ2UpID0+IGNvbnNvbGUuZXJyb3IobWVzc2FnZSksXG4gICAgICAgIG9uU3VjY2VzczogKG1lc3NhZ2UpID0+IGNvbnNvbGUubG9nKG1lc3NhZ2UpLFxuICAgICAgfSlcbiAgICB9KVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7O0FBQ0EsU0FBUyxlQUFlOzs7QUNBeEIsWUFBWUEsU0FBUTtBQUNwQixZQUFZQyxXQUFVOzs7QUNGdEIsT0FBTyxRQUFRO0FBR1IsSUFBTSx1QkFBdUIsTUFBYztBQUNoRCxRQUFNLFlBQVksUUFBUSxJQUFJLHlCQUF5QjtBQUN2RCxNQUFJLFVBQVUsV0FBVyxNQUFNLEVBQUcsUUFBTztBQUN6QyxNQUFJLFVBQVUsV0FBVyxNQUFNLEVBQUcsUUFBTztBQUN6QyxNQUFJLFVBQVUsV0FBVyxLQUFLLEVBQUcsUUFBTztBQUV4QyxNQUFJLEdBQUcsV0FBVyxXQUFXLEVBQUcsUUFBTztBQUN2QyxNQUFJLEdBQUcsV0FBVyxnQkFBZ0IsRUFBRyxRQUFPO0FBQzVDLE1BQUksR0FBRyxXQUFXLFdBQVcsRUFBRyxRQUFPO0FBRXZDLFNBQU87QUFDVDs7O0FDYkEsT0FBT0MsU0FBUTtBQUNmLE9BQU8sVUFBVTtBQUNqQixTQUFTLGdCQUFnQjtBQUVsQixTQUFTLGlCQUNkLFlBQVksUUFBUSxJQUFJLEdBQ3hCLGVBQWUsQ0FBQyxnQkFBZ0IsaUJBQWlCLEdBQ2pEO0FBQ0EsUUFBTSxjQUFjLEtBQUssUUFBUSxTQUFTO0FBQzFDLE1BQUksQ0FBQ0EsSUFBRyxXQUFXLFdBQVcsR0FBRztBQUMvQixJQUFBQSxJQUFHLFVBQVUsYUFBYSxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQUEsRUFDL0M7QUFDQSxRQUFNLGlCQUFpQixxQkFBcUI7QUFFNUMsVUFBUSxJQUFJLDJCQUEyQixXQUFXLEtB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QUM5QixxQkFBcUIsT0FBTztBQUU1QixlQUFlLE9BQU87QUFDdEIsb0JBQW9CLE9BQU87QUFFM0IsZUFBZSxPQUFPO0FBRXRCLElBQUksUUFBUSxLQUFLLFdBQVcsR0FBRztBQUM3QixhQUFXLFNBQVMsUUFBUSxJQUFJO0FBQ2xDLE9BQU87QUFDTCxVQUFRLE1BQU07QUFDaEI7IiwKICAibmFtZXMiOiBbImZzIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgInBhdGgiLCAicHJvZ3JhbSIsICJwYXRoIiwgImZzIiwgImZzIiwgInBhdGgiLCAia3kiLCAiZnMiLCAicGF0aCIsICJyZXNvbHZlIiwgInBhdGgiLCAiZnMiLCAiZnMiLCAicGF0aCIsICJmcyIsICJ0cyIsICJmcyIsICJwYXRoIiwgImt5IiwgInBhdGgiLCAia3kiLCAiZnMiLCAicHJvZ3JhbSIsICJwb3J0IiwgInJlc29sdmUiLCAic2VydmVyIiwgInByb2dyYW0iLCAia3kiLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJmcyIsICJwYXRoIiwgInByb2dyYW0iLCAia3kiLCAic2VtdmVyIiwgInBhdGgiLCAiZnMiLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJzZW12ZXIiXQp9Cg==
@@ -31,7 +31,9 @@ export const createHttpServer = async (port = 3020) => {
31
31
  res.end(content)
32
32
  return
33
33
  } catch (error) {
34
- console.error("Error serving standalone.min.js:", error)
34
+ console.info(
35
+ "Local runframe standalone not found, falling back to the production version.",
36
+ )
35
37
  }
36
38
 
37
39
  res.writeHead(302, {
@@ -31,5 +31,5 @@ yarn-debug.log*
31
31
  yarn-error.log*
32
32
  `
33
33
 
34
- writeFileIfNotExists(gitignorePath, gitignoreContent)
35
- }
34
+ writeFileIfNotExists(gitignorePath, gitignoreContent)
35
+ }
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@tscircuit/cli",
3
3
  "main": "dist/main.js",
4
4
  "type": "module",
5
- "version": "0.1.32",
5
+ "version": "0.1.34",
6
6
  "bin": {
7
7
  "tsci": "./dist/main.js"
8
8
  },
@@ -34,7 +34,9 @@
34
34
  "@tscircuit/eval": "^0.0.96",
35
35
  "@tscircuit/file-server": "^0.0.13",
36
36
  "@tscircuit/runframe": "^0.0.167",
37
+ "bun-match-svg": "^0.0.9",
37
38
  "chokidar": "4.0.1",
39
+ "circuit-to-svg": "^0.0.101",
38
40
  "commander": "^12.1.0",
39
41
  "configstore": "^7.0.0",
40
42
  "cosmiconfig": "^9.0.0",
@@ -0,0 +1,13 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="800" height="600"><style>
2
+ .boundary { fill: #000; }
3
+ .pcb-board { fill: none; }
4
+ .pcb-trace { fill: none; }
5
+ .pcb-hole-outer { fill: rgb(200, 52, 52); }
6
+ .pcb-hole-inner { fill: rgb(255, 38, 226); }
7
+ .pcb-pad { }
8
+ .pcb-boundary { fill: none; stroke: #fff; stroke-width: 0.3; }
9
+ .pcb-silkscreen { fill: none; }
10
+ .pcb-silkscreen-top { stroke: #f2eda1; }
11
+ .pcb-silkscreen-bottom { stroke: #f2eda1; }
12
+ .pcb-silkscreen-text { fill: #f2eda1; }
13
+ </style><rect class="boundary" x="0" y="0" width="800" height="600"/><rect class="pcb-boundary" x="150" y="50" width="500" height="500"/><path class="pcb-board" d="M 150 550 L 650 550 L 650 50 L 150 50 Z" stroke="rgba(255, 255, 255, 0.5)" stroke-width="5"/><g transform="translate(550, 300) rotate(0) scale(1, -1)"><rect class="pcb-component" x="-39.99999999999999" y="-15.000000000000002" width="79.99999999999999" height="30.000000000000004"/><rect class="pcb-component-outline" x="-39.99999999999999" y="-15.000000000000002" width="79.99999999999999" height="30.000000000000004"/></g><g transform="translate(250, 300) rotate(0) scale(1, -1)"><rect class="pcb-component" x="-39.99999999999999" y="-15.000000000000002" width="79.99999999999999" height="30.000000000000004"/><rect class="pcb-component-outline" x="-39.99999999999999" y="-15.000000000000002" width="79.99999999999999" height="30.000000000000004"/></g><rect class="pcb-pad" fill="rgb(200, 52, 52)" x="510" y="285" width="30.000000000000004" height="30.000000000000004"/><rect class="pcb-pad" fill="rgb(200, 52, 52)" x="560" y="285" width="30.000000000000004" height="30.000000000000004"/><rect class="pcb-pad" fill="rgb(200, 52, 52)" x="210" y="285" width="30.000000000000004" height="30.000000000000004"/><rect class="pcb-pad" fill="rgb(200, 52, 52)" x="260" y="285" width="30.000000000000004" height="30.000000000000004"/><path class="pcb-trace" stroke="rgb(200, 52, 52)" d="M 525 300 L 340 300" stroke-width="8" stroke-linecap="round" stroke-linejoin="round" shape-rendering="crispEdges"/><path class="pcb-trace" stroke="rgb(200, 52, 52)" d="M 340 300 L 340 235" stroke-width="8" stroke-linecap="round" stroke-linejoin="round" shape-rendering="crispEdges"/><path class="pcb-trace" stroke="rgb(200, 52, 52)" d="M 340 235 L 225 235" stroke-width="8" stroke-linecap="round" stroke-linejoin="round" shape-rendering="crispEdges"/><path class="pcb-trace" stroke="rgb(200, 52, 52)" d="M 225 235 L 225 300" stroke-width="8" stroke-linecap="round" stroke-linejoin="round" shape-rendering="crispEdges"/></svg>