gitlab-ci-local 4.45.1 → 4.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +1 -1
- package/src/argv.js +1 -1
- package/src/commander.js +1 -1
- package/src/data-expander.js +10 -4
- package/src/executor.js +1 -1
- package/src/git-data.js +20 -1
- package/src/handler.js +1 -1
- package/src/index.js +4 -1
- package/src/job.js +89 -82
- package/src/mutex.js +1 -1
- package/src/parallel.js +1 -1
- package/src/parser-includes.js +1 -1
- package/src/parser.js +1 -1
- package/src/predefined-variables.js +8 -6
- package/src/producers.js +1 -1
- package/src/state.js +1 -1
- package/src/utils.js +8 -5
- package/src/validator.js +1 -1
- package/src/variables-from-files.js +4 -4
- package/src/write-streams.js +1 -1
package/src/job.js
CHANGED
|
@@ -82,7 +82,8 @@ class Job {
|
|
|
82
82
|
constructor(opt) {
|
|
83
83
|
const jobData = opt.data;
|
|
84
84
|
const gitData = opt.gitData;
|
|
85
|
-
const
|
|
85
|
+
const jobVariables = jobData.variables ?? {};
|
|
86
|
+
const globalVariables = opt.globalVariables ?? {};
|
|
86
87
|
const variablesFromFiles = opt.variablesFromFiles;
|
|
87
88
|
const argv = opt.argv;
|
|
88
89
|
const cwd = argv.cwd;
|
|
@@ -103,8 +104,10 @@ class Job {
|
|
|
103
104
|
this.dependencies = jobData.dependencies || null;
|
|
104
105
|
this.rules = jobData.rules || null;
|
|
105
106
|
this.environment = typeof jobData.environment === "string" ? { name: jobData.environment } : jobData.environment;
|
|
107
|
+
// Set FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR
|
|
108
|
+
globalVariables["FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR"] = argv.umask ? "false" : "true";
|
|
106
109
|
const matrixVariables = opt.matrixVariables ?? {};
|
|
107
|
-
this._variables = { ...globalVariables
|
|
110
|
+
this._variables = { ...globalVariables, ...jobVariables, ...matrixVariables, ...predefinedVariables, ...argvVariables };
|
|
108
111
|
let ciProjectDir = `${cwd}`;
|
|
109
112
|
if (this.jobData["image"]) {
|
|
110
113
|
ciProjectDir = "/gcl-builds";
|
|
@@ -127,7 +130,7 @@ class Job {
|
|
|
127
130
|
predefinedVariables["CI_NODE_INDEX"] = `${opt.nodeIndex}`;
|
|
128
131
|
predefinedVariables["CI_NODE_TOTAL"] = `${opt.nodesTotal}`;
|
|
129
132
|
predefinedVariables["CI_REGISTRY"] = `local-registry.${this.gitData.remote.host}`;
|
|
130
|
-
predefinedVariables["CI_REGISTRY_IMAGE"] = `$CI_REGISTRY/${this._variables["
|
|
133
|
+
predefinedVariables["CI_REGISTRY_IMAGE"] = `$CI_REGISTRY/${this._variables["CI_PROJECT_PATH"]}`;
|
|
131
134
|
// Find environment matched variables
|
|
132
135
|
if (this.environment) {
|
|
133
136
|
const expanded = utils_1.Utils.expandVariables(this._variables);
|
|
@@ -136,23 +139,23 @@ class Job {
|
|
|
136
139
|
}
|
|
137
140
|
const envMatchedVariables = utils_1.Utils.findEnvMatchedVariables(variablesFromFiles, this.fileVariablesDir, this.environment);
|
|
138
141
|
// Merge and expand after finding env matched variables
|
|
139
|
-
this._variables = { ...globalVariables
|
|
142
|
+
this._variables = { ...globalVariables, ...jobVariables, ...matrixVariables, ...predefinedVariables, ...envMatchedVariables, ...argvVariables };
|
|
140
143
|
// Set {when, allowFailure} based on rules result
|
|
141
144
|
if (this.rules) {
|
|
142
145
|
const ruleResult = utils_1.Utils.getRulesResult({ cwd, rules: this.rules, variables: this._variables });
|
|
143
146
|
this.when = ruleResult.when;
|
|
144
147
|
this.allowFailure = ruleResult.allowFailure;
|
|
145
|
-
this._variables = { ...globalVariables
|
|
148
|
+
this._variables = { ...globalVariables, ...jobVariables, ...ruleResult.variables, ...matrixVariables, ...predefinedVariables, ...envMatchedVariables, ...argvVariables };
|
|
146
149
|
}
|
|
147
150
|
// Delete variables the user intentionally wants unset
|
|
148
151
|
for (const unsetVariable of argv.unsetVariables) {
|
|
149
152
|
delete this._variables[unsetVariable];
|
|
150
153
|
}
|
|
151
154
|
(0, assert_1.default)(this.scripts || this.trigger, (0, chalk_1.default) `{blueBright ${this.name}} must have script specified`);
|
|
152
|
-
if (this.interactive && (this.when !== "manual" || this.imageName !== null)) {
|
|
155
|
+
if (this.interactive && (this.when !== "manual" || this.imageName(this._variables) !== null)) {
|
|
153
156
|
throw new assert_1.AssertionError({ message: `${this.formattedJobName} @Interactive decorator cannot have image: and must be when:manual` });
|
|
154
157
|
}
|
|
155
|
-
if (this.injectSSHAgent && this.imageName === null) {
|
|
158
|
+
if (this.injectSSHAgent && this.imageName(this._variables) === null) {
|
|
156
159
|
throw new assert_1.AssertionError({ message: `${this.formattedJobName} @InjectSSHAgent can only be used with image:` });
|
|
157
160
|
}
|
|
158
161
|
for (const [i, c] of Object.entries(this.cache)) {
|
|
@@ -166,7 +169,7 @@ class Job {
|
|
|
166
169
|
(0, assert_1.default)(!s.entrypoint || Array.isArray(s.entrypoint), (0, chalk_1.default) `{blue ${this.name}} services[${i}].entrypoint must be an array`);
|
|
167
170
|
}
|
|
168
171
|
(0, assert_1.default)(!this.artifacts?.paths || Array.isArray(this.artifacts.paths), (0, chalk_1.default) `{blue ${this.name}} artifacts.paths must be an array`);
|
|
169
|
-
if (this.imageName && argv.mountCache) {
|
|
172
|
+
if (this.imageName(this._variables) && argv.mountCache) {
|
|
170
173
|
const expanded = utils_1.Utils.expandVariables(this._variables);
|
|
171
174
|
for (const c of this.cache) {
|
|
172
175
|
c.paths.forEach((p) => {
|
|
@@ -208,14 +211,6 @@ class Job {
|
|
|
208
211
|
get tmpVolumeName() {
|
|
209
212
|
return `gcl-${this.safeJobName}-${this.jobId}-tmp`;
|
|
210
213
|
}
|
|
211
|
-
get imageName() {
|
|
212
|
-
const image = this.jobData["image"];
|
|
213
|
-
if (!image)
|
|
214
|
-
return null;
|
|
215
|
-
const expanded = utils_1.Utils.expandVariables(this._variables);
|
|
216
|
-
const imageName = utils_1.Utils.expandText(image.name, expanded);
|
|
217
|
-
return imageName.includes(":") ? imageName : `${imageName}:latest`;
|
|
218
|
-
}
|
|
219
214
|
get imageEntrypoint() {
|
|
220
215
|
const image = this.jobData["image"];
|
|
221
216
|
if (!image?.entrypoint) {
|
|
@@ -283,13 +278,16 @@ class Job {
|
|
|
283
278
|
}));
|
|
284
279
|
}
|
|
285
280
|
get beforeScripts() {
|
|
286
|
-
|
|
281
|
+
const beforeScripts = this.jobData["before_script"] || [];
|
|
282
|
+
return typeof beforeScripts === "string" ? [beforeScripts] : beforeScripts;
|
|
287
283
|
}
|
|
288
284
|
get afterScripts() {
|
|
289
|
-
|
|
285
|
+
const afterScripts = this.jobData["after_script"] || [];
|
|
286
|
+
return typeof afterScripts === "string" ? [afterScripts] : afterScripts;
|
|
290
287
|
}
|
|
291
288
|
get scripts() {
|
|
292
|
-
|
|
289
|
+
const script = this.jobData["script"];
|
|
290
|
+
return typeof script === "string" ? [script] : script;
|
|
293
291
|
}
|
|
294
292
|
get trigger() {
|
|
295
293
|
return this.jobData["trigger"];
|
|
@@ -319,14 +317,15 @@ class Job {
|
|
|
319
317
|
const writeStreams = this.writeStreams;
|
|
320
318
|
const reportsDotenvVariables = await this.initProducerReportsDotenvVariables(writeStreams, utils_1.Utils.expandVariables(this._variables));
|
|
321
319
|
const expanded = utils_1.Utils.expandVariables({ ...this._variables, ...reportsDotenvVariables });
|
|
320
|
+
const imageName = this.imageName(expanded);
|
|
322
321
|
const safeJobName = this.safeJobName;
|
|
323
322
|
const outputLogFilePath = `${argv.cwd}/${argv.stateDir}/output/${safeJobName}.log`;
|
|
324
323
|
await fs.ensureFile(outputLogFilePath);
|
|
325
324
|
await fs.truncate(outputLogFilePath);
|
|
326
325
|
if (!this.interactive) {
|
|
327
|
-
writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright starting} ${
|
|
326
|
+
writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright starting} ${imageName ?? "shell"} ({yellow ${this.stage}})\n`);
|
|
328
327
|
}
|
|
329
|
-
if (
|
|
328
|
+
if (imageName) {
|
|
330
329
|
const buildVolumeName = this.buildVolumeName;
|
|
331
330
|
const tmpVolumeName = this.tmpVolumeName;
|
|
332
331
|
const fileVariablesDir = this.fileVariablesDir;
|
|
@@ -338,9 +337,18 @@ class Job {
|
|
|
338
337
|
await Promise.all(volumePromises);
|
|
339
338
|
const time = process.hrtime();
|
|
340
339
|
this.refreshLongRunningSilentTimeout(writeStreams);
|
|
340
|
+
let chownOpt = "0:0";
|
|
341
|
+
let chmodOpt = "a+rw";
|
|
342
|
+
if (expanded["FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR"] === "true") {
|
|
343
|
+
const { stdout } = await utils_1.Utils.spawn(["docker", "run", "--rm", imageName, "sh", "-c", "echo \"$(id -u):$(id -g)\""]);
|
|
344
|
+
chownOpt = stdout;
|
|
345
|
+
if (chownOpt == "0:0") {
|
|
346
|
+
chmodOpt = "g-w";
|
|
347
|
+
}
|
|
348
|
+
}
|
|
341
349
|
const { stdout: containerId } = await utils_1.Utils.spawn([
|
|
342
|
-
this.argv.containerExecutable, "create", `--volume=${buildVolumeName}:/gcl-builds`, `--volume=${tmpVolumeName}:${this.fileVariablesDir}`, "docker.io/firecow/gitlab-ci-local-util",
|
|
343
|
-
"
|
|
350
|
+
this.argv.containerExecutable, "create", "--user=0:0", `--volume=${buildVolumeName}:/gcl-builds`, `--volume=${tmpVolumeName}:${this.fileVariablesDir}`, "docker.io/firecow/gitlab-ci-local-util",
|
|
351
|
+
...["sh", "-c", `chown ${chownOpt} -R /gcl-builds/ && chmod ${chmodOpt} -R /gcl-builds/ && chown ${chownOpt} -R /tmp/ && chmod ${chmodOpt} -R /tmp/`],
|
|
344
352
|
], argv.cwd);
|
|
345
353
|
this._containersToClean.push(containerId);
|
|
346
354
|
if (await fs.pathExists(fileVariablesDir)) {
|
|
@@ -358,7 +366,7 @@ class Job {
|
|
|
358
366
|
await Promise.all(this.services.map(async (service, serviceIndex) => {
|
|
359
367
|
const serviceName = service.name;
|
|
360
368
|
await this.pullImage(writeStreams, serviceName);
|
|
361
|
-
const serviceContainerId = await this.startService(writeStreams, utils_1.Utils.expandVariables({ ...expanded, ...service.variables }), service
|
|
369
|
+
const serviceContainerId = await this.startService(writeStreams, utils_1.Utils.expandVariables({ ...expanded, ...service.variables }), service);
|
|
362
370
|
const serviceContainerLogFile = `${argv.cwd}/${argv.stateDir}/services-output/${this.safeJobName}/${serviceName}-${serviceIndex}.log`;
|
|
363
371
|
await this.serviceHealthCheck(writeStreams, service, serviceIndex, serviceContainerLogFile);
|
|
364
372
|
const { stdout, stderr } = await utils_1.Utils.spawn([this.argv.containerExecutable, "logs", serviceContainerId]);
|
|
@@ -471,7 +479,7 @@ class Job {
|
|
|
471
479
|
return cmd;
|
|
472
480
|
}
|
|
473
481
|
async mountCacheCmd(writeStreams, expanded) {
|
|
474
|
-
if (this.imageName && !this.argv.mountCache)
|
|
482
|
+
if (this.imageName(expanded) && !this.argv.mountCache)
|
|
475
483
|
return [];
|
|
476
484
|
const cmd = [];
|
|
477
485
|
for (const c of this.cache) {
|
|
@@ -492,12 +500,13 @@ class Job {
|
|
|
492
500
|
const outputFilesPath = `${cwd}/${stateDir}/output/${safeJobName}.log`;
|
|
493
501
|
const buildVolumeName = this.buildVolumeName;
|
|
494
502
|
const tmpVolumeName = this.tmpVolumeName;
|
|
503
|
+
const imageName = this.imageName(expanded);
|
|
495
504
|
const writeStreams = this.writeStreams;
|
|
496
505
|
if (scripts.length === 0 || scripts[0] == null) {
|
|
497
506
|
return 0;
|
|
498
507
|
}
|
|
499
508
|
// Copy git tracked files to build folder if shell isolation enabled.
|
|
500
|
-
if (!
|
|
509
|
+
if (!imageName && this.argv.shellIsolation) {
|
|
501
510
|
await utils_1.Utils.rsyncTrackedFiles(cwd, stateDir, `${safeJobName}`);
|
|
502
511
|
}
|
|
503
512
|
if (this.interactive) {
|
|
@@ -514,16 +523,16 @@ class Job {
|
|
|
514
523
|
});
|
|
515
524
|
}
|
|
516
525
|
this.refreshLongRunningSilentTimeout(writeStreams);
|
|
517
|
-
if (
|
|
518
|
-
await this.pullImage(writeStreams,
|
|
519
|
-
let dockerCmd =
|
|
526
|
+
if (imageName) {
|
|
527
|
+
await this.pullImage(writeStreams, imageName);
|
|
528
|
+
let dockerCmd = `${this.argv.containerExecutable} create --interactive ${this.generateInjectSSHAgentOptions()} `;
|
|
520
529
|
if (this.argv.privileged) {
|
|
521
530
|
dockerCmd += "--privileged ";
|
|
522
531
|
}
|
|
523
532
|
if (this.argv.ulimit !== null) {
|
|
524
533
|
dockerCmd += `--ulimit nofile=${this.argv.ulimit} `;
|
|
525
534
|
}
|
|
526
|
-
if (
|
|
535
|
+
if (expanded["FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR"] === "false") {
|
|
527
536
|
dockerCmd += "--user 0:0 ";
|
|
528
537
|
}
|
|
529
538
|
if (this.services?.length) {
|
|
@@ -542,25 +551,25 @@ class Job {
|
|
|
542
551
|
for (const extraHost of this.argv.extraHost) {
|
|
543
552
|
dockerCmd += `--add-host=${extraHost} `;
|
|
544
553
|
}
|
|
545
|
-
const
|
|
554
|
+
for (const [key, val] of Object.entries(expanded)) {
|
|
555
|
+
dockerCmd += `-e '${key}=${val}' `;
|
|
556
|
+
}
|
|
546
557
|
if (this.imageEntrypoint) {
|
|
547
558
|
if (this.imageEntrypoint[0] == "") {
|
|
548
559
|
dockerCmd += "--entrypoint '' ";
|
|
549
560
|
}
|
|
550
561
|
else {
|
|
551
|
-
|
|
552
|
-
await fs.appendFile(entrypointFile, `${this.imageEntrypoint.join(" ")}`);
|
|
553
|
-
await fs.chmod(entrypointFile, "0755");
|
|
554
|
-
dockerCmd += "--entrypoint '/gcl-entry' ";
|
|
555
|
-
await fs.appendFile(entrypointFile, " \"$@\"\n");
|
|
556
|
-
this._filesToRm.push(entrypointFile);
|
|
562
|
+
dockerCmd += `--entrypoint ${this.imageEntrypoint[0]} `;
|
|
557
563
|
}
|
|
558
564
|
}
|
|
559
|
-
for (const key of Object.keys(expanded)) {
|
|
560
|
-
dockerCmd += `-e ${key} `;
|
|
561
|
-
}
|
|
562
565
|
dockerCmd += `${(await this.mountCacheCmd(writeStreams, expanded)).join(" ")} `;
|
|
563
|
-
dockerCmd += `${
|
|
566
|
+
dockerCmd += `${imageName} `;
|
|
567
|
+
if (this.imageEntrypoint?.length ?? 0 > 1) {
|
|
568
|
+
this.imageEntrypoint?.slice(1).forEach((e) => {
|
|
569
|
+
dockerCmd += `"${e}" `;
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
dockerCmd += "sh -c \"\n";
|
|
564
573
|
dockerCmd += "if [ -x /usr/local/bin/bash ]; then\n";
|
|
565
574
|
dockerCmd += "\texec /usr/local/bin/bash \n";
|
|
566
575
|
dockerCmd += "elif [ -x /usr/bin/bash ]; then\n";
|
|
@@ -579,7 +588,7 @@ class Job {
|
|
|
579
588
|
dockerCmd += "\techo shell not found\n";
|
|
580
589
|
dockerCmd += "\texit 1\n";
|
|
581
590
|
dockerCmd += "fi\n\"";
|
|
582
|
-
const { stdout: containerId } = await utils_1.Utils.bash(dockerCmd, cwd
|
|
591
|
+
const { stdout: containerId } = await utils_1.Utils.bash(dockerCmd, cwd);
|
|
583
592
|
this._containerId = containerId;
|
|
584
593
|
this._containersToClean.push(this._containerId);
|
|
585
594
|
}
|
|
@@ -587,7 +596,7 @@ class Job {
|
|
|
587
596
|
await this.copyArtifactsIn(writeStreams);
|
|
588
597
|
let cmd = "set -eo pipefail\n";
|
|
589
598
|
cmd += "exec 0< /dev/null\n";
|
|
590
|
-
if (!
|
|
599
|
+
if (!imageName && this.argv.shellIsolation) {
|
|
591
600
|
cmd += `cd ${stateDir}/builds/${safeJobName}/\n`;
|
|
592
601
|
}
|
|
593
602
|
cmd += this.generateScriptCommands(scripts);
|
|
@@ -596,16 +605,13 @@ class Job {
|
|
|
596
605
|
await fs.outputFile(jobScriptFile, cmd, "utf-8");
|
|
597
606
|
await fs.chmod(jobScriptFile, "0755");
|
|
598
607
|
this._filesToRm.push(jobScriptFile);
|
|
599
|
-
if (
|
|
608
|
+
if (imageName) {
|
|
600
609
|
await utils_1.Utils.spawn([this.argv.containerExecutable, "cp", `${stateDir}/scripts/${safeJobName}_${this.jobId}`, `${this._containerId}:/gcl-cmd`], cwd);
|
|
601
610
|
}
|
|
602
|
-
|
|
603
|
-
await utils_1.Utils.spawn([this.argv.containerExecutable, "cp", `${stateDir}/scripts/image_entry/${safeJobName}_${this.jobId}`, `${this._containerId}:/gcl-entry`], cwd);
|
|
604
|
-
}
|
|
605
|
-
const cp = (0, execa_1.default)(this._containerId ? `docker start --attach -i ${this._containerId}` : "bash", {
|
|
611
|
+
const cp = (0, execa_1.default)(this._containerId ? `${this.argv.containerExecutable} start --attach -i ${this._containerId}` : "bash", {
|
|
606
612
|
cwd,
|
|
607
613
|
shell: "bash",
|
|
608
|
-
env: expanded,
|
|
614
|
+
env: imageName ? process.env : expanded,
|
|
609
615
|
});
|
|
610
616
|
const outFunc = (line, stream, colorize) => {
|
|
611
617
|
this.refreshLongRunningSilentTimeout(writeStreams);
|
|
@@ -624,7 +630,7 @@ class Job {
|
|
|
624
630
|
}
|
|
625
631
|
void cp.on("exit", (code) => resolve(code ?? 0));
|
|
626
632
|
void cp.on("error", (err) => reject(err));
|
|
627
|
-
if (
|
|
633
|
+
if (imageName) {
|
|
628
634
|
cp.stdin?.end("/gcl-cmd");
|
|
629
635
|
}
|
|
630
636
|
else {
|
|
@@ -632,6 +638,14 @@ class Job {
|
|
|
632
638
|
}
|
|
633
639
|
});
|
|
634
640
|
}
|
|
641
|
+
imageName(vars = {}) {
|
|
642
|
+
const image = this.jobData["image"];
|
|
643
|
+
if (!image)
|
|
644
|
+
return null;
|
|
645
|
+
const expanded = utils_1.Utils.expandVariables(vars);
|
|
646
|
+
const imageName = utils_1.Utils.expandText(image.name, expanded);
|
|
647
|
+
return imageName.includes(":") ? imageName : `${imageName}:latest`;
|
|
648
|
+
}
|
|
635
649
|
async pullImage(writeStreams, imageToPull) {
|
|
636
650
|
try {
|
|
637
651
|
await utils_1.Utils.spawn([this.argv.containerExecutable, "image", "inspect", imageToPull]);
|
|
@@ -671,9 +685,9 @@ class Job {
|
|
|
671
685
|
return producerReportsEnvs;
|
|
672
686
|
}
|
|
673
687
|
async copyCacheIn(writeStreams, expanded) {
|
|
674
|
-
if (this.argv.mountCache && this.imageName)
|
|
688
|
+
if (this.argv.mountCache && this.imageName(expanded))
|
|
675
689
|
return;
|
|
676
|
-
if ((!this.imageName && !this.argv.shellIsolation) || this.cache.length === 0)
|
|
690
|
+
if ((!this.imageName(expanded) && !this.argv.shellIsolation) || this.cache.length === 0)
|
|
677
691
|
return;
|
|
678
692
|
const cwd = this.argv.cwd;
|
|
679
693
|
const stateDir = this.argv.stateDir;
|
|
@@ -694,7 +708,7 @@ class Job {
|
|
|
694
708
|
}
|
|
695
709
|
}
|
|
696
710
|
async copyArtifactsIn(writeStreams) {
|
|
697
|
-
if ((!this.imageName && !this.argv.shellIsolation) || (this.producers ?? []).length === 0)
|
|
711
|
+
if ((!this.imageName(this._variables) && !this.argv.shellIsolation) || (this.producers ?? []).length === 0)
|
|
698
712
|
return;
|
|
699
713
|
const cwd = this.argv.cwd;
|
|
700
714
|
const stateDir = this.argv.stateDir;
|
|
@@ -718,15 +732,15 @@ class Job {
|
|
|
718
732
|
}
|
|
719
733
|
copyIn(source) {
|
|
720
734
|
const safeJobName = this.safeJobName;
|
|
721
|
-
if (!this.imageName && this.argv.shellIsolation) {
|
|
735
|
+
if (!this.imageName(this._variables) && this.argv.shellIsolation) {
|
|
722
736
|
return utils_1.Utils.spawn(["rsync", "-a", `${source}/.`, `${this.argv.cwd}/${this.argv.stateDir}/builds/${safeJobName}`]);
|
|
723
737
|
}
|
|
724
738
|
return utils_1.Utils.spawn([this.argv.containerExecutable, "cp", `${source}/.`, `${this._containerId}:/gcl-builds`]);
|
|
725
739
|
}
|
|
726
740
|
async copyCacheOut(writeStreams, expanded, exitCode) {
|
|
727
|
-
if (this.argv.mountCache && this.imageName)
|
|
741
|
+
if (this.argv.mountCache && this.imageName(expanded))
|
|
728
742
|
return;
|
|
729
|
-
if ((!this.imageName && !this.argv.shellIsolation) || this.cache.length === 0)
|
|
743
|
+
if ((!this.imageName(expanded) && !this.argv.shellIsolation) || this.cache.length === 0)
|
|
730
744
|
return;
|
|
731
745
|
const cwd = this.argv.cwd;
|
|
732
746
|
const stateDir = this.argv.stateDir;
|
|
@@ -763,7 +777,7 @@ class Job {
|
|
|
763
777
|
const safeJobName = this.safeJobName;
|
|
764
778
|
const cwd = this.argv.cwd;
|
|
765
779
|
const stateDir = this.argv.stateDir;
|
|
766
|
-
const artifactsPath = !this.argv.shellIsolation && !this.imageName ? `${stateDir}/artifacts` : "../../artifacts";
|
|
780
|
+
const artifactsPath = !this.argv.shellIsolation && !this.imageName(expanded) ? `${stateDir}/artifacts` : "../../artifacts";
|
|
767
781
|
if (!this.artifacts)
|
|
768
782
|
return;
|
|
769
783
|
if ((this.artifacts.paths?.length ?? 0) === 0 && this.artifacts.reports?.dotenv == null)
|
|
@@ -802,7 +816,7 @@ class Job {
|
|
|
802
816
|
else {
|
|
803
817
|
writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright exported artifacts} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
|
|
804
818
|
}
|
|
805
|
-
if (this.artifactsToSource && (this.argv.shellIsolation || this.imageName)) {
|
|
819
|
+
if (this.artifactsToSource && (this.argv.shellIsolation || this.imageName(expanded))) {
|
|
806
820
|
time = process.hrtime();
|
|
807
821
|
await utils_1.Utils.spawn(["rsync", "--exclude=/.gitlab-ci-reports/", "-a", `${cwd}/${stateDir}/artifacts/${safeJobName}/.`, cwd]);
|
|
808
822
|
if (reportDotenv != null) {
|
|
@@ -817,8 +831,8 @@ class Job {
|
|
|
817
831
|
const buildVolumeName = this.buildVolumeName;
|
|
818
832
|
const cwd = this.argv.cwd;
|
|
819
833
|
await fs.mkdirp(`${cwd}/${stateDir}/${type}`);
|
|
820
|
-
if (this.imageName) {
|
|
821
|
-
const { stdout: containerId } = await utils_1.Utils.bash(
|
|
834
|
+
if (this.imageName(this._variables)) {
|
|
835
|
+
const { stdout: containerId } = await utils_1.Utils.bash(`${this.argv.containerExecutable} create -i ${dockerCmdExtras.join(" ")} -v ${buildVolumeName}:/gcl-builds/ -w /gcl-builds docker.io/firecow/gitlab-ci-local-util bash -c "${cmd}"`, cwd);
|
|
822
836
|
this._containersToClean.push(containerId);
|
|
823
837
|
await utils_1.Utils.spawn([this.argv.containerExecutable, "start", containerId, "--attach"]);
|
|
824
838
|
await utils_1.Utils.spawn([this.argv.containerExecutable, "cp", `${containerId}:/${type}/.`, `${stateDir}/${type}/.`], cwd);
|
|
@@ -855,13 +869,11 @@ class Job {
|
|
|
855
869
|
const { stdout: networkId } = await utils_1.Utils.spawn([this.argv.containerExecutable, "network", "create", `${networkName}`]);
|
|
856
870
|
this._serviceNetworkId = networkId;
|
|
857
871
|
}
|
|
858
|
-
async startService(writeStreams, expanded, service
|
|
872
|
+
async startService(writeStreams, expanded, service) {
|
|
859
873
|
const cwd = this.argv.cwd;
|
|
860
|
-
|
|
861
|
-
const safeJobName = this.safeJobName;
|
|
862
|
-
let dockerCmd = `docker create --interactive --network gitlab-ci-local-${this.jobId} `;
|
|
874
|
+
let dockerCmd = `${this.argv.containerExecutable} create --interactive --network gitlab-ci-local-${this.jobId} `;
|
|
863
875
|
this.refreshLongRunningSilentTimeout(writeStreams);
|
|
864
|
-
if (
|
|
876
|
+
if (expanded["FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR"] === "false") {
|
|
865
877
|
dockerCmd += "--user 0:0 ";
|
|
866
878
|
}
|
|
867
879
|
if (this.argv.privileged) {
|
|
@@ -885,35 +897,30 @@ class Job {
|
|
|
885
897
|
for (const alias of aliases) {
|
|
886
898
|
dockerCmd += `--network-alias=${alias} `;
|
|
887
899
|
}
|
|
888
|
-
for (const key of Object.
|
|
889
|
-
dockerCmd += `-e ${key} `;
|
|
900
|
+
for (const [key, val] of Object.entries(expanded)) {
|
|
901
|
+
dockerCmd += `-e '${key}=${val}' `;
|
|
890
902
|
}
|
|
891
903
|
const serviceEntrypoint = service.entrypoint;
|
|
892
|
-
const serviceEntrypointFile = `${cwd}/${stateDir}/scripts/services_entry/${safeJobName}_${serviceNameWithoutVersion}_${serviceIndex}_${this.jobId}`;
|
|
893
904
|
if (serviceEntrypoint) {
|
|
894
905
|
if (serviceEntrypoint[0] == "") {
|
|
895
906
|
dockerCmd += "--entrypoint '' ";
|
|
896
907
|
}
|
|
897
908
|
else {
|
|
898
|
-
|
|
899
|
-
await fs.appendFile(serviceEntrypointFile, `${serviceEntrypoint.join(" ")}`);
|
|
900
|
-
await fs.appendFile(serviceEntrypointFile, " \"$@\"\n");
|
|
901
|
-
await fs.chmod(serviceEntrypointFile, "0755");
|
|
902
|
-
this._filesToRm.push(serviceEntrypointFile);
|
|
903
|
-
dockerCmd += "--entrypoint '/gcl-entry' ";
|
|
909
|
+
dockerCmd += `--entrypoint ${serviceEntrypoint[0]} `;
|
|
904
910
|
}
|
|
905
911
|
}
|
|
906
912
|
dockerCmd += `--volume ${this.buildVolumeName}:/gcl-builds `;
|
|
907
913
|
dockerCmd += `--volume ${this.tmpVolumeName}:${this.fileVariablesDir} `;
|
|
908
914
|
dockerCmd += `${serviceName} `;
|
|
909
|
-
(
|
|
915
|
+
if (serviceEntrypoint?.length ?? 0 > 1) {
|
|
916
|
+
serviceEntrypoint?.slice(1).forEach((e) => {
|
|
917
|
+
dockerCmd += `"${e}" `;
|
|
918
|
+
});
|
|
919
|
+
}
|
|
920
|
+
(service.command ?? []).forEach((e) => dockerCmd += `"${e.replace(/\$/g, "\\$")}" `);
|
|
910
921
|
const time = process.hrtime();
|
|
911
|
-
const { stdout: containerId } = await utils_1.Utils.bash(dockerCmd, cwd
|
|
922
|
+
const { stdout: containerId } = await utils_1.Utils.bash(dockerCmd, cwd);
|
|
912
923
|
this._containersToClean.push(containerId);
|
|
913
|
-
// Copy docker entrypoint if specified for service
|
|
914
|
-
if (serviceEntrypoint && serviceEntrypoint[0] != "") {
|
|
915
|
-
await utils_1.Utils.spawn([this.argv.containerExecutable, "cp", serviceEntrypointFile, `${containerId}:/gcl-entry`]);
|
|
916
|
-
}
|
|
917
924
|
await utils_1.Utils.spawn([this.argv.containerExecutable, "start", `${containerId}`]);
|
|
918
925
|
const endTime = process.hrtime(time);
|
|
919
926
|
writeStreams.stdout((0, chalk_1.default) `${this.formattedJobName} {magentaBright started service image: ${serviceName} with aliases: ${Array.from(aliases).join(", ")}} in {magenta ${(0, pretty_hrtime_1.default)(endTime)}}\n`);
|
|
@@ -941,7 +948,7 @@ class Job {
|
|
|
941
948
|
if (!port.endsWith("/tcp"))
|
|
942
949
|
return;
|
|
943
950
|
const portNum = parseInt(port.replace("/tcp", ""));
|
|
944
|
-
const spawnCmd = [this.argv.containerExecutable, "run", "--rm", `--name=gcl-wait-for-it-${this.jobId}-${serviceIndex}-${portNum}`, "--network", `gitlab-ci-local-${this.jobId}`, "docker.io/
|
|
951
|
+
const spawnCmd = [this.argv.containerExecutable, "run", "--rm", `--name=gcl-wait-for-it-${this.jobId}-${serviceIndex}-${portNum}`, "--network", `gitlab-ci-local-${this.jobId}`, "docker.io/sumina46/wait-for-it", `${uniqueAlias}:${portNum}`, "-t", "30"];
|
|
945
952
|
return utils_1.Utils.spawn(spawnCmd);
|
|
946
953
|
}));
|
|
947
954
|
const endTime = process.hrtime(time);
|
|
@@ -980,4 +987,4 @@ async function cleanupJobResources(jobs) {
|
|
|
980
987
|
await Promise.all(promises);
|
|
981
988
|
}
|
|
982
989
|
exports.cleanupJobResources = cleanupJobResources;
|
|
983
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLCtDQUFpQztBQUNqQyw2Q0FBK0I7QUFDL0Isa0VBQXlDO0FBQ3pDLG9EQUE0QjtBQUM1QixtQ0FBOEI7QUFHOUIsaURBQThDO0FBQzlDLG1DQUE4QjtBQUU5QixrREFBMEI7QUEwQzFCLE1BQU0sYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUU7SUFDckQsSUFBSSxFQUFFLFNBQVM7SUFDZixLQUFLLEVBQUUsU0FBUztJQUNoQixJQUFJLEVBQUUsU0FBUztJQUNmLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLE1BQU0sRUFBRSxLQUFLO0NBQ2hCLENBQUMsQ0FBQztBQUVILE1BQWEsR0FBRztJQUVaLE1BQU0sQ0FBVSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFDdEMsU0FBUyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxVQUFVO1FBQ3JELFFBQVEsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVM7UUFDN0MsY0FBYyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsVUFBVTtLQUNuRCxDQUFDLENBQUM7SUFFTSxJQUFJLENBQU87SUFDWCxJQUFJLENBQVM7SUFDYixRQUFRLENBQVM7SUFDakIsWUFBWSxDQUFrQjtJQUM5QixXQUFXLENBQXNDO0lBQ2pELEtBQUssQ0FBUztJQUNkLEtBQUssQ0FNVjtJQUVLLFlBQVksQ0FBVTtJQUN0QixJQUFJLENBQVM7SUFDYixNQUFNLENBQVc7SUFDakIsV0FBVyxDQUFTO0lBQ3BCLE9BQU8sQ0FBVTtJQUVULFVBQVUsR0FBNEIsRUFBRSxDQUFDO0lBQ2xELG1CQUFtQixHQUFrQixJQUFJLENBQUM7SUFDMUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLGdCQUFnQixHQUFrQixJQUFJLENBQUM7SUFDdkMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixZQUFZLEdBQWtCLElBQUksQ0FBQztJQUNuQyxpQkFBaUIsR0FBa0IsSUFBSSxDQUFDO0lBQ3hDLHFCQUFxQixHQUFhLEVBQUUsQ0FBQztJQUNyQyx5QkFBeUIsR0FBbUIsQ0FBQyxDQUFRLENBQUM7SUFDdEQsVUFBVSxHQUFtRCxJQUFJLENBQUM7SUFDbEUsV0FBVyxHQUFrQixJQUFJLENBQUM7SUFFbEMsa0JBQWtCLEdBQWEsRUFBRSxDQUFDO0lBQ2xDLFVBQVUsR0FBYSxFQUFFLENBQUM7SUFDMUIsVUFBVSxDQUFvQjtJQUM5QixRQUFRLENBQW9CO0lBRW5CLE9BQU8sQ0FBTTtJQUNiLFlBQVksQ0FBZTtJQUU1QyxZQUFhLEdBQWU7UUFDeEIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUN6QixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQzVCLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFDNUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUM7UUFDbEQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUN0QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDL0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNwQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztRQUVwRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQzNCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDO1FBRW5DLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxZQUFZLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDO1FBQ25ELElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUM7UUFDakQsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sT0FBTyxDQUFDLFdBQVcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUUvRyxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUMsR0FBRyxlQUFlLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsR0FBRyxlQUFlLEVBQUUsR0FBRyxtQkFBbUIsRUFBRSxHQUFHLGFBQWEsRUFBQyxDQUFDO1FBRXZJLElBQUksWUFBWSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZCLFlBQVksR0FBRyxhQUFhLENBQUM7U0FDaEM7YUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDNUIsWUFBWSxHQUFHLEdBQUcsR0FBRyxJQUFJLFFBQVEsV0FBVyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDbEU7UUFFRCxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuRCxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUNyRSxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9ELG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BELG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUNwSixtQkFBbUIsQ0FBQyxjQUFjLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0RCxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFlBQVksQ0FBQztRQUNyRCxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsR0FBRyxXQUFXLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxXQUFXLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQjtRQUNqSyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLFdBQVcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLGNBQWMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFKLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzFFLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDdEssbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDeEUsbUJBQW1CLENBQUMsZUFBZSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDMUQsbUJBQW1CLENBQUMsZUFBZSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0QsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEdBQUcsa0JBQWtCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xGLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEdBQUcsZ0JBQWdCLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO1FBRXJHLHFDQUFxQztRQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsTUFBTSxRQUFRLEdBQUcsYUFBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxhQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzNFO1FBQ0QsTUFBTSxtQkFBbUIsR0FBRyxhQUFLLENBQUMsdUJBQXVCLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV2SCx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFDLEdBQUcsZUFBZSxJQUFJLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLEdBQUcsZUFBZSxFQUFFLEdBQUcsbUJBQW1CLEVBQUUsR0FBRyxtQkFBbUIsRUFBRSxHQUFHLGFBQWEsRUFBQyxDQUFDO1FBRS9KLGlEQUFpRDtRQUNqRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDWixNQUFNLFVBQVUsR0FBRyxhQUFLLENBQUMsY0FBYyxDQUFDLEVBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQztZQUM5RixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1lBQzVDLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBQyxHQUFHLGVBQWUsSUFBSSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxHQUFHLFVBQVUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxlQUFlLEVBQUUsR0FBRyxtQkFBbUIsRUFBRSxHQUFHLG1CQUFtQixFQUFFLEdBQUcsYUFBYSxFQUFDLENBQUM7U0FDM0w7UUFDRCxzREFBc0Q7UUFDdEQsS0FBSyxNQUFNLGFBQWEsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzdDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUN6QztRQUVELElBQUEsZ0JBQU0sRUFBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBQSxlQUFLLEVBQUEsZUFBZSxJQUFJLENBQUMsSUFBSSw4QkFBOEIsQ0FBQyxDQUFDO1FBRWxHLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDekUsTUFBTSxJQUFJLHVCQUFjLENBQUMsRUFBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLG9FQUFvRSxFQUFDLENBQUMsQ0FBQztTQUNySTtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRTtZQUNoRCxNQUFNLElBQUksdUJBQWMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsK0NBQStDLEVBQUMsQ0FBQyxDQUFDO1NBQ2hIO1FBRUQsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xELElBQUEsZ0JBQU0sRUFBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFBLGVBQUssRUFBQSxTQUFTLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1lBQzdJLElBQUEsZ0JBQU0sRUFBQyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFBLGVBQUssRUFBQSxTQUFTLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1lBQzNKLElBQUEsZ0JBQU0sRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFBLGVBQUssRUFBQSxTQUFTLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQzlGO1FBRUQsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JELElBQUEsZ0JBQU0sRUFBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUEsZUFBSyxFQUFBLFNBQVMsSUFBSSxDQUFDLElBQUksY0FBYyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDNUUsSUFBQSxnQkFBTSxFQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFBLGVBQUssRUFBQSxTQUFTLElBQUksQ0FBQyxJQUFJLGNBQWMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ25ILElBQUEsZ0JBQU0sRUFBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBQSxlQUFLLEVBQUEsU0FBUyxJQUFJLENBQUMsSUFBSSxjQUFjLENBQUMsK0JBQStCLENBQUMsQ0FBQztTQUMvSDtRQUVELElBQUEsZ0JBQU0sRUFBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFBLGVBQUssRUFBQSxTQUFTLElBQUksQ0FBQyxJQUFJLG9DQUFvQyxDQUFDLENBQUM7UUFFbkksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkMsTUFBTSxRQUFRLEdBQUcsYUFBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEQsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUN4QixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNsQixNQUFNLElBQUksR0FBRyxhQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDM0MsSUFBQSxnQkFBTSxFQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFBLGVBQUssRUFBQSxTQUFTLElBQUksQ0FBQyxJQUFJLCtEQUErRCxDQUFDLENBQUM7Z0JBQ3hILENBQUMsQ0FBQyxDQUFDO2FBQ047U0FDSjtJQUNMLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNqQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDZCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixPQUFPLElBQUEsdUJBQVksRUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdEM7UUFFRCxPQUFPLElBQUksQ0FBQyxVQUFVO1lBQ2xCLENBQUMsQ0FBQyxJQUFBLHVCQUFZLEVBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqQixDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDaEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQzVDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQzdFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFVCwrQ0FBK0M7UUFDL0MsT0FBTyxJQUFBLGVBQUssRUFBQSxHQUFHLGVBQWUsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztJQUN0RixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ1gsT0FBTyxhQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDZixPQUFPLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxRQUFRLENBQUM7SUFDekQsQ0FBQztJQUVELElBQUksYUFBYTtRQUNiLE9BQU8sT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQztJQUN2RCxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLGFBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sU0FBUyxHQUFHLGFBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6RCxPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLFNBQVMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsSUFBQSxnQkFBTSxFQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLG1DQUFtQyxDQUFDLENBQUM7UUFDN0UsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixNQUFNLFFBQVEsR0FBYyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFekMsS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRTtZQUNoRSxNQUFNLFFBQVEsR0FBRyxhQUFLLENBQUMsZUFBZSxDQUFDLEVBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQztZQUN0RixJQUFJLFdBQVcsR0FBRyxhQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM5RCxXQUFXLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsU0FBUyxDQUFDO1lBQ2hGLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLFVBQVUsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSTtnQkFDekMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJO2dCQUNuQyxTQUFTLEVBQUUsUUFBUTtnQkFDbkIsS0FBSyxFQUFFLGFBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUk7YUFDOUQsQ0FBQyxDQUFDO1NBQ047UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUUsVUFBa0I7UUFDOUIsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxFQUFFLHVDQUF1QyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUUsU0FBeUQ7UUFDcEUsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFLHNDQUFzQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksY0FBYztRQUNkLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxLQUFLLENBQUMsa0JBQWtCLENBQUUsR0FBVyxFQUFFLFFBQWlDLEVBQUUsR0FBUTtRQUNyRixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3hDLE9BQU8sYUFBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3ZEO1FBQ0QsT0FBTyxLQUFLLEdBQUcsTUFBTSxhQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUNqRSxPQUFPLEdBQUcsR0FBRyxJQUFJLGFBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxrQkFBa0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksb0JBQW9CO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLElBQUksQ0FBQztJQUM5RCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLElBQUksQ0FBQztJQUMvRCxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2YsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2hCLE9BQU8sdUNBQXVDLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUcsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1AsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFFckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxJQUFJLENBQUMsa0NBQWtDLENBQUMsWUFBWSxFQUFFLGFBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbkksTUFBTSxRQUFRLEdBQUcsYUFBSyxDQUFDLGVBQWUsQ0FBQyxFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLHNCQUFzQixFQUFDLENBQUMsQ0FBQztRQUN4RixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBR3JDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLFdBQVcsV0FBVyxNQUFNLENBQUM7UUFDbkYsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdkMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFckMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbkIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsNkJBQTZCLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxhQUFhLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1NBQ3pJO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN6QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUUvQyxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7WUFDMUIsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0SCxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BILElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFbEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuRCxNQUFNLEVBQUMsTUFBTSxFQUFFLFdBQVcsRUFBQyxHQUFHLE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQztnQkFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsWUFBWSxlQUFlLGNBQWMsRUFBRSxZQUFZLGFBQWEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSx3Q0FBd0M7Z0JBQ2xMLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0ZBQWdGO2FBQ2pHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxQyxJQUFJLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO2dCQUN2QyxNQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxHQUFHLGdCQUFnQixJQUFJLEVBQUUsR0FBRyxXQUFXLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEksSUFBSSxDQUFDLCtCQUErQixDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3REO1lBQ0QsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxtQkFBbUIsRUFBRSxHQUFHLFdBQVcsY0FBYyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RJLE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0YsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2RixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHlEQUF5RCxJQUFBLHVCQUFZLEVBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pJO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRTtZQUN2QixNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFFaEUsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUU7Z0JBQzlDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxhQUFLLENBQUMsZUFBZSxDQUFDLEVBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ3BKLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLG9CQUFvQixJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsSUFBSSxZQUFZLE1BQU0sQ0FBQztnQkFDdEksTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztnQkFDNUYsTUFBTSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUMsR0FBRyxNQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hHLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUM3QyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLHVCQUF1QixFQUFFLG1CQUFtQixNQUFNLHFCQUFxQixNQUFNLElBQUksQ0FBQyxDQUFDO1lBQ25ILENBQUMsQ0FBQyxDQUNMLENBQUM7U0FDTDtRQUVELE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxRQUFnQixFQUFFLFdBQW1CLEVBQUUsRUFBRTtZQUN6RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkIsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO2dCQUNmLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxXQUFXLElBQUksQ0FBQyxDQUFDO2FBQzNDO2lCQUFNO2dCQUNILFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxXQUFXLElBQUksQ0FBQyxDQUFDO2FBQzNDO1lBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDMUQsSUFBSSxRQUFRLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDcEQsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ3ZEO1lBQ0QsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsQyxDQUFDLENBQUM7UUFFRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0QsUUFBUSxDQUFDLGVBQWUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUN0QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFO1lBQ2hFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN4RyxPQUFPO1NBQ1Y7UUFFRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pHO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDOUIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsNENBQTRDLENBQUMsQ0FBQztZQUMvRixRQUFRLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDbEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtnQkFDeEYsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN2QixZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN2RztTQUNKO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLGFBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztTQUMxSDtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0I7UUFDbEIsWUFBWSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBRTdDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBRS9CLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3RDLElBQUk7Z0JBQ0EsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzVFO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1IsSUFBQSxnQkFBTSxFQUFDLENBQUMsWUFBWSxLQUFLLEVBQUUsMkJBQTJCLENBQUMsQ0FBQzthQUMzRDtTQUNKO1FBRUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDeEIsSUFBSTtnQkFDQSxNQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDcEc7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDUixJQUFBLGdCQUFNLEVBQUMsQ0FBQyxZQUFZLEtBQUssRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO2FBQzNEO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZDLElBQUk7Z0JBQ0EsS0FBSyxNQUFNLGVBQWUsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7b0JBQ3RELE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDNUY7YUFDSjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNSLElBQUEsZ0JBQU0sRUFBQyxDQUFDLFlBQVksS0FBSyxFQUFFLDJCQUEyQixDQUFDLENBQUM7YUFDM0Q7U0FDSjtRQUVELE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUN0QixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDaEMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQztTQUNoRTtRQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU5QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvQyxJQUFJO1lBQ0EsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztTQUNqRTtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1IsSUFBQSxnQkFBTSxFQUFDLENBQUMsWUFBWSxLQUFLLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztTQUMzRDtJQUNMLENBQUM7SUFFTyw2QkFBNkI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdEIsT0FBTyxFQUFFLENBQUM7U0FDYjtRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsRUFBRTtZQUMzRSxPQUFPLDJIQUEySCxDQUFDO1NBQ3RJO1FBQ0QsT0FBTyx1QkFBdUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzSCxDQUFDO0lBRU8sc0JBQXNCLENBQUUsT0FBaUI7UUFDN0MsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3ZCLGlDQUFpQztZQUNqQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hGLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzRixHQUFHLElBQUksSUFBQSxlQUFLLEVBQUEsa0JBQWtCLElBQUksR0FBRyxhQUFhLE1BQU0sQ0FBQztZQUV6RCx3QkFBd0I7WUFDeEIsR0FBRyxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFFLFlBQTBCLEVBQUUsUUFBaUM7UUFDdEYsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFdkQsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUN4QixNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RGLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLE1BQU0sSUFBSSxHQUFHLGFBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMzQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLEdBQUcsSUFBSSxDQUFDLGdCQUFnQiw0Q0FBNEMsSUFBSSxJQUFJLENBQUMsQ0FBQztnQkFDdkcsTUFBTSxVQUFVLEdBQUcsYUFBSyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sUUFBUSxDQUFDLG9CQUFvQixJQUFJLGVBQWUsRUFBRSxDQUFDLENBQUM7Z0JBQ3JHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsVUFBVSxnQkFBZ0IsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN4RCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVcsQ0FBRSxPQUFpQixFQUFFLFFBQWlDO1FBQzNFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3BDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckMsTUFBTSxlQUFlLEdBQUcsR0FBRyxHQUFHLElBQUksUUFBUSxXQUFXLFdBQVcsTUFBTSxDQUFDO1FBQ3ZFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN6QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRXZDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtZQUM1QyxPQUFPLENBQUMsQ0FBQztTQUNaO1FBRUQscUVBQXFFO1FBQ3JFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzdDLE1BQU0sYUFBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsRCxNQUFNLGFBQWEsR0FBRyxJQUFBLGVBQUssRUFBQyxJQUFJLEVBQUU7Z0JBQzlCLEdBQUc7Z0JBQ0gsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7Z0JBQ3hDLEdBQUcsRUFBRSxFQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBQzthQUNyQyxDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksT0FBTyxDQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUMzQyxLQUFLLGFBQWEsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELEtBQUssYUFBYSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3pELENBQUMsQ0FBQyxDQUFDO1NBQ047UUFFRCxJQUFJLENBQUMsK0JBQStCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFbkQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRW5ELElBQUksU0FBUyxHQUFHLCtCQUErQixJQUFJLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxDQUFDO1lBQ3ZGLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3RCLFNBQVMsSUFBSSxlQUFlLENBQUM7YUFDaEM7WUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtnQkFDM0IsU0FBUyxJQUFJLG1CQUFtQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO2FBQ3ZEO1lBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDakIsU0FBUyxJQUFJLGFBQWEsQ0FBQzthQUM5QjtZQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUU7Z0JBQ3ZCLFNBQVMsSUFBSSw2QkFBNkIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDO2dCQUN4RCxTQUFTLElBQUksd0JBQXdCLENBQUM7YUFDekM7WUFFRCxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNyQyxTQUFTLElBQUksYUFBYSxPQUFPLEdBQUcsQ0FBQzthQUN4QztZQUVELFNBQVMsSUFBSSxZQUFZLGVBQWUsZUFBZSxDQUFDO1lBQ3hELFNBQVMsSUFBSSxZQUFZLGFBQWEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQztZQUNuRSxTQUFTLElBQUksd0JBQXdCLENBQUM7WUFFdEMsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDbkMsU0FBUyxJQUFJLFlBQVksTUFBTSxHQUFHLENBQUM7YUFDdEM7WUFFRCxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUN6QyxTQUFTLElBQUksY0FBYyxTQUFTLEdBQUcsQ0FBQzthQUMzQztZQUVELE1BQU0sY0FBYyxHQUFHLEdBQUcsR0FBRyxJQUFJLFFBQVEsd0JBQXdCLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0YsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN0QixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUMvQixTQUFTLElBQUksa0JBQWtCLENBQUM7aUJBQ25DO3FCQUFNO29CQUNILE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUM7b0JBQ25ELE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3pFLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ3ZDLFNBQVMsSUFBSSw0QkFBNEIsQ0FBQztvQkFDMUMsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztvQkFDakQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQ3hDO2FBQ0o7WUFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3JDLFNBQVMsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO2FBQzdCO1lBRUQsU0FBUyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDaEYsU0FBUyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsWUFBWSxDQUFDO1lBQzNDLFNBQVMsSUFBSSx1Q0FBdUMsQ0FBQztZQUNyRCxTQUFTLElBQUksK0JBQStCLENBQUM7WUFDN0MsU0FBUyxJQUFJLG1DQUFtQyxDQUFDO1lBQ2pELFNBQVMsSUFBSSx5QkFBeUIsQ0FBQztZQUN2QyxTQUFTLElBQUksK0JBQStCLENBQUM7WUFDN0MsU0FBUyxJQUFJLHFCQUFxQixDQUFDO1lBQ25DLFNBQVMsSUFBSSx1Q0FBdUMsQ0FBQztZQUNyRCxTQUFTLElBQUksNkJBQTZCLENBQUM7WUFDM0MsU0FBUyxJQUFJLGlDQUFpQyxDQUFDO1lBQy9DLFNBQVMsSUFBSSx1QkFBdUIsQ0FBQztZQUNyQyxTQUFTLElBQUksNkJBQTZCLENBQUM7WUFDM0MsU0FBUyxJQUFJLG1CQUFtQixDQUFDO1lBQ2pDLFNBQVMsSUFBSSxpQ0FBaUMsQ0FBQztZQUMvQyxTQUFTLElBQUksdUJBQXVCLENBQUM7WUFDckMsU0FBUyxJQUFJLFFBQVEsQ0FBQztZQUN0QixTQUFTLElBQUksMEJBQTBCLENBQUM7WUFDeEMsU0FBUyxJQUFJLFlBQVksQ0FBQztZQUMxQixTQUFTLElBQUksUUFBUSxDQUFDO1lBRXRCLE1BQU0sRUFBQyxNQUFNLEVBQUUsV0FBVyxFQUFDLEdBQUcsTUFBTSxhQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7WUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDbkQ7UUFFRCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV6QyxJQUFJLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQztRQUMvQixHQUFHLElBQUkscUJBQXFCLENBQUM7UUFFN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDN0MsR0FBRyxJQUFJLE1BQU0sUUFBUSxXQUFXLFdBQVcsS0FBSyxDQUFDO1NBQ3BEO1FBQ0QsR0FBRyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU1QyxHQUFHLElBQUksVUFBVSxDQUFDO1FBRWxCLE1BQU0sYUFBYSxHQUFHLEdBQUcsR0FBRyxJQUFJLFFBQVEsWUFBWSxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hGLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFcEMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLEdBQUcsUUFBUSxZQUFZLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxXQUFXLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUN0SjtRQUNELElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2RCxNQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxHQUFHLFFBQVEsd0JBQXdCLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxhQUFhLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNwSztRQUVELE1BQU0sRUFBRSxHQUFHLElBQUEsZUFBSyxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtZQUMzRixHQUFHO1lBQ0gsS0FBSyxFQUFFLE1BQU07WUFDYixHQUFHLEVBQUUsUUFBUTtTQUNoQixDQUFDLENBQUM7UUFFSCxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQVksRUFBRSxNQUE2QixFQUFFLFFBQWlDLEVBQUUsRUFBRTtZQUMvRixJQUFJLENBQUMsK0JBQStCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDakMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUMvQjtZQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7WUFDcEIsRUFBRSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQztRQUVGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRTlCLE9BQU8sTUFBTSxJQUFJLE9BQU8sQ0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNqRCxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNSLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUEsZ0JBQU0sR0FBRSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBQSxlQUFLLEVBQUEsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUksRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBQSxnQkFBTSxHQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLGVBQUssRUFBQSxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMzSTtZQUNELEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRCxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUUxQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2hCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzdCO2lCQUFNO2dCQUNILEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssUUFBUSxZQUFZLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUN2RTtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLEtBQUssQ0FBQyxTQUFTLENBQUUsWUFBMEIsRUFBRSxXQUFtQjtRQUNwRSxJQUFJO1lBQ0EsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDdkY7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNiLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM5QixNQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsMkJBQTJCLFdBQVcsZ0JBQWdCLElBQUEsdUJBQVksRUFBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkksSUFBSSxDQUFDLCtCQUErQixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3REO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBRSxZQUEwQixFQUFFLFFBQWlDO1FBQzNHLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDakMsSUFBSSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDN0IsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLElBQUksRUFBRSxFQUFFO1lBQ3BDLE1BQU0sY0FBYyxHQUFHLGFBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNuRSxJQUFJLGNBQWMsS0FBSyxJQUFJO2dCQUFFLFNBQVM7WUFFdEMsTUFBTSxnQkFBZ0IsR0FBRyxhQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9ELE1BQU0sWUFBWSxHQUFHLEdBQUcsR0FBRyxJQUFJLFFBQVEsY0FBYyxnQkFBZ0IsNkJBQTZCLENBQUM7WUFDbkcsSUFBSSxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ25DLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0RyxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRTtvQkFDbEMsSUFBSSxVQUFVLElBQUksRUFBRTt3QkFBRSxTQUFTO29CQUMvQixNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsWUFBWSxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDM0YsbUJBQW1CLEdBQUcsRUFBQyxHQUFHLG1CQUFtQixFQUFFLEdBQUcsaUJBQWlCLEVBQUMsQ0FBQztpQkFDeEU7YUFDSjtpQkFBTTtnQkFDSCxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLEdBQUcsSUFBSSxDQUFDLGdCQUFnQix3Q0FBd0MsUUFBUSxDQUFDLElBQUkseUJBQXlCLENBQUMsQ0FBQzthQUNwSTtTQUVKO1FBQ0QsT0FBTyxtQkFBbUIsQ0FBQztJQUMvQixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVcsQ0FBRSxZQUEwQixFQUFFLFFBQWlDO1FBQ3BGLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQ25ELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBRXRGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRXBDLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUN4QixJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQUUsT0FBTztZQUV0RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEUsTUFBTSxXQUFXLEdBQUcsR0FBRyxHQUFHLElBQUksUUFBUSxVQUFVLFNBQVMsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ25DLFNBQVM7YUFDWjtZQUVELE1BQU0sYUFBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3hDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNuQyxDQUFDLENBQUMsQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsbUNBQW1DLFNBQVMsa0JBQWtCLElBQUEsdUJBQVksRUFBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDOUk7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FBRSxZQUEwQjtRQUNyRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBRWxHLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM5QixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRTtZQUN6QyxNQUFNLGdCQUFnQixHQUFHLGFBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0QsTUFBTSxjQUFjLEdBQUcsR0FBRyxHQUFHLElBQUksUUFBUSxjQUFjLGdCQUFnQixFQUFFLENBQUM7WUFDMUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRTtnQkFDdEMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ25DO1lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2pELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3RCLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHVDQUF1QyxnQkFBZ0IsZ0JBQWdCLENBQUMsQ0FBQzthQUM3SDtZQUVELFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsbURBQW1ELElBQUEsdUJBQVksRUFBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEksQ0FBQztJQUVELE1BQU0sQ0FBRSxNQUFjO1FBQ2xCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDN0MsT0FBTyxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLFdBQVcsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3RIO1FBQ0QsT0FBTyxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDakgsQ0FBQztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUUsWUFBMEIsRUFBRSxRQUFpQyxFQUFFLFFBQWdCO1FBQ3ZHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQ25ELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBRXRGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRXBDLElBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQztRQUNsQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDeEIsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUFFLE9BQU87WUFDdEQsSUFBSSxZQUFZLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxRQUFRLElBQUksQ0FBQztnQkFBRSxPQUFPO1lBQ3JELElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksUUFBUSxLQUFLLENBQUM7Z0JBQUUsT0FBTztZQUN0RCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0RSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3hCLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sWUFBWSxHQUFHLGFBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxjQUFjLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDakcsSUFBSSxHQUFHLEdBQUcsc0NBQXNDLENBQUM7Z0JBQ2pELEdBQUcsSUFBSSx3QkFBd0IsU0FBUyxJQUFJLENBQUM7Z0JBQzdDLEdBQUcsSUFBSSxhQUFhLFlBQVksZ0JBQWdCLFNBQVMsY0FBYyxDQUFDO2dCQUV4RSxNQUFNLGFBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUN4QyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ25ELENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUUvQixNQUFNLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxRQUFRLFVBQVUsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDcEYsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDdEIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsdUNBQXVDLElBQUksUUFBUSxDQUFDLENBQUM7aUJBQ3pHO3FCQUFNO29CQUNILFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGtDQUFrQyxZQUFZLEtBQUssU0FBUyxrQkFBa0IsSUFBQSx1QkFBWSxFQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDOUo7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBRSxZQUEwQixFQUFFLFFBQWlDO1FBQ3pGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDcEMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO1FBRWpILElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLElBQUk7WUFBRSxPQUFPO1FBRWhHLElBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQztRQUNsQixJQUFJLEtBQUssR0FBRyxzQ0FBc0MsQ0FBQztRQUNuRCxLQUFLLElBQUksWUFBWSxhQUFhLElBQUksV0FBVyxJQUFJLENBQUM7UUFDdEQsS0FBSyxJQUFJLDRDQUE0QyxDQUFDO1FBQ3RELEtBQUssTUFBTSxtQkFBbUIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sSUFBSSxFQUFFLEVBQUU7WUFDN0QsTUFBTSxZQUFZLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsY0FBYyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEgsS0FBSyxJQUFJLGNBQWMsWUFBWSxJQUFJLENBQUM7U0FDM0M7UUFDRCxLQUFLLE1BQU0sWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRTtZQUNwRCxNQUFNLFlBQVksR0FBRyxhQUFLLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsY0FBYyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekcsS0FBSyxJQUFJLEdBQUcsWUFBWSxHQUFHLENBQUM7U0FDL0I7UUFDRCxLQUFLLElBQUksR0FBRyxhQUFhLElBQUksV0FBVyxjQUFjLENBQUM7UUFDdkQsTUFBTSxZQUFZLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hGLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtZQUN0QixLQUFLLElBQUksWUFBWSxhQUFhLElBQUksV0FBVyw4QkFBOEIsQ0FBQztZQUNoRixLQUFLLElBQUksV0FBVyxZQUFZLFlBQVksQ0FBQztZQUM3QyxLQUFLLElBQUksZUFBZSxZQUFZLElBQUksYUFBYSxJQUFJLFdBQVcsZ0NBQWdDLENBQUM7WUFDckcsS0FBSyxJQUFJLE1BQU0sQ0FBQztTQUNuQjtRQUVELElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDbEUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0IsSUFBSSxZQUFZLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxJQUFJLFFBQVEsY0FBYyxXQUFXLDhCQUE4QixZQUFZLEVBQUUsQ0FBQyxFQUFFO1lBQ3ZJLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHFDQUFxQyxZQUFZLHlCQUF5QixDQUFDLENBQUM7U0FDaEk7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksUUFBUSxjQUFjLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDaEYsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN0QixZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLEdBQUcsSUFBSSxDQUFDLGdCQUFnQiwyQ0FBMkMsQ0FBQyxDQUFDO1NBQ2pHO2FBQU07WUFDSCxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixtREFBbUQsSUFBQSx1QkFBWSxFQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNuSTtRQUVELElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3hFLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsSUFBSSxRQUFRLGNBQWMsV0FBVyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzSCxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7Z0JBQ3RCLE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLElBQUksUUFBUSxjQUFjLFdBQVcsOEJBQThCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUN0SDtZQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHdEQUF3RCxJQUFBLHVCQUFZLEVBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3hJO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQUUsR0FBVyxFQUFFLFFBQWdCLEVBQUUsSUFBMkIsRUFBRSxlQUF5QjtRQUN4RyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3JDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFFMUIsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTlDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixNQUFNLEVBQUMsTUFBTSxFQUFFLFdBQVcsRUFBQyxHQUFHLE1BQU0sYUFBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxlQUFlLGdGQUFnRixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3JGLE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLEdBQUcsV0FBVyxLQUFLLElBQUksSUFBSSxFQUFFLEdBQUcsUUFBUSxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDdkg7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ2pDLE1BQU0sYUFBSyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLElBQUksUUFBUSxXQUFXLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDakc7YUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDbEMsTUFBTSxhQUFLLENBQUMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDL0Q7SUFDTCxDQUFDO0lBRU8sK0JBQStCLENBQUUsWUFBMEI7UUFDL0QsWUFBWSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQzdDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLDhCQUE4QixDQUFDLENBQUM7WUFDakYsSUFBSSxDQUFDLCtCQUErQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZELENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNkLENBQUM7SUFFTyxlQUFlLENBQUUsSUFBWSxFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQUUsYUFBYSxHQUFHLEVBQUU7UUFDdEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0MsSUFBSSxPQUFPLEVBQUU7WUFDVCxPQUFPLElBQUEsZUFBSyxFQUFBLEdBQUcsV0FBVyxnQ0FBZ0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLGFBQWEsRUFBRSxDQUFDO1NBQ2pHO1FBRUQsT0FBTyxJQUFBLGVBQUssRUFBQSxHQUFHLFdBQVcsdUJBQXVCLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxhQUFhLEVBQUUsQ0FBQztJQUMxRixDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVPLGlCQUFpQjtRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IseUNBQXlDLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQztJQUN4RyxDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUFFLFdBQW1CO1FBQ2xELE1BQU0sRUFBQyxNQUFNLEVBQUUsU0FBUyxFQUFDLEdBQUcsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RILElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7SUFDdkMsQ0FBQztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUUsWUFBMEIsRUFBRSxRQUFpQyxFQUFFLE9BQWdCLEVBQUUsWUFBb0I7UUFDN0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDcEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLFNBQVMsR0FBRyx5REFBeUQsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDO1FBQ3ZGLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVuRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2pCLFNBQVMsSUFBSSxhQUFhLENBQUM7U0FDOUI7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3RCLFNBQVMsSUFBSSxlQUFlLENBQUM7U0FDaEM7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUMzQixTQUFTLElBQUksbUJBQW1CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7U0FDdkQ7UUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ25DLFNBQVMsSUFBSSxZQUFZLE1BQU0sR0FBRyxDQUFDO1NBQ3RDO1FBRUQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNuQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ2pDLE1BQU0seUJBQXlCLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekUsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM1RCxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM3RCxJQUFJLFlBQVksRUFBRTtZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDN0I7UUFFRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRTtZQUN6QixTQUFTLElBQUksbUJBQW1CLEtBQUssR0FBRyxDQUFDO1NBQzVDO1FBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JDLFNBQVMsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO1NBQzdCO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQzdDLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxHQUFHLElBQUksUUFBUSwyQkFBMkIsV0FBVyxJQUFJLHlCQUF5QixJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEosSUFBSSxpQkFBaUIsRUFBRTtZQUNuQixJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDNUIsU0FBUyxJQUFJLGtCQUFrQixDQUFDO2FBQ25DO2lCQUFNO2dCQUNILE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDMUQsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0UsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLHFCQUFxQixFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQzVDLFNBQVMsSUFBSSw0QkFBNEIsQ0FBQzthQUM3QztTQUNKO1FBQ0QsU0FBUyxJQUFJLFlBQVksSUFBSSxDQUFDLGVBQWUsZUFBZSxDQUFDO1FBQzdELFNBQVMsSUFBSSxZQUFZLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUM7UUFDeEUsU0FBUyxJQUFJLEdBQUcsV0FBVyxHQUFHLENBQUM7UUFFL0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFOUIsTUFBTSxFQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUMsR0FBRyxNQUFNLGFBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTFDLGtEQUFrRDtRQUNsRCxJQUFJLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNqRCxNQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxHQUFHLFdBQVcsYUFBYSxDQUFDLENBQUMsQ0FBQztTQUNoSDtRQUVELE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTlFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsMENBQTBDLFdBQVcsa0JBQWtCLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBQSx1QkFBWSxFQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVuTSxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRU8sS0FBSyxDQUFDLGtCQUFrQixDQUFFLFlBQTBCLEVBQUUsT0FBZ0IsRUFBRSxZQUFvQixFQUFFLHNCQUE4QjtRQUNoSSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ25DLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFFakMsTUFBTSxFQUFDLE1BQU0sRUFBQyxHQUFHLE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3JHLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFeEMsZ0ZBQWdGO1FBQ2hGLE1BQU0seUJBQXlCLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekUsTUFBTSxPQUFPLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsSCxJQUFJLFlBQVksRUFBRTtZQUNkLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDOUI7UUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzFELE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsNkNBQTZDLFdBQVcsS0FBSyxDQUFDLENBQUM7U0FDMUg7UUFFRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDOUIsSUFBSTtZQUNBLCtFQUErRTtZQUMvRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUM1RSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7b0JBQUUsT0FBTztnQkFDbkMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLDBCQUEwQixJQUFJLENBQUMsS0FBSyxJQUFJLFlBQVksSUFBSSxPQUFPLEVBQUUsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxnQ0FBZ0MsRUFBRSxHQUFHLFdBQVcsSUFBSSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzVQLE9BQU8sYUFBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ0osTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixnQ0FBZ0MsV0FBVyxpQ0FBaUMsSUFBQSx1QkFBWSxFQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM3SjtRQUFDLE9BQU8sQ0FBTSxFQUFFO1lBQ2IsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLGNBQWMsQ0FBQztnQkFBRSxNQUFNLENBQUMsQ0FBQztZQUM1QyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQWtCLEVBQUUsRUFBRTtnQkFDcEMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsOEJBQThCLFdBQVcsd0JBQXdCLENBQUMsQ0FBQztnQkFDcEgsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUU7b0JBQ3pELFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGlCQUFpQixJQUFJLEtBQUssQ0FBQyxDQUFDO2dCQUNqRixDQUFDLENBQUMsQ0FBQztnQkFDSCxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLEdBQUcsSUFBSSxDQUFDLGdCQUFnQix5QkFBeUIsc0JBQXNCLE1BQU0sQ0FBQyxDQUFDO1lBQzVHLENBQUMsQ0FBQyxDQUFDO1NBQ047Z0JBQVM7WUFDTixpRUFBaUU7WUFDakUsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDbkYsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO29CQUFFLE9BQU87Z0JBQ25DLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxPQUFPLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsbUJBQW1CLElBQUksQ0FBQyxLQUFLLElBQUksWUFBWSxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ1A7SUFDTCxDQUFDOztBQXhpQ0wsa0JBeWlDQztBQUVNLEtBQUssVUFBVSxtQkFBbUIsQ0FBRSxJQUFvQjtJQUMzRCxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU87SUFDbEIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztLQUN6QztJQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBUEQsa0RBT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgKiBhcyBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgcHJldHR5SHJ0aW1lIGZyb20gXCJwcmV0dHktaHJ0aW1lXCI7XG5pbXBvcnQgc3BsaXQyIGZyb20gXCJzcGxpdDJcIjtcbmltcG9ydCB7VXRpbHN9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1dyaXRlU3RyZWFtc30gZnJvbSBcIi4vd3JpdGUtc3RyZWFtc1wiO1xuaW1wb3J0IHtHaXREYXRhfSBmcm9tIFwiLi9naXQtZGF0YVwiO1xuaW1wb3J0IGFzc2VydCwge0Fzc2VydGlvbkVycm9yfSBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQge011dGV4fSBmcm9tIFwiLi9tdXRleFwiO1xuaW1wb3J0IHtBcmd2fSBmcm9tIFwiLi9hcmd2XCI7XG5pbXBvcnQgZXhlY2EgZnJvbSBcImV4ZWNhXCI7XG5pbXBvcnQge0NJQ0RWYXJpYWJsZX0gZnJvbSBcIi4vdmFyaWFibGVzLWZyb20tZmlsZXNcIjtcblxuaW50ZXJmYWNlIEpvYk9wdGlvbnMge1xuICAgIGFyZ3Y6IEFyZ3Y7XG4gICAgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXM7XG4gICAgZGF0YTogYW55O1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBiYXNlTmFtZTogc3RyaW5nO1xuICAgIHBpcGVsaW5lSWlkOiBudW1iZXI7XG4gICAgZ2l0RGF0YTogR2l0RGF0YTtcbiAgICBnbG9iYWxWYXJpYWJsZXM6IHtbbmFtZTogc3RyaW5nXTogc3RyaW5nfTtcbiAgICB2YXJpYWJsZXNGcm9tRmlsZXM6IHtbbmFtZTogc3RyaW5nXTogQ0lDRFZhcmlhYmxlfTtcbiAgICBwcmVkZWZpbmVkVmFyaWFibGVzOiB7W25hbWU6IHN0cmluZ106IGFueX07XG4gICAgbWF0cml4VmFyaWFibGVzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSB8IG51bGw7XG4gICAgbm9kZUluZGV4OiBudW1iZXIgfCBudWxsO1xuICAgIG5vZGVzVG90YWw6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIENhY2hlIHtcbiAgICBwb2xpY3k6IFwicHVsbFwiIHwgXCJwdWxsLXB1c2hcIiB8IFwicHVzaFwiO1xuICAgIGtleTogc3RyaW5nIHwge2ZpbGVzOiBzdHJpbmdbXX07XG4gICAgcGF0aHM6IHN0cmluZ1tdO1xuICAgIHdoZW46IFwib25fc3VjY2Vzc1wiIHwgXCJvbl9mYWlsdXJlXCIgfCBcImFsd2F5c1wiO1xufVxuXG5pbnRlcmZhY2UgU2VydmljZSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGVudHJ5cG9pbnQ6IHN0cmluZ1tdIHwgbnVsbDtcbiAgICBjb21tYW5kOiBzdHJpbmdbXSB8IG51bGw7XG4gICAgYWxpYXM6IHN0cmluZyB8IG51bGw7XG4gICAgdmFyaWFibGVzOiB7W25hbWU6IHN0cmluZ106IHN0cmluZ307XG59XG5cbmludGVyZmFjZSBOZWVkIHtcbiAgICBqb2I6IHN0cmluZztcbiAgICBhcnRpZmFjdHM6IGJvb2xlYW47XG4gICAgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcGlwZWxpbmU6IHN0cmluZyB8IG51bGw7XG4gICAgcHJvamVjdDogc3RyaW5nIHwgbnVsbDtcbn1cblxuY29uc3QgZGF0ZUZvcm1hdHRlciA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHVuZGVmaW5lZCwge1xuICAgIHllYXI6IHVuZGVmaW5lZCxcbiAgICBtb250aDogdW5kZWZpbmVkLFxuICAgIGhvdXI6IFwibnVtZXJpY1wiLFxuICAgIG1pbnV0ZTogXCJudW1lcmljXCIsXG4gICAgc2Vjb25kOiBcIm51bWVyaWNcIixcbiAgICBob3VyMTI6IGZhbHNlLFxufSk7XG5cbmV4cG9ydCBjbGFzcyBKb2Ige1xuXG4gICAgc3RhdGljIHJlYWRvbmx5IGlsbGVnYWxKb2JOYW1lcyA9IG5ldyBTZXQoW1xuICAgICAgICBcImluY2x1ZGVcIiwgXCJsb2NhbF9jb25maWd1cmF0aW9uXCIsIFwiaW1hZ2VcIiwgXCJzZXJ2aWNlc1wiLFxuICAgICAgICBcInN0YWdlc1wiLCBcInR5cGVzXCIsIFwiYmVmb3JlX3NjcmlwdFwiLCBcImRlZmF1bHRcIixcbiAgICAgICAgXCJhZnRlcl9zY3JpcHRcIiwgXCJ2YXJpYWJsZXNcIiwgXCJjYWNoZVwiLCBcIndvcmtmbG93XCIsXG4gICAgXSk7XG5cbiAgICByZWFkb25seSBhcmd2OiBBcmd2O1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICByZWFkb25seSBiYXNlTmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGRlcGVuZGVuY2llczogc3RyaW5nW10gfCBudWxsO1xuICAgIHJlYWRvbmx5IGVudmlyb25tZW50Pzoge25hbWU6IHN0cmluZzsgdXJsOiBzdHJpbmcgfCBudWxsfTtcbiAgICByZWFkb25seSBqb2JJZDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHJ1bGVzPzoge1xuICAgICAgICBpZjogc3RyaW5nO1xuICAgICAgICB3aGVuOiBzdHJpbmc7XG4gICAgICAgIGV4aXN0czogc3RyaW5nW107XG4gICAgICAgIGFsbG93X2ZhaWx1cmU6IGJvb2xlYW47XG4gICAgICAgIHZhcmlhYmxlczoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gICAgfVtdO1xuXG4gICAgcmVhZG9ubHkgYWxsb3dGYWlsdXJlOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHdoZW46IHN0cmluZztcbiAgICByZWFkb25seSBleGlzdHM6IHN0cmluZ1tdO1xuICAgIHJlYWRvbmx5IHBpcGVsaW5lSWlkOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgZ2l0RGF0YTogR2l0RGF0YTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ZhcmlhYmxlczoge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7fTtcbiAgICBwcml2YXRlIF9wcmVzY3JpcHRzRXhpdENvZGU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2FmdGVyU2NyaXB0c0V4aXRDb2RlID0gMDtcbiAgICBwcml2YXRlIF9jb3ZlcmFnZVBlcmNlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX3J1bm5pbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jb250YWluZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfc2VydmljZU5ldHdvcmtJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfY29udGFpbmVyVm9sdW1lTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBfbG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0OiBOb2RlSlMuVGltZW91dCA9IC0xIGFzIGFueTtcbiAgICBwcml2YXRlIF9wcm9kdWNlcnM6IHtuYW1lOiBzdHJpbmc7IGRvdGVudjogc3RyaW5nIHwgbnVsbH1bXSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2pvYk5hbWVQYWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyc1RvQ2xlYW46IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBfZmlsZXNUb1JtOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX3N0YXJ0VGltZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgcHJpdmF0ZSBfZW5kVGltZT86IFtudW1iZXIsIG51bWJlcl07XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGpvYkRhdGE6IGFueTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zO1xuXG4gICAgY29uc3RydWN0b3IgKG9wdDogSm9iT3B0aW9ucykge1xuICAgICAgICBjb25zdCBqb2JEYXRhID0gb3B0LmRhdGE7XG4gICAgICAgIGNvbnN0IGdpdERhdGEgPSBvcHQuZ2l0RGF0YTtcbiAgICAgICAgY29uc3QgZ2xvYmFsVmFyaWFibGVzID0gb3B0Lmdsb2JhbFZhcmlhYmxlcztcbiAgICAgICAgY29uc3QgdmFyaWFibGVzRnJvbUZpbGVzID0gb3B0LnZhcmlhYmxlc0Zyb21GaWxlcztcbiAgICAgICAgY29uc3QgYXJndiA9IG9wdC5hcmd2O1xuICAgICAgICBjb25zdCBjd2QgPSBhcmd2LmN3ZDtcbiAgICAgICAgY29uc3Qgc3RhdGVEaXIgPSBhcmd2LnN0YXRlRGlyO1xuICAgICAgICBjb25zdCBhcmd2VmFyaWFibGVzID0gYXJndi52YXJpYWJsZTtcbiAgICAgICAgY29uc3QgcHJlZGVmaW5lZFZhcmlhYmxlcyA9IG9wdC5wcmVkZWZpbmVkVmFyaWFibGVzO1xuXG4gICAgICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgICAgIHRoaXMud3JpdGVTdHJlYW1zID0gb3B0LndyaXRlU3RyZWFtcztcbiAgICAgICAgdGhpcy5naXREYXRhID0gb3B0LmdpdERhdGE7XG4gICAgICAgIHRoaXMubmFtZSA9IG9wdC5uYW1lO1xuICAgICAgICB0aGlzLmJhc2VOYW1lID0gb3B0LmJhc2VOYW1lO1xuICAgICAgICB0aGlzLmpvYklkID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMCk7XG4gICAgICAgIHRoaXMuam9iRGF0YSA9IG9wdC5kYXRhO1xuICAgICAgICB0aGlzLnBpcGVsaW5lSWlkID0gb3B0LnBpcGVsaW5lSWlkO1xuXG4gICAgICAgIHRoaXMud2hlbiA9IGpvYkRhdGEud2hlbiB8fCBcIm9uX3N1Y2Nlc3NcIjtcbiAgICAgICAgdGhpcy5leGlzdHMgPSBqb2JEYXRhLmV4aXN0cyB8fCBbXTtcbiAgICAgICAgdGhpcy5hbGxvd0ZhaWx1cmUgPSBqb2JEYXRhLmFsbG93X2ZhaWx1cmUgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gam9iRGF0YS5kZXBlbmRlbmNpZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5ydWxlcyA9IGpvYkRhdGEucnVsZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IHR5cGVvZiBqb2JEYXRhLmVudmlyb25tZW50ID09PSBcInN0cmluZ1wiID8ge25hbWU6IGpvYkRhdGEuZW52aXJvbm1lbnR9IDogam9iRGF0YS5lbnZpcm9ubWVudDtcblxuICAgICAgICBjb25zdCBtYXRyaXhWYXJpYWJsZXMgPSBvcHQubWF0cml4VmFyaWFibGVzID8/IHt9O1xuICAgICAgICB0aGlzLl92YXJpYWJsZXMgPSB7Li4uZ2xvYmFsVmFyaWFibGVzIHx8IHt9LCAuLi5qb2JEYXRhLnZhcmlhYmxlcyB8fCB7fSwgLi4ubWF0cml4VmFyaWFibGVzLCAuLi5wcmVkZWZpbmVkVmFyaWFibGVzLCAuLi5hcmd2VmFyaWFibGVzfTtcblxuICAgICAgICBsZXQgY2lQcm9qZWN0RGlyID0gYCR7Y3dkfWA7XG4gICAgICAgIGlmICh0aGlzLmpvYkRhdGFbXCJpbWFnZVwiXSkge1xuICAgICAgICAgICAgY2lQcm9qZWN0RGlyID0gXCIvZ2NsLWJ1aWxkc1wiO1xuICAgICAgICB9IGVsc2UgaWYgKGFyZ3Yuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGNpUHJvamVjdERpciA9IGAke2N3ZH0vJHtzdGF0ZURpcn0vYnVpbGRzLyR7dGhpcy5zYWZlSm9iTmFtZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX0pPQl9JRFwiXSA9IGAke3RoaXMuam9iSWR9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX1BJUEVMSU5FX0lEXCJdID0gYCR7dGhpcy5waXBlbGluZUlpZCArIDEwMDB9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX1BJUEVMSU5FX0lJRFwiXSA9IGAke3RoaXMucGlwZWxpbmVJaWR9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX0pPQl9OQU1FXCJdID0gYCR7dGhpcy5uYW1lfWA7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9KT0JfTkFNRV9TTFVHXCJdID0gYCR7dGhpcy5uYW1lLnJlcGxhY2UoL1teYS16XFxkXSsvaWcsIFwiLVwiKS5yZXBsYWNlKC9eLS8sIFwiXCIpLnNsaWNlKDAsIDYzKS5yZXBsYWNlKC8tJC8sIFwiXCIpLnRvTG93ZXJDYXNlKCl9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX0pPQl9TVEFHRVwiXSA9IGAke3RoaXMuc3RhZ2V9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX1BST0pFQ1RfRElSXCJdID0gY2lQcm9qZWN0RGlyO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfSk9CX1VSTFwiXSA9IGBodHRwczovLyR7Z2l0RGF0YS5yZW1vdGUuaG9zdH0vJHtnaXREYXRhLnJlbW90ZS5ncm91cH0vJHtnaXREYXRhLnJlbW90ZS5wcm9qZWN0fS8tL2pvYnMvJHt0aGlzLmpvYklkfWA7IC8vIENoYW5nZXMgb24gcmVydW4uXG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9QSVBFTElORV9VUkxcIl0gPSBgaHR0cHM6Ly8ke2dpdERhdGEucmVtb3RlLmhvc3R9LyR7Z2l0RGF0YS5yZW1vdGUuZ3JvdXB9LyR7Z2l0RGF0YS5yZW1vdGUucHJvamVjdH0vcGlwZWxpbmVzLyR7dGhpcy5waXBlbGluZUlpZH1gO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfRU5WSVJPTk1FTlRfTkFNRVwiXSA9IHRoaXMuZW52aXJvbm1lbnQ/Lm5hbWUgPz8gXCJcIjtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX0VOVklST05NRU5UX1NMVUdcIl0gPSB0aGlzLmVudmlyb25tZW50Py5uYW1lPy5yZXBsYWNlKC9bXmEtelxcZF0rL2lnLCBcIi1cIikucmVwbGFjZSgvXi0vLCBcIlwiKS5zbGljZSgwLCAyMykucmVwbGFjZSgvLSQvLCBcIlwiKS50b0xvd2VyQ2FzZSgpID8/IFwiXCI7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9FTlZJUk9OTUVOVF9VUkxcIl0gPSB0aGlzLmVudmlyb25tZW50Py51cmwgPz8gXCJcIjtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX05PREVfSU5ERVhcIl0gPSBgJHtvcHQubm9kZUluZGV4fWA7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9OT0RFX1RPVEFMXCJdID0gYCR7b3B0Lm5vZGVzVG90YWx9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX1JFR0lTVFJZXCJdID0gYGxvY2FsLXJlZ2lzdHJ5LiR7dGhpcy5naXREYXRhLnJlbW90ZS5ob3N0fWA7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9SRUdJU1RSWV9JTUFHRVwiXSA9IGAkQ0lfUkVHSVNUUlkvJHt0aGlzLl92YXJpYWJsZXNbXCJDSV9QUk9KRUNUX1BBVEhfU0xVR1wiXX1gO1xuXG4gICAgICAgIC8vIEZpbmQgZW52aXJvbm1lbnQgbWF0Y2hlZCB2YXJpYWJsZXNcbiAgICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVkID0gVXRpbHMuZXhwYW5kVmFyaWFibGVzKHRoaXMuX3ZhcmlhYmxlcyk7XG4gICAgICAgICAgICB0aGlzLmVudmlyb25tZW50Lm5hbWUgPSBVdGlscy5leHBhbmRUZXh0KHRoaXMuZW52aXJvbm1lbnQubmFtZSwgZXhwYW5kZWQpO1xuICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudC51cmwgPSBVdGlscy5leHBhbmRUZXh0KHRoaXMuZW52aXJvbm1lbnQudXJsLCBleHBhbmRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW52TWF0Y2hlZFZhcmlhYmxlcyA9IFV0aWxzLmZpbmRFbnZNYXRjaGVkVmFyaWFibGVzKHZhcmlhYmxlc0Zyb21GaWxlcywgdGhpcy5maWxlVmFyaWFibGVzRGlyLCB0aGlzLmVudmlyb25tZW50KTtcblxuICAgICAgICAvLyBNZXJnZSBhbmQgZXhwYW5kIGFmdGVyIGZpbmRpbmcgZW52IG1hdGNoZWQgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuX3ZhcmlhYmxlcyA9IHsuLi5nbG9iYWxWYXJpYWJsZXMgfHwge30sIC4uLmpvYkRhdGEudmFyaWFibGVzIHx8IHt9LCAuLi5tYXRyaXhWYXJpYWJsZXMsIC4uLnByZWRlZmluZWRWYXJpYWJsZXMsIC4uLmVudk1hdGNoZWRWYXJpYWJsZXMsIC4uLmFyZ3ZWYXJpYWJsZXN9O1xuXG4gICAgICAgIC8vIFNldCB7d2hlbiwgYWxsb3dGYWlsdXJlfSBiYXNlZCBvbiBydWxlcyByZXN1bHRcbiAgICAgICAgaWYgKHRoaXMucnVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGVSZXN1bHQgPSBVdGlscy5nZXRSdWxlc1Jlc3VsdCh7Y3dkLCBydWxlczogdGhpcy5ydWxlcywgdmFyaWFibGVzOiB0aGlzLl92YXJpYWJsZXN9KTtcbiAgICAgICAgICAgIHRoaXMud2hlbiA9IHJ1bGVSZXN1bHQud2hlbjtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dGYWlsdXJlID0gcnVsZVJlc3VsdC5hbGxvd0ZhaWx1cmU7XG4gICAgICAgICAgICB0aGlzLl92YXJpYWJsZXMgPSB7Li4uZ2xvYmFsVmFyaWFibGVzIHx8IHt9LCAuLi5qb2JEYXRhLnZhcmlhYmxlcyB8fCB7fSwgLi4ucnVsZVJlc3VsdC52YXJpYWJsZXMsIC4uLm1hdHJpeFZhcmlhYmxlcywgLi4ucHJlZGVmaW5lZFZhcmlhYmxlcywgLi4uZW52TWF0Y2hlZFZhcmlhYmxlcywgLi4uYXJndlZhcmlhYmxlc307XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVsZXRlIHZhcmlhYmxlcyB0aGUgdXNlciBpbnRlbnRpb25hbGx5IHdhbnRzIHVuc2V0XG4gICAgICAgIGZvciAoY29uc3QgdW5zZXRWYXJpYWJsZSBvZiBhcmd2LnVuc2V0VmFyaWFibGVzKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdmFyaWFibGVzW3Vuc2V0VmFyaWFibGVdO1xuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0KHRoaXMuc2NyaXB0cyB8fCB0aGlzLnRyaWdnZXIsIGNoYWxrYHtibHVlQnJpZ2h0ICR7dGhpcy5uYW1lfX0gbXVzdCBoYXZlIHNjcmlwdCBzcGVjaWZpZWRgKTtcblxuICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGl2ZSAmJiAodGhpcy53aGVuICE9PSBcIm1hbnVhbFwiIHx8IHRoaXMuaW1hZ2VOYW1lICE9PSBudWxsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKHttZXNzYWdlOiBgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IEBJbnRlcmFjdGl2ZSBkZWNvcmF0b3IgY2Fubm90IGhhdmUgaW1hZ2U6IGFuZCBtdXN0IGJlIHdoZW46bWFudWFsYH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5qZWN0U1NIQWdlbnQgJiYgdGhpcy5pbWFnZU5hbWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcih7bWVzc2FnZTogYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSBASW5qZWN0U1NIQWdlbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGltYWdlOmB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2ksIGNdIG9mIE9iamVjdC5lbnRyaWVzPGFueT4odGhpcy5jYWNoZSkpIHtcbiAgICAgICAgICAgIGFzc2VydChbXCJwdWxsXCIsIFwicHVzaFwiLCBcInB1bGwtcHVzaFwiXS5pbmNsdWRlcyhjLnBvbGljeSksIGNoYWxrYHtibHVlICR7dGhpcy5uYW1lfX0gY2FjaGVbJHtpfV0ucG9saWN5IGlzIG5vdCAncHVsbCcsICdwdXNoJyBvciAncHVsbC1wdXNoJ2ApO1xuICAgICAgICAgICAgYXNzZXJ0KFtcIm9uX3N1Y2Nlc3NcIiwgXCJvbl9mYWlsdXJlXCIsIFwiYWx3YXlzXCJdLmluY2x1ZGVzKGMud2hlbiksIGNoYWxrYHtibHVlICR7dGhpcy5uYW1lfX0gY2FjaGVbJHtpfV0ud2hlbiBpcyBub3QgJ29uX3N1Y2Nlc3MnLCAnb25fZmFpbHVyZScgb3IgJ2Fsd2F5cydgKTtcbiAgICAgICAgICAgIGFzc2VydChBcnJheS5pc0FycmF5KGMucGF0aHMpLCBjaGFsa2B7Ymx1ZSAke3RoaXMubmFtZX19IGNhY2hlWyR7aX1dLnBhdGhzIG11c3QgYmUgYXJyYXlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2ksIHNdIG9mIE9iamVjdC5lbnRyaWVzPGFueT4odGhpcy5zZXJ2aWNlcykpIHtcbiAgICAgICAgICAgIGFzc2VydChzLm5hbWUsIGNoYWxrYHtibHVlICR7dGhpcy5uYW1lfX0gc2VydmljZXNbJHtpfV0ubmFtZSBpcyB1bmRlZmluZWRgKTtcbiAgICAgICAgICAgIGFzc2VydCghcy5jb21tYW5kIHx8IEFycmF5LmlzQXJyYXkocy5jb21tYW5kKSwgY2hhbGtge2JsdWUgJHt0aGlzLm5hbWV9fSBzZXJ2aWNlc1ske2l9XS5jb21tYW5kIG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgICAgICAgICAgIGFzc2VydCghcy5lbnRyeXBvaW50IHx8IEFycmF5LmlzQXJyYXkocy5lbnRyeXBvaW50KSwgY2hhbGtge2JsdWUgJHt0aGlzLm5hbWV9fSBzZXJ2aWNlc1ske2l9XS5lbnRyeXBvaW50IG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2VydCghdGhpcy5hcnRpZmFjdHM/LnBhdGhzIHx8IEFycmF5LmlzQXJyYXkodGhpcy5hcnRpZmFjdHMucGF0aHMpLCBjaGFsa2B7Ymx1ZSAke3RoaXMubmFtZX19IGFydGlmYWN0cy5wYXRocyBtdXN0IGJlIGFuIGFycmF5YCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lICYmIGFyZ3YubW91bnRDYWNoZSkge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBVdGlscy5leHBhbmRWYXJpYWJsZXModGhpcy5fdmFyaWFibGVzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgICAgICAgYy5wYXRocy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBVdGlscy5leHBhbmRUZXh0KHAsIGV4cGFuZGVkKTtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCFwYXRoLmluY2x1ZGVzKFwiKlwiKSwgY2hhbGtge2JsdWUgJHt0aGlzLm5hbWV9fSBjYW5ub3QgaGF2ZSAqIGluIGNhY2hlIHBhdGhzLCB3aGVuIC0tbW91bnQtY2FjaGUgaXMgZW5hYmxlZGApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGFydGlmYWN0c1RvU291cmNlICgpIHtcbiAgICAgICAgaWYgKHRoaXMuam9iRGF0YVtcImFydGlmYWN0c1RvU291cmNlXCJdICE9IG51bGwpIHJldHVybiB0aGlzLmpvYkRhdGFbXCJhcnRpZmFjdHNUb1NvdXJjZVwiXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJndi5hcnRpZmFjdHNUb1NvdXJjZTtcbiAgICB9XG5cbiAgICBnZXQgcHJldHR5RHVyYXRpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZW5kVGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIHByZXR0eUhydGltZSh0aGlzLl9lbmRUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFydFRpbWVcbiAgICAgICAgICAgID8gcHJldHR5SHJ0aW1lKHByb2Nlc3MuaHJ0aW1lKHRoaXMuX3N0YXJ0VGltZSkpXG4gICAgICAgICAgICA6IFwiMCBtc1wiO1xuICAgIH1cblxuICAgIGdldCBmb3JtYXR0ZWRKb2JOYW1lICgpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wUHJlZml4ID0gdGhpcy5hcmd2LnNob3dUaW1lc3RhbXBzXG4gICAgICAgICAgICA/IGBbJHtkYXRlRm9ybWF0dGVyLmZvcm1hdChuZXcgRGF0ZSgpKX0gJHt0aGlzLnByZXR0eUR1cmF0aW9uLnBhZFN0YXJ0KDcpfV0gYFxuICAgICAgICAgICAgOiBcIlwiO1xuXG4gICAgICAgIC8vIFsxNjozMzoxOSAxLjM3IG1pbl0gbXktam9iICAgICA+IGhlbGxvIHdvcmxkXG4gICAgICAgIHJldHVybiBjaGFsa2Ake3RpbWVzdGFtcFByZWZpeH17Ymx1ZUJyaWdodCAke3RoaXMubmFtZS5wYWRFbmQodGhpcy5qb2JOYW1lUGFkKX19YDtcbiAgICB9XG5cbiAgICBnZXQgc2FmZUpvYk5hbWUgKCkge1xuICAgICAgICByZXR1cm4gVXRpbHMuc2FmZURvY2tlclN0cmluZyh0aGlzLm5hbWUpO1xuICAgIH1cblxuICAgIGdldCBuZWVkcyAoKTogTmVlZFtdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJuZWVkc1wiXSA/PyBudWxsO1xuICAgIH1cblxuICAgIGdldCBidWlsZFZvbHVtZU5hbWUgKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZ2NsLSR7dGhpcy5zYWZlSm9iTmFtZX0tJHt0aGlzLmpvYklkfS1idWlsZGA7XG4gICAgfVxuXG4gICAgZ2V0IHRtcFZvbHVtZU5hbWUgKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZ2NsLSR7dGhpcy5zYWZlSm9iTmFtZX0tJHt0aGlzLmpvYklkfS10bXBgO1xuICAgIH1cblxuICAgIGdldCBpbWFnZU5hbWUgKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuam9iRGF0YVtcImltYWdlXCJdO1xuICAgICAgICBpZiAoIWltYWdlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBVdGlscy5leHBhbmRWYXJpYWJsZXModGhpcy5fdmFyaWFibGVzKTtcbiAgICAgICAgY29uc3QgaW1hZ2VOYW1lID0gVXRpbHMuZXhwYW5kVGV4dChpbWFnZS5uYW1lLCBleHBhbmRlZCk7XG4gICAgICAgIHJldHVybiBpbWFnZU5hbWUuaW5jbHVkZXMoXCI6XCIpID8gaW1hZ2VOYW1lIDogYCR7aW1hZ2VOYW1lfTpsYXRlc3RgO1xuICAgIH1cblxuICAgIGdldCBpbWFnZUVudHJ5cG9pbnQgKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5qb2JEYXRhW1wiaW1hZ2VcIl07XG5cbiAgICAgICAgaWYgKCFpbWFnZT8uZW50cnlwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkoaW1hZ2UuZW50cnlwb2ludCksIFwiaW1hZ2U6ZW50cnlwb2ludCBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICAgICAgICByZXR1cm4gaW1hZ2UuZW50cnlwb2ludDtcbiAgICB9XG5cbiAgICBnZXQgc2VydmljZXMgKCk6IFNlcnZpY2VbXSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzOiBTZXJ2aWNlW10gPSBbXTtcbiAgICAgICAgaWYgKCF0aGlzLmpvYkRhdGFbXCJzZXJ2aWNlc1wiXSkgcmV0dXJuIFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiBPYmplY3QudmFsdWVzPGFueT4odGhpcy5qb2JEYXRhW1wic2VydmljZXNcIl0pKSB7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlZCA9IFV0aWxzLmV4cGFuZFZhcmlhYmxlcyh7Li4udGhpcy5fdmFyaWFibGVzLCAuLi5zZXJ2aWNlW1widmFyaWFibGVzXCJdfSk7XG4gICAgICAgICAgICBsZXQgc2VydmljZU5hbWUgPSBVdGlscy5leHBhbmRUZXh0KHNlcnZpY2VbXCJuYW1lXCJdLCBleHBhbmRlZCk7XG4gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lLmluY2x1ZGVzKFwiOlwiKSA/IHNlcnZpY2VOYW1lIDogYCR7c2VydmljZU5hbWV9OmxhdGVzdGA7XG4gICAgICAgICAgICBzZXJ2aWNlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBzZXJ2aWNlTmFtZSxcbiAgICAgICAgICAgICAgICBlbnRyeXBvaW50OiBzZXJ2aWNlW1wiZW50cnlwb2ludFwiXSA/PyBudWxsLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IHNlcnZpY2VbXCJjb21tYW5kXCJdID8/IG51bGwsXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiBleHBhbmRlZCxcbiAgICAgICAgICAgICAgICBhbGlhczogVXRpbHMuZXhwYW5kVGV4dChzZXJ2aWNlW1wiYWxpYXNcIl0sIGV4cGFuZGVkKSA/PyBudWxsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcnZpY2VzO1xuICAgIH1cblxuICAgIHNldCBqb2JOYW1lUGFkIChqb2JOYW1lUGFkOiBudW1iZXIpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuX2pvYk5hbWVQYWQgPT0gbnVsbCwgXCJ0aGlzLl9qb2JOYW1lUGFkIGNhbiBvbmx5IGJlIHNldCBvbmNlXCIpO1xuICAgICAgICB0aGlzLl9qb2JOYW1lUGFkID0gam9iTmFtZVBhZDtcbiAgICB9XG5cbiAgICBnZXQgam9iTmFtZVBhZCAoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2pvYk5hbWVQYWQgPz8gMDtcbiAgICB9XG5cbiAgICBnZXQgcHJvZHVjZXJzICgpOiB7bmFtZTogc3RyaW5nOyBkb3RlbnY6IHN0cmluZyB8IG51bGx9W10gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2R1Y2VycztcbiAgICB9XG5cbiAgICBzZXQgcHJvZHVjZXJzIChwcm9kdWNlcnM6IHtuYW1lOiBzdHJpbmc7IGRvdGVudjogc3RyaW5nIHwgbnVsbH1bXSB8IG51bGwpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuX3Byb2R1Y2VycyA9PSBudWxsLCBcInRoaXMuX3Byb2R1Y2VycyBjYW4gb25seSBiZSBzZXQgb25jZVwiKTtcbiAgICAgICAgdGhpcy5fcHJvZHVjZXJzID0gcHJvZHVjZXJzO1xuICAgIH1cblxuICAgIGdldCBzdGFnZSAoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcInN0YWdlXCJdIHx8IFwidGVzdFwiO1xuICAgIH1cblxuICAgIGdldCBpbnRlcmFjdGl2ZSAoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJpbnRlcmFjdGl2ZVwiXSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgaW5qZWN0U1NIQWdlbnQgKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiaW5qZWN0U1NIQWdlbnRcIl0gfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGRlc2NyaXB0aW9uICgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiZGVzY3JpcHRpb25cIl0gPz8gXCJcIjtcbiAgICB9XG5cbiAgICBnZXQgYXJ0aWZhY3RzICgpOiB7cGF0aHM6IHN0cmluZ1tdOyBleGNsdWRlPzogc3RyaW5nW107IHJlcG9ydHM/OiB7ZG90ZW52Pzogc3RyaW5nfTsgd2hlbj86IHN0cmluZ30gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImFydGlmYWN0c1wiXTtcbiAgICB9XG5cbiAgICBnZXQgY2FjaGUgKCk6IENhY2hlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiY2FjaGVcIl0gfHwgW107XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVuaXF1ZUNhY2hlTmFtZSAoY3dkOiBzdHJpbmcsIGV4cGFuZGVkOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSwga2V5OiBhbnkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgfHwga2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5leHBhbmRUZXh0KGtleSA/PyBcImRlZmF1bHRcIiwgZXhwYW5kZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIm1kLVwiICsgYXdhaXQgVXRpbHMuY2hlY2tzdW1GaWxlcyhrZXlbXCJmaWxlc1wiXS5tYXAoKGY6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAke2N3ZH0vJHtVdGlscy5leHBhbmRUZXh0KGYsIGV4cGFuZGVkKX1gO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgZ2V0IGJlZm9yZVNjcmlwdHMgKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImJlZm9yZV9zY3JpcHRcIl0gfHwgW107XG4gICAgfVxuXG4gICAgZ2V0IGFmdGVyU2NyaXB0cyAoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiYWZ0ZXJfc2NyaXB0XCJdIHx8IFtdO1xuICAgIH1cblxuICAgIGdldCBzY3JpcHRzICgpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJzY3JpcHRcIl07XG4gICAgfVxuXG4gICAgZ2V0IHRyaWdnZXIgKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJ0cmlnZ2VyXCJdO1xuICAgIH1cblxuICAgIGdldCBwcmVTY3JpcHRzRXhpdENvZGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlO1xuICAgIH1cblxuICAgIGdldCBhZnRlclNjcmlwdHNFeGl0Q29kZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZnRlclNjcmlwdHNFeGl0Q29kZTtcbiAgICB9XG5cbiAgICBnZXQgc3RhcnRlZCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5uaW5nIHx8IHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgZmluaXNoZWQgKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX3J1bm5pbmcgJiYgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlICE9PSBudWxsO1xuICAgIH1cblxuICAgIGdldCBjb3ZlcmFnZVBlcmNlbnQgKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fY292ZXJhZ2VQZXJjZW50O1xuICAgIH1cblxuICAgIGdldCBmaWxlVmFyaWFibGVzRGlyICgpIHtcbiAgICAgICAgcmV0dXJuIGAvdG1wL2dpdGxhYi1jaS1sb2NhbC1maWxlLXZhcmlhYmxlcy0ke3RoaXMuX3ZhcmlhYmxlc1tcIkNJX1BST0pFQ1RfUEFUSF9TTFVHXCJdfS0ke3RoaXMuam9iSWR9YDtcbiAgICB9XG5cbiAgICBhc3luYyBzdGFydCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuX3J1bm5pbmcgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGFyZ3YgPSB0aGlzLmFyZ3Y7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtcyA9IHRoaXMud3JpdGVTdHJlYW1zO1xuICAgICAgICBjb25zdCByZXBvcnRzRG90ZW52VmFyaWFibGVzID0gYXdhaXQgdGhpcy5pbml0UHJvZHVjZXJSZXBvcnRzRG90ZW52VmFyaWFibGVzKHdyaXRlU3RyZWFtcywgVXRpbHMuZXhwYW5kVmFyaWFibGVzKHRoaXMuX3ZhcmlhYmxlcykpO1xuICAgICAgICBjb25zdCBleHBhbmRlZCA9IFV0aWxzLmV4cGFuZFZhcmlhYmxlcyh7Li4udGhpcy5fdmFyaWFibGVzLCAuLi5yZXBvcnRzRG90ZW52VmFyaWFibGVzfSk7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcblxuXG4gICAgICAgIGNvbnN0IG91dHB1dExvZ0ZpbGVQYXRoID0gYCR7YXJndi5jd2R9LyR7YXJndi5zdGF0ZURpcn0vb3V0cHV0LyR7c2FmZUpvYk5hbWV9LmxvZ2A7XG4gICAgICAgIGF3YWl0IGZzLmVuc3VyZUZpbGUob3V0cHV0TG9nRmlsZVBhdGgpO1xuICAgICAgICBhd2FpdCBmcy50cnVuY2F0ZShvdXRwdXRMb2dGaWxlUGF0aCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBzdGFydGluZ30gJHt0aGlzLmltYWdlTmFtZSA/PyBcInNoZWxsXCJ9ICh7eWVsbG93ICR7dGhpcy5zdGFnZX19KVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBidWlsZFZvbHVtZU5hbWUgPSB0aGlzLmJ1aWxkVm9sdW1lTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IHRtcFZvbHVtZU5hbWUgPSB0aGlzLnRtcFZvbHVtZU5hbWU7XG4gICAgICAgICAgICBjb25zdCBmaWxlVmFyaWFibGVzRGlyID0gdGhpcy5maWxlVmFyaWFibGVzRGlyO1xuXG4gICAgICAgICAgICBjb25zdCB2b2x1bWVQcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgdm9sdW1lUHJvbWlzZXMucHVzaChVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwidm9sdW1lXCIsIFwiY3JlYXRlXCIsIGAke2J1aWxkVm9sdW1lTmFtZX1gXSwgYXJndi5jd2QpKTtcbiAgICAgICAgICAgIHZvbHVtZVByb21pc2VzLnB1c2goVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInZvbHVtZVwiLCBcImNyZWF0ZVwiLCBgJHt0bXBWb2x1bWVOYW1lfWBdLCBhcmd2LmN3ZCkpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyVm9sdW1lTmFtZXMucHVzaChidWlsZFZvbHVtZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyVm9sdW1lTmFtZXMucHVzaCh0bXBWb2x1bWVOYW1lKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHZvbHVtZVByb21pc2VzKTtcblxuICAgICAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgICAgIGNvbnN0IHtzdGRvdXQ6IGNvbnRhaW5lcklkfSA9IGF3YWl0IFV0aWxzLnNwYXduKFtcbiAgICAgICAgICAgICAgICB0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJjcmVhdGVcIiwgYC0tdm9sdW1lPSR7YnVpbGRWb2x1bWVOYW1lfTovZ2NsLWJ1aWxkc2AsIGAtLXZvbHVtZT0ke3RtcFZvbHVtZU5hbWV9OiR7dGhpcy5maWxlVmFyaWFibGVzRGlyfWAsIFwiZG9ja2VyLmlvL2ZpcmVjb3cvZ2l0bGFiLWNpLWxvY2FsLXV0aWxcIixcbiAgICAgICAgICAgICAgICBcImJhc2hcIiwgXCItY1wiLCBcImNob3duIDA6MCAtUiAvZ2NsLWJ1aWxkcy8gJiYgY2htb2QgYStydyAtUiAvZ2NsLWJ1aWxkcy8gJiYgY2htb2QgYStydyAtUiAvdG1wL1wiLFxuICAgICAgICAgICAgXSwgYXJndi5jd2QpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyc1RvQ2xlYW4ucHVzaChjb250YWluZXJJZCk7XG4gICAgICAgICAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhmaWxlVmFyaWFibGVzRGlyKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJjcFwiLCBgJHtmaWxlVmFyaWFibGVzRGlyfS8uYCwgYCR7Y29udGFpbmVySWR9OiR7ZmlsZVZhcmlhYmxlc0Rpcn1gXSwgYXJndi5jd2QpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcImNwXCIsIGAke2FyZ3Yuc3RhdGVEaXJ9L2J1aWxkcy8uZG9ja2VyLy5gLCBgJHtjb250YWluZXJJZH06L2djbC1idWlsZHNgXSwgYXJndi5jd2QpO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInN0YXJ0XCIsIFwiLS1hdHRhY2hcIiwgY29udGFpbmVySWRdLCBhcmd2LmN3ZCk7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwicm1cIiwgXCItdmZcIiwgY29udGFpbmVySWRdLCBhcmd2LmN3ZCk7XG4gICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBjb3BpZWQgdG8gZG9ja2VyIHZvbHVtZXN9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRG9ja2VyTmV0d29yayhgZ2l0bGFiLWNpLWxvY2FsLSR7dGhpcy5qb2JJZH1gKTtcblxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlcy5tYXAoYXN5bmMgKHNlcnZpY2UsIHNlcnZpY2VJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHNlcnZpY2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wdWxsSW1hZ2Uod3JpdGVTdHJlYW1zLCBzZXJ2aWNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VDb250YWluZXJJZCA9IGF3YWl0IHRoaXMuc3RhcnRTZXJ2aWNlKHdyaXRlU3RyZWFtcywgVXRpbHMuZXhwYW5kVmFyaWFibGVzKHsuLi5leHBhbmRlZCwgLi4uc2VydmljZS52YXJpYWJsZXN9KSwgc2VydmljZSwgc2VydmljZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZUNvbnRhaW5lckxvZ0ZpbGUgPSBgJHthcmd2LmN3ZH0vJHthcmd2LnN0YXRlRGlyfS9zZXJ2aWNlcy1vdXRwdXQvJHt0aGlzLnNhZmVKb2JOYW1lfS8ke3NlcnZpY2VOYW1lfS0ke3NlcnZpY2VJbmRleH0ubG9nYDtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXJ2aWNlSGVhbHRoQ2hlY2sod3JpdGVTdHJlYW1zLCBzZXJ2aWNlLCBzZXJ2aWNlSW5kZXgsIHNlcnZpY2VDb250YWluZXJMb2dGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qge3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJsb2dzXCIsIHNlcnZpY2VDb250YWluZXJJZF0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmcy5lbnN1cmVGaWxlKHNlcnZpY2VDb250YWluZXJMb2dGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHNlcnZpY2VDb250YWluZXJMb2dGaWxlLCBgIyMjIHN0ZG91dCAjIyNcXG4ke3N0ZG91dH1cXG4jIyMgc3RkZXJyICMjI1xcbiR7c3RkZXJyfVxcbmApO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZG9uZSA9IGFzeW5jIChleGl0Q29kZTogbnVtYmVyLCBleGl0TWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRW5kVGltZSgpO1xuICAgICAgICAgICAgaWYgKGV4aXRDb2RlID09IDApIHtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGAke2V4aXRNZXNzYWdlfVxcbmApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGAke2V4aXRNZXNzYWdlfVxcbmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5Q2FjaGVPdXQod3JpdGVTdHJlYW1zLCBleHBhbmRlZCwgZXhpdENvZGUpO1xuICAgICAgICAgICAgaWYgKGV4aXRDb2RlID09IDAgfHwgdGhpcy5hcnRpZmFjdHM/LndoZW4gPT09IFwiYWx3YXlzXCIpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlBcnRpZmFjdHNPdXQod3JpdGVTdHJlYW1zLCBleHBhbmRlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFudXBSZXNvdXJjZXMoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBwcmVzY3JpcHRzID0gdGhpcy5iZWZvcmVTY3JpcHRzLmNvbmNhdCh0aGlzLnNjcmlwdHMpO1xuICAgICAgICBleHBhbmRlZFtcIkNJX0pPQl9TVEFUVVNcIl0gPSBcInJ1bm5pbmdcIjtcbiAgICAgICAgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlID0gYXdhaXQgdGhpcy5leGVjU2NyaXB0cyhwcmVzY3JpcHRzLCBleHBhbmRlZCk7XG4gICAgICAgIGlmICh0aGlzLmFmdGVyU2NyaXB0cy5sZW5ndGggPT09IDAgJiYgdGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlID4gMCkge1xuICAgICAgICAgICAgYXdhaXQgZG9uZSh0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUsIHRoaXMuZ2V0RXhpdGVkU3RyaW5nKHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSwgdGhpcy5hbGxvd0ZhaWx1cmUpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRW5kVGltZSgpO1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihgJHt0aGlzLmdldEV4aXRlZFN0cmluZyh0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUsIHRoaXMuYWxsb3dGYWlsdXJlKX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFmdGVyU2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBydW5uaW5nIGFmdGVyIHNjcmlwdC4uLn1cXG5gKTtcbiAgICAgICAgICAgIGV4cGFuZGVkW1wiQ0lfSk9CX1NUQVRVU1wiXSA9IHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA9PT0gMCA/IFwic3VjY2Vzc1wiIDogXCJmYWlsZWRcIjtcbiAgICAgICAgICAgIGlmICgwIDwgKHRoaXMuX2FmdGVyU2NyaXB0c0V4aXRDb2RlID0gYXdhaXQgdGhpcy5leGVjU2NyaXB0cyh0aGlzLmFmdGVyU2NyaXB0cywgZXhwYW5kZWQpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJFbmRUaW1lKCk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihgJHt0aGlzLmdldEV4aXRlZFN0cmluZyh0aGlzLl9hZnRlclNjcmlwdHNFeGl0Q29kZSwgdHJ1ZSwgXCIgYWZ0ZXJfc2NyaXB0XCIpfVxcbmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuam9iRGF0YVtcImNvdmVyYWdlXCJdKSB7XG4gICAgICAgICAgICB0aGlzLl9jb3ZlcmFnZVBlcmNlbnQgPSBhd2FpdCBVdGlscy5nZXRDb3ZlcmFnZVBlcmNlbnQoYXJndi5jd2QsIGFyZ3Yuc3RhdGVEaXIsIHRoaXMuam9iRGF0YVtcImNvdmVyYWdlXCJdLCBzYWZlSm9iTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgZG9uZSh0aGlzLl9hZnRlclNjcmlwdHNFeGl0Q29kZSwgdGhpcy5nZXRGaW5pc2hlZFN0cmluZygpKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbGVhbnVwUmVzb3VyY2VzICgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2xvbmdSdW5uaW5nU2lsZW50VGltZW91dCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmFyZ3YuY2xlYW51cCkgcmV0dXJuO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgdGhpcy5fY29udGFpbmVyc1RvQ2xlYW4pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInJtXCIsIFwiLXZmXCIsIGAke2lkfWBdKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIEVycm9yLCBcImUgaXMgbm90IGluc3RhbmNlb2YgRXJyb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fc2VydmljZU5ldHdvcmtJZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwibmV0d29ya1wiLCBcInJtXCIsIGAke3RoaXMuX3NlcnZpY2VOZXR3b3JrSWR9YF0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgRXJyb3IsIFwiZSBpcyBub3QgaW5zdGFuY2VvZiBFcnJvclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXJWb2x1bWVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyVm9sdW1lIG9mIHRoaXMuX2NvbnRhaW5lclZvbHVtZU5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJ2b2x1bWVcIiwgXCJybVwiLCBgJHtjb250YWluZXJWb2x1bWV9YF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIEVycm9yLCBcImUgaXMgbm90IGluc3RhbmNlb2YgRXJyb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBybVByb21pc2VzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiB0aGlzLl9maWxlc1RvUm0pIHtcbiAgICAgICAgICAgIHJtUHJvbWlzZXMucHVzaChmcy5ybShmaWxlLCB7cmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZX0pKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChybVByb21pc2VzKTtcblxuICAgICAgICBjb25zdCBmaWxlVmFyaWFibGVzRGlyID0gdGhpcy5maWxlVmFyaWFibGVzRGlyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMucm0oZmlsZVZhcmlhYmxlc0Rpciwge3JlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWV9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBFcnJvciwgXCJlIGlzIG5vdCBpbnN0YW5jZW9mIEVycm9yXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUluamVjdFNTSEFnZW50T3B0aW9ucyAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmplY3RTU0hBZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCIgfHwgL15kYXJ3aW4vLmV4ZWMocHJvY2Vzcy5lbnYuT1NUWVBFID8/IFwiXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCItLWVudiBTU0hfQVVUSF9TT0NLPS9ydW4vaG9zdC1zZXJ2aWNlcy9zc2gtYXV0aC5zb2NrIC12IC9ydW4vaG9zdC1zZXJ2aWNlcy9zc2gtYXV0aC5zb2NrOi9ydW4vaG9zdC1zZXJ2aWNlcy9zc2gtYXV0aC5zb2NrXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAtLWVudiBTU0hfQVVUSF9TT0NLPSR7cHJvY2Vzcy5lbnYuU1NIX0FVVEhfU09DS30gLXYgJHtwcm9jZXNzLmVudi5TU0hfQVVUSF9TT0NLfToke3Byb2Nlc3MuZW52LlNTSF9BVVRIX1NPQ0t9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlU2NyaXB0Q29tbWFuZHMgKHNjcmlwdHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBjbWQgPSBcIlwiO1xuICAgICAgICBzY3JpcHRzLmZvckVhY2goKHNjcmlwdCkgPT4ge1xuICAgICAgICAgICAgLy8gUHJpbnQgY29tbWFuZCBlY2hvJ2VkIGluIGNvbG9yXG4gICAgICAgICAgICBjb25zdCBzcGxpdCA9IHNjcmlwdC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgICAgICAgY29uc3QgbXVsdGlsaW5lVGV4dCA9IHNwbGl0Lmxlbmd0aCA+IDEgPyBcIiAjIGNvbGxhcHNlZCBtdWx0aS1saW5lIGNvbW1hbmRcIiA6IFwiXCI7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gc3BsaXRbMF0/LnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9cIi9nLCBcIlxcXFxcXFwiXCIpLnJlcGxhY2UoL1skXS9nLCBcIlxcXFwkXCIpO1xuICAgICAgICAgICAgY21kICs9IGNoYWxrYGVjaG8gXCJ7Z3JlZW4gJCAke3RleHR9JHttdWx0aWxpbmVUZXh0fX1cIlxcbmA7XG5cbiAgICAgICAgICAgIC8vIEV4ZWN1dGUgYWN0dWFsIHNjcmlwdFxuICAgICAgICAgICAgY21kICs9IGAke3NjcmlwdH1cXG5gO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG1vdW50Q2FjaGVDbWQgKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30pIHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VOYW1lICYmICF0aGlzLmFyZ3YubW91bnRDYWNoZSkgcmV0dXJuIFtdO1xuXG4gICAgICAgIGNvbnN0IGNtZDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUNhY2hlTmFtZSA9IGF3YWl0IHRoaXMuZ2V0VW5pcXVlQ2FjaGVOYW1lKHRoaXMuYXJndi5jd2QsIGV4cGFuZGVkLCBjLmtleSk7XG4gICAgICAgICAgICBjLnBhdGhzLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gVXRpbHMuZXhwYW5kVGV4dChwLCBleHBhbmRlZCk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgbW91bnRpbmcgY2FjaGV9IGZvciBwYXRoICR7cGF0aH1cXG5gKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZU1vdW50ID0gVXRpbHMuc2FmZURvY2tlclN0cmluZyhgZ2NsLSR7ZXhwYW5kZWQuQ0lfUFJPSkVDVF9QQVRIX1NMVUd9LSR7dW5pcXVlQ2FjaGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIGNtZC5wdXNoKFwiLXZcIiwgYCR7Y2FjaGVNb3VudH06L2djbC1idWlsZHMvJHtwYXRofWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGV4ZWNTY3JpcHRzIChzY3JpcHRzOiBzdHJpbmdbXSwgZXhwYW5kZWQ6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5hcmd2LmN3ZDtcbiAgICAgICAgY29uc3Qgc3RhdGVEaXIgPSB0aGlzLmFyZ3Yuc3RhdGVEaXI7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcbiAgICAgICAgY29uc3Qgb3V0cHV0RmlsZXNQYXRoID0gYCR7Y3dkfS8ke3N0YXRlRGlyfS9vdXRwdXQvJHtzYWZlSm9iTmFtZX0ubG9nYDtcbiAgICAgICAgY29uc3QgYnVpbGRWb2x1bWVOYW1lID0gdGhpcy5idWlsZFZvbHVtZU5hbWU7XG4gICAgICAgIGNvbnN0IHRtcFZvbHVtZU5hbWUgPSB0aGlzLnRtcFZvbHVtZU5hbWU7XG4gICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtcyA9IHRoaXMud3JpdGVTdHJlYW1zO1xuXG4gICAgICAgIGlmIChzY3JpcHRzLmxlbmd0aCA9PT0gMCB8fCBzY3JpcHRzWzBdID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29weSBnaXQgdHJhY2tlZCBmaWxlcyB0byBidWlsZCBmb2xkZXIgaWYgc2hlbGwgaXNvbGF0aW9uIGVuYWJsZWQuXG4gICAgICAgIGlmICghdGhpcy5pbWFnZU5hbWUgJiYgdGhpcy5hcmd2LnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5yc3luY1RyYWNrZWRGaWxlcyhjd2QsIHN0YXRlRGlyLCBgJHtzYWZlSm9iTmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmludGVyYWN0aXZlKSB7XG4gICAgICAgICAgICBjb25zdCBpQ21kID0gdGhpcy5nZW5lcmF0ZVNjcmlwdENvbW1hbmRzKHNjcmlwdHMpO1xuICAgICAgICAgICAgY29uc3QgaW50ZXJhY3RpdmVDcCA9IGV4ZWNhKGlDbWQsIHtcbiAgICAgICAgICAgICAgICBjd2QsXG4gICAgICAgICAgICAgICAgc2hlbGw6IFwiYmFzaFwiLFxuICAgICAgICAgICAgICAgIHN0ZGlvOiBbXCJpbmhlcml0XCIsIFwiaW5oZXJpdFwiLCBcImluaGVyaXRcIl0sXG4gICAgICAgICAgICAgICAgZW52OiB7Li4uZXhwYW5kZWQsIC4uLnByb2Nlc3MuZW52fSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPG51bWJlcj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgaW50ZXJhY3RpdmVDcC5vbihcImV4aXRcIiwgKGNvZGUpID0+IHJlc29sdmUoY29kZSA/PyAwKSk7XG4gICAgICAgICAgICAgICAgdm9pZCBpbnRlcmFjdGl2ZUNwLm9uKFwiZXJyb3JcIiwgKGVycikgPT4gcmVqZWN0KGVycikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHVsbEltYWdlKHdyaXRlU3RyZWFtcywgdGhpcy5pbWFnZU5hbWUpO1xuXG4gICAgICAgICAgICBsZXQgZG9ja2VyQ21kID0gYGRvY2tlciBjcmVhdGUgLS1pbnRlcmFjdGl2ZSAke3RoaXMuZ2VuZXJhdGVJbmplY3RTU0hBZ2VudE9wdGlvbnMoKX0gYDtcbiAgICAgICAgICAgIGlmICh0aGlzLmFyZ3YucHJpdmlsZWdlZCkge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0tcHJpdmlsZWdlZCBcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuYXJndi51bGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdWxpbWl0IG5vZmlsZT0ke3RoaXMuYXJndi51bGltaXR9IGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmFyZ3YudW1hc2spIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCItLXVzZXIgMDowIFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5zZXJ2aWNlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLW5ldHdvcmsgZ2l0bGFiLWNpLWxvY2FsLSR7dGhpcy5qb2JJZH0gYDtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCItLW5ldHdvcmstYWxpYXM9YnVpbGQgXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbmV0d29yayBvZiB0aGlzLmFyZ3YubmV0d29yaykge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1uZXR3b3JrICR7bmV0d29ya30gYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLXZvbHVtZSAke2J1aWxkVm9sdW1lTmFtZX06L2djbC1idWlsZHMgYDtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS12b2x1bWUgJHt0bXBWb2x1bWVOYW1lfToke3RoaXMuZmlsZVZhcmlhYmxlc0Rpcn0gYDtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0td29ya2RpciAvZ2NsLWJ1aWxkcyBcIjtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB2b2x1bWUgb2YgdGhpcy5hcmd2LnZvbHVtZSkge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS12b2x1bWUgJHt2b2x1bWV9IGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZXh0cmFIb3N0IG9mIHRoaXMuYXJndi5leHRyYUhvc3QpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tYWRkLWhvc3Q9JHtleHRyYUhvc3R9IGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVudHJ5cG9pbnRGaWxlID0gYCR7Y3dkfS8ke3N0YXRlRGlyfS9zY3JpcHRzL2ltYWdlX2VudHJ5LyR7c2FmZUpvYk5hbWV9XyR7dGhpcy5qb2JJZH1gO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW1hZ2VFbnRyeXBvaW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW1hZ2VFbnRyeXBvaW50WzBdID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiLS1lbnRyeXBvaW50ICcnIFwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzLm91dHB1dEZpbGUoZW50cnlwb2ludEZpbGUsIFwiIyEvYmluL3NoXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmcy5hcHBlbmRGaWxlKGVudHJ5cG9pbnRGaWxlLCBgJHt0aGlzLmltYWdlRW50cnlwb2ludC5qb2luKFwiIFwiKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnMuY2htb2QoZW50cnlwb2ludEZpbGUsIFwiMDc1NVwiKTtcbiAgICAgICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiLS1lbnRyeXBvaW50ICcvZ2NsLWVudHJ5JyBcIjtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnMuYXBwZW5kRmlsZShlbnRyeXBvaW50RmlsZSwgXCIgXFxcIiRAXFxcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmlsZXNUb1JtLnB1c2goZW50cnlwb2ludEZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZXhwYW5kZWQpKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtZSAke2tleX0gYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAkeyhhd2FpdCB0aGlzLm1vdW50Q2FjaGVDbWQod3JpdGVTdHJlYW1zLCBleHBhbmRlZCkpLmpvaW4oXCIgXCIpfSBgO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAke3RoaXMuaW1hZ2VOYW1lfSBzaCAtYyBcIlxcbmA7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJpZiBbIC14IC91c3IvbG9jYWwvYmluL2Jhc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvdXNyL2xvY2FsL2Jpbi9iYXNoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC91c3IvYmluL2Jhc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvdXNyL2Jpbi9iYXNoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC9iaW4vYmFzaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC9iaW4vYmFzaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvdXNyL2xvY2FsL2Jpbi9zaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC91c3IvbG9jYWwvYmluL3NoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC91c3IvYmluL3NoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL3Vzci9iaW4vc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL2Jpbi9zaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC9iaW4vc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL2J1c3lib3gvc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvYnVzeWJveC9zaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsc2VcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGVjaG8gc2hlbGwgbm90IGZvdW5kXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGl0IDFcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImZpXFxuXFxcIlwiO1xuXG4gICAgICAgICAgICBjb25zdCB7c3Rkb3V0OiBjb250YWluZXJJZH0gPSBhd2FpdCBVdGlscy5iYXNoKGRvY2tlckNtZCwgY3dkLCBleHBhbmRlZCk7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJJZCA9IGNvbnRhaW5lcklkO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyc1RvQ2xlYW4ucHVzaCh0aGlzLl9jb250YWluZXJJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmNvcHlDYWNoZUluKHdyaXRlU3RyZWFtcywgZXhwYW5kZWQpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvcHlBcnRpZmFjdHNJbih3cml0ZVN0cmVhbXMpO1xuXG4gICAgICAgIGxldCBjbWQgPSBcInNldCAtZW8gcGlwZWZhaWxcXG5cIjtcbiAgICAgICAgY21kICs9IFwiZXhlYyAwPCAvZGV2L251bGxcXG5cIjtcblxuICAgICAgICBpZiAoIXRoaXMuaW1hZ2VOYW1lICYmIHRoaXMuYXJndi5zaGVsbElzb2xhdGlvbikge1xuICAgICAgICAgICAgY21kICs9IGBjZCAke3N0YXRlRGlyfS9idWlsZHMvJHtzYWZlSm9iTmFtZX0vXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBjbWQgKz0gdGhpcy5nZW5lcmF0ZVNjcmlwdENvbW1hbmRzKHNjcmlwdHMpO1xuXG4gICAgICAgIGNtZCArPSBcImV4aXQgMFxcblwiO1xuXG4gICAgICAgIGNvbnN0IGpvYlNjcmlwdEZpbGUgPSBgJHtjd2R9LyR7c3RhdGVEaXJ9L3NjcmlwdHMvJHtzYWZlSm9iTmFtZX1fJHt0aGlzLmpvYklkfWA7XG4gICAgICAgIGF3YWl0IGZzLm91dHB1dEZpbGUoam9iU2NyaXB0RmlsZSwgY21kLCBcInV0Zi04XCIpO1xuICAgICAgICBhd2FpdCBmcy5jaG1vZChqb2JTY3JpcHRGaWxlLCBcIjA3NTVcIik7XG4gICAgICAgIHRoaXMuX2ZpbGVzVG9SbS5wdXNoKGpvYlNjcmlwdEZpbGUpO1xuXG4gICAgICAgIGlmICh0aGlzLmltYWdlTmFtZSkge1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcImNwXCIsIGAke3N0YXRlRGlyfS9zY3JpcHRzLyR7c2FmZUpvYk5hbWV9XyR7dGhpcy5qb2JJZH1gLCBgJHt0aGlzLl9jb250YWluZXJJZH06L2djbC1jbWRgXSwgY3dkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbWFnZUVudHJ5cG9pbnQgJiYgdGhpcy5pbWFnZUVudHJ5cG9pbnRbMF0gIT0gXCJcIikge1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcImNwXCIsIGAke3N0YXRlRGlyfS9zY3JpcHRzL2ltYWdlX2VudHJ5LyR7c2FmZUpvYk5hbWV9XyR7dGhpcy5qb2JJZH1gLCBgJHt0aGlzLl9jb250YWluZXJJZH06L2djbC1lbnRyeWBdLCBjd2QpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3AgPSBleGVjYSh0aGlzLl9jb250YWluZXJJZCA/IGBkb2NrZXIgc3RhcnQgLS1hdHRhY2ggLWkgJHt0aGlzLl9jb250YWluZXJJZH1gIDogXCJiYXNoXCIsIHtcbiAgICAgICAgICAgIGN3ZCxcbiAgICAgICAgICAgIHNoZWxsOiBcImJhc2hcIixcbiAgICAgICAgICAgIGVudjogZXhwYW5kZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG91dEZ1bmMgPSAobGluZTogc3RyaW5nLCBzdHJlYW06ICh0eHQ6IHN0cmluZykgPT4gdm9pZCwgY29sb3JpemU6IChzdHI6IHN0cmluZykgPT4gc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgICAgIHN0cmVhbShgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IGApO1xuICAgICAgICAgICAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoXCJcXHUwMDFiWzMybSRcIikpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0oYCR7Y29sb3JpemUoXCI+XCIpfSBgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0cmVhbShgJHtsaW5lfVxcbmApO1xuICAgICAgICAgICAgZnMuYXBwZW5kRmlsZVN5bmMob3V0cHV0RmlsZXNQYXRoLCBgJHtsaW5lfVxcbmApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHF1aWV0ID0gdGhpcy5hcmd2LnF1aWV0O1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmICghcXVpZXQpIHtcbiAgICAgICAgICAgICAgICBjcC5zdGRvdXQ/LnBpcGUoc3BsaXQyKCkpLm9uKFwiZGF0YVwiLCAoZTogc3RyaW5nKSA9PiBvdXRGdW5jKGUsIHdyaXRlU3RyZWFtcy5zdGRvdXQuYmluZCh3cml0ZVN0cmVhbXMpLCAocykgPT4gY2hhbGtge2dyZWVuQnJpZ2h0ICR7c319YCkpO1xuICAgICAgICAgICAgICAgIGNwLnN0ZGVycj8ucGlwZShzcGxpdDIoKSkub24oXCJkYXRhXCIsIChlOiBzdHJpbmcpID0+IG91dEZ1bmMoZSwgd3JpdGVTdHJlYW1zLnN0ZGVyci5iaW5kKHdyaXRlU3RyZWFtcyksIChzKSA9PiBjaGFsa2B7cmVkQnJpZ2h0ICR7c319YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdm9pZCBjcC5vbihcImV4aXRcIiwgKGNvZGUpID0+IHJlc29sdmUoY29kZSA/PyAwKSk7XG4gICAgICAgICAgICB2b2lkIGNwLm9uKFwiZXJyb3JcIiwgKGVycikgPT4gcmVqZWN0KGVycikpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjcC5zdGRpbj8uZW5kKFwiL2djbC1jbWRcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNwLnN0ZGluPy5lbmQoYC4vJHtzdGF0ZURpcn0vc2NyaXB0cy8ke3NhZmVKb2JOYW1lfV8ke3RoaXMuam9iSWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcHVsbEltYWdlICh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgaW1hZ2VUb1B1bGw6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcImltYWdlXCIsIFwiaW5zcGVjdFwiLCBpbWFnZVRvUHVsbF0pO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInB1bGxcIiwgaW1hZ2VUb1B1bGxdKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IHB1bGxlZH0gJHtpbWFnZVRvUHVsbH0gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXRQcm9kdWNlclJlcG9ydHNEb3RlbnZWYXJpYWJsZXMgKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30pIHtcbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5hcmd2LmN3ZDtcbiAgICAgICAgY29uc3Qgc3RhdGVEaXIgPSB0aGlzLmFyZ3Yuc3RhdGVEaXI7XG4gICAgICAgIGNvbnN0IHByb2R1Y2VycyA9IHRoaXMucHJvZHVjZXJzO1xuICAgICAgICBsZXQgcHJvZHVjZXJSZXBvcnRzRW52cyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHByb2R1Y2VyIG9mIHByb2R1Y2VycyA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgcHJvZHVjZXJEb3RlbnYgPSBVdGlscy5leHBhbmRUZXh0KHByb2R1Y2VyLmRvdGVudiwgZXhwYW5kZWQpO1xuICAgICAgICAgICAgaWYgKHByb2R1Y2VyRG90ZW52ID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3Qgc2FmZVByb2R1Y2VyTmFtZSA9IFV0aWxzLnNhZmVEb2NrZXJTdHJpbmcocHJvZHVjZXIubmFtZSk7XG4gICAgICAgICAgICBjb25zdCBkb3RlbnZGb2xkZXIgPSBgJHtjd2R9LyR7c3RhdGVEaXJ9L2FydGlmYWN0cy8ke3NhZmVQcm9kdWNlck5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnYvYDtcbiAgICAgICAgICAgIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKGRvdGVudkZvbGRlcikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb3RlbnZGaWxlcyA9IChhd2FpdCBVdGlscy5zcGF3bihbXCJmaW5kXCIsIFwiLlwiLCBcIi10eXBlXCIsIFwiZlwiXSwgZG90ZW52Rm9sZGVyKSkuc3Rkb3V0LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZG90ZW52RmlsZSBvZiBkb3RlbnZGaWxlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG90ZW52RmlsZSA9PSBcIlwiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZHVjZXJSZXBvcnRFbnYgPSBkb3RlbnYucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUoYCR7ZG90ZW52Rm9sZGVyfS8ke2RvdGVudkZpbGV9YCkpO1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWNlclJlcG9ydHNFbnZzID0gey4uLnByb2R1Y2VyUmVwb3J0c0VudnMsIC4uLnByb2R1Y2VyUmVwb3J0RW52fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHt5ZWxsb3cgcmVwb3J0cy5kb3RlbnYgcHJvZHVjZWQgYnkgJyR7cHJvZHVjZXIubmFtZX0nIGNvdWxkIG5vdCBiZSBmb3VuZH1cXG5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9kdWNlclJlcG9ydHNFbnZzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29weUNhY2hlSW4gKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30pIHtcbiAgICAgICAgaWYgKHRoaXMuYXJndi5tb3VudENhY2hlICYmIHRoaXMuaW1hZ2VOYW1lKSByZXR1cm47XG4gICAgICAgIGlmICgoIXRoaXMuaW1hZ2VOYW1lICYmICF0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24pIHx8IHRoaXMuY2FjaGUubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5hcmd2LmN3ZDtcbiAgICAgICAgY29uc3Qgc3RhdGVEaXIgPSB0aGlzLmFyZ3Yuc3RhdGVEaXI7XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIGlmICghW1wicHVsbFwiLCBcInB1bGwtcHVzaFwiXS5pbmNsdWRlcyhjLnBvbGljeSkpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZU5hbWUgPSBhd2FpdCB0aGlzLmdldFVuaXF1ZUNhY2hlTmFtZShjd2QsIGV4cGFuZGVkLCBjLmtleSk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZUZvbGRlciA9IGAke2N3ZH0vJHtzdGF0ZURpcn0vY2FjaGUvJHtjYWNoZU5hbWV9YDtcbiAgICAgICAgICAgIGlmICghYXdhaXQgZnMucGF0aEV4aXN0cyhjYWNoZUZvbGRlcikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXdhaXQgTXV0ZXguZXhjbHVzaXZlKGNhY2hlTmFtZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weUluKGNhY2hlRm9sZGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgaW1wb3J0ZWQgY2FjaGUgJyR7Y2FjaGVOYW1lfSd9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29weUFydGlmYWN0c0luICh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBpZiAoKCF0aGlzLmltYWdlTmFtZSAmJiAhdGhpcy5hcmd2LnNoZWxsSXNvbGF0aW9uKSB8fCAodGhpcy5wcm9kdWNlcnMgPz8gW10pLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGN3ZCA9IHRoaXMuYXJndi5jd2Q7XG4gICAgICAgIGNvbnN0IHN0YXRlRGlyID0gdGhpcy5hcmd2LnN0YXRlRGlyO1xuICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9kdWNlciBvZiB0aGlzLnByb2R1Y2VycyA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgcHJvZHVjZXJTYWZlTmFtZSA9IFV0aWxzLnNhZmVEb2NrZXJTdHJpbmcocHJvZHVjZXIubmFtZSk7XG4gICAgICAgICAgICBjb25zdCBhcnRpZmFjdEZvbGRlciA9IGAke2N3ZH0vJHtzdGF0ZURpcn0vYXJ0aWZhY3RzLyR7cHJvZHVjZXJTYWZlTmFtZX1gO1xuICAgICAgICAgICAgaWYgKCFhd2FpdCBmcy5wYXRoRXhpc3RzKGFydGlmYWN0Rm9sZGVyKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLm1rZGlycChhcnRpZmFjdEZvbGRlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlYWRkaXIgPSBhd2FpdCBmcy5yZWFkZGlyKGFydGlmYWN0Rm9sZGVyKTtcbiAgICAgICAgICAgIGlmIChyZWFkZGlyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHt5ZWxsb3cgYXJ0aWZhY3RzIGZyb20ge2JsdWVCcmlnaHQgJHtwcm9kdWNlclNhZmVOYW1lfX0gd2FzIGVtcHR5fVxcbmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuY29weUluKGFydGlmYWN0Rm9sZGVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGltcG9ydGVkIGFydGlmYWN0c30gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgIH1cblxuICAgIGNvcHlJbiAoc291cmNlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc2FmZUpvYk5hbWUgPSB0aGlzLnNhZmVKb2JOYW1lO1xuICAgICAgICBpZiAoIXRoaXMuaW1hZ2VOYW1lICYmIHRoaXMuYXJndi5zaGVsbElzb2xhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnNwYXduKFtcInJzeW5jXCIsIFwiLWFcIiwgYCR7c291cmNlfS8uYCwgYCR7dGhpcy5hcmd2LmN3ZH0vJHt0aGlzLmFyZ3Yuc3RhdGVEaXJ9L2J1aWxkcy8ke3NhZmVKb2JOYW1lfWBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcImNwXCIsIGAke3NvdXJjZX0vLmAsIGAke3RoaXMuX2NvbnRhaW5lcklkfTovZ2NsLWJ1aWxkc2BdKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlDYWNoZU91dCAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIGV4cGFuZGVkOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSwgZXhpdENvZGU6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5hcmd2Lm1vdW50Q2FjaGUgJiYgdGhpcy5pbWFnZU5hbWUpIHJldHVybjtcbiAgICAgICAgaWYgKCghdGhpcy5pbWFnZU5hbWUgJiYgIXRoaXMuYXJndi5zaGVsbElzb2xhdGlvbikgfHwgdGhpcy5jYWNoZS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBjb25zdCBjd2QgPSB0aGlzLmFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IHRoaXMuYXJndi5zdGF0ZURpcjtcblxuICAgICAgICBsZXQgdGltZSwgZW5kVGltZTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2FjaGUpIHtcbiAgICAgICAgICAgIGlmICghW1wicHVzaFwiLCBcInB1bGwtcHVzaFwiXS5pbmNsdWRlcyhjLnBvbGljeSkpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChcIm9uX3N1Y2Nlc3NcIiA9PT0gYy53aGVuICYmIGV4aXRDb2RlICE9IDApIHJldHVybjtcbiAgICAgICAgICAgIGlmIChcIm9uX2ZhaWx1cmVcIiA9PT0gYy53aGVuICYmIGV4aXRDb2RlID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjYWNoZU5hbWUgPSBhd2FpdCB0aGlzLmdldFVuaXF1ZUNhY2hlTmFtZShjd2QsIGV4cGFuZGVkLCBjLmtleSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgYy5wYXRocykge1xuICAgICAgICAgICAgICAgIHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVkUGF0aCA9IFV0aWxzLmV4cGFuZFRleHQocGF0aCwgZXhwYW5kZWQpLnJlcGxhY2UoYCR7ZXhwYW5kZWQuQ0lfUFJPSkVDVF9ESVJ9L2AsIFwiXCIpO1xuICAgICAgICAgICAgICAgIGxldCBjbWQgPSBcInNob3B0IC1zIGdsb2JzdGFyIG51bGxnbG9iIGRvdGdsb2JcXG5cIjtcbiAgICAgICAgICAgICAgICBjbWQgKz0gYG1rZGlyIC1wIC4uLy4uL2NhY2hlLyR7Y2FjaGVOYW1lfVxcbmA7XG4gICAgICAgICAgICAgICAgY21kICs9IGByc3luYyAtUmEgJHtleHBhbmRlZFBhdGh9IC4uLy4uL2NhY2hlLyR7Y2FjaGVOYW1lfS8uIHx8IHRydWVcXG5gO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgTXV0ZXguZXhjbHVzaXZlKGNhY2hlTmFtZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlPdXQoY21kLCBzdGF0ZURpciwgXCJjYWNoZVwiLCBbXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZGRpciA9IGF3YWl0IGZzLnJlYWRkaXIoYCR7dGhpcy5hcmd2LmN3ZH0vJHtzdGF0ZURpcn0vY2FjaGUvJHtjYWNoZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlYWRkaXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHt5ZWxsb3cgISEgbm8gY2FjaGUgd2FzIGNvcGllZCBmb3IgJHtwYXRofSAhIX1cXG5gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBleHBvcnRlZCBjYWNoZSAke2V4cGFuZGVkUGF0aH0gJyR7Y2FjaGVOYW1lfSd9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlBcnRpZmFjdHNPdXQgKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30pIHtcbiAgICAgICAgY29uc3Qgc2FmZUpvYk5hbWUgPSB0aGlzLnNhZmVKb2JOYW1lO1xuICAgICAgICBjb25zdCBjd2QgPSB0aGlzLmFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IHRoaXMuYXJndi5zdGF0ZURpcjtcbiAgICAgICAgY29uc3QgYXJ0aWZhY3RzUGF0aCA9ICF0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24gJiYgIXRoaXMuaW1hZ2VOYW1lID8gYCR7c3RhdGVEaXJ9L2FydGlmYWN0c2AgOiBcIi4uLy4uL2FydGlmYWN0c1wiO1xuXG4gICAgICAgIGlmICghdGhpcy5hcnRpZmFjdHMpIHJldHVybjtcbiAgICAgICAgaWYgKCh0aGlzLmFydGlmYWN0cy5wYXRocz8ubGVuZ3RoID8/IDApID09PSAwICYmIHRoaXMuYXJ0aWZhY3RzLnJlcG9ydHM/LmRvdGVudiA9PSBudWxsKSByZXR1cm47XG5cbiAgICAgICAgbGV0IHRpbWUsIGVuZFRpbWU7XG4gICAgICAgIGxldCBjcENtZCA9IFwic2hvcHQgLXMgZ2xvYnN0YXIgbnVsbGdsb2IgZG90Z2xvYlxcblwiO1xuICAgICAgICBjcENtZCArPSBgbWtkaXIgLXAgJHthcnRpZmFjdHNQYXRofS8ke3NhZmVKb2JOYW1lfVxcbmA7XG4gICAgICAgIGNwQ21kICs9IFwicnN5bmMgLS1leGNsdWRlICcuZ2l0bGFiLWNpLWxvY2FsLyoqJyAtUmEgXCI7XG4gICAgICAgIGZvciAoY29uc3QgYXJ0aWZhY3RFeGNsdWRlUGF0aCBvZiB0aGlzLmFydGlmYWN0cz8uZXhjbHVkZSA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWRQYXRoID0gVXRpbHMuZXhwYW5kVGV4dChhcnRpZmFjdEV4Y2x1ZGVQYXRoLCBleHBhbmRlZCkucmVwbGFjZShgJHtleHBhbmRlZC5DSV9QUk9KRUNUX0RJUn0vYCwgXCJcIik7XG4gICAgICAgICAgICBjcENtZCArPSBgLS1leGNsdWRlICcke2V4cGFuZGVkUGF0aH0nIGA7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBhcnRpZmFjdFBhdGggb2YgdGhpcy5hcnRpZmFjdHM/LnBhdGhzID8/IFtdKSB7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlZFBhdGggPSBVdGlscy5leHBhbmRUZXh0KGFydGlmYWN0UGF0aCwgZXhwYW5kZWQpLnJlcGxhY2UoYCR7ZXhwYW5kZWQuQ0lfUFJPSkVDVF9ESVJ9L2AsIFwiXCIpO1xuICAgICAgICAgICAgY3BDbWQgKz0gYCR7ZXhwYW5kZWRQYXRofSBgO1xuICAgICAgICB9XG4gICAgICAgIGNwQ21kICs9IGAke2FydGlmYWN0c1BhdGh9LyR7c2FmZUpvYk5hbWV9Ly4gfHwgdHJ1ZVxcbmA7XG4gICAgICAgIGNvbnN0IHJlcG9ydERvdGVudiA9IFV0aWxzLmV4cGFuZFRleHQodGhpcy5hcnRpZmFjdHMucmVwb3J0cz8uZG90ZW52ID8/IG51bGwsIGV4cGFuZGVkKTtcbiAgICAgICAgaWYgKHJlcG9ydERvdGVudiAhPSBudWxsKSB7XG4gICAgICAgICAgICBjcENtZCArPSBgbWtkaXIgLXAgJHthcnRpZmFjdHNQYXRofS8ke3NhZmVKb2JOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52XFxuYDtcbiAgICAgICAgICAgIGNwQ21kICs9IGBpZiBbIC1mICR7cmVwb3J0RG90ZW52fSBdOyB0aGVuXFxuYDtcbiAgICAgICAgICAgIGNwQ21kICs9IGAgIHJzeW5jIC1SYSAke3JlcG9ydERvdGVudn0gJHthcnRpZmFjdHNQYXRofS8ke3NhZmVKb2JOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52Ly5cXG5gO1xuICAgICAgICAgICAgY3BDbWQgKz0gXCJmaVxcblwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIGNvbnN0IGRvY2tlckNtZEV4dHJhcyA9IHRoaXMuYXJndi5tb3VudENhY2hlID8gYXdhaXQgdGhpcy5tb3VudENhY2hlQ21kKHdyaXRlU3RyZWFtcywgZXhwYW5kZWQpIDogW107XG4gICAgICAgIGF3YWl0IHRoaXMuY29weU91dChjcENtZCwgc3RhdGVEaXIsIFwiYXJ0aWZhY3RzXCIsIGRvY2tlckNtZEV4dHJhcyk7XG4gICAgICAgIGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcblxuICAgICAgICBpZiAocmVwb3J0RG90ZW52ICE9IG51bGwgJiYgIWF3YWl0IGZzLnBhdGhFeGlzdHMoYCR7Y3dkfS8ke3N0YXRlRGlyfS9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLmdpdGxhYi1jaS1yZXBvcnRzL2RvdGVudi8ke3JlcG9ydERvdGVudn1gKSkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3llbGxvdyBhcnRpZmFjdCByZXBvcnRzIGRvdGVudiAnJHtyZXBvcnREb3RlbnZ9JyBjb3VsZCBub3QgYmUgZm91bmR9XFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWFkZGlyID0gYXdhaXQgZnMucmVhZGRpcihgJHtjd2R9LyR7c3RhdGVEaXJ9L2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICBpZiAocmVhZGRpci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHt5ZWxsb3cgISEgbm8gYXJ0aWZhY3RzIHdhcyBjb3BpZWQgISF9XFxuYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBleHBvcnRlZCBhcnRpZmFjdHN9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFydGlmYWN0c1RvU291cmNlICYmICh0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24gfHwgdGhpcy5pbWFnZU5hbWUpKSB7XG4gICAgICAgICAgICB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFtcInJzeW5jXCIsIFwiLS1leGNsdWRlPS8uZ2l0bGFiLWNpLXJlcG9ydHMvXCIsIFwiLWFcIiwgYCR7Y3dkfS8ke3N0YXRlRGlyfS9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLmAsIGN3ZF0pO1xuICAgICAgICAgICAgaWYgKHJlcG9ydERvdGVudiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW1wicnN5bmNcIiwgXCItYVwiLCBgJHtjd2R9LyR7c3RhdGVEaXJ9L2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52Ly5gLCBjd2RdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGNvcGllZCBhcnRpZmFjdHMgdG8gY3dkfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlPdXQgKGNtZDogc3RyaW5nLCBzdGF0ZURpcjogc3RyaW5nLCB0eXBlOiBcImFydGlmYWN0c1wiIHwgXCJjYWNoZVwiLCBkb2NrZXJDbWRFeHRyYXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcbiAgICAgICAgY29uc3QgYnVpbGRWb2x1bWVOYW1lID0gdGhpcy5idWlsZFZvbHVtZU5hbWU7XG4gICAgICAgIGNvbnN0IGN3ZCA9IHRoaXMuYXJndi5jd2Q7XG5cbiAgICAgICAgYXdhaXQgZnMubWtkaXJwKGAke2N3ZH0vJHtzdGF0ZURpcn0vJHt0eXBlfWApO1xuXG4gICAgICAgIGlmICh0aGlzLmltYWdlTmFtZSkge1xuICAgICAgICAgICAgY29uc3Qge3N0ZG91dDogY29udGFpbmVySWR9ID0gYXdhaXQgVXRpbHMuYmFzaChgZG9ja2VyIGNyZWF0ZSAtaSAke2RvY2tlckNtZEV4dHJhcy5qb2luKFwiIFwiKX0gLXYgJHtidWlsZFZvbHVtZU5hbWV9Oi9nY2wtYnVpbGRzLyAtdyAvZ2NsLWJ1aWxkcyBkb2NrZXIuaW8vZmlyZWNvdy9naXRsYWItY2ktbG9jYWwtdXRpbCBiYXNoIC1jIFwiJHtjbWR9XCJgLCBjd2QpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyc1RvQ2xlYW4ucHVzaChjb250YWluZXJJZCk7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwic3RhcnRcIiwgY29udGFpbmVySWQsIFwiLS1hdHRhY2hcIl0pO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcImNwXCIsIGAke2NvbnRhaW5lcklkfTovJHt0eXBlfS8uYCwgYCR7c3RhdGVEaXJ9LyR7dHlwZX0vLmBdLCBjd2QpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXJndi5zaGVsbElzb2xhdGlvbikge1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuYmFzaChgYmFzaCAtZW8gcGlwZWZhaWwgLWMgXCIke2NtZH1cImAsIGAke2N3ZH0vJHtzdGF0ZURpcn0vYnVpbGRzLyR7c2FmZUpvYk5hbWV9YCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuYXJndi5zaGVsbElzb2xhdGlvbikge1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuYmFzaChgYmFzaCAtZW8gcGlwZWZhaWwgLWMgXCIke2NtZH1cImAsIGAke2N3ZH1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2xvbmdSdW5uaW5nU2lsZW50VGltZW91dCk7XG4gICAgICAgIHRoaXMuX2xvbmdSdW5uaW5nU2lsZW50VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge2dyZXkgPiBzdGlsbCBydW5uaW5nLi4ufVxcbmApO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG4gICAgICAgIH0sIDEwMDAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEV4aXRlZFN0cmluZyAoY29kZTogbnVtYmVyLCB3YXJuaW5nID0gZmFsc2UsIHByZXBlbmRTdHJpbmcgPSBcIlwiKSB7XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkU3RyID0gdGhpcy5nZXRGaW5pc2hlZFN0cmluZygpO1xuICAgICAgICBpZiAod2FybmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGNoYWxrYCR7ZmluaXNoZWRTdHJ9IHtibGFjay5iZ1llbGxvd0JyaWdodCAgV0FSTiAke2NvZGUudG9TdHJpbmcoKX0gfSR7cHJlcGVuZFN0cmluZ31gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoYWxrYCR7ZmluaXNoZWRTdHJ9IHtibGFjay5iZ1JlZCAgRkFJTCAke2NvZGUudG9TdHJpbmcoKX0gfSAke3ByZXBlbmRTdHJpbmd9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyRW5kVGltZSAoKSB7XG4gICAgICAgIHRoaXMuX2VuZFRpbWUgPSB0aGlzLl9lbmRUaW1lID8/IHByb2Nlc3MuaHJ0aW1lKHRoaXMuX3N0YXJ0VGltZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGaW5pc2hlZFN0cmluZyAoKSB7XG4gICAgICAgIHRoaXMuX2VuZFRpbWUgPSB0aGlzLl9lbmRUaW1lID8/IHByb2Nlc3MuaHJ0aW1lKHRoaXMuX3N0YXJ0VGltZSk7XG4gICAgICAgIHJldHVybiBjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgZmluaXNoZWR9IGluIHttYWdlbnRhICR7dGhpcy5wcmV0dHlEdXJhdGlvbn19YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZURvY2tlck5ldHdvcmsgKG5ldHdvcmtOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qge3N0ZG91dDogbmV0d29ya0lkfSA9IGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJuZXR3b3JrXCIsIFwiY3JlYXRlXCIsIGAke25ldHdvcmtOYW1lfWBdKTtcbiAgICAgICAgdGhpcy5fc2VydmljZU5ldHdvcmtJZCA9IG5ldHdvcmtJZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHN0YXJ0U2VydmljZSAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIGV4cGFuZGVkOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSwgc2VydmljZTogU2VydmljZSwgc2VydmljZUluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5hcmd2LmN3ZDtcbiAgICAgICAgY29uc3Qgc3RhdGVEaXIgPSB0aGlzLmFyZ3Yuc3RhdGVEaXI7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcbiAgICAgICAgbGV0IGRvY2tlckNtZCA9IGBkb2NrZXIgY3JlYXRlIC0taW50ZXJhY3RpdmUgLS1uZXR3b3JrIGdpdGxhYi1jaS1sb2NhbC0ke3RoaXMuam9iSWR9IGA7XG4gICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmFyZ3YudW1hc2spIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0tdXNlciAwOjAgXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmd2LnByaXZpbGVnZWQpIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0tcHJpdmlsZWdlZCBcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3YudWxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdWxpbWl0IG5vZmlsZT0ke3RoaXMuYXJndi51bGltaXR9IGA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHZvbHVtZSBvZiB0aGlzLmFyZ3Yudm9sdW1lKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7dm9sdW1lfSBgO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VydmljZUFsaWFzID0gc2VydmljZS5hbGlhcztcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBzZXJ2aWNlLm5hbWU7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24gPSBzZXJ2aWNlTmFtZS5yZXBsYWNlKC8oLiopKDouKikvLCBcIiQxXCIpO1xuICAgICAgICBjb25zdCBhbGlhc2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGFsaWFzZXMuYWRkKHNlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24ucmVwbGFjZUFsbChcIi9cIiwgXCItXCIpKTtcbiAgICAgICAgYWxpYXNlcy5hZGQoc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbi5yZXBsYWNlQWxsKFwiL1wiLCBcIl9fXCIpKTtcbiAgICAgICAgaWYgKHNlcnZpY2VBbGlhcykge1xuICAgICAgICAgICAgYWxpYXNlcy5hZGQoc2VydmljZUFsaWFzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgYWxpYXMgb2YgYWxpYXNlcykge1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLW5ldHdvcmstYWxpYXM9JHthbGlhc30gYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGV4cGFuZGVkKSkge1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtZSAke2tleX0gYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcnZpY2VFbnRyeXBvaW50ID0gc2VydmljZS5lbnRyeXBvaW50O1xuICAgICAgICBjb25zdCBzZXJ2aWNlRW50cnlwb2ludEZpbGUgPSBgJHtjd2R9LyR7c3RhdGVEaXJ9L3NjcmlwdHMvc2VydmljZXNfZW50cnkvJHtzYWZlSm9iTmFtZX1fJHtzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9ufV8ke3NlcnZpY2VJbmRleH1fJHt0aGlzLmpvYklkfWA7XG4gICAgICAgIGlmIChzZXJ2aWNlRW50cnlwb2ludCkge1xuICAgICAgICAgICAgaWYgKHNlcnZpY2VFbnRyeXBvaW50WzBdID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCItLWVudHJ5cG9pbnQgJycgXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLm91dHB1dEZpbGUoc2VydmljZUVudHJ5cG9pbnRGaWxlLCBcIiMhL2Jpbi9zaFxcblwiKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5hcHBlbmRGaWxlKHNlcnZpY2VFbnRyeXBvaW50RmlsZSwgYCR7c2VydmljZUVudHJ5cG9pbnQuam9pbihcIiBcIil9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMuYXBwZW5kRmlsZShzZXJ2aWNlRW50cnlwb2ludEZpbGUsIFwiIFxcXCIkQFxcXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMuY2htb2Qoc2VydmljZUVudHJ5cG9pbnRGaWxlLCBcIjA3NTVcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsZXNUb1JtLnB1c2goc2VydmljZUVudHJ5cG9pbnRGaWxlKTtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCItLWVudHJ5cG9pbnQgJy9nY2wtZW50cnknIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRvY2tlckNtZCArPSBgLS12b2x1bWUgJHt0aGlzLmJ1aWxkVm9sdW1lTmFtZX06L2djbC1idWlsZHMgYDtcbiAgICAgICAgZG9ja2VyQ21kICs9IGAtLXZvbHVtZSAke3RoaXMudG1wVm9sdW1lTmFtZX06JHt0aGlzLmZpbGVWYXJpYWJsZXNEaXJ9IGA7XG4gICAgICAgIGRvY2tlckNtZCArPSBgJHtzZXJ2aWNlTmFtZX0gYDtcblxuICAgICAgICAoc2VydmljZS5jb21tYW5kID8/IFtdKS5mb3JFYWNoKChlKSA9PiBkb2NrZXJDbWQgKz0gYFwiJHtlfVwiIGApO1xuXG4gICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuXG4gICAgICAgIGNvbnN0IHtzdGRvdXQ6IGNvbnRhaW5lcklkfSA9IGF3YWl0IFV0aWxzLmJhc2goZG9ja2VyQ21kLCBjd2QsIGV4cGFuZGVkKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyc1RvQ2xlYW4ucHVzaChjb250YWluZXJJZCk7XG5cbiAgICAgICAgLy8gQ29weSBkb2NrZXIgZW50cnlwb2ludCBpZiBzcGVjaWZpZWQgZm9yIHNlcnZpY2VcbiAgICAgICAgaWYgKHNlcnZpY2VFbnRyeXBvaW50ICYmIHNlcnZpY2VFbnRyeXBvaW50WzBdICE9IFwiXCIpIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJjcFwiLCBzZXJ2aWNlRW50cnlwb2ludEZpbGUsIGAke2NvbnRhaW5lcklkfTovZ2NsLWVudHJ5YF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInN0YXJ0XCIsIGAke2NvbnRhaW5lcklkfWBdKTtcblxuICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IHN0YXJ0ZWQgc2VydmljZSBpbWFnZTogJHtzZXJ2aWNlTmFtZX0gd2l0aCBhbGlhc2VzOiAke0FycmF5LmZyb20oYWxpYXNlcykuam9pbihcIiwgXCIpfX0gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuXG4gICAgICAgIHJldHVybiBjb250YWluZXJJZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNlcnZpY2VIZWFsdGhDaGVjayAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIHNlcnZpY2U6IFNlcnZpY2UsIHNlcnZpY2VJbmRleDogbnVtYmVyLCBzZXJ2aWNlQ29udGFuZXJMb2dGaWxlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZUFsaWFzID0gc2VydmljZS5hbGlhcztcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBzZXJ2aWNlLm5hbWU7XG5cbiAgICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwiaW1hZ2VcIiwgXCJpbnNwZWN0XCIsIHNlcnZpY2VOYW1lXSk7XG4gICAgICAgIGNvbnN0IGltYWdlSW5zcGVjdCA9IEpTT04ucGFyc2Uoc3Rkb3V0KTtcblxuICAgICAgICAvLyBDb3BpZWQgZnJvbSB0aGUgc3RhcnRTZXJ2aWNlIGJsb2NrLiBJbXBvcnRhbnQgdGhpbmcgaXMgdGhhdCB0aGUgYWxpYXNlcyBtYXRjaFxuICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uID0gc2VydmljZU5hbWUucmVwbGFjZSgvKC4qKSg6LiopLywgXCIkMVwiKTtcbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IFtzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uLnJlcGxhY2VBbGwoXCIvXCIsIFwiLVwiKSwgc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbi5yZXBsYWNlQWxsKFwiL1wiLCBcIl9fXCIpXTtcbiAgICAgICAgaWYgKHNlcnZpY2VBbGlhcykge1xuICAgICAgICAgICAgYWxpYXNlcy5wdXNoKHNlcnZpY2VBbGlhcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bmlxdWVBbGlhcyA9IGFsaWFzZXNbYWxpYXNlcy5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAoKGltYWdlSW5zcGVjdFswXT8uQ29uZmlnPy5FeHBvc2VkUG9ydHMgPz8gbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7eWVsbG93IENvdWxkIG5vdCBmaW5kIGV4cG9zZWQgdGNwIHBvcnRzICR7c2VydmljZU5hbWV9fVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBwb3J0IGRlZmluZWQgaW4gdGhlIGltYWdlLCBhbmQgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIGFsaWFzXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFueShPYmplY3Qua2V5cyhpbWFnZUluc3BlY3RbMF0uQ29uZmlnLkV4cG9zZWRQb3J0cykubWFwKChwb3J0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFwb3J0LmVuZHNXaXRoKFwiL3RjcFwiKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcnROdW0gPSBwYXJzZUludChwb3J0LnJlcGxhY2UoXCIvdGNwXCIsIFwiXCIpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGF3bkNtZCA9IFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJydW5cIiwgXCItLXJtXCIsIGAtLW5hbWU9Z2NsLXdhaXQtZm9yLWl0LSR7dGhpcy5qb2JJZH0tJHtzZXJ2aWNlSW5kZXh9LSR7cG9ydE51bX1gLCBcIi0tbmV0d29ya1wiLCBgZ2l0bGFiLWNpLWxvY2FsLSR7dGhpcy5qb2JJZH1gLCBcImRvY2tlci5pby93aWxsd2lsbC93YWl0LWZvci1pdFwiLCBgJHt1bmlxdWVBbGlhc306JHtwb3J0TnVtfWAsIFwiLXRcIiwgXCIzMFwiXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuc3Bhd24oc3Bhd25DbWQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge2dyZWVuQnJpZ2h0IHNlcnZpY2UgaW1hZ2U6ICR7c2VydmljZU5hbWV9IGhlYWx0aGNoZWNrIHBhc3NlZCBpbiB7Z3JlZW4gJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fX1cXG5gKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgICAgICAgZS5lcnJvcnMuZm9yRWFjaCgoc2luZ2xlRXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3JlZEJyaWdodCBzZXJ2aWNlIGltYWdlOiAke3NlcnZpY2VOYW1lfSBoZWFsdGhjaGVjayBmYWlsZWR9XFxuYCk7XG4gICAgICAgICAgICAgICAgc2luZ2xlRXJyb3IubWVzc2FnZS5zcGxpdCgvXFxyP1xcbi9nKS5mb3JFYWNoKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3JlZEJyaWdodCAgICR7bGluZX19XFxuYCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3JlZEJyaWdodCBhbHNvIHNlZSAoJHtzZXJ2aWNlQ29udGFuZXJMb2dGaWxlfSl9XFxuYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIC8vIEtpbGwgYWxsIHdhaXQtZm9yLWl0IGNvbnRhaW5lcnMsIHdoZW4gb25lIGhhdmUgYmVlbiBzdWNjZXNzZnVsXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoT2JqZWN0LmtleXMoaW1hZ2VJbnNwZWN0WzBdLkNvbmZpZy5FeHBvc2VkUG9ydHMpLm1hcCgocG9ydCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcG9ydC5lbmRzV2l0aChcIi90Y3BcIikpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3J0TnVtID0gcGFyc2VJbnQocG9ydC5yZXBsYWNlKFwiL3RjcFwiLCBcIlwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJybVwiLCBcIi12ZlwiLCBgZ2NsLXdhaXQtZm9yLWl0LSR7dGhpcy5qb2JJZH0tJHtzZXJ2aWNlSW5kZXh9LSR7cG9ydE51bX1gXSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhbnVwSm9iUmVzb3VyY2VzIChqb2JzPzogSXRlcmFibGU8Sm9iPikge1xuICAgIGlmICgham9icykgcmV0dXJuO1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgZm9yIChjb25zdCBqb2Igb2Ygam9icykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGpvYi5jbGVhbnVwUmVzb3VyY2VzKCkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59XG4iXX0=
|
|
990
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLCtDQUFpQztBQUNqQyw2Q0FBK0I7QUFDL0Isa0VBQXlDO0FBQ3pDLG9EQUE0QjtBQUM1QixtQ0FBOEI7QUFHOUIsaURBQThDO0FBQzlDLG1DQUE4QjtBQUU5QixrREFBMEI7QUEwQzFCLE1BQU0sYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUU7SUFDckQsSUFBSSxFQUFFLFNBQVM7SUFDZixLQUFLLEVBQUUsU0FBUztJQUNoQixJQUFJLEVBQUUsU0FBUztJQUNmLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLE1BQU0sRUFBRSxLQUFLO0NBQ2hCLENBQUMsQ0FBQztBQUVILE1BQWEsR0FBRztJQUVaLE1BQU0sQ0FBVSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFDdEMsU0FBUyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxVQUFVO1FBQ3JELFFBQVEsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVM7UUFDN0MsY0FBYyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsVUFBVTtLQUNuRCxDQUFDLENBQUM7SUFFTSxJQUFJLENBQU87SUFDWCxJQUFJLENBQVM7SUFDYixRQUFRLENBQVM7SUFDakIsWUFBWSxDQUFrQjtJQUM5QixXQUFXLENBQXNDO0lBQ2pELEtBQUssQ0FBUztJQUNkLEtBQUssQ0FNVjtJQUVLLFlBQVksQ0FBVTtJQUN0QixJQUFJLENBQVM7SUFDYixNQUFNLENBQVc7SUFDakIsV0FBVyxDQUFTO0lBQ3BCLE9BQU8sQ0FBVTtJQUVULFVBQVUsR0FBNEIsRUFBRSxDQUFDO0lBQ2xELG1CQUFtQixHQUFrQixJQUFJLENBQUM7SUFDMUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLGdCQUFnQixHQUFrQixJQUFJLENBQUM7SUFDdkMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixZQUFZLEdBQWtCLElBQUksQ0FBQztJQUNuQyxpQkFBaUIsR0FBa0IsSUFBSSxDQUFDO0lBQ3hDLHFCQUFxQixHQUFhLEVBQUUsQ0FBQztJQUNyQyx5QkFBeUIsR0FBbUIsQ0FBQyxDQUFRLENBQUM7SUFDdEQsVUFBVSxHQUFtRCxJQUFJLENBQUM7SUFDbEUsV0FBVyxHQUFrQixJQUFJLENBQUM7SUFFbEMsa0JBQWtCLEdBQWEsRUFBRSxDQUFDO0lBQ2xDLFVBQVUsR0FBYSxFQUFFLENBQUM7SUFDMUIsVUFBVSxDQUFvQjtJQUM5QixRQUFRLENBQW9CO0lBRW5CLE9BQU8sQ0FBTTtJQUNiLFlBQVksQ0FBZTtJQUU1QyxZQUFhLEdBQWU7UUFDeEIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUN6QixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQzVCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO1FBQzdDLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO1FBQ2xELE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixDQUFDO1FBQ2xELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDdEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDcEMsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUMsbUJBQW1CLENBQUM7UUFFcEQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQzdCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUVuQyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQztRQUNuRCxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO1FBQ2pELElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLE9BQU8sQ0FBQyxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFFL0csMkNBQTJDO1FBQzNDLGVBQWUsQ0FBQyxzQ0FBc0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRXhGLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBQyxHQUFHLGVBQWUsRUFBRSxHQUFHLFlBQVksRUFBRSxHQUFHLGVBQWUsRUFBRSxHQUFHLG1CQUFtQixFQUFFLEdBQUcsYUFBYSxFQUFDLENBQUM7UUFFdEgsSUFBSSxZQUFZLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN4QixZQUFZLEdBQUcsYUFBYSxDQUFDO1FBQ2pDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM3QixZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksUUFBUSxXQUFXLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBRUQsbUJBQW1CLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkQsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDckUsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvRCxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwRCxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDcEosbUJBQW1CLENBQUMsY0FBYyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEQsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxZQUFZLENBQUM7UUFDckQsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEdBQUcsV0FBVyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sV0FBVyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7UUFDakssbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsR0FBRyxXQUFXLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxjQUFjLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxSixtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUMxRSxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3RLLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3hFLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzFELG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNELG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxHQUFHLGtCQUFrQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsRixtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLGdCQUFnQixJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUVoRyxxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsTUFBTSxRQUFRLEdBQUcsYUFBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxhQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxNQUFNLG1CQUFtQixHQUFHLGFBQUssQ0FBQyx1QkFBdUIsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXZILHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUMsR0FBRyxlQUFlLEVBQUUsR0FBRyxZQUFZLEVBQUUsR0FBRyxlQUFlLEVBQUUsR0FBRyxtQkFBbUIsRUFBRSxHQUFHLG1CQUFtQixFQUFFLEdBQUcsYUFBYSxFQUFDLENBQUM7UUFFOUksaURBQWlEO1FBQ2pELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxVQUFVLEdBQUcsYUFBSyxDQUFDLGNBQWMsQ0FBQyxFQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUM7WUFDOUYsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQztZQUM1QyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUMsR0FBRyxlQUFlLEVBQUUsR0FBRyxZQUFZLEVBQUUsR0FBRyxVQUFVLENBQUMsU0FBUyxFQUFFLEdBQUcsZUFBZSxFQUFFLEdBQUcsbUJBQW1CLEVBQUUsR0FBRyxtQkFBbUIsRUFBRSxHQUFHLGFBQWEsRUFBQyxDQUFDO1FBQzNLLENBQUM7UUFDRCxzREFBc0Q7UUFDdEQsS0FBSyxNQUFNLGFBQWEsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDOUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCxJQUFBLGdCQUFNLEVBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUEsZUFBSyxFQUFBLGVBQWUsSUFBSSxDQUFDLElBQUksOEJBQThCLENBQUMsQ0FBQztRQUVsRyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNGLE1BQU0sSUFBSSx1QkFBYyxDQUFDLEVBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixvRUFBb0UsRUFBQyxDQUFDLENBQUM7UUFDdEksQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNsRSxNQUFNLElBQUksdUJBQWMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsK0NBQStDLEVBQUMsQ0FBQyxDQUFDO1FBQ2pILENBQUM7UUFFRCxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFBLGdCQUFNLEVBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBQSxlQUFLLEVBQUEsU0FBUyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsK0NBQStDLENBQUMsQ0FBQztZQUM3SSxJQUFBLGdCQUFNLEVBQUMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBQSxlQUFLLEVBQUEsU0FBUyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUMzSixJQUFBLGdCQUFNLEVBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBQSxlQUFLLEVBQUEsU0FBUyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUMvRixDQUFDO1FBRUQsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdEQsSUFBQSxnQkFBTSxFQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBQSxlQUFLLEVBQUEsU0FBUyxJQUFJLENBQUMsSUFBSSxjQUFjLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUM1RSxJQUFBLGdCQUFNLEVBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUEsZUFBSyxFQUFBLFNBQVMsSUFBSSxDQUFDLElBQUksY0FBYyxDQUFDLDRCQUE0QixDQUFDLENBQUM7WUFDbkgsSUFBQSxnQkFBTSxFQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFBLGVBQUssRUFBQSxTQUFTLElBQUksQ0FBQyxJQUFJLGNBQWMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ2hJLENBQUM7UUFFRCxJQUFBLGdCQUFNLEVBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBQSxlQUFLLEVBQUEsU0FBUyxJQUFJLENBQUMsSUFBSSxvQ0FBb0MsQ0FBQyxDQUFDO1FBRW5JLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JELE1BQU0sUUFBUSxHQUFHLGFBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3hELEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN6QixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNsQixNQUFNLElBQUksR0FBRyxhQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDM0MsSUFBQSxnQkFBTSxFQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFBLGVBQUssRUFBQSxTQUFTLElBQUksQ0FBQyxJQUFJLCtEQUErRCxDQUFDLENBQUM7Z0JBQ3hILENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDakIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3hGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFBLHVCQUFZLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxVQUFVO1lBQ2xCLENBQUMsQ0FBQyxJQUFBLHVCQUFZLEVBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqQixDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDaEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQzVDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQzdFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFVCwrQ0FBK0M7UUFDL0MsT0FBTyxJQUFBLGVBQUssRUFBQSxHQUFHLGVBQWUsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztJQUN0RixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ1gsT0FBTyxhQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDZixPQUFPLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxRQUFRLENBQUM7SUFDekQsQ0FBQztJQUVELElBQUksYUFBYTtRQUNiLE9BQU8sT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQztJQUN2RCxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxJQUFBLGdCQUFNLEVBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUM3RSxPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE1BQU0sUUFBUSxHQUFjLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUV6QyxLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakUsTUFBTSxRQUFRLEdBQUcsYUFBSyxDQUFDLGVBQWUsQ0FBQyxFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUM7WUFDdEYsSUFBSSxXQUFXLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDOUQsV0FBVyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLFNBQVMsQ0FBQztZQUNoRixRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNWLElBQUksRUFBRSxXQUFXO2dCQUNqQixVQUFVLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUk7Z0JBQ3pDLE9BQU8sRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSTtnQkFDbkMsU0FBUyxFQUFFLFFBQVE7Z0JBQ25CLEtBQUssRUFBRSxhQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJO2FBQzlELENBQUMsQ0FBQztRQUNQLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUUsVUFBa0I7UUFDOUIsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxFQUFFLHVDQUF1QyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUUsU0FBeUQ7UUFDcEUsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFLHNDQUFzQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksY0FBYztRQUNkLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxLQUFLLENBQUMsa0JBQWtCLENBQUUsR0FBVyxFQUFFLFFBQWlDLEVBQUUsR0FBUTtRQUNyRixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDekMsT0FBTyxhQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELE9BQU8sS0FBSyxHQUFHLE1BQU0sYUFBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDakUsT0FBTyxHQUFHLEdBQUcsSUFBSSxhQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUQsT0FBTyxPQUFPLGFBQWEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUMvRSxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ1osTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEQsT0FBTyxPQUFPLFlBQVksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUM1RSxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1AsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxPQUFPLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFELENBQUM7SUFFRCxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUNwQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLENBQUM7SUFDL0QsQ0FBQztJQUVELElBQUksZUFBZTtRQUNmLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNoQixPQUFPLHVDQUF1QyxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFHLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNQLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXJCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN2QyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sSUFBSSxDQUFDLGtDQUFrQyxDQUFDLFlBQVksRUFBRSxhQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ25JLE1BQU0sUUFBUSxHQUFHLGFBQUssQ0FBQyxlQUFlLENBQUMsRUFBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxzQkFBc0IsRUFBQyxDQUFDLENBQUM7UUFDeEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRXJDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLFdBQVcsV0FBVyxNQUFNLENBQUM7UUFDbkYsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdkMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFckMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQixZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLEdBQUcsSUFBSSxDQUFDLGdCQUFnQiw2QkFBNkIsU0FBUyxJQUFJLE9BQU8sYUFBYSxJQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQztRQUNySSxDQUFDO1FBRUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNaLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN6QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUUvQyxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7WUFDMUIsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0SCxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BILElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFbEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUVuRCxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDO1lBQ3RCLElBQUksUUFBUSxDQUFDLHNDQUFzQyxDQUFDLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzlELE1BQU0sRUFBQyxNQUFNLEVBQUMsR0FBRyxNQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSw0QkFBNEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ILFFBQVEsR0FBRyxNQUFNLENBQUM7Z0JBQ2xCLElBQUksUUFBUSxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNwQixRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixDQUFDO1lBQ0wsQ0FBQztZQUNELE1BQU0sRUFBQyxNQUFNLEVBQUUsV0FBVyxFQUFDLEdBQUcsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsWUFBWSxlQUFlLGNBQWMsRUFBRSxZQUFZLGFBQWEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSx3Q0FBd0M7Z0JBQ2hNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsUUFBUSw2QkFBNkIsUUFBUSw2QkFBNkIsUUFBUSxzQkFBc0IsUUFBUSxXQUFXLENBQUM7YUFDeEosRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFDLElBQUksTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxnQkFBZ0IsSUFBSSxFQUFFLEdBQUcsV0FBVyxJQUFJLGdCQUFnQixFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xJLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBQ0QsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxtQkFBbUIsRUFBRSxHQUFHLFdBQVcsY0FBYyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RJLE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0YsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2RixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHlEQUF5RCxJQUFBLHVCQUFZLEVBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFJLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRWhFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDYixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFO2dCQUM5QyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNqQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsYUFBSyxDQUFDLGVBQWUsQ0FBQyxFQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3RJLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLG9CQUFvQixJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsSUFBSSxZQUFZLE1BQU0sQ0FBQztnQkFDdEksTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztnQkFDNUYsTUFBTSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUMsR0FBRyxNQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hHLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUM3QyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLHVCQUF1QixFQUFFLG1CQUFtQixNQUFNLHFCQUFxQixNQUFNLElBQUksQ0FBQyxDQUFDO1lBQ25ILENBQUMsQ0FBQyxDQUNMLENBQUM7UUFDTixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLFFBQWdCLEVBQUUsV0FBbUIsRUFBRSxFQUFFO1lBQ3pELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QixJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDaEIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFdBQVcsSUFBSSxDQUFDLENBQUM7WUFDNUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxXQUFXLElBQUksQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMxRCxJQUFJLFFBQVEsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3JELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsQyxDQUFDLENBQUM7UUFFRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0QsUUFBUSxDQUFDLGVBQWUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUN0QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakUsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3hHLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xHLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9CLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLDRDQUE0QyxDQUFDLENBQUM7WUFDL0YsUUFBUSxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ2xGLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDekYsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN2QixZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLGFBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMzSCxDQUFDO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQjtRQUNsQixZQUFZLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFFN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFFL0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUM7Z0JBQ0QsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNULElBQUEsZ0JBQU0sRUFBQyxDQUFDLFlBQVksS0FBSyxFQUFFLDJCQUEyQixDQUFDLENBQUM7WUFDNUQsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQztnQkFDRCxNQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckcsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1QsSUFBQSxnQkFBTSxFQUFDLENBQUMsWUFBWSxLQUFLLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztZQUM1RCxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUM7Z0JBQ0QsS0FBSyxNQUFNLGVBQWUsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztvQkFDdkQsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3RixDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1QsSUFBQSxnQkFBTSxFQUFDLENBQUMsWUFBWSxLQUFLLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztZQUM1RCxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUN0QixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNqQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFOUIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0MsSUFBSSxDQUFDO1lBQ0QsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULElBQUEsZ0JBQU0sRUFBQyxDQUFDLFlBQVksS0FBSyxFQUFFLDJCQUEyQixDQUFDLENBQUM7UUFDNUQsQ0FBQztJQUNMLENBQUM7SUFFTyw2QkFBNkI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM1RSxPQUFPLDJIQUEySCxDQUFDO1FBQ3ZJLENBQUM7UUFDRCxPQUFPLHVCQUF1QixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNILENBQUM7SUFFTyxzQkFBc0IsQ0FBRSxPQUFpQjtRQUM3QyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkIsaUNBQWlDO1lBQ2pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEYsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzNGLEdBQUcsSUFBSSxJQUFBLGVBQUssRUFBQSxrQkFBa0IsSUFBSSxHQUFHLGFBQWEsTUFBTSxDQUFDO1lBRXpELHdCQUF3QjtZQUN4QixHQUFHLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhLENBQUUsWUFBMEIsRUFBRSxRQUFpQztRQUN0RixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVqRSxNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUM7UUFDekIsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekIsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0RixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNsQixNQUFNLElBQUksR0FBRyxhQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDM0MsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsNENBQTRDLElBQUksSUFBSSxDQUFDLENBQUM7Z0JBQ3ZHLE1BQU0sVUFBVSxHQUFHLGFBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxvQkFBb0IsSUFBSSxlQUFlLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLFVBQVUsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUM7WUFDeEQsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVcsQ0FBRSxPQUFpQixFQUFFLFFBQWlDO1FBQzNFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3BDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckMsTUFBTSxlQUFlLEdBQUcsR0FBRyxHQUFHLElBQUksUUFBUSxXQUFXLFdBQVcsTUFBTSxDQUFDO1FBQ3ZFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFFdkMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDN0MsT0FBTyxDQUFDLENBQUM7UUFDYixDQUFDO1FBRUQscUVBQXFFO1FBQ3JFLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QyxNQUFNLGFBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELE1BQU0sYUFBYSxHQUFHLElBQUEsZUFBSyxFQUFDLElBQUksRUFBRTtnQkFDOUIsR0FBRztnQkFDSCxLQUFLLEVBQUUsTUFBTTtnQkFDYixLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztnQkFDeEMsR0FBRyxFQUFFLEVBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFDO2FBQ3JDLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQzNDLEtBQUssYUFBYSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUQsS0FBSyxhQUFhLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekQsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsSUFBSSxDQUFDLCtCQUErQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRW5ELElBQUksU0FBUyxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRTlDLElBQUksU0FBUyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIseUJBQXlCLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUM7WUFDakgsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN2QixTQUFTLElBQUksZUFBZSxDQUFDO1lBQ2pDLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUM1QixTQUFTLElBQUksbUJBQW1CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDeEQsQ0FBQztZQUVELElBQUksUUFBUSxDQUFDLHNDQUFzQyxDQUFDLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQy9ELFNBQVMsSUFBSSxhQUFhLENBQUM7WUFDL0IsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsU0FBUyxJQUFJLDZCQUE2QixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7Z0JBQ3hELFNBQVMsSUFBSSx3QkFBd0IsQ0FBQztZQUMxQyxDQUFDO1lBRUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN0QyxTQUFTLElBQUksYUFBYSxPQUFPLEdBQUcsQ0FBQztZQUN6QyxDQUFDO1lBRUQsU0FBUyxJQUFJLFlBQVksZUFBZSxlQUFlLENBQUM7WUFDeEQsU0FBUyxJQUFJLFlBQVksYUFBYSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDO1lBQ25FLFNBQVMsSUFBSSx3QkFBd0IsQ0FBQztZQUV0QyxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3BDLFNBQVMsSUFBSSxZQUFZLE1BQU0sR0FBRyxDQUFDO1lBQ3ZDLENBQUM7WUFFRCxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzFDLFNBQVMsSUFBSSxjQUFjLFNBQVMsR0FBRyxDQUFDO1lBQzVDLENBQUM7WUFFRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNoRCxTQUFTLElBQUksT0FBTyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7WUFDdkMsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN2QixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ2hDLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQztnQkFDcEMsQ0FBQztxQkFBTSxDQUFDO29CQUNKLFNBQVMsSUFBSSxnQkFBZ0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUM1RCxDQUFDO1lBQ0wsQ0FBQztZQUVELFNBQVMsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ2hGLFNBQVMsSUFBSSxHQUFHLFNBQVMsR0FBRyxDQUFDO1lBRTdCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDekMsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUVELFNBQVMsSUFBSSxZQUFZLENBQUM7WUFDMUIsU0FBUyxJQUFJLHVDQUF1QyxDQUFDO1lBQ3JELFNBQVMsSUFBSSwrQkFBK0IsQ0FBQztZQUM3QyxTQUFTLElBQUksbUNBQW1DLENBQUM7WUFDakQsU0FBUyxJQUFJLHlCQUF5QixDQUFDO1lBQ3ZDLFNBQVMsSUFBSSwrQkFBK0IsQ0FBQztZQUM3QyxTQUFTLElBQUkscUJBQXFCLENBQUM7WUFDbkMsU0FBUyxJQUFJLHVDQUF1QyxDQUFDO1lBQ3JELFNBQVMsSUFBSSw2QkFBNkIsQ0FBQztZQUMzQyxTQUFTLElBQUksaUNBQWlDLENBQUM7WUFDL0MsU0FBUyxJQUFJLHVCQUF1QixDQUFDO1lBQ3JDLFNBQVMsSUFBSSw2QkFBNkIsQ0FBQztZQUMzQyxTQUFTLElBQUksbUJBQW1CLENBQUM7WUFDakMsU0FBUyxJQUFJLGlDQUFpQyxDQUFDO1lBQy9DLFNBQVMsSUFBSSx1QkFBdUIsQ0FBQztZQUNyQyxTQUFTLElBQUksUUFBUSxDQUFDO1lBQ3RCLFNBQVMsSUFBSSwwQkFBMEIsQ0FBQztZQUN4QyxTQUFTLElBQUksWUFBWSxDQUFDO1lBQzFCLFNBQVMsSUFBSSxRQUFRLENBQUM7WUFFdEIsTUFBTSxFQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUMsR0FBRyxNQUFNLGFBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV6QyxJQUFJLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQztRQUMvQixHQUFHLElBQUkscUJBQXFCLENBQUM7UUFFN0IsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pDLEdBQUcsSUFBSSxNQUFNLFFBQVEsV0FBVyxXQUFXLEtBQUssQ0FBQztRQUNyRCxDQUFDO1FBQ0QsR0FBRyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU1QyxHQUFHLElBQUksVUFBVSxDQUFDO1FBRWxCLE1BQU0sYUFBYSxHQUFHLEdBQUcsR0FBRyxJQUFJLFFBQVEsWUFBWSxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hGLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFcEMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNaLE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLEdBQUcsUUFBUSxZQUFZLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxXQUFXLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2SixDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUcsSUFBQSxlQUFLLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixzQkFBc0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDckgsR0FBRztZQUNILEtBQUssRUFBRSxNQUFNO1lBQ2IsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUTtTQUMxQyxDQUFDLENBQUM7UUFFSCxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQVksRUFBRSxNQUE2QixFQUFFLFFBQWlDLEVBQUUsRUFBRTtZQUMvRixJQUFJLENBQUMsK0JBQStCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7WUFDRCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ3BCLEVBQUUsQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUM7UUFFRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUU5QixPQUFPLE1BQU0sSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDakQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNULEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUEsZ0JBQU0sR0FBRSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBQSxlQUFLLEVBQUEsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUksRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBQSxnQkFBTSxHQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLGVBQUssRUFBQSxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1SSxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRTFDLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ1osRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssUUFBUSxZQUFZLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN4RSxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sU0FBUyxDQUFFLE9BQWdDLEVBQUU7UUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLGFBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsU0FBUyxDQUFDO0lBQ3ZFLENBQUM7SUFFTyxLQUFLLENBQUMsU0FBUyxDQUFFLFlBQTBCLEVBQUUsV0FBbUI7UUFDcEUsSUFBSSxDQUFDO1lBQ0QsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDOUIsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN4RSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLDJCQUEyQixXQUFXLGdCQUFnQixJQUFBLHVCQUFZLEVBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25JLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RCxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBRSxZQUEwQixFQUFFLFFBQWlDO1FBQzNHLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDakMsSUFBSSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDN0IsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLElBQUksRUFBRSxFQUFFLENBQUM7WUFDckMsTUFBTSxjQUFjLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ25FLElBQUksY0FBYyxLQUFLLElBQUk7Z0JBQUUsU0FBUztZQUV0QyxNQUFNLGdCQUFnQixHQUFHLGFBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0QsTUFBTSxZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksUUFBUSxjQUFjLGdCQUFnQiw2QkFBNkIsQ0FBQztZQUNuRyxJQUFJLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEcsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxVQUFVLElBQUksRUFBRTt3QkFBRSxTQUFTO29CQUMvQixNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsWUFBWSxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDM0YsbUJBQW1CLEdBQUcsRUFBQyxHQUFHLG1CQUFtQixFQUFFLEdBQUcsaUJBQWlCLEVBQUMsQ0FBQztnQkFDekUsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDSixZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLEdBQUcsSUFBSSxDQUFDLGdCQUFnQix3Q0FBd0MsUUFBUSxDQUFDLElBQUkseUJBQXlCLENBQUMsQ0FBQztZQUNySSxDQUFDO1FBRUwsQ0FBQztRQUNELE9BQU8sbUJBQW1CLENBQUM7SUFDL0IsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXLENBQUUsWUFBMEIsRUFBRSxRQUFpQztRQUNwRixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBTztRQUM3RCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUVoRyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUMxQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUVwQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQUUsT0FBTztZQUV0RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEUsTUFBTSxXQUFXLEdBQUcsR0FBRyxHQUFHLElBQUksUUFBUSxVQUFVLFNBQVMsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsU0FBUztZQUNiLENBQUM7WUFFRCxNQUFNLGFBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN4QyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbkMsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLG1DQUFtQyxTQUFTLGtCQUFrQixJQUFBLHVCQUFZLEVBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9JLENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FBRSxZQUEwQjtRQUNyRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUVuSCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUMxQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDOUIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUMxQyxNQUFNLGdCQUFnQixHQUFHLGFBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0QsTUFBTSxjQUFjLEdBQUcsR0FBRyxHQUFHLElBQUksUUFBUSxjQUFjLGdCQUFnQixFQUFFLENBQUM7WUFDMUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDcEMsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNqRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHVDQUF1QyxnQkFBZ0IsZ0JBQWdCLENBQUMsQ0FBQztZQUM5SCxDQUFDO1lBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLG1EQUFtRCxJQUFBLHVCQUFZLEVBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BJLENBQUM7SUFFRCxNQUFNLENBQUUsTUFBYztRQUNsQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQy9ELE9BQU8sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxXQUFXLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2SCxDQUFDO1FBQ0QsT0FBTyxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDakgsQ0FBQztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUUsWUFBMEIsRUFBRSxRQUFpQyxFQUFFLFFBQWdCO1FBQ3ZHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7WUFBRSxPQUFPO1FBQzdELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBRWhHLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRXBDLElBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQztRQUNsQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQUUsT0FBTztZQUN0RCxJQUFJLFlBQVksS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLFFBQVEsSUFBSSxDQUFDO2dCQUFFLE9BQU87WUFDckQsSUFBSSxZQUFZLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxRQUFRLEtBQUssQ0FBQztnQkFBRSxPQUFPO1lBQ3RELE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RFLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN6QixJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN4QixNQUFNLFlBQVksR0FBRyxhQUFLLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsY0FBYyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2pHLElBQUksR0FBRyxHQUFHLHNDQUFzQyxDQUFDO2dCQUNqRCxHQUFHLElBQUksd0JBQXdCLFNBQVMsSUFBSSxDQUFDO2dCQUM3QyxHQUFHLElBQUksYUFBYSxZQUFZLGdCQUFnQixTQUFTLGNBQWMsQ0FBQztnQkFFeEUsTUFBTSxhQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDeEMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFL0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksUUFBUSxVQUFVLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdkIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsdUNBQXVDLElBQUksUUFBUSxDQUFDLENBQUM7Z0JBQzFHLENBQUM7cUJBQU0sQ0FBQztvQkFDSixZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixrQ0FBa0MsWUFBWSxLQUFLLFNBQVMsa0JBQWtCLElBQUEsdUJBQVksRUFBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9KLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUUsWUFBMEIsRUFBRSxRQUFpQztRQUN6RixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztRQUUzSCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxJQUFJO1lBQUUsT0FBTztRQUVoRyxJQUFJLElBQUksRUFBRSxPQUFPLENBQUM7UUFDbEIsSUFBSSxLQUFLLEdBQUcsc0NBQXNDLENBQUM7UUFDbkQsS0FBSyxJQUFJLFlBQVksYUFBYSxJQUFJLFdBQVcsSUFBSSxDQUFDO1FBQ3RELEtBQUssSUFBSSw0Q0FBNEMsQ0FBQztRQUN0RCxLQUFLLE1BQU0sbUJBQW1CLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7WUFDOUQsTUFBTSxZQUFZLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsY0FBYyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEgsS0FBSyxJQUFJLGNBQWMsWUFBWSxJQUFJLENBQUM7UUFDNUMsQ0FBQztRQUNELEtBQUssTUFBTSxZQUFZLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLENBQUM7WUFDckQsTUFBTSxZQUFZLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLGNBQWMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pHLEtBQUssSUFBSSxHQUFHLFlBQVksR0FBRyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxLQUFLLElBQUksR0FBRyxhQUFhLElBQUksV0FBVyxjQUFjLENBQUM7UUFDdkQsTUFBTSxZQUFZLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hGLElBQUksWUFBWSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLEtBQUssSUFBSSxZQUFZLGFBQWEsSUFBSSxXQUFXLDhCQUE4QixDQUFDO1lBQ2hGLEtBQUssSUFBSSxXQUFXLFlBQVksWUFBWSxDQUFDO1lBQzdDLEtBQUssSUFBSSxlQUFlLFlBQVksSUFBSSxhQUFhLElBQUksV0FBVyxnQ0FBZ0MsQ0FBQztZQUNyRyxLQUFLLElBQUksTUFBTSxDQUFDO1FBQ3BCLENBQUM7UUFFRCxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3hCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRS9CLElBQUksWUFBWSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxRQUFRLGNBQWMsV0FBVyw4QkFBOEIsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3hJLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLHFDQUFxQyxZQUFZLHlCQUF5QixDQUFDLENBQUM7UUFDakksQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxRQUFRLGNBQWMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNoRixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsMkNBQTJDLENBQUMsQ0FBQztRQUNsRyxDQUFDO2FBQU0sQ0FBQztZQUNKLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLG1EQUFtRCxJQUFBLHVCQUFZLEVBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BJLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25GLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsSUFBSSxRQUFRLGNBQWMsV0FBVyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzSCxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsSUFBSSxRQUFRLGNBQWMsV0FBVyw4QkFBOEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZILENBQUM7WUFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLEdBQUcsSUFBSSxDQUFDLGdCQUFnQix3REFBd0QsSUFBQSx1QkFBWSxFQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6SSxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQUUsR0FBVyxFQUFFLFFBQWdCLEVBQUUsSUFBMkIsRUFBRSxlQUF5QjtRQUN4RyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3JDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFFMUIsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTlDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLEVBQUMsTUFBTSxFQUFFLFdBQVcsRUFBQyxHQUFHLE1BQU0sYUFBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLGNBQWMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxlQUFlLGdGQUFnRixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6TyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3JGLE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLEdBQUcsV0FBVyxLQUFLLElBQUksSUFBSSxFQUFFLEdBQUcsUUFBUSxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEgsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNsQyxNQUFNLGFBQUssQ0FBQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLFFBQVEsV0FBVyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2xHLENBQUM7YUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNuQyxNQUFNLGFBQUssQ0FBQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoRSxDQUFDO0lBQ0wsQ0FBQztJQUVPLCtCQUErQixDQUFFLFlBQTBCO1FBQy9ELFlBQVksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMseUJBQXlCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUM3QyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLEdBQUcsSUFBSSxDQUFDLGdCQUFnQiw4QkFBOEIsQ0FBQyxDQUFDO1lBQ2pGLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RCxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBRU8sZUFBZSxDQUFFLElBQVksRUFBRSxPQUFPLEdBQUcsS0FBSyxFQUFFLGFBQWEsR0FBRyxFQUFFO1FBQ3RFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLElBQUEsZUFBSyxFQUFBLEdBQUcsV0FBVyxnQ0FBZ0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLGFBQWEsRUFBRSxDQUFDO1FBQ2xHLENBQUM7UUFFRCxPQUFPLElBQUEsZUFBSyxFQUFBLEdBQUcsV0FBVyx1QkFBdUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLGFBQWEsRUFBRSxDQUFDO0lBQzFGLENBQUM7SUFFTyxlQUFlO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU8saUJBQWlCO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqRSxPQUFPLElBQUEsZUFBSyxFQUFBLEdBQUcsSUFBSSxDQUFDLGdCQUFnQix5Q0FBeUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDO0lBQ3hHLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CLENBQUUsV0FBbUI7UUFDbEQsTUFBTSxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUMsR0FBRyxNQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FBRSxZQUEwQixFQUFFLFFBQWlDLEVBQUUsT0FBZ0I7UUFDdkcsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDMUIsSUFBSSxTQUFTLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixtREFBbUQsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDO1FBQ2pILElBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVuRCxJQUFJLFFBQVEsQ0FBQyxzQ0FBc0MsQ0FBQyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQy9ELFNBQVMsSUFBSSxhQUFhLENBQUM7UUFDL0IsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2QixTQUFTLElBQUksZUFBZSxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzVCLFNBQVMsSUFBSSxtQkFBbUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUN4RCxDQUFDO1FBRUQsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLFNBQVMsSUFBSSxZQUFZLE1BQU0sR0FBRyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ25DLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDakMsTUFBTSx5QkFBeUIsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RSxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVELE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdELElBQUksWUFBWSxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzFCLFNBQVMsSUFBSSxtQkFBbUIsS0FBSyxHQUFHLENBQUM7UUFDN0MsQ0FBQztRQUVELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDaEQsU0FBUyxJQUFJLE9BQU8sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDN0MsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3BCLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQzdCLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQztZQUNwQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osU0FBUyxJQUFJLGdCQUFnQixpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3pELENBQUM7UUFDTCxDQUFDO1FBQ0QsU0FBUyxJQUFJLFlBQVksSUFBSSxDQUFDLGVBQWUsZUFBZSxDQUFDO1FBQzdELFNBQVMsSUFBSSxZQUFZLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUM7UUFDeEUsU0FBUyxJQUFJLEdBQUcsV0FBVyxHQUFHLENBQUM7UUFFL0IsSUFBSSxpQkFBaUIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDdEMsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXJGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUU5QixNQUFNLEVBQUMsTUFBTSxFQUFFLFdBQVcsRUFBQyxHQUFHLE1BQU0sYUFBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUxQyxNQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxHQUFHLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU5RSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLDBDQUEwQyxXQUFXLGtCQUFrQixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUEsdUJBQVksRUFBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbk0sT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBRSxZQUEwQixFQUFFLE9BQWdCLEVBQUUsWUFBb0IsRUFBRSxzQkFBOEI7UUFDaEksTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNuQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBRWpDLE1BQU0sRUFBQyxNQUFNLEVBQUMsR0FBRyxNQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUNyRyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXhDLGdGQUFnRjtRQUNoRixNQUFNLHlCQUF5QixHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sT0FBTyxHQUFHLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEgsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWhELElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMzRCxPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLDZDQUE2QyxXQUFXLEtBQUssQ0FBQyxDQUFDO1FBQzNILENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDO1lBQ0QsK0VBQStFO1lBQy9FLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQzVFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztvQkFBRSxPQUFPO2dCQUNuQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsMEJBQTBCLElBQUksQ0FBQyxLQUFLLElBQUksWUFBWSxJQUFJLE9BQU8sRUFBRSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLGdDQUFnQyxFQUFFLEdBQUcsV0FBVyxJQUFJLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDNVAsT0FBTyxhQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDSixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGdDQUFnQyxXQUFXLGlDQUFpQyxJQUFBLHVCQUFZLEVBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlKLENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLGNBQWMsQ0FBQztnQkFBRSxNQUFNLENBQUMsQ0FBQztZQUM1QyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQWtCLEVBQUUsRUFBRTtnQkFDcEMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsOEJBQThCLFdBQVcsd0JBQXdCLENBQUMsQ0FBQztnQkFDcEgsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUU7b0JBQ3pELFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGlCQUFpQixJQUFJLEtBQUssQ0FBQyxDQUFDO2dCQUNqRixDQUFDLENBQUMsQ0FBQztnQkFDSCxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLEdBQUcsSUFBSSxDQUFDLGdCQUFnQix5QkFBeUIsc0JBQXNCLE1BQU0sQ0FBQyxDQUFDO1lBQzVHLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztnQkFBUyxDQUFDO1lBQ1AsaUVBQWlFO1lBQ2pFLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ25GLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztvQkFBRSxPQUFPO2dCQUNuQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkQsT0FBTyxhQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixJQUFJLENBQUMsS0FBSyxJQUFJLFlBQVksSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUM7SUFDTCxDQUFDOztBQWpqQ0wsa0JBa2pDQztBQUVNLEtBQUssVUFBVSxtQkFBbUIsQ0FBRSxJQUFvQjtJQUMzRCxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU87SUFDbEIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDckIsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQVBELGtEQU9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0ICogYXMgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0IHByZXR0eUhydGltZSBmcm9tIFwicHJldHR5LWhydGltZVwiO1xuaW1wb3J0IHNwbGl0MiBmcm9tIFwic3BsaXQyXCI7XG5pbXBvcnQge1V0aWxzfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtXcml0ZVN0cmVhbXN9IGZyb20gXCIuL3dyaXRlLXN0cmVhbXNcIjtcbmltcG9ydCB7R2l0RGF0YX0gZnJvbSBcIi4vZ2l0LWRhdGFcIjtcbmltcG9ydCBhc3NlcnQsIHtBc3NlcnRpb25FcnJvcn0gZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHtNdXRleH0gZnJvbSBcIi4vbXV0ZXhcIjtcbmltcG9ydCB7QXJndn0gZnJvbSBcIi4vYXJndlwiO1xuaW1wb3J0IGV4ZWNhIGZyb20gXCJleGVjYVwiO1xuaW1wb3J0IHtDSUNEVmFyaWFibGV9IGZyb20gXCIuL3ZhcmlhYmxlcy1mcm9tLWZpbGVzXCI7XG5cbmludGVyZmFjZSBKb2JPcHRpb25zIHtcbiAgICBhcmd2OiBBcmd2O1xuICAgIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zO1xuICAgIGRhdGE6IGFueTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYmFzZU5hbWU6IHN0cmluZztcbiAgICBwaXBlbGluZUlpZDogbnVtYmVyO1xuICAgIGdpdERhdGE6IEdpdERhdGE7XG4gICAgZ2xvYmFsVmFyaWFibGVzOiB7W25hbWU6IHN0cmluZ106IHN0cmluZ307XG4gICAgdmFyaWFibGVzRnJvbUZpbGVzOiB7W25hbWU6IHN0cmluZ106IENJQ0RWYXJpYWJsZX07XG4gICAgcHJlZGVmaW5lZFZhcmlhYmxlczoge1tuYW1lOiBzdHJpbmddOiBhbnl9O1xuICAgIG1hdHJpeFZhcmlhYmxlczoge1trZXk6IHN0cmluZ106IHN0cmluZ30gfCBudWxsO1xuICAgIG5vZGVJbmRleDogbnVtYmVyIHwgbnVsbDtcbiAgICBub2Rlc1RvdGFsOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBDYWNoZSB7XG4gICAgcG9saWN5OiBcInB1bGxcIiB8IFwicHVsbC1wdXNoXCIgfCBcInB1c2hcIjtcbiAgICBrZXk6IHN0cmluZyB8IHtmaWxlczogc3RyaW5nW119O1xuICAgIHBhdGhzOiBzdHJpbmdbXTtcbiAgICB3aGVuOiBcIm9uX3N1Y2Nlc3NcIiB8IFwib25fZmFpbHVyZVwiIHwgXCJhbHdheXNcIjtcbn1cblxuaW50ZXJmYWNlIFNlcnZpY2Uge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBlbnRyeXBvaW50OiBzdHJpbmdbXSB8IG51bGw7XG4gICAgY29tbWFuZDogc3RyaW5nW10gfCBudWxsO1xuICAgIGFsaWFzOiBzdHJpbmcgfCBudWxsO1xuICAgIHZhcmlhYmxlczoge1tuYW1lOiBzdHJpbmddOiBzdHJpbmd9O1xufVxuXG5pbnRlcmZhY2UgTmVlZCB7XG4gICAgam9iOiBzdHJpbmc7XG4gICAgYXJ0aWZhY3RzOiBib29sZWFuO1xuICAgIG9wdGlvbmFsOiBib29sZWFuO1xuICAgIHBpcGVsaW5lOiBzdHJpbmcgfCBudWxsO1xuICAgIHByb2plY3Q6IHN0cmluZyB8IG51bGw7XG59XG5cbmNvbnN0IGRhdGVGb3JtYXR0ZXIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh1bmRlZmluZWQsIHtcbiAgICB5ZWFyOiB1bmRlZmluZWQsXG4gICAgbW9udGg6IHVuZGVmaW5lZCxcbiAgICBob3VyOiBcIm51bWVyaWNcIixcbiAgICBtaW51dGU6IFwibnVtZXJpY1wiLFxuICAgIHNlY29uZDogXCJudW1lcmljXCIsXG4gICAgaG91cjEyOiBmYWxzZSxcbn0pO1xuXG5leHBvcnQgY2xhc3MgSm9iIHtcblxuICAgIHN0YXRpYyByZWFkb25seSBpbGxlZ2FsSm9iTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAgICAgXCJpbmNsdWRlXCIsIFwibG9jYWxfY29uZmlndXJhdGlvblwiLCBcImltYWdlXCIsIFwic2VydmljZXNcIixcbiAgICAgICAgXCJzdGFnZXNcIiwgXCJ0eXBlc1wiLCBcImJlZm9yZV9zY3JpcHRcIiwgXCJkZWZhdWx0XCIsXG4gICAgICAgIFwiYWZ0ZXJfc2NyaXB0XCIsIFwidmFyaWFibGVzXCIsIFwiY2FjaGVcIiwgXCJ3b3JrZmxvd1wiLFxuICAgIF0pO1xuXG4gICAgcmVhZG9ubHkgYXJndjogQXJndjtcbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgYmFzZU5hbWU6IHN0cmluZztcbiAgICByZWFkb25seSBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdIHwgbnVsbDtcbiAgICByZWFkb25seSBlbnZpcm9ubWVudD86IHtuYW1lOiBzdHJpbmc7IHVybDogc3RyaW5nIHwgbnVsbH07XG4gICAgcmVhZG9ubHkgam9iSWQ6IG51bWJlcjtcbiAgICByZWFkb25seSBydWxlcz86IHtcbiAgICAgICAgaWY6IHN0cmluZztcbiAgICAgICAgd2hlbjogc3RyaW5nO1xuICAgICAgICBleGlzdHM6IHN0cmluZ1tdO1xuICAgICAgICBhbGxvd19mYWlsdXJlOiBib29sZWFuO1xuICAgICAgICB2YXJpYWJsZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICAgIH1bXTtcblxuICAgIHJlYWRvbmx5IGFsbG93RmFpbHVyZTogYm9vbGVhbjtcbiAgICByZWFkb25seSB3aGVuOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZXhpc3RzOiBzdHJpbmdbXTtcbiAgICByZWFkb25seSBwaXBlbGluZUlpZDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGdpdERhdGE6IEdpdERhdGE7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF92YXJpYWJsZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gICAgcHJpdmF0ZSBfcHJlc2NyaXB0c0V4aXRDb2RlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9hZnRlclNjcmlwdHNFeGl0Q29kZSA9IDA7XG4gICAgcHJpdmF0ZSBfY292ZXJhZ2VQZXJjZW50OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9ydW5uaW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY29udGFpbmVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX3NlcnZpY2VOZXR3b3JrSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2NvbnRhaW5lclZvbHVtZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX2xvbmdSdW5uaW5nU2lsZW50VGltZW91dDogTm9kZUpTLlRpbWVvdXQgPSAtMSBhcyBhbnk7XG4gICAgcHJpdmF0ZSBfcHJvZHVjZXJzOiB7bmFtZTogc3RyaW5nOyBkb3RlbnY6IHN0cmluZyB8IG51bGx9W10gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9qb2JOYW1lUGFkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgX2NvbnRhaW5lcnNUb0NsZWFuOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX2ZpbGVzVG9SbTogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9zdGFydFRpbWU/OiBbbnVtYmVyLCBudW1iZXJdO1xuICAgIHByaXZhdGUgX2VuZFRpbWU/OiBbbnVtYmVyLCBudW1iZXJdO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBqb2JEYXRhOiBhbnk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcztcblxuICAgIGNvbnN0cnVjdG9yIChvcHQ6IEpvYk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgam9iRGF0YSA9IG9wdC5kYXRhO1xuICAgICAgICBjb25zdCBnaXREYXRhID0gb3B0LmdpdERhdGE7XG4gICAgICAgIGNvbnN0IGpvYlZhcmlhYmxlcyA9IGpvYkRhdGEudmFyaWFibGVzID8/IHt9O1xuICAgICAgICBjb25zdCBnbG9iYWxWYXJpYWJsZXMgPSBvcHQuZ2xvYmFsVmFyaWFibGVzID8/IHt9O1xuICAgICAgICBjb25zdCB2YXJpYWJsZXNGcm9tRmlsZXMgPSBvcHQudmFyaWFibGVzRnJvbUZpbGVzO1xuICAgICAgICBjb25zdCBhcmd2ID0gb3B0LmFyZ3Y7XG4gICAgICAgIGNvbnN0IGN3ZCA9IGFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IGFyZ3Yuc3RhdGVEaXI7XG4gICAgICAgIGNvbnN0IGFyZ3ZWYXJpYWJsZXMgPSBhcmd2LnZhcmlhYmxlO1xuICAgICAgICBjb25zdCBwcmVkZWZpbmVkVmFyaWFibGVzID0gb3B0LnByZWRlZmluZWRWYXJpYWJsZXM7XG5cbiAgICAgICAgdGhpcy5hcmd2ID0gYXJndjtcbiAgICAgICAgdGhpcy53cml0ZVN0cmVhbXMgPSBvcHQud3JpdGVTdHJlYW1zO1xuICAgICAgICB0aGlzLmdpdERhdGEgPSBvcHQuZ2l0RGF0YTtcbiAgICAgICAgdGhpcy5uYW1lID0gb3B0Lm5hbWU7XG4gICAgICAgIHRoaXMuYmFzZU5hbWUgPSBvcHQuYmFzZU5hbWU7XG4gICAgICAgIHRoaXMuam9iSWQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKTtcbiAgICAgICAgdGhpcy5qb2JEYXRhID0gb3B0LmRhdGE7XG4gICAgICAgIHRoaXMucGlwZWxpbmVJaWQgPSBvcHQucGlwZWxpbmVJaWQ7XG5cbiAgICAgICAgdGhpcy53aGVuID0gam9iRGF0YS53aGVuIHx8IFwib25fc3VjY2Vzc1wiO1xuICAgICAgICB0aGlzLmV4aXN0cyA9IGpvYkRhdGEuZXhpc3RzIHx8IFtdO1xuICAgICAgICB0aGlzLmFsbG93RmFpbHVyZSA9IGpvYkRhdGEuYWxsb3dfZmFpbHVyZSA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBqb2JEYXRhLmRlcGVuZGVuY2llcyB8fCBudWxsO1xuICAgICAgICB0aGlzLnJ1bGVzID0gam9iRGF0YS5ydWxlcyB8fCBudWxsO1xuICAgICAgICB0aGlzLmVudmlyb25tZW50ID0gdHlwZW9mIGpvYkRhdGEuZW52aXJvbm1lbnQgPT09IFwic3RyaW5nXCIgPyB7bmFtZTogam9iRGF0YS5lbnZpcm9ubWVudH0gOiBqb2JEYXRhLmVudmlyb25tZW50O1xuXG4gICAgICAgIC8vIFNldCBGRl9ESVNBQkxFX1VNQVNLX0ZPUl9ET0NLRVJfRVhFQ1VUT1JcbiAgICAgICAgZ2xvYmFsVmFyaWFibGVzW1wiRkZfRElTQUJMRV9VTUFTS19GT1JfRE9DS0VSX0VYRUNVVE9SXCJdID0gYXJndi51bWFzayA/IFwiZmFsc2VcIiA6IFwidHJ1ZVwiO1xuXG4gICAgICAgIGNvbnN0IG1hdHJpeFZhcmlhYmxlcyA9IG9wdC5tYXRyaXhWYXJpYWJsZXMgPz8ge307XG4gICAgICAgIHRoaXMuX3ZhcmlhYmxlcyA9IHsuLi5nbG9iYWxWYXJpYWJsZXMsIC4uLmpvYlZhcmlhYmxlcywgLi4ubWF0cml4VmFyaWFibGVzLCAuLi5wcmVkZWZpbmVkVmFyaWFibGVzLCAuLi5hcmd2VmFyaWFibGVzfTtcblxuICAgICAgICBsZXQgY2lQcm9qZWN0RGlyID0gYCR7Y3dkfWA7XG4gICAgICAgIGlmICh0aGlzLmpvYkRhdGFbXCJpbWFnZVwiXSkge1xuICAgICAgICAgICAgY2lQcm9qZWN0RGlyID0gXCIvZ2NsLWJ1aWxkc1wiO1xuICAgICAgICB9IGVsc2UgaWYgKGFyZ3Yuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGNpUHJvamVjdERpciA9IGAke2N3ZH0vJHtzdGF0ZURpcn0vYnVpbGRzLyR7dGhpcy5zYWZlSm9iTmFtZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX0pPQl9JRFwiXSA9IGAke3RoaXMuam9iSWR9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX1BJUEVMSU5FX0lEXCJdID0gYCR7dGhpcy5waXBlbGluZUlpZCArIDEwMDB9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX1BJUEVMSU5FX0lJRFwiXSA9IGAke3RoaXMucGlwZWxpbmVJaWR9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX0pPQl9OQU1FXCJdID0gYCR7dGhpcy5uYW1lfWA7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9KT0JfTkFNRV9TTFVHXCJdID0gYCR7dGhpcy5uYW1lLnJlcGxhY2UoL1teYS16XFxkXSsvaWcsIFwiLVwiKS5yZXBsYWNlKC9eLS8sIFwiXCIpLnNsaWNlKDAsIDYzKS5yZXBsYWNlKC8tJC8sIFwiXCIpLnRvTG93ZXJDYXNlKCl9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX0pPQl9TVEFHRVwiXSA9IGAke3RoaXMuc3RhZ2V9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX1BST0pFQ1RfRElSXCJdID0gY2lQcm9qZWN0RGlyO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfSk9CX1VSTFwiXSA9IGBodHRwczovLyR7Z2l0RGF0YS5yZW1vdGUuaG9zdH0vJHtnaXREYXRhLnJlbW90ZS5ncm91cH0vJHtnaXREYXRhLnJlbW90ZS5wcm9qZWN0fS8tL2pvYnMvJHt0aGlzLmpvYklkfWA7IC8vIENoYW5nZXMgb24gcmVydW4uXG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9QSVBFTElORV9VUkxcIl0gPSBgaHR0cHM6Ly8ke2dpdERhdGEucmVtb3RlLmhvc3R9LyR7Z2l0RGF0YS5yZW1vdGUuZ3JvdXB9LyR7Z2l0RGF0YS5yZW1vdGUucHJvamVjdH0vcGlwZWxpbmVzLyR7dGhpcy5waXBlbGluZUlpZH1gO1xuICAgICAgICBwcmVkZWZpbmVkVmFyaWFibGVzW1wiQ0lfRU5WSVJPTk1FTlRfTkFNRVwiXSA9IHRoaXMuZW52aXJvbm1lbnQ/Lm5hbWUgPz8gXCJcIjtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX0VOVklST05NRU5UX1NMVUdcIl0gPSB0aGlzLmVudmlyb25tZW50Py5uYW1lPy5yZXBsYWNlKC9bXmEtelxcZF0rL2lnLCBcIi1cIikucmVwbGFjZSgvXi0vLCBcIlwiKS5zbGljZSgwLCAyMykucmVwbGFjZSgvLSQvLCBcIlwiKS50b0xvd2VyQ2FzZSgpID8/IFwiXCI7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9FTlZJUk9OTUVOVF9VUkxcIl0gPSB0aGlzLmVudmlyb25tZW50Py51cmwgPz8gXCJcIjtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX05PREVfSU5ERVhcIl0gPSBgJHtvcHQubm9kZUluZGV4fWA7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9OT0RFX1RPVEFMXCJdID0gYCR7b3B0Lm5vZGVzVG90YWx9YDtcbiAgICAgICAgcHJlZGVmaW5lZFZhcmlhYmxlc1tcIkNJX1JFR0lTVFJZXCJdID0gYGxvY2FsLXJlZ2lzdHJ5LiR7dGhpcy5naXREYXRhLnJlbW90ZS5ob3N0fWA7XG4gICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXNbXCJDSV9SRUdJU1RSWV9JTUFHRVwiXSA9IGAkQ0lfUkVHSVNUUlkvJHt0aGlzLl92YXJpYWJsZXNbXCJDSV9QUk9KRUNUX1BBVEhcIl19YDtcblxuICAgICAgICAvLyBGaW5kIGVudmlyb25tZW50IG1hdGNoZWQgdmFyaWFibGVzXG4gICAgICAgIGlmICh0aGlzLmVudmlyb25tZW50KSB7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlZCA9IFV0aWxzLmV4cGFuZFZhcmlhYmxlcyh0aGlzLl92YXJpYWJsZXMpO1xuICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudC5uYW1lID0gVXRpbHMuZXhwYW5kVGV4dCh0aGlzLmVudmlyb25tZW50Lm5hbWUsIGV4cGFuZGVkKTtcbiAgICAgICAgICAgIHRoaXMuZW52aXJvbm1lbnQudXJsID0gVXRpbHMuZXhwYW5kVGV4dCh0aGlzLmVudmlyb25tZW50LnVybCwgZXhwYW5kZWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudk1hdGNoZWRWYXJpYWJsZXMgPSBVdGlscy5maW5kRW52TWF0Y2hlZFZhcmlhYmxlcyh2YXJpYWJsZXNGcm9tRmlsZXMsIHRoaXMuZmlsZVZhcmlhYmxlc0RpciwgdGhpcy5lbnZpcm9ubWVudCk7XG5cbiAgICAgICAgLy8gTWVyZ2UgYW5kIGV4cGFuZCBhZnRlciBmaW5kaW5nIGVudiBtYXRjaGVkIHZhcmlhYmxlc1xuICAgICAgICB0aGlzLl92YXJpYWJsZXMgPSB7Li4uZ2xvYmFsVmFyaWFibGVzLCAuLi5qb2JWYXJpYWJsZXMsIC4uLm1hdHJpeFZhcmlhYmxlcywgLi4ucHJlZGVmaW5lZFZhcmlhYmxlcywgLi4uZW52TWF0Y2hlZFZhcmlhYmxlcywgLi4uYXJndlZhcmlhYmxlc307XG5cbiAgICAgICAgLy8gU2V0IHt3aGVuLCBhbGxvd0ZhaWx1cmV9IGJhc2VkIG9uIHJ1bGVzIHJlc3VsdFxuICAgICAgICBpZiAodGhpcy5ydWxlcykge1xuICAgICAgICAgICAgY29uc3QgcnVsZVJlc3VsdCA9IFV0aWxzLmdldFJ1bGVzUmVzdWx0KHtjd2QsIHJ1bGVzOiB0aGlzLnJ1bGVzLCB2YXJpYWJsZXM6IHRoaXMuX3ZhcmlhYmxlc30pO1xuICAgICAgICAgICAgdGhpcy53aGVuID0gcnVsZVJlc3VsdC53aGVuO1xuICAgICAgICAgICAgdGhpcy5hbGxvd0ZhaWx1cmUgPSBydWxlUmVzdWx0LmFsbG93RmFpbHVyZTtcbiAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlcyA9IHsuLi5nbG9iYWxWYXJpYWJsZXMsIC4uLmpvYlZhcmlhYmxlcywgLi4ucnVsZVJlc3VsdC52YXJpYWJsZXMsIC4uLm1hdHJpeFZhcmlhYmxlcywgLi4ucHJlZGVmaW5lZFZhcmlhYmxlcywgLi4uZW52TWF0Y2hlZFZhcmlhYmxlcywgLi4uYXJndlZhcmlhYmxlc307XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVsZXRlIHZhcmlhYmxlcyB0aGUgdXNlciBpbnRlbnRpb25hbGx5IHdhbnRzIHVuc2V0XG4gICAgICAgIGZvciAoY29uc3QgdW5zZXRWYXJpYWJsZSBvZiBhcmd2LnVuc2V0VmFyaWFibGVzKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdmFyaWFibGVzW3Vuc2V0VmFyaWFibGVdO1xuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0KHRoaXMuc2NyaXB0cyB8fCB0aGlzLnRyaWdnZXIsIGNoYWxrYHtibHVlQnJpZ2h0ICR7dGhpcy5uYW1lfX0gbXVzdCBoYXZlIHNjcmlwdCBzcGVjaWZpZWRgKTtcblxuICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGl2ZSAmJiAodGhpcy53aGVuICE9PSBcIm1hbnVhbFwiIHx8IHRoaXMuaW1hZ2VOYW1lKHRoaXMuX3ZhcmlhYmxlcykgIT09IG51bGwpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3Ioe21lc3NhZ2U6IGAke3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0gQEludGVyYWN0aXZlIGRlY29yYXRvciBjYW5ub3QgaGF2ZSBpbWFnZTogYW5kIG11c3QgYmUgd2hlbjptYW51YWxgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbmplY3RTU0hBZ2VudCAmJiB0aGlzLmltYWdlTmFtZSh0aGlzLl92YXJpYWJsZXMpID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3Ioe21lc3NhZ2U6IGAke3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0gQEluamVjdFNTSEFnZW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBpbWFnZTpgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtpLCBjXSBvZiBPYmplY3QuZW50cmllczxhbnk+KHRoaXMuY2FjaGUpKSB7XG4gICAgICAgICAgICBhc3NlcnQoW1wicHVsbFwiLCBcInB1c2hcIiwgXCJwdWxsLXB1c2hcIl0uaW5jbHVkZXMoYy5wb2xpY3kpLCBjaGFsa2B7Ymx1ZSAke3RoaXMubmFtZX19IGNhY2hlWyR7aX1dLnBvbGljeSBpcyBub3QgJ3B1bGwnLCAncHVzaCcgb3IgJ3B1bGwtcHVzaCdgKTtcbiAgICAgICAgICAgIGFzc2VydChbXCJvbl9zdWNjZXNzXCIsIFwib25fZmFpbHVyZVwiLCBcImFsd2F5c1wiXS5pbmNsdWRlcyhjLndoZW4pLCBjaGFsa2B7Ymx1ZSAke3RoaXMubmFtZX19IGNhY2hlWyR7aX1dLndoZW4gaXMgbm90ICdvbl9zdWNjZXNzJywgJ29uX2ZhaWx1cmUnIG9yICdhbHdheXMnYCk7XG4gICAgICAgICAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShjLnBhdGhzKSwgY2hhbGtge2JsdWUgJHt0aGlzLm5hbWV9fSBjYWNoZVske2l9XS5wYXRocyBtdXN0IGJlIGFycmF5YCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtpLCBzXSBvZiBPYmplY3QuZW50cmllczxhbnk+KHRoaXMuc2VydmljZXMpKSB7XG4gICAgICAgICAgICBhc3NlcnQocy5uYW1lLCBjaGFsa2B7Ymx1ZSAke3RoaXMubmFtZX19IHNlcnZpY2VzWyR7aX1dLm5hbWUgaXMgdW5kZWZpbmVkYCk7XG4gICAgICAgICAgICBhc3NlcnQoIXMuY29tbWFuZCB8fCBBcnJheS5pc0FycmF5KHMuY29tbWFuZCksIGNoYWxrYHtibHVlICR7dGhpcy5uYW1lfX0gc2VydmljZXNbJHtpfV0uY29tbWFuZCBtdXN0IGJlIGFuIGFycmF5YCk7XG4gICAgICAgICAgICBhc3NlcnQoIXMuZW50cnlwb2ludCB8fCBBcnJheS5pc0FycmF5KHMuZW50cnlwb2ludCksIGNoYWxrYHtibHVlICR7dGhpcy5uYW1lfX0gc2VydmljZXNbJHtpfV0uZW50cnlwb2ludCBtdXN0IGJlIGFuIGFycmF5YCk7XG4gICAgICAgIH1cblxuICAgICAgICBhc3NlcnQoIXRoaXMuYXJ0aWZhY3RzPy5wYXRocyB8fCBBcnJheS5pc0FycmF5KHRoaXMuYXJ0aWZhY3RzLnBhdGhzKSwgY2hhbGtge2JsdWUgJHt0aGlzLm5hbWV9fSBhcnRpZmFjdHMucGF0aHMgbXVzdCBiZSBhbiBhcnJheWApO1xuXG4gICAgICAgIGlmICh0aGlzLmltYWdlTmFtZSh0aGlzLl92YXJpYWJsZXMpICYmIGFyZ3YubW91bnRDYWNoZSkge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBVdGlscy5leHBhbmRWYXJpYWJsZXModGhpcy5fdmFyaWFibGVzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgICAgICAgYy5wYXRocy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBVdGlscy5leHBhbmRUZXh0KHAsIGV4cGFuZGVkKTtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCFwYXRoLmluY2x1ZGVzKFwiKlwiKSwgY2hhbGtge2JsdWUgJHt0aGlzLm5hbWV9fSBjYW5ub3QgaGF2ZSAqIGluIGNhY2hlIHBhdGhzLCB3aGVuIC0tbW91bnQtY2FjaGUgaXMgZW5hYmxlZGApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGFydGlmYWN0c1RvU291cmNlICgpIHtcbiAgICAgICAgaWYgKHRoaXMuam9iRGF0YVtcImFydGlmYWN0c1RvU291cmNlXCJdICE9IG51bGwpIHJldHVybiB0aGlzLmpvYkRhdGFbXCJhcnRpZmFjdHNUb1NvdXJjZVwiXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJndi5hcnRpZmFjdHNUb1NvdXJjZTtcbiAgICB9XG5cbiAgICBnZXQgcHJldHR5RHVyYXRpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZW5kVGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIHByZXR0eUhydGltZSh0aGlzLl9lbmRUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFydFRpbWVcbiAgICAgICAgICAgID8gcHJldHR5SHJ0aW1lKHByb2Nlc3MuaHJ0aW1lKHRoaXMuX3N0YXJ0VGltZSkpXG4gICAgICAgICAgICA6IFwiMCBtc1wiO1xuICAgIH1cblxuICAgIGdldCBmb3JtYXR0ZWRKb2JOYW1lICgpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wUHJlZml4ID0gdGhpcy5hcmd2LnNob3dUaW1lc3RhbXBzXG4gICAgICAgICAgICA/IGBbJHtkYXRlRm9ybWF0dGVyLmZvcm1hdChuZXcgRGF0ZSgpKX0gJHt0aGlzLnByZXR0eUR1cmF0aW9uLnBhZFN0YXJ0KDcpfV0gYFxuICAgICAgICAgICAgOiBcIlwiO1xuXG4gICAgICAgIC8vIFsxNjozMzoxOSAxLjM3IG1pbl0gbXktam9iICAgICA+IGhlbGxvIHdvcmxkXG4gICAgICAgIHJldHVybiBjaGFsa2Ake3RpbWVzdGFtcFByZWZpeH17Ymx1ZUJyaWdodCAke3RoaXMubmFtZS5wYWRFbmQodGhpcy5qb2JOYW1lUGFkKX19YDtcbiAgICB9XG5cbiAgICBnZXQgc2FmZUpvYk5hbWUgKCkge1xuICAgICAgICByZXR1cm4gVXRpbHMuc2FmZURvY2tlclN0cmluZyh0aGlzLm5hbWUpO1xuICAgIH1cblxuICAgIGdldCBuZWVkcyAoKTogTmVlZFtdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJuZWVkc1wiXSA/PyBudWxsO1xuICAgIH1cblxuICAgIGdldCBidWlsZFZvbHVtZU5hbWUgKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZ2NsLSR7dGhpcy5zYWZlSm9iTmFtZX0tJHt0aGlzLmpvYklkfS1idWlsZGA7XG4gICAgfVxuXG4gICAgZ2V0IHRtcFZvbHVtZU5hbWUgKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZ2NsLSR7dGhpcy5zYWZlSm9iTmFtZX0tJHt0aGlzLmpvYklkfS10bXBgO1xuICAgIH1cblxuICAgIGdldCBpbWFnZUVudHJ5cG9pbnQgKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5qb2JEYXRhW1wiaW1hZ2VcIl07XG5cbiAgICAgICAgaWYgKCFpbWFnZT8uZW50cnlwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkoaW1hZ2UuZW50cnlwb2ludCksIFwiaW1hZ2U6ZW50cnlwb2ludCBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICAgICAgICByZXR1cm4gaW1hZ2UuZW50cnlwb2ludDtcbiAgICB9XG5cbiAgICBnZXQgc2VydmljZXMgKCk6IFNlcnZpY2VbXSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzOiBTZXJ2aWNlW10gPSBbXTtcbiAgICAgICAgaWYgKCF0aGlzLmpvYkRhdGFbXCJzZXJ2aWNlc1wiXSkgcmV0dXJuIFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiBPYmplY3QudmFsdWVzPGFueT4odGhpcy5qb2JEYXRhW1wic2VydmljZXNcIl0pKSB7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlZCA9IFV0aWxzLmV4cGFuZFZhcmlhYmxlcyh7Li4udGhpcy5fdmFyaWFibGVzLCAuLi5zZXJ2aWNlW1widmFyaWFibGVzXCJdfSk7XG4gICAgICAgICAgICBsZXQgc2VydmljZU5hbWUgPSBVdGlscy5leHBhbmRUZXh0KHNlcnZpY2VbXCJuYW1lXCJdLCBleHBhbmRlZCk7XG4gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lLmluY2x1ZGVzKFwiOlwiKSA/IHNlcnZpY2VOYW1lIDogYCR7c2VydmljZU5hbWV9OmxhdGVzdGA7XG4gICAgICAgICAgICBzZXJ2aWNlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBzZXJ2aWNlTmFtZSxcbiAgICAgICAgICAgICAgICBlbnRyeXBvaW50OiBzZXJ2aWNlW1wiZW50cnlwb2ludFwiXSA/PyBudWxsLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IHNlcnZpY2VbXCJjb21tYW5kXCJdID8/IG51bGwsXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiBleHBhbmRlZCxcbiAgICAgICAgICAgICAgICBhbGlhczogVXRpbHMuZXhwYW5kVGV4dChzZXJ2aWNlW1wiYWxpYXNcIl0sIGV4cGFuZGVkKSA/PyBudWxsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcnZpY2VzO1xuICAgIH1cblxuICAgIHNldCBqb2JOYW1lUGFkIChqb2JOYW1lUGFkOiBudW1iZXIpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuX2pvYk5hbWVQYWQgPT0gbnVsbCwgXCJ0aGlzLl9qb2JOYW1lUGFkIGNhbiBvbmx5IGJlIHNldCBvbmNlXCIpO1xuICAgICAgICB0aGlzLl9qb2JOYW1lUGFkID0gam9iTmFtZVBhZDtcbiAgICB9XG5cbiAgICBnZXQgam9iTmFtZVBhZCAoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2pvYk5hbWVQYWQgPz8gMDtcbiAgICB9XG5cbiAgICBnZXQgcHJvZHVjZXJzICgpOiB7bmFtZTogc3RyaW5nOyBkb3RlbnY6IHN0cmluZyB8IG51bGx9W10gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2R1Y2VycztcbiAgICB9XG5cbiAgICBzZXQgcHJvZHVjZXJzIChwcm9kdWNlcnM6IHtuYW1lOiBzdHJpbmc7IGRvdGVudjogc3RyaW5nIHwgbnVsbH1bXSB8IG51bGwpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuX3Byb2R1Y2VycyA9PSBudWxsLCBcInRoaXMuX3Byb2R1Y2VycyBjYW4gb25seSBiZSBzZXQgb25jZVwiKTtcbiAgICAgICAgdGhpcy5fcHJvZHVjZXJzID0gcHJvZHVjZXJzO1xuICAgIH1cblxuICAgIGdldCBzdGFnZSAoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcInN0YWdlXCJdIHx8IFwidGVzdFwiO1xuICAgIH1cblxuICAgIGdldCBpbnRlcmFjdGl2ZSAoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvYkRhdGFbXCJpbnRlcmFjdGl2ZVwiXSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgaW5qZWN0U1NIQWdlbnQgKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiaW5qZWN0U1NIQWdlbnRcIl0gfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IGRlc2NyaXB0aW9uICgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiZGVzY3JpcHRpb25cIl0gPz8gXCJcIjtcbiAgICB9XG5cbiAgICBnZXQgYXJ0aWZhY3RzICgpOiB7cGF0aHM6IHN0cmluZ1tdOyBleGNsdWRlPzogc3RyaW5nW107IHJlcG9ydHM/OiB7ZG90ZW52Pzogc3RyaW5nfTsgd2hlbj86IHN0cmluZ30gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9iRGF0YVtcImFydGlmYWN0c1wiXTtcbiAgICB9XG5cbiAgICBnZXQgY2FjaGUgKCk6IENhY2hlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1wiY2FjaGVcIl0gfHwgW107XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFVuaXF1ZUNhY2hlTmFtZSAoY3dkOiBzdHJpbmcsIGV4cGFuZGVkOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSwga2V5OiBhbnkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgfHwga2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5leHBhbmRUZXh0KGtleSA/PyBcImRlZmF1bHRcIiwgZXhwYW5kZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIm1kLVwiICsgYXdhaXQgVXRpbHMuY2hlY2tzdW1GaWxlcyhrZXlbXCJmaWxlc1wiXS5tYXAoKGY6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAke2N3ZH0vJHtVdGlscy5leHBhbmRUZXh0KGYsIGV4cGFuZGVkKX1gO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgZ2V0IGJlZm9yZVNjcmlwdHMgKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgYmVmb3JlU2NyaXB0cyA9IHRoaXMuam9iRGF0YVtcImJlZm9yZV9zY3JpcHRcIl0gfHwgW107XG4gICAgICAgIHJldHVybiB0eXBlb2YgYmVmb3JlU2NyaXB0cyA9PT0gXCJzdHJpbmdcIiA/IFtiZWZvcmVTY3JpcHRzXSA6IGJlZm9yZVNjcmlwdHM7XG4gICAgfVxuXG4gICAgZ2V0IGFmdGVyU2NyaXB0cyAoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBhZnRlclNjcmlwdHMgPSB0aGlzLmpvYkRhdGFbXCJhZnRlcl9zY3JpcHRcIl0gfHwgW107XG4gICAgICAgIHJldHVybiB0eXBlb2YgYWZ0ZXJTY3JpcHRzID09PSBcInN0cmluZ1wiID8gW2FmdGVyU2NyaXB0c10gOiBhZnRlclNjcmlwdHM7XG4gICAgfVxuXG4gICAgZ2V0IHNjcmlwdHMgKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gdGhpcy5qb2JEYXRhW1wic2NyaXB0XCJdO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHNjcmlwdCA9PT0gXCJzdHJpbmdcIiA/IFtzY3JpcHRdIDogc2NyaXB0O1xuICAgIH1cblxuICAgIGdldCB0cmlnZ2VyICgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2JEYXRhW1widHJpZ2dlclwiXTtcbiAgICB9XG5cbiAgICBnZXQgcHJlU2NyaXB0c0V4aXRDb2RlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZTtcbiAgICB9XG5cbiAgICBnZXQgYWZ0ZXJTY3JpcHRzRXhpdENvZGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWZ0ZXJTY3JpcHRzRXhpdENvZGU7XG4gICAgfVxuXG4gICAgZ2V0IHN0YXJ0ZWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVubmluZyB8fCB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgIT09IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGZpbmlzaGVkICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9ydW5uaW5nICYmIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgY292ZXJhZ2VQZXJjZW50ICgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdmVyYWdlUGVyY2VudDtcbiAgICB9XG5cbiAgICBnZXQgZmlsZVZhcmlhYmxlc0RpciAoKSB7XG4gICAgICAgIHJldHVybiBgL3RtcC9naXRsYWItY2ktbG9jYWwtZmlsZS12YXJpYWJsZXMtJHt0aGlzLl92YXJpYWJsZXNbXCJDSV9QUk9KRUNUX1BBVEhfU0xVR1wiXX0tJHt0aGlzLmpvYklkfWA7XG4gICAgfVxuXG4gICAgYXN5bmMgc3RhcnQgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBhcmd2ID0gdGhpcy5hcmd2O1xuICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICBjb25zdCB3cml0ZVN0cmVhbXMgPSB0aGlzLndyaXRlU3RyZWFtcztcbiAgICAgICAgY29uc3QgcmVwb3J0c0RvdGVudlZhcmlhYmxlcyA9IGF3YWl0IHRoaXMuaW5pdFByb2R1Y2VyUmVwb3J0c0RvdGVudlZhcmlhYmxlcyh3cml0ZVN0cmVhbXMsIFV0aWxzLmV4cGFuZFZhcmlhYmxlcyh0aGlzLl92YXJpYWJsZXMpKTtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBVdGlscy5leHBhbmRWYXJpYWJsZXMoey4uLnRoaXMuX3ZhcmlhYmxlcywgLi4ucmVwb3J0c0RvdGVudlZhcmlhYmxlc30pO1xuICAgICAgICBjb25zdCBpbWFnZU5hbWUgPSB0aGlzLmltYWdlTmFtZShleHBhbmRlZCk7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcblxuICAgICAgICBjb25zdCBvdXRwdXRMb2dGaWxlUGF0aCA9IGAke2FyZ3YuY3dkfS8ke2FyZ3Yuc3RhdGVEaXJ9L291dHB1dC8ke3NhZmVKb2JOYW1lfS5sb2dgO1xuICAgICAgICBhd2FpdCBmcy5lbnN1cmVGaWxlKG91dHB1dExvZ0ZpbGVQYXRoKTtcbiAgICAgICAgYXdhaXQgZnMudHJ1bmNhdGUob3V0cHV0TG9nRmlsZVBhdGgpO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgc3RhcnRpbmd9ICR7aW1hZ2VOYW1lID8/IFwic2hlbGxcIn0gKHt5ZWxsb3cgJHt0aGlzLnN0YWdlfX0pXFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBidWlsZFZvbHVtZU5hbWUgPSB0aGlzLmJ1aWxkVm9sdW1lTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IHRtcFZvbHVtZU5hbWUgPSB0aGlzLnRtcFZvbHVtZU5hbWU7XG4gICAgICAgICAgICBjb25zdCBmaWxlVmFyaWFibGVzRGlyID0gdGhpcy5maWxlVmFyaWFibGVzRGlyO1xuXG4gICAgICAgICAgICBjb25zdCB2b2x1bWVQcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgdm9sdW1lUHJvbWlzZXMucHVzaChVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwidm9sdW1lXCIsIFwiY3JlYXRlXCIsIGAke2J1aWxkVm9sdW1lTmFtZX1gXSwgYXJndi5jd2QpKTtcbiAgICAgICAgICAgIHZvbHVtZVByb21pc2VzLnB1c2goVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInZvbHVtZVwiLCBcImNyZWF0ZVwiLCBgJHt0bXBWb2x1bWVOYW1lfWBdLCBhcmd2LmN3ZCkpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyVm9sdW1lTmFtZXMucHVzaChidWlsZFZvbHVtZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyVm9sdW1lTmFtZXMucHVzaCh0bXBWb2x1bWVOYW1lKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHZvbHVtZVByb21pc2VzKTtcblxuICAgICAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcblxuICAgICAgICAgICAgbGV0IGNob3duT3B0ID0gXCIwOjBcIjtcbiAgICAgICAgICAgIGxldCBjaG1vZE9wdCA9IFwiYStyd1wiO1xuICAgICAgICAgICAgaWYgKGV4cGFuZGVkW1wiRkZfRElTQUJMRV9VTUFTS19GT1JfRE9DS0VSX0VYRUNVVE9SXCJdID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgVXRpbHMuc3Bhd24oW1wiZG9ja2VyXCIsIFwicnVuXCIsIFwiLS1ybVwiLCBpbWFnZU5hbWUsIFwic2hcIiwgXCItY1wiLCBcImVjaG8gXFxcIiQoaWQgLXUpOiQoaWQgLWcpXFxcIlwiXSk7XG4gICAgICAgICAgICAgICAgY2hvd25PcHQgPSBzdGRvdXQ7XG4gICAgICAgICAgICAgICAgaWYgKGNob3duT3B0ID09IFwiMDowXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2htb2RPcHQgPSBcImctd1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHtzdGRvdXQ6IGNvbnRhaW5lcklkfSA9IGF3YWl0IFV0aWxzLnNwYXduKFtcbiAgICAgICAgICAgICAgICB0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJjcmVhdGVcIiwgXCItLXVzZXI9MDowXCIsIGAtLXZvbHVtZT0ke2J1aWxkVm9sdW1lTmFtZX06L2djbC1idWlsZHNgLCBgLS12b2x1bWU9JHt0bXBWb2x1bWVOYW1lfToke3RoaXMuZmlsZVZhcmlhYmxlc0Rpcn1gLCBcImRvY2tlci5pby9maXJlY293L2dpdGxhYi1jaS1sb2NhbC11dGlsXCIsXG4gICAgICAgICAgICAgICAgLi4uW1wic2hcIiwgXCItY1wiLCBgY2hvd24gJHtjaG93bk9wdH0gLVIgL2djbC1idWlsZHMvICYmIGNobW9kICR7Y2htb2RPcHR9IC1SIC9nY2wtYnVpbGRzLyAmJiBjaG93biAke2Nob3duT3B0fSAtUiAvdG1wLyAmJiBjaG1vZCAke2NobW9kT3B0fSAtUiAvdG1wL2BdLFxuICAgICAgICAgICAgXSwgYXJndi5jd2QpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyc1RvQ2xlYW4ucHVzaChjb250YWluZXJJZCk7XG4gICAgICAgICAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhmaWxlVmFyaWFibGVzRGlyKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJjcFwiLCBgJHtmaWxlVmFyaWFibGVzRGlyfS8uYCwgYCR7Y29udGFpbmVySWR9OiR7ZmlsZVZhcmlhYmxlc0Rpcn1gXSwgYXJndi5jd2QpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcImNwXCIsIGAke2FyZ3Yuc3RhdGVEaXJ9L2J1aWxkcy8uZG9ja2VyLy5gLCBgJHtjb250YWluZXJJZH06L2djbC1idWlsZHNgXSwgYXJndi5jd2QpO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInN0YXJ0XCIsIFwiLS1hdHRhY2hcIiwgY29udGFpbmVySWRdLCBhcmd2LmN3ZCk7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwicm1cIiwgXCItdmZcIiwgY29udGFpbmVySWRdLCBhcmd2LmN3ZCk7XG4gICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBjb3BpZWQgdG8gZG9ja2VyIHZvbHVtZXN9IGluIHttYWdlbnRhICR7cHJldHR5SHJ0aW1lKGVuZFRpbWUpfX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRG9ja2VyTmV0d29yayhgZ2l0bGFiLWNpLWxvY2FsLSR7dGhpcy5qb2JJZH1gKTtcblxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlcy5tYXAoYXN5bmMgKHNlcnZpY2UsIHNlcnZpY2VJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHNlcnZpY2UubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wdWxsSW1hZ2Uod3JpdGVTdHJlYW1zLCBzZXJ2aWNlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VDb250YWluZXJJZCA9IGF3YWl0IHRoaXMuc3RhcnRTZXJ2aWNlKHdyaXRlU3RyZWFtcywgVXRpbHMuZXhwYW5kVmFyaWFibGVzKHsuLi5leHBhbmRlZCwgLi4uc2VydmljZS52YXJpYWJsZXN9KSwgc2VydmljZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VDb250YWluZXJMb2dGaWxlID0gYCR7YXJndi5jd2R9LyR7YXJndi5zdGF0ZURpcn0vc2VydmljZXMtb3V0cHV0LyR7dGhpcy5zYWZlSm9iTmFtZX0vJHtzZXJ2aWNlTmFtZX0tJHtzZXJ2aWNlSW5kZXh9LmxvZ2A7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VydmljZUhlYWx0aENoZWNrKHdyaXRlU3RyZWFtcywgc2VydmljZSwgc2VydmljZUluZGV4LCBzZXJ2aWNlQ29udGFpbmVyTG9nRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHtzdGRvdXQsIHN0ZGVycn0gPSBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwibG9nc1wiLCBzZXJ2aWNlQ29udGFpbmVySWRdKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnMuZW5zdXJlRmlsZShzZXJ2aWNlQ29udGFpbmVyTG9nRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShzZXJ2aWNlQ29udGFpbmVyTG9nRmlsZSwgYCMjIyBzdGRvdXQgIyMjXFxuJHtzdGRvdXR9XFxuIyMjIHN0ZGVyciAjIyNcXG4ke3N0ZGVycn1cXG5gKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRvbmUgPSBhc3luYyAoZXhpdENvZGU6IG51bWJlciwgZXhpdE1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlckVuZFRpbWUoKTtcbiAgICAgICAgICAgIGlmIChleGl0Q29kZSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChgJHtleGl0TWVzc2FnZX1cXG5gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihgJHtleGl0TWVzc2FnZX1cXG5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weUNhY2hlT3V0KHdyaXRlU3RyZWFtcywgZXhwYW5kZWQsIGV4aXRDb2RlKTtcbiAgICAgICAgICAgIGlmIChleGl0Q29kZSA9PSAwIHx8IHRoaXMuYXJ0aWZhY3RzPy53aGVuID09PSBcImFsd2F5c1wiKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5QXJ0aWZhY3RzT3V0KHdyaXRlU3RyZWFtcywgZXhwYW5kZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwUmVzb3VyY2VzKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcHJlc2NyaXB0cyA9IHRoaXMuYmVmb3JlU2NyaXB0cy5jb25jYXQodGhpcy5zY3JpcHRzKTtcbiAgICAgICAgZXhwYW5kZWRbXCJDSV9KT0JfU1RBVFVTXCJdID0gXCJydW5uaW5nXCI7XG4gICAgICAgIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA9IGF3YWl0IHRoaXMuZXhlY1NjcmlwdHMocHJlc2NyaXB0cywgZXhwYW5kZWQpO1xuICAgICAgICBpZiAodGhpcy5hZnRlclNjcmlwdHMubGVuZ3RoID09PSAwICYmIHRoaXMuX3ByZXNjcmlwdHNFeGl0Q29kZSA+IDApIHtcbiAgICAgICAgICAgIGF3YWl0IGRvbmUodGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlLCB0aGlzLmdldEV4aXRlZFN0cmluZyh0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUsIHRoaXMuYWxsb3dGYWlsdXJlKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlID4gMCkge1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlckVuZFRpbWUoKTtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoYCR7dGhpcy5nZXRFeGl0ZWRTdHJpbmcodGhpcy5fcHJlc2NyaXB0c0V4aXRDb2RlLCB0aGlzLmFsbG93RmFpbHVyZSl9XFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hZnRlclNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgcnVubmluZyBhZnRlciBzY3JpcHQuLi59XFxuYCk7XG4gICAgICAgICAgICBleHBhbmRlZFtcIkNJX0pPQl9TVEFUVVNcIl0gPSB0aGlzLl9wcmVzY3JpcHRzRXhpdENvZGUgPT09IDAgPyBcInN1Y2Nlc3NcIiA6IFwiZmFpbGVkXCI7XG4gICAgICAgICAgICBpZiAoMCA8ICh0aGlzLl9hZnRlclNjcmlwdHNFeGl0Q29kZSA9IGF3YWl0IHRoaXMuZXhlY1NjcmlwdHModGhpcy5hZnRlclNjcmlwdHMsIGV4cGFuZGVkKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRW5kVGltZSgpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoYCR7dGhpcy5nZXRFeGl0ZWRTdHJpbmcodGhpcy5fYWZ0ZXJTY3JpcHRzRXhpdENvZGUsIHRydWUsIFwiIGFmdGVyX3NjcmlwdFwiKX1cXG5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmpvYkRhdGFbXCJjb3ZlcmFnZVwiXSkge1xuICAgICAgICAgICAgdGhpcy5fY292ZXJhZ2VQZXJjZW50ID0gYXdhaXQgVXRpbHMuZ2V0Q292ZXJhZ2VQZXJjZW50KGFyZ3YuY3dkLCBhcmd2LnN0YXRlRGlyLCB0aGlzLmpvYkRhdGFbXCJjb3ZlcmFnZVwiXSwgc2FmZUpvYk5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGRvbmUodGhpcy5fYWZ0ZXJTY3JpcHRzRXhpdENvZGUsIHRoaXMuZ2V0RmluaXNoZWRTdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2xlYW51cFJlc291cmNlcyAoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sb25nUnVubmluZ1NpbGVudFRpbWVvdXQpO1xuXG4gICAgICAgIGlmICghdGhpcy5hcmd2LmNsZWFudXApIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHRoaXMuX2NvbnRhaW5lcnNUb0NsZWFuKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJybVwiLCBcIi12ZlwiLCBgJHtpZH1gXSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBFcnJvciwgXCJlIGlzIG5vdCBpbnN0YW5jZW9mIEVycm9yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3NlcnZpY2VOZXR3b3JrSWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcIm5ldHdvcmtcIiwgXCJybVwiLCBgJHt0aGlzLl9zZXJ2aWNlTmV0d29ya0lkfWBdKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIEVycm9yLCBcImUgaXMgbm90IGluc3RhbmNlb2YgRXJyb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyVm9sdW1lTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lclZvbHVtZSBvZiB0aGlzLl9jb250YWluZXJWb2x1bWVOYW1lcykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwidm9sdW1lXCIsIFwicm1cIiwgYCR7Y29udGFpbmVyVm9sdW1lfWBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBFcnJvciwgXCJlIGlzIG5vdCBpbnN0YW5jZW9mIEVycm9yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm1Qcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGhpcy5fZmlsZXNUb1JtKSB7XG4gICAgICAgICAgICBybVByb21pc2VzLnB1c2goZnMucm0oZmlsZSwge3JlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWV9KSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocm1Qcm9taXNlcyk7XG5cbiAgICAgICAgY29uc3QgZmlsZVZhcmlhYmxlc0RpciA9IHRoaXMuZmlsZVZhcmlhYmxlc0RpcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnJtKGZpbGVWYXJpYWJsZXNEaXIsIHtyZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgRXJyb3IsIFwiZSBpcyBub3QgaW5zdGFuY2VvZiBFcnJvclwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVJbmplY3RTU0hBZ2VudE9wdGlvbnMgKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5qZWN0U1NIQWdlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiIHx8IC9eZGFyd2luLy5leGVjKHByb2Nlc3MuZW52Lk9TVFlQRSA/PyBcIlwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiLS1lbnYgU1NIX0FVVEhfU09DSz0vcnVuL2hvc3Qtc2VydmljZXMvc3NoLWF1dGguc29jayAtdiAvcnVuL2hvc3Qtc2VydmljZXMvc3NoLWF1dGguc29jazovcnVuL2hvc3Qtc2VydmljZXMvc3NoLWF1dGguc29ja1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgLS1lbnYgU1NIX0FVVEhfU09DSz0ke3Byb2Nlc3MuZW52LlNTSF9BVVRIX1NPQ0t9IC12ICR7cHJvY2Vzcy5lbnYuU1NIX0FVVEhfU09DS306JHtwcm9jZXNzLmVudi5TU0hfQVVUSF9TT0NLfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVNjcmlwdENvbW1hbmRzIChzY3JpcHRzOiBzdHJpbmdbXSkge1xuICAgICAgICBsZXQgY21kID0gXCJcIjtcbiAgICAgICAgc2NyaXB0cy5mb3JFYWNoKChzY3JpcHQpID0+IHtcbiAgICAgICAgICAgIC8vIFByaW50IGNvbW1hbmQgZWNobydlZCBpbiBjb2xvclxuICAgICAgICAgICAgY29uc3Qgc3BsaXQgPSBzY3JpcHQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpbGluZVRleHQgPSBzcGxpdC5sZW5ndGggPiAxID8gXCIgIyBjb2xsYXBzZWQgbXVsdGktbGluZSBjb21tYW5kXCIgOiBcIlwiO1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IHNwbGl0WzBdPy5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIikucmVwbGFjZSgvXCIvZywgXCJcXFxcXFxcIlwiKS5yZXBsYWNlKC9bJF0vZywgXCJcXFxcJFwiKTtcbiAgICAgICAgICAgIGNtZCArPSBjaGFsa2BlY2hvIFwie2dyZWVuICQgJHt0ZXh0fSR7bXVsdGlsaW5lVGV4dH19XCJcXG5gO1xuXG4gICAgICAgICAgICAvLyBFeGVjdXRlIGFjdHVhbCBzY3JpcHRcbiAgICAgICAgICAgIGNtZCArPSBgJHtzY3JpcHR9XFxuYDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBtb3VudENhY2hlQ21kICh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgZXhwYW5kZWQ6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlTmFtZShleHBhbmRlZCkgJiYgIXRoaXMuYXJndi5tb3VudENhY2hlKSByZXR1cm4gW107XG5cbiAgICAgICAgY29uc3QgY21kOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jYWNoZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlQ2FjaGVOYW1lID0gYXdhaXQgdGhpcy5nZXRVbmlxdWVDYWNoZU5hbWUodGhpcy5hcmd2LmN3ZCwgZXhwYW5kZWQsIGMua2V5KTtcbiAgICAgICAgICAgIGMucGF0aHMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBVdGlscy5leHBhbmRUZXh0KHAsIGV4cGFuZGVkKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7bWFnZW50YUJyaWdodCBtb3VudGluZyBjYWNoZX0gZm9yIHBhdGggJHtwYXRofVxcbmApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlTW91bnQgPSBVdGlscy5zYWZlRG9ja2VyU3RyaW5nKGBnY2wtJHtleHBhbmRlZC5DSV9QUk9KRUNUX1BBVEhfU0xVR30tJHt1bmlxdWVDYWNoZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgY21kLnB1c2goXCItdlwiLCBgJHtjYWNoZU1vdW50fTovZ2NsLWJ1aWxkcy8ke3BhdGh9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY21kO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZXhlY1NjcmlwdHMgKHNjcmlwdHM6IHN0cmluZ1tdLCBleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBjd2QgPSB0aGlzLmFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IHRoaXMuYXJndi5zdGF0ZURpcjtcbiAgICAgICAgY29uc3Qgc2FmZUpvYk5hbWUgPSB0aGlzLnNhZmVKb2JOYW1lO1xuICAgICAgICBjb25zdCBvdXRwdXRGaWxlc1BhdGggPSBgJHtjd2R9LyR7c3RhdGVEaXJ9L291dHB1dC8ke3NhZmVKb2JOYW1lfS5sb2dgO1xuICAgICAgICBjb25zdCBidWlsZFZvbHVtZU5hbWUgPSB0aGlzLmJ1aWxkVm9sdW1lTmFtZTtcbiAgICAgICAgY29uc3QgdG1wVm9sdW1lTmFtZSA9IHRoaXMudG1wVm9sdW1lTmFtZTtcbiAgICAgICAgY29uc3QgaW1hZ2VOYW1lID0gdGhpcy5pbWFnZU5hbWUoZXhwYW5kZWQpO1xuICAgICAgICBjb25zdCB3cml0ZVN0cmVhbXMgPSB0aGlzLndyaXRlU3RyZWFtcztcblxuICAgICAgICBpZiAoc2NyaXB0cy5sZW5ndGggPT09IDAgfHwgc2NyaXB0c1swXSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvcHkgZ2l0IHRyYWNrZWQgZmlsZXMgdG8gYnVpbGQgZm9sZGVyIGlmIHNoZWxsIGlzb2xhdGlvbiBlbmFibGVkLlxuICAgICAgICBpZiAoIWltYWdlTmFtZSAmJiB0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnJzeW5jVHJhY2tlZEZpbGVzKGN3ZCwgc3RhdGVEaXIsIGAke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGlDbWQgPSB0aGlzLmdlbmVyYXRlU2NyaXB0Q29tbWFuZHMoc2NyaXB0cyk7XG4gICAgICAgICAgICBjb25zdCBpbnRlcmFjdGl2ZUNwID0gZXhlY2EoaUNtZCwge1xuICAgICAgICAgICAgICAgIGN3ZCxcbiAgICAgICAgICAgICAgICBzaGVsbDogXCJiYXNoXCIsXG4gICAgICAgICAgICAgICAgc3RkaW86IFtcImluaGVyaXRcIiwgXCJpbmhlcml0XCIsIFwiaW5oZXJpdFwiXSxcbiAgICAgICAgICAgICAgICBlbnY6IHsuLi5leHBhbmRlZCwgLi4ucHJvY2Vzcy5lbnZ9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBpbnRlcmFjdGl2ZUNwLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4gcmVzb2x2ZShjb2RlID8/IDApKTtcbiAgICAgICAgICAgICAgICB2b2lkIGludGVyYWN0aXZlQ3Aub24oXCJlcnJvclwiLCAoZXJyKSA9PiByZWplY3QoZXJyKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuXG4gICAgICAgIGlmIChpbWFnZU5hbWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHVsbEltYWdlKHdyaXRlU3RyZWFtcywgaW1hZ2VOYW1lKTtcblxuICAgICAgICAgICAgbGV0IGRvY2tlckNtZCA9IGAke3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlfSBjcmVhdGUgLS1pbnRlcmFjdGl2ZSAke3RoaXMuZ2VuZXJhdGVJbmplY3RTU0hBZ2VudE9wdGlvbnMoKX0gYDtcbiAgICAgICAgICAgIGlmICh0aGlzLmFyZ3YucHJpdmlsZWdlZCkge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0tcHJpdmlsZWdlZCBcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuYXJndi51bGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdWxpbWl0IG5vZmlsZT0ke3RoaXMuYXJndi51bGltaXR9IGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleHBhbmRlZFtcIkZGX0RJU0FCTEVfVU1BU0tfRk9SX0RPQ0tFUl9FWEVDVVRPUlwiXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiLS11c2VyIDA6MCBcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuc2VydmljZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1uZXR3b3JrIGdpdGxhYi1jaS1sb2NhbC0ke3RoaXMuam9iSWR9IGA7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiLS1uZXR3b3JrLWFsaWFzPWJ1aWxkIFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5ldHdvcmsgb2YgdGhpcy5hcmd2Lm5ldHdvcmspIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tbmV0d29yayAke25ldHdvcmt9IGA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS12b2x1bWUgJHtidWlsZFZvbHVtZU5hbWV9Oi9nY2wtYnVpbGRzIGA7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7dG1wVm9sdW1lTmFtZX06JHt0aGlzLmZpbGVWYXJpYWJsZXNEaXJ9IGA7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCItLXdvcmtkaXIgL2djbC1idWlsZHMgXCI7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgdm9sdW1lIG9mIHRoaXMuYXJndi52b2x1bWUpIHtcbiAgICAgICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7dm9sdW1lfSBgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4dHJhSG9zdCBvZiB0aGlzLmFyZ3YuZXh0cmFIb3N0KSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLWFkZC1ob3N0PSR7ZXh0cmFIb3N0fSBgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMoZXhwYW5kZWQpKSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtZSAnJHtrZXl9PSR7dmFsfScgYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaW1hZ2VFbnRyeXBvaW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW1hZ2VFbnRyeXBvaW50WzBdID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiLS1lbnRyeXBvaW50ICcnIFwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLS1lbnRyeXBvaW50ICR7dGhpcy5pbWFnZUVudHJ5cG9pbnRbMF19IGA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYCR7KGF3YWl0IHRoaXMubW91bnRDYWNoZUNtZCh3cml0ZVN0cmVhbXMsIGV4cGFuZGVkKSkuam9pbihcIiBcIil9IGA7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYCR7aW1hZ2VOYW1lfSBgO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pbWFnZUVudHJ5cG9pbnQ/Lmxlbmd0aCA/PyAwID4gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VFbnRyeXBvaW50Py5zbGljZSgxKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBgXCIke2V9XCIgYDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwic2ggLWMgXFxcIlxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiaWYgWyAteCAvdXNyL2xvY2FsL2Jpbi9iYXNoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL3Vzci9sb2NhbC9iaW4vYmFzaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvdXNyL2Jpbi9iYXNoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL3Vzci9iaW4vYmFzaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvYmluL2Jhc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvYmluL2Jhc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbGlmIFsgLXggL3Vzci9sb2NhbC9iaW4vc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvdXNyL2xvY2FsL2Jpbi9zaCBcXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcImVsaWYgWyAteCAvdXNyL2Jpbi9zaCBdOyB0aGVuXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRleGVjIC91c3IvYmluL3NoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC9iaW4vc2ggXTsgdGhlblxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhlYyAvYmluL3NoIFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiZWxpZiBbIC14IC9idXN5Ym94L3NoIF07IHRoZW5cXG5cIjtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIlxcdGV4ZWMgL2J1c3lib3gvc2ggXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJlbHNlXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJcXHRlY2hvIHNoZWxsIG5vdCBmb3VuZFxcblwiO1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IFwiXFx0ZXhpdCAxXFxuXCI7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gXCJmaVxcblxcXCJcIjtcblxuICAgICAgICAgICAgY29uc3Qge3N0ZG91dDogY29udGFpbmVySWR9ID0gYXdhaXQgVXRpbHMuYmFzaChkb2NrZXJDbWQsIGN3ZCk7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJJZCA9IGNvbnRhaW5lcklkO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyc1RvQ2xlYW4ucHVzaCh0aGlzLl9jb250YWluZXJJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmNvcHlDYWNoZUluKHdyaXRlU3RyZWFtcywgZXhwYW5kZWQpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvcHlBcnRpZmFjdHNJbih3cml0ZVN0cmVhbXMpO1xuXG4gICAgICAgIGxldCBjbWQgPSBcInNldCAtZW8gcGlwZWZhaWxcXG5cIjtcbiAgICAgICAgY21kICs9IFwiZXhlYyAwPCAvZGV2L251bGxcXG5cIjtcblxuICAgICAgICBpZiAoIWltYWdlTmFtZSAmJiB0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGNtZCArPSBgY2QgJHtzdGF0ZURpcn0vYnVpbGRzLyR7c2FmZUpvYk5hbWV9L1xcbmA7XG4gICAgICAgIH1cbiAgICAgICAgY21kICs9IHRoaXMuZ2VuZXJhdGVTY3JpcHRDb21tYW5kcyhzY3JpcHRzKTtcblxuICAgICAgICBjbWQgKz0gXCJleGl0IDBcXG5cIjtcblxuICAgICAgICBjb25zdCBqb2JTY3JpcHRGaWxlID0gYCR7Y3dkfS8ke3N0YXRlRGlyfS9zY3JpcHRzLyR7c2FmZUpvYk5hbWV9XyR7dGhpcy5qb2JJZH1gO1xuICAgICAgICBhd2FpdCBmcy5vdXRwdXRGaWxlKGpvYlNjcmlwdEZpbGUsIGNtZCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgYXdhaXQgZnMuY2htb2Qoam9iU2NyaXB0RmlsZSwgXCIwNzU1XCIpO1xuICAgICAgICB0aGlzLl9maWxlc1RvUm0ucHVzaChqb2JTY3JpcHRGaWxlKTtcblxuICAgICAgICBpZiAoaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwiY3BcIiwgYCR7c3RhdGVEaXJ9L3NjcmlwdHMvJHtzYWZlSm9iTmFtZX1fJHt0aGlzLmpvYklkfWAsIGAke3RoaXMuX2NvbnRhaW5lcklkfTovZ2NsLWNtZGBdLCBjd2QpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3AgPSBleGVjYSh0aGlzLl9jb250YWluZXJJZCA/IGAke3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlfSBzdGFydCAtLWF0dGFjaCAtaSAke3RoaXMuX2NvbnRhaW5lcklkfWAgOiBcImJhc2hcIiwge1xuICAgICAgICAgICAgY3dkLFxuICAgICAgICAgICAgc2hlbGw6IFwiYmFzaFwiLFxuICAgICAgICAgICAgZW52OiBpbWFnZU5hbWUgPyBwcm9jZXNzLmVudiA6IGV4cGFuZGVkLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBvdXRGdW5jID0gKGxpbmU6IHN0cmluZywgc3RyZWFtOiAodHh0OiBzdHJpbmcpID0+IHZvaWQsIGNvbG9yaXplOiAoc3RyOiBzdHJpbmcpID0+IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG4gICAgICAgICAgICBzdHJlYW0oYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSBgKTtcbiAgICAgICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKFwiXFx1MDAxYlszMm0kXCIpKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtKGAke2NvbG9yaXplKFwiPlwiKX0gYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJlYW0oYCR7bGluZX1cXG5gKTtcbiAgICAgICAgICAgIGZzLmFwcGVuZEZpbGVTeW5jKG91dHB1dEZpbGVzUGF0aCwgYCR7bGluZX1cXG5gKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBxdWlldCA9IHRoaXMuYXJndi5xdWlldDtcblxuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgICAgICAgICAgY3Auc3Rkb3V0Py5waXBlKHNwbGl0MigpKS5vbihcImRhdGFcIiwgKGU6IHN0cmluZykgPT4gb3V0RnVuYyhlLCB3cml0ZVN0cmVhbXMuc3Rkb3V0LmJpbmQod3JpdGVTdHJlYW1zKSwgKHMpID0+IGNoYWxrYHtncmVlbkJyaWdodCAke3N9fWApKTtcbiAgICAgICAgICAgICAgICBjcC5zdGRlcnI/LnBpcGUoc3BsaXQyKCkpLm9uKFwiZGF0YVwiLCAoZTogc3RyaW5nKSA9PiBvdXRGdW5jKGUsIHdyaXRlU3RyZWFtcy5zdGRlcnIuYmluZCh3cml0ZVN0cmVhbXMpLCAocykgPT4gY2hhbGtge3JlZEJyaWdodCAke3N9fWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgY3Aub24oXCJleGl0XCIsIChjb2RlKSA9PiByZXNvbHZlKGNvZGUgPz8gMCkpO1xuICAgICAgICAgICAgdm9pZCBjcC5vbihcImVycm9yXCIsIChlcnIpID0+IHJlamVjdChlcnIpKTtcblxuICAgICAgICAgICAgaWYgKGltYWdlTmFtZSkge1xuICAgICAgICAgICAgICAgIGNwLnN0ZGluPy5lbmQoXCIvZ2NsLWNtZFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3Auc3RkaW4/LmVuZChgLi8ke3N0YXRlRGlyfS9zY3JpcHRzLyR7c2FmZUpvYk5hbWV9XyR7dGhpcy5qb2JJZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbWFnZU5hbWUgKHZhcnM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge30pOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmpvYkRhdGFbXCJpbWFnZVwiXTtcbiAgICAgICAgaWYgKCFpbWFnZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkID0gVXRpbHMuZXhwYW5kVmFyaWFibGVzKHZhcnMpO1xuICAgICAgICBjb25zdCBpbWFnZU5hbWUgPSBVdGlscy5leHBhbmRUZXh0KGltYWdlLm5hbWUsIGV4cGFuZGVkKTtcbiAgICAgICAgcmV0dXJuIGltYWdlTmFtZS5pbmNsdWRlcyhcIjpcIikgPyBpbWFnZU5hbWUgOiBgJHtpbWFnZU5hbWV9OmxhdGVzdGA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwdWxsSW1hZ2UgKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBpbWFnZVRvUHVsbDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwiaW1hZ2VcIiwgXCJpbnNwZWN0XCIsIGltYWdlVG9QdWxsXSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwicHVsbFwiLCBpbWFnZVRvUHVsbF0pO1xuICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgcHVsbGVkfSAke2ltYWdlVG9QdWxsfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQod3JpdGVTdHJlYW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaW5pdFByb2R1Y2VyUmVwb3J0c0RvdGVudlZhcmlhYmxlcyAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIGV4cGFuZGVkOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSkge1xuICAgICAgICBjb25zdCBjd2QgPSB0aGlzLmFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IHRoaXMuYXJndi5zdGF0ZURpcjtcbiAgICAgICAgY29uc3QgcHJvZHVjZXJzID0gdGhpcy5wcm9kdWNlcnM7XG4gICAgICAgIGxldCBwcm9kdWNlclJlcG9ydHNFbnZzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcHJvZHVjZXIgb2YgcHJvZHVjZXJzID8/IFtdKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9kdWNlckRvdGVudiA9IFV0aWxzLmV4cGFuZFRleHQocHJvZHVjZXIuZG90ZW52LCBleHBhbmRlZCk7XG4gICAgICAgICAgICBpZiAocHJvZHVjZXJEb3RlbnYgPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBzYWZlUHJvZHVjZXJOYW1lID0gVXRpbHMuc2FmZURvY2tlclN0cmluZyhwcm9kdWNlci5uYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGRvdGVudkZvbGRlciA9IGAke2N3ZH0vJHtzdGF0ZURpcn0vYXJ0aWZhY3RzLyR7c2FmZVByb2R1Y2VyTmFtZX0vLmdpdGxhYi1jaS1yZXBvcnRzL2RvdGVudi9gO1xuICAgICAgICAgICAgaWYgKGF3YWl0IGZzLnBhdGhFeGlzdHMoZG90ZW52Rm9sZGVyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvdGVudkZpbGVzID0gKGF3YWl0IFV0aWxzLnNwYXduKFtcImZpbmRcIiwgXCIuXCIsIFwiLXR5cGVcIiwgXCJmXCJdLCBkb3RlbnZGb2xkZXIpKS5zdGRvdXQuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBkb3RlbnZGaWxlIG9mIGRvdGVudkZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb3RlbnZGaWxlID09IFwiXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9kdWNlclJlcG9ydEVudiA9IGRvdGVudi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShgJHtkb3RlbnZGb2xkZXJ9LyR7ZG90ZW52RmlsZX1gKSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y2VyUmVwb3J0c0VudnMgPSB7Li4ucHJvZHVjZXJSZXBvcnRzRW52cywgLi4ucHJvZHVjZXJSZXBvcnRFbnZ9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3llbGxvdyByZXBvcnRzLmRvdGVudiBwcm9kdWNlZCBieSAnJHtwcm9kdWNlci5uYW1lfScgY291bGQgbm90IGJlIGZvdW5kfVxcbmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2R1Y2VyUmVwb3J0c0VudnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5Q2FjaGVJbiAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIGV4cGFuZGVkOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSkge1xuICAgICAgICBpZiAodGhpcy5hcmd2Lm1vdW50Q2FjaGUgJiYgdGhpcy5pbWFnZU5hbWUoZXhwYW5kZWQpKSByZXR1cm47XG4gICAgICAgIGlmICgoIXRoaXMuaW1hZ2VOYW1lKGV4cGFuZGVkKSAmJiAhdGhpcy5hcmd2LnNoZWxsSXNvbGF0aW9uKSB8fCB0aGlzLmNhY2hlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGN3ZCA9IHRoaXMuYXJndi5jd2Q7XG4gICAgICAgIGNvbnN0IHN0YXRlRGlyID0gdGhpcy5hcmd2LnN0YXRlRGlyO1xuXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgICBpZiAoIVtcInB1bGxcIiwgXCJwdWxsLXB1c2hcIl0uaW5jbHVkZXMoYy5wb2xpY3kpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVOYW1lID0gYXdhaXQgdGhpcy5nZXRVbmlxdWVDYWNoZU5hbWUoY3dkLCBleHBhbmRlZCwgYy5rZXkpO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVGb2xkZXIgPSBgJHtjd2R9LyR7c3RhdGVEaXJ9L2NhY2hlLyR7Y2FjaGVOYW1lfWA7XG4gICAgICAgICAgICBpZiAoIWF3YWl0IGZzLnBhdGhFeGlzdHMoY2FjaGVGb2xkZXIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IE11dGV4LmV4Y2x1c2l2ZShjYWNoZU5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlJbihjYWNoZUZvbGRlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGltcG9ydGVkIGNhY2hlICcke2NhY2hlTmFtZX0nfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlBcnRpZmFjdHNJbiAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpIHtcbiAgICAgICAgaWYgKCghdGhpcy5pbWFnZU5hbWUodGhpcy5fdmFyaWFibGVzKSAmJiAhdGhpcy5hcmd2LnNoZWxsSXNvbGF0aW9uKSB8fCAodGhpcy5wcm9kdWNlcnMgPz8gW10pLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGN3ZCA9IHRoaXMuYXJndi5jd2Q7XG4gICAgICAgIGNvbnN0IHN0YXRlRGlyID0gdGhpcy5hcmd2LnN0YXRlRGlyO1xuICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9kdWNlciBvZiB0aGlzLnByb2R1Y2VycyA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgcHJvZHVjZXJTYWZlTmFtZSA9IFV0aWxzLnNhZmVEb2NrZXJTdHJpbmcocHJvZHVjZXIubmFtZSk7XG4gICAgICAgICAgICBjb25zdCBhcnRpZmFjdEZvbGRlciA9IGAke2N3ZH0vJHtzdGF0ZURpcn0vYXJ0aWZhY3RzLyR7cHJvZHVjZXJTYWZlTmFtZX1gO1xuICAgICAgICAgICAgaWYgKCFhd2FpdCBmcy5wYXRoRXhpc3RzKGFydGlmYWN0Rm9sZGVyKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZzLm1rZGlycChhcnRpZmFjdEZvbGRlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlYWRkaXIgPSBhd2FpdCBmcy5yZWFkZGlyKGFydGlmYWN0Rm9sZGVyKTtcbiAgICAgICAgICAgIGlmIChyZWFkZGlyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHt5ZWxsb3cgYXJ0aWZhY3RzIGZyb20ge2JsdWVCcmlnaHQgJHtwcm9kdWNlclNhZmVOYW1lfX0gd2FzIGVtcHR5fVxcbmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuY29weUluKGFydGlmYWN0Rm9sZGVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGltcG9ydGVkIGFydGlmYWN0c30gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgIH1cblxuICAgIGNvcHlJbiAoc291cmNlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc2FmZUpvYk5hbWUgPSB0aGlzLnNhZmVKb2JOYW1lO1xuICAgICAgICBpZiAoIXRoaXMuaW1hZ2VOYW1lKHRoaXMuX3ZhcmlhYmxlcykgJiYgdGhpcy5hcmd2LnNoZWxsSXNvbGF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuc3Bhd24oW1wicnN5bmNcIiwgXCItYVwiLCBgJHtzb3VyY2V9Ly5gLCBgJHt0aGlzLmFyZ3YuY3dkfS8ke3RoaXMuYXJndi5zdGF0ZURpcn0vYnVpbGRzLyR7c2FmZUpvYk5hbWV9YF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwiY3BcIiwgYCR7c291cmNlfS8uYCwgYCR7dGhpcy5fY29udGFpbmVySWR9Oi9nY2wtYnVpbGRzYF0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY29weUNhY2hlT3V0ICh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgZXhwYW5kZWQ6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LCBleGl0Q29kZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmFyZ3YubW91bnRDYWNoZSAmJiB0aGlzLmltYWdlTmFtZShleHBhbmRlZCkpIHJldHVybjtcbiAgICAgICAgaWYgKCghdGhpcy5pbWFnZU5hbWUoZXhwYW5kZWQpICYmICF0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24pIHx8IHRoaXMuY2FjaGUubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5hcmd2LmN3ZDtcbiAgICAgICAgY29uc3Qgc3RhdGVEaXIgPSB0aGlzLmFyZ3Yuc3RhdGVEaXI7XG5cbiAgICAgICAgbGV0IHRpbWUsIGVuZFRpbWU7XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgICBpZiAoIVtcInB1c2hcIiwgXCJwdWxsLXB1c2hcIl0uaW5jbHVkZXMoYy5wb2xpY3kpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoXCJvbl9zdWNjZXNzXCIgPT09IGMud2hlbiAmJiBleGl0Q29kZSAhPSAwKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoXCJvbl9mYWlsdXJlXCIgPT09IGMud2hlbiAmJiBleGl0Q29kZSA9PT0gMCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVOYW1lID0gYXdhaXQgdGhpcy5nZXRVbmlxdWVDYWNoZU5hbWUoY3dkLCBleHBhbmRlZCwgYy5rZXkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIGMucGF0aHMpIHtcbiAgICAgICAgICAgICAgICB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBhbmRlZFBhdGggPSBVdGlscy5leHBhbmRUZXh0KHBhdGgsIGV4cGFuZGVkKS5yZXBsYWNlKGAke2V4cGFuZGVkLkNJX1BST0pFQ1RfRElSfS9gLCBcIlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgY21kID0gXCJzaG9wdCAtcyBnbG9ic3RhciBudWxsZ2xvYiBkb3RnbG9iXFxuXCI7XG4gICAgICAgICAgICAgICAgY21kICs9IGBta2RpciAtcCAuLi8uLi9jYWNoZS8ke2NhY2hlTmFtZX1cXG5gO1xuICAgICAgICAgICAgICAgIGNtZCArPSBgcnN5bmMgLVJhICR7ZXhwYW5kZWRQYXRofSAuLi8uLi9jYWNoZS8ke2NhY2hlTmFtZX0vLiB8fCB0cnVlXFxuYDtcblxuICAgICAgICAgICAgICAgIGF3YWl0IE11dGV4LmV4Y2x1c2l2ZShjYWNoZU5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5T3V0KGNtZCwgc3RhdGVEaXIsIFwiY2FjaGVcIiwgW10pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRkaXIgPSBhd2FpdCBmcy5yZWFkZGlyKGAke3RoaXMuYXJndi5jd2R9LyR7c3RhdGVEaXJ9L2NhY2hlLyR7Y2FjaGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIGlmIChyZWFkZGlyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7eWVsbG93ICEhIG5vIGNhY2hlIHdhcyBjb3BpZWQgZm9yICR7cGF0aH0gISF9XFxuYCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge21hZ2VudGFCcmlnaHQgZXhwb3J0ZWQgY2FjaGUgJHtleHBhbmRlZFBhdGh9ICcke2NhY2hlTmFtZX0nfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb3B5QXJ0aWZhY3RzT3V0ICh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgZXhwYW5kZWQ6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KSB7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5hcmd2LmN3ZDtcbiAgICAgICAgY29uc3Qgc3RhdGVEaXIgPSB0aGlzLmFyZ3Yuc3RhdGVEaXI7XG4gICAgICAgIGNvbnN0IGFydGlmYWN0c1BhdGggPSAhdGhpcy5hcmd2LnNoZWxsSXNvbGF0aW9uICYmICF0aGlzLmltYWdlTmFtZShleHBhbmRlZCkgPyBgJHtzdGF0ZURpcn0vYXJ0aWZhY3RzYCA6IFwiLi4vLi4vYXJ0aWZhY3RzXCI7XG5cbiAgICAgICAgaWYgKCF0aGlzLmFydGlmYWN0cykgcmV0dXJuO1xuICAgICAgICBpZiAoKHRoaXMuYXJ0aWZhY3RzLnBhdGhzPy5sZW5ndGggPz8gMCkgPT09IDAgJiYgdGhpcy5hcnRpZmFjdHMucmVwb3J0cz8uZG90ZW52ID09IG51bGwpIHJldHVybjtcblxuICAgICAgICBsZXQgdGltZSwgZW5kVGltZTtcbiAgICAgICAgbGV0IGNwQ21kID0gXCJzaG9wdCAtcyBnbG9ic3RhciBudWxsZ2xvYiBkb3RnbG9iXFxuXCI7XG4gICAgICAgIGNwQ21kICs9IGBta2RpciAtcCAke2FydGlmYWN0c1BhdGh9LyR7c2FmZUpvYk5hbWV9XFxuYDtcbiAgICAgICAgY3BDbWQgKz0gXCJyc3luYyAtLWV4Y2x1ZGUgJy5naXRsYWItY2ktbG9jYWwvKionIC1SYSBcIjtcbiAgICAgICAgZm9yIChjb25zdCBhcnRpZmFjdEV4Y2x1ZGVQYXRoIG9mIHRoaXMuYXJ0aWZhY3RzPy5leGNsdWRlID8/IFtdKSB7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlZFBhdGggPSBVdGlscy5leHBhbmRUZXh0KGFydGlmYWN0RXhjbHVkZVBhdGgsIGV4cGFuZGVkKS5yZXBsYWNlKGAke2V4cGFuZGVkLkNJX1BST0pFQ1RfRElSfS9gLCBcIlwiKTtcbiAgICAgICAgICAgIGNwQ21kICs9IGAtLWV4Y2x1ZGUgJyR7ZXhwYW5kZWRQYXRofScgYDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGFydGlmYWN0UGF0aCBvZiB0aGlzLmFydGlmYWN0cz8ucGF0aHMgPz8gW10pIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVkUGF0aCA9IFV0aWxzLmV4cGFuZFRleHQoYXJ0aWZhY3RQYXRoLCBleHBhbmRlZCkucmVwbGFjZShgJHtleHBhbmRlZC5DSV9QUk9KRUNUX0RJUn0vYCwgXCJcIik7XG4gICAgICAgICAgICBjcENtZCArPSBgJHtleHBhbmRlZFBhdGh9IGA7XG4gICAgICAgIH1cbiAgICAgICAgY3BDbWQgKz0gYCR7YXJ0aWZhY3RzUGF0aH0vJHtzYWZlSm9iTmFtZX0vLiB8fCB0cnVlXFxuYDtcbiAgICAgICAgY29uc3QgcmVwb3J0RG90ZW52ID0gVXRpbHMuZXhwYW5kVGV4dCh0aGlzLmFydGlmYWN0cy5yZXBvcnRzPy5kb3RlbnYgPz8gbnVsbCwgZXhwYW5kZWQpO1xuICAgICAgICBpZiAocmVwb3J0RG90ZW52ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNwQ21kICs9IGBta2RpciAtcCAke2FydGlmYWN0c1BhdGh9LyR7c2FmZUpvYk5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnZcXG5gO1xuICAgICAgICAgICAgY3BDbWQgKz0gYGlmIFsgLWYgJHtyZXBvcnREb3RlbnZ9IF07IHRoZW5cXG5gO1xuICAgICAgICAgICAgY3BDbWQgKz0gYCAgcnN5bmMgLVJhICR7cmVwb3J0RG90ZW52fSAke2FydGlmYWN0c1BhdGh9LyR7c2FmZUpvYk5hbWV9Ly5naXRsYWItY2ktcmVwb3J0cy9kb3RlbnYvLlxcbmA7XG4gICAgICAgICAgICBjcENtZCArPSBcImZpXFxuXCI7XG4gICAgICAgIH1cblxuICAgICAgICB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgY29uc3QgZG9ja2VyQ21kRXh0cmFzID0gdGhpcy5hcmd2Lm1vdW50Q2FjaGUgPyBhd2FpdCB0aGlzLm1vdW50Q2FjaGVDbWQod3JpdGVTdHJlYW1zLCBleHBhbmRlZCkgOiBbXTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5T3V0KGNwQ21kLCBzdGF0ZURpciwgXCJhcnRpZmFjdHNcIiwgZG9ja2VyQ21kRXh0cmFzKTtcbiAgICAgICAgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuXG4gICAgICAgIGlmIChyZXBvcnREb3RlbnYgIT0gbnVsbCAmJiAhYXdhaXQgZnMucGF0aEV4aXN0cyhgJHtjd2R9LyR7c3RhdGVEaXJ9L2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52LyR7cmVwb3J0RG90ZW52fWApKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7eWVsbG93IGFydGlmYWN0IHJlcG9ydHMgZG90ZW52ICcke3JlcG9ydERvdGVudn0nIGNvdWxkIG5vdCBiZSBmb3VuZH1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlYWRkaXIgPSBhd2FpdCBmcy5yZWFkZGlyKGAke2N3ZH0vJHtzdGF0ZURpcn0vYXJ0aWZhY3RzLyR7c2FmZUpvYk5hbWV9YCk7XG4gICAgICAgIGlmIChyZWFkZGlyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3llbGxvdyAhISBubyBhcnRpZmFjdHMgd2FzIGNvcGllZCAhIX1cXG5gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGV4cG9ydGVkIGFydGlmYWN0c30gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXJ0aWZhY3RzVG9Tb3VyY2UgJiYgKHRoaXMuYXJndi5zaGVsbElzb2xhdGlvbiB8fCB0aGlzLmltYWdlTmFtZShleHBhbmRlZCkpKSB7XG4gICAgICAgICAgICB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFtcInJzeW5jXCIsIFwiLS1leGNsdWRlPS8uZ2l0bGFiLWNpLXJlcG9ydHMvXCIsIFwiLWFcIiwgYCR7Y3dkfS8ke3N0YXRlRGlyfS9hcnRpZmFjdHMvJHtzYWZlSm9iTmFtZX0vLmAsIGN3ZF0pO1xuICAgICAgICAgICAgaWYgKHJlcG9ydERvdGVudiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW1wicnN5bmNcIiwgXCItYVwiLCBgJHtjd2R9LyR7c3RhdGVEaXJ9L2FydGlmYWN0cy8ke3NhZmVKb2JOYW1lfS8uZ2l0bGFiLWNpLXJlcG9ydHMvZG90ZW52Ly5gLCBjd2RdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZFRpbWUgPSBwcm9jZXNzLmhydGltZSh0aW1lKTtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGNvcGllZCBhcnRpZmFjdHMgdG8gY3dkfSBpbiB7bWFnZW50YSAke3ByZXR0eUhydGltZShlbmRUaW1lKX19XFxuYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvcHlPdXQgKGNtZDogc3RyaW5nLCBzdGF0ZURpcjogc3RyaW5nLCB0eXBlOiBcImFydGlmYWN0c1wiIHwgXCJjYWNoZVwiLCBkb2NrZXJDbWRFeHRyYXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHNhZmVKb2JOYW1lID0gdGhpcy5zYWZlSm9iTmFtZTtcbiAgICAgICAgY29uc3QgYnVpbGRWb2x1bWVOYW1lID0gdGhpcy5idWlsZFZvbHVtZU5hbWU7XG4gICAgICAgIGNvbnN0IGN3ZCA9IHRoaXMuYXJndi5jd2Q7XG5cbiAgICAgICAgYXdhaXQgZnMubWtkaXJwKGAke2N3ZH0vJHtzdGF0ZURpcn0vJHt0eXBlfWApO1xuXG4gICAgICAgIGlmICh0aGlzLmltYWdlTmFtZSh0aGlzLl92YXJpYWJsZXMpKSB7XG4gICAgICAgICAgICBjb25zdCB7c3Rkb3V0OiBjb250YWluZXJJZH0gPSBhd2FpdCBVdGlscy5iYXNoKGAke3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlfSBjcmVhdGUgLWkgJHtkb2NrZXJDbWRFeHRyYXMuam9pbihcIiBcIil9IC12ICR7YnVpbGRWb2x1bWVOYW1lfTovZ2NsLWJ1aWxkcy8gLXcgL2djbC1idWlsZHMgZG9ja2VyLmlvL2ZpcmVjb3cvZ2l0bGFiLWNpLWxvY2FsLXV0aWwgYmFzaCAtYyBcIiR7Y21kfVwiYCwgY3dkKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lcnNUb0NsZWFuLnB1c2goY29udGFpbmVySWQpO1xuICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInN0YXJ0XCIsIGNvbnRhaW5lcklkLCBcIi0tYXR0YWNoXCJdKTtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJjcFwiLCBgJHtjb250YWluZXJJZH06LyR7dHlwZX0vLmAsIGAke3N0YXRlRGlyfS8ke3R5cGV9Ly5gXSwgY3dkKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLmJhc2goYGJhc2ggLWVvIHBpcGVmYWlsIC1jIFwiJHtjbWR9XCJgLCBgJHtjd2R9LyR7c3RhdGVEaXJ9L2J1aWxkcy8ke3NhZmVKb2JOYW1lfWApO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmFyZ3Yuc2hlbGxJc29sYXRpb24pIHtcbiAgICAgICAgICAgIGF3YWl0IFV0aWxzLmJhc2goYGJhc2ggLWVvIHBpcGVmYWlsIC1jIFwiJHtjbWR9XCJgLCBgJHtjd2R9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZnJlc2hMb25nUnVubmluZ1NpbGVudFRpbWVvdXQgKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sb25nUnVubmluZ1NpbGVudFRpbWVvdXQpO1xuICAgICAgICB0aGlzLl9sb25nUnVubmluZ1NpbGVudFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHtncmV5ID4gc3RpbGwgcnVubmluZy4uLn1cXG5gKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaExvbmdSdW5uaW5nU2lsZW50VGltZW91dCh3cml0ZVN0cmVhbXMpO1xuICAgICAgICB9LCAxMDAwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFeGl0ZWRTdHJpbmcgKGNvZGU6IG51bWJlciwgd2FybmluZyA9IGZhbHNlLCBwcmVwZW5kU3RyaW5nID0gXCJcIikge1xuICAgICAgICBjb25zdCBmaW5pc2hlZFN0ciA9IHRoaXMuZ2V0RmluaXNoZWRTdHJpbmcoKTtcbiAgICAgICAgaWYgKHdhcm5pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGFsa2Ake2ZpbmlzaGVkU3RyfSB7YmxhY2suYmdZZWxsb3dCcmlnaHQgIFdBUk4gJHtjb2RlLnRvU3RyaW5nKCl9IH0ke3ByZXBlbmRTdHJpbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGFsa2Ake2ZpbmlzaGVkU3RyfSB7YmxhY2suYmdSZWQgIEZBSUwgJHtjb2RlLnRvU3RyaW5nKCl9IH0gJHtwcmVwZW5kU3RyaW5nfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlckVuZFRpbWUgKCkge1xuICAgICAgICB0aGlzLl9lbmRUaW1lID0gdGhpcy5fZW5kVGltZSA/PyBwcm9jZXNzLmhydGltZSh0aGlzLl9zdGFydFRpbWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmluaXNoZWRTdHJpbmcgKCkge1xuICAgICAgICB0aGlzLl9lbmRUaW1lID0gdGhpcy5fZW5kVGltZSA/PyBwcm9jZXNzLmhydGltZSh0aGlzLl9zdGFydFRpbWUpO1xuICAgICAgICByZXR1cm4gY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IGZpbmlzaGVkfSBpbiB7bWFnZW50YSAke3RoaXMucHJldHR5RHVyYXRpb259fWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVEb2NrZXJOZXR3b3JrIChuZXR3b3JrTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHtzdGRvdXQ6IG5ldHdvcmtJZH0gPSBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwibmV0d29ya1wiLCBcImNyZWF0ZVwiLCBgJHtuZXR3b3JrTmFtZX1gXSk7XG4gICAgICAgIHRoaXMuX3NlcnZpY2VOZXR3b3JrSWQgPSBuZXR3b3JrSWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzdGFydFNlcnZpY2UgKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBleHBhbmRlZDoge1trZXk6IHN0cmluZ106IHN0cmluZ30sIHNlcnZpY2U6IFNlcnZpY2UpIHtcbiAgICAgICAgY29uc3QgY3dkID0gdGhpcy5hcmd2LmN3ZDtcbiAgICAgICAgbGV0IGRvY2tlckNtZCA9IGAke3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlfSBjcmVhdGUgLS1pbnRlcmFjdGl2ZSAtLW5ldHdvcmsgZ2l0bGFiLWNpLWxvY2FsLSR7dGhpcy5qb2JJZH0gYDtcbiAgICAgICAgdGhpcy5yZWZyZXNoTG9uZ1J1bm5pbmdTaWxlbnRUaW1lb3V0KHdyaXRlU3RyZWFtcyk7XG5cbiAgICAgICAgaWYgKGV4cGFuZGVkW1wiRkZfRElTQUJMRV9VTUFTS19GT1JfRE9DS0VSX0VYRUNVVE9SXCJdID09PSBcImZhbHNlXCIpIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0tdXNlciAwOjAgXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcmd2LnByaXZpbGVnZWQpIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0tcHJpdmlsZWdlZCBcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3YudWxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdWxpbWl0IG5vZmlsZT0ke3RoaXMuYXJndi51bGltaXR9IGA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHZvbHVtZSBvZiB0aGlzLmFyZ3Yudm9sdW1lKSB7XG4gICAgICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7dm9sdW1lfSBgO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VydmljZUFsaWFzID0gc2VydmljZS5hbGlhcztcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBzZXJ2aWNlLm5hbWU7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24gPSBzZXJ2aWNlTmFtZS5yZXBsYWNlKC8oLiopKDouKikvLCBcIiQxXCIpO1xuICAgICAgICBjb25zdCBhbGlhc2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGFsaWFzZXMuYWRkKHNlcnZpY2VOYW1lV2l0aG91dFZlcnNpb24ucmVwbGFjZUFsbChcIi9cIiwgXCItXCIpKTtcbiAgICAgICAgYWxpYXNlcy5hZGQoc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbi5yZXBsYWNlQWxsKFwiL1wiLCBcIl9fXCIpKTtcbiAgICAgICAgaWYgKHNlcnZpY2VBbGlhcykge1xuICAgICAgICAgICAgYWxpYXNlcy5hZGQoc2VydmljZUFsaWFzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgYWxpYXMgb2YgYWxpYXNlcykge1xuICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLW5ldHdvcmstYWxpYXM9JHthbGlhc30gYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhleHBhbmRlZCkpIHtcbiAgICAgICAgICAgIGRvY2tlckNtZCArPSBgLWUgJyR7a2V5fT0ke3ZhbH0nIGA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXJ2aWNlRW50cnlwb2ludCA9IHNlcnZpY2UuZW50cnlwb2ludDtcbiAgICAgICAgaWYgKHNlcnZpY2VFbnRyeXBvaW50KSB7XG4gICAgICAgICAgICBpZiAoc2VydmljZUVudHJ5cG9pbnRbMF0gPT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGRvY2tlckNtZCArPSBcIi0tZW50cnlwb2ludCAnJyBcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGAtLWVudHJ5cG9pbnQgJHtzZXJ2aWNlRW50cnlwb2ludFswXX0gYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkb2NrZXJDbWQgKz0gYC0tdm9sdW1lICR7dGhpcy5idWlsZFZvbHVtZU5hbWV9Oi9nY2wtYnVpbGRzIGA7XG4gICAgICAgIGRvY2tlckNtZCArPSBgLS12b2x1bWUgJHt0aGlzLnRtcFZvbHVtZU5hbWV9OiR7dGhpcy5maWxlVmFyaWFibGVzRGlyfSBgO1xuICAgICAgICBkb2NrZXJDbWQgKz0gYCR7c2VydmljZU5hbWV9IGA7XG5cbiAgICAgICAgaWYgKHNlcnZpY2VFbnRyeXBvaW50Py5sZW5ndGggPz8gMCA+IDEpIHtcbiAgICAgICAgICAgIHNlcnZpY2VFbnRyeXBvaW50Py5zbGljZSgxKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9ja2VyQ21kICs9IGBcIiR7ZX1cIiBgO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgKHNlcnZpY2UuY29tbWFuZCA/PyBbXSkuZm9yRWFjaCgoZSkgPT4gZG9ja2VyQ21kICs9IGBcIiR7ZS5yZXBsYWNlKC9cXCQvZywgXCJcXFxcJFwiKX1cIiBgKTtcblxuICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcblxuICAgICAgICBjb25zdCB7c3Rkb3V0OiBjb250YWluZXJJZH0gPSBhd2FpdCBVdGlscy5iYXNoKGRvY2tlckNtZCwgY3dkKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyc1RvQ2xlYW4ucHVzaChjb250YWluZXJJZCk7XG5cbiAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oW3RoaXMuYXJndi5jb250YWluZXJFeGVjdXRhYmxlLCBcInN0YXJ0XCIsIGAke2NvbnRhaW5lcklkfWBdKTtcblxuICAgICAgICBjb25zdCBlbmRUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgJHt0aGlzLmZvcm1hdHRlZEpvYk5hbWV9IHttYWdlbnRhQnJpZ2h0IHN0YXJ0ZWQgc2VydmljZSBpbWFnZTogJHtzZXJ2aWNlTmFtZX0gd2l0aCBhbGlhc2VzOiAke0FycmF5LmZyb20oYWxpYXNlcykuam9pbihcIiwgXCIpfX0gaW4ge21hZ2VudGEgJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fVxcbmApO1xuXG4gICAgICAgIHJldHVybiBjb250YWluZXJJZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNlcnZpY2VIZWFsdGhDaGVjayAod3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIHNlcnZpY2U6IFNlcnZpY2UsIHNlcnZpY2VJbmRleDogbnVtYmVyLCBzZXJ2aWNlQ29udGFuZXJMb2dGaWxlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZUFsaWFzID0gc2VydmljZS5hbGlhcztcbiAgICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBzZXJ2aWNlLm5hbWU7XG5cbiAgICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBVdGlscy5zcGF3bihbdGhpcy5hcmd2LmNvbnRhaW5lckV4ZWN1dGFibGUsIFwiaW1hZ2VcIiwgXCJpbnNwZWN0XCIsIHNlcnZpY2VOYW1lXSk7XG4gICAgICAgIGNvbnN0IGltYWdlSW5zcGVjdCA9IEpTT04ucGFyc2Uoc3Rkb3V0KTtcblxuICAgICAgICAvLyBDb3BpZWQgZnJvbSB0aGUgc3RhcnRTZXJ2aWNlIGJsb2NrLiBJbXBvcnRhbnQgdGhpbmcgaXMgdGhhdCB0aGUgYWxpYXNlcyBtYXRjaFxuICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uID0gc2VydmljZU5hbWUucmVwbGFjZSgvKC4qKSg6LiopLywgXCIkMVwiKTtcbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IFtzZXJ2aWNlTmFtZVdpdGhvdXRWZXJzaW9uLnJlcGxhY2VBbGwoXCIvXCIsIFwiLVwiKSwgc2VydmljZU5hbWVXaXRob3V0VmVyc2lvbi5yZXBsYWNlQWxsKFwiL1wiLCBcIl9fXCIpXTtcbiAgICAgICAgaWYgKHNlcnZpY2VBbGlhcykge1xuICAgICAgICAgICAgYWxpYXNlcy5wdXNoKHNlcnZpY2VBbGlhcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bmlxdWVBbGlhcyA9IGFsaWFzZXNbYWxpYXNlcy5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAoKGltYWdlSW5zcGVjdFswXT8uQ29uZmlnPy5FeHBvc2VkUG9ydHMgPz8gbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYCR7dGhpcy5mb3JtYXR0ZWRKb2JOYW1lfSB7eWVsbG93IENvdWxkIG5vdCBmaW5kIGV4cG9zZWQgdGNwIHBvcnRzICR7c2VydmljZU5hbWV9fVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBwb3J0IGRlZmluZWQgaW4gdGhlIGltYWdlLCBhbmQgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIGFsaWFzXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFueShPYmplY3Qua2V5cyhpbWFnZUluc3BlY3RbMF0uQ29uZmlnLkV4cG9zZWRQb3J0cykubWFwKChwb3J0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFwb3J0LmVuZHNXaXRoKFwiL3RjcFwiKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcnROdW0gPSBwYXJzZUludChwb3J0LnJlcGxhY2UoXCIvdGNwXCIsIFwiXCIpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGF3bkNtZCA9IFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJydW5cIiwgXCItLXJtXCIsIGAtLW5hbWU9Z2NsLXdhaXQtZm9yLWl0LSR7dGhpcy5qb2JJZH0tJHtzZXJ2aWNlSW5kZXh9LSR7cG9ydE51bX1gLCBcIi0tbmV0d29ya1wiLCBgZ2l0bGFiLWNpLWxvY2FsLSR7dGhpcy5qb2JJZH1gLCBcImRvY2tlci5pby9zdW1pbmE0Ni93YWl0LWZvci1pdFwiLCBgJHt1bmlxdWVBbGlhc306JHtwb3J0TnVtfWAsIFwiLXRcIiwgXCIzMFwiXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuc3Bhd24oc3Bhd25DbWQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lKHRpbWUpO1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge2dyZWVuQnJpZ2h0IHNlcnZpY2UgaW1hZ2U6ICR7c2VydmljZU5hbWV9IGhlYWx0aGNoZWNrIHBhc3NlZCBpbiB7Z3JlZW4gJHtwcmV0dHlIcnRpbWUoZW5kVGltZSl9fX1cXG5gKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgICAgICAgZS5lcnJvcnMuZm9yRWFjaCgoc2luZ2xlRXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3JlZEJyaWdodCBzZXJ2aWNlIGltYWdlOiAke3NlcnZpY2VOYW1lfSBoZWFsdGhjaGVjayBmYWlsZWR9XFxuYCk7XG4gICAgICAgICAgICAgICAgc2luZ2xlRXJyb3IubWVzc2FnZS5zcGxpdCgvXFxyP1xcbi9nKS5mb3JFYWNoKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3JlZEJyaWdodCAgICR7bGluZX19XFxuYCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2Ake3RoaXMuZm9ybWF0dGVkSm9iTmFtZX0ge3JlZEJyaWdodCBhbHNvIHNlZSAoJHtzZXJ2aWNlQ29udGFuZXJMb2dGaWxlfSl9XFxuYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIC8vIEtpbGwgYWxsIHdhaXQtZm9yLWl0IGNvbnRhaW5lcnMsIHdoZW4gb25lIGhhdmUgYmVlbiBzdWNjZXNzZnVsXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoT2JqZWN0LmtleXMoaW1hZ2VJbnNwZWN0WzBdLkNvbmZpZy5FeHBvc2VkUG9ydHMpLm1hcCgocG9ydCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcG9ydC5lbmRzV2l0aChcIi90Y3BcIikpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3J0TnVtID0gcGFyc2VJbnQocG9ydC5yZXBsYWNlKFwiL3RjcFwiLCBcIlwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnNwYXduKFt0aGlzLmFyZ3YuY29udGFpbmVyRXhlY3V0YWJsZSwgXCJybVwiLCBcIi12ZlwiLCBgZ2NsLXdhaXQtZm9yLWl0LSR7dGhpcy5qb2JJZH0tJHtzZXJ2aWNlSW5kZXh9LSR7cG9ydE51bX1gXSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhbnVwSm9iUmVzb3VyY2VzIChqb2JzPzogSXRlcmFibGU8Sm9iPikge1xuICAgIGlmICgham9icykgcmV0dXJuO1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgZm9yIChjb25zdCBqb2Igb2Ygam9icykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGpvYi5jbGVhbnVwUmVzb3VyY2VzKCkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59XG4iXX0=
|