@mnaoumov/typescript-dev-toolkit 6.0.2 → 6.1.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 +18 -0
- package/dist/lib/cjs/version.cjs +65 -10
- package/dist/lib/cjs/version.d.cts +20 -0
- package/dist/lib/esm/version.d.mts +20 -0
- package/dist/lib/esm/version.mjs +65 -10
- package/package.json +21 -21
package/dist/lib/esm/version.mjs
CHANGED
|
@@ -53,6 +53,7 @@ import {
|
|
|
53
53
|
writeFile
|
|
54
54
|
} from "node:fs/promises";
|
|
55
55
|
import { tmpdir } from "node:os";
|
|
56
|
+
import { basename } from "node:path";
|
|
56
57
|
import { createInterface } from "node:readline/promises";
|
|
57
58
|
import { parseArgs } from "node:util";
|
|
58
59
|
import {
|
|
@@ -254,9 +255,8 @@ function parseVersionArguments($arguments) {
|
|
|
254
255
|
};
|
|
255
256
|
}
|
|
256
257
|
async function publishGitHubRelease(newVersion, options = {}) {
|
|
257
|
-
const { getReleaseAssetPaths = getNpmPackReleaseAssetPaths, shouldCloseReleasedIssues = true } = options;
|
|
258
|
-
|
|
259
|
-
filePaths = filePaths.filter((filePath) => existsSync(resolvePathFromRootSafe({ path: filePath })));
|
|
258
|
+
const { getReleaseAssetPaths = getNpmPackReleaseAssetPaths, shouldCloseReleasedIssues = true, shouldVerifyRelease = false } = options;
|
|
259
|
+
const filePaths = await resolveReleaseAssetPaths(getReleaseAssetPaths, shouldVerifyRelease);
|
|
260
260
|
await execFromRoot([
|
|
261
261
|
"gh",
|
|
262
262
|
"release",
|
|
@@ -265,6 +265,7 @@ async function publishGitHubRelease(newVersion, options = {}) {
|
|
|
265
265
|
...filePaths,
|
|
266
266
|
"--title",
|
|
267
267
|
`v${newVersion}`,
|
|
268
|
+
...shouldVerifyRelease ? ["--verify-tag"] : [],
|
|
268
269
|
...isPreRelease(newVersion) ? ["--prerelease"] : [],
|
|
269
270
|
"--notes-file",
|
|
270
271
|
"-"
|
|
@@ -272,14 +273,13 @@ async function publishGitHubRelease(newVersion, options = {}) {
|
|
|
272
273
|
isQuiet: true,
|
|
273
274
|
stdin: await getReleaseNotes(newVersion)
|
|
274
275
|
});
|
|
276
|
+
if (shouldVerifyRelease) {
|
|
277
|
+
await verifyGitHubRelease(newVersion, filePaths);
|
|
278
|
+
}
|
|
275
279
|
if (!shouldCloseReleasedIssues) {
|
|
276
280
|
return;
|
|
277
281
|
}
|
|
278
|
-
|
|
279
|
-
await closeReleasedIssues({ newVersion });
|
|
280
|
-
} catch (error) {
|
|
281
|
-
console.warn(`The ${newVersion} release is published, but closing the issues it carries failed: ${errorToString(error)}`);
|
|
282
|
-
}
|
|
282
|
+
await closeReleasedIssuesSafely(newVersion, true);
|
|
283
283
|
}
|
|
284
284
|
function toUpdateVersionOptions(values) {
|
|
285
285
|
return {
|
|
@@ -298,11 +298,12 @@ async function updateChangelog(newVersion, options = {}) {
|
|
|
298
298
|
async function updateVersion(versionUpdateType, options = {}) {
|
|
299
299
|
const {
|
|
300
300
|
changelogFilePath,
|
|
301
|
-
getReleaseAssetPaths,
|
|
301
|
+
getReleaseAssetPaths = getNpmPackReleaseAssetPaths,
|
|
302
302
|
prepareGitHubRelease,
|
|
303
303
|
shouldBuild = true,
|
|
304
304
|
shouldCloseReleasedIssues = true,
|
|
305
305
|
shouldEditChangelog = true,
|
|
306
|
+
shouldPublishBeforePush = false,
|
|
306
307
|
shouldRelease = true,
|
|
307
308
|
shouldRunChecks = true,
|
|
308
309
|
shouldVerifyCommit = true,
|
|
@@ -348,6 +349,25 @@ async function updateVersion(versionUpdateType, options = {}) {
|
|
|
348
349
|
getLibDebugger("Version")("Skipping git push and GitHub release (--no-release). The version bump, changelog, commit, and tag have been created locally.");
|
|
349
350
|
return;
|
|
350
351
|
}
|
|
352
|
+
if (shouldPublishBeforePush) {
|
|
353
|
+
await prepareGitHubRelease?.(newVersion);
|
|
354
|
+
const filePaths = await resolveReleaseAssetPaths(getReleaseAssetPaths, true);
|
|
355
|
+
await assertReleaseCommitLanded(newVersion, startHead, "pushing");
|
|
356
|
+
const tagCommitSha = await execFromRoot(["git", "rev-parse", `refs/tags/${newVersion}^{}`], { isQuiet: true });
|
|
357
|
+
if (tagCommitSha !== releaseCommitSha) {
|
|
358
|
+
throw new Error(`Refusing to push ${newVersion}: its tag no longer names the verified release commit.`);
|
|
359
|
+
}
|
|
360
|
+
await execFromRoot(["git", "push", "origin", `refs/tags/${newVersion}:refs/tags/${newVersion}`], { isQuiet: true });
|
|
361
|
+
await publishGitHubRelease(newVersion, {
|
|
362
|
+
getReleaseAssetPaths: () => Promise.resolve(filePaths),
|
|
363
|
+
shouldCloseReleasedIssues: false,
|
|
364
|
+
shouldVerifyRelease: true
|
|
365
|
+
});
|
|
366
|
+
await assertReleaseCommitLanded(newVersion, startHead, "pushing");
|
|
367
|
+
await execFromRoot(["git", "push", "origin", `${releaseCommitSha}:refs/heads/${startHead.branch}`], { isQuiet: true });
|
|
368
|
+
await closeReleasedIssuesSafely(newVersion, shouldCloseReleasedIssues);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
351
371
|
await assertReleaseCommitLanded(newVersion, startHead, "pushing");
|
|
352
372
|
await gitPush();
|
|
353
373
|
await prepareGitHubRelease?.(newVersion);
|
|
@@ -447,6 +467,16 @@ async function assertVersionUpdateTypeMeetsBumpFloor(versionUpdateType) {
|
|
|
447
467
|
versionUpdateType
|
|
448
468
|
});
|
|
449
469
|
}
|
|
470
|
+
async function closeReleasedIssuesSafely(newVersion, shouldClose) {
|
|
471
|
+
if (!shouldClose) {
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
try {
|
|
475
|
+
await closeReleasedIssues({ newVersion });
|
|
476
|
+
} catch (error) {
|
|
477
|
+
console.warn(`The ${newVersion} release is published, but closing the issues it carries failed: ${errorToString(error)}`);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
450
480
|
async function composeChangelog(newVersion, changelogFilePath) {
|
|
451
481
|
const previousChangelogLines = await readPreviousChangelogLines();
|
|
452
482
|
let newChangeLog = `# CHANGELOG
|
|
@@ -658,6 +688,16 @@ async function resolveLastReleasedTag(previousChangelogLines) {
|
|
|
658
688
|
}
|
|
659
689
|
return lastTag;
|
|
660
690
|
}
|
|
691
|
+
async function resolveReleaseAssetPaths(getPaths, shouldRequireAssets) {
|
|
692
|
+
const paths = await getPaths();
|
|
693
|
+
return paths.filter((path) => {
|
|
694
|
+
const isExists = existsSync(resolvePathFromRootSafe({ path }));
|
|
695
|
+
if (!isExists && shouldRequireAssets) {
|
|
696
|
+
throw new Error(`Release asset does not exist: ${path}`);
|
|
697
|
+
}
|
|
698
|
+
return isExists;
|
|
699
|
+
});
|
|
700
|
+
}
|
|
661
701
|
async function reviewChangelog(newChangeLog, findings) {
|
|
662
702
|
const scratchFolder = await mkdtemp(join(tmpdir(), "changelog-"));
|
|
663
703
|
const scratchChangelogPath = join(scratchFolder, RepoPaths.ChangelogMd);
|
|
@@ -789,6 +829,21 @@ function toHighestBumpLevel(forcingCommits) {
|
|
|
789
829
|
}
|
|
790
830
|
return forcingCommits.length > 0 ? "minor" /* Minor */ : "patch" /* Patch */;
|
|
791
831
|
}
|
|
832
|
+
async function verifyGitHubRelease(newVersion, filePaths) {
|
|
833
|
+
const release = JSON.parse(
|
|
834
|
+
await execFromRoot([
|
|
835
|
+
"gh",
|
|
836
|
+
"release",
|
|
837
|
+
"view",
|
|
838
|
+
newVersion,
|
|
839
|
+
"--json",
|
|
840
|
+
"isDraft,isPrerelease,tagName,assets"
|
|
841
|
+
], { isQuiet: true })
|
|
842
|
+
);
|
|
843
|
+
if (release.isDraft || release.tagName !== newVersion || release.isPrerelease !== isPreRelease(newVersion) || filePaths.some((path) => release.assets.every((asset) => !(asset.name === basename(path) && asset.state === "uploaded")))) {
|
|
844
|
+
throw new Error(`Could not verify the public ${newVersion} release and its uploaded assets; the remote branch was not advanced.`);
|
|
845
|
+
}
|
|
846
|
+
}
|
|
792
847
|
async function writeChangelog(newChangeLog) {
|
|
793
848
|
await writeFile(resolvePathFromRootSafe({ path: RepoPaths.ChangelogMd }), newChangeLog, "utf-8");
|
|
794
849
|
}
|
|
@@ -816,4 +871,4 @@ export {
|
|
|
816
871
|
updateVersionInFiles,
|
|
817
872
|
validate
|
|
818
873
|
};
|
|
819
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92ZXJzaW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIHZlcnNpb24gdXBkYXRlcyBpbiBhIHByb2plY3QuXG4gKiBJdCBpbmNsdWRlcyB0YXNrcyBzdWNoIGFzIHZhbGlkYXRpbmcgdmVyc2lvbiB1cGRhdGUgdHlwZXMsIGNoZWNraW5nIHRoZSBzdGF0ZVxuICogb2YgR2l0IGFuZCBHaXRIdWIgQ0xJLCB1cGRhdGluZyB2ZXJzaW9uIG51bWJlcnMgaW4gZmlsZXMsIGFuZCBwZXJmb3JtaW5nXG4gKiBHaXQgb3BlcmF0aW9ucyBzdWNoIGFzIHRhZ2dpbmcgYW5kIHB1c2hpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQYXJzZUFyZ3NDb25maWcgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHR5cGUgeyBSZWxlYXNlVHlwZSB9IGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7XG4gIGVzY2FwZVJlZ0V4cCxcbiAgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZHRlbXAsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UgfSBmcm9tICdub2RlOnJlYWRsaW5lL3Byb21pc2VzJztcbmltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBpbmMsXG4gIHBhcnNlLFxuICBwcmVyZWxlYXNlXG59IGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUxvY2tKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQge1xuICBmaW5kRm9yYmlkZGVuUGF0dGVybk1hdGNoZXMsXG4gIEZPUkJJRERFTl9QQVRURVJOU19GSUxFX0VOVl9WQVJJQUJMRSxcbiAgcmVhZEZvcmJpZGRlblBhdHRlcm5zXG59IGZyb20gJy4vZm9yYmlkZGVuLXBhdHRlcm5zLnRzJztcbmltcG9ydCB7IGdhdGUgfSBmcm9tICcuL2dhdGUudHMnO1xuaW1wb3J0IHsgc3BlbGxjaGVja0NvbnRlbnQgfSBmcm9tICcuL2xpbnRlcnMvY3NwZWxsLWNvbnRlbnQudHMnO1xuaW1wb3J0IHtcbiAgZml4TWFya2Rvd25Db250ZW50LFxuICBsaW50TWFya2Rvd25Db250ZW50XG59IGZyb20gJy4vbGludGVycy9tYXJrZG93bmxpbnQtY29udGVudC50cyc7XG5pbXBvcnQge1xuICBlZGl0TnBtU2hyaW5rV3JhcEpzb24sXG4gIGVkaXRQYWNrYWdlSnNvbixcbiAgZWRpdFBhY2thZ2VMb2NrSnNvbixcbiAgcmVhZFBhY2thZ2VKc29uXG59IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IGNsb3NlUmVsZWFzZWRJc3N1ZXMgfSBmcm9tICcuL3JlbGVhc2VkLWlzc3Vlcy50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuL3JlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZXhlY0Zyb21Sb290LFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBhZGRVcGRhdGVkRmlsZXNUb0dpdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVXBkYXRlZEZpbGVzVG9HaXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkVmVyc2lvbkFyZ3VtZW50cyB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBwYXJzZWQgZnJvbSB0aGUgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uYWwgdmVyc2lvbiB1cGRhdGUgdHlwZSBhcmd1bWVudCwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBwdWJsaXNoR2l0SHViUmVsZWFzZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZpbGVzIHRvIGF0dGFjaCB0byB0aGUgR2l0SHViIHJlbGVhc2UsIGFzIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuIEEgcGF0aCB0aGF0IGRvZXNcbiAgICogbm90IGV4aXN0IGlzIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBgbnBtIHBhY2tgIHRhcmJhbGwgb2YgdGhlIHByb2plY3QsIHdyaXR0ZW4gaW50byBgZGlzdC9gLCBhbmQgYGRpc3Qvc3R5bGVzLmNzc2BcbiAgICovXG4gIHJlYWRvbmx5IGdldFJlbGVhc2VBc3NldFBhdGhzPzogKCgpID0+IFByb21pc2U8c3RyaW5nW10+KSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjbG9zZSB0aGUgaXNzdWVzIHRoZSByZWxlYXNlIGNhcnJpZXMgb25jZSBpdCBpcyBwdWJsaXNoZWQ6IGV2ZXJ5IGlzc3VlIGEgY29tbWl0IHNpbmNlIHRoZSBwcmV2aW91c1xuICAgKiB0YWcgbmFtZXMgd2l0aCBhIGNsb3Npbmcga2V5d29yZCAoYGZpeGVzICMxMmApIGlzIGNsb3NlZCB3aXRoIGEgYEZpeGVkIGluYCAvIGBJbXBsZW1lbnRlZCBpbmAgY29tbWVudCBsaW5raW5nXG4gICAqIHRoZSByZWxlYXNlLiBTZWUge0BsaW5rIGNsb3NlUmVsZWFzZWRJc3N1ZXN9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVDaGFuZ2Vsb2d9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMge1xuICAvKipcbiAgICogQSBwYXRoIHRvIGEgZmlsZSB3aG9zZSBjb250ZW50cyBiZWNvbWUgdGhlIGJvZHkgb2YgdGhlIG5ldyB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24sIGluc3RlYWQgb2ZcbiAgICogdGhlIGJ1bGxldHMgZGVyaXZlZCBmcm9tIHRoZSBjb21taXQgbWVzc2FnZXMuIFVzZSBpdCB0byBzdXBwbHkgcHJlcGFyZWQgcmVsZWFzZSBub3RlcyBmcm9tIGFcbiAgICogbm9uLWludGVyYWN0aXZlIGNhbGxlciAoYSBiYWNrZ3JvdW5kIHByb2Nlc3MsIENJLCBhbiBhZ2VudCkuXG4gICAqXG4gICAqIFNldHRpbmcgaXQgaW1wbGllcyBubyBpbnRlcmFjdGl2ZSByZXZpZXc6IHRoZSBjb21taXQgbG9nIGlzIG5vdCByZWFkLCBhbmQgdGhlIGNoYW5nZWxvZyBpcyBuZXZlclxuICAgKiBvcGVuZWQgaW4gdGhlIGVkaXRvciBub3Igd2FpdGVkIG9uIGF0IHRoZSBjb25zb2xlLCByZWdhcmRsZXNzIG9mIHtAbGluayBzaG91bGRFZGl0Q2hhbmdlbG9nfS5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGZpcnN0LXBhcmVudCBjb21taXQgc3ViamVjdHMgc2luY2UgdGhlIHByZXZpb3VzIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZWxvZ0ZpbGVQYXRoPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG9wZW4gdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaW4gdGhlIGVkaXRvciBmb3IgYW4gaW50ZXJhY3RpdmUgcmV2aWV3LiBXaGVuIGBmYWxzZWAsXG4gICAqIHRoZSBjaGFuZ2Vsb2cgaXMgc3RpbGwgZ2VuZXJhdGVkIGZyb20gY29tbWl0IG1lc3NhZ2VzLCBidXQgaXQgaXMgbm90IG9wZW5lZCBpbiB0aGUgZWRpdG9yIGZvclxuICAgKiBtYW51YWwgcmV2aWV3LlxuICAgKlxuICAgKiBJZ25vcmVkIHdoZW4ge0BsaW5rIGNoYW5nZWxvZ0ZpbGVQYXRofSBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdENoYW5nZWxvZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHVwZGF0ZVZlcnNpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVZlcnNpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgcGF0aCB0byBhIGZpbGUgd2hvc2UgY29udGVudHMgYmVjb21lIHRoZSBib2R5IG9mIHRoZSBuZXcgdmVyc2lvbidzIGNoYW5nZWxvZyBzZWN0aW9uLCBpbnN0ZWFkIG9mXG4gICAqIHRoZSBidWxsZXRzIGRlcml2ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzLiBVc2UgaXQgdG8gc3VwcGx5IHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMgZnJvbSBhXG4gICAqIG5vbi1pbnRlcmFjdGl2ZSBjYWxsZXIgKGEgYmFja2dyb3VuZCBwcm9jZXNzLCBDSSwgYW4gYWdlbnQpLlxuICAgKlxuICAgKiBTZXR0aW5nIGl0IGltcGxpZXMgbm8gaW50ZXJhY3RpdmUgcmV2aWV3OiB0aGUgY29tbWl0IGxvZyBpcyBub3QgcmVhZCwgYW5kIHRoZSBjaGFuZ2Vsb2cgaXMgbmV2ZXJcbiAgICogb3BlbmVkIGluIHRoZSBlZGl0b3Igbm9yIHdhaXRlZCBvbiBhdCB0aGUgY29uc29sZSwgcmVnYXJkbGVzcyBvZiB7QGxpbmsgc2hvdWxkRWRpdENoYW5nZWxvZ30uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0IHN1YmplY3RzIHNpbmNlIHRoZSBwcmV2aW91cyB2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2Vsb2dGaWxlUGF0aD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmlsZXMgdG8gYXR0YWNoIHRvIHRoZSBHaXRIdWIgcmVsZWFzZS4gU2VlIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuZ2V0UmVsZWFzZUFzc2V0UGF0aHN9LlxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0UmVsZWFzZUFzc2V0UGF0aHM/OiAoKCkgPT4gUHJvbWlzZTxzdHJpbmdbXT4pIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIEdpdEh1YiByZWxlYXNlLlxuICAgKlxuICAgKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSByZWxlYXNlLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIEdpdEh1YiByZWxlYXNlIGhhcyBiZWVuIHByZXBhcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlcGFyZUdpdEh1YlJlbGVhc2U/OiAobmV3VmVyc2lvbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgYnVpbGQgc3RlcC4gVGhlIGJ1aWxkIGlzIGEgcHVibGlzaGluZyBwcmVyZXF1aXNpdGUsIG5vdCBhIHZlcmlmaWNhdGlvbiBjaGVjayxcbiAgICogc28gaXQgaXMgZ292ZXJuZWQgYnkgdGhpcyBmbGFnIGluZGVwZW5kZW50bHkgb2Yge0BsaW5rIHNob3VsZFJ1bkNoZWNrc30g4oCUIGl0IHJ1bnMgZXZlbiB3aGVuIHRoZVxuICAgKiBjaGVja3MgYXJlIHNraXBwZWQsIHNvIGEgZmFzdCByZWxlYXNlIHN0aWxsIHNoaXBzIGZyZXNoIGFydGlmYWN0cy4gU2V0IHRvIGBmYWxzZWAgb25seSB3aGVuIHRoZVxuICAgKiBidWlsZCBvdXRwdXQgaXMga25vd24gdG8gYWxyZWFkeSBtYXRjaCB0aGUgY3VycmVudCBjb2RlOyBvdGhlcndpc2UgdGhlIHJlbGVhc2Ugd291bGQgcHVibGlzaFxuICAgKiBzdGFsZSBhcnRpZmFjdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNsb3NlIHRoZSBpc3N1ZXMgdGhlIHJlbGVhc2UgY2FycmllcyBvbmNlIGl0IGlzIHB1Ymxpc2hlZC4gU2VlXG4gICAqIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlc30uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpbiB0aGUgZWRpdG9yIGZvciBhbiBpbnRlcmFjdGl2ZSByZXZpZXcuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiB7QGxpbmsgY2hhbmdlbG9nRmlsZVBhdGh9IGlzIHNldC4gV2hlbiBpdCBpcyBuZWl0aGVyIHNldCBub3IgZGlzYWJsZWQsIHRoZSByZWxlYXNlXG4gICAqIHJlcXVpcmVzIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCBhbmQge0BsaW5rIHVwZGF0ZVZlcnNpb259IHJlZnVzZXMgdXAgZnJvbnQgd2l0aG91dCBvbmUgcmF0aGVyXG4gICAqIHRoYW4gYmxvY2tpbmcgb24gYW4gZWRpdG9yIG5vYm9keSB3aWxsIGNsb3NlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHB1Ymxpc2ggdGhlIHJlbGVhc2UuIFdoZW4gYGZhbHNlYCwgYWxsIGxvY2FsIHN0ZXBzIGFyZSBleGVjdXRlZCAodmVyc2lvbiBidW1wLFxuICAgKiBjaGFuZ2Vsb2csIGNvbW1pdCwgdGFnKSwgYnV0IHRoZSBjaGFuZ2VzIGFyZSBub3QgcHVzaGVkIGFuZCBubyBHaXRIdWIgcmVsZWFzZSBpcyBwdWJsaXNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmVmbGlnaHQgdmVyaWZpY2F0aW9uIGNoZWNrcyAoY2xlYW4tcmVwbyBjaGVjaywgZm9ybWF0LCBzcGVsbGNoZWNrLCBsaW50LFxuICAgKiBvdmVyLWV4cG9zdXJlIGFuYWx5c2lzLCBhbmQgdGVzdHMpLiBUaGUgYnVpbGQgc3RlcCBpcyBub3Qgb25lIG9mIHRoZXNlIGNoZWNrcyDigJQgaXQgaXMgZ292ZXJuZWRcbiAgICogc2VwYXJhdGVseSBieSB7QGxpbmsgc2hvdWxkQnVpbGR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJ1bkNoZWNrcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgdmVyc2lvbiBpbiBhbnkgZmlsZSBiZXlvbmQgYHBhY2thZ2UuanNvbmAgYW5kIHRoZSBsb2NrZmlsZXMsIG9uY2UgdGhlIG5ldyB2ZXJzaW9uIGlzIGtub3duIGFuZFxuICAgKiBiZWZvcmUgdGhlIHJlbGVhc2UgY29tbWl0IGlzIG1hZGUuIEFuIE9ic2lkaWFuIHBsdWdpbidzIGBtYW5pZmVzdC5qc29uYCBhbmQgYHZlcnNpb25zLmpzb25gIGFyZSB0aGUgY2FzZSB0aGlzXG4gICAqIGV4aXN0cyBmb3IuXG4gICAqXG4gICAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIHZlcnNpb24gYmVpbmcgcmVsZWFzZWQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZXMgYXJlIHVwZGF0ZWQuXG4gICAqL1xuICByZWFkb25seSB1cGRhdGVWZXJzaW9uSW5FeHRyYUZpbGVzPzogKChuZXdWZXJzaW9uOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4pIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBsb3dlc3QgYnVtcCBhIHJhbmdlIG9mIGNvbW1pdHMgbWF5IGJlIHB1Ymxpc2hlZCB1bmRlciwgYW5kIHRoZSBjb21taXRzIHRoYXQgZm9yY2UgaXQuXG4gKi9cbmludGVyZmFjZSBCdW1wRmxvb3Ige1xuICAvKipcbiAgICogVGhlIGNvbW1pdHMgd2hvc2UgQ29udmVudGlvbmFsLUNvbW1pdHMgbWFya2VycyBmb3JjZSB7QGxpbmsgbGV2ZWx9LCBpbiB0aGUgb3JkZXIgYGdpdCBsb2dgIHJlcG9ydGVkIHRoZW0uXG4gICAqIEVtcHR5IHdoZW4gbm90aGluZyBmb3JjZXMgYW55dGhpbmcsIHdoaWNoIGlzIHRoZSBvcmRpbmFyeSBjYXNlIGZvciBhIHJhbmdlIG9mIGBmaXhgZXMgYW5kIGBjaG9yZWBzLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2luZ0NvbW1pdHM6IHJlYWRvbmx5IEZvcmNpbmdDb21taXRbXTtcblxuICAvKipcbiAgICogVGhlIGxvd2VzdCB7QGxpbmsgQnVtcExldmVsfSB0aGUgcmFuZ2UgbWF5IHNoaXAgYXMuXG4gICAqL1xuICByZWFkb25seSBsZXZlbDogQnVtcExldmVsO1xufVxuXG4vKipcbiAqIFdoYXQge0BsaW5rIHRvQnVtcEZsb29yRXJyb3J9IG5lZWRzIGJleW9uZCB0aGUge0BsaW5rIEJ1bXBGbG9vcn0gaXRzZWxmIHRvIHNheSB3aGF0IHdhcyBhc2tlZCBmb3IgYW5kIHdoYXRcbiAqIHRoYXQgd291bGQgaGF2ZSBzaGlwcGVkIGFzLlxuICovXG5pbnRlcmZhY2UgQnVtcEZsb29yUmVmdXNhbENvbnRleHQge1xuICAvKipcbiAgICogVGhlIHByZXZpb3VzIHJlbGVhc2UgdGFnIHRoZSByYW5nZSB3YXMgbWVhc3VyZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGxhc3RUYWc6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gdGhlIHJlcXVlc3RlZCBidW1wIHdvdWxkIGhhdmUgcHJvZHVjZWQuXG4gICAqL1xuICByZWFkb25seSBuZXdWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB7QGxpbmsgQnVtcExldmVsfSB7QGxpbmsgbmV3VmVyc2lvbn0gYWN0dWFsbHkgbW92ZXMsIHJlbGF0aXZlIHRvIHtAbGluayBsYXN0VGFnfS5cbiAgICovXG4gIHJlYWRvbmx5IHRha2VuTGV2ZWw6IEJ1bXBMZXZlbDtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgdGhlIHJlbGVhc2Ugd2FzIGFza2VkIGZvciwgdmVyYmF0aW0g4oCUIHdoaWNoIGlzIGEgcHJlLXJlbGVhc2UgdHlwZSBvciBhbiBleHBsaWNpdFxuICAgKiB2ZXJzaW9uIGFzIG9mdGVuIGFzIGl0IGlzIGEgcGxhaW4gYHBhdGNoYCwgYW5kIGlzIHRoZXJlZm9yZSB3b3J0aCBxdW90aW5nIGJhY2sgcmF0aGVyIHRoYW4gaW5mZXJyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgdGhyZWUgcmVsZWFzZSBsaW5lcyBhIGJ1bXAgY2FuIG1vdmUsIG9yZGVyZWQgYnkge0BsaW5rIGlzQnVtcExldmVsQXRMZWFzdH0uXG4gKlxuICogQSBwcmUtcmVsZWFzZSB0eXBlIGlzIG5vdCBvbmUgb2YgdGhlc2U6IGBwcmVtYWpvcmAgbW92ZXMgdGhlIG1ham9yIGxpbmUgYW5kIGBwcmVyZWxlYXNlYCBtb3ZlcyB3aGljaGV2ZXJcbiAqIGxpbmUgYW4gZWFybGllciBwcmUtcmVsZWFzZSBhbHJlYWR5IGNob3NlLCBzbyB3aGF0IGEgcHJlLXJlbGVhc2UgZGlkIGlzIHJlYWQgb2ZmIHRoZSByZXN1bHRpbmcgdmVyc2lvblxuICogcmF0aGVyIHRoYW4gb2ZmIGl0cyB0eXBlLiBTZWUge0BsaW5rIHRvRWZmZWN0aXZlQnVtcExldmVsfS5cbiAqL1xudHlwZSBCdW1wTGV2ZWwgPSBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvciB8IFZlcnNpb25VcGRhdGVUeXBlLk1pbm9yIHwgVmVyc2lvblVwZGF0ZVR5cGUuUGF0Y2g7XG5cbi8qKlxuICogT25lIGZpbmRpbmcgcmVwb3J0ZWQgb3ZlciB0aGUgc2V0dGxlZCBjaGFuZ2Vsb2cgc2VjdGlvbiwgdGFnZ2VkIHdpdGggdGhlIG5wbSBzY3JpcHQgd2hvc2UgY2hlY2sgcHJvZHVjZWQgaXQuXG4gKlxuICogVGhlIHRhZyBpcyB3aGF0IGxldHMgb25lIG1lc3NhZ2UgbmFtZSBgbGludDptZGAsIGBzcGVsbGNoZWNrYCBvciBib3RoLCB0cnV0aGZ1bGx5LiBCb3RoIGNoZWNrcyBydW4gb3ZlclxuICogZXZlcnkgc2V0dGxlLCBzbyBhbiBhdXRob3Igd2hvIGhhcyB0byBmaXggYSBoYXJkLXdyYXBwZWQgbGluZSBhbmQgYSBjb2luZWQgd29yZCBmaXhlcyB0aGVtIGluIE9ORSByb3VuZCBvZlxuICogdGhlIHJldmlldyByYXRoZXIgdGhhbiBiZWluZyBzZW50IGJhY2sgdHdpY2UuXG4gKi9cbmludGVyZmFjZSBDaGFuZ2Vsb2dGaW5kaW5nIHtcbiAgLyoqXG4gICAqIFRoZSBucG0gc2NyaXB0IHRoYXQgd291bGQgaGF2ZSByZXBvcnRlZCB0aGlzIG9uIHRoZSBicmFuY2guXG4gICAqL1xuICByZWFkb25seSBzY3JpcHROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXBvcnRlZCBsaW5lLCBleGFjdGx5IGFzIHRoYXQgc2NyaXB0J3Mgb3duIG91dHB1dCB3b3VsZCBoYXZlIGNhcnJpZWQgaXQuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIGNvbW1pdCB0aGF0IGZvcmNlcyBhIHtAbGluayBCdW1wRmxvb3J9LCByZW5kZXJlZCBpbnRvIHRoZSByZWZ1c2FsIHNvIHRoZSBhdXRob3IgY2FuIGdvIGFuZCBsb29rIGF0IGl0LlxuICovXG5pbnRlcmZhY2UgRm9yY2luZ0NvbW1pdCB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIEJ1bXBMZXZlbH0gdGhpcyBvbmUgY29tbWl0IGZvcmNlcyBvbiBpdHMgb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgbGV2ZWw6IEJ1bXBMZXZlbDtcblxuICAvKipcbiAgICogV2hhdCBpbiB0aGUgY29tbWl0IGZvcmNlZCBpdCDigJQgdGhlIGAhYCBtYXJrZXIsIHRoZSBgQlJFQUtJTkcgQ0hBTkdFOmAgZm9vdGVyLCBvciB0aGUgYGZlYXRgIHR5cGUg4oCUIG5hbWVkXG4gICAqIHNvIGEgcmVhZGVyIGNhbiB0ZWxsIGEgZGVsaWJlcmF0ZSBicmVha2luZyBtYXJrZXIgZnJvbSBhIGZvb3RlciBzb21lYm9keSB3cm90ZSBpbiBwYXNzaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2VyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxsIGNvbW1pdCBoYXNoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21taXQgc3ViamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE5wbVBhY2tSZXN1bHQge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgYEJSRUFLSU5HIENIQU5HRTpgIGZvb3RlciwgaW4gYm90aCBzcGVsbGluZ3MgQ29udmVudGlvbmFsIENvbW1pdHMgYWxsb3dzLlxuICpcbiAqIE1hdGNoZWQgcGVyIGxpbmUgKGBtYCkgcmF0aGVyIHRoYW4gYWdhaW5zdCB0aGUgd2hvbGUgbWVzc2FnZSwgYmVjYXVzZSBhIGZvb3RlciBzaXRzIGF0IHRoZSBib3R0b20gb2YgdGhlXG4gKiBib2R5LiBJdCBpcyB0aGUgaGFsZiBvZiB0aGUgYnJlYWtpbmctY2hhbmdlIHNpZ25hbCB0aGF0IHtAbGluayBNRVJHRV9TVUJKRUNUX1JFR19FWFB9J3Mgc2libGluZyByZXdyaXRlXG4gKiBjYW5ub3QgY2Fycnk6IGB0b0NoYW5nZWxvZ0VudHJ5YCBsaWZ0cyBvbmx5IHRoZSBtZXJnZSBib2R5J3MgZmlyc3QgbGluZSBvbnRvIHRoZSBtZXJnZSBzdWJqZWN0LCBzbyBhIGZvb3RlclxuICogd3JpdHRlbiBvbiBhIGJyYW5jaCBjb21taXQgbmV2ZXIgcmVhY2hlcyB0aGUgZmlyc3QtcGFyZW50IGhpc3RvcnkgYXQgYWxsLiBUaGF0IGlzIHdoeVxuICoge0BsaW5rIGdldEJ1bXBGbG9vcn0gcmVhZHMgZXZlcnkgY29tbWl0IGluIHRoZSByYW5nZSByYXRoZXIgdGhhbiBvbmx5IHRoZSBmaXJzdC1wYXJlbnQgb25lcy5cbiAqL1xuY29uc3QgQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9SRUdfRVhQID0gL15CUkVBS0lOR1sgLV1DSEFOR0U6L207XG5cbi8qKlxuICogVGhlIG1hcmtlciBuYW1lcyBhIHtAbGluayBGb3JjaW5nQ29tbWl0fSBjYXJyaWVzLCBhbmQgdGhlcmVmb3JlIHdoYXQgdGhlIHJlZnVzYWwgbWVzc2FnZSBzYXlzIGZvcmNlZCB0aGVcbiAqIGZsb29yLiBUaGV5IGFyZSBzcGVsbGVkIG91dCByYXRoZXIgdGhhbiByZWR1Y2VkIHRvIHRoZSBsZXZlbCBhbG9uZSwgYmVjYXVzZSBgZmVhdCFgIGFuZCBhIGBCUkVBS0lORyBDSEFOR0U6YFxuICogZm9vdGVyIGJ1cmllZCBpbiBhIGJvZHkgYXJlIHZlcnkgZGlmZmVyZW50IHRoaW5ncyB0byBiZSB0b2xkIGFib3V0LlxuICovXG5jb25zdCBCUkVBS0lOR19DSEFOR0VfRk9PVEVSX01BUktFUiA9ICdhIGBCUkVBS0lORyBDSEFOR0U6YCBmb290ZXInO1xuXG4vKipcbiAqIFNlZSB7QGxpbmsgQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9NQVJLRVJ9LlxuICovXG5jb25zdCBCUkVBS0lOR19NQVJLRVIgPSAndGhlIGAhYCBicmVha2luZyBtYXJrZXInO1xuXG4vKipcbiAqIFNlZSB7QGxpbmsgQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9NQVJLRVJ9LlxuICovXG5jb25zdCBGRUFUX1RZUEVfTUFSS0VSID0gJ2EgYGZlYXRgIHR5cGUnO1xuXG4vKipcbiAqIEEgQ29udmVudGlvbmFsLUNvbW1pdHMgc3ViamVjdDogYSB0eXBlLCBhbiBvcHRpb25hbCBzY29wZSwgYW4gb3B0aW9uYWwgYCFgLCB0aGVuIHRoZSBjb2xvbi5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgdG9sZXJhbnQgb2YgYSBzdWJqZWN0IHRoYXQgaXMgbm90IG9uZSBhdCBhbGwg4oCUIGFuIHVucGFyc2FibGUgc3ViamVjdCBzaW1wbHkgY29uc3RyYWluc1xuICogbm90aGluZywgd2hpY2ggaXMgdGhlIHNhbWUgYW5zd2VyIGEgYGNob3JlOmAgZ2l2ZXMuIFRoaXMgZ2F0ZSBleGlzdHMgdG8gY2F0Y2ggYSBidW1wIHRoYXQgaXMgdG9vIExPVywgc29cbiAqIGZhaWxpbmcgdG8gcmVjb2duaXplIGEgc3ViamVjdCBjYW4gb25seSB1bmRlci1jb25zdHJhaW4sIG5ldmVyIHJlZnVzZSBhIHJlbGVhc2UgdGhhdCBzaG91bGQgaGF2ZSBzaGlwcGVkLlxuICovXG5jb25zdCBDT05WRU5USU9OQUxfQ09NTUlUX1NVQkpFQ1RfUkVHX0VYUCA9IC9eKD88dHlwZT5bYS16XSspKD86XFwoW14oKV0qXFwpKT8oPzxicmVha2luZz4hKT86XFxzL2k7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcHJlLXJlbGVhc2UgaWRlbnRpZmllciB1c2VkIGZvciBwcmUtcmVsZWFzZSB2ZXJzaW9ucy5cbiAqL1xuY29uc3QgREVGQVVMVF9QUkVJRCA9ICdiZXRhJztcblxuLyoqXG4gKiBUaGUgQ29udmVudGlvbmFsLUNvbW1pdHMgdHlwZSB0aGF0IGZvcmNlcyBhIG1pbm9yLlxuICovXG5jb25zdCBGRUFUX1RZUEUgPSAnZmVhdCc7XG5cbi8qKlxuICogT25lIGlzc3VlIHJlZmVyZW5jZSBpbnNpZGUgYW4ge0BsaW5rIElTU1VFX1JFRkVSRU5DRV9MSU5FX1JFR19FWFB9IGxpbmU6IGFuIGlzc3VlIG9yIHB1bGwgcmVxdWVzdCBVUkwsIGFuXG4gKiBgb3duZXIvcmVwbyNuYCwgb3IgYSBiYXJlIGAjbmAuXG4gKi9cbmNvbnN0IElTU1VFX1JFRkVSRU5DRV9SRUdfRVhQID0gL2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyg/PHVybFNsdWc+W1xcdy4tXStcXC9bXFx3Li1dKylcXC8oPzppc3N1ZXN8cHVsbClcXC8oPzx1cmxOdW1iZXI+XFxkKyl8KD88IVtcXHcuLy1dKSg/PHNsdWc+W1xcdy4tXStcXC9bXFx3Li1dKykjKD88c2x1Z051bWJlcj5cXGQrKVxcYnwoPzwhW1xcdy8mIy4tXSkjKD88YmFyZU51bWJlcj5cXGQrKVxcYi9nO1xuXG4vKipcbiAqIEEgY29tbWl0IGJvZHkgbGluZSB0aGF0IG5hbWVzIHRoZSBpc3N1ZXMgdGhlIGNvbW1pdCB3b3JrcyBvbjogYFJlZnMgb3duZXIvcmVwbyMxMmAsIGBGaXhlcyAjM2AsXG4gKiBgQ2xvc2VzIGh0dHBzOi8vZ2l0aHViLmNvbS9vd25lci9yZXBvL2lzc3Vlcy80LCAjNWAuIFRoZSBrZXl3b3JkIGlzIGZvbGxvd2VkIGJ5IHJlZmVyZW5jZXMgYW5kIG5vdGhpbmcgZWxzZVxuICogKHNlZSB7QGxpbmsgcGFyc2VJc3N1ZVJlZmVyZW5jZUxpbmV9KSwgc28gYSBwcm9zZSBsaW5lIHRoYXQgbWVyZWx5IG9wZW5zIHdpdGggYEZpeGVzYCBuYW1lcyBub3RoaW5nLlxuICpcbiAqIEEgZml4IG1hZGUgaW4gb25lIHJlcG9zaXRvcnkgZm9yIGFuIGlzc3VlIGluIGFub3RoZXIgY2xvc2VzIG5vdGhpbmcgaGVyZSwgYW5kIGl0cyBjb21taXQgc3ViamVjdCBjYW5ub3QgY2FycnlcbiAqIHRoZSBvdGhlciByZXBvc2l0b3J5J3MgbnVtYmVyLCBzbyB0aGlzIGxpbmUgaXMgdGhlIG9ubHkgcGxhY2UgdGhlIHJlbGVhc2UgY2FuIGxlYXJuIHdoaWNoIGlzc3VlIGl0IGZpeGVzLlxuICovXG5jb25zdCBJU1NVRV9SRUZFUkVOQ0VfTElORV9SRUdfRVhQID0gL14oPzpyZWZzP3xyZXxmaXgoPzplW3NkXSk/fGNsb3NlW3NkXT98cmVzb2x2ZVtzZF0/fGltcGxlbWVudHM/KTo/XFxzKyg/PHJlZmVyZW5jZXM+LispJC9pO1xuXG4vKipcbiAqIFRoZSBucG0gc2NyaXB0cyB3aG9zZSBjaGVja3MgdGhlIHNldHRsZWQgY2hhbmdlbG9nIGlzIGhlbGQgdG8sIG5hbWVkIGluIHRoZSBtZXNzYWdlcyBzbyBhIHJlYWRlciBrbm93cyB3aGljaFxuICogZ2F0ZSB0aGV5IGFyZSBsb29raW5nIGF0IOKAlCBhbmQga25vd3MgdGhhdCBmaXhpbmcgaXQgaGVyZSBpcyB0aGUgc2FtZSBmaXggYXMgZml4aW5nIGl0IG9uIHRoZSBicmFuY2guXG4gKi9cbmNvbnN0IExJTlRfTURfU0NSSVBUX05BTUUgPSAnbGludDptZCc7XG5cbi8qKlxuICogSG93IG11Y2ggb2YgYSBjb21taXQgaGFzaCB0aGUgYnVtcC1mbG9vciByZWZ1c2FsIHByaW50cy4gTG9uZyBlbm91Z2ggdG8gcGFzdGUgaW50byBgZ2l0IHNob3dgLCBzaG9ydCBlbm91Z2hcbiAqIHRoYXQgYSBsaXN0IG9mIHRoZW0gc3RheXMgcmVhZGFibGUuXG4gKi9cbmNvbnN0IFNIT1JUX1NIQV9MRU5HVEggPSA4O1xuXG4vKipcbiAqIFNlZSB7QGxpbmsgTElOVF9NRF9TQ1JJUFRfTkFNRX0uXG4gKi9cbmNvbnN0IFNQRUxMQ0hFQ0tfU0NSSVBUX05BTUUgPSAnc3BlbGxjaGVjayc7XG5cbi8qKlxuICogVGhlIHNoYXBlIG9mIGEgbWVyZ2Ugc3ViamVjdCBnaXQgd3JvdGUgaXRzZWxmLCByYXRoZXIgdGhhbiBvbmUgYW4gYXV0aG9yIGNob3NlLlxuICpcbiAqIEV2ZXJ5IGRlZmF1bHQgZ2l0IHByb2R1Y2VzIG9wZW5zIHdpdGggYE1lcmdlYCBhbmQgYSB3b3JkIGJvdW5kYXJ5IOKAlCBgTWVyZ2UgYnJhbmNoICd4J2AsXG4gKiBgTWVyZ2UgYnJhbmNoZXMgJ3gnIGFuZCAneSdgLCBgTWVyZ2UgcmVtb3RlLXRyYWNraW5nIGJyYW5jaCAneCdgLCBgTWVyZ2UgcHVsbCByZXF1ZXN0ICMxIGZyb20geWAsXG4gKiBgTWVyZ2UgdGFnICd4J2AsIGBNZXJnZSBjb21taXQgJ2FiYydgIOKAlCB3aGljaCBpcyB3aGF0IHRoZSBvcHRpb25hbCBhbHRlcm5hdGlvbiBhbmQgdGhlIHRyYWlsaW5nIGBcXGJgIGNvdmVyXG4gKiBiZXR3ZWVuIHRoZW0uIEJlaW5nIHRoYXQgYnJvYWQgY29zdHMgbm90aGluZyBoZXJlOiBldmVyeSBjaGFuZ2Vsb2cgZW50cnkgaW4gdGhpcyB3b3Jrc3BhY2UgaXMgYVxuICogQ29udmVudGlvbmFsLUNvbW1pdHMgc3ViamVjdCwgYW5kIHRob3NlIG9wZW4gd2l0aCBhIHR5cGUgKGBmZWF0YCwgYGZpeGAsIGBjaG9yZWAsIOKApiksIG5ldmVyIHdpdGggYE1lcmdlYC5cbiAqXG4gKiBPTkUgcGF0dGVybiBkcml2ZXMgYm90aCBoYWx2ZXMgb2YgdGhlIGd1YXJkLCBzbyB0aGV5IGNhbm5vdCBkcmlmdCBhcGFydDoge0BsaW5rIHRvQ2hhbmdlbG9nRW50cnl9IHJld3JpdGVzXG4gKiBhIGNvbW1pdCB3aG9zZSBzdWJqZWN0IG1hdGNoZXMgaXQsIGFuZCB7QGxpbmsgYXNzZXJ0Q2hhbmdlbG9nSGFzTm9NZXJnZVN1YmplY3RzfSByZWZ1c2VzIGEgY2hhbmdlbG9nIGxpbmVcbiAqIHRoYXQgc3RpbGwgZG9lcy4gVGhlIHJlZnVzYWwgaXMgdGhlcmVmb3JlIHJlYWNoYWJsZSBvbmx5IGZvciBhIG1lcmdlIHRoZSByZXdyaXRlIGhhZCBub3RoaW5nIHRvIHdvcmsgd2l0aC5cbiAqL1xuY29uc3QgTUVSR0VfU1VCSkVDVF9SRUdfRVhQID0gL15NZXJnZSg/OiBicmFuY2h8IHJlbW90ZS10cmFja2luZ3wgcHVsbCByZXF1ZXN0KT9cXGIvO1xuXG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIGRpZmZlcmVudCB0eXBlcyBvZiB2ZXJzaW9uIHVwZGF0ZXMuXG4gKlxuICogQWxpZ25zIHdpdGggbnBtJ3MgYG5wbSB2ZXJzaW9uYCBpbmNyZW1lbnQgdHlwZXMgcGx1cyBgTWFudWFsYCBmb3IgZXhwbGljaXQgdmVyc2lvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIFZlcnNpb25VcGRhdGVUeXBlIHtcbiAgSW52YWxpZCA9ICdpbnZhbGlkJyxcbiAgTWFqb3IgPSAnbWFqb3InLFxuICBNYW51YWwgPSAnbWFudWFsJyxcbiAgTWlub3IgPSAnbWlub3InLFxuICBQYXRjaCA9ICdwYXRjaCcsXG4gIFByZU1ham9yID0gJ3ByZW1ham9yJyxcbiAgUHJlTWlub3IgPSAncHJlbWlub3InLFxuICBQcmVQYXRjaCA9ICdwcmVwYXRjaCcsXG4gIFByZVJlbGVhc2UgPSAncHJlcmVsZWFzZSdcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiB1cGRhdGUgdHlwZXMgYSBjYWxsZXIgbmFtZXMgZGlyZWN0bHksIGtleWVkIGJ5IHRoZWlyIG5hbWUsIGFzIG9wcG9zZWQgdG8gdGhlIHR3byBgZ2V0VmVyc2lvblVwZGF0ZVR5cGVgIGRlcml2ZXMuXG4gKi9cbmNvbnN0IE5BTUVEX1ZFUlNJT05fVVBEQVRFX1RZUEVTID0gbmV3IE1hcDxzdHJpbmcsIFZlcnNpb25VcGRhdGVUeXBlPihbXG4gIFZlcnNpb25VcGRhdGVUeXBlLk1ham9yLFxuICBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vcixcbiAgVmVyc2lvblVwZGF0ZVR5cGUuUGF0Y2gsXG4gIFZlcnNpb25VcGRhdGVUeXBlLlByZU1ham9yLFxuICBWZXJzaW9uVXBkYXRlVHlwZS5QcmVNaW5vcixcbiAgVmVyc2lvblVwZGF0ZVR5cGUuUHJlUGF0Y2gsXG4gIFZlcnNpb25VcGRhdGVUeXBlLlByZVJlbGVhc2Vcbl0ubWFwKCh0eXBlKSA9PiBbdHlwZSwgdHlwZV0pKTtcblxuLyoqXG4gKiBXaGVyZSBgSEVBRGAgc3Rvb2Qgd2hlbiBhIHJlbGVhc2Ugc3RhcnRlZDogdGhlIGJyYW5jaCBpdCBpcyBvbiAoZW1wdHkgZm9yIGEgZGV0YWNoZWQgYEhFQURgKSBhbmQgaXRzIGNvbW1pdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRIZWFkU3RhdGUge1xuICAvKipcbiAgICogVGhlIGNoZWNrZWQtb3V0IGJyYW5jaCwgb3IgYW4gZW1wdHkgc3RyaW5nIGZvciBhIGRldGFjaGVkIGBIRUFEYC5cbiAgICovXG4gIHJlYWRvbmx5IGJyYW5jaDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IGBIRUFEYCBwb2ludHMgYXQuXG4gICAqL1xuICByZWFkb25seSBzaGE6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgR2l0IHRhZyBmb3IgdGhlIG5ldyB2ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0byB1c2UgZm9yIHRoZSB0YWcuXG4gKiBAcGFyYW0gY29tbWl0U2hhIC0gVGhlIGNvbW1pdCB0byB0YWcuIFdoZW4gb21pdHRlZCwgYEhFQURgIGlzIHRhZ2dlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdGFnIGhhcyBiZWVuIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRHaXRUYWcobmV3VmVyc2lvbjogc3RyaW5nLCBjb21taXRTaGE/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXhlY0Zyb21Sb290KGBnaXQgdGFnIC1hICR7bmV3VmVyc2lvbn0gLW0gJHtuZXdWZXJzaW9ufSAtLWZvcmNlJHtjb21taXRTaGEgPyBgICR7Y29tbWl0U2hhfWAgOiAnJ31gLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG59XG5cbi8qKlxuICogQWRkcyB1cGRhdGVkIGZpbGVzIHRvIHRoZSBHaXQgc3RhZ2luZyBhcmVhIGFuZCBjb21taXRzIHRoZW0gd2l0aCB0aGUgbmV3IHZlcnNpb24gbWVzc2FnZS5cbiAqXG4gKiBJZiB0aGUgY29tbWl0IGZhaWxzIChmb3IgZXhhbXBsZSwgdGhlIHByZS1jb21taXQgaG9vayByZWplY3RzIGEgbmV3IHdvcmQgaW4gdGhlIGNoYW5nZWxvZykgYW5kIHRoZVxuICogcHJvY2VzcyBpcyBhdHRhY2hlZCB0byBhbiBpbnRlcmFjdGl2ZSB0ZXJtaW5hbCwgdGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gZml4IHRoZSBpc3N1ZSAoZm9yIGV4YW1wbGUsXG4gKiBhZGQgdGhlIG1pc3Npbmcgd29yZCB0byBgY3NwZWxsLmpzb25gKSBhbmQgcHJlc3MgRW50ZXIgdG8gcmV0cnkuIFRoZSByZXRyeSByZS1zdGFnZXMgYWxsIGZpbGVzLCBzbyB0aGVcbiAqIGZpeCBpcyBwaWNrZWQgdXAgd2l0aG91dCByZXN0YXJ0aW5nIHRoZSB3aG9sZSByZWxlYXNlIGxpZmVjeWNsZS4gSW4gYSBub24taW50ZXJhY3RpdmUgZW52aXJvbm1lbnQgKG5vXG4gKiBUVFksIHN1Y2ggYXMgQ0kpLCB0aGUgZXJyb3IgaXMgcmUtdGhyb3duIGluc3RlYWQgb2YgcHJvbXB0aW5nLCBzbyB0aGUgc2NyaXB0IGZhaWxzIGZhc3QgcmF0aGVyIHRoYW5cbiAqIGhhbmdpbmcuIFBhc3MgYHNob3VsZFZlcmlmeUNvbW1pdDogZmFsc2VgIHRvIHNraXAgdGhlIHByZS1jb21taXQgaG9vayBlbnRpcmVseSBpbiBzdWNoIGNhc2VzLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB1c2VkIGFzIHRoZSBjb21taXQgbWVzc2FnZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBBZGRVcGRhdGVkRmlsZXNUb0dpdE9wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSBjb21taXQgYmVoYXZpb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZpbGVzIGhhdmUgYmVlbiBhZGRlZCBhbmQgY29tbWl0dGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkVXBkYXRlZEZpbGVzVG9HaXQobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBBZGRVcGRhdGVkRmlsZXNUb0dpdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHNob3VsZFZlcmlmeUNvbW1pdCA9IHRydWUgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHZlcnNpb25EZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdWZXJzaW9uJyk7XG5cbiAgY29uc3QgY29tbWl0QXJndW1lbnRzID0gWydnaXQnLCAnY29tbWl0JywgJy1tJywgYGNob3JlOiByZWxlYXNlICR7bmV3VmVyc2lvbn1gLCAnLS1hbGxvdy1lbXB0eScsIC4uLihzaG91bGRWZXJpZnlDb21taXQgPyBbXSA6IFsnLS1uby12ZXJpZnknXSldO1xuXG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ2FkZCcsICctLWFsbCddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgICBhd2FpdCBleGVjRnJvbVJvb3QoY29tbWl0QXJndW1lbnRzLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgdmVyc2lvbkRlYnVnZ2VyKFxuICAgICAgICBgRmFpbGVkIHRvIGNvbW1pdCB0aGUgcmVsZWFzZS5cXG4ke2Vycm9yVG9TdHJpbmcoZXJyb3IpfVxcbmBcbiAgICAgICAgICArICdGaXggdGhlIGlzc3VlcyAoZm9yIGV4YW1wbGUsIGFkZCB0aGUgbWlzc2luZyB3b3JkIHRvIGNzcGVsbC5qc29uKSBhbmQgcHJlc3MgRW50ZXIgdG8gcmV0cnkgdGhlIGNvbW1pdCwgb3IgQ3RybCtDIHRvIGFib3J0LidcbiAgICAgICk7XG4gICAgICBhd2FpdCBjcmVhdGVJbnRlcmZhY2UocHJvY2Vzcy5zdGRpbiwgcHJvY2Vzcy5zdGRvdXQpLnF1ZXN0aW9uKCdQcmVzcyBFbnRlciB0byByZXRyeSB0aGUgY29tbWl0Li4uJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIEdpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydEdpdEh1YkNsaUluc3RhbGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjRnJvbVJvb3QoJ2doIC0tdmVyc2lvbicsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuIFBsZWFzZSBpbnN0YWxsIGl0IGZyb20gaHR0cHM6Ly9jbGkuZ2l0aHViLmNvbS8nKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBHaXQgaXMgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uXG4gKlxuICogVGhyb3dzIGFuIGVycm9yIGlmIEdpdCBpcyBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEB0aHJvd3MgRXJyb3IgaWYgR2l0IGlzIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRHaXRJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgLS12ZXJzaW9uJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdCBpcyBub3QgaW5zdGFsbGVkLiBQbGVhc2UgaW5zdGFsbCBpdCBmcm9tIGh0dHBzOi8vZ2l0LXNjbS5jb20vJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIGNsZWFuLCBtZWFuaW5nIHRoZXJlIGFyZSBubyB1bmNvbW1pdHRlZCBjaGFuZ2VzLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLlxuICpcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydEdpdFJlcG9DbGVhbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCBzdGF0dXMgLS1wb3JjZWxhaW4gLS11bnRyYWNrZWQtZmlsZXM9YWxsJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIGlmIChzdGRvdXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uIFBsZWFzZSBjb21taXQgb3Igc3Rhc2ggeW91ciBjaGFuZ2VzIGJlZm9yZSByZWxlYXNpbmcgYSBuZXcgdmVyc2lvbi4nKTtcbiAgfVxufVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgSEVBRGAgaXMgdGhlIHJlbGVhc2UgY29tbWl0OiBvbiB0aGUgYnJhbmNoIHRoZSByZWxlYXNlIHN0YXJ0ZWQgb24sIGEgc2luZ2xlIGNvbW1pdCBvbiB0b3Agb2YgdGhlXG4gKiBjb21taXQgaXQgc3RhcnRlZCBmcm9tLCB3aXRoIHRoZSBgY2hvcmU6IHJlbGVhc2UgPHZlcnNpb24+YCBzdWJqZWN0LlxuICpcbiAqIEEgc3VjY2Vzc2Z1bCBgZ2l0IGNvbW1pdGAgcHJvdmVzIG9ubHkgdGhhdCBhIGNvbW1pdCB3YXMgbWFkZSBzb21ld2hlcmUuIEEgY2hlY2tvdXQgc3dpdGNoZWQgdW5kZXJuZWF0aCBhXG4gKiByZWxlYXNlIGJ5IGFub3RoZXIgcHJvY2VzcyB0YWtlcyB0aGUgY29tbWl0IG9udG8gdGhhdCBvdGhlciBicmFuY2gsIGFuZCB3aGVuIGl0IGlzIHN3aXRjaGVkIGJhY2sgdGhlIHRhZyBhbmRcbiAqIHRoZSBHaXRIdWIgcmVsZWFzZSBnbyBvdXQgb24gdGhlIGNvbW1pdCBiZWZvcmUgdGhlIGJ1bXAsIHdpdGggdGhlIGJ1bXAgbGVmdCBzdGFnZWQgaW4gdGhlIHdvcmtpbmcgdHJlZSBhbmQgbm90aGluZ1xuICogcmVwb3J0ZWQuIFNvIHRoZSByZWxlYXNlIGNoZWNrcyB3aGVyZSB0aGUgY29tbWl0IGxhbmRlZCBiZWZvcmUgdGFnZ2luZywgYW5kIGFnYWluIGJlZm9yZSBwdXNoaW5nLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIHZlcnNpb24gYmVpbmcgcmVsZWFzZWQuXG4gKiBAcGFyYW0gc3RhcnRIZWFkIC0gV2hlcmUgYEhFQURgIHN0b29kIHdoZW4gdGhlIHJlbGVhc2Ugc3RhcnRlZC5cbiAqIEBwYXJhbSBzdGFnZSAtIFRoZSBzdGVwIGFib3V0IHRvIHJ1biwgZm9yIHRoZSBlcnJvciBtZXNzYWdlIChmb3IgZXhhbXBsZSBgdGFnZ2luZ2ApLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmVsZWFzZSBjb21taXQncyBTSEEuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRSZWxlYXNlQ29tbWl0TGFuZGVkKG5ld1ZlcnNpb246IHN0cmluZywgc3RhcnRIZWFkOiBHaXRIZWFkU3RhdGUsIHN0YWdlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBleHBlY3RlZFN1YmplY3QgPSBgY2hvcmU6IHJlbGVhc2UgJHtuZXdWZXJzaW9ufWA7XG4gIGNvbnN0IGJyYW5jaCA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdicmFuY2gnLCAnLS1zaG93LWN1cnJlbnQnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICBjb25zdCBoZWFkTG9nRmllbGRDb3VudCA9IDM7XG4gIGNvbnN0IGhlYWRMb2cgPSBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAnbG9nJywgJy0xJywgJy0tZm9ybWF0PSVIJW4lUCVuJXMnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICBjb25zdCBbc2hhID0gJycsIHBhcmVudHMgPSAnJywgc3ViamVjdCA9ICcnXSA9IGhlYWRMb2cuc3BsaXQoJ1xcbicsIGhlYWRMb2dGaWVsZENvdW50KTtcblxuICBpZiAoYnJhbmNoID09PSBzdGFydEhlYWQuYnJhbmNoICYmIHBhcmVudHMgPT09IHN0YXJ0SGVhZC5zaGEgJiYgc3ViamVjdCA9PT0gZXhwZWN0ZWRTdWJqZWN0KSB7XG4gICAgcmV0dXJuIHNoYTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgUmVmdXNpbmcgdG8gY29udGludWUgYmVmb3JlICR7c3RhZ2V9OiB0aGUgcmVsZWFzZSBjb21taXQgZm9yICR7bmV3VmVyc2lvbn0gaXMgbm90IHdoZXJlIGl0IHNob3VsZCBiZS4gYFxuICAgICAgKyBgVGhlIHJlbGVhc2Ugc3RhcnRlZCBvbiAke2Rlc2NyaWJlQnJhbmNoKHN0YXJ0SGVhZC5icmFuY2gpfSBhdCAke3N0YXJ0SGVhZC5zaGF9IGFuZCBleHBlY3RzIGEgJyR7ZXhwZWN0ZWRTdWJqZWN0fScgY29tbWl0IG9uIHRvcCBvZiBpdCwgYFxuICAgICAgKyBgYnV0IEhFQUQgaXMgJHtzaGF9ICgnJHtzdWJqZWN0fScsIHBhcmVudCAke3BhcmVudHMgfHwgJ25vbmUnfSkgb24gJHtkZXNjcmliZUJyYW5jaChicmFuY2gpfS4gYFxuICAgICAgKyAnU29tZXRoaW5nIGVsc2UgbW92ZWQgSEVBRCBpbiB0aGlzIHdvcmtpbmcgdHJlZSB3aGlsZSB0aGUgcmVsZWFzZSByYW4gKGEgY29uY3VycmVudCBjaGVja291dCwgcmVzZXQgb3IgY29tbWl0KS4gJ1xuICAgICAgKyAnQ2hlY2sgYGdpdCByZWZsb2dgIHRvIGZpbmQgdGhlIHJlbGVhc2UgY29tbWl0LCBwdXQgaXQgb24gdGhlIHJlbGVhc2UgYnJhbmNoLCBhbmQgdGFnIGFuZCBwdXNoIGl0IGJ5IGhhbmQuJ1xuICApO1xufVxuXG4vKipcbiAqIFdyYXBzIGFueSBiYXJlIGBodHRwKHMpOi8vYCBVUkwgaW4gdGhlIGdpdmVuIHRleHQgaW4gYW5nbGUgYnJhY2tldHMgKGA8dXJsPmApIHNvIHRoYXQgdGV4dCBlbWl0dGVkXG4gKiBpbnRvIGEgTWFya2Rvd24gZG9jdW1lbnQgKHN1Y2ggYXMgYSBnZW5lcmF0ZWQgY2hhbmdlbG9nIGJ1bGxldCkgcGFzc2VzIG1hcmtkb3dubGludCdzXG4gKiBgTUQwMzQvbm8tYmFyZS11cmxzYCBydWxlIHdoaWxlIHN0aWxsIHJlbmRlcmluZyBhcyBhIGNsaWNrYWJsZSBhdXRvbGluayBvbiBHaXRIdWIuXG4gKlxuICogVVJMcyB0aGF0IGFyZSBhbHJlYWR5IHdyYXBwZWQgaW4gYW5nbGUgYnJhY2tldHMgKGA8dXJsPmApIG9yIHRoYXQgZm9ybSB0aGUgdGFyZ2V0IG9mIGEgTWFya2Rvd25cbiAqIGxpbmsgKGBbdGV4dF0odXJsKWApIGFyZSBsZWZ0IHVudG91Y2hlZCwgc28gdGhlIGZ1bmN0aW9uIGlzIHNhZmUgdG8gcnVuIHJlcGVhdGVkbHkuIFRyYWlsaW5nXG4gKiBzZW50ZW5jZSBwdW5jdHVhdGlvbiAoYC5gLCBgLGAsIGA7YCwgYDpgLCBgIWAsIGA/YCkgaXMga2VwdCBvdXRzaWRlIHRoZSBhbmdsZSBicmFja2V0cyBzbyBpdCBkb2VzXG4gKiBub3QgYmVjb21lIHBhcnQgb2YgdGhlIGxpbmsuXG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCBwb3NzaWJseSBjb250YWluaW5nIGJhcmUgVVJMcy5cbiAqIEByZXR1cm5zIFRoZSB0ZXh0IHdpdGggZXZlcnkgYmFyZSBVUkwgd3JhcHBlZCBpbiBhbmdsZSBicmFja2V0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF1dG9saW5rQmFyZVVybHModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvKD88IVs8WyhdKWh0dHBzPzpcXC9cXC9bXlxcczw+KVxcXV0rL2csICh1cmwpID0+IHtcbiAgICBjb25zdCB0cmFpbGluZ1B1bmN0dWF0aW9uID0gL1suLDs6IT9dKyQvLmV4ZWModXJsKT8uWzBdID8/ICcnO1xuICAgIGNvbnN0IGJhcmVVcmwgPSB1cmwuc2xpY2UoMCwgdXJsLmxlbmd0aCAtIHRyYWlsaW5nUHVuY3R1YXRpb24ubGVuZ3RoKTtcbiAgICByZXR1cm4gYDwke2JhcmVVcmx9PiR7dHJhaWxpbmdQdW5jdHVhdGlvbn1gO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBuZXcgdmVyc2lvbiBzdHJpbmcgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmVyc2lvbiBhbmQgdGhlIHNwZWNpZmllZCB1cGRhdGUgdHlwZS5cbiAqXG4gKiBVc2VzIHRoZSBgc2VtdmVyYCBwYWNrYWdlIHRvIGNvbXB1dGUgdGhlIG5leHQgdmVyc2lvbiwgc3VwcG9ydGluZyBhbGwgbnBtIGluY3JlbWVudCB0eXBlczpcbiAqIGBtYWpvcmAsIGBtaW5vcmAsIGBwYXRjaGAsIGBwcmVtYWpvcmAsIGBwcmVtaW5vcmAsIGBwcmVwYXRjaGAsIGFuZCBgcHJlcmVsZWFzZWAuXG4gKiBQcmUtcmVsZWFzZSB2ZXJzaW9ucyB1c2UgdGhlIGBiZXRhYCBpZGVudGlmaWVyIGJ5IGRlZmF1bHQgKGUuZy4sIGAxLjIuNC1iZXRhLjBgKS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSBvciBhbiBleHBsaWNpdCB2ZXJzaW9uIHN0cmluZy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyB2ZXJzaW9uIHN0cmluZy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBpbnZhbGlkIG9yIHRoZSBpbmNyZW1lbnQgZmFpbHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROZXdWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB2ZXJzaW9uVHlwZSA9IGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgaWYgKHZlcnNpb25UeXBlID09PSBWZXJzaW9uVXBkYXRlVHlwZS5NYW51YWwpIHtcbiAgICByZXR1cm4gdmVyc2lvblVwZGF0ZVR5cGU7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbigpO1xuICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHBhY2thZ2VKc29uLnZlcnNpb24gPz8gJyc7XG5cbiAgY29uc3QgcmVsZWFzZVR5cGUgPSB2ZXJzaW9uVHlwZSBhcyBSZWxlYXNlVHlwZTtcbiAgY29uc3QgaXNQcmVSZWxlYXNlVHlwZSA9IHJlbGVhc2VUeXBlLnN0YXJ0c1dpdGgoJ3ByZScpO1xuICBjb25zdCBuZXdWZXJzaW9uID0gaXNQcmVSZWxlYXNlVHlwZVxuICAgID8gaW5jKGN1cnJlbnRWZXJzaW9uLCByZWxlYXNlVHlwZSwgREVGQVVMVF9QUkVJRClcbiAgICA6IGluYyhjdXJyZW50VmVyc2lvbiwgcmVsZWFzZVR5cGUpO1xuICBhc3NlcnROb25OdWxsYWJsZShuZXdWZXJzaW9uLCBgRmFpbGVkIHRvIGluY3JlbWVudCB2ZXJzaW9uIGZyb20gJyR7Y3VycmVudFZlcnNpb259JyB3aXRoIHR5cGUgJyR7dmVyc2lvblR5cGV9J2ApO1xuXG4gIHJldHVybiBuZXdWZXJzaW9uO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgcmVsZWFzZSBub3RlcyBmb3IgYSBzcGVjaWZpYyB2ZXJzaW9uIGZyb20gdGhlIGNoYW5nZWxvZy5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgZm9yIHdoaWNoIHRvIGdldCB0aGUgcmVsZWFzZSBub3Rlcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIHRoZSBzcGVjaWZpZWQgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlbGVhc2VOb3RlcyhuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjaGFuZ2Vsb2dQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBSZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShjaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgY29uc3Qgc2VjdGlvbiA9IGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNvbnRlbnQsIG5ld1ZlcnNpb24pO1xuICBsZXQgcmVsZWFzZU5vdGVzID0gc2VjdGlvbiA/IGAke3NlY3Rpb259XFxuXFxuYCA6ICcnO1xuXG4gIGNvbnN0IHRhZ091dHB1dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHRhZyAtLXNvcnQ9LWNyZWF0b3JkYXRlJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICBjb25zdCB0YWdzID0gdGFnT3V0cHV0LnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IHRhZ3NbMV07XG5cbiAgY29uc3QgcmVwb1VybCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2ggcmVwbyB2aWV3IC0tanNvbiB1cmwgLXEgLnVybCcsIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICBjb25zdCBjaGFuZ2VzVXJsID0gcHJldmlvdXNWZXJzaW9uID8gYCR7cmVwb1VybH0vY29tcGFyZS8ke3ByZXZpb3VzVmVyc2lvbn0uLi4ke25ld1ZlcnNpb259YCA6IGAke3JlcG9Vcmx9L2NvbW1pdHMvJHtuZXdWZXJzaW9ufWA7XG5cbiAgcmVsZWFzZU5vdGVzICs9IGAqKkZ1bGwgQ2hhbmdlbG9nKio6ICR7Y2hhbmdlc1VybH1gO1xuICByZXR1cm4gcmVsZWFzZU5vdGVzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgYmFzZWQgb24gdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgaW5wdXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIGBWZXJzaW9uVXBkYXRlVHlwZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogVmVyc2lvblVwZGF0ZVR5cGUge1xuICBjb25zdCBuYW1lZFZlcnNpb25VcGRhdGVUeXBlID0gTkFNRURfVkVSU0lPTl9VUERBVEVfVFlQRVMuZ2V0KHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgaWYgKG5hbWVkVmVyc2lvblVwZGF0ZVR5cGUpIHtcbiAgICByZXR1cm4gbmFtZWRWZXJzaW9uVXBkYXRlVHlwZTtcbiAgfVxuXG4gIHJldHVybiAvXlxcZCtcXC5cXGQrXFwuXFxkKyg/Oi1bXFx3XFxkLi1dKyk/JC8udGVzdCh2ZXJzaW9uVXBkYXRlVHlwZSkgPyBWZXJzaW9uVXBkYXRlVHlwZS5NYW51YWwgOiBWZXJzaW9uVXBkYXRlVHlwZS5JbnZhbGlkO1xufVxuXG4vKipcbiAqIFB1c2hlcyBjb21taXRzIGFuZCB0YWdzIHRvIHRoZSByZW1vdGUgR2l0IHJlcG9zaXRvcnkuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwdXNoIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdpdFB1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHB1c2ggLS1mb2xsb3ctdGFncyAtLWZvcmNlJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIFJlYWRzIHdoZXJlIGBIRUFEYCBzdGFuZHMgbm93LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGN1cnJlbnQge0BsaW5rIEdpdEhlYWRTdGF0ZX0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkR2l0SGVhZFN0YXRlKCk6IFByb21pc2U8R2l0SGVhZFN0YXRlPiB7XG4gIGNvbnN0IGJyYW5jaCA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdicmFuY2gnLCAnLS1zaG93LWN1cnJlbnQnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICBjb25zdCBzaGEgPSBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAncmV2LXBhcnNlJywgJ0hFQUQnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICByZXR1cm4geyBicmFuY2gsIHNoYSB9O1xufVxuXG4vKipcbiAqIFRoZSBmbGFncyB7QGxpbmsgcGFyc2VWZXJzaW9uQXJndW1lbnRzfSByZWNvZ25pemVzLCBpbiB0aGUgc2hhcGUgTm9kZSdzIGBwYXJzZUFyZ3NgIHRha2VzLiBFeHBvcnRlZCBzbyBhIHdyYXBwZXJcbiAqIHRoYXQgYWRkcyBmbGFncyBvZiBpdHMgb3duIGNhbiBwYXJzZSB0aGVtIGFsbCBpbiBvbmUgcGFzcyBhbmQgc3RpbGwgcmVhZCB0aGVzZSB0aHJvdWdoXG4gKiB7QGxpbmsgdG9VcGRhdGVWZXJzaW9uT3B0aW9uc30uXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OX0FSR1VNRU5UX09QVElPTlMgPSB7XG4gICdjaGFuZ2Vsb2ctZmlsZSc6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgJ25vLWJ1aWxkJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgJ25vLWNoYW5nZWxvZy1lZGl0aW5nJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgJ25vLWNoZWNrcyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICduby1jb21taXQtdmVyaWZpY2F0aW9uJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgJ25vLWlzc3VlLWNsb3NpbmcnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8tcmVsZWFzZSc6IHsgdHlwZTogJ2Jvb2xlYW4nIH1cbn0gYXMgY29uc3Qgc2F0aXNmaWVzIE5vbk51bGxhYmxlPFBhcnNlQXJnc0NvbmZpZ1snb3B0aW9ucyddPjtcblxuLyoqXG4gKiBUaGUgdmFsdWVzIGBwYXJzZUFyZ3NgIHJlcG9ydHMgZm9yIHtAbGluayBWRVJTSU9OX0FSR1VNRU5UX09QVElPTlN9LlxuICovXG5leHBvcnQgdHlwZSBWZXJzaW9uQXJndW1lbnRWYWx1ZXMgPSBSZXR1cm5UeXBlPHR5cGVvZiBwYXJzZUFyZ3M8VmVyc2lvbkFyZ3VtZW50UGFyc2VDb25maWc+PlsndmFsdWVzJ107XG5cbi8qKlxuICogT25lIGlzc3VlIHJlZmVyZW5jZSBhIGNvbW1pdCBib2R5IG5hbWVzLCBhcyB7QGxpbmsgcGFyc2VJc3N1ZVJlZmVyZW5jZUxpbmV9IHJlYWRzIGl0LlxuICovXG5pbnRlcmZhY2UgSXNzdWVSZWZlcmVuY2Uge1xuICAvKipcbiAgICogSG93IHRoZSBjaGFuZ2Vsb2cgbGluZSBzaG93cyBpdDogYCNuYCBmb3IgYSBiYXJlIG51bWJlciwgdGhlIGlzc3VlIFVSTCBpbiBhbmdsZSBicmFja2V0cyBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSByZW5kZXJlZDogc3RyaW5nO1xuICAvKipcbiAgICogRXZlcnkgd2F5IGEgbGluZSB0aGF0IGFscmVhZHkgc2hvd3MgaXQgbWF5IHNwZWxsIGl0OiBgI25gLCBvciBgb3duZXIvcmVwbyNuYCBhbmQgdGhlIGlzc3VlIFVSTC5cbiAgICovXG4gIHJlYWRvbmx5IHNwZWxsaW5nczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIGBwYXJzZUFyZ3NgIGNvbmZpZ3VyYXRpb24ge0BsaW5rIFZlcnNpb25Bcmd1bWVudFZhbHVlc30gaXMgZGVyaXZlZCBmcm9tLlxuICovXG5pbnRlcmZhY2UgVmVyc2lvbkFyZ3VtZW50UGFyc2VDb25maWcge1xuICAvKipcbiAgICogVGhlIHJlY29nbml6ZWQgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiB0eXBlb2YgVkVSU0lPTl9BUkdVTUVOVF9PUFRJT05TO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSB2ZXJzaW9uIGlzIGEgcHJlLXJlbGVhc2UsIHN1Y2ggYXMgYDEuMi40LWJldGEuMGAuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFdoZXRoZXIgaXQgY2FycmllcyBhIHByZS1yZWxlYXNlIHBhcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ByZVJlbGVhc2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcmVyZWxlYXNlKHZlcnNpb24pICE9PSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgYSB2ZXJzaW9uIHVwZGF0ZSBpbnRvIGEgdmVyc2lvbiB1cGRhdGUgdHlwZSBhbmRcbiAqIHtAbGluayBVcGRhdGVWZXJzaW9uT3B0aW9uc30uXG4gKlxuICogRWFjaCBiZWhhdmlvciBpcyBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRoZSBjb3JyZXNwb25kaW5nIGAtLW5vLSpgIGZsYWcgdHVybnMgaXQgb2ZmLiBgLS1jaGFuZ2Vsb2ctZmlsZWAgdGFrZXMgYVxuICogdmFsdWUgaW5zdGVhZCBhbmQgaGFzIG5vIGRlZmF1bHQuIFJlY29nbml6ZWQgZmxhZ3M6XG4gKiAtIGAtLWNoYW5nZWxvZy1maWxlPTxwYXRoPmAg4oCUIHVzZSB0aGlzIGZpbGUncyBjb250ZW50cyBhcyB0aGUgbmV3IHZlcnNpb24ncyBjaGFuZ2Vsb2cgc2VjdGlvbiBpbnN0ZWFkIG9mXG4gKiAgIHRoZSBjb21taXQtZGVyaXZlZCBidWxsZXRzLCBhbmQgc2tpcCB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3IGVudGlyZWx5LlxuICogLSBgLS1uby1idWlsZGAg4oCUIHNraXAgdGhlIGJ1aWxkIHN0ZXAgKG9ubHkgc2FmZSB3aGVuIHRoZSBidWlsZCBvdXRwdXQgYWxyZWFkeSBtYXRjaGVzIHRoZSBjdXJyZW50IGNvZGUpLlxuICogLSBgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2Ag4oCUIGdlbmVyYXRlIHRoZSBjaGFuZ2Vsb2cgd2l0aG91dCBvcGVuaW5nIGl0IGZvciBtYW51YWwgcmV2aWV3LlxuICogLSBgLS1uby1jaGVja3NgIOKAlCBza2lwIHRoZSBjbGVhbi1yZXBvIGNoZWNrLCBmb3JtYXQsIHNwZWxsY2hlY2ssIGxpbnQsIG92ZXItZXhwb3N1cmUgYW5hbHlzaXMsIGFuZCB0ZXN0cyAodGhlIGJ1aWxkIHN0aWxsIHJ1bnMpLlxuICogLSBgLS1uby1jb21taXQtdmVyaWZpY2F0aW9uYCDigJQgcGFzcyBgLS1uby12ZXJpZnlgIHRvIHRoZSByZWxlYXNlIGNvbW1pdCwgc2tpcHBpbmcgdGhlIHByZS1jb21taXQgaG9vay5cbiAqIC0gYC0tbm8taXNzdWUtY2xvc2luZ2Ag4oCUIGRvIG5vdCBjbG9zZSB0aGUgaXNzdWVzIHRoZSByZWxlYXNlIGNhcnJpZXMgb25jZSBpdCBpcyBwdWJsaXNoZWQuXG4gKiAtIGAtLW5vLXJlbGVhc2VgIOKAlCBydW4gYWxsIGxvY2FsIHN0ZXBzIGJ1dCBza2lwIHRoZSBwdXNoIGFuZCB0aGUgR2l0SHViIHJlbGVhc2UuXG4gKlxuICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0byBwYXJzZSAodHlwaWNhbGx5IGBwcm9jZXNzLmFyZ3Yuc2xpY2UoMilgKS5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGFyc2VkVmVyc2lvbkFyZ3VtZW50c30gY29udGFpbmluZyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSBhbmQgdGhlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZlcnNpb25Bcmd1bWVudHMoJGFyZ3VtZW50czogc3RyaW5nW10pOiBQYXJzZWRWZXJzaW9uQXJndW1lbnRzIHtcbiAgY29uc3QgeyBwb3NpdGlvbmFscywgdmFsdWVzIH0gPSBwYXJzZUFyZ3Moe1xuICAgIGFsbG93UG9zaXRpb25hbHM6IHRydWUsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGFyZ3NgIGlzIHRoZSBvcHRpb24gbmFtZSBOb2RlJ3MgYHBhcnNlQXJnc2AgcmVhZHMuXG4gICAgYXJnczogJGFyZ3VtZW50cyxcbiAgICBvcHRpb25zOiBWRVJTSU9OX0FSR1VNRU5UX09QVElPTlNcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBvcHRpb25zOiB0b1VwZGF0ZVZlcnNpb25PcHRpb25zKHZhbHVlcyksXG4gICAgdmVyc2lvblVwZGF0ZVR5cGU6IHBvc2l0aW9uYWxzWzBdXG4gIH07XG59XG4vKipcbiAqIFB1Ymxpc2hlcyBhIEdpdEh1YiByZWxlYXNlIGZvciB0aGUgbmV3IHZlcnNpb24uXG4gKlxuICogQ3JlYXRlcyB0aGUgcmVsZWFzZSBhbmQgYXR0YWNoZXMgdGhlIGZpbGVzIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuZ2V0UmVsZWFzZUFzc2V0UGF0aHN9IG5hbWVzLlxuICpcbiAqIE9uY2UgdGhlIHJlbGVhc2UgZXhpc3RzLCB0aGUgaXNzdWVzIGl0IGNhcnJpZXMgYXJlIGNsb3NlZCB3aXRoIGEgbGluayB0byBpdCAoc2VlIHtAbGluayBjbG9zZVJlbGVhc2VkSXNzdWVzfSksXG4gKiB1bmxlc3Mge0BsaW5rIFB1Ymxpc2hHaXRIdWJSZWxlYXNlT3B0aW9ucy5zaG91bGRDbG9zZVJlbGVhc2VkSXNzdWVzfSBpcyBgZmFsc2VgLiBBIGZhaWx1cmUgdGhlcmUgaXMgcmVwb3J0ZWQgYW5kXG4gKiBkb2VzIG5vdCBmYWlsIHRoZSByZWxlYXNlLCB3aGljaCBpcyBhbHJlYWR5IHB1Ymxpc2hlZC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSByZWxlYXNlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFB1Ymxpc2hHaXRIdWJSZWxlYXNlT3B0aW9uc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHJlbGVhc2UgaGFzIGJlZW4gcHVibGlzaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaEdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGdldFJlbGVhc2VBc3NldFBhdGhzID0gZ2V0TnBtUGFja1JlbGVhc2VBc3NldFBhdGhzLCBzaG91bGRDbG9zZVJlbGVhc2VkSXNzdWVzID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgbGV0IGZpbGVQYXRocyA9IGF3YWl0IGdldFJlbGVhc2VBc3NldFBhdGhzKCk7XG4gIGZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoKGZpbGVQYXRoKSA9PiBleGlzdHNTeW5jKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogZmlsZVBhdGggfSkpKTtcblxuICBhd2FpdCBleGVjRnJvbVJvb3QoW1xuICAgICdnaCcsXG4gICAgJ3JlbGVhc2UnLFxuICAgICdjcmVhdGUnLFxuICAgIG5ld1ZlcnNpb24sXG4gICAgLi4uZmlsZVBhdGhzLFxuICAgICctLXRpdGxlJyxcbiAgICBgdiR7bmV3VmVyc2lvbn1gLFxuICAgIC4uLihpc1ByZVJlbGVhc2UobmV3VmVyc2lvbikgPyBbJy0tcHJlcmVsZWFzZSddIDogW10pLFxuICAgICctLW5vdGVzLWZpbGUnLFxuICAgICctJ1xuICBdLCB7XG4gICAgaXNRdWlldDogdHJ1ZSxcbiAgICBzdGRpbjogYXdhaXQgZ2V0UmVsZWFzZU5vdGVzKG5ld1ZlcnNpb24pXG4gIH0pO1xuXG4gIGlmICghc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgY2xvc2VSZWxlYXNlZElzc3Vlcyh7IG5ld1ZlcnNpb24gfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBUaGUgJHtuZXdWZXJzaW9ufSByZWxlYXNlIGlzIHB1Ymxpc2hlZCwgYnV0IGNsb3NpbmcgdGhlIGlzc3VlcyBpdCBjYXJyaWVzIGZhaWxlZDogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIE1hcHMgdGhlIHZhbHVlcyBgcGFyc2VBcmdzYCByZXBvcnRzIGZvciB7QGxpbmsgVkVSU0lPTl9BUkdVTUVOVF9PUFRJT05TfSBvbnRvIHtAbGluayBVcGRhdGVWZXJzaW9uT3B0aW9uc30uXG4gKlxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSBwYXJzZWQgdmFsdWVzLlxuICogQHJldHVybnMgVGhlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1VwZGF0ZVZlcnNpb25PcHRpb25zKHZhbHVlczogVmVyc2lvbkFyZ3VtZW50VmFsdWVzKTogVXBkYXRlVmVyc2lvbk9wdGlvbnMge1xuICByZXR1cm4ge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoOiB2YWx1ZXNbJ2NoYW5nZWxvZy1maWxlJ10sXG4gICAgc2hvdWxkQnVpbGQ6ICEodmFsdWVzWyduby1idWlsZCddID8/IGZhbHNlKSxcbiAgICBzaG91bGRDbG9zZVJlbGVhc2VkSXNzdWVzOiAhKHZhbHVlc1snbm8taXNzdWUtY2xvc2luZyddID8/IGZhbHNlKSxcbiAgICBzaG91bGRFZGl0Q2hhbmdlbG9nOiAhKHZhbHVlc1snbm8tY2hhbmdlbG9nLWVkaXRpbmcnXSA/PyBmYWxzZSksXG4gICAgc2hvdWxkUmVsZWFzZTogISh2YWx1ZXNbJ25vLXJlbGVhc2UnXSA/PyBmYWxzZSksXG4gICAgc2hvdWxkUnVuQ2hlY2tzOiAhKHZhbHVlc1snbm8tY2hlY2tzJ10gPz8gZmFsc2UpLFxuICAgIHNob3VsZFZlcmlmeUNvbW1pdDogISh2YWx1ZXNbJ25vLWNvbW1pdC12ZXJpZmljYXRpb24nXSA/PyBmYWxzZSlcbiAgfTtcbn1cbi8qKlxuICogVXBkYXRlcyB0aGUgY2hhbmdlbG9nIGZpbGUgd2l0aCBuZXcgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgY29tbWl0IG1lc3NhZ2VzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGN1cnJlbnQgY2hhbmdlbG9nLCBhcHBlbmRzIG5ldyBlbnRyaWVzIGZvciB0aGUgbGF0ZXN0IHZlcnNpb24sXG4gKiBhbmQgcHJvbXB0cyB0aGUgdXNlciB0byByZXZpZXcgdGhlIGNoYW5nZXMuXG4gKlxuICogVGhlIHJldmlldyBoYXBwZW5zIG9uIGEgc2NyYXRjaCBjb3B5IGluIHRoZSBPUyB0ZW1wb3JhcnkgZm9sZGVyLCBhbmQgdGhlIHJlcG9zaXRvcnkncyBvd25cbiAqIGBDSEFOR0VMT0cubWRgIGlzIHdyaXR0ZW4gb25seSBvbmNlIHRoZSByZXZpZXcgaXMgb3ZlciDigJQgc28gaW50ZXJydXB0aW5nIHRoZSByZXZpZXcgbGVhdmVzIHRoZVxuICogcmVwb3NpdG9yeSB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIGJlIGFkZGVkIHRvIHRoZSBjaGFuZ2Vsb2cuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlQ2hhbmdlbG9nT3B0aW9uc30gY29udHJvbGxpbmcgdGhlIGNoYW5nZWxvZyByZXZpZXcgYmVoYXZpb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoYW5nZWxvZyB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVDaGFuZ2Vsb2cobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgd3JpdGVDaGFuZ2Vsb2coYXdhaXQgcHJlcGFyZUNoYW5nZWxvZyhuZXdWZXJzaW9uLCBvcHRpb25zKSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHVwZGF0ZSB0eXBlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBzZXJpZXMgb2YgdGFza3MgdG8gaGFuZGxlIHZlcnNpb24gdXBkYXRlczpcbiAqIDEuIFZhbGlkYXRlcyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZS5cbiAqIDIuIENoZWNrcyBpZiBHaXQgYW5kIEdpdEh1YiBDTEkgYXJlIGluc3RhbGxlZC5cbiAqIDMuIFZlcmlmaWVzIHRoYXQgdGhlIGludGVyYWN0aXZlIGNoYW5nZWxvZyByZXZpZXcsIGlmIG9uZSBpcyBkdWUsIGNhbiBhY3R1YWxseSBiZSBhbnN3ZXJlZC5cbiAqIDQuIFZlcmlmaWVzIHRoYXQgdGhlIGJ1bXAgaXMgbm90IGxvd2VyIHRoYW4gdGhlIGNvbW1pdHMgc2luY2UgdGhlIGxhc3QgdGFnIGZvcmNlIGl0IHRvIGJlLlxuICogNS4gVmVyaWZpZXMgdGhhdCB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgY2xlYW4uXG4gKiA2LiBSdW5zIHNwZWxsY2hlY2sgYW5kIGxpbnRpbmcuXG4gKiA3LiBCdWlsZHMgdGhlIHByb2plY3QuXG4gKiA4LiBTZXR0bGVzIHRoZSBjaGFuZ2Vsb2cg4oCUIHRoZSBvbmx5IHN0ZXAgdGhhdCBjYW4gYmxvY2sgb24gYSBodW1hbiwgYW5kIGRlbGliZXJhdGVseSB0aGUgbGFzdCBvbmUgYmVmb3JlXG4gKiAgICBhbnl0aGluZyBpcyB3cml0dGVuLCBzbyBhbiBpbnRlcnJ1cHQgaGVyZSBsZWF2ZXMgdGhlIHdvcmtpbmcgdHJlZSBjbGVhbiBhbmQgdGhlIHJlbGVhc2UgcmUtcnVubmFibGUuXG4gKiAgICBUaGUgc2V0dGxlZCB0ZXh0IGlzIGxpbnRlZCBoZXJlIHRvbzogYGxpbnQ6bWRgIHJhbiBpbiBzdGVwIDYsIGJlZm9yZSBhIGNoYXJhY3RlciBvZiBpdCBleGlzdGVkLlxuICogOS4gVXBkYXRlcyB2ZXJzaW9uIGluIGZpbGVzIChhbmQgaW4gd2hhdGV2ZXIge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zLnVwZGF0ZVZlcnNpb25JbkV4dHJhRmlsZXN9IGFkZHMpLCB0aGVuXG4gKiAgICB3cml0ZXMgdGhlIHNldHRsZWQgY2hhbmdlbG9nLlxuICogMTAuIEFkZHMgdXBkYXRlZCBmaWxlcyB0byBHaXQsIHRhZ3MgdGhlIGNvbW1pdCwgYW5kIHB1c2hlcyB0byB0aGUgcmVwb3NpdG9yeS5cbiAqIDExLiBQcmVwYXJlcyBhbmQgcHVibGlzaGVzIGEgR2l0SHViIHJlbGVhc2UuXG4gKiAxMi4gQ2xvc2VzIHRoZSBpc3N1ZXMgdGhlIHJlbGVhc2UgY2Fycmllcywgd2l0aCBhIGxpbmsgdG8gaXQuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgdG8gcGVyZm9ybSAobWFqb3IsIG1pbm9yLCBwYXRjaCwgcHJlbWFqb3IsIHByZW1pbm9yLCBwcmVwYXRjaCwgcHJlcmVsZWFzZSwgb3IgeC55LnpbLXN1ZmZpeF0pLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBjb250cm9sbGluZyB0aGUgcmVsZWFzZSBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdmVyc2lvbiB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlPzogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBjaGFuZ2Vsb2dGaWxlUGF0aCxcbiAgICBnZXRSZWxlYXNlQXNzZXRQYXRocyxcbiAgICBwcmVwYXJlR2l0SHViUmVsZWFzZSxcbiAgICBzaG91bGRCdWlsZCA9IHRydWUsXG4gICAgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3VlcyA9IHRydWUsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZyA9IHRydWUsXG4gICAgc2hvdWxkUmVsZWFzZSA9IHRydWUsXG4gICAgc2hvdWxkUnVuQ2hlY2tzID0gdHJ1ZSxcbiAgICBzaG91bGRWZXJpZnlDb21taXQgPSB0cnVlLFxuICAgIHVwZGF0ZVZlcnNpb25JbkV4dHJhRmlsZXNcbiAgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKCF2ZXJzaW9uVXBkYXRlVHlwZSkge1xuICAgIGNvbnN0IG5wbU9sZFZlcnNpb24gPSBwcm9jZXNzLmVudlsnbnBtX29sZF92ZXJzaW9uJ107XG4gICAgY29uc3QgbnBtTmV3VmVyc2lvbiA9IHByb2Nlc3MuZW52WyducG1fbmV3X3ZlcnNpb24nXTtcblxuICAgIGlmIChucG1PbGRWZXJzaW9uICYmIG5wbU5ld1ZlcnNpb24pIHtcbiAgICAgIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkZpbGVzKG5wbU9sZFZlcnNpb24pO1xuICAgICAgYXdhaXQgdXBkYXRlVmVyc2lvbihucG1OZXdWZXJzaW9uLCBvcHRpb25zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHZlcnNpb24gdXBkYXRlIHR5cGUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIHZhbGlkYXRlKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgYXdhaXQgYXNzZXJ0R2l0SW5zdGFsbGVkKCk7XG4gIGF3YWl0IGFzc2VydEdpdEh1YkNsaUluc3RhbGxlZCgpO1xuICAvLyBDaGVja2VkIGhlcmUsIGJlZm9yZSB0aGUgY2hlY2tzIGFuZCB0aGUgYnVpbGQsIHJhdGhlciB0aGFuIGF0IHRoZSBjaGFuZ2Vsb2cgc3RlcCBpdHNlbGY6IGEgbm9uLWludGVyYWN0aXZlXG4gIC8vIGNhbGxlciBsZWFybnMgaW4gc2Vjb25kcyBpbnN0ZWFkIG9mIHBheWluZyBmb3IgdGhlIHdob2xlIHByZWZsaWdodCBhbmQgb25seSB0aGVuIGJsb2NraW5nIG9uIGFuIGVkaXRvclxuICAvLyB3aW5kb3cgbm9ib2R5IHdpbGwgZXZlciBjbG9zZS5cbiAgYXNzZXJ0Q2hhbmdlbG9nU3RlcElzTm9uQmxvY2tpbmcoY2hhbmdlbG9nRmlsZVBhdGgsIHNob3VsZEVkaXRDaGFuZ2Vsb2cpO1xuICAvLyBTYW1lIHBsYWNlbWVudCwgc2FtZSByZWFzb24uIERlbGliZXJhdGVseSBOT1QgdW5kZXIgYHNob3VsZFJ1bkNoZWNrc2A6IHRoYXQgZmxhZyBidXlzIGEgZmFzdCByZWxlYXNlIGJ5XG4gIC8vIHNraXBwaW5nIHRoZSBWRVJJRklDQVRJT04gb2YgdGhlIGNvZGUsIGFuZCB0aGlzIGlzIGEgY29ycmVjdG5lc3MgZ2F0ZSBvbiB0aGUgcmVsZWFzZSBpdHNlbGYg4oCUIHRoZSBidW1wXG4gIC8vIGEgYC0tbm8tY2hlY2tzYCByZWxlYXNlIHNoaXBzIGlzIGFzIHB1YmxpYywgYW5kIGFzIHVuZml4YWJsZSBhZnRlcndhcmRzLCBhcyBhbnkgb3RoZXIuXG4gIGF3YWl0IGFzc2VydFZlcnNpb25VcGRhdGVUeXBlTWVldHNCdW1wRmxvb3IodmVyc2lvblVwZGF0ZVR5cGUpO1xuICAvLyBTYW1lIHBsYWNlbWVudCwgc2FtZSByZWFzb246IGEgY2hhbmdlbG9nIHNlY3Rpb24gbm9ib2R5IHdpbGwgcmV2aWV3IGlzIGZ1bGx5IGtub3duIGJlZm9yZSB0aGUgZ2F0ZSwgYW5kIGEgc3ViamVjdCBpdFxuICAvLyBmYWlscyBvbiBpcyBhbHJlYWR5IHB1c2hlZCwgc28gbGVhcm5pbmcgdGhhdCBhZnRlciB0aGUgcHJlZmxpZ2h0IG9ubHkgY29zdHMgdGhlIHByZWZsaWdodC5cbiAgYXdhaXQgYXNzZXJ0Tm9uSW50ZXJhY3RpdmVDaGFuZ2Vsb2dJc1B1Ymxpc2hhYmxlKHZlcnNpb25VcGRhdGVUeXBlLCBjaGFuZ2Vsb2dGaWxlUGF0aCwgc2hvdWxkRWRpdENoYW5nZWxvZyk7XG5cbiAgaWYgKHNob3VsZFJ1bkNoZWNrcykge1xuICAgIGF3YWl0IGFzc2VydEdpdFJlcG9DbGVhbigpO1xuICB9XG5cbiAgLy8gUmVhZCBiZWZvcmUgdGhlIGdhdGUsIHNvIGEgY2hlY2tvdXQgc3dpdGNoZWQgYXQgYW55IHBvaW50IG9mIHRoZSByZWxlYXNlIGlzIGNhdWdodCBhZnRlciB0aGUgY29tbWl0LlxuICBjb25zdCBzdGFydEhlYWQgPSBhd2FpdCByZWFkR2l0SGVhZFN0YXRlKCk7XG5cbiAgLy8gVGhlIHJlc3Qgb2YgdGhlIHByZWZsaWdodCBJUyBgbnBtIHJ1biBnYXRlYCwgbm90IGEgY29weSBvZiBpdDogYSBjaGVjayBhZGRlZCB0byB0aGUgZ2F0ZSBpcyByZWFjaGFibGVcbiAgLy8gZnJvbSB0aGUgYnJhbmNoIGFuZCBmcm9tIHRoZSByZWxlYXNlIGJ5IGNvbnN0cnVjdGlvbiwgaW5zdGVhZCBvZiBieSB0d28gbGlzdHMgaGFwcGVuaW5nIHRvIGFncmVlLlxuICAvLyBUaGUgY2xlYW4tcmVwbyBhc3NlcnRpb24gYWJvdmUgc3RheXMgaGVyZSwgYmVjYXVzZSB0aGUgZ2F0ZSBpcyBydW4gb24gYSBkaXJ0eSB0cmVlIG9uIHB1cnBvc2UuXG4gIC8vIFRoZSBidWlsZCBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgcHVibGlzaGluZywgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLCBzbyBpdCBydW5zIHVubGVzcyBgc2hvdWxkQnVpbGRgIGlzIGBmYWxzZWAg4oCUIHRoaXMga2VlcHMgdGhlIHJlbGVhc2VkIGFydGlmYWN0cyBpbiBzeW5jIHdpdGggdGhlIGN1cnJlbnQgY29kZSBldmVuIG9uIGEgZmFzdCByZWxlYXNlLlxuICBhd2FpdCBnYXRlKHtcbiAgICBzaG91bGRCdWlsZCxcbiAgICBzaG91bGRSdW5DaGVja3MsXG4gICAgc2hvdWxkUnVuSW50ZWdyYXRpb25UZXN0czogdHJ1ZVxuICB9KTtcblxuICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZSk7XG5cbiAgLy8gVGhlIGNoYW5nZWxvZyBpcyBzZXR0bGVkIEJFRk9SRSBhbnl0aGluZyBpcyB3cml0dGVuLCBiZWNhdXNlIHRoaXMgaXMgdGhlIG9ubHkgc3RlcCB0aGF0IGNhbiBibG9jayBvbiBhXG4gIC8vIGh1bWFuLiBJbnRlcnJ1cHRpbmcgaXQgdGhlcmVmb3JlIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIHByaXN0aW5lIGFuZCB0aGUgd2hvbGUgcmVsZWFzZSByZS1ydW5uYWJsZSxcbiAgLy8gaW5zdGVhZCBvZiBzdHJhbmRpbmcgYSBidW1wZWQtYnV0LXVuY29tbWl0dGVkIHRyZWUgdGhhdCBgYXNzZXJ0R2l0UmVwb0NsZWFuYCB0aGVuIHJlZnVzZXMgdG8gcmUtcmVsZWFzZS5cbiAgY29uc3QgbmV3Q2hhbmdlTG9nID0gYXdhaXQgcHJlcGFyZUNoYW5nZWxvZyhuZXdWZXJzaW9uLCB7XG4gICAgY2hhbmdlbG9nRmlsZVBhdGgsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZ1xuICB9KTtcblxuICBhd2FpdCB1cGRhdGVWZXJzaW9uSW5GaWxlcyhuZXdWZXJzaW9uKTtcbiAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRXh0cmFGaWxlcz8uKG5ld1ZlcnNpb24pO1xuXG4gIGF3YWl0IHdyaXRlQ2hhbmdlbG9nKG5ld0NoYW5nZUxvZyk7XG4gIGF3YWl0IGFkZFVwZGF0ZWRGaWxlc1RvR2l0KG5ld1ZlcnNpb24sIHsgc2hvdWxkVmVyaWZ5Q29tbWl0IH0pO1xuICAvLyBUaGUgdGFnIG5hbWVzIHRoZSB2ZXJpZmllZCBjb21taXQgcmF0aGVyIHRoYW4gd2hhdGV2ZXIgYEhFQURgIGlzIGJ5IHRoZSB0aW1lIGBnaXQgdGFnYCBydW5zLlxuICBjb25zdCByZWxlYXNlQ29tbWl0U2hhID0gYXdhaXQgYXNzZXJ0UmVsZWFzZUNvbW1pdExhbmRlZChuZXdWZXJzaW9uLCBzdGFydEhlYWQsICd0YWdnaW5nJyk7XG4gIGF3YWl0IGFkZEdpdFRhZyhuZXdWZXJzaW9uLCByZWxlYXNlQ29tbWl0U2hhKTtcblxuICBpZiAoIXNob3VsZFJlbGVhc2UpIHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpKCdTa2lwcGluZyBnaXQgcHVzaCBhbmQgR2l0SHViIHJlbGVhc2UgKC0tbm8tcmVsZWFzZSkuIFRoZSB2ZXJzaW9uIGJ1bXAsIGNoYW5nZWxvZywgY29tbWl0LCBhbmQgdGFnIGhhdmUgYmVlbiBjcmVhdGVkIGxvY2FsbHkuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgYXNzZXJ0UmVsZWFzZUNvbW1pdExhbmRlZChuZXdWZXJzaW9uLCBzdGFydEhlYWQsICdwdXNoaW5nJyk7XG4gIGF3YWl0IGdpdFB1c2goKTtcbiAgYXdhaXQgcHJlcGFyZUdpdEh1YlJlbGVhc2U/LihuZXdWZXJzaW9uKTtcbiAgYXdhaXQgcHVibGlzaEdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbiwgeyBnZXRSZWxlYXNlQXNzZXRQYXRocywgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3VlcyB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB2ZXJzaW9uIGluIGBwYWNrYWdlLmpzb25gIGFuZCwgd2hlcmUgdGhleSBleGlzdCwgYHBhY2thZ2UtbG9jay5qc29uYCBhbmQgYG5wbS1zaHJpbmt3cmFwLmpzb25gLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIHN0cmluZyB0byB1cGRhdGUgaW4gdGhlIGZpbGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uSW5GaWxlcyhuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZWRpdFBhY2thZ2VKc29uKChwYWNrYWdlSnNvbikgPT4ge1xuICAgIHBhY2thZ2VKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICB9KTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUxvY2tKc29uKHVwZGF0ZSwgeyBzaG91bGRTa2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xuICBhd2FpdCBlZGl0TnBtU2hyaW5rV3JhcEpzb24odXBkYXRlLCB7IHNob3VsZFNraXBJZk1pc3Npbmc6IHRydWUgfSk7XG5cbiAgZnVuY3Rpb24gdXBkYXRlKHBhY2thZ2VMb2NrSnNvbjogUGFja2FnZUxvY2tKc29uKTogdm9pZCB7XG4gICAgcGFja2FnZUxvY2tKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgIGNvbnN0IGRlZmF1bHRQYWNrYWdlID0gcGFja2FnZUxvY2tKc29uLnBhY2thZ2VzPy5bJyddO1xuICAgIGlmIChkZWZhdWx0UGFja2FnZSkge1xuICAgICAgZGVmYXVsdFBhY2thZ2UudmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRvIGVuc3VyZSBpdCBpcyBlaXRoZXIgYSByZWNvZ25pemVkIHR5cGVcbiAqIG9yIGEgdmFsaWQgbWFudWFsIHZlcnNpb24gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRvIHZhbGlkYXRlLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSBpcyBpbnZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGUodmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZ2V0VmVyc2lvblVwZGF0ZVR5cGUodmVyc2lvblVwZGF0ZVR5cGUpID09PSBWZXJzaW9uVXBkYXRlVHlwZS5JbnZhbGlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0ludmFsaWQgdmVyc2lvbiB1cGRhdGUgdHlwZS4gUGxlYXNlIHVzZSBcXCdtYWpvclxcJywgXFwnbWlub3JcXCcsIFxcJ3BhdGNoXFwnLCBcXCdwcmVtYWpvclxcJywgXFwncHJlbWlub3JcXCcsIFxcJ3ByZXBhdGNoXFwnLCBcXCdwcmVyZWxlYXNlXFwnLCBvciBcXCd4Lnkuelstc3VmZml4XVxcJyBmb3JtYXQuJ1xuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWZ1c2VzIGEgY2hhbmdlbG9nIHdob3NlIE5FVyBzZWN0aW9uIG1hdGNoZXMgb25lIG9mIHRoZSBtYWludGFpbmVyJ3Mgb3duIHVucHVibGlzaGVkIGZvcmJpZGRlbiBwYXR0ZXJucy5cbiAqXG4gKiBFdmVyeSBjb21taXQgc3ViamVjdCBzaW5jZSB0aGUgbGFzdCB0YWcgc2hpcHMgdmVyYmF0aW0gaW50byB0aGUgbmV3IHNlY3Rpb24sIHNvIGEgc3ViamVjdCB0aGF0IGNhcnJpZXNcbiAqIHZvY2FidWxhcnkgcHJpdmF0ZSB0byB0aGUgbWFpbnRhaW5lciDigJQgYW4gaW50ZXJuYWwgdHJhY2tlciBpZCwgYSBwcml2YXRlIHByb2plY3Qgc2hvcnQgbmFtZSDigJQgbGFuZHMgaW4gYVxuICogY2hlY2tlZC1pbiwgcHVibGlzaGVkIGZpbGUgaW5zaWRlIHRoZSByZWxlYXNlIGNvbW1pdCwgd2hlcmUgbm90aGluZyBldmVyIGxvb2tzIGF0IGl0IGFnYWluLiBUaGUgbGlzdCBvZiB3aGF0XG4gKiBjb3VudHMgYXMgcHJpdmF0ZSBjYW5ub3QgbGl2ZSBpbiB0aGlzIGxpYnJhcnkgb3IgaW4gdGhlIHJlcG9zaXRvcnkgd2l0aG91dCBwdWJsaXNoaW5nIHRoZSB2ZXJ5IHRoaW5nIGl0XG4gKiBwcm90ZWN0cywgc28gaXQgY29tZXMgZnJvbSB0aGUgZmlsZSB7QGxpbmsgRk9SQklEREVOX1BBVFRFUk5TX0ZJTEVfRU5WX1ZBUklBQkxFfSBuYW1lcywgYW5kIHRoaXMgaXMgYSBuby1vcFxuICogd2hlcmV2ZXIgdGhhdCBpcyBub3QgY29uZmlndXJlZC5cbiAqXG4gKiBMaWtlIHtAbGluayBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHN9LCBvbmx5IHRoZSBzZWN0aW9uIGJlaW5nIHB1Ymxpc2hlZCBpcyBzY2FubmVkLCBhbmQgdGhlIHRocm93XG4gKiBjb21lcyBiZWZvcmUgYW55dGhpbmcgaXMgd3JpdHRlbi5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nQ29udGVudCAtIFRoZSBmdWxsIGNvbXBvc2VkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gaXMgYWJvdXQgdG8gYmUgcHVibGlzaGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZWN0aW9uIGlzIGNsZWFuLlxuICovXG5hc3luYyBmdW5jdGlvbiBhc3NlcnRDaGFuZ2Vsb2dIYXNOb0ZvcmJpZGRlblBhdHRlcm5zKGNoYW5nZWxvZ0NvbnRlbnQ6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhdHRlcm5zID0gYXdhaXQgcmVhZEZvcmJpZGRlblBhdHRlcm5zKCk7XG4gIGNvbnN0IG1hdGNoZXMgPSBmaW5kRm9yYmlkZGVuUGF0dGVybk1hdGNoZXMoZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nQ29udGVudCwgdmVyc2lvbiksIHBhdHRlcm5zKTtcblxuICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFRoZSAke3ZlcnNpb259IHNlY3Rpb24gb2YgJHtSZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IG1hdGNoZXMgYSBwYXR0ZXJuIGZyb20gdGhlIGZpbGVgXG4gICAgICArIGAgJHtGT1JCSURERU5fUEFUVEVSTlNfRklMRV9FTlZfVkFSSUFCTEV9IG5hbWVzOlxcbmBcbiAgICAgICsgYCR7bWF0Y2hlcy5tYXAoKHsgbGluZSwgbWF0Y2ggfSkgPT4gYCR7bGluZX0gICAgPC0gJHttYXRjaH1gKS5qb2luKCdcXG4nKX1cXG5gXG4gICAgICArICdOb3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4geWV0LiBTdXBwbHkgcmVsZWFzZSBub3RlcyB0aGF0IHNheSB0aGUgc2FtZSB0aGluZyB3aXRob3V0IGl0LCB3aXRoJ1xuICAgICAgKyAnIGAtLWNoYW5nZWxvZy1maWxlIDxwYXRoPmAsIG9yIHJlbW92ZSBpdCBhdCB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3LCBhbmQgcmUtcnVuIHRoZSByZWxlYXNlLidcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWZ1c2VzIGEgY2hhbmdlbG9nIHdob3NlIE5FVyBzZWN0aW9uIHN0aWxsIGNhcnJpZXMgYW4gZW50cnkgdGhhdCByZWFkcyBhcyBhIG1lcmdlIHN1YmplY3QgZ2l0IHdyb3RlIGl0c2VsZi5cbiAqXG4gKiBUaGUgY29udmVudGlvbiB0aGlzIGVuZm9yY2VzIGlzIHRoYXQgYSBub24tZmYgbWVyZ2UgdGFrZXMgdGhlIHNhbWUgQ29udmVudGlvbmFsLUNvbW1pdHMgc3ViamVjdCBhcyB0aGUgYnJhbmNoXG4gKiBjb21taXQgaXQgbGFuZHMuIE5vdGhpbmcgdXNlZCB0byBob2xkIGl0OiBmb3IgYSBub24tZmYgbWVyZ2UgdGhlIGZpcnN0LXBhcmVudCBjb21taXQgaXMgdGhlIG1lcmdlIGNvbW1pdCwgc28gYVxuICogZGVmYXVsdCBzdWJqZWN0IHNoaXBzIHZlcmJhdGltLCBwdWJsaXNoaW5nIGEgYmFyZSBicmFuY2ggbmFtZSAoYE1lcmdlIGJyYW5jaCAnZml4LXRoZS10aGluZydgKSBhcyBhIGNoYW5nZWxvZ1xuICogZW50cnkg4oCUIHdoaWNoIHNheXMgbm90aGluZyBhYm91dCB3aGF0IGNoYW5nZWQsIGFuZCBvbiBhIGJyYW5jaCBuYW1lZCBhZnRlciBhIHByaXZhdGUgdHJhY2tlciBpdGVtIGRlY29kZXMgdG9cbiAqIG5vdGhpbmcgYXQgYWxsIGZvciBhIHJlYWRlci4gVGhlIGludGVyYWN0aXZlIHJldmlldyB3YXMgdGhlIGRlIGZhY3RvIGNhdGNoLCBhbmQgYC0tbm8tY2hhbmdlbG9nLWVkaXRpbmdgLCB0aGVcbiAqIGZsYWcgYW4gdW5hdHRlbmRlZCByZWxlYXNlIGFjdHVhbGx5IHVzZXMsIHNraXBzIGl0OyBvbmUgc3dlZXAgYWNyb3NzIHRoaXMgd29ya3NwYWNlIGZvdW5kIHR3ZWx2ZSBzdWNoXG4gKiBwdWJsaXNoZWQgZW50cmllcyBpbiBhIHNpbmdsZSByZXBvc2l0b3J5LlxuICpcbiAqIE9ubHkgdGhlIHNlY3Rpb24gYmVpbmcgcHVibGlzaGVkIGlzIHNjYW5uZWQsIHNvIGFuIGVudHJ5IGFscmVhZHkgc2hpcHBlZCB1bmRlciBhbiBvbGRlciB2ZXJzaW9uIGNhbm5vdCBibG9ja1xuICogZXZlcnkgZnV0dXJlIHJlbGVhc2UuIHtAbGluayB0b0NoYW5nZWxvZ0VudHJ5fSBoYXMgYWxyZWFkeSByZXdyaXR0ZW4gZXZlcnkgbWVyZ2UgdGhhdCBoYWQgYSBib2R5IHRvIHJld3JpdGVcbiAqIGZyb20sIHNvIHdoYXQgcmVhY2hlcyBoZXJlIGlzIGEgbWVyZ2Ugd2hvc2UgYXV0aG9yIHdyb3RlIG5vdGhpbmcgYXQgYWxsIOKAlCB3aGljaCBubyByZXdyaXRlIGNhbiBpbnZlbnQsIGFuZFxuICogd2hpY2ggaXMgdGhlcmVmb3JlIHdvcnRoIHN0b3BwaW5nIHRoZSByZWxlYXNlIGZvci5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nQ29udGVudCAtIFRoZSBmdWxsIGNvbXBvc2VkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gaXMgYWJvdXQgdG8gYmUgcHVibGlzaGVkLlxuICovXG5mdW5jdGlvbiBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHMoY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgQlVMTEVUX1JFR19FWFAgPSAvXi0gLztcbiAgY29uc3Qgb2ZmZW5kaW5nRW50cmllcyA9IGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNoYW5nZWxvZ0NvbnRlbnQsIHZlcnNpb24pXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5maWx0ZXIoKGxpbmUpID0+IE1FUkdFX1NVQkpFQ1RfUkVHX0VYUC50ZXN0KGxpbmUucmVwbGFjZShCVUxMRVRfUkVHX0VYUCwgJycpKSk7XG5cbiAgaWYgKG9mZmVuZGluZ0VudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBUaGUgJHt2ZXJzaW9ufSBzZWN0aW9uIG9mICR7UmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBjYXJyaWVzIGEgbWVyZ2Ugc3ViamVjdCBnaXQgd3JvdGUgaXRzZWxmOlxcbmBcbiAgICAgICsgYCR7b2ZmZW5kaW5nRW50cmllcy5qb2luKCdcXG4nKX1cXG5gXG4gICAgICArICdTdWNoIGFuIGVudHJ5IHB1Ymxpc2hlcyBhIGJyYW5jaCBuYW1lIGluc3RlYWQgb2Ygc2F5aW5nIHdoYXQgc2hpcHBlZC4gR2l2ZSB0aGUgbWVyZ2UgY29tbWl0IHRoZSBzYW1lJ1xuICAgICAgKyAnIHN1YmplY3QgYXMgdGhlIGJyYW5jaCBjb21taXQgaXQgbGFuZHMgKGBnaXQgY29tbWl0IC0tYW1lbmRgIG9uIHRoZSBtZXJnZSwgdGhlbiByZS1ydW4gdGhlIHJlbGVhc2UpLCBvcidcbiAgICAgICsgJyBzdXBwbHkgdGhlIHJlbGVhc2Ugbm90ZXMgeW91cnNlbGYgd2l0aCBgLS1jaGFuZ2Vsb2ctZmlsZSA8cGF0aD5gLidcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWZ1c2VzIGEgcmVsZWFzZSB0aGF0IHdvdWxkIGhhdmUgdG8gc3RvcCBhdCB0aGUgaW50ZXJhY3RpdmUgY2hhbmdlbG9nIHJldmlldyB3aXRoIG5vYm9keSB0aGVyZSB0b1xuICogZmluaXNoIGl0LiBDYWxsZWQgZnJvbSB0aGUgcHJlZmxpZ2h0IHNvIHRoZSByZWZ1c2FsIGNvc3RzIHNlY29uZHMsIG5vdCB0aGUgd2hvbGUgY2hlY2stYW5kLWJ1aWxkIGdhdGUuXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0ZpbGVQYXRoIC0gVGhlIHBhdGggdG8gdGhlIHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqIEBwYXJhbSBzaG91bGRFZGl0Q2hhbmdlbG9nIC0gV2hldGhlciB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpcyBtZWFudCB0byBiZSByZXZpZXdlZCBpbnRlcmFjdGl2ZWx5LlxuICovXG5mdW5jdGlvbiBhc3NlcnRDaGFuZ2Vsb2dTdGVwSXNOb25CbG9ja2luZyhjaGFuZ2Vsb2dGaWxlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzaG91bGRFZGl0Q2hhbmdlbG9nOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChjaGFuZ2Vsb2dGaWxlUGF0aCAhPT0gdW5kZWZpbmVkIHx8ICFzaG91bGRFZGl0Q2hhbmdlbG9nIHx8IHByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ1RoZSBpbnRlcmFjdGl2ZSBjaGFuZ2Vsb2cgcmV2aWV3IG5lZWRzIGEgdGVybWluYWwsIGFuZCB0aGlzIHByb2Nlc3MgaGFzIG5vbmUsIHNvIHRoZSByZWxlYXNlIHdvdWxkIGJsb2NrIGZvcmV2ZXIuJ1xuICAgICAgKyAnIFBhc3MgYC0tY2hhbmdlbG9nLWZpbGUgPHBhdGg+YCB0byBzdXBwbHkgcHJlcGFyZWQgcmVsZWFzZSBub3Rlcywgb3IgYC0tbm8tY2hhbmdlbG9nLWVkaXRpbmdgIHRvIGFjY2VwdCB0aGUnXG4gICAgICArICcgY2hhbmdlbG9nIGdlbmVyYXRlZCBmcm9tIHRoZSBjb21taXQgbWVzc2FnZXMgYXMgaXMuJ1xuICApO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGNoZWNrcyB7QGxpbmsgcHJlcGFyZUNoYW5nZWxvZ30gcnVucyBvbiBhIGNoYW5nZWxvZyBub2JvZHkgd2lsbCByZXZpZXcsIGJlZm9yZSB0aGUgZ2F0ZSByYXRoZXIgdGhhblxuICogYWZ0ZXIgaXQuXG4gKlxuICogV2l0aG91dCBhbiBpbnRlcmFjdGl2ZSByZXZpZXcgKGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCwgb3IgYC0tY2hhbmdlbG9nLWZpbGVgKSwgdGhlIG5ldyBzZWN0aW9uIGlzIGZ1bGx5IGRlY2lkZWRcbiAqIGJ5IHdoYXQgaXMgYWxyZWFkeSBjb21taXR0ZWQsIHNvIGV2ZXJ5IGNoZWNrIGBwcmVwYXJlQ2hhbmdlbG9nYCB3b3VsZCB0aHJvdyBvbiBjYW4gYmUgYW5zd2VyZWQgaW4gc2Vjb25kcy4gQVxuICogcmVsZWFzZSBvbmNlIHBhc3NlZCBpdHMgd2hvbGUgMjUtbWludXRlIHByZWZsaWdodCBhbmQgd2FzIHRoZW4gcmVmdXNlZCBieSBgbGludDptZGAgb3ZlciBhIHB1c2hlZCBjb21taXQgc3ViamVjdFxuICogaXQgY291bGQgaGF2ZSBuYW1lZCBhdCB0aGUgc3RhcnQuIFdpdGggYSByZXZpZXcgZHVlLCBub3RoaW5nIGlzIGNoZWNrZWQgaGVyZSwgYmVjYXVzZSB0aGUgYXV0aG9yIGNhbiBzdGlsbCBmaXhcbiAqIGEgZmluZGluZyBpbiB0aGUgZWRpdG9yLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSByZXF1ZXN0ZWQgdmVyc2lvbiB1cGRhdGUgdHlwZS5cbiAqIEBwYXJhbSBjaGFuZ2Vsb2dGaWxlUGF0aCAtIFRoZSBwcmVwYXJlZCBub3Rlcywgd2hlbiB0aGUgcmVsZWFzZSB3YXMgZ2l2ZW4gdGhlbS5cbiAqIEBwYXJhbSBzaG91bGRFZGl0Q2hhbmdlbG9nIC0gV2hldGhlciB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3IHdhcyBhc2tlZCBmb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNlY3Rpb24gd291bGQgcGFzcywgYW5kIHJlamVjdHMgbmFtaW5nIHdoYXQgaXQgZmFpbHMgb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydE5vbkludGVyYWN0aXZlQ2hhbmdlbG9nSXNQdWJsaXNoYWJsZShcbiAgdmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyxcbiAgY2hhbmdlbG9nRmlsZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgc2hvdWxkRWRpdENoYW5nZWxvZzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChpc0NoYW5nZWxvZ1Jldmlld0R1ZShjaGFuZ2Vsb2dGaWxlUGF0aCwgc2hvdWxkRWRpdENoYW5nZWxvZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGNvbnN0IGNoYW5nZWxvZyA9IGF3YWl0IGNvbXBvc2VDaGFuZ2Vsb2dOb2JvZHlSZXZpZXdzKG5ld1ZlcnNpb24sIGNoYW5nZWxvZ0ZpbGVQYXRoKTtcbiAgY29uc3QgZmluZGluZ3MgPSBhd2FpdCBnZXRDaGFuZ2Vsb2dTZWN0aW9uRmluZGluZ3MoY2hhbmdlbG9nLCBuZXdWZXJzaW9uKTtcbiAgaWYgKGZpbmRpbmdzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyB0b0NoYW5nZWxvZ0ZpbmRpbmdzRXJyb3IoZmluZGluZ3MsIG5ld1ZlcnNpb24pO1xuICB9XG5cbiAgYXNzZXJ0Q2hhbmdlbG9nSGFzTm9NZXJnZVN1YmplY3RzKGNoYW5nZWxvZywgbmV3VmVyc2lvbik7XG4gIGF3YWl0IGFzc2VydENoYW5nZWxvZ0hhc05vRm9yYmlkZGVuUGF0dGVybnMoY2hhbmdlbG9nLCBuZXdWZXJzaW9uKTtcbn1cblxuLyoqXG4gKiBSZWZ1c2VzIGEgcmVsZWFzZSB3aG9zZSBidW1wIGlzIExPV0VSIHRoYW4gdGhlIGNvbW1pdHMgaXQgaXMgYWJvdXQgdG8gcHVibGlzaCBmb3JjZSBpdCB0byBiZS5cbiAqXG4gKiBUaGUgcnVsZSB0aGlzIGVuZm9yY2VzIGlzIG9sZCBhbmQgd2FzIHdyaXR0ZW4gZG93biBhZnRlciBgOTYuNS4xYCBzaGlwcGVkIHNpeCB1bnJlbGVhc2VkIGBmZWF0OmAgY29tbWl0cyBhc1xuICogYSBwYXRjaDogY2hvb3NlIHRoZSBidW1wIGZyb20gdGhlIHdob2xlIHJhbmdlIHNpbmNlIHRoZSBsYXN0IHRhZywgbmV2ZXIgZnJvbSB0aGUgY2hhbmdlIHlvdSBoYXBwZW4gdG8gYmVcbiAqIHdvcmtpbmcgb24uIEl0IGRpZCBub3QgaG9sZCDigJQgYDEwNS4xLjBgIG9mIHRoaXMgbGlicmFyeSBpcyBhIE1JTk9SIGNhcnJ5aW5nIGBmZWF0KHZpdGVzdC1jb25maWcpIWAsIHNvIGV2ZXJ5XG4gKiBjb25zdW1lciBvbiBhIGNhcmV0IHJhbmdlIHRvb2sgYSBicmVha2luZyBjaGFuZ2Ugd2l0aCBubyB2ZXJzaW9uIHNpZ25hbCDigJQgYW5kIGl0IGNvdWxkIG5vdCBob2xkLCBiZWNhdXNlIGl0XG4gKiBhc2tlZCBhIGh1bWFuIHRvIHNjYW4gYSByYW5nZSBhbmQgdGhlbiB0eXBlIGEgYnVtcCB0aGF0IG5vdGhpbmcgY29tcGFyZWQgYWdhaW5zdCB3aGF0IHRoZSBzY2FuIHdvdWxkIGhhdmVcbiAqIGZvdW5kLiBUaGlzIGlzIHRoYXQgY29tcGFyaXNvbiwgYXQgdGhlIG9uZSBtb21lbnQgdGhlIHJ1bGUgaXMgYmVpbmcgYnJva2VuLlxuICpcbiAqIEl0IHJlZnVzZXMgb25seSBhIGJ1bXAgdGhhdCBpcyB0b28gTE9XLiBBIGRlbGliZXJhdGVseSBoaWdoZXIgb25lIOKAlCBhIG1ham9yIGN1dCB0byBzaWduYWwgYSBicmVhayBsYXRlLCBhXG4gKiBtaW5vciBmb3IgYSByYW5nZSBvZiBwdXJlIGBmaXhgZXMg4oCUIHBhc3NlcyB1bnRvdWNoZWQsIGFuZCB0aGVyZSBpcyBubyBmbGFnIHRvIHN3aXRjaCB0aGUgZ2F0ZSBvZmY6IGFuXG4gKiBvcHQtb3V0IGlzIHdoYXQgZ2V0cyByZWFjaGVkIGZvciByZWZsZXhpdmVseSwgYW5kIHRoZSBsZWdpdGltYXRlIGVzY2FwZSAoYnVtcCBoaWdoZXIpIGFscmVhZHkgZXhpc3RzLlxuICpcbiAqIENhbGxlZCBmcm9tIHRoZSBwcmVmbGlnaHQgcmF0aGVyIHRoYW4gYXQgdGhlIGJ1bXAgaXRzZWxmLCBzbyBhIHJlZnVzYWwgY29zdHMgc2Vjb25kcyBpbnN0ZWFkIG9mIHRoZSB3aG9sZVxuICogY2hlY2stYW5kLWJ1aWxkIGdhdGUsIGFuZCBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4gd2hlbiBpdCB0aHJvd3MuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgdGhlIHJlbGVhc2Ugd2FzIGFza2VkIGZvci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXNzZXJ0VmVyc2lvblVwZGF0ZVR5cGVNZWV0c0J1bXBGbG9vcih2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHZlcnNpb25EZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdWZXJzaW9uJyk7XG4gIGNvbnN0IGxhc3RUYWcgPSBhd2FpdCByZXNvbHZlTGFzdFJlbGVhc2VkVGFnKGF3YWl0IHJlYWRQcmV2aW91c0NoYW5nZWxvZ0xpbmVzKCkpO1xuXG4gIC8vIE5vIGJhc2VsaW5lLCBubyByYW5nZSwgbm8gZmxvb3IuIFRoaXMgaXMgYSBmaXJzdCByZWxlYXNlLCBvciBvbmUgd2hvc2UgcHJldmlvdXMgdGFnIHdhcyBkZWxldGVkIOKAlCB0aGVcbiAgLy8gY2hhbmdlbG9nIHN0ZXAgZmFsbHMgYmFjayB0byB0aGUgZnVsbCBoaXN0b3J5IHRoZXJlLCBhbmQgZGVyaXZpbmcgYSBmbG9vciBmcm9tIHRoZSBmdWxsIGhpc3Rvcnkgb2YgYSByZXBvXG4gIC8vIGFib3V0IHRvIGN1dCBgMS4wLjBgIHdvdWxkIHJlZnVzZSBpdCBvdmVyIGNvbW1pdHMgdGhhdCBwcmVkYXRlIHRoZSBjb25jZXB0IG9mIGEgcHVibGlzaGVkIHN1cmZhY2UuXG4gIGlmICghbGFzdFRhZykge1xuICAgIHZlcnNpb25EZWJ1Z2dlcignTm8gcHJldmlvdXMgcmVsZWFzZSB0YWcgcmVzb2x2ZWQsIHNvIHRoZSBidW1wIGZsb29yIGlzIG5vdCBkZXJpdmVkLiBUaGUgYnVtcCBpcyB0YWtlbiBhcyBnaXZlbi4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBidW1wRmxvb3IgPSBhd2FpdCBnZXRCdW1wRmxvb3IoYCR7bGFzdFRhZ30uLkhFQURgKTtcbiAgY29uc3QgZmxvb3JMZXZlbCA9IGJ1bXBGbG9vci5sZXZlbDtcbiAgaWYgKGZsb29yTGV2ZWwgPT09IFZlcnNpb25VcGRhdGVUeXBlLlBhdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbmV3VmVyc2lvbiA9IGF3YWl0IGdldE5ld1ZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGUpO1xuICBjb25zdCB0YWtlbkxldmVsID0gdG9FZmZlY3RpdmVCdW1wTGV2ZWwobGFzdFRhZywgbmV3VmVyc2lvbik7XG5cbiAgLy8gQW4gdW5wYXJzYWJsZSBiYXNlbGluZSBvciB0YXJnZXQgaXMgbm90IHRoaXMgZ2F0ZSdzIGJ1c2luZXNzIHRvIGZhaWwgYSByZWxlYXNlIG92ZXIuIEl0IGNhbiBvbmx5IGhhcHBlblxuICAvLyBmb3IgYSB0YWcgdGhhdCBpcyBub3QgYSB2ZXJzaW9uIGF0IGFsbCwgd2hpY2ggZXZlcnkgb3RoZXIgc3RlcCBoZXJlIHdvdWxkIGhhdmUgaXRzIG93biB0cm91YmxlIHdpdGguXG4gIGlmICghdGFrZW5MZXZlbCkge1xuICAgIHZlcnNpb25EZWJ1Z2dlcihgQ291bGQgbm90IGNvbXBhcmUgJyR7bmV3VmVyc2lvbn0nIGFnYWluc3QgdGhlIHByZXZpb3VzIHRhZyAnJHtsYXN0VGFnfScsIHNvIHRoZSBidW1wIGZsb29yIGlzIG5vdCBlbmZvcmNlZC5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaXNCdW1wTGV2ZWxBdExlYXN0KHRha2VuTGV2ZWwsIGZsb29yTGV2ZWwpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgdG9CdW1wRmxvb3JFcnJvcihidW1wRmxvb3IsIHtcbiAgICBsYXN0VGFnLFxuICAgIG5ld1ZlcnNpb24sXG4gICAgdGFrZW5MZXZlbCxcbiAgICB2ZXJzaW9uVXBkYXRlVHlwZVxuICB9KTtcbn1cblxuLyoqXG4gKiBDb21wb3NlcyB0aGUgbmV3IGBDSEFOR0VMT0cubWRgIGNvbnRlbnQg4oCUIHRoZSBuZXcgc2VjdGlvbiBmcm9tIHRoZSBjb21taXRzIHNpbmNlIHRoZSBsYXN0IHRhZywgb3IgZnJvbSB0aGVcbiAqIHByZXBhcmVkIG5vdGVzLCBhYm92ZSB0aGUgcHJldmlvdXMgc2VjdGlvbnMg4oCUIHdpdGhvdXQgcmV2aWV3aW5nLCBjaGVja2luZyBvciB3cml0aW5nIGl0LlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0aGUgY2hhbmdlbG9nIHNlY3Rpb24gaXMgd3JpdHRlbiBmb3IuXG4gKiBAcGFyYW0gY2hhbmdlbG9nRmlsZVBhdGggLSBUaGUgcHJlcGFyZWQgbm90ZXMsIHdoZW4gdGhlIHJlbGVhc2Ugd2FzIGdpdmVuIHRoZW0uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb21wb3NlZCBjb250ZW50LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wb3NlQ2hhbmdlbG9nKG5ld1ZlcnNpb246IHN0cmluZywgY2hhbmdlbG9nRmlsZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHByZXZpb3VzQ2hhbmdlbG9nTGluZXMgPSBhd2FpdCByZWFkUHJldmlvdXNDaGFuZ2Vsb2dMaW5lcygpO1xuXG4gIGxldCBuZXdDaGFuZ2VMb2cgPSBgIyBDSEFOR0VMT0dcXG5cXG4jIyAke25ld1ZlcnNpb259XFxuXFxuYDtcblxuICBpZiAoY2hhbmdlbG9nRmlsZVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGxhc3RUYWcgPSBhd2FpdCByZXNvbHZlTGFzdFJlbGVhc2VkVGFnKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMpO1xuICAgIGNvbnN0IGNvbW1pdFJhbmdlID0gbGFzdFRhZyA/IGAke2xhc3RUYWd9Li5IRUFEYCA6ICdIRUFEJztcbiAgICBjb25zdCBjb21taXRNZXNzYWdlc1N0cmluZyA9IGF3YWl0IGV4ZWNGcm9tUm9vdChgZ2l0IGxvZyAke2NvbW1pdFJhbmdlfSAtLWZvcm1hdD0lQiAtLWZpcnN0LXBhcmVudCAtemAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBjb25zdCBjb21taXRNZXNzYWdlcyA9IGNvbW1pdE1lc3NhZ2VzU3RyaW5nLnNwbGl0KCdcXDAnKS5maWx0ZXIoQm9vbGVhbikubWFwKChjb21taXRNZXNzYWdlKSA9PiB0b0NoYW5nZWxvZ0VudHJ5KGNvbW1pdE1lc3NhZ2UpKTtcblxuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBjb21taXRNZXNzYWdlcykge1xuICAgICAgbmV3Q2hhbmdlTG9nICs9IGAtICR7YXV0b2xpbmtCYXJlVXJscyhtZXNzYWdlKX1cXG5gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcmVwYXJlZE5vdGVzID0gYXdhaXQgcmVhZEZpbGUoY2hhbmdlbG9nRmlsZVBhdGgsICd1dGYtOCcpO1xuICAgIG5ld0NoYW5nZUxvZyArPSBgJHtyZXBsYWNlQWxsKHsgJHN0cmluZzogcHJlcGFyZWROb3RlcywgcmVwbGFjZXI6ICdcXG4nLCBzZWFyY2hWYWx1ZTogJ1xcclxcbicgfSkudHJpbSgpfVxcbmA7XG4gIH1cblxuICBpZiAocHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgbmV3Q2hhbmdlTG9nICs9ICdcXG4nO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzKSB7XG4gICAgICBuZXdDaGFuZ2VMb2cgKz0gYCR7bGluZX1cXG5gO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdDaGFuZ2VMb2c7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgdGhlIG5ldyBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IGZvciBhIHJlbGVhc2Ugbm9ib2R5IHJldmlld3MsIGFwcGx5aW5nIGBsaW50Om1kOmZpeGAncyBmaXhlcyB0byBhIHNlY3Rpb25cbiAqIGdlbmVyYXRlZCBmcm9tIGNvbW1pdCBzdWJqZWN0cy5cbiAqXG4gKiBBIHN1YmplY3QgY2FuIGZhaWwgYGxpbnQ6bWRgIHdpdGhvdXQgYW55b25lIGhhdmluZyBoYWQgdGhlIGNoYW5jZSB0byBmaXggaXQ6IGEgYC0tbm8tZmZgIG1lcmdlIGlzIG1hZGUgd2l0aFxuICogYEhVU0tZPTBgLCBzbyBjb21taXRsaW50IG5ldmVyIHNlZXMgaXQsIGFuZCBhbiBpc3N1ZS1jbG9zaW5nIG1lcmdlIHRha2VzIHRoZSBpc3N1ZSB0aXRsZSB2ZXJiYXRpbS4gQW4gT2JzaWRpYW5cbiAqIHBsdWdpbidzIHN1YmplY3QgbmFtaW5nIHRoZSBwbHVnaW4gd2l0aG91dCBiYWNrdGlja3Mgc3RvcHBlZCBhIHJlbGVhc2UgdGhhdCB3YXkgdGhyZWUgdGltZXMsIGFmdGVyIHRoZSB3aG9sZVxuICogcHJlZmxpZ2h0LiBXaGF0ZXZlciB0aGUgcmVwb3NpdG9yeSdzIGNvbmZpZ3VyYXRpb24gY2FuIGZpeCBpcyBmaXhlZCBoZXJlLCBhbmQgd2hhdCBpdCBjYW5ub3QgaXMgc3RpbGwgcmVmdXNlZCBieVxuICogdGhlIGZpbmRpbmdzIGNoZWNrIHRoYXQgZm9sbG93cy4gUHJlcGFyZWQgbm90ZXMgYXJlIHRoZSBhdXRob3IncyByZXZpZXdlZCB0ZXh0LCBzbyB0aGV5IGFyZSBuZXZlciByZXdyaXR0ZW4sIGFuZFxuICogb25seSB0aGUgbmV3IHNlY3Rpb24gaXMgdG91Y2hlZCwgbmV2ZXIgYSBwdWJsaXNoZWQgb25lLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0aGUgY2hhbmdlbG9nIHNlY3Rpb24gaXMgd3JpdHRlbiBmb3IuXG4gKiBAcGFyYW0gY2hhbmdlbG9nRmlsZVBhdGggLSBUaGUgcHJlcGFyZWQgbm90ZXMsIHdoZW4gdGhlIHJlbGVhc2Ugd2FzIGdpdmVuIHRoZW0uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb21wb3NlZCBjb250ZW50LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wb3NlQ2hhbmdlbG9nTm9ib2R5UmV2aWV3cyhuZXdWZXJzaW9uOiBzdHJpbmcsIGNoYW5nZWxvZ0ZpbGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjaGFuZ2Vsb2cgPSBhd2FpdCBjb21wb3NlQ2hhbmdlbG9nKG5ld1ZlcnNpb24sIGNoYW5nZWxvZ0ZpbGVQYXRoKTtcbiAgaWYgKGNoYW5nZWxvZ0ZpbGVQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2hhbmdlbG9nO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcbiAgaWYgKCFPYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KS5pbmNsdWRlcyhMSU5UX01EX1NDUklQVF9OQU1FKSkge1xuICAgIHJldHVybiBjaGFuZ2Vsb2c7XG4gIH1cblxuICBjb25zdCBzZWN0aW9uID0gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nLCBuZXdWZXJzaW9uKTtcbiAgY29uc3QgeyBjb250ZW50LCBmaXhDb3VudCB9ID0gYXdhaXQgZml4TWFya2Rvd25Db250ZW50KHtcbiAgICBjb250ZW50OiB0b0NoYW5nZWxvZ1NlY3Rpb25Eb2N1bWVudChjaGFuZ2Vsb2csIG5ld1ZlcnNpb24pLFxuICAgIGZpbGVQYXRoOiByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KVxuICB9KTtcbiAgaWYgKGZpeENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIGNoYW5nZWxvZztcbiAgfVxuXG4gIGNvbnNvbGUud2FybihgRml4ZWQgJHtTdHJpbmcoZml4Q291bnQpfSBtYXJrZG93bmxpbnQgZmluZGluZyhzKSBpbiB0aGUgZ2VuZXJhdGVkICR7bmV3VmVyc2lvbn0gY2hhbmdlbG9nIHNlY3Rpb24sIHNvIGl0IGRpZmZlcnMgZnJvbSB0aGUgY29tbWl0IHN1YmplY3RzLmApO1xuICBjb25zdCBoZWFkaW5nID0gYCMjICR7bmV3VmVyc2lvbn1cXG5cXG5gO1xuICByZXR1cm4gY2hhbmdlbG9nLnJlcGxhY2UoYCR7aGVhZGluZ30ke3NlY3Rpb259YCwgKCkgPT4gYCR7aGVhZGluZ30ke2V4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNvbnRlbnQsIG5ld1ZlcnNpb24pfWApO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUJyYW5jaChicmFuY2g6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBicmFuY2ggPyBgYnJhbmNoICcke2JyYW5jaH0nYCA6ICdhIGRldGFjaGVkIEhFQUQnO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBib2R5IG9mIG9uZSB2ZXJzaW9uJ3MgYENIQU5HRUxPRy5tZGAgc2VjdGlvbiDigJQgZXZlcnl0aGluZyBiZXR3ZWVuIGl0cyBgIyMgPHZlcnNpb24+YCBoZWFkaW5nXG4gKiBhbmQgd2hpY2hldmVyIGNvbWVzIGZpcnN0LCB0aGUgbmV4dCBgIyMgYCBoZWFkaW5nIG9yIHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gKlxuICogRW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgbm90IGFuIGVkZ2UgY2FzZSBidXQgdGhlIG5vcm1hbCBzaGFwZSBvZiBhIEZJUlNUIHJlbGVhc2U6IHNlY3Rpb25zIGFyZVxuICogcHJlcGVuZGVkLCBzbyB0aGUgbmV3ZXN0IG9uZSBpcyBib3VuZGVkIGJ5IHRoZSBwcmV2aW91cyByZWxlYXNlIG9ubHkgb25jZSBhIHByZXZpb3VzIHJlbGVhc2UgZXhpc3RzLiBUaGVcbiAqIHJlZ2V4IHRoaXMgcmVwbGFjZWQgcmVxdWlyZWQgYSB0cmFpbGluZyBgXFxuXFxuIyNgLCBzbyBldmVyeSBgMS4wLjBgIHNpbGVudGx5IHB1Ymxpc2hlZCBlbXB0eSByZWxlYXNlIG5vdGVzLlxuICogVGVybWluYXRpbmcgb24gYCcjIyAnYCBXSVRIIGl0cyB0cmFpbGluZyBzcGFjZSBpcyB3aGF0IGtlZXBzIGFuIGAjIyNgIHN1Yi1oZWFkaW5nIGluc2lkZSB0aGUgc2VjdGlvblxuICogaW5zdGVhZCBvZiB0cnVuY2F0aW5nIGl0IHRoZXJlLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dDb250ZW50IC0gVGhlIGZ1bGwgY29udGVudHMgb2YgYENIQU5HRUxPRy5tZGAuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIFRoZSBzZWN0aW9uIGJvZHksIHRyaW1tZWQsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBjaGFuZ2Vsb2cgaGFzIG5vIHNlY3Rpb24gZm9yIHRoYXQgdmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IGNoYW5nZWxvZ0NvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgaGVhZGluZ0luZGV4ID0gbGluZXMuaW5kZXhPZihgIyMgJHt2ZXJzaW9ufWApO1xuICBpZiAoaGVhZGluZ0luZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGJvZHlTdGFydEluZGV4ID0gaGVhZGluZ0luZGV4ICsgMTtcbiAgY29uc3QgbmV4dEhlYWRpbmdPZmZzZXQgPSBsaW5lcy5zbGljZShib2R5U3RhcnRJbmRleCkuZmluZEluZGV4KChsaW5lKSA9PiBsaW5lLnN0YXJ0c1dpdGgoJyMjICcpKTtcbiAgY29uc3QgYm9keUVuZEluZGV4ID0gbmV4dEhlYWRpbmdPZmZzZXQgPT09IC0xID8gbGluZXMubGVuZ3RoIDogYm9keVN0YXJ0SW5kZXggKyBuZXh0SGVhZGluZ09mZnNldDtcbiAgcmV0dXJuIGxpbmVzLnNsaWNlKGJvZHlTdGFydEluZGV4LCBib2R5RW5kSW5kZXgpLmpvaW4oJ1xcbicpLnRyaW0oKTtcbn1cbi8qKlxuICogRGVyaXZlcyB0aGUgbG93ZXN0IGJ1bXAgYSBjb21taXQgcmFuZ2UgbWF5IGJlIHB1Ymxpc2hlZCB1bmRlciwgZnJvbSB0aGUgQ29udmVudGlvbmFsLUNvbW1pdHMgbWFya2VycyB0aGVcbiAqIGNvbW1pdHMgaW4gaXQgY2FycnkuXG4gKlxuICogQSBgIWAgYmVmb3JlIHRoZSBzdWJqZWN0J3MgY29sb24sIG9yIGEgYEJSRUFLSU5HIENIQU5HRTpgIC8gYEJSRUFLSU5HLUNIQU5HRTpgIGZvb3RlciwgZm9yY2VzIGEgbWFqb3I7IGFcbiAqIGBmZWF0YCB0eXBlIGZvcmNlcyBhIG1pbm9yOyBldmVyeXRoaW5nIGVsc2Ug4oCUIGBmaXhgLCBgY2hvcmVgLCBgZG9jc2AsIGByZWZhY3RvcmAsIGFuIHVucGFyc2FibGUgc3ViamVjdCDigJRcbiAqIGNvbnN0cmFpbnMgbm90aGluZyBhbmQgeWllbGRzIGEgcGF0Y2ggZmxvb3IsIHdoaWNoIGlzIG5vIGNvbnN0cmFpbnQgYXQgYWxsLlxuICpcbiAqICoqRXZlcnkgY29tbWl0IGluIHRoZSByYW5nZSBpcyByZWFkLCBkZWxpYmVyYXRlbHkgTk9UIG9ubHkgdGhlIGZpcnN0LXBhcmVudCBvbmVzKiosIHdoaWNoIGlzIHdoZXJlIHRoaXNcbiAqIGRpZmZlcnMgZnJvbSB0aGUgY2hhbmdlbG9nIGdlbmVyYXRlZCBvdmVyIHRoZSBzYW1lIHJhbmdlLiBUaGUgY2hhbmdlbG9nIGlzIGZpcnN0LXBhcmVudCBiZWNhdXNlIGl0IHB1Ymxpc2hlc1xuICogb25lIGxpbmUgcGVyIGxhbmRlZCBjaGFuZ2U7IGEgYnJlYWtpbmcgY2hhbmdlIGlzIGJyZWFraW5nIHdoaWNoZXZlciBwYXJlbnQgaXQgYXJyaXZlZCBvbi4gQ29uY3JldGVseSxcbiAqIHtAbGluayB0b0NoYW5nZWxvZ0VudHJ5fSBsaWZ0cyBvbmx5IHRoZSBGSVJTVCBsaW5lIG9mIGEgbWVyZ2UgYm9keSBvbnRvIGEgZGVmYXVsdCBtZXJnZSBzdWJqZWN0LCBzbyBhXG4gKiBgQlJFQUtJTkcgQ0hBTkdFOmAgZm9vdGVyIHdyaXR0ZW4gb24gYSBicmFuY2ggY29tbWl0IGlzIGludmlzaWJsZSB0byB0aGUgZmlyc3QtcGFyZW50IGhpc3Rvcnkg4oCUIGFuZCBhIGZvb3RlclxuICogaXMgdGhlIG9uZSBicmVha2luZyBzaWduYWwgQ29udmVudGlvbmFsIENvbW1pdHMgcHV0cyBpbiB0aGUgYm9keSByYXRoZXIgdGhhbiB0aGUgc3ViamVjdC4gVGhlIGNvc3Qgb2ZcbiAqIHJlYWRpbmcgZXZlcnl0aGluZyBpcyBvdmVyLWRldGVjdGlvbjogYSBicmFuY2ggd2hvc2UgYnJlYWtpbmcgY29tbWl0IHdhcyByZXdvcmtlZCBpbnRvIGEgbm9uLWJyZWFraW5nIG1lcmdlXG4gKiBzdGlsbCBmb3JjZXMgYSBtYWpvci4gVGhhdCBkaXJlY3Rpb24gaXMgc2FmZSDigJQgYW4gb3Zlci1idW1wIGNvc3RzIGEgY29uc3VtZXIgbm90aGluZyBhbmQgdGhlIG1lc3NhZ2UgbmFtZXNcbiAqIHRoZSBjb21taXQgc28gdGhlIGF1dGhvciBjYW4gc2VlIGV4YWN0bHkgd2hpY2ggb25lIOKAlCBhbmQgdGhlIG90aGVyIGRpcmVjdGlvbiBpcyB0aGUgZGVmZWN0IHRoaXMgZXhpc3RzIGZvci5cbiAqXG4gKiBAcGFyYW0gY29tbWl0UmFuZ2UgLSBUaGUgZ2l0IHJldmlzaW9uIHJhbmdlIHRvIHNjYW4sIGUuZy4gYDEwNS4yLjAuLkhFQURgLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUge0BsaW5rIEJ1bXBGbG9vcn0gdGhlIHJhbmdlIGZvcmNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QnVtcEZsb29yKGNvbW1pdFJhbmdlOiBzdHJpbmcpOiBQcm9taXNlPEJ1bXBGbG9vcj4ge1xuICAvLyBgJUglbiVCYCBwdXRzIHRoZSBoYXNoIG9uIGl0cyBvd24gZmlyc3QgbGluZSBhbmQgdGhlIGZ1bGwgbWVzc2FnZSB1bmRlciBpdCwgYW5kIGAtemAgc2VwYXJhdGVzIHRoZVxuICAvLyBjb21taXRzIHdpdGggTlVMIOKAlCBzbyBub3RoaW5nIGluIGEgY29tbWl0IG1lc3NhZ2UgY2FuIGJlIG1pc3Rha2VuIGZvciBhIHJlY29yZCBib3VuZGFyeS5cbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ2xvZycsIGNvbW1pdFJhbmdlLCAnLS1mb3JtYXQ9JUglbiVCJywgJy16J10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICBjb25zdCBmb3JjaW5nQ29tbWl0cyA9IG91dHB1dFxuICAgIC5zcGxpdCgnXFwwJylcbiAgICAubWFwKChyZWNvcmQpID0+IHRvRm9yY2luZ0NvbW1pdChyZWNvcmQpKVxuICAgIC5maWx0ZXIoKGZvcmNpbmdDb21taXQpID0+IGZvcmNpbmdDb21taXQgIT09IG51bGwpO1xuXG4gIHJldHVybiB7XG4gICAgZm9yY2luZ0NvbW1pdHMsXG4gICAgbGV2ZWw6IHRvSGlnaGVzdEJ1bXBMZXZlbChmb3JjaW5nQ29tbWl0cylcbiAgfTtcbn1cblxuLyoqXG4gKiBSdW5zIGBsaW50Om1kYCdzIGFuZCBgc3BlbGxjaGVja2AncyBjaGVja3Mgb3ZlciB0aGUgTkVXIHNlY3Rpb24gb2YgYSBjb21wb3NlZCBjaGFuZ2Vsb2csIGJlZm9yZSBhbnkgb2YgaXRcbiAqIHJlYWNoZXMgdGhlIHJlcG9zaXRvcnkuXG4gKlxuICogT25seSB0aGUgbmV3IHNlY3Rpb24gaXMgY2hlY2tlZCwgYW5kIGRlbGliZXJhdGVseSBzby4gVGhlIGhvbmVzdCBjaGVjayBpcyB0aGUgd2hvbGUgZmlsZSwgYnV0IGl0IGZhaWxzIGFcbiAqIHJlbGVhc2Ugb24gYSBkZWZlY3QgaW4gYSBzZWN0aW9uIHNvbWVib2R5IHNoaXBwZWQgeWVhcnMgYWdvIOKAlCB3aGljaCBpcyBhIHJlbGVhc2Ugbm9ib2R5IGNhbiBjdXQgd2l0aG91dFxuICogZmlyc3QgZml4aW5nIGhpc3RvcnksIGFuZCBpcyBleGFjdGx5IGhvdyBhIGNoYW5nZWxvZyBkZWZlY3QgYmVjb21lcyBhIHBlcm1hbmVudCBibG9ja2VyIGluc3RlYWQgb2YgYVxuICogdHdvLW1pbnV0ZSBmaXguIFRoYXQgaXMgbm90IGh5cG90aGV0aWNhbCBmb3IgdGhlIHNwZWxsaW5nIGhhbGYgaW4gcGFydGljdWxhcjogaXQgaXMgdGhlIHN0YXRlIGZpdmVcbiAqIHJlcG9zaXRvcmllcyBpbiB0aGlzIHdvcmtzcGFjZSBhcmUgaW4sIGVhY2ggd2l0aCBhIGNvaW5lZCB3b3JkIGFscmVhZHkgcHVibGlzaGVkIGluIGFuIG9sZCBzZWN0aW9uLiBUaGUgbmV3XG4gKiBzZWN0aW9uIGlzIHRoZSBvbmx5IHBhcnQgdGhpcyByZWxlYXNlIGlzIHJlc3BvbnNpYmxlIGZvci5cbiAqXG4gKiBCT1RIIGNoZWNrcyBydW4gb3ZlciBldmVyeSBzZXR0bGUsIGFuZCBuZWl0aGVyIHNob3J0LWNpcmN1aXRzIHRoZSBvdGhlci4gQW4gYXV0aG9yIHdobyBoYXMgYSBoYXJkLXdyYXBwZWRcbiAqIGxpbmUgYW5kIGEgY29pbmVkIHdvcmQgaXMgdG9sZCBhYm91dCBib3RoIGF0IG9uY2UsIGluIG9uZSByb3VuZCBvZiB0aGUgcmV2aWV3LCByYXRoZXIgdGhhbiBmaXhpbmcgb25lIGFuZFxuICogYmVpbmcgc2VudCBiYWNrIGZvciB0aGUgb3RoZXIuXG4gKlxuICogRWFjaCBoYWxmIHJ1bnMgb25seSB3aGVyZSB0aGUgcHJvamVjdCBkZWZpbmVzIHRoZSBzY3JpcHQgaXQgc3RhbmRzIGZvciwganVzdCBhcyB7QGxpbmsgZ2F0ZX0gcnVucyB0aGF0IHNjcmlwdFxuICogb25seSB3aGVyZSBpdCBpcyBkZWZpbmVkLiBBIHByb2plY3Qgd2l0aCBubyBgc3BlbGxjaGVja2AgaGFzIG5vIHNwZWxsaW5nIGNvbmZpZ3VyYXRpb24gZWl0aGVyLCBzbyBgY3NwZWxsYCB3b3VsZFxuICoganVkZ2UgaXRzIHJlbGVhc2Ugbm90ZXMgYWdhaW5zdCB0aGUgc3RvY2sgZGljdGlvbmFyaWVzIGFsb25lIGFuZCByZWZ1c2UgdGhlIHJlbGVhc2Ugb3ZlciB0aGUgcGx1Z2luJ3Mgb3duIG5hbWU6XG4gKiBhIGNoZWNrIHRoZSBwcm9qZWN0IG5ldmVyIGFkb3B0ZWQsIGVuZm9yY2VkIG9ubHkgYXQgcmVsZWFzZSB0aW1lLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dDb250ZW50IC0gVGhlIGZ1bGwgY29tcG9zZWQgYENIQU5HRUxPRy5tZGAgY29udGVudC5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIHZlcnNpb24gd2hvc2Ugc2VjdGlvbiBpcyBhYm91dCB0byBiZSBwdWJsaXNoZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmaW5kaW5ncywgb3IgYW4gZW1wdHkgYXJyYXkgd2hlbiB0aGUgc2VjdGlvbiBpcyBjbGVhbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hhbmdlbG9nU2VjdGlvbkZpbmRpbmdzKGNoYW5nZWxvZ0NvbnRlbnQ6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxDaGFuZ2Vsb2dGaW5kaW5nW10+IHtcbiAgY29uc3QgY29udGVudCA9IHRvQ2hhbmdlbG9nU2VjdGlvbkRvY3VtZW50KGNoYW5nZWxvZ0NvbnRlbnQsIHZlcnNpb24pO1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogUmVwb1BhdGhzLkNoYW5nZWxvZ01kIH0pO1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbigpO1xuICBjb25zdCBzY3JpcHROYW1lcyA9IE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30pO1xuXG4gIGNvbnN0IG1hcmtkb3dubGludEZpbmRpbmdzID0gc2NyaXB0TmFtZXMuaW5jbHVkZXMoTElOVF9NRF9TQ1JJUFRfTkFNRSlcbiAgICA/IGF3YWl0IGxpbnRNYXJrZG93bkNvbnRlbnQoe1xuICAgICAgY29udGVudCxcbiAgICAgIGZpbGVQYXRoXG4gICAgfSlcbiAgICA6IFtdO1xuICBjb25zdCBzcGVsbGluZ0ZpbmRpbmdzID0gc2NyaXB0TmFtZXMuaW5jbHVkZXMoU1BFTExDSEVDS19TQ1JJUFRfTkFNRSlcbiAgICA/IGF3YWl0IHNwZWxsY2hlY2tDb250ZW50KHtcbiAgICAgIGNvbnRlbnQsXG4gICAgICBmaWxlUGF0aFxuICAgIH0pXG4gICAgOiBbXTtcblxuICByZXR1cm4gW1xuICAgIC4uLm1hcmtkb3dubGludEZpbmRpbmdzLm1hcCgodGV4dCkgPT4gKHtcbiAgICAgIHNjcmlwdE5hbWU6IExJTlRfTURfU0NSSVBUX05BTUUsXG4gICAgICB0ZXh0XG4gICAgfSkpLFxuICAgIC4uLnNwZWxsaW5nRmluZGluZ3MubWFwKCh0ZXh0KSA9PiAoe1xuICAgICAgc2NyaXB0TmFtZTogU1BFTExDSEVDS19TQ1JJUFRfTkFNRSxcbiAgICAgIHRleHRcbiAgICB9KSlcbiAgXTtcbn1cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCByZWxlYXNlIGFzc2V0czogdGhlIHByb2plY3QncyBgbnBtIHBhY2tgIHRhcmJhbGwsIHdyaXR0ZW4gaW50byBgZGlzdC9gLCBhbmQgYGRpc3Qvc3R5bGVzLmNzc2AuXG4gKlxuICogQHJldHVybnMgVGhlIGFzc2V0IHBhdGhzLCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCByb290LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXROcG1QYWNrUmVsZWFzZUFzc2V0UGF0aHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZXN1bHRPdXRwdXQgPSBhd2FpdCBleGVjRnJvbVJvb3QoWyducG0nLCAncGFjaycsICctLXBhY2stZGVzdGluYXRpb24nLCBSZXBvUGF0aHMuRGlzdCwgJy0tanNvbiddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcnNlTnBtUGFja091dHB1dChyZXN1bHRPdXRwdXQpO1xuICByZXR1cm4gW1xuICAgIGpvaW4oUmVwb1BhdGhzLkRpc3QsIHJlc3VsdC5maWxlbmFtZSksXG4gICAgam9pbihSZXBvUGF0aHMuRGlzdCwgUmVwb1BhdGhzLlN0eWxlc0NzcylcbiAgXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgYnVtcCByZWFjaGVzIGEgZmxvb3IuXG4gKlxuICogU3BlbGxlZCBvdXQgcmF0aGVyIHRoYW4gZ2l2ZW4gbnVtZXJpYyByYW5rcywgYmVjYXVzZSB0aHJlZSBsZXZlbHMgZG8gbm90IG5lZWQgYW4gb3JkZXJpbmcgc2NoZW1lIGFuZCBhXG4gKiBgMiA+PSAzYCBpbiBhIHJlbGVhc2UgZ2F0ZSBpcyBvbmUgdHJhbnNwb3NpdGlvbiBhd2F5IGZyb20gc2lsZW50bHkgcGFzc2luZyBldmVyeXRoaW5nLiBgZmxvb3JMZXZlbGAgZXhjbHVkZXNcbiAqIHtAbGluayBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaH0gZm9yIHRoZSBzYW1lIHJlYXNvbiBpdCBpcyBub3QgdGVzdGVkIGZvcjogYSBwYXRjaCBmbG9vciBpcyBubyBmbG9vciwgYW5kIGl0c1xuICogb25seSBjYWxsZXIgaGFzIGFscmVhZHkgcmV0dXJuZWQgYnkgdGhlbiDigJQgYSBicmFuY2ggdGhhdCBjYW4gb25seSBldmVyIGFuc3dlciBgdHJ1ZWAgaXMgb25lIG5vYm9keSByZWFkcyBhbmRcbiAqIG5vdGhpbmcgY292ZXJzLlxuICpcbiAqIEBwYXJhbSBsZXZlbCAtIFRoZSB7QGxpbmsgQnVtcExldmVsfSBhY3R1YWxseSB0YWtlbi5cbiAqIEBwYXJhbSBmbG9vckxldmVsIC0gVGhlIHtAbGluayBCdW1wTGV2ZWx9IHJlcXVpcmVkLlxuICogQHJldHVybnMgV2hldGhlciBgbGV2ZWxgIGlzIGF0IGxlYXN0IGBmbG9vckxldmVsYC5cbiAqL1xuZnVuY3Rpb24gaXNCdW1wTGV2ZWxBdExlYXN0KGxldmVsOiBCdW1wTGV2ZWwsIGZsb29yTGV2ZWw6IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yIHwgVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZsb29yTGV2ZWwgPT09IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yXG4gICAgPyBsZXZlbCA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3JcbiAgICA6IGxldmVsICE9PSBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZWxlYXNlIG9wZW5zIHRoZSBpbnRlcmFjdGl2ZSBjaGFuZ2Vsb2cgcmV2aWV3LiBQcmVwYXJlZCBub3RlcyBhcmUgYWxyZWFkeSB0aGUgcmV2aWV3ZWQgdGV4dCwgc29cbiAqIHRoZXkgbmV2ZXIgb3BlbiBhbiBlZGl0b3IsIHdoYXRldmVyIGBzaG91bGRFZGl0Q2hhbmdlbG9nYCBzYXlzLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dGaWxlUGF0aCAtIFRoZSBwcmVwYXJlZCBub3Rlcywgd2hlbiB0aGUgcmVsZWFzZSB3YXMgZ2l2ZW4gdGhlbS5cbiAqIEBwYXJhbSBzaG91bGRFZGl0Q2hhbmdlbG9nIC0gV2hldGhlciB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3IHdhcyBhc2tlZCBmb3IuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSByZXZpZXcgaXMgZHVlLlxuICovXG5mdW5jdGlvbiBpc0NoYW5nZWxvZ1Jldmlld0R1ZShjaGFuZ2Vsb2dGaWxlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzaG91bGRFZGl0Q2hhbmdlbG9nOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGFuZ2Vsb2dGaWxlUGF0aCA9PT0gdW5kZWZpbmVkICYmIHNob3VsZEVkaXRDaGFuZ2Vsb2c7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGlzc3VlIHJlZmVyZW5jZXMgb2ZmIG9uZSB7QGxpbmsgSVNTVUVfUkVGRVJFTkNFX0xJTkVfUkVHX0VYUH0gbGluZS5cbiAqXG4gKiBBIGNyb3NzLXJlcG9zaXRvcnkgcmVmZXJlbmNlIGlzIHJlbmRlcmVkIGFzIGl0cyBVUkwgcmF0aGVyIHRoYW4gYXMgYG93bmVyL3JlcG8jbmA6IEdpdEh1YiBzaG93cyB0aGUgVVJMIGFzIHRoZVxuICogc2FtZSBzaG9ydCBsaW5rLCBhbmQgdGhlIHNwZWxsY2hlY2tlciB0aGUgY2hhbmdlbG9nIHNlY3Rpb24gaXMgaGVsZCB0byBza2lwcyBhIFVSTCBidXQgbm90IGEgcmVwb3NpdG9yeSBuYW1lLlxuICpcbiAqIEBwYXJhbSBsaW5lIC0gT25lIGxpbmUgb2YgYSBjb21taXQgYm9keS5cbiAqIEByZXR1cm5zIFRoZSByZWZlcmVuY2VzLCBvciBgbnVsbGAgd2hlbiB0aGUgbGluZSBpcyBub3QgYSByZWZlcmVuY2UgbGluZSBvciBob2xkcyBhbnl0aGluZyBidXQgcmVmZXJlbmNlcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VJc3N1ZVJlZmVyZW5jZUxpbmUobGluZTogc3RyaW5nKTogSXNzdWVSZWZlcmVuY2VbXSB8IG51bGwge1xuICBjb25zdCByZWZlcmVuY2VzVGV4dCA9IElTU1VFX1JFRkVSRU5DRV9MSU5FX1JFR19FWFAuZXhlYyhsaW5lLnRyaW0oKSk/Lmdyb3Vwcz8uWydyZWZlcmVuY2VzJ107XG4gIGlmIChyZWZlcmVuY2VzVGV4dD8ucmVwbGFjZUFsbChJU1NVRV9SRUZFUkVOQ0VfUkVHX0VYUCwgJycpLnJlcGxhY2VBbGwoL1xcYmFuZFxcYnxbXFxzLF0vZywgJycpICE9PSAnJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20ocmVmZXJlbmNlc1RleHQubWF0Y2hBbGwoSVNTVUVfUkVGRVJFTkNFX1JFR19FWFApLCAobWF0Y2gpOiBJc3N1ZVJlZmVyZW5jZSA9PiB7XG4gICAgY29uc3QgYmFyZU51bWJlciA9IGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ2JhcmVOdW1iZXInKTtcbiAgICBpZiAoYmFyZU51bWJlciAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgcmVuZGVyZWQ6IGAjJHtiYXJlTnVtYmVyfWAsIHNwZWxsaW5nczogW2AjJHtiYXJlTnVtYmVyfWBdIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcG9TbHVnID0gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAndXJsU2x1ZycpID8/IGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ3NsdWcnKTtcbiAgICBjb25zdCBpc3N1ZU51bWJlciA9IGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ3VybE51bWJlcicpID8/IGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ3NsdWdOdW1iZXInKTtcbiAgICBhc3NlcnROb25OdWxsYWJsZShyZXBvU2x1Zyk7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoaXNzdWVOdW1iZXIpO1xuICAgIGNvbnN0IHVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvU2x1Z30vaXNzdWVzLyR7aXNzdWVOdW1iZXJ9YDtcbiAgICByZXR1cm4geyByZW5kZXJlZDogYDwke3VybH0+YCwgc3BlbGxpbmdzOiBbYCR7cmVwb1NsdWd9IyR7aXNzdWVOdW1iZXJ9YCwgdXJsLCBgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb1NsdWd9L3B1bGwvJHtpc3N1ZU51bWJlcn1gXSB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgc2luZ2xlIHBhY2sgcmVzdWx0IGZyb20gdGhlIG91dHB1dCBvZiBgbnBtIHBhY2sgLS1qc29uYC5cbiAqXG4gKiBUd28gdGhpbmdzIG1ha2UgdGhpcyBtb3JlIHRoYW4gYSBgSlNPTi5wYXJzZSgpYC4gVGhlIHBheWxvYWQgaXMgUFJFQ0VERUQgb24gc3Rkb3V0IGJ5IHdoYXRldmVyIHRoZVxuICogYHByZXBhcmVgIHNjcmlwdCBwcmludGVkICh0aGUgYG5wbSBub3RpY2VgIGxpbmVzIGdvIHRvIHN0ZGVyciwgbm90IGhlcmUpLCBzbyBpdHMgc3RhcnQgaGFzIHRvIGJlIGZvdW5kIOKAlFxuICogYW5kIGl0IGlzIGZvdW5kIGJ5IHBhcnNpbmcgZnJvbSBlYWNoIGNhbmRpZGF0ZSBzdGFydCByYXRoZXIgdGhhbiBieSBtYXRjaGluZyBhIGxpdGVyYWwsIGJlY2F1c2UgdGhlXG4gKiBwcmVmaXggbWF5IGl0c2VsZiBjb250YWluIGEgYnJhY2UuIEFuZCB0aGUgcGF5bG9hZCdzIFNIQVBFIGRlcGVuZHMgb24gdGhlIG5wbSBtYWpvcjogbnBtIDExIGFuZCBlYXJsaWVyXG4gKiBlbWl0IGFuIGFycmF5IG9mIHBhY2sgcmVzdWx0cywgbnBtIDEyIGVtaXRzIGFuIG9iamVjdCBrZXllZCBieSBwYWNrYWdlIG5hbWUuIEJvdGggYXJlIGFjY2VwdGVkOyBzY2FubmluZ1xuICogZm9yIHRoZSBhcnJheSdzIGxpdGVyYWwgb3BlbmluZyBpcyB3aGF0IGJyb2tlIGV2ZXJ5IHJlbGVhc2Ugb24gbnBtIDEyLlxuICpcbiAqIEBwYXJhbSBvdXRwdXQgLSBUaGUgc3Rkb3V0IG9mIGBucG0gcGFjayAtLWpzb25gLlxuICogQHJldHVybnMgVGhlIHtAbGluayBOcG1QYWNrUmVzdWx0fSBkZXNjcmliaW5nIHRoZSBwYWNrZWQgdGFyYmFsbC5cbiAqIEB0aHJvd3MgSWYgdGhlIG91dHB1dCBob2xkcyBubyBwYXJzYWJsZSBKU09OIHBheWxvYWQsIG9yIHRoZSBwYXlsb2FkIGhvbGRzIG5vIHBhY2sgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBwYXJzZU5wbVBhY2tPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBOcG1QYWNrUmVzdWx0IHtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBvdXRwdXQubWF0Y2hBbGwoL1tbe10vZykpIHtcbiAgICBsZXQgcGF5bG9hZDogdW5rbm93bjtcblxuICAgIHRyeSB7XG4gICAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShvdXRwdXQuc2xpY2UobWF0Y2guaW5kZXgpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCBhcyBOcG1QYWNrUmVzdWx0W10gOiBPYmplY3QudmFsdWVzKHBheWxvYWQgYXMgUmVjb3JkPHN0cmluZywgTnBtUGFja1Jlc3VsdD4pO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbMF07XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBubyBwYWNrIHJlc3VsdCBpbiB0aGUgYG5wbSBwYWNrIC0tanNvbmAgb3V0cHV0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZpbmQgdGhlIEpTT04gcGF5bG9hZCBpbiB0aGUgYG5wbSBwYWNrIC0tanNvbmAgb3V0cHV0Jyk7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgdGhlIGZ1bGwgbmV3IGBDSEFOR0VMT0cubWRgIGNvbnRlbnQg4oCUIGluY2x1ZGluZyB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3LCB3aGVuIG9uZSBpcyBkdWUg4oCUXG4gKiBXSVRIT1VUIHRvdWNoaW5nIHRoZSByZXBvc2l0b3J5LiBOb3RoaW5nIGhlcmUgd3JpdGVzIGludG8gdGhlIHJlcG8sIHNvIGFuIGludGVycnVwdCBhbnl3aGVyZSBpbiB0aGVcbiAqIHJldmlldyB3aW5kb3cgKHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgc3BsaXQpIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIGV4YWN0bHkgYXMgaXQgd2FzLlxuICpcbiAqIFRoZSBzZXR0bGVkIGNvbnRlbnQgaXMgaGFuZGVkIHRvIHtAbGluayBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHN9IGJlZm9yZSBpdCBpcyByZXR1cm5lZCwgd2hpY2ggaXNcbiAqIGhvdyB0aGF0IGd1YXJkIHJlYWNoZXMgZXZlcnkgY2FsbGVyIGFuZCBldmVyeSBwYXRoIOKAlCByZXZpZXdlZCBvciBub3QsIGNvbW1pdC1kZXJpdmVkIG9yIHByZXBhcmVkIOKAlCBmcm9tIGFcbiAqIHNpbmdsZSBzaXRlLlxuICpcbiAqIEl0IGlzIGFsc28gd2hlcmUgdGhlIG5ldyBzZWN0aW9uIGlzIExJTlRFRCBhbmQgU1BFTExDSEVDS0VELCBmb3IgdGhlIHNhbWUgcmVhc29uIGFuZCBvbmUgdGhlIHJlbGVhc2Unc1xuICogb3JkZXJpbmcgZm9yY2VzOiB0aGUgcmVsZWFzZSdzIG9ubHkgYGxpbnQ6bWRgIGFuZCBgc3BlbGxjaGVja2AgcnVuIGluIHRoZSBnYXRlLCB3aGljaCBpcyBvdmVyIGJlZm9yZSB0aGlzXG4gKiB0ZXh0IGV4aXN0cywgc28gZXZlcnkgY2hhcmFjdGVyIG9mIGEgbmV3IGNoYW5nZWxvZyBzZWN0aW9uIHVzZWQgdG8gZW50ZXIgdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIG9ubHlcbiAqIGNoZWNrcyB0aGF0IGNvdWxkIGhhdmUgbG9va2VkIGF0IGl0LiBUaGUgZ2VuZXJhdG9yJ3Mgb3duIGJ1bGxldHMgY2Fubm90IGZhaWwgdGhlbSDigJQgdGhleSBhcmUgb25lXG4gKiBgdG9GaXJzdExpbmVgIHBlciBjb21taXQg4oCUIGJ1dCB0aGUgdHdvIHBhdGhzIGEgaHVtYW4gb3IgYW4gYWdlbnQgd3JpdGVzLCB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3IGFuZFxuICogYC0tY2hhbmdlbG9nLWZpbGVgLCBhcmUgZXhhY3RseSB0aGUgcGF0aHMgdGhhdCBjYXJyeSBwcm9zZS4gQSBkZWZlY3QgdGhlcmUgZG9lcyBub3QgZmFpbCB0aGUgcmVsZWFzZTogaXRcbiAqIGxhbmRzIG9uIHRoZSBkZWZhdWx0IGJyYW5jaCBpbnNpZGUgdGhlIGBjaG9yZTogcmVsZWFzZWAgY29tbWl0LCBhbmQgdHVybnMgdGhlIE5FWFQgZ2F0ZSByZWQsIG9uIGEgYnJhbmNoXG4gKiBiZWxvbmdpbmcgdG8gc29tZWJvZHkgd2hvIGRpZCBub3Qgd3JpdGUgaXQuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRoZSBjaGFuZ2Vsb2cgc2VjdGlvbiBpcyB3cml0dGVuIGZvci5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zfSBjb250cm9sbGluZyB3aGVyZSB0aGUgc2VjdGlvbiBib2R5IGNvbWVzIGZyb20uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzZXR0bGVkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVDaGFuZ2Vsb2cobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2cgPSB0cnVlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBpc1Jldmlld0R1ZSA9IGlzQ2hhbmdlbG9nUmV2aWV3RHVlKGNoYW5nZWxvZ0ZpbGVQYXRoLCBzaG91bGRFZGl0Q2hhbmdlbG9nKTtcbiAgY29uc3QgbmV3Q2hhbmdlTG9nID0gaXNSZXZpZXdEdWVcbiAgICA/IGF3YWl0IGNvbXBvc2VDaGFuZ2Vsb2cobmV3VmVyc2lvbiwgY2hhbmdlbG9nRmlsZVBhdGgpXG4gICAgOiBhd2FpdCBjb21wb3NlQ2hhbmdlbG9nTm9ib2R5UmV2aWV3cyhuZXdWZXJzaW9uLCBjaGFuZ2Vsb2dGaWxlUGF0aCk7XG4gIGxldCBzZXR0bGVkQ2hhbmdlTG9nID0gbmV3Q2hhbmdlTG9nO1xuICBsZXQgZmluZGluZ3M6IENoYW5nZWxvZ0ZpbmRpbmdbXSA9IFtdO1xuXG4gIC8vIFRoZSBjaGVja3MgcnVuIG9uIHRoZSBTRVRUTEVEIHRleHQsIHNvIHRoZSByZXZpZXcgc2l0cyBpbnNpZGUgdGhlIGxvb3AgcmF0aGVyIHRoYW4gYmVmb3JlIGl0OiB0aGUgYXV0aG9yIGlzXG4gIC8vIHN0aWxsIHNpdHRpbmcgYXQgdGhlIGVkaXRvciwgc28gdGhleSBhcmUgaGFuZGVkIHRoZSBmaW5kaW5ncyBhbmQgdGhlIHNhbWUgc2NyYXRjaCBjb3B5IGJhY2suIEEgcmV2aWV3IHRoYXRcbiAgLy8gcmV0dXJucyBieXRlLWlkZW50aWNhbCB0ZXh0IGlzIHRoZSBhdXRob3IgZGVjbGluaW5nIHRvIGZpeCB0aGVtLCB3aGljaCBlbmRzIHRoZSBsb29wIGluc3RlYWQgb2YgcmVvcGVuaW5nXG4gIC8vIGZvciBldmVyLiBUaGVyZSBpcyBub2JvZHkgdG8gaGFuZCBhIGZpbmRpbmcgdG8gb24gdGhlIG90aGVyIHBhdGhzLCBzbyB0aG9zZSB0aHJvdyBvbiB0aGUgZmlyc3Qgb25lLlxuICBmb3IgKDs7KSB7XG4gICAgaWYgKGlzUmV2aWV3RHVlKSB7XG4gICAgICBjb25zdCByZXZpZXdlZENoYW5nZUxvZyA9IGF3YWl0IHJldmlld0NoYW5nZWxvZyhzZXR0bGVkQ2hhbmdlTG9nLCBmaW5kaW5ncyk7XG4gICAgICBpZiAoZmluZGluZ3MubGVuZ3RoID4gMCAmJiByZXZpZXdlZENoYW5nZUxvZyA9PT0gc2V0dGxlZENoYW5nZUxvZykge1xuICAgICAgICB0aHJvdyB0b0NoYW5nZWxvZ0ZpbmRpbmdzRXJyb3IoZmluZGluZ3MsIG5ld1ZlcnNpb24pO1xuICAgICAgfVxuXG4gICAgICBzZXR0bGVkQ2hhbmdlTG9nID0gcmV2aWV3ZWRDaGFuZ2VMb2c7XG4gICAgfVxuXG4gICAgZmluZGluZ3MgPSBhd2FpdCBnZXRDaGFuZ2Vsb2dTZWN0aW9uRmluZGluZ3Moc2V0dGxlZENoYW5nZUxvZywgbmV3VmVyc2lvbik7XG4gICAgaWYgKGZpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKCFpc1Jldmlld0R1ZSkge1xuICAgICAgdGhyb3cgdG9DaGFuZ2Vsb2dGaW5kaW5nc0Vycm9yKGZpbmRpbmdzLCBuZXdWZXJzaW9uKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgbGFzdCB0aGluZyB0aGUgY29tcG9zaXRpb24gZG9lcywgYW5kIHRoYXQgcGxhY2VtZW50IGlzIHRoZSB3aG9sZSBwb2ludDogdGhpcyBPTkUgc2l0ZSBzZWVzIHRoZVxuICAvLyBjb21taXQtZGVyaXZlZCBidWxsZXRzLCB0aGUgcHJlcGFyZWQgbm90ZXMgYW5kIHdoYXRldmVyIGEgcmV2aWV3IGxlZnQgYmVoaW5kLCBzbyB0aGUgZ3VhcmQgcnVucyB3aGV0aGVyIG9yIG5vdFxuICAvLyB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3IGRvZXMg4oCUIGFuZCB0aGUgcmV2aWV3IGlzIHByZWNpc2VseSB3aGF0IGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCBza2lwcy4gTm90aGluZyBoYXMgYmVlblxuICAvLyB3cml0dGVuIHRvIHRoZSByZXBvc2l0b3J5IHlldCBlaXRoZXIsIHNvIHRoZSB0aHJvdyBsZWF2ZXMgdGhlIHdvcmtpbmcgdHJlZSBwcmlzdGluZSBhbmQgdGhlIHJlbGVhc2UgcmUtcnVubmFibGUuXG4gIGFzc2VydENoYW5nZWxvZ0hhc05vTWVyZ2VTdWJqZWN0cyhzZXR0bGVkQ2hhbmdlTG9nLCBuZXdWZXJzaW9uKTtcbiAgYXdhaXQgYXNzZXJ0Q2hhbmdlbG9nSGFzTm9Gb3JiaWRkZW5QYXR0ZXJucyhzZXR0bGVkQ2hhbmdlTG9nLCBuZXdWZXJzaW9uKTtcbiAgcmV0dXJuIHNldHRsZWRDaGFuZ2VMb2c7XG59XG5cbi8qKlxuICogUmVhZHMgYENIQU5HRUxPRy5tZGAgYW5kIHJldHVybnMgZXZlcnl0aGluZyBiZWxvdyBpdHMgYCMgQ0hBTkdFTE9HYCBoZWFkZXIg4oCUIHNvIHRoZSBmaXJzdCBsaW5lIGlzIHRoZVxuICogbmV3ZXN0IGAjIyA8dmVyc2lvbj5gIGhlYWRpbmcsIHdoaWNoIGlzIHdoYXQgbmFtZXMgdGhlIGxhc3QgcmVsZWFzZWQgdmVyc2lvbi5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBsaW5lcywgb3IgYW4gZW1wdHkgYXJyYXkgd2hlbiB0aGUgcmVwb3NpdG9yeSBoYXMgbm8gY2hhbmdlbG9nXG4gKiB5ZXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQcmV2aW91c0NoYW5nZWxvZ0xpbmVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgSEVBREVSX0xJTkVTX0NPVU5UID0gMjtcbiAgY29uc3QgY2hhbmdlbG9nUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogUmVwb1BhdGhzLkNoYW5nZWxvZ01kIH0pO1xuICBpZiAoIWV4aXN0c1N5bmMoY2hhbmdlbG9nUGF0aCkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoY2hhbmdlbG9nUGF0aCwgJ3V0Zi04Jyk7XG4gIGNvbnN0IHByZXZpb3VzQ2hhbmdlbG9nTGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKS5zbGljZShIRUFERVJfTElORVNfQ09VTlQpO1xuICBpZiAocHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5hdCgtMSkgPT09ICcnKSB7XG4gICAgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5wb3AoKTtcbiAgfVxuXG4gIHJldHVybiBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSB0YWcgb2YgdGhlIGxhc3QgcmVsZWFzZWQgdmVyc2lvbiDigJQgdGhlIGJhc2VsaW5lIGJvdGggdGhlIGNoYW5nZWxvZyByYW5nZSBhbmQgdGhlIGJ1bXAgZmxvb3IgYXJlXG4gKiBtZWFzdXJlZCBmcm9tLCBkZXJpdmVkIG9uY2UgaGVyZSBzbyB0aG9zZSB0d28gY2FuIG5ldmVyIGRpc2FncmVlIGFib3V0IHdoaWNoIGNvbW1pdHMgYXJlIGJlaW5nIHB1Ymxpc2hlZC5cbiAqXG4gKiBBIGhlYWRpbmcgaXMgbm90IGEgdGFnLiBBIGhhbmQtd3JpdHRlbiBgIyMgMC4wLjBgIHBsYWNlaG9sZGVyIGluIGEgbmV2ZXItdGFnZ2VkIHJlcG8sIG9yIGEgdGFnIGRlbGV0ZWQgYWZ0ZXJcbiAqIHRoZSBmYWN0LCB3b3VsZCBvdGhlcndpc2UgcmVhY2ggYGdpdCBsb2dgIGFzIGEgcmV2aXNpb24gaXQgY2Fubm90IHJlc29sdmUg4oCUIGFuZCBpdCB1c2VkIHRvIHJlYWNoIGl0IGF0IHRoZVxuICogdmVyeSBFTkQgb2YgdGhlIHJlbGVhc2UsIGFmdGVyIHRoZSB3aG9sZSBwcmVmbGlnaHQgaGFkIGJlZW4gcGFpZCBmb3IuIEZhbGxpbmcgYmFjayB0byBubyBiYXNlbGluZVxuICogb3Zlci1pbmNsdWRlcyB3aGVuIGEgdGFnIHdhcyBkZWxldGVkLCBidXQgdGhhdCBpcyBzYWZlIGFuZCB2aXNpYmxlOiB0aGUgY2hhbmdlbG9nIHJldmlldyBpcyBleGFjdGx5IHdoZXJlIGFuXG4gKiBvdmVyLWluY2x1ZGVkIHJhbmdlIGdldHMgdHJpbW1lZCwgYW5kIHRoZSBidW1wIGZsb29yIGRlY2xpbmVzIHRvIGRlcml2ZSBhbnl0aGluZyBhdCBhbGwgd2l0aG91dCBhIGJhc2VsaW5lLlxuICpcbiAqIEBwYXJhbSBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzIC0gVGhlIGxpbmVzIHtAbGluayByZWFkUHJldmlvdXNDaGFuZ2Vsb2dMaW5lc30gcmV0dXJuZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB0YWcgbmFtZSwgb3IgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlcmUgaXMgbm9uZSB0byByZXNvbHZlLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlTGFzdFJlbGVhc2VkVGFnKHByZXZpb3VzQ2hhbmdlbG9nTGluZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbGFzdFRhZyA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHByZXZpb3VzQ2hhbmdlbG9nTGluZXNbMF0gPz8gJycsXG4gICAgcmVwbGFjZXI6ICcnLFxuICAgIHNlYXJjaFZhbHVlOiAnIyMgJ1xuICB9KTtcblxuICBpZiAoIWxhc3RUYWcpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCByZXNvbHZlZExhc3RUYWcgPSBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAncmV2LXBhcnNlJywgJy0tdmVyaWZ5JywgJy0tcXVpZXQnLCBgcmVmcy90YWdzLyR7bGFzdFRhZ31gXSwge1xuICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWVcbiAgfSk7XG5cbiAgaWYgKCFyZXNvbHZlZExhc3RUYWcpIHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpKFxuICAgICAgYCR7UmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBzdGFydHMgYXQgJyMjICR7bGFzdFRhZ30nLCBidXQgbm8gc3VjaCB0YWcgZXhpc3RzLiBHZW5lcmF0aW5nIHRoZSBjaGFuZ2Vsb2cgZnJvbSB0aGUgZnVsbCBoaXN0b3J5IGluc3RlYWQuYFxuICAgICk7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RUYWc7XG59XG5cbi8qKlxuICogSGFuZHMgdGhlIGNvbXBvc2VkIGNoYW5nZWxvZyB0byB0aGUgdXNlciBmb3IgcmV2aWV3IG9uIGEgc2NyYXRjaCBjb3B5IG91dHNpZGUgdGhlIHJlcG9zaXRvcnksIGFuZFxuICogcmV0dXJucyB3aGF0ZXZlciB0aGV5IGxlZnQgYmVoaW5kLiBUaGUgc2NyYXRjaCBmb2xkZXIgaXMgcmVtb3ZlZCBldmVuIHdoZW4gdGhlIHJldmlldyBmYWlscy5cbiAqXG4gKiBAcGFyYW0gbmV3Q2hhbmdlTG9nIC0gVGhlIGNvbXBvc2VkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQgdG8gaGFuZCBvdmVyIGZvciByZXZpZXcuXG4gKiBAcGFyYW0gZmluZGluZ3MgLSBUaGUgZmluZGluZ3MgdGhlIHByZXZpb3VzIHJvdW5kIG9mIHRoaXMgcmV2aWV3IGxlZnQgdW5maXhlZCwgcHJpbnRlZCBhYm92ZSB0aGUgcHJvbXB0IHNvXG4gKiB0aGUgYXV0aG9yIHNlZXMgd2hhdCBoYXMgdG8gY2hhbmdlLiBFbXB0eSBvbiB0aGUgZmlyc3Qgcm91bmQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXZpZXdlZCBjb250ZW50LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXZpZXdDaGFuZ2Vsb2cobmV3Q2hhbmdlTG9nOiBzdHJpbmcsIGZpbmRpbmdzOiBDaGFuZ2Vsb2dGaW5kaW5nW10pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBzY3JhdGNoRm9sZGVyID0gYXdhaXQgbWtkdGVtcChqb2luKHRtcGRpcigpLCAnY2hhbmdlbG9nLScpKTtcbiAgY29uc3Qgc2NyYXRjaENoYW5nZWxvZ1BhdGggPSBqb2luKHNjcmF0Y2hGb2xkZXIsIFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB3cml0ZUZpbGUoc2NyYXRjaENoYW5nZWxvZ1BhdGgsIG5ld0NoYW5nZUxvZywgJ3V0Zi04Jyk7XG5cbiAgICBjb25zdCBjb2RlVmVyc2lvbiA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnY29kZSAtLXZlcnNpb24nLCB7XG4gICAgICBpc1F1aWV0OiB0cnVlLFxuICAgICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWVcbiAgICB9KTtcbiAgICBjb25zdCB2ZXJzaW9uRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpO1xuICAgIGlmIChmaW5kaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICB2ZXJzaW9uRGVidWdnZXIoXG4gICAgICAgIGAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gZG9lcyBub3QgcGFzcyAke3RvRmFpbGVkU2NyaXB0TmFtZXMoZmluZGluZ3MpfSB5ZXQ6XFxuJHt0b0ZpbmRpbmdMaW5lcyhmaW5kaW5ncyl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29kZVZlcnNpb24pIHtcbiAgICAgIHZlcnNpb25EZWJ1Z2dlcihgUGxlYXNlIHVwZGF0ZSB0aGUgJHtSZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IGZpbGUuIENsb3NlIFZpc3VhbCBTdHVkaW8gQ29kZSB3aGVuIHlvdSBhcmUgZG9uZS4uLmApO1xuICAgICAgYXdhaXQgZXhlY0Zyb21Sb290KFsnY29kZScsICctdycsIHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoXSwge1xuICAgICAgICBpc1F1aWV0OiB0cnVlLFxuICAgICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZlcnNpb25EZWJ1Z2dlcignQ291bGQgbm90IGZpbmQgVmlzdWFsIFN0dWRpbyBDb2RlIGluIHlvdXIgUEFUSC4gVXNpbmcgY29uc29sZSBtb2RlIGluc3RlYWQuJyk7XG4gICAgICBhd2FpdCBjcmVhdGVJbnRlcmZhY2UocHJvY2Vzcy5zdGRpbiwgcHJvY2Vzcy5zdGRvdXQpLnF1ZXN0aW9uKFxuICAgICAgICBgUGxlYXNlIHVwZGF0ZSB0aGUgJHtzY3JhdGNoQ2hhbmdlbG9nUGF0aH0gZmlsZS4gUHJlc3MgRW50ZXIgd2hlbiB5b3UgYXJlIGRvbmUuLi5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCByZWFkRmlsZShzY3JhdGNoQ2hhbmdlbG9nUGF0aCwgJ3V0Zi04Jyk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcm0oc2NyYXRjaEZvbGRlciwge1xuICAgICAgZm9yY2U6IHRydWUsXG4gICAgICByZWN1cnNpdmU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZXJyb3IgdGhhdCByZWZ1c2VzIGEgYnVtcCBsb3dlciB0aGFuIHRoZSByYW5nZSBmb3JjZXMuXG4gKlxuICogSXQgbmFtZXMgZXZlcnkgZm9yY2luZyBjb21taXQgd2l0aCBpdHMgc2hvcnQgaGFzaCwgaXRzIHN1YmplY3QgYW5kIFdISUNIIG1hcmtlciBmb3JjZWQgaXQsIGJlY2F1c2UgdGhlXG4gKiByZW1lZHkgZGVwZW5kcyBvbiB0aGF0OiBhIGBmZWF0IWAgaXMgYSBkZWxpYmVyYXRlIGJyZWFrIHNvbWVib2R5IHR5cGVkLCB3aGlsZSBhIGBCUkVBS0lORyBDSEFOR0U6YCBmb290ZXJcbiAqIHNpdHMgaW4gYSBib2R5IG5vYm9keSByZS1yZWFkcyBhbmQgaXMgZXhhY3RseSB0aGUgdGhpbmcgdGhpcyBnYXRlIGV4aXN0cyB0byBzdXJmYWNlLiBUaGUgaW5zdHJ1Y3Rpb24gaXMgdG9cbiAqIHRha2UgdGhlIGhpZ2hlciBidW1wLCBub3QgdG8gZWRpdCB0aGUgY29tbWl0cyDigJQgaGlzdG9yeSB0aGF0IGFscmVhZHkgcmVhY2hlZCB0aGUgZGVmYXVsdCBicmFuY2ggaXMgd2hhdCBhXG4gKiByZWxlYXNlIHB1Ymxpc2hlcywgYW5kIHJld3JpdGluZyBpdCB0byBkb2RnZSBhIHZlcnNpb24gc2lnbmFsIGlzIHRoZSBkZWZlY3Qgb25lIGxldmVsIHVwLlxuICpcbiAqIEBwYXJhbSBidW1wRmxvb3IgLSBUaGUgZGVyaXZlZCB7QGxpbmsgQnVtcEZsb29yfS5cbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHtAbGluayBCdW1wRmxvb3JSZWZ1c2FsQ29udGV4dH0gZGVzY3JpYmluZyB3aGF0IHdhcyBhc2tlZCBmb3IuXG4gKiBAcmV0dXJucyBUaGUgZXJyb3IgdG8gdGhyb3cuXG4gKi9cbmZ1bmN0aW9uIHRvQnVtcEZsb29yRXJyb3IoYnVtcEZsb29yOiBCdW1wRmxvb3IsIGNvbnRleHQ6IEJ1bXBGbG9vclJlZnVzYWxDb250ZXh0KTogRXJyb3Ige1xuICBjb25zdCBmb3JjaW5nTGluZXMgPSBidW1wRmxvb3IuZm9yY2luZ0NvbW1pdHNcbiAgICAubWFwKChmb3JjaW5nQ29tbWl0KSA9PiBgICAke2ZvcmNpbmdDb21taXQuc2hhLnNsaWNlKDAsIFNIT1JUX1NIQV9MRU5HVEgpfSAgJHtmb3JjaW5nQ29tbWl0LnN1YmplY3R9ICAoJHtmb3JjaW5nQ29tbWl0Lm1hcmtlcn0pYClcbiAgICAuam9pbignXFxuJyk7XG5cbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBgVGhlIGNvbW1pdHMgc2luY2UgJHtjb250ZXh0Lmxhc3RUYWd9IGZvcmNlIGF0IGxlYXN0IGEgJHtidW1wRmxvb3IubGV2ZWx9IHJlbGVhc2UsIGJ1dCAnJHtjb250ZXh0LnZlcnNpb25VcGRhdGVUeXBlfScgd291bGQgcHVibGlzaGBcbiAgICAgICsgYCAke2NvbnRleHQubmV3VmVyc2lvbn0sIHdoaWNoIGlzIGEgJHtjb250ZXh0LnRha2VuTGV2ZWx9LlxcbmBcbiAgICAgICsgYCR7Zm9yY2luZ0xpbmVzfVxcbmBcbiAgICAgICsgJ0EgcmVsZWFzZSBwdWJsaXNoZXMgZXZlcnkgY29tbWl0IHNpbmNlIHRoZSBsYXN0IHRhZywgbm90IHRoZSBjaGFuZ2UgeW91IGhhcHBlbiB0byBiZSB3b3JraW5nIG9uLCBzbyB0aGUnXG4gICAgICArICcgYnVtcCBoYXMgdG8gYW5zd2VyIGZvciBhbGwgb2YgdGhlbS4gUmUtcnVuIHRoZSByZWxlYXNlIHdpdGggYSdcbiAgICAgICsgYCAke2J1bXBGbG9vci5sZXZlbH0gYnVtcCDigJQgYSBoaWdoZXIgb25lIGlzIGFsd2F5cyBhY2NlcHRlZCwgYW5kIG5vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbiB5ZXQuYFxuICApO1xufVxuXG4vKipcbiAqIFR1cm5zIG9uZSBmdWxsIGNvbW1pdCBtZXNzYWdlIChgZ2l0IGxvZyAtLWZvcm1hdD0lQmApIGludG8gdGhlIGNoYW5nZWxvZyBsaW5lIGl0IHNob3VsZCBjb250cmlidXRlLlxuICpcbiAqIE5vcm1hbGx5IHRoYXQgaXMgdGhlIHN1YmplY3QuIFRoZSBleGNlcHRpb24gaXMgYSBtZXJnZSB3aG9zZSBzdWJqZWN0IGdpdCB3cm90ZSBpdHNlbGY6IGZvciBhIG5vbi1mZiBtZXJnZVxuICogdGhlIGZpcnN0LXBhcmVudCBjb21taXQgSVMgdGhlIG1lcmdlIGNvbW1pdCwgc28gaXRzIHN1YmplY3QgaXMgd2hhdCBzaGlwcywgYW5kIGEgZGVmYXVsdCBvbmUgcHVibGlzaGVzIGFcbiAqIHByaXZhdGUgYnJhbmNoIG5hbWUgYXMgYSBjaGFuZ2Vsb2cgZW50cnkuIFRoZSBtZXNzYWdlIHRoZSBhdXRob3IgYWN0dWFsbHkgd3JvdGUgaXMgdXN1YWxseSBzdGlsbCB0aGVyZSDigJRcbiAqIG9uZSBsaW5lIGJlbG93LCBhcyB0aGUgbWVyZ2UgYm9keSDigJQgc28gaXQgaXMgbGlmdGVkIG91dCByYXRoZXIgdGhhbiBkaXNjYXJkZWQsIHdoaWNoIGlzIGV4YWN0bHkgdGhlIGVkaXQgYVxuICogaHVtYW4gbWFrZXMgYnkgaGFuZCBhdCB0aGUgcmV2aWV3IHN0ZXAuIEEgbWVyZ2Ugd2l0aCBubyBib2R5IGhhcyBub3RoaW5nIHRvIGxpZnQgYW5kIGtlZXBzIGl0cyBzdWJqZWN0O1xuICoge0BsaW5rIGFzc2VydENoYW5nZWxvZ0hhc05vTWVyZ2VTdWJqZWN0c30gaXMgd2hhdCBzdG9wcyB0aGF0IG9uZSBmcm9tIGJlaW5nIHB1Ymxpc2hlZC5cbiAqXG4gKiBUaGUgaXNzdWVzIHRoZSBib2R5IG5hbWVzIG9uIHtAbGluayBJU1NVRV9SRUZFUkVOQ0VfTElORV9SRUdfRVhQfSBsaW5lcyBhcmUgYXBwZW5kZWQgdG8gdGhlIGxpbmUsIHNvIHRoZVxuICogcmVsZWFzZSBsaW5rcyB0aGVtLiBPbmx5IHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0J3MgYm9keSBpcyByZWFkLCBzbyBmb3IgYSBtZXJnZSBpdCBpcyB0aGUgbWVyZ2UgbWVzc2FnZSB0aGF0XG4gKiBoYXMgdG8gY2FycnkgdGhlbS4gQSByZWZlcmVuY2UgdGhlIGxpbmUgYWxyZWFkeSBzaG93cyBpcyBub3QgcmVwZWF0ZWQuXG4gKlxuICogQHBhcmFtIGNvbW1pdE1lc3NhZ2UgLSBUaGUgZnVsbCBjb21taXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIFRoZSBjaGFuZ2Vsb2cgbGluZSBmb3IgdGhhdCBjb21taXQuXG4gKi9cbmZ1bmN0aW9uIHRvQ2hhbmdlbG9nRW50cnkoY29tbWl0TWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSBjb21taXRNZXNzYWdlLnNwbGl0KC9cXHI/XFxuLykuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBzdWJqZWN0ID0gbGluZXNbMF0gPz8gJyc7XG4gIGNvbnN0IGJvZHlMaW5lcyA9IGxpbmVzLnNsaWNlKDEpO1xuICBjb25zdCBlbnRyeSA9IE1FUkdFX1NVQkpFQ1RfUkVHX0VYUC50ZXN0KHN1YmplY3QpID8gYm9keUxpbmVzLmZpbmQoKGxpbmUpID0+ICFwYXJzZUlzc3VlUmVmZXJlbmNlTGluZShsaW5lKSkgPz8gc3ViamVjdCA6IHN1YmplY3Q7XG4gIGNvbnN0IHJlZmVyZW5jZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgYm9keUxpbmVzLmZsYXRNYXAoKGxpbmUpID0+IHBhcnNlSXNzdWVSZWZlcmVuY2VMaW5lKGxpbmUpID8/IFtdKSkge1xuICAgIGlmIChyZWZlcmVuY2Uuc3BlbGxpbmdzLmV2ZXJ5KChzcGVsbGluZykgPT4gIW5ldyBSZWdFeHAoU3RyaW5nLnJhd2AoPzwhW1xcdy9dKSR7ZXNjYXBlUmVnRXhwKHNwZWxsaW5nKX0oPyFcXGQpYCkudGVzdChlbnRyeSkpKSB7XG4gICAgICByZWZlcmVuY2VzLmFkZChyZWZlcmVuY2UucmVuZGVyZWQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVmZXJlbmNlcy5zaXplID09PSAwID8gZW50cnkgOiBgJHtlbnRyeX0gKCR7Wy4uLnJlZmVyZW5jZXNdLmpvaW4oJywgJyl9KWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBlcnJvciB0aGF0IHN0b3BzIGEgcmVsZWFzZSB3aG9zZSBuZXcgY2hhbmdlbG9nIHNlY3Rpb24gZG9lcyBub3QgcGFzcyBgbGludDptZGAgb3IgYHNwZWxsY2hlY2tgLlxuICpcbiAqIEl0IGlzIHRocm93biBmcm9tIHRoZSBjb21wb3NpdGlvbiBzdGVwLCB3aGljaCBpcyBCRUZPUkUgYW55dGhpbmcgaXMgd3JpdHRlbiwgc28gdGhlIHJlY292ZXJ5IGl0IGRlc2NyaWJlcyBpc1xuICogdGhlIHdob2xlIHJlY292ZXJ5OiB0aGVyZSBpcyBub3RoaW5nIHRvIHJldmVydCwgYW5kIHRoZSByZWxlYXNlIHJlLXJ1bnMgZnJvbSB0aGUgdG9wLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncywgYXMge0BsaW5rIGdldENoYW5nZWxvZ1NlY3Rpb25GaW5kaW5nc30gY29sbGVjdGVkIHRoZW0uXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gd2FzIGJlaW5nIHB1Ymxpc2hlZC5cbiAqIEByZXR1cm5zIFRoZSBlcnJvciB0byB0aHJvdy5cbiAqL1xuZnVuY3Rpb24gdG9DaGFuZ2Vsb2dGaW5kaW5nc0Vycm9yKGZpbmRpbmdzOiBDaGFuZ2Vsb2dGaW5kaW5nW10sIHZlcnNpb246IHN0cmluZyk6IEVycm9yIHtcbiAgY29uc3Qgc2NyaXB0TmFtZXMgPSB0b0ZhaWxlZFNjcmlwdE5hbWVzKGZpbmRpbmdzKTtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBgVGhlICR7dmVyc2lvbn0gc2VjdGlvbiBvZiAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gZG9lcyBub3QgcGFzcyAke3NjcmlwdE5hbWVzfTpcXG5gXG4gICAgICArIGAke3RvRmluZGluZ0xpbmVzKGZpbmRpbmdzKX1cXG5gXG4gICAgICArICdUaGUgY2hhbmdlbG9nIGlzIHNldHRsZWQgYmVmb3JlIGl0IGlzIHdyaXR0ZW4sIHNvIHRoaXMgc3RvcHMgdGhlIHJlbGVhc2Ugd2l0aCB0aGUgcmVwb3NpdG9yeSB1bnRvdWNoZWQnXG4gICAgICArICcgYW5kIG5vdGhpbmcgdG8gcmV2ZXJ0LiBUaGUgbGluZSBudW1iZXJzIGFyZSB0aGUgb25lcyB0aGUgd3JpdHRlbiBmaWxlIHdvdWxkIGhhdmUgaGFkLiBGaXggdGhlIHJlbGVhc2UnXG4gICAgICArICcgbm90ZXMg4oCUIGluIHRoZSBwcmVwYXJlZCBub3RlcyBmaWxlLCBvciBpbiB0aGUgY29tbWl0IG1lc3NhZ2VzIHRoZXkgd2VyZSBnZW5lcmF0ZWQgZnJvbSDigJQgb3IsIGZvciBhIHdvcmQnXG4gICAgICArICcgdGhpcyBwcm9qZWN0IHJlYWxseSBkb2VzIHVzZSwgYWRkIGl0IHRvIHRoZSBwcm9qZWN0XFwncyBgY3NwZWxsYCBjb25maWd1cmF0aW9uLCBhbmQgcmUtcnVuIHRoZSByZWxlYXNlLidcbiAgICAgICsgJyBSZWxlYXNpbmcgYW55d2F5IHdvdWxkIGxhbmQgdGhlIGRlZmVjdCBvbiB0aGUgZGVmYXVsdCBicmFuY2ggaW5zaWRlIHRoZSByZWxlYXNlIGNvbW1pdCwgd2hlcmUgdGhlIG5leHQnXG4gICAgICArIGAgJHtzY3JpcHROYW1lc30gb24gYW55b25lJ3MgYnJhbmNoIHJlcG9ydHMgaXQuYFxuICApO1xufVxuXG4vKipcbiAqIFdyYXBzIG9uZSB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24gaW4gdGhlIG1pbmltYWwgZG9jdW1lbnQgdGhlIGNoZWNrcyBhcmUgaGFuZGVkLlxuICpcbiAqIFRoZSBzZWN0aW9uIGdvZXMgaW5zaWRlIGEgZG9jdW1lbnQgcmF0aGVyIHRoYW4gb24gaXRzIG93biwgc28gdGhlIGhlYWRpbmcgYW5kIGxpc3QgcnVsZXMgc2VlIHRoZVxuICogY29udGV4dCB0aGV5IG5lZWQgKGEgZG9jdW1lbnQgd2hvc2UgZmlyc3QgbGluZSBpcyBhIGxpc3QgaXRlbSBpcyBhIGRpZmZlcmVudCBkb2N1bWVudCkuIFRoZSBsaW5lIG51bWJlcnMgYVxuICogZmluZGluZyByZXBvcnRzIGFyZSB0aGVuIHRoZSBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCdzIG93biwgd2hpY2ggaXMgbm90IGEgY29pbmNpZGVuY2UgYW5kIGlzIHdvcnRoIGtlZXBpbmc6XG4gKiBhIHNlY3Rpb24gaXMgUFJFUEVOREVELCBzbyB0aGlzIGRvY3VtZW50IGlzIGNoYXJhY3Rlci1mb3ItY2hhcmFjdGVyIHRoZSBoZWFkIG9mIHRoZSBmaWxlIGFib3V0IHRvIGJlIHdyaXR0ZW4uXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0NvbnRlbnQgLSBUaGUgZnVsbCBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50LlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiB3aG9zZSBzZWN0aW9uIGlzIGFib3V0IHRvIGJlIHB1Ymxpc2hlZC5cbiAqIEByZXR1cm5zIFRoZSBtaW5pbWFsIGRvY3VtZW50IHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiB0b0NoYW5nZWxvZ1NlY3Rpb25Eb2N1bWVudChjaGFuZ2Vsb2dDb250ZW50OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhlYWRpbmcgPSBgIyBDSEFOR0VMT0dcXG5cXG4jIyAke3ZlcnNpb259YDtcbiAgY29uc3Qgc2VjdGlvbiA9IGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNoYW5nZWxvZ0NvbnRlbnQsIHZlcnNpb24pO1xuICAvLyBBbiBlbXB0eSBzZWN0aW9uIGlzIGEgcmVhbCBzaGFwZSDigJQgYSByZWxlYXNlIHdpdGggbm8gY29tbWl0cyB0byBkZXNjcmliZSwgb3IgcHJlcGFyZWQgbm90ZXMgdGhhdCBhcmUgYW5cbiAgLy8gZW1wdHkgZmlsZSDigJQgYW5kIGFwcGVuZGluZyBhIGJsYW5rIGJvZHkgdG8gdGhlIGhlYWRpbmcgd291bGQgcmVwb3J0IGEgZGVmZWN0IHRoaXMgcmVsZWFzZSBkaWQgbm90IGNvbW1pdC5cbiAgcmV0dXJuIHNlY3Rpb24gPT09ICcnID8gYCR7aGVhZGluZ31cXG5gIDogYCR7aGVhZGluZ31cXG5cXG4ke3NlY3Rpb259XFxuYDtcbn1cblxuLyoqXG4gKiBSZWFkcyBvZmYgd2hpY2ggcmVsZWFzZSBsaW5lIGEgdmVyc2lvbiBhY3R1YWxseSBtb3ZlcywgcmVsYXRpdmUgdG8gdGhlIGJhc2VsaW5lIGl0IGlzIGJlaW5nIGN1dCBmcm9tLlxuICpcbiAqIFRoaXMgaXMgbWVhc3VyZWQgcmF0aGVyIHRoYW4gcmVhZCBvZmYgdGhlIHJlcXVlc3RlZCB0eXBlIG9uIHB1cnBvc2UsIGJlY2F1c2UgdGhlIHR5cGUgZG9lcyBub3QgYWx3YXlzIHNheS5cbiAqIGBwcmVyZWxlYXNlYCBhZHZhbmNlcyB3aGljaGV2ZXIgbGluZSBhbiBlYXJsaWVyIGBwcmVtYWpvcmAgb3IgYHByZW1pbm9yYCBhbHJlYWR5IGNob3NlLCBhbmQgYW4gZXhwbGljaXRcbiAqIGB4LnkuemAgc2F5cyBub3RoaW5nIGF0IGFsbCB1bnRpbCBpdCBpcyBjb21wYXJlZC4gVGFraW5nIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcmVzdWx0aW5nIHZlcnNpb24gYW5zd2VycyBhbGxcbiAqIG9mIHRoZW0gd2l0aCBvbmUgcnVsZSDigJQgYW5kIGl0IGFuc3dlcnMgdGhlbSB0aGUgd2F5IGEgY29uc3VtZXIncyBjYXJldCByYW5nZSBzZWVzIGl0LCB3aGljaCBpcyB0aGUgb25seVxuICogcmVhZGluZyB0aGF0IG1hdHRlcnMgZm9yIGEgcHVibGlzaGVkIHN1cmZhY2UuXG4gKlxuICogQHBhcmFtIGJhc2VWZXJzaW9uIC0gVGhlIHByZXZpb3VzIHJlbGVhc2VkIHZlcnNpb24uXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSB2ZXJzaW9uIGFib3V0IHRvIGJlIHB1Ymxpc2hlZC5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgQnVtcExldmVsfSwgb3IgYG51bGxgIHdoZW4gZWl0aGVyIHZlcnNpb24gaXMgbm90IHBhcnNhYmxlIGFzIHNlbXZlci5cbiAqL1xuZnVuY3Rpb24gdG9FZmZlY3RpdmVCdW1wTGV2ZWwoYmFzZVZlcnNpb246IHN0cmluZywgbmV3VmVyc2lvbjogc3RyaW5nKTogQnVtcExldmVsIHwgbnVsbCB7XG4gIGNvbnN0IGJhc2UgPSBwYXJzZShiYXNlVmVyc2lvbik7XG4gIGNvbnN0IG5leHQgPSBwYXJzZShuZXdWZXJzaW9uKTtcbiAgaWYgKCFiYXNlIHx8ICFuZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobmV4dC5tYWpvciA+IGJhc2UubWFqb3IpIHtcbiAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3I7XG4gIH1cblxuICByZXR1cm4gbmV4dC5taW5vciA+IGJhc2UubWlub3IgPyBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vciA6IFZlcnNpb25VcGRhdGVUeXBlLlBhdGNoO1xufVxuXG4vKipcbiAqIE5hbWVzIHRoZSBucG0gc2NyaXB0cyB0aGF0IGFjdHVhbGx5IHJlcG9ydGVkIHNvbWV0aGluZywgaW4gdGhlIG9yZGVyIHRoZXkgcmFuLlxuICpcbiAqIE5hbWluZyBib3RoIHVuY29uZGl0aW9uYWxseSB3b3VsZCBiZSB0aGUgZWFzeSB2ZXJzaW9uIGFuZCB3b3VsZCBiZSBhIGxpZSBoYWxmIHRoZSB0aW1lOiBhIHJlbGVhc2Ugc3RvcHBlZCBieVxuICogYSBjb2luZWQgd29yZCB3b3VsZCB0ZWxsIGl0cyBhdXRob3IgdG8gZ28gYW5kIGxvb2sgYXQgYGxpbnQ6bWRgLCB3aGljaCBwYXNzZWQuXG4gKlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzIHRvIG5hbWUgdGhlIHNjcmlwdHMgb2YuXG4gKiBAcmV0dXJucyBUaGUgc2NyaXB0IG5hbWVzLCBqb2luZWQgZm9yIHByb3NlIOKAlCBgbGludDptZGAsIGBzcGVsbGNoZWNrYCwgb3IgYGxpbnQ6bWQgYW5kIHNwZWxsY2hlY2tgLlxuICovXG5mdW5jdGlvbiB0b0ZhaWxlZFNjcmlwdE5hbWVzKGZpbmRpbmdzOiBDaGFuZ2Vsb2dGaW5kaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBzY3JpcHROYW1lcyA9IFtMSU5UX01EX1NDUklQVF9OQU1FLCBTUEVMTENIRUNLX1NDUklQVF9OQU1FXS5maWx0ZXIoKHNjcmlwdE5hbWUpID0+IGZpbmRpbmdzLnNvbWUoKGZpbmRpbmcpID0+IGZpbmRpbmcuc2NyaXB0TmFtZSA9PT0gc2NyaXB0TmFtZSkpO1xuICByZXR1cm4gc2NyaXB0TmFtZXMuam9pbignIGFuZCAnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBmaW5kaW5ncyBmb3IgYSBtZXNzYWdlLCBlYWNoIGxpbmUgdGFnZ2VkIHdpdGggdGhlIHNjcmlwdCB0aGF0IHJlcG9ydGVkIGl0LlxuICpcbiAqIFRoZSB0YWcgaXMgbm90IGRlY29yYXRpb246IHRoZSB0d28gdG9vbHMnIG91dHB1dCBzaGFwZXMgYXJlIHNpbWlsYXIgZW5vdWdoIHRvIGJlIG1pc3Rha2VuIGZvciBlYWNoIG90aGVyLFxuICogYW5kIHRoZSBmaXggZm9yIG9uZSBpcyBub3QgdGhlIGZpeCBmb3IgdGhlIG90aGVyLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0byByZW5kZXIuXG4gKiBAcmV0dXJucyBUaGUgcmVuZGVyZWQgbGluZXMsIG9uZSBmaW5kaW5nIHBlciBsaW5lLlxuICovXG5mdW5jdGlvbiB0b0ZpbmRpbmdMaW5lcyhmaW5kaW5nczogQ2hhbmdlbG9nRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZpbmRpbmdzLm1hcCgoZmluZGluZykgPT4gYFske2ZpbmRpbmcuc2NyaXB0TmFtZX1dICR7ZmluZGluZy50ZXh0fWApLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIENsYXNzaWZpZXMgb25lIGBnaXQgbG9nIC0tZm9ybWF0PSVIJW4lQiAtemAgcmVjb3JkIGludG8gdGhlIHtAbGluayBGb3JjaW5nQ29tbWl0fSBpdCBpcywgb3IgYG51bGxgIHdoZW4gaXRcbiAqIGZvcmNlcyBub3RoaW5nLlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBPbmUgTlVMLWRlbGltaXRlZCByZWNvcmQ6IHRoZSBmdWxsIGhhc2ggb24gdGhlIGZpcnN0IGxpbmUsIHRoZSBmdWxsIGNvbW1pdCBtZXNzYWdlIGJlbG93IGl0LlxuICogQHJldHVybnMgVGhlIHtAbGluayBGb3JjaW5nQ29tbWl0fSwgb3IgYG51bGxgIGZvciBhIHJlY29yZCB0aGF0IGNvbnN0cmFpbnMgbm90aGluZyBvciBpcyBub3QgYSByZWNvcmQgYXQgYWxsXG4gKiAodGhlIHRyYWlsaW5nIGVtcHR5IHN0cmluZyBgLXpgIG91dHB1dCBlbmRzIHdpdGgsIGFtb25nIG90aGVycykuXG4gKi9cbmZ1bmN0aW9uIHRvRm9yY2luZ0NvbW1pdChyZWNvcmQ6IHN0cmluZyk6IEZvcmNpbmdDb21taXQgfCBudWxsIHtcbiAgLy8gVGhlIHRyYWlsaW5nIGVtcHR5IHJlY29yZCBgLXpgIGxlYXZlcyBoYXMgbm8gaGFzaCwgYW5kIGEgcmVjb3JkIHdpdGggbm8gbGluZSB1bmRlciB0aGUgaGFzaCBpcyBub3Qgb25lXG4gIC8vIHRoaXMgY2FuIGNsYXNzaWZ5LiBCb3RoIGFyZSB0aGUgc2FtZSBub24tYW5zd2VyLlxuICBjb25zdCBbc2hhLCBzdWJqZWN0TGluZSwgLi4uYm9keUxpbmVzXSA9IHJlY29yZC5zcGxpdCgnXFxuJyk7XG4gIGlmICghc2hhIHx8IHN1YmplY3RMaW5lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHN1YmplY3QgPSBzdWJqZWN0TGluZS50cmltKCk7XG4gIGNvbnN0IGJvZHkgPSBib2R5TGluZXMuam9pbignXFxuJyk7XG4gIGNvbnN0IHN1YmplY3RNYXRjaCA9IENPTlZFTlRJT05BTF9DT01NSVRfU1VCSkVDVF9SRUdfRVhQLmV4ZWMoc3ViamVjdCk7XG5cbiAgaWYgKHN1YmplY3RNYXRjaD8uZ3JvdXBzPy5bJ2JyZWFraW5nJ10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGV2ZWw6IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yLFxuICAgICAgbWFya2VyOiBCUkVBS0lOR19NQVJLRVIsXG4gICAgICBzaGEsXG4gICAgICBzdWJqZWN0XG4gICAgfTtcbiAgfVxuXG4gIGlmIChCUkVBS0lOR19DSEFOR0VfRk9PVEVSX1JFR19FWFAudGVzdChib2R5KSkge1xuICAgIHJldHVybiB7XG4gICAgICBsZXZlbDogVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3IsXG4gICAgICBtYXJrZXI6IEJSRUFLSU5HX0NIQU5HRV9GT09URVJfTUFSS0VSLFxuICAgICAgc2hhLFxuICAgICAgc3ViamVjdFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3ViamVjdE1hdGNoPy5ncm91cHM/LlsndHlwZSddPy50b0xvd2VyQ2FzZSgpID09PSBGRUFUX1RZUEVcbiAgICA/IHtcbiAgICAgIGxldmVsOiBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vcixcbiAgICAgIG1hcmtlcjogRkVBVF9UWVBFX01BUktFUixcbiAgICAgIHNoYSxcbiAgICAgIHN1YmplY3RcbiAgICB9XG4gICAgOiBudWxsO1xufVxuXG4vKipcbiAqIFJlZHVjZXMgdGhlIGNvbW1pdHMgdGhhdCBmb3JjZSBzb21ldGhpbmcgdG8gdGhlIG9uZSBmbG9vciB0aGUgcmFuZ2UgYXMgYSB3aG9sZSBoYXMgdG8gY2xlYXIuXG4gKlxuICogQHBhcmFtIGZvcmNpbmdDb21taXRzIC0gVGhlIHtAbGluayBGb3JjaW5nQ29tbWl0fXMgZm91bmQgaW4gdGhlIHJhbmdlLlxuICogQHJldHVybnMgVGhlIGhpZ2hlc3Qge0BsaW5rIEJ1bXBMZXZlbH0gYW55IG9mIHRoZW0gZm9yY2VzLCBvciB7QGxpbmsgVmVyc2lvblVwZGF0ZVR5cGUuUGF0Y2h9IOKAlCBub1xuICogY29uc3RyYWludCDigJQgd2hlbiB0aGVyZSBhcmUgbm9uZS5cbiAqL1xuZnVuY3Rpb24gdG9IaWdoZXN0QnVtcExldmVsKGZvcmNpbmdDb21taXRzOiByZWFkb25seSBGb3JjaW5nQ29tbWl0W10pOiBCdW1wTGV2ZWwge1xuICBpZiAoZm9yY2luZ0NvbW1pdHMuc29tZSgoZm9yY2luZ0NvbW1pdCkgPT4gZm9yY2luZ0NvbW1pdC5sZXZlbCA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3IpKSB7XG4gICAgcmV0dXJuIFZlcnNpb25VcGRhdGVUeXBlLk1ham9yO1xuICB9XG5cbiAgcmV0dXJuIGZvcmNpbmdDb21taXRzLmxlbmd0aCA+IDAgPyBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vciA6IFZlcnNpb25VcGRhdGVUeXBlLlBhdGNoO1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgY29tcG9zZWQgY2hhbmdlbG9nIGludG8gdGhlIHJlcG9zaXRvcnkuIERlbGliZXJhdGVseSB0aGUgbGFzdCB0aGluZyB0aGUgY2hhbmdlbG9nIHN0ZXAgZG9lcyxcbiAqIHNvIG5vdGhpbmcgbGFuZHMgb24gZGlzayB1bnRpbCB0aGUgY29udGVudCBpcyBzZXR0bGVkLlxuICpcbiAqIEBwYXJhbSBuZXdDaGFuZ2VMb2cgLSBUaGUgc2V0dGxlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IHRvIHdyaXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBjaGFuZ2Vsb2cgaGFzIGJlZW4gd3JpdHRlbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVDaGFuZ2Vsb2cobmV3Q2hhbmdlTG9nOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgd3JpdGVGaWxlKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogUmVwb1BhdGhzLkNoYW5nZWxvZ01kIH0pLCBuZXdDaGFuZ2VMb2csICd1dGYtOCcpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVlBLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsWUFBWTtBQUNyQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGNBQWM7QUFDdkIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxpQkFBaUI7QUFDMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBSVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBQ3JCLFNBQVMseUJBQXlCO0FBQ2xDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FB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QztBQUNqRSxRQUFNLGNBQWMsQ0FBQyxxQkFBcUIsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLGVBQWUsU0FBUyxLQUFLLENBQUMsWUFBWSxRQUFRLGVBQWUsVUFBVSxDQUFDO0FBQ3RKLFNBQU8sWUFBWSxLQUFLLE9BQU87QUFDakM7QUFXQSxTQUFTLGVBQWUsVUFBc0M7QUFDNUQsU0FBTyxTQUFTLElBQUksQ0FBQyxZQUFZLElBQUksUUFBUSxVQUFVLEtBQUssUUFBUSxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUk7QUFDdkY7QUFVQSxTQUFTLGdCQUFnQixRQUFzQztBQUc3RCxRQUFNLENBQUMsS0FBSyxhQUFhLEdBQUcsU0FBUyxJQUFJLE9BQU8sTUFBTSxJQUFJO0FBQzFELE1BQUksQ0FBQyxPQUFPLGdCQUFnQixRQUFXO0FBQ3JDLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxVQUFVLFlBQVksS0FBSztBQUNqQyxRQUFNLE9BQU8sVUFBVSxLQUFLLElBQUk7QUFDaEMsUUFBTSxlQUFlLG9DQUFvQyxLQUFLLE9BQU87QUFFckUsTUFBSSxjQUFjLFNBQVMsVUFBVSxHQUFHO0FBQ3RDLFdBQU87QUFBQSxNQUNMLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSwrQkFBK0IsS0FBSyxJQUFJLEdBQUc7QUFDN0MsV0FBTztBQUFBLE1BQ0wsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1I7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLGNBQWMsU0FBUyxNQUFNLEdBQUcsWUFBWSxNQUFNLFlBQ3JEO0FBQUEsSUFDQSxPQUFPO0FBQUEsSUFDUCxRQUFRO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQ0U7QUFDTjtBQVNBLFNBQVMsbUJBQW1CLGdCQUFxRDtBQUMvRSxNQUFJLGVBQWUsS0FBSyxDQUFDLGtCQUFrQixjQUFjLFVBQVUsbUJBQXVCLEdBQUc7QUFDM0YsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGVBQWUsU0FBUyxJQUFJLHNCQUEwQjtBQUMvRDtBQVNBLGVBQWUsZUFBZSxjQUFxQztBQUNqRSxRQUFNLFVBQVUsd0JBQXdCLEVBQUUsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFHLGNBQWMsT0FBTztBQUNqRzsiLCJuYW1lcyI6WyJWZXJzaW9uVXBkYXRlVHlwZSJdfQ==
|
|
874
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92ZXJzaW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIHZlcnNpb24gdXBkYXRlcyBpbiBhIHByb2plY3QuXG4gKiBJdCBpbmNsdWRlcyB0YXNrcyBzdWNoIGFzIHZhbGlkYXRpbmcgdmVyc2lvbiB1cGRhdGUgdHlwZXMsIGNoZWNraW5nIHRoZSBzdGF0ZVxuICogb2YgR2l0IGFuZCBHaXRIdWIgQ0xJLCB1cGRhdGluZyB2ZXJzaW9uIG51bWJlcnMgaW4gZmlsZXMsIGFuZCBwZXJmb3JtaW5nXG4gKiBHaXQgb3BlcmF0aW9ucyBzdWNoIGFzIHRhZ2dpbmcgYW5kIHB1c2hpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQYXJzZUFyZ3NDb25maWcgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHR5cGUgeyBSZWxlYXNlVHlwZSB9IGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7XG4gIGVzY2FwZVJlZ0V4cCxcbiAgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZHRlbXAsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBiYXNlbmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UgfSBmcm9tICdub2RlOnJlYWRsaW5lL3Byb21pc2VzJztcbmltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBpbmMsXG4gIHBhcnNlLFxuICBwcmVyZWxlYXNlXG59IGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUxvY2tKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQge1xuICBmaW5kRm9yYmlkZGVuUGF0dGVybk1hdGNoZXMsXG4gIEZPUkJJRERFTl9QQVRURVJOU19GSUxFX0VOVl9WQVJJQUJMRSxcbiAgcmVhZEZvcmJpZGRlblBhdHRlcm5zXG59IGZyb20gJy4vZm9yYmlkZGVuLXBhdHRlcm5zLnRzJztcbmltcG9ydCB7IGdhdGUgfSBmcm9tICcuL2dhdGUudHMnO1xuaW1wb3J0IHsgc3BlbGxjaGVja0NvbnRlbnQgfSBmcm9tICcuL2xpbnRlcnMvY3NwZWxsLWNvbnRlbnQudHMnO1xuaW1wb3J0IHtcbiAgZml4TWFya2Rvd25Db250ZW50LFxuICBsaW50TWFya2Rvd25Db250ZW50XG59IGZyb20gJy4vbGludGVycy9tYXJrZG93bmxpbnQtY29udGVudC50cyc7XG5pbXBvcnQge1xuICBlZGl0TnBtU2hyaW5rV3JhcEpzb24sXG4gIGVkaXRQYWNrYWdlSnNvbixcbiAgZWRpdFBhY2thZ2VMb2NrSnNvbixcbiAgcmVhZFBhY2thZ2VKc29uXG59IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IGNsb3NlUmVsZWFzZWRJc3N1ZXMgfSBmcm9tICcuL3JlbGVhc2VkLWlzc3Vlcy50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuL3JlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZXhlY0Zyb21Sb290LFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBhZGRVcGRhdGVkRmlsZXNUb0dpdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVXBkYXRlZEZpbGVzVG9HaXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkVmVyc2lvbkFyZ3VtZW50cyB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBwYXJzZWQgZnJvbSB0aGUgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uYWwgdmVyc2lvbiB1cGRhdGUgdHlwZSBhcmd1bWVudCwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBwdWJsaXNoR2l0SHViUmVsZWFzZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZpbGVzIHRvIGF0dGFjaCB0byB0aGUgR2l0SHViIHJlbGVhc2UsIGFzIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuIEEgcGF0aCB0aGF0IGRvZXNcbiAgICogbm90IGV4aXN0IGlzIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBgbnBtIHBhY2tgIHRhcmJhbGwgb2YgdGhlIHByb2plY3QsIHdyaXR0ZW4gaW50byBgZGlzdC9gLCBhbmQgYGRpc3Qvc3R5bGVzLmNzc2BcbiAgICovXG4gIHJlYWRvbmx5IGdldFJlbGVhc2VBc3NldFBhdGhzPzogKCgpID0+IFByb21pc2U8c3RyaW5nW10+KSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjbG9zZSB0aGUgaXNzdWVzIHRoZSByZWxlYXNlIGNhcnJpZXMgb25jZSBpdCBpcyBwdWJsaXNoZWQ6IGV2ZXJ5IGlzc3VlIGEgY29tbWl0IHNpbmNlIHRoZSBwcmV2aW91c1xuICAgKiB0YWcgbmFtZXMgd2l0aCBhIGNsb3Npbmcga2V5d29yZCAoYGZpeGVzICMxMmApIGlzIGNsb3NlZCB3aXRoIGEgYEZpeGVkIGluYCAvIGBJbXBsZW1lbnRlZCBpbmAgY29tbWVudCBsaW5raW5nXG4gICAqIHRoZSByZWxlYXNlLiBTZWUge0BsaW5rIGNsb3NlUmVsZWFzZWRJc3N1ZXN9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlcXVpcmUgZXZlcnkgYXNzZXQgdG8gZXhpc3QsIHJlcXVpcmUgYW4gZXhpc3RpbmcgcmVtb3RlIHRhZywgYW5kIHZlcmlmeSB0aGUgcHVibGlzaGVkXG4gICAqIG5vbi1kcmFmdCByZWxlYXNlIGFuZCBpdHMgdXBsb2FkZWQgYXNzZXRzIGJlZm9yZSBjbG9zaW5nIGlzc3Vlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5UmVsZWFzZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHVwZGF0ZUNoYW5nZWxvZ30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIHBhdGggdG8gYSBmaWxlIHdob3NlIGNvbnRlbnRzIGJlY29tZSB0aGUgYm9keSBvZiB0aGUgbmV3IHZlcnNpb24ncyBjaGFuZ2Vsb2cgc2VjdGlvbiwgaW5zdGVhZCBvZlxuICAgKiB0aGUgYnVsbGV0cyBkZXJpdmVkIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlcy4gVXNlIGl0IHRvIHN1cHBseSBwcmVwYXJlZCByZWxlYXNlIG5vdGVzIGZyb20gYVxuICAgKiBub24taW50ZXJhY3RpdmUgY2FsbGVyIChhIGJhY2tncm91bmQgcHJvY2VzcywgQ0ksIGFuIGFnZW50KS5cbiAgICpcbiAgICogU2V0dGluZyBpdCBpbXBsaWVzIG5vIGludGVyYWN0aXZlIHJldmlldzogdGhlIGNvbW1pdCBsb2cgaXMgbm90IHJlYWQsIGFuZCB0aGUgY2hhbmdlbG9nIGlzIG5ldmVyXG4gICAqIG9wZW5lZCBpbiB0aGUgZWRpdG9yIG5vciB3YWl0ZWQgb24gYXQgdGhlIGNvbnNvbGUsIHJlZ2FyZGxlc3Mgb2Yge0BsaW5rIHNob3VsZEVkaXRDaGFuZ2Vsb2d9LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgZmlyc3QtcGFyZW50IGNvbW1pdCBzdWJqZWN0cyBzaW5jZSB0aGUgcHJldmlvdXMgdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlbG9nRmlsZVBhdGg/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpbiB0aGUgZWRpdG9yIGZvciBhbiBpbnRlcmFjdGl2ZSByZXZpZXcuIFdoZW4gYGZhbHNlYCxcbiAgICogdGhlIGNoYW5nZWxvZyBpcyBzdGlsbCBnZW5lcmF0ZWQgZnJvbSBjb21taXQgbWVzc2FnZXMsIGJ1dCBpdCBpcyBub3Qgb3BlbmVkIGluIHRoZSBlZGl0b3IgZm9yXG4gICAqIG1hbnVhbCByZXZpZXcuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiB7QGxpbmsgY2hhbmdlbG9nRmlsZVBhdGh9IGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0Q2hhbmdlbG9nPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdXBkYXRlVmVyc2lvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlVmVyc2lvbk9wdGlvbnMge1xuICAvKipcbiAgICogQSBwYXRoIHRvIGEgZmlsZSB3aG9zZSBjb250ZW50cyBiZWNvbWUgdGhlIGJvZHkgb2YgdGhlIG5ldyB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24sIGluc3RlYWQgb2ZcbiAgICogdGhlIGJ1bGxldHMgZGVyaXZlZCBmcm9tIHRoZSBjb21taXQgbWVzc2FnZXMuIFVzZSBpdCB0byBzdXBwbHkgcHJlcGFyZWQgcmVsZWFzZSBub3RlcyBmcm9tIGFcbiAgICogbm9uLWludGVyYWN0aXZlIGNhbGxlciAoYSBiYWNrZ3JvdW5kIHByb2Nlc3MsIENJLCBhbiBhZ2VudCkuXG4gICAqXG4gICAqIFNldHRpbmcgaXQgaW1wbGllcyBubyBpbnRlcmFjdGl2ZSByZXZpZXc6IHRoZSBjb21taXQgbG9nIGlzIG5vdCByZWFkLCBhbmQgdGhlIGNoYW5nZWxvZyBpcyBuZXZlclxuICAgKiBvcGVuZWQgaW4gdGhlIGVkaXRvciBub3Igd2FpdGVkIG9uIGF0IHRoZSBjb25zb2xlLCByZWdhcmRsZXNzIG9mIHtAbGluayBzaG91bGRFZGl0Q2hhbmdlbG9nfS5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGZpcnN0LXBhcmVudCBjb21taXQgc3ViamVjdHMgc2luY2UgdGhlIHByZXZpb3VzIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZWxvZ0ZpbGVQYXRoPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaWxlcyB0byBhdHRhY2ggdG8gdGhlIEdpdEh1YiByZWxlYXNlLiBTZWUge0BsaW5rIFB1Ymxpc2hHaXRIdWJSZWxlYXNlT3B0aW9ucy5nZXRSZWxlYXNlQXNzZXRQYXRoc30uXG4gICAqL1xuICByZWFkb25seSBnZXRSZWxlYXNlQXNzZXRQYXRocz86ICgoKSA9PiBQcm9taXNlPHN0cmluZ1tdPikgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJlcGFyZSB0aGUgR2l0SHViIHJlbGVhc2UuXG4gICAqXG4gICAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIHJlbGVhc2UuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgR2l0SHViIHJlbGVhc2UgaGFzIGJlZW4gcHJlcGFyZWQuXG4gICAqL1xuICByZWFkb25seSBwcmVwYXJlR2l0SHViUmVsZWFzZT86IChuZXdWZXJzaW9uOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBidWlsZCBzdGVwLiBUaGUgYnVpbGQgaXMgYSBwdWJsaXNoaW5nIHByZXJlcXVpc2l0ZSwgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLFxuICAgKiBzbyBpdCBpcyBnb3Zlcm5lZCBieSB0aGlzIGZsYWcgaW5kZXBlbmRlbnRseSBvZiB7QGxpbmsgc2hvdWxkUnVuQ2hlY2tzfSDigJQgaXQgcnVucyBldmVuIHdoZW4gdGhlXG4gICAqIGNoZWNrcyBhcmUgc2tpcHBlZCwgc28gYSBmYXN0IHJlbGVhc2Ugc3RpbGwgc2hpcHMgZnJlc2ggYXJ0aWZhY3RzLiBTZXQgdG8gYGZhbHNlYCBvbmx5IHdoZW4gdGhlXG4gICAqIGJ1aWxkIG91dHB1dCBpcyBrbm93biB0byBhbHJlYWR5IG1hdGNoIHRoZSBjdXJyZW50IGNvZGU7IG90aGVyd2lzZSB0aGUgcmVsZWFzZSB3b3VsZCBwdWJsaXNoXG4gICAqIHN0YWxlIGFydGlmYWN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRCdWlsZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gY2xvc2UgdGhlIGlzc3VlcyB0aGUgcmVsZWFzZSBjYXJyaWVzIG9uY2UgaXQgaXMgcHVibGlzaGVkLiBTZWVcbiAgICoge0BsaW5rIFB1Ymxpc2hHaXRIdWJSZWxlYXNlT3B0aW9ucy5zaG91bGRDbG9zZVJlbGVhc2VkSXNzdWVzfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRDbG9zZVJlbGVhc2VkSXNzdWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBvcGVuIHRoZSBnZW5lcmF0ZWQgY2hhbmdlbG9nIGluIHRoZSBlZGl0b3IgZm9yIGFuIGludGVyYWN0aXZlIHJldmlldy5cbiAgICpcbiAgICogSWdub3JlZCB3aGVuIHtAbGluayBjaGFuZ2Vsb2dGaWxlUGF0aH0gaXMgc2V0LiBXaGVuIGl0IGlzIG5laXRoZXIgc2V0IG5vciBkaXNhYmxlZCwgdGhlIHJlbGVhc2VcbiAgICogcmVxdWlyZXMgYW4gaW50ZXJhY3RpdmUgdGVybWluYWwsIGFuZCB7QGxpbmsgdXBkYXRlVmVyc2lvbn0gcmVmdXNlcyB1cCBmcm9udCB3aXRob3V0IG9uZSByYXRoZXJcbiAgICogdGhhbiBibG9ja2luZyBvbiBhbiBlZGl0b3Igbm9ib2R5IHdpbGwgY2xvc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdENoYW5nZWxvZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHVibGlzaCBhbmQgdmVyaWZ5IHRoZSBHaXRIdWIgcmVsZWFzZSBiZWZvcmUgcHVzaGluZyB0aGUgdmVyc2lvbiBjb21taXQgdG8gdGhlIGJyYW5jaC5cbiAgICogUHJlcGFyYXRpb24gYW5kIGFzc2V0IHZhbGlkYXRpb24gaGFwcGVuIGJlZm9yZSBhbnkgcHVzaC4gT25seSB0aGUgcmVsZWFzZSB0YWcgaXMgcHVzaGVkIGZpcnN0O1xuICAgKiBhIGZhaWxlZCBwcmVwYXJhdGlvbiwgcHVibGljYXRpb24gb3IgdmVyaWZpY2F0aW9uIGxlYXZlcyB0aGUgcmVtb3RlIGJyYW5jaCB1bmNoYW5nZWQuXG4gICAqIFVzZXMgdGhlIGBvcmlnaW5gIHJlbW90ZSBhbmQgcHVzaGVzIHRoZSB2ZXJpZmllZCBjb21taXQgdG8gdGhlIG9yaWdpbmFsIGJyYW5jaCB3aXRob3V0IGZvcmNlLlxuICAgKiBJZ25vcmVkIHdoZW4ge0BsaW5rIHNob3VsZFJlbGVhc2V9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFB1Ymxpc2hCZWZvcmVQdXNoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwdWJsaXNoIHRoZSByZWxlYXNlLiBXaGVuIGBmYWxzZWAsIGFsbCBsb2NhbCBzdGVwcyBhcmUgZXhlY3V0ZWQgKHZlcnNpb24gYnVtcCxcbiAgICogY2hhbmdlbG9nLCBjb21taXQsIHRhZyksIGJ1dCB0aGUgY2hhbmdlcyBhcmUgbm90IHB1c2hlZCBhbmQgbm8gR2l0SHViIHJlbGVhc2UgaXMgcHVibGlzaGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlbGVhc2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgcHJlZmxpZ2h0IHZlcmlmaWNhdGlvbiBjaGVja3MgKGNsZWFuLXJlcG8gY2hlY2ssIGZvcm1hdCwgc3BlbGxjaGVjaywgbGludCxcbiAgICogb3Zlci1leHBvc3VyZSBhbmFseXNpcywgYW5kIHRlc3RzKS4gVGhlIGJ1aWxkIHN0ZXAgaXMgbm90IG9uZSBvZiB0aGVzZSBjaGVja3Mg4oCUIGl0IGlzIGdvdmVybmVkXG4gICAqIHNlcGFyYXRlbHkgYnkge0BsaW5rIHNob3VsZEJ1aWxkfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSdW5DaGVja3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgcHJlLWNvbW1pdCBob29rIHdoZW4gY3JlYXRpbmcgdGhlIHJlbGVhc2UgY29tbWl0LiBXaGVuIGBmYWxzZWAsIGAtLW5vLXZlcmlmeWBcbiAgICogaXMgcGFzc2VkIHRvIHRoZSByZWxlYXNlIGNvbW1pdCB0byBza2lwIHRoZSBob29rLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFZlcmlmeUNvbW1pdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHZlcnNpb24gaW4gYW55IGZpbGUgYmV5b25kIGBwYWNrYWdlLmpzb25gIGFuZCB0aGUgbG9ja2ZpbGVzLCBvbmNlIHRoZSBuZXcgdmVyc2lvbiBpcyBrbm93biBhbmRcbiAgICogYmVmb3JlIHRoZSByZWxlYXNlIGNvbW1pdCBpcyBtYWRlLiBBbiBPYnNpZGlhbiBwbHVnaW4ncyBgbWFuaWZlc3QuanNvbmAgYW5kIGB2ZXJzaW9ucy5qc29uYCBhcmUgdGhlIGNhc2UgdGhpc1xuICAgKiBleGlzdHMgZm9yLlxuICAgKlxuICAgKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSB2ZXJzaW9uIGJlaW5nIHJlbGVhc2VkLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZpbGVzIGFyZSB1cGRhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlVmVyc2lvbkluRXh0cmFGaWxlcz86ICgobmV3VmVyc2lvbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgbG93ZXN0IGJ1bXAgYSByYW5nZSBvZiBjb21taXRzIG1heSBiZSBwdWJsaXNoZWQgdW5kZXIsIGFuZCB0aGUgY29tbWl0cyB0aGF0IGZvcmNlIGl0LlxuICovXG5pbnRlcmZhY2UgQnVtcEZsb29yIHtcbiAgLyoqXG4gICAqIFRoZSBjb21taXRzIHdob3NlIENvbnZlbnRpb25hbC1Db21taXRzIG1hcmtlcnMgZm9yY2Uge0BsaW5rIGxldmVsfSwgaW4gdGhlIG9yZGVyIGBnaXQgbG9nYCByZXBvcnRlZCB0aGVtLlxuICAgKiBFbXB0eSB3aGVuIG5vdGhpbmcgZm9yY2VzIGFueXRoaW5nLCB3aGljaCBpcyB0aGUgb3JkaW5hcnkgY2FzZSBmb3IgYSByYW5nZSBvZiBgZml4YGVzIGFuZCBgY2hvcmVgcy5cbiAgICovXG4gIHJlYWRvbmx5IGZvcmNpbmdDb21taXRzOiByZWFkb25seSBGb3JjaW5nQ29tbWl0W107XG5cbiAgLyoqXG4gICAqIFRoZSBsb3dlc3Qge0BsaW5rIEJ1bXBMZXZlbH0gdGhlIHJhbmdlIG1heSBzaGlwIGFzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGV2ZWw6IEJ1bXBMZXZlbDtcbn1cblxuLyoqXG4gKiBXaGF0IHtAbGluayB0b0J1bXBGbG9vckVycm9yfSBuZWVkcyBiZXlvbmQgdGhlIHtAbGluayBCdW1wRmxvb3J9IGl0c2VsZiB0byBzYXkgd2hhdCB3YXMgYXNrZWQgZm9yIGFuZCB3aGF0XG4gKiB0aGF0IHdvdWxkIGhhdmUgc2hpcHBlZCBhcy5cbiAqL1xuaW50ZXJmYWNlIEJ1bXBGbG9vclJlZnVzYWxDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBwcmV2aW91cyByZWxlYXNlIHRhZyB0aGUgcmFuZ2Ugd2FzIG1lYXN1cmVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSBsYXN0VGFnOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIHRoZSByZXF1ZXN0ZWQgYnVtcCB3b3VsZCBoYXZlIHByb2R1Y2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3VmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIEJ1bXBMZXZlbH0ge0BsaW5rIG5ld1ZlcnNpb259IGFjdHVhbGx5IG1vdmVzLCByZWxhdGl2ZSB0byB7QGxpbmsgbGFzdFRhZ30uXG4gICAqL1xuICByZWFkb25seSB0YWtlbkxldmVsOiBCdW1wTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRoZSByZWxlYXNlIHdhcyBhc2tlZCBmb3IsIHZlcmJhdGltIOKAlCB3aGljaCBpcyBhIHByZS1yZWxlYXNlIHR5cGUgb3IgYW4gZXhwbGljaXRcbiAgICogdmVyc2lvbiBhcyBvZnRlbiBhcyBpdCBpcyBhIHBsYWluIGBwYXRjaGAsIGFuZCBpcyB0aGVyZWZvcmUgd29ydGggcXVvdGluZyBiYWNrIHJhdGhlciB0aGFuIGluZmVycmluZy5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHRocmVlIHJlbGVhc2UgbGluZXMgYSBidW1wIGNhbiBtb3ZlLCBvcmRlcmVkIGJ5IHtAbGluayBpc0J1bXBMZXZlbEF0TGVhc3R9LlxuICpcbiAqIEEgcHJlLXJlbGVhc2UgdHlwZSBpcyBub3Qgb25lIG9mIHRoZXNlOiBgcHJlbWFqb3JgIG1vdmVzIHRoZSBtYWpvciBsaW5lIGFuZCBgcHJlcmVsZWFzZWAgbW92ZXMgd2hpY2hldmVyXG4gKiBsaW5lIGFuIGVhcmxpZXIgcHJlLXJlbGVhc2UgYWxyZWFkeSBjaG9zZSwgc28gd2hhdCBhIHByZS1yZWxlYXNlIGRpZCBpcyByZWFkIG9mZiB0aGUgcmVzdWx0aW5nIHZlcnNpb25cbiAqIHJhdGhlciB0aGFuIG9mZiBpdHMgdHlwZS4gU2VlIHtAbGluayB0b0VmZmVjdGl2ZUJ1bXBMZXZlbH0uXG4gKi9cbnR5cGUgQnVtcExldmVsID0gVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3IgfCBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vciB8IFZlcnNpb25VcGRhdGVUeXBlLlBhdGNoO1xuXG4vKipcbiAqIE9uZSBmaW5kaW5nIHJlcG9ydGVkIG92ZXIgdGhlIHNldHRsZWQgY2hhbmdlbG9nIHNlY3Rpb24sIHRhZ2dlZCB3aXRoIHRoZSBucG0gc2NyaXB0IHdob3NlIGNoZWNrIHByb2R1Y2VkIGl0LlxuICpcbiAqIFRoZSB0YWcgaXMgd2hhdCBsZXRzIG9uZSBtZXNzYWdlIG5hbWUgYGxpbnQ6bWRgLCBgc3BlbGxjaGVja2Agb3IgYm90aCwgdHJ1dGhmdWxseS4gQm90aCBjaGVja3MgcnVuIG92ZXJcbiAqIGV2ZXJ5IHNldHRsZSwgc28gYW4gYXV0aG9yIHdobyBoYXMgdG8gZml4IGEgaGFyZC13cmFwcGVkIGxpbmUgYW5kIGEgY29pbmVkIHdvcmQgZml4ZXMgdGhlbSBpbiBPTkUgcm91bmQgb2ZcbiAqIHRoZSByZXZpZXcgcmF0aGVyIHRoYW4gYmVpbmcgc2VudCBiYWNrIHR3aWNlLlxuICovXG5pbnRlcmZhY2UgQ2hhbmdlbG9nRmluZGluZyB7XG4gIC8qKlxuICAgKiBUaGUgbnBtIHNjcmlwdCB0aGF0IHdvdWxkIGhhdmUgcmVwb3J0ZWQgdGhpcyBvbiB0aGUgYnJhbmNoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2NyaXB0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3J0ZWQgbGluZSwgZXhhY3RseSBhcyB0aGF0IHNjcmlwdCdzIG93biBvdXRwdXQgd291bGQgaGF2ZSBjYXJyaWVkIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9uZSBjb21taXQgdGhhdCBmb3JjZXMgYSB7QGxpbmsgQnVtcEZsb29yfSwgcmVuZGVyZWQgaW50byB0aGUgcmVmdXNhbCBzbyB0aGUgYXV0aG9yIGNhbiBnbyBhbmQgbG9vayBhdCBpdC5cbiAqL1xuaW50ZXJmYWNlIEZvcmNpbmdDb21taXQge1xuICAvKipcbiAgICogVGhlIHtAbGluayBCdW1wTGV2ZWx9IHRoaXMgb25lIGNvbW1pdCBmb3JjZXMgb24gaXRzIG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGxldmVsOiBCdW1wTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFdoYXQgaW4gdGhlIGNvbW1pdCBmb3JjZWQgaXQg4oCUIHRoZSBgIWAgbWFya2VyLCB0aGUgYEJSRUFLSU5HIENIQU5HRTpgIGZvb3Rlciwgb3IgdGhlIGBmZWF0YCB0eXBlIOKAlCBuYW1lZFxuICAgKiBzbyBhIHJlYWRlciBjYW4gdGVsbCBhIGRlbGliZXJhdGUgYnJlYWtpbmcgbWFya2VyIGZyb20gYSBmb290ZXIgc29tZWJvZHkgd3JvdGUgaW4gcGFzc2luZy5cbiAgICovXG4gIHJlYWRvbmx5IG1hcmtlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVsbCBjb21taXQgaGFzaC5cbiAgICovXG4gIHJlYWRvbmx5IHNoYTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IHN1YmplY3QuXG4gICAqL1xuICByZWFkb25seSBzdWJqZWN0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBOcG1QYWNrUmVzdWx0IHtcbiAgcmVhZG9ubHkgZmlsZW5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGBCUkVBS0lORyBDSEFOR0U6YCBmb290ZXIsIGluIGJvdGggc3BlbGxpbmdzIENvbnZlbnRpb25hbCBDb21taXRzIGFsbG93cy5cbiAqXG4gKiBNYXRjaGVkIHBlciBsaW5lIChgbWApIHJhdGhlciB0aGFuIGFnYWluc3QgdGhlIHdob2xlIG1lc3NhZ2UsIGJlY2F1c2UgYSBmb290ZXIgc2l0cyBhdCB0aGUgYm90dG9tIG9mIHRoZVxuICogYm9keS4gSXQgaXMgdGhlIGhhbGYgb2YgdGhlIGJyZWFraW5nLWNoYW5nZSBzaWduYWwgdGhhdCB7QGxpbmsgTUVSR0VfU1VCSkVDVF9SRUdfRVhQfSdzIHNpYmxpbmcgcmV3cml0ZVxuICogY2Fubm90IGNhcnJ5OiBgdG9DaGFuZ2Vsb2dFbnRyeWAgbGlmdHMgb25seSB0aGUgbWVyZ2UgYm9keSdzIGZpcnN0IGxpbmUgb250byB0aGUgbWVyZ2Ugc3ViamVjdCwgc28gYSBmb290ZXJcbiAqIHdyaXR0ZW4gb24gYSBicmFuY2ggY29tbWl0IG5ldmVyIHJlYWNoZXMgdGhlIGZpcnN0LXBhcmVudCBoaXN0b3J5IGF0IGFsbC4gVGhhdCBpcyB3aHlcbiAqIHtAbGluayBnZXRCdW1wRmxvb3J9IHJlYWRzIGV2ZXJ5IGNvbW1pdCBpbiB0aGUgcmFuZ2UgcmF0aGVyIHRoYW4gb25seSB0aGUgZmlyc3QtcGFyZW50IG9uZXMuXG4gKi9cbmNvbnN0IEJSRUFLSU5HX0NIQU5HRV9GT09URVJfUkVHX0VYUCA9IC9eQlJFQUtJTkdbIC1dQ0hBTkdFOi9tO1xuXG4vKipcbiAqIFRoZSBtYXJrZXIgbmFtZXMgYSB7QGxpbmsgRm9yY2luZ0NvbW1pdH0gY2FycmllcywgYW5kIHRoZXJlZm9yZSB3aGF0IHRoZSByZWZ1c2FsIG1lc3NhZ2Ugc2F5cyBmb3JjZWQgdGhlXG4gKiBmbG9vci4gVGhleSBhcmUgc3BlbGxlZCBvdXQgcmF0aGVyIHRoYW4gcmVkdWNlZCB0byB0aGUgbGV2ZWwgYWxvbmUsIGJlY2F1c2UgYGZlYXQhYCBhbmQgYSBgQlJFQUtJTkcgQ0hBTkdFOmBcbiAqIGZvb3RlciBidXJpZWQgaW4gYSBib2R5IGFyZSB2ZXJ5IGRpZmZlcmVudCB0aGluZ3MgdG8gYmUgdG9sZCBhYm91dC5cbiAqL1xuY29uc3QgQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9NQVJLRVIgPSAnYSBgQlJFQUtJTkcgQ0hBTkdFOmAgZm9vdGVyJztcblxuLyoqXG4gKiBTZWUge0BsaW5rIEJSRUFLSU5HX0NIQU5HRV9GT09URVJfTUFSS0VSfS5cbiAqL1xuY29uc3QgQlJFQUtJTkdfTUFSS0VSID0gJ3RoZSBgIWAgYnJlYWtpbmcgbWFya2VyJztcblxuLyoqXG4gKiBTZWUge0BsaW5rIEJSRUFLSU5HX0NIQU5HRV9GT09URVJfTUFSS0VSfS5cbiAqL1xuY29uc3QgRkVBVF9UWVBFX01BUktFUiA9ICdhIGBmZWF0YCB0eXBlJztcblxuLyoqXG4gKiBBIENvbnZlbnRpb25hbC1Db21taXRzIHN1YmplY3Q6IGEgdHlwZSwgYW4gb3B0aW9uYWwgc2NvcGUsIGFuIG9wdGlvbmFsIGAhYCwgdGhlbiB0aGUgY29sb24uXG4gKlxuICogRGVsaWJlcmF0ZWx5IHRvbGVyYW50IG9mIGEgc3ViamVjdCB0aGF0IGlzIG5vdCBvbmUgYXQgYWxsIOKAlCBhbiB1bnBhcnNhYmxlIHN1YmplY3Qgc2ltcGx5IGNvbnN0cmFpbnNcbiAqIG5vdGhpbmcsIHdoaWNoIGlzIHRoZSBzYW1lIGFuc3dlciBhIGBjaG9yZTpgIGdpdmVzLiBUaGlzIGdhdGUgZXhpc3RzIHRvIGNhdGNoIGEgYnVtcCB0aGF0IGlzIHRvbyBMT1csIHNvXG4gKiBmYWlsaW5nIHRvIHJlY29nbml6ZSBhIHN1YmplY3QgY2FuIG9ubHkgdW5kZXItY29uc3RyYWluLCBuZXZlciByZWZ1c2UgYSByZWxlYXNlIHRoYXQgc2hvdWxkIGhhdmUgc2hpcHBlZC5cbiAqL1xuY29uc3QgQ09OVkVOVElPTkFMX0NPTU1JVF9TVUJKRUNUX1JFR19FWFAgPSAvXig/PHR5cGU+W2Etel0rKSg/OlxcKFteKCldKlxcKSk/KD88YnJlYWtpbmc+ISk/Olxccy9pO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHByZS1yZWxlYXNlIGlkZW50aWZpZXIgdXNlZCBmb3IgcHJlLXJlbGVhc2UgdmVyc2lvbnMuXG4gKi9cbmNvbnN0IERFRkFVTFRfUFJFSUQgPSAnYmV0YSc7XG5cbi8qKlxuICogVGhlIENvbnZlbnRpb25hbC1Db21taXRzIHR5cGUgdGhhdCBmb3JjZXMgYSBtaW5vci5cbiAqL1xuY29uc3QgRkVBVF9UWVBFID0gJ2ZlYXQnO1xuXG4vKipcbiAqIE9uZSBpc3N1ZSByZWZlcmVuY2UgaW5zaWRlIGFuIHtAbGluayBJU1NVRV9SRUZFUkVOQ0VfTElORV9SRUdfRVhQfSBsaW5lOiBhbiBpc3N1ZSBvciBwdWxsIHJlcXVlc3QgVVJMLCBhblxuICogYG93bmVyL3JlcG8jbmAsIG9yIGEgYmFyZSBgI25gLlxuICovXG5jb25zdCBJU1NVRV9SRUZFUkVOQ0VfUkVHX0VYUCA9IC9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oPzx1cmxTbHVnPltcXHcuLV0rXFwvW1xcdy4tXSspXFwvKD86aXNzdWVzfHB1bGwpXFwvKD88dXJsTnVtYmVyPlxcZCspfCg/PCFbXFx3Li8tXSkoPzxzbHVnPltcXHcuLV0rXFwvW1xcdy4tXSspIyg/PHNsdWdOdW1iZXI+XFxkKylcXGJ8KD88IVtcXHcvJiMuLV0pIyg/PGJhcmVOdW1iZXI+XFxkKylcXGIvZztcblxuLyoqXG4gKiBBIGNvbW1pdCBib2R5IGxpbmUgdGhhdCBuYW1lcyB0aGUgaXNzdWVzIHRoZSBjb21taXQgd29ya3Mgb246IGBSZWZzIG93bmVyL3JlcG8jMTJgLCBgRml4ZXMgIzNgLFxuICogYENsb3NlcyBodHRwczovL2dpdGh1Yi5jb20vb3duZXIvcmVwby9pc3N1ZXMvNCwgIzVgLiBUaGUga2V5d29yZCBpcyBmb2xsb3dlZCBieSByZWZlcmVuY2VzIGFuZCBub3RoaW5nIGVsc2VcbiAqIChzZWUge0BsaW5rIHBhcnNlSXNzdWVSZWZlcmVuY2VMaW5lfSksIHNvIGEgcHJvc2UgbGluZSB0aGF0IG1lcmVseSBvcGVucyB3aXRoIGBGaXhlc2AgbmFtZXMgbm90aGluZy5cbiAqXG4gKiBBIGZpeCBtYWRlIGluIG9uZSByZXBvc2l0b3J5IGZvciBhbiBpc3N1ZSBpbiBhbm90aGVyIGNsb3NlcyBub3RoaW5nIGhlcmUsIGFuZCBpdHMgY29tbWl0IHN1YmplY3QgY2Fubm90IGNhcnJ5XG4gKiB0aGUgb3RoZXIgcmVwb3NpdG9yeSdzIG51bWJlciwgc28gdGhpcyBsaW5lIGlzIHRoZSBvbmx5IHBsYWNlIHRoZSByZWxlYXNlIGNhbiBsZWFybiB3aGljaCBpc3N1ZSBpdCBmaXhlcy5cbiAqL1xuY29uc3QgSVNTVUVfUkVGRVJFTkNFX0xJTkVfUkVHX0VYUCA9IC9eKD86cmVmcz98cmV8Zml4KD86ZVtzZF0pP3xjbG9zZVtzZF0/fHJlc29sdmVbc2RdP3xpbXBsZW1lbnRzPyk6P1xccysoPzxyZWZlcmVuY2VzPi4rKSQvaTtcblxuLyoqXG4gKiBUaGUgbnBtIHNjcmlwdHMgd2hvc2UgY2hlY2tzIHRoZSBzZXR0bGVkIGNoYW5nZWxvZyBpcyBoZWxkIHRvLCBuYW1lZCBpbiB0aGUgbWVzc2FnZXMgc28gYSByZWFkZXIga25vd3Mgd2hpY2hcbiAqIGdhdGUgdGhleSBhcmUgbG9va2luZyBhdCDigJQgYW5kIGtub3dzIHRoYXQgZml4aW5nIGl0IGhlcmUgaXMgdGhlIHNhbWUgZml4IGFzIGZpeGluZyBpdCBvbiB0aGUgYnJhbmNoLlxuICovXG5jb25zdCBMSU5UX01EX1NDUklQVF9OQU1FID0gJ2xpbnQ6bWQnO1xuXG4vKipcbiAqIEhvdyBtdWNoIG9mIGEgY29tbWl0IGhhc2ggdGhlIGJ1bXAtZmxvb3IgcmVmdXNhbCBwcmludHMuIExvbmcgZW5vdWdoIHRvIHBhc3RlIGludG8gYGdpdCBzaG93YCwgc2hvcnQgZW5vdWdoXG4gKiB0aGF0IGEgbGlzdCBvZiB0aGVtIHN0YXlzIHJlYWRhYmxlLlxuICovXG5jb25zdCBTSE9SVF9TSEFfTEVOR1RIID0gODtcblxuLyoqXG4gKiBTZWUge0BsaW5rIExJTlRfTURfU0NSSVBUX05BTUV9LlxuICovXG5jb25zdCBTUEVMTENIRUNLX1NDUklQVF9OQU1FID0gJ3NwZWxsY2hlY2snO1xuXG4vKipcbiAqIFRoZSBzaGFwZSBvZiBhIG1lcmdlIHN1YmplY3QgZ2l0IHdyb3RlIGl0c2VsZiwgcmF0aGVyIHRoYW4gb25lIGFuIGF1dGhvciBjaG9zZS5cbiAqXG4gKiBFdmVyeSBkZWZhdWx0IGdpdCBwcm9kdWNlcyBvcGVucyB3aXRoIGBNZXJnZWAgYW5kIGEgd29yZCBib3VuZGFyeSDigJQgYE1lcmdlIGJyYW5jaCAneCdgLFxuICogYE1lcmdlIGJyYW5jaGVzICd4JyBhbmQgJ3knYCwgYE1lcmdlIHJlbW90ZS10cmFja2luZyBicmFuY2ggJ3gnYCwgYE1lcmdlIHB1bGwgcmVxdWVzdCAjMSBmcm9tIHlgLFxuICogYE1lcmdlIHRhZyAneCdgLCBgTWVyZ2UgY29tbWl0ICdhYmMnYCDigJQgd2hpY2ggaXMgd2hhdCB0aGUgb3B0aW9uYWwgYWx0ZXJuYXRpb24gYW5kIHRoZSB0cmFpbGluZyBgXFxiYCBjb3ZlclxuICogYmV0d2VlbiB0aGVtLiBCZWluZyB0aGF0IGJyb2FkIGNvc3RzIG5vdGhpbmcgaGVyZTogZXZlcnkgY2hhbmdlbG9nIGVudHJ5IGluIHRoaXMgd29ya3NwYWNlIGlzIGFcbiAqIENvbnZlbnRpb25hbC1Db21taXRzIHN1YmplY3QsIGFuZCB0aG9zZSBvcGVuIHdpdGggYSB0eXBlIChgZmVhdGAsIGBmaXhgLCBgY2hvcmVgLCDigKYpLCBuZXZlciB3aXRoIGBNZXJnZWAuXG4gKlxuICogT05FIHBhdHRlcm4gZHJpdmVzIGJvdGggaGFsdmVzIG9mIHRoZSBndWFyZCwgc28gdGhleSBjYW5ub3QgZHJpZnQgYXBhcnQ6IHtAbGluayB0b0NoYW5nZWxvZ0VudHJ5fSByZXdyaXRlc1xuICogYSBjb21taXQgd2hvc2Ugc3ViamVjdCBtYXRjaGVzIGl0LCBhbmQge0BsaW5rIGFzc2VydENoYW5nZWxvZ0hhc05vTWVyZ2VTdWJqZWN0c30gcmVmdXNlcyBhIGNoYW5nZWxvZyBsaW5lXG4gKiB0aGF0IHN0aWxsIGRvZXMuIFRoZSByZWZ1c2FsIGlzIHRoZXJlZm9yZSByZWFjaGFibGUgb25seSBmb3IgYSBtZXJnZSB0aGUgcmV3cml0ZSBoYWQgbm90aGluZyB0byB3b3JrIHdpdGguXG4gKi9cbmNvbnN0IE1FUkdFX1NVQkpFQ1RfUkVHX0VYUCA9IC9eTWVyZ2UoPzogYnJhbmNofCByZW1vdGUtdHJhY2tpbmd8IHB1bGwgcmVxdWVzdCk/XFxiLztcblxuLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyBkaWZmZXJlbnQgdHlwZXMgb2YgdmVyc2lvbiB1cGRhdGVzLlxuICpcbiAqIEFsaWducyB3aXRoIG5wbSdzIGBucG0gdmVyc2lvbmAgaW5jcmVtZW50IHR5cGVzIHBsdXMgYE1hbnVhbGAgZm9yIGV4cGxpY2l0IHZlcnNpb25zLlxuICovXG5leHBvcnQgZW51bSBWZXJzaW9uVXBkYXRlVHlwZSB7XG4gIEludmFsaWQgPSAnaW52YWxpZCcsXG4gIE1ham9yID0gJ21ham9yJyxcbiAgTWFudWFsID0gJ21hbnVhbCcsXG4gIE1pbm9yID0gJ21pbm9yJyxcbiAgUGF0Y2ggPSAncGF0Y2gnLFxuICBQcmVNYWpvciA9ICdwcmVtYWpvcicsXG4gIFByZU1pbm9yID0gJ3ByZW1pbm9yJyxcbiAgUHJlUGF0Y2ggPSAncHJlcGF0Y2gnLFxuICBQcmVSZWxlYXNlID0gJ3ByZXJlbGVhc2UnXG59XG5cbi8qKlxuICogVGhlIHZlcnNpb24gdXBkYXRlIHR5cGVzIGEgY2FsbGVyIG5hbWVzIGRpcmVjdGx5LCBrZXllZCBieSB0aGVpciBuYW1lLCBhcyBvcHBvc2VkIHRvIHRoZSB0d28gYGdldFZlcnNpb25VcGRhdGVUeXBlYCBkZXJpdmVzLlxuICovXG5jb25zdCBOQU1FRF9WRVJTSU9OX1VQREFURV9UWVBFUyA9IG5ldyBNYXA8c3RyaW5nLCBWZXJzaW9uVXBkYXRlVHlwZT4oW1xuICBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvcixcbiAgVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IsXG4gIFZlcnNpb25VcGRhdGVUeXBlLlBhdGNoLFxuICBWZXJzaW9uVXBkYXRlVHlwZS5QcmVNYWpvcixcbiAgVmVyc2lvblVwZGF0ZVR5cGUuUHJlTWlub3IsXG4gIFZlcnNpb25VcGRhdGVUeXBlLlByZVBhdGNoLFxuICBWZXJzaW9uVXBkYXRlVHlwZS5QcmVSZWxlYXNlXG5dLm1hcCgodHlwZSkgPT4gW3R5cGUsIHR5cGVdKSk7XG5cbi8qKlxuICogV2hlcmUgYEhFQURgIHN0b29kIHdoZW4gYSByZWxlYXNlIHN0YXJ0ZWQ6IHRoZSBicmFuY2ggaXQgaXMgb24gKGVtcHR5IGZvciBhIGRldGFjaGVkIGBIRUFEYCkgYW5kIGl0cyBjb21taXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SGVhZFN0YXRlIHtcbiAgLyoqXG4gICAqIFRoZSBjaGVja2VkLW91dCBicmFuY2gsIG9yIGFuIGVtcHR5IHN0cmluZyBmb3IgYSBkZXRhY2hlZCBgSEVBRGAuXG4gICAqL1xuICByZWFkb25seSBicmFuY2g6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbW1pdCBgSEVBRGAgcG9pbnRzIGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hhOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIEdpdCB0YWcgZm9yIHRoZSBuZXcgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdG8gdXNlIGZvciB0aGUgdGFnLlxuICogQHBhcmFtIGNvbW1pdFNoYSAtIFRoZSBjb21taXQgdG8gdGFnLiBXaGVuIG9taXR0ZWQsIGBIRUFEYCBpcyB0YWdnZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRhZyBoYXMgYmVlbiBjcmVhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkR2l0VGFnKG5ld1ZlcnNpb246IHN0cmluZywgY29tbWl0U2hhPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChgZ2l0IHRhZyAtYSAke25ld1ZlcnNpb259IC1tICR7bmV3VmVyc2lvbn0gLS1mb3JjZSR7Y29tbWl0U2hhID8gYCAke2NvbW1pdFNoYX1gIDogJyd9YCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEFkZHMgdXBkYXRlZCBmaWxlcyB0byB0aGUgR2l0IHN0YWdpbmcgYXJlYSBhbmQgY29tbWl0cyB0aGVtIHdpdGggdGhlIG5ldyB2ZXJzaW9uIG1lc3NhZ2UuXG4gKlxuICogSWYgdGhlIGNvbW1pdCBmYWlscyAoZm9yIGV4YW1wbGUsIHRoZSBwcmUtY29tbWl0IGhvb2sgcmVqZWN0cyBhIG5ldyB3b3JkIGluIHRoZSBjaGFuZ2Vsb2cpIGFuZCB0aGVcbiAqIHByb2Nlc3MgaXMgYXR0YWNoZWQgdG8gYW4gaW50ZXJhY3RpdmUgdGVybWluYWwsIHRoZSB1c2VyIGlzIHByb21wdGVkIHRvIGZpeCB0aGUgaXNzdWUgKGZvciBleGFtcGxlLFxuICogYWRkIHRoZSBtaXNzaW5nIHdvcmQgdG8gYGNzcGVsbC5qc29uYCkgYW5kIHByZXNzIEVudGVyIHRvIHJldHJ5LiBUaGUgcmV0cnkgcmUtc3RhZ2VzIGFsbCBmaWxlcywgc28gdGhlXG4gKiBmaXggaXMgcGlja2VkIHVwIHdpdGhvdXQgcmVzdGFydGluZyB0aGUgd2hvbGUgcmVsZWFzZSBsaWZlY3ljbGUuIEluIGEgbm9uLWludGVyYWN0aXZlIGVudmlyb25tZW50IChub1xuICogVFRZLCBzdWNoIGFzIENJKSwgdGhlIGVycm9yIGlzIHJlLXRocm93biBpbnN0ZWFkIG9mIHByb21wdGluZywgc28gdGhlIHNjcmlwdCBmYWlscyBmYXN0IHJhdGhlciB0aGFuXG4gKiBoYW5naW5nLiBQYXNzIGBzaG91bGRWZXJpZnlDb21taXQ6IGZhbHNlYCB0byBza2lwIHRoZSBwcmUtY29tbWl0IGhvb2sgZW50aXJlbHkgaW4gc3VjaCBjYXNlcy5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdXNlZCBhcyB0aGUgY29tbWl0IG1lc3NhZ2UuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgQWRkVXBkYXRlZEZpbGVzVG9HaXRPcHRpb25zfSBjb250cm9sbGluZyB0aGUgY29tbWl0IGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgYW5kIGNvbW1pdHRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZFVwZGF0ZWRGaWxlc1RvR2l0KG5ld1ZlcnNpb246IHN0cmluZywgb3B0aW9uczogQWRkVXBkYXRlZEZpbGVzVG9HaXRPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzaG91bGRWZXJpZnlDb21taXQgPSB0cnVlIH0gPSBvcHRpb25zO1xuICBjb25zdCB2ZXJzaW9uRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpO1xuXG4gIGNvbnN0IGNvbW1pdEFyZ3VtZW50cyA9IFsnZ2l0JywgJ2NvbW1pdCcsICctbScsIGBjaG9yZTogcmVsZWFzZSAke25ld1ZlcnNpb259YCwgJy0tYWxsb3ctZW1wdHknLCAuLi4oc2hvdWxkVmVyaWZ5Q29tbWl0ID8gW10gOiBbJy0tbm8tdmVyaWZ5J10pXTtcblxuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdhZGQnLCAnLS1hbGwnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlY0Zyb21Sb290KGNvbW1pdEFyZ3VtZW50cywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHZlcnNpb25EZWJ1Z2dlcihcbiAgICAgICAgYEZhaWxlZCB0byBjb21taXQgdGhlIHJlbGVhc2UuXFxuJHtlcnJvclRvU3RyaW5nKGVycm9yKX1cXG5gXG4gICAgICAgICAgKyAnRml4IHRoZSBpc3N1ZXMgKGZvciBleGFtcGxlLCBhZGQgdGhlIG1pc3Npbmcgd29yZCB0byBjc3BlbGwuanNvbikgYW5kIHByZXNzIEVudGVyIHRvIHJldHJ5IHRoZSBjb21taXQsIG9yIEN0cmwrQyB0byBhYm9ydC4nXG4gICAgICApO1xuICAgICAgYXdhaXQgY3JlYXRlSW50ZXJmYWNlKHByb2Nlc3Muc3RkaW4sIHByb2Nlc3Muc3Rkb3V0KS5xdWVzdGlvbignUHJlc3MgRW50ZXIgdG8gcmV0cnkgdGhlIGNvbW1pdC4uLicpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgR2l0SHViIENMSSBpcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEdpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRHaXRIdWJDbGlJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaCAtLXZlcnNpb24nLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLiBQbGVhc2UgaW5zdGFsbCBpdCBmcm9tIGh0dHBzOi8vY2xpLmdpdGh1Yi5jb20vJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgR2l0IGlzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiBHaXQgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIEdpdCBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0R2l0SW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IC0tdmVyc2lvbicsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdHaXQgaXMgbm90IGluc3RhbGxlZC4gUGxlYXNlIGluc3RhbGwgaXQgZnJvbSBodHRwczovL2dpdC1zY20uY29tLycpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbiwgbWVhbmluZyB0aGVyZSBhcmUgbm8gdW5jb21taXR0ZWQgY2hhbmdlcy5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRHaXRSZXBvQ2xlYW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgc3RhdHVzIC0tcG9yY2VsYWluIC0tdW50cmFja2VkLWZpbGVzPWFsbCcsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBpZiAoc3Rkb3V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLiBQbGVhc2UgY29tbWl0IG9yIHN0YXNoIHlvdXIgY2hhbmdlcyBiZWZvcmUgcmVsZWFzaW5nIGEgbmV3IHZlcnNpb24uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYEhFQURgIGlzIHRoZSByZWxlYXNlIGNvbW1pdDogb24gdGhlIGJyYW5jaCB0aGUgcmVsZWFzZSBzdGFydGVkIG9uLCBhIHNpbmdsZSBjb21taXQgb24gdG9wIG9mIHRoZVxuICogY29tbWl0IGl0IHN0YXJ0ZWQgZnJvbSwgd2l0aCB0aGUgYGNob3JlOiByZWxlYXNlIDx2ZXJzaW9uPmAgc3ViamVjdC5cbiAqXG4gKiBBIHN1Y2Nlc3NmdWwgYGdpdCBjb21taXRgIHByb3ZlcyBvbmx5IHRoYXQgYSBjb21taXQgd2FzIG1hZGUgc29tZXdoZXJlLiBBIGNoZWNrb3V0IHN3aXRjaGVkIHVuZGVybmVhdGggYVxuICogcmVsZWFzZSBieSBhbm90aGVyIHByb2Nlc3MgdGFrZXMgdGhlIGNvbW1pdCBvbnRvIHRoYXQgb3RoZXIgYnJhbmNoLCBhbmQgd2hlbiBpdCBpcyBzd2l0Y2hlZCBiYWNrIHRoZSB0YWcgYW5kXG4gKiB0aGUgR2l0SHViIHJlbGVhc2UgZ28gb3V0IG9uIHRoZSBjb21taXQgYmVmb3JlIHRoZSBidW1wLCB3aXRoIHRoZSBidW1wIGxlZnQgc3RhZ2VkIGluIHRoZSB3b3JraW5nIHRyZWUgYW5kIG5vdGhpbmdcbiAqIHJlcG9ydGVkLiBTbyB0aGUgcmVsZWFzZSBjaGVja3Mgd2hlcmUgdGhlIGNvbW1pdCBsYW5kZWQgYmVmb3JlIHRhZ2dpbmcsIGFuZCBhZ2FpbiBiZWZvcmUgcHVzaGluZy5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSB2ZXJzaW9uIGJlaW5nIHJlbGVhc2VkLlxuICogQHBhcmFtIHN0YXJ0SGVhZCAtIFdoZXJlIGBIRUFEYCBzdG9vZCB3aGVuIHRoZSByZWxlYXNlIHN0YXJ0ZWQuXG4gKiBAcGFyYW0gc3RhZ2UgLSBUaGUgc3RlcCBhYm91dCB0byBydW4sIGZvciB0aGUgZXJyb3IgbWVzc2FnZSAoZm9yIGV4YW1wbGUgYHRhZ2dpbmdgKS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlbGVhc2UgY29tbWl0J3MgU0hBLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0UmVsZWFzZUNvbW1pdExhbmRlZChuZXdWZXJzaW9uOiBzdHJpbmcsIHN0YXJ0SGVhZDogR2l0SGVhZFN0YXRlLCBzdGFnZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZXhwZWN0ZWRTdWJqZWN0ID0gYGNob3JlOiByZWxlYXNlICR7bmV3VmVyc2lvbn1gO1xuICBjb25zdCBicmFuY2ggPSBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAnYnJhbmNoJywgJy0tc2hvdy1jdXJyZW50J10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgY29uc3QgaGVhZExvZ0ZpZWxkQ291bnQgPSAzO1xuICBjb25zdCBoZWFkTG9nID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ2xvZycsICctMScsICctLWZvcm1hdD0lSCVuJVAlbiVzJ10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgY29uc3QgW3NoYSA9ICcnLCBwYXJlbnRzID0gJycsIHN1YmplY3QgPSAnJ10gPSBoZWFkTG9nLnNwbGl0KCdcXG4nLCBoZWFkTG9nRmllbGRDb3VudCk7XG5cbiAgaWYgKGJyYW5jaCA9PT0gc3RhcnRIZWFkLmJyYW5jaCAmJiBwYXJlbnRzID09PSBzdGFydEhlYWQuc2hhICYmIHN1YmplY3QgPT09IGV4cGVjdGVkU3ViamVjdCkge1xuICAgIHJldHVybiBzaGE7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFJlZnVzaW5nIHRvIGNvbnRpbnVlIGJlZm9yZSAke3N0YWdlfTogdGhlIHJlbGVhc2UgY29tbWl0IGZvciAke25ld1ZlcnNpb259IGlzIG5vdCB3aGVyZSBpdCBzaG91bGQgYmUuIGBcbiAgICAgICsgYFRoZSByZWxlYXNlIHN0YXJ0ZWQgb24gJHtkZXNjcmliZUJyYW5jaChzdGFydEhlYWQuYnJhbmNoKX0gYXQgJHtzdGFydEhlYWQuc2hhfSBhbmQgZXhwZWN0cyBhICcke2V4cGVjdGVkU3ViamVjdH0nIGNvbW1pdCBvbiB0b3Agb2YgaXQsIGBcbiAgICAgICsgYGJ1dCBIRUFEIGlzICR7c2hhfSAoJyR7c3ViamVjdH0nLCBwYXJlbnQgJHtwYXJlbnRzIHx8ICdub25lJ30pIG9uICR7ZGVzY3JpYmVCcmFuY2goYnJhbmNoKX0uIGBcbiAgICAgICsgJ1NvbWV0aGluZyBlbHNlIG1vdmVkIEhFQUQgaW4gdGhpcyB3b3JraW5nIHRyZWUgd2hpbGUgdGhlIHJlbGVhc2UgcmFuIChhIGNvbmN1cnJlbnQgY2hlY2tvdXQsIHJlc2V0IG9yIGNvbW1pdCkuICdcbiAgICAgICsgJ0NoZWNrIGBnaXQgcmVmbG9nYCB0byBmaW5kIHRoZSByZWxlYXNlIGNvbW1pdCwgcHV0IGl0IG9uIHRoZSByZWxlYXNlIGJyYW5jaCwgYW5kIHRhZyBhbmQgcHVzaCBpdCBieSBoYW5kLidcbiAgKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhbnkgYmFyZSBgaHR0cChzKTovL2AgVVJMIGluIHRoZSBnaXZlbiB0ZXh0IGluIGFuZ2xlIGJyYWNrZXRzIChgPHVybD5gKSBzbyB0aGF0IHRleHQgZW1pdHRlZFxuICogaW50byBhIE1hcmtkb3duIGRvY3VtZW50IChzdWNoIGFzIGEgZ2VuZXJhdGVkIGNoYW5nZWxvZyBidWxsZXQpIHBhc3NlcyBtYXJrZG93bmxpbnQnc1xuICogYE1EMDM0L25vLWJhcmUtdXJsc2AgcnVsZSB3aGlsZSBzdGlsbCByZW5kZXJpbmcgYXMgYSBjbGlja2FibGUgYXV0b2xpbmsgb24gR2l0SHViLlxuICpcbiAqIFVSTHMgdGhhdCBhcmUgYWxyZWFkeSB3cmFwcGVkIGluIGFuZ2xlIGJyYWNrZXRzIChgPHVybD5gKSBvciB0aGF0IGZvcm0gdGhlIHRhcmdldCBvZiBhIE1hcmtkb3duXG4gKiBsaW5rIChgW3RleHRdKHVybClgKSBhcmUgbGVmdCB1bnRvdWNoZWQsIHNvIHRoZSBmdW5jdGlvbiBpcyBzYWZlIHRvIHJ1biByZXBlYXRlZGx5LiBUcmFpbGluZ1xuICogc2VudGVuY2UgcHVuY3R1YXRpb24gKGAuYCwgYCxgLCBgO2AsIGA6YCwgYCFgLCBgP2ApIGlzIGtlcHQgb3V0c2lkZSB0aGUgYW5nbGUgYnJhY2tldHMgc28gaXQgZG9lc1xuICogbm90IGJlY29tZSBwYXJ0IG9mIHRoZSBsaW5rLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgcG9zc2libHkgY29udGFpbmluZyBiYXJlIFVSTHMuXG4gKiBAcmV0dXJucyBUaGUgdGV4dCB3aXRoIGV2ZXJ5IGJhcmUgVVJMIHdyYXBwZWQgaW4gYW5nbGUgYnJhY2tldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvbGlua0JhcmVVcmxzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoLyg/PCFbPFsoXSlodHRwcz86XFwvXFwvW15cXHM8PilcXF1dKy9nLCAodXJsKSA9PiB7XG4gICAgY29uc3QgdHJhaWxpbmdQdW5jdHVhdGlvbiA9IC9bLiw7OiE/XSskLy5leGVjKHVybCk/LlswXSA/PyAnJztcbiAgICBjb25zdCBiYXJlVXJsID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSB0cmFpbGluZ1B1bmN0dWF0aW9uLmxlbmd0aCk7XG4gICAgcmV0dXJuIGA8JHtiYXJlVXJsfT4ke3RyYWlsaW5nUHVuY3R1YXRpb259YDtcbiAgfSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbmV3IHZlcnNpb24gc3RyaW5nIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZlcnNpb24gYW5kIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogVXNlcyB0aGUgYHNlbXZlcmAgcGFja2FnZSB0byBjb21wdXRlIHRoZSBuZXh0IHZlcnNpb24sIHN1cHBvcnRpbmcgYWxsIG5wbSBpbmNyZW1lbnQgdHlwZXM6XG4gKiBgbWFqb3JgLCBgbWlub3JgLCBgcGF0Y2hgLCBgcHJlbWFqb3JgLCBgcHJlbWlub3JgLCBgcHJlcGF0Y2hgLCBhbmQgYHByZXJlbGVhc2VgLlxuICogUHJlLXJlbGVhc2UgdmVyc2lvbnMgdXNlIHRoZSBgYmV0YWAgaWRlbnRpZmllciBieSBkZWZhdWx0IChlLmcuLCBgMS4yLjQtYmV0YS4wYCkuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgb3IgYW4gZXhwbGljaXQgdmVyc2lvbiBzdHJpbmcuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgdmVyc2lvbiBzdHJpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjdXJyZW50IHZlcnNpb24gaXMgaW52YWxpZCBvciB0aGUgaW5jcmVtZW50IGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdmVyc2lvblR5cGUgPSBnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGlmICh2ZXJzaW9uVHlwZSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsKSB7XG4gICAgcmV0dXJuIHZlcnNpb25VcGRhdGVUeXBlO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcbiAgY29uc3QgY3VycmVudFZlcnNpb24gPSBwYWNrYWdlSnNvbi52ZXJzaW9uID8/ICcnO1xuXG4gIGNvbnN0IHJlbGVhc2VUeXBlID0gdmVyc2lvblR5cGUgYXMgUmVsZWFzZVR5cGU7XG4gIGNvbnN0IGlzUHJlUmVsZWFzZVR5cGUgPSByZWxlYXNlVHlwZS5zdGFydHNXaXRoKCdwcmUnKTtcbiAgY29uc3QgbmV3VmVyc2lvbiA9IGlzUHJlUmVsZWFzZVR5cGVcbiAgICA/IGluYyhjdXJyZW50VmVyc2lvbiwgcmVsZWFzZVR5cGUsIERFRkFVTFRfUFJFSUQpXG4gICAgOiBpbmMoY3VycmVudFZlcnNpb24sIHJlbGVhc2VUeXBlKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3VmVyc2lvbiwgYEZhaWxlZCB0byBpbmNyZW1lbnQgdmVyc2lvbiBmcm9tICcke2N1cnJlbnRWZXJzaW9ufScgd2l0aCB0eXBlICcke3ZlcnNpb25UeXBlfSdgKTtcblxuICByZXR1cm4gbmV3VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIGEgc3BlY2lmaWMgdmVyc2lvbiBmcm9tIHRoZSBjaGFuZ2Vsb2cuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB3aGljaCB0byBnZXQgdGhlIHJlbGVhc2Ugbm90ZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZWxlYXNlIG5vdGVzIGZvciB0aGUgc3BlY2lmaWVkIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWxlYXNlTm90ZXMobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2hhbmdlbG9nUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogUmVwb1BhdGhzLkNoYW5nZWxvZ01kIH0pO1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoY2hhbmdlbG9nUGF0aCwgJ3V0Zi04Jyk7XG4gIGNvbnN0IHNlY3Rpb24gPSBleHRyYWN0Q2hhbmdlbG9nU2VjdGlvbihjb250ZW50LCBuZXdWZXJzaW9uKTtcbiAgbGV0IHJlbGVhc2VOb3RlcyA9IHNlY3Rpb24gPyBgJHtzZWN0aW9ufVxcblxcbmAgOiAnJztcblxuICBjb25zdCB0YWdPdXRwdXQgPSBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCB0YWcgLS1zb3J0PS1jcmVhdG9yZGF0ZScsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgY29uc3QgdGFncyA9IHRhZ091dHB1dC5zcGxpdCgvXFxyP1xcbi8pO1xuICBjb25zdCBwcmV2aW91c1ZlcnNpb24gPSB0YWdzWzFdO1xuXG4gIGNvbnN0IHJlcG9VcmwgPSBhd2FpdCBleGVjRnJvbVJvb3QoJ2doIHJlcG8gdmlldyAtLWpzb24gdXJsIC1xIC51cmwnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgY29uc3QgY2hhbmdlc1VybCA9IHByZXZpb3VzVmVyc2lvbiA/IGAke3JlcG9Vcmx9L2NvbXBhcmUvJHtwcmV2aW91c1ZlcnNpb259Li4uJHtuZXdWZXJzaW9ufWAgOiBgJHtyZXBvVXJsfS9jb21taXRzLyR7bmV3VmVyc2lvbn1gO1xuXG4gIHJlbGVhc2VOb3RlcyArPSBgKipGdWxsIENoYW5nZWxvZyoqOiAke2NoYW5nZXNVcmx9YDtcbiAgcmV0dXJuIHJlbGVhc2VOb3Rlcztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSB0eXBlIG9mIHZlcnNpb24gdXBkYXRlIGJhc2VkIG9uIHRoZSBpbnB1dCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIGlucHV0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUuXG4gKiBAcmV0dXJucyBUaGUgY29ycmVzcG9uZGluZyBgVmVyc2lvblVwZGF0ZVR5cGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmVyc2lvblVwZGF0ZVR5cGUodmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IFZlcnNpb25VcGRhdGVUeXBlIHtcbiAgY29uc3QgbmFtZWRWZXJzaW9uVXBkYXRlVHlwZSA9IE5BTUVEX1ZFUlNJT05fVVBEQVRFX1RZUEVTLmdldCh2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGlmIChuYW1lZFZlcnNpb25VcGRhdGVUeXBlKSB7XG4gICAgcmV0dXJuIG5hbWVkVmVyc2lvblVwZGF0ZVR5cGU7XG4gIH1cblxuICByZXR1cm4gL15cXGQrXFwuXFxkK1xcLlxcZCsoPzotW1xcd1xcZC4tXSspPyQvLnRlc3QodmVyc2lvblVwZGF0ZVR5cGUpID8gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsIDogVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZDtcbn1cblxuLyoqXG4gKiBQdXNoZXMgY29tbWl0cyBhbmQgdGFncyB0byB0aGUgcmVtb3RlIEdpdCByZXBvc2l0b3J5LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcHVzaCBvcGVyYXRpb24gaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnaXRQdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCBwdXNoIC0tZm9sbG93LXRhZ3MgLS1mb3JjZScsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBSZWFkcyB3aGVyZSBgSEVBRGAgc3RhbmRzIG5vdy5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjdXJyZW50IHtAbGluayBHaXRIZWFkU3RhdGV9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEdpdEhlYWRTdGF0ZSgpOiBQcm9taXNlPEdpdEhlYWRTdGF0ZT4ge1xuICBjb25zdCBicmFuY2ggPSBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAnYnJhbmNoJywgJy0tc2hvdy1jdXJyZW50J10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgY29uc3Qgc2hhID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ3Jldi1wYXJzZScsICdIRUFEJ10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgcmV0dXJuIHsgYnJhbmNoLCBzaGEgfTtcbn1cblxuLyoqXG4gKiBUaGUgZmxhZ3Mge0BsaW5rIHBhcnNlVmVyc2lvbkFyZ3VtZW50c30gcmVjb2duaXplcywgaW4gdGhlIHNoYXBlIE5vZGUncyBgcGFyc2VBcmdzYCB0YWtlcy4gRXhwb3J0ZWQgc28gYSB3cmFwcGVyXG4gKiB0aGF0IGFkZHMgZmxhZ3Mgb2YgaXRzIG93biBjYW4gcGFyc2UgdGhlbSBhbGwgaW4gb25lIHBhc3MgYW5kIHN0aWxsIHJlYWQgdGhlc2UgdGhyb3VnaFxuICoge0BsaW5rIHRvVXBkYXRlVmVyc2lvbk9wdGlvbnN9LlxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTl9BUkdVTUVOVF9PUFRJT05TID0ge1xuICAnY2hhbmdlbG9nLWZpbGUnOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICduby1idWlsZCc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICduby1jaGFuZ2Vsb2ctZWRpdGluZyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICduby1jaGVja3MnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8tY29tbWl0LXZlcmlmaWNhdGlvbic6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICduby1pc3N1ZS1jbG9zaW5nJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgJ25vLXJlbGVhc2UnOiB7IHR5cGU6ICdib29sZWFuJyB9XG59IGFzIGNvbnN0IHNhdGlzZmllcyBOb25OdWxsYWJsZTxQYXJzZUFyZ3NDb25maWdbJ29wdGlvbnMnXT47XG5cbi8qKlxuICogVGhlIHZhbHVlcyBgcGFyc2VBcmdzYCByZXBvcnRzIGZvciB7QGxpbmsgVkVSU0lPTl9BUkdVTUVOVF9PUFRJT05TfS5cbiAqL1xuZXhwb3J0IHR5cGUgVmVyc2lvbkFyZ3VtZW50VmFsdWVzID0gUmV0dXJuVHlwZTx0eXBlb2YgcGFyc2VBcmdzPFZlcnNpb25Bcmd1bWVudFBhcnNlQ29uZmlnPj5bJ3ZhbHVlcyddO1xuXG4vKipcbiAqIEFuIHVwbG9hZGVkIGFzc2V0IHJldHVybmVkIGJ5IEdpdEh1YiBDTEkgZm9yIHB1YmxpY2F0aW9uIHZlcmlmaWNhdGlvbi5cbiAqL1xuaW50ZXJmYWNlIEdpdEh1YlJlbGVhc2VBc3NldE1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIFRoZSBkb3dubG9hZGFibGUgZmlsZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogR2l0SHViJ3MgdXBsb2FkIHN0YXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVsZWFzZSBmaWVsZHMgcmV0dXJuZWQgYnkgR2l0SHViIENMSSBmb3IgcHVibGljYXRpb24gdmVyaWZpY2F0aW9uLlxuICovXG5pbnRlcmZhY2UgR2l0SHViUmVsZWFzZU1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIFVwbG9hZGVkIGFzc2V0cy5cbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0czogcmVhZG9ubHkgR2l0SHViUmVsZWFzZUFzc2V0TWV0YWRhdGFbXTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJlbGVhc2UgcmVtYWlucyBwcml2YXRlIGFzIGEgZHJhZnQuXG4gICAqL1xuICByZWFkb25seSBpc0RyYWZ0OiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciBHaXRIdWIgbWFya3MgaXQgYXMgYSBwcmUtcmVsZWFzZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzUHJlcmVsZWFzZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBleGFjdCB0YWcgdXNlcnMgd2lsbCBkb3dubG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IHRhZ05hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPbmUgaXNzdWUgcmVmZXJlbmNlIGEgY29tbWl0IGJvZHkgbmFtZXMsIGFzIHtAbGluayBwYXJzZUlzc3VlUmVmZXJlbmNlTGluZX0gcmVhZHMgaXQuXG4gKi9cbmludGVyZmFjZSBJc3N1ZVJlZmVyZW5jZSB7XG4gIC8qKlxuICAgKiBIb3cgdGhlIGNoYW5nZWxvZyBsaW5lIHNob3dzIGl0OiBgI25gIGZvciBhIGJhcmUgbnVtYmVyLCB0aGUgaXNzdWUgVVJMIGluIGFuZ2xlIGJyYWNrZXRzIG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlcmVkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFdmVyeSB3YXkgYSBsaW5lIHRoYXQgYWxyZWFkeSBzaG93cyBpdCBtYXkgc3BlbGwgaXQ6IGAjbmAsIG9yIGBvd25lci9yZXBvI25gIGFuZCB0aGUgaXNzdWUgVVJMLlxuICAgKi9cbiAgcmVhZG9ubHkgc3BlbGxpbmdzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgYHBhcnNlQXJnc2AgY29uZmlndXJhdGlvbiB7QGxpbmsgVmVyc2lvbkFyZ3VtZW50VmFsdWVzfSBpcyBkZXJpdmVkIGZyb20uXG4gKi9cbmludGVyZmFjZSBWZXJzaW9uQXJndW1lbnRQYXJzZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgcmVjb2duaXplZCBmbGFncy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IHR5cGVvZiBWRVJTSU9OX0FSR1VNRU5UX09QVElPTlM7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHZlcnNpb24gaXMgYSBwcmUtcmVsZWFzZSwgc3VjaCBhcyBgMS4yLjQtYmV0YS4wYC5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uLlxuICogQHJldHVybnMgV2hldGhlciBpdCBjYXJyaWVzIGEgcHJlLXJlbGVhc2UgcGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHJlUmVsZWFzZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByZXJlbGVhc2UodmVyc2lvbikgIT09IG51bGw7XG59XG4vKipcbiAqIFBhcnNlcyB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgYSB2ZXJzaW9uIHVwZGF0ZSBpbnRvIGEgdmVyc2lvbiB1cGRhdGUgdHlwZSBhbmRcbiAqIHtAbGluayBVcGRhdGVWZXJzaW9uT3B0aW9uc30uXG4gKlxuICogRWFjaCBiZWhhdmlvciBpcyBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRoZSBjb3JyZXNwb25kaW5nIGAtLW5vLSpgIGZsYWcgdHVybnMgaXQgb2ZmLiBgLS1jaGFuZ2Vsb2ctZmlsZWAgdGFrZXMgYVxuICogdmFsdWUgaW5zdGVhZCBhbmQgaGFzIG5vIGRlZmF1bHQuIFJlY29nbml6ZWQgZmxhZ3M6XG4gKiAtIGAtLWNoYW5nZWxvZy1maWxlPTxwYXRoPmAg4oCUIHVzZSB0aGlzIGZpbGUncyBjb250ZW50cyBhcyB0aGUgbmV3IHZlcnNpb24ncyBjaGFuZ2Vsb2cgc2VjdGlvbiBpbnN0ZWFkIG9mXG4gKiAgIHRoZSBjb21taXQtZGVyaXZlZCBidWxsZXRzLCBhbmQgc2tpcCB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3IGVudGlyZWx5LlxuICogLSBgLS1uby1idWlsZGAg4oCUIHNraXAgdGhlIGJ1aWxkIHN0ZXAgKG9ubHkgc2FmZSB3aGVuIHRoZSBidWlsZCBvdXRwdXQgYWxyZWFkeSBtYXRjaGVzIHRoZSBjdXJyZW50IGNvZGUpLlxuICogLSBgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2Ag4oCUIGdlbmVyYXRlIHRoZSBjaGFuZ2Vsb2cgd2l0aG91dCBvcGVuaW5nIGl0IGZvciBtYW51YWwgcmV2aWV3LlxuICogLSBgLS1uby1jaGVja3NgIOKAlCBza2lwIHRoZSBjbGVhbi1yZXBvIGNoZWNrLCBmb3JtYXQsIHNwZWxsY2hlY2ssIGxpbnQsIG92ZXItZXhwb3N1cmUgYW5hbHlzaXMsIGFuZCB0ZXN0cyAodGhlIGJ1aWxkIHN0aWxsIHJ1bnMpLlxuICogLSBgLS1uby1jb21taXQtdmVyaWZpY2F0aW9uYCDigJQgcGFzcyBgLS1uby12ZXJpZnlgIHRvIHRoZSByZWxlYXNlIGNvbW1pdCwgc2tpcHBpbmcgdGhlIHByZS1jb21taXQgaG9vay5cbiAqIC0gYC0tbm8taXNzdWUtY2xvc2luZ2Ag4oCUIGRvIG5vdCBjbG9zZSB0aGUgaXNzdWVzIHRoZSByZWxlYXNlIGNhcnJpZXMgb25jZSBpdCBpcyBwdWJsaXNoZWQuXG4gKiAtIGAtLW5vLXJlbGVhc2VgIOKAlCBydW4gYWxsIGxvY2FsIHN0ZXBzIGJ1dCBza2lwIHRoZSBwdXNoIGFuZCB0aGUgR2l0SHViIHJlbGVhc2UuXG4gKlxuICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0byBwYXJzZSAodHlwaWNhbGx5IGBwcm9jZXNzLmFyZ3Yuc2xpY2UoMilgKS5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGFyc2VkVmVyc2lvbkFyZ3VtZW50c30gY29udGFpbmluZyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSBhbmQgdGhlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZlcnNpb25Bcmd1bWVudHMoJGFyZ3VtZW50czogc3RyaW5nW10pOiBQYXJzZWRWZXJzaW9uQXJndW1lbnRzIHtcbiAgY29uc3QgeyBwb3NpdGlvbmFscywgdmFsdWVzIH0gPSBwYXJzZUFyZ3Moe1xuICAgIGFsbG93UG9zaXRpb25hbHM6IHRydWUsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGFyZ3NgIGlzIHRoZSBvcHRpb24gbmFtZSBOb2RlJ3MgYHBhcnNlQXJnc2AgcmVhZHMuXG4gICAgYXJnczogJGFyZ3VtZW50cyxcbiAgICBvcHRpb25zOiBWRVJTSU9OX0FSR1VNRU5UX09QVElPTlNcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBvcHRpb25zOiB0b1VwZGF0ZVZlcnNpb25PcHRpb25zKHZhbHVlcyksXG4gICAgdmVyc2lvblVwZGF0ZVR5cGU6IHBvc2l0aW9uYWxzWzBdXG4gIH07XG59XG5cbi8qKlxuICogUHVibGlzaGVzIGEgR2l0SHViIHJlbGVhc2UgZm9yIHRoZSBuZXcgdmVyc2lvbi5cbiAqXG4gKiBDcmVhdGVzIHRoZSByZWxlYXNlIGFuZCBhdHRhY2hlcyB0aGUgZmlsZXMge0BsaW5rIFB1Ymxpc2hHaXRIdWJSZWxlYXNlT3B0aW9ucy5nZXRSZWxlYXNlQXNzZXRQYXRoc30gbmFtZXMuXG4gKlxuICogT25jZSB0aGUgcmVsZWFzZSBleGlzdHMsIHRoZSBpc3N1ZXMgaXQgY2FycmllcyBhcmUgY2xvc2VkIHdpdGggYSBsaW5rIHRvIGl0IChzZWUge0BsaW5rIGNsb3NlUmVsZWFzZWRJc3N1ZXN9KSxcbiAqIHVubGVzcyB7QGxpbmsgUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zLnNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXN9IGlzIGBmYWxzZWAuIEEgZmFpbHVyZSB0aGVyZSBpcyByZXBvcnRlZCBhbmRcbiAqIGRvZXMgbm90IGZhaWwgdGhlIHJlbGVhc2UsIHdoaWNoIGlzIGFscmVhZHkgcHVibGlzaGVkLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIHJlbGVhc2UuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVsZWFzZSBoYXMgYmVlbiBwdWJsaXNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoR2l0SHViUmVsZWFzZShuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFB1Ymxpc2hHaXRIdWJSZWxlYXNlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZ2V0UmVsZWFzZUFzc2V0UGF0aHMgPSBnZXROcG1QYWNrUmVsZWFzZUFzc2V0UGF0aHMsIHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXMgPSB0cnVlLCBzaG91bGRWZXJpZnlSZWxlYXNlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IHJlc29sdmVSZWxlYXNlQXNzZXRQYXRocyhnZXRSZWxlYXNlQXNzZXRQYXRocywgc2hvdWxkVmVyaWZ5UmVsZWFzZSk7XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFtcbiAgICAnZ2gnLFxuICAgICdyZWxlYXNlJyxcbiAgICAnY3JlYXRlJyxcbiAgICBuZXdWZXJzaW9uLFxuICAgIC4uLmZpbGVQYXRocyxcbiAgICAnLS10aXRsZScsXG4gICAgYHYke25ld1ZlcnNpb259YCxcbiAgICAuLi4oc2hvdWxkVmVyaWZ5UmVsZWFzZSA/IFsnLS12ZXJpZnktdGFnJ10gOiBbXSksXG4gICAgLi4uKGlzUHJlUmVsZWFzZShuZXdWZXJzaW9uKSA/IFsnLS1wcmVyZWxlYXNlJ10gOiBbXSksXG4gICAgJy0tbm90ZXMtZmlsZScsXG4gICAgJy0nXG4gIF0sIHtcbiAgICBpc1F1aWV0OiB0cnVlLFxuICAgIHN0ZGluOiBhd2FpdCBnZXRSZWxlYXNlTm90ZXMobmV3VmVyc2lvbilcbiAgfSk7XG5cbiAgaWYgKHNob3VsZFZlcmlmeVJlbGVhc2UpIHtcbiAgICBhd2FpdCB2ZXJpZnlHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb24sIGZpbGVQYXRocyk7XG4gIH1cblxuICBpZiAoIXNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBjbG9zZVJlbGVhc2VkSXNzdWVzU2FmZWx5KG5ld1ZlcnNpb24sIHRydWUpO1xufVxuXG4vKipcbiAqIE1hcHMgdGhlIHZhbHVlcyBgcGFyc2VBcmdzYCByZXBvcnRzIGZvciB7QGxpbmsgVkVSU0lPTl9BUkdVTUVOVF9PUFRJT05TfSBvbnRvIHtAbGluayBVcGRhdGVWZXJzaW9uT3B0aW9uc30uXG4gKlxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSBwYXJzZWQgdmFsdWVzLlxuICogQHJldHVybnMgVGhlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1VwZGF0ZVZlcnNpb25PcHRpb25zKHZhbHVlczogVmVyc2lvbkFyZ3VtZW50VmFsdWVzKTogVXBkYXRlVmVyc2lvbk9wdGlvbnMge1xuICByZXR1cm4ge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoOiB2YWx1ZXNbJ2NoYW5nZWxvZy1maWxlJ10sXG4gICAgc2hvdWxkQnVpbGQ6ICEodmFsdWVzWyduby1idWlsZCddID8/IGZhbHNlKSxcbiAgICBzaG91bGRDbG9zZVJlbGVhc2VkSXNzdWVzOiAhKHZhbHVlc1snbm8taXNzdWUtY2xvc2luZyddID8/IGZhbHNlKSxcbiAgICBzaG91bGRFZGl0Q2hhbmdlbG9nOiAhKHZhbHVlc1snbm8tY2hhbmdlbG9nLWVkaXRpbmcnXSA/PyBmYWxzZSksXG4gICAgc2hvdWxkUmVsZWFzZTogISh2YWx1ZXNbJ25vLXJlbGVhc2UnXSA/PyBmYWxzZSksXG4gICAgc2hvdWxkUnVuQ2hlY2tzOiAhKHZhbHVlc1snbm8tY2hlY2tzJ10gPz8gZmFsc2UpLFxuICAgIHNob3VsZFZlcmlmeUNvbW1pdDogISh2YWx1ZXNbJ25vLWNvbW1pdC12ZXJpZmljYXRpb24nXSA/PyBmYWxzZSlcbiAgfTtcbn1cbi8qKlxuICogVXBkYXRlcyB0aGUgY2hhbmdlbG9nIGZpbGUgd2l0aCBuZXcgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgY29tbWl0IG1lc3NhZ2VzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGN1cnJlbnQgY2hhbmdlbG9nLCBhcHBlbmRzIG5ldyBlbnRyaWVzIGZvciB0aGUgbGF0ZXN0IHZlcnNpb24sXG4gKiBhbmQgcHJvbXB0cyB0aGUgdXNlciB0byByZXZpZXcgdGhlIGNoYW5nZXMuXG4gKlxuICogVGhlIHJldmlldyBoYXBwZW5zIG9uIGEgc2NyYXRjaCBjb3B5IGluIHRoZSBPUyB0ZW1wb3JhcnkgZm9sZGVyLCBhbmQgdGhlIHJlcG9zaXRvcnkncyBvd25cbiAqIGBDSEFOR0VMT0cubWRgIGlzIHdyaXR0ZW4gb25seSBvbmNlIHRoZSByZXZpZXcgaXMgb3ZlciDigJQgc28gaW50ZXJydXB0aW5nIHRoZSByZXZpZXcgbGVhdmVzIHRoZVxuICogcmVwb3NpdG9yeSB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIGJlIGFkZGVkIHRvIHRoZSBjaGFuZ2Vsb2cuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlQ2hhbmdlbG9nT3B0aW9uc30gY29udHJvbGxpbmcgdGhlIGNoYW5nZWxvZyByZXZpZXcgYmVoYXZpb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoYW5nZWxvZyB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVDaGFuZ2Vsb2cobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgd3JpdGVDaGFuZ2Vsb2coYXdhaXQgcHJlcGFyZUNoYW5nZWxvZyhuZXdWZXJzaW9uLCBvcHRpb25zKSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHVwZGF0ZSB0eXBlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBzZXJpZXMgb2YgdGFza3MgdG8gaGFuZGxlIHZlcnNpb24gdXBkYXRlczpcbiAqIDEuIFZhbGlkYXRlcyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZS5cbiAqIDIuIENoZWNrcyBpZiBHaXQgYW5kIEdpdEh1YiBDTEkgYXJlIGluc3RhbGxlZC5cbiAqIDMuIFZlcmlmaWVzIHRoYXQgdGhlIGludGVyYWN0aXZlIGNoYW5nZWxvZyByZXZpZXcsIGlmIG9uZSBpcyBkdWUsIGNhbiBhY3R1YWxseSBiZSBhbnN3ZXJlZC5cbiAqIDQuIFZlcmlmaWVzIHRoYXQgdGhlIGJ1bXAgaXMgbm90IGxvd2VyIHRoYW4gdGhlIGNvbW1pdHMgc2luY2UgdGhlIGxhc3QgdGFnIGZvcmNlIGl0IHRvIGJlLlxuICogNS4gVmVyaWZpZXMgdGhhdCB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgY2xlYW4uXG4gKiA2LiBSdW5zIHNwZWxsY2hlY2sgYW5kIGxpbnRpbmcuXG4gKiA3LiBCdWlsZHMgdGhlIHByb2plY3QuXG4gKiA4LiBTZXR0bGVzIHRoZSBjaGFuZ2Vsb2cg4oCUIHRoZSBvbmx5IHN0ZXAgdGhhdCBjYW4gYmxvY2sgb24gYSBodW1hbiwgYW5kIGRlbGliZXJhdGVseSB0aGUgbGFzdCBvbmUgYmVmb3JlXG4gKiAgICBhbnl0aGluZyBpcyB3cml0dGVuLCBzbyBhbiBpbnRlcnJ1cHQgaGVyZSBsZWF2ZXMgdGhlIHdvcmtpbmcgdHJlZSBjbGVhbiBhbmQgdGhlIHJlbGVhc2UgcmUtcnVubmFibGUuXG4gKiAgICBUaGUgc2V0dGxlZCB0ZXh0IGlzIGxpbnRlZCBoZXJlIHRvbzogYGxpbnQ6bWRgIHJhbiBpbiBzdGVwIDYsIGJlZm9yZSBhIGNoYXJhY3RlciBvZiBpdCBleGlzdGVkLlxuICogOS4gVXBkYXRlcyB2ZXJzaW9uIGluIGZpbGVzIChhbmQgaW4gd2hhdGV2ZXIge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zLnVwZGF0ZVZlcnNpb25JbkV4dHJhRmlsZXN9IGFkZHMpLCB0aGVuXG4gKiAgICB3cml0ZXMgdGhlIHNldHRsZWQgY2hhbmdlbG9nLlxuICogMTAuIEFkZHMgdXBkYXRlZCBmaWxlcyB0byBHaXQsIHRhZ3MgdGhlIGNvbW1pdCwgYW5kIHB1c2hlcyB0byB0aGUgcmVwb3NpdG9yeS5cbiAqIDExLiBQcmVwYXJlcyBhbmQgcHVibGlzaGVzIGEgR2l0SHViIHJlbGVhc2UuXG4gKiAxMi4gQ2xvc2VzIHRoZSBpc3N1ZXMgdGhlIHJlbGVhc2UgY2Fycmllcywgd2l0aCBhIGxpbmsgdG8gaXQuXG4gKlxuICogV2l0aCB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnMuc2hvdWxkUHVibGlzaEJlZm9yZVB1c2h9LCBwcmVwYXJhdGlvbiBhbmQgYXNzZXQgdmFsaWRhdGlvbiBwcmVjZWRlXG4gKiB0aGUgdGFnIHB1c2guIFB1YmxpY2F0aW9uIGFuZCB2ZXJpZmljYXRpb24gdGhlbiBwcmVjZWRlIHRoZSBicmFuY2ggcHVzaCwgYW5kIGlzc3VlIGNsb3NpbmcgcmVtYWlucyBsYXN0LlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB0eXBlIG9mIHZlcnNpb24gdXBkYXRlIHRvIHBlcmZvcm0gKG1ham9yLCBtaW5vciwgcGF0Y2gsIHByZW1ham9yLCBwcmVtaW5vciwgcHJlcGF0Y2gsIHByZXJlbGVhc2UsIG9yIHgueS56Wy1zdWZmaXhdKS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBVcGRhdGVWZXJzaW9uT3B0aW9uc30gY29udHJvbGxpbmcgdGhlIHJlbGVhc2UgYmVoYXZpb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHZlcnNpb24gdXBkYXRlIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlVmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZT86IHN0cmluZywgb3B0aW9uczogVXBkYXRlVmVyc2lvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgY2hhbmdlbG9nRmlsZVBhdGgsXG4gICAgZ2V0UmVsZWFzZUFzc2V0UGF0aHMgPSBnZXROcG1QYWNrUmVsZWFzZUFzc2V0UGF0aHMsXG4gICAgcHJlcGFyZUdpdEh1YlJlbGVhc2UsXG4gICAgc2hvdWxkQnVpbGQgPSB0cnVlLFxuICAgIHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXMgPSB0cnVlLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2cgPSB0cnVlLFxuICAgIHNob3VsZFB1Ymxpc2hCZWZvcmVQdXNoID0gZmFsc2UsXG4gICAgc2hvdWxkUmVsZWFzZSA9IHRydWUsXG4gICAgc2hvdWxkUnVuQ2hlY2tzID0gdHJ1ZSxcbiAgICBzaG91bGRWZXJpZnlDb21taXQgPSB0cnVlLFxuICAgIHVwZGF0ZVZlcnNpb25JbkV4dHJhRmlsZXNcbiAgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKCF2ZXJzaW9uVXBkYXRlVHlwZSkge1xuICAgIGNvbnN0IG5wbU9sZFZlcnNpb24gPSBwcm9jZXNzLmVudlsnbnBtX29sZF92ZXJzaW9uJ107XG4gICAgY29uc3QgbnBtTmV3VmVyc2lvbiA9IHByb2Nlc3MuZW52WyducG1fbmV3X3ZlcnNpb24nXTtcblxuICAgIGlmIChucG1PbGRWZXJzaW9uICYmIG5wbU5ld1ZlcnNpb24pIHtcbiAgICAgIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkZpbGVzKG5wbU9sZFZlcnNpb24pO1xuICAgICAgYXdhaXQgdXBkYXRlVmVyc2lvbihucG1OZXdWZXJzaW9uLCBvcHRpb25zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHZlcnNpb24gdXBkYXRlIHR5cGUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIHZhbGlkYXRlKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgYXdhaXQgYXNzZXJ0R2l0SW5zdGFsbGVkKCk7XG4gIGF3YWl0IGFzc2VydEdpdEh1YkNsaUluc3RhbGxlZCgpO1xuICAvLyBDaGVja2VkIGhlcmUsIGJlZm9yZSB0aGUgY2hlY2tzIGFuZCB0aGUgYnVpbGQsIHJhdGhlciB0aGFuIGF0IHRoZSBjaGFuZ2Vsb2cgc3RlcCBpdHNlbGY6IGEgbm9uLWludGVyYWN0aXZlXG4gIC8vIGNhbGxlciBsZWFybnMgaW4gc2Vjb25kcyBpbnN0ZWFkIG9mIHBheWluZyBmb3IgdGhlIHdob2xlIHByZWZsaWdodCBhbmQgb25seSB0aGVuIGJsb2NraW5nIG9uIGFuIGVkaXRvclxuICAvLyB3aW5kb3cgbm9ib2R5IHdpbGwgZXZlciBjbG9zZS5cbiAgYXNzZXJ0Q2hhbmdlbG9nU3RlcElzTm9uQmxvY2tpbmcoY2hhbmdlbG9nRmlsZVBhdGgsIHNob3VsZEVkaXRDaGFuZ2Vsb2cpO1xuICAvLyBTYW1lIHBsYWNlbWVudCwgc2FtZSByZWFzb24uIERlbGliZXJhdGVseSBOT1QgdW5kZXIgYHNob3VsZFJ1bkNoZWNrc2A6IHRoYXQgZmxhZyBidXlzIGEgZmFzdCByZWxlYXNlIGJ5XG4gIC8vIHNraXBwaW5nIHRoZSBWRVJJRklDQVRJT04gb2YgdGhlIGNvZGUsIGFuZCB0aGlzIGlzIGEgY29ycmVjdG5lc3MgZ2F0ZSBvbiB0aGUgcmVsZWFzZSBpdHNlbGYg4oCUIHRoZSBidW1wXG4gIC8vIGEgYC0tbm8tY2hlY2tzYCByZWxlYXNlIHNoaXBzIGlzIGFzIHB1YmxpYywgYW5kIGFzIHVuZml4YWJsZSBhZnRlcndhcmRzLCBhcyBhbnkgb3RoZXIuXG4gIGF3YWl0IGFzc2VydFZlcnNpb25VcGRhdGVUeXBlTWVldHNCdW1wRmxvb3IodmVyc2lvblVwZGF0ZVR5cGUpO1xuICAvLyBTYW1lIHBsYWNlbWVudCwgc2FtZSByZWFzb246IGEgY2hhbmdlbG9nIHNlY3Rpb24gbm9ib2R5IHdpbGwgcmV2aWV3IGlzIGZ1bGx5IGtub3duIGJlZm9yZSB0aGUgZ2F0ZSwgYW5kIGEgc3ViamVjdCBpdFxuICAvLyBmYWlscyBvbiBpcyBhbHJlYWR5IHB1c2hlZCwgc28gbGVhcm5pbmcgdGhhdCBhZnRlciB0aGUgcHJlZmxpZ2h0IG9ubHkgY29zdHMgdGhlIHByZWZsaWdodC5cbiAgYXdhaXQgYXNzZXJ0Tm9uSW50ZXJhY3RpdmVDaGFuZ2Vsb2dJc1B1Ymxpc2hhYmxlKHZlcnNpb25VcGRhdGVUeXBlLCBjaGFuZ2Vsb2dGaWxlUGF0aCwgc2hvdWxkRWRpdENoYW5nZWxvZyk7XG5cbiAgaWYgKHNob3VsZFJ1bkNoZWNrcykge1xuICAgIGF3YWl0IGFzc2VydEdpdFJlcG9DbGVhbigpO1xuICB9XG5cbiAgLy8gUmVhZCBiZWZvcmUgdGhlIGdhdGUsIHNvIGEgY2hlY2tvdXQgc3dpdGNoZWQgYXQgYW55IHBvaW50IG9mIHRoZSByZWxlYXNlIGlzIGNhdWdodCBhZnRlciB0aGUgY29tbWl0LlxuICBjb25zdCBzdGFydEhlYWQgPSBhd2FpdCByZWFkR2l0SGVhZFN0YXRlKCk7XG5cbiAgLy8gVGhlIHJlc3Qgb2YgdGhlIHByZWZsaWdodCBJUyBgbnBtIHJ1biBnYXRlYCwgbm90IGEgY29weSBvZiBpdDogYSBjaGVjayBhZGRlZCB0byB0aGUgZ2F0ZSBpcyByZWFjaGFibGVcbiAgLy8gZnJvbSB0aGUgYnJhbmNoIGFuZCBmcm9tIHRoZSByZWxlYXNlIGJ5IGNvbnN0cnVjdGlvbiwgaW5zdGVhZCBvZiBieSB0d28gbGlzdHMgaGFwcGVuaW5nIHRvIGFncmVlLlxuICAvLyBUaGUgY2xlYW4tcmVwbyBhc3NlcnRpb24gYWJvdmUgc3RheXMgaGVyZSwgYmVjYXVzZSB0aGUgZ2F0ZSBpcyBydW4gb24gYSBkaXJ0eSB0cmVlIG9uIHB1cnBvc2UuXG4gIC8vIFRoZSBidWlsZCBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgcHVibGlzaGluZywgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLCBzbyBpdCBydW5zIHVubGVzcyBgc2hvdWxkQnVpbGRgIGlzIGBmYWxzZWAg4oCUIHRoaXMga2VlcHMgdGhlIHJlbGVhc2VkIGFydGlmYWN0cyBpbiBzeW5jIHdpdGggdGhlIGN1cnJlbnQgY29kZSBldmVuIG9uIGEgZmFzdCByZWxlYXNlLlxuICBhd2FpdCBnYXRlKHtcbiAgICBzaG91bGRCdWlsZCxcbiAgICBzaG91bGRSdW5DaGVja3MsXG4gICAgc2hvdWxkUnVuSW50ZWdyYXRpb25UZXN0czogdHJ1ZVxuICB9KTtcblxuICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZSk7XG5cbiAgLy8gVGhlIGNoYW5nZWxvZyBpcyBzZXR0bGVkIEJFRk9SRSBhbnl0aGluZyBpcyB3cml0dGVuLCBiZWNhdXNlIHRoaXMgaXMgdGhlIG9ubHkgc3RlcCB0aGF0IGNhbiBibG9jayBvbiBhXG4gIC8vIGh1bWFuLiBJbnRlcnJ1cHRpbmcgaXQgdGhlcmVmb3JlIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIHByaXN0aW5lIGFuZCB0aGUgd2hvbGUgcmVsZWFzZSByZS1ydW5uYWJsZSxcbiAgLy8gaW5zdGVhZCBvZiBzdHJhbmRpbmcgYSBidW1wZWQtYnV0LXVuY29tbWl0dGVkIHRyZWUgdGhhdCBgYXNzZXJ0R2l0UmVwb0NsZWFuYCB0aGVuIHJlZnVzZXMgdG8gcmUtcmVsZWFzZS5cbiAgY29uc3QgbmV3Q2hhbmdlTG9nID0gYXdhaXQgcHJlcGFyZUNoYW5nZWxvZyhuZXdWZXJzaW9uLCB7XG4gICAgY2hhbmdlbG9nRmlsZVBhdGgsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZ1xuICB9KTtcblxuICBhd2FpdCB1cGRhdGVWZXJzaW9uSW5GaWxlcyhuZXdWZXJzaW9uKTtcbiAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRXh0cmFGaWxlcz8uKG5ld1ZlcnNpb24pO1xuXG4gIGF3YWl0IHdyaXRlQ2hhbmdlbG9nKG5ld0NoYW5nZUxvZyk7XG4gIGF3YWl0IGFkZFVwZGF0ZWRGaWxlc1RvR2l0KG5ld1ZlcnNpb24sIHsgc2hvdWxkVmVyaWZ5Q29tbWl0IH0pO1xuICAvLyBUaGUgdGFnIG5hbWVzIHRoZSB2ZXJpZmllZCBjb21taXQgcmF0aGVyIHRoYW4gd2hhdGV2ZXIgYEhFQURgIGlzIGJ5IHRoZSB0aW1lIGBnaXQgdGFnYCBydW5zLlxuICBjb25zdCByZWxlYXNlQ29tbWl0U2hhID0gYXdhaXQgYXNzZXJ0UmVsZWFzZUNvbW1pdExhbmRlZChuZXdWZXJzaW9uLCBzdGFydEhlYWQsICd0YWdnaW5nJyk7XG4gIGF3YWl0IGFkZEdpdFRhZyhuZXdWZXJzaW9uLCByZWxlYXNlQ29tbWl0U2hhKTtcblxuICBpZiAoIXNob3VsZFJlbGVhc2UpIHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpKCdTa2lwcGluZyBnaXQgcHVzaCBhbmQgR2l0SHViIHJlbGVhc2UgKC0tbm8tcmVsZWFzZSkuIFRoZSB2ZXJzaW9uIGJ1bXAsIGNoYW5nZWxvZywgY29tbWl0LCBhbmQgdGFnIGhhdmUgYmVlbiBjcmVhdGVkIGxvY2FsbHkuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFB1Ymxpc2hCZWZvcmVQdXNoKSB7XG4gICAgYXdhaXQgcHJlcGFyZUdpdEh1YlJlbGVhc2U/LihuZXdWZXJzaW9uKTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCByZXNvbHZlUmVsZWFzZUFzc2V0UGF0aHMoZ2V0UmVsZWFzZUFzc2V0UGF0aHMsIHRydWUpO1xuICAgIGF3YWl0IGFzc2VydFJlbGVhc2VDb21taXRMYW5kZWQobmV3VmVyc2lvbiwgc3RhcnRIZWFkLCAncHVzaGluZycpO1xuICAgIGNvbnN0IHRhZ0NvbW1pdFNoYSA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdyZXYtcGFyc2UnLCBgcmVmcy90YWdzLyR7bmV3VmVyc2lvbn1ee31gXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIGlmICh0YWdDb21taXRTaGEgIT09IHJlbGVhc2VDb21taXRTaGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVmdXNpbmcgdG8gcHVzaCAke25ld1ZlcnNpb259OiBpdHMgdGFnIG5vIGxvbmdlciBuYW1lcyB0aGUgdmVyaWZpZWQgcmVsZWFzZSBjb21taXQuYCk7XG4gICAgfVxuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdwdXNoJywgJ29yaWdpbicsIGByZWZzL3RhZ3MvJHtuZXdWZXJzaW9ufTpyZWZzL3RhZ3MvJHtuZXdWZXJzaW9ufWBdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgYXdhaXQgcHVibGlzaEdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbiwge1xuICAgICAgZ2V0UmVsZWFzZUFzc2V0UGF0aHM6ICgpID0+IFByb21pc2UucmVzb2x2ZShmaWxlUGF0aHMpLFxuICAgICAgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3VlczogZmFsc2UsXG4gICAgICBzaG91bGRWZXJpZnlSZWxlYXNlOiB0cnVlXG4gICAgfSk7XG4gICAgYXdhaXQgYXNzZXJ0UmVsZWFzZUNvbW1pdExhbmRlZChuZXdWZXJzaW9uLCBzdGFydEhlYWQsICdwdXNoaW5nJyk7XG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ3B1c2gnLCAnb3JpZ2luJywgYCR7cmVsZWFzZUNvbW1pdFNoYX06cmVmcy9oZWFkcy8ke3N0YXJ0SGVhZC5icmFuY2h9YF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBhd2FpdCBjbG9zZVJlbGVhc2VkSXNzdWVzU2FmZWx5KG5ld1ZlcnNpb24sIHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGFzc2VydFJlbGVhc2VDb21taXRMYW5kZWQobmV3VmVyc2lvbiwgc3RhcnRIZWFkLCAncHVzaGluZycpO1xuICBhd2FpdCBnaXRQdXNoKCk7XG4gIGF3YWl0IHByZXBhcmVHaXRIdWJSZWxlYXNlPy4obmV3VmVyc2lvbik7XG4gIGF3YWl0IHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb24sIHsgZ2V0UmVsZWFzZUFzc2V0UGF0aHMsIHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXMgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdmVyc2lvbiBpbiBgcGFja2FnZS5qc29uYCBhbmQsIHdoZXJlIHRoZXkgZXhpc3QsIGBwYWNrYWdlLWxvY2suanNvbmAgYW5kIGBucG0tc2hyaW5rd3JhcC5qc29uYC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBzdHJpbmcgdG8gdXBkYXRlIGluIHRoZSBmaWxlcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlVmVyc2lvbkluRmlsZXMobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGVkaXRQYWNrYWdlSnNvbigocGFja2FnZUpzb24pID0+IHtcbiAgICBwYWNrYWdlSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgfSk7XG5cbiAgYXdhaXQgZWRpdFBhY2thZ2VMb2NrSnNvbih1cGRhdGUsIHsgc2hvdWxkU2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbiAgYXdhaXQgZWRpdE5wbVNocmlua1dyYXBKc29uKHVwZGF0ZSwgeyBzaG91bGRTa2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZShwYWNrYWdlTG9ja0pzb246IFBhY2thZ2VMb2NrSnNvbik6IHZvaWQge1xuICAgIHBhY2thZ2VMb2NrSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICBjb25zdCBkZWZhdWx0UGFja2FnZSA9IHBhY2thZ2VMb2NrSnNvbi5wYWNrYWdlcz8uWycnXTtcbiAgICBpZiAoZGVmYXVsdFBhY2thZ2UpIHtcbiAgICAgIGRlZmF1bHRQYWNrYWdlLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byBlbnN1cmUgaXQgaXMgZWl0aGVyIGEgcmVjb2duaXplZCB0eXBlXG4gKiBvciBhIHZhbGlkIG1hbnVhbCB2ZXJzaW9uIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byB2YWxpZGF0ZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgaXMgaW52YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlKSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdJbnZhbGlkIHZlcnNpb24gdXBkYXRlIHR5cGUuIFBsZWFzZSB1c2UgXFwnbWFqb3JcXCcsIFxcJ21pbm9yXFwnLCBcXCdwYXRjaFxcJywgXFwncHJlbWFqb3JcXCcsIFxcJ3ByZW1pbm9yXFwnLCBcXCdwcmVwYXRjaFxcJywgXFwncHJlcmVsZWFzZVxcJywgb3IgXFwneC55LnpbLXN1ZmZpeF1cXCcgZm9ybWF0LidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVmdXNlcyBhIGNoYW5nZWxvZyB3aG9zZSBORVcgc2VjdGlvbiBtYXRjaGVzIG9uZSBvZiB0aGUgbWFpbnRhaW5lcidzIG93biB1bnB1Ymxpc2hlZCBmb3JiaWRkZW4gcGF0dGVybnMuXG4gKlxuICogRXZlcnkgY29tbWl0IHN1YmplY3Qgc2luY2UgdGhlIGxhc3QgdGFnIHNoaXBzIHZlcmJhdGltIGludG8gdGhlIG5ldyBzZWN0aW9uLCBzbyBhIHN1YmplY3QgdGhhdCBjYXJyaWVzXG4gKiB2b2NhYnVsYXJ5IHByaXZhdGUgdG8gdGhlIG1haW50YWluZXIg4oCUIGFuIGludGVybmFsIHRyYWNrZXIgaWQsIGEgcHJpdmF0ZSBwcm9qZWN0IHNob3J0IG5hbWUg4oCUIGxhbmRzIGluIGFcbiAqIGNoZWNrZWQtaW4sIHB1Ymxpc2hlZCBmaWxlIGluc2lkZSB0aGUgcmVsZWFzZSBjb21taXQsIHdoZXJlIG5vdGhpbmcgZXZlciBsb29rcyBhdCBpdCBhZ2Fpbi4gVGhlIGxpc3Qgb2Ygd2hhdFxuICogY291bnRzIGFzIHByaXZhdGUgY2Fubm90IGxpdmUgaW4gdGhpcyBsaWJyYXJ5IG9yIGluIHRoZSByZXBvc2l0b3J5IHdpdGhvdXQgcHVibGlzaGluZyB0aGUgdmVyeSB0aGluZyBpdFxuICogcHJvdGVjdHMsIHNvIGl0IGNvbWVzIGZyb20gdGhlIGZpbGUge0BsaW5rIEZPUkJJRERFTl9QQVRURVJOU19GSUxFX0VOVl9WQVJJQUJMRX0gbmFtZXMsIGFuZCB0aGlzIGlzIGEgbm8tb3BcbiAqIHdoZXJldmVyIHRoYXQgaXMgbm90IGNvbmZpZ3VyZWQuXG4gKlxuICogTGlrZSB7QGxpbmsgYXNzZXJ0Q2hhbmdlbG9nSGFzTm9NZXJnZVN1YmplY3RzfSwgb25seSB0aGUgc2VjdGlvbiBiZWluZyBwdWJsaXNoZWQgaXMgc2Nhbm5lZCwgYW5kIHRoZSB0aHJvd1xuICogY29tZXMgYmVmb3JlIGFueXRoaW5nIGlzIHdyaXR0ZW4uXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0NvbnRlbnQgLSBUaGUgZnVsbCBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50LlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiB3aG9zZSBzZWN0aW9uIGlzIGFib3V0IHRvIGJlIHB1Ymxpc2hlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2VjdGlvbiBpcyBjbGVhbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXNzZXJ0Q2hhbmdlbG9nSGFzTm9Gb3JiaWRkZW5QYXR0ZXJucyhjaGFuZ2Vsb2dDb250ZW50OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYXR0ZXJucyA9IGF3YWl0IHJlYWRGb3JiaWRkZW5QYXR0ZXJucygpO1xuICBjb25zdCBtYXRjaGVzID0gZmluZEZvcmJpZGRlblBhdHRlcm5NYXRjaGVzKGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNoYW5nZWxvZ0NvbnRlbnQsIHZlcnNpb24pLCBwYXR0ZXJucyk7XG5cbiAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBUaGUgJHt2ZXJzaW9ufSBzZWN0aW9uIG9mICR7UmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBtYXRjaGVzIGEgcGF0dGVybiBmcm9tIHRoZSBmaWxlYFxuICAgICAgKyBgICR7Rk9SQklEREVOX1BBVFRFUk5TX0ZJTEVfRU5WX1ZBUklBQkxFfSBuYW1lczpcXG5gXG4gICAgICArIGAke21hdGNoZXMubWFwKCh7IGxpbmUsIG1hdGNoIH0pID0+IGAke2xpbmV9ICAgIDwtICR7bWF0Y2h9YCkuam9pbignXFxuJyl9XFxuYFxuICAgICAgKyAnTm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHlldC4gU3VwcGx5IHJlbGVhc2Ugbm90ZXMgdGhhdCBzYXkgdGhlIHNhbWUgdGhpbmcgd2l0aG91dCBpdCwgd2l0aCdcbiAgICAgICsgJyBgLS1jaGFuZ2Vsb2ctZmlsZSA8cGF0aD5gLCBvciByZW1vdmUgaXQgYXQgdGhlIGludGVyYWN0aXZlIHJldmlldywgYW5kIHJlLXJ1biB0aGUgcmVsZWFzZS4nXG4gICk7XG59XG5cbi8qKlxuICogUmVmdXNlcyBhIGNoYW5nZWxvZyB3aG9zZSBORVcgc2VjdGlvbiBzdGlsbCBjYXJyaWVzIGFuIGVudHJ5IHRoYXQgcmVhZHMgYXMgYSBtZXJnZSBzdWJqZWN0IGdpdCB3cm90ZSBpdHNlbGYuXG4gKlxuICogVGhlIGNvbnZlbnRpb24gdGhpcyBlbmZvcmNlcyBpcyB0aGF0IGEgbm9uLWZmIG1lcmdlIHRha2VzIHRoZSBzYW1lIENvbnZlbnRpb25hbC1Db21taXRzIHN1YmplY3QgYXMgdGhlIGJyYW5jaFxuICogY29tbWl0IGl0IGxhbmRzLiBOb3RoaW5nIHVzZWQgdG8gaG9sZCBpdDogZm9yIGEgbm9uLWZmIG1lcmdlIHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0IGlzIHRoZSBtZXJnZSBjb21taXQsIHNvIGFcbiAqIGRlZmF1bHQgc3ViamVjdCBzaGlwcyB2ZXJiYXRpbSwgcHVibGlzaGluZyBhIGJhcmUgYnJhbmNoIG5hbWUgKGBNZXJnZSBicmFuY2ggJ2ZpeC10aGUtdGhpbmcnYCkgYXMgYSBjaGFuZ2Vsb2dcbiAqIGVudHJ5IOKAlCB3aGljaCBzYXlzIG5vdGhpbmcgYWJvdXQgd2hhdCBjaGFuZ2VkLCBhbmQgb24gYSBicmFuY2ggbmFtZWQgYWZ0ZXIgYSBwcml2YXRlIHRyYWNrZXIgaXRlbSBkZWNvZGVzIHRvXG4gKiBub3RoaW5nIGF0IGFsbCBmb3IgYSByZWFkZXIuIFRoZSBpbnRlcmFjdGl2ZSByZXZpZXcgd2FzIHRoZSBkZSBmYWN0byBjYXRjaCwgYW5kIGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCwgdGhlXG4gKiBmbGFnIGFuIHVuYXR0ZW5kZWQgcmVsZWFzZSBhY3R1YWxseSB1c2VzLCBza2lwcyBpdDsgb25lIHN3ZWVwIGFjcm9zcyB0aGlzIHdvcmtzcGFjZSBmb3VuZCB0d2VsdmUgc3VjaFxuICogcHVibGlzaGVkIGVudHJpZXMgaW4gYSBzaW5nbGUgcmVwb3NpdG9yeS5cbiAqXG4gKiBPbmx5IHRoZSBzZWN0aW9uIGJlaW5nIHB1Ymxpc2hlZCBpcyBzY2FubmVkLCBzbyBhbiBlbnRyeSBhbHJlYWR5IHNoaXBwZWQgdW5kZXIgYW4gb2xkZXIgdmVyc2lvbiBjYW5ub3QgYmxvY2tcbiAqIGV2ZXJ5IGZ1dHVyZSByZWxlYXNlLiB7QGxpbmsgdG9DaGFuZ2Vsb2dFbnRyeX0gaGFzIGFscmVhZHkgcmV3cml0dGVuIGV2ZXJ5IG1lcmdlIHRoYXQgaGFkIGEgYm9keSB0byByZXdyaXRlXG4gKiBmcm9tLCBzbyB3aGF0IHJlYWNoZXMgaGVyZSBpcyBhIG1lcmdlIHdob3NlIGF1dGhvciB3cm90ZSBub3RoaW5nIGF0IGFsbCDigJQgd2hpY2ggbm8gcmV3cml0ZSBjYW4gaW52ZW50LCBhbmRcbiAqIHdoaWNoIGlzIHRoZXJlZm9yZSB3b3J0aCBzdG9wcGluZyB0aGUgcmVsZWFzZSBmb3IuXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0NvbnRlbnQgLSBUaGUgZnVsbCBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50LlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiB3aG9zZSBzZWN0aW9uIGlzIGFib3V0IHRvIGJlIHB1Ymxpc2hlZC5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Q2hhbmdlbG9nSGFzTm9NZXJnZVN1YmplY3RzKGNoYW5nZWxvZ0NvbnRlbnQ6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IEJVTExFVF9SRUdfRVhQID0gL14tIC87XG4gIGNvbnN0IG9mZmVuZGluZ0VudHJpZXMgPSBleHRyYWN0Q2hhbmdlbG9nU2VjdGlvbihjaGFuZ2Vsb2dDb250ZW50LCB2ZXJzaW9uKVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiBNRVJHRV9TVUJKRUNUX1JFR19FWFAudGVzdChsaW5lLnJlcGxhY2UoQlVMTEVUX1JFR19FWFAsICcnKSkpO1xuXG4gIGlmIChvZmZlbmRpbmdFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgVGhlICR7dmVyc2lvbn0gc2VjdGlvbiBvZiAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gY2FycmllcyBhIG1lcmdlIHN1YmplY3QgZ2l0IHdyb3RlIGl0c2VsZjpcXG5gXG4gICAgICArIGAke29mZmVuZGluZ0VudHJpZXMuam9pbignXFxuJyl9XFxuYFxuICAgICAgKyAnU3VjaCBhbiBlbnRyeSBwdWJsaXNoZXMgYSBicmFuY2ggbmFtZSBpbnN0ZWFkIG9mIHNheWluZyB3aGF0IHNoaXBwZWQuIEdpdmUgdGhlIG1lcmdlIGNvbW1pdCB0aGUgc2FtZSdcbiAgICAgICsgJyBzdWJqZWN0IGFzIHRoZSBicmFuY2ggY29tbWl0IGl0IGxhbmRzIChgZ2l0IGNvbW1pdCAtLWFtZW5kYCBvbiB0aGUgbWVyZ2UsIHRoZW4gcmUtcnVuIHRoZSByZWxlYXNlKSwgb3InXG4gICAgICArICcgc3VwcGx5IHRoZSByZWxlYXNlIG5vdGVzIHlvdXJzZWxmIHdpdGggYC0tY2hhbmdlbG9nLWZpbGUgPHBhdGg+YC4nXG4gICk7XG59XG5cbi8qKlxuICogUmVmdXNlcyBhIHJlbGVhc2UgdGhhdCB3b3VsZCBoYXZlIHRvIHN0b3AgYXQgdGhlIGludGVyYWN0aXZlIGNoYW5nZWxvZyByZXZpZXcgd2l0aCBub2JvZHkgdGhlcmUgdG9cbiAqIGZpbmlzaCBpdC4gQ2FsbGVkIGZyb20gdGhlIHByZWZsaWdodCBzbyB0aGUgcmVmdXNhbCBjb3N0cyBzZWNvbmRzLCBub3QgdGhlIHdob2xlIGNoZWNrLWFuZC1idWlsZCBnYXRlLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dGaWxlUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBwcmVwYXJlZCByZWxlYXNlIG5vdGVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vbmUuXG4gKiBAcGFyYW0gc2hvdWxkRWRpdENoYW5nZWxvZyAtIFdoZXRoZXIgdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaXMgbWVhbnQgdG8gYmUgcmV2aWV3ZWQgaW50ZXJhY3RpdmVseS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Q2hhbmdlbG9nU3RlcElzTm9uQmxvY2tpbmcoY2hhbmdlbG9nRmlsZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2hvdWxkRWRpdENoYW5nZWxvZzogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoY2hhbmdlbG9nRmlsZVBhdGggIT09IHVuZGVmaW5lZCB8fCAhc2hvdWxkRWRpdENoYW5nZWxvZyB8fCBwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICdUaGUgaW50ZXJhY3RpdmUgY2hhbmdlbG9nIHJldmlldyBuZWVkcyBhIHRlcm1pbmFsLCBhbmQgdGhpcyBwcm9jZXNzIGhhcyBub25lLCBzbyB0aGUgcmVsZWFzZSB3b3VsZCBibG9jayBmb3JldmVyLidcbiAgICAgICsgJyBQYXNzIGAtLWNoYW5nZWxvZy1maWxlIDxwYXRoPmAgdG8gc3VwcGx5IHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMsIG9yIGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCB0byBhY2NlcHQgdGhlJ1xuICAgICAgKyAnIGNoYW5nZWxvZyBnZW5lcmF0ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzIGFzIGlzLidcbiAgKTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBjaGVja3Mge0BsaW5rIHByZXBhcmVDaGFuZ2Vsb2d9IHJ1bnMgb24gYSBjaGFuZ2Vsb2cgbm9ib2R5IHdpbGwgcmV2aWV3LCBiZWZvcmUgdGhlIGdhdGUgcmF0aGVyIHRoYW5cbiAqIGFmdGVyIGl0LlxuICpcbiAqIFdpdGhvdXQgYW4gaW50ZXJhY3RpdmUgcmV2aWV3IChgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2AsIG9yIGAtLWNoYW5nZWxvZy1maWxlYCksIHRoZSBuZXcgc2VjdGlvbiBpcyBmdWxseSBkZWNpZGVkXG4gKiBieSB3aGF0IGlzIGFscmVhZHkgY29tbWl0dGVkLCBzbyBldmVyeSBjaGVjayBgcHJlcGFyZUNoYW5nZWxvZ2Agd291bGQgdGhyb3cgb24gY2FuIGJlIGFuc3dlcmVkIGluIHNlY29uZHMuIEFcbiAqIHJlbGVhc2Ugb25jZSBwYXNzZWQgaXRzIHdob2xlIDI1LW1pbnV0ZSBwcmVmbGlnaHQgYW5kIHdhcyB0aGVuIHJlZnVzZWQgYnkgYGxpbnQ6bWRgIG92ZXIgYSBwdXNoZWQgY29tbWl0IHN1YmplY3RcbiAqIGl0IGNvdWxkIGhhdmUgbmFtZWQgYXQgdGhlIHN0YXJ0LiBXaXRoIGEgcmV2aWV3IGR1ZSwgbm90aGluZyBpcyBjaGVja2VkIGhlcmUsIGJlY2F1c2UgdGhlIGF1dGhvciBjYW4gc3RpbGwgZml4XG4gKiBhIGZpbmRpbmcgaW4gdGhlIGVkaXRvci5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgcmVxdWVzdGVkIHZlcnNpb24gdXBkYXRlIHR5cGUuXG4gKiBAcGFyYW0gY2hhbmdlbG9nRmlsZVBhdGggLSBUaGUgcHJlcGFyZWQgbm90ZXMsIHdoZW4gdGhlIHJlbGVhc2Ugd2FzIGdpdmVuIHRoZW0uXG4gKiBAcGFyYW0gc2hvdWxkRWRpdENoYW5nZWxvZyAtIFdoZXRoZXIgdGhlIGludGVyYWN0aXZlIHJldmlldyB3YXMgYXNrZWQgZm9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZWN0aW9uIHdvdWxkIHBhc3MsIGFuZCByZWplY3RzIG5hbWluZyB3aGF0IGl0IGZhaWxzIG9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBhc3NlcnROb25JbnRlcmFjdGl2ZUNoYW5nZWxvZ0lzUHVibGlzaGFibGUoXG4gIHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcsXG4gIGNoYW5nZWxvZ0ZpbGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNob3VsZEVkaXRDaGFuZ2Vsb2c6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoaXNDaGFuZ2Vsb2dSZXZpZXdEdWUoY2hhbmdlbG9nRmlsZVBhdGgsIHNob3VsZEVkaXRDaGFuZ2Vsb2cpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbmV3VmVyc2lvbiA9IGF3YWl0IGdldE5ld1ZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGUpO1xuICBjb25zdCBjaGFuZ2Vsb2cgPSBhd2FpdCBjb21wb3NlQ2hhbmdlbG9nTm9ib2R5UmV2aWV3cyhuZXdWZXJzaW9uLCBjaGFuZ2Vsb2dGaWxlUGF0aCk7XG4gIGNvbnN0IGZpbmRpbmdzID0gYXdhaXQgZ2V0Q2hhbmdlbG9nU2VjdGlvbkZpbmRpbmdzKGNoYW5nZWxvZywgbmV3VmVyc2lvbik7XG4gIGlmIChmaW5kaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgdG9DaGFuZ2Vsb2dGaW5kaW5nc0Vycm9yKGZpbmRpbmdzLCBuZXdWZXJzaW9uKTtcbiAgfVxuXG4gIGFzc2VydENoYW5nZWxvZ0hhc05vTWVyZ2VTdWJqZWN0cyhjaGFuZ2Vsb2csIG5ld1ZlcnNpb24pO1xuICBhd2FpdCBhc3NlcnRDaGFuZ2Vsb2dIYXNOb0ZvcmJpZGRlblBhdHRlcm5zKGNoYW5nZWxvZywgbmV3VmVyc2lvbik7XG59XG5cbi8qKlxuICogUmVmdXNlcyBhIHJlbGVhc2Ugd2hvc2UgYnVtcCBpcyBMT1dFUiB0aGFuIHRoZSBjb21taXRzIGl0IGlzIGFib3V0IHRvIHB1Ymxpc2ggZm9yY2UgaXQgdG8gYmUuXG4gKlxuICogVGhlIHJ1bGUgdGhpcyBlbmZvcmNlcyBpcyBvbGQgYW5kIHdhcyB3cml0dGVuIGRvd24gYWZ0ZXIgYDk2LjUuMWAgc2hpcHBlZCBzaXggdW5yZWxlYXNlZCBgZmVhdDpgIGNvbW1pdHMgYXNcbiAqIGEgcGF0Y2g6IGNob29zZSB0aGUgYnVtcCBmcm9tIHRoZSB3aG9sZSByYW5nZSBzaW5jZSB0aGUgbGFzdCB0YWcsIG5ldmVyIGZyb20gdGhlIGNoYW5nZSB5b3UgaGFwcGVuIHRvIGJlXG4gKiB3b3JraW5nIG9uLiBJdCBkaWQgbm90IGhvbGQg4oCUIGAxMDUuMS4wYCBvZiB0aGlzIGxpYnJhcnkgaXMgYSBNSU5PUiBjYXJyeWluZyBgZmVhdCh2aXRlc3QtY29uZmlnKSFgLCBzbyBldmVyeVxuICogY29uc3VtZXIgb24gYSBjYXJldCByYW5nZSB0b29rIGEgYnJlYWtpbmcgY2hhbmdlIHdpdGggbm8gdmVyc2lvbiBzaWduYWwg4oCUIGFuZCBpdCBjb3VsZCBub3QgaG9sZCwgYmVjYXVzZSBpdFxuICogYXNrZWQgYSBodW1hbiB0byBzY2FuIGEgcmFuZ2UgYW5kIHRoZW4gdHlwZSBhIGJ1bXAgdGhhdCBub3RoaW5nIGNvbXBhcmVkIGFnYWluc3Qgd2hhdCB0aGUgc2NhbiB3b3VsZCBoYXZlXG4gKiBmb3VuZC4gVGhpcyBpcyB0aGF0IGNvbXBhcmlzb24sIGF0IHRoZSBvbmUgbW9tZW50IHRoZSBydWxlIGlzIGJlaW5nIGJyb2tlbi5cbiAqXG4gKiBJdCByZWZ1c2VzIG9ubHkgYSBidW1wIHRoYXQgaXMgdG9vIExPVy4gQSBkZWxpYmVyYXRlbHkgaGlnaGVyIG9uZSDigJQgYSBtYWpvciBjdXQgdG8gc2lnbmFsIGEgYnJlYWsgbGF0ZSwgYVxuICogbWlub3IgZm9yIGEgcmFuZ2Ugb2YgcHVyZSBgZml4YGVzIOKAlCBwYXNzZXMgdW50b3VjaGVkLCBhbmQgdGhlcmUgaXMgbm8gZmxhZyB0byBzd2l0Y2ggdGhlIGdhdGUgb2ZmOiBhblxuICogb3B0LW91dCBpcyB3aGF0IGdldHMgcmVhY2hlZCBmb3IgcmVmbGV4aXZlbHksIGFuZCB0aGUgbGVnaXRpbWF0ZSBlc2NhcGUgKGJ1bXAgaGlnaGVyKSBhbHJlYWR5IGV4aXN0cy5cbiAqXG4gKiBDYWxsZWQgZnJvbSB0aGUgcHJlZmxpZ2h0IHJhdGhlciB0aGFuIGF0IHRoZSBidW1wIGl0c2VsZiwgc28gYSByZWZ1c2FsIGNvc3RzIHNlY29uZHMgaW5zdGVhZCBvZiB0aGUgd2hvbGVcbiAqIGNoZWNrLWFuZC1idWlsZCBnYXRlLCBhbmQgbm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHdoZW4gaXQgdGhyb3dzLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRoZSByZWxlYXNlIHdhcyBhc2tlZCBmb3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydFZlcnNpb25VcGRhdGVUeXBlTWVldHNCdW1wRmxvb3IodmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2ZXJzaW9uRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpO1xuICBjb25zdCBsYXN0VGFnID0gYXdhaXQgcmVzb2x2ZUxhc3RSZWxlYXNlZFRhZyhhd2FpdCByZWFkUHJldmlvdXNDaGFuZ2Vsb2dMaW5lcygpKTtcblxuICAvLyBObyBiYXNlbGluZSwgbm8gcmFuZ2UsIG5vIGZsb29yLiBUaGlzIGlzIGEgZmlyc3QgcmVsZWFzZSwgb3Igb25lIHdob3NlIHByZXZpb3VzIHRhZyB3YXMgZGVsZXRlZCDigJQgdGhlXG4gIC8vIGNoYW5nZWxvZyBzdGVwIGZhbGxzIGJhY2sgdG8gdGhlIGZ1bGwgaGlzdG9yeSB0aGVyZSwgYW5kIGRlcml2aW5nIGEgZmxvb3IgZnJvbSB0aGUgZnVsbCBoaXN0b3J5IG9mIGEgcmVwb1xuICAvLyBhYm91dCB0byBjdXQgYDEuMC4wYCB3b3VsZCByZWZ1c2UgaXQgb3ZlciBjb21taXRzIHRoYXQgcHJlZGF0ZSB0aGUgY29uY2VwdCBvZiBhIHB1Ymxpc2hlZCBzdXJmYWNlLlxuICBpZiAoIWxhc3RUYWcpIHtcbiAgICB2ZXJzaW9uRGVidWdnZXIoJ05vIHByZXZpb3VzIHJlbGVhc2UgdGFnIHJlc29sdmVkLCBzbyB0aGUgYnVtcCBmbG9vciBpcyBub3QgZGVyaXZlZC4gVGhlIGJ1bXAgaXMgdGFrZW4gYXMgZ2l2ZW4uJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYnVtcEZsb29yID0gYXdhaXQgZ2V0QnVtcEZsb29yKGAke2xhc3RUYWd9Li5IRUFEYCk7XG4gIGNvbnN0IGZsb29yTGV2ZWwgPSBidW1wRmxvb3IubGV2ZWw7XG4gIGlmIChmbG9vckxldmVsID09PSBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCBnZXROZXdWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgY29uc3QgdGFrZW5MZXZlbCA9IHRvRWZmZWN0aXZlQnVtcExldmVsKGxhc3RUYWcsIG5ld1ZlcnNpb24pO1xuXG4gIC8vIEFuIHVucGFyc2FibGUgYmFzZWxpbmUgb3IgdGFyZ2V0IGlzIG5vdCB0aGlzIGdhdGUncyBidXNpbmVzcyB0byBmYWlsIGEgcmVsZWFzZSBvdmVyLiBJdCBjYW4gb25seSBoYXBwZW5cbiAgLy8gZm9yIGEgdGFnIHRoYXQgaXMgbm90IGEgdmVyc2lvbiBhdCBhbGwsIHdoaWNoIGV2ZXJ5IG90aGVyIHN0ZXAgaGVyZSB3b3VsZCBoYXZlIGl0cyBvd24gdHJvdWJsZSB3aXRoLlxuICBpZiAoIXRha2VuTGV2ZWwpIHtcbiAgICB2ZXJzaW9uRGVidWdnZXIoYENvdWxkIG5vdCBjb21wYXJlICcke25ld1ZlcnNpb259JyBhZ2FpbnN0IHRoZSBwcmV2aW91cyB0YWcgJyR7bGFzdFRhZ30nLCBzbyB0aGUgYnVtcCBmbG9vciBpcyBub3QgZW5mb3JjZWQuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzQnVtcExldmVsQXRMZWFzdCh0YWtlbkxldmVsLCBmbG9vckxldmVsKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IHRvQnVtcEZsb29yRXJyb3IoYnVtcEZsb29yLCB7XG4gICAgbGFzdFRhZyxcbiAgICBuZXdWZXJzaW9uLFxuICAgIHRha2VuTGV2ZWwsXG4gICAgdmVyc2lvblVwZGF0ZVR5cGVcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwb3J0cyBpc3N1ZS1jbG9zaW5nIGZhaWx1cmVzIHdpdGhvdXQgZmFpbGluZyBhbiBhbHJlYWR5IHB1Ymxpc2hlZCByZWxlYXNlLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIHdob3NlIGlzc3VlcyBzaG91bGQgY2xvc2UuXG4gKiBAcGFyYW0gc2hvdWxkQ2xvc2UgLSBXaGV0aGVyIHRvIGNsb3NlIHRoZSBpc3N1ZXMgYWZ0ZXIgc3VjY2Vzc2Z1bCBkZWxpdmVyeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2xvc2VSZWxlYXNlZElzc3Vlc1NhZmVseShuZXdWZXJzaW9uOiBzdHJpbmcsIHNob3VsZENsb3NlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghc2hvdWxkQ2xvc2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBjbG9zZVJlbGVhc2VkSXNzdWVzKHsgbmV3VmVyc2lvbiB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFRoZSAke25ld1ZlcnNpb259IHJlbGVhc2UgaXMgcHVibGlzaGVkLCBidXQgY2xvc2luZyB0aGUgaXNzdWVzIGl0IGNhcnJpZXMgZmFpbGVkOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qKlxuICogQ29tcG9zZXMgdGhlIG5ldyBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IOKAlCB0aGUgbmV3IHNlY3Rpb24gZnJvbSB0aGUgY29tbWl0cyBzaW5jZSB0aGUgbGFzdCB0YWcsIG9yIGZyb20gdGhlXG4gKiBwcmVwYXJlZCBub3RlcywgYWJvdmUgdGhlIHByZXZpb3VzIHNlY3Rpb25zIOKAlCB3aXRob3V0IHJldmlld2luZywgY2hlY2tpbmcgb3Igd3JpdGluZyBpdC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdGhlIGNoYW5nZWxvZyBzZWN0aW9uIGlzIHdyaXR0ZW4gZm9yLlxuICogQHBhcmFtIGNoYW5nZWxvZ0ZpbGVQYXRoIC0gVGhlIHByZXBhcmVkIG5vdGVzLCB3aGVuIHRoZSByZWxlYXNlIHdhcyBnaXZlbiB0aGVtLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29tcG9zZWQgY29udGVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29tcG9zZUNoYW5nZWxvZyhuZXdWZXJzaW9uOiBzdHJpbmcsIGNoYW5nZWxvZ0ZpbGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gYXdhaXQgcmVhZFByZXZpb3VzQ2hhbmdlbG9nTGluZXMoKTtcblxuICBsZXQgbmV3Q2hhbmdlTG9nID0gYCMgQ0hBTkdFTE9HXFxuXFxuIyMgJHtuZXdWZXJzaW9ufVxcblxcbmA7XG5cbiAgaWYgKGNoYW5nZWxvZ0ZpbGVQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBsYXN0VGFnID0gYXdhaXQgcmVzb2x2ZUxhc3RSZWxlYXNlZFRhZyhwcmV2aW91c0NoYW5nZWxvZ0xpbmVzKTtcbiAgICBjb25zdCBjb21taXRSYW5nZSA9IGxhc3RUYWcgPyBgJHtsYXN0VGFnfS4uSEVBRGAgOiAnSEVBRCc7XG4gICAgY29uc3QgY29tbWl0TWVzc2FnZXNTdHJpbmcgPSBhd2FpdCBleGVjRnJvbVJvb3QoYGdpdCBsb2cgJHtjb21taXRSYW5nZX0gLS1mb3JtYXQ9JUIgLS1maXJzdC1wYXJlbnQgLXpgLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgY29uc3QgY29tbWl0TWVzc2FnZXMgPSBjb21taXRNZXNzYWdlc1N0cmluZy5zcGxpdCgnXFwwJykuZmlsdGVyKEJvb2xlYW4pLm1hcCgoY29tbWl0TWVzc2FnZSkgPT4gdG9DaGFuZ2Vsb2dFbnRyeShjb21taXRNZXNzYWdlKSk7XG5cbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgY29tbWl0TWVzc2FnZXMpIHtcbiAgICAgIG5ld0NoYW5nZUxvZyArPSBgLSAke2F1dG9saW5rQmFyZVVybHMobWVzc2FnZSl9XFxuYDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJlcGFyZWROb3RlcyA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ0ZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICBuZXdDaGFuZ2VMb2cgKz0gYCR7cmVwbGFjZUFsbCh7ICRzdHJpbmc6IHByZXBhcmVkTm90ZXMsIHJlcGxhY2VyOiAnXFxuJywgc2VhcmNoVmFsdWU6ICdcXHJcXG4nIH0pLnRyaW0oKX1cXG5gO1xuICB9XG5cbiAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMubGVuZ3RoID4gMCkge1xuICAgIG5ld0NoYW5nZUxvZyArPSAnXFxuJztcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcykge1xuICAgICAgbmV3Q2hhbmdlTG9nICs9IGAke2xpbmV9XFxuYDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3Q2hhbmdlTG9nO1xufVxuXG4vKipcbiAqIENvbXBvc2VzIHRoZSBuZXcgYENIQU5HRUxPRy5tZGAgY29udGVudCBmb3IgYSByZWxlYXNlIG5vYm9keSByZXZpZXdzLCBhcHBseWluZyBgbGludDptZDpmaXhgJ3MgZml4ZXMgdG8gYSBzZWN0aW9uXG4gKiBnZW5lcmF0ZWQgZnJvbSBjb21taXQgc3ViamVjdHMuXG4gKlxuICogQSBzdWJqZWN0IGNhbiBmYWlsIGBsaW50Om1kYCB3aXRob3V0IGFueW9uZSBoYXZpbmcgaGFkIHRoZSBjaGFuY2UgdG8gZml4IGl0OiBhIGAtLW5vLWZmYCBtZXJnZSBpcyBtYWRlIHdpdGhcbiAqIGBIVVNLWT0wYCwgc28gY29tbWl0bGludCBuZXZlciBzZWVzIGl0LCBhbmQgYW4gaXNzdWUtY2xvc2luZyBtZXJnZSB0YWtlcyB0aGUgaXNzdWUgdGl0bGUgdmVyYmF0aW0uIEFuIE9ic2lkaWFuXG4gKiBwbHVnaW4ncyBzdWJqZWN0IG5hbWluZyB0aGUgcGx1Z2luIHdpdGhvdXQgYmFja3RpY2tzIHN0b3BwZWQgYSByZWxlYXNlIHRoYXQgd2F5IHRocmVlIHRpbWVzLCBhZnRlciB0aGUgd2hvbGVcbiAqIHByZWZsaWdodC4gV2hhdGV2ZXIgdGhlIHJlcG9zaXRvcnkncyBjb25maWd1cmF0aW9uIGNhbiBmaXggaXMgZml4ZWQgaGVyZSwgYW5kIHdoYXQgaXQgY2Fubm90IGlzIHN0aWxsIHJlZnVzZWQgYnlcbiAqIHRoZSBmaW5kaW5ncyBjaGVjayB0aGF0IGZvbGxvd3MuIFByZXBhcmVkIG5vdGVzIGFyZSB0aGUgYXV0aG9yJ3MgcmV2aWV3ZWQgdGV4dCwgc28gdGhleSBhcmUgbmV2ZXIgcmV3cml0dGVuLCBhbmRcbiAqIG9ubHkgdGhlIG5ldyBzZWN0aW9uIGlzIHRvdWNoZWQsIG5ldmVyIGEgcHVibGlzaGVkIG9uZS5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdGhlIGNoYW5nZWxvZyBzZWN0aW9uIGlzIHdyaXR0ZW4gZm9yLlxuICogQHBhcmFtIGNoYW5nZWxvZ0ZpbGVQYXRoIC0gVGhlIHByZXBhcmVkIG5vdGVzLCB3aGVuIHRoZSByZWxlYXNlIHdhcyBnaXZlbiB0aGVtLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29tcG9zZWQgY29udGVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29tcG9zZUNoYW5nZWxvZ05vYm9keVJldmlld3MobmV3VmVyc2lvbjogc3RyaW5nLCBjaGFuZ2Vsb2dGaWxlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2hhbmdlbG9nID0gYXdhaXQgY29tcG9zZUNoYW5nZWxvZyhuZXdWZXJzaW9uLCBjaGFuZ2Vsb2dGaWxlUGF0aCk7XG4gIGlmIChjaGFuZ2Vsb2dGaWxlUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNoYW5nZWxvZztcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gIGlmICghT2JqZWN0LmtleXMocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkuaW5jbHVkZXMoTElOVF9NRF9TQ1JJUFRfTkFNRSkpIHtcbiAgICByZXR1cm4gY2hhbmdlbG9nO1xuICB9XG5cbiAgY29uc3Qgc2VjdGlvbiA9IGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNoYW5nZWxvZywgbmV3VmVyc2lvbik7XG4gIGNvbnN0IHsgY29udGVudCwgZml4Q291bnQgfSA9IGF3YWl0IGZpeE1hcmtkb3duQ29udGVudCh7XG4gICAgY29udGVudDogdG9DaGFuZ2Vsb2dTZWN0aW9uRG9jdW1lbnQoY2hhbmdlbG9nLCBuZXdWZXJzaW9uKSxcbiAgICBmaWxlUGF0aDogcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBSZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSlcbiAgfSk7XG4gIGlmIChmaXhDb3VudCA9PT0gMCkge1xuICAgIHJldHVybiBjaGFuZ2Vsb2c7XG4gIH1cblxuICBjb25zb2xlLndhcm4oYEZpeGVkICR7U3RyaW5nKGZpeENvdW50KX0gbWFya2Rvd25saW50IGZpbmRpbmcocykgaW4gdGhlIGdlbmVyYXRlZCAke25ld1ZlcnNpb259IGNoYW5nZWxvZyBzZWN0aW9uLCBzbyBpdCBkaWZmZXJzIGZyb20gdGhlIGNvbW1pdCBzdWJqZWN0cy5gKTtcbiAgY29uc3QgaGVhZGluZyA9IGAjIyAke25ld1ZlcnNpb259XFxuXFxuYDtcbiAgcmV0dXJuIGNoYW5nZWxvZy5yZXBsYWNlKGAke2hlYWRpbmd9JHtzZWN0aW9ufWAsICgpID0+IGAke2hlYWRpbmd9JHtleHRyYWN0Q2hhbmdlbG9nU2VjdGlvbihjb250ZW50LCBuZXdWZXJzaW9uKX1gKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVCcmFuY2goYnJhbmNoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnJhbmNoID8gYGJyYW5jaCAnJHticmFuY2h9J2AgOiAnYSBkZXRhY2hlZCBIRUFEJztcbn1cbi8qKlxuICogRXh0cmFjdHMgdGhlIGJvZHkgb2Ygb25lIHZlcnNpb24ncyBgQ0hBTkdFTE9HLm1kYCBzZWN0aW9uIOKAlCBldmVyeXRoaW5nIGJldHdlZW4gaXRzIGAjIyA8dmVyc2lvbj5gIGhlYWRpbmdcbiAqIGFuZCB3aGljaGV2ZXIgY29tZXMgZmlyc3QsIHRoZSBuZXh0IGAjIyBgIGhlYWRpbmcgb3IgdGhlIGVuZCBvZiB0aGUgZmlsZS5cbiAqXG4gKiBFbmRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBpcyBub3QgYW4gZWRnZSBjYXNlIGJ1dCB0aGUgbm9ybWFsIHNoYXBlIG9mIGEgRklSU1QgcmVsZWFzZTogc2VjdGlvbnMgYXJlXG4gKiBwcmVwZW5kZWQsIHNvIHRoZSBuZXdlc3Qgb25lIGlzIGJvdW5kZWQgYnkgdGhlIHByZXZpb3VzIHJlbGVhc2Ugb25seSBvbmNlIGEgcHJldmlvdXMgcmVsZWFzZSBleGlzdHMuIFRoZVxuICogcmVnZXggdGhpcyByZXBsYWNlZCByZXF1aXJlZCBhIHRyYWlsaW5nIGBcXG5cXG4jI2AsIHNvIGV2ZXJ5IGAxLjAuMGAgc2lsZW50bHkgcHVibGlzaGVkIGVtcHR5IHJlbGVhc2Ugbm90ZXMuXG4gKiBUZXJtaW5hdGluZyBvbiBgJyMjICdgIFdJVEggaXRzIHRyYWlsaW5nIHNwYWNlIGlzIHdoYXQga2VlcHMgYW4gYCMjI2Agc3ViLWhlYWRpbmcgaW5zaWRlIHRoZSBzZWN0aW9uXG4gKiBpbnN0ZWFkIG9mIHRydW5jYXRpbmcgaXQgdGhlcmUuXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0NvbnRlbnQgLSBUaGUgZnVsbCBjb250ZW50cyBvZiBgQ0hBTkdFTE9HLm1kYC5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIHZlcnNpb24gd2hvc2Ugc2VjdGlvbiB0byBleHRyYWN0LlxuICogQHJldHVybnMgVGhlIHNlY3Rpb24gYm9keSwgdHJpbW1lZCwgb3IgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGNoYW5nZWxvZyBoYXMgbm8gc2VjdGlvbiBmb3IgdGhhdCB2ZXJzaW9uLlxuICovXG5mdW5jdGlvbiBleHRyYWN0Q2hhbmdlbG9nU2VjdGlvbihjaGFuZ2Vsb2dDb250ZW50OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gY2hhbmdlbG9nQ29udGVudC5zcGxpdCgvXFxyP1xcbi8pO1xuICBjb25zdCBoZWFkaW5nSW5kZXggPSBsaW5lcy5pbmRleE9mKGAjIyAke3ZlcnNpb259YCk7XG4gIGlmIChoZWFkaW5nSW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgYm9keVN0YXJ0SW5kZXggPSBoZWFkaW5nSW5kZXggKyAxO1xuICBjb25zdCBuZXh0SGVhZGluZ09mZnNldCA9IGxpbmVzLnNsaWNlKGJvZHlTdGFydEluZGV4KS5maW5kSW5kZXgoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aCgnIyMgJykpO1xuICBjb25zdCBib2R5RW5kSW5kZXggPSBuZXh0SGVhZGluZ09mZnNldCA9PT0gLTEgPyBsaW5lcy5sZW5ndGggOiBib2R5U3RhcnRJbmRleCArIG5leHRIZWFkaW5nT2Zmc2V0O1xuICByZXR1cm4gbGluZXMuc2xpY2UoYm9keVN0YXJ0SW5kZXgsIGJvZHlFbmRJbmRleCkuam9pbignXFxuJykudHJpbSgpO1xufVxuXG4vKipcbiAqIERlcml2ZXMgdGhlIGxvd2VzdCBidW1wIGEgY29tbWl0IHJhbmdlIG1heSBiZSBwdWJsaXNoZWQgdW5kZXIsIGZyb20gdGhlIENvbnZlbnRpb25hbC1Db21taXRzIG1hcmtlcnMgdGhlXG4gKiBjb21taXRzIGluIGl0IGNhcnJ5LlxuICpcbiAqIEEgYCFgIGJlZm9yZSB0aGUgc3ViamVjdCdzIGNvbG9uLCBvciBhIGBCUkVBS0lORyBDSEFOR0U6YCAvIGBCUkVBS0lORy1DSEFOR0U6YCBmb290ZXIsIGZvcmNlcyBhIG1ham9yOyBhXG4gKiBgZmVhdGAgdHlwZSBmb3JjZXMgYSBtaW5vcjsgZXZlcnl0aGluZyBlbHNlIOKAlCBgZml4YCwgYGNob3JlYCwgYGRvY3NgLCBgcmVmYWN0b3JgLCBhbiB1bnBhcnNhYmxlIHN1YmplY3Qg4oCUXG4gKiBjb25zdHJhaW5zIG5vdGhpbmcgYW5kIHlpZWxkcyBhIHBhdGNoIGZsb29yLCB3aGljaCBpcyBubyBjb25zdHJhaW50IGF0IGFsbC5cbiAqXG4gKiAqKkV2ZXJ5IGNvbW1pdCBpbiB0aGUgcmFuZ2UgaXMgcmVhZCwgZGVsaWJlcmF0ZWx5IE5PVCBvbmx5IHRoZSBmaXJzdC1wYXJlbnQgb25lcyoqLCB3aGljaCBpcyB3aGVyZSB0aGlzXG4gKiBkaWZmZXJzIGZyb20gdGhlIGNoYW5nZWxvZyBnZW5lcmF0ZWQgb3ZlciB0aGUgc2FtZSByYW5nZS4gVGhlIGNoYW5nZWxvZyBpcyBmaXJzdC1wYXJlbnQgYmVjYXVzZSBpdCBwdWJsaXNoZXNcbiAqIG9uZSBsaW5lIHBlciBsYW5kZWQgY2hhbmdlOyBhIGJyZWFraW5nIGNoYW5nZSBpcyBicmVha2luZyB3aGljaGV2ZXIgcGFyZW50IGl0IGFycml2ZWQgb24uIENvbmNyZXRlbHksXG4gKiB7QGxpbmsgdG9DaGFuZ2Vsb2dFbnRyeX0gbGlmdHMgb25seSB0aGUgRklSU1QgbGluZSBvZiBhIG1lcmdlIGJvZHkgb250byBhIGRlZmF1bHQgbWVyZ2Ugc3ViamVjdCwgc28gYVxuICogYEJSRUFLSU5HIENIQU5HRTpgIGZvb3RlciB3cml0dGVuIG9uIGEgYnJhbmNoIGNvbW1pdCBpcyBpbnZpc2libGUgdG8gdGhlIGZpcnN0LXBhcmVudCBoaXN0b3J5IOKAlCBhbmQgYSBmb290ZXJcbiAqIGlzIHRoZSBvbmUgYnJlYWtpbmcgc2lnbmFsIENvbnZlbnRpb25hbCBDb21taXRzIHB1dHMgaW4gdGhlIGJvZHkgcmF0aGVyIHRoYW4gdGhlIHN1YmplY3QuIFRoZSBjb3N0IG9mXG4gKiByZWFkaW5nIGV2ZXJ5dGhpbmcgaXMgb3Zlci1kZXRlY3Rpb246IGEgYnJhbmNoIHdob3NlIGJyZWFraW5nIGNvbW1pdCB3YXMgcmV3b3JrZWQgaW50byBhIG5vbi1icmVha2luZyBtZXJnZVxuICogc3RpbGwgZm9yY2VzIGEgbWFqb3IuIFRoYXQgZGlyZWN0aW9uIGlzIHNhZmUg4oCUIGFuIG92ZXItYnVtcCBjb3N0cyBhIGNvbnN1bWVyIG5vdGhpbmcgYW5kIHRoZSBtZXNzYWdlIG5hbWVzXG4gKiB0aGUgY29tbWl0IHNvIHRoZSBhdXRob3IgY2FuIHNlZSBleGFjdGx5IHdoaWNoIG9uZSDigJQgYW5kIHRoZSBvdGhlciBkaXJlY3Rpb24gaXMgdGhlIGRlZmVjdCB0aGlzIGV4aXN0cyBmb3IuXG4gKlxuICogQHBhcmFtIGNvbW1pdFJhbmdlIC0gVGhlIGdpdCByZXZpc2lvbiByYW5nZSB0byBzY2FuLCBlLmcuIGAxMDUuMi4wLi5IRUFEYC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHtAbGluayBCdW1wRmxvb3J9IHRoZSByYW5nZSBmb3JjZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEJ1bXBGbG9vcihjb21taXRSYW5nZTogc3RyaW5nKTogUHJvbWlzZTxCdW1wRmxvb3I+IHtcbiAgLy8gYCVIJW4lQmAgcHV0cyB0aGUgaGFzaCBvbiBpdHMgb3duIGZpcnN0IGxpbmUgYW5kIHRoZSBmdWxsIG1lc3NhZ2UgdW5kZXIgaXQsIGFuZCBgLXpgIHNlcGFyYXRlcyB0aGVcbiAgLy8gY29tbWl0cyB3aXRoIE5VTCDigJQgc28gbm90aGluZyBpbiBhIGNvbW1pdCBtZXNzYWdlIGNhbiBiZSBtaXN0YWtlbiBmb3IgYSByZWNvcmQgYm91bmRhcnkuXG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdsb2cnLCBjb21taXRSYW5nZSwgJy0tZm9ybWF0PSVIJW4lQicsICcteiddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgY29uc3QgZm9yY2luZ0NvbW1pdHMgPSBvdXRwdXRcbiAgICAuc3BsaXQoJ1xcMCcpXG4gICAgLm1hcCgocmVjb3JkKSA9PiB0b0ZvcmNpbmdDb21taXQocmVjb3JkKSlcbiAgICAuZmlsdGVyKChmb3JjaW5nQ29tbWl0KSA9PiBmb3JjaW5nQ29tbWl0ICE9PSBudWxsKTtcblxuICByZXR1cm4ge1xuICAgIGZvcmNpbmdDb21taXRzLFxuICAgIGxldmVsOiB0b0hpZ2hlc3RCdW1wTGV2ZWwoZm9yY2luZ0NvbW1pdHMpXG4gIH07XG59XG5cbi8qKlxuICogUnVucyBgbGludDptZGAncyBhbmQgYHNwZWxsY2hlY2tgJ3MgY2hlY2tzIG92ZXIgdGhlIE5FVyBzZWN0aW9uIG9mIGEgY29tcG9zZWQgY2hhbmdlbG9nLCBiZWZvcmUgYW55IG9mIGl0XG4gKiByZWFjaGVzIHRoZSByZXBvc2l0b3J5LlxuICpcbiAqIE9ubHkgdGhlIG5ldyBzZWN0aW9uIGlzIGNoZWNrZWQsIGFuZCBkZWxpYmVyYXRlbHkgc28uIFRoZSBob25lc3QgY2hlY2sgaXMgdGhlIHdob2xlIGZpbGUsIGJ1dCBpdCBmYWlscyBhXG4gKiByZWxlYXNlIG9uIGEgZGVmZWN0IGluIGEgc2VjdGlvbiBzb21lYm9keSBzaGlwcGVkIHllYXJzIGFnbyDigJQgd2hpY2ggaXMgYSByZWxlYXNlIG5vYm9keSBjYW4gY3V0IHdpdGhvdXRcbiAqIGZpcnN0IGZpeGluZyBoaXN0b3J5LCBhbmQgaXMgZXhhY3RseSBob3cgYSBjaGFuZ2Vsb2cgZGVmZWN0IGJlY29tZXMgYSBwZXJtYW5lbnQgYmxvY2tlciBpbnN0ZWFkIG9mIGFcbiAqIHR3by1taW51dGUgZml4LiBUaGF0IGlzIG5vdCBoeXBvdGhldGljYWwgZm9yIHRoZSBzcGVsbGluZyBoYWxmIGluIHBhcnRpY3VsYXI6IGl0IGlzIHRoZSBzdGF0ZSBmaXZlXG4gKiByZXBvc2l0b3JpZXMgaW4gdGhpcyB3b3Jrc3BhY2UgYXJlIGluLCBlYWNoIHdpdGggYSBjb2luZWQgd29yZCBhbHJlYWR5IHB1Ymxpc2hlZCBpbiBhbiBvbGQgc2VjdGlvbi4gVGhlIG5ld1xuICogc2VjdGlvbiBpcyB0aGUgb25seSBwYXJ0IHRoaXMgcmVsZWFzZSBpcyByZXNwb25zaWJsZSBmb3IuXG4gKlxuICogQk9USCBjaGVja3MgcnVuIG92ZXIgZXZlcnkgc2V0dGxlLCBhbmQgbmVpdGhlciBzaG9ydC1jaXJjdWl0cyB0aGUgb3RoZXIuIEFuIGF1dGhvciB3aG8gaGFzIGEgaGFyZC13cmFwcGVkXG4gKiBsaW5lIGFuZCBhIGNvaW5lZCB3b3JkIGlzIHRvbGQgYWJvdXQgYm90aCBhdCBvbmNlLCBpbiBvbmUgcm91bmQgb2YgdGhlIHJldmlldywgcmF0aGVyIHRoYW4gZml4aW5nIG9uZSBhbmRcbiAqIGJlaW5nIHNlbnQgYmFjayBmb3IgdGhlIG90aGVyLlxuICpcbiAqIEVhY2ggaGFsZiBydW5zIG9ubHkgd2hlcmUgdGhlIHByb2plY3QgZGVmaW5lcyB0aGUgc2NyaXB0IGl0IHN0YW5kcyBmb3IsIGp1c3QgYXMge0BsaW5rIGdhdGV9IHJ1bnMgdGhhdCBzY3JpcHRcbiAqIG9ubHkgd2hlcmUgaXQgaXMgZGVmaW5lZC4gQSBwcm9qZWN0IHdpdGggbm8gYHNwZWxsY2hlY2tgIGhhcyBubyBzcGVsbGluZyBjb25maWd1cmF0aW9uIGVpdGhlciwgc28gYGNzcGVsbGAgd291bGRcbiAqIGp1ZGdlIGl0cyByZWxlYXNlIG5vdGVzIGFnYWluc3QgdGhlIHN0b2NrIGRpY3Rpb25hcmllcyBhbG9uZSBhbmQgcmVmdXNlIHRoZSByZWxlYXNlIG92ZXIgdGhlIHBsdWdpbidzIG93biBuYW1lOlxuICogYSBjaGVjayB0aGUgcHJvamVjdCBuZXZlciBhZG9wdGVkLCBlbmZvcmNlZCBvbmx5IGF0IHJlbGVhc2UgdGltZS5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nQ29udGVudCAtIFRoZSBmdWxsIGNvbXBvc2VkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gaXMgYWJvdXQgdG8gYmUgcHVibGlzaGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZmluZGluZ3MsIG9yIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlIHNlY3Rpb24gaXMgY2xlYW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENoYW5nZWxvZ1NlY3Rpb25GaW5kaW5ncyhjaGFuZ2Vsb2dDb250ZW50OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IFByb21pc2U8Q2hhbmdlbG9nRmluZGluZ1tdPiB7XG4gIGNvbnN0IGNvbnRlbnQgPSB0b0NoYW5nZWxvZ1NlY3Rpb25Eb2N1bWVudChjaGFuZ2Vsb2dDb250ZW50LCB2ZXJzaW9uKTtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcbiAgY29uc3Qgc2NyaXB0TmFtZXMgPSBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9KTtcblxuICBjb25zdCBtYXJrZG93bmxpbnRGaW5kaW5ncyA9IHNjcmlwdE5hbWVzLmluY2x1ZGVzKExJTlRfTURfU0NSSVBUX05BTUUpXG4gICAgPyBhd2FpdCBsaW50TWFya2Rvd25Db250ZW50KHtcbiAgICAgIGNvbnRlbnQsXG4gICAgICBmaWxlUGF0aFxuICAgIH0pXG4gICAgOiBbXTtcbiAgY29uc3Qgc3BlbGxpbmdGaW5kaW5ncyA9IHNjcmlwdE5hbWVzLmluY2x1ZGVzKFNQRUxMQ0hFQ0tfU0NSSVBUX05BTUUpXG4gICAgPyBhd2FpdCBzcGVsbGNoZWNrQ29udGVudCh7XG4gICAgICBjb250ZW50LFxuICAgICAgZmlsZVBhdGhcbiAgICB9KVxuICAgIDogW107XG5cbiAgcmV0dXJuIFtcbiAgICAuLi5tYXJrZG93bmxpbnRGaW5kaW5ncy5tYXAoKHRleHQpID0+ICh7XG4gICAgICBzY3JpcHROYW1lOiBMSU5UX01EX1NDUklQVF9OQU1FLFxuICAgICAgdGV4dFxuICAgIH0pKSxcbiAgICAuLi5zcGVsbGluZ0ZpbmRpbmdzLm1hcCgodGV4dCkgPT4gKHtcbiAgICAgIHNjcmlwdE5hbWU6IFNQRUxMQ0hFQ0tfU0NSSVBUX05BTUUsXG4gICAgICB0ZXh0XG4gICAgfSkpXG4gIF07XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcmVsZWFzZSBhc3NldHM6IHRoZSBwcm9qZWN0J3MgYG5wbSBwYWNrYCB0YXJiYWxsLCB3cml0dGVuIGludG8gYGRpc3QvYCwgYW5kIGBkaXN0L3N0eWxlcy5jc3NgLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhc3NldCBwYXRocywgcmVsYXRpdmUgdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TnBtUGFja1JlbGVhc2VBc3NldFBhdGhzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVzdWx0T3V0cHV0ID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnbnBtJywgJ3BhY2snLCAnLS1wYWNrLWRlc3RpbmF0aW9uJywgUmVwb1BhdGhzLkRpc3QsICctLWpzb24nXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICBjb25zdCByZXN1bHQgPSBwYXJzZU5wbVBhY2tPdXRwdXQocmVzdWx0T3V0cHV0KTtcbiAgcmV0dXJuIFtcbiAgICBqb2luKFJlcG9QYXRocy5EaXN0LCByZXN1bHQuZmlsZW5hbWUpLFxuICAgIGpvaW4oUmVwb1BhdGhzLkRpc3QsIFJlcG9QYXRocy5TdHlsZXNDc3MpXG4gIF07XG59XG5cbi8qKlxuICogV2hldGhlciBhIGJ1bXAgcmVhY2hlcyBhIGZsb29yLlxuICpcbiAqIFNwZWxsZWQgb3V0IHJhdGhlciB0aGFuIGdpdmVuIG51bWVyaWMgcmFua3MsIGJlY2F1c2UgdGhyZWUgbGV2ZWxzIGRvIG5vdCBuZWVkIGFuIG9yZGVyaW5nIHNjaGVtZSBhbmQgYVxuICogYDIgPj0gM2AgaW4gYSByZWxlYXNlIGdhdGUgaXMgb25lIHRyYW5zcG9zaXRpb24gYXdheSBmcm9tIHNpbGVudGx5IHBhc3NpbmcgZXZlcnl0aGluZy4gYGZsb29yTGV2ZWxgIGV4Y2x1ZGVzXG4gKiB7QGxpbmsgVmVyc2lvblVwZGF0ZVR5cGUuUGF0Y2h9IGZvciB0aGUgc2FtZSByZWFzb24gaXQgaXMgbm90IHRlc3RlZCBmb3I6IGEgcGF0Y2ggZmxvb3IgaXMgbm8gZmxvb3IsIGFuZCBpdHNcbiAqIG9ubHkgY2FsbGVyIGhhcyBhbHJlYWR5IHJldHVybmVkIGJ5IHRoZW4g4oCUIGEgYnJhbmNoIHRoYXQgY2FuIG9ubHkgZXZlciBhbnN3ZXIgYHRydWVgIGlzIG9uZSBub2JvZHkgcmVhZHMgYW5kXG4gKiBub3RoaW5nIGNvdmVycy5cbiAqXG4gKiBAcGFyYW0gbGV2ZWwgLSBUaGUge0BsaW5rIEJ1bXBMZXZlbH0gYWN0dWFsbHkgdGFrZW4uXG4gKiBAcGFyYW0gZmxvb3JMZXZlbCAtIFRoZSB7QGxpbmsgQnVtcExldmVsfSByZXF1aXJlZC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgYGxldmVsYCBpcyBhdCBsZWFzdCBgZmxvb3JMZXZlbGAuXG4gKi9cbmZ1bmN0aW9uIGlzQnVtcExldmVsQXRMZWFzdChsZXZlbDogQnVtcExldmVsLCBmbG9vckxldmVsOiBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvciB8IFZlcnNpb25VcGRhdGVUeXBlLk1pbm9yKTogYm9vbGVhbiB7XG4gIHJldHVybiBmbG9vckxldmVsID09PSBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvclxuICAgID8gbGV2ZWwgPT09IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yXG4gICAgOiBsZXZlbCAhPT0gVmVyc2lvblVwZGF0ZVR5cGUuUGF0Y2g7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVsZWFzZSBvcGVucyB0aGUgaW50ZXJhY3RpdmUgY2hhbmdlbG9nIHJldmlldy4gUHJlcGFyZWQgbm90ZXMgYXJlIGFscmVhZHkgdGhlIHJldmlld2VkIHRleHQsIHNvXG4gKiB0aGV5IG5ldmVyIG9wZW4gYW4gZWRpdG9yLCB3aGF0ZXZlciBgc2hvdWxkRWRpdENoYW5nZWxvZ2Agc2F5cy5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nRmlsZVBhdGggLSBUaGUgcHJlcGFyZWQgbm90ZXMsIHdoZW4gdGhlIHJlbGVhc2Ugd2FzIGdpdmVuIHRoZW0uXG4gKiBAcGFyYW0gc2hvdWxkRWRpdENoYW5nZWxvZyAtIFdoZXRoZXIgdGhlIGludGVyYWN0aXZlIHJldmlldyB3YXMgYXNrZWQgZm9yLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcmV2aWV3IGlzIGR1ZS5cbiAqL1xuZnVuY3Rpb24gaXNDaGFuZ2Vsb2dSZXZpZXdEdWUoY2hhbmdlbG9nRmlsZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2hvdWxkRWRpdENoYW5nZWxvZzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hhbmdlbG9nRmlsZVBhdGggPT09IHVuZGVmaW5lZCAmJiBzaG91bGRFZGl0Q2hhbmdlbG9nO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBpc3N1ZSByZWZlcmVuY2VzIG9mZiBvbmUge0BsaW5rIElTU1VFX1JFRkVSRU5DRV9MSU5FX1JFR19FWFB9IGxpbmUuXG4gKlxuICogQSBjcm9zcy1yZXBvc2l0b3J5IHJlZmVyZW5jZSBpcyByZW5kZXJlZCBhcyBpdHMgVVJMIHJhdGhlciB0aGFuIGFzIGBvd25lci9yZXBvI25gOiBHaXRIdWIgc2hvd3MgdGhlIFVSTCBhcyB0aGVcbiAqIHNhbWUgc2hvcnQgbGluaywgYW5kIHRoZSBzcGVsbGNoZWNrZXIgdGhlIGNoYW5nZWxvZyBzZWN0aW9uIGlzIGhlbGQgdG8gc2tpcHMgYSBVUkwgYnV0IG5vdCBhIHJlcG9zaXRvcnkgbmFtZS5cbiAqXG4gKiBAcGFyYW0gbGluZSAtIE9uZSBsaW5lIG9mIGEgY29tbWl0IGJvZHkuXG4gKiBAcmV0dXJucyBUaGUgcmVmZXJlbmNlcywgb3IgYG51bGxgIHdoZW4gdGhlIGxpbmUgaXMgbm90IGEgcmVmZXJlbmNlIGxpbmUgb3IgaG9sZHMgYW55dGhpbmcgYnV0IHJlZmVyZW5jZXMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSXNzdWVSZWZlcmVuY2VMaW5lKGxpbmU6IHN0cmluZyk6IElzc3VlUmVmZXJlbmNlW10gfCBudWxsIHtcbiAgY29uc3QgcmVmZXJlbmNlc1RleHQgPSBJU1NVRV9SRUZFUkVOQ0VfTElORV9SRUdfRVhQLmV4ZWMobGluZS50cmltKCkpPy5ncm91cHM/LlsncmVmZXJlbmNlcyddO1xuICBpZiAocmVmZXJlbmNlc1RleHQ/LnJlcGxhY2VBbGwoSVNTVUVfUkVGRVJFTkNFX1JFR19FWFAsICcnKS5yZXBsYWNlQWxsKC9cXGJhbmRcXGJ8W1xccyxdL2csICcnKSAhPT0gJycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKHJlZmVyZW5jZXNUZXh0Lm1hdGNoQWxsKElTU1VFX1JFRkVSRU5DRV9SRUdfRVhQKSwgKG1hdGNoKTogSXNzdWVSZWZlcmVuY2UgPT4ge1xuICAgIGNvbnN0IGJhcmVOdW1iZXIgPSBnZXRPcHRpb25hbE5hbWVkR3JvdXAobWF0Y2gsICdiYXJlTnVtYmVyJyk7XG4gICAgaWYgKGJhcmVOdW1iZXIgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IHJlbmRlcmVkOiBgIyR7YmFyZU51bWJlcn1gLCBzcGVsbGluZ3M6IFtgIyR7YmFyZU51bWJlcn1gXSB9O1xuICAgIH1cbiAgICBjb25zdCByZXBvU2x1ZyA9IGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ3VybFNsdWcnKSA/PyBnZXRPcHRpb25hbE5hbWVkR3JvdXAobWF0Y2gsICdzbHVnJyk7XG4gICAgY29uc3QgaXNzdWVOdW1iZXIgPSBnZXRPcHRpb25hbE5hbWVkR3JvdXAobWF0Y2gsICd1cmxOdW1iZXInKSA/PyBnZXRPcHRpb25hbE5hbWVkR3JvdXAobWF0Y2gsICdzbHVnTnVtYmVyJyk7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUocmVwb1NsdWcpO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKGlzc3VlTnVtYmVyKTtcbiAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb1NsdWd9L2lzc3Vlcy8ke2lzc3VlTnVtYmVyfWA7XG4gICAgcmV0dXJuIHsgcmVuZGVyZWQ6IGA8JHt1cmx9PmAsIHNwZWxsaW5nczogW2Ake3JlcG9TbHVnfSMke2lzc3VlTnVtYmVyfWAsIHVybCwgYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9TbHVnfS9wdWxsLyR7aXNzdWVOdW1iZXJ9YF0gfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHNpbmdsZSBwYWNrIHJlc3VsdCBmcm9tIHRoZSBvdXRwdXQgb2YgYG5wbSBwYWNrIC0tanNvbmAuXG4gKlxuICogVHdvIHRoaW5ncyBtYWtlIHRoaXMgbW9yZSB0aGFuIGEgYEpTT04ucGFyc2UoKWAuIFRoZSBwYXlsb2FkIGlzIFBSRUNFREVEIG9uIHN0ZG91dCBieSB3aGF0ZXZlciB0aGVcbiAqIGBwcmVwYXJlYCBzY3JpcHQgcHJpbnRlZCAodGhlIGBucG0gbm90aWNlYCBsaW5lcyBnbyB0byBzdGRlcnIsIG5vdCBoZXJlKSwgc28gaXRzIHN0YXJ0IGhhcyB0byBiZSBmb3VuZCDigJRcbiAqIGFuZCBpdCBpcyBmb3VuZCBieSBwYXJzaW5nIGZyb20gZWFjaCBjYW5kaWRhdGUgc3RhcnQgcmF0aGVyIHRoYW4gYnkgbWF0Y2hpbmcgYSBsaXRlcmFsLCBiZWNhdXNlIHRoZVxuICogcHJlZml4IG1heSBpdHNlbGYgY29udGFpbiBhIGJyYWNlLiBBbmQgdGhlIHBheWxvYWQncyBTSEFQRSBkZXBlbmRzIG9uIHRoZSBucG0gbWFqb3I6IG5wbSAxMSBhbmQgZWFybGllclxuICogZW1pdCBhbiBhcnJheSBvZiBwYWNrIHJlc3VsdHMsIG5wbSAxMiBlbWl0cyBhbiBvYmplY3Qga2V5ZWQgYnkgcGFja2FnZSBuYW1lLiBCb3RoIGFyZSBhY2NlcHRlZDsgc2Nhbm5pbmdcbiAqIGZvciB0aGUgYXJyYXkncyBsaXRlcmFsIG9wZW5pbmcgaXMgd2hhdCBicm9rZSBldmVyeSByZWxlYXNlIG9uIG5wbSAxMi5cbiAqXG4gKiBAcGFyYW0gb3V0cHV0IC0gVGhlIHN0ZG91dCBvZiBgbnBtIHBhY2sgLS1qc29uYC5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgTnBtUGFja1Jlc3VsdH0gZGVzY3JpYmluZyB0aGUgcGFja2VkIHRhcmJhbGwuXG4gKiBAdGhyb3dzIElmIHRoZSBvdXRwdXQgaG9sZHMgbm8gcGFyc2FibGUgSlNPTiBwYXlsb2FkLCBvciB0aGUgcGF5bG9hZCBob2xkcyBubyBwYWNrIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VOcG1QYWNrT3V0cHV0KG91dHB1dDogc3RyaW5nKTogTnBtUGFja1Jlc3VsdCB7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygb3V0cHV0Lm1hdGNoQWxsKC9bW3tdL2cpKSB7XG4gICAgbGV0IHBheWxvYWQ6IHVua25vd247XG5cbiAgICB0cnkge1xuICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2Uob3V0cHV0LnNsaWNlKG1hdGNoLmluZGV4KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgYXMgTnBtUGFja1Jlc3VsdFtdIDogT2JqZWN0LnZhbHVlcyhwYXlsb2FkIGFzIFJlY29yZDxzdHJpbmcsIE5wbVBhY2tSZXN1bHQ+KTtcbiAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzWzBdO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgbm8gcGFjayByZXN1bHQgaW4gdGhlIGBucG0gcGFjayAtLWpzb25gIG91dHB1dCcpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmaW5kIHRoZSBKU09OIHBheWxvYWQgaW4gdGhlIGBucG0gcGFjayAtLWpzb25gIG91dHB1dCcpO1xufVxuXG4vKipcbiAqIENvbXBvc2VzIHRoZSBmdWxsIG5ldyBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IOKAlCBpbmNsdWRpbmcgdGhlIGludGVyYWN0aXZlIHJldmlldywgd2hlbiBvbmUgaXMgZHVlIOKAlFxuICogV0lUSE9VVCB0b3VjaGluZyB0aGUgcmVwb3NpdG9yeS4gTm90aGluZyBoZXJlIHdyaXRlcyBpbnRvIHRoZSByZXBvLCBzbyBhbiBpbnRlcnJ1cHQgYW55d2hlcmUgaW4gdGhlXG4gKiByZXZpZXcgd2luZG93ICh0aGUgd2hvbGUgcG9pbnQgb2YgdGhlIHNwbGl0KSBsZWF2ZXMgdGhlIHdvcmtpbmcgdHJlZSBleGFjdGx5IGFzIGl0IHdhcy5cbiAqXG4gKiBUaGUgc2V0dGxlZCBjb250ZW50IGlzIGhhbmRlZCB0byB7QGxpbmsgYXNzZXJ0Q2hhbmdlbG9nSGFzTm9NZXJnZVN1YmplY3RzfSBiZWZvcmUgaXQgaXMgcmV0dXJuZWQsIHdoaWNoIGlzXG4gKiBob3cgdGhhdCBndWFyZCByZWFjaGVzIGV2ZXJ5IGNhbGxlciBhbmQgZXZlcnkgcGF0aCDigJQgcmV2aWV3ZWQgb3Igbm90LCBjb21taXQtZGVyaXZlZCBvciBwcmVwYXJlZCDigJQgZnJvbSBhXG4gKiBzaW5nbGUgc2l0ZS5cbiAqXG4gKiBJdCBpcyBhbHNvIHdoZXJlIHRoZSBuZXcgc2VjdGlvbiBpcyBMSU5URUQgYW5kIFNQRUxMQ0hFQ0tFRCwgZm9yIHRoZSBzYW1lIHJlYXNvbiBhbmQgb25lIHRoZSByZWxlYXNlJ3NcbiAqIG9yZGVyaW5nIGZvcmNlczogdGhlIHJlbGVhc2UncyBvbmx5IGBsaW50Om1kYCBhbmQgYHNwZWxsY2hlY2tgIHJ1biBpbiB0aGUgZ2F0ZSwgd2hpY2ggaXMgb3ZlciBiZWZvcmUgdGhpc1xuICogdGV4dCBleGlzdHMsIHNvIGV2ZXJ5IGNoYXJhY3RlciBvZiBhIG5ldyBjaGFuZ2Vsb2cgc2VjdGlvbiB1c2VkIHRvIGVudGVyIHRoZSByZXBvc2l0b3J5IGFmdGVyIHRoZSBvbmx5XG4gKiBjaGVja3MgdGhhdCBjb3VsZCBoYXZlIGxvb2tlZCBhdCBpdC4gVGhlIGdlbmVyYXRvcidzIG93biBidWxsZXRzIGNhbm5vdCBmYWlsIHRoZW0g4oCUIHRoZXkgYXJlIG9uZVxuICogYHRvRmlyc3RMaW5lYCBwZXIgY29tbWl0IOKAlCBidXQgdGhlIHR3byBwYXRocyBhIGh1bWFuIG9yIGFuIGFnZW50IHdyaXRlcywgdGhlIGludGVyYWN0aXZlIHJldmlldyBhbmRcbiAqIGAtLWNoYW5nZWxvZy1maWxlYCwgYXJlIGV4YWN0bHkgdGhlIHBhdGhzIHRoYXQgY2FycnkgcHJvc2UuIEEgZGVmZWN0IHRoZXJlIGRvZXMgbm90IGZhaWwgdGhlIHJlbGVhc2U6IGl0XG4gKiBsYW5kcyBvbiB0aGUgZGVmYXVsdCBicmFuY2ggaW5zaWRlIHRoZSBgY2hvcmU6IHJlbGVhc2VgIGNvbW1pdCwgYW5kIHR1cm5zIHRoZSBORVhUIGdhdGUgcmVkLCBvbiBhIGJyYW5jaFxuICogYmVsb25naW5nIHRvIHNvbWVib2R5IHdobyBkaWQgbm90IHdyaXRlIGl0LlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0aGUgY2hhbmdlbG9nIHNlY3Rpb24gaXMgd3JpdHRlbiBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlQ2hhbmdlbG9nT3B0aW9uc30gY29udHJvbGxpbmcgd2hlcmUgdGhlIHNlY3Rpb24gYm9keSBjb21lcyBmcm9tLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgc2V0dGxlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50LlxuICovXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlQ2hhbmdlbG9nKG5ld1ZlcnNpb246IHN0cmluZywgb3B0aW9uczogVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBjaGFuZ2Vsb2dGaWxlUGF0aCxcbiAgICBzaG91bGRFZGl0Q2hhbmdlbG9nID0gdHJ1ZVxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgaXNSZXZpZXdEdWUgPSBpc0NoYW5nZWxvZ1Jldmlld0R1ZShjaGFuZ2Vsb2dGaWxlUGF0aCwgc2hvdWxkRWRpdENoYW5nZWxvZyk7XG4gIGNvbnN0IG5ld0NoYW5nZUxvZyA9IGlzUmV2aWV3RHVlXG4gICAgPyBhd2FpdCBjb21wb3NlQ2hhbmdlbG9nKG5ld1ZlcnNpb24sIGNoYW5nZWxvZ0ZpbGVQYXRoKVxuICAgIDogYXdhaXQgY29tcG9zZUNoYW5nZWxvZ05vYm9keVJldmlld3MobmV3VmVyc2lvbiwgY2hhbmdlbG9nRmlsZVBhdGgpO1xuICBsZXQgc2V0dGxlZENoYW5nZUxvZyA9IG5ld0NoYW5nZUxvZztcbiAgbGV0IGZpbmRpbmdzOiBDaGFuZ2Vsb2dGaW5kaW5nW10gPSBbXTtcblxuICAvLyBUaGUgY2hlY2tzIHJ1biBvbiB0aGUgU0VUVExFRCB0ZXh0LCBzbyB0aGUgcmV2aWV3IHNpdHMgaW5zaWRlIHRoZSBsb29wIHJhdGhlciB0aGFuIGJlZm9yZSBpdDogdGhlIGF1dGhvciBpc1xuICAvLyBzdGlsbCBzaXR0aW5nIGF0IHRoZSBlZGl0b3IsIHNvIHRoZXkgYXJlIGhhbmRlZCB0aGUgZmluZGluZ3MgYW5kIHRoZSBzYW1lIHNjcmF0Y2ggY29weSBiYWNrLiBBIHJldmlldyB0aGF0XG4gIC8vIHJldHVybnMgYnl0ZS1pZGVudGljYWwgdGV4dCBpcyB0aGUgYXV0aG9yIGRlY2xpbmluZyB0byBmaXggdGhlbSwgd2hpY2ggZW5kcyB0aGUgbG9vcCBpbnN0ZWFkIG9mIHJlb3BlbmluZ1xuICAvLyBmb3IgZXZlci4gVGhlcmUgaXMgbm9ib2R5IHRvIGhhbmQgYSBmaW5kaW5nIHRvIG9uIHRoZSBvdGhlciBwYXRocywgc28gdGhvc2UgdGhyb3cgb24gdGhlIGZpcnN0IG9uZS5cbiAgZm9yICg7Oykge1xuICAgIGlmIChpc1Jldmlld0R1ZSkge1xuICAgICAgY29uc3QgcmV2aWV3ZWRDaGFuZ2VMb2cgPSBhd2FpdCByZXZpZXdDaGFuZ2Vsb2coc2V0dGxlZENoYW5nZUxvZywgZmluZGluZ3MpO1xuICAgICAgaWYgKGZpbmRpbmdzLmxlbmd0aCA+IDAgJiYgcmV2aWV3ZWRDaGFuZ2VMb2cgPT09IHNldHRsZWRDaGFuZ2VMb2cpIHtcbiAgICAgICAgdGhyb3cgdG9DaGFuZ2Vsb2dGaW5kaW5nc0Vycm9yKGZpbmRpbmdzLCBuZXdWZXJzaW9uKTtcbiAgICAgIH1cblxuICAgICAgc2V0dGxlZENoYW5nZUxvZyA9IHJldmlld2VkQ2hhbmdlTG9nO1xuICAgIH1cblxuICAgIGZpbmRpbmdzID0gYXdhaXQgZ2V0Q2hhbmdlbG9nU2VjdGlvbkZpbmRpbmdzKHNldHRsZWRDaGFuZ2VMb2csIG5ld1ZlcnNpb24pO1xuICAgIGlmIChmaW5kaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICghaXNSZXZpZXdEdWUpIHtcbiAgICAgIHRocm93IHRvQ2hhbmdlbG9nRmluZGluZ3NFcnJvcihmaW5kaW5ncywgbmV3VmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGxhc3QgdGhpbmcgdGhlIGNvbXBvc2l0aW9uIGRvZXMsIGFuZCB0aGF0IHBsYWNlbWVudCBpcyB0aGUgd2hvbGUgcG9pbnQ6IHRoaXMgT05FIHNpdGUgc2VlcyB0aGVcbiAgLy8gY29tbWl0LWRlcml2ZWQgYnVsbGV0cywgdGhlIHByZXBhcmVkIG5vdGVzIGFuZCB3aGF0ZXZlciBhIHJldmlldyBsZWZ0IGJlaGluZCwgc28gdGhlIGd1YXJkIHJ1bnMgd2hldGhlciBvciBub3RcbiAgLy8gdGhlIGludGVyYWN0aXZlIHJldmlldyBkb2VzIOKAlCBhbmQgdGhlIHJldmlldyBpcyBwcmVjaXNlbHkgd2hhdCBgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2Agc2tpcHMuIE5vdGhpbmcgaGFzIGJlZW5cbiAgLy8gd3JpdHRlbiB0byB0aGUgcmVwb3NpdG9yeSB5ZXQgZWl0aGVyLCBzbyB0aGUgdGhyb3cgbGVhdmVzIHRoZSB3b3JraW5nIHRyZWUgcHJpc3RpbmUgYW5kIHRoZSByZWxlYXNlIHJlLXJ1bm5hYmxlLlxuICBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHMoc2V0dGxlZENoYW5nZUxvZywgbmV3VmVyc2lvbik7XG4gIGF3YWl0IGFzc2VydENoYW5nZWxvZ0hhc05vRm9yYmlkZGVuUGF0dGVybnMoc2V0dGxlZENoYW5nZUxvZywgbmV3VmVyc2lvbik7XG4gIHJldHVybiBzZXR0bGVkQ2hhbmdlTG9nO1xufVxuXG4vKipcbiAqIFJlYWRzIGBDSEFOR0VMT0cubWRgIGFuZCByZXR1cm5zIGV2ZXJ5dGhpbmcgYmVsb3cgaXRzIGAjIENIQU5HRUxPR2AgaGVhZGVyIOKAlCBzbyB0aGUgZmlyc3QgbGluZSBpcyB0aGVcbiAqIG5ld2VzdCBgIyMgPHZlcnNpb24+YCBoZWFkaW5nLCB3aGljaCBpcyB3aGF0IG5hbWVzIHRoZSBsYXN0IHJlbGVhc2VkIHZlcnNpb24uXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbGluZXMsIG9yIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlIHJlcG9zaXRvcnkgaGFzIG5vIGNoYW5nZWxvZ1xuICogeWV0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUHJldmlvdXNDaGFuZ2Vsb2dMaW5lcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IEhFQURFUl9MSU5FU19DT1VOVCA9IDI7XG4gIGNvbnN0IGNoYW5nZWxvZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgaWYgKCFleGlzdHNTeW5jKGNoYW5nZWxvZ1BhdGgpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICBjb25zdCBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJykuc2xpY2UoSEVBREVSX0xJTkVTX0NPVU5UKTtcbiAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMuYXQoLTEpID09PSAnJykge1xuICAgIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMucG9wKCk7XG4gIH1cblxuICByZXR1cm4gcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgdGFnIG9mIHRoZSBsYXN0IHJlbGVhc2VkIHZlcnNpb24g4oCUIHRoZSBiYXNlbGluZSBib3RoIHRoZSBjaGFuZ2Vsb2cgcmFuZ2UgYW5kIHRoZSBidW1wIGZsb29yIGFyZVxuICogbWVhc3VyZWQgZnJvbSwgZGVyaXZlZCBvbmNlIGhlcmUgc28gdGhvc2UgdHdvIGNhbiBuZXZlciBkaXNhZ3JlZSBhYm91dCB3aGljaCBjb21taXRzIGFyZSBiZWluZyBwdWJsaXNoZWQuXG4gKlxuICogQSBoZWFkaW5nIGlzIG5vdCBhIHRhZy4gQSBoYW5kLXdyaXR0ZW4gYCMjIDAuMC4wYCBwbGFjZWhvbGRlciBpbiBhIG5ldmVyLXRhZ2dlZCByZXBvLCBvciBhIHRhZyBkZWxldGVkIGFmdGVyXG4gKiB0aGUgZmFjdCwgd291bGQgb3RoZXJ3aXNlIHJlYWNoIGBnaXQgbG9nYCBhcyBhIHJldmlzaW9uIGl0IGNhbm5vdCByZXNvbHZlIOKAlCBhbmQgaXQgdXNlZCB0byByZWFjaCBpdCBhdCB0aGVcbiAqIHZlcnkgRU5EIG9mIHRoZSByZWxlYXNlLCBhZnRlciB0aGUgd2hvbGUgcHJlZmxpZ2h0IGhhZCBiZWVuIHBhaWQgZm9yLiBGYWxsaW5nIGJhY2sgdG8gbm8gYmFzZWxpbmVcbiAqIG92ZXItaW5jbHVkZXMgd2hlbiBhIHRhZyB3YXMgZGVsZXRlZCwgYnV0IHRoYXQgaXMgc2FmZSBhbmQgdmlzaWJsZTogdGhlIGNoYW5nZWxvZyByZXZpZXcgaXMgZXhhY3RseSB3aGVyZSBhblxuICogb3Zlci1pbmNsdWRlZCByYW5nZSBnZXRzIHRyaW1tZWQsIGFuZCB0aGUgYnVtcCBmbG9vciBkZWNsaW5lcyB0byBkZXJpdmUgYW55dGhpbmcgYXQgYWxsIHdpdGhvdXQgYSBiYXNlbGluZS5cbiAqXG4gKiBAcGFyYW0gcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcyAtIFRoZSBsaW5lcyB7QGxpbmsgcmVhZFByZXZpb3VzQ2hhbmdlbG9nTGluZXN9IHJldHVybmVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdGFnIG5hbWUsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZXJlIGlzIG5vbmUgdG8gcmVzb2x2ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxhc3RSZWxlYXNlZFRhZyhwcmV2aW91c0NoYW5nZWxvZ0xpbmVzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGxhc3RUYWcgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzWzBdID8/ICcnLFxuICAgIHJlcGxhY2VyOiAnJyxcbiAgICBzZWFyY2hWYWx1ZTogJyMjICdcbiAgfSk7XG5cbiAgaWYgKCFsYXN0VGFnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMYXN0VGFnID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ3Jldi1wYXJzZScsICctLXZlcmlmeScsICctLXF1aWV0JywgYHJlZnMvdGFncy8ke2xhc3RUYWd9YF0sIHtcbiAgICBpc1F1aWV0OiB0cnVlLFxuICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gIH0pO1xuXG4gIGlmICghcmVzb2x2ZWRMYXN0VGFnKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKShcbiAgICAgIGAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gc3RhcnRzIGF0ICcjIyAke2xhc3RUYWd9JywgYnV0IG5vIHN1Y2ggdGFnIGV4aXN0cy4gR2VuZXJhdGluZyB0aGUgY2hhbmdlbG9nIGZyb20gdGhlIGZ1bGwgaGlzdG9yeSBpbnN0ZWFkLmBcbiAgICApO1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBsYXN0VGFnO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGFzc2V0cyBvbmNlIHByZXBhcmF0aW9uIGhhcyBmaW5pc2hlZCwgcmVmdXNpbmcgbWlzc2luZyBmaWxlcyBpbiB0aGUgZ3VhcmRlZCBtb2RlLlxuICpcbiAqIEBwYXJhbSBnZXRQYXRocyAtIFRoZSBjYWxsYmFjayBuYW1pbmcgdGhlIHByZXBhcmVkIGFzc2V0cy5cbiAqIEBwYXJhbSBzaG91bGRSZXF1aXJlQXNzZXRzIC0gV2hldGhlciBhIG1pc3NpbmcgcmVxdWVzdGVkIGFzc2V0IGZhaWxzIHRoZSByZWxlYXNlLlxuICogQHJldHVybnMgVGhlIGV4aXN0aW5nIHBhdGhzIHRvIGF0dGFjaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVJlbGVhc2VBc3NldFBhdGhzKGdldFBhdGhzOiAoKSA9PiBQcm9taXNlPHN0cmluZ1tdPiwgc2hvdWxkUmVxdWlyZUFzc2V0czogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcGF0aHMgPSBhd2FpdCBnZXRQYXRocygpO1xuICByZXR1cm4gcGF0aHMuZmlsdGVyKChwYXRoKSA9PiB7XG4gICAgY29uc3QgaXNFeGlzdHMgPSBleGlzdHNTeW5jKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aCB9KSk7XG4gICAgaWYgKCFpc0V4aXN0cyAmJiBzaG91bGRSZXF1aXJlQXNzZXRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlbGVhc2UgYXNzZXQgZG9lcyBub3QgZXhpc3Q6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzRXhpc3RzO1xuICB9KTtcbn1cblxuLyoqXG4gKiBIYW5kcyB0aGUgY29tcG9zZWQgY2hhbmdlbG9nIHRvIHRoZSB1c2VyIGZvciByZXZpZXcgb24gYSBzY3JhdGNoIGNvcHkgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgYW5kXG4gKiByZXR1cm5zIHdoYXRldmVyIHRoZXkgbGVmdCBiZWhpbmQuIFRoZSBzY3JhdGNoIGZvbGRlciBpcyByZW1vdmVkIGV2ZW4gd2hlbiB0aGUgcmV2aWV3IGZhaWxzLlxuICpcbiAqIEBwYXJhbSBuZXdDaGFuZ2VMb2cgLSBUaGUgY29tcG9zZWQgYENIQU5HRUxPRy5tZGAgY29udGVudCB0byBoYW5kIG92ZXIgZm9yIHJldmlldy5cbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0aGUgcHJldmlvdXMgcm91bmQgb2YgdGhpcyByZXZpZXcgbGVmdCB1bmZpeGVkLCBwcmludGVkIGFib3ZlIHRoZSBwcm9tcHQgc29cbiAqIHRoZSBhdXRob3Igc2VlcyB3aGF0IGhhcyB0byBjaGFuZ2UuIEVtcHR5IG9uIHRoZSBmaXJzdCByb3VuZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldmlld2VkIGNvbnRlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJldmlld0NoYW5nZWxvZyhuZXdDaGFuZ2VMb2c6IHN0cmluZywgZmluZGluZ3M6IENoYW5nZWxvZ0ZpbmRpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHNjcmF0Y2hGb2xkZXIgPSBhd2FpdCBta2R0ZW1wKGpvaW4odG1wZGlyKCksICdjaGFuZ2Vsb2ctJykpO1xuICBjb25zdCBzY3JhdGNoQ2hhbmdlbG9nUGF0aCA9IGpvaW4oc2NyYXRjaEZvbGRlciwgUmVwb1BhdGhzLkNoYW5nZWxvZ01kKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdyaXRlRmlsZShzY3JhdGNoQ2hhbmdlbG9nUGF0aCwgbmV3Q2hhbmdlTG9nLCAndXRmLTgnKTtcblxuICAgIGNvbnN0IGNvZGVWZXJzaW9uID0gYXdhaXQgZXhlY0Zyb21Sb290KCdjb2RlIC0tdmVyc2lvbicsIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnN0IHZlcnNpb25EZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdWZXJzaW9uJyk7XG4gICAgaWYgKGZpbmRpbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZlcnNpb25EZWJ1Z2dlcihcbiAgICAgICAgYCR7UmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBkb2VzIG5vdCBwYXNzICR7dG9GYWlsZWRTY3JpcHROYW1lcyhmaW5kaW5ncyl9IHlldDpcXG4ke3RvRmluZGluZ0xpbmVzKGZpbmRpbmdzKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjb2RlVmVyc2lvbikge1xuICAgICAgdmVyc2lvbkRlYnVnZ2VyKGBQbGVhc2UgdXBkYXRlIHRoZSAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gZmlsZS4gQ2xvc2UgVmlzdWFsIFN0dWRpbyBDb2RlIHdoZW4geW91IGFyZSBkb25lLi4uYCk7XG4gICAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydjb2RlJywgJy13Jywgc2NyYXRjaENoYW5nZWxvZ1BhdGhdLCB7XG4gICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmVyc2lvbkRlYnVnZ2VyKCdDb3VsZCBub3QgZmluZCBWaXN1YWwgU3R1ZGlvIENvZGUgaW4geW91ciBQQVRILiBVc2luZyBjb25zb2xlIG1vZGUgaW5zdGVhZC4nKTtcbiAgICAgIGF3YWl0IGNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCkucXVlc3Rpb24oXG4gICAgICAgIGBQbGVhc2UgdXBkYXRlIHRoZSAke3NjcmF0Y2hDaGFuZ2Vsb2dQYXRofSBmaWxlLiBQcmVzcyBFbnRlciB3aGVuIHlvdSBhcmUgZG9uZS4uLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlYWRGaWxlKHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBybShzY3JhdGNoRm9sZGVyLCB7XG4gICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBlcnJvciB0aGF0IHJlZnVzZXMgYSBidW1wIGxvd2VyIHRoYW4gdGhlIHJhbmdlIGZvcmNlcy5cbiAqXG4gKiBJdCBuYW1lcyBldmVyeSBmb3JjaW5nIGNvbW1pdCB3aXRoIGl0cyBzaG9ydCBoYXNoLCBpdHMgc3ViamVjdCBhbmQgV0hJQ0ggbWFya2VyIGZvcmNlZCBpdCwgYmVjYXVzZSB0aGVcbiAqIHJlbWVkeSBkZXBlbmRzIG9uIHRoYXQ6IGEgYGZlYXQhYCBpcyBhIGRlbGliZXJhdGUgYnJlYWsgc29tZWJvZHkgdHlwZWQsIHdoaWxlIGEgYEJSRUFLSU5HIENIQU5HRTpgIGZvb3RlclxuICogc2l0cyBpbiBhIGJvZHkgbm9ib2R5IHJlLXJlYWRzIGFuZCBpcyBleGFjdGx5IHRoZSB0aGluZyB0aGlzIGdhdGUgZXhpc3RzIHRvIHN1cmZhY2UuIFRoZSBpbnN0cnVjdGlvbiBpcyB0b1xuICogdGFrZSB0aGUgaGlnaGVyIGJ1bXAsIG5vdCB0byBlZGl0IHRoZSBjb21taXRzIOKAlCBoaXN0b3J5IHRoYXQgYWxyZWFkeSByZWFjaGVkIHRoZSBkZWZhdWx0IGJyYW5jaCBpcyB3aGF0IGFcbiAqIHJlbGVhc2UgcHVibGlzaGVzLCBhbmQgcmV3cml0aW5nIGl0IHRvIGRvZGdlIGEgdmVyc2lvbiBzaWduYWwgaXMgdGhlIGRlZmVjdCBvbmUgbGV2ZWwgdXAuXG4gKlxuICogQHBhcmFtIGJ1bXBGbG9vciAtIFRoZSBkZXJpdmVkIHtAbGluayBCdW1wRmxvb3J9LlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUge0BsaW5rIEJ1bXBGbG9vclJlZnVzYWxDb250ZXh0fSBkZXNjcmliaW5nIHdoYXQgd2FzIGFza2VkIGZvci5cbiAqIEByZXR1cm5zIFRoZSBlcnJvciB0byB0aHJvdy5cbiAqL1xuZnVuY3Rpb24gdG9CdW1wRmxvb3JFcnJvcihidW1wRmxvb3I6IEJ1bXBGbG9vciwgY29udGV4dDogQnVtcEZsb29yUmVmdXNhbENvbnRleHQpOiBFcnJvciB7XG4gIGNvbnN0IGZvcmNpbmdMaW5lcyA9IGJ1bXBGbG9vci5mb3JjaW5nQ29tbWl0c1xuICAgIC5tYXAoKGZvcmNpbmdDb21taXQpID0+IGAgICR7Zm9yY2luZ0NvbW1pdC5zaGEuc2xpY2UoMCwgU0hPUlRfU0hBX0xFTkdUSCl9ICAke2ZvcmNpbmdDb21taXQuc3ViamVjdH0gICgke2ZvcmNpbmdDb21taXQubWFya2VyfSlgKVxuICAgIC5qb2luKCdcXG4nKTtcblxuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGBUaGUgY29tbWl0cyBzaW5jZSAke2NvbnRleHQubGFzdFRhZ30gZm9yY2UgYXQgbGVhc3QgYSAke2J1bXBGbG9vci5sZXZlbH0gcmVsZWFzZSwgYnV0ICcke2NvbnRleHQudmVyc2lvblVwZGF0ZVR5cGV9JyB3b3VsZCBwdWJsaXNoYFxuICAgICAgKyBgICR7Y29udGV4dC5uZXdWZXJzaW9ufSwgd2hpY2ggaXMgYSAke2NvbnRleHQudGFrZW5MZXZlbH0uXFxuYFxuICAgICAgKyBgJHtmb3JjaW5nTGluZXN9XFxuYFxuICAgICAgKyAnQSByZWxlYXNlIHB1Ymxpc2hlcyBldmVyeSBjb21taXQgc2luY2UgdGhlIGxhc3QgdGFnLCBub3QgdGhlIGNoYW5nZSB5b3UgaGFwcGVuIHRvIGJlIHdvcmtpbmcgb24sIHNvIHRoZSdcbiAgICAgICsgJyBidW1wIGhhcyB0byBhbnN3ZXIgZm9yIGFsbCBvZiB0aGVtLiBSZS1ydW4gdGhlIHJlbGVhc2Ugd2l0aCBhJ1xuICAgICAgKyBgICR7YnVtcEZsb29yLmxldmVsfSBidW1wIOKAlCBhIGhpZ2hlciBvbmUgaXMgYWx3YXlzIGFjY2VwdGVkLCBhbmQgbm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHlldC5gXG4gICk7XG59XG5cbi8qKlxuICogVHVybnMgb25lIGZ1bGwgY29tbWl0IG1lc3NhZ2UgKGBnaXQgbG9nIC0tZm9ybWF0PSVCYCkgaW50byB0aGUgY2hhbmdlbG9nIGxpbmUgaXQgc2hvdWxkIGNvbnRyaWJ1dGUuXG4gKlxuICogTm9ybWFsbHkgdGhhdCBpcyB0aGUgc3ViamVjdC4gVGhlIGV4Y2VwdGlvbiBpcyBhIG1lcmdlIHdob3NlIHN1YmplY3QgZ2l0IHdyb3RlIGl0c2VsZjogZm9yIGEgbm9uLWZmIG1lcmdlXG4gKiB0aGUgZmlyc3QtcGFyZW50IGNvbW1pdCBJUyB0aGUgbWVyZ2UgY29tbWl0LCBzbyBpdHMgc3ViamVjdCBpcyB3aGF0IHNoaXBzLCBhbmQgYSBkZWZhdWx0IG9uZSBwdWJsaXNoZXMgYVxuICogcHJpdmF0ZSBicmFuY2ggbmFtZSBhcyBhIGNoYW5nZWxvZyBlbnRyeS4gVGhlIG1lc3NhZ2UgdGhlIGF1dGhvciBhY3R1YWxseSB3cm90ZSBpcyB1c3VhbGx5IHN0aWxsIHRoZXJlIOKAlFxuICogb25lIGxpbmUgYmVsb3csIGFzIHRoZSBtZXJnZSBib2R5IOKAlCBzbyBpdCBpcyBsaWZ0ZWQgb3V0IHJhdGhlciB0aGFuIGRpc2NhcmRlZCwgd2hpY2ggaXMgZXhhY3RseSB0aGUgZWRpdCBhXG4gKiBodW1hbiBtYWtlcyBieSBoYW5kIGF0IHRoZSByZXZpZXcgc3RlcC4gQSBtZXJnZSB3aXRoIG5vIGJvZHkgaGFzIG5vdGhpbmcgdG8gbGlmdCBhbmQga2VlcHMgaXRzIHN1YmplY3Q7XG4gKiB7QGxpbmsgYXNzZXJ0Q2hhbmdlbG9nSGFzTm9NZXJnZVN1YmplY3RzfSBpcyB3aGF0IHN0b3BzIHRoYXQgb25lIGZyb20gYmVpbmcgcHVibGlzaGVkLlxuICpcbiAqIFRoZSBpc3N1ZXMgdGhlIGJvZHkgbmFtZXMgb24ge0BsaW5rIElTU1VFX1JFRkVSRU5DRV9MSU5FX1JFR19FWFB9IGxpbmVzIGFyZSBhcHBlbmRlZCB0byB0aGUgbGluZSwgc28gdGhlXG4gKiByZWxlYXNlIGxpbmtzIHRoZW0uIE9ubHkgdGhlIGZpcnN0LXBhcmVudCBjb21taXQncyBib2R5IGlzIHJlYWQsIHNvIGZvciBhIG1lcmdlIGl0IGlzIHRoZSBtZXJnZSBtZXNzYWdlIHRoYXRcbiAqIGhhcyB0byBjYXJyeSB0aGVtLiBBIHJlZmVyZW5jZSB0aGUgbGluZSBhbHJlYWR5IHNob3dzIGlzIG5vdCByZXBlYXRlZC5cbiAqXG4gKiBAcGFyYW0gY29tbWl0TWVzc2FnZSAtIFRoZSBmdWxsIGNvbW1pdCBtZXNzYWdlLlxuICogQHJldHVybnMgVGhlIGNoYW5nZWxvZyBsaW5lIGZvciB0aGF0IGNvbW1pdC5cbiAqL1xuZnVuY3Rpb24gdG9DaGFuZ2Vsb2dFbnRyeShjb21taXRNZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IGNvbW1pdE1lc3NhZ2Uuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHN1YmplY3QgPSBsaW5lc1swXSA/PyAnJztcbiAgY29uc3QgYm9keUxpbmVzID0gbGluZXMuc2xpY2UoMSk7XG4gIGNvbnN0IGVudHJ5ID0gTUVSR0VfU1VCSkVDVF9SRUdfRVhQLnRlc3Qoc3ViamVjdCkgPyBib2R5TGluZXMuZmluZCgobGluZSkgPT4gIXBhcnNlSXNzdWVSZWZlcmVuY2VMaW5lKGxpbmUpKSA/PyBzdWJqZWN0IDogc3ViamVjdDtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiBib2R5TGluZXMuZmxhdE1hcCgobGluZSkgPT4gcGFyc2VJc3N1ZVJlZmVyZW5jZUxpbmUobGluZSkgPz8gW10pKSB7XG4gICAgaWYgKHJlZmVyZW5jZS5zcGVsbGluZ3MuZXZlcnkoKHNwZWxsaW5nKSA9PiAhbmV3IFJlZ0V4cChTdHJpbmcucmF3YCg/PCFbXFx3L10pJHtlc2NhcGVSZWdFeHAoc3BlbGxpbmcpfSg/IVxcZClgKS50ZXN0KGVudHJ5KSkpIHtcbiAgICAgIHJlZmVyZW5jZXMuYWRkKHJlZmVyZW5jZS5yZW5kZXJlZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWZlcmVuY2VzLnNpemUgPT09IDAgPyBlbnRyeSA6IGAke2VudHJ5fSAoJHtbLi4ucmVmZXJlbmNlc10uam9pbignLCAnKX0pYDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGVycm9yIHRoYXQgc3RvcHMgYSByZWxlYXNlIHdob3NlIG5ldyBjaGFuZ2Vsb2cgc2VjdGlvbiBkb2VzIG5vdCBwYXNzIGBsaW50Om1kYCBvciBgc3BlbGxjaGVja2AuXG4gKlxuICogSXQgaXMgdGhyb3duIGZyb20gdGhlIGNvbXBvc2l0aW9uIHN0ZXAsIHdoaWNoIGlzIEJFRk9SRSBhbnl0aGluZyBpcyB3cml0dGVuLCBzbyB0aGUgcmVjb3ZlcnkgaXQgZGVzY3JpYmVzIGlzXG4gKiB0aGUgd2hvbGUgcmVjb3Zlcnk6IHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV2ZXJ0LCBhbmQgdGhlIHJlbGVhc2UgcmUtcnVucyBmcm9tIHRoZSB0b3AuXG4gKlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzLCBhcyB7QGxpbmsgZ2V0Q2hhbmdlbG9nU2VjdGlvbkZpbmRpbmdzfSBjb2xsZWN0ZWQgdGhlbS5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIHZlcnNpb24gd2hvc2Ugc2VjdGlvbiB3YXMgYmVpbmcgcHVibGlzaGVkLlxuICogQHJldHVybnMgVGhlIGVycm9yIHRvIHRocm93LlxuICovXG5mdW5jdGlvbiB0b0NoYW5nZWxvZ0ZpbmRpbmdzRXJyb3IoZmluZGluZ3M6IENoYW5nZWxvZ0ZpbmRpbmdbXSwgdmVyc2lvbjogc3RyaW5nKTogRXJyb3Ige1xuICBjb25zdCBzY3JpcHROYW1lcyA9IHRvRmFpbGVkU2NyaXB0TmFtZXMoZmluZGluZ3MpO1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGBUaGUgJHt2ZXJzaW9ufSBzZWN0aW9uIG9mICR7UmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBkb2VzIG5vdCBwYXNzICR7c2NyaXB0TmFtZXN9OlxcbmBcbiAgICAgICsgYCR7dG9GaW5kaW5nTGluZXMoZmluZGluZ3MpfVxcbmBcbiAgICAgICsgJ1RoZSBjaGFuZ2Vsb2cgaXMgc2V0dGxlZCBiZWZvcmUgaXQgaXMgd3JpdHRlbiwgc28gdGhpcyBzdG9wcyB0aGUgcmVsZWFzZSB3aXRoIHRoZSByZXBvc2l0b3J5IHVudG91Y2hlZCdcbiAgICAgICsgJyBhbmQgbm90aGluZyB0byByZXZlcnQuIFRoZSBsaW5lIG51bWJlcnMgYXJlIHRoZSBvbmVzIHRoZSB3cml0dGVuIGZpbGUgd291bGQgaGF2ZSBoYWQuIEZpeCB0aGUgcmVsZWFzZSdcbiAgICAgICsgJyBub3RlcyDigJQgaW4gdGhlIHByZXBhcmVkIG5vdGVzIGZpbGUsIG9yIGluIHRoZSBjb21taXQgbWVzc2FnZXMgdGhleSB3ZXJlIGdlbmVyYXRlZCBmcm9tIOKAlCBvciwgZm9yIGEgd29yZCdcbiAgICAgICsgJyB0aGlzIHByb2plY3QgcmVhbGx5IGRvZXMgdXNlLCBhZGQgaXQgdG8gdGhlIHByb2plY3RcXCdzIGBjc3BlbGxgIGNvbmZpZ3VyYXRpb24sIGFuZCByZS1ydW4gdGhlIHJlbGVhc2UuJ1xuICAgICAgKyAnIFJlbGVhc2luZyBhbnl3YXkgd291bGQgbGFuZCB0aGUgZGVmZWN0IG9uIHRoZSBkZWZhdWx0IGJyYW5jaCBpbnNpZGUgdGhlIHJlbGVhc2UgY29tbWl0LCB3aGVyZSB0aGUgbmV4dCdcbiAgICAgICsgYCAke3NjcmlwdE5hbWVzfSBvbiBhbnlvbmUncyBicmFuY2ggcmVwb3J0cyBpdC5gXG4gICk7XG59XG5cbi8qKlxuICogV3JhcHMgb25lIHZlcnNpb24ncyBjaGFuZ2Vsb2cgc2VjdGlvbiBpbiB0aGUgbWluaW1hbCBkb2N1bWVudCB0aGUgY2hlY2tzIGFyZSBoYW5kZWQuXG4gKlxuICogVGhlIHNlY3Rpb24gZ29lcyBpbnNpZGUgYSBkb2N1bWVudCByYXRoZXIgdGhhbiBvbiBpdHMgb3duLCBzbyB0aGUgaGVhZGluZyBhbmQgbGlzdCBydWxlcyBzZWUgdGhlXG4gKiBjb250ZXh0IHRoZXkgbmVlZCAoYSBkb2N1bWVudCB3aG9zZSBmaXJzdCBsaW5lIGlzIGEgbGlzdCBpdGVtIGlzIGEgZGlmZmVyZW50IGRvY3VtZW50KS4gVGhlIGxpbmUgbnVtYmVycyBhXG4gKiBmaW5kaW5nIHJlcG9ydHMgYXJlIHRoZW4gdGhlIGNvbXBvc2VkIGBDSEFOR0VMT0cubWRgJ3Mgb3duLCB3aGljaCBpcyBub3QgYSBjb2luY2lkZW5jZSBhbmQgaXMgd29ydGgga2VlcGluZzpcbiAqIGEgc2VjdGlvbiBpcyBQUkVQRU5ERUQsIHNvIHRoaXMgZG9jdW1lbnQgaXMgY2hhcmFjdGVyLWZvci1jaGFyYWN0ZXIgdGhlIGhlYWQgb2YgdGhlIGZpbGUgYWJvdXQgdG8gYmUgd3JpdHRlbi5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nQ29udGVudCAtIFRoZSBmdWxsIGNvbXBvc2VkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gaXMgYWJvdXQgdG8gYmUgcHVibGlzaGVkLlxuICogQHJldHVybnMgVGhlIG1pbmltYWwgZG9jdW1lbnQgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIHRvQ2hhbmdlbG9nU2VjdGlvbkRvY3VtZW50KGNoYW5nZWxvZ0NvbnRlbnQ6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGVhZGluZyA9IGAjIENIQU5HRUxPR1xcblxcbiMjICR7dmVyc2lvbn1gO1xuICBjb25zdCBzZWN0aW9uID0gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nQ29udGVudCwgdmVyc2lvbik7XG4gIC8vIEFuIGVtcHR5IHNlY3Rpb24gaXMgYSByZWFsIHNoYXBlIOKAlCBhIHJlbGVhc2Ugd2l0aCBubyBjb21taXRzIHRvIGRlc2NyaWJlLCBvciBwcmVwYXJlZCBub3RlcyB0aGF0IGFyZSBhblxuICAvLyBlbXB0eSBmaWxlIOKAlCBhbmQgYXBwZW5kaW5nIGEgYmxhbmsgYm9keSB0byB0aGUgaGVhZGluZyB3b3VsZCByZXBvcnQgYSBkZWZlY3QgdGhpcyByZWxlYXNlIGRpZCBub3QgY29tbWl0LlxuICByZXR1cm4gc2VjdGlvbiA9PT0gJycgPyBgJHtoZWFkaW5nfVxcbmAgOiBgJHtoZWFkaW5nfVxcblxcbiR7c2VjdGlvbn1cXG5gO1xufVxuXG4vKipcbiAqIFJlYWRzIG9mZiB3aGljaCByZWxlYXNlIGxpbmUgYSB2ZXJzaW9uIGFjdHVhbGx5IG1vdmVzLCByZWxhdGl2ZSB0byB0aGUgYmFzZWxpbmUgaXQgaXMgYmVpbmcgY3V0IGZyb20uXG4gKlxuICogVGhpcyBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgcmVxdWVzdGVkIHR5cGUgb24gcHVycG9zZSwgYmVjYXVzZSB0aGUgdHlwZSBkb2VzIG5vdCBhbHdheXMgc2F5LlxuICogYHByZXJlbGVhc2VgIGFkdmFuY2VzIHdoaWNoZXZlciBsaW5lIGFuIGVhcmxpZXIgYHByZW1ham9yYCBvciBgcHJlbWlub3JgIGFscmVhZHkgY2hvc2UsIGFuZCBhbiBleHBsaWNpdFxuICogYHgueS56YCBzYXlzIG5vdGhpbmcgYXQgYWxsIHVudGlsIGl0IGlzIGNvbXBhcmVkLiBUYWtpbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSByZXN1bHRpbmcgdmVyc2lvbiBhbnN3ZXJzIGFsbFxuICogb2YgdGhlbSB3aXRoIG9uZSBydWxlIOKAlCBhbmQgaXQgYW5zd2VycyB0aGVtIHRoZSB3YXkgYSBjb25zdW1lcidzIGNhcmV0IHJhbmdlIHNlZXMgaXQsIHdoaWNoIGlzIHRoZSBvbmx5XG4gKiByZWFkaW5nIHRoYXQgbWF0dGVycyBmb3IgYSBwdWJsaXNoZWQgc3VyZmFjZS5cbiAqXG4gKiBAcGFyYW0gYmFzZVZlcnNpb24gLSBUaGUgcHJldmlvdXMgcmVsZWFzZWQgdmVyc2lvbi5cbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIHZlcnNpb24gYWJvdXQgdG8gYmUgcHVibGlzaGVkLlxuICogQHJldHVybnMgVGhlIHtAbGluayBCdW1wTGV2ZWx9LCBvciBgbnVsbGAgd2hlbiBlaXRoZXIgdmVyc2lvbiBpcyBub3QgcGFyc2FibGUgYXMgc2VtdmVyLlxuICovXG5mdW5jdGlvbiB0b0VmZmVjdGl2ZUJ1bXBMZXZlbChiYXNlVmVyc2lvbjogc3RyaW5nLCBuZXdWZXJzaW9uOiBzdHJpbmcpOiBCdW1wTGV2ZWwgfCBudWxsIHtcbiAgY29uc3QgYmFzZSA9IHBhcnNlKGJhc2VWZXJzaW9uKTtcbiAgY29uc3QgbmV4dCA9IHBhcnNlKG5ld1ZlcnNpb24pO1xuICBpZiAoIWJhc2UgfHwgIW5leHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChuZXh0Lm1ham9yID4gYmFzZS5tYWpvcikge1xuICAgIHJldHVybiBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvcjtcbiAgfVxuXG4gIHJldHVybiBuZXh0Lm1pbm9yID4gYmFzZS5taW5vciA/IFZlcnNpb25VcGRhdGVUeXBlLk1pbm9yIDogVmVyc2lvblVwZGF0ZVR5cGUuUGF0Y2g7XG59XG5cbi8qKlxuICogTmFtZXMgdGhlIG5wbSBzY3JpcHRzIHRoYXQgYWN0dWFsbHkgcmVwb3J0ZWQgc29tZXRoaW5nLCBpbiB0aGUgb3JkZXIgdGhleSByYW4uXG4gKlxuICogTmFtaW5nIGJvdGggdW5jb25kaXRpb25hbGx5IHdvdWxkIGJlIHRoZSBlYXN5IHZlcnNpb24gYW5kIHdvdWxkIGJlIGEgbGllIGhhbGYgdGhlIHRpbWU6IGEgcmVsZWFzZSBzdG9wcGVkIGJ5XG4gKiBhIGNvaW5lZCB3b3JkIHdvdWxkIHRlbGwgaXRzIGF1dGhvciB0byBnbyBhbmQgbG9vayBhdCBgbGludDptZGAsIHdoaWNoIHBhc3NlZC5cbiAqXG4gKiBAcGFyYW0gZmluZGluZ3MgLSBUaGUgZmluZGluZ3MgdG8gbmFtZSB0aGUgc2NyaXB0cyBvZi5cbiAqIEByZXR1cm5zIFRoZSBzY3JpcHQgbmFtZXMsIGpvaW5lZCBmb3IgcHJvc2Ug4oCUIGBsaW50Om1kYCwgYHNwZWxsY2hlY2tgLCBvciBgbGludDptZCBhbmQgc3BlbGxjaGVja2AuXG4gKi9cbmZ1bmN0aW9uIHRvRmFpbGVkU2NyaXB0TmFtZXMoZmluZGluZ3M6IENoYW5nZWxvZ0ZpbmRpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHNjcmlwdE5hbWVzID0gW0xJTlRfTURfU0NSSVBUX05BTUUsIFNQRUxMQ0hFQ0tfU0NSSVBUX05BTUVdLmZpbHRlcigoc2NyaXB0TmFtZSkgPT4gZmluZGluZ3Muc29tZSgoZmluZGluZykgPT4gZmluZGluZy5zY3JpcHROYW1lID09PSBzY3JpcHROYW1lKSk7XG4gIHJldHVybiBzY3JpcHROYW1lcy5qb2luKCcgYW5kICcpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgdGhlIGZpbmRpbmdzIGZvciBhIG1lc3NhZ2UsIGVhY2ggbGluZSB0YWdnZWQgd2l0aCB0aGUgc2NyaXB0IHRoYXQgcmVwb3J0ZWQgaXQuXG4gKlxuICogVGhlIHRhZyBpcyBub3QgZGVjb3JhdGlvbjogdGhlIHR3byB0b29scycgb3V0cHV0IHNoYXBlcyBhcmUgc2ltaWxhciBlbm91Z2ggdG8gYmUgbWlzdGFrZW4gZm9yIGVhY2ggb3RoZXIsXG4gKiBhbmQgdGhlIGZpeCBmb3Igb25lIGlzIG5vdCB0aGUgZml4IGZvciB0aGUgb3RoZXIuXG4gKlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzIHRvIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSByZW5kZXJlZCBsaW5lcywgb25lIGZpbmRpbmcgcGVyIGxpbmUuXG4gKi9cbmZ1bmN0aW9uIHRvRmluZGluZ0xpbmVzKGZpbmRpbmdzOiBDaGFuZ2Vsb2dGaW5kaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZmluZGluZ3MubWFwKChmaW5kaW5nKSA9PiBgWyR7ZmluZGluZy5zY3JpcHROYW1lfV0gJHtmaW5kaW5nLnRleHR9YCkuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogQ2xhc3NpZmllcyBvbmUgYGdpdCBsb2cgLS1mb3JtYXQ9JUglbiVCIC16YCByZWNvcmQgaW50byB0aGUge0BsaW5rIEZvcmNpbmdDb21taXR9IGl0IGlzLCBvciBgbnVsbGAgd2hlbiBpdFxuICogZm9yY2VzIG5vdGhpbmcuXG4gKlxuICogQHBhcmFtIHJlY29yZCAtIE9uZSBOVUwtZGVsaW1pdGVkIHJlY29yZDogdGhlIGZ1bGwgaGFzaCBvbiB0aGUgZmlyc3QgbGluZSwgdGhlIGZ1bGwgY29tbWl0IG1lc3NhZ2UgYmVsb3cgaXQuXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIEZvcmNpbmdDb21taXR9LCBvciBgbnVsbGAgZm9yIGEgcmVjb3JkIHRoYXQgY29uc3RyYWlucyBub3RoaW5nIG9yIGlzIG5vdCBhIHJlY29yZCBhdCBhbGxcbiAqICh0aGUgdHJhaWxpbmcgZW1wdHkgc3RyaW5nIGAtemAgb3V0cHV0IGVuZHMgd2l0aCwgYW1vbmcgb3RoZXJzKS5cbiAqL1xuZnVuY3Rpb24gdG9Gb3JjaW5nQ29tbWl0KHJlY29yZDogc3RyaW5nKTogRm9yY2luZ0NvbW1pdCB8IG51bGwge1xuICAvLyBUaGUgdHJhaWxpbmcgZW1wdHkgcmVjb3JkIGAtemAgbGVhdmVzIGhhcyBubyBoYXNoLCBhbmQgYSByZWNvcmQgd2l0aCBubyBsaW5lIHVuZGVyIHRoZSBoYXNoIGlzIG5vdCBvbmVcbiAgLy8gdGhpcyBjYW4gY2xhc3NpZnkuIEJvdGggYXJlIHRoZSBzYW1lIG5vbi1hbnN3ZXIuXG4gIGNvbnN0IFtzaGEsIHN1YmplY3RMaW5lLCAuLi5ib2R5TGluZXNdID0gcmVjb3JkLnNwbGl0KCdcXG4nKTtcbiAgaWYgKCFzaGEgfHwgc3ViamVjdExpbmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc3ViamVjdCA9IHN1YmplY3RMaW5lLnRyaW0oKTtcbiAgY29uc3QgYm9keSA9IGJvZHlMaW5lcy5qb2luKCdcXG4nKTtcbiAgY29uc3Qgc3ViamVjdE1hdGNoID0gQ09OVkVOVElPTkFMX0NPTU1JVF9TVUJKRUNUX1JFR19FWFAuZXhlYyhzdWJqZWN0KTtcblxuICBpZiAoc3ViamVjdE1hdGNoPy5ncm91cHM/LlsnYnJlYWtpbmcnXSkge1xuICAgIHJldHVybiB7XG4gICAgICBsZXZlbDogVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3IsXG4gICAgICBtYXJrZXI6IEJSRUFLSU5HX01BUktFUixcbiAgICAgIHNoYSxcbiAgICAgIHN1YmplY3RcbiAgICB9O1xuICB9XG5cbiAgaWYgKEJSRUFLSU5HX0NIQU5HRV9GT09URVJfUkVHX0VYUC50ZXN0KGJvZHkpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxldmVsOiBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvcixcbiAgICAgIG1hcmtlcjogQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9NQVJLRVIsXG4gICAgICBzaGEsXG4gICAgICBzdWJqZWN0XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzdWJqZWN0TWF0Y2g/Lmdyb3Vwcz8uWyd0eXBlJ10/LnRvTG93ZXJDYXNlKCkgPT09IEZFQVRfVFlQRVxuICAgID8ge1xuICAgICAgbGV2ZWw6IFZlcnNpb25VcGRhdGVUeXBlLk1pbm9yLFxuICAgICAgbWFya2VyOiBGRUFUX1RZUEVfTUFSS0VSLFxuICAgICAgc2hhLFxuICAgICAgc3ViamVjdFxuICAgIH1cbiAgICA6IG51bGw7XG59XG5cbi8qKlxuICogUmVkdWNlcyB0aGUgY29tbWl0cyB0aGF0IGZvcmNlIHNvbWV0aGluZyB0byB0aGUgb25lIGZsb29yIHRoZSByYW5nZSBhcyBhIHdob2xlIGhhcyB0byBjbGVhci5cbiAqXG4gKiBAcGFyYW0gZm9yY2luZ0NvbW1pdHMgLSBUaGUge0BsaW5rIEZvcmNpbmdDb21taXR9cyBmb3VuZCBpbiB0aGUgcmFuZ2UuXG4gKiBAcmV0dXJucyBUaGUgaGlnaGVzdCB7QGxpbmsgQnVtcExldmVsfSBhbnkgb2YgdGhlbSBmb3JjZXMsIG9yIHtAbGluayBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaH0g4oCUIG5vXG4gKiBjb25zdHJhaW50IOKAlCB3aGVuIHRoZXJlIGFyZSBub25lLlxuICovXG5mdW5jdGlvbiB0b0hpZ2hlc3RCdW1wTGV2ZWwoZm9yY2luZ0NvbW1pdHM6IHJlYWRvbmx5IEZvcmNpbmdDb21taXRbXSk6IEJ1bXBMZXZlbCB7XG4gIGlmIChmb3JjaW5nQ29tbWl0cy5zb21lKChmb3JjaW5nQ29tbWl0KSA9PiBmb3JjaW5nQ29tbWl0LmxldmVsID09PSBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvcikpIHtcbiAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3I7XG4gIH1cblxuICByZXR1cm4gZm9yY2luZ0NvbW1pdHMubGVuZ3RoID4gMCA/IFZlcnNpb25VcGRhdGVUeXBlLk1pbm9yIDogVmVyc2lvblVwZGF0ZVR5cGUuUGF0Y2g7XG59XG5cbi8qKlxuICogVmVyaWZpZXMgcHVibGljIHJlbGVhc2UgbWV0YWRhdGEgYW5kIGNvbXBsZXRlZCB1cGxvYWRzIGJlZm9yZSBleHBvc2luZyBpdHMgdmVyc2lvbiBvbiB0aGUgYnJhbmNoLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIGV4YWN0IHZlcnNpb24gdGFnIGV4cGVjdGVkIG9uIHRoZSByZWxlYXNlLlxuICogQHBhcmFtIGZpbGVQYXRocyAtIFRoZSBmaWxlcyB3aG9zZSB1cGxvYWRzIG11c3QgYmUgY29tcGxldGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbjogc3RyaW5nLCBmaWxlUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlbGVhc2UgPSBKU09OLnBhcnNlKFxuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbXG4gICAgICAnZ2gnLFxuICAgICAgJ3JlbGVhc2UnLFxuICAgICAgJ3ZpZXcnLFxuICAgICAgbmV3VmVyc2lvbixcbiAgICAgICctLWpzb24nLFxuICAgICAgJ2lzRHJhZnQsaXNQcmVyZWxlYXNlLHRhZ05hbWUsYXNzZXRzJ1xuICAgIF0sIHsgaXNRdWlldDogdHJ1ZSB9KVxuICApIGFzIEdpdEh1YlJlbGVhc2VNZXRhZGF0YTtcbiAgaWYgKFxuICAgIHJlbGVhc2UuaXNEcmFmdCB8fCByZWxlYXNlLnRhZ05hbWUgIT09IG5ld1ZlcnNpb24gfHwgcmVsZWFzZS5pc1ByZXJlbGVhc2UgIT09IGlzUHJlUmVsZWFzZShuZXdWZXJzaW9uKVxuICAgIHx8IGZpbGVQYXRocy5zb21lKChwYXRoKSA9PiByZWxlYXNlLmFzc2V0cy5ldmVyeSgoYXNzZXQpID0+ICEoYXNzZXQubmFtZSA9PT0gYmFzZW5hbWUocGF0aCkgJiYgYXNzZXQuc3RhdGUgPT09ICd1cGxvYWRlZCcpKSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgdmVyaWZ5IHRoZSBwdWJsaWMgJHtuZXdWZXJzaW9ufSByZWxlYXNlIGFuZCBpdHMgdXBsb2FkZWQgYXNzZXRzOyB0aGUgcmVtb3RlIGJyYW5jaCB3YXMgbm90IGFkdmFuY2VkLmApO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBjb21wb3NlZCBjaGFuZ2Vsb2cgaW50byB0aGUgcmVwb3NpdG9yeS4gRGVsaWJlcmF0ZWx5IHRoZSBsYXN0IHRoaW5nIHRoZSBjaGFuZ2Vsb2cgc3RlcCBkb2VzLFxuICogc28gbm90aGluZyBsYW5kcyBvbiBkaXNrIHVudGlsIHRoZSBjb250ZW50IGlzIHNldHRsZWQuXG4gKlxuICogQHBhcmFtIG5ld0NoYW5nZUxvZyAtIFRoZSBzZXR0bGVkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQgdG8gd3JpdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZWxvZyBoYXMgYmVlbiB3cml0dGVuLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNoYW5nZWxvZyhuZXdDaGFuZ2VMb2c6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCB3cml0ZUZpbGUocmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBSZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSksIG5ld0NoYW5nZUxvZywgJ3V0Zi04Jyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUEsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxxQkFBcUI7QUFDOUIsU0FBUyxZQUFZO0FBQ3JCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLGdCQUFnQjtBQUN6QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLGlCQUFpQjtBQUMxQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFJUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsU0FBUyx5QkFBeUI7QUFDbEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyxpQkFB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
|