@tscircuit/cli 0.1.23 → 0.1.24
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/cli/dev/DevServer.ts +31 -0
- package/cli/main.ts +1 -1
- package/cli/push/register.ts +7 -189
- package/dist/main.js +258 -221
- package/lib/file-server/FileServerRoutes.ts +3 -1
- package/lib/server/EventsRoutes.ts +32 -0
- package/lib/shared/push-snippet.ts +198 -0
- package/package.json +1 -1
- package/tests/test5-dev-server-save-snippet.test.ts +90 -0
package/dist/main.js
CHANGED
|
@@ -109,8 +109,8 @@ export default () => (
|
|
|
109
109
|
};
|
|
110
110
|
|
|
111
111
|
// cli/dev/register.ts
|
|
112
|
-
import * as
|
|
113
|
-
import * as
|
|
112
|
+
import * as path7 from "node:path";
|
|
113
|
+
import * as fs8 from "node:fs";
|
|
114
114
|
|
|
115
115
|
// lib/dependency-analysis/installNodeModuleTypesForSnippet.ts
|
|
116
116
|
import * as fs2 from "node:fs";
|
|
@@ -173,7 +173,7 @@ async function installNodeModuleTypesForSnippet(snippetPath) {
|
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
// cli/dev/DevServer.ts
|
|
176
|
-
import
|
|
176
|
+
import ky2 from "ky";
|
|
177
177
|
|
|
178
178
|
// lib/server/createHttpServer.ts
|
|
179
179
|
import * as http from "node:http";
|
|
@@ -186,7 +186,7 @@ var package_default = {
|
|
|
186
186
|
name: "@tscircuit/cli",
|
|
187
187
|
main: "dist/main.js",
|
|
188
188
|
type: "module",
|
|
189
|
-
version: "0.1.
|
|
189
|
+
version: "0.1.23",
|
|
190
190
|
bin: {
|
|
191
191
|
tsci: "./dist/main.js"
|
|
192
192
|
},
|
|
@@ -351,8 +351,8 @@ var EventsWatcher = class extends EventEmitter {
|
|
|
351
351
|
};
|
|
352
352
|
|
|
353
353
|
// cli/dev/DevServer.ts
|
|
354
|
-
import
|
|
355
|
-
import
|
|
354
|
+
import path6 from "node:path";
|
|
355
|
+
import fs7 from "node:fs";
|
|
356
356
|
import * as chokidar from "chokidar";
|
|
357
357
|
|
|
358
358
|
// lib/dependency-analysis/FilesystemTypesHandler.ts
|
|
@@ -443,6 +443,192 @@ var FilesystemTypesHandler = class {
|
|
|
443
443
|
}
|
|
444
444
|
};
|
|
445
445
|
|
|
446
|
+
// lib/cli-config/index.ts
|
|
447
|
+
import Configstore from "configstore";
|
|
448
|
+
import { jwtDecode } from "jwt-decode";
|
|
449
|
+
var cliConfig = new Configstore(
|
|
450
|
+
"tscircuit"
|
|
451
|
+
);
|
|
452
|
+
var setSessionToken = (token) => {
|
|
453
|
+
cliConfig.set("sessionToken", token);
|
|
454
|
+
const decoded = jwtDecode(token);
|
|
455
|
+
cliConfig.set("githubUsername", decoded.github_username);
|
|
456
|
+
};
|
|
457
|
+
var clearSession = () => {
|
|
458
|
+
cliConfig.delete("sessionToken");
|
|
459
|
+
cliConfig.delete("githubUsername");
|
|
460
|
+
};
|
|
461
|
+
var getRegistryApiUrl = () => {
|
|
462
|
+
return cliConfig.get("registryApiUrl") ?? "https://registry-api.tscircuit.com";
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
// lib/registry-api/get-ky.ts
|
|
466
|
+
import ky from "ky";
|
|
467
|
+
var prettyResponseErrorHook = async (_request, _options, response) => {
|
|
468
|
+
if (!response.ok) {
|
|
469
|
+
try {
|
|
470
|
+
const errorData = await response.json();
|
|
471
|
+
throw new Error(
|
|
472
|
+
`FAIL [${response.status}]: ${_request.method} ${new URL(_request.url).pathname}
|
|
473
|
+
|
|
474
|
+
${JSON.stringify(errorData, null, 2)}`
|
|
475
|
+
);
|
|
476
|
+
} catch (e) {
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
var getKy = () => {
|
|
481
|
+
return ky.create({
|
|
482
|
+
prefixUrl: getRegistryApiUrl(),
|
|
483
|
+
hooks: {
|
|
484
|
+
afterResponse: [prettyResponseErrorHook]
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
};
|
|
488
|
+
|
|
489
|
+
// lib/shared/push-snippet.ts
|
|
490
|
+
import * as fs6 from "node:fs";
|
|
491
|
+
import * as path5 from "node:path";
|
|
492
|
+
import semver from "semver";
|
|
493
|
+
var pushSnippet = async ({
|
|
494
|
+
filePath,
|
|
495
|
+
onExit = (code) => process.exit(code),
|
|
496
|
+
onError = (message) => console.error(message),
|
|
497
|
+
onSuccess = (message) => console.log(message)
|
|
498
|
+
}) => {
|
|
499
|
+
const sessionToken = cliConfig.get("sessionToken");
|
|
500
|
+
if (!sessionToken) {
|
|
501
|
+
onError("You need to log in to save snippet.");
|
|
502
|
+
return onExit(1);
|
|
503
|
+
}
|
|
504
|
+
let snippetFilePath = null;
|
|
505
|
+
if (filePath) {
|
|
506
|
+
snippetFilePath = path5.resolve(filePath);
|
|
507
|
+
} else {
|
|
508
|
+
const defaultEntrypoint = path5.resolve("index.tsx");
|
|
509
|
+
if (fs6.existsSync(defaultEntrypoint)) {
|
|
510
|
+
snippetFilePath = defaultEntrypoint;
|
|
511
|
+
onSuccess("No file provided. Using 'index.tsx' as the entrypoint.");
|
|
512
|
+
} else {
|
|
513
|
+
onError(
|
|
514
|
+
"No entrypoint found. Run 'tsci init' to bootstrap a basic project."
|
|
515
|
+
);
|
|
516
|
+
return onExit(1);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
const packageJsonPath = path5.resolve(
|
|
520
|
+
path5.join(path5.dirname(snippetFilePath), "package.json")
|
|
521
|
+
);
|
|
522
|
+
let packageJson = {};
|
|
523
|
+
if (fs6.existsSync(packageJsonPath)) {
|
|
524
|
+
try {
|
|
525
|
+
packageJson = JSON.parse(fs6.readFileSync(packageJsonPath).toString());
|
|
526
|
+
} catch {
|
|
527
|
+
onError("Invalid package.json provided");
|
|
528
|
+
return onExit(1);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
if (!fs6.existsSync(snippetFilePath)) {
|
|
532
|
+
onError(`File not found: ${snippetFilePath}`);
|
|
533
|
+
return onExit(1);
|
|
534
|
+
}
|
|
535
|
+
const ky3 = getKy();
|
|
536
|
+
const packageName = (packageJson.name ?? path5.parse(snippetFilePath).name).replace(/^@/, "");
|
|
537
|
+
const packageAuthor = packageJson.author?.split(" ")[0] ?? cliConfig.get("githubUsername");
|
|
538
|
+
const packageIdentifier = `${packageAuthor}/${packageName}`;
|
|
539
|
+
let packageVersion = packageJson.version ?? await ky3.post("package_releases/list", {
|
|
540
|
+
json: { package_name: packageIdentifier }
|
|
541
|
+
}).json().then(
|
|
542
|
+
(response) => response.package_releases?.[response.package_releases.length - 1]?.version
|
|
543
|
+
).catch((error) => {
|
|
544
|
+
onError("Failed to retrieve latest package version:" + error);
|
|
545
|
+
return onExit(1);
|
|
546
|
+
});
|
|
547
|
+
if (!packageVersion) {
|
|
548
|
+
onError("Failed to retrieve package version.");
|
|
549
|
+
return onExit(1);
|
|
550
|
+
}
|
|
551
|
+
const updatePackageJsonVersion = (newVersion) => {
|
|
552
|
+
if (packageJson.version) {
|
|
553
|
+
try {
|
|
554
|
+
packageJson.version = newVersion ?? `${packageVersion}`;
|
|
555
|
+
fs6.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
556
|
+
} catch (error) {
|
|
557
|
+
onError("Failed to update package.json version:" + error);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
};
|
|
561
|
+
const doesPackageExist = await ky3.post("packages/get", {
|
|
562
|
+
json: { name: packageIdentifier },
|
|
563
|
+
throwHttpErrors: false
|
|
564
|
+
}).json().then((response) => !(response.error?.error_code === "package_not_found"));
|
|
565
|
+
if (!doesPackageExist) {
|
|
566
|
+
await ky3.post("packages/create", {
|
|
567
|
+
json: { name: packageIdentifier },
|
|
568
|
+
headers: { Authorization: `Bearer ${sessionToken}` }
|
|
569
|
+
}).catch((error) => {
|
|
570
|
+
onError("Error creating package:" + error);
|
|
571
|
+
return onExit(1);
|
|
572
|
+
});
|
|
573
|
+
}
|
|
574
|
+
const doesReleaseExist = await ky3.post("package_releases/get", {
|
|
575
|
+
json: {
|
|
576
|
+
package_name_with_version: `${packageIdentifier}@${packageVersion}`
|
|
577
|
+
},
|
|
578
|
+
throwHttpErrors: false
|
|
579
|
+
}).json().then((response) => {
|
|
580
|
+
if (response.package_release?.version) {
|
|
581
|
+
packageVersion = response.package_release.version;
|
|
582
|
+
updatePackageJsonVersion(response.package_release.version);
|
|
583
|
+
return true;
|
|
584
|
+
}
|
|
585
|
+
return !(response.error?.error_code === "package_release_not_found");
|
|
586
|
+
});
|
|
587
|
+
if (doesReleaseExist) {
|
|
588
|
+
const bumpedVersion = semver.inc(packageVersion, "patch");
|
|
589
|
+
onSuccess(
|
|
590
|
+
`Incrementing Package Version ${packageVersion} -> ${bumpedVersion}`
|
|
591
|
+
);
|
|
592
|
+
packageVersion = bumpedVersion;
|
|
593
|
+
updatePackageJsonVersion(packageVersion);
|
|
594
|
+
}
|
|
595
|
+
await ky3.post("package_releases/create", {
|
|
596
|
+
json: {
|
|
597
|
+
package_name_with_version: `${packageIdentifier}@${packageVersion}`
|
|
598
|
+
},
|
|
599
|
+
throwHttpErrors: false
|
|
600
|
+
}).catch((error) => {
|
|
601
|
+
onError("Error creating release:" + error);
|
|
602
|
+
return onExit(1);
|
|
603
|
+
});
|
|
604
|
+
onSuccess("\n");
|
|
605
|
+
const directoryFiles = fs6.readdirSync(path5.dirname(snippetFilePath));
|
|
606
|
+
for (const file of directoryFiles) {
|
|
607
|
+
const fileExtension = path5.extname(file).replace(".", "");
|
|
608
|
+
if (!["json", "tsx", "ts"].includes(fileExtension)) continue;
|
|
609
|
+
const fileContent = fs6.readFileSync(path5.join(path5.dirname(snippetFilePath), file)).toString() ?? "";
|
|
610
|
+
await ky3.post("package_files/create", {
|
|
611
|
+
json: {
|
|
612
|
+
file_path: file,
|
|
613
|
+
content_text: fileContent,
|
|
614
|
+
package_name_with_version: `${packageIdentifier}@${packageVersion}`
|
|
615
|
+
},
|
|
616
|
+
throwHttpErrors: false
|
|
617
|
+
}).then(() => {
|
|
618
|
+
onSuccess(`Uploaded file ${file} to the registry.`);
|
|
619
|
+
}).catch((error) => {
|
|
620
|
+
onError(`Error uploading file ${file}:` + error);
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
onSuccess(
|
|
624
|
+
[
|
|
625
|
+
`
|
|
626
|
+
\u{1F389} Successfully pushed package ${packageIdentifier}@${packageVersion} to the registry!${Bun.color("blue", "ansi")}`,
|
|
627
|
+
`https://tscircuit.com/${packageIdentifier} \x1B[0m`
|
|
628
|
+
].join(" ")
|
|
629
|
+
);
|
|
630
|
+
};
|
|
631
|
+
|
|
446
632
|
// cli/dev/DevServer.ts
|
|
447
633
|
var DevServer = class {
|
|
448
634
|
port;
|
|
@@ -476,8 +662,8 @@ var DevServer = class {
|
|
|
476
662
|
}) {
|
|
477
663
|
this.port = port;
|
|
478
664
|
this.componentFilePath = componentFilePath;
|
|
479
|
-
this.projectDir =
|
|
480
|
-
this.fsKy =
|
|
665
|
+
this.projectDir = path6.dirname(componentFilePath);
|
|
666
|
+
this.fsKy = ky2.create({
|
|
481
667
|
prefixUrl: `http://localhost:${port}`
|
|
482
668
|
});
|
|
483
669
|
this.typesHandler = new FilesystemTypesHandler(this.projectDir);
|
|
@@ -491,6 +677,10 @@ var DevServer = class {
|
|
|
491
677
|
"FILE_UPDATED",
|
|
492
678
|
this.handleFileUpdatedEventFromServer.bind(this)
|
|
493
679
|
);
|
|
680
|
+
this.eventsWatcher.on(
|
|
681
|
+
"REQUEST_TO_SAVE_SNIPPET",
|
|
682
|
+
this.saveSnippet.bind(this)
|
|
683
|
+
);
|
|
494
684
|
this.filesystemWatcher = chokidar.watch(this.projectDir, {
|
|
495
685
|
persistent: true,
|
|
496
686
|
ignoreInitial: true
|
|
@@ -507,7 +697,7 @@ var DevServer = class {
|
|
|
507
697
|
this.typesHandler?.handleInitialTypeDependencies(this.componentFilePath);
|
|
508
698
|
}
|
|
509
699
|
async addEntrypoint() {
|
|
510
|
-
const relativeComponentFilePath =
|
|
700
|
+
const relativeComponentFilePath = path6.relative(
|
|
511
701
|
this.projectDir,
|
|
512
702
|
this.componentFilePath
|
|
513
703
|
);
|
|
@@ -529,32 +719,32 @@ circuit.add(<MyCircuit />)
|
|
|
529
719
|
const { file } = await this.fsKy.get("api/files/get", {
|
|
530
720
|
searchParams: { file_path: ev.file_path }
|
|
531
721
|
}).json();
|
|
532
|
-
|
|
533
|
-
|
|
722
|
+
fs7.writeFileSync(
|
|
723
|
+
path6.join(this.projectDir, "manual-edits.json"),
|
|
534
724
|
file.text_content
|
|
535
725
|
);
|
|
536
726
|
}
|
|
537
727
|
}
|
|
538
728
|
async handleFileChangedOnFilesystem(absoluteFilePath) {
|
|
539
|
-
const relativeFilePath =
|
|
729
|
+
const relativeFilePath = path6.relative(this.projectDir, absoluteFilePath);
|
|
540
730
|
if (relativeFilePath.includes("manual-edits.json")) return;
|
|
541
731
|
await this.typesHandler?.handleFileTypeDependencies(absoluteFilePath);
|
|
542
732
|
console.log(`${relativeFilePath} saved. Applying changes...`);
|
|
543
733
|
await this.fsKy.post("api/files/upsert", {
|
|
544
734
|
json: {
|
|
545
735
|
file_path: relativeFilePath,
|
|
546
|
-
text_content:
|
|
736
|
+
text_content: fs7.readFileSync(absoluteFilePath, "utf-8"),
|
|
547
737
|
initiator: "filesystem_change"
|
|
548
738
|
}
|
|
549
739
|
}).json();
|
|
550
740
|
}
|
|
551
741
|
async upsertInitialFiles() {
|
|
552
|
-
const fileNames =
|
|
742
|
+
const fileNames = fs7.readdirSync(this.projectDir);
|
|
553
743
|
for (const fileName of fileNames) {
|
|
554
|
-
if (
|
|
744
|
+
if (fs7.statSync(path6.join(this.projectDir, fileName)).isDirectory())
|
|
555
745
|
continue;
|
|
556
|
-
const fileContent =
|
|
557
|
-
|
|
746
|
+
const fileContent = fs7.readFileSync(
|
|
747
|
+
path6.join(this.projectDir, fileName),
|
|
558
748
|
"utf-8"
|
|
559
749
|
);
|
|
560
750
|
await this.fsKy.post("api/files/upsert", {
|
|
@@ -566,6 +756,26 @@ circuit.add(<MyCircuit />)
|
|
|
566
756
|
});
|
|
567
757
|
}
|
|
568
758
|
}
|
|
759
|
+
async saveSnippet() {
|
|
760
|
+
const postEvent = async (event) => this.fsKy.post("api/events/create", {
|
|
761
|
+
json: { event_type: event },
|
|
762
|
+
throwHttpErrors: false
|
|
763
|
+
});
|
|
764
|
+
await pushSnippet({
|
|
765
|
+
filePath: this.componentFilePath,
|
|
766
|
+
onExit: (e) => {
|
|
767
|
+
console.error("Failed to save snippet", e);
|
|
768
|
+
postEvent("FAILED_TO_SAVE_SNIPPET");
|
|
769
|
+
},
|
|
770
|
+
onError: (e) => {
|
|
771
|
+
console.error("Failed to save snippet", e);
|
|
772
|
+
postEvent("FAILED_TO_SAVE_SNIPPET");
|
|
773
|
+
},
|
|
774
|
+
onSuccess: () => {
|
|
775
|
+
postEvent("SNIPPET_SAVED");
|
|
776
|
+
}
|
|
777
|
+
});
|
|
778
|
+
}
|
|
569
779
|
async stop() {
|
|
570
780
|
this.httpServer?.close();
|
|
571
781
|
this.eventsWatcher?.stop();
|
|
@@ -593,14 +803,14 @@ var registerDev = (program2) => {
|
|
|
593
803
|
}
|
|
594
804
|
let absolutePath;
|
|
595
805
|
if (file) {
|
|
596
|
-
absolutePath =
|
|
806
|
+
absolutePath = path7.resolve(file);
|
|
597
807
|
if (!absolutePath.endsWith(".tsx")) {
|
|
598
808
|
console.error("Error: Only .tsx files are supported");
|
|
599
809
|
return;
|
|
600
810
|
}
|
|
601
811
|
} else {
|
|
602
|
-
const entrypointPath =
|
|
603
|
-
if (
|
|
812
|
+
const entrypointPath = path7.resolve("index.tsx");
|
|
813
|
+
if (fs8.existsSync(entrypointPath)) {
|
|
604
814
|
absolutePath = entrypointPath;
|
|
605
815
|
console.log("No file provided. Using 'index.tsx' as the entrypoint.");
|
|
606
816
|
} else {
|
|
@@ -610,7 +820,7 @@ var registerDev = (program2) => {
|
|
|
610
820
|
return;
|
|
611
821
|
}
|
|
612
822
|
}
|
|
613
|
-
const fileDir =
|
|
823
|
+
const fileDir = path7.dirname(absolutePath);
|
|
614
824
|
try {
|
|
615
825
|
console.log("Installing types for imported snippets...");
|
|
616
826
|
await installNodeModuleTypesForSnippet(absolutePath);
|
|
@@ -627,53 +837,8 @@ var registerDev = (program2) => {
|
|
|
627
837
|
});
|
|
628
838
|
};
|
|
629
839
|
|
|
630
|
-
// lib/cli-config/index.ts
|
|
631
|
-
import Configstore from "configstore";
|
|
632
|
-
import { jwtDecode } from "jwt-decode";
|
|
633
|
-
var cliConfig = new Configstore(
|
|
634
|
-
"tscircuit"
|
|
635
|
-
);
|
|
636
|
-
var setSessionToken = (token) => {
|
|
637
|
-
cliConfig.set("sessionToken", token);
|
|
638
|
-
const decoded = jwtDecode(token);
|
|
639
|
-
cliConfig.set("githubUsername", decoded.github_username);
|
|
640
|
-
};
|
|
641
|
-
var clearSession = () => {
|
|
642
|
-
cliConfig.delete("sessionToken");
|
|
643
|
-
cliConfig.delete("githubUsername");
|
|
644
|
-
};
|
|
645
|
-
var getRegistryApiUrl = () => {
|
|
646
|
-
return cliConfig.get("registryApiUrl") ?? "https://registry-api.tscircuit.com";
|
|
647
|
-
};
|
|
648
|
-
|
|
649
840
|
// cli/auth/login/register.ts
|
|
650
841
|
import delay from "delay";
|
|
651
|
-
|
|
652
|
-
// lib/registry-api/get-ky.ts
|
|
653
|
-
import ky2 from "ky";
|
|
654
|
-
var prettyResponseErrorHook = async (_request, _options, response) => {
|
|
655
|
-
if (!response.ok) {
|
|
656
|
-
try {
|
|
657
|
-
const errorData = await response.json();
|
|
658
|
-
throw new Error(
|
|
659
|
-
`FAIL [${response.status}]: ${_request.method} ${new URL(_request.url).pathname}
|
|
660
|
-
|
|
661
|
-
${JSON.stringify(errorData, null, 2)}`
|
|
662
|
-
);
|
|
663
|
-
} catch (e) {
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
};
|
|
667
|
-
var getKy = () => {
|
|
668
|
-
return ky2.create({
|
|
669
|
-
prefixUrl: getRegistryApiUrl(),
|
|
670
|
-
hooks: {
|
|
671
|
-
afterResponse: [prettyResponseErrorHook]
|
|
672
|
-
}
|
|
673
|
-
});
|
|
674
|
-
};
|
|
675
|
-
|
|
676
|
-
// cli/auth/login/register.ts
|
|
677
842
|
var registerAuthLogin = (program2) => {
|
|
678
843
|
const loginAction = async () => {
|
|
679
844
|
const ky3 = getKy();
|
|
@@ -752,8 +917,8 @@ var registerConfigPrint = (program2) => {
|
|
|
752
917
|
};
|
|
753
918
|
|
|
754
919
|
// cli/clone/register.ts
|
|
755
|
-
import * as
|
|
756
|
-
import * as
|
|
920
|
+
import * as fs9 from "node:fs";
|
|
921
|
+
import * as path8 from "node:path";
|
|
757
922
|
var registerClone = (program2) => {
|
|
758
923
|
program2.command("clone").description("Clone a snippet from the registry").argument("<snippet>", "Snippet to clone (e.g. author/snippetName)").action(async (snippetPath) => {
|
|
759
924
|
let author;
|
|
@@ -783,8 +948,8 @@ var registerClone = (program2) => {
|
|
|
783
948
|
}
|
|
784
949
|
}).json();
|
|
785
950
|
const dirPath = `./${author}.${snippetName}`;
|
|
786
|
-
if (!
|
|
787
|
-
|
|
951
|
+
if (!fs9.existsSync(dirPath)) {
|
|
952
|
+
fs9.mkdirSync(dirPath);
|
|
788
953
|
}
|
|
789
954
|
for (const fileInfo of packageFileList.package_files) {
|
|
790
955
|
const filePath = fileInfo.file_path.startsWith("/") ? fileInfo.file_path.slice(1) : fileInfo.file_path;
|
|
@@ -795,15 +960,15 @@ var registerClone = (program2) => {
|
|
|
795
960
|
file_path: fileInfo.file_path
|
|
796
961
|
}
|
|
797
962
|
}).json();
|
|
798
|
-
const fullPath =
|
|
799
|
-
const dirName =
|
|
800
|
-
if (!
|
|
801
|
-
|
|
963
|
+
const fullPath = path8.join(dirPath, filePath);
|
|
964
|
+
const dirName = path8.dirname(fullPath);
|
|
965
|
+
if (!fs9.existsSync(dirName)) {
|
|
966
|
+
fs9.mkdirSync(dirName, { recursive: true });
|
|
802
967
|
}
|
|
803
|
-
|
|
968
|
+
fs9.writeFileSync(fullPath, fileContent.package_file.content_text);
|
|
804
969
|
}
|
|
805
|
-
const npmrcPath =
|
|
806
|
-
|
|
970
|
+
const npmrcPath = path8.join(dirPath, ".npmrc");
|
|
971
|
+
fs9.writeFileSync(npmrcPath, "@tsci:registry=https://npm.tscircuit.com");
|
|
807
972
|
console.log(`Successfully cloned to ./${author}.${snippetName}/`);
|
|
808
973
|
} catch (error) {
|
|
809
974
|
if (error instanceof Error) {
|
|
@@ -824,8 +989,8 @@ import semver2 from "semver";
|
|
|
824
989
|
import { createCircuitWebWorker } from "@tscircuit/eval-webworker";
|
|
825
990
|
import webWorkerBundleUrl from "@tscircuit/eval-webworker/blob-url";
|
|
826
991
|
import { getVirtualFileSystemFromDirPath } from "make-vfs";
|
|
827
|
-
import
|
|
828
|
-
import
|
|
992
|
+
import path9 from "node:path";
|
|
993
|
+
import fs10 from "node:fs";
|
|
829
994
|
var ALLOWED_FORMATS = [
|
|
830
995
|
"json",
|
|
831
996
|
"circuit-json",
|
|
@@ -857,13 +1022,13 @@ Supported formats: ${ALLOWED_FORMATS.join(",")}`
|
|
|
857
1022
|
);
|
|
858
1023
|
}
|
|
859
1024
|
if (!output) {
|
|
860
|
-
output =
|
|
1025
|
+
output = path9.basename(file).replace(/\.[^.]+$/, "");
|
|
861
1026
|
}
|
|
862
1027
|
const worker = await createCircuitWebWorker({
|
|
863
1028
|
webWorkerUrl: webWorkerBundleUrl
|
|
864
1029
|
});
|
|
865
|
-
const projectDir =
|
|
866
|
-
const relativeComponentPath =
|
|
1030
|
+
const projectDir = path9.dirname(file);
|
|
1031
|
+
const relativeComponentPath = path9.relative(projectDir, file);
|
|
867
1032
|
await worker.executeWithFsMap({
|
|
868
1033
|
entrypoint: "entrypoint.tsx",
|
|
869
1034
|
fsMap: {
|
|
@@ -880,11 +1045,11 @@ circuit.add(<MyCircuit />)
|
|
|
880
1045
|
});
|
|
881
1046
|
await worker.renderUntilSettled();
|
|
882
1047
|
const circuitJson = await worker.getCircuitJson();
|
|
883
|
-
const outputPath =
|
|
1048
|
+
const outputPath = path9.join(
|
|
884
1049
|
projectDir,
|
|
885
1050
|
`${output}${OUTPUT_EXTENSIONS[format]}`
|
|
886
1051
|
);
|
|
887
|
-
|
|
1052
|
+
fs10.writeFileSync(outputPath, JSON.stringify(circuitJson));
|
|
888
1053
|
console.log(`Exported to ${outputPath}`);
|
|
889
1054
|
process.exit(0);
|
|
890
1055
|
});
|
|
@@ -918,145 +1083,14 @@ var registerAuthSetToken = (program2) => {
|
|
|
918
1083
|
};
|
|
919
1084
|
|
|
920
1085
|
// cli/push/register.ts
|
|
921
|
-
import * as fs10 from "node:fs";
|
|
922
|
-
import * as path9 from "node:path";
|
|
923
|
-
import semver from "semver";
|
|
924
1086
|
var registerPush = (program2) => {
|
|
925
1087
|
program2.command("push").description("Save snippet code to Registry API").argument("[file]", "Path to the snippet file").action(async (filePath) => {
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
let snippetFilePath = null;
|
|
932
|
-
if (filePath) {
|
|
933
|
-
snippetFilePath = path9.resolve(filePath);
|
|
934
|
-
} else {
|
|
935
|
-
const defaultEntrypoint = path9.resolve("index.tsx");
|
|
936
|
-
if (fs10.existsSync(defaultEntrypoint)) {
|
|
937
|
-
snippetFilePath = defaultEntrypoint;
|
|
938
|
-
console.log("No file provided. Using 'index.tsx' as the entrypoint.");
|
|
939
|
-
} else {
|
|
940
|
-
console.error(
|
|
941
|
-
"No entrypoint found. Run 'tsci init' to bootstrap a basic project."
|
|
942
|
-
);
|
|
943
|
-
process.exit(1);
|
|
944
|
-
}
|
|
945
|
-
}
|
|
946
|
-
const packageJsonPath = path9.resolve(
|
|
947
|
-
path9.join(path9.dirname(snippetFilePath), "package.json")
|
|
948
|
-
);
|
|
949
|
-
let packageJson = {};
|
|
950
|
-
if (fs10.existsSync(packageJsonPath)) {
|
|
951
|
-
try {
|
|
952
|
-
packageJson = JSON.parse(fs10.readFileSync(packageJsonPath).toString());
|
|
953
|
-
} catch {
|
|
954
|
-
console.error("Invalid package.json provided");
|
|
955
|
-
process.exit(1);
|
|
956
|
-
}
|
|
957
|
-
}
|
|
958
|
-
if (!fs10.existsSync(snippetFilePath)) {
|
|
959
|
-
console.error(`File not found: ${snippetFilePath}`);
|
|
960
|
-
process.exit(1);
|
|
961
|
-
}
|
|
962
|
-
const ky3 = getKy();
|
|
963
|
-
const packageName = (packageJson.name ?? path9.parse(snippetFilePath).name).replace(/^@/, "");
|
|
964
|
-
const packageAuthor = packageJson.author?.split(" ")[0] ?? cliConfig.get("githubUsername");
|
|
965
|
-
const packageIdentifier = `${packageAuthor}/${packageName}`;
|
|
966
|
-
let packageVersion = packageJson.version ?? await ky3.post("package_releases/list", {
|
|
967
|
-
json: { package_name: packageIdentifier }
|
|
968
|
-
}).json().then(
|
|
969
|
-
(response) => response.package_releases?.[response.package_releases.length - 1]?.version
|
|
970
|
-
).catch((error) => {
|
|
971
|
-
console.error("Failed to retrieve latest package version:", error);
|
|
972
|
-
process.exit(1);
|
|
1088
|
+
await pushSnippet({
|
|
1089
|
+
filePath,
|
|
1090
|
+
onExit: (code) => process.exit(code),
|
|
1091
|
+
onError: (message) => console.error(message),
|
|
1092
|
+
onSuccess: (message) => console.log(message)
|
|
973
1093
|
});
|
|
974
|
-
if (!packageVersion) {
|
|
975
|
-
console.log("Failed to retrieve package version.");
|
|
976
|
-
process.exit(1);
|
|
977
|
-
}
|
|
978
|
-
const updatePackageJsonVersion = (newVersion) => {
|
|
979
|
-
if (packageJson.version) {
|
|
980
|
-
try {
|
|
981
|
-
packageJson.version = newVersion ?? packageVersion;
|
|
982
|
-
fs10.writeFileSync(
|
|
983
|
-
packageJsonPath,
|
|
984
|
-
JSON.stringify(packageJson, null, 2)
|
|
985
|
-
);
|
|
986
|
-
} catch (error) {
|
|
987
|
-
console.error("Failed to update package.json version:", error);
|
|
988
|
-
}
|
|
989
|
-
}
|
|
990
|
-
};
|
|
991
|
-
const doesPackageExist = await ky3.post("packages/get", {
|
|
992
|
-
json: { name: packageIdentifier },
|
|
993
|
-
throwHttpErrors: false
|
|
994
|
-
}).json().then(
|
|
995
|
-
(response) => !(response.error?.error_code === "package_not_found")
|
|
996
|
-
);
|
|
997
|
-
if (!doesPackageExist) {
|
|
998
|
-
await ky3.post("packages/create", {
|
|
999
|
-
json: { name: packageIdentifier },
|
|
1000
|
-
headers: { Authorization: `Bearer ${sessionToken}` }
|
|
1001
|
-
}).catch((error) => {
|
|
1002
|
-
console.error("Error creating package:", error);
|
|
1003
|
-
process.exit(1);
|
|
1004
|
-
});
|
|
1005
|
-
}
|
|
1006
|
-
const doesReleaseExist = await ky3.post("package_releases/get", {
|
|
1007
|
-
json: {
|
|
1008
|
-
package_name_with_version: `${packageIdentifier}@${packageVersion}`
|
|
1009
|
-
},
|
|
1010
|
-
throwHttpErrors: false
|
|
1011
|
-
}).json().then((response) => {
|
|
1012
|
-
if (response.package_release?.version) {
|
|
1013
|
-
packageVersion = response.package_release.version;
|
|
1014
|
-
updatePackageJsonVersion(response.package_release.version);
|
|
1015
|
-
return true;
|
|
1016
|
-
}
|
|
1017
|
-
return !(response.error?.error_code === "package_release_not_found");
|
|
1018
|
-
});
|
|
1019
|
-
if (doesReleaseExist) {
|
|
1020
|
-
const bumpedVersion = semver.inc(packageVersion, "patch");
|
|
1021
|
-
console.log(
|
|
1022
|
-
`Incrementing Package Version ${packageVersion} -> ${bumpedVersion}`
|
|
1023
|
-
);
|
|
1024
|
-
packageVersion = bumpedVersion;
|
|
1025
|
-
updatePackageJsonVersion(packageVersion);
|
|
1026
|
-
}
|
|
1027
|
-
await ky3.post("package_releases/create", {
|
|
1028
|
-
json: {
|
|
1029
|
-
package_name_with_version: `${packageIdentifier}@${packageVersion}`
|
|
1030
|
-
},
|
|
1031
|
-
throwHttpErrors: false
|
|
1032
|
-
}).catch((error) => {
|
|
1033
|
-
console.error("Error creating release:", error);
|
|
1034
|
-
process.exit(1);
|
|
1035
|
-
});
|
|
1036
|
-
console.log("\n");
|
|
1037
|
-
const directoryFiles = fs10.readdirSync(path9.dirname(snippetFilePath));
|
|
1038
|
-
for (const file of directoryFiles) {
|
|
1039
|
-
const fileExtension = path9.extname(file).replace(".", "");
|
|
1040
|
-
if (!["json", "tsx", "ts"].includes(fileExtension)) continue;
|
|
1041
|
-
const fileContent = fs10.readFileSync(path9.join(path9.dirname(snippetFilePath), file)).toString() ?? "";
|
|
1042
|
-
await ky3.post("package_files/create", {
|
|
1043
|
-
json: {
|
|
1044
|
-
file_path: file,
|
|
1045
|
-
content_text: fileContent,
|
|
1046
|
-
package_name_with_version: `${packageIdentifier}@${packageVersion}`
|
|
1047
|
-
},
|
|
1048
|
-
throwHttpErrors: false
|
|
1049
|
-
}).then(() => {
|
|
1050
|
-
console.log(`Uploaded file ${file} to the registry.`);
|
|
1051
|
-
}).catch((error) => {
|
|
1052
|
-
console.error(`Error uploading file ${file}:`, error);
|
|
1053
|
-
});
|
|
1054
|
-
}
|
|
1055
|
-
console.log(
|
|
1056
|
-
`
|
|
1057
|
-
\u{1F389} Successfully pushed package ${packageIdentifier}@${packageVersion} to the registry!${Bun.color("blue", "ansi")}`,
|
|
1058
|
-
`https://tscircuit.com/${packageIdentifier} \x1B[0m`
|
|
1059
|
-
);
|
|
1060
1094
|
});
|
|
1061
1095
|
};
|
|
1062
1096
|
|
|
@@ -1080,4 +1114,7 @@ if (process.argv.length === 2) {
|
|
|
1080
1114
|
} else {
|
|
1081
1115
|
program.parse();
|
|
1082
1116
|
}
|
|
1083
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2luaXQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldC50cyIsICIuLi9jbGkvZGV2L0RldlNlcnZlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXIudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL2xpYi9zaXRlL2dldEluZGV4LnRzIiwgIi4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyLnRzIiwgIi4uL2xpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2ZpbmRJbXBvcnRzSW5TbmlwcGV0LnRzIiwgIi4uL2xpYi9jbGktY29uZmlnL2luZGV4LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ2luL3JlZ2lzdGVyLnRzIiwgIi4uL2xpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ291dC9yZWdpc3Rlci50cyIsICIuLi9jbGkvYXV0aC9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jb25maWcvcHJpbnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Nsb25lL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9leHBvcnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvcHJpbnQtdG9rZW4vcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9wdXNoL3JlZ2lzdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyByZWdpc3RlckluaXQgfSBmcm9tIFwiLi9pbml0L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGV2IH0gZnJvbSBcIi4vZGV2L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aExvZ2luIH0gZnJvbSBcIi4vYXV0aC9sb2dpbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dvdXQgfSBmcm9tIFwiLi9hdXRoL2xvZ291dC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGggfSBmcm9tIFwiLi9hdXRoL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnUHJpbnQgfSBmcm9tIFwiLi9jb25maWcvcHJpbnQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDbG9uZSB9IGZyb20gXCIuL2Nsb25lL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHBlcmZlY3RDbGkgfSBmcm9tIFwicGVyZmVjdC1jbGlcIlxuaW1wb3J0IHBrZyBmcm9tIFwiLi4vcGFja2FnZS5qc29uXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5pbXBvcnQgeyByZWdpc3RlckV4cG9ydCB9IGZyb20gXCIuL2V4cG9ydC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhQcmludFRva2VuIH0gZnJvbSBcIi4vYXV0aC9wcmludC10b2tlbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhTZXRUb2tlbiB9IGZyb20gXCIuL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyUHVzaCB9IGZyb20gXCIuL3B1c2gvcmVnaXN0ZXJcIlxuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKVxuXG5wcm9ncmFtXG4gIC5uYW1lKFwidHNjaVwiKVxuICAuZGVzY3JpcHRpb24oXCJDTEkgZm9yIGRldmVsb3BpbmcgdHNjaXJjdWl0IHNuaXBwZXRzXCIpXG4gIC8vIEhBQ0s6IGF0IGJ1aWxkIHRpbWUgdGhlIHZlcnNpb24gaXMgb2xkLCB3ZSBuZWVkIHRvXG4gIC8vIGZpeCB0aGlzIGF0IHNvbWUgcG9pbnQuLi5cbiAgLnZlcnNpb24oc2VtdmVyLmluYyhwa2cudmVyc2lvbiwgXCJwYXRjaFwiKSA/PyBwa2cudmVyc2lvbilcblxucmVnaXN0ZXJJbml0KHByb2dyYW0pXG5cbnJlZ2lzdGVyRGV2KHByb2dyYW0pXG5yZWdpc3RlckNsb25lKHByb2dyYW0pXG5yZWdpc3RlclB1c2gocHJvZ3JhbSlcblxucmVnaXN0ZXJBdXRoKHByb2dyYW0pXG5yZWdpc3RlckF1dGhMb2dpbihwcm9ncmFtKVxucmVnaXN0ZXJBdXRoTG9nb3V0KHByb2dyYW0pXG5yZWdpc3RlckF1dGhQcmludFRva2VuKHByb2dyYW0pXG5yZWdpc3RlckF1dGhTZXRUb2tlbihwcm9ncmFtKVxuXG5yZWdpc3RlckNvbmZpZyhwcm9ncmFtKVxucmVnaXN0ZXJDb25maWdQcmludChwcm9ncmFtKVxuXG5yZWdpc3RlckV4cG9ydChwcm9ncmFtKVxuXG5pZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PT0gMikge1xuICBwZXJmZWN0Q2xpKHByb2dyYW0sIHByb2Nlc3MuYXJndilcbn0gZWxzZSB7XG4gIHByb2dyYW0ucGFyc2UoKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiXG5cbi8vIERldGVjdCB0aGUgcGFja2FnZSBtYW5hZ2VyIGJlaW5nIHVzZWQgaW4gdGhlIHByb2plY3RcbmNvbnN0IGRldGVjdFBhY2thZ2VNYW5hZ2VyID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHVzZXJBZ2VudCA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfdXNlcl9hZ2VudCB8fCBcIlwiXG4gIGlmICh1c2VyQWdlbnQuc3RhcnRzV2l0aChcInlhcm5cIikpIHJldHVybiBcInlhcm5cIlxuICBpZiAodXNlckFnZW50LnN0YXJ0c1dpdGgoXCJwbnBtXCIpKSByZXR1cm4gXCJwbnBtXCJcbiAgaWYgKHVzZXJBZ2VudC5zdGFydHNXaXRoKFwiYnVuXCIpKSByZXR1cm4gXCJidW5cIlxuXG4gIGlmIChmcy5leGlzdHNTeW5jKFwieWFybi5sb2NrXCIpKSByZXR1cm4gXCJ5YXJuXCJcbiAgaWYgKGZzLmV4aXN0c1N5bmMoXCJwbnBtLWxvY2sueWFtbFwiKSkgcmV0dXJuIFwicG5wbVwiXG4gIGlmIChmcy5leGlzdHNTeW5jKFwiYnVuLmxvY2tiXCIpKSByZXR1cm4gXCJidW5cIlxuXG4gIHJldHVybiBcIm5wbVwiIC8vIERlZmF1bHQgdG8gbnBtXG59XG5cbi8vIEdlbmVyYXRlIGEgUmVhY3QtY29tcGF0aWJsZSB0c2NvbmZpZy5qc29uXG5jb25zdCBnZW5lcmF0ZVRzQ29uZmlnID0gKGRpcjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHRzY29uZmlnUGF0aCA9IHBhdGguam9pbihkaXIsIFwidHNjb25maWcuanNvblwiKVxuICBjb25zdCB0c2NvbmZpZ0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShcbiAgICB7XG4gICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgdGFyZ2V0OiBcIkVTNlwiLFxuICAgICAgICBtb2R1bGU6IFwiRVNOZXh0XCIsXG4gICAgICAgIGpzeDogXCJyZWFjdC1qc3hcIixcbiAgICAgICAgb3V0RGlyOiBcImRpc3RcIixcbiAgICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgICBlc01vZHVsZUludGVyb3A6IHRydWUsXG4gICAgICAgIG1vZHVsZVJlc29sdXRpb246IFwibm9kZVwiLFxuICAgICAgICBza2lwTGliQ2hlY2s6IHRydWUsXG4gICAgICAgIGZvcmNlQ29uc2lzdGVudENhc2luZ0luRmlsZU5hbWVzOiB0cnVlLFxuICAgICAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSxcbiAgICAgICAgc291cmNlTWFwOiB0cnVlLFxuICAgICAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLFxuICAgICAgICBleHBlcmltZW50YWxEZWNvcmF0b3JzOiB0cnVlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIG51bGwsXG4gICAgMixcbiAgKVxuICBpZiAoIWZzLmV4aXN0c1N5bmModHNjb25maWdQYXRoKSkge1xuICAgIGZzLndyaXRlRmlsZVN5bmModHNjb25maWdQYXRoLCB0c2NvbmZpZ0NvbnRlbnQudHJpbVN0YXJ0KCkpXG4gICAgY29uc29sZS5sb2coYENyZWF0ZWQ6ICR7dHNjb25maWdQYXRofWApXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coYFNraXBwZWQ6ICR7dHNjb25maWdQYXRofSBhbHJlYWR5IGV4aXN0c2ApXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVySW5pdCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImluaXRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJJbml0aWFsaXplIGEgbmV3IFRTQ2lyY3VpdCBwcm9qZWN0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeVwiKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudERpciA9IHByb2Nlc3MuY3dkKClcbiAgICAgIGNvbnN0IGluZGV4RmlsZVBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpciwgXCJpbmRleC50c3hcIilcbiAgICAgIGNvbnN0IG5wbXJjRmlsZVBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpciwgXCIubnBtcmNcIilcblxuICAgICAgLy8gQ29udGVudCBmb3IgaW5kZXgudHN4XG4gICAgICBjb25zdCBpbmRleENvbnRlbnQgPSBgXG5pbXBvcnQgXCJAdHNjaXJjdWl0L2NvcmVcIlxuXG5leHBvcnQgZGVmYXVsdCAoKSA9PiAoXG4gIDxib2FyZCB3aWR0aD1cIjEwbW1cIiBoZWlnaHQ9XCIxMG1tXCI+XG4gICAgPHJlc2lzdG9yXG4gICAgICByZXNpc3RhbmNlPVwiMWtcIlxuICAgICAgZm9vdHByaW50PVwiMDQwMlwiXG4gICAgICBuYW1lPVwiUjFcIlxuICAgICAgc2NoWD17M31cbiAgICAgIHBjYlg9ezN9XG4gICAgLz5cbiAgICA8Y2FwYWNpdG9yXG4gICAgICBjYXBhY2l0YW5jZT1cIjEwMDBwRlwiXG4gICAgICBmb290cHJpbnQ9XCIwNDAyXCJcbiAgICAgIG5hbWU9XCJDMVwiXG4gICAgICBzY2hYPXstM31cbiAgICAgIHBjYlg9ey0zfVxuICAgIC8+XG4gICAgPHRyYWNlIGZyb209XCIuUjEgPiAucGluMVwiIHRvPVwiLkMxID4gLnBpbjFcIiAvPlxuICA8L2JvYXJkPlxuKTtcbmAudHJpbSgpXG5cbiAgICAgIC8vIENvbnRlbnQgZm9yIC5ucG1yY1xuICAgICAgY29uc3QgbnBtcmNDb250ZW50ID0gYFxuQHRzY2k6cmVnaXN0cnk9aHR0cHM6Ly9ucG0udHNjaXJjdWl0LmNvbVxuYC50cmltKClcblxuICAgICAgLy8gQ3JlYXRlIGluZGV4LnRzeCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoaW5kZXhGaWxlUGF0aCkpIHtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhpbmRleEZpbGVQYXRoLCBpbmRleENvbnRlbnQudHJpbVN0YXJ0KCkpXG4gICAgICAgIGNvbnNvbGUubG9nKGBDcmVhdGVkOiAke2luZGV4RmlsZVBhdGh9YClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBTa2lwcGVkOiAke2luZGV4RmlsZVBhdGh9IGFscmVhZHkgZXhpc3RzYClcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIC5ucG1yYyBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobnBtcmNGaWxlUGF0aCkpIHtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhucG1yY0ZpbGVQYXRoLCBucG1yY0NvbnRlbnQudHJpbVN0YXJ0KCkpXG4gICAgICAgIGNvbnNvbGUubG9nKGBDcmVhdGVkOiAke25wbXJjRmlsZVBhdGh9YClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBTa2lwcGVkOiAke25wbXJjRmlsZVBhdGh9IGFscmVhZHkgZXhpc3RzYClcbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZWN0IHRoZSBwYWNrYWdlIG1hbmFnZXJcbiAgICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gZGV0ZWN0UGFja2FnZU1hbmFnZXIoKVxuICAgICAgY29uc29sZS5sb2coYERldGVjdGVkIHBhY2thZ2UgbWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1gKVxuXG4gICAgICAvLyBJbnN0YWxsIGRlcHMgdXNpbmcgdGhlIGRldGVjdGVkIHBhY2thZ2UgbWFuYWdlclxuICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0gXCJAdHlwZXMvcmVhY3QgQHRzY2lyY3VpdC9jb3JlXCJcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuLi5cIilcbiAgICAgICAgY29uc3QgaW5zdGFsbENvbW1hbmQgPVxuICAgICAgICAgIHBhY2thZ2VNYW5hZ2VyID09PSBcInlhcm5cIlxuICAgICAgICAgICAgPyBgeWFybiBhZGQgLUQgJHtkZXBlbmRlbmNpZXN9YFxuICAgICAgICAgICAgOiBwYWNrYWdlTWFuYWdlciA9PT0gXCJwbnBtXCJcbiAgICAgICAgICAgICAgPyBgcG5wbSBhZGQgLUQgJHtkZXBlbmRlbmNpZXN9YFxuICAgICAgICAgICAgICA6IHBhY2thZ2VNYW5hZ2VyID09PSBcImJ1blwiXG4gICAgICAgICAgICAgICAgPyBgYnVuIGFkZCAtRCAke2RlcGVuZGVuY2llc31gXG4gICAgICAgICAgICAgICAgOiBgbnBtIGluc3RhbGwgLUQgJHtkZXBlbmRlbmNpZXN9YFxuICAgICAgICBleGVjU3luYyhpbnN0YWxsQ29tbWFuZCwgeyBzdGRpbzogXCJpbmhlcml0XCIgfSlcbiAgICAgICAgY29uc29sZS5sb2coXCJEZXBlbmRlbmNpZXMgaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseS5cIilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gaW5zdGFsbCBkZXBlbmRlbmNpZXM6XCIsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZSB0c2NvbmZpZy5qc29uXG4gICAgICBnZW5lcmF0ZVRzQ29uZmlnKGN1cnJlbnREaXIpXG5cbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgSW5pdGlhbGl6YXRpb24gY29tcGxldGUuIFJ1biBcInRzY2kgZGV2XCIgdG8gc3RhcnQgZGV2ZWxvcGluZy5gLFxuICAgICAgKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0ICogYXMgY2hva2lkYXIgZnJvbSBcImNob2tpZGFyXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB7IGNyZWF0ZUh0dHBTZXJ2ZXIgfSBmcm9tIFwibGliL3NlcnZlci9jcmVhdGVIdHRwU2VydmVyXCJcbmltcG9ydCB7IGdldExvY2FsRmlsZURlcGVuZGVuY2llcyB9IGZyb20gXCJsaWIvZGVwZW5kZW5jeS1hbmFseXNpcy9nZXRMb2NhbEZpbGVEZXBlbmRlbmNpZXNcIlxuaW1wb3J0IHsgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQgfSBmcm9tIFwiLi4vLi4vbGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXRcIlxuaW1wb3J0IHsgRXZlbnRzV2F0Y2hlciB9IGZyb20gXCIuLi8uLi9saWIvc2VydmVyL0V2ZW50c1dhdGNoZXJcIlxuaW1wb3J0IHsgRGV2U2VydmVyIH0gZnJvbSBcIi4vRGV2U2VydmVyXCJcbmltcG9ydCAqIGFzIG5ldCBmcm9tIFwibm9kZTpuZXRcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJEZXYgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJkZXZcIilcbiAgICAuZGVzY3JpcHRpb24oXCJTdGFydCBkZXZlbG9wbWVudCBzZXJ2ZXIgZm9yIGEgc25pcHBldFwiKVxuICAgIC5hcmd1bWVudChcIltmaWxlXVwiLCBcIlBhdGggdG8gdGhlIHNuaXBwZXQgZmlsZVwiKVxuICAgIC5vcHRpb24oXCItcCwgLS1wb3J0IDxudW1iZXI+XCIsIFwiUG9ydCB0byBydW4gc2VydmVyIG9uXCIsIFwiMzAyMFwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKGZpbGU6IHN0cmluZywgb3B0aW9uczogeyBwb3J0OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgbGV0IHBvcnQgPSBwYXJzZUludChvcHRpb25zLnBvcnQpXG5cbiAgICAgIGNvbnN0IGlzUG9ydEF2YWlsYWJsZSA9IChwb3J0OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VydmVyID0gbmV0LmNyZWF0ZVNlcnZlcigpXG4gICAgICAgICAgc2VydmVyLm9uY2UoXCJlcnJvclwiLCAoKSA9PiByZXNvbHZlKGZhbHNlKSlcbiAgICAgICAgICBzZXJ2ZXIub25jZShcImxpc3RlbmluZ1wiLCAoKSA9PiB7XG4gICAgICAgICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4gcmVzb2x2ZSh0cnVlKSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIHNlcnZlci5saXN0ZW4ocG9ydClcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCEoYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUG9ydCAke3BvcnR9IGlzIGluIHVzZSwgdHJ5aW5nIHBvcnQgJHtwb3J0ICsgMX0uLi5gKVxuICAgICAgICBwb3J0ICs9IDFcbiAgICAgIH1cblxuICAgICAgbGV0IGFic29sdXRlUGF0aDogc3RyaW5nXG5cbiAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgIGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlKVxuICAgICAgICBpZiAoIWFic29sdXRlUGF0aC5lbmRzV2l0aChcIi50c3hcIikpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6IE9ubHkgLnRzeCBmaWxlcyBhcmUgc3VwcG9ydGVkXCIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVudHJ5cG9pbnRQYXRoID0gcGF0aC5yZXNvbHZlKFwiaW5kZXgudHN4XCIpXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGVudHJ5cG9pbnRQYXRoKSkge1xuICAgICAgICAgIGFic29sdXRlUGF0aCA9IGVudHJ5cG9pbnRQYXRoXG4gICAgICAgICAgY29uc29sZS5sb2coXCJObyBmaWxlIHByb3ZpZGVkLiBVc2luZyAnaW5kZXgudHN4JyBhcyB0aGUgZW50cnlwb2ludC5cIilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIFwiTm8gZW50cnlwb2ludCBmb3VuZC4gUnVuICd0c2NpIGluaXQnIHRvIGJvb3RzdHJhcCBhIGJhc2ljIHByb2plY3QuXCIsXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVEaXIgPSBwYXRoLmRpcm5hbWUoYWJzb2x1dGVQYXRoKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkluc3RhbGxpbmcgdHlwZXMgZm9yIGltcG9ydGVkIHNuaXBwZXRzLi4uXCIpXG4gICAgICAgIGF3YWl0IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KGFic29sdXRlUGF0aClcbiAgICAgICAgY29uc29sZS5sb2coXCJUeXBlcyBpbnN0YWxsZWQgc3VjY2Vzc2Z1bGx5XCIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gaW5zdGFsbCB0eXBlczpcIiwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcnZlciA9IG5ldyBEZXZTZXJ2ZXIoe1xuICAgICAgICBwb3J0LFxuICAgICAgICBjb21wb25lbnRGaWxlUGF0aDogYWJzb2x1dGVQYXRoLFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgc2VydmVyLnN0YXJ0KClcbiAgICAgIGF3YWl0IHNlcnZlci5hZGRFbnRyeXBvaW50KClcbiAgICB9KVxufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiXG5cbmludGVyZmFjZSBTbmlwcGV0QXBpUmVzcG9uc2Uge1xuICBzbmlwcGV0OiB7XG4gICAgZHRzOiBzdHJpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoc25pcHBldFBhdGg6IHN0cmluZykge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNuaXBwZXRQYXRoLCBcInV0Zi04XCIpXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIHNuaXBwZXRQYXRoLFxuICAgIGNvbnRlbnQsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICApXG5cbiAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXVxuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IHRzLk5vZGUpIHtcbiAgICBpZiAodHMuaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gbm9kZS5tb2R1bGVTcGVjaWZpZXJcbiAgICAgIGlmIChtb2R1bGVTcGVjaWZpZXIgJiYgdHMuaXNTdHJpbmdMaXRlcmFsKG1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IG1vZHVsZVNwZWNpZmllci50ZXh0XG4gICAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHtcbiAgICAgICAgICBpbXBvcnRzLnB1c2goaW1wb3J0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpXG4gIH1cblxuICB2aXNpdChzb3VyY2VGaWxlKVxuXG4gIGxldCBwcm9qZWN0Um9vdCA9IHBhdGguZGlybmFtZShzbmlwcGV0UGF0aClcbiAgd2hpbGUgKHByb2plY3RSb290ICE9PSBwYXRoLnBhcnNlKHByb2plY3RSb290KS5yb290KSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3RSb290LCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIHByb2plY3RSb290ID0gcGF0aC5kaXJuYW1lKHByb2plY3RSb290KVxuICB9XG5cbiAgZm9yIChjb25zdCBpbXBvcnRQYXRoIG9mIGltcG9ydHMpIHtcbiAgICBjb25zdCBbb3duZXIsIG5hbWVdID0gaW1wb3J0UGF0aC5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpLnNwbGl0KFwiLlwiKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbS9zbmlwcGV0cy9nZXQ/b3duZXJfbmFtZT0ke293bmVyfSZ1bnNjb3BlZF9uYW1lPSR7bmFtZX1gLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGZldGNoIHR5cGVzIGZvciAke2ltcG9ydFBhdGh9YClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogU25pcHBldEFwaVJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIGlmIChkYXRhLnNuaXBwZXQuZHRzKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgcHJvamVjdFJvb3QsXG4gICAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgICBcIkB0c2NpXCIsXG4gICAgICAgICAgYCR7b3duZXJ9LiR7bmFtZX1gLFxuICAgICAgICApXG4gICAgICAgIGZzLm1rZGlyU3luYyhwYWNrYWdlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VEaXIsIFwiaW5kZXguZC50c1wiKSwgZGF0YS5zbmlwcGV0LmR0cylcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBFcnJvciBmZXRjaGluZyB0eXBlcyBmb3IgJHtpbXBvcnRQYXRofTpgLCBlcnJvcilcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQga3kgZnJvbSBcImt5XCJcbmltcG9ydCB0eXBlIHsgRmlsZVNlcnZlclJvdXRlcyB9IGZyb20gXCJsaWIvZmlsZS1zZXJ2ZXIvRmlsZVNlcnZlclJvdXRlc1wiXG5pbXBvcnQgeyBjcmVhdGVIdHRwU2VydmVyIH0gZnJvbSBcImxpYi9zZXJ2ZXIvY3JlYXRlSHR0cFNlcnZlclwiXG5pbXBvcnQgeyBFdmVudHNXYXRjaGVyIH0gZnJvbSBcImxpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlclwiXG5pbXBvcnQgdHlwZSBodHRwIGZyb20gXCJub2RlOmh0dHBcIlxuaW1wb3J0IHR5cGUgeyBUeXBlZEt5SW5zdGFuY2UgfSBmcm9tIFwidHlwZWQta3lcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IHR5cGUgeyBGaWxlVXBkYXRlZEV2ZW50IH0gZnJvbSBcImxpYi9maWxlLXNlcnZlci9GaWxlU2VydmVyRXZlbnRcIlxuaW1wb3J0ICogYXMgY2hva2lkYXIgZnJvbSBcImNob2tpZGFyXCJcbmltcG9ydCB7IEZpbGVzeXN0ZW1UeXBlc0hhbmRsZXIgfSBmcm9tIFwibGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvRmlsZXN5c3RlbVR5cGVzSGFuZGxlclwiXG5cbmV4cG9ydCBjbGFzcyBEZXZTZXJ2ZXIge1xuICBwb3J0OiBudW1iZXJcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIGEgY29tcG9uZW50IHRoYXQgZXhwb3J0cyBhIDxib2FyZCAvPiBvciA8Z3JvdXAgLz4gY29tcG9uZW50XG4gICAqL1xuICBjb21wb25lbnRGaWxlUGF0aDogc3RyaW5nXG5cbiAgcHJvamVjdERpcjogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSBIVFRQIHNlcnZlciB0aGF0IGhvc3RzIHRoZSBmaWxlIHNlcnZlciBhbmQgZXZlbnQgYnVzLiBZb3UgY2FuIHVzZVxuICAgKiBmc0t5IHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGZpbGUgc2VydmVyL2V2ZW50IGJ1c1xuICAgKi9cbiAgaHR0cFNlcnZlcj86IGh0dHAuU2VydmVyXG4gIC8qKlxuICAgKiBXYXRjaGVzIGZvciBldmVudHMgb24gdGhlIGV2ZW50IGJ1cyBieSBwb2xsaW5nIGBhcGkvZXZlbnRzL2xpc3RgXG4gICAqL1xuICBldmVudHNXYXRjaGVyPzogRXZlbnRzV2F0Y2hlclxuICAvKipcbiAgICogQSBreSBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGZpbGUgc2VydmVyIGFuZFxuICAgKiBldmVudCBidXNcbiAgICovXG4gIGZzS3k6IFR5cGVkS3lJbnN0YW5jZTxrZXlvZiBGaWxlU2VydmVyUm91dGVzLCBGaWxlU2VydmVyUm91dGVzPlxuICAvKipcbiAgICogQSBjaG9raWRhciBpbnN0YW5jZSB0aGF0IHdhdGNoZXMgdGhlIHByb2plY3QgZGlyZWN0b3J5IGZvciBmaWxlIGNoYW5nZXNcbiAgICovXG4gIGZpbGVzeXN0ZW1XYXRjaGVyPzogY2hva2lkYXIuRlNXYXRjaGVyXG5cbiAgcHJpdmF0ZSB0eXBlc0hhbmRsZXI/OiBGaWxlc3lzdGVtVHlwZXNIYW5kbGVyXG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIHBvcnQsXG4gICAgY29tcG9uZW50RmlsZVBhdGgsXG4gIH06IHtcbiAgICBwb3J0OiBudW1iZXJcbiAgICBjb21wb25lbnRGaWxlUGF0aDogc3RyaW5nXG4gIH0pIHtcbiAgICB0aGlzLnBvcnQgPSBwb3J0XG4gICAgdGhpcy5jb21wb25lbnRGaWxlUGF0aCA9IGNvbXBvbmVudEZpbGVQYXRoXG4gICAgdGhpcy5wcm9qZWN0RGlyID0gcGF0aC5kaXJuYW1lKGNvbXBvbmVudEZpbGVQYXRoKVxuICAgIHRoaXMuZnNLeSA9IGt5LmNyZWF0ZSh7XG4gICAgICBwcmVmaXhVcmw6IGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gLFxuICAgIH0pIGFzIGFueVxuICAgIHRoaXMudHlwZXNIYW5kbGVyID0gbmV3IEZpbGVzeXN0ZW1UeXBlc0hhbmRsZXIodGhpcy5wcm9qZWN0RGlyKVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgY29uc3QgeyBzZXJ2ZXIgfSA9IGF3YWl0IGNyZWF0ZUh0dHBTZXJ2ZXIodGhpcy5wb3J0KVxuICAgIHRoaXMuaHR0cFNlcnZlciA9IHNlcnZlclxuXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyID0gbmV3IEV2ZW50c1dhdGNoZXIoYGh0dHA6Ly9sb2NhbGhvc3Q6JHt0aGlzLnBvcnR9YClcbiAgICB0aGlzLmV2ZW50c1dhdGNoZXIuc3RhcnQoKVxuXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyLm9uKFxuICAgICAgXCJGSUxFX1VQREFURURcIixcbiAgICAgIHRoaXMuaGFuZGxlRmlsZVVwZGF0ZWRFdmVudEZyb21TZXJ2ZXIuYmluZCh0aGlzKSxcbiAgICApXG5cbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyID0gY2hva2lkYXIud2F0Y2godGhpcy5wcm9qZWN0RGlyLCB7XG4gICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICB9KVxuXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImNoYW5nZVwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG4gICAgdGhpcy5maWxlc3lzdGVtV2F0Y2hlci5vbihcImFkZFwiLCAoZmlsZVBhdGgpID0+XG4gICAgICB0aGlzLmhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGZpbGVQYXRoKSxcbiAgICApXG5cbiAgICB0aGlzLnVwc2VydEluaXRpYWxGaWxlcygpXG5cbiAgICB0aGlzLnR5cGVzSGFuZGxlcj8uaGFuZGxlSW5pdGlhbFR5cGVEZXBlbmRlbmNpZXModGhpcy5jb21wb25lbnRGaWxlUGF0aClcbiAgfVxuXG4gIGFzeW5jIGFkZEVudHJ5cG9pbnQoKSB7XG4gICAgY29uc3QgcmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoXG4gICAgICB0aGlzLnByb2plY3REaXIsXG4gICAgICB0aGlzLmNvbXBvbmVudEZpbGVQYXRoLFxuICAgIClcbiAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAganNvbjoge1xuICAgICAgICBmaWxlX3BhdGg6IFwiZW50cnlwb2ludC50c3hcIixcbiAgICAgICAgdGV4dF9jb250ZW50OiBgXG5pbXBvcnQgTXlDaXJjdWl0IGZyb20gXCIuLyR7cmVsYXRpdmVDb21wb25lbnRGaWxlUGF0aH1cIlxuXG5jaXJjdWl0LmFkZCg8TXlDaXJjdWl0IC8+KVxuYCxcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVVcGRhdGVkRXZlbnRGcm9tU2VydmVyKGV2OiBGaWxlVXBkYXRlZEV2ZW50KSB7XG4gICAgaWYgKGV2LmluaXRpYXRvciA9PT0gXCJmaWxlc3lzdGVtX2NoYW5nZVwiKSByZXR1cm5cblxuICAgIGlmIChldi5maWxlX3BhdGggPT09IFwibWFudWFsLWVkaXRzLmpzb25cIikge1xuICAgICAgY29uc29sZS5sb2coXCJNYW51YWwgZWRpdHMgdXBkYXRlZCwgdXBkYXRpbmcgb24gZmlsZXN5c3RlbS4uLlwiKVxuICAgICAgY29uc3QgeyBmaWxlIH0gPSBhd2FpdCB0aGlzLmZzS3lcbiAgICAgICAgLmdldChcImFwaS9maWxlcy9nZXRcIiwge1xuICAgICAgICAgIHNlYXJjaFBhcmFtczogeyBmaWxlX3BhdGg6IGV2LmZpbGVfcGF0aCB9LFxuICAgICAgICB9KVxuICAgICAgICAuanNvbigpXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBcIm1hbnVhbC1lZGl0cy5qc29uXCIpLFxuICAgICAgICBmaWxlLnRleHRfY29udGVudCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlZE9uRmlsZXN5c3RlbShhYnNvbHV0ZUZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLnByb2plY3REaXIsIGFic29sdXRlRmlsZVBhdGgpXG4gICAgLy8gV2UndmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQgdXBzZXJ0aW5nIG1hbnVhbCBlZGl0cyBmcm9tIGZpbGVzeXN0ZW0gY2hhbmdlc1xuICAgIC8vIGJlY2F1c2UgaXQgY2FuIGJlIGVkaXRlZCBieSB0aGUgYnJvd3NlclxuICAgIGlmIChyZWxhdGl2ZUZpbGVQYXRoLmluY2x1ZGVzKFwibWFudWFsLWVkaXRzLmpzb25cIikpIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy50eXBlc0hhbmRsZXI/LmhhbmRsZUZpbGVUeXBlRGVwZW5kZW5jaWVzKGFic29sdXRlRmlsZVBhdGgpXG5cbiAgICBjb25zb2xlLmxvZyhgJHtyZWxhdGl2ZUZpbGVQYXRofSBzYXZlZC4gQXBwbHlpbmcgY2hhbmdlcy4uLmApXG4gICAgYXdhaXQgdGhpcy5mc0t5XG4gICAgICAucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiByZWxhdGl2ZUZpbGVQYXRoLFxuICAgICAgICAgIHRleHRfY29udGVudDogZnMucmVhZEZpbGVTeW5jKGFic29sdXRlRmlsZVBhdGgsIFwidXRmLThcIiksXG4gICAgICAgICAgaW5pdGlhdG9yOiBcImZpbGVzeXN0ZW1fY2hhbmdlXCIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmpzb24oKVxuICB9XG5cbiAgYXN5bmMgdXBzZXJ0SW5pdGlhbEZpbGVzKCkge1xuICAgIC8vIFNjYW4gcHJvamVjdCBkaXJlY3RvcnkgZm9yIGFsbCBmaWxlcyBhbmQgdXBzZXJ0IHRoZW1cbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyh0aGlzLnByb2plY3REaXIpXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBmaWxlTmFtZSkpLmlzRGlyZWN0b3J5KCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBjb25zdCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKHRoaXMucHJvamVjdERpciwgZmlsZU5hbWUpLFxuICAgICAgICBcInV0Zi04XCIsXG4gICAgICApXG4gICAgICBhd2FpdCB0aGlzLmZzS3kucG9zdChcImFwaS9maWxlcy91cHNlcnRcIiwge1xuICAgICAgICBqc29uOiB7XG4gICAgICAgICAgZmlsZV9wYXRoOiBmaWxlTmFtZSxcbiAgICAgICAgICB0ZXh0X2NvbnRlbnQ6IGZpbGVDb250ZW50LFxuICAgICAgICAgIGluaXRpYXRvcjogXCJmaWxlc3lzdGVtX2NoYW5nZVwiLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCkge1xuICAgIHRoaXMuaHR0cFNlcnZlcj8uY2xvc2UoKVxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlcj8uc3RvcCgpXG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBodHRwIGZyb20gXCJub2RlOmh0dHBcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGdldE5vZGVIYW5kbGVyIH0gZnJvbSBcIndpbnRlcnNwZWMvYWRhcHRlcnMvbm9kZVwiXG5pbXBvcnQgcGtnIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIlxuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgd2ludGVyc3BlY0J1bmRsZSBmcm9tIFwiQHRzY2lyY3VpdC9maWxlLXNlcnZlci9kaXN0L2J1bmRsZS5qc1wiXG5pbXBvcnQgeyBnZXRJbmRleCB9IGZyb20gXCIuLi9zaXRlL2dldEluZGV4XCJcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUh0dHBTZXJ2ZXIgPSBhc3luYyAocG9ydCA9IDMwMjApID0+IHtcbiAgY29uc3QgZmlsZVNlcnZlckhhbmRsZXIgPSBnZXROb2RlSGFuZGxlcih3aW50ZXJzcGVjQnVuZGxlIGFzIGFueSwge30pXG5cbiAgY29uc3Qgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXEudXJsISwgYGh0dHA6Ly8ke3JlcS5oZWFkZXJzLmhvc3R9YClcblxuICAgIGlmICh1cmwucGF0aG5hbWUgPT09IFwiL3N0YW5kYWxvbmUubWluLmpzXCIpIHtcbiAgICAgIGNvbnN0IHN0YW5kYWxvbmVGaWxlUGF0aCA9XG4gICAgICAgIHByb2Nlc3MuZW52LlJVTkZSQU1FX1NUQU5EQUxPTkVfRklMRV9QQVRIIHx8XG4gICAgICAgIHBhdGgucmVzb2x2ZShcbiAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIFwibm9kZV9tb2R1bGVzXCIsXG4gICAgICAgICAgXCJAdHNjaXJjdWl0L3J1bmZyYW1lL2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNcIixcbiAgICAgICAgKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHN0YW5kYWxvbmVGaWxlUGF0aCwgXCJ1dGY4XCIpXG4gICAgICAgIHJlcy53cml0ZUhlYWQoMjAwLCB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0OyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgICAgIH0pXG4gICAgICAgIHJlcy5lbmQoY29udGVudClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igc2VydmluZyBzdGFuZGFsb25lLm1pbi5qczpcIiwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHJlcy53cml0ZUhlYWQoMzAyLCB7XG4gICAgICAgIExvY2F0aW9uOiBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L3J1bmZyYW1lQCR7cGtnLmRlcGVuZGVuY2llc1tcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIl0ucmVwbGFjZSgvXlteMC05XSsvLCBcIlwiKX0vZGlzdC9zdGFuZGFsb25lLm1pbi5qc2AsXG4gICAgICB9KVxuICAgICAgcmVzLmVuZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lID09PSBcIi9cIikge1xuICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IGdldEluZGV4KClcbiAgICAgIHJlcy53cml0ZUhlYWQoMjAwLCB7IFwiQ29udGVudC1UeXBlXCI6IFwidGV4dC9odG1sXCIgfSlcbiAgICAgIHJlcy5lbmQoaHRtbClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh1cmwucGF0aG5hbWUuc3RhcnRzV2l0aChcIi9hcGkvXCIpKSB7XG4gICAgICByZXEudXJsID0gcmVxLnVybCEucmVwbGFjZShcIi9hcGkvXCIsIFwiL1wiKVxuICAgICAgZmlsZVNlcnZlckhhbmRsZXIocmVxLCByZXMpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXMud3JpdGVIZWFkKDQwNClcbiAgICByZXMuZW5kKFwiTm90IGZvdW5kXCIpXG4gIH0pXG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPHsgc2VydmVyOiBodHRwLlNlcnZlciB9PigocmVzb2x2ZSkgPT4ge1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYFNlcnZlciBydW5uaW5nIGF0IGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWApXG4gICAgICByZXNvbHZlKHsgc2VydmVyIH0pXG4gICAgfSlcbiAgfSlcbn1cbiIsICJ7XG4gIFwibmFtZVwiOiBcIkB0c2NpcmN1aXQvY2xpXCIsXG4gIFwibWFpblwiOiBcImRpc3QvbWFpbi5qc1wiLFxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMC4xLjIyXCIsXG4gIFwiYmluXCI6IHtcbiAgICBcInRzY2lcIjogXCIuL2Rpc3QvbWFpbi5qc1wiXG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJzdGFydFwiOiBcImJ1biBydW4gZGV2XCIsXG4gICAgXCJkZXZcIjogXCJidW4gLS1ob3QgLi9jbGkvbWFpbi50cyBkZXYgLi9leGFtcGxlLWRpci9zbmlwcGV0MS1iYXNpYy50c3hcIixcbiAgICBcImJ1aWxkXCI6IFwidHN1cC1ub2RlIGNsaS9tYWluLnRzIC0tZm9ybWF0IGVzbSAtLXNvdXJjZW1hcCBpbmxpbmVcIixcbiAgICBcImZvcm1hdFwiOiBcImJpb21lIGZvcm1hdCAtLXdyaXRlIC5cIixcbiAgICBcImZvcm1hdDpjaGVja1wiOiBcImJpb21lIGZvcm1hdCAuXCIsXG4gICAgXCJjbGlcIjogXCJidW4gLi9jbGkvbWFpbi50c1wiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBiaW9tZWpzL2Jpb21lXCI6IFwiXjEuOS40XCIsXG4gICAgXCJAdHNjaXJjdWl0L2NvcmVcIjogXCJeMC4wLjI0OVwiLFxuICAgIFwiQHRzY2lyY3VpdC9mYWtlLXNuaXBwZXRzXCI6IFwiXjAuMC41XCIsXG4gICAgXCJAdHlwZXMvYnVuXCI6IFwiXjEuMS4xNVwiLFxuICAgIFwiQHR5cGVzL2NvbmZpZ3N0b3JlXCI6IFwiXjYuMC4yXCIsXG4gICAgXCJAdHlwZXMvcmVhY3RcIjogXCJeMTkuMC44XCIsXG4gICAgXCJAdHlwZXMvc2VtdmVyXCI6IFwiXjcuNS44XCIsXG4gICAgXCJnZXQtcG9ydFwiOiBcIl43LjEuMFwiLFxuICAgIFwidGVtcHlcIjogXCJeMy4xLjBcIixcbiAgICBcInRzdXBcIjogXCJeOC4zLjVcIixcbiAgICBcInR5cGVkLWt5XCI6IFwiXjAuMC40XCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcInR5cGVzY3JpcHRcIjogXCJeNS4wLjBcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAdHNjaXJjdWl0L2ZpbGUtc2VydmVyXCI6IFwiXjAuMC4xM1wiLFxuICAgIFwiQHRzY2lyY3VpdC9ydW5mcmFtZVwiOiBcIl4wLjAuNDdcIixcbiAgICBcImNob2tpZGFyXCI6IFwiNC4wLjFcIixcbiAgICBcImNvbW1hbmRlclwiOiBcIl4xMi4xLjBcIixcbiAgICBcImNvbmZpZ3N0b3JlXCI6IFwiXjcuMC4wXCIsXG4gICAgXCJjb3NtaWNvbmZpZ1wiOiBcIl45LjAuMFwiLFxuICAgIFwiZGVsYXlcIjogXCJeNi4wLjBcIixcbiAgICBcImp3dC1kZWNvZGVcIjogXCJeNC4wLjBcIixcbiAgICBcImt5XCI6IFwiXjEuNy40XCIsXG4gICAgXCJtYWtlLXZmc1wiOiBcIl4xLjAuMTVcIixcbiAgICBcInBlcmZlY3QtY2xpXCI6IFwiXjEuMC4yMFwiLFxuICAgIFwicmVkYXhpb3NcIjogXCJeMC41LjFcIixcbiAgICBcInNlbXZlclwiOiBcIl43LjYuM1wiXG4gIH1cbn1cbiIsICJpbXBvcnQgcGtnIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIlxuXG5leHBvcnQgY29uc3QgZ2V0SW5kZXggPSBhc3luYyAoKSA9PiB7XG4gIHJldHVybiBgPGh0bWw+XG4gICAgPGhlYWQ+XG4gICAgPC9oZWFkPlxuICAgIDxib2R5PlxuICAgICAgPHNjcmlwdCBzcmM9XCJodHRwczovL2Nkbi50YWlsd2luZGNzcy5jb21cIj48L3NjcmlwdD5cbiAgICAgIDxkaXYgaWQ9XCJyb290XCI+bG9hZGluZy4uLjwvZGl2PlxuICAgICAgPHNjcmlwdD5cbiAgICAgIGdsb2JhbFRoaXMucHJvY2VzcyA9IHsgZW52OiB7IE5PREVfRU5WOiBcInByb2R1Y3Rpb25cIiB9IH1cbiAgICAgIDwvc2NyaXB0PlxuICAgICAgPHNjcmlwdCBzcmM9XCIvc3RhbmRhbG9uZS5taW4uanNcIj48L3NjcmlwdD5cbiAgICA8L2JvZHk+XG4gIDwvaHRtbD5gXG59XG5cbi8vIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AdHNjaXJjdWl0L3J1bmZyYW1lQCR7cGtnLmRlcGVuZGVuY2llc1tcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIl0ucmVwbGFjZSgvXlteMC05XSsvLCBcIlwiKX0vZGlzdC9zdGFuZGFsb25lLm1pbi5qc1wiPjwvc2NyaXB0PlxuIiwgImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudHNcIlxuXG5pbnRlcmZhY2UgRXZlbnQge1xuICBldmVudF9pZDogc3RyaW5nXG4gIGNyZWF0ZWRfYXQ6IHN0cmluZ1xuICBldmVudF90eXBlOiBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmludGVyZmFjZSBFdmVudHNSZXNwb25zZSB7XG4gIGV2ZW50X2xpc3Q6IEV2ZW50W11cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50c1dhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBwcml2YXRlIGxhc3RQb2xsVGltZTogc3RyaW5nXG4gIHByaXZhdGUgcG9sbEludGVydmFsOiBudW1iZXJcbiAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmdcbiAgcHJpdmF0ZSBwb2xsaW5nID0gZmFsc2VcbiAgcHJpdmF0ZSB0aW1lb3V0SWQ/OiBOb2RlSlMuVGltZW91dFxuXG4gIGNvbnN0cnVjdG9yKGJhc2VVcmwgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiLCBwb2xsSW50ZXJ2YWwgPSAxMDAwKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmxcbiAgICB0aGlzLnBvbGxJbnRlcnZhbCA9IHBvbGxJbnRlcnZhbFxuICAgIHRoaXMubGFzdFBvbGxUaW1lID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5wb2xsaW5nKSByZXR1cm5cbiAgICB0aGlzLnBvbGxpbmcgPSB0cnVlXG4gICAgYXdhaXQgdGhpcy5wb2xsKClcbiAgfVxuXG4gIHN0b3AoKSB7XG4gICAgdGhpcy5wb2xsaW5nID0gZmFsc2VcbiAgICBpZiAodGhpcy50aW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBvbGwoKSB7XG4gICAgaWYgKCF0aGlzLnBvbGxpbmcpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGAke3RoaXMuYmFzZVVybH0vYXBpL2V2ZW50cy9saXN0P3NpbmNlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubGFzdFBvbGxUaW1lKX1gLFxuICAgICAgKVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhOiBFdmVudHNSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICAvLyBVcGRhdGUgbGFzdCBwb2xsIHRpbWUgdG8gbGF0ZXN0IGV2ZW50IG9yIGN1cnJlbnQgdGltZVxuICAgICAgY29uc3QgbGF0ZXN0RXZlbnQgPSBkYXRhLmV2ZW50X2xpc3RbZGF0YS5ldmVudF9saXN0Lmxlbmd0aCAtIDFdXG4gICAgICB0aGlzLmxhc3RQb2xsVGltZSA9IGxhdGVzdEV2ZW50XG4gICAgICAgID8gbGF0ZXN0RXZlbnQuY3JlYXRlZF9hdFxuICAgICAgICA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuXG4gICAgICAvLyBFbWl0IGV2ZW50cyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyXG4gICAgICBkYXRhLmV2ZW50X2xpc3QuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KGV2ZW50LmV2ZW50X3R5cGUsIGV2ZW50KVxuICAgICAgICB0aGlzLmVtaXQoXCIqXCIsIGV2ZW50KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyb3IpXG4gICAgfVxuICAgIC8vIFNjaGVkdWxlIG5leHQgcG9sbFxuICAgIHRoaXMudGltZW91dElkID0gZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KFxuICAgICAgKCkgPT4gdGhpcy5wb2xsKCksXG4gICAgICB0aGlzLnBvbGxJbnRlcnZhbCxcbiAgICApIGFzIHVua25vd24gYXMgTm9kZUpTLlRpbWVvdXRcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBmaW5kSW1wb3J0c0luU25pcHBldCB9IGZyb20gXCIuL2ZpbmRJbXBvcnRzSW5TbmlwcGV0XCJcbmltcG9ydCB7IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0IH0gZnJvbSBcIi4vaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXRcIlxuXG5leHBvcnQgY2xhc3MgRmlsZXN5c3RlbVR5cGVzSGFuZGxlciB7XG4gIHByaXZhdGUgcHJvamVjdFJvb3Q6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxEaXI6IHN0cmluZykge1xuICAgIHRoaXMucHJvamVjdFJvb3QgPSB0aGlzLmZpbmRQcm9qZWN0Um9vdChpbml0aWFsRGlyKVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlSW5pdGlhbFR5cGVEZXBlbmRlbmNpZXMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIGNvbnNvbGUubG9nKFwiQ2hlY2tpbmcgaW5pdGlhbCB0eXBlIGRlcGVuZGVuY2llcy4uLlwiKVxuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuYXJlVHlwZXNJbnN0YWxsZWQoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW5zdGFsbGluZyBtaXNzaW5nIGluaXRpYWwgdHlwZXMuLi5cIilcbiAgICAgICAgYXdhaXQgaW5zdGFsbE5vZGVNb2R1bGVUeXBlc0ZvclNuaXBwZXQoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkVycm9yIGhhbmRsaW5nIGluaXRpYWwgdHlwZSBkZXBlbmRlbmNpZXM6XCIsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVUeXBlRGVwZW5kZW5jaWVzKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmFyZVR5cGVzSW5zdGFsbGVkKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkluc3RhbGxpbmcgbWlzc2luZyBmaWxlIHR5cGVzLi4uXCIpXG4gICAgICAgIGF3YWl0IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KGZpbGVQYXRoKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gdmVyaWZ5IHR5cGVzOlwiLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFyZVR5cGVzSW5zdGFsbGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbXBvcnRzID0gZmluZEltcG9ydHNJblNuaXBwZXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIGltcG9ydHMuZXZlcnkoKGltcCkgPT4gdGhpcy5jaGVja1R5cGVFeGlzdHMoaW1wKSlcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tUeXBlRXhpc3RzKGltcG9ydFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3QgcGF0aFdpdGhvdXRQcmVmaXggPSBpbXBvcnRQYXRoLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIilcbiAgICBjb25zdCBbb3duZXIsIG5hbWVdID0gcGF0aFdpdGhvdXRQcmVmaXguc3BsaXQoXCIuXCIpXG5cbiAgICBjb25zdCB0eXBlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIHRoaXMucHJvamVjdFJvb3QsXG4gICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgXCJAdHNjaVwiLFxuICAgICAgYCR7b3duZXJ9LiR7bmFtZX1gLFxuICAgICAgXCJpbmRleC5kLnRzXCIsXG4gICAgKVxuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmModHlwZVBhdGgpXG4gIH1cblxuICBwcml2YXRlIGZpbmRQcm9qZWN0Um9vdChzdGFydERpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcm9vdCA9IHBhdGgucmVzb2x2ZShzdGFydERpcilcbiAgICB3aGlsZSAocm9vdCAhPT0gcGF0aC5wYXJzZShyb290KS5yb290KSB7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICAgIHJldHVybiByb290XG4gICAgICB9XG4gICAgICByb290ID0gcGF0aC5kaXJuYW1lKHJvb3QpXG4gICAgfVxuICAgIHJldHVybiBzdGFydERpclxuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIlxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEltcG9ydHNJblNuaXBwZXQoc25pcHBldFBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzbmlwcGV0UGF0aCwgXCJ1dGYtOFwiKVxuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBzbmlwcGV0UGF0aCxcbiAgICBjb250ZW50LFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgKVxuXG4gIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW11cblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiB0cy5Ob2RlKSB7XG4gICAgaWYgKHRzLmlzSW1wb3J0RGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVNwZWNpZmllciA9IG5vZGUubW9kdWxlU3BlY2lmaWVyXG4gICAgICBpZiAobW9kdWxlU3BlY2lmaWVyICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydFBhdGggPSBtb2R1bGVTcGVjaWZpZXIudGV4dFxuICAgICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgICAgICAgaW1wb3J0cy5wdXNoKGltcG9ydFBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KVxuICB9XG5cbiAgdmlzaXQoc291cmNlRmlsZSlcblxuICByZXR1cm4gaW1wb3J0c1xufVxuIiwgImltcG9ydCBDb25maWdzdG9yZSBmcm9tIFwiY29uZmlnc3RvcmVcIlxuaW1wb3J0IHR5cGUgeyBUeXBlZENvbmZpZ3N0b3JlIH0gZnJvbSBcIi4vVHlwZWRDb25maWdTdG9yZVwiXG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tIFwiand0LWRlY29kZVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpQ29uZmlnIHtcbiAgc2Vzc2lvblRva2VuPzogc3RyaW5nXG4gIGdpdGh1YlVzZXJuYW1lPzogc3RyaW5nXG4gIHJlZ2lzdHJ5QXBpVXJsPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBjbGlDb25maWc6IFR5cGVkQ29uZmlnc3RvcmU8Q2xpQ29uZmlnPiA9IG5ldyBDb25maWdzdG9yZShcbiAgXCJ0c2NpcmN1aXRcIixcbilcblxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb25Ub2tlbiA9ICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gIGNsaUNvbmZpZy5zZXQoXCJzZXNzaW9uVG9rZW5cIiwgdG9rZW4pXG4gIGNvbnN0IGRlY29kZWQgPSBqd3REZWNvZGU8e1xuICAgIGdpdGh1Yl91c2VybmFtZTogc3RyaW5nXG4gIH0+KHRva2VuKVxuICBjbGlDb25maWcuc2V0KFwiZ2l0aHViVXNlcm5hbWVcIiwgZGVjb2RlZC5naXRodWJfdXNlcm5hbWUpXG59XG5cbmV4cG9ydCBjb25zdCBjbGVhclNlc3Npb24gPSAoKSA9PiB7XG4gIGNsaUNvbmZpZy5kZWxldGUoXCJzZXNzaW9uVG9rZW5cIilcbiAgY2xpQ29uZmlnLmRlbGV0ZShcImdpdGh1YlVzZXJuYW1lXCIpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRSZWdpc3RyeUFwaVVybCA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gY2xpQ29uZmlnLmdldChcInJlZ2lzdHJ5QXBpVXJsXCIpID8/IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBzZXRTZXNzaW9uVG9rZW4gfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IGRlbGF5IGZyb20gXCJkZWxheVwiXG5pbXBvcnQgeyBnZXRLeSB9IGZyb20gXCJsaWIvcmVnaXN0cnktYXBpL2dldC1reVwiXG5pbXBvcnQgdHlwZSB7IEVuZHBvaW50UmVzcG9uc2UgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9lbmRwb2ludC10eXBlc1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dpbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIC8vIERlZmluZSB0aGUgbG9naW4gYWN0aW9uIG9uY2UgdG8gc2hhcmUgYmV0d2VlbiBib3RoIGNvbW1hbmRzXG4gIGNvbnN0IGxvZ2luQWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuXG4gICAgY29uc3QgeyBsb2dpbl9wYWdlIH0gPSBhd2FpdCBreVxuICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvY3JlYXRlXCJdPihcbiAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2NyZWF0ZVwiLFxuICAgICAgICB7XG4gICAgICAgICAganNvbjoge30sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAuanNvbigpXG5cbiAgICBjb25zb2xlLmxvZyhcIlBsZWFzZSB2aXNpdCB0aGUgZm9sbG93aW5nIFVSTCB0byBsb2cgaW46XCIpXG4gICAgY29uc29sZS5sb2cobG9naW5fcGFnZS51cmwpXG5cbiAgICAvLyBXYWl0IHVudGlsIHdlIHJlY2VpdmUgY29uZmlybWF0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHsgbG9naW5fcGFnZTogbmV3X2xvZ2luX3BhZ2UgfSA9IGF3YWl0IGt5XG4gICAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2dldFwiXT4oXG4gICAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2dldFwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgLmpzb24oKVxuXG4gICAgICBpZiAobmV3X2xvZ2luX3BhZ2Uud2FzX2xvZ2luX3N1Y2Nlc3NmdWwpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJMb2dnZWQgaW4hIEdlbmVyYXRpbmcgdG9rZW4uLi5cIilcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld19sb2dpbl9wYWdlLmlzX2V4cGlyZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9naW4gcGFnZSBleHBpcmVkXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRlbGF5KDEwMDApXG4gICAgfVxuXG4gICAgY29uc3QgeyBzZXNzaW9uIH0gPSBhd2FpdCBreVxuICAgICAgLnBvc3Q8RW5kcG9pbnRSZXNwb25zZVtcInNlc3Npb25zL2xvZ2luX3BhZ2UvZXhjaGFuZ2VfZm9yX2NsaV9zZXNzaW9uXCJdPihcbiAgICAgICAgXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiLFxuICAgICAgICB7XG4gICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgbG9naW5fcGFnZV9pZDogbG9naW5fcGFnZS5sb2dpbl9wYWdlX2lkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvZ2luX3BhZ2UubG9naW5fcGFnZV9hdXRoX3Rva2VufWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIC5qc29uKClcblxuICAgIHNldFNlc3Npb25Ub2tlbihzZXNzaW9uLnRva2VuKVxuICAgIGNvbnNvbGUubG9nKFwiXFxuUmVhZHkgdG8gdXNlIVwiKVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGF1dGggbG9naW4gc3ViY29tbWFuZFxuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJsb2dpblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkF1dGhlbnRpY2F0ZSBDTEksIGxvZ2luIHRvIHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dpbkFjdGlvbilcblxuICAvLyBSZWdpc3RlciB0aGUgdG9wLWxldmVsIGxvZ2luIGNvbW1hbmQgYXMgYW4gYWxpYXNcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwibG9naW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJMb2dpbiB0byB0c2NpcmN1aXQgcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ2luQWN0aW9uKVxufVxuIiwgImltcG9ydCB7IGdldFJlZ2lzdHJ5QXBpVXJsIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcbmltcG9ydCBreSwgeyB0eXBlIEFmdGVyUmVzcG9uc2VIb29rIH0gZnJvbSBcImt5XCJcblxuZXhwb3J0IGNvbnN0IHByZXR0eVJlc3BvbnNlRXJyb3JIb29rOiBBZnRlclJlc3BvbnNlSG9vayA9IGFzeW5jIChcbiAgX3JlcXVlc3QsXG4gIF9vcHRpb25zLFxuICByZXNwb25zZSxcbikgPT4ge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRkFJTCBbJHtyZXNwb25zZS5zdGF0dXN9XTogJHtfcmVxdWVzdC5tZXRob2R9ICR7XG4gICAgICAgICAgbmV3IFVSTChfcmVxdWVzdC51cmwpLnBhdGhuYW1lXG4gICAgICAgIH0gXFxuXFxuICR7SlNPTi5zdHJpbmdpZnkoZXJyb3JEYXRhLCBudWxsLCAyKX1gLFxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vaWdub3JlLCBhbGxvdyB0aGUgZXJyb3IgdG8gYmUgdGhyb3duXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRLeSA9ICgpID0+IHtcbiAgcmV0dXJuIGt5LmNyZWF0ZSh7XG4gICAgcHJlZml4VXJsOiBnZXRSZWdpc3RyeUFwaVVybCgpLFxuICAgIGhvb2tzOiB7XG4gICAgICBhZnRlclJlc3BvbnNlOiBbcHJldHR5UmVzcG9uc2VFcnJvckhvb2tdLFxuICAgIH0sXG4gIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGVhclNlc3Npb24gfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoTG9nb3V0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgY29uc3QgbG9nb3V0QWN0aW9uID0gKCkgPT4ge1xuICAgIGNsZWFyU2Vzc2lvbigpXG4gICAgY29uc29sZS5sb2coXCJZb3UgaGF2ZSBiZWVuIGxvZ2dlZCBvdXQhXCIpXG4gIH1cblxuICAvLyBSZWdpc3RlciB0aGUgYXV0aCBsb2dvdXQgc3ViY29tbWFuZFxuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJsb2dvdXRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJMb2dvdXQgZnJvbSByZWdpc3RyeVwiKVxuICAgIC5hY3Rpb24obG9nb3V0QWN0aW9uKVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSB0b3AtbGV2ZWwgbG9nb3V0IGNvbW1hbmQgYXMgYW4gYWxpYXNcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwibG9nb3V0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiTG9nb3V0IGZyb20gdHNjaXJjdWl0IHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dvdXRBY3Rpb24pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGggPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmQoXCJhdXRoXCIpLmRlc2NyaXB0aW9uKFwiTG9naW4vbG9nb3V0XCIpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZyA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZChcImNvbmZpZ1wiKS5kZXNjcmlwdGlvbihcIk1hbmFnZSB0c2NpcmN1aXQgQ0xJIGNvbmZpZ3VyYXRpb25cIilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNsaUNvbmZpZyB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNvbmZpZ1ByaW50ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJjb25maWdcIikhXG4gICAgLmNvbW1hbmQoXCJwcmludFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlByaW50IHRoZSBjdXJyZW50IGNvbmZpZ1wiKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoY2xpQ29uZmlnLmFsbCwgbnVsbCwgMikpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGdldEt5IH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5XCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckNsb25lID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiY2xvbmVcIilcbiAgICAuZGVzY3JpcHRpb24oXCJDbG9uZSBhIHNuaXBwZXQgZnJvbSB0aGUgcmVnaXN0cnlcIilcbiAgICAuYXJndW1lbnQoXCI8c25pcHBldD5cIiwgXCJTbmlwcGV0IHRvIGNsb25lIChlLmcuIGF1dGhvci9zbmlwcGV0TmFtZSlcIilcbiAgICAuYWN0aW9uKGFzeW5jIChzbmlwcGV0UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBsZXQgYXV0aG9yOiBzdHJpbmdcbiAgICAgIGxldCBzbmlwcGV0TmFtZTogc3RyaW5nXG4gICAgICBpZiAoIXNuaXBwZXRQYXRoLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikgJiYgc25pcHBldFBhdGguaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICAgIDtbYXV0aG9yLCBzbmlwcGV0TmFtZV0gPSBzbmlwcGV0UGF0aC5zcGxpdChcIi9cIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWRQYXRoID0gc25pcHBldFBhdGgucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKVxuICAgICAgICBjb25zdCBmaXJzdERvdEluZGV4ID0gdHJpbW1lZFBhdGguaW5kZXhPZihcIi5cIilcbiAgICAgICAgYXV0aG9yID0gdHJpbW1lZFBhdGguc2xpY2UoMCwgZmlyc3REb3RJbmRleClcbiAgICAgICAgc25pcHBldE5hbWUgPSB0cmltbWVkUGF0aC5zbGljZShmaXJzdERvdEluZGV4ICsgMSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFhdXRob3IgfHwgIXNuaXBwZXROYW1lKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIHNuaXBwZXQgcGF0aC4gVXNlIGZvcm1hdDogYXV0aG9yL3NuaXBwZXROYW1lLCBhdXRob3Iuc25pcHBldE5hbWUgb3IgQHRzY2kvYXV0aG9yLnNuaXBwZXROYW1lXCIsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGt5ID0gZ2V0S3koKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQ2xvbmluZyAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX0uLi5gKVxuXG4gICAgICAgIGNvbnN0IHBhY2thZ2VGaWxlTGlzdCA9IGF3YWl0IGt5XG4gICAgICAgICAgLnBvc3Q8e1xuICAgICAgICAgICAgcGFja2FnZV9maWxlczogQXJyYXk8e1xuICAgICAgICAgICAgICBwYWNrYWdlX2ZpbGVfaWQ6IHN0cmluZ1xuICAgICAgICAgICAgICBwYWNrYWdlX3JlbGVhc2VfaWQ6IHN0cmluZ1xuICAgICAgICAgICAgICBmaWxlX3BhdGg6IHN0cmluZ1xuICAgICAgICAgICAgICBjcmVhdGVkX2F0OiBzdHJpbmdcbiAgICAgICAgICAgIH0+XG4gICAgICAgICAgfT4oXCJwYWNrYWdlX2ZpbGVzL2xpc3RcIiwge1xuICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICB1c2VfbGF0ZXN0X3ZlcnNpb246IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgIC8vIENyZWF0ZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICBjb25zdCBkaXJQYXRoID0gYC4vJHthdXRob3J9LiR7c25pcHBldE5hbWV9YFxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgICAgICBmcy5ta2RpclN5bmMoZGlyUGF0aClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvd25sb2FkIGVhY2ggZmlsZSB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBkaXN0L1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGVJbmZvIG9mIHBhY2thZ2VGaWxlTGlzdC5wYWNrYWdlX2ZpbGVzKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBmaWxlSW5mby5maWxlX3BhdGguc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gZmlsZUluZm8uZmlsZV9wYXRoLnNsaWNlKDEpXG4gICAgICAgICAgICA6IGZpbGVJbmZvLmZpbGVfcGF0aFxuXG4gICAgICAgICAgaWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkgY29udGludWVcblxuICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQga3lcbiAgICAgICAgICAgIC5wb3N0PHtcbiAgICAgICAgICAgICAgcGFja2FnZV9maWxlOiB7XG4gICAgICAgICAgICAgICAgY29udGVudF90ZXh0OiBzdHJpbmdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfT4oXCJwYWNrYWdlX2ZpbGVzL2dldFwiLCB7XG4gICAgICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IGAke2F1dGhvcn0vJHtzbmlwcGV0TmFtZX1gLFxuICAgICAgICAgICAgICAgIGZpbGVfcGF0aDogZmlsZUluZm8uZmlsZV9wYXRoLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qc29uKClcblxuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGVQYXRoKVxuICAgICAgICAgIGNvbnN0IGRpck5hbWUgPSBwYXRoLmRpcm5hbWUoZnVsbFBhdGgpXG5cbiAgICAgICAgICAvLyBDcmVhdGUgbmVzdGVkIGRpcmVjdG9yaWVzIGlmIHRoZXkgZG9uJ3QgZXhpc3RcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyTmFtZSkpIHtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXJOYW1lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGZpbGVDb250ZW50LnBhY2thZ2VfZmlsZS5jb250ZW50X3RleHQpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBucG1yY1BhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgXCIubnBtcmNcIilcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhucG1yY1BhdGgsIFwiQHRzY2k6cmVnaXN0cnk9aHR0cHM6Ly9ucG0udHNjaXJjdWl0LmNvbVwiKVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBTdWNjZXNzZnVsbHkgY2xvbmVkIHRvIC4vJHthdXRob3J9LiR7c25pcHBldE5hbWV9L2ApXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY2xvbmUgc25pcHBldDpcIiwgZXJyb3IubWVzc2FnZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNsb25lIHNuaXBwZXQ6XCIsIGVycm9yKVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgfVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjcmVhdGVDaXJjdWl0V2ViV29ya2VyIH0gZnJvbSBcIkB0c2NpcmN1aXQvZXZhbC13ZWJ3b3JrZXJcIlxuaW1wb3J0IHdlYldvcmtlckJ1bmRsZVVybCBmcm9tIFwiQHRzY2lyY3VpdC9ldmFsLXdlYndvcmtlci9ibG9iLXVybFwiXG5pbXBvcnQgeyBnZXRWaXJ0dWFsRmlsZVN5c3RlbUZyb21EaXJQYXRoIH0gZnJvbSBcIm1ha2UtdmZzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCJcblxuY29uc3QgQUxMT1dFRF9GT1JNQVRTID0gW1xuICBcImpzb25cIixcbiAgXCJjaXJjdWl0LWpzb25cIixcbiAgXCJzY2hlbWF0aWMtc3ZnXCIsXG4gIFwicGNiLXN2Z1wiLFxuICBcImdlcmJlcnNcIixcbiAgXCJyZWFkYWJsZS1uZXRsaXN0XCIsXG4gIFwiZ2x0ZlwiLFxuICBcInNwZWNjdHJhLWRzblwiLFxuXSBhcyBjb25zdFxuXG50eXBlIEZvcm1hdCA9ICh0eXBlb2YgQUxMT1dFRF9GT1JNQVRTKVtudW1iZXJdXG5cbmNvbnN0IE9VVFBVVF9FWFRFTlNJT05TID0ge1xuICBqc29uOiBcIi5jaXJjdWl0Lmpzb25cIixcbiAgXCJjaXJjdWl0LWpzb25cIjogXCIuY2lyY3VpdC5qc29uXCIsXG4gIFwic2NoZW1hdGljLXN2Z1wiOiBcIi1zY2hlbWF0aWMuc3ZnXCIsXG4gIFwicGNiLXN2Z1wiOiBcIi1wY2Iuc3ZnXCIsXG4gIGdlcmJlcnM6IFwiLWdlcmJlcnMuemlwXCIsXG4gIFwicmVhZGFibGUtbmV0bGlzdFwiOiBcIi1yZWFkYWJsZS5uZXRsaXN0XCIsXG4gIGdsdGY6IFwiLmdsdGZcIixcbiAgXCJzcGVjY3RyYS1kc25cIjogXCIuZHNuXCIsXG59XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckV4cG9ydCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImV4cG9ydFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkV4cG9ydCB0c2NpcmN1aXQgY29kZSB0byB2YXJpb3VzIGZvcm1hdHNcIilcbiAgICAuYXJndW1lbnQoXCI8ZmlsZT5cIiwgXCJQYXRoIHRvIHRoZSBzbmlwcGV0IGZpbGVcIilcbiAgICAub3B0aW9uKFwiLWYsIC0tZm9ybWF0IDxmb3JtYXQ+XCIsIFwiT3V0cHV0IGZvcm1hdFwiKVxuICAgIC5vcHRpb24oXCItbywgLS1vdXRwdXQgPHBhdGg+XCIsIFwiT3V0cHV0IGZpbGUgcGF0aFwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKGZpbGUsIG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IHsgZm9ybWF0ID0gXCJjaXJjdWl0LWpzb25cIiB9ID0gb3B0aW9uc1xuICAgICAgbGV0IHsgb3V0cHV0IH0gPSBvcHRpb25zXG4gICAgICBpZiAoIUFMTE9XRURfRk9STUFUUy5pbmNsdWRlcyhmb3JtYXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBmb3JtYXQ6ICR7Zm9ybWF0fVxcblN1cHBvcnRlZCBmb3JtYXRzOiAke0FMTE9XRURfRk9STUFUUy5qb2luKFwiLFwiKX1gLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmICghb3V0cHV0KSB7XG4gICAgICAgIG91dHB1dCA9IHBhdGguYmFzZW5hbWUoZmlsZSkucmVwbGFjZSgvXFwuW14uXSskLywgXCJcIilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgY3JlYXRlQ2lyY3VpdFdlYldvcmtlcih7XG4gICAgICAgIHdlYldvcmtlclVybDogd2ViV29ya2VyQnVuZGxlVXJsLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgcHJvamVjdERpciA9IHBhdGguZGlybmFtZShmaWxlKVxuXG4gICAgICBjb25zdCByZWxhdGl2ZUNvbXBvbmVudFBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2plY3REaXIsIGZpbGUpXG5cbiAgICAgIGF3YWl0IHdvcmtlci5leGVjdXRlV2l0aEZzTWFwKHtcbiAgICAgICAgZW50cnlwb2ludDogXCJlbnRyeXBvaW50LnRzeFwiLFxuICAgICAgICBmc01hcDoge1xuICAgICAgICAgIC4uLigoYXdhaXQgZ2V0VmlydHVhbEZpbGVTeXN0ZW1Gcm9tRGlyUGF0aCh7XG4gICAgICAgICAgICBkaXJQYXRoOiBwcm9qZWN0RGlyLFxuICAgICAgICAgICAgY29udGVudEZvcm1hdDogXCJzdHJpbmdcIixcbiAgICAgICAgICB9KSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiksXG4gICAgICAgICAgXCJlbnRyeXBvaW50LnRzeFwiOiBgXG5pbXBvcnQgTXlDaXJjdWl0IGZyb20gXCIuLyR7cmVsYXRpdmVDb21wb25lbnRQYXRofVwiXG5cbmNpcmN1aXQuYWRkKDxNeUNpcmN1aXQgLz4pXG4gICAgICAgIGAsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB3b3JrZXIucmVuZGVyVW50aWxTZXR0bGVkKClcblxuICAgICAgY29uc3QgY2lyY3VpdEpzb24gPSBhd2FpdCB3b3JrZXIuZ2V0Q2lyY3VpdEpzb24oKVxuXG4gICAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICBwcm9qZWN0RGlyLFxuICAgICAgICBgJHtvdXRwdXR9JHtPVVRQVVRfRVhURU5TSU9OU1tmb3JtYXQgYXMgRm9ybWF0XX1gLFxuICAgICAgKVxuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIEpTT04uc3RyaW5naWZ5KGNpcmN1aXRKc29uKSlcblxuICAgICAgY29uc29sZS5sb2coYEV4cG9ydGVkIHRvICR7b3V0cHV0UGF0aH1gKVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMClcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY2xpQ29uZmlnIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aFByaW50VG9rZW4gPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJwcmludC10b2tlblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIlByaW50cyB5b3VyIGF1dGggdG9rZW5cIilcbiAgICAuYWN0aW9uKCgpID0+IHtcbiAgICAgIGNvbnN0IHRva2VuID0gY2xpQ29uZmlnLmdldChcInNlc3Npb25Ub2tlblwiKVxuICAgICAgaWYgKCF0b2tlbikgcmV0dXJuIGNvbnNvbGUubG9nKFwiWW91IG5lZWQgdG8gbG9nIGluIHRvIGFjY2VzcyB0aGlzLlwiKVxuICAgICAgY29uc29sZS5sb2coXCJZb3VyIFRva2VuOlxcblwiLCB0b2tlbilcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgc2V0U2Vzc2lvblRva2VuIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZnVuY3Rpb24gdmFsaWRhdGVKV1RMZW5ndGgodG9rZW46IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHRva2VuLnNwbGl0KFwiLlwiKVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDMgJiYgcGFydHMuZXZlcnkoKHBhcnQpID0+IHBhcnQubGVuZ3RoID4gMCkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoU2V0VG9rZW4gPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImF1dGhcIikhXG4gICAgLmNvbW1hbmQoXCJzZXQtdG9rZW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJFeHBsaWNpdGx5IHNldCB5b3VyIGF1dGggdG9rZW5cIilcbiAgICAuYXJndW1lbnQoXCI8dG9rZW4+XCIsIFwiTmV3IHRva2VuIHRvIG1hbnVhbGx5IGNvbmZpZ3VyZVwiKVxuICAgIC5hY3Rpb24oKHRva2VuKSA9PiB7XG4gICAgICBpZiAoIXZhbGlkYXRlSldUTGVuZ3RoKHRva2VuKSlcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKFwiSW52YWxpZCB0b2tlbiBwcm92aWRlZFwiKVxuICAgICAgc2V0U2Vzc2lvblRva2VuKHRva2VuKVxuICAgICAgY29uc29sZS5sb2coXCJUb2tlbiBtYW51YWxseSB1cGRhdGVkLlwiKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuaW1wb3J0IHsgZ2V0S3kgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9nZXQta3lcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlclB1c2ggPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJwdXNoXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU2F2ZSBzbmlwcGV0IGNvZGUgdG8gUmVnaXN0cnkgQVBJXCIpXG4gICAgLmFyZ3VtZW50KFwiW2ZpbGVdXCIsIFwiUGF0aCB0byB0aGUgc25pcHBldCBmaWxlXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb25Ub2tlbiA9IGNsaUNvbmZpZy5nZXQoXCJzZXNzaW9uVG9rZW5cIilcbiAgICAgIGlmICghc2Vzc2lvblRva2VuKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJZb3UgbmVlZCB0byBsb2cgaW4gdG8gc2F2ZSBzbmlwcGV0LlwiKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgbGV0IHNuaXBwZXRGaWxlUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICBzbmlwcGV0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkZWZhdWx0RW50cnlwb2ludCA9IHBhdGgucmVzb2x2ZShcImluZGV4LnRzeFwiKVxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhkZWZhdWx0RW50cnlwb2ludCkpIHtcbiAgICAgICAgICBzbmlwcGV0RmlsZVBhdGggPSBkZWZhdWx0RW50cnlwb2ludFxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiTm8gZmlsZSBwcm92aWRlZC4gVXNpbmcgJ2luZGV4LnRzeCcgYXMgdGhlIGVudHJ5cG9pbnQuXCIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiTm8gZW50cnlwb2ludCBmb3VuZC4gUnVuICd0c2NpIGluaXQnIHRvIGJvb3RzdHJhcCBhIGJhc2ljIHByb2plY3QuXCIsXG4gICAgICAgICAgKVxuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgcGF0aC5qb2luKHBhdGguZGlybmFtZShzbmlwcGV0RmlsZVBhdGgpLCBcInBhY2thZ2UuanNvblwiKSxcbiAgICAgIClcbiAgICAgIGxldCBwYWNrYWdlSnNvbjogeyBuYW1lPzogc3RyaW5nOyBhdXRob3I/OiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfSA9IHt9XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgpLnRvU3RyaW5nKCkpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIHBhY2thZ2UuanNvbiBwcm92aWRlZFwiKVxuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhzbmlwcGV0RmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke3NuaXBwZXRGaWxlUGF0aH1gKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qga3kgPSBnZXRLeSgpXG4gICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IChcbiAgICAgICAgcGFja2FnZUpzb24ubmFtZSA/PyBwYXRoLnBhcnNlKHNuaXBwZXRGaWxlUGF0aCkubmFtZVxuICAgICAgKS5yZXBsYWNlKC9eQC8sIFwiXCIpXG5cbiAgICAgIGNvbnN0IHBhY2thZ2VBdXRob3IgPVxuICAgICAgICBwYWNrYWdlSnNvbi5hdXRob3I/LnNwbGl0KFwiIFwiKVswXSA/PyBjbGlDb25maWcuZ2V0KFwiZ2l0aHViVXNlcm5hbWVcIilcblxuICAgICAgY29uc3QgcGFja2FnZUlkZW50aWZpZXIgPSBgJHtwYWNrYWdlQXV0aG9yfS8ke3BhY2thZ2VOYW1lfWBcblxuICAgICAgbGV0IHBhY2thZ2VWZXJzaW9uID1cbiAgICAgICAgcGFja2FnZUpzb24udmVyc2lvbiA/P1xuICAgICAgICAoYXdhaXQga3lcbiAgICAgICAgICAucG9zdDx7XG4gICAgICAgICAgICBlcnJvcj86IHsgZXJyb3JfY29kZTogc3RyaW5nIH1cbiAgICAgICAgICAgIHBhY2thZ2VfcmVsZWFzZXM/OiB7IHZlcnNpb246IHN0cmluZzsgaXNfbGF0ZXN0OiBib29sZWFuIH1bXVxuICAgICAgICAgIH0+KFwicGFja2FnZV9yZWxlYXNlcy9saXN0XCIsIHtcbiAgICAgICAgICAgIGpzb246IHsgcGFja2FnZV9uYW1lOiBwYWNrYWdlSWRlbnRpZmllciB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmpzb24oKVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgKHJlc3BvbnNlKSA9PlxuICAgICAgICAgICAgICByZXNwb25zZS5wYWNrYWdlX3JlbGVhc2VzPy5bcmVzcG9uc2UucGFja2FnZV9yZWxlYXNlcy5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICAgID8udmVyc2lvbixcbiAgICAgICAgICApXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byByZXRyaWV2ZSBsYXRlc3QgcGFja2FnZSB2ZXJzaW9uOlwiLCBlcnJvcilcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgICAgIH0pKVxuXG4gICAgICBpZiAoIXBhY2thZ2VWZXJzaW9uKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiRmFpbGVkIHRvIHJldHJpZXZlIHBhY2thZ2UgdmVyc2lvbi5cIilcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVwZGF0ZVBhY2thZ2VKc29uVmVyc2lvbiA9IChuZXdWZXJzaW9uPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChwYWNrYWdlSnNvbi52ZXJzaW9uKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBhY2thZ2VKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uID8/IHBhY2thZ2VWZXJzaW9uXG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgICBwYWNrYWdlSnNvblBhdGgsXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCBudWxsLCAyKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byB1cGRhdGUgcGFja2FnZS5qc29uIHZlcnNpb246XCIsIGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkb2VzUGFja2FnZUV4aXN0ID0gYXdhaXQga3lcbiAgICAgICAgLnBvc3Q8eyBlcnJvcj86IHsgZXJyb3JfY29kZTogc3RyaW5nIH0gfT4oXCJwYWNrYWdlcy9nZXRcIiwge1xuICAgICAgICAgIGpzb246IHsgbmFtZTogcGFja2FnZUlkZW50aWZpZXIgfSxcbiAgICAgICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAuanNvbigpXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIChyZXNwb25zZSkgPT4gIShyZXNwb25zZS5lcnJvcj8uZXJyb3JfY29kZSA9PT0gXCJwYWNrYWdlX25vdF9mb3VuZFwiKSxcbiAgICAgICAgKVxuXG4gICAgICBpZiAoIWRvZXNQYWNrYWdlRXhpc3QpIHtcbiAgICAgICAgYXdhaXQga3lcbiAgICAgICAgICAucG9zdChcInBhY2thZ2VzL2NyZWF0ZVwiLCB7XG4gICAgICAgICAgICBqc29uOiB7IG5hbWU6IHBhY2thZ2VJZGVudGlmaWVyIH0sXG4gICAgICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzZXNzaW9uVG9rZW59YCB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNyZWF0aW5nIHBhY2thZ2U6XCIsIGVycm9yKVxuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZG9lc1JlbGVhc2VFeGlzdCA9IGF3YWl0IGt5XG4gICAgICAgIC5wb3N0PHtcbiAgICAgICAgICBlcnJvcj86IHsgZXJyb3JfY29kZTogc3RyaW5nIH1cbiAgICAgICAgICBwYWNrYWdlX3JlbGVhc2U/OiB7IHZlcnNpb246IHN0cmluZyB9XG4gICAgICAgIH0+KFwicGFja2FnZV9yZWxlYXNlcy9nZXRcIiwge1xuICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgIHBhY2thZ2VfbmFtZV93aXRoX3ZlcnNpb246IGAke3BhY2thZ2VJZGVudGlmaWVyfUAke3BhY2thZ2VWZXJzaW9ufWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAuanNvbigpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5wYWNrYWdlX3JlbGVhc2U/LnZlcnNpb24pIHtcbiAgICAgICAgICAgIHBhY2thZ2VWZXJzaW9uID0gcmVzcG9uc2UucGFja2FnZV9yZWxlYXNlLnZlcnNpb25cbiAgICAgICAgICAgIHVwZGF0ZVBhY2thZ2VKc29uVmVyc2lvbihyZXNwb25zZS5wYWNrYWdlX3JlbGVhc2UudmVyc2lvbilcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAhKHJlc3BvbnNlLmVycm9yPy5lcnJvcl9jb2RlID09PSBcInBhY2thZ2VfcmVsZWFzZV9ub3RfZm91bmRcIilcbiAgICAgICAgfSlcblxuICAgICAgaWYgKGRvZXNSZWxlYXNlRXhpc3QpIHtcbiAgICAgICAgY29uc3QgYnVtcGVkVmVyc2lvbiA9IHNlbXZlci5pbmMocGFja2FnZVZlcnNpb24sIFwicGF0Y2hcIikhXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBJbmNyZW1lbnRpbmcgUGFja2FnZSBWZXJzaW9uICR7cGFja2FnZVZlcnNpb259IC0+ICR7YnVtcGVkVmVyc2lvbn1gLFxuICAgICAgICApXG4gICAgICAgIHBhY2thZ2VWZXJzaW9uID0gYnVtcGVkVmVyc2lvblxuICAgICAgICB1cGRhdGVQYWNrYWdlSnNvblZlcnNpb24ocGFja2FnZVZlcnNpb24pXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGt5XG4gICAgICAgIC5wb3N0KFwicGFja2FnZV9yZWxlYXNlcy9jcmVhdGVcIiwge1xuICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgIHBhY2thZ2VfbmFtZV93aXRoX3ZlcnNpb246IGAke3BhY2thZ2VJZGVudGlmaWVyfUAke3BhY2thZ2VWZXJzaW9ufWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNyZWF0aW5nIHJlbGVhc2U6XCIsIGVycm9yKVxuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgICAgICB9KVxuXG4gICAgICBjb25zb2xlLmxvZyhcIlxcblwiKVxuXG4gICAgICBjb25zdCBkaXJlY3RvcnlGaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHBhdGguZGlybmFtZShzbmlwcGV0RmlsZVBhdGgpKVxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGRpcmVjdG9yeUZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZSkucmVwbGFjZShcIi5cIiwgXCJcIilcbiAgICAgICAgaWYgKCFbXCJqc29uXCIsIFwidHN4XCIsIFwidHNcIl0uaW5jbHVkZXMoZmlsZUV4dGVuc2lvbikpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPVxuICAgICAgICAgIGZzXG4gICAgICAgICAgICAucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUoc25pcHBldEZpbGVQYXRoKSwgZmlsZSkpXG4gICAgICAgICAgICAudG9TdHJpbmcoKSA/PyBcIlwiXG4gICAgICAgIGF3YWl0IGt5XG4gICAgICAgICAgLnBvc3QoXCJwYWNrYWdlX2ZpbGVzL2NyZWF0ZVwiLCB7XG4gICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgIGZpbGVfcGF0aDogZmlsZSxcbiAgICAgICAgICAgICAgY29udGVudF90ZXh0OiBmaWxlQ29udGVudCxcbiAgICAgICAgICAgICAgcGFja2FnZV9uYW1lX3dpdGhfdmVyc2lvbjogYCR7cGFja2FnZUlkZW50aWZpZXJ9QCR7cGFja2FnZVZlcnNpb259YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFVwbG9hZGVkIGZpbGUgJHtmaWxlfSB0byB0aGUgcmVnaXN0cnkuYClcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHVwbG9hZGluZyBmaWxlICR7ZmlsZX06YCwgZXJyb3IpXG4gICAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBcXG5cdUQ4M0NcdURGODkgU3VjY2Vzc2Z1bGx5IHB1c2hlZCBwYWNrYWdlICR7cGFja2FnZUlkZW50aWZpZXJ9QCR7cGFja2FnZVZlcnNpb259IHRvIHRoZSByZWdpc3RyeSEke0J1bi5jb2xvcihcImJsdWVcIiwgXCJhbnNpXCIpfWAsXG4gICAgICAgIGBodHRwczovL3RzY2lyY3VpdC5jb20vJHtwYWNrYWdlSWRlbnRpZmllcn0gXFx4MWJbMG1gLFxuICAgICAgKVxuICAgIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFDQSxTQUFTLGVB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QUMsRUFDQSxNQUFNLENBQUMsVUFBVTtBQUNoQixnQkFBUSxNQUFNLHdCQUF3QixJQUFJLEtBQUssS0FBSztBQUFBLE1BQ3RELENBQUM7QUFBQSxJQUNMO0FBRUEsWUFBUTtBQUFBLE1BQ047QUFBQSx3Q0FBb0MsaUJBQWlCLElBQUksY0FBYyxvQkFBb0IsSUFBSSxNQUFNLFFBQVEsTUFBTSxDQUFDO0FBQUEsTUFDcEgseUJBQXlCLGlCQUFpQjtBQUFBLElBQzVDO0FBQUEsRUFDRixDQUFDO0FBQ0w7OztBdEJwTEEsSUFBTSxVQUFVLElBQUksUUFBUTtBQUU1QixRQUNHLEtBQUssTUFBTSxFQUNYLFlBQVksdUNBQXVDLEVBR25ELFFBQVFDLFFBQU8sSUFBSSxnQkFBSSxTQUFTLE9BQU8sS0FBSyxnQkFBSSxPQUFPO0FBRTFELGFBQWEsT0FBTztBQUVwQixZQUFZLE9BQU87QUFDbkIsY0FBYyxPQUFPO0FBQ3JCLGFBQWEsT0FBTztBQUVwQixhQUFhLE9BQU87QUFDcEIsa0JBQWtCLE9BQU87QUFDekIsbUJBQW1CLE9BQU87QUFDMUIsdUJBQXVCLE9BQU87QUFDOUIscUJBQXFCLE9BQU87QUFFNUIsZUFBZSxPQUFPO0FBQ3RCLG9CQUFvQixPQUFPO0FBRTNCLGVBQWUsT0FBTztBQUV0QixJQUFJLFFBQVEsS0FBSyxXQUFXLEdBQUc7QUFDN0IsYUFBVyxTQUFTLFFBQVEsSUFBSTtBQUNsQyxPQUFPO0FBQ0wsVUFBUSxNQUFNO0FBQ2hCOyIsCiAgIm5hbWVzIjogWyJwcm9ncmFtIiwgInBhdGgiLCAiZnMiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgInJlc29sdmUiLCAicGF0aCIsICJmcyIsICJmcyIsICJwYXRoIiwgImZzIiwgInRzIiwgInBhdGgiLCAiZnMiLCAicHJvZ3JhbSIsICJwb3J0IiwgInJlc29sdmUiLCAic2VydmVyIiwgImt5IiwgInByb2dyYW0iLCAia3kiLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJmcyIsICJwYXRoIiwgInByb2dyYW0iLCAia3kiLCAic2VtdmVyIiwgInBhdGgiLCAiZnMiLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAiZnMiLCAicGF0aCIsICJwcm9ncmFtIiwgImt5IiwgInNlbXZlciJdCn0K
|
|
1117
|
+
export {
|
|
1118
|
+
program
|
|
1119
|
+
};
|
|
1120
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL21haW4udHMiLCAiLi4vY2xpL2luaXQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Rldi9yZWdpc3Rlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9pbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldC50cyIsICIuLi9jbGkvZGV2L0RldlNlcnZlci50cyIsICIuLi9saWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXIudHMiLCAiLi4vcGFja2FnZS5qc29uIiwgIi4uL2xpYi9zaXRlL2dldEluZGV4LnRzIiwgIi4uL2xpYi9zZXJ2ZXIvRXZlbnRzV2F0Y2hlci50cyIsICIuLi9saWIvZGVwZW5kZW5jeS1hbmFseXNpcy9GaWxlc3lzdGVtVHlwZXNIYW5kbGVyLnRzIiwgIi4uL2xpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2ZpbmRJbXBvcnRzSW5TbmlwcGV0LnRzIiwgIi4uL2xpYi9jbGktY29uZmlnL2luZGV4LnRzIiwgIi4uL2xpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5LnRzIiwgIi4uL2xpYi9zaGFyZWQvcHVzaC1zbmlwcGV0LnRzIiwgIi4uL2NsaS9hdXRoL2xvZ2luL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9hdXRoL2xvZ291dC9yZWdpc3Rlci50cyIsICIuLi9jbGkvYXV0aC9yZWdpc3Rlci50cyIsICIuLi9jbGkvY29uZmlnL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9jb25maWcvcHJpbnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2Nsb25lL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9leHBvcnQvcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvcHJpbnQtdG9rZW4vcmVnaXN0ZXIudHMiLCAiLi4vY2xpL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyLnRzIiwgIi4uL2NsaS9wdXNoL3JlZ2lzdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyByZWdpc3RlckluaXQgfSBmcm9tIFwiLi9pbml0L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyRGV2IH0gZnJvbSBcIi4vZGV2L3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aExvZ2luIH0gZnJvbSBcIi4vYXV0aC9sb2dpbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhMb2dvdXQgfSBmcm9tIFwiLi9hdXRoL2xvZ291dC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGggfSBmcm9tIFwiLi9hdXRoL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyQ29uZmlnUHJpbnQgfSBmcm9tIFwiLi9jb25maWcvcHJpbnQvcmVnaXN0ZXJcIlxuaW1wb3J0IHsgcmVnaXN0ZXJDbG9uZSB9IGZyb20gXCIuL2Nsb25lL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHBlcmZlY3RDbGkgfSBmcm9tIFwicGVyZmVjdC1jbGlcIlxuaW1wb3J0IHBrZyBmcm9tIFwiLi4vcGFja2FnZS5qc29uXCJcbmltcG9ydCBzZW12ZXIgZnJvbSBcInNlbXZlclwiXG5pbXBvcnQgeyByZWdpc3RlckV4cG9ydCB9IGZyb20gXCIuL2V4cG9ydC9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhQcmludFRva2VuIH0gZnJvbSBcIi4vYXV0aC9wcmludC10b2tlbi9yZWdpc3RlclwiXG5pbXBvcnQgeyByZWdpc3RlckF1dGhTZXRUb2tlbiB9IGZyb20gXCIuL2F1dGgvc2V0LXRva2VuL3JlZ2lzdGVyXCJcbmltcG9ydCB7IHJlZ2lzdGVyUHVzaCB9IGZyb20gXCIuL3B1c2gvcmVnaXN0ZXJcIlxuXG5leHBvcnQgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcblxucHJvZ3JhbVxuICAubmFtZShcInRzY2lcIilcbiAgLmRlc2NyaXB0aW9uKFwiQ0xJIGZvciBkZXZlbG9waW5nIHRzY2lyY3VpdCBzbmlwcGV0c1wiKVxuICAvLyBIQUNLOiBhdCBidWlsZCB0aW1lIHRoZSB2ZXJzaW9uIGlzIG9sZCwgd2UgbmVlZCB0b1xuICAvLyBmaXggdGhpcyBhdCBzb21lIHBvaW50Li4uXG4gIC52ZXJzaW9uKHNlbXZlci5pbmMocGtnLnZlcnNpb24sIFwicGF0Y2hcIikgPz8gcGtnLnZlcnNpb24pXG5cbnJlZ2lzdGVySW5pdChwcm9ncmFtKVxuXG5yZWdpc3RlckRldihwcm9ncmFtKVxucmVnaXN0ZXJDbG9uZShwcm9ncmFtKVxucmVnaXN0ZXJQdXNoKHByb2dyYW0pXG5cbnJlZ2lzdGVyQXV0aChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoTG9naW4ocHJvZ3JhbSlcbnJlZ2lzdGVyQXV0aExvZ291dChwcm9ncmFtKVxucmVnaXN0ZXJBdXRoUHJpbnRUb2tlbihwcm9ncmFtKVxucmVnaXN0ZXJBdXRoU2V0VG9rZW4ocHJvZ3JhbSlcblxucmVnaXN0ZXJDb25maWcocHJvZ3JhbSlcbnJlZ2lzdGVyQ29uZmlnUHJpbnQocHJvZ3JhbSlcblxucmVnaXN0ZXJFeHBvcnQocHJvZ3JhbSlcblxuaWYgKHByb2Nlc3MuYXJndi5sZW5ndGggPT09IDIpIHtcbiAgcGVyZmVjdENsaShwcm9ncmFtLCBwcm9jZXNzLmFyZ3YpXG59IGVsc2Uge1xuICBwcm9ncmFtLnBhcnNlKClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIlxuXG4vLyBEZXRlY3QgdGhlIHBhY2thZ2UgbWFuYWdlciBiZWluZyB1c2VkIGluIHRoZSBwcm9qZWN0XG5jb25zdCBkZXRlY3RQYWNrYWdlTWFuYWdlciA9ICgpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB1c2VyQWdlbnQgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX3VzZXJfYWdlbnQgfHwgXCJcIlxuICBpZiAodXNlckFnZW50LnN0YXJ0c1dpdGgoXCJ5YXJuXCIpKSByZXR1cm4gXCJ5YXJuXCJcbiAgaWYgKHVzZXJBZ2VudC5zdGFydHNXaXRoKFwicG5wbVwiKSkgcmV0dXJuIFwicG5wbVwiXG4gIGlmICh1c2VyQWdlbnQuc3RhcnRzV2l0aChcImJ1blwiKSkgcmV0dXJuIFwiYnVuXCJcblxuICBpZiAoZnMuZXhpc3RzU3luYyhcInlhcm4ubG9ja1wiKSkgcmV0dXJuIFwieWFyblwiXG4gIGlmIChmcy5leGlzdHNTeW5jKFwicG5wbS1sb2NrLnlhbWxcIikpIHJldHVybiBcInBucG1cIlxuICBpZiAoZnMuZXhpc3RzU3luYyhcImJ1bi5sb2NrYlwiKSkgcmV0dXJuIFwiYnVuXCJcblxuICByZXR1cm4gXCJucG1cIiAvLyBEZWZhdWx0IHRvIG5wbVxufVxuXG4vLyBHZW5lcmF0ZSBhIFJlYWN0LWNvbXBhdGlibGUgdHNjb25maWcuanNvblxuY29uc3QgZ2VuZXJhdGVUc0NvbmZpZyA9IChkaXI6IHN0cmluZykgPT4ge1xuICBjb25zdCB0c2NvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZGlyLCBcInRzY29uZmlnLmpzb25cIilcbiAgY29uc3QgdHNjb25maWdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoXG4gICAge1xuICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgIHRhcmdldDogXCJFUzZcIixcbiAgICAgICAgbW9kdWxlOiBcIkVTTmV4dFwiLFxuICAgICAgICBqc3g6IFwicmVhY3QtanN4XCIsXG4gICAgICAgIG91dERpcjogXCJkaXN0XCIsXG4gICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiBcIm5vZGVcIixcbiAgICAgICAgc2tpcExpYkNoZWNrOiB0cnVlLFxuICAgICAgICBmb3JjZUNvbnNpc3RlbnRDYXNpbmdJbkZpbGVOYW1lczogdHJ1ZSxcbiAgICAgICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsXG4gICAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSxcbiAgICAgICAgZXhwZXJpbWVudGFsRGVjb3JhdG9yczogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBudWxsLFxuICAgIDIsXG4gIClcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHRzY29uZmlnUGF0aCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRzY29uZmlnUGF0aCwgdHNjb25maWdDb250ZW50LnRyaW1TdGFydCgpKVxuICAgIGNvbnNvbGUubG9nKGBDcmVhdGVkOiAke3RzY29uZmlnUGF0aH1gKVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKGBTa2lwcGVkOiAke3RzY29uZmlnUGF0aH0gYWxyZWFkeSBleGlzdHNgKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckluaXQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJpbml0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiSW5pdGlhbGl6ZSBhIG5ldyBUU0NpcmN1aXQgcHJvamVjdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnlcIilcbiAgICAuYWN0aW9uKCgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnREaXIgPSBwcm9jZXNzLmN3ZCgpXG4gICAgICBjb25zdCBpbmRleEZpbGVQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIFwiaW5kZXgudHN4XCIpXG4gICAgICBjb25zdCBucG1yY0ZpbGVQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIFwiLm5wbXJjXCIpXG5cbiAgICAgIC8vIENvbnRlbnQgZm9yIGluZGV4LnRzeFxuICAgICAgY29uc3QgaW5kZXhDb250ZW50ID0gYFxuaW1wb3J0IFwiQHRzY2lyY3VpdC9jb3JlXCJcblxuZXhwb3J0IGRlZmF1bHQgKCkgPT4gKFxuICA8Ym9hcmQgd2lkdGg9XCIxMG1tXCIgaGVpZ2h0PVwiMTBtbVwiPlxuICAgIDxyZXNpc3RvclxuICAgICAgcmVzaXN0YW5jZT1cIjFrXCJcbiAgICAgIGZvb3RwcmludD1cIjA0MDJcIlxuICAgICAgbmFtZT1cIlIxXCJcbiAgICAgIHNjaFg9ezN9XG4gICAgICBwY2JYPXszfVxuICAgIC8+XG4gICAgPGNhcGFjaXRvclxuICAgICAgY2FwYWNpdGFuY2U9XCIxMDAwcEZcIlxuICAgICAgZm9vdHByaW50PVwiMDQwMlwiXG4gICAgICBuYW1lPVwiQzFcIlxuICAgICAgc2NoWD17LTN9XG4gICAgICBwY2JYPXstM31cbiAgICAvPlxuICAgIDx0cmFjZSBmcm9tPVwiLlIxID4gLnBpbjFcIiB0bz1cIi5DMSA+IC5waW4xXCIgLz5cbiAgPC9ib2FyZD5cbik7XG5gLnRyaW0oKVxuXG4gICAgICAvLyBDb250ZW50IGZvciAubnBtcmNcbiAgICAgIGNvbnN0IG5wbXJjQ29udGVudCA9IGBcbkB0c2NpOnJlZ2lzdHJ5PWh0dHBzOi8vbnBtLnRzY2lyY3VpdC5jb21cbmAudHJpbSgpXG5cbiAgICAgIC8vIENyZWF0ZSBpbmRleC50c3ggaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGluZGV4RmlsZVBhdGgpKSB7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoaW5kZXhGaWxlUGF0aCwgaW5kZXhDb250ZW50LnRyaW1TdGFydCgpKVxuICAgICAgICBjb25zb2xlLmxvZyhgQ3JlYXRlZDogJHtpbmRleEZpbGVQYXRofWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgU2tpcHBlZDogJHtpbmRleEZpbGVQYXRofSBhbHJlYWR5IGV4aXN0c2ApXG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSAubnBtcmMgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG5wbXJjRmlsZVBhdGgpKSB7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMobnBtcmNGaWxlUGF0aCwgbnBtcmNDb250ZW50LnRyaW1TdGFydCgpKVxuICAgICAgICBjb25zb2xlLmxvZyhgQ3JlYXRlZDogJHtucG1yY0ZpbGVQYXRofWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgU2tpcHBlZDogJHtucG1yY0ZpbGVQYXRofSBhbHJlYWR5IGV4aXN0c2ApXG4gICAgICB9XG5cbiAgICAgIC8vIERldGVjdCB0aGUgcGFja2FnZSBtYW5hZ2VyXG4gICAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGRldGVjdFBhY2thZ2VNYW5hZ2VyKClcbiAgICAgIGNvbnNvbGUubG9nKGBEZXRlY3RlZCBwYWNrYWdlIG1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9YClcblxuICAgICAgLy8gSW5zdGFsbCBkZXBzIHVzaW5nIHRoZSBkZXRlY3RlZCBwYWNrYWdlIG1hbmFnZXJcbiAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IFwiQHR5cGVzL3JlYWN0IEB0c2NpcmN1aXQvY29yZVwiXG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLi4uXCIpXG4gICAgICAgIGNvbnN0IGluc3RhbGxDb21tYW5kID1cbiAgICAgICAgICBwYWNrYWdlTWFuYWdlciA9PT0gXCJ5YXJuXCJcbiAgICAgICAgICAgID8gYHlhcm4gYWRkIC1EICR7ZGVwZW5kZW5jaWVzfWBcbiAgICAgICAgICAgIDogcGFja2FnZU1hbmFnZXIgPT09IFwicG5wbVwiXG4gICAgICAgICAgICAgID8gYHBucG0gYWRkIC1EICR7ZGVwZW5kZW5jaWVzfWBcbiAgICAgICAgICAgICAgOiBwYWNrYWdlTWFuYWdlciA9PT0gXCJidW5cIlxuICAgICAgICAgICAgICAgID8gYGJ1biBhZGQgLUQgJHtkZXBlbmRlbmNpZXN9YFxuICAgICAgICAgICAgICAgIDogYG5wbSBpbnN0YWxsIC1EICR7ZGVwZW5kZW5jaWVzfWBcbiAgICAgICAgZXhlY1N5bmMoaW5zdGFsbENvbW1hbmQsIHsgc3RkaW86IFwiaW5oZXJpdFwiIH0pXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRGVwZW5kZW5jaWVzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHkuXCIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzOlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgdHNjb25maWcuanNvblxuICAgICAgZ2VuZXJhdGVUc0NvbmZpZyhjdXJyZW50RGlyKVxuXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYEluaXRpYWxpemF0aW9uIGNvbXBsZXRlLiBSdW4gXCJ0c2NpIGRldlwiIHRvIHN0YXJ0IGRldmVsb3BpbmcuYCxcbiAgICAgIClcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIGNob2tpZGFyIGZyb20gXCJjaG9raWRhclwiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBjcmVhdGVIdHRwU2VydmVyIH0gZnJvbSBcImxpYi9zZXJ2ZXIvY3JlYXRlSHR0cFNlcnZlclwiXG5pbXBvcnQgeyBnZXRMb2NhbEZpbGVEZXBlbmRlbmNpZXMgfSBmcm9tIFwibGliL2RlcGVuZGVuY3ktYW5hbHlzaXMvZ2V0TG9jYWxGaWxlRGVwZW5kZW5jaWVzXCJcbmltcG9ydCB7IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0IH0gZnJvbSBcIi4uLy4uL2xpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL2luc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0XCJcbmltcG9ydCB7IEV2ZW50c1dhdGNoZXIgfSBmcm9tIFwiLi4vLi4vbGliL3NlcnZlci9FdmVudHNXYXRjaGVyXCJcbmltcG9ydCB7IERldlNlcnZlciB9IGZyb20gXCIuL0RldlNlcnZlclwiXG5pbXBvcnQgKiBhcyBuZXQgZnJvbSBcIm5vZGU6bmV0XCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyRGV2ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiZGV2XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiU3RhcnQgZGV2ZWxvcG1lbnQgc2VydmVyIGZvciBhIHNuaXBwZXRcIilcbiAgICAuYXJndW1lbnQoXCJbZmlsZV1cIiwgXCJQYXRoIHRvIHRoZSBzbmlwcGV0IGZpbGVcIilcbiAgICAub3B0aW9uKFwiLXAsIC0tcG9ydCA8bnVtYmVyPlwiLCBcIlBvcnQgdG8gcnVuIHNlcnZlciBvblwiLCBcIjMwMjBcIilcbiAgICAuYWN0aW9uKGFzeW5jIChmaWxlOiBzdHJpbmcsIG9wdGlvbnM6IHsgcG9ydDogc3RyaW5nIH0pID0+IHtcbiAgICAgIGxldCBwb3J0ID0gcGFyc2VJbnQob3B0aW9ucy5wb3J0KVxuXG4gICAgICBjb25zdCBpc1BvcnRBdmFpbGFibGUgPSAocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlcnZlciA9IG5ldC5jcmVhdGVTZXJ2ZXIoKVxuICAgICAgICAgIHNlcnZlci5vbmNlKFwiZXJyb3JcIiwgKCkgPT4gcmVzb2x2ZShmYWxzZSkpXG4gICAgICAgICAgc2VydmVyLm9uY2UoXCJsaXN0ZW5pbmdcIiwgKCkgPT4ge1xuICAgICAgICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHJlc29sdmUodHJ1ZSkpXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzZXJ2ZXIubGlzdGVuKHBvcnQpXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHdoaWxlICghKGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KSkpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFBvcnQgJHtwb3J0fSBpcyBpbiB1c2UsIHRyeWluZyBwb3J0ICR7cG9ydCArIDF9Li4uYClcbiAgICAgICAgcG9ydCArPSAxXG4gICAgICB9XG5cbiAgICAgIGxldCBhYnNvbHV0ZVBhdGg6IHN0cmluZ1xuXG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSlcbiAgICAgICAgaWYgKCFhYnNvbHV0ZVBhdGguZW5kc1dpdGgoXCIudHN4XCIpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOiBPbmx5IC50c3ggZmlsZXMgYXJlIHN1cHBvcnRlZFwiKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbnRyeXBvaW50UGF0aCA9IHBhdGgucmVzb2x2ZShcImluZGV4LnRzeFwiKVxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhlbnRyeXBvaW50UGF0aCkpIHtcbiAgICAgICAgICBhYnNvbHV0ZVBhdGggPSBlbnRyeXBvaW50UGF0aFxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiTm8gZmlsZSBwcm92aWRlZC4gVXNpbmcgJ2luZGV4LnRzeCcgYXMgdGhlIGVudHJ5cG9pbnQuXCIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBcIk5vIGVudHJ5cG9pbnQgZm91bmQuIFJ1biAndHNjaSBpbml0JyB0byBib290c3RyYXAgYSBiYXNpYyBwcm9qZWN0LlwiLFxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWxlRGlyID0gcGF0aC5kaXJuYW1lKGFic29sdXRlUGF0aClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIHR5cGVzIGZvciBpbXBvcnRlZCBzbmlwcGV0cy4uLlwiKVxuICAgICAgICBhd2FpdCBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChhYnNvbHV0ZVBhdGgpXG4gICAgICAgIGNvbnNvbGUubG9nKFwiVHlwZXMgaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseVwiKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIGluc3RhbGwgdHlwZXM6XCIsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXJ2ZXIgPSBuZXcgRGV2U2VydmVyKHtcbiAgICAgICAgcG9ydCxcbiAgICAgICAgY29tcG9uZW50RmlsZVBhdGg6IGFic29sdXRlUGF0aCxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHNlcnZlci5zdGFydCgpXG4gICAgICBhd2FpdCBzZXJ2ZXIuYWRkRW50cnlwb2ludCgpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIlxuXG5pbnRlcmZhY2UgU25pcHBldEFwaVJlc3BvbnNlIHtcbiAgc25pcHBldDoge1xuICAgIGR0czogc3RyaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KHNuaXBwZXRQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzbmlwcGV0UGF0aCwgXCJ1dGYtOFwiKVxuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBzbmlwcGV0UGF0aCxcbiAgICBjb250ZW50LFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgKVxuXG4gIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW11cblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiB0cy5Ob2RlKSB7XG4gICAgaWYgKHRzLmlzSW1wb3J0RGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVNwZWNpZmllciA9IG5vZGUubW9kdWxlU3BlY2lmaWVyXG4gICAgICBpZiAobW9kdWxlU3BlY2lmaWVyICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydFBhdGggPSBtb2R1bGVTcGVjaWZpZXIudGV4dFxuICAgICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgICAgICAgaW1wb3J0cy5wdXNoKGltcG9ydFBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KVxuICB9XG5cbiAgdmlzaXQoc291cmNlRmlsZSlcblxuICBsZXQgcHJvamVjdFJvb3QgPSBwYXRoLmRpcm5hbWUoc25pcHBldFBhdGgpXG4gIHdoaWxlIChwcm9qZWN0Um9vdCAhPT0gcGF0aC5wYXJzZShwcm9qZWN0Um9vdCkucm9vdCkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0Um9vdCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgICBwcm9qZWN0Um9vdCA9IHBhdGguZGlybmFtZShwcm9qZWN0Um9vdClcbiAgfVxuXG4gIGZvciAoY29uc3QgaW1wb3J0UGF0aCBvZiBpbXBvcnRzKSB7XG4gICAgY29uc3QgW293bmVyLCBuYW1lXSA9IGltcG9ydFBhdGgucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKS5zcGxpdChcIi5cIilcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYGh0dHBzOi8vcmVnaXN0cnktYXBpLnRzY2lyY3VpdC5jb20vc25pcHBldHMvZ2V0P293bmVyX25hbWU9JHtvd25lcn0mdW5zY29wZWRfbmFtZT0ke25hbWV9YCxcbiAgICAgIClcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBmZXRjaCB0eXBlcyBmb3IgJHtpbXBvcnRQYXRofWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGE6IFNuaXBwZXRBcGlSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICBpZiAoZGF0YS5zbmlwcGV0LmR0cykge1xuICAgICAgICBjb25zdCBwYWNrYWdlRGlyID0gcGF0aC5qb2luKFxuICAgICAgICAgIHByb2plY3RSb290LFxuICAgICAgICAgIFwibm9kZV9tb2R1bGVzXCIsXG4gICAgICAgICAgXCJAdHNjaVwiLFxuICAgICAgICAgIGAke293bmVyfS4ke25hbWV9YCxcbiAgICAgICAgKVxuICAgICAgICBmcy5ta2RpclN5bmMocGFja2FnZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlRGlyLCBcImluZGV4LmQudHNcIiksIGRhdGEuc25pcHBldC5kdHMpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRXJyb3IgZmV0Y2hpbmcgdHlwZXMgZm9yICR7aW1wb3J0UGF0aH06YCwgZXJyb3IpXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IGt5IGZyb20gXCJreVwiXG5pbXBvcnQgdHlwZSB7IEZpbGVTZXJ2ZXJSb3V0ZXMgfSBmcm9tIFwibGliL2ZpbGUtc2VydmVyL0ZpbGVTZXJ2ZXJSb3V0ZXNcIlxuaW1wb3J0IHsgY3JlYXRlSHR0cFNlcnZlciB9IGZyb20gXCJsaWIvc2VydmVyL2NyZWF0ZUh0dHBTZXJ2ZXJcIlxuaW1wb3J0IHsgRXZlbnRzV2F0Y2hlciB9IGZyb20gXCJsaWIvc2VydmVyL0V2ZW50c1dhdGNoZXJcIlxuaW1wb3J0IHR5cGUgaHR0cCBmcm9tIFwibm9kZTpodHRwXCJcbmltcG9ydCB0eXBlIHsgVHlwZWRLeUluc3RhbmNlIH0gZnJvbSBcInR5cGVkLWt5XCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCB0eXBlIHsgRmlsZVVwZGF0ZWRFdmVudCB9IGZyb20gXCJsaWIvZmlsZS1zZXJ2ZXIvRmlsZVNlcnZlckV2ZW50XCJcbmltcG9ydCAqIGFzIGNob2tpZGFyIGZyb20gXCJjaG9raWRhclwiXG5pbXBvcnQgeyBGaWxlc3lzdGVtVHlwZXNIYW5kbGVyIH0gZnJvbSBcImxpYi9kZXBlbmRlbmN5LWFuYWx5c2lzL0ZpbGVzeXN0ZW1UeXBlc0hhbmRsZXJcIlxuaW1wb3J0IHsgcHVzaFNuaXBwZXQgfSBmcm9tIFwibGliL3NoYXJlZC9wdXNoLXNuaXBwZXRcIlxuXG5leHBvcnQgY2xhc3MgRGV2U2VydmVyIHtcbiAgcG9ydDogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byBhIGNvbXBvbmVudCB0aGF0IGV4cG9ydHMgYSA8Ym9hcmQgLz4gb3IgPGdyb3VwIC8+IGNvbXBvbmVudFxuICAgKi9cbiAgY29tcG9uZW50RmlsZVBhdGg6IHN0cmluZ1xuXG4gIHByb2plY3REaXI6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBUaGUgSFRUUCBzZXJ2ZXIgdGhhdCBob3N0cyB0aGUgZmlsZSBzZXJ2ZXIgYW5kIGV2ZW50IGJ1cy4gWW91IGNhbiB1c2VcbiAgICogZnNLeSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBmaWxlIHNlcnZlci9ldmVudCBidXNcbiAgICovXG4gIGh0dHBTZXJ2ZXI/OiBodHRwLlNlcnZlclxuICAvKipcbiAgICogV2F0Y2hlcyBmb3IgZXZlbnRzIG9uIHRoZSBldmVudCBidXMgYnkgcG9sbGluZyBgYXBpL2V2ZW50cy9saXN0YFxuICAgKi9cbiAgZXZlbnRzV2F0Y2hlcj86IEV2ZW50c1dhdGNoZXJcbiAgLyoqXG4gICAqIEEga3kgaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBmaWxlIHNlcnZlciBhbmRcbiAgICogZXZlbnQgYnVzXG4gICAqL1xuICBmc0t5OiBUeXBlZEt5SW5zdGFuY2U8a2V5b2YgRmlsZVNlcnZlclJvdXRlcywgRmlsZVNlcnZlclJvdXRlcz5cbiAgLyoqXG4gICAqIEEgY2hva2lkYXIgaW5zdGFuY2UgdGhhdCB3YXRjaGVzIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBmb3IgZmlsZSBjaGFuZ2VzXG4gICAqL1xuICBmaWxlc3lzdGVtV2F0Y2hlcj86IGNob2tpZGFyLkZTV2F0Y2hlclxuXG4gIHByaXZhdGUgdHlwZXNIYW5kbGVyPzogRmlsZXN5c3RlbVR5cGVzSGFuZGxlclxuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBwb3J0LFxuICAgIGNvbXBvbmVudEZpbGVQYXRoLFxuICB9OiB7XG4gICAgcG9ydDogbnVtYmVyXG4gICAgY29tcG9uZW50RmlsZVBhdGg6IHN0cmluZ1xuICB9KSB7XG4gICAgdGhpcy5wb3J0ID0gcG9ydFxuICAgIHRoaXMuY29tcG9uZW50RmlsZVBhdGggPSBjb21wb25lbnRGaWxlUGF0aFxuICAgIHRoaXMucHJvamVjdERpciA9IHBhdGguZGlybmFtZShjb21wb25lbnRGaWxlUGF0aClcbiAgICB0aGlzLmZzS3kgPSBreS5jcmVhdGUoe1xuICAgICAgcHJlZml4VXJsOiBgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YCxcbiAgICB9KSBhcyBhbnlcbiAgICB0aGlzLnR5cGVzSGFuZGxlciA9IG5ldyBGaWxlc3lzdGVtVHlwZXNIYW5kbGVyKHRoaXMucHJvamVjdERpcilcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGNvbnN0IHsgc2VydmVyIH0gPSBhd2FpdCBjcmVhdGVIdHRwU2VydmVyKHRoaXMucG9ydClcbiAgICB0aGlzLmh0dHBTZXJ2ZXIgPSBzZXJ2ZXJcblxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlciA9IG5ldyBFdmVudHNXYXRjaGVyKGBodHRwOi8vbG9jYWxob3N0OiR7dGhpcy5wb3J0fWApXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyLnN0YXJ0KClcblxuICAgIHRoaXMuZXZlbnRzV2F0Y2hlci5vbihcbiAgICAgIFwiRklMRV9VUERBVEVEXCIsXG4gICAgICB0aGlzLmhhbmRsZUZpbGVVcGRhdGVkRXZlbnRGcm9tU2VydmVyLmJpbmQodGhpcyksXG4gICAgKVxuXG4gICAgdGhpcy5ldmVudHNXYXRjaGVyLm9uKFxuICAgICAgXCJSRVFVRVNUX1RPX1NBVkVfU05JUFBFVFwiLFxuICAgICAgdGhpcy5zYXZlU25pcHBldC5iaW5kKHRoaXMpLFxuICAgIClcblxuICAgIHRoaXMuZmlsZXN5c3RlbVdhdGNoZXIgPSBjaG9raWRhci53YXRjaCh0aGlzLnByb2plY3REaXIsIHtcbiAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIH0pXG5cbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiY2hhbmdlXCIsIChmaWxlUGF0aCkgPT5cbiAgICAgIHRoaXMuaGFuZGxlRmlsZUNoYW5nZWRPbkZpbGVzeXN0ZW0oZmlsZVBhdGgpLFxuICAgIClcbiAgICB0aGlzLmZpbGVzeXN0ZW1XYXRjaGVyLm9uKFwiYWRkXCIsIChmaWxlUGF0aCkgPT5cbiAgICAgIHRoaXMuaGFuZGxlRmlsZUNoYW5nZWRPbkZpbGVzeXN0ZW0oZmlsZVBhdGgpLFxuICAgIClcblxuICAgIHRoaXMudXBzZXJ0SW5pdGlhbEZpbGVzKClcblxuICAgIHRoaXMudHlwZXNIYW5kbGVyPy5oYW5kbGVJbml0aWFsVHlwZURlcGVuZGVuY2llcyh0aGlzLmNvbXBvbmVudEZpbGVQYXRoKVxuICB9XG5cbiAgYXN5bmMgYWRkRW50cnlwb2ludCgpIHtcbiAgICBjb25zdCByZWxhdGl2ZUNvbXBvbmVudEZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZShcbiAgICAgIHRoaXMucHJvamVjdERpcixcbiAgICAgIHRoaXMuY29tcG9uZW50RmlsZVBhdGgsXG4gICAgKVxuICAgIGF3YWl0IHRoaXMuZnNLeS5wb3N0KFwiYXBpL2ZpbGVzL3Vwc2VydFwiLCB7XG4gICAgICBqc29uOiB7XG4gICAgICAgIGZpbGVfcGF0aDogXCJlbnRyeXBvaW50LnRzeFwiLFxuICAgICAgICB0ZXh0X2NvbnRlbnQ6IGBcbmltcG9ydCBNeUNpcmN1aXQgZnJvbSBcIi4vJHtyZWxhdGl2ZUNvbXBvbmVudEZpbGVQYXRofVwiXG5cbmNpcmN1aXQuYWRkKDxNeUNpcmN1aXQgLz4pXG5gLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlRmlsZVVwZGF0ZWRFdmVudEZyb21TZXJ2ZXIoZXY6IEZpbGVVcGRhdGVkRXZlbnQpIHtcbiAgICBpZiAoZXYuaW5pdGlhdG9yID09PSBcImZpbGVzeXN0ZW1fY2hhbmdlXCIpIHJldHVyblxuXG4gICAgaWYgKGV2LmZpbGVfcGF0aCA9PT0gXCJtYW51YWwtZWRpdHMuanNvblwiKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIk1hbnVhbCBlZGl0cyB1cGRhdGVkLCB1cGRhdGluZyBvbiBmaWxlc3lzdGVtLi4uXCIpXG4gICAgICBjb25zdCB7IGZpbGUgfSA9IGF3YWl0IHRoaXMuZnNLeVxuICAgICAgICAuZ2V0KFwiYXBpL2ZpbGVzL2dldFwiLCB7XG4gICAgICAgICAgc2VhcmNoUGFyYW1zOiB7IGZpbGVfcGF0aDogZXYuZmlsZV9wYXRoIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5qc29uKClcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgIHBhdGguam9pbih0aGlzLnByb2plY3REaXIsIFwibWFudWFsLWVkaXRzLmpzb25cIiksXG4gICAgICAgIGZpbGUudGV4dF9jb250ZW50LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVDaGFuZ2VkT25GaWxlc3lzdGVtKGFic29sdXRlRmlsZVBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMucHJvamVjdERpciwgYWJzb2x1dGVGaWxlUGF0aClcbiAgICAvLyBXZSd2ZSB0ZW1wb3JhcmlseSBkaXNhYmxlZCB1cHNlcnRpbmcgbWFudWFsIGVkaXRzIGZyb20gZmlsZXN5c3RlbSBjaGFuZ2VzXG4gICAgLy8gYmVjYXVzZSBpdCBjYW4gYmUgZWRpdGVkIGJ5IHRoZSBicm93c2VyXG4gICAgaWYgKHJlbGF0aXZlRmlsZVBhdGguaW5jbHVkZXMoXCJtYW51YWwtZWRpdHMuanNvblwiKSkgcmV0dXJuXG5cbiAgICBhd2FpdCB0aGlzLnR5cGVzSGFuZGxlcj8uaGFuZGxlRmlsZVR5cGVEZXBlbmRlbmNpZXMoYWJzb2x1dGVGaWxlUGF0aClcblxuICAgIGNvbnNvbGUubG9nKGAke3JlbGF0aXZlRmlsZVBhdGh9IHNhdmVkLiBBcHBseWluZyBjaGFuZ2VzLi4uYClcbiAgICBhd2FpdCB0aGlzLmZzS3lcbiAgICAgIC5wb3N0KFwiYXBpL2ZpbGVzL3Vwc2VydFwiLCB7XG4gICAgICAgIGpzb246IHtcbiAgICAgICAgICBmaWxlX3BhdGg6IHJlbGF0aXZlRmlsZVBhdGgsXG4gICAgICAgICAgdGV4dF9jb250ZW50OiBmcy5yZWFkRmlsZVN5bmMoYWJzb2x1dGVGaWxlUGF0aCwgXCJ1dGYtOFwiKSxcbiAgICAgICAgICBpbml0aWF0b3I6IFwiZmlsZXN5c3RlbV9jaGFuZ2VcIixcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuanNvbigpXG4gIH1cblxuICBhc3luYyB1cHNlcnRJbml0aWFsRmlsZXMoKSB7XG4gICAgLy8gU2NhbiBwcm9qZWN0IGRpcmVjdG9yeSBmb3IgYWxsIGZpbGVzIGFuZCB1cHNlcnQgdGhlbVxuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMucHJvamVjdERpcilcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKGZzLnN0YXRTeW5jKHBhdGguam9pbih0aGlzLnByb2plY3REaXIsIGZpbGVOYW1lKSkuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0RGlyLCBmaWxlTmFtZSksXG4gICAgICAgIFwidXRmLThcIixcbiAgICAgIClcbiAgICAgIGF3YWl0IHRoaXMuZnNLeS5wb3N0KFwiYXBpL2ZpbGVzL3Vwc2VydFwiLCB7XG4gICAgICAgIGpzb246IHtcbiAgICAgICAgICBmaWxlX3BhdGg6IGZpbGVOYW1lLFxuICAgICAgICAgIHRleHRfY29udGVudDogZmlsZUNvbnRlbnQsXG4gICAgICAgICAgaW5pdGlhdG9yOiBcImZpbGVzeXN0ZW1fY2hhbmdlXCIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVNuaXBwZXQoKSB7XG4gICAgY29uc3QgcG9zdEV2ZW50ID0gYXN5bmMgKFxuICAgICAgZXZlbnQ6IFwiRkFJTEVEX1RPX1NBVkVfU05JUFBFVFwiIHwgXCJTTklQUEVUX1NBVkVEXCIsXG4gICAgKSA9PlxuICAgICAgdGhpcy5mc0t5LnBvc3QoXCJhcGkvZXZlbnRzL2NyZWF0ZVwiLCB7XG4gICAgICAgIGpzb246IHsgZXZlbnRfdHlwZTogZXZlbnQgfSxcbiAgICAgICAgdGhyb3dIdHRwRXJyb3JzOiBmYWxzZSxcbiAgICAgIH0pXG5cbiAgICBhd2FpdCBwdXNoU25pcHBldCh7XG4gICAgICBmaWxlUGF0aDogdGhpcy5jb21wb25lbnRGaWxlUGF0aCxcbiAgICAgIG9uRXhpdDogKGUpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBzYXZlIHNuaXBwZXRcIiwgZSlcbiAgICAgICAgcG9zdEV2ZW50KFwiRkFJTEVEX1RPX1NBVkVfU05JUFBFVFwiKVxuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gc2F2ZSBzbmlwcGV0XCIsIGUpXG4gICAgICAgIHBvc3RFdmVudChcIkZBSUxFRF9UT19TQVZFX1NOSVBQRVRcIilcbiAgICAgIH0sXG4gICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgcG9zdEV2ZW50KFwiU05JUFBFVF9TQVZFRFwiKVxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICB0aGlzLmh0dHBTZXJ2ZXI/LmNsb3NlKClcbiAgICB0aGlzLmV2ZW50c1dhdGNoZXI/LnN0b3AoKVxuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgaHR0cCBmcm9tIFwibm9kZTpodHRwXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBnZXROb2RlSGFuZGxlciB9IGZyb20gXCJ3aW50ZXJzcGVjL2FkYXB0ZXJzL25vZGVcIlxuaW1wb3J0IHBrZyBmcm9tIFwiLi4vLi4vcGFja2FnZS5qc29uXCJcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHdpbnRlcnNwZWNCdW5kbGUgZnJvbSBcIkB0c2NpcmN1aXQvZmlsZS1zZXJ2ZXIvZGlzdC9idW5kbGUuanNcIlxuaW1wb3J0IHsgZ2V0SW5kZXggfSBmcm9tIFwiLi4vc2l0ZS9nZXRJbmRleFwiXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVIdHRwU2VydmVyID0gYXN5bmMgKHBvcnQgPSAzMDIwKSA9PiB7XG4gIGNvbnN0IGZpbGVTZXJ2ZXJIYW5kbGVyID0gZ2V0Tm9kZUhhbmRsZXIod2ludGVyc3BlY0J1bmRsZSBhcyBhbnksIHt9KVxuXG4gIGNvbnN0IHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLnVybCEsIGBodHRwOi8vJHtyZXEuaGVhZGVycy5ob3N0fWApXG5cbiAgICBpZiAodXJsLnBhdGhuYW1lID09PSBcIi9zdGFuZGFsb25lLm1pbi5qc1wiKSB7XG4gICAgICBjb25zdCBzdGFuZGFsb25lRmlsZVBhdGggPVxuICAgICAgICBwcm9jZXNzLmVudi5SVU5GUkFNRV9TVEFOREFMT05FX0ZJTEVfUEFUSCB8fFxuICAgICAgICBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICBcIm5vZGVfbW9kdWxlc1wiLFxuICAgICAgICAgIFwiQHRzY2lyY3VpdC9ydW5mcmFtZS9kaXN0L3N0YW5kYWxvbmUubWluLmpzXCIsXG4gICAgICAgIClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzdGFuZGFsb25lRmlsZVBhdGgsIFwidXRmOFwiKVxuICAgICAgICByZXMud3JpdGVIZWFkKDIwMCwge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdDsgY2hhcnNldD11dGYtOFwiLFxuICAgICAgICB9KVxuICAgICAgICByZXMuZW5kKGNvbnRlbnQpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHNlcnZpbmcgc3RhbmRhbG9uZS5taW4uanM6XCIsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICByZXMud3JpdGVIZWFkKDMwMiwge1xuICAgICAgICBMb2NhdGlvbjogYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ydW5mcmFtZUAke3BrZy5kZXBlbmRlbmNpZXNbXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCJdLnJlcGxhY2UoL15bXjAtOV0rLywgXCJcIil9L2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNgLFxuICAgICAgfSlcbiAgICAgIHJlcy5lbmQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVybC5wYXRobmFtZSA9PT0gXCIvXCIpIHtcbiAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCBnZXRJbmRleCgpXG4gICAgICByZXMud3JpdGVIZWFkKDIwMCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvaHRtbFwiIH0pXG4gICAgICByZXMuZW5kKGh0bWwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvYXBpL1wiKSkge1xuICAgICAgcmVxLnVybCA9IHJlcS51cmwhLnJlcGxhY2UoXCIvYXBpL1wiLCBcIi9cIilcbiAgICAgIGZpbGVTZXJ2ZXJIYW5kbGVyKHJlcSwgcmVzKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmVzLndyaXRlSGVhZCg0MDQpXG4gICAgcmVzLmVuZChcIk5vdCBmb3VuZFwiKVxuICB9KVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTx7IHNlcnZlcjogaHR0cC5TZXJ2ZXIgfT4oKHJlc29sdmUpID0+IHtcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGBTZXJ2ZXIgcnVubmluZyBhdCBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKVxuICAgICAgcmVzb2x2ZSh7IHNlcnZlciB9KVxuICAgIH0pXG4gIH0pXG59XG4iLCAie1xuICBcIm5hbWVcIjogXCJAdHNjaXJjdWl0L2NsaVwiLFxuICBcIm1haW5cIjogXCJkaXN0L21haW4uanNcIixcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwidmVyc2lvblwiOiBcIjAuMS4yM1wiLFxuICBcImJpblwiOiB7XG4gICAgXCJ0c2NpXCI6IFwiLi9kaXN0L21haW4uanNcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwic3RhcnRcIjogXCJidW4gcnVuIGRldlwiLFxuICAgIFwiZGV2XCI6IFwiYnVuIC0taG90IC4vY2xpL21haW4udHMgZGV2IC4vZXhhbXBsZS1kaXIvc25pcHBldDEtYmFzaWMudHN4XCIsXG4gICAgXCJidWlsZFwiOiBcInRzdXAtbm9kZSBjbGkvbWFpbi50cyAtLWZvcm1hdCBlc20gLS1zb3VyY2VtYXAgaW5saW5lXCIsXG4gICAgXCJmb3JtYXRcIjogXCJiaW9tZSBmb3JtYXQgLS13cml0ZSAuXCIsXG4gICAgXCJmb3JtYXQ6Y2hlY2tcIjogXCJiaW9tZSBmb3JtYXQgLlwiLFxuICAgIFwiY2xpXCI6IFwiYnVuIC4vY2xpL21haW4udHNcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYmlvbWVqcy9iaW9tZVwiOiBcIl4xLjkuNFwiLFxuICAgIFwiQHRzY2lyY3VpdC9jb3JlXCI6IFwiXjAuMC4yNDlcIixcbiAgICBcIkB0c2NpcmN1aXQvZmFrZS1zbmlwcGV0c1wiOiBcIl4wLjAuNVwiLFxuICAgIFwiQHR5cGVzL2J1blwiOiBcIl4xLjEuMTVcIixcbiAgICBcIkB0eXBlcy9jb25maWdzdG9yZVwiOiBcIl42LjAuMlwiLFxuICAgIFwiQHR5cGVzL3JlYWN0XCI6IFwiXjE5LjAuOFwiLFxuICAgIFwiQHR5cGVzL3NlbXZlclwiOiBcIl43LjUuOFwiLFxuICAgIFwiZ2V0LXBvcnRcIjogXCJeNy4xLjBcIixcbiAgICBcInRlbXB5XCI6IFwiXjMuMS4wXCIsXG4gICAgXCJ0c3VwXCI6IFwiXjguMy41XCIsXG4gICAgXCJ0eXBlZC1reVwiOiBcIl4wLjAuNFwiXG4gIH0sXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuMC4wXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHRzY2lyY3VpdC9maWxlLXNlcnZlclwiOiBcIl4wLjAuMTNcIixcbiAgICBcIkB0c2NpcmN1aXQvcnVuZnJhbWVcIjogXCJeMC4wLjQ3XCIsXG4gICAgXCJjaG9raWRhclwiOiBcIjQuMC4xXCIsXG4gICAgXCJjb21tYW5kZXJcIjogXCJeMTIuMS4wXCIsXG4gICAgXCJjb25maWdzdG9yZVwiOiBcIl43LjAuMFwiLFxuICAgIFwiY29zbWljb25maWdcIjogXCJeOS4wLjBcIixcbiAgICBcImRlbGF5XCI6IFwiXjYuMC4wXCIsXG4gICAgXCJqd3QtZGVjb2RlXCI6IFwiXjQuMC4wXCIsXG4gICAgXCJreVwiOiBcIl4xLjcuNFwiLFxuICAgIFwibWFrZS12ZnNcIjogXCJeMS4wLjE1XCIsXG4gICAgXCJwZXJmZWN0LWNsaVwiOiBcIl4xLjAuMjBcIixcbiAgICBcInJlZGF4aW9zXCI6IFwiXjAuNS4xXCIsXG4gICAgXCJzZW12ZXJcIjogXCJeNy42LjNcIlxuICB9XG59XG4iLCAiaW1wb3J0IHBrZyBmcm9tIFwiLi4vLi4vcGFja2FnZS5qc29uXCJcblxuZXhwb3J0IGNvbnN0IGdldEluZGV4ID0gYXN5bmMgKCkgPT4ge1xuICByZXR1cm4gYDxodG1sPlxuICAgIDxoZWFkPlxuICAgIDwvaGVhZD5cbiAgICA8Ym9keT5cbiAgICAgIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9jZG4udGFpbHdpbmRjc3MuY29tXCI+PC9zY3JpcHQ+XG4gICAgICA8ZGl2IGlkPVwicm9vdFwiPmxvYWRpbmcuLi48L2Rpdj5cbiAgICAgIDxzY3JpcHQ+XG4gICAgICBnbG9iYWxUaGlzLnByb2Nlc3MgPSB7IGVudjogeyBOT0RFX0VOVjogXCJwcm9kdWN0aW9uXCIgfSB9XG4gICAgICA8L3NjcmlwdD5cbiAgICAgIDxzY3JpcHQgc3JjPVwiL3N0YW5kYWxvbmUubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgPC9ib2R5PlxuICA8L2h0bWw+YFxufVxuXG4vLyA8c2NyaXB0IHNyYz1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ydW5mcmFtZUAke3BrZy5kZXBlbmRlbmNpZXNbXCJAdHNjaXJjdWl0L3J1bmZyYW1lXCJdLnJlcGxhY2UoL15bXjAtOV0rLywgXCJcIil9L2Rpc3Qvc3RhbmRhbG9uZS5taW4uanNcIj48L3NjcmlwdD5cbiIsICJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCJcblxuaW50ZXJmYWNlIEV2ZW50IHtcbiAgZXZlbnRfaWQ6IHN0cmluZ1xuICBjcmVhdGVkX2F0OiBzdHJpbmdcbiAgZXZlbnRfdHlwZTogc3RyaW5nXG4gIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5pbnRlcmZhY2UgRXZlbnRzUmVzcG9uc2Uge1xuICBldmVudF9saXN0OiBFdmVudFtdXG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudHNXYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBsYXN0UG9sbFRpbWU6IHN0cmluZ1xuICBwcml2YXRlIHBvbGxJbnRlcnZhbDogbnVtYmVyXG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nXG4gIHByaXZhdGUgcG9sbGluZyA9IGZhbHNlXG4gIHByaXZhdGUgdGltZW91dElkPzogTm9kZUpTLlRpbWVvdXRcblxuICBjb25zdHJ1Y3RvcihiYXNlVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiwgcG9sbEludGVydmFsID0gMTAwMCkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsXG4gICAgdGhpcy5wb2xsSW50ZXJ2YWwgPSBwb2xsSW50ZXJ2YWxcbiAgICB0aGlzLmxhc3RQb2xsVGltZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgaWYgKHRoaXMucG9sbGluZykgcmV0dXJuXG4gICAgdGhpcy5wb2xsaW5nID0gdHJ1ZVxuICAgIGF3YWl0IHRoaXMucG9sbCgpXG4gIH1cblxuICBzdG9wKCkge1xuICAgIHRoaXMucG9sbGluZyA9IGZhbHNlXG4gICAgaWYgKHRoaXMudGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwb2xsKCkge1xuICAgIGlmICghdGhpcy5wb2xsaW5nKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9ldmVudHMvbGlzdD9zaW5jZT0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmxhc3RQb2xsVGltZSl9YCxcbiAgICAgIClcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YTogRXZlbnRzUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgLy8gVXBkYXRlIGxhc3QgcG9sbCB0aW1lIHRvIGxhdGVzdCBldmVudCBvciBjdXJyZW50IHRpbWVcbiAgICAgIGNvbnN0IGxhdGVzdEV2ZW50ID0gZGF0YS5ldmVudF9saXN0W2RhdGEuZXZlbnRfbGlzdC5sZW5ndGggLSAxXVxuICAgICAgdGhpcy5sYXN0UG9sbFRpbWUgPSBsYXRlc3RFdmVudFxuICAgICAgICA/IGxhdGVzdEV2ZW50LmNyZWF0ZWRfYXRcbiAgICAgICAgOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcblxuICAgICAgLy8gRW1pdCBldmVudHMgaW4gY2hyb25vbG9naWNhbCBvcmRlclxuICAgICAgZGF0YS5ldmVudF9saXN0LmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdChldmVudC5ldmVudF90eXBlLCBldmVudClcbiAgICAgICAgdGhpcy5lbWl0KFwiKlwiLCBldmVudClcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKVxuICAgIH1cbiAgICAvLyBTY2hlZHVsZSBuZXh0IHBvbGxcbiAgICB0aGlzLnRpbWVvdXRJZCA9IGdsb2JhbFRoaXMuc2V0VGltZW91dChcbiAgICAgICgpID0+IHRoaXMucG9sbCgpLFxuICAgICAgdGhpcy5wb2xsSW50ZXJ2YWwsXG4gICAgKSBhcyB1bmtub3duIGFzIE5vZGVKUy5UaW1lb3V0XG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZmluZEltcG9ydHNJblNuaXBwZXQgfSBmcm9tIFwiLi9maW5kSW1wb3J0c0luU25pcHBldFwiXG5pbXBvcnQgeyBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldCB9IGZyb20gXCIuL2luc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0XCJcblxuZXhwb3J0IGNsYXNzIEZpbGVzeXN0ZW1UeXBlc0hhbmRsZXIge1xuICBwcml2YXRlIHByb2plY3RSb290OiBzdHJpbmdcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsRGlyOiBzdHJpbmcpIHtcbiAgICB0aGlzLnByb2plY3RSb290ID0gdGhpcy5maW5kUHJvamVjdFJvb3QoaW5pdGlhbERpcilcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUluaXRpYWxUeXBlRGVwZW5kZW5jaWVzKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmxvZyhcIkNoZWNraW5nIGluaXRpYWwgdHlwZSBkZXBlbmRlbmNpZXMuLi5cIilcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmFyZVR5cGVzSW5zdGFsbGVkKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkluc3RhbGxpbmcgbWlzc2luZyBpbml0aWFsIHR5cGVzLi4uXCIpXG4gICAgICAgIGF3YWl0IGluc3RhbGxOb2RlTW9kdWxlVHlwZXNGb3JTbmlwcGV0KGZpbGVQYXRoKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJFcnJvciBoYW5kbGluZyBpbml0aWFsIHR5cGUgZGVwZW5kZW5jaWVzOlwiLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVGaWxlVHlwZURlcGVuZGVuY2llcyhmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5hcmVUeXBlc0luc3RhbGxlZChmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbnN0YWxsaW5nIG1pc3NpbmcgZmlsZSB0eXBlcy4uLlwiKVxuICAgICAgICBhd2FpdCBpbnN0YWxsTm9kZU1vZHVsZVR5cGVzRm9yU25pcHBldChmaWxlUGF0aClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHZlcmlmeSB0eXBlczpcIiwgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcmVUeXBlc0luc3RhbGxlZChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW1wb3J0cyA9IGZpbmRJbXBvcnRzSW5TbmlwcGV0KGZpbGVQYXRoKVxuICAgIHJldHVybiBpbXBvcnRzLmV2ZXJ5KChpbXApID0+IHRoaXMuY2hlY2tUeXBlRXhpc3RzKGltcCkpXG4gIH1cblxuICBwcml2YXRlIGNoZWNrVHlwZUV4aXN0cyhpbXBvcnRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWltcG9ydFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IHBhdGhXaXRob3V0UHJlZml4ID0gaW1wb3J0UGF0aC5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpXG4gICAgY29uc3QgW293bmVyLCBuYW1lXSA9IHBhdGhXaXRob3V0UHJlZml4LnNwbGl0KFwiLlwiKVxuXG4gICAgY29uc3QgdHlwZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICB0aGlzLnByb2plY3RSb290LFxuICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgIFwiQHRzY2lcIixcbiAgICAgIGAke293bmVyfS4ke25hbWV9YCxcbiAgICAgIFwiaW5kZXguZC50c1wiLFxuICAgIClcblxuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHR5cGVQYXRoKVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUHJvamVjdFJvb3Qoc3RhcnREaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJvb3QgPSBwYXRoLnJlc29sdmUoc3RhcnREaXIpXG4gICAgd2hpbGUgKHJvb3QgIT09IHBhdGgucGFyc2Uocm9vdCkucm9vdCkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3QsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgICByZXR1cm4gcm9vdFxuICAgICAgfVxuICAgICAgcm9vdCA9IHBhdGguZGlybmFtZShyb290KVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnREaXJcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRJbXBvcnRzSW5TbmlwcGV0KHNuaXBwZXRQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc25pcHBldFBhdGgsIFwidXRmLThcIilcbiAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgc25pcHBldFBhdGgsXG4gICAgY29udGVudCxcbiAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgIHRydWUsXG4gIClcblxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogdHMuTm9kZSkge1xuICAgIGlmICh0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXIgPSBub2RlLm1vZHVsZVNwZWNpZmllclxuICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAmJiB0cy5pc1N0cmluZ0xpdGVyYWwobW9kdWxlU3BlY2lmaWVyKSkge1xuICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gbW9kdWxlU3BlY2lmaWVyLnRleHRcbiAgICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgICAgICAgIGltcG9ydHMucHVzaChpbXBvcnRQYXRoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdClcbiAgfVxuXG4gIHZpc2l0KHNvdXJjZUZpbGUpXG5cbiAgcmV0dXJuIGltcG9ydHNcbn1cbiIsICJpbXBvcnQgQ29uZmlnc3RvcmUgZnJvbSBcImNvbmZpZ3N0b3JlXCJcbmltcG9ydCB0eXBlIHsgVHlwZWRDb25maWdzdG9yZSB9IGZyb20gXCIuL1R5cGVkQ29uZmlnU3RvcmVcIlxuaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSBcImp3dC1kZWNvZGVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENsaUNvbmZpZyB7XG4gIHNlc3Npb25Ub2tlbj86IHN0cmluZ1xuICBnaXRodWJVc2VybmFtZT86IHN0cmluZ1xuICByZWdpc3RyeUFwaVVybD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgY2xpQ29uZmlnOiBUeXBlZENvbmZpZ3N0b3JlPENsaUNvbmZpZz4gPSBuZXcgQ29uZmlnc3RvcmUoXG4gIFwidHNjaXJjdWl0XCIsXG4pXG5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uVG9rZW4gPSAodG9rZW46IHN0cmluZykgPT4ge1xuICBjbGlDb25maWcuc2V0KFwic2Vzc2lvblRva2VuXCIsIHRva2VuKVxuICBjb25zdCBkZWNvZGVkID0gand0RGVjb2RlPHtcbiAgICBnaXRodWJfdXNlcm5hbWU6IHN0cmluZ1xuICB9Pih0b2tlbilcbiAgY2xpQ29uZmlnLnNldChcImdpdGh1YlVzZXJuYW1lXCIsIGRlY29kZWQuZ2l0aHViX3VzZXJuYW1lKVxufVxuXG5leHBvcnQgY29uc3QgY2xlYXJTZXNzaW9uID0gKCkgPT4ge1xuICBjbGlDb25maWcuZGVsZXRlKFwic2Vzc2lvblRva2VuXCIpXG4gIGNsaUNvbmZpZy5kZWxldGUoXCJnaXRodWJVc2VybmFtZVwiKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UmVnaXN0cnlBcGlVcmwgPSAoKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIGNsaUNvbmZpZy5nZXQoXCJyZWdpc3RyeUFwaVVybFwiKSA/PyBcImh0dHBzOi8vcmVnaXN0cnktYXBpLnRzY2lyY3VpdC5jb21cIlxufVxuIiwgImltcG9ydCB7IGdldFJlZ2lzdHJ5QXBpVXJsIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcbmltcG9ydCBreSwgeyB0eXBlIEFmdGVyUmVzcG9uc2VIb29rIH0gZnJvbSBcImt5XCJcblxuZXhwb3J0IGNvbnN0IHByZXR0eVJlc3BvbnNlRXJyb3JIb29rOiBBZnRlclJlc3BvbnNlSG9vayA9IGFzeW5jIChcbiAgX3JlcXVlc3QsXG4gIF9vcHRpb25zLFxuICByZXNwb25zZSxcbikgPT4ge1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRkFJTCBbJHtyZXNwb25zZS5zdGF0dXN9XTogJHtfcmVxdWVzdC5tZXRob2R9ICR7XG4gICAgICAgICAgbmV3IFVSTChfcmVxdWVzdC51cmwpLnBhdGhuYW1lXG4gICAgICAgIH0gXFxuXFxuICR7SlNPTi5zdHJpbmdpZnkoZXJyb3JEYXRhLCBudWxsLCAyKX1gLFxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vaWdub3JlLCBhbGxvdyB0aGUgZXJyb3IgdG8gYmUgdGhyb3duXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRLeSA9ICgpID0+IHtcbiAgcmV0dXJuIGt5LmNyZWF0ZSh7XG4gICAgcHJlZml4VXJsOiBnZXRSZWdpc3RyeUFwaVVybCgpLFxuICAgIGhvb2tzOiB7XG4gICAgICBhZnRlclJlc3BvbnNlOiBbcHJldHR5UmVzcG9uc2VFcnJvckhvb2tdLFxuICAgIH0sXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgY2xpQ29uZmlnIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcbmltcG9ydCB7IGdldEt5IH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZ2V0LWt5XCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgc2VtdmVyIGZyb20gXCJzZW12ZXJcIlxuXG50eXBlIFB1c2hPcHRpb25zID0ge1xuICBmaWxlUGF0aD86IHN0cmluZ1xuICBvbkV4aXQ/OiAoY29kZTogbnVtYmVyKSA9PiB2b2lkXG4gIG9uRXJyb3I/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkXG4gIG9uU3VjY2Vzcz86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IHB1c2hTbmlwcGV0ID0gYXN5bmMgKHtcbiAgZmlsZVBhdGgsXG4gIG9uRXhpdCA9IChjb2RlKSA9PiBwcm9jZXNzLmV4aXQoY29kZSksXG4gIG9uRXJyb3IgPSAobWVzc2FnZSkgPT4gY29uc29sZS5lcnJvcihtZXNzYWdlKSxcbiAgb25TdWNjZXNzID0gKG1lc3NhZ2UpID0+IGNvbnNvbGUubG9nKG1lc3NhZ2UpLFxufTogUHVzaE9wdGlvbnMpID0+IHtcbiAgY29uc3Qgc2Vzc2lvblRva2VuID0gY2xpQ29uZmlnLmdldChcInNlc3Npb25Ub2tlblwiKVxuICBpZiAoIXNlc3Npb25Ub2tlbikge1xuICAgIG9uRXJyb3IoXCJZb3UgbmVlZCB0byBsb2cgaW4gdG8gc2F2ZSBzbmlwcGV0LlwiKVxuICAgIHJldHVybiBvbkV4aXQoMSlcbiAgfVxuXG4gIGxldCBzbmlwcGV0RmlsZVBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIGlmIChmaWxlUGF0aCkge1xuICAgIHNuaXBwZXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlUGF0aClcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZWZhdWx0RW50cnlwb2ludCA9IHBhdGgucmVzb2x2ZShcImluZGV4LnRzeFwiKVxuICAgIGlmIChmcy5leGlzdHNTeW5jKGRlZmF1bHRFbnRyeXBvaW50KSkge1xuICAgICAgc25pcHBldEZpbGVQYXRoID0gZGVmYXVsdEVudHJ5cG9pbnRcbiAgICAgIG9uU3VjY2VzcyhcIk5vIGZpbGUgcHJvdmlkZWQuIFVzaW5nICdpbmRleC50c3gnIGFzIHRoZSBlbnRyeXBvaW50LlwiKVxuICAgIH0gZWxzZSB7XG4gICAgICBvbkVycm9yKFxuICAgICAgICBcIk5vIGVudHJ5cG9pbnQgZm91bmQuIFJ1biAndHNjaSBpbml0JyB0byBib290c3RyYXAgYSBiYXNpYyBwcm9qZWN0LlwiLFxuICAgICAgKVxuICAgICAgcmV0dXJuIG9uRXhpdCgxKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHNuaXBwZXRGaWxlUGF0aCksIFwicGFja2FnZS5qc29uXCIpLFxuICApXG4gIGxldCBwYWNrYWdlSnNvbjogeyBuYW1lPzogc3RyaW5nOyBhdXRob3I/OiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfSA9IHt9XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgpLnRvU3RyaW5nKCkpXG4gICAgfSBjYXRjaCB7XG4gICAgICBvbkVycm9yKFwiSW52YWxpZCBwYWNrYWdlLmpzb24gcHJvdmlkZWRcIilcbiAgICAgIHJldHVybiBvbkV4aXQoMSlcbiAgICB9XG4gIH1cblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc25pcHBldEZpbGVQYXRoKSkge1xuICAgIG9uRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke3NuaXBwZXRGaWxlUGF0aH1gKVxuICAgIHJldHVybiBvbkV4aXQoMSlcbiAgfVxuXG4gIGNvbnN0IGt5ID0gZ2V0S3koKVxuICBjb25zdCBwYWNrYWdlTmFtZSA9IChcbiAgICBwYWNrYWdlSnNvbi5uYW1lID8/IHBhdGgucGFyc2Uoc25pcHBldEZpbGVQYXRoKS5uYW1lXG4gICkucmVwbGFjZSgvXkAvLCBcIlwiKVxuICBjb25zdCBwYWNrYWdlQXV0aG9yID1cbiAgICBwYWNrYWdlSnNvbi5hdXRob3I/LnNwbGl0KFwiIFwiKVswXSA/PyBjbGlDb25maWcuZ2V0KFwiZ2l0aHViVXNlcm5hbWVcIilcbiAgY29uc3QgcGFja2FnZUlkZW50aWZpZXIgPSBgJHtwYWNrYWdlQXV0aG9yfS8ke3BhY2thZ2VOYW1lfWBcblxuICBsZXQgcGFja2FnZVZlcnNpb24gPVxuICAgIHBhY2thZ2VKc29uLnZlcnNpb24gPz9cbiAgICAoYXdhaXQga3lcbiAgICAgIC5wb3N0PHtcbiAgICAgICAgZXJyb3I/OiB7IGVycm9yX2NvZGU6IHN0cmluZyB9XG4gICAgICAgIHBhY2thZ2VfcmVsZWFzZXM/OiB7IHZlcnNpb246IHN0cmluZzsgaXNfbGF0ZXN0OiBib29sZWFuIH1bXVxuICAgICAgfT4oXCJwYWNrYWdlX3JlbGVhc2VzL2xpc3RcIiwge1xuICAgICAgICBqc29uOiB7IHBhY2thZ2VfbmFtZTogcGFja2FnZUlkZW50aWZpZXIgfSxcbiAgICAgIH0pXG4gICAgICAuanNvbigpXG4gICAgICAudGhlbihcbiAgICAgICAgKHJlc3BvbnNlKSA9PlxuICAgICAgICAgIHJlc3BvbnNlLnBhY2thZ2VfcmVsZWFzZXM/LltyZXNwb25zZS5wYWNrYWdlX3JlbGVhc2VzLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICA/LnZlcnNpb24sXG4gICAgICApXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIG9uRXJyb3IoXCJGYWlsZWQgdG8gcmV0cmlldmUgbGF0ZXN0IHBhY2thZ2UgdmVyc2lvbjpcIiArIGVycm9yKVxuICAgICAgICByZXR1cm4gb25FeGl0KDEpXG4gICAgICB9KSlcblxuICBpZiAoIXBhY2thZ2VWZXJzaW9uKSB7XG4gICAgb25FcnJvcihcIkZhaWxlZCB0byByZXRyaWV2ZSBwYWNrYWdlIHZlcnNpb24uXCIpXG4gICAgcmV0dXJuIG9uRXhpdCgxKVxuICB9XG5cbiAgY29uc3QgdXBkYXRlUGFja2FnZUpzb25WZXJzaW9uID0gKG5ld1ZlcnNpb24/OiBzdHJpbmcpID0+IHtcbiAgICBpZiAocGFja2FnZUpzb24udmVyc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFja2FnZUpzb24udmVyc2lvbiA9IG5ld1ZlcnNpb24gPz8gYCR7cGFja2FnZVZlcnNpb259YFxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDIpKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgb25FcnJvcihcIkZhaWxlZCB0byB1cGRhdGUgcGFja2FnZS5qc29uIHZlcnNpb246XCIgKyBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBkb2VzUGFja2FnZUV4aXN0ID0gYXdhaXQga3lcbiAgICAucG9zdDx7IGVycm9yPzogeyBlcnJvcl9jb2RlOiBzdHJpbmcgfSB9PihcInBhY2thZ2VzL2dldFwiLCB7XG4gICAgICBqc29uOiB7IG5hbWU6IHBhY2thZ2VJZGVudGlmaWVyIH0sXG4gICAgICB0aHJvd0h0dHBFcnJvcnM6IGZhbHNlLFxuICAgIH0pXG4gICAgLmpzb24oKVxuICAgIC50aGVuKChyZXNwb25zZSkgPT4gIShyZXNwb25zZS5lcnJvcj8uZXJyb3JfY29kZSA9PT0gXCJwYWNrYWdlX25vdF9mb3VuZFwiKSlcblxuICBpZiAoIWRvZXNQYWNrYWdlRXhpc3QpIHtcbiAgICBhd2FpdCBreVxuICAgICAgLnBvc3QoXCJwYWNrYWdlcy9jcmVhdGVcIiwge1xuICAgICAgICBqc29uOiB7IG5hbWU6IHBhY2thZ2VJZGVudGlmaWVyIH0sXG4gICAgICAgIGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Nlc3Npb25Ub2tlbn1gIH0sXG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBvbkVycm9yKFwiRXJyb3IgY3JlYXRpbmcgcGFja2FnZTpcIiArIGVycm9yKVxuICAgICAgICByZXR1cm4gb25FeGl0KDEpXG4gICAgICB9KVxuICB9XG5cbiAgY29uc3QgZG9lc1JlbGVhc2VFeGlzdCA9IGF3YWl0IGt5XG4gICAgLnBvc3Q8e1xuICAgICAgZXJyb3I/OiB7IGVycm9yX2NvZGU6IHN0cmluZyB9XG4gICAgICBwYWNrYWdlX3JlbGVhc2U/OiB7IHZlcnNpb246IHN0cmluZyB9XG4gICAgfT4oXCJwYWNrYWdlX3JlbGVhc2VzL2dldFwiLCB7XG4gICAgICBqc29uOiB7XG4gICAgICAgIHBhY2thZ2VfbmFtZV93aXRoX3ZlcnNpb246IGAke3BhY2thZ2VJZGVudGlmaWVyfUAke3BhY2thZ2VWZXJzaW9ufWAsXG4gICAgICB9LFxuICAgICAgdGhyb3dIdHRwRXJyb3JzOiBmYWxzZSxcbiAgICB9KVxuICAgIC5qc29uKClcbiAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5wYWNrYWdlX3JlbGVhc2U/LnZlcnNpb24pIHtcbiAgICAgICAgcGFja2FnZVZlcnNpb24gPSByZXNwb25zZS5wYWNrYWdlX3JlbGVhc2UudmVyc2lvblxuICAgICAgICB1cGRhdGVQYWNrYWdlSnNvblZlcnNpb24ocmVzcG9uc2UucGFja2FnZV9yZWxlYXNlLnZlcnNpb24pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gIShyZXNwb25zZS5lcnJvcj8uZXJyb3JfY29kZSA9PT0gXCJwYWNrYWdlX3JlbGVhc2Vfbm90X2ZvdW5kXCIpXG4gICAgfSlcblxuICBpZiAoZG9lc1JlbGVhc2VFeGlzdCkge1xuICAgIGNvbnN0IGJ1bXBlZFZlcnNpb24gPSBzZW12ZXIuaW5jKHBhY2thZ2VWZXJzaW9uLCBcInBhdGNoXCIpIVxuICAgIG9uU3VjY2VzcyhcbiAgICAgIGBJbmNyZW1lbnRpbmcgUGFja2FnZSBWZXJzaW9uICR7cGFja2FnZVZlcnNpb259IC0+ICR7YnVtcGVkVmVyc2lvbn1gLFxuICAgIClcbiAgICBwYWNrYWdlVmVyc2lvbiA9IGJ1bXBlZFZlcnNpb25cbiAgICB1cGRhdGVQYWNrYWdlSnNvblZlcnNpb24ocGFja2FnZVZlcnNpb24pXG4gIH1cblxuICBhd2FpdCBreVxuICAgIC5wb3N0KFwicGFja2FnZV9yZWxlYXNlcy9jcmVhdGVcIiwge1xuICAgICAganNvbjoge1xuICAgICAgICBwYWNrYWdlX25hbWVfd2l0aF92ZXJzaW9uOiBgJHtwYWNrYWdlSWRlbnRpZmllcn1AJHtwYWNrYWdlVmVyc2lvbn1gLFxuICAgICAgfSxcbiAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBvbkVycm9yKFwiRXJyb3IgY3JlYXRpbmcgcmVsZWFzZTpcIiArIGVycm9yKVxuICAgICAgcmV0dXJuIG9uRXhpdCgxKVxuICAgIH0pXG5cbiAgb25TdWNjZXNzKFwiXFxuXCIpXG5cbiAgY29uc3QgZGlyZWN0b3J5RmlsZXMgPSBmcy5yZWFkZGlyU3luYyhwYXRoLmRpcm5hbWUoc25pcHBldEZpbGVQYXRoKSlcbiAgZm9yIChjb25zdCBmaWxlIG9mIGRpcmVjdG9yeUZpbGVzKSB7XG4gICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlKS5yZXBsYWNlKFwiLlwiLCBcIlwiKVxuICAgIGlmICghW1wianNvblwiLCBcInRzeFwiLCBcInRzXCJdLmluY2x1ZGVzKGZpbGVFeHRlbnNpb24pKSBjb250aW51ZVxuICAgIGNvbnN0IGZpbGVDb250ZW50ID1cbiAgICAgIGZzXG4gICAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZShzbmlwcGV0RmlsZVBhdGgpLCBmaWxlKSlcbiAgICAgICAgLnRvU3RyaW5nKCkgPz8gXCJcIlxuICAgIGF3YWl0IGt5XG4gICAgICAucG9zdChcInBhY2thZ2VfZmlsZXMvY3JlYXRlXCIsIHtcbiAgICAgICAganNvbjoge1xuICAgICAgICAgIGZpbGVfcGF0aDogZmlsZSxcbiAgICAgICAgICBjb250ZW50X3RleHQ6IGZpbGVDb250ZW50LFxuICAgICAgICAgIHBhY2thZ2VfbmFtZV93aXRoX3ZlcnNpb246IGAke3BhY2thZ2VJZGVudGlmaWVyfUAke3BhY2thZ2VWZXJzaW9ufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHRocm93SHR0cEVycm9yczogZmFsc2UsXG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBvblN1Y2Nlc3MoYFVwbG9hZGVkIGZpbGUgJHtmaWxlfSB0byB0aGUgcmVnaXN0cnkuYClcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIG9uRXJyb3IoYEVycm9yIHVwbG9hZGluZyBmaWxlICR7ZmlsZX06YCArIGVycm9yKVxuICAgICAgfSlcbiAgfVxuXG4gIG9uU3VjY2VzcyhcbiAgICBbXG4gICAgICBgXFxuXHVEODNDXHVERjg5IFN1Y2Nlc3NmdWxseSBwdXNoZWQgcGFja2FnZSAke3BhY2thZ2VJZGVudGlmaWVyfUAke3BhY2thZ2VWZXJzaW9ufSB0byB0aGUgcmVnaXN0cnkhJHtCdW4uY29sb3IoXCJibHVlXCIsIFwiYW5zaVwiKX1gLFxuICAgICAgYGh0dHBzOi8vdHNjaXJjdWl0LmNvbS8ke3BhY2thZ2VJZGVudGlmaWVyfSBcXHgxYlswbWAsXG4gICAgXS5qb2luKFwiIFwiKSxcbiAgKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgc2V0U2Vzc2lvblRva2VuIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcbmltcG9ydCBkZWxheSBmcm9tIFwiZGVsYXlcIlxuaW1wb3J0IHsgZ2V0S3kgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9nZXQta3lcIlxuaW1wb3J0IHR5cGUgeyBFbmRwb2ludFJlc3BvbnNlIH0gZnJvbSBcImxpYi9yZWdpc3RyeS1hcGkvZW5kcG9pbnQtdHlwZXNcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoTG9naW4gPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICAvLyBEZWZpbmUgdGhlIGxvZ2luIGFjdGlvbiBvbmNlIHRvIHNoYXJlIGJldHdlZW4gYm90aCBjb21tYW5kc1xuICBjb25zdCBsb2dpbkFjdGlvbiA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBreSA9IGdldEt5KClcblxuICAgIGNvbnN0IHsgbG9naW5fcGFnZSB9ID0gYXdhaXQga3lcbiAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2NyZWF0ZVwiXT4oXG4gICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9jcmVhdGVcIixcbiAgICAgICAge1xuICAgICAgICAgIGpzb246IHt9LFxuICAgICAgICB9LFxuICAgICAgKVxuICAgICAgLmpzb24oKVxuXG4gICAgY29uc29sZS5sb2coXCJQbGVhc2UgdmlzaXQgdGhlIGZvbGxvd2luZyBVUkwgdG8gbG9nIGluOlwiKVxuICAgIGNvbnNvbGUubG9nKGxvZ2luX3BhZ2UudXJsKVxuXG4gICAgLy8gV2FpdCB1bnRpbCB3ZSByZWNlaXZlIGNvbmZpcm1hdGlvblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB7IGxvZ2luX3BhZ2U6IG5ld19sb2dpbl9wYWdlIH0gPSBhd2FpdCBreVxuICAgICAgICAucG9zdDxFbmRwb2ludFJlc3BvbnNlW1wic2Vzc2lvbnMvbG9naW5fcGFnZS9nZXRcIl0+KFxuICAgICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9nZXRcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgIGxvZ2luX3BhZ2VfaWQ6IGxvZ2luX3BhZ2UubG9naW5fcGFnZV9pZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfYXV0aF90b2tlbn1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIC5qc29uKClcblxuICAgICAgaWYgKG5ld19sb2dpbl9wYWdlLndhc19sb2dpbl9zdWNjZXNzZnVsKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTG9nZ2VkIGluISBHZW5lcmF0aW5nIHRva2VuLi4uXCIpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdfbG9naW5fcGFnZS5pc19leHBpcmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2luIHBhZ2UgZXhwaXJlZFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBkZWxheSgxMDAwKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2Vzc2lvbiB9ID0gYXdhaXQga3lcbiAgICAgIC5wb3N0PEVuZHBvaW50UmVzcG9uc2VbXCJzZXNzaW9ucy9sb2dpbl9wYWdlL2V4Y2hhbmdlX2Zvcl9jbGlfc2Vzc2lvblwiXT4oXG4gICAgICAgIFwic2Vzc2lvbnMvbG9naW5fcGFnZS9leGNoYW5nZV9mb3JfY2xpX3Nlc3Npb25cIixcbiAgICAgICAge1xuICAgICAgICAgIGpzb246IHtcbiAgICAgICAgICAgIGxvZ2luX3BhZ2VfaWQ6IGxvZ2luX3BhZ2UubG9naW5fcGFnZV9pZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2dpbl9wYWdlLmxvZ2luX3BhZ2VfYXV0aF90b2tlbn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAuanNvbigpXG5cbiAgICBzZXRTZXNzaW9uVG9rZW4oc2Vzc2lvbi50b2tlbilcbiAgICBjb25zb2xlLmxvZyhcIlxcblJlYWR5IHRvIHVzZSFcIilcbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSBhdXRoIGxvZ2luIHN1YmNvbW1hbmRcbiAgcHJvZ3JhbS5jb21tYW5kc1xuICAgIC5maW5kKChjKSA9PiBjLm5hbWUoKSA9PT0gXCJhdXRoXCIpIVxuICAgIC5jb21tYW5kKFwibG9naW5cIilcbiAgICAuZGVzY3JpcHRpb24oXCJBdXRoZW50aWNhdGUgQ0xJLCBsb2dpbiB0byByZWdpc3RyeVwiKVxuICAgIC5hY3Rpb24obG9naW5BY3Rpb24pXG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHRvcC1sZXZlbCBsb2dpbiBjb21tYW5kIGFzIGFuIGFsaWFzXG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImxvZ2luXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiTG9naW4gdG8gdHNjaXJjdWl0IHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dpbkFjdGlvbilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNsZWFyU2Vzc2lvbiB9IGZyb20gXCJsaWIvY2xpLWNvbmZpZ1wiXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhMb2dvdXQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBjb25zdCBsb2dvdXRBY3Rpb24gPSAoKSA9PiB7XG4gICAgY2xlYXJTZXNzaW9uKClcbiAgICBjb25zb2xlLmxvZyhcIllvdSBoYXZlIGJlZW4gbG9nZ2VkIG91dCFcIilcbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSBhdXRoIGxvZ291dCBzdWJjb21tYW5kXG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcImxvZ291dFwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkxvZ291dCBmcm9tIHJlZ2lzdHJ5XCIpXG4gICAgLmFjdGlvbihsb2dvdXRBY3Rpb24pXG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHRvcC1sZXZlbCBsb2dvdXQgY29tbWFuZCBhcyBhbiBhbGlhc1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJsb2dvdXRcIilcbiAgICAuZGVzY3JpcHRpb24oXCJMb2dvdXQgZnJvbSB0c2NpcmN1aXQgcmVnaXN0cnlcIilcbiAgICAuYWN0aW9uKGxvZ291dEFjdGlvbilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQXV0aCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZChcImF1dGhcIikuZGVzY3JpcHRpb24oXCJMb2dpbi9sb2dvdXRcIilcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ29uZmlnID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbS5jb21tYW5kKFwiY29uZmlnXCIpLmRlc2NyaXB0aW9uKFwiTWFuYWdlIHRzY2lyY3VpdCBDTEkgY29uZmlndXJhdGlvblwiKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgY2xpQ29uZmlnIH0gZnJvbSBcImxpYi9jbGktY29uZmlnXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ29uZmlnUHJpbnQgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtLmNvbW1hbmRzXG4gICAgLmZpbmQoKGMpID0+IGMubmFtZSgpID09PSBcImNvbmZpZ1wiKSFcbiAgICAuY29tbWFuZChcInByaW50XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUHJpbnQgdGhlIGN1cnJlbnQgY29uZmlnXCIpXG4gICAgLmFjdGlvbigoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShjbGlDb25maWcuYWxsLCBudWxsLCAyKSlcbiAgICB9KVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIlxuaW1wb3J0IHsgZ2V0S3kgfSBmcm9tIFwibGliL3JlZ2lzdHJ5LWFwaS9nZXQta3lcIlxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ2xvbmUgPSAocHJvZ3JhbTogQ29tbWFuZCkgPT4ge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJjbG9uZVwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkNsb25lIGEgc25pcHBldCBmcm9tIHRoZSByZWdpc3RyeVwiKVxuICAgIC5hcmd1bWVudChcIjxzbmlwcGV0PlwiLCBcIlNuaXBwZXQgdG8gY2xvbmUgKGUuZy4gYXV0aG9yL3NuaXBwZXROYW1lKVwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKHNuaXBwZXRQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGxldCBhdXRob3I6IHN0cmluZ1xuICAgICAgbGV0IHNuaXBwZXROYW1lOiBzdHJpbmdcbiAgICAgIGlmICghc25pcHBldFBhdGguc3RhcnRzV2l0aChcIkB0c2NpL1wiKSAmJiBzbmlwcGV0UGF0aC5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICAgICAgO1thdXRob3IsIHNuaXBwZXROYW1lXSA9IHNuaXBwZXRQYXRoLnNwbGl0KFwiL1wiKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZFBhdGggPSBzbmlwcGV0UGF0aC5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpXG4gICAgICAgIGNvbnN0IGZpcnN0RG90SW5kZXggPSB0cmltbWVkUGF0aC5pbmRleE9mKFwiLlwiKVxuICAgICAgICBhdXRob3IgPSB0cmltbWVkUGF0aC5zbGljZSgwLCBmaXJzdERvdEluZGV4KVxuICAgICAgICBzbmlwcGV0TmFtZSA9IHRyaW1tZWRQYXRoLnNsaWNlKGZpcnN0RG90SW5kZXggKyAxKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWF1dGhvciB8fCAhc25pcHBldE5hbWUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkludmFsaWQgc25pcHBldCBwYXRoLiBVc2UgZm9ybWF0OiBhdXRob3Ivc25pcHBldE5hbWUsIGF1dGhvci5zbmlwcGV0TmFtZSBvciBAdHNjaS9hdXRob3Iuc25pcHBldE5hbWVcIixcbiAgICAgICAgKVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qga3kgPSBnZXRLeSgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDbG9uaW5nICR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfS4uLmApXG5cbiAgICAgICAgY29uc3QgcGFja2FnZUZpbGVMaXN0ID0gYXdhaXQga3lcbiAgICAgICAgICAucG9zdDx7XG4gICAgICAgICAgICBwYWNrYWdlX2ZpbGVzOiBBcnJheTx7XG4gICAgICAgICAgICAgIHBhY2thZ2VfZmlsZV9pZDogc3RyaW5nXG4gICAgICAgICAgICAgIHBhY2thZ2VfcmVsZWFzZV9pZDogc3RyaW5nXG4gICAgICAgICAgICAgIGZpbGVfcGF0aDogc3RyaW5nXG4gICAgICAgICAgICAgIGNyZWF0ZWRfYXQ6IHN0cmluZ1xuICAgICAgICAgICAgfT5cbiAgICAgICAgICB9PihcInBhY2thZ2VfZmlsZXMvbGlzdFwiLCB7XG4gICAgICAgICAgICBqc29uOiB7XG4gICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogYCR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfWAsXG4gICAgICAgICAgICAgIHVzZV9sYXRlc3RfdmVyc2lvbjogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuanNvbigpXG5cbiAgICAgICAgLy8gQ3JlYXRlIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIGNvbnN0IGRpclBhdGggPSBgLi8ke2F1dGhvcn0uJHtzbmlwcGV0TmFtZX1gXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXJQYXRoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG93bmxvYWQgZWFjaCBmaWxlIHRoYXQgZG9lc24ndCBzdGFydCB3aXRoIGRpc3QvXG4gICAgICAgIGZvciAoY29uc3QgZmlsZUluZm8gb2YgcGFja2FnZUZpbGVMaXN0LnBhY2thZ2VfZmlsZXMpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGVJbmZvLmZpbGVfcGF0aC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgPyBmaWxlSW5mby5maWxlX3BhdGguc2xpY2UoMSlcbiAgICAgICAgICAgIDogZmlsZUluZm8uZmlsZV9wYXRoXG5cbiAgICAgICAgICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aChcImRpc3QvXCIpKSBjb250aW51ZVxuXG4gICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBreVxuICAgICAgICAgICAgLnBvc3Q8e1xuICAgICAgICAgICAgICBwYWNrYWdlX2ZpbGU6IHtcbiAgICAgICAgICAgICAgICBjb250ZW50X3RleHQ6IHN0cmluZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9PihcInBhY2thZ2VfZmlsZXMvZ2V0XCIsIHtcbiAgICAgICAgICAgICAganNvbjoge1xuICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogYCR7YXV0aG9yfS8ke3NuaXBwZXROYW1lfWAsXG4gICAgICAgICAgICAgICAgZmlsZV9wYXRoOiBmaWxlSW5mby5maWxlX3BhdGgsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpzb24oKVxuXG4gICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZVBhdGgpXG4gICAgICAgICAgY29uc3QgZGlyTmFtZSA9IHBhdGguZGlybmFtZShmdWxsUGF0aClcblxuICAgICAgICAgIC8vIENyZWF0ZSBuZXN0ZWQgZGlyZWN0b3JpZXMgaWYgdGhleSBkb24ndCBleGlzdFxuICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXJOYW1lKSkge1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKGRpck5hbWUsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgZmlsZUNvbnRlbnQucGFja2FnZV9maWxlLmNvbnRlbnRfdGV4dClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5wbXJjUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBcIi5ucG1yY1wiKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG5wbXJjUGF0aCwgXCJAdHNjaTpyZWdpc3RyeT1odHRwczovL25wbS50c2NpcmN1aXQuY29tXCIpXG5cbiAgICAgICAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSBjbG9uZWQgdG8gLi8ke2F1dGhvcn0uJHtzbmlwcGV0TmFtZX0vYClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjbG9uZSBzbmlwcGV0OlwiLCBlcnJvci5tZXNzYWdlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY2xvbmUgc25pcHBldDpcIiwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgICB9XG4gICAgfSlcbn1cbiIsICJpbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNyZWF0ZUNpcmN1aXRXZWJXb3JrZXIgfSBmcm9tIFwiQHRzY2lyY3VpdC9ldmFsLXdlYndvcmtlclwiXG5pbXBvcnQgd2ViV29ya2VyQnVuZGxlVXJsIGZyb20gXCJAdHNjaXJjdWl0L2V2YWwtd2Vid29ya2VyL2Jsb2ItdXJsXCJcbmltcG9ydCB7IGdldFZpcnR1YWxGaWxlU3lzdGVtRnJvbURpclBhdGggfSBmcm9tIFwibWFrZS12ZnNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIlxuXG5jb25zdCBBTExPV0VEX0ZPUk1BVFMgPSBbXG4gIFwianNvblwiLFxuICBcImNpcmN1aXQtanNvblwiLFxuICBcInNjaGVtYXRpYy1zdmdcIixcbiAgXCJwY2Itc3ZnXCIsXG4gIFwiZ2VyYmVyc1wiLFxuICBcInJlYWRhYmxlLW5ldGxpc3RcIixcbiAgXCJnbHRmXCIsXG4gIFwic3BlY2N0cmEtZHNuXCIsXG5dIGFzIGNvbnN0XG5cbnR5cGUgRm9ybWF0ID0gKHR5cGVvZiBBTExPV0VEX0ZPUk1BVFMpW251bWJlcl1cblxuY29uc3QgT1VUUFVUX0VYVEVOU0lPTlMgPSB7XG4gIGpzb246IFwiLmNpcmN1aXQuanNvblwiLFxuICBcImNpcmN1aXQtanNvblwiOiBcIi5jaXJjdWl0Lmpzb25cIixcbiAgXCJzY2hlbWF0aWMtc3ZnXCI6IFwiLXNjaGVtYXRpYy5zdmdcIixcbiAgXCJwY2Itc3ZnXCI6IFwiLXBjYi5zdmdcIixcbiAgZ2VyYmVyczogXCItZ2VyYmVycy56aXBcIixcbiAgXCJyZWFkYWJsZS1uZXRsaXN0XCI6IFwiLXJlYWRhYmxlLm5ldGxpc3RcIixcbiAgZ2x0ZjogXCIuZ2x0ZlwiLFxuICBcInNwZWNjdHJhLWRzblwiOiBcIi5kc25cIixcbn1cblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyRXhwb3J0ID0gKHByb2dyYW06IENvbW1hbmQpID0+IHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKFwiZXhwb3J0XCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiRXhwb3J0IHRzY2lyY3VpdCBjb2RlIHRvIHZhcmlvdXMgZm9ybWF0c1wiKVxuICAgIC5hcmd1bWVudChcIjxmaWxlPlwiLCBcIlBhdGggdG8gdGhlIHNuaXBwZXQgZmlsZVwiKVxuICAgIC5vcHRpb24oXCItZiwgLS1mb3JtYXQgPGZvcm1hdD5cIiwgXCJPdXRwdXQgZm9ybWF0XCIpXG4gICAgLm9wdGlvbihcIi1vLCAtLW91dHB1dCA8cGF0aD5cIiwgXCJPdXRwdXQgZmlsZSBwYXRoXCIpXG4gICAgLmFjdGlvbihhc3luYyAoZmlsZSwgb3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgeyBmb3JtYXQgPSBcImNpcmN1aXQtanNvblwiIH0gPSBvcHRpb25zXG4gICAgICBsZXQgeyBvdXRwdXQgfSA9IG9wdGlvbnNcbiAgICAgIGlmICghQUxMT1dFRF9GT1JNQVRTLmluY2x1ZGVzKGZvcm1hdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGZvcm1hdDogJHtmb3JtYXR9XFxuU3VwcG9ydGVkIGZvcm1hdHM6ICR7QUxMT1dFRF9GT1JNQVRTLmpvaW4oXCIsXCIpfWAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKCFvdXRwdXQpIHtcbiAgICAgICAgb3V0cHV0ID0gcGF0aC5iYXNlbmFtZShmaWxlKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCBcIlwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCBjcmVhdGVDaXJjdWl0V2ViV29ya2VyKHtcbiAgICAgICAgd2ViV29ya2VyVXJsOiB3ZWJXb3JrZXJCdW5kbGVVcmwsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBwcm9qZWN0RGlyID0gcGF0aC5kaXJuYW1lKGZpbGUpXG5cbiAgICAgIGNvbnN0IHJlbGF0aXZlQ29tcG9uZW50UGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdERpciwgZmlsZSlcblxuICAgICAgYXdhaXQgd29ya2VyLmV4ZWN1dGVXaXRoRnNNYXAoe1xuICAgICAgICBlbnRyeXBvaW50OiBcImVudHJ5cG9pbnQudHN4XCIsXG4gICAgICAgIGZzTWFwOiB7XG4gICAgICAgICAgLi4uKChhd2FpdCBnZXRWaXJ0dWFsRmlsZVN5c3RlbUZyb21EaXJQYXRoKHtcbiAgICAgICAgICAgIGRpclBhdGg6IHByb2plY3REaXIsXG4gICAgICAgICAgICBjb250ZW50Rm9ybWF0OiBcInN0cmluZ1wiLFxuICAgICAgICAgIH0pKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSxcbiAgICAgICAgICBcImVudHJ5cG9pbnQudHN4XCI6IGBcbmltcG9ydCBNeUNpcmN1aXQgZnJvbSBcIi4vJHtyZWxhdGl2ZUNvbXBvbmVudFBhdGh9XCJcblxuY2lyY3VpdC5hZGQoPE15Q2lyY3VpdCAvPilcbiAgICAgICAgYCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHdvcmtlci5yZW5kZXJVbnRpbFNldHRsZWQoKVxuXG4gICAgICBjb25zdCBjaXJjdWl0SnNvbiA9IGF3YWl0IHdvcmtlci5nZXRDaXJjdWl0SnNvbigpXG5cbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIHByb2plY3REaXIsXG4gICAgICAgIGAke291dHB1dH0ke09VVFBVVF9FWFRFTlNJT05TW2Zvcm1hdCBhcyBGb3JtYXRdfWAsXG4gICAgICApXG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgSlNPTi5zdHJpbmdpZnkoY2lyY3VpdEpzb24pKVxuXG4gICAgICBjb25zb2xlLmxvZyhgRXhwb3J0ZWQgdG8gJHtvdXRwdXRQYXRofWApXG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBjbGlDb25maWcgfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJBdXRoUHJpbnRUb2tlbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcInByaW50LXRva2VuXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiUHJpbnRzIHlvdXIgYXV0aCB0b2tlblwiKVxuICAgIC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBjbGlDb25maWcuZ2V0KFwic2Vzc2lvblRva2VuXCIpXG4gICAgICBpZiAoIXRva2VuKSByZXR1cm4gY29uc29sZS5sb2coXCJZb3UgbmVlZCB0byBsb2cgaW4gdG8gYWNjZXNzIHRoaXMuXCIpXG4gICAgICBjb25zb2xlLmxvZyhcIllvdXIgVG9rZW46XFxuXCIsIHRva2VuKVxuICAgIH0pXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBzZXRTZXNzaW9uVG9rZW4gfSBmcm9tIFwibGliL2NsaS1jb25maWdcIlxuXG5mdW5jdGlvbiB2YWxpZGF0ZUpXVExlbmd0aCh0b2tlbjogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gdG9rZW4uc3BsaXQoXCIuXCIpXG5cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMyAmJiBwYXJ0cy5ldmVyeSgocGFydCkgPT4gcGFydC5sZW5ndGggPiAwKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbmV4cG9ydCBjb25zdCByZWdpc3RlckF1dGhTZXRUb2tlbiA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW0uY29tbWFuZHNcbiAgICAuZmluZCgoYykgPT4gYy5uYW1lKCkgPT09IFwiYXV0aFwiKSFcbiAgICAuY29tbWFuZChcInNldC10b2tlblwiKVxuICAgIC5kZXNjcmlwdGlvbihcIkV4cGxpY2l0bHkgc2V0IHlvdXIgYXV0aCB0b2tlblwiKVxuICAgIC5hcmd1bWVudChcIjx0b2tlbj5cIiwgXCJOZXcgdG9rZW4gdG8gbWFudWFsbHkgY29uZmlndXJlXCIpXG4gICAgLmFjdGlvbigodG9rZW4pID0+IHtcbiAgICAgIGlmICghdmFsaWRhdGVKV1RMZW5ndGgodG9rZW4pKVxuICAgICAgICByZXR1cm4gY29uc29sZS5sb2coXCJJbnZhbGlkIHRva2VuIHByb3ZpZGVkXCIpXG4gICAgICBzZXRTZXNzaW9uVG9rZW4odG9rZW4pXG4gICAgICBjb25zb2xlLmxvZyhcIlRva2VuIG1hbnVhbGx5IHVwZGF0ZWQuXCIpXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgeyBwdXNoU25pcHBldCB9IGZyb20gXCJsaWIvc2hhcmVkL3B1c2gtc25pcHBldFwiXG5pbXBvcnQgdHlwZSB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyUHVzaCA9IChwcm9ncmFtOiBDb21tYW5kKSA9PiB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcInB1c2hcIilcbiAgICAuZGVzY3JpcHRpb24oXCJTYXZlIHNuaXBwZXQgY29kZSB0byBSZWdpc3RyeSBBUElcIilcbiAgICAuYXJndW1lbnQoXCJbZmlsZV1cIiwgXCJQYXRoIHRvIHRoZSBzbmlwcGV0IGZpbGVcIilcbiAgICAuYWN0aW9uKGFzeW5jIChmaWxlUGF0aD86IHN0cmluZykgPT4ge1xuICAgICAgYXdhaXQgcHVzaFNuaXBwZXQoe1xuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgb25FeGl0OiAoY29kZSkgPT4gcHJvY2Vzcy5leGl0KGNvZGUpLFxuICAgICAgICBvbkVycm9yOiAobWVzc2FnZSkgPT4gY29uc29sZS5lcnJvcihtZXNzYWdlKSxcbiAgICAgICAgb25TdWNjZXNzOiAobWVzc2FnZSkgPT4gY29uc29sZS5sb2cobWVzc2FnZSksXG4gICAgICB9KVxuICAgIH0pXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFDQSxTQUFTLGVBQWU7OztBQ0F4QixZQUFZLFFBQVE7QUFDcEIsWUFBWSxVQUFVO0FBQ3RCLFNBQVMsZ0JBQWdCO0FBR3pCLElBQU0sdUJBQXVCLE1BQWM7QUFDekMs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QU0sVUFBVSxJQUFJLFFBQVE7QUFFbkMsUUFDRyxLQUFLLE1BQU0sRUFDWCxZQUFZLHVDQUF1QyxFQUduRCxRQUFRQyxRQUFPLElBQUksZ0JBQUksU0FBUyxPQUFPLEtBQUssZ0JBQUksT0FBTztBQUUxRCxhQUFhLE9BQU87QUFFcEIsWUFBWSxPQUFPO0FBQ25CLGNBQWMsT0FBTztBQUNyQixhQUFhLE9BQU87QUFFcEIsYUFBYSxPQUFPO0FBQ3BCLGtCQUFrQixPQUFPO0FBQ3pCLG1CQUFtQixPQUFPO0FBQzFCLHVCQUF1QixPQUFPO0FBQzlCLHFCQUFxQixPQUFPO0FBRTVCLGVBQWUsT0FBTztBQUN0QixvQkFBb0IsT0FBTztBQUUzQixlQUFlLE9BQU87QUFFdEIsSUFBSSxRQUFRLEtBQUssV0FBVyxHQUFHO0FBQzdCLGFBQVcsU0FBUyxRQUFRLElBQUk7QUFDbEMsT0FBTztBQUNMLFVBQVEsTUFBTTtBQUNoQjsiLAogICJuYW1lcyI6IFsicHJvZ3JhbSIsICJwYXRoIiwgImZzIiwgImZzIiwgInBhdGgiLCAia3kiLCAiZnMiLCAicGF0aCIsICJyZXNvbHZlIiwgInBhdGgiLCAiZnMiLCAiZnMiLCAicGF0aCIsICJmcyIsICJ0cyIsICJmcyIsICJwYXRoIiwgImt5IiwgInBhdGgiLCAia3kiLCAiZnMiLCAicHJvZ3JhbSIsICJwb3J0IiwgInJlc29sdmUiLCAic2VydmVyIiwgInByb2dyYW0iLCAia3kiLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJmcyIsICJwYXRoIiwgInByb2dyYW0iLCAia3kiLCAic2VtdmVyIiwgInBhdGgiLCAiZnMiLCAicHJvZ3JhbSIsICJwcm9ncmFtIiwgInByb2dyYW0iLCAicHJvZ3JhbSIsICJzZW12ZXIiXQp9Cg==
|