path-terminal-init 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -11
- package/dist/cli.js +8 -7
- package/dist/init.js +7 -6
- package/package.json +1 -1
- package/rules/ios/path-integration.mdc +29 -0
package/README.md
CHANGED
|
@@ -23,18 +23,20 @@ build.mjs builds dist/cli.js + dist/init.js
|
|
|
23
23
|
|
|
24
24
|
## How a customer runs it
|
|
25
25
|
|
|
26
|
-
**
|
|
27
|
-
```bash
|
|
28
|
-
node <(curl -s https://mcp.path2ai.tech/init.js) --agent claude
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
**iOS — once published to npm:**
|
|
26
|
+
**Every platform (published to npm) — run from the project root:**
|
|
32
27
|
```bash
|
|
33
28
|
npx path-terminal-init
|
|
34
29
|
```
|
|
35
|
-
|
|
30
|
+
Works on macOS, Linux and Windows (PowerShell or CMD). Needs Node installed. It
|
|
31
|
+
auto-detects iOS / Android / Windows 11 (WinUI 3) / Windows 10 (WPF). Add `--agent cursor`
|
|
32
|
+
for Cursor (default is Claude Code).
|
|
33
|
+
|
|
34
|
+
**Alternative — fetch from the help server (no npm):**
|
|
36
35
|
```bash
|
|
37
|
-
|
|
36
|
+
# macOS / Linux:
|
|
37
|
+
node <(curl -s https://mcp.path2ai.tech/init.js) --agent claude
|
|
38
|
+
# Windows PowerShell:
|
|
39
|
+
curl.exe -s https://mcp.path2ai.tech/init.js -o "$env:TEMP\path-init.js"; node "$env:TEMP\path-init.js" --agent claude
|
|
38
40
|
```
|
|
39
41
|
|
|
40
42
|
The CLI writes a `.mcp.json` (connecting the agent to `https://mcp.path2ai.tech`), adds the
|
|
@@ -58,10 +60,15 @@ node dist/cli.js --help
|
|
|
58
60
|
`Path-mcp-server` serves `dist/init.js` at `/init.js` and the `rules/` files at `/rules*`.
|
|
59
61
|
Its deploy copies them from this repo, so the server is never a stale duplicate.
|
|
60
62
|
|
|
61
|
-
##
|
|
63
|
+
## Publishing updates to npm
|
|
64
|
+
|
|
65
|
+
Published as **[`path-terminal-init`](https://www.npmjs.com/package/path-terminal-init)** (public).
|
|
66
|
+
To ship a new version: bump `version` in `package.json`, then:
|
|
62
67
|
|
|
63
68
|
```bash
|
|
64
|
-
npm login
|
|
65
|
-
npm publish --access public
|
|
69
|
+
npm login # if not already logged in
|
|
70
|
+
npm publish --access public # prepublishOnly rebuilds dist/ first
|
|
66
71
|
npm view path-terminal-init version
|
|
67
72
|
```
|
|
73
|
+
|
|
74
|
+
`npx path-terminal-init` always fetches the latest published version.
|
package/dist/cli.js
CHANGED
|
@@ -540,7 +540,7 @@ import_commander.program.name("path-terminal-init").description(
|
|
|
540
540
|
spinner.succeed("PathTerminalSDK added to Package.swift.");
|
|
541
541
|
actions.push("PathTerminalSDK added to Package.swift");
|
|
542
542
|
manualSteps.push(
|
|
543
|
-
`Open Xcode and link all
|
|
543
|
+
`Open Xcode and link all four targets to your app: PathTerminalSDK, PathEmulatorAdapter, PathCoreModels, PathVerifonePSDKAdapter.`
|
|
544
544
|
);
|
|
545
545
|
} else {
|
|
546
546
|
spinner.warn("Could not automatically modify Package.swift \u2014 manual step required.");
|
|
@@ -566,12 +566,13 @@ import_commander.program.name("path-terminal-init").description(
|
|
|
566
566
|
console.log(" 2. File \u2192 Add Package Dependencies\u2026");
|
|
567
567
|
console.log(` 3. Enter URL: ${import_chalk.default.cyan(SDK_GITHUB_URL)}`);
|
|
568
568
|
console.log(
|
|
569
|
-
" 4. In the 'Choose Package Products' dialog, set all
|
|
569
|
+
" 4. In the 'Choose Package Products' dialog, set all four to your app target:"
|
|
570
570
|
);
|
|
571
|
-
console.log(import_chalk.default.cyan(" PathTerminalSDK
|
|
572
|
-
console.log(import_chalk.default.cyan(" PathEmulatorAdapter
|
|
573
|
-
console.log(import_chalk.default.cyan(" PathCoreModels
|
|
574
|
-
console.log(import_chalk.default.
|
|
571
|
+
console.log(import_chalk.default.cyan(" PathTerminalSDK \u2192 your app target"));
|
|
572
|
+
console.log(import_chalk.default.cyan(" PathEmulatorAdapter \u2192 your app target"));
|
|
573
|
+
console.log(import_chalk.default.cyan(" PathCoreModels \u2192 your app target"));
|
|
574
|
+
console.log(import_chalk.default.cyan(" PathVerifonePSDKAdapter \u2192 your app target"));
|
|
575
|
+
console.log(import_chalk.default.dim(" (PathVerifonePSDKAdapter is required for the Verifone backend; PathDiagnostics can be left as None)"));
|
|
575
576
|
console.log(" 5. Click Add Package\n");
|
|
576
577
|
const confirmed = await ask(
|
|
577
578
|
import_chalk.default.bold(" Press Enter once you have added the package, or type 'skip' to do this later: ")
|
|
@@ -722,4 +723,4 @@ import_commander.program.name("path-terminal-init").description(
|
|
|
722
723
|
printSummary(agent, platform, actions, warnings, manualSteps);
|
|
723
724
|
});
|
|
724
725
|
import_commander.program.parse(process.argv);
|
|
725
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBwcm9ncmFtIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tIFwicmVhZGxpbmVcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBvcmEgZnJvbSBcIm9yYVwiO1xuXG5jb25zdCBTREtfR0lUSFVCX1VSTCA9IFwiaHR0cHM6Ly9naXRodWIuY29tL2tleW1hbjEyL3BhdGgtdGVybWluYWwtc2RrXCI7XG5jb25zdCBBTkRST0lEX1NES19HSVRIVUJfVVJMID0gXCJodHRwczovL2dpdGh1Yi5jb20va2V5bWFuMTIvcGF0aC10ZXJtaW5hbC1zZGstYW5kcm9pZFwiO1xuY29uc3QgU0RLX1ZFUlNJT04gPSBcIjAuMS4wXCI7IC8vIG1pbmltdW0gdmVyc2lvbiB0byByZWZlcmVuY2VcbmNvbnN0IEFORFJPSURfU0RLX0pJVFBBQ0tfVkVSU0lPTiA9IFwidjEuNFwiO1xuY29uc3QgQU5EUk9JRF9TREtfSklUUEFDS19HUk9VUCA9IFwiY29tLmdpdGh1Yi5rZXltYW4xMi5wYXRoLXRlcm1pbmFsLXNkay1hbmRyb2lkXCI7XG5jb25zdCBNQ1BfU0VSVkVSX1VSTCA9IFwiaHR0cHM6Ly9tY3AucGF0aDJhaS50ZWNoL3NzZVwiO1xuY29uc3QgUlVMRVNfRkVUQ0hfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvcnVsZXNcIjtcbmNvbnN0IEFORFJPSURfUlVMRVNfRkVUQ0hfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvcnVsZXMvYW5kcm9pZFwiO1xuY29uc3QgV0lORE9XUzExX1JVTEVTX0ZFVENIX1VSTCA9IFwiaHR0cHM6Ly9tY3AucGF0aDJhaS50ZWNoL3J1bGVzL3dpbmRvd3MxMVwiO1xuY29uc3QgV0lORE9XUzEwX1JVTEVTX0ZFVENIX1VSTCA9IFwiaHR0cHM6Ly9tY3AucGF0aDJhaS50ZWNoL3J1bGVzL3dpbmRvd3MxMFwiO1xuXG5jb25zdCBSVUxFU19TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uL3J1bGVzL2lvcy9wYXRoLWludGVncmF0aW9uLm1kY1wiKTtcbmNvbnN0IEFORFJPSURfUlVMRVNfU09VUkNFID0gcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLi9ydWxlcy9hbmRyb2lkL3BhdGgtaW50ZWdyYXRpb24tYW5kcm9pZC5tZGNcIik7XG5jb25zdCBXSU5ET1dTMTFfUlVMRVNfU09VUkNFID0gcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLi9ydWxlcy93aW5kb3dzLTExL3BhdGgtaW50ZWdyYXRpb24td2luZG93czExLm1kY1wiKTtcbmNvbnN0IFdJTkRPV1MxMF9SVUxFU19TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uL3J1bGVzL3dpbmRvd3MtMTAvcGF0aC1pbnRlZ3JhdGlvbi13aW5kb3dzMTAubWRjXCIpO1xuXG4vLyBUaGUgV2luZG93cyBTREsgaXMgY29uc3VtZWQgYnkgcmVsYXRpdmUgUHJvamVjdFJlZmVyZW5jZSB0byB0aGlzIHNpYmxpbmcgY2xvbmVcbi8vIChvbmUgcmVwbyBzZXJ2ZXMgYm90aCB0aGUgV2luVUkgMyAvIC5ORVQgMTAgYW5kIFdQRiAvIC5ORVQgRlcgNC44IHN0YWNrcykuXG5jb25zdCBXSU5ET1dTX1NES19SRVBPID0gXCJQYXRoLXRlcm1pbmFsLXNkay13aW5kb3dzMTFcIjtcblxudHlwZSBBZ2VudFR5cGUgPSBcImN1cnNvclwiIHwgXCJjbGF1ZGVcIjtcbnR5cGUgUGxhdGZvcm0gPSBcImlvc1wiIHwgXCJhbmRyb2lkXCIgfCBcIndpbmRvd3MxMVwiIHwgXCJ3aW5kb3dzMTBcIjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFV0aWxpdGllcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gYXNrKHF1ZXN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7IGlucHV0OiBwcm9jZXNzLnN0ZGluLCBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0IH0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBybC5xdWVzdGlvbihxdWVzdGlvbiwgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcbiAgICAgIHJlc29sdmUoYW5zd2VyLnRyaW0oKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmaW5kWGNvZGVQcm9qZWN0KGRpcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGlzWGNvZGVBcnRpZmFjdCA9IChlOiBzdHJpbmcpID0+XG4gICAgZS5lbmRzV2l0aChcIi54Y29kZXByb2pcIikgfHwgZS5lbmRzV2l0aChcIi54Y3dvcmtzcGFjZVwiKTtcblxuICAvLyBDaGVjayB0aGUgY3VycmVudCBkaXJlY3RvcnkgZmlyc3RcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpcik7XG4gIGNvbnN0IHByb2ogPSBlbnRyaWVzLmZpbmQoaXNYY29kZUFydGlmYWN0KTtcbiAgaWYgKHByb2opIHJldHVybiBwYXRoLmpvaW4oZGlyLCBwcm9qKTtcblxuICAvLyBTZWFyY2ggb25lIGxldmVsIGRlZXAgaW4gc3ViZGlyZWN0b3JpZXMgKGhhbmRsZXMgcmVwb3Mgd2hlcmUgdGhlXG4gIC8vIFhjb2RlIHByb2plY3Qgc2l0cyBpbnNpZGUgYSBuYW1lZCBzdWJmb2xkZXIsIGUuZy4gT3JkZXJjaGFtcGlvbkVQT1MvKVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBpZiAoZW50cnkuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHN1YiA9IHBhdGguam9pbihkaXIsIGVudHJ5KTtcbiAgICB0cnkge1xuICAgICAgaWYgKGZzLnN0YXRTeW5jKHN1YikuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBjb25zdCBzdWJFbnRyaWVzID0gZnMucmVhZGRpclN5bmMoc3ViKTtcbiAgICAgICAgY29uc3Qgc3ViUHJvaiA9IHN1YkVudHJpZXMuZmluZChpc1hjb2RlQXJ0aWZhY3QpO1xuICAgICAgICBpZiAoc3ViUHJvaikgcmV0dXJuIHBhdGguam9pbihzdWIsIHN1YlByb2opO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggeyAvKiBza2lwIHVucmVhZGFibGUgZGlycyAqLyB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VTd2lmdChkaXI6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBwID0gcGF0aC5qb2luKGRpciwgXCJQYWNrYWdlLnN3aWZ0XCIpO1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwKSA/IHAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBoYXNTREtEZXBlbmRlbmN5KHBhY2thZ2VTd2lmdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZVN3aWZ0LCBcInV0Zi04XCIpO1xuICByZXR1cm4gY29udGVudC5pbmNsdWRlcyhcInBhdGgtdGVybWluYWwtc2RrXCIpIHx8IGNvbnRlbnQuaW5jbHVkZXMoXCJQYXRoVGVybWluYWxTREtcIik7XG59XG5cbmZ1bmN0aW9uIGhhc1hjb2RlUHJvamVjdFNES0RlcGVuZGVuY3koeGNvZGVQcm9qZWN0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gWGNvZGUgc3RvcmVzIHJlc29sdmVkIFNQTSBwYWNrYWdlcyBpbiB0aGUgd29ya3NwYWNlJ3MgUGFja2FnZS5yZXNvbHZlZFxuICBjb25zdCByZXNvbHZlZFBhdGhzID0gW1xuICAgIHBhdGguam9pbih4Y29kZVByb2plY3QsIFwicHJvamVjdC54Y3dvcmtzcGFjZVwiLCBcInhjc2hhcmVkZGF0YVwiLCBcInN3aWZ0cG1cIiwgXCJQYWNrYWdlLnJlc29sdmVkXCIpLFxuICAgIHBhdGguam9pbih4Y29kZVByb2plY3QsIFwieGNzaGFyZWRkYXRhXCIsIFwic3dpZnRwbVwiLCBcIlBhY2thZ2UucmVzb2x2ZWRcIiksXG4gIF07XG4gIGZvciAoY29uc3QgcCBvZiByZXNvbHZlZFBhdGhzKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgXCJ1dGYtOFwiKTtcbiAgICAgIGlmIChjb250ZW50LmluY2x1ZGVzKFwicGF0aC10ZXJtaW5hbC1zZGtcIikgfHwgY29udGVudC5pbmNsdWRlcyhcIlBhdGhUZXJtaW5hbFNES1wiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpbmplY3RTUE1EZXBlbmRlbmN5KHBhY2thZ2VTd2lmdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlU3dpZnRQYXRoLCBcInV0Zi04XCIpO1xuXG4gIC8vIEFscmVhZHkgcHJlc2VudD9cbiAgaWYgKGhhc1NES0RlcGVuZGVuY3kocGFja2FnZVN3aWZ0UGF0aCkpIHJldHVybiBmYWxzZTtcblxuICAvLyBBZGQgdGhlIHBhY2thZ2UgZGVwZW5kZW5jeSBcdTIwMTQgZmluZCB0aGUgZGVwZW5kZW5jaWVzOiBbIGFycmF5XG4gIGNvbnN0IGRlcHNSZWdleCA9IC8oZGVwZW5kZW5jaWVzOlxccypcXFspLztcbiAgaWYgKCFkZXBzUmVnZXgudGVzdChjb250ZW50KSkge1xuICAgIHJldHVybiBmYWxzZTsgLy8gQ2FuJ3Qgc2FmZWx5IGluamVjdCBcdTIwMTQgc3RydWN0dXJlIG5vdCByZWNvZ25pc2VkXG4gIH1cblxuICBjb25zdCBkZXBFbnRyeSA9IGBcXG4gICAgICAgIC5wYWNrYWdlKHVybDogXCIke1NES19HSVRIVUJfVVJMfVwiLCBmcm9tOiBcIiR7U0RLX1ZFUlNJT059XCIpLGA7XG4gIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZGVwc1JlZ2V4LCBgJDEke2RlcEVudHJ5fWApO1xuICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VTd2lmdFBhdGgsIGNvbnRlbnQsIFwidXRmLThcIik7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ3Vyc29yLXNwZWNpZmljIGNvbmZpZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gd3JpdGVDdXJzb3JNY3BDb25maWcoZGlyOiBzdHJpbmcpOiB7IHdyaXR0ZW46IGJvb2xlYW47IG1lcmdlZDogYm9vbGVhbiB9IHtcbiAgY29uc3QgY3Vyc29yRGlyID0gcGF0aC5qb2luKGRpciwgXCIuY3Vyc29yXCIpO1xuICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKGN1cnNvckRpciwgXCJtY3AuanNvblwiKTtcblxuICBmcy5ta2RpclN5bmMoY3Vyc29yRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBwYXRoRW50cnkgPSB7XG4gICAgXCJwYXRoLXRlcm1pbmFsXCI6IHsgdXJsOiBNQ1BfU0VSVkVSX1VSTCB9LFxuICB9O1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICBpZiAoIWV4aXN0aW5nLm1jcFNlcnZlcnMpIGV4aXN0aW5nLm1jcFNlcnZlcnMgPSB7fTtcbiAgICAgIGlmIChleGlzdGluZy5tY3BTZXJ2ZXJzW1wicGF0aC10ZXJtaW5hbFwiXSkge1xuICAgICAgICByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgbWVyZ2VkOiBmYWxzZSB9OyAvLyBhbHJlYWR5IHByZXNlbnRcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nLm1jcFNlcnZlcnNbXCJwYXRoLXRlcm1pbmFsXCJdID0gcGF0aEVudHJ5W1wicGF0aC10ZXJtaW5hbFwiXTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkoZXhpc3RpbmcsIG51bGwsIDIpLCBcInV0Zi04XCIpO1xuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgbWVyZ2VkOiB0cnVlIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGaWxlIGV4aXN0cyBidXQgaXMgbm90IHZhbGlkIEpTT04gXHUyMDE0IGRvbid0IG92ZXJ3cml0ZVxuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25maWcgPSB7IG1jcFNlcnZlcnM6IHBhdGhFbnRyeSB9O1xuICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gd3JpdGVDdXJzb3JSdWxlc0ZpbGUoZGlyOiBzdHJpbmcsIHJ1bGVzU291cmNlOiBzdHJpbmcgPSBSVUxFU19TT1VSQ0UsIGZpbGVuYW1lOiBzdHJpbmcgPSBcInBhdGgtaW50ZWdyYXRpb24ubWRjXCIsIGZhbGxiYWNrVXJsPzogc3RyaW5nKTogeyB3cml0dGVuOiBib29sZWFuOyBza2lwcGVkOiBib29sZWFuIH0ge1xuICBjb25zdCBydWxlc0RpciA9IHBhdGguam9pbihkaXIsIFwiLmN1cnNvclwiLCBcInJ1bGVzXCIpO1xuICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihydWxlc0RpciwgZmlsZW5hbWUpO1xuXG4gIGZzLm1rZGlyU3luYyhydWxlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGVzdFBhdGgpKSB7XG4gICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIHNraXBwZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBsb2FkUnVsZXNDb250ZW50KHJ1bGVzU291cmNlLCBmYWxsYmFja1VybCk7XG4gIGlmICghY29udGVudCkgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIHNraXBwZWQ6IGZhbHNlIH07XG5cbiAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgc2tpcHBlZDogZmFsc2UgfTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENsYXVkZSBDb2RlLXNwZWNpZmljIGNvbmZpZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gd3JpdGVDbGF1ZGVNY3BDb25maWcoZGlyOiBzdHJpbmcpOiB7IHdyaXR0ZW46IGJvb2xlYW47IG1lcmdlZDogYm9vbGVhbiB9IHtcbiAgLy8gQ2xhdWRlIENvZGUgcmVhZHMgLm1jcC5qc29uIGF0IHRoZSBwcm9qZWN0IHJvb3QgKHNhbWUgbWNwU2VydmVycyBmb3JtYXQgYXMgQ3Vyc29yKVxuICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKGRpciwgXCIubWNwLmpzb25cIik7XG5cbiAgY29uc3Qgc2VydmVyRW50cnkgPSB7XG4gICAgdHlwZTogXCJzc2VcIixcbiAgICB1cmw6IE1DUF9TRVJWRVJfVVJMLFxuICB9O1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICBpZiAoIWV4aXN0aW5nLm1jcFNlcnZlcnMpIGV4aXN0aW5nLm1jcFNlcnZlcnMgPSB7fTtcbiAgICAgIGlmIChleGlzdGluZy5tY3BTZXJ2ZXJzW1wicGF0aC10ZXJtaW5hbFwiXSkge1xuICAgICAgICByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgbWVyZ2VkOiBmYWxzZSB9OyAvLyBhbHJlYWR5IHByZXNlbnRcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nLm1jcFNlcnZlcnNbXCJwYXRoLXRlcm1pbmFsXCJdID0gc2VydmVyRW50cnk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nLCBudWxsLCAyKSwgXCJ1dGYtOFwiKTtcbiAgICAgIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogdHJ1ZSB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25maWcgPSB7XG4gICAgbWNwU2VydmVyczoge1xuICAgICAgXCJwYXRoLXRlcm1pbmFsXCI6IHNlcnZlckVudHJ5LFxuICAgIH0sXG4gIH07XG4gIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKSwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgbWVyZ2VkOiBmYWxzZSB9O1xufVxuXG4vLyBQcmUtYXBwcm92ZSB0aGUgcGF0aC10ZXJtaW5hbCBNQ1Agc2VydmVyIGluIC5jbGF1ZGUvc2V0dGluZ3MuanNvbiBzbyBDbGF1ZGVcbi8vIENvZGUgbG9hZHMgaXRzIHRvb2xzIG9uIHRoZSB2ZXJ5IGZpcnN0IHNlc3Npb24gd2l0aG91dCB0aGUgdXNlciBoYXZpbmcgdG9cbi8vIGNsaWNrIHRocm91Z2ggYW4gYXBwcm92YWwgcHJvbXB0ICh3aGljaCBpcyBlYXN5IHRvIG1pc3MgYW5kIGxlYXZlcyB0aGUgYWdlbnRcbi8vIHJ1bm5pbmcgd2l0aG91dCBNQ1AgdG9vbHMpLlxuZnVuY3Rpb24gd3JpdGVDbGF1ZGVTZXR0aW5ncyhkaXI6IHN0cmluZyk6IHsgd3JpdHRlbjogYm9vbGVhbjsgbWVyZ2VkOiBib29sZWFuOyBhbHJlYWR5QXBwcm92ZWQ6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGNsYXVkZURpciA9IHBhdGguam9pbihkaXIsIFwiLmNsYXVkZVwiKTtcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJzZXR0aW5ncy5qc29uXCIpO1xuICBjb25zdCBNQ1BfTkFNRSA9IFwicGF0aC10ZXJtaW5hbFwiO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhjbGF1ZGVEaXIpKSB7XG4gICAgZnMubWtkaXJTeW5jKGNsYXVkZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICBpZiAoZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgIGNvbnN0IGN1cnJlbnQ6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShleGlzdGluZy5lbmFibGVkTWNwanNvblNlcnZlcnMpID8gZXhpc3RpbmcuZW5hYmxlZE1jcGpzb25TZXJ2ZXJzIDogW107XG4gICAgICBpZiAoY3VycmVudC5pbmNsdWRlcyhNQ1BfTkFNRSkpIHtcbiAgICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UsIGFscmVhZHlBcHByb3ZlZDogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgZXhpc3RpbmcuZW5hYmxlZE1jcGpzb25TZXJ2ZXJzID0gWy4uLmN1cnJlbnQsIE1DUF9OQU1FXTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBKU09OLnN0cmluZ2lmeShleGlzdGluZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gICAgICByZXR1cm4geyB3cml0dGVuOiB0cnVlLCBtZXJnZWQ6IHRydWUsIGFscmVhZHlBcHByb3ZlZDogZmFsc2UgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBtZXJnZWQ6IGZhbHNlLCBhbHJlYWR5QXBwcm92ZWQ6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmlnID0ge1xuICAgIGVuYWJsZWRNY3Bqc29uU2VydmVyczogW01DUF9OQU1FXSxcbiAgfTtcbiAgZnMud3JpdGVGaWxlU3luYyhzZXR0aW5nc1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogZmFsc2UsIGFscmVhZHlBcHByb3ZlZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gd3JpdGVDbGF1ZGVSdWxlc0ZpbGUoZGlyOiBzdHJpbmcsIHJ1bGVzU291cmNlOiBzdHJpbmcgPSBSVUxFU19TT1VSQ0UsIGZhbGxiYWNrVXJsPzogc3RyaW5nKTogeyB3cml0dGVuOiBib29sZWFuOyBza2lwcGVkOiBib29sZWFuIH0ge1xuICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkaXIsIFwiQ0xBVURFLm1kXCIpO1xuXG4gIC8vIERvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBDTEFVREUubWQgXHUyMDE0IGl0IG1heSBoYXZlIGN1c3RvbSBpbnN0cnVjdGlvbnNcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGVzdFBhdGgpKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhkZXN0UGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBpZiAoY29udGVudC5pbmNsdWRlcyhcIlBhdGggVGVybWluYWwgU0RLXCIpKSB7XG4gICAgICByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgc2tpcHBlZDogdHJ1ZSB9O1xuICAgIH1cbiAgICAvLyBBcHBlbmQgdG8gZXhpc3RpbmcgQ0xBVURFLm1kXG4gICAgY29uc3QgcnVsZXMgPSBsb2FkUnVsZXNDb250ZW50KHJ1bGVzU291cmNlLCBmYWxsYmFja1VybCk7XG4gICAgaWYgKCFydWxlcykgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgZnMuYXBwZW5kRmlsZVN5bmMoZGVzdFBhdGgsIFwiXFxuXFxuXCIgKyBydWxlcywgXCJ1dGYtOFwiKTtcbiAgICByZXR1cm4geyB3cml0dGVuOiB0cnVlLCBza2lwcGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgcnVsZXMgPSBsb2FkUnVsZXNDb250ZW50KHJ1bGVzU291cmNlLCBmYWxsYmFja1VybCk7XG4gIGlmICghcnVsZXMpIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBza2lwcGVkOiBmYWxzZSB9O1xuICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBydWxlcywgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgc2tpcHBlZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gbG9hZFJ1bGVzQ29udGVudChydWxlc1NvdXJjZTogc3RyaW5nID0gUlVMRVNfU09VUkNFLCBmYWxsYmFja1VybD86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBsZXQgcmF3OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBpZiAoZnMuZXhpc3RzU3luYyhydWxlc1NvdXJjZSkpIHtcbiAgICByYXcgPSBmcy5yZWFkRmlsZVN5bmMocnVsZXNTb3VyY2UsIFwidXRmLThcIik7XG4gIH0gZWxzZSBpZiAoZmFsbGJhY2tVcmwpIHtcbiAgICB0cnkge1xuICAgICAgcmF3ID0gZXhlY1N5bmMoYGN1cmwgLXNmIC0tbWF4LXRpbWUgMTAgXCIke2ZhbGxiYWNrVXJsfVwiYCwgeyBlbmNvZGluZzogXCJ1dGYtOFwiIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuXG4gIC8vIFN0cmlwIHRoZSBZQU1MIGZyb250bWF0dGVyICgtLS0gLi4uIC0tLSkgdGhhdCBDdXJzb3IgdXNlc1xuICBjb25zdCBzdHJpcHBlZCA9IHJhdy5yZXBsYWNlKC9eLS0tW1xcc1xcU10qPy0tLVxccyovLCBcIlwiKTtcbiAgcmV0dXJuIHN0cmlwcGVkLnRyaW0oKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFNoYXJlZCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gY2hlY2tJbmZvUGxpc3QoZGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGxpc3RGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICBmdW5jdGlvbiBmaW5kUGxpc3RzKGQ6IHN0cmluZywgZGVwdGg6IG51bWJlciA9IDApIHtcbiAgICBpZiAoZGVwdGggPiA0KSByZXR1cm47XG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGQpO1xuICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoZSA9PT0gXCJub2RlX21vZHVsZXNcIiB8fCBlLnN0YXJ0c1dpdGgoXCIuXCIpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZ1bGwgPSBwYXRoLmpvaW4oZCwgZSk7XG4gICAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbCk7XG4gICAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSBmaW5kUGxpc3RzKGZ1bGwsIGRlcHRoICsgMSk7XG4gICAgICBlbHNlIGlmIChlID09PSBcIkluZm8ucGxpc3RcIikgcGxpc3RGaWxlcy5wdXNoKGZ1bGwpO1xuICAgIH1cbiAgfVxuXG4gIGZpbmRQbGlzdHMoZGlyKTtcblxuICBmb3IgKGNvbnN0IHBsaXN0IG9mIHBsaXN0RmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBsaXN0LCBcInV0Zi04XCIpO1xuICAgIGlmICghY29udGVudC5pbmNsdWRlcyhcIk5TQmx1ZXRvb3RoQWx3YXlzVXNhZ2VEZXNjcmlwdGlvblwiKSkge1xuICAgICAgaXNzdWVzLnB1c2gocGxpc3QpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc3N1ZXM7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBbmRyb2lkIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGZpbmRBbmRyb2lkUHJvamVjdChkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyLCBcInNldHRpbmdzLmdyYWRsZS5rdHNcIikpICYmXG4gICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXIsIFwiYXBwXCIsIFwiYnVpbGQuZ3JhZGxlLmt0c1wiKSk7XG59XG5cbmZ1bmN0aW9uIGhhc0FuZHJvaWRTREtEZXBlbmRlbmN5KGRpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENoZWNrIHNldHRpbmdzLmdyYWRsZS5rdHMgaGFzIEppdFBhY2sgcmVwb1xuICBjb25zdCBzZXR0aW5nc1BhdGggPSBwYXRoLmpvaW4oZGlyLCBcInNldHRpbmdzLmdyYWRsZS5rdHNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHNldHRpbmdzID0gZnMucmVhZEZpbGVTeW5jKHNldHRpbmdzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlcyhcImppdHBhY2suaW9cIikpIHJldHVybiBmYWxzZTtcbiAgLy8gQ2hlY2sgYnVpbGQuZ3JhZGxlLmt0cyBoYXMgdGhlIGRlcGVuZGVuY3kgdW5jb21tZW50ZWRcbiAgY29uc3QgYnVpbGRQYXRoID0gcGF0aC5qb2luKGRpciwgXCJhcHBcIiwgXCJidWlsZC5ncmFkbGUua3RzXCIpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoYnVpbGRQYXRoKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGJ1aWxkID0gZnMucmVhZEZpbGVTeW5jKGJ1aWxkUGF0aCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIC9eXFxzKmltcGxlbWVudGF0aW9uXFwoXCJjb21cXC5naXRodWJcXC5rZXltYW4xMlxcLnBhdGgtdGVybWluYWwtc2RrLWFuZHJvaWQ6cGF0aC10ZXJtaW5hbC1zZGsvbS50ZXN0KGJ1aWxkKTtcbn1cblxuZnVuY3Rpb24gaW5qZWN0Sml0UGFja1JlcG8oZGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKGRpciwgXCJzZXR0aW5ncy5ncmFkbGUua3RzXCIpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzZXR0aW5nc1BhdGgsIFwidXRmLThcIik7XG4gIGlmIChjb250ZW50LmluY2x1ZGVzKFwiaml0cGFjay5pb1wiKSkgcmV0dXJuIHRydWU7IC8vIGFscmVhZHkgcHJlc2VudFxuICAvLyBBZGQgaml0cGFjayBpbnNpZGUgZGVwZW5kZW5jeVJlc29sdXRpb25NYW5hZ2VtZW50IHJlcG9zaXRvcmllcyBibG9ja1xuICBjb25zdCByZXBvUmVnZXggPSAvKGRlcGVuZGVuY3lSZXNvbHV0aW9uTWFuYWdlbWVudFxccypcXHtbXn1dKnJlcG9zaXRvcmllc1xccypcXHspL3M7XG4gIGlmICghcmVwb1JlZ2V4LnRlc3QoY29udGVudCkpIHJldHVybiBmYWxzZTtcbiAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShyZXBvUmVnZXgsIGAkMVxcbiAgICAgICAgbWF2ZW4geyB1cmwgPSB1cmkoXCJodHRwczovL2ppdHBhY2suaW9cIikgfWApO1xuICBmcy53cml0ZUZpbGVTeW5jKHNldHRpbmdzUGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGluamVjdEdyYWRsZURlcGVuZGVuY2llcyhkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBidWlsZFBhdGggPSBwYXRoLmpvaW4oZGlyLCBcImFwcFwiLCBcImJ1aWxkLmdyYWRsZS5rdHNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhidWlsZFBhdGgpKSByZXR1cm4gZmFsc2U7XG4gIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGJ1aWxkUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAvLyBBbHJlYWR5IHByZXNlbnQgYW5kIHVuY29tbWVudGVkIFx1MjAxNCBub3RoaW5nIHRvIGRvXG4gIGlmICgvXlxccyppbXBsZW1lbnRhdGlvblxcKFwiY29tXFwuZ2l0aHViXFwua2V5bWFuMTJcXC5wYXRoLXRlcm1pbmFsLXNkay1hbmRyb2lkOnBhdGgtdGVybWluYWwtc2RrL20udGVzdChjb250ZW50KSkgcmV0dXJuIHRydWU7XG5cbiAgLy8gUHJlc2VudCBidXQgY29tbWVudGVkIG91dCBcdTIwMTQgdW5jb21tZW50IHRob3NlIGxpbmVzXG4gIGlmIChjb250ZW50LmluY2x1ZGVzKFwicGF0aC10ZXJtaW5hbC1zZGstYW5kcm9pZFwiKSkge1xuICAgIGNvbnRlbnQgPSBjb250ZW50XG4gICAgICAucmVwbGFjZSgvXlxccypcXC9cXC9cXHMqaW1wbGVtZW50YXRpb25cXChcImNvbVxcLmdpdGh1YlxcLmtleW1hbjEyXFwucGF0aC10ZXJtaW5hbC1zZGstYW5kcm9pZDpwYXRoLWNvcmUtbW9kZWxzW15cIl0qXCJcXCkvZ20sXG4gICAgICAgIGAgICAgaW1wbGVtZW50YXRpb24oXCIke0FORFJPSURfU0RLX0pJVFBBQ0tfR1JPVVB9OnBhdGgtY29yZS1tb2RlbHM6JHtBTkRST0lEX1NES19KSVRQQUNLX1ZFUlNJT059XCIpYClcbiAgICAgIC5yZXBsYWNlKC9eXFxzKlxcL1xcL1xccyppbXBsZW1lbnRhdGlvblxcKFwiY29tXFwuZ2l0aHViXFwua2V5bWFuMTJcXC5wYXRoLXRlcm1pbmFsLXNkay1hbmRyb2lkOnBhdGgtdGVybWluYWwtc2RrW15cIl0qXCJcXCkvZ20sXG4gICAgICAgIGAgICAgaW1wbGVtZW50YXRpb24oXCIke0FORFJPSURfU0RLX0pJVFBBQ0tfR1JPVVB9OnBhdGgtdGVybWluYWwtc2RrOiR7QU5EUk9JRF9TREtfSklUUEFDS19WRVJTSU9OfVwiKWApXG4gICAgICAucmVwbGFjZSgvXlxccypcXC9cXC9cXHMqaW1wbGVtZW50YXRpb25cXChcImNvbVxcLmdpdGh1YlxcLmtleW1hbjEyXFwucGF0aC10ZXJtaW5hbC1zZGstYW5kcm9pZDpwYXRoLWVtdWxhdG9yLWFkYXB0ZXJbXlwiXSpcIlxcKS9nbSxcbiAgICAgICAgYCAgICBpbXBsZW1lbnRhdGlvbihcIiR7QU5EUk9JRF9TREtfSklUUEFDS19HUk9VUH06cGF0aC1lbXVsYXRvci1hZGFwdGVyOiR7QU5EUk9JRF9TREtfSklUUEFDS19WRVJTSU9OfVwiKWApO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoYnVpbGRQYXRoLCBjb250ZW50LCBcInV0Zi04XCIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gTm90IHByZXNlbnQgYXQgYWxsIFx1MjAxNCBpbmplY3QgYWZ0ZXIgb3BlbmluZyBicmFjZVxuICBjb25zdCBkZXBzID0gW1xuICAgIGAgICAgaW1wbGVtZW50YXRpb24oXCIke0FORFJPSURfU0RLX0pJVFBBQ0tfR1JPVVB9OnBhdGgtY29yZS1tb2RlbHM6JHtBTkRST0lEX1NES19KSVRQQUNLX1ZFUlNJT059XCIpYCxcbiAgICBgICAgIGltcGxlbWVudGF0aW9uKFwiJHtBTkRST0lEX1NES19KSVRQQUNLX0dST1VQfTpwYXRoLXRlcm1pbmFsLXNkazoke0FORFJPSURfU0RLX0pJVFBBQ0tfVkVSU0lPTn1cIilgLFxuICAgIGAgICAgaW1wbGVtZW50YXRpb24oXCIke0FORFJPSURfU0RLX0pJVFBBQ0tfR1JPVVB9OnBhdGgtZW11bGF0b3ItYWRhcHRlcjoke0FORFJPSURfU0RLX0pJVFBBQ0tfVkVSU0lPTn1cIilgLFxuICBdLmpvaW4oXCJcXG5cIikgKyBcIlxcblwiO1xuICBjb25zdCBkZXBzUmVnZXggPSAvKGRlcGVuZGVuY2llc1xccypcXHspLztcbiAgaWYgKCFkZXBzUmVnZXgudGVzdChjb250ZW50KSkgcmV0dXJuIGZhbHNlO1xuICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGRlcHNSZWdleCwgYCQxXFxuJHtkZXBzfWApO1xuICBmcy53cml0ZUZpbGVTeW5jKGJ1aWxkUGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQW5kcm9pZE1hbmlmZXN0KGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gIGZ1bmN0aW9uIGZpbmRNYW5pZmVzdHMoZDogc3RyaW5nLCBkZXB0aDogbnVtYmVyID0gMCkge1xuICAgIGlmIChkZXB0aCA+IDQpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IGUgb2YgZnMucmVhZGRpclN5bmMoZCkpIHtcbiAgICAgIGlmIChlLnN0YXJ0c1dpdGgoXCIuXCIpIHx8IGUgPT09IFwiYnVpbGRcIikgY29udGludWU7XG4gICAgICBjb25zdCBmdWxsID0gcGF0aC5qb2luKGQsIGUpO1xuICAgICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGwpO1xuICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkgZmluZE1hbmlmZXN0cyhmdWxsLCBkZXB0aCArIDEpO1xuICAgICAgZWxzZSBpZiAoZSA9PT0gXCJBbmRyb2lkTWFuaWZlc3QueG1sXCIpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsLCBcInV0Zi04XCIpO1xuICAgICAgICBpZiAoIWNvbnRlbnQuaW5jbHVkZXMoXCJCTFVFVE9PVEhfU0NBTlwiKSkgaXNzdWVzLnB1c2goZnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZpbmRNYW5pZmVzdHMoZGlyKTtcbiAgcmV0dXJuIGlzc3Vlcztcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFdpbmRvd3MgaGVscGVycyAoLk5FVCBcdTIwMTQgV2luVUkgMyAvIC5ORVQgMTAgYW5kIFdQRiAvIC5ORVQgRlcgNC44KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLy8gQ29sbGVjdCAuY3Nwcm9qIGZpbGUgcGF0aHMgaW4gY3dkIGFuZCBvbmUgbGV2ZWwgZGVlcC5cbmZ1bmN0aW9uIGZpbmRDc3Byb2pGaWxlcyhkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZm91bmQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHdhbGsgPSAoZDogc3RyaW5nLCBkZXB0aDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKGRlcHRoID4gMSkgcmV0dXJuO1xuICAgIGxldCBlbnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkKTsgfSBjYXRjaCB7IHJldHVybjsgfVxuICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoZS5zdGFydHNXaXRoKFwiLlwiKSB8fCBlID09PSBcImJpblwiIHx8IGUgPT09IFwib2JqXCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZnVsbCA9IHBhdGguam9pbihkLCBlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0ID0gZnMuc3RhdFN5bmMoZnVsbCk7XG4gICAgICAgIGlmIChzdC5pc0RpcmVjdG9yeSgpKSB3YWxrKGZ1bGwsIGRlcHRoICsgMSk7XG4gICAgICAgIGVsc2UgaWYgKGUuZW5kc1dpdGgoXCIuY3Nwcm9qXCIpKSBmb3VuZC5wdXNoKGZ1bGwpO1xuICAgICAgfSBjYXRjaCB7IC8qIHNraXAgKi8gfVxuICAgIH1cbiAgfTtcbiAgd2FsayhkaXIsIDApO1xuICByZXR1cm4gZm91bmQ7XG59XG5cbi8vIEEgV2luZG93cyBwcm9qZWN0ID0gYSAuc2xuIG9yIGEgLmNzcHJvaiBpbiBjd2Qgb3Igb25lIGxldmVsIGRlZXAuXG5mdW5jdGlvbiBmaW5kV2luZG93c1Byb2plY3QoZGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG4gIHRyeSB7IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpOyB9IGNhdGNoIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChlbnRyaWVzLnNvbWUoKGUpID0+IGUuZW5kc1dpdGgoXCIuc2xuXCIpKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmaW5kQ3Nwcm9qRmlsZXMoZGlyKS5sZW5ndGggPiAwO1xufVxuXG4vLyBXaW4xMSA9IFdpblVJIDMgLyAuTkVUIDEwIChuZXQxMC4wLXdpbmRvd3MpOyBXaW4xMCA9IFdQRiAvIC5ORVQgRnJhbWV3b3JrIDQuOCAobmV0NDgpLlxuLy8gRGVmYXVsdCB0byBXaW5kb3dzIDExICh0aGUgbW9kZXJuIHN0YWNrKSB3aGVuIHRoZSBzaWduYWwgaXMgYW1iaWd1b3VzLlxuZnVuY3Rpb24gZGV0ZWN0V2luZG93c0ZsYXZvdXIoZGlyOiBzdHJpbmcpOiBcIndpbmRvd3MxMVwiIHwgXCJ3aW5kb3dzMTBcIiB7XG4gIGNvbnN0IGJsb2IgPSBmaW5kQ3Nwcm9qRmlsZXMoZGlyKS5tYXAoKGYpID0+IHtcbiAgICB0cnkgeyByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGYsIFwidXRmLThcIik7IH0gY2F0Y2ggeyByZXR1cm4gXCJcIjsgfVxuICB9KS5qb2luKFwiXFxuXCIpLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChibG9iLmluY2x1ZGVzKFwibmV0NDhcIikgfHwgYmxvYi5pbmNsdWRlcyhcIjx1c2V3cGY+dHJ1ZVwiKSB8fCBibG9iLmluY2x1ZGVzKFwidjQuOFwiKSkgcmV0dXJuIFwid2luZG93czEwXCI7XG4gIHJldHVybiBcIndpbmRvd3MxMVwiO1xufVxuXG5mdW5jdGlvbiBoYXNXaW5kb3dzU0RLRGVwZW5kZW5jeShkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmluZENzcHJvakZpbGVzKGRpcikuc29tZSgoZikgPT4ge1xuICAgIHRyeSB7IHJldHVybiAvUGF0aFxcLlRlcm1pbmFsXFwuU2RrLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhmLCBcInV0Zi04XCIpKTsgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfVxuICB9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN1bW1hcnkgaGVscGVycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gcGxhdGZvcm1MYWJlbChwbGF0Zm9ybTogUGxhdGZvcm0pOiBzdHJpbmcge1xuICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgY2FzZSBcImFuZHJvaWRcIjogcmV0dXJuIFwiQW5kcm9pZFwiO1xuICAgIGNhc2UgXCJ3aW5kb3dzMTFcIjogcmV0dXJuIFwiV2luZG93cyAxMSAoV2luVUkgMyAvIC5ORVQgMTApXCI7XG4gICAgY2FzZSBcIndpbmRvd3MxMFwiOiByZXR1cm4gXCJXaW5kb3dzIDEwIChXUEYgLyAuTkVUIEZXIDQuOClcIjtcbiAgICBkZWZhdWx0OiByZXR1cm4gXCJpT1NcIjtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFN1bW1hcnkoYWdlbnQ6IEFnZW50VHlwZSwgcGxhdGZvcm06IFBsYXRmb3JtLCBhY3Rpb25zOiBzdHJpbmdbXSwgd2FybmluZ3M6IHN0cmluZ1tdLCBtYW51YWxTdGVwczogc3RyaW5nW10pIHtcbiAgY29uc3QgaXNBbmRyb2lkID0gcGxhdGZvcm0gPT09IFwiYW5kcm9pZFwiO1xuICBjb25zdCBpc1dpbmRvd3MgPSBwbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzMTFcIiB8fCBwbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzMTBcIjtcbiAgY29uc29sZS5sb2coXCJcXG5cIiArIGNoYWxrLmJvbGQoXCJcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcIikpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGAgIFBhdGggVGVybWluYWwgU0RLIFx1MjAxNCBTZXR1cCBDb21wbGV0ZSAoJHtwbGF0Zm9ybUxhYmVsKHBsYXRmb3JtKX0pYCkpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXFxuXCIpKTtcblxuICBpZiAoYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJcdTI3MTMgRG9uZTpcIikpO1xuICAgIGFjdGlvbnMuZm9yRWFjaCgoYSkgPT4gY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCAgXHUyMDIyICR7YX1gKSkpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gIH1cblxuICBpZiAobWFudWFsU3RlcHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIlx1MjZBMCBNYW51YWwgc3RlcHMgcmVxdWlyZWQ6XCIpKTtcbiAgICBtYW51YWxTdGVwcy5mb3JFYWNoKChzLCBpKSA9PiBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCAgJHtpICsgMX0uICR7c31gKSkpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gIH1cblxuICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlx1MjEzOSBOb3RlczpcIikpO1xuICAgIHdhcm5pbmdzLmZvckVhY2goKHcpID0+IGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBcdTIwMjIgJHt3fWApKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfVxuXG4gIC8vIENhbm9uaWNhbCBmaXJzdC1wcm9tcHQgdGV4dCBcdTIwMTQgaWRlbnRpY2FsIGZvciBDbGF1ZGUgQ29kZSBhbmQgQ3Vyc29yIHNvIHRoZVxuICAvLyBhZ2VudCByZWNlaXZlcyB0aGUgc2FtZSBkaXJlY3RpdmUgcmVnYXJkbGVzcyBvZiB0aGUgZGV2ZWxvcGVyJ3MgSURFLlxuICBjb25zdCBtY3BQcm9tcHQgPVxuICAgIHBsYXRmb3JtID09PSBcImFuZHJvaWRcIiA/IFwiaW50ZWdyYXRlLXBhdGgtYW5kcm9pZFwiIDpcbiAgICBwbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzMTFcIiA/IFwiaW50ZWdyYXRlLXBhdGgtd2luZG93czExXCIgOlxuICAgIHBsYXRmb3JtID09PSBcIndpbmRvd3MxMFwiID8gXCJpbnRlZ3JhdGUtcGF0aC13aW5kb3dzMTBcIiA6XG4gICAgXCJpbnRlZ3JhdGUtcGF0aC1zYWxlXCI7XG4gIGNvbnN0IGZpcnN0UHJvbXB0ID1cbiAgICAnICBcIkludGVncmF0ZSB0aGUgUGF0aCBUZXJtaW5hbCBTREsgaW50byB0aGlzIEVQT1MgYXBwLiBSZWFkIENMQVVERS5tZFxcbicgK1xuICAgICcgICBmb3IgdGhlIGludGVncmF0aW9uIHJ1bGVzLCB0aGVuIHVzZSB0aGUgUGF0aCBNQ1AgJyArIG1jcFByb21wdCArICdcXG4nICtcbiAgICAnICAgcHJvbXB0IHRvIGFkZCBhIFBhdGggUE9TIEFkYXB0ZXIgaW4gU2V0dGluZ3MgXHUyMDE0IGEgYmFja2VuZCBzd2l0Y2hlciBmb3IgdGhlXFxuJyArXG4gICAgJyAgIFBhdGggUE9TIEVtdWxhdG9yIChXaS1GaS9JUCBvciBCbHVldG9vdGgpIGFuZCBhIHJlYWwgVmVyaWZvbmUgdGVybWluYWwuXCInO1xuXG4gIGlmIChhZ2VudCA9PT0gXCJjbGF1ZGVcIikge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJcdUQ4M0RcdURFODAgU3RhcnQgQ2xhdWRlIENvZGUgaW4gdGhpcyBkaXJlY3Rvcnk6XCIpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICBjbGF1ZGUgLS1tb2RlbCBzb25uZXRcIikpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIiAgVGhlbiBwYXN0ZSB0aGlzIHByb21wdDpcIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oZmlyc3RQcm9tcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiXHVEODNEXHVERTgwIFlvdXIgZmlyc3QgcHJvbXB0IGluIEN1cnNvcjpcIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oZmlyc3RQcm9tcHQpKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBNQ1Agc2VydmVyOiAke01DUF9TRVJWRVJfVVJMfWApKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiICBEb2NzOiAgICAgICBodHRwczovL21jcC5wYXRoMmFpLnRlY2gvaGVhbHRoXCIpKTtcbiAgY29uc29sZS5sb2coKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIE1haW4gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbnByb2dyYW1cbiAgLm5hbWUoXCJwYXRoLXRlcm1pbmFsLWluaXRcIilcbiAgLmRlc2NyaXB0aW9uKFxuICAgIFwiU2V0IHVwIHRoZSBQYXRoIFRlcm1pbmFsIFNESyBpbnRlZ3JhdGlvbiBhc3Npc3RhbnQgZm9yIHlvdXIgRVBPUyBwcm9qZWN0LlxcblwiICtcbiAgICAgIFwiQXV0by1kZXRlY3RzIHBsYXRmb3JtIChpT1MsIEFuZHJvaWQsIG9yIFdpbmRvd3MpIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxcblwiICtcbiAgICAgIFwiQ29uZmlndXJlcyBNQ1Agc2VydmVyIGFjY2VzcywgZHJvcHMgdGhlIGludGVncmF0aW9uIHJlY2lwZSwgYW5kIG9wdGlvbmFsbHlcXG5cIiArXG4gICAgICBcImFkZHMgdGhlIFNESyBkZXBlbmRlbmN5LlxcblxcblwiICtcbiAgICAgIFwiU3VwcG9ydGVkIGFnZW50czogY2xhdWRlIChkZWZhdWx0KSwgY3Vyc29yXFxuXCIgK1xuICAgICAgXCJTdXBwb3J0ZWQgcGxhdGZvcm1zOiBpb3MgKGRlZmF1bHQpLCBhbmRyb2lkLCB3aW5kb3dzMTEgKFdpblVJIDMgLyAuTkVUIDEwKSxcXG5cIiArXG4gICAgICBcIndpbmRvd3MxMCAoV1BGIC8gLk5FVCBGVyA0LjgpLiBVc2UgJ3dpbmRvd3MnIHRvIGF1dG8tcGljayB0aGUgV2luZG93cyBmbGF2b3VyLlwiXG4gIClcbiAgLnZlcnNpb24oXCIwLjIuMFwiKVxuICAub3B0aW9uKFwiLS10b29scy1vbmx5XCIsIFwiT25seSBjb25maWd1cmUgTUNQICsgcnVsZXMuIFNraXAgU0RLIGluc3RhbGxhdGlvbi5cIilcbiAgLm9wdGlvbihcIi0tYWdlbnQgPG5hbWU+XCIsIFwiQUkgYWdlbnQgdG8gY29uZmlndXJlOiAnY2xhdWRlJyAoZGVmYXVsdCkgb3IgJ2N1cnNvcicuXCIsIFwiY2xhdWRlXCIpXG4gIC5vcHRpb24oXCItLXBsYXRmb3JtIDxuYW1lPlwiLCBcIlBsYXRmb3JtOiBpb3MgfCBhbmRyb2lkIHwgd2luZG93cyB8IHdpbmRvd3MxMSB8IHdpbmRvd3MxMC4gQXV0by1kZXRlY3RlZCBpZiBub3Qgc3BlY2lmaWVkLlwiKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgdG9vbHNPbmx5OiBib29sZWFuID0gb3B0aW9ucy50b29sc09ubHkgPz8gZmFsc2U7XG4gICAgY29uc3QgYWdlbnQ6IEFnZW50VHlwZSA9IChvcHRpb25zLmFnZW50ID8/IFwiY2xhdWRlXCIpIGFzIEFnZW50VHlwZTtcbiAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgLy8gQXV0by1kZXRlY3QgcGxhdGZvcm0uIE9yZGVyOiBBbmRyb2lkIChHcmFkbGUpIFx1MjE5MiBXaW5kb3dzICguY3Nwcm9qLy5zbG4pIFx1MjE5MiBpT1MgKGRlZmF1bHQpLlxuICAgIGNvbnN0IHJhd1BsYXRmb3JtOiBzdHJpbmcgPSBvcHRpb25zLnBsYXRmb3JtID8/IFwiYXV0b1wiO1xuICAgIGNvbnN0IFZBTElEX1BMQVRGT1JNUyA9IFtcImlvc1wiLCBcImFuZHJvaWRcIiwgXCJ3aW5kb3dzXCIsIFwid2luZG93czExXCIsIFwid2luZG93czEwXCJdO1xuICAgIGxldCBwbGF0Zm9ybTogUGxhdGZvcm07XG4gICAgaWYgKHJhd1BsYXRmb3JtID09PSBcImF1dG9cIiB8fCAhVkFMSURfUExBVEZPUk1TLmluY2x1ZGVzKHJhd1BsYXRmb3JtKSkge1xuICAgICAgaWYgKGZpbmRBbmRyb2lkUHJvamVjdChjd2QpKSBwbGF0Zm9ybSA9IFwiYW5kcm9pZFwiO1xuICAgICAgZWxzZSBpZiAoZmluZFdpbmRvd3NQcm9qZWN0KGN3ZCkpIHBsYXRmb3JtID0gZGV0ZWN0V2luZG93c0ZsYXZvdXIoY3dkKTtcbiAgICAgIGVsc2UgcGxhdGZvcm0gPSBcImlvc1wiO1xuICAgIH0gZWxzZSBpZiAocmF3UGxhdGZvcm0gPT09IFwid2luZG93c1wiKSB7XG4gICAgICAvLyBFeHBsaWNpdCBXaW5kb3dzLCBidXQgbGV0IHRoZSAuY3Nwcm9qIGRlY2lkZSBXaW4xMSAoV2luVUkgMykgdnMgV2luMTAgKFdQRikuXG4gICAgICBwbGF0Zm9ybSA9IGRldGVjdFdpbmRvd3NGbGF2b3VyKGN3ZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBsYXRmb3JtID0gcmF3UGxhdGZvcm0gYXMgUGxhdGZvcm07XG4gICAgfVxuICAgIGNvbnN0IGlzQW5kcm9pZCA9IHBsYXRmb3JtID09PSBcImFuZHJvaWRcIjtcbiAgICBjb25zdCBpc1dpbmRvd3MgPSBwbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzMTFcIiB8fCBwbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzMTBcIjtcblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIiAgUGF0aCBUZXJtaW5hbCBTREsgXHUyMDE0IEludGVncmF0aW9uIEFzc2lzdGFudCBTZXR1cFwiKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiICBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBBZ2VudDogICAgJHthZ2VudH1gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFBsYXRmb3JtOiAke3BsYXRmb3JtfSR7b3B0aW9ucy5wbGF0Zm9ybSA/IFwiXCIgOiBcIiAoYXV0by1kZXRlY3RlZClcIn1gKSk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIGlmIChhZ2VudCAhPT0gXCJjdXJzb3JcIiAmJiBhZ2VudCAhPT0gXCJjbGF1ZGVcIikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgXHUyNkEwIEFnZW50ICcke2FnZW50fScgaXMgbm90IHN1cHBvcnRlZC4gVXNlICdjdXJzb3InIG9yICdjbGF1ZGUnLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG1hbnVhbFN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIDEuIFNESyBpbnN0YWxsYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgaWYgKCF0b29sc09ubHkpIHtcbiAgICAgIGlmIChpc0FuZHJvaWQpIHtcbiAgICAgICAgLy8gXHUyNTAwXHUyNTAwIEFuZHJvaWQ6IEppdFBhY2sgKyBHcmFkbGUgXHUyNTAwXHUyNTAwXG4gICAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoXCJDaGVja2luZyBBbmRyb2lkIHByb2plY3RcdTIwMjZcIikuc3RhcnQoKTtcblxuICAgICAgICBpZiAoIWZpbmRBbmRyb2lkUHJvamVjdChjd2QpKSB7XG4gICAgICAgICAgc3Bpbm5lci53YXJuKFwiTm8gQW5kcm9pZCBwcm9qZWN0IGZvdW5kIChzZXR0aW5ncy5ncmFkbGUua3RzIG9yIGFwcC9idWlsZC5ncmFkbGUua3RzIG1pc3NpbmcpLlwiKTtcbiAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBhc2soXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXCIgIENvbnRpbnVlIHdpdGggdG9vbHMtb25seSBzZXR1cD8gKHkvbik6IFwiKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGFuc3dlci50b0xvd2VyQ2FzZSgpICE9PSBcInlcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiXFxuICBSdW4gdGhpcyBmcm9tIHlvdXIgQW5kcm9pZCBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LlxcblwiKSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdhcm5pbmdzLnB1c2goXCJSYW4gaW4gdG9vbHMtb25seSBtb2RlIFx1MjAxNCBubyBBbmRyb2lkIHByb2plY3QgZm91bmQuXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGhhc0FuZHJvaWRTREtEZXBlbmRlbmN5KGN3ZCkpIHtcbiAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJQYXRoIFRlcm1pbmFsIFNESyBhbHJlYWR5IHByZXNlbnQgaW4gc2V0dGluZ3MuZ3JhZGxlLmt0cy5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwiU0RLIGRlcGVuZGVuY3kgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcGlubmVyLnRleHQgPSBcIkFkZGluZyBKaXRQYWNrIHJlcG9zaXRvcnkgdG8gc2V0dGluZ3MuZ3JhZGxlLmt0c1x1MjAyNlwiO1xuICAgICAgICAgIGNvbnN0IHNldHRpbmdzT2sgPSBpbmplY3RKaXRQYWNrUmVwbyhjd2QpO1xuICAgICAgICAgIGNvbnN0IGRlcHNPayA9IGluamVjdEdyYWRsZURlcGVuZGVuY2llcyhjd2QpO1xuXG4gICAgICAgICAgaWYgKHNldHRpbmdzT2spIHtcbiAgICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIkppdFBhY2sgcmVwb3NpdG9yeSBhZGRlZCB0byBzZXR0aW5ncy5ncmFkbGUua3RzLlwiKTtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChcIkppdFBhY2sgcmVwb3NpdG9yeSBhZGRlZCB0byBzZXR0aW5ncy5ncmFkbGUua3RzXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVwc09rKSB7XG4gICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJTREsgZGVwZW5kZW5jaWVzIGFkZGVkIHRvIGFwcC9idWlsZC5ncmFkbGUua3RzLlwiKTtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChcInBhdGgtdGVybWluYWwtc2RrICsgcGF0aC1lbXVsYXRvci1hZGFwdGVyIGFkZGVkIHRvIGFwcC9idWlsZC5ncmFkbGUua3RzXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzcGlubmVyLndhcm4oXCJDb3VsZCBub3QgYXV0by1pbmplY3QgZGVwZW5kZW5jaWVzIGludG8gYXBwL2J1aWxkLmdyYWRsZS5rdHMuXCIpO1xuICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgYEFkZCB0byBhcHAvYnVpbGQuZ3JhZGxlLmt0cyBkZXBlbmRlbmNpZXMge306XFxuYCArXG4gICAgICAgICAgICAgIGAgICAgIGltcGxlbWVudGF0aW9uKFwiJHtBTkRST0lEX1NES19KSVRQQUNLX0dST1VQfTpwYXRoLXRlcm1pbmFsLXNkazoke0FORFJPSURfU0RLX0pJVFBBQ0tfVkVSU0lPTn1cIilcXG5gICtcbiAgICAgICAgICAgICAgYCAgICAgaW1wbGVtZW50YXRpb24oXCIke0FORFJPSURfU0RLX0pJVFBBQ0tfR1JPVVB9OnBhdGgtZW11bGF0b3ItYWRhcHRlcjoke0FORFJPSURfU0RLX0pJVFBBQ0tfVkVSU0lPTn1cIilgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1dpbmRvd3MpIHtcbiAgICAgICAgLy8gXHUyNTAwXHUyNTAwIFdpbmRvd3M6IFByb2plY3RSZWZlcmVuY2UgdG8gdGhlIHNpYmxpbmcgU0RLIFx1MjUwMFx1MjUwMFxuICAgICAgICBjb25zdCBzcGlubmVyID0gb3JhKFwiQ2hlY2tpbmcgV2luZG93cyAoLk5FVCkgcHJvamVjdFx1MjAyNlwiKS5zdGFydCgpO1xuICAgICAgICBpZiAoIWZpbmRXaW5kb3dzUHJvamVjdChjd2QpKSB7XG4gICAgICAgICAgc3Bpbm5lci53YXJuKFwiTm8gV2luZG93cyBwcm9qZWN0IGZvdW5kICguc2xuIG9yIC5jc3Byb2opLlwiKTtcbiAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBhc2soY2hhbGsueWVsbG93KFwiICBDb250aW51ZSB3aXRoIHRvb2xzLW9ubHkgc2V0dXA/ICh5L24pOiBcIikpO1xuICAgICAgICAgIGlmIChhbnN3ZXIudG9Mb3dlckNhc2UoKSAhPT0gXCJ5XCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlxcbiAgUnVuIHRoaXMgZnJvbSB5b3VyIFdpbmRvd3MgRVBPUyBwcm9qZWN0IHJvb3QuXFxuXCIpKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgd2FybmluZ3MucHVzaChcIlJhbiBpbiB0b29scy1vbmx5IG1vZGUgXHUyMDE0IG5vIFdpbmRvd3MgcHJvamVjdCBmb3VuZC5cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzV2luZG93c1NES0RlcGVuZGVuY3koY3dkKSkge1xuICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIlBhdGggVGVybWluYWwgU0RLIGFscmVhZHkgcmVmZXJlbmNlZCBpbiB0aGUgcHJvamVjdC5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwiU0RLIFByb2plY3RSZWZlcmVuY2UgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcGlubmVyLmluZm8oXCJQYXRoIFNESyBpcyB3aXJlZCBieSBQcm9qZWN0UmVmZXJlbmNlIFx1MjAxNCB0aGUgaW50ZWdyYXRpb24gcmVjaXBlIChTdGVwIDApIGRvZXMgdGhpcy5cIik7XG4gICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgIGBBZGQgdGhlIFBhdGggU0RLIFByb2plY3RSZWZlcmVuY2VzIHRvIHlvdXIgLmNzcHJvaiBcdTIwMTQgdGhlIGludGVncmF0aW9uIHJlY2lwZSdzIFN0ZXAgMCBsaXN0cyBhbGwgc2l4IGAgK1xuICAgICAgICAgICAgYChDb3JlTW9kZWxzLCBTZGssIEVtdWxhdG9yQWRhcHRlciwgTW9ja0FkYXB0ZXIsIERpYWdub3N0aWNzLCBQc2RrQWRhcHRlcikuIGAgK1xuICAgICAgICAgICAgYENsb25lICR7V0lORE9XU19TREtfUkVQT30gYXMgYSBTSUJMSU5HIGZvbGRlciBvZiB0aGlzIHByb2plY3QgZmlyc3QuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFx1MjUwMFx1MjUwMCBpT1M6IFNQTSAvIFhjb2RlIFx1MjUwMFx1MjUwMFxuICAgICAgICBjb25zdCBzcGlubmVyID0gb3JhKFwiQ2hlY2tpbmcgZm9yIFhjb2RlIHByb2plY3RcdTIwMjZcIikuc3RhcnQoKTtcblxuICAgICAgICBjb25zdCB4Y29kZVByb2plY3QgPSBmaW5kWGNvZGVQcm9qZWN0KGN3ZCk7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VTd2lmdCA9IGZpbmRQYWNrYWdlU3dpZnQoY3dkKTtcblxuICAgICAgICBpZiAocGFja2FnZVN3aWZ0KSB7XG4gICAgICAgICAgc3Bpbm5lci50ZXh0ID0gXCJGb3VuZCBQYWNrYWdlLnN3aWZ0IFx1MjAxNCBhZGRpbmcgUGF0aFRlcm1pbmFsU0RLIGRlcGVuZGVuY3lcdTIwMjZcIjtcbiAgICAgICAgICBpZiAoaGFzU0RLRGVwZW5kZW5jeShwYWNrYWdlU3dpZnQpKSB7XG4gICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJQYXRoVGVybWluYWxTREsgYWxyZWFkeSBwcmVzZW50IGluIFBhY2thZ2Uuc3dpZnQuXCIpO1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKFwiUGF0aFRlcm1pbmFsU0RLIGRlcGVuZGVuY3kgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5qZWN0ZWQgPSBpbmplY3RTUE1EZXBlbmRlbmN5KHBhY2thZ2VTd2lmdCk7XG4gICAgICAgICAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiUGF0aFRlcm1pbmFsU0RLIGFkZGVkIHRvIFBhY2thZ2Uuc3dpZnQuXCIpO1xuICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goXCJQYXRoVGVybWluYWxTREsgYWRkZWQgdG8gUGFja2FnZS5zd2lmdFwiKTtcbiAgICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgICBgT3BlbiBYY29kZSBhbmQgbGluayBhbGwgdGhyZWUgdGFyZ2V0cyB0byB5b3VyIGFwcDogUGF0aFRlcm1pbmFsU0RLLCBQYXRoRW11bGF0b3JBZGFwdGVyLCBQYXRoQ29yZU1vZGVscy5gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzcGlubmVyLndhcm4oXCJDb3VsZCBub3QgYXV0b21hdGljYWxseSBtb2RpZnkgUGFja2FnZS5zd2lmdCBcdTIwMTQgbWFudWFsIHN0ZXAgcmVxdWlyZWQuXCIpO1xuICAgICAgICAgICAgICBtYW51YWxTdGVwcy5wdXNoKFxuICAgICAgICAgICAgICAgIGBBZGQgUGF0aFRlcm1pbmFsU0RLIG1hbnVhbGx5IHRvIFBhY2thZ2Uuc3dpZnQ6XFxuYCArXG4gICAgICAgICAgICAgICAgICBgICAgICAucGFja2FnZSh1cmw6IFwiJHtTREtfR0lUSFVCX1VSTH1cIiwgZnJvbTogXCIke1NES19WRVJTSU9OfVwiKWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoeGNvZGVQcm9qZWN0KSB7XG4gICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKGBGb3VuZCBYY29kZSBwcm9qZWN0OiAke3BhdGguYmFzZW5hbWUoeGNvZGVQcm9qZWN0KX1gKTtcbiAgICAgICAgICBpZiAoaGFzWGNvZGVQcm9qZWN0U0RLRGVwZW5kZW5jeSh4Y29kZVByb2plY3QpKSB7XG4gICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJQYXRoVGVybWluYWxTREsgYWxyZWFkeSBwcmVzZW50IGluIFhjb2RlIHByb2plY3QuXCIpO1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKFwiUGF0aFRlcm1pbmFsU0RLIGRlcGVuZGVuY3kgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBcIlxcbiAgXHUyNkEwIEF1dG9tYXRpYyBTUE0gaW5qZWN0aW9uIGludG8gLnhjb2RlcHJvaiBpcyBub3Qgc3VwcG9ydGVkIChYY29kZSBtYW5hZ2VzIHRoaXMpLlwiXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiXFxuICBUbyBhZGQgUGF0aFRlcm1pbmFsU0RLIGluIFhjb2RlOlwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiAgMS4gT3BlbiB5b3VyIHByb2plY3QgaW4gWGNvZGVcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiAgMi4gRmlsZSBcdTIxOTIgQWRkIFBhY2thZ2UgRGVwZW5kZW5jaWVzXHUyMDI2XCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgMy4gRW50ZXIgVVJMOiAke2NoYWxrLmN5YW4oU0RLX0dJVEhVQl9VUkwpfWApO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIFwiICA0LiBJbiB0aGUgJ0Nob29zZSBQYWNrYWdlIFByb2R1Y3RzJyBkaWFsb2csIHNldCBhbGwgdGhyZWUgdG8geW91ciBhcHAgdGFyZ2V0OlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihcIiAgICAgICBQYXRoVGVybWluYWxTREsgICAgXHUyMTkyIHlvdXIgYXBwIHRhcmdldFwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICAgICAgIFBhdGhFbXVsYXRvckFkYXB0ZXIgXHUyMTkyIHlvdXIgYXBwIHRhcmdldFwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICAgICAgIFBhdGhDb3JlTW9kZWxzICAgICAgXHUyMTkyIHlvdXIgYXBwIHRhcmdldFwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCIgICAgIChQYXRoRGlhZ25vc3RpY3MgY2FuIGJlIGxlZnQgYXMgTm9uZSlcIikpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCIgIDUuIENsaWNrIEFkZCBQYWNrYWdlXFxuXCIpO1xuICAgICAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgYXNrKFxuICAgICAgICAgICAgICBjaGFsay5ib2xkKFwiICBQcmVzcyBFbnRlciBvbmNlIHlvdSBoYXZlIGFkZGVkIHRoZSBwYWNrYWdlLCBvciB0eXBlICdza2lwJyB0byBkbyB0aGlzIGxhdGVyOiBcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY29uZmlybWVkLnRvTG93ZXJDYXNlKCkgIT09IFwic2tpcFwiKSB7XG4gICAgICAgICAgICAgIGFjdGlvbnMucHVzaChgUGF0aFRlcm1pbmFsU0RLIGFkZGVkIHRvIFhjb2RlIHByb2plY3QgKGNvbmZpcm1lZCBieSB1c2VyKWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgICBgQWRkIFBhdGhUZXJtaW5hbFNESyB2aWEgWGNvZGU6IEZpbGUgXHUyMTkyIEFkZCBQYWNrYWdlIERlcGVuZGVuY2llcyBcdTIxOTIgJHtTREtfR0lUSFVCX1VSTH1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNwaW5uZXIud2FybihcIk5vIFhjb2RlIHByb2plY3QgZm91bmQgaW4gY3VycmVudCBkaXJlY3RvcnkuXCIpO1xuICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGFzayhcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgXCIgIE5vIC54Y29kZXByb2ogb3IgUGFja2FnZS5zd2lmdCBmb3VuZC4gQ29udGludWUgd2l0aCB0b29scy1vbmx5IHNldHVwPyAoeS9uKTogXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChhbnN3ZXIudG9Mb3dlckNhc2UoKSAhPT0gXCJ5XCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay5kaW0oXCJcXG4gIFJ1biB0aGlzIGNvbW1hbmQgZnJvbSB5b3VyIFhjb2RlIHByb2plY3QgZGlyZWN0b3J5LCBvciB1c2UgLS10b29scy1vbmx5LlxcblwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgd2FybmluZ3MucHVzaChcIlJhbiBpbiB0b29scy1vbmx5IG1vZGUgXHUyMDE0IG5vIFhjb2RlIHByb2plY3QgZm91bmQuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGlvbnMucHVzaChcIlNraXBwZWQgU0RLIGluc3RhbGxhdGlvbiAoLS10b29scy1vbmx5IG1vZGUpXCIpO1xuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCAyLiBNQ1AgY29uZmlnIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoXCJXcml0aW5nIE1DUCBzZXJ2ZXIgY29uZmlnXHUyMDI2XCIpLnN0YXJ0KCk7XG5cbiAgICAgIGxldCByZXN1bHQ6IHsgd3JpdHRlbjogYm9vbGVhbjsgbWVyZ2VkOiBib29sZWFuIH07XG4gICAgICBsZXQgY29uZmlnRmlsZTogc3RyaW5nO1xuXG4gICAgICBpZiAoYWdlbnQgPT09IFwiY2xhdWRlXCIpIHtcbiAgICAgICAgcmVzdWx0ID0gd3JpdGVDbGF1ZGVNY3BDb25maWcoY3dkKTtcbiAgICAgICAgY29uZmlnRmlsZSA9IFwiLm1jcC5qc29uXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB3cml0ZUN1cnNvck1jcENvbmZpZyhjd2QpO1xuICAgICAgICBjb25maWdGaWxlID0gXCIuY3Vyc29yL21jcC5qc29uXCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQud3JpdHRlbiAmJiByZXN1bHQubWVyZ2VkKSB7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZChgTUNQIGNvbmZpZyBtZXJnZWQgaW50byBleGlzdGluZyAke2NvbmZpZ0ZpbGV9LmApO1xuICAgICAgICBhY3Rpb25zLnB1c2goYHBhdGgtdGVybWluYWwgZW50cnkgbWVyZ2VkIGludG8gJHtjb25maWdGaWxlfWApO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQud3JpdHRlbikge1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoYE1DUCBjb25maWcgd3JpdHRlbiB0byAke2NvbmZpZ0ZpbGV9LmApO1xuICAgICAgICBhY3Rpb25zLnB1c2goYE1DUCBzZXJ2ZXIgY29uZmlndXJlZDogJHtjb25maWdGaWxlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bpbm5lci5pbmZvKFwiTUNQIGNvbmZpZyBhbHJlYWR5IHByZXNlbnQgXHUyMDE0IG5vIGNoYW5nZSBuZWVkZWQuXCIpO1xuICAgICAgICBhY3Rpb25zLnB1c2goXCJNQ1AgY29uZmlnIGFscmVhZHkgcHJlc2VudCBcdTIwMTQgbm8gY2hhbmdlIG5lZWRlZC5cIik7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBDbGF1ZGUgQ29kZSwgYWxzbyBwcmUtYXBwcm92ZSB0aGUgTUNQIHNlcnZlciBpbiAuY2xhdWRlL3NldHRpbmdzLmpzb24uXG4gICAgICAvLyBXaXRob3V0IHRoaXMsIENsYXVkZSBDb2RlIHNob3dzIGFuIGludGVyYWN0aXZlIFwiQWxsb3cgdGhpcyBNQ1Agc2VydmVyP1wiXG4gICAgICAvLyBwcm9tcHQgb24gZmlyc3QgbGF1bmNoIFx1MjAxNCBlYXN5IHRvIG1pc3MsIGFuZCB0aGUgYWdlbnQgZW5kcyB1cCBydW5uaW5nXG4gICAgICAvLyB3aXRob3V0IE1DUCB0b29scyBpZiB0aGUgdXNlciBkaXNtaXNzZXMgaXQuXG4gICAgICBpZiAoYWdlbnQgPT09IFwiY2xhdWRlXCIpIHtcbiAgICAgICAgY29uc3QgYXBwcm92ZVNwaW5uZXIgPSBvcmEoXCJQcmUtYXBwcm92aW5nIFBhdGggTUNQIHNlcnZlciBmb3IgQ2xhdWRlIENvZGVcdTIwMjZcIikuc3RhcnQoKTtcbiAgICAgICAgY29uc3QgYXBwcm92ZSA9IHdyaXRlQ2xhdWRlU2V0dGluZ3MoY3dkKTtcbiAgICAgICAgaWYgKGFwcHJvdmUuYWxyZWFkeUFwcHJvdmVkKSB7XG4gICAgICAgICAgYXBwcm92ZVNwaW5uZXIuaW5mbyhcIlBhdGggTUNQIHNlcnZlciBhbHJlYWR5IHByZS1hcHByb3ZlZCBcdTIwMTQgbm8gY2hhbmdlIG5lZWRlZC5cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoYXBwcm92ZS53cml0dGVuICYmIGFwcHJvdmUubWVyZ2VkKSB7XG4gICAgICAgICAgYXBwcm92ZVNwaW5uZXIuc3VjY2VlZChcInBhdGgtdGVybWluYWwgYWRkZWQgdG8gZXhpc3RpbmcgLmNsYXVkZS9zZXR0aW5ncy5qc29uLlwiKTtcbiAgICAgICAgICBhY3Rpb25zLnB1c2goXCJwYXRoLXRlcm1pbmFsIHByZS1hcHByb3ZlZCBpbiAuY2xhdWRlL3NldHRpbmdzLmpzb25cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoYXBwcm92ZS53cml0dGVuKSB7XG4gICAgICAgICAgYXBwcm92ZVNwaW5uZXIuc3VjY2VlZChcIlByZS1hcHByb3ZhbCB3cml0dGVuIHRvIC5jbGF1ZGUvc2V0dGluZ3MuanNvbi5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwiQ2xhdWRlIENvZGUgcHJlLWFwcHJvdmFsOiAuY2xhdWRlL3NldHRpbmdzLmpzb25cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXBwcm92ZVNwaW5uZXIud2FybihcIkNvdWxkIG5vdCB3cml0ZSAuY2xhdWRlL3NldHRpbmdzLmpzb24gXHUyMDE0IHlvdSBtYXkgc2VlIGFuIFxcXCJBbGxvdyBNQ1Agc2VydmVyP1xcXCIgcHJvbXB0IG9uIGZpcnN0IENsYXVkZSBDb2RlIGxhdW5jaC4gQWNjZXB0IGl0LlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCAzLiBSdWxlcyBmaWxlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoYFdyaXRpbmcgJHthZ2VudCA9PT0gXCJjbGF1ZGVcIiA/IFwiQ0xBVURFLm1kXCIgOiBcIkN1cnNvciBydWxlc1wifSBmaWxlXHUyMDI2YCkuc3RhcnQoKTtcblxuICAgICAgbGV0IHJlc3VsdDogeyB3cml0dGVuOiBib29sZWFuOyBza2lwcGVkOiBib29sZWFuIH07XG4gICAgICBsZXQgcnVsZXNGaWxlOiBzdHJpbmc7XG5cbiAgICAgIC8vIFBlci1wbGF0Zm9ybSByZWNpcGUgc291cmNlICsgZmV0Y2ggVVJMICsgZmlsZW5hbWUuXG4gICAgICBjb25zdCBydWxlc0J5UGxhdGZvcm0gPSB7XG4gICAgICAgIGlvczogICAgICAgeyBzcmM6IFJVTEVTX1NPVVJDRSwgICAgICAgICAgdXJsOiBSVUxFU19GRVRDSF9VUkwsICAgICAgICAgIGZpbGU6IFwicGF0aC1pbnRlZ3JhdGlvbi5tZGNcIiB9LFxuICAgICAgICBhbmRyb2lkOiAgIHsgc3JjOiBBTkRST0lEX1JVTEVTX1NPVVJDRSwgICB1cmw6IEFORFJPSURfUlVMRVNfRkVUQ0hfVVJMLCAgIGZpbGU6IFwicGF0aC1pbnRlZ3JhdGlvbi1hbmRyb2lkLm1kY1wiIH0sXG4gICAgICAgIHdpbmRvd3MxMTogeyBzcmM6IFdJTkRPV1MxMV9SVUxFU19TT1VSQ0UsIHVybDogV0lORE9XUzExX1JVTEVTX0ZFVENIX1VSTCwgZmlsZTogXCJwYXRoLWludGVncmF0aW9uLXdpbmRvd3MxMS5tZGNcIiB9LFxuICAgICAgICB3aW5kb3dzMTA6IHsgc3JjOiBXSU5ET1dTMTBfUlVMRVNfU09VUkNFLCB1cmw6IFdJTkRPV1MxMF9SVUxFU19GRVRDSF9VUkwsIGZpbGU6IFwicGF0aC1pbnRlZ3JhdGlvbi13aW5kb3dzMTAubWRjXCIgfSxcbiAgICAgIH0gYXMgY29uc3Q7XG4gICAgICBjb25zdCBhY3RpdmVSdWxlcyA9IHJ1bGVzQnlQbGF0Zm9ybVtwbGF0Zm9ybV07XG4gICAgICBjb25zdCBhY3RpdmVGZXRjaFVybCA9IGFjdGl2ZVJ1bGVzLnVybDtcblxuICAgICAgaWYgKGFnZW50ID09PSBcImNsYXVkZVwiKSB7XG4gICAgICAgIHJlc3VsdCA9IHdyaXRlQ2xhdWRlUnVsZXNGaWxlKGN3ZCwgYWN0aXZlUnVsZXMuc3JjLCBhY3RpdmVGZXRjaFVybCk7XG4gICAgICAgIHJ1bGVzRmlsZSA9IFwiQ0xBVURFLm1kXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB3cml0ZUN1cnNvclJ1bGVzRmlsZShjd2QsIGFjdGl2ZVJ1bGVzLnNyYywgYWN0aXZlUnVsZXMuZmlsZSwgYWN0aXZlRmV0Y2hVcmwpO1xuICAgICAgICBydWxlc0ZpbGUgPSBgLmN1cnNvci9ydWxlcy8ke2FjdGl2ZVJ1bGVzLmZpbGV9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC53cml0dGVuKSB7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZChgUnVsZXMgZmlsZSB3cml0dGVuIHRvICR7cnVsZXNGaWxlfS5gKTtcbiAgICAgICAgYWN0aW9ucy5wdXNoKGBJbnRlZ3JhdGlvbiBydWxlcyBmaWxlOiAke3J1bGVzRmlsZX1gKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnNraXBwZWQpIHtcbiAgICAgICAgc3Bpbm5lci5pbmZvKFxuICAgICAgICAgIGAke3J1bGVzRmlsZX0gYWxyZWFkeSBleGlzdHMgXHUyMDE0IHNraXBwZWQgdG8gcHJlc2VydmUgeW91ciBjdXN0b21pc2F0aW9ucy5gXG4gICAgICAgICk7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICAgICAgYCR7cnVsZXNGaWxlfSBhbHJlYWR5IGV4aXN0cyBcdTIwMTQgbm90IG92ZXJ3cml0dGVuLmBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwaW5uZXIud2FybihcIkNvdWxkIG5vdCB3cml0ZSBydWxlcyBmaWxlIFx1MjAxNCBjaGVjayBuZXR3b3JrIGNvbm5lY3Rpdml0eS5cIik7XG4gICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgYERvd25sb2FkICR7YWN0aXZlUnVsZXMuZmlsZX0gbWFudWFsbHkgZnJvbTogJHthY3RpdmVGZXRjaFVybH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIDQuIFBlcm1pc3Npb24gY2hlY2sgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgaWYgKCF0b29sc09ubHkpIHtcbiAgICAgIGlmIChpc0FuZHJvaWQpIHtcbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYShcIkNoZWNraW5nIEFuZHJvaWRNYW5pZmVzdC54bWwgQkxFIHBlcm1pc3Npb25zXHUyMDI2XCIpLnN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0c1dpdGhJc3N1ZXMgPSBjaGVja0FuZHJvaWRNYW5pZmVzdChjd2QpO1xuICAgICAgICBpZiAobWFuaWZlc3RzV2l0aElzc3Vlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJCTEUgcGVybWlzc2lvbnMgZm91bmQgaW4gQW5kcm9pZE1hbmlmZXN0LnhtbC5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwiQkxFIHBlcm1pc3Npb25zIHZlcmlmaWVkIGluIEFuZHJvaWRNYW5pZmVzdC54bWxcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Bpbm5lci53YXJuKFxuICAgICAgICAgICAgYEJMVUVUT09USF9TQ0FOIG1pc3NpbmcgZnJvbSAke21hbmlmZXN0c1dpdGhJc3N1ZXMubGVuZ3RofSBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUocykuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgbWFuaWZlc3RzV2l0aElzc3Vlcy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGl2ZSA9IHBhdGgucmVsYXRpdmUoY3dkLCBwKTtcbiAgICAgICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgICAgIGBBZGQgQkxFIHBlcm1pc3Npb25zIHRvICR7cmVsYXRpdmV9OlxcbmAgK1xuICAgICAgICAgICAgICBgICAgICAoQXNrIHRoZSBNQ1A6IFwiZ2V0X21hbmlmZXN0X3JlcXVpcmVtZW50c1wiIGZvciB0aGUgZnVsbCBYTUwpYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1dpbmRvd3MpIHtcbiAgICAgICAgLy8gV2luZG93cyByZWFjaGVzIEJMRSB2aWEgV2luUlQgXHUyMDE0IG5vIG1hbmlmZXN0IGNhcGFiaWxpdHkgdG8gYWRkICh1bnBhY2thZ2VkXG4gICAgICAgIC8vIFdpblVJIDMgLyBXUEYpLiBUaGUgV2ktRmkvSVAgYW5kIFZlcmlmb25lIGJhY2tlbmRzIHVzZSBubyBCbHVldG9vdGggYXQgYWxsLlxuICAgICAgICBhY3Rpb25zLnB1c2goXCJCbHVldG9vdGggbmVlZHMgbm8gbWFuaWZlc3QgZW50cnkgb24gV2luZG93cyAoV2luUlQpLlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoXCJDaGVja2luZyBJbmZvLnBsaXN0IEJMRSBwZXJtaXNzaW9uc1x1MjAyNlwiKS5zdGFydCgpO1xuICAgICAgICBjb25zdCBwbGlzdHNXaXRoSXNzdWVzID0gY2hlY2tJbmZvUGxpc3QoY3dkKTtcbiAgICAgICAgaWYgKHBsaXN0c1dpdGhJc3N1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiQkxFIHBlcm1pc3Npb25zIGZvdW5kIGluIEluZm8ucGxpc3QuXCIpO1xuICAgICAgICAgIGFjdGlvbnMucHVzaChcIkJMRSBwZXJtaXNzaW9ucyB2ZXJpZmllZCBpbiBJbmZvLnBsaXN0XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNwaW5uZXIud2FybihcbiAgICAgICAgICAgIGBOU0JsdWV0b290aEFsd2F5c1VzYWdlRGVzY3JpcHRpb24gbWlzc2luZyBmcm9tICR7cGxpc3RzV2l0aElzc3Vlcy5sZW5ndGh9IEluZm8ucGxpc3QgZmlsZShzKS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwbGlzdHNXaXRoSXNzdWVzLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShjd2QsIHApO1xuICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgYEFkZCBCTEUgcGVybWlzc2lvbiB0byAke3JlbGF0aXZlfTpcXG5gICtcbiAgICAgICAgICAgICAgICBgICAgICA8a2V5Pk5TQmx1ZXRvb3RoQWx3YXlzVXNhZ2VEZXNjcmlwdGlvbjwva2V5PlxcbmAgK1xuICAgICAgICAgICAgICAgIGAgICAgIDxzdHJpbmc+VGhpcyBhcHAgY29ubmVjdHMgdG8gYSBQYXRoIHBheW1lbnQgdGVybWluYWwgdmlhIEJsdWV0b290aC48L3N0cmluZz5cXG5gICtcbiAgICAgICAgICAgICAgICBgICAgICAoQXNrIHRoZSBNQ1A6IFwiZ2V0X2luZm9fcGxpc3RfcmVxdWlyZW1lbnRzXCIgZm9yIHRoZSBmdWxsIFhNTClgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIDUuIFN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgcHJpbnRTdW1tYXJ5KGFnZW50LCBwbGF0Zm9ybSwgYWN0aW9ucywgd2FybmluZ3MsIG1hbnVhbFN0ZXBzKTtcbiAgfSk7XG5cbnByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLHVCQUF3QjtBQUN4QixtQkFBa0I7QUFDbEIsU0FBb0I7QUFDcEIsV0FBc0I7QUFDdEIsZUFBMEI7QUFDMUIsMkJBQXlCO0FBQ3pCLGlCQUFnQjtBQUVoQixNQUFNLGlCQUFpQjtBQUN2QixNQUFNLHlCQUF5QjtBQUMvQixNQUFNLGNBQWM7QUFDcEIsTUFBTSw4QkFBOEI7QUFDcEMsTUFBTSw0QkFBNEI7QUFDbEMsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSw0QkFBNEI7QUFDbEMsTUFBTSw0QkFBNEI7QUFFbEMsTUFBTSxlQUFlLEtBQUssS0FBSyxXQUFXLG1DQUFtQztBQUM3RSxNQUFNLHVCQUF1QixLQUFLLEtBQUssV0FBVywrQ0FBK0M7QUFDakcsTUFBTSx5QkFBeUIsS0FBSyxLQUFLLFdBQVcsb0RBQW9EO0FBQ3hHLE1BQU0seUJBQXlCLEtBQUssS0FBSyxXQUFXLG9EQUFvRDtB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
|
|
726
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBwcm9ncmFtIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tIFwicmVhZGxpbmVcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBvcmEgZnJvbSBcIm9yYVwiO1xuXG5jb25zdCBTREtfR0lUSFVCX1VSTCA9IFwiaHR0cHM6Ly9naXRodWIuY29tL2tleW1hbjEyL3BhdGgtdGVybWluYWwtc2RrXCI7XG5jb25zdCBBTkRST0lEX1NES19HSVRIVUJfVVJMID0gXCJodHRwczovL2dpdGh1Yi5jb20va2V5bWFuMTIvcGF0aC10ZXJtaW5hbC1zZGstYW5kcm9pZFwiO1xuY29uc3QgU0RLX1ZFUlNJT04gPSBcIjAuMS4wXCI7IC8vIG1pbmltdW0gdmVyc2lvbiB0byByZWZlcmVuY2VcbmNvbnN0IEFORFJPSURfU0RLX0pJVFBBQ0tfVkVSU0lPTiA9IFwidjEuNFwiO1xuY29uc3QgQU5EUk9JRF9TREtfSklUUEFDS19HUk9VUCA9IFwiY29tLmdpdGh1Yi5rZXltYW4xMi5wYXRoLXRlcm1pbmFsLXNkay1hbmRyb2lkXCI7XG5jb25zdCBNQ1BfU0VSVkVSX1VSTCA9IFwiaHR0cHM6Ly9tY3AucGF0aDJhaS50ZWNoL3NzZVwiO1xuY29uc3QgUlVMRVNfRkVUQ0hfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvcnVsZXNcIjtcbmNvbnN0IEFORFJPSURfUlVMRVNfRkVUQ0hfVVJMID0gXCJodHRwczovL21jcC5wYXRoMmFpLnRlY2gvcnVsZXMvYW5kcm9pZFwiO1xuY29uc3QgV0lORE9XUzExX1JVTEVTX0ZFVENIX1VSTCA9IFwiaHR0cHM6Ly9tY3AucGF0aDJhaS50ZWNoL3J1bGVzL3dpbmRvd3MxMVwiO1xuY29uc3QgV0lORE9XUzEwX1JVTEVTX0ZFVENIX1VSTCA9IFwiaHR0cHM6Ly9tY3AucGF0aDJhaS50ZWNoL3J1bGVzL3dpbmRvd3MxMFwiO1xuXG5jb25zdCBSVUxFU19TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uL3J1bGVzL2lvcy9wYXRoLWludGVncmF0aW9uLm1kY1wiKTtcbmNvbnN0IEFORFJPSURfUlVMRVNfU09VUkNFID0gcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLi9ydWxlcy9hbmRyb2lkL3BhdGgtaW50ZWdyYXRpb24tYW5kcm9pZC5tZGNcIik7XG5jb25zdCBXSU5ET1dTMTFfUlVMRVNfU09VUkNFID0gcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLi9ydWxlcy93aW5kb3dzLTExL3BhdGgtaW50ZWdyYXRpb24td2luZG93czExLm1kY1wiKTtcbmNvbnN0IFdJTkRPV1MxMF9SVUxFU19TT1VSQ0UgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uL3J1bGVzL3dpbmRvd3MtMTAvcGF0aC1pbnRlZ3JhdGlvbi13aW5kb3dzMTAubWRjXCIpO1xuXG4vLyBUaGUgV2luZG93cyBTREsgaXMgY29uc3VtZWQgYnkgcmVsYXRpdmUgUHJvamVjdFJlZmVyZW5jZSB0byB0aGlzIHNpYmxpbmcgY2xvbmVcbi8vIChvbmUgcmVwbyBzZXJ2ZXMgYm90aCB0aGUgV2luVUkgMyAvIC5ORVQgMTAgYW5kIFdQRiAvIC5ORVQgRlcgNC44IHN0YWNrcykuXG5jb25zdCBXSU5ET1dTX1NES19SRVBPID0gXCJQYXRoLXRlcm1pbmFsLXNkay13aW5kb3dzMTFcIjtcblxudHlwZSBBZ2VudFR5cGUgPSBcImN1cnNvclwiIHwgXCJjbGF1ZGVcIjtcbnR5cGUgUGxhdGZvcm0gPSBcImlvc1wiIHwgXCJhbmRyb2lkXCIgfCBcIndpbmRvd3MxMVwiIHwgXCJ3aW5kb3dzMTBcIjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFV0aWxpdGllcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gYXNrKHF1ZXN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7IGlucHV0OiBwcm9jZXNzLnN0ZGluLCBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0IH0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBybC5xdWVzdGlvbihxdWVzdGlvbiwgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcbiAgICAgIHJlc29sdmUoYW5zd2VyLnRyaW0oKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmaW5kWGNvZGVQcm9qZWN0KGRpcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGlzWGNvZGVBcnRpZmFjdCA9IChlOiBzdHJpbmcpID0+XG4gICAgZS5lbmRzV2l0aChcIi54Y29kZXByb2pcIikgfHwgZS5lbmRzV2l0aChcIi54Y3dvcmtzcGFjZVwiKTtcblxuICAvLyBDaGVjayB0aGUgY3VycmVudCBkaXJlY3RvcnkgZmlyc3RcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpcik7XG4gIGNvbnN0IHByb2ogPSBlbnRyaWVzLmZpbmQoaXNYY29kZUFydGlmYWN0KTtcbiAgaWYgKHByb2opIHJldHVybiBwYXRoLmpvaW4oZGlyLCBwcm9qKTtcblxuICAvLyBTZWFyY2ggb25lIGxldmVsIGRlZXAgaW4gc3ViZGlyZWN0b3JpZXMgKGhhbmRsZXMgcmVwb3Mgd2hlcmUgdGhlXG4gIC8vIFhjb2RlIHByb2plY3Qgc2l0cyBpbnNpZGUgYSBuYW1lZCBzdWJmb2xkZXIsIGUuZy4gT3JkZXJjaGFtcGlvbkVQT1MvKVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBpZiAoZW50cnkuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHN1YiA9IHBhdGguam9pbihkaXIsIGVudHJ5KTtcbiAgICB0cnkge1xuICAgICAgaWYgKGZzLnN0YXRTeW5jKHN1YikuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBjb25zdCBzdWJFbnRyaWVzID0gZnMucmVhZGRpclN5bmMoc3ViKTtcbiAgICAgICAgY29uc3Qgc3ViUHJvaiA9IHN1YkVudHJpZXMuZmluZChpc1hjb2RlQXJ0aWZhY3QpO1xuICAgICAgICBpZiAoc3ViUHJvaikgcmV0dXJuIHBhdGguam9pbihzdWIsIHN1YlByb2opO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggeyAvKiBza2lwIHVucmVhZGFibGUgZGlycyAqLyB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VTd2lmdChkaXI6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBwID0gcGF0aC5qb2luKGRpciwgXCJQYWNrYWdlLnN3aWZ0XCIpO1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwKSA/IHAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBoYXNTREtEZXBlbmRlbmN5KHBhY2thZ2VTd2lmdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZVN3aWZ0LCBcInV0Zi04XCIpO1xuICByZXR1cm4gY29udGVudC5pbmNsdWRlcyhcInBhdGgtdGVybWluYWwtc2RrXCIpIHx8IGNvbnRlbnQuaW5jbHVkZXMoXCJQYXRoVGVybWluYWxTREtcIik7XG59XG5cbmZ1bmN0aW9uIGhhc1hjb2RlUHJvamVjdFNES0RlcGVuZGVuY3koeGNvZGVQcm9qZWN0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gWGNvZGUgc3RvcmVzIHJlc29sdmVkIFNQTSBwYWNrYWdlcyBpbiB0aGUgd29ya3NwYWNlJ3MgUGFja2FnZS5yZXNvbHZlZFxuICBjb25zdCByZXNvbHZlZFBhdGhzID0gW1xuICAgIHBhdGguam9pbih4Y29kZVByb2plY3QsIFwicHJvamVjdC54Y3dvcmtzcGFjZVwiLCBcInhjc2hhcmVkZGF0YVwiLCBcInN3aWZ0cG1cIiwgXCJQYWNrYWdlLnJlc29sdmVkXCIpLFxuICAgIHBhdGguam9pbih4Y29kZVByb2plY3QsIFwieGNzaGFyZWRkYXRhXCIsIFwic3dpZnRwbVwiLCBcIlBhY2thZ2UucmVzb2x2ZWRcIiksXG4gIF07XG4gIGZvciAoY29uc3QgcCBvZiByZXNvbHZlZFBhdGhzKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgXCJ1dGYtOFwiKTtcbiAgICAgIGlmIChjb250ZW50LmluY2x1ZGVzKFwicGF0aC10ZXJtaW5hbC1zZGtcIikgfHwgY29udGVudC5pbmNsdWRlcyhcIlBhdGhUZXJtaW5hbFNES1wiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpbmplY3RTUE1EZXBlbmRlbmN5KHBhY2thZ2VTd2lmdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlU3dpZnRQYXRoLCBcInV0Zi04XCIpO1xuXG4gIC8vIEFscmVhZHkgcHJlc2VudD9cbiAgaWYgKGhhc1NES0RlcGVuZGVuY3kocGFja2FnZVN3aWZ0UGF0aCkpIHJldHVybiBmYWxzZTtcblxuICAvLyBBZGQgdGhlIHBhY2thZ2UgZGVwZW5kZW5jeSBcdTIwMTQgZmluZCB0aGUgZGVwZW5kZW5jaWVzOiBbIGFycmF5XG4gIGNvbnN0IGRlcHNSZWdleCA9IC8oZGVwZW5kZW5jaWVzOlxccypcXFspLztcbiAgaWYgKCFkZXBzUmVnZXgudGVzdChjb250ZW50KSkge1xuICAgIHJldHVybiBmYWxzZTsgLy8gQ2FuJ3Qgc2FmZWx5IGluamVjdCBcdTIwMTQgc3RydWN0dXJlIG5vdCByZWNvZ25pc2VkXG4gIH1cblxuICBjb25zdCBkZXBFbnRyeSA9IGBcXG4gICAgICAgIC5wYWNrYWdlKHVybDogXCIke1NES19HSVRIVUJfVVJMfVwiLCBmcm9tOiBcIiR7U0RLX1ZFUlNJT059XCIpLGA7XG4gIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoZGVwc1JlZ2V4LCBgJDEke2RlcEVudHJ5fWApO1xuICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VTd2lmdFBhdGgsIGNvbnRlbnQsIFwidXRmLThcIik7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ3Vyc29yLXNwZWNpZmljIGNvbmZpZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gd3JpdGVDdXJzb3JNY3BDb25maWcoZGlyOiBzdHJpbmcpOiB7IHdyaXR0ZW46IGJvb2xlYW47IG1lcmdlZDogYm9vbGVhbiB9IHtcbiAgY29uc3QgY3Vyc29yRGlyID0gcGF0aC5qb2luKGRpciwgXCIuY3Vyc29yXCIpO1xuICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKGN1cnNvckRpciwgXCJtY3AuanNvblwiKTtcblxuICBmcy5ta2RpclN5bmMoY3Vyc29yRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBwYXRoRW50cnkgPSB7XG4gICAgXCJwYXRoLXRlcm1pbmFsXCI6IHsgdXJsOiBNQ1BfU0VSVkVSX1VSTCB9LFxuICB9O1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICBpZiAoIWV4aXN0aW5nLm1jcFNlcnZlcnMpIGV4aXN0aW5nLm1jcFNlcnZlcnMgPSB7fTtcbiAgICAgIGlmIChleGlzdGluZy5tY3BTZXJ2ZXJzW1wicGF0aC10ZXJtaW5hbFwiXSkge1xuICAgICAgICByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgbWVyZ2VkOiBmYWxzZSB9OyAvLyBhbHJlYWR5IHByZXNlbnRcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nLm1jcFNlcnZlcnNbXCJwYXRoLXRlcm1pbmFsXCJdID0gcGF0aEVudHJ5W1wicGF0aC10ZXJtaW5hbFwiXTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkoZXhpc3RpbmcsIG51bGwsIDIpLCBcInV0Zi04XCIpO1xuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgbWVyZ2VkOiB0cnVlIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGaWxlIGV4aXN0cyBidXQgaXMgbm90IHZhbGlkIEpTT04gXHUyMDE0IGRvbid0IG92ZXJ3cml0ZVxuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25maWcgPSB7IG1jcFNlcnZlcnM6IHBhdGhFbnRyeSB9O1xuICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gd3JpdGVDdXJzb3JSdWxlc0ZpbGUoZGlyOiBzdHJpbmcsIHJ1bGVzU291cmNlOiBzdHJpbmcgPSBSVUxFU19TT1VSQ0UsIGZpbGVuYW1lOiBzdHJpbmcgPSBcInBhdGgtaW50ZWdyYXRpb24ubWRjXCIsIGZhbGxiYWNrVXJsPzogc3RyaW5nKTogeyB3cml0dGVuOiBib29sZWFuOyBza2lwcGVkOiBib29sZWFuIH0ge1xuICBjb25zdCBydWxlc0RpciA9IHBhdGguam9pbihkaXIsIFwiLmN1cnNvclwiLCBcInJ1bGVzXCIpO1xuICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihydWxlc0RpciwgZmlsZW5hbWUpO1xuXG4gIGZzLm1rZGlyU3luYyhydWxlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGVzdFBhdGgpKSB7XG4gICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIHNraXBwZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBsb2FkUnVsZXNDb250ZW50KHJ1bGVzU291cmNlLCBmYWxsYmFja1VybCk7XG4gIGlmICghY29udGVudCkgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIHNraXBwZWQ6IGZhbHNlIH07XG5cbiAgZnMud3JpdGVGaWxlU3luYyhkZXN0UGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgc2tpcHBlZDogZmFsc2UgfTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENsYXVkZSBDb2RlLXNwZWNpZmljIGNvbmZpZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gd3JpdGVDbGF1ZGVNY3BDb25maWcoZGlyOiBzdHJpbmcpOiB7IHdyaXR0ZW46IGJvb2xlYW47IG1lcmdlZDogYm9vbGVhbiB9IHtcbiAgLy8gQ2xhdWRlIENvZGUgcmVhZHMgLm1jcC5qc29uIGF0IHRoZSBwcm9qZWN0IHJvb3QgKHNhbWUgbWNwU2VydmVycyBmb3JtYXQgYXMgQ3Vyc29yKVxuICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKGRpciwgXCIubWNwLmpzb25cIik7XG5cbiAgY29uc3Qgc2VydmVyRW50cnkgPSB7XG4gICAgdHlwZTogXCJzc2VcIixcbiAgICB1cmw6IE1DUF9TRVJWRVJfVVJMLFxuICB9O1xuXG4gIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICBpZiAoIWV4aXN0aW5nLm1jcFNlcnZlcnMpIGV4aXN0aW5nLm1jcFNlcnZlcnMgPSB7fTtcbiAgICAgIGlmIChleGlzdGluZy5tY3BTZXJ2ZXJzW1wicGF0aC10ZXJtaW5hbFwiXSkge1xuICAgICAgICByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgbWVyZ2VkOiBmYWxzZSB9OyAvLyBhbHJlYWR5IHByZXNlbnRcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nLm1jcFNlcnZlcnNbXCJwYXRoLXRlcm1pbmFsXCJdID0gc2VydmVyRW50cnk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nLCBudWxsLCAyKSwgXCJ1dGYtOFwiKTtcbiAgICAgIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogdHJ1ZSB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25maWcgPSB7XG4gICAgbWNwU2VydmVyczoge1xuICAgICAgXCJwYXRoLXRlcm1pbmFsXCI6IHNlcnZlckVudHJ5LFxuICAgIH0sXG4gIH07XG4gIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKSwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgbWVyZ2VkOiBmYWxzZSB9O1xufVxuXG4vLyBQcmUtYXBwcm92ZSB0aGUgcGF0aC10ZXJtaW5hbCBNQ1Agc2VydmVyIGluIC5jbGF1ZGUvc2V0dGluZ3MuanNvbiBzbyBDbGF1ZGVcbi8vIENvZGUgbG9hZHMgaXRzIHRvb2xzIG9uIHRoZSB2ZXJ5IGZpcnN0IHNlc3Npb24gd2l0aG91dCB0aGUgdXNlciBoYXZpbmcgdG9cbi8vIGNsaWNrIHRocm91Z2ggYW4gYXBwcm92YWwgcHJvbXB0ICh3aGljaCBpcyBlYXN5IHRvIG1pc3MgYW5kIGxlYXZlcyB0aGUgYWdlbnRcbi8vIHJ1bm5pbmcgd2l0aG91dCBNQ1AgdG9vbHMpLlxuZnVuY3Rpb24gd3JpdGVDbGF1ZGVTZXR0aW5ncyhkaXI6IHN0cmluZyk6IHsgd3JpdHRlbjogYm9vbGVhbjsgbWVyZ2VkOiBib29sZWFuOyBhbHJlYWR5QXBwcm92ZWQ6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGNsYXVkZURpciA9IHBhdGguam9pbihkaXIsIFwiLmNsYXVkZVwiKTtcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJzZXR0aW5ncy5qc29uXCIpO1xuICBjb25zdCBNQ1BfTkFNRSA9IFwicGF0aC10ZXJtaW5hbFwiO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhjbGF1ZGVEaXIpKSB7XG4gICAgZnMubWtkaXJTeW5jKGNsYXVkZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICBpZiAoZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgIGNvbnN0IGN1cnJlbnQ6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShleGlzdGluZy5lbmFibGVkTWNwanNvblNlcnZlcnMpID8gZXhpc3RpbmcuZW5hYmxlZE1jcGpzb25TZXJ2ZXJzIDogW107XG4gICAgICBpZiAoY3VycmVudC5pbmNsdWRlcyhNQ1BfTkFNRSkpIHtcbiAgICAgICAgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIG1lcmdlZDogZmFsc2UsIGFscmVhZHlBcHByb3ZlZDogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgZXhpc3RpbmcuZW5hYmxlZE1jcGpzb25TZXJ2ZXJzID0gWy4uLmN1cnJlbnQsIE1DUF9OQU1FXTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NQYXRoLCBKU09OLnN0cmluZ2lmeShleGlzdGluZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gICAgICByZXR1cm4geyB3cml0dGVuOiB0cnVlLCBtZXJnZWQ6IHRydWUsIGFscmVhZHlBcHByb3ZlZDogZmFsc2UgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBtZXJnZWQ6IGZhbHNlLCBhbHJlYWR5QXBwcm92ZWQ6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29uZmlnID0ge1xuICAgIGVuYWJsZWRNY3Bqc29uU2VydmVyczogW01DUF9OQU1FXSxcbiAgfTtcbiAgZnMud3JpdGVGaWxlU3luYyhzZXR0aW5nc1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMiksIFwidXRmLThcIik7XG4gIHJldHVybiB7IHdyaXR0ZW46IHRydWUsIG1lcmdlZDogZmFsc2UsIGFscmVhZHlBcHByb3ZlZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gd3JpdGVDbGF1ZGVSdWxlc0ZpbGUoZGlyOiBzdHJpbmcsIHJ1bGVzU291cmNlOiBzdHJpbmcgPSBSVUxFU19TT1VSQ0UsIGZhbGxiYWNrVXJsPzogc3RyaW5nKTogeyB3cml0dGVuOiBib29sZWFuOyBza2lwcGVkOiBib29sZWFuIH0ge1xuICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihkaXIsIFwiQ0xBVURFLm1kXCIpO1xuXG4gIC8vIERvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBDTEFVREUubWQgXHUyMDE0IGl0IG1heSBoYXZlIGN1c3RvbSBpbnN0cnVjdGlvbnNcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGVzdFBhdGgpKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhkZXN0UGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBpZiAoY29udGVudC5pbmNsdWRlcyhcIlBhdGggVGVybWluYWwgU0RLXCIpKSB7XG4gICAgICByZXR1cm4geyB3cml0dGVuOiBmYWxzZSwgc2tpcHBlZDogdHJ1ZSB9O1xuICAgIH1cbiAgICAvLyBBcHBlbmQgdG8gZXhpc3RpbmcgQ0xBVURFLm1kXG4gICAgY29uc3QgcnVsZXMgPSBsb2FkUnVsZXNDb250ZW50KHJ1bGVzU291cmNlLCBmYWxsYmFja1VybCk7XG4gICAgaWYgKCFydWxlcykgcmV0dXJuIHsgd3JpdHRlbjogZmFsc2UsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgZnMuYXBwZW5kRmlsZVN5bmMoZGVzdFBhdGgsIFwiXFxuXFxuXCIgKyBydWxlcywgXCJ1dGYtOFwiKTtcbiAgICByZXR1cm4geyB3cml0dGVuOiB0cnVlLCBza2lwcGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgcnVsZXMgPSBsb2FkUnVsZXNDb250ZW50KHJ1bGVzU291cmNlLCBmYWxsYmFja1VybCk7XG4gIGlmICghcnVsZXMpIHJldHVybiB7IHdyaXR0ZW46IGZhbHNlLCBza2lwcGVkOiBmYWxzZSB9O1xuICBmcy53cml0ZUZpbGVTeW5jKGRlc3RQYXRoLCBydWxlcywgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHsgd3JpdHRlbjogdHJ1ZSwgc2tpcHBlZDogZmFsc2UgfTtcbn1cblxuZnVuY3Rpb24gbG9hZFJ1bGVzQ29udGVudChydWxlc1NvdXJjZTogc3RyaW5nID0gUlVMRVNfU09VUkNFLCBmYWxsYmFja1VybD86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBsZXQgcmF3OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBpZiAoZnMuZXhpc3RzU3luYyhydWxlc1NvdXJjZSkpIHtcbiAgICByYXcgPSBmcy5yZWFkRmlsZVN5bmMocnVsZXNTb3VyY2UsIFwidXRmLThcIik7XG4gIH0gZWxzZSBpZiAoZmFsbGJhY2tVcmwpIHtcbiAgICB0cnkge1xuICAgICAgcmF3ID0gZXhlY1N5bmMoYGN1cmwgLXNmIC0tbWF4LXRpbWUgMTAgXCIke2ZhbGxiYWNrVXJsfVwiYCwgeyBlbmNvZGluZzogXCJ1dGYtOFwiIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuXG4gIC8vIFN0cmlwIHRoZSBZQU1MIGZyb250bWF0dGVyICgtLS0gLi4uIC0tLSkgdGhhdCBDdXJzb3IgdXNlc1xuICBjb25zdCBzdHJpcHBlZCA9IHJhdy5yZXBsYWNlKC9eLS0tW1xcc1xcU10qPy0tLVxccyovLCBcIlwiKTtcbiAgcmV0dXJuIHN0cmlwcGVkLnRyaW0oKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFNoYXJlZCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gY2hlY2tJbmZvUGxpc3QoZGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGxpc3RGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICBmdW5jdGlvbiBmaW5kUGxpc3RzKGQ6IHN0cmluZywgZGVwdGg6IG51bWJlciA9IDApIHtcbiAgICBpZiAoZGVwdGggPiA0KSByZXR1cm47XG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGQpO1xuICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoZSA9PT0gXCJub2RlX21vZHVsZXNcIiB8fCBlLnN0YXJ0c1dpdGgoXCIuXCIpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZ1bGwgPSBwYXRoLmpvaW4oZCwgZSk7XG4gICAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbCk7XG4gICAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSBmaW5kUGxpc3RzKGZ1bGwsIGRlcHRoICsgMSk7XG4gICAgICBlbHNlIGlmIChlID09PSBcIkluZm8ucGxpc3RcIikgcGxpc3RGaWxlcy5wdXNoKGZ1bGwpO1xuICAgIH1cbiAgfVxuXG4gIGZpbmRQbGlzdHMoZGlyKTtcblxuICBmb3IgKGNvbnN0IHBsaXN0IG9mIHBsaXN0RmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBsaXN0LCBcInV0Zi04XCIpO1xuICAgIGlmICghY29udGVudC5pbmNsdWRlcyhcIk5TQmx1ZXRvb3RoQWx3YXlzVXNhZ2VEZXNjcmlwdGlvblwiKSkge1xuICAgICAgaXNzdWVzLnB1c2gocGxpc3QpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc3N1ZXM7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBbmRyb2lkIGhlbHBlcnMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmZ1bmN0aW9uIGZpbmRBbmRyb2lkUHJvamVjdChkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyLCBcInNldHRpbmdzLmdyYWRsZS5rdHNcIikpICYmXG4gICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXIsIFwiYXBwXCIsIFwiYnVpbGQuZ3JhZGxlLmt0c1wiKSk7XG59XG5cbmZ1bmN0aW9uIGhhc0FuZHJvaWRTREtEZXBlbmRlbmN5KGRpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENoZWNrIHNldHRpbmdzLmdyYWRsZS5rdHMgaGFzIEppdFBhY2sgcmVwb1xuICBjb25zdCBzZXR0aW5nc1BhdGggPSBwYXRoLmpvaW4oZGlyLCBcInNldHRpbmdzLmdyYWRsZS5rdHNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhzZXR0aW5nc1BhdGgpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHNldHRpbmdzID0gZnMucmVhZEZpbGVTeW5jKHNldHRpbmdzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlcyhcImppdHBhY2suaW9cIikpIHJldHVybiBmYWxzZTtcbiAgLy8gQ2hlY2sgYnVpbGQuZ3JhZGxlLmt0cyBoYXMgdGhlIGRlcGVuZGVuY3kgdW5jb21tZW50ZWRcbiAgY29uc3QgYnVpbGRQYXRoID0gcGF0aC5qb2luKGRpciwgXCJhcHBcIiwgXCJidWlsZC5ncmFkbGUua3RzXCIpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoYnVpbGRQYXRoKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGJ1aWxkID0gZnMucmVhZEZpbGVTeW5jKGJ1aWxkUGF0aCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIC9eXFxzKmltcGxlbWVudGF0aW9uXFwoXCJjb21cXC5naXRodWJcXC5rZXltYW4xMlxcLnBhdGgtdGVybWluYWwtc2RrLWFuZHJvaWQ6cGF0aC10ZXJtaW5hbC1zZGsvbS50ZXN0KGJ1aWxkKTtcbn1cblxuZnVuY3Rpb24gaW5qZWN0Sml0UGFja1JlcG8oZGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgc2V0dGluZ3NQYXRoID0gcGF0aC5qb2luKGRpciwgXCJzZXR0aW5ncy5ncmFkbGUua3RzXCIpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2V0dGluZ3NQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzZXR0aW5nc1BhdGgsIFwidXRmLThcIik7XG4gIGlmIChjb250ZW50LmluY2x1ZGVzKFwiaml0cGFjay5pb1wiKSkgcmV0dXJuIHRydWU7IC8vIGFscmVhZHkgcHJlc2VudFxuICAvLyBBZGQgaml0cGFjayBpbnNpZGUgZGVwZW5kZW5jeVJlc29sdXRpb25NYW5hZ2VtZW50IHJlcG9zaXRvcmllcyBibG9ja1xuICBjb25zdCByZXBvUmVnZXggPSAvKGRlcGVuZGVuY3lSZXNvbHV0aW9uTWFuYWdlbWVudFxccypcXHtbXn1dKnJlcG9zaXRvcmllc1xccypcXHspL3M7XG4gIGlmICghcmVwb1JlZ2V4LnRlc3QoY29udGVudCkpIHJldHVybiBmYWxzZTtcbiAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShyZXBvUmVnZXgsIGAkMVxcbiAgICAgICAgbWF2ZW4geyB1cmwgPSB1cmkoXCJodHRwczovL2ppdHBhY2suaW9cIikgfWApO1xuICBmcy53cml0ZUZpbGVTeW5jKHNldHRpbmdzUGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGluamVjdEdyYWRsZURlcGVuZGVuY2llcyhkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBidWlsZFBhdGggPSBwYXRoLmpvaW4oZGlyLCBcImFwcFwiLCBcImJ1aWxkLmdyYWRsZS5rdHNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhidWlsZFBhdGgpKSByZXR1cm4gZmFsc2U7XG4gIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGJ1aWxkUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAvLyBBbHJlYWR5IHByZXNlbnQgYW5kIHVuY29tbWVudGVkIFx1MjAxNCBub3RoaW5nIHRvIGRvXG4gIGlmICgvXlxccyppbXBsZW1lbnRhdGlvblxcKFwiY29tXFwuZ2l0aHViXFwua2V5bWFuMTJcXC5wYXRoLXRlcm1pbmFsLXNkay1hbmRyb2lkOnBhdGgtdGVybWluYWwtc2RrL20udGVzdChjb250ZW50KSkgcmV0dXJuIHRydWU7XG5cbiAgLy8gUHJlc2VudCBidXQgY29tbWVudGVkIG91dCBcdTIwMTQgdW5jb21tZW50IHRob3NlIGxpbmVzXG4gIGlmIChjb250ZW50LmluY2x1ZGVzKFwicGF0aC10ZXJtaW5hbC1zZGstYW5kcm9pZFwiKSkge1xuICAgIGNvbnRlbnQgPSBjb250ZW50XG4gICAgICAucmVwbGFjZSgvXlxccypcXC9cXC9cXHMqaW1wbGVtZW50YXRpb25cXChcImNvbVxcLmdpdGh1YlxcLmtleW1hbjEyXFwucGF0aC10ZXJtaW5hbC1zZGstYW5kcm9pZDpwYXRoLWNvcmUtbW9kZWxzW15cIl0qXCJcXCkvZ20sXG4gICAgICAgIGAgICAgaW1wbGVtZW50YXRpb24oXCIke0FORFJPSURfU0RLX0pJVFBBQ0tfR1JPVVB9OnBhdGgtY29yZS1tb2RlbHM6JHtBTkRST0lEX1NES19KSVRQQUNLX1ZFUlNJT059XCIpYClcbiAgICAgIC5yZXBsYWNlKC9eXFxzKlxcL1xcL1xccyppbXBsZW1lbnRhdGlvblxcKFwiY29tXFwuZ2l0aHViXFwua2V5bWFuMTJcXC5wYXRoLXRlcm1pbmFsLXNkay1hbmRyb2lkOnBhdGgtdGVybWluYWwtc2RrW15cIl0qXCJcXCkvZ20sXG4gICAgICAgIGAgICAgaW1wbGVtZW50YXRpb24oXCIke0FORFJPSURfU0RLX0pJVFBBQ0tfR1JPVVB9OnBhdGgtdGVybWluYWwtc2RrOiR7QU5EUk9JRF9TREtfSklUUEFDS19WRVJTSU9OfVwiKWApXG4gICAgICAucmVwbGFjZSgvXlxccypcXC9cXC9cXHMqaW1wbGVtZW50YXRpb25cXChcImNvbVxcLmdpdGh1YlxcLmtleW1hbjEyXFwucGF0aC10ZXJtaW5hbC1zZGstYW5kcm9pZDpwYXRoLWVtdWxhdG9yLWFkYXB0ZXJbXlwiXSpcIlxcKS9nbSxcbiAgICAgICAgYCAgICBpbXBsZW1lbnRhdGlvbihcIiR7QU5EUk9JRF9TREtfSklUUEFDS19HUk9VUH06cGF0aC1lbXVsYXRvci1hZGFwdGVyOiR7QU5EUk9JRF9TREtfSklUUEFDS19WRVJTSU9OfVwiKWApO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoYnVpbGRQYXRoLCBjb250ZW50LCBcInV0Zi04XCIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gTm90IHByZXNlbnQgYXQgYWxsIFx1MjAxNCBpbmplY3QgYWZ0ZXIgb3BlbmluZyBicmFjZVxuICBjb25zdCBkZXBzID0gW1xuICAgIGAgICAgaW1wbGVtZW50YXRpb24oXCIke0FORFJPSURfU0RLX0pJVFBBQ0tfR1JPVVB9OnBhdGgtY29yZS1tb2RlbHM6JHtBTkRST0lEX1NES19KSVRQQUNLX1ZFUlNJT059XCIpYCxcbiAgICBgICAgIGltcGxlbWVudGF0aW9uKFwiJHtBTkRST0lEX1NES19KSVRQQUNLX0dST1VQfTpwYXRoLXRlcm1pbmFsLXNkazoke0FORFJPSURfU0RLX0pJVFBBQ0tfVkVSU0lPTn1cIilgLFxuICAgIGAgICAgaW1wbGVtZW50YXRpb24oXCIke0FORFJPSURfU0RLX0pJVFBBQ0tfR1JPVVB9OnBhdGgtZW11bGF0b3ItYWRhcHRlcjoke0FORFJPSURfU0RLX0pJVFBBQ0tfVkVSU0lPTn1cIilgLFxuICBdLmpvaW4oXCJcXG5cIikgKyBcIlxcblwiO1xuICBjb25zdCBkZXBzUmVnZXggPSAvKGRlcGVuZGVuY2llc1xccypcXHspLztcbiAgaWYgKCFkZXBzUmVnZXgudGVzdChjb250ZW50KSkgcmV0dXJuIGZhbHNlO1xuICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGRlcHNSZWdleCwgYCQxXFxuJHtkZXBzfWApO1xuICBmcy53cml0ZUZpbGVTeW5jKGJ1aWxkUGF0aCwgY29udGVudCwgXCJ1dGYtOFwiKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQW5kcm9pZE1hbmlmZXN0KGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gIGZ1bmN0aW9uIGZpbmRNYW5pZmVzdHMoZDogc3RyaW5nLCBkZXB0aDogbnVtYmVyID0gMCkge1xuICAgIGlmIChkZXB0aCA+IDQpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IGUgb2YgZnMucmVhZGRpclN5bmMoZCkpIHtcbiAgICAgIGlmIChlLnN0YXJ0c1dpdGgoXCIuXCIpIHx8IGUgPT09IFwiYnVpbGRcIikgY29udGludWU7XG4gICAgICBjb25zdCBmdWxsID0gcGF0aC5qb2luKGQsIGUpO1xuICAgICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGwpO1xuICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkgZmluZE1hbmlmZXN0cyhmdWxsLCBkZXB0aCArIDEpO1xuICAgICAgZWxzZSBpZiAoZSA9PT0gXCJBbmRyb2lkTWFuaWZlc3QueG1sXCIpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmdWxsLCBcInV0Zi04XCIpO1xuICAgICAgICBpZiAoIWNvbnRlbnQuaW5jbHVkZXMoXCJCTFVFVE9PVEhfU0NBTlwiKSkgaXNzdWVzLnB1c2goZnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZpbmRNYW5pZmVzdHMoZGlyKTtcbiAgcmV0dXJuIGlzc3Vlcztcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFdpbmRvd3MgaGVscGVycyAoLk5FVCBcdTIwMTQgV2luVUkgMyAvIC5ORVQgMTAgYW5kIFdQRiAvIC5ORVQgRlcgNC44KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuLy8gQ29sbGVjdCAuY3Nwcm9qIGZpbGUgcGF0aHMgaW4gY3dkIGFuZCBvbmUgbGV2ZWwgZGVlcC5cbmZ1bmN0aW9uIGZpbmRDc3Byb2pGaWxlcyhkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZm91bmQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHdhbGsgPSAoZDogc3RyaW5nLCBkZXB0aDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKGRlcHRoID4gMSkgcmV0dXJuO1xuICAgIGxldCBlbnRyaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkKTsgfSBjYXRjaCB7IHJldHVybjsgfVxuICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoZS5zdGFydHNXaXRoKFwiLlwiKSB8fCBlID09PSBcImJpblwiIHx8IGUgPT09IFwib2JqXCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZnVsbCA9IHBhdGguam9pbihkLCBlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0ID0gZnMuc3RhdFN5bmMoZnVsbCk7XG4gICAgICAgIGlmIChzdC5pc0RpcmVjdG9yeSgpKSB3YWxrKGZ1bGwsIGRlcHRoICsgMSk7XG4gICAgICAgIGVsc2UgaWYgKGUuZW5kc1dpdGgoXCIuY3Nwcm9qXCIpKSBmb3VuZC5wdXNoKGZ1bGwpO1xuICAgICAgfSBjYXRjaCB7IC8qIHNraXAgKi8gfVxuICAgIH1cbiAgfTtcbiAgd2FsayhkaXIsIDApO1xuICByZXR1cm4gZm91bmQ7XG59XG5cbi8vIEEgV2luZG93cyBwcm9qZWN0ID0gYSAuc2xuIG9yIGEgLmNzcHJvaiBpbiBjd2Qgb3Igb25lIGxldmVsIGRlZXAuXG5mdW5jdGlvbiBmaW5kV2luZG93c1Byb2plY3QoZGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGVudHJpZXM6IHN0cmluZ1tdID0gW107XG4gIHRyeSB7IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpOyB9IGNhdGNoIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChlbnRyaWVzLnNvbWUoKGUpID0+IGUuZW5kc1dpdGgoXCIuc2xuXCIpKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmaW5kQ3Nwcm9qRmlsZXMoZGlyKS5sZW5ndGggPiAwO1xufVxuXG4vLyBXaW4xMSA9IFdpblVJIDMgLyAuTkVUIDEwIChuZXQxMC4wLXdpbmRvd3MpOyBXaW4xMCA9IFdQRiAvIC5ORVQgRnJhbWV3b3JrIDQuOCAobmV0NDgpLlxuLy8gRGVmYXVsdCB0byBXaW5kb3dzIDExICh0aGUgbW9kZXJuIHN0YWNrKSB3aGVuIHRoZSBzaWduYWwgaXMgYW1iaWd1b3VzLlxuZnVuY3Rpb24gZGV0ZWN0V2luZG93c0ZsYXZvdXIoZGlyOiBzdHJpbmcpOiBcIndpbmRvd3MxMVwiIHwgXCJ3aW5kb3dzMTBcIiB7XG4gIGNvbnN0IGJsb2IgPSBmaW5kQ3Nwcm9qRmlsZXMoZGlyKS5tYXAoKGYpID0+IHtcbiAgICB0cnkgeyByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGYsIFwidXRmLThcIik7IH0gY2F0Y2ggeyByZXR1cm4gXCJcIjsgfVxuICB9KS5qb2luKFwiXFxuXCIpLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChibG9iLmluY2x1ZGVzKFwibmV0NDhcIikgfHwgYmxvYi5pbmNsdWRlcyhcIjx1c2V3cGY+dHJ1ZVwiKSB8fCBibG9iLmluY2x1ZGVzKFwidjQuOFwiKSkgcmV0dXJuIFwid2luZG93czEwXCI7XG4gIHJldHVybiBcIndpbmRvd3MxMVwiO1xufVxuXG5mdW5jdGlvbiBoYXNXaW5kb3dzU0RLRGVwZW5kZW5jeShkaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmluZENzcHJvakZpbGVzKGRpcikuc29tZSgoZikgPT4ge1xuICAgIHRyeSB7IHJldHVybiAvUGF0aFxcLlRlcm1pbmFsXFwuU2RrLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhmLCBcInV0Zi04XCIpKTsgfSBjYXRjaCB7IHJldHVybiBmYWxzZTsgfVxuICB9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN1bW1hcnkgaGVscGVycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gcGxhdGZvcm1MYWJlbChwbGF0Zm9ybTogUGxhdGZvcm0pOiBzdHJpbmcge1xuICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgY2FzZSBcImFuZHJvaWRcIjogcmV0dXJuIFwiQW5kcm9pZFwiO1xuICAgIGNhc2UgXCJ3aW5kb3dzMTFcIjogcmV0dXJuIFwiV2luZG93cyAxMSAoV2luVUkgMyAvIC5ORVQgMTApXCI7XG4gICAgY2FzZSBcIndpbmRvd3MxMFwiOiByZXR1cm4gXCJXaW5kb3dzIDEwIChXUEYgLyAuTkVUIEZXIDQuOClcIjtcbiAgICBkZWZhdWx0OiByZXR1cm4gXCJpT1NcIjtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFN1bW1hcnkoYWdlbnQ6IEFnZW50VHlwZSwgcGxhdGZvcm06IFBsYXRmb3JtLCBhY3Rpb25zOiBzdHJpbmdbXSwgd2FybmluZ3M6IHN0cmluZ1tdLCBtYW51YWxTdGVwczogc3RyaW5nW10pIHtcbiAgY29uc3QgaXNBbmRyb2lkID0gcGxhdGZvcm0gPT09IFwiYW5kcm9pZFwiO1xuICBjb25zdCBpc1dpbmRvd3MgPSBwbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzMTFcIiB8fCBwbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzMTBcIjtcbiAgY29uc29sZS5sb2coXCJcXG5cIiArIGNoYWxrLmJvbGQoXCJcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcIikpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGAgIFBhdGggVGVybWluYWwgU0RLIFx1MjAxNCBTZXR1cCBDb21wbGV0ZSAoJHtwbGF0Zm9ybUxhYmVsKHBsYXRmb3JtKX0pYCkpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXFxuXCIpKTtcblxuICBpZiAoYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJcdTI3MTMgRG9uZTpcIikpO1xuICAgIGFjdGlvbnMuZm9yRWFjaCgoYSkgPT4gY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCAgXHUyMDIyICR7YX1gKSkpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gIH1cblxuICBpZiAobWFudWFsU3RlcHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIlx1MjZBMCBNYW51YWwgc3RlcHMgcmVxdWlyZWQ6XCIpKTtcbiAgICBtYW51YWxTdGVwcy5mb3JFYWNoKChzLCBpKSA9PiBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCAgJHtpICsgMX0uICR7c31gKSkpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gIH1cblxuICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlx1MjEzOSBOb3RlczpcIikpO1xuICAgIHdhcm5pbmdzLmZvckVhY2goKHcpID0+IGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBcdTIwMjIgJHt3fWApKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfVxuXG4gIC8vIENhbm9uaWNhbCBmaXJzdC1wcm9tcHQgdGV4dCBcdTIwMTQgaWRlbnRpY2FsIGZvciBDbGF1ZGUgQ29kZSBhbmQgQ3Vyc29yIHNvIHRoZVxuICAvLyBhZ2VudCByZWNlaXZlcyB0aGUgc2FtZSBkaXJlY3RpdmUgcmVnYXJkbGVzcyBvZiB0aGUgZGV2ZWxvcGVyJ3MgSURFLlxuICBjb25zdCBtY3BQcm9tcHQgPVxuICAgIHBsYXRmb3JtID09PSBcImFuZHJvaWRcIiA/IFwiaW50ZWdyYXRlLXBhdGgtYW5kcm9pZFwiIDpcbiAgICBwbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzMTFcIiA/IFwiaW50ZWdyYXRlLXBhdGgtd2luZG93czExXCIgOlxuICAgIHBsYXRmb3JtID09PSBcIndpbmRvd3MxMFwiID8gXCJpbnRlZ3JhdGUtcGF0aC13aW5kb3dzMTBcIiA6XG4gICAgXCJpbnRlZ3JhdGUtcGF0aC1zYWxlXCI7XG4gIGNvbnN0IGZpcnN0UHJvbXB0ID1cbiAgICAnICBcIkludGVncmF0ZSB0aGUgUGF0aCBUZXJtaW5hbCBTREsgaW50byB0aGlzIEVQT1MgYXBwLiBSZWFkIENMQVVERS5tZFxcbicgK1xuICAgICcgICBmb3IgdGhlIGludGVncmF0aW9uIHJ1bGVzLCB0aGVuIHVzZSB0aGUgUGF0aCBNQ1AgJyArIG1jcFByb21wdCArICdcXG4nICtcbiAgICAnICAgcHJvbXB0IHRvIGFkZCBhIFBhdGggUE9TIEFkYXB0ZXIgaW4gU2V0dGluZ3MgXHUyMDE0IGEgYmFja2VuZCBzd2l0Y2hlciBmb3IgdGhlXFxuJyArXG4gICAgJyAgIFBhdGggUE9TIEVtdWxhdG9yIChXaS1GaS9JUCBvciBCbHVldG9vdGgpIGFuZCBhIHJlYWwgVmVyaWZvbmUgdGVybWluYWwuXCInO1xuXG4gIGlmIChhZ2VudCA9PT0gXCJjbGF1ZGVcIikge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJcdUQ4M0RcdURFODAgU3RhcnQgQ2xhdWRlIENvZGUgaW4gdGhpcyBkaXJlY3Rvcnk6XCIpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICBjbGF1ZGUgLS1tb2RlbCBzb25uZXRcIikpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIiAgVGhlbiBwYXN0ZSB0aGlzIHByb21wdDpcIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oZmlyc3RQcm9tcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiXHVEODNEXHVERTgwIFlvdXIgZmlyc3QgcHJvbXB0IGluIEN1cnNvcjpcIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oZmlyc3RQcm9tcHQpKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBNQ1Agc2VydmVyOiAke01DUF9TRVJWRVJfVVJMfWApKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiICBEb2NzOiAgICAgICBodHRwczovL21jcC5wYXRoMmFpLnRlY2gvaGVhbHRoXCIpKTtcbiAgY29uc29sZS5sb2coKTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIE1haW4gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbnByb2dyYW1cbiAgLm5hbWUoXCJwYXRoLXRlcm1pbmFsLWluaXRcIilcbiAgLmRlc2NyaXB0aW9uKFxuICAgIFwiU2V0IHVwIHRoZSBQYXRoIFRlcm1pbmFsIFNESyBpbnRlZ3JhdGlvbiBhc3Npc3RhbnQgZm9yIHlvdXIgRVBPUyBwcm9qZWN0LlxcblwiICtcbiAgICAgIFwiQXV0by1kZXRlY3RzIHBsYXRmb3JtIChpT1MsIEFuZHJvaWQsIG9yIFdpbmRvd3MpIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxcblwiICtcbiAgICAgIFwiQ29uZmlndXJlcyBNQ1Agc2VydmVyIGFjY2VzcywgZHJvcHMgdGhlIGludGVncmF0aW9uIHJlY2lwZSwgYW5kIG9wdGlvbmFsbHlcXG5cIiArXG4gICAgICBcImFkZHMgdGhlIFNESyBkZXBlbmRlbmN5LlxcblxcblwiICtcbiAgICAgIFwiU3VwcG9ydGVkIGFnZW50czogY2xhdWRlIChkZWZhdWx0KSwgY3Vyc29yXFxuXCIgK1xuICAgICAgXCJTdXBwb3J0ZWQgcGxhdGZvcm1zOiBpb3MgKGRlZmF1bHQpLCBhbmRyb2lkLCB3aW5kb3dzMTEgKFdpblVJIDMgLyAuTkVUIDEwKSxcXG5cIiArXG4gICAgICBcIndpbmRvd3MxMCAoV1BGIC8gLk5FVCBGVyA0LjgpLiBVc2UgJ3dpbmRvd3MnIHRvIGF1dG8tcGljayB0aGUgV2luZG93cyBmbGF2b3VyLlwiXG4gIClcbiAgLnZlcnNpb24oXCIwLjIuMFwiKVxuICAub3B0aW9uKFwiLS10b29scy1vbmx5XCIsIFwiT25seSBjb25maWd1cmUgTUNQICsgcnVsZXMuIFNraXAgU0RLIGluc3RhbGxhdGlvbi5cIilcbiAgLm9wdGlvbihcIi0tYWdlbnQgPG5hbWU+XCIsIFwiQUkgYWdlbnQgdG8gY29uZmlndXJlOiAnY2xhdWRlJyAoZGVmYXVsdCkgb3IgJ2N1cnNvcicuXCIsIFwiY2xhdWRlXCIpXG4gIC5vcHRpb24oXCItLXBsYXRmb3JtIDxuYW1lPlwiLCBcIlBsYXRmb3JtOiBpb3MgfCBhbmRyb2lkIHwgd2luZG93cyB8IHdpbmRvd3MxMSB8IHdpbmRvd3MxMC4gQXV0by1kZXRlY3RlZCBpZiBub3Qgc3BlY2lmaWVkLlwiKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgdG9vbHNPbmx5OiBib29sZWFuID0gb3B0aW9ucy50b29sc09ubHkgPz8gZmFsc2U7XG4gICAgY29uc3QgYWdlbnQ6IEFnZW50VHlwZSA9IChvcHRpb25zLmFnZW50ID8/IFwiY2xhdWRlXCIpIGFzIEFnZW50VHlwZTtcbiAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgLy8gQXV0by1kZXRlY3QgcGxhdGZvcm0uIE9yZGVyOiBBbmRyb2lkIChHcmFkbGUpIFx1MjE5MiBXaW5kb3dzICguY3Nwcm9qLy5zbG4pIFx1MjE5MiBpT1MgKGRlZmF1bHQpLlxuICAgIGNvbnN0IHJhd1BsYXRmb3JtOiBzdHJpbmcgPSBvcHRpb25zLnBsYXRmb3JtID8/IFwiYXV0b1wiO1xuICAgIGNvbnN0IFZBTElEX1BMQVRGT1JNUyA9IFtcImlvc1wiLCBcImFuZHJvaWRcIiwgXCJ3aW5kb3dzXCIsIFwid2luZG93czExXCIsIFwid2luZG93czEwXCJdO1xuICAgIGxldCBwbGF0Zm9ybTogUGxhdGZvcm07XG4gICAgaWYgKHJhd1BsYXRmb3JtID09PSBcImF1dG9cIiB8fCAhVkFMSURfUExBVEZPUk1TLmluY2x1ZGVzKHJhd1BsYXRmb3JtKSkge1xuICAgICAgaWYgKGZpbmRBbmRyb2lkUHJvamVjdChjd2QpKSBwbGF0Zm9ybSA9IFwiYW5kcm9pZFwiO1xuICAgICAgZWxzZSBpZiAoZmluZFdpbmRvd3NQcm9qZWN0KGN3ZCkpIHBsYXRmb3JtID0gZGV0ZWN0V2luZG93c0ZsYXZvdXIoY3dkKTtcbiAgICAgIGVsc2UgcGxhdGZvcm0gPSBcImlvc1wiO1xuICAgIH0gZWxzZSBpZiAocmF3UGxhdGZvcm0gPT09IFwid2luZG93c1wiKSB7XG4gICAgICAvLyBFeHBsaWNpdCBXaW5kb3dzLCBidXQgbGV0IHRoZSAuY3Nwcm9qIGRlY2lkZSBXaW4xMSAoV2luVUkgMykgdnMgV2luMTAgKFdQRikuXG4gICAgICBwbGF0Zm9ybSA9IGRldGVjdFdpbmRvd3NGbGF2b3VyKGN3ZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBsYXRmb3JtID0gcmF3UGxhdGZvcm0gYXMgUGxhdGZvcm07XG4gICAgfVxuICAgIGNvbnN0IGlzQW5kcm9pZCA9IHBsYXRmb3JtID09PSBcImFuZHJvaWRcIjtcbiAgICBjb25zdCBpc1dpbmRvd3MgPSBwbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzMTFcIiB8fCBwbGF0Zm9ybSA9PT0gXCJ3aW5kb3dzMTBcIjtcblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIiAgUGF0aCBUZXJtaW5hbCBTREsgXHUyMDE0IEludGVncmF0aW9uIEFzc2lzdGFudCBTZXR1cFwiKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiICBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBBZ2VudDogICAgJHthZ2VudH1gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFBsYXRmb3JtOiAke3BsYXRmb3JtfSR7b3B0aW9ucy5wbGF0Zm9ybSA/IFwiXCIgOiBcIiAoYXV0by1kZXRlY3RlZClcIn1gKSk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIGlmIChhZ2VudCAhPT0gXCJjdXJzb3JcIiAmJiBhZ2VudCAhPT0gXCJjbGF1ZGVcIikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgXHUyNkEwIEFnZW50ICcke2FnZW50fScgaXMgbm90IHN1cHBvcnRlZC4gVXNlICdjdXJzb3InIG9yICdjbGF1ZGUnLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG1hbnVhbFN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIDEuIFNESyBpbnN0YWxsYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgaWYgKCF0b29sc09ubHkpIHtcbiAgICAgIGlmIChpc0FuZHJvaWQpIHtcbiAgICAgICAgLy8gXHUyNTAwXHUyNTAwIEFuZHJvaWQ6IEppdFBhY2sgKyBHcmFkbGUgXHUyNTAwXHUyNTAwXG4gICAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoXCJDaGVja2luZyBBbmRyb2lkIHByb2plY3RcdTIwMjZcIikuc3RhcnQoKTtcblxuICAgICAgICBpZiAoIWZpbmRBbmRyb2lkUHJvamVjdChjd2QpKSB7XG4gICAgICAgICAgc3Bpbm5lci53YXJuKFwiTm8gQW5kcm9pZCBwcm9qZWN0IGZvdW5kIChzZXR0aW5ncy5ncmFkbGUua3RzIG9yIGFwcC9idWlsZC5ncmFkbGUua3RzIG1pc3NpbmcpLlwiKTtcbiAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBhc2soXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXCIgIENvbnRpbnVlIHdpdGggdG9vbHMtb25seSBzZXR1cD8gKHkvbik6IFwiKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGFuc3dlci50b0xvd2VyQ2FzZSgpICE9PSBcInlcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiXFxuICBSdW4gdGhpcyBmcm9tIHlvdXIgQW5kcm9pZCBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LlxcblwiKSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdhcm5pbmdzLnB1c2goXCJSYW4gaW4gdG9vbHMtb25seSBtb2RlIFx1MjAxNCBubyBBbmRyb2lkIHByb2plY3QgZm91bmQuXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGhhc0FuZHJvaWRTREtEZXBlbmRlbmN5KGN3ZCkpIHtcbiAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJQYXRoIFRlcm1pbmFsIFNESyBhbHJlYWR5IHByZXNlbnQgaW4gc2V0dGluZ3MuZ3JhZGxlLmt0cy5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwiU0RLIGRlcGVuZGVuY3kgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcGlubmVyLnRleHQgPSBcIkFkZGluZyBKaXRQYWNrIHJlcG9zaXRvcnkgdG8gc2V0dGluZ3MuZ3JhZGxlLmt0c1x1MjAyNlwiO1xuICAgICAgICAgIGNvbnN0IHNldHRpbmdzT2sgPSBpbmplY3RKaXRQYWNrUmVwbyhjd2QpO1xuICAgICAgICAgIGNvbnN0IGRlcHNPayA9IGluamVjdEdyYWRsZURlcGVuZGVuY2llcyhjd2QpO1xuXG4gICAgICAgICAgaWYgKHNldHRpbmdzT2spIHtcbiAgICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIkppdFBhY2sgcmVwb3NpdG9yeSBhZGRlZCB0byBzZXR0aW5ncy5ncmFkbGUua3RzLlwiKTtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChcIkppdFBhY2sgcmVwb3NpdG9yeSBhZGRlZCB0byBzZXR0aW5ncy5ncmFkbGUua3RzXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVwc09rKSB7XG4gICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJTREsgZGVwZW5kZW5jaWVzIGFkZGVkIHRvIGFwcC9idWlsZC5ncmFkbGUua3RzLlwiKTtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChcInBhdGgtdGVybWluYWwtc2RrICsgcGF0aC1lbXVsYXRvci1hZGFwdGVyIGFkZGVkIHRvIGFwcC9idWlsZC5ncmFkbGUua3RzXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzcGlubmVyLndhcm4oXCJDb3VsZCBub3QgYXV0by1pbmplY3QgZGVwZW5kZW5jaWVzIGludG8gYXBwL2J1aWxkLmdyYWRsZS5rdHMuXCIpO1xuICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgYEFkZCB0byBhcHAvYnVpbGQuZ3JhZGxlLmt0cyBkZXBlbmRlbmNpZXMge306XFxuYCArXG4gICAgICAgICAgICAgIGAgICAgIGltcGxlbWVudGF0aW9uKFwiJHtBTkRST0lEX1NES19KSVRQQUNLX0dST1VQfTpwYXRoLXRlcm1pbmFsLXNkazoke0FORFJPSURfU0RLX0pJVFBBQ0tfVkVSU0lPTn1cIilcXG5gICtcbiAgICAgICAgICAgICAgYCAgICAgaW1wbGVtZW50YXRpb24oXCIke0FORFJPSURfU0RLX0pJVFBBQ0tfR1JPVVB9OnBhdGgtZW11bGF0b3ItYWRhcHRlcjoke0FORFJPSURfU0RLX0pJVFBBQ0tfVkVSU0lPTn1cIilgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1dpbmRvd3MpIHtcbiAgICAgICAgLy8gXHUyNTAwXHUyNTAwIFdpbmRvd3M6IFByb2plY3RSZWZlcmVuY2UgdG8gdGhlIHNpYmxpbmcgU0RLIFx1MjUwMFx1MjUwMFxuICAgICAgICBjb25zdCBzcGlubmVyID0gb3JhKFwiQ2hlY2tpbmcgV2luZG93cyAoLk5FVCkgcHJvamVjdFx1MjAyNlwiKS5zdGFydCgpO1xuICAgICAgICBpZiAoIWZpbmRXaW5kb3dzUHJvamVjdChjd2QpKSB7XG4gICAgICAgICAgc3Bpbm5lci53YXJuKFwiTm8gV2luZG93cyBwcm9qZWN0IGZvdW5kICguc2xuIG9yIC5jc3Byb2opLlwiKTtcbiAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBhc2soY2hhbGsueWVsbG93KFwiICBDb250aW51ZSB3aXRoIHRvb2xzLW9ubHkgc2V0dXA/ICh5L24pOiBcIikpO1xuICAgICAgICAgIGlmIChhbnN3ZXIudG9Mb3dlckNhc2UoKSAhPT0gXCJ5XCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlxcbiAgUnVuIHRoaXMgZnJvbSB5b3VyIFdpbmRvd3MgRVBPUyBwcm9qZWN0IHJvb3QuXFxuXCIpKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgd2FybmluZ3MucHVzaChcIlJhbiBpbiB0b29scy1vbmx5IG1vZGUgXHUyMDE0IG5vIFdpbmRvd3MgcHJvamVjdCBmb3VuZC5cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzV2luZG93c1NES0RlcGVuZGVuY3koY3dkKSkge1xuICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZChcIlBhdGggVGVybWluYWwgU0RLIGFscmVhZHkgcmVmZXJlbmNlZCBpbiB0aGUgcHJvamVjdC5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwiU0RLIFByb2plY3RSZWZlcmVuY2UgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcGlubmVyLmluZm8oXCJQYXRoIFNESyBpcyB3aXJlZCBieSBQcm9qZWN0UmVmZXJlbmNlIFx1MjAxNCB0aGUgaW50ZWdyYXRpb24gcmVjaXBlIChTdGVwIDApIGRvZXMgdGhpcy5cIik7XG4gICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgIGBBZGQgdGhlIFBhdGggU0RLIFByb2plY3RSZWZlcmVuY2VzIHRvIHlvdXIgLmNzcHJvaiBcdTIwMTQgdGhlIGludGVncmF0aW9uIHJlY2lwZSdzIFN0ZXAgMCBsaXN0cyBhbGwgc2l4IGAgK1xuICAgICAgICAgICAgYChDb3JlTW9kZWxzLCBTZGssIEVtdWxhdG9yQWRhcHRlciwgTW9ja0FkYXB0ZXIsIERpYWdub3N0aWNzLCBQc2RrQWRhcHRlcikuIGAgK1xuICAgICAgICAgICAgYENsb25lICR7V0lORE9XU19TREtfUkVQT30gYXMgYSBTSUJMSU5HIGZvbGRlciBvZiB0aGlzIHByb2plY3QgZmlyc3QuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFx1MjUwMFx1MjUwMCBpT1M6IFNQTSAvIFhjb2RlIFx1MjUwMFx1MjUwMFxuICAgICAgICBjb25zdCBzcGlubmVyID0gb3JhKFwiQ2hlY2tpbmcgZm9yIFhjb2RlIHByb2plY3RcdTIwMjZcIikuc3RhcnQoKTtcblxuICAgICAgICBjb25zdCB4Y29kZVByb2plY3QgPSBmaW5kWGNvZGVQcm9qZWN0KGN3ZCk7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VTd2lmdCA9IGZpbmRQYWNrYWdlU3dpZnQoY3dkKTtcblxuICAgICAgICBpZiAocGFja2FnZVN3aWZ0KSB7XG4gICAgICAgICAgc3Bpbm5lci50ZXh0ID0gXCJGb3VuZCBQYWNrYWdlLnN3aWZ0IFx1MjAxNCBhZGRpbmcgUGF0aFRlcm1pbmFsU0RLIGRlcGVuZGVuY3lcdTIwMjZcIjtcbiAgICAgICAgICBpZiAoaGFzU0RLRGVwZW5kZW5jeShwYWNrYWdlU3dpZnQpKSB7XG4gICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJQYXRoVGVybWluYWxTREsgYWxyZWFkeSBwcmVzZW50IGluIFBhY2thZ2Uuc3dpZnQuXCIpO1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKFwiUGF0aFRlcm1pbmFsU0RLIGRlcGVuZGVuY3kgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5qZWN0ZWQgPSBpbmplY3RTUE1EZXBlbmRlbmN5KHBhY2thZ2VTd2lmdCk7XG4gICAgICAgICAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiUGF0aFRlcm1pbmFsU0RLIGFkZGVkIHRvIFBhY2thZ2Uuc3dpZnQuXCIpO1xuICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goXCJQYXRoVGVybWluYWxTREsgYWRkZWQgdG8gUGFja2FnZS5zd2lmdFwiKTtcbiAgICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgICBgT3BlbiBYY29kZSBhbmQgbGluayBhbGwgZm91ciB0YXJnZXRzIHRvIHlvdXIgYXBwOiBQYXRoVGVybWluYWxTREssIFBhdGhFbXVsYXRvckFkYXB0ZXIsIFBhdGhDb3JlTW9kZWxzLCBQYXRoVmVyaWZvbmVQU0RLQWRhcHRlci5gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzcGlubmVyLndhcm4oXCJDb3VsZCBub3QgYXV0b21hdGljYWxseSBtb2RpZnkgUGFja2FnZS5zd2lmdCBcdTIwMTQgbWFudWFsIHN0ZXAgcmVxdWlyZWQuXCIpO1xuICAgICAgICAgICAgICBtYW51YWxTdGVwcy5wdXNoKFxuICAgICAgICAgICAgICAgIGBBZGQgUGF0aFRlcm1pbmFsU0RLIG1hbnVhbGx5IHRvIFBhY2thZ2Uuc3dpZnQ6XFxuYCArXG4gICAgICAgICAgICAgICAgICBgICAgICAucGFja2FnZSh1cmw6IFwiJHtTREtfR0lUSFVCX1VSTH1cIiwgZnJvbTogXCIke1NES19WRVJTSU9OfVwiKWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoeGNvZGVQcm9qZWN0KSB7XG4gICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKGBGb3VuZCBYY29kZSBwcm9qZWN0OiAke3BhdGguYmFzZW5hbWUoeGNvZGVQcm9qZWN0KX1gKTtcbiAgICAgICAgICBpZiAoaGFzWGNvZGVQcm9qZWN0U0RLRGVwZW5kZW5jeSh4Y29kZVByb2plY3QpKSB7XG4gICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJQYXRoVGVybWluYWxTREsgYWxyZWFkeSBwcmVzZW50IGluIFhjb2RlIHByb2plY3QuXCIpO1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKFwiUGF0aFRlcm1pbmFsU0RLIGRlcGVuZGVuY3kgYWxyZWFkeSBwcmVzZW50IFx1MjAxNCBubyBjaGFuZ2UgbmVlZGVkLlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBcIlxcbiAgXHUyNkEwIEF1dG9tYXRpYyBTUE0gaW5qZWN0aW9uIGludG8gLnhjb2RlcHJvaiBpcyBub3Qgc3VwcG9ydGVkIChYY29kZSBtYW5hZ2VzIHRoaXMpLlwiXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiXFxuICBUbyBhZGQgUGF0aFRlcm1pbmFsU0RLIGluIFhjb2RlOlwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiAgMS4gT3BlbiB5b3VyIHByb2plY3QgaW4gWGNvZGVcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiAgMi4gRmlsZSBcdTIxOTIgQWRkIFBhY2thZ2UgRGVwZW5kZW5jaWVzXHUyMDI2XCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgMy4gRW50ZXIgVVJMOiAke2NoYWxrLmN5YW4oU0RLX0dJVEhVQl9VUkwpfWApO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIFwiICA0LiBJbiB0aGUgJ0Nob29zZSBQYWNrYWdlIFByb2R1Y3RzJyBkaWFsb2csIHNldCBhbGwgZm91ciB0byB5b3VyIGFwcCB0YXJnZXQ6XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICAgICAgIFBhdGhUZXJtaW5hbFNESyAgICAgICAgXHUyMTkyIHlvdXIgYXBwIHRhcmdldFwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICAgICAgIFBhdGhFbXVsYXRvckFkYXB0ZXIgICAgXHUyMTkyIHlvdXIgYXBwIHRhcmdldFwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICAgICAgIFBhdGhDb3JlTW9kZWxzICAgICAgICAgXHUyMTkyIHlvdXIgYXBwIHRhcmdldFwiKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKFwiICAgICAgIFBhdGhWZXJpZm9uZVBTREtBZGFwdGVyIFx1MjE5MiB5b3VyIGFwcCB0YXJnZXRcIikpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiICAgICAoUGF0aFZlcmlmb25lUFNES0FkYXB0ZXIgaXMgcmVxdWlyZWQgZm9yIHRoZSBWZXJpZm9uZSBiYWNrZW5kOyBQYXRoRGlhZ25vc3RpY3MgY2FuIGJlIGxlZnQgYXMgTm9uZSlcIikpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCIgIDUuIENsaWNrIEFkZCBQYWNrYWdlXFxuXCIpO1xuICAgICAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgYXNrKFxuICAgICAgICAgICAgICBjaGFsay5ib2xkKFwiICBQcmVzcyBFbnRlciBvbmNlIHlvdSBoYXZlIGFkZGVkIHRoZSBwYWNrYWdlLCBvciB0eXBlICdza2lwJyB0byBkbyB0aGlzIGxhdGVyOiBcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY29uZmlybWVkLnRvTG93ZXJDYXNlKCkgIT09IFwic2tpcFwiKSB7XG4gICAgICAgICAgICAgIGFjdGlvbnMucHVzaChgUGF0aFRlcm1pbmFsU0RLIGFkZGVkIHRvIFhjb2RlIHByb2plY3QgKGNvbmZpcm1lZCBieSB1c2VyKWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgICBgQWRkIFBhdGhUZXJtaW5hbFNESyB2aWEgWGNvZGU6IEZpbGUgXHUyMTkyIEFkZCBQYWNrYWdlIERlcGVuZGVuY2llcyBcdTIxOTIgJHtTREtfR0lUSFVCX1VSTH1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNwaW5uZXIud2FybihcIk5vIFhjb2RlIHByb2plY3QgZm91bmQgaW4gY3VycmVudCBkaXJlY3RvcnkuXCIpO1xuICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGFzayhcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgXCIgIE5vIC54Y29kZXByb2ogb3IgUGFja2FnZS5zd2lmdCBmb3VuZC4gQ29udGludWUgd2l0aCB0b29scy1vbmx5IHNldHVwPyAoeS9uKTogXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChhbnN3ZXIudG9Mb3dlckNhc2UoKSAhPT0gXCJ5XCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay5kaW0oXCJcXG4gIFJ1biB0aGlzIGNvbW1hbmQgZnJvbSB5b3VyIFhjb2RlIHByb2plY3QgZGlyZWN0b3J5LCBvciB1c2UgLS10b29scy1vbmx5LlxcblwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgd2FybmluZ3MucHVzaChcIlJhbiBpbiB0b29scy1vbmx5IG1vZGUgXHUyMDE0IG5vIFhjb2RlIHByb2plY3QgZm91bmQuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGlvbnMucHVzaChcIlNraXBwZWQgU0RLIGluc3RhbGxhdGlvbiAoLS10b29scy1vbmx5IG1vZGUpXCIpO1xuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCAyLiBNQ1AgY29uZmlnIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoXCJXcml0aW5nIE1DUCBzZXJ2ZXIgY29uZmlnXHUyMDI2XCIpLnN0YXJ0KCk7XG5cbiAgICAgIGxldCByZXN1bHQ6IHsgd3JpdHRlbjogYm9vbGVhbjsgbWVyZ2VkOiBib29sZWFuIH07XG4gICAgICBsZXQgY29uZmlnRmlsZTogc3RyaW5nO1xuXG4gICAgICBpZiAoYWdlbnQgPT09IFwiY2xhdWRlXCIpIHtcbiAgICAgICAgcmVzdWx0ID0gd3JpdGVDbGF1ZGVNY3BDb25maWcoY3dkKTtcbiAgICAgICAgY29uZmlnRmlsZSA9IFwiLm1jcC5qc29uXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB3cml0ZUN1cnNvck1jcENvbmZpZyhjd2QpO1xuICAgICAgICBjb25maWdGaWxlID0gXCIuY3Vyc29yL21jcC5qc29uXCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQud3JpdHRlbiAmJiByZXN1bHQubWVyZ2VkKSB7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZChgTUNQIGNvbmZpZyBtZXJnZWQgaW50byBleGlzdGluZyAke2NvbmZpZ0ZpbGV9LmApO1xuICAgICAgICBhY3Rpb25zLnB1c2goYHBhdGgtdGVybWluYWwgZW50cnkgbWVyZ2VkIGludG8gJHtjb25maWdGaWxlfWApO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQud3JpdHRlbikge1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoYE1DUCBjb25maWcgd3JpdHRlbiB0byAke2NvbmZpZ0ZpbGV9LmApO1xuICAgICAgICBhY3Rpb25zLnB1c2goYE1DUCBzZXJ2ZXIgY29uZmlndXJlZDogJHtjb25maWdGaWxlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bpbm5lci5pbmZvKFwiTUNQIGNvbmZpZyBhbHJlYWR5IHByZXNlbnQgXHUyMDE0IG5vIGNoYW5nZSBuZWVkZWQuXCIpO1xuICAgICAgICBhY3Rpb25zLnB1c2goXCJNQ1AgY29uZmlnIGFscmVhZHkgcHJlc2VudCBcdTIwMTQgbm8gY2hhbmdlIG5lZWRlZC5cIik7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBDbGF1ZGUgQ29kZSwgYWxzbyBwcmUtYXBwcm92ZSB0aGUgTUNQIHNlcnZlciBpbiAuY2xhdWRlL3NldHRpbmdzLmpzb24uXG4gICAgICAvLyBXaXRob3V0IHRoaXMsIENsYXVkZSBDb2RlIHNob3dzIGFuIGludGVyYWN0aXZlIFwiQWxsb3cgdGhpcyBNQ1Agc2VydmVyP1wiXG4gICAgICAvLyBwcm9tcHQgb24gZmlyc3QgbGF1bmNoIFx1MjAxNCBlYXN5IHRvIG1pc3MsIGFuZCB0aGUgYWdlbnQgZW5kcyB1cCBydW5uaW5nXG4gICAgICAvLyB3aXRob3V0IE1DUCB0b29scyBpZiB0aGUgdXNlciBkaXNtaXNzZXMgaXQuXG4gICAgICBpZiAoYWdlbnQgPT09IFwiY2xhdWRlXCIpIHtcbiAgICAgICAgY29uc3QgYXBwcm92ZVNwaW5uZXIgPSBvcmEoXCJQcmUtYXBwcm92aW5nIFBhdGggTUNQIHNlcnZlciBmb3IgQ2xhdWRlIENvZGVcdTIwMjZcIikuc3RhcnQoKTtcbiAgICAgICAgY29uc3QgYXBwcm92ZSA9IHdyaXRlQ2xhdWRlU2V0dGluZ3MoY3dkKTtcbiAgICAgICAgaWYgKGFwcHJvdmUuYWxyZWFkeUFwcHJvdmVkKSB7XG4gICAgICAgICAgYXBwcm92ZVNwaW5uZXIuaW5mbyhcIlBhdGggTUNQIHNlcnZlciBhbHJlYWR5IHByZS1hcHByb3ZlZCBcdTIwMTQgbm8gY2hhbmdlIG5lZWRlZC5cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoYXBwcm92ZS53cml0dGVuICYmIGFwcHJvdmUubWVyZ2VkKSB7XG4gICAgICAgICAgYXBwcm92ZVNwaW5uZXIuc3VjY2VlZChcInBhdGgtdGVybWluYWwgYWRkZWQgdG8gZXhpc3RpbmcgLmNsYXVkZS9zZXR0aW5ncy5qc29uLlwiKTtcbiAgICAgICAgICBhY3Rpb25zLnB1c2goXCJwYXRoLXRlcm1pbmFsIHByZS1hcHByb3ZlZCBpbiAuY2xhdWRlL3NldHRpbmdzLmpzb25cIik7XG4gICAgICAgIH0gZWxzZSBpZiAoYXBwcm92ZS53cml0dGVuKSB7XG4gICAgICAgICAgYXBwcm92ZVNwaW5uZXIuc3VjY2VlZChcIlByZS1hcHByb3ZhbCB3cml0dGVuIHRvIC5jbGF1ZGUvc2V0dGluZ3MuanNvbi5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwiQ2xhdWRlIENvZGUgcHJlLWFwcHJvdmFsOiAuY2xhdWRlL3NldHRpbmdzLmpzb25cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXBwcm92ZVNwaW5uZXIud2FybihcIkNvdWxkIG5vdCB3cml0ZSAuY2xhdWRlL3NldHRpbmdzLmpzb24gXHUyMDE0IHlvdSBtYXkgc2VlIGFuIFxcXCJBbGxvdyBNQ1Agc2VydmVyP1xcXCIgcHJvbXB0IG9uIGZpcnN0IENsYXVkZSBDb2RlIGxhdW5jaC4gQWNjZXB0IGl0LlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCAzLiBSdWxlcyBmaWxlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoYFdyaXRpbmcgJHthZ2VudCA9PT0gXCJjbGF1ZGVcIiA/IFwiQ0xBVURFLm1kXCIgOiBcIkN1cnNvciBydWxlc1wifSBmaWxlXHUyMDI2YCkuc3RhcnQoKTtcblxuICAgICAgbGV0IHJlc3VsdDogeyB3cml0dGVuOiBib29sZWFuOyBza2lwcGVkOiBib29sZWFuIH07XG4gICAgICBsZXQgcnVsZXNGaWxlOiBzdHJpbmc7XG5cbiAgICAgIC8vIFBlci1wbGF0Zm9ybSByZWNpcGUgc291cmNlICsgZmV0Y2ggVVJMICsgZmlsZW5hbWUuXG4gICAgICBjb25zdCBydWxlc0J5UGxhdGZvcm0gPSB7XG4gICAgICAgIGlvczogICAgICAgeyBzcmM6IFJVTEVTX1NPVVJDRSwgICAgICAgICAgdXJsOiBSVUxFU19GRVRDSF9VUkwsICAgICAgICAgIGZpbGU6IFwicGF0aC1pbnRlZ3JhdGlvbi5tZGNcIiB9LFxuICAgICAgICBhbmRyb2lkOiAgIHsgc3JjOiBBTkRST0lEX1JVTEVTX1NPVVJDRSwgICB1cmw6IEFORFJPSURfUlVMRVNfRkVUQ0hfVVJMLCAgIGZpbGU6IFwicGF0aC1pbnRlZ3JhdGlvbi1hbmRyb2lkLm1kY1wiIH0sXG4gICAgICAgIHdpbmRvd3MxMTogeyBzcmM6IFdJTkRPV1MxMV9SVUxFU19TT1VSQ0UsIHVybDogV0lORE9XUzExX1JVTEVTX0ZFVENIX1VSTCwgZmlsZTogXCJwYXRoLWludGVncmF0aW9uLXdpbmRvd3MxMS5tZGNcIiB9LFxuICAgICAgICB3aW5kb3dzMTA6IHsgc3JjOiBXSU5ET1dTMTBfUlVMRVNfU09VUkNFLCB1cmw6IFdJTkRPV1MxMF9SVUxFU19GRVRDSF9VUkwsIGZpbGU6IFwicGF0aC1pbnRlZ3JhdGlvbi13aW5kb3dzMTAubWRjXCIgfSxcbiAgICAgIH0gYXMgY29uc3Q7XG4gICAgICBjb25zdCBhY3RpdmVSdWxlcyA9IHJ1bGVzQnlQbGF0Zm9ybVtwbGF0Zm9ybV07XG4gICAgICBjb25zdCBhY3RpdmVGZXRjaFVybCA9IGFjdGl2ZVJ1bGVzLnVybDtcblxuICAgICAgaWYgKGFnZW50ID09PSBcImNsYXVkZVwiKSB7XG4gICAgICAgIHJlc3VsdCA9IHdyaXRlQ2xhdWRlUnVsZXNGaWxlKGN3ZCwgYWN0aXZlUnVsZXMuc3JjLCBhY3RpdmVGZXRjaFVybCk7XG4gICAgICAgIHJ1bGVzRmlsZSA9IFwiQ0xBVURFLm1kXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB3cml0ZUN1cnNvclJ1bGVzRmlsZShjd2QsIGFjdGl2ZVJ1bGVzLnNyYywgYWN0aXZlUnVsZXMuZmlsZSwgYWN0aXZlRmV0Y2hVcmwpO1xuICAgICAgICBydWxlc0ZpbGUgPSBgLmN1cnNvci9ydWxlcy8ke2FjdGl2ZVJ1bGVzLmZpbGV9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC53cml0dGVuKSB7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZChgUnVsZXMgZmlsZSB3cml0dGVuIHRvICR7cnVsZXNGaWxlfS5gKTtcbiAgICAgICAgYWN0aW9ucy5wdXNoKGBJbnRlZ3JhdGlvbiBydWxlcyBmaWxlOiAke3J1bGVzRmlsZX1gKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnNraXBwZWQpIHtcbiAgICAgICAgc3Bpbm5lci5pbmZvKFxuICAgICAgICAgIGAke3J1bGVzRmlsZX0gYWxyZWFkeSBleGlzdHMgXHUyMDE0IHNraXBwZWQgdG8gcHJlc2VydmUgeW91ciBjdXN0b21pc2F0aW9ucy5gXG4gICAgICAgICk7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICAgICAgYCR7cnVsZXNGaWxlfSBhbHJlYWR5IGV4aXN0cyBcdTIwMTQgbm90IG92ZXJ3cml0dGVuLmBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwaW5uZXIud2FybihcIkNvdWxkIG5vdCB3cml0ZSBydWxlcyBmaWxlIFx1MjAxNCBjaGVjayBuZXR3b3JrIGNvbm5lY3Rpdml0eS5cIik7XG4gICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgYERvd25sb2FkICR7YWN0aXZlUnVsZXMuZmlsZX0gbWFudWFsbHkgZnJvbTogJHthY3RpdmVGZXRjaFVybH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIDQuIFBlcm1pc3Npb24gY2hlY2sgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgaWYgKCF0b29sc09ubHkpIHtcbiAgICAgIGlmIChpc0FuZHJvaWQpIHtcbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYShcIkNoZWNraW5nIEFuZHJvaWRNYW5pZmVzdC54bWwgQkxFIHBlcm1pc3Npb25zXHUyMDI2XCIpLnN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0c1dpdGhJc3N1ZXMgPSBjaGVja0FuZHJvaWRNYW5pZmVzdChjd2QpO1xuICAgICAgICBpZiAobWFuaWZlc3RzV2l0aElzc3Vlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoXCJCTEUgcGVybWlzc2lvbnMgZm91bmQgaW4gQW5kcm9pZE1hbmlmZXN0LnhtbC5cIik7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKFwiQkxFIHBlcm1pc3Npb25zIHZlcmlmaWVkIGluIEFuZHJvaWRNYW5pZmVzdC54bWxcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Bpbm5lci53YXJuKFxuICAgICAgICAgICAgYEJMVUVUT09USF9TQ0FOIG1pc3NpbmcgZnJvbSAke21hbmlmZXN0c1dpdGhJc3N1ZXMubGVuZ3RofSBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUocykuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgbWFuaWZlc3RzV2l0aElzc3Vlcy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGl2ZSA9IHBhdGgucmVsYXRpdmUoY3dkLCBwKTtcbiAgICAgICAgICAgIG1hbnVhbFN0ZXBzLnB1c2goXG4gICAgICAgICAgICAgIGBBZGQgQkxFIHBlcm1pc3Npb25zIHRvICR7cmVsYXRpdmV9OlxcbmAgK1xuICAgICAgICAgICAgICBgICAgICAoQXNrIHRoZSBNQ1A6IFwiZ2V0X21hbmlmZXN0X3JlcXVpcmVtZW50c1wiIGZvciB0aGUgZnVsbCBYTUwpYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1dpbmRvd3MpIHtcbiAgICAgICAgLy8gV2luZG93cyByZWFjaGVzIEJMRSB2aWEgV2luUlQgXHUyMDE0IG5vIG1hbmlmZXN0IGNhcGFiaWxpdHkgdG8gYWRkICh1bnBhY2thZ2VkXG4gICAgICAgIC8vIFdpblVJIDMgLyBXUEYpLiBUaGUgV2ktRmkvSVAgYW5kIFZlcmlmb25lIGJhY2tlbmRzIHVzZSBubyBCbHVldG9vdGggYXQgYWxsLlxuICAgICAgICBhY3Rpb25zLnB1c2goXCJCbHVldG9vdGggbmVlZHMgbm8gbWFuaWZlc3QgZW50cnkgb24gV2luZG93cyAoV2luUlQpLlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoXCJDaGVja2luZyBJbmZvLnBsaXN0IEJMRSBwZXJtaXNzaW9uc1x1MjAyNlwiKS5zdGFydCgpO1xuICAgICAgICBjb25zdCBwbGlzdHNXaXRoSXNzdWVzID0gY2hlY2tJbmZvUGxpc3QoY3dkKTtcbiAgICAgICAgaWYgKHBsaXN0c1dpdGhJc3N1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKFwiQkxFIHBlcm1pc3Npb25zIGZvdW5kIGluIEluZm8ucGxpc3QuXCIpO1xuICAgICAgICAgIGFjdGlvbnMucHVzaChcIkJMRSBwZXJtaXNzaW9ucyB2ZXJpZmllZCBpbiBJbmZvLnBsaXN0XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNwaW5uZXIud2FybihcbiAgICAgICAgICAgIGBOU0JsdWV0b290aEFsd2F5c1VzYWdlRGVzY3JpcHRpb24gbWlzc2luZyBmcm9tICR7cGxpc3RzV2l0aElzc3Vlcy5sZW5ndGh9IEluZm8ucGxpc3QgZmlsZShzKS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwbGlzdHNXaXRoSXNzdWVzLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShjd2QsIHApO1xuICAgICAgICAgICAgbWFudWFsU3RlcHMucHVzaChcbiAgICAgICAgICAgICAgYEFkZCBCTEUgcGVybWlzc2lvbiB0byAke3JlbGF0aXZlfTpcXG5gICtcbiAgICAgICAgICAgICAgICBgICAgICA8a2V5Pk5TQmx1ZXRvb3RoQWx3YXlzVXNhZ2VEZXNjcmlwdGlvbjwva2V5PlxcbmAgK1xuICAgICAgICAgICAgICAgIGAgICAgIDxzdHJpbmc+VGhpcyBhcHAgY29ubmVjdHMgdG8gYSBQYXRoIHBheW1lbnQgdGVybWluYWwgdmlhIEJsdWV0b290aC48L3N0cmluZz5cXG5gICtcbiAgICAgICAgICAgICAgICBgICAgICAoQXNrIHRoZSBNQ1A6IFwiZ2V0X2luZm9fcGxpc3RfcmVxdWlyZW1lbnRzXCIgZm9yIHRoZSBmdWxsIFhNTClgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIDUuIFN1bW1hcnkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgcHJpbnRTdW1tYXJ5KGFnZW50LCBwbGF0Zm9ybSwgYWN0aW9ucywgd2FybmluZ3MsIG1hbnVhbFN0ZXBzKTtcbiAgfSk7XG5cbnByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLHVCQUF3QjtBQUN4QixtQkFBa0I7QUFDbEIsU0FBb0I7QUFDcEIsV0FBc0I7QUFDdEIsZUFBMEI7QUFDMUIsMkJBQXlCO0FBQ3pCLGlCQUFnQjtBQUVoQixNQUFNLGlCQUFpQjtBQUN2QixNQUFNLHlCQUF5QjtBQUMvQixNQUFNLGNBQWM7QUFDcEIsTUFBTSw4QkFBOEI7QUFDcEMsTUFBTSw0QkFBNEI7QUFDbEMsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSwwQkFBMEI7QUFD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
|
package/dist/init.js
CHANGED
|
@@ -6621,7 +6621,7 @@ program.name("path-terminal-init").description(
|
|
|
6621
6621
|
spinner.succeed("PathTerminalSDK added to Package.swift.");
|
|
6622
6622
|
actions.push("PathTerminalSDK added to Package.swift");
|
|
6623
6623
|
manualSteps.push(
|
|
6624
|
-
`Open Xcode and link all
|
|
6624
|
+
`Open Xcode and link all four targets to your app: PathTerminalSDK, PathEmulatorAdapter, PathCoreModels, PathVerifonePSDKAdapter.`
|
|
6625
6625
|
);
|
|
6626
6626
|
} else {
|
|
6627
6627
|
spinner.warn("Could not automatically modify Package.swift \u2014 manual step required.");
|
|
@@ -6647,12 +6647,13 @@ program.name("path-terminal-init").description(
|
|
|
6647
6647
|
console.log(" 2. File \u2192 Add Package Dependencies\u2026");
|
|
6648
6648
|
console.log(` 3. Enter URL: ${source_default.cyan(SDK_GITHUB_URL)}`);
|
|
6649
6649
|
console.log(
|
|
6650
|
-
" 4. In the 'Choose Package Products' dialog, set all
|
|
6650
|
+
" 4. In the 'Choose Package Products' dialog, set all four to your app target:"
|
|
6651
6651
|
);
|
|
6652
|
-
console.log(source_default.cyan(" PathTerminalSDK
|
|
6653
|
-
console.log(source_default.cyan(" PathEmulatorAdapter
|
|
6654
|
-
console.log(source_default.cyan(" PathCoreModels
|
|
6655
|
-
console.log(source_default.
|
|
6652
|
+
console.log(source_default.cyan(" PathTerminalSDK \u2192 your app target"));
|
|
6653
|
+
console.log(source_default.cyan(" PathEmulatorAdapter \u2192 your app target"));
|
|
6654
|
+
console.log(source_default.cyan(" PathCoreModels \u2192 your app target"));
|
|
6655
|
+
console.log(source_default.cyan(" PathVerifonePSDKAdapter \u2192 your app target"));
|
|
6656
|
+
console.log(source_default.dim(" (PathVerifonePSDKAdapter is required for the Verifone backend; PathDiagnostics can be left as None)"));
|
|
6656
6657
|
console.log(" 5. Click Add Package\n");
|
|
6657
6658
|
const confirmed = await ask(
|
|
6658
6659
|
source_default.bold(" Press Enter once you have added the package, or type 'skip' to do this later: ")
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "path-terminal-init",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "One-line setup for the Path Terminal SDK integration assistant — connects the user's AI agent to the Path MCP server and installs the per-OS integration recipe (iOS, Android, Windows). The single source of truth for the bootstrap CLI and the recipes.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"path-terminal-init": "dist/cli.js"
|
|
@@ -205,6 +205,27 @@ stored keys, their own editable fields in Settings) — cleaner than reusing the
|
|
|
205
205
|
emulator's. All terminals are treated as **generic Verifone** (same AGPA app, same
|
|
206
206
|
PSDK connect/login), so no per-terminal configuration is needed beyond IP + login.
|
|
207
207
|
|
|
208
|
+
#### Step 2d — Merchant logo on the customer display (idle branding)
|
|
209
|
+
|
|
210
|
+
Wire the terminal's **customer-display logo** as part of the integration — it is a
|
|
211
|
+
one-call feature that partners expect, and it is easy to miss. Call `get_code_example`
|
|
212
|
+
with operation `"idle-branding"` first, then reproduce it.
|
|
213
|
+
|
|
214
|
+
- Push the logo with `terminal.setIdleBranding(CustomerDisplayContent(imageData:caption:))`
|
|
215
|
+
**right after a successful `connect()`** (and whenever the logo changes). It is a
|
|
216
|
+
**no-op while disconnected**, and a **no-op on the emulator** (only Verifone paints a
|
|
217
|
+
customer screen), so it is safe to call for any backend.
|
|
218
|
+
- `imageData` is raw **PNG/JPEG bytes**. Use the app's existing logo asset if there is
|
|
219
|
+
one; otherwise a simple placeholder. Caption = the store name.
|
|
220
|
+
- **Hard size rule:** the payload must fit **~32 KB base64**. A full-size photo is
|
|
221
|
+
**silently dropped by the PSDK and can wedge the next transaction**. Size the logo to
|
|
222
|
+
~**360px** wide (a small PNG). Do not pass a camera-resolution image.
|
|
223
|
+
- On success the SDK logs `idle branding pushed to customer display` — surface that in
|
|
224
|
+
your `onLog` handler so the developer can confirm it worked.
|
|
225
|
+
|
|
226
|
+
Do **not** call `setIdleBranding` before connect in the payment path, and never block the
|
|
227
|
+
sale/refund flow on it — it is fire-and-forget branding, not part of a transaction.
|
|
228
|
+
|
|
208
229
|
#### After creating PathPaymentTerminalAdapter.swift — confirm the SDK is linked
|
|
209
230
|
|
|
210
231
|
Before triggering the first build, run:
|
|
@@ -319,6 +340,12 @@ If `PathPaymentTerminalAdapter.swift` does not exist, create it:
|
|
|
319
340
|
terminal, unchanged. (Only one client may connect to a Verifone terminal at a
|
|
320
341
|
time — disconnect any other POS first.)
|
|
321
342
|
|
|
343
|
+
7. **Confirm the customer-display logo (Step 2d):** on the Verifone connect, the
|
|
344
|
+
terminal screen should show the merchant logo, and the log should read
|
|
345
|
+
`idle branding pushed to customer display`. If the screen is blank, the image is
|
|
346
|
+
almost certainly over the ~32 KB base64 limit — shrink it (a ~360px PNG) and retry.
|
|
347
|
+
(The emulator has no customer display, so nothing shows there — that is expected.)
|
|
348
|
+
|
|
322
349
|
---
|
|
323
350
|
|
|
324
351
|
## SDK rules — always follow these
|
|
@@ -389,5 +416,7 @@ details themselves, so tell them exactly where you wired things in:
|
|
|
389
416
|
- How to also connect over **Bluetooth** if they prefer (Scan → Connect)
|
|
390
417
|
- How to **switch to Verifone** when they're ready: pick Verifone, enter the
|
|
391
418
|
terminal IP, confirm the stored login, connect
|
|
419
|
+
- That the **merchant logo** appears on the Verifone customer display on connect
|
|
420
|
+
(Step 2d), and where to drop in their own logo asset (keep it a small ~360px PNG)
|
|
392
421
|
|
|
393
422
|
Keep it brief and concrete — the user should be able to follow it without reading code.
|