obsidian-integration-testing 8.2.1 → 8.4.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/dist/lib/cjs/asar-fallback-detection.cjs +48 -0
- package/dist/lib/cjs/asar-fallback-detection.d.cts +75 -0
- package/dist/lib/cjs/compatibility-options.cjs +68 -0
- package/dist/lib/cjs/compatibility-options.d.cts +112 -0
- package/dist/lib/cjs/connect-to-cdp.cjs +19 -11
- package/dist/lib/cjs/connect-to-cdp.d.cts +64 -2
- package/dist/lib/cjs/ecmascript-version.cjs +63 -0
- package/dist/lib/cjs/ecmascript-version.d.cts +28 -0
- package/dist/lib/cjs/electron-compatibility.cjs +46 -0
- package/dist/lib/cjs/electron-compatibility.d.cts +74 -0
- package/dist/lib/cjs/index.cjs +10 -1
- package/dist/lib/cjs/index.d.cts +7 -1
- package/dist/lib/cjs/installer-asset.cjs +18 -3
- package/dist/lib/cjs/installer-asset.d.cts +26 -0
- package/dist/lib/cjs/installer-compatibility.cjs +1 -1
- package/dist/lib/cjs/installer-compatibility.d.cts +4 -1
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/namespace-bootstrap.cjs +44 -7
- package/dist/lib/cjs/normalize-optional-properties.cjs +31 -0
- package/dist/lib/cjs/normalize-optional-properties.d.cts +26 -0
- package/dist/lib/cjs/obsidian-installer.cjs +6 -1
- package/dist/lib/cjs/obsidian-metadata.cjs +3775 -302
- package/dist/lib/cjs/obsidian-metadata.d.cts +71 -0
- package/dist/lib/cjs/obsidian-version-switch.cjs +5 -2
- package/dist/lib/cjs/owned-vault-seed.cjs +38 -0
- package/dist/lib/cjs/owned-vault-seed.d.cts +67 -0
- package/dist/lib/cjs/silent-asar-fallback-error.cjs +48 -0
- package/dist/lib/cjs/silent-asar-fallback-error.d.cts +40 -0
- package/dist/lib/cjs/transport-desktop-cdp.cjs +223 -45
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +105 -1
- package/dist/lib/cjs/transport-factory.cjs +36 -16
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +48 -0
- package/dist/lib/esm/asar-fallback-detection.d.mts +75 -0
- package/dist/lib/esm/asar-fallback-detection.mjs +24 -0
- package/dist/lib/esm/compatibility-options.d.mts +112 -0
- package/dist/lib/esm/compatibility-options.mjs +40 -0
- package/dist/lib/esm/connect-to-cdp.d.mts +64 -2
- package/dist/lib/esm/connect-to-cdp.mjs +19 -11
- package/dist/lib/esm/ecmascript-version.d.mts +28 -0
- package/dist/lib/esm/ecmascript-version.mjs +39 -0
- package/dist/lib/esm/electron-compatibility.d.mts +74 -0
- package/dist/lib/esm/electron-compatibility.mjs +22 -0
- package/dist/lib/esm/index.d.mts +7 -1
- package/dist/lib/esm/index.mjs +7 -1
- package/dist/lib/esm/installer-asset.d.mts +26 -0
- package/dist/lib/esm/installer-asset.mjs +16 -2
- package/dist/lib/esm/installer-compatibility.d.mts +4 -1
- package/dist/lib/esm/installer-compatibility.mjs +1 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/namespace-bootstrap.mjs +44 -7
- package/dist/lib/esm/normalize-optional-properties.d.mts +26 -0
- package/dist/lib/esm/normalize-optional-properties.mjs +7 -0
- package/dist/lib/esm/obsidian-installer.mjs +8 -2
- package/dist/lib/esm/obsidian-metadata.d.mts +71 -0
- package/dist/lib/esm/obsidian-metadata.mjs +3775 -302
- package/dist/lib/esm/obsidian-version-switch.mjs +5 -2
- package/dist/lib/esm/owned-vault-seed.d.mts +67 -0
- package/dist/lib/esm/owned-vault-seed.mjs +14 -0
- package/dist/lib/esm/silent-asar-fallback-error.d.mts +40 -0
- package/dist/lib/esm/silent-asar-fallback-error.mjs +24 -0
- package/dist/lib/esm/transport-desktop-cdp.d.mts +105 -1
- package/dist/lib/esm/transport-desktop-cdp.mjs +223 -45
- package/dist/lib/esm/transport-factory.mjs +41 -16
- package/dist/lib/esm/transport-options.d.mts +48 -0
- package/dist/obsidian-integration-testing-8.4.0.tgz +0 -0
- package/package.json +3 -1
- package/dist/obsidian-integration-testing-8.2.1.tgz +0 -0
|
@@ -41,6 +41,7 @@ var import_node_process = __toESM(require("node:process"), 1);
|
|
|
41
41
|
var import_webdriverio = require("webdriverio");
|
|
42
42
|
var import_appium_dependencies = require("./appium-dependencies.cjs");
|
|
43
43
|
var import_appium_session_config = require("./appium-session-config.cjs");
|
|
44
|
+
var import_compatibility_options = require("./compatibility-options.cjs");
|
|
44
45
|
var import_device_readiness = require("./device-readiness.cjs");
|
|
45
46
|
var import_emulator_args = require("./emulator-args.cjs");
|
|
46
47
|
var import_exec = require("./exec.cjs");
|
|
@@ -48,6 +49,7 @@ var import_incompatible_installer_version_error = require("./incompatible-instal
|
|
|
48
49
|
var import_installer_compatibility = require("./installer-compatibility.cjs");
|
|
49
50
|
var import_kill_process_tree = require("./kill-process-tree.cjs");
|
|
50
51
|
var import_log = require("./log.cjs");
|
|
52
|
+
var import_normalize_optional_properties = require("./normalize-optional-properties.cjs");
|
|
51
53
|
var import_obsidian_config = require("./obsidian-config.cjs");
|
|
52
54
|
var import_obsidian_executable = require("./obsidian-executable.cjs");
|
|
53
55
|
var import_obsidian_installer = require("./obsidian-installer.cjs");
|
|
@@ -688,7 +690,8 @@ Emulator output (tail):
|
|
|
688
690
|
${trimmedOutput}` : "";
|
|
689
691
|
return `Android emulator ${reason} during startup.${details}`;
|
|
690
692
|
}
|
|
691
|
-
function checkAndReportCompatibility(
|
|
693
|
+
function checkAndReportCompatibility(params) {
|
|
694
|
+
const { appVersion, installerVersion, shouldThrowOnIncompatibleInstaller, shouldWarnOnCompatibilityIssues } = params;
|
|
692
695
|
if (appVersion === void 0) {
|
|
693
696
|
return void 0;
|
|
694
697
|
}
|
|
@@ -697,14 +700,24 @@ function checkAndReportCompatibility(appVersion, installerVersion) {
|
|
|
697
700
|
installerVersion,
|
|
698
701
|
metadata: (0, import_obsidian_metadata.getVersionMetadata)(appVersion)
|
|
699
702
|
});
|
|
700
|
-
|
|
703
|
+
const action = (0, import_compatibility_options.resolveInstallerCompatibilityAction)({
|
|
704
|
+
shouldThrowOnIncompatibleInstaller,
|
|
705
|
+
shouldWarnOnCompatibilityIssues,
|
|
706
|
+
tier: compatibility.tier
|
|
707
|
+
});
|
|
708
|
+
if (action === "throw") {
|
|
701
709
|
throw new import_incompatible_installer_version_error.IncompatibleInstallerVersionError({
|
|
702
710
|
appVersion: compatibility.appVersion,
|
|
703
711
|
installerVersion: (0, import_type_guards.ensureNonNullable)(compatibility.installerVersion),
|
|
704
712
|
minRunnableInstallerVersion: (0, import_type_guards.ensureNonNullable)(compatibility.minRunnableInstallerVersion)
|
|
705
713
|
});
|
|
706
714
|
}
|
|
707
|
-
if (
|
|
715
|
+
if (action === "warn-unrunnable") {
|
|
716
|
+
(0, import_log.log)(
|
|
717
|
+
`[transport-factory:obsidian-cdp] Obsidian installer ${(0, import_type_guards.ensureNonNullable)(compatibility.installerVersion)} is below the run floor ${(0, import_type_guards.ensureNonNullable)(compatibility.minRunnableInstallerVersion)} for Obsidian ${compatibility.appVersion}; proceeding to launch (shouldThrowOnIncompatibleInstaller is false) \u2014 the boot will likely dead-boot.`
|
|
718
|
+
);
|
|
719
|
+
}
|
|
720
|
+
if (action === "warn-nagged") {
|
|
708
721
|
(0, import_log.log)(`[transport-factory:obsidian-cdp] ${(0, import_type_guards.ensureNonNullable)(compatibility.message)}`);
|
|
709
722
|
}
|
|
710
723
|
return compatibility;
|
|
@@ -713,23 +726,25 @@ async function createCdpTransport(options) {
|
|
|
713
726
|
if (options?.port !== void 0) {
|
|
714
727
|
const ownedSuffix = options.isHarnessOwnedInstance ? " (harness-owned)" : "";
|
|
715
728
|
(0, import_log.log)(`[transport-factory:obsidian-cdp] Attaching to running Obsidian${ownedSuffix} (host=${options.host ?? "localhost"}, port=${String(options.port)})`);
|
|
716
|
-
return new import_transport_desktop_cdp.DesktopCdpTransport({
|
|
717
|
-
|
|
729
|
+
return new import_transport_desktop_cdp.DesktopCdpTransport((0, import_normalize_optional_properties.normalizeOptionalProperties)({
|
|
730
|
+
cdpHost: options.host,
|
|
718
731
|
cdpPort: options.port,
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
});
|
|
732
|
+
commandTimeoutInMilliseconds: options.commandTimeoutInMilliseconds,
|
|
733
|
+
isHarnessOwnedInstance: options.isHarnessOwnedInstance
|
|
734
|
+
}));
|
|
722
735
|
}
|
|
723
736
|
(0, import_log.log)("[transport-factory:obsidian-cdp] Creating owned isolated Obsidian instance");
|
|
724
737
|
const ownedInstance = await resolveOwnedInstanceConfig(options);
|
|
725
|
-
return new import_transport_desktop_cdp.DesktopCdpTransport({
|
|
726
|
-
|
|
727
|
-
|
|
738
|
+
return new import_transport_desktop_cdp.DesktopCdpTransport((0, import_normalize_optional_properties.normalizeOptionalProperties)({
|
|
739
|
+
cdpHost: options?.host,
|
|
740
|
+
commandTimeoutInMilliseconds: options?.commandTimeoutInMilliseconds,
|
|
728
741
|
deadBootGraceInMilliseconds: (0, import_renderer_boot_detection.resolveDeadBootGraceInMilliseconds)(options),
|
|
729
|
-
|
|
742
|
+
isObsidianAppVisible: options?.isObsidianAppVisible,
|
|
730
743
|
ownedInstance,
|
|
731
|
-
|
|
732
|
-
|
|
744
|
+
shouldDisableSandbox: options?.shouldDisableSandbox,
|
|
745
|
+
shouldThrowOnSilentAsarFallback: (0, import_compatibility_options.resolveShouldThrowOnSilentAsarFallback)(options?.shouldThrowOnSilentAsarFallback),
|
|
746
|
+
shouldWarnOnCompatibilityIssues: (0, import_compatibility_options.resolveShouldWarnOnCompatibilityIssues)(options?.shouldWarnOnCompatibilityIssues)
|
|
747
|
+
}));
|
|
733
748
|
}
|
|
734
749
|
function createOwnedUserDataDir() {
|
|
735
750
|
const root = (0, import_node_path.join)((0, import_node_os.tmpdir)(), "obsidian-integration-testing");
|
|
@@ -774,7 +789,12 @@ async function resolveOwnedInstanceConfig(options) {
|
|
|
774
789
|
}
|
|
775
790
|
const plan = await resolveAsarPlan(options, shellVersion);
|
|
776
791
|
const swapAppVersion = plan.asarVersionToSwap ?? plan.asar?.version;
|
|
777
|
-
const compatibility = checkAndReportCompatibility(
|
|
792
|
+
const compatibility = checkAndReportCompatibility({
|
|
793
|
+
appVersion: swapAppVersion,
|
|
794
|
+
installerVersion: shellVersion,
|
|
795
|
+
shouldThrowOnIncompatibleInstaller: (0, import_compatibility_options.resolveShouldThrowOnIncompatibleInstaller)(options?.shouldThrowOnIncompatibleInstaller),
|
|
796
|
+
shouldWarnOnCompatibilityIssues: (0, import_compatibility_options.resolveShouldWarnOnCompatibilityIssues)(options?.shouldWarnOnCompatibilityIssues)
|
|
797
|
+
});
|
|
778
798
|
if (pinnedInstallerVersion !== void 0) {
|
|
779
799
|
const installed = await resolveInstalledShellOrNull();
|
|
780
800
|
exePath = installed?.shellVersion === pinnedInstallerVersion ? installed.exePath : await (0, import_obsidian_installer.ensureShellCached)(pinnedInstallerVersion);
|
|
@@ -802,4 +822,4 @@ function stripForbiddenFetchHeaders(requestOptions) {
|
|
|
802
822
|
createTransportFromOptions,
|
|
803
823
|
getOrCreateTransport
|
|
804
824
|
});
|
|
805
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE93bmVkSW5zdGFuY2VDb25maWcgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHtcbiAgY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZCxcbiAgcmVzb2x2ZVNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzLFxuICBVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUVcbn0gZnJvbSAnLi9hcHBpdW0tZGVwZW5kZW5jaWVzLmNqcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzXG59IGZyb20gJy4vYXBwaXVtLXNlc3Npb24tY29uZmlnLmNqcyc7XG5pbXBvcnQge1xuICBjaGVja0RldmljZUlkbGUsXG4gIHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG59IGZyb20gJy4vZGV2aWNlLXJlYWRpbmVzcy5janMnO1xuaW1wb3J0IHsgYnVpbGRFbXVsYXRvckFyZ3MgfSBmcm9tICcuL2VtdWxhdG9yLWFyZ3MuY2pzJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICcuL2V4ZWMuY2pzJztcbmltcG9ydCB7IEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvciB9IGZyb20gJy4vaW5jb21wYXRpYmxlLWluc3RhbGxlci12ZXJzaW9uLWVycm9yLmNqcyc7XG5pbXBvcnQgeyBjaGVja0luc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgeyBraWxsUHJvY2Vzc1RyZWUgfSBmcm9tICcuL2tpbGwtcHJvY2Vzcy10cmVlLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5Db25maWdEaXIgfSBmcm9tICcuL29ic2lkaWFuLWNvbmZpZy5janMnO1xuaW1wb3J0IHsgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSB9IGZyb20gJy4vb2JzaWRpYW4tZXhlY3V0YWJsZS5janMnO1xuaW1wb3J0IHtcbiAgZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uLFxuICBlbnN1cmVTaGVsbENhY2hlZFxufSBmcm9tICcuL29ic2lkaWFuLWluc3RhbGxlci5janMnO1xuaW1wb3J0IHsgZ2V0VmVyc2lvbk1ldGFkYXRhIH0gZnJvbSAnLi9vYnNpZGlhbi1tZXRhZGF0YS5janMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlQXNhckNhY2hlZCxcbiAgZmluZE5ld2VzdEFzYXIsXG4gIHJlc29sdmVDb25jcmV0ZVZlcnNpb25cbn0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLXN3aXRjaC5janMnO1xuaW1wb3J0IHsgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlRGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzIH0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5janMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUFwcGl1bVNwYXduRmxhZ3MsXG4gIHJlc29sdmVFbXVsYXRvclNwYXduRmxhZ3Ncbn0gZnJvbSAnLi9zcGF3bi1vcHRpb25zLmNqcyc7XG5pbXBvcnQgeyBBcHBpdW1UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0uY2pzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLmNqcyc7XG5pbXBvcnQge1xuICBzaG91bGRIaWRlQXBwaXVtQ29uc29sZSxcbiAgc2hvdWxkSGlkZUVtdWxhdG9yV2luZG93XG59IGZyb20gJy4vdmlzaWJpbGl0eS5janMnO1xuXG5jb25zdCBBUFBfUEFDS0FHRSA9ICdtZC5vYnNpZGlhbic7XG5jb25zdCBBUFBfQUNUSVZJVFkgPSBgJHtBUFBfUEFDS0FHRX0uTWFpbkFjdGl2aXR5YDtcbmNvbnN0IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuY29uc3QgQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBPV05FRF9VU0VSX0RBVEFfUFJFRklYID0gJ3VzZXJkYXRhLSc7XG4vLyBBcHBpdW0gaW5zZWN1cmUgZmVhdHVyZSBsZXR0aW5nIHRoZSBVaUF1dG9tYXRvcjIgZHJpdmVyIGF1dG8tZG93bmxvYWQgYVxuLy8gQ2hyb21lZHJpdmVyIG1hdGNoaW5nIE9ic2lkaWFuJ3MgV2ViVmlldyBDaHJvbWUgdmVyc2lvbi4gRW5hYmxpbmcgaXQgb24gdGhlXG4vLyBBcHBpdW0gc2VydmVyIChpdCBoYXMgbm8gZWZmZWN0IGFzIGEgY2FwYWJpbGl0eSkgYXZvaWRzIHRoZSBmYWlsdXJlXG4vLyBcIk5vIENocm9tZWRyaXZlciBmb3VuZCB0aGF0IGNhbiBhdXRvbWF0ZSBDaHJvbWUgLi4uXCIuXG5jb25zdCBDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUgPSAndWlhdXRvbWF0b3IyOmNocm9tZWRyaXZlcl9hdXRvZG93bmxvYWQnO1xuY29uc3QgQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDtcbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2RwJztcbmNvbnN0IERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcbmNvbnN0IEVNVUxBVE9SX09VVFBVVF9UQUlMX01BWF9MRU5HVEggPSA4MDAwO1xuY29uc3QgS0VZQ09ERV9NRU5VID0gODI7XG5jb25zdCBLRVlDT0RFX1dBS0VVUCA9IDIyNDtcbmNvbnN0IFNFUlZFUl9JTlNUQUxMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcblxuLyoqXG4gKiBIb3cgdGhlIHJlcXVlc3RlZCBhcHAgKGFzYXIpIHZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIHRvIGFuIG93bmVkIGluc3RhbmNlOyBhdFxuICogbW9zdCBvbmUgZmllbGQgaXMgc2V0IChzZWUge0BsaW5rIHJlc29sdmVBc2FyUGxhbn0pLlxuICovXG5pbnRlcmZhY2UgQXNhclBsYW4ge1xuICAvKiogVGhlIHVzZXIncyBuZXdlc3QgaW5zdGFsbGVkIGFzYXIgdG8gcHJvdmlzaW9uIGFzLWlzIChubyBkb3dubG9hZCkuICovXG4gIHJlYWRvbmx5IGFzYXI/OiBPd25lZEluc3RhbmNlQ29uZmlnWydhc2FyJ107XG5cbiAgLyoqIFRoZSBhcHAgdmVyc2lvbiB0byBkb3dubG9hZCBhbmQgYXNhci1zd2FwIG9udG8gdGhlIHNoZWxsLiAqL1xuICByZWFkb25seSBhc2FyVmVyc2lvblRvU3dhcD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIGFwcCB2ZXJzaW9uIHdob3NlIG93biBpbnN0YWxsZXIgc2hlbGwgdG8gZG93bmxvYWQgKGEgZG93bmdyYWRlKS4gKi9cbiAgcmVhZG9ubHkgZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIGFuIGVtdWxhdG9yIHByb2Nlc3MgdGhhdCBoYXMgZXhpdGVkLlxuICovXG5pbnRlcmZhY2UgRW11bGF0b3JFeGl0SW5mbyB7XG4gIC8qKiBFeGl0IGNvZGUsIG9yIGBudWxsYCBpZiB0aGUgcHJvY2VzcyB3YXMgdGVybWluYXRlZCBieSBhIHNpZ25hbC4gKi9cbiAgY29kZTogbnVsbCB8IG51bWJlcjtcblxuICAvKiogVGVybWluYXRpbmcgc2lnbmFsLCBvciBgbnVsbGAgaWYgdGhlIHByb2Nlc3MgZXhpdGVkIG5vcm1hbGx5LiAqL1xuICBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBBIHNwYXduZWQgZW11bGF0b3IgcHJvY2VzcyB0b2dldGhlciB3aXRoIGhlbHBlcnMgdG8gaW5zcGVjdCBpdHMgY2FwdHVyZWRcbiAqIG91dHB1dCBhbmQgZXhpdCBzdGF0dXMuXG4gKi9cbmludGVyZmFjZSBFbXVsYXRvckxhdW5jaCB7XG4gIC8qKiBUaGUgc3Bhd25lZCBlbXVsYXRvciBwcm9jZXNzLiAqL1xuICBwcm9jZXNzOiBDaGlsZFByb2Nlc3M7XG5cbiAgLyoqIFJldHVybnMgdGhlIGV4aXQgZGV0YWlscyBvbmNlIHRoZSBwcm9jZXNzIGhhcyBleGl0ZWQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC4gKi9cbiAgcmVhZEV4aXRJbmZvOiAoKSA9PiBFbXVsYXRvckV4aXRJbmZvIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIChib3VuZGVkIHRvIHRoZSBtb3N0IHJlY2VudCBvdXRwdXQpLiAqL1xuICByZWFkT3V0cHV0OiAoKSA9PiBzdHJpbmc7XG5cbiAgLyoqIFN0b3BzIGFjY3VtdWxhdGluZyBvdXRwdXQuIENhbGwgb25jZSBzdGFydHVwIGhhcyBzdWNjZWVkZWQuICovXG4gIHN0b3BDYXB0dXJlOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVuc3VyZURldmljZUNvbm5lY3RlZH0uXG4gKi9cbmludGVyZmFjZSBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMge1xuICAvKiogQVZEIG5hbWUgdG8gY29ubmVjdCB0byAoc3RhcnRpbmcgYSBuZXcgZW11bGF0b3IgaWYgbm90IGFscmVhZHkgcnVubmluZykuICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBwb3N0LWJvb3QgZGV2aWNlLWlkbGUgd2FpdCAoYDBgIHNraXBzIGl0KS4gKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgZW11bGF0b3Igd2luZG93IGlzIHNob3duIChvbWl0dGVkIFx1MjE5MiBoaWRkZW4pLiAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVuc3VyZURldmljZUNvbm5lY3RlZH0uXG4gKi9cbmludGVyZmFjZSBFbnN1cmVEZXZpY2VDb25uZWN0ZWRSZXN1bHQge1xuICAvKiogVGhlIGFjdHVhbCBkZXZpY2UgSUQgdGhhdCBpcyBjb25uZWN0ZWQgKG1heSBkaWZmZXIgZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSkuICovXG4gIHJlYWRvbmx5IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBlbXVsYXRvciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiBzaGVsbCByZXNvbHZlZCBieSB7QGxpbmsgcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsfS5cbiAqL1xuaW50ZXJmYWNlIEluc3RhbGxlZFNoZWxsIHtcbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIGluc3RhbGxlZCBzaGVsbCBleGVjdXRhYmxlLiAqL1xuICByZWFkb25seSBleGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBkZXRlY3RlZCBzaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAqL1xuICByZWFkb25seSBzaGVsbFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5zdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMge1xuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciB0byBiZWNvbWUgcmVhZHkuICovXG4gIHJlYWRvbmx5IGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIFVSTC4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBVUkw7XG5cbiAgLyoqIEFWRCBuYW1lIHRvIHN0YXJ0LiAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgcG9zdC1ib290IGRldmljZS1pZGxlIHdhaXQgKGAwYCBza2lwcyBpdCkuICovXG4gIHJlYWRvbmx5IGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKiogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgY29uc29sZSB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgZW11bGF0b3Igd2luZG93IGlzIHNob3duIChvbWl0dGVkIFx1MjE5MiBoaWRkZW4pLiAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIHBvcnQuICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKiogV2hldGhlciBtaXNzaW5nIEFwcGl1bSBkZXBlbmRlbmNpZXMgbWF5IGJlIGF1dG8taW5zdGFsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGlzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXM6IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgQXBwaXVtIGF1dG8tc3RhcnQgaXMgYWxsb3dlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcn0uXG4gKi9cbmludGVyZmFjZSBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUmVzdWx0IHtcbiAgLyoqIFRoZSBhY3R1YWwgZGV2aWNlIElEIHRoYXQgaXMgY29ubmVjdGVkIChtYXkgZGlmZmVyIGZyb20gdGhlIHJlcXVlc3RlZCBvbmUpLiAqL1xuICByZWFkb25seSBhY3R1YWxEZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEVuY2Fwc3VsYXRlcyBhbGwgQXBwaXVtIHRyYW5zcG9ydCBjcmVhdGlvbiBsb2dpYywgaW5jbHVkaW5nIEFwcGl1bSBzZXJ2ZXJcbiAqIHN0YXJ0dXAsIGVtdWxhdG9yIG1hbmFnZW1lbnQsIGFuZCBXZWJEcml2ZXJJTyBzZXNzaW9uIGVzdGFibGlzaG1lbnQuXG4gKlxuICogVXNpbmcgYSBjbGFzcyBhdm9pZHMgdGhyZWFkaW5nIHRoZSB0cmFuc3BvcnQgYHR5cGVgIGxhYmVsIHRocm91Z2ggZXZlcnlcbiAqIGhlbHBlciBmdW5jdGlvbiBcdTIwMTQgYHRoaXMubG9nKClgIGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgaXQuXG4gKi9cbmNsYXNzIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkge1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFwcGl1bSB0cmFuc3BvcnQgYnkgZXN0YWJsaXNoaW5nIGEgV2ViRHJpdmVySU8gc2Vzc2lvbi5cbiAgICpcbiAgICogSWYgYG9wdGlvbnMuc2Vzc2lvbklkYCBpcyBwcmVzZW50LCByZWF0dGFjaGVzIHRvIHRoZSBleGlzdGluZyBzZXNzaW9uXG4gICAqIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLiBUaGlzIGF2b2lkcyBkdXBsaWNhdGUgQXBwaXVtL0FEQiBjb25uZWN0aW9uc1xuICAgKiB3aGVuIHRlc3Qgd29ya2VycyByZXVzZSB0aGUgZ2xvYmFsIHNldHVwJ3Mgc2Vzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAgICogQHJldHVybnMgQSBjb25maWd1cmVkIEFwcGl1bSB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgaWYgKG9wdGlvbnMuc2Vzc2lvbklkICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5kZXZpY2VJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRhY2hUb0V4aXN0aW5nU2Vzc2lvbihvcHRpb25zLnNlc3Npb25JZCwgb3B0aW9ucy5kZXZpY2VJZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV3U2Vzc2lvbihvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXR0YWNoVG9FeGlzdGluZ1Nlc3Npb24oXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgZGV2aWNlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4gICk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgICB0aGlzLmxvZyhgUmVhdHRhY2hpbmcgdG8gZXhpc3RpbmcgQXBwaXVtIHNlc3Npb24gJHtzZXNzaW9uSWR9IChkZXZpY2U9JHtkZXZpY2VJZH0pYCk7XG5cbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgYXR0YWNoKHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdBbmRyb2lkJ1xuICAgICAgfSxcbiAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICBsb2dMZXZlbDogJ3dhcm4nLFxuICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgcG9ydCxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IHN0cmlwRm9yYmlkZGVuRmV0Y2hIZWFkZXJzXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZygnUmVhdHRhY2hlZCB0byBBcHBpdW0gc2Vzc2lvbi4nKTtcblxuICAgIHJldHVybiBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgIGFwcElkLFxuICAgICAgYnJvd3NlcixcbiAgICAgIGRldmljZUlkLFxuICAgICAgaXNTZXNzaW9uT3duZXI6IGZhbHNlLFxuICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgIC4uLihvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSxcbiAgICAgIC4uLihvcHRpb25zLnZhdWx0QmFzZVBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCB9KSxcbiAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXNVcmwgPSBuZXcgVVJMKCcvc3RhdHVzJywgdXJsKTtcbiAgICAgIGNvbnN0IHJlcSA9IGh0dHAuZ2V0KHN0YXR1c1VybCwgeyB0aW1lb3V0OiBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChyZXMpID0+IHtcbiAgICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn0gZGlkIG5vdCByZXNwb25kIHdpdGhpbiAke1N0cmluZyhBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXEub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCByZWFjaCBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn06ICR7ZXJyLm1lc3NhZ2V9LiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTmV3U2Vzc2lvbihvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIHRoaXMubG9nKGBDcmVhdGluZyBBcHBpdW1UcmFuc3BvcnQgKHVybD0ke29wdGlvbnMuYXBwaXVtVXJsfSwgYXZkPSR7b3B0aW9ucy5hdmROYW1lfSlgKTtcblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5hcHBpdW1VcmwpO1xuXG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgaWYgKGlzTmFOKHBvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcG9ydCBpbiBhcHBpdW1Vcmw6ICR7dXJsLnBvcnR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gICAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZW11bGF0b3JQcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdGFydEFwcGl1bUFuZEVtdWxhdG9yKHtcbiAgICAgICAgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVBcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyhvcHRpb25zKSxcbiAgICAgICAgYXBwaXVtVXJsOiB1cmwsXG4gICAgICAgIGF2ZE5hbWU6IG9wdGlvbnMuYXZkTmFtZSxcbiAgICAgICAgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogcmVzb2x2ZURldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgIGlzQXBwaXVtQ29uc29sZVZpc2libGU6IG9wdGlvbnMuaXNBcHBpdW1Db25zb2xlVmlzaWJsZSxcbiAgICAgICAgaXNFbXVsYXRvclZpc2libGU6IG9wdGlvbnMuaXNFbXVsYXRvclZpc2libGUsXG4gICAgICAgIHBvcnQsXG4gICAgICAgIHNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzOiByZXNvbHZlU2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXMob3B0aW9ucyksXG4gICAgICAgIHNob3VsZEF1dG9TdGFydEFwcGl1bTogb3B0aW9ucy5zaG91bGRBdXRvU3RhcnRBcHBpdW1cbiAgICAgIH0pO1xuXG4gICAgICBhcHBpdW1Qcm9jZXNzID0gcmVzdWx0LmFwcGl1bVByb2Nlc3M7XG4gICAgICBlbXVsYXRvclByb2Nlc3MgPSByZXN1bHQuZW11bGF0b3JQcm9jZXNzO1xuICAgICAgY29uc3QgYWN0dWFsRGV2aWNlSWQgPSByZXN1bHQuYWN0dWFsRGV2aWNlSWQ7XG5cbiAgICAgIGNvbnN0IHNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0ID0gcmVzb2x2ZVNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyk7XG4gICAgICB0aGlzLmxvZyhcbiAgICAgICAgYENvbm5lY3RpbmcgdG8gQXBwaXVtIChkZXZpY2U9JHthY3R1YWxEZXZpY2VJZH0sIGFwcD0ke2FwcElkfSwgcmV0cnlUaW1lb3V0OiAke1N0cmluZyhzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCl9bXMsIHJldHJpZXM6ICR7U3RyaW5nKEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UKX0pLi4uYFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCByZW1vdGUoe1xuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAnYXBwaXVtOmFwcEFjdGl2aXR5JzogQVBQX0FDVElWSVRZLFxuICAgICAgICAgICdhcHBpdW06YXBwUGFja2FnZSc6IGFwcElkLFxuICAgICAgICAgICdhcHBpdW06YXV0b0dyYW50UGVybWlzc2lvbnMnOiB0cnVlLFxuICAgICAgICAgICdhcHBpdW06YXV0b21hdGlvbk5hbWUnOiAnVWlBdXRvbWF0b3IyJyxcbiAgICAgICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAnYXBwaXVtOm5vUmVzZXQnOiB0cnVlLFxuICAgICAgICAgICdhcHBpdW06dWRpZCc6IGFjdHVhbERldmljZUlkLFxuICAgICAgICAgICdhcHBpdW06dWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQnOiBTRVJWRVJfSU5TVEFMTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQnOiBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnQW5kcm9pZCdcbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5ULFxuICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiBzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCxcbiAgICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgICBwb3J0LFxuICAgICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVyc1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2Vzc2lvbiBlc3RhYmxpc2hlZC4nKTtcbiAgICAgIGNvbnN0IGFwcGl1bVRyYW5zcG9ydCA9IG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgICAgICBhcHBJZCxcbiAgICAgICAgYnJvd3NlcixcbiAgICAgICAgZGV2aWNlSWQ6IGFjdHVhbERldmljZUlkLFxuICAgICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgICAuLi4ob3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAgIC4uLihvcHRpb25zLnZhdWx0QmFzZVBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCB9KSxcbiAgICAgICAgLi4uKG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3JpZ2luYWxEaXNwb3NlID0gYXBwaXVtVHJhbnNwb3J0LmRpc3Bvc2UuYmluZChhcHBpdW1UcmFuc3BvcnQpO1xuICAgICAgY29uc3QgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCA9IGFwcGl1bVRyYW5zcG9ydDtcbiAgICAgIHRyYW5zcG9ydC5kaXNwb3NlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsRGlzcG9zZSgpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZVN5bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRyYW5zcG9ydDtcblxuICAgICAgZnVuY3Rpb24ga2lsbEF1dG9TdGFydGVkUHJvY2Vzc2VzKCk6IHZvaWQge1xuICAgICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICAgIGtpbGxQcm9jZXNzVHJlZShhcHBpdW1Qcm9jZXNzKTtcbiAgICAgICAgICAvLyBDYW5ub3QgdXNlIHRoaXMubG9nIGluc2lkZSBuZXN0ZWQgZnVuY3Rpb24gXHUyMDE0IGB0aGlzYCBpcyBub3QgY2FwdHVyZWQuXG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBzdG9wcGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbXVsYXRvclByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke29wdGlvbnMudHlwZX1dIEF1dG8tc3RhcnRlZCBlbXVsYXRvciBzdG9wcGVkLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICAgIGtpbGxQcm9jZXNzVHJlZShhcHBpdW1Qcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgICB9XG4gICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgIGtpbGxQcm9jZXNzVHJlZShlbXVsYXRvclByb2Nlc3MpO1xuICAgICAgICB0aGlzLmxvZygnS2lsbGVkIGF1dG8tc3RhcnRlZCBlbXVsYXRvciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgQXBwaXVtIHRvb2xjaGFpbiBpcyBwcmVzZW50IGJlZm9yZSB0aGUgc2VydmVyIGlzIGF1dG8tc3RhcnRlZDpcbiAgICogQXBwaXVtIGl0c2VsZiwgdGhlbiB0aGUgYHVpYXV0b21hdG9yMmAgZHJpdmVyLiBFYWNoIGlzIGNoZWNrZWQgZmlyc3QgYW5kXG4gICAqIGluc3RhbGxlZCBvbmx5IHdoZW4gbWlzc2luZywgc28gYSBmdWxseS1wcm92aXNpb25lZCBtYWNoaW5lIGluY3VycyBqdXN0IHR3b1xuICAgKiBmYXN0IHZlcnNpb24vbGlzdCBwcm9iZXMuXG4gICAqXG4gICAqIE9ubHkgaW52b2tlZCB3aGVuIHRoZSBoYXJuZXNzIGlzIGFib3V0IHRvIGF1dG8tc3RhcnQgdGhlIHNlcnZlciBhbmRcbiAgICoge0BsaW5rIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMuc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXN9XG4gICAqIGlzIGVuYWJsZWQuIENvbW1hbmRzIGFyZSBwYXNzZWQgYXMgc3RyaW5ncyBzbyBgZXhlY2AgcnVucyB0aGVtIHRocm91Z2ggdGhlXG4gICAqIHNoZWxsLCB3aGljaCByZXNvbHZlcyB0aGUgYG5wbWAvYG5weGAgYC5jbWRgIHNoaW1zIG9uIFdpbmRvd3MgKHRoZSBhcnJheVxuICAgKiBwYXRoIHNwYXducyB3aXRob3V0IGEgc2hlbGwgYW5kIGNhbm5vdCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUFwcGl1bURlcGVuZGVuY2llcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUFwcGl1bUluc3RhbGxlZCgpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlVWlhdXRvbWF0b3IyRHJpdmVySW5zdGFsbGVkKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZUFwcGl1bUluc3RhbGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZygnQ2hlY2tpbmcgd2hldGhlciBBcHBpdW0gaXMgaW5zdGFsbGVkLi4uJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYygnbnB4IC0tbm8taW5zdGFsbCBhcHBpdW0gLS12ZXJzaW9uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLFxuICAgICAgc2hvdWxkSW5jbHVkZURldGFpbHM6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQuZXhpdENvZGUgPT09IDApIHtcbiAgICAgIHRoaXMubG9nKGBBcHBpdW0gaXMgaW5zdGFsbGVkICh2ZXJzaW9uICR7cmVzdWx0LnN0ZG91dC50cmltKCkgfHwgJ3Vua25vd24nfSkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2coJ0FwcGl1bSBpcyBub3QgaW5zdGFsbGVkLiBJbnN0YWxsaW5nIGdsb2JhbGx5IHZpYSBgbnBtIGluc3RhbGwgLWcgYXBwaXVtYC4uLicpO1xuICAgIGF3YWl0IGV4ZWMoJ25wbSBpbnN0YWxsIC1nIGFwcGl1bScpO1xuICAgIHRoaXMubG9nKCdBcHBpdW0gaW5zdGFsbGVkLicpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXZpY2VDb25uZWN0ZWQocGFyYW1zOiBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMpOiBQcm9taXNlPEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNFbXVsYXRvclZpc2libGUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBkZXZpY2VJZHNCZWZvcmUgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZUlkcygpO1xuICAgIHRoaXMubG9nKGBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCIke2F2ZE5hbWV9XCIuLi4gKGNvbm5lY3RlZDogWyR7ZGV2aWNlSWRzQmVmb3JlLmpvaW4oJywgJyl9XSlgKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlSWQgPSBhd2FpdCB0aGlzLmZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZSwgZGV2aWNlSWRzQmVmb3JlKTtcblxuICAgIGlmIChleGlzdGluZ0RldmljZUlkKSB7XG4gICAgICB0aGlzLmxvZyhgQVZEIFwiJHthdmROYW1lfVwiIGlzIGFscmVhZHkgcnVubmluZyBvbiBkZXZpY2UgJHtleGlzdGluZ0RldmljZUlkfSwgcmV1c2luZy5gKTtcbiAgICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoZXhpc3RpbmdEZXZpY2VJZCk7XG4gICAgICByZXR1cm4geyBhY3R1YWxEZXZpY2VJZDogZXhpc3RpbmdEZXZpY2VJZCB9O1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBBVkQgXCIke2F2ZE5hbWV9XCIgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2UsIHN0YXJ0aW5nIGEgbmV3IGVtdWxhdG9yLi4uYCk7XG4gICAgY29uc3QgZW11bGF0b3IgPSB0aGlzLnN0YXJ0RW11bGF0b3IoYXZkTmFtZSwgaXNFbXVsYXRvclZpc2libGUpO1xuXG4gICAgbGV0IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGFjdHVhbERldmljZUlkID0gYXdhaXQgdGhpcy53YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZSwgZW11bGF0b3IsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbXVsYXRvci5zdG9wQ2FwdHVyZSgpO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBFbXVsYXRvciBcIiR7YXZkTmFtZX1cIiBzdGFydGVkLCBkZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gaXMgY29ubmVjdGVkLmApO1xuICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoYWN0dWFsRGV2aWNlSWQpO1xuICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkLCBlbXVsYXRvclByb2Nlc3M6IGVtdWxhdG9yLnByb2Nlc3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlVWlhdXRvbWF0b3IyRHJpdmVySW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nKGBDaGVja2luZyB3aGV0aGVyIHRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGlzIGluc3RhbGxlZC4uLmApO1xuICAgIGNvbnN0IGRyaXZlckxpc3RKc29uID0gYXdhaXQgZXhlYygnbnB4IC0tbm8taW5zdGFsbCBhcHBpdW0gZHJpdmVyIGxpc3QgLS1pbnN0YWxsZWQgLS1qc29uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAoY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZCh7IGRyaXZlckxpc3RKc29uLCBkcml2ZXJOYW1lOiBVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUUgfSkpIHtcbiAgICAgIHRoaXMubG9nKGBUaGUgJHtVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUV9IGRyaXZlciBpcyBpbnN0YWxsZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYFRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGlzIG5vdCBpbnN0YWxsZWQuIEluc3RhbGxpbmcgdmlhIFxcYGFwcGl1bSBkcml2ZXIgaW5zdGFsbCAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX1cXGAuLi5gKTtcbiAgICBhd2FpdCBleGVjKGBucHggLS1uby1pbnN0YWxsIGFwcGl1bSBkcml2ZXIgaW5zdGFsbCAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX1gKTtcbiAgICB0aGlzLmxvZyhgVGhlICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfSBkcml2ZXIgaW5zdGFsbGVkLmApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kRGV2aWNlQnlBdmROYW1lKGF2ZE5hbWU6IHN0cmluZywgZGV2aWNlSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgZm9yIChjb25zdCBkZXZpY2VJZCBvZiBkZXZpY2VJZHMpIHtcbiAgICAgIGNvbnN0IHJ1bm5pbmdBdmQgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAgICdhZGInLFxuICAgICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ2VtdScsICdhdmQnLCAnbmFtZSddLFxuICAgICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAgIChfZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQuc3BsaXQoJ1xcbicpWzBdPy50cmltKCkgPz8gJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocnVubmluZ0F2ZCA9PT0gYXZkTmFtZSkge1xuICAgICAgICByZXR1cm4gZGV2aWNlSWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGV4ZWNGaWxlKCdhZGInLCBbJ2RldmljZXMnXSwgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAnYWRiIGRldmljZXMnOiAke2Vycm9yLm1lc3NhZ2V9LiBJcyBBREIgaW5zdGFsbGVkIGFuZCBpbiBQQVRIP2ApKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIHRoaXMubG9nKGBBREIgc3RkZXJyOiAke3N0ZGVyci50cmltKCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBsaW5lcyA9IG91dHB1dC5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSkuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuICAgIHJldHVybiBsaW5lc1xuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5pbmNsdWRlcygnXFx0ZGV2aWNlJykpXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNwbGl0KCdcXHQnKVswXSA/PyAnJyk7XG4gIH1cblxuICBwcml2YXRlIGdldERldmljZVByb3AoZGV2aWNlSWQ6IHN0cmluZywgcHJvcDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnZ2V0cHJvcCcsIHByb3BdLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAvLyBSZXR1cm4gbm8gb3V0cHV0IG9uIHRpbWVvdXQvZXJyb3IgKG5vdCBwYXJ0aWFsIHN0ZG91dCkgc28gYSBub24tcmVzcG9uc2l2ZSBndWVzdCByZWFkcyBhcyBcIm5vdCBpZGxlXCIuXG4gICAgICAgICAgcmVzb2x2ZShlcnJvciA/ICcnIDogc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdEluc3RhbGxlZFBhY2thZ2VzKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdjbWQnLCAncGFja2FnZScsICdsaXN0JywgJ3BhY2thZ2VzJ10sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgIC8vIFJldHVybiBubyBvdXRwdXQgb24gdGltZW91dC9lcnJvciBzbyBhIGNodXJuaW5nIGd1ZXN0J3Mgc2xvdy9wYXJ0aWFsIHBhY2thZ2UgbGlzdCBjYW4ndCBmYWxzZWx5IHJlYWQgYXMgaWRsZS5cbiAgICAgICAgICByZXNvbHZlKGVycm9yID8gJycgOiBzdGRvdXQpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2cobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHt0aGlzLnR5cGV9XSAke21lc3NhZ2V9YCk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVFbXVsYXRvckJpbmFyeSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNka1Jvb3QgPSBwcm9jZXNzLmVudlsnQU5EUk9JRF9IT01FJ10gPz8gcHJvY2Vzcy5lbnZbJ0FORFJPSURfU0RLX1JPT1QnXTtcbiAgICBpZiAoIXNka1Jvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBmaW5kIEFuZHJvaWQgZW11bGF0b3I6IG5laXRoZXIgQU5EUk9JRF9IT01FIG5vciBBTkRST0lEX1NES19ST09UIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldC4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gam9pbihzZGtSb290LCAnZW11bGF0b3InLCAnZW11bGF0b3InKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZEtleUV2ZW50KGRldmljZUlkOiBzdHJpbmcsIGtleUNvZGU6IG51bWJlciwgZGVzY3JpcHRpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2lucHV0JywgJ2tleWV2ZW50JywgU3RyaW5nKGtleUNvZGUpXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgICAgIGBXYXJuaW5nOiBmYWlsZWQgdG8gJHtkZXNjcmlwdGlvbn0gKGtleWV2ZW50ICR7U3RyaW5nKGtleUNvZGUpfSk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0YXJ0QXBwaXVtQW5kRW11bGF0b3IocGFyYW1zOiBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUGFyYW1zKTogUHJvbWlzZTxTdGFydEFwcGl1bUFuZEVtdWxhdG9yUmVzdWx0PiB7XG4gICAgY29uc3QgeyBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcywgYXBwaXVtVXJsLCBhdmROYW1lLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzLCBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlLCBpc0VtdWxhdG9yVmlzaWJsZSwgcG9ydCwgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXMsIHNob3VsZEF1dG9TdGFydEFwcGl1bSB9ID0gcGFyYW1zO1xuXG4gICAgbGV0IG5lZWRzQXBwaXVtU3RhcnQgPSBmYWxzZTtcblxuICAgIHRoaXMubG9nKGBDaGVja2luZyBBcHBpdW0gc2VydmVyIGF0ICR7YXBwaXVtVXJsLmhyZWZ9Li4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUoYXBwaXVtVXJsKTtcbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2VydmVyIGlzIHJlYWNoYWJsZS4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKHNob3VsZEF1dG9TdGFydEFwcGl1bSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBuZWVkc0FwcGl1bVN0YXJ0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5lZWRzQXBwaXVtU3RhcnQpIHtcbiAgICAgIGlmIChzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcykge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUFwcGl1bURlcGVuZGVuY2llcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2coYEFwcGl1bSBub3QgcmVhY2hhYmxlLCBhdXRvLXN0YXJ0aW5nIG9uIHBvcnQgJHtTdHJpbmcocG9ydCl9Li4uYCk7XG4gICAgICBhcHBpdW1Qcm9jZXNzID0gdGhpcy5zdGFydEFwcGl1bVNlcnZlcihwb3J0LCBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgWywgZGV2aWNlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgbmVlZHNBcHBpdW1TdGFydFxuICAgICAgICAgID8gdGhpcy53YWl0Rm9yQXBwaXVtUmVhZHkoYXBwaXVtVXJsLCBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZygnQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgaXMgcmVhZHkuJyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgICB0aGlzLmVuc3VyZURldmljZUNvbm5lY3RlZCh7IGF2ZE5hbWUsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGlzRW11bGF0b3JWaXNpYmxlIH0pXG4gICAgICBdKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0dWFsRGV2aWNlSWQ6IGRldmljZVJlc3VsdC5hY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgYXBwaXVtUHJvY2VzcyxcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzOiBkZXZpY2VSZXN1bHQuZW11bGF0b3JQcm9jZXNzXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgc3RhcnR1cCBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEFwcGl1bVNlcnZlcihwb3J0OiBudW1iZXIsIGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuKTogQ2hpbGRQcm9jZXNzIHtcbiAgICBjb25zdCBpc0NvbnNvbGVIaWRkZW4gPSBzaG91bGRIaWRlQXBwaXVtQ29uc29sZShpc0FwcGl1bUNvbnNvbGVWaXNpYmxlKTtcbiAgICBjb25zdCB7IGRldGFjaGVkLCB3aW5kb3dzSGlkZSB9ID0gcmVzb2x2ZUFwcGl1bVNwYXduRmxhZ3MoaXNDb25zb2xlSGlkZGVuKTtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGBucHggYXBwaXVtIC0tbG9nLXRpbWVzdGFtcCAtLXBvcnQgJHtTdHJpbmcocG9ydCl9IC0tYWxsb3ctaW5zZWN1cmU9JHtDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkV9YCwge1xuICAgICAgZGV0YWNoZWQsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiBpc0NvbnNvbGVIaWRkZW4gPyAnaWdub3JlJyA6IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgd2luZG93c0hpZGVcbiAgICB9KTtcblxuICAgIGNoaWxkLnVucmVmKCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEVtdWxhdG9yKGF2ZE5hbWU6IHN0cmluZywgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuKTogRW11bGF0b3JMYXVuY2gge1xuICAgIGNvbnN0IGVtdWxhdG9yQmluYXJ5ID0gdGhpcy5yZXNvbHZlRW11bGF0b3JCaW5hcnkoKTtcbiAgICBjb25zdCBpc1dpbmRvd0hpZGRlbiA9IHNob3VsZEhpZGVFbXVsYXRvcldpbmRvdyhpc0VtdWxhdG9yVmlzaWJsZSk7XG4gICAgY29uc3QgYXJncyA9IGJ1aWxkRW11bGF0b3JBcmdzKHsgYXZkTmFtZSwgaXNIaWRkZW46IGlzV2luZG93SGlkZGVuIH0pO1xuICAgIGNvbnN0IHsgZGV0YWNoZWQsIHdpbmRvd3NIaWRlIH0gPSByZXNvbHZlRW11bGF0b3JTcGF3bkZsYWdzKGlzV2luZG93SGlkZGVuKTtcbiAgICB0aGlzLmxvZyhgUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAvKlxuICAgICAqIFBpcGUgKHJhdGhlciB0aGFuIGlnbm9yZSkgc3Rkb3V0L3N0ZGVyciBzbyBhbiBlYXJseSBmYWlsdXJlIHN1Y2ggYXNcbiAgICAgKiBcIng4Nl82NCBlbXVsYXRpb24gY3VycmVudGx5IHJlcXVpcmVzIGhhcmR3YXJlIGFjY2VsZXJhdGlvblwiIGNhbiBiZVxuICAgICAqIHN1cmZhY2VkIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlIGZ1bGwgYm9vdCB0aW1lb3V0LlxuICAgICAqL1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZW11bGF0b3JCaW5hcnksIGFyZ3MsIHtcbiAgICAgIGRldGFjaGVkLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgICAgd2luZG93c0hpZGVcbiAgICB9KTtcblxuICAgIGxldCBjYXB0dXJlZE91dHB1dCA9ICcnO1xuICAgIGxldCBleGl0SW5mbzogRW11bGF0b3JFeGl0SW5mbyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaXNDYXB0dXJpbmcgPSB0cnVlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgYXBwZW5kT3V0cHV0KTtcbiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBhcHBlbmRPdXRwdXQpO1xuICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICBleGl0SW5mbyA9IHsgY29kZSwgc2lnbmFsIH07XG4gICAgfSk7XG5cbiAgICBjaGlsZC51bnJlZigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2Nlc3M6IGNoaWxkLFxuICAgICAgcmVhZEV4aXRJbmZvOiAoKSA9PiBleGl0SW5mbyxcbiAgICAgIHJlYWRPdXRwdXQ6ICgpID0+IGNhcHR1cmVkT3V0cHV0LFxuICAgICAgc3RvcENhcHR1cmU6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgICogTGVhdmUgdGhlIGBkYXRhYCBsaXN0ZW5lcnMgYXR0YWNoZWQgc28gdGhlIHBpcGVzIGtlZXAgZHJhaW5pbmcgKGFcbiAgICAgICAgICogZnVsbCBPUyBwaXBlIGJ1ZmZlciB3b3VsZCBibG9jayB0aGUgbG9uZy1ydW5uaW5nIGVtdWxhdG9yKTsgdGhlIGZsYWdcbiAgICAgICAgICoganVzdCBmcmVlemVzIHRoZSBjYXB0dXJlZCB0YWlsIG9uY2Ugc3RhcnR1cCBoYXMgc3VjY2VlZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgaXNDYXB0dXJpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYXBwZW5kT3V0cHV0KGNodW5rOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgIGlmICghaXNDYXB0dXJpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FwdHVyZWRPdXRwdXQgPSAoY2FwdHVyZWRPdXRwdXQgKyBjaHVuay50b1N0cmluZygpKS5zbGljZSgtRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIHRoZSBndWVzdCdzIGNyYXNoL0FOUiBkaWFsb2dzIG9uIHRoZSBnaXZlbiBkZXZpY2UuXG4gICAqXG4gICAqIEEgcmVzb3VyY2Utc3RhcnZlZCBlbXVsYXRvciBjYW4gcmFpc2UgYSBcIlByb2Nlc3Mgc3lzdGVtIGlzbid0IHJlc3BvbmRpbmdcIlxuICAgKiBBTlIgKGFuIGBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlYCB0aW1lb3V0KSB3aG9zZSBkaWFsb2cgb3ZlcmxheXMgdGhlIFVJLiBJZlxuICAgKiBpdCBhcHBlYXJzIGJlZm9yZSBBcHBpdW0gYXR0YWNoZXMsIG5vdGhpbmcgY2FuIGRpc21pc3MgaXQgYW5kIHRoZSBydW4gaGFuZ3NcbiAgICogb3IgZmFpbHMgaW50ZXJtaXR0ZW50bHkuIFNldHRpbmcgdGhlIGBoaWRlX2Vycm9yX2RpYWxvZ3NgIGdsb2JhbCBcdTIwMTQgdGhlIHNhbWVcbiAgICogZmxhZyBBbmRyb2lkJ3Mgb3duIHRlc3QgaW5mcmEgdXNlcyBcdTIwMTQgdGVsbHMgYEFjdGl2aXR5TWFuYWdlclNlcnZpY2VgIHRvXG4gICAqIG5ldmVyIGRyYXcgY3Jhc2gvQU5SIGRpYWxvZ3MsIHNvIHRoZSBBTlIgY2FuIG5vIGxvbmdlciBibG9jayBhdXRvbWF0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBlYXJsaWVzdCBwb2ludCBhdCB3aGljaCB0aGUgZmxhZyBjYW4gYmUgc2V0OiB0aGUgZnJhbWV3b3JrXG4gICAqIChgc3lzdGVtX3NlcnZlcmApIG11c3QgYmUgdXAgYmVmb3JlIGBzZXR0aW5ncyBwdXRgIHdvcmtzLCBzbyBjYWxsZXJzIGludm9rZVxuICAgKiBpdCBvbmx5IGFmdGVyIGBzeXMuYm9vdF9jb21wbGV0ZWRgLiBJdCBuYXJyb3dzIFx1MjAxNCBidXQgY2Fubm90IGZ1bGx5IGNsb3NlIFx1MjAxNFxuICAgKiB0aGUgcmFjZSB3aXRoIGFuIEFOUiB0aGF0IGZpcmVzIGJldHdlZW4gYm9vdCBjb21wbGV0aW5nIGFuZCB0aGlzIGNhbGw7IGFcbiAgICogcHJlLWJha2VkIHNuYXBzaG90IHdpdGggdGhlIGZsYWcgYWxyZWFkeSBzZXQgaXMgdGhlIG9ubHkgd2F5IHRvIGVsaW1pbmF0ZVxuICAgKiBpdCBlbnRpcmVseS4gQmVzdC1lZmZvcnQ6IGEgZmFpbHVyZSBpcyBsb2dnZWQsIG5vdCB0aHJvd24sIHNpbmNlIGl0IG9ubHlcbiAgICogc3VwcHJlc3NlcyBhIHN5bXB0b20uXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBjb25maWd1cmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN1cHByZXNzRXJyb3JEaWFsb2dzKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgRGlzYWJsaW5nIGNyYXNoL0FOUiBkaWFsb2dzIG9uIGRldmljZSAke2RldmljZUlkfSAoc2V0dGluZ3MgcHV0IGdsb2JhbCBoaWRlX2Vycm9yX2RpYWxvZ3MgMSkuLi5gKTtcblxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ3NldHRpbmdzJywgJ3B1dCcsICdnbG9iYWwnLCAnaGlkZV9lcnJvcl9kaWFsb2dzJywgJzEnXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgICAgIGBXYXJuaW5nOiBmYWlsZWQgdG8gZGlzYWJsZSBjcmFzaC9BTlIgZGlhbG9nczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckFwcGl1bVJlYWR5KHVybDogVVJMLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBBcHBpdW0gYXQgJHt1cmwuaHJlZn0gKHRpbWVvdXQ6ICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMsIHBvbGw6ICR7U3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICAgICAgdGhpcy5sb2coYEFwcGl1bSBzZXJ2ZXIgcmVhZHkgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRoaXMubG9nKGBBcHBpdW0gc2VydmVyIG5vdCByZWFkeSB5ZXQgKGVsYXBzZWQ6ICR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMpLiBSZXRyeWluZy4uLmApO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGRpZCBub3QgYmVjb21lIHJlYWR5IHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zYFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JCb290KGRldmljZUlkOiBzdHJpbmcsIGRlYWRsaW5lOiBudW1iZXIsIGVtdWxhdG9yOiBFbXVsYXRvckxhdW5jaCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlbWFpbmluZ01zID0gTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKTtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gZmluaXNoIGJvb3RpbmcgKHJlbWFpbmluZzogJHtTdHJpbmcocmVtYWluaW5nTXMpfW1zLCBwb2xsOiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IGlzQm9vdGVkID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICAgJ2FkYicsXG4gICAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnZ2V0cHJvcCcsICdzeXMuYm9vdF9jb21wbGV0ZWQnXSxcbiAgICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgICAoX2Vycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnRyaW0oKSA9PT0gJzEnKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzQm9vdGVkKSB7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gYm9vdCBjb21wbGV0ZWQuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhpdEluZm8gPSBlbXVsYXRvci5yZWFkRXhpdEluZm8oKTtcbiAgICAgIGlmIChleGl0SW5mbykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYnVpbGRFbXVsYXRvckV4aXRNZXNzYWdlKGV4aXRJbmZvLCBlbXVsYXRvci5yZWFkT3V0cHV0KCkpKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBEZXZpY2UgXCIke2RldmljZUlkfVwiIGNvbm5lY3RlZCBidXQgZGlkIG5vdCBmaW5pc2ggYm9vdGluZyB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIGEgZnJlc2hseS1ib290ZWQgZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBzZXNzaW9uIGlzXG4gICAqIGVzdGFibGlzaGVkLlxuICAgKlxuICAgKiBgc3lzLmJvb3RfY29tcGxldGVkYCBmaXJlcyBiZWZvcmUgdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGUgXHUyMDE0IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzZXJ2aWNlcyBrZWVwIGNodXJuaW5nIFx1MjAxNCBzbyBlc3RhYmxpc2hpbmcgdGhlIEFwcGl1bVxuICAgKiBzZXNzaW9uIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IHNlcmlhbGl6ZWQgVWlBdXRvbWF0b3IyIGBhZGJgIHJvdW5kLXRyaXBcbiAgICogY29udGVuZCB3aXRoIHRoYXQgd29yayBhbmQgaW5mbGF0ZXMgc2Vzc2lvbiBlc3RhYmxpc2htZW50IH4zeC4gVGhpcyBwb2xsc1xuICAgKiBhIGxhdGVyLCBxdWlldGVyIHNpZ25hbCAoYm9vdCBhbmltYXRpb24gc3RvcHBlZCArIHBhY2thZ2UgbWFuYWdlciBzZXJ2aW5nLFxuICAgKiB2aWEge0BsaW5rIGNoZWNrRGV2aWNlSWRsZX0pIGFuZCByZXR1cm5zIGFzIHNvb24gYXMgaXQgaXMgc2F0aXNmaWVkLlxuICAgKlxuICAgKiBCZXN0LWVmZm9ydDogaWYgdGhlIGd1ZXN0IGRvZXMgbm90IHJlcG9ydCBpZGxlIHdpdGhpbiB0aGUgYnVkZ2V0IGl0IGxvZ3MgYVxuICAgKiB3YXJuaW5nIGFuZCBwcm9jZWVkcyAoYSBzbG93IHNlc3Npb24gaXMgYmV0dGVyIHRoYW4gYSBmYWlsZWQgcnVuKSwgYW5kIGFcbiAgICogYnVkZ2V0IG9mIGAwYCBza2lwcyB0aGUgd2FpdCBlbnRpcmVseS5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGRldmljZSBVRElEIHRvIHBvbGwuXG4gICAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBNYXhpbXVtIHRpbWUgdG8gd2FpdDsgYDBgIHNraXBzIHRoZSB3YWl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yRGV2aWNlSWRsZShkZXZpY2VJZDogc3RyaW5nLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aW1lb3V0SW5NaWxsaXNlY29uZHMgPD0gMCkge1xuICAgICAgdGhpcy5sb2coYFNraXBwaW5nIHBvc3QtYm9vdCBpZGxlIHdhaXQgZm9yIGRldmljZSAke2RldmljZUlkfSAodGltZW91dCBpcyAwKS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gYmVjb21lIGlkbGUgKHRpbWVvdXQ6ICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMsIHBvbGw6ICR7U3RyaW5nKERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IFtib290QW5pbWF0aW9uUHJvcCwgcGFja2FnZUxpc3RPdXRwdXRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLmdldERldmljZVByb3AoZGV2aWNlSWQsICdpbml0LnN2Yy5ib290YW5pbScpLFxuICAgICAgICB0aGlzLmxpc3RJbnN0YWxsZWRQYWNrYWdlcyhkZXZpY2VJZClcbiAgICAgIF0pO1xuXG4gICAgICBpZiAoY2hlY2tEZXZpY2VJZGxlKHsgYm9vdEFuaW1hdGlvblByb3AsIHBhY2thZ2VMaXN0T3V0cHV0IH0pKSB7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gaXMgaWRsZSBhZnRlciAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gbm90IGlkbGUgeWV0IChlbGFwc2VkOiAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zKS4gUmV0cnlpbmcuLi5gKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgREVWSUNFX0lETEVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FybmluZzogZGV2aWNlICR7ZGV2aWNlSWR9IGRpZCBub3QgcmVwb3J0IGlkbGUgd2l0aGluICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXM7IHByb2NlZWRpbmcgd2l0aCBzZXNzaW9uIGVzdGFibGlzaG1lbnQgYW55d2F5LmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZTogc3RyaW5nW10sIGVtdWxhdG9yOiBFbXVsYXRvckxhdW5jaCwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBhIG5ldyBkZXZpY2UgdG8gYXBwZWFyIGluIEFEQiAodGltZW91dDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHBvbGw6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBjdXJyZW50SWRzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHMoKTtcbiAgICAgIGNvbnN0IG5ld0lkcyA9IGN1cnJlbnRJZHMuZmlsdGVyKChpZCkgPT4gIWRldmljZUlkc0JlZm9yZS5pbmNsdWRlcyhpZCkpO1xuXG4gICAgICBpZiAobmV3SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWN0dWFsRGV2aWNlSWQgPSBuZXdJZHNbMF0gPz8gJyc7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gYXBwZWFyZWQgaW4gQURCLCB3YWl0aW5nIGZvciBib290IHRvIGNvbXBsZXRlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckJvb3QoYWN0dWFsRGV2aWNlSWQsIGRlYWRsaW5lLCBlbXVsYXRvcik7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZUlkbGUoYWN0dWFsRGV2aWNlSWQsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgICAgICBhd2FpdCB0aGlzLndha2VTY3JlZW4oYWN0dWFsRGV2aWNlSWQpO1xuICAgICAgICByZXR1cm4gYWN0dWFsRGV2aWNlSWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbywgZW11bGF0b3IucmVhZE91dHB1dCgpKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gbmV3IGVtdWxhdG9yIGRldmljZSBhcHBlYXJlZCB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdha2VTY3JlZW4oZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nKGBXYWtpbmcgc2NyZWVuIG9uIGRldmljZSAke2RldmljZUlkfS4uLmApO1xuXG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfV0FLRVVQLCAnd2FrZSBzY3JlZW4nKTtcbiAgICBhd2FpdCB0aGlzLnNlbmRLZXlFdmVudChkZXZpY2VJZCwgS0VZQ09ERV9NRU5VLCAnZGlzbWlzcyBsb2NrIHNjcmVlbicpO1xuXG4gICAgdGhpcy5sb2coYFNjcmVlbiB3YWtlIGNvbXBsZXRlIG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gYW4gb3duZWQgZGVza3RvcCBDRFAgdHJhbnNwb3J0LlxuICogQHJldHVybnMgQSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgY29uc3QgdHlwZSA9IG9wdGlvbnM/LnR5cGUgPz8gREVGQVVMVF9UUkFOU1BPUlRfVFlQRTtcblxuICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2RwJykge1xuICAgIHJldHVybiBjcmVhdGVDZHBUcmFuc3BvcnQob3B0aW9ucyk7XG4gIH1cblxuICBjb25zdCBmYWN0b3J5ID0gbmV3IEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkodHlwZSk7XG4gIHJldHVybiBmYWN0b3J5LmNyZWF0ZShvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlIGZvciBhbiBlbXVsYXRvciBwcm9jZXNzIHRoYXQgZXhpdGVkIGR1cmluZ1xuICogc3RhcnR1cCwgYXBwZW5kaW5nIHRoZSBjYXB0dXJlZCBvdXRwdXQgdGFpbCB3aGVuIGF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0gZXhpdEluZm8gLSBUaGUgZW11bGF0b3IncyBleGl0IGRldGFpbHMuXG4gKiBAcGFyYW0gb3V0cHV0IC0gVGhlIGNhcHR1cmVkIHN0ZG91dCtzdGRlcnIgdGFpbC5cbiAqIEByZXR1cm5zIEEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRFbXVsYXRvckV4aXRNZXNzYWdlKGV4aXRJbmZvOiBFbXVsYXRvckV4aXRJbmZvLCBvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlYXNvbiA9IGV4aXRJbmZvLnNpZ25hbCA9PT0gbnVsbFxuICAgID8gYGV4aXRlZCBwcmVtYXR1cmVseSB3aXRoIGNvZGUgJHtTdHJpbmcoZXhpdEluZm8uY29kZSl9YFxuICAgIDogYHdhcyB0ZXJtaW5hdGVkIGJ5IHNpZ25hbCAke2V4aXRJbmZvLnNpZ25hbH1gO1xuICBjb25zdCB0cmltbWVkT3V0cHV0ID0gb3V0cHV0LnRyaW0oKTtcbiAgY29uc3QgZGV0YWlscyA9IHRyaW1tZWRPdXRwdXQubGVuZ3RoID4gMFxuICAgID8gYFxcblxcbkVtdWxhdG9yIG91dHB1dCAodGFpbCk6XFxuJHt0cmltbWVkT3V0cHV0fWBcbiAgICA6ICcnO1xuICByZXR1cm4gYEFuZHJvaWQgZW11bGF0b3IgJHtyZWFzb259IGR1cmluZyBzdGFydHVwLiR7ZGV0YWlsc31gO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHByb2FjdGl2ZSBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSBjaGVjayBmb3IgYW4gYXNhci1zd2FwIGFuZCBhY3RzXG4gKiBvbiB0aGUgdmVyZGljdDogdGhyb3dzIHtAbGluayBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3J9IGZvciBhblxuICogaW5zdGFsbGVyIGJlbG93IHRoZSBhcHAncyBydW4gZmxvb3IsIGFuZCBsb2dzIGEgd2FybmluZyBmb3IgYVxuICogcnVubmFibGUtYnV0LWJlbG93LXJlY29tbWVuZGVkIGluc3RhbGxlci5cbiAqXG4gKiBAcGFyYW0gYXBwVmVyc2lvbiAtIFRoZSBhcHAgKGFzYXIpIHZlcnNpb24gdGhhdCB3aWxsIGJlIHN3YXBwZWQgb250byB0aGUgc2hlbGwsXG4gKiAgIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gYXNhci1zd2FwIHdpbGwgaGFwcGVuIChub3RoaW5nIGlzIGNoZWNrZWQgdGhlbikuXG4gKiBAcGFyYW0gaW5zdGFsbGVyVmVyc2lvbiAtIFRoZSByZXNvbHZlZCBpbnN0YWxsZXIvc2hlbGwgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAuXG4gKiBAcmV0dXJucyBUaGUgdmVyZGljdCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBubyBhc2FyLXN3YXAgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQW5kUmVwb3J0Q29tcGF0aWJpbGl0eShcbiAgYXBwVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBpbnN0YWxsZXJWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQge1xuICBpZiAoYXBwVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGNvbXBhdGliaWxpdHkgPSBjaGVja0luc3RhbGxlckNvbXBhdGliaWxpdHkoe1xuICAgIGFwcFZlcnNpb24sXG4gICAgaW5zdGFsbGVyVmVyc2lvbixcbiAgICBtZXRhZGF0YTogZ2V0VmVyc2lvbk1ldGFkYXRhKGFwcFZlcnNpb24pXG4gIH0pO1xuXG4gIGlmIChjb21wYXRpYmlsaXR5LnRpZXIgPT09ICd1bnJ1bm5hYmxlJykge1xuICAgIHRocm93IG5ldyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3Ioe1xuICAgICAgYXBwVmVyc2lvbjogY29tcGF0aWJpbGl0eS5hcHBWZXJzaW9uLFxuICAgICAgaW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5pbnN0YWxsZXJWZXJzaW9uKSxcbiAgICAgIG1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5taW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb24pXG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29tcGF0aWJpbGl0eS50aWVyID09PSAnbmFnZ2VkJykge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lm1lc3NhZ2UpfWApO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBhdGliaWxpdHk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlc2t0b3AgQ0RQIHRyYW5zcG9ydC4gV2hlbiBhbiBleHBsaWNpdCBgcG9ydGAgaXMgZ2l2ZW4gdGhlXG4gKiB0cmFuc3BvcnQgYXR0YWNoZXMgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuIG9uIHRoYXQgcG9ydDsgb3RoZXJ3aXNlIGl0XG4gKiBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBpbnN0YW5jZSAodGhlIGRlZmF1bHQsIGhlcm1ldGljIG1vZGUpLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0RQIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgQSBjb25maWd1cmVkIENEUCB0cmFuc3BvcnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNkcFRyYW5zcG9ydChvcHRpb25zPzogT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBpZiAob3B0aW9ucz8ucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgb3duZWRTdWZmaXggPSBvcHRpb25zLmlzSGFybmVzc093bmVkSW5zdGFuY2UgPyAnIChoYXJuZXNzLW93bmVkKScgOiAnJztcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIEF0dGFjaGluZyB0byBydW5uaW5nIE9ic2lkaWFuJHtvd25lZFN1ZmZpeH0gKGhvc3Q9JHtvcHRpb25zLmhvc3QgPz8gJ2xvY2FsaG9zdCd9LCBwb3J0PSR7U3RyaW5nKG9wdGlvbnMucG9ydCl9KWApO1xuICAgIHJldHVybiBuZXcgRGVza3RvcENkcFRyYW5zcG9ydCh7XG4gICAgICAuLi4ob3B0aW9ucy5ob3N0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBIb3N0OiBvcHRpb25zLmhvc3QgfSksXG4gICAgICBjZHBQb3J0OiBvcHRpb25zLnBvcnQsXG4gICAgICAuLi4ob3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAuLi4ob3B0aW9ucy5pc0hhcm5lc3NPd25lZEluc3RhbmNlICE9PSB1bmRlZmluZWQgJiYgeyBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiBvcHRpb25zLmlzSGFybmVzc093bmVkSW5zdGFuY2UgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gQ3JlYXRpbmcgb3duZWQgaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UnKTtcbiAgY29uc3Qgb3duZWRJbnN0YW5jZSA9IGF3YWl0IHJlc29sdmVPd25lZEluc3RhbmNlQ29uZmlnKG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IERlc2t0b3BDZHBUcmFuc3BvcnQoe1xuICAgIC4uLihvcHRpb25zPy5ob3N0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBIb3N0OiBvcHRpb25zLmhvc3QgfSksXG4gICAgLi4uKG9wdGlvbnM/LmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSxcbiAgICBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM6IHJlc29sdmVEZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgLi4uKG9wdGlvbnM/LmlzT2JzaWRpYW5BcHBWaXNpYmxlICE9PSB1bmRlZmluZWQgJiYgeyBpc09ic2lkaWFuQXBwVmlzaWJsZTogb3B0aW9ucy5pc09ic2lkaWFuQXBwVmlzaWJsZSB9KSxcbiAgICBvd25lZEluc3RhbmNlLFxuICAgIC4uLihvcHRpb25zPy5zaG91bGREaXNhYmxlU2FuZGJveCAhPT0gdW5kZWZpbmVkICYmIHsgc2hvdWxkRGlzYWJsZVNhbmRib3g6IG9wdGlvbnMuc2hvdWxkRGlzYWJsZVNhbmRib3ggfSlcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZyZXNoLCBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGZvciBhbiBvd25lZCBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgbmV3IGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlT3duZWRVc2VyRGF0YURpcigpOiBzdHJpbmcge1xuICBjb25zdCByb290ID0gam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnKTtcbiAgbWtkaXJTeW5jKHJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICByZXR1cm4gbWtkdGVtcFN5bmMoam9pbihyb290LCBPV05FRF9VU0VSX0RBVEFfUFJFRklYKSk7XG59XG5cbi8qKlxuICogRGVjaWRlcyBob3cgdGhlIHJlcXVlc3RlZCBhcHAgKGFzYXIpIHZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIHRvIGFuIG93bmVkXG4gKiBpbnN0YW5jZSwgd2l0aG91dCBkb3dubG9hZGluZyBhbnl0aGluZyB5ZXQ6IGFuIHVwZ3JhZGUtb25seSBhc2FyLXN3YXAgb250byB0aGVcbiAqIHNoZWxsLCBhIGRvd25ncmFkZSB0byB0aGUgYXBwJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgb3IgdGhlIHVzZXIncyBuZXdlc3RcbiAqIGluc3RhbGxlZCBhc2FyIHdoZW4gbmVpdGhlciB2ZXJzaW9uIGlzIHBpbm5lZC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENEUCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEBwYXJhbSBzaGVsbFZlcnNpb24gLSBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyL3NoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgLlxuICogQHJldHVybnMgVGhlIGFzYXIgcGxhbiAoYXQgbW9zdCBvbmUgb2YgaXRzIGZpZWxkcyBpcyBzZXQpLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQXNhclBsYW4oXG4gIG9wdGlvbnM6IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgc2hlbGxWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8QXNhclBsYW4+IHtcbiAgaWYgKG9wdGlvbnM/Lm9ic2lkaWFuVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgYXNhclZlcnNpb24gPSBhd2FpdCByZXNvbHZlQ29uY3JldGVWZXJzaW9uKG9wdGlvbnMub2JzaWRpYW5WZXJzaW9uKTtcbiAgICBpZiAoc2hlbGxWZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgY29tcGFyZVZlcnNpb25zKGFzYXJWZXJzaW9uLCBzaGVsbFZlcnNpb24pID49IDApIHtcbiAgICAgIHJldHVybiB7IGFzYXJWZXJzaW9uVG9Td2FwOiBhc2FyVmVyc2lvbiB9O1xuICAgIH1cblxuICAgIC8vIEFzYXItc3dhcCBpcyB1cGdyYWRlLW9ubHksIHNvIGl0IGNhbm5vdCBhcHBseSBhIHZlcnNpb24gb2xkZXIgdGhhbiB0aGVcbiAgICAvLyBTaGVsbCdzIGJ1bmRsZWQgb25lIFx1MjAxNCBhbmQgd2hlbiB0aGUgc2hlbGwgdmVyc2lvbiBpcyB1bmtub3duIChhIExpbnV4XG4gICAgLy8gUGF0aC1wYXJzZSBtaXNzKSB3ZSBjYW5ub3QgcHJvdmUgdGhlIHN3YXAgd291bGQgYXBwbHkgYXQgYWxsLiBJbiBib3RoXG4gICAgLy8gQ2FzZXMgdXNlIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbidzIG93biBpbnN0YWxsZXIgc2hlbGwsIHdob3NlIGJ1bmRsZWQgYXNhclxuICAgIC8vIElzIGV4YWN0bHkgdGhpcyB2ZXJzaW9uLCBzbyB0aGUgcGluIGlzIGFsd2F5cyBob25vcmVkLlxuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gVXNpbmcgdGhlICR7YXNhclZlcnNpb259IGluc3RhbGxlciBzaGVsbCAoc2hlbGwgdmVyc2lvbiAke3NoZWxsVmVyc2lvbiA/PyAndW5rbm93bid9OyBhc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5KS5gKTtcbiAgICByZXR1cm4geyBkb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uOiBhc2FyVmVyc2lvbiB9O1xuICB9XG5cbiAgaWYgKG9wdGlvbnM/Lm9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbmV3ZXN0ID0gZmluZE5ld2VzdEFzYXIoZ2V0T2JzaWRpYW5Db25maWdEaXIoKSk7XG4gICAgaWYgKG5ld2VzdCAmJiAoc2hlbGxWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgY29tcGFyZVZlcnNpb25zKG5ld2VzdC52ZXJzaW9uLCBzaGVsbFZlcnNpb24pID49IDApKSB7XG4gICAgICByZXR1cm4geyBhc2FyOiB7IHBhdGg6IG5ld2VzdC5wYXRoLCB2ZXJzaW9uOiBuZXdlc3QudmVyc2lvbiB9IH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHt9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiBzaGVsbCwgdG9sZXJhdGluZyBpdHMgYWJzZW5jZS5cbiAqXG4gKiBVbmxpa2Uge0BsaW5rIHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGV9ICh3aGljaCB0aHJvd3Mgd2hlbiBPYnNpZGlhbiBpcyBub3RcbiAqIGluc3RhbGxlZCksIHRoaXMgcmV0dXJucyBgdW5kZWZpbmVkYCBpbiB0aGF0IGNhc2UsIHNvIGEgY2FsbGVyIHBpbm5pbmcgYW5cbiAqIGluc3RhbGxlciB2ZXJzaW9uIGNhbiBmYWxsIGJhY2sgdG8gZG93bmxvYWRpbmcgdGhlIHBpbm5lZCBzaGVsbCBpbnN0ZWFkIG9mXG4gKiBmYWlsaW5nIG9uIGEgaG9zdCB3aXRoIG5vIE9ic2lkaWFuIGluc3RhbGxlZCAoZS5nLiBDSSkuXG4gKlxuICogQHJldHVybnMgVGhlIGluc3RhbGxlZCBzaGVsbCdzIHBhdGggYW5kIGRldGVjdGVkIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW5cbiAqICAgbm8gT2JzaWRpYW4gaXMgaW5zdGFsbGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGwoKTogUHJvbWlzZTxJbnN0YWxsZWRTaGVsbCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gICAgcmV0dXJuIHsgZXhlUGF0aCwgc2hlbGxWZXJzaW9uOiBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24oZXhlUGF0aCkgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBzaGVsbCBleGVjdXRhYmxlLCBhc2FyIHByb3Zpc2lvbmluZywgYW5kIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJcbiAqIGZvciBhIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UgZnJvbSB0aGUgcmVxdWVzdGVkIHZlcnNpb24ga25vYnMuXG4gKlxuICogLSBgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uYCBwaW5zIHRoZSBFbGVjdHJvbiBzaGVsbCAoZG93bmxvYWRzICsgZXh0cmFjdHMgYVxuICogICBwb3J0YWJsZSBidWlsZCB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgaW5zdGFsbGVkIHNoZWxsKS5cbiAqIC0gYG9ic2lkaWFuVmVyc2lvbmAgcGlucyB0aGUgYXBwOiBhbiBhc2FyLXN3YXAgd2hlbiBpdCBpcyA+PSB0aGUgc2hlbGwgdmVyc2lvblxuICogICAoY2hlYXApLCBvdGhlcndpc2UgdGhlIG1hdGNoaW5nIGluc3RhbGxlciBzaGVsbCBpcyB1c2VkIChkb3duZ3JhZGUpLlxuICogLSBXaGVuIG5laXRoZXIgaXMgc2V0LCB0aGUgdXNlcidzIG5ld2VzdCBpbnN0YWxsZWQgYXNhciBpcyBjb3BpZWQgaW4gKHNvIHRoZVxuICogICBvd25lZCBpbnN0YW5jZSBtYXRjaGVzIHRoZSB2ZXJzaW9uIHRoZSB1c2VyIGN1cnJlbnRseSBydW5zKSB3aXRoIHplcm8gbmV0d29yay5cbiAqXG4gKiBUaGUgY29uY3JldGUgKGFwcCwgaW5zdGFsbGVyKSB2ZXJzaW9uIHBhaXIgaXMgcmVzb2x2ZWQgKmJlZm9yZSogYW55IHNoZWxsL2FzYXJcbiAqIGRvd25sb2FkLCBzbyBhIHByb2FjdGl2ZSBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSBjaGVja1xuICogKHtAbGluayBjaGVja0luc3RhbGxlckNvbXBhdGliaWxpdHl9KSBjYW4gZmFpbCBmYXN0OiBhbiBpbnN0YWxsZXIgYmVsb3cgdGhlXG4gKiBhcHAncyBydW4gZmxvb3IgdGhyb3dzIHtAbGluayBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3J9IGJlZm9yZVxuICogYW55dGhpbmcgaXMgZG93bmxvYWRlZCBvciBsYXVuY2hlZCAoc3VwZXJzZWRpbmcgdGhlIHJlYWN0aXZlIGRlYWQtYm9vdFxuICogZmFzdC1mYWlsIGZvciB0YWJsZS1rbm93biBjb21ib3MpLCBhbmQgYSBydW5uYWJsZS1idXQtYmVsb3ctcmVjb21tZW5kZWRcbiAqIGluc3RhbGxlciBsb2dzIGEgd2FybmluZy4gVGhlIHZlcmRpY3QgaXMgdGhyZWFkZWQgb250byB0aGUgcmV0dXJuZWQgY29uZmlnIHNvXG4gKiB0aGUgdHJhbnNwb3J0IGNhbiBzdXJmYWNlIGl0IGFzIGRhdGEuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgb3duZWQtaW5zdGFuY2UgY29uZmlnLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlT3duZWRJbnN0YW5jZUNvbmZpZyhvcHRpb25zPzogT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPd25lZEluc3RhbmNlQ29uZmlnPiB7XG4gIC8vIFJlc29sdmUgdGhlIGNvbmNyZXRlIHNoZWxsIChpbnN0YWxsZXIpIHZlcnNpb24gZmlyc3QsIGJ1dCBmb3IgYSBwaW5uZWRcbiAgLy8gSW5zdGFsbGVyIERFRkVSIHJlc29sdmluZy9kb3dubG9hZGluZyB0aGUgYWN0dWFsIHNoZWxsIHVudGlsIGFmdGVyIHRoZVxuICAvLyBQcm9hY3RpdmUgY29tcGF0aWJpbGl0eSBjaGVjaywgc28gYW4gdW5ydW5uYWJsZSBwaW4gZmFpbHMgZmFzdCBcdTIwMTQgYmVmb3JlIHRoZVxuICAvLyAocG9zc2libHkgc2xvdykgaW5zdGFsbGVkLXNoZWxsIGRldGVjdGlvbiBhbmQgYW55IGRvd25sb2FkLlxuICBsZXQgZXhlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgc2hlbGxWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKG9wdGlvbnM/Lm9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlUGF0aCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUoKTtcbiAgICBzaGVsbFZlcnNpb24gPSBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24oZXhlUGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQSBwaW5uZWQgaW5zdGFsbGVyIHZlcnNpb24gZnVsbHkgZGV0ZXJtaW5lcyB0aGUgc2hlbGwgdmVyc2lvbiB1cCBmcm9udCxcbiAgICAvLyBXaXRob3V0IHJlcXVpcmluZyBhIGxvY2FsbHktaW5zdGFsbGVkIE9ic2lkaWFuIChhIENJIHJ1bm5lciBoYXMgbm9uZSkuXG4gICAgcGlubmVkSW5zdGFsbGVyVmVyc2lvbiA9IGF3YWl0IHJlc29sdmVDb25jcmV0ZVZlcnNpb24ob3B0aW9ucy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24pO1xuICAgIHNoZWxsVmVyc2lvbiA9IHBpbm5lZEluc3RhbGxlclZlcnNpb247XG4gIH1cblxuICAvLyBEZWNpZGUgaG93IHRoZSBhcHAgKGFzYXIpIHZlcnNpb24gd2lsbCBiZSBhcHBsaWVkLCBzdGlsbCBXSVRIT1VUIGRvd25sb2FkaW5nLlxuICBjb25zdCBwbGFuID0gYXdhaXQgcmVzb2x2ZUFzYXJQbGFuKG9wdGlvbnMsIHNoZWxsVmVyc2lvbik7XG5cbiAgLy8gVGhlIGFwcCB2ZXJzaW9uIHRoYXQgd2lsbCBydW4gYXMgYW4gYXNhci1zd2FwIG9udG8gYHNoZWxsVmVyc2lvbmAgXHUyMDE0IHRoZSBvbmx5XG4gIC8vIENvbWJpbmF0aW9uIHRoYXQgY2FuIGRlYWQtYm9vdC4gVGhlIGRvd25ncmFkZSAvIG93bi1pbnN0YWxsZXIgcGF0aHMgcnVuIHRoZVxuICAvLyBBcHAncyBvd24gaW5zdGFsbGVyIHNoZWxsLCBzbyB0aGV5IGFsd2F5cyBib290IGFuZCBhcmUgbm90IGNoZWNrZWQuXG4gIGNvbnN0IHN3YXBBcHBWZXJzaW9uID0gcGxhbi5hc2FyVmVyc2lvblRvU3dhcCA/PyBwbGFuLmFzYXI/LnZlcnNpb247XG4gIGNvbnN0IGNvbXBhdGliaWxpdHkgPSBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHkoc3dhcEFwcFZlcnNpb24sIHNoZWxsVmVyc2lvbik7XG5cbiAgLy8gVGhlIHBpbiBpcyBrbm93biBydW5uYWJsZSBcdTIwMTQgcmVzb2x2ZS9kb3dubG9hZCB0aGUgZGVmZXJyZWQgc2hlbGwgKyBhc2FyIG5vdy5cbiAgLy8gUmV1c2UgdGhlIGluc3RhbGxlZCBzaGVsbCBvbmx5IHdoZW4gaXQgYWxyZWFkeSBtYXRjaGVzIHRoZSBwaW4gKHNhdmVzIHRoZVxuICAvLyBEb3dubG9hZCk7IG90aGVyd2lzZSBkb3dubG9hZCBhbmQgZXh0cmFjdCB0aGUgcGlubmVkIGluc3RhbGxlci5cbiAgaWYgKHBpbm5lZEluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IHJlc29sdmVJbnN0YWxsZWRTaGVsbE9yTnVsbCgpO1xuICAgIGV4ZVBhdGggPSBpbnN0YWxsZWQ/LnNoZWxsVmVyc2lvbiA9PT0gcGlubmVkSW5zdGFsbGVyVmVyc2lvbiA/IGluc3RhbGxlZC5leGVQYXRoIDogYXdhaXQgZW5zdXJlU2hlbGxDYWNoZWQocGlubmVkSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cbiAgaWYgKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlUGF0aCA9IGF3YWl0IGVuc3VyZVNoZWxsQ2FjaGVkKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cblxuICBjb25zdCBhc2FyID0gcGxhbi5hc2FyVmVyc2lvblRvU3dhcCA9PT0gdW5kZWZpbmVkXG4gICAgPyBwbGFuLmFzYXJcbiAgICA6IHsgcGF0aDogYXdhaXQgZW5zdXJlQXNhckNhY2hlZChwbGFuLmFzYXJWZXJzaW9uVG9Td2FwKSwgdmVyc2lvbjogcGxhbi5hc2FyVmVyc2lvblRvU3dhcCB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uKGFzYXIgJiYgeyBhc2FyIH0pLFxuICAgIC4uLihjb21wYXRpYmlsaXR5ICYmIHsgY29tcGF0aWJpbGl0eSB9KSxcbiAgICBleGVQYXRoOiBlbnN1cmVOb25OdWxsYWJsZShleGVQYXRoKSxcbiAgICB1c2VyRGF0YURpcjogY3JlYXRlT3duZWRVc2VyRGF0YURpcigpXG4gIH07XG59XG5cbi8qKlxuICogUmVtb3ZlcyBgQ29ubmVjdGlvbmAgYW5kIGBDb250ZW50LUxlbmd0aGAgZnJvbSBhIFdlYkRyaXZlciByZXF1ZXN0J3MgaGVhZGVycy5cbiAqXG4gKiBUaGUgYnVuZGxlZCBgd2ViZHJpdmVyYCBwYWNrYWdlIHNldHMgYm90aCBoZWFkZXJzIGV4cGxpY2l0bHkuIFRoZXkgYXJlXG4gKiBmb3JiaWRkZW4gcmVxdWVzdCBoZWFkZXJzIHBlciB0aGUgRmV0Y2ggc3BlYzogTm9kZSB1cCB0byAyNSBhY2NlcHRlZCB0aGVtXG4gKiBzaWxlbnRseSwgYnV0IE5vZGUgMjYgcmVqZWN0cyB0aGVtIHdpdGggYFVORF9FUlJfSU5WQUxJRF9BUkdgLCBicmVha2luZyB0aGVcbiAqIEFwcGl1bSBgL3Nlc3Npb25gIHJlcXVlc3QuIFRoZSB0cmFuc3BvcnQgbGF5ZXIgbWFuYWdlcyBjb25uZWN0aW9uIHJldXNlIGFuZFxuICogdGhlIEZldGNoIEFQSSBjb21wdXRlcyBgQ29udGVudC1MZW5ndGhgIGZyb20gdGhlIGJvZHksIHNvIGRyb3BwaW5nIGJvdGggaXNcbiAqIHNhZmUgb24gZXZlcnkgTm9kZSB2ZXJzaW9uLiBTZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJkcml2ZXJpby93ZWJkcml2ZXJpby9pc3N1ZXMvMTUyNjV9LlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0T3B0aW9ucyAtIFRoZSByZXF1ZXN0IG9wdGlvbnMgYWJvdXQgdG8gYmUgc2VudCBieSBXZWJEcml2ZXJJTy5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIHJlcXVlc3Qgb3B0aW9ucyB3aXRoIHRoZSBmb3JiaWRkZW4gaGVhZGVycyByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVycyhyZXF1ZXN0T3B0aW9uczogUmVxdWVzdEluaXQpOiBSZXF1ZXN0SW5pdCB7XG4gIGlmIChyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb25uZWN0aW9uJyk7XG4gICAgcmVxdWVzdE9wdGlvbnMuaGVhZGVycy5kZWxldGUoJ0NvbnRlbnQtTGVuZ3RoJyk7XG4gIH1cblxuICByZXR1cm4gcmVxdWVzdE9wdGlvbnM7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUEsZ0NBR087QUFDUCxxQkFHTztBQUNQLHVCQUFpQjtBQUNqQixxQkFBdUI7QUFDdkIsdUJBQXFCO0FBQ3JCLDBCQUFvQjtBQUNwQix5QkFHTztBQVdQLGlDQUlPO0FBQ1AsbUNBR087QUFDUCw4QkFHTztBQUNQLDJCQUFrQztBQUNsQyxrQkFBcUI7QUFDckIsa0RBQWtEO0FBQ2xELHFDQUE0QztBQUM1QywrQkFBZ0M7QUFDaEMsaUJBQW9CO0FBQ3BCLDZCQUFxQztBQUNyQyxpQ0FBMEM7QUFDMUMsZ0NBR087QUFDUCwrQkFBbUM7QUFDbkMscUNBSU87QUFDUCw4QkFBZ0M7QUFDaEMscUNBQW1EO0FBQ25ELDJCQUdPO0FBQ1AsOEJBQWdDO0FBQ2hDLG1DQUFvQztBQUNwQyx5QkFBa0M7QUFDbEMsd0JBR087QUFFUCxNQUFNLGNBQWM7QUFDcEIsTUFBTSxlQUFlLEdBQUcs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
|
|
825
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgdHlwZSB7XG4gIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcsXG4gIE93bmVkSW5zdGFuY2VDb25maWdcbn0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAuY2pzJztcbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5janMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LmNqcyc7XG5cbmltcG9ydCB7XG4gIGNoZWNrSXNBcHBpdW1Ecml2ZXJJbnN0YWxsZWQsXG4gIHJlc29sdmVTaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcyxcbiAgVUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FXG59IGZyb20gJy4vYXBwaXVtLWRlcGVuZGVuY2llcy5janMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICByZXNvbHZlU2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xufSBmcm9tICcuL2FwcGl1bS1zZXNzaW9uLWNvbmZpZy5janMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlBY3Rpb24sXG4gIHJlc29sdmVTaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLFxuICByZXNvbHZlU2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayxcbiAgcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXNcbn0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMuY2pzJztcbmltcG9ydCB7XG4gIGNoZWNrRGV2aWNlSWRsZSxcbiAgcmVzb2x2ZURldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbn0gZnJvbSAnLi9kZXZpY2UtcmVhZGluZXNzLmNqcyc7XG5pbXBvcnQgeyBidWlsZEVtdWxhdG9yQXJncyB9IGZyb20gJy4vZW11bGF0b3ItYXJncy5janMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5janMnO1xuaW1wb3J0IHsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IuY2pzJztcbmltcG9ydCB7IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmltcG9ydCB7IGtpbGxQcm9jZXNzVHJlZSB9IGZyb20gJy4va2lsbC1wcm9jZXNzLXRyZWUuY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuL25vcm1hbGl6ZS1vcHRpb25hbC1wcm9wZXJ0aWVzLmNqcyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkNvbmZpZ0RpciB9IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLmNqcyc7XG5pbXBvcnQge1xuICBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24sXG4gIGVuc3VyZVNoZWxsQ2FjaGVkXG59IGZyb20gJy4vb2JzaWRpYW4taW5zdGFsbGVyLmNqcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLmNqcyc7XG5pbXBvcnQge1xuICBlbnN1cmVBc2FyQ2FjaGVkLFxuICBmaW5kTmV3ZXN0QXNhcixcbiAgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvblxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLmNqcyc7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24uY2pzJztcbmltcG9ydCB7IHJlc29sdmVEZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgfSBmcm9tICcuL3JlbmRlcmVyLWJvb3QtZGV0ZWN0aW9uLmNqcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3Bhd25GbGFncyxcbiAgcmVzb2x2ZUVtdWxhdG9yU3Bhd25GbGFnc1xufSBmcm9tICcuL3NwYXduLW9wdGlvbnMuY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMuY2pzJztcbmltcG9ydCB7XG4gIHNob3VsZEhpZGVBcHBpdW1Db25zb2xlLFxuICBzaG91bGRIaWRlRW11bGF0b3JXaW5kb3dcbn0gZnJvbSAnLi92aXNpYmlsaXR5LmNqcyc7XG5cbmNvbnN0IEFQUF9QQUNLQUdFID0gJ21kLm9ic2lkaWFuJztcbmNvbnN0IEFQUF9BQ1RJVklUWSA9IGAke0FQUF9QQUNLQUdFfS5NYWluQWN0aXZpdHlgO1xuY29uc3QgQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCA9IDM7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE9XTkVEX1VTRVJfREFUQV9QUkVGSVggPSAndXNlcmRhdGEtJztcbi8vIEFwcGl1bSBpbnNlY3VyZSBmZWF0dXJlIGxldHRpbmcgdGhlIFVpQXV0b21hdG9yMiBkcml2ZXIgYXV0by1kb3dubG9hZCBhXG4vLyBDaHJvbWVkcml2ZXIgbWF0Y2hpbmcgT2JzaWRpYW4ncyBXZWJWaWV3IENocm9tZSB2ZXJzaW9uLiBFbmFibGluZyBpdCBvbiB0aGVcbi8vIEFwcGl1bSBzZXJ2ZXIgKGl0IGhhcyBubyBlZmZlY3QgYXMgYSBjYXBhYmlsaXR5KSBhdm9pZHMgdGhlIGZhaWx1cmVcbi8vIFwiTm8gQ2hyb21lZHJpdmVyIGZvdW5kIHRoYXQgY2FuIGF1dG9tYXRlIENocm9tZSAuLi5cIi5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICd1aWF1dG9tYXRvcjI6Y2hyb21lZHJpdmVyX2F1dG9kb3dubG9hZCc7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgREVGQVVMVF9UUkFOU1BPUlRfVFlQRSA9ICdvYnNpZGlhbi1jZHAnO1xuY29uc3QgREVWSUNFX0lETEVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBLRVlDT0RFX01FTlUgPSA4MjtcbmNvbnN0IEtFWUNPREVfV0FLRVVQID0gMjI0O1xuY29uc3QgU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuXG4vKipcbiAqIEhvdyB0aGUgcmVxdWVzdGVkIGFwcCAoYXNhcikgdmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgdG8gYW4gb3duZWQgaW5zdGFuY2U7IGF0XG4gKiBtb3N0IG9uZSBmaWVsZCBpcyBzZXQgKHNlZSB7QGxpbmsgcmVzb2x2ZUFzYXJQbGFufSkuXG4gKi9cbmludGVyZmFjZSBBc2FyUGxhbiB7XG4gIC8qKiBUaGUgdXNlcidzIG5ld2VzdCBpbnN0YWxsZWQgYXNhciB0byBwcm92aXNpb24gYXMtaXMgKG5vIGRvd25sb2FkKS4gKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VDb25maWdbJ2FzYXInXTtcblxuICAvKiogVGhlIGFwcCB2ZXJzaW9uIHRvIGRvd25sb2FkIGFuZCBhc2FyLXN3YXAgb250byB0aGUgc2hlbGwuICovXG4gIHJlYWRvbmx5IGFzYXJWZXJzaW9uVG9Td2FwPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgYXBwIHZlcnNpb24gd2hvc2Ugb3duIGluc3RhbGxlciBzaGVsbCB0byBkb3dubG9hZCAoYSBkb3duZ3JhZGUpLiAqL1xuICByZWFkb25seSBkb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERldGFpbHMgb2YgYW4gZW11bGF0b3IgcHJvY2VzcyB0aGF0IGhhcyBleGl0ZWQuXG4gKi9cbmludGVyZmFjZSBFbXVsYXRvckV4aXRJbmZvIHtcbiAgLyoqIEV4aXQgY29kZSwgb3IgYG51bGxgIGlmIHRoZSBwcm9jZXNzIHdhcyB0ZXJtaW5hdGVkIGJ5IGEgc2lnbmFsLiAqL1xuICBjb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKiBUZXJtaW5hdGluZyBzaWduYWwsIG9yIGBudWxsYCBpZiB0aGUgcHJvY2VzcyBleGl0ZWQgbm9ybWFsbHkuICovXG4gIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xufVxuXG4vKipcbiAqIEEgc3Bhd25lZCBlbXVsYXRvciBwcm9jZXNzIHRvZ2V0aGVyIHdpdGggaGVscGVycyB0byBpbnNwZWN0IGl0cyBjYXB0dXJlZFxuICogb3V0cHV0IGFuZCBleGl0IHN0YXR1cy5cbiAqL1xuaW50ZXJmYWNlIEVtdWxhdG9yTGF1bmNoIHtcbiAgLyoqIFRoZSBzcGF3bmVkIGVtdWxhdG9yIHByb2Nlc3MuICovXG4gIHByb2Nlc3M6IENoaWxkUHJvY2VzcztcblxuICAvKiogUmV0dXJucyB0aGUgZXhpdCBkZXRhaWxzIG9uY2UgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLiAqL1xuICByZWFkRXhpdEluZm86ICgpID0+IEVtdWxhdG9yRXhpdEluZm8gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFJldHVybnMgdGhlIGNhcHR1cmVkIHN0ZG91dCtzdGRlcnIgKGJvdW5kZWQgdG8gdGhlIG1vc3QgcmVjZW50IG91dHB1dCkuICovXG4gIHJlYWRPdXRwdXQ6ICgpID0+IHN0cmluZztcblxuICAvKiogU3RvcHMgYWNjdW11bGF0aW5nIG91dHB1dC4gQ2FsbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC4gKi9cbiAgc3RvcENhcHR1cmU6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBjb25uZWN0IHRvIChzdGFydGluZyBhIG5ldyBlbXVsYXRvciBpZiBub3QgYWxyZWFkeSBydW5uaW5nKS4gKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHBvc3QtYm9vdCBkZXZpY2UtaWRsZSB3YWl0IChgMGAgc2tpcHMgaXQpLiAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGxvY2FsbHktaW5zdGFsbGVkIE9ic2lkaWFuIHNoZWxsIHJlc29sdmVkIGJ5IHtAbGluayByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGx9LlxuICovXG5pbnRlcmZhY2UgSW5zdGFsbGVkU2hlbGwge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgaW5zdGFsbGVkIHNoZWxsIGV4ZWN1dGFibGUuICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKiogVGhlIGRldGVjdGVkIHNoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGRldGVybWluZWQuICovXG4gIHJlYWRvbmx5IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN0YXJ0QXBwaXVtQW5kRW11bGF0b3J9LlxuICovXG5pbnRlcmZhY2UgU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyB7XG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIHRvIGJlY29tZSByZWFkeS4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLiAqL1xuICByZWFkb25seSBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKiogQVZEIG5hbWUgdG8gc3RhcnQuICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBwb3N0LWJvb3QgZGV2aWNlLWlkbGUgd2FpdCAoYDBgIHNraXBzIGl0KS4gKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBjb25zb2xlIHdpbmRvdyBpcyBzaG93biAob21pdHRlZCBcdTIxOTIgaGlkZGVuKS4gKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgcG9ydC4gKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIG1pc3NpbmcgQXBwaXVtIGRlcGVuZGVuY2llcyBtYXkgYmUgYXV0by1pbnN0YWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgaXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llczogYm9vbGVhbjtcblxuICAvKiogV2hldGhlciBBcHBpdW0gYXV0by1zdGFydCBpcyBhbGxvd2VkLiAqL1xuICByZWFkb25seSBzaG91bGRBdXRvU3RhcnRBcHBpdW0/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5zdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JSZXN1bHQge1xuICAvKiogVGhlIGFjdHVhbCBkZXZpY2UgSUQgdGhhdCBpcyBjb25uZWN0ZWQgKG1heSBkaWZmZXIgZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSkuICovXG4gIHJlYWRvbmx5IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBhcHBpdW1Qcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgZW11bGF0b3IgcHJvY2VzcywgaWYgb25lIHdhcyBhdXRvLXN0YXJ0ZWQuICovXG4gIHJlYWRvbmx5IGVtdWxhdG9yUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNoZWNrQW5kUmVwb3J0Q29tcGF0aWJpbGl0eX0uXG4gKi9cbmludGVyZmFjZSBDaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHlQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcCAoYXNhcikgdmVyc2lvbiB0aGF0IHdpbGwgYmUgc3dhcHBlZCBvbnRvIHRoZSBzaGVsbCwgb3IgYHVuZGVmaW5lZGBcbiAgICogd2hlbiBubyBhc2FyLXN3YXAgd2lsbCBoYXBwZW4gKG5vdGhpbmcgaXMgY2hlY2tlZCB0aGVuKS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIHJlc29sdmVkIGluc3RhbGxlci9zaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC4gKi9cbiAgcmVhZG9ubHkgaW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuIGAndW5ydW5uYWJsZSdgIHZlcmRpY3QgdGhyb3dzIHtAbGluayBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3J9XG4gICAqIChgdHJ1ZWApIG9yIHByb2NlZWRzIHRvIGxhdW5jaCB3aXRoIHRoZSB2ZXJkaWN0IHN1cmZhY2VkIGFzIGRhdGEgKGBmYWxzZWApLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogYm9vbGVhbjtcblxuICAvKiogV2hldGhlciBhIGAnbmFnZ2VkJ2AgKG9yIHByb2NlZWRpbmctYCd1bnJ1bm5hYmxlJ2ApIHZlcmRpY3QgaXMgbG9nZ2VkLiAqL1xuICByZWFkb25seSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVuY2Fwc3VsYXRlcyBhbGwgQXBwaXVtIHRyYW5zcG9ydCBjcmVhdGlvbiBsb2dpYywgaW5jbHVkaW5nIEFwcGl1bSBzZXJ2ZXJcbiAqIHN0YXJ0dXAsIGVtdWxhdG9yIG1hbmFnZW1lbnQsIGFuZCBXZWJEcml2ZXJJTyBzZXNzaW9uIGVzdGFibGlzaG1lbnQuXG4gKlxuICogVXNpbmcgYSBjbGFzcyBhdm9pZHMgdGhyZWFkaW5nIHRoZSB0cmFuc3BvcnQgYHR5cGVgIGxhYmVsIHRocm91Z2ggZXZlcnlcbiAqIGhlbHBlciBmdW5jdGlvbiBcdTIwMTQgYHRoaXMubG9nKClgIGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgaXQuXG4gKi9cbmNsYXNzIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkge1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFwcGl1bSB0cmFuc3BvcnQgYnkgZXN0YWJsaXNoaW5nIGEgV2ViRHJpdmVySU8gc2Vzc2lvbi5cbiAgICpcbiAgICogSWYgYG9wdGlvbnMuc2Vzc2lvbklkYCBpcyBwcmVzZW50LCByZWF0dGFjaGVzIHRvIHRoZSBleGlzdGluZyBzZXNzaW9uXG4gICAqIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLiBUaGlzIGF2b2lkcyBkdXBsaWNhdGUgQXBwaXVtL0FEQiBjb25uZWN0aW9uc1xuICAgKiB3aGVuIHRlc3Qgd29ya2VycyByZXVzZSB0aGUgZ2xvYmFsIHNldHVwJ3Mgc2Vzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAgICogQHJldHVybnMgQSBjb25maWd1cmVkIEFwcGl1bSB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgaWYgKG9wdGlvbnMuc2Vzc2lvbklkICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5kZXZpY2VJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRhY2hUb0V4aXN0aW5nU2Vzc2lvbihvcHRpb25zLnNlc3Npb25JZCwgb3B0aW9ucy5kZXZpY2VJZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV3U2Vzc2lvbihvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXR0YWNoVG9FeGlzdGluZ1Nlc3Npb24oXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgZGV2aWNlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4gICk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgICB0aGlzLmxvZyhgUmVhdHRhY2hpbmcgdG8gZXhpc3RpbmcgQXBwaXVtIHNlc3Npb24gJHtzZXNzaW9uSWR9IChkZXZpY2U9JHtkZXZpY2VJZH0pYCk7XG5cbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgYXR0YWNoKHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdBbmRyb2lkJ1xuICAgICAgfSxcbiAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICBsb2dMZXZlbDogJ3dhcm4nLFxuICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgcG9ydCxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IHN0cmlwRm9yYmlkZGVuRmV0Y2hIZWFkZXJzXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZygnUmVhdHRhY2hlZCB0byBBcHBpdW0gc2Vzc2lvbi4nKTtcblxuICAgIHJldHVybiBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgIGFwcElkLFxuICAgICAgYnJvd3NlcixcbiAgICAgIGRldmljZUlkLFxuICAgICAgaXNTZXNzaW9uT3duZXI6IGZhbHNlLFxuICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgIC4uLihvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSxcbiAgICAgIC4uLihvcHRpb25zLnZhdWx0QmFzZVBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCB9KSxcbiAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXNVcmwgPSBuZXcgVVJMKCcvc3RhdHVzJywgdXJsKTtcbiAgICAgIGNvbnN0IHJlcSA9IGh0dHAuZ2V0KHN0YXR1c1VybCwgeyB0aW1lb3V0OiBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChyZXMpID0+IHtcbiAgICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn0gZGlkIG5vdCByZXNwb25kIHdpdGhpbiAke1N0cmluZyhBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXEub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCByZWFjaCBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn06ICR7ZXJyLm1lc3NhZ2V9LiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTmV3U2Vzc2lvbihvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIHRoaXMubG9nKGBDcmVhdGluZyBBcHBpdW1UcmFuc3BvcnQgKHVybD0ke29wdGlvbnMuYXBwaXVtVXJsfSwgYXZkPSR7b3B0aW9ucy5hdmROYW1lfSlgKTtcblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5hcHBpdW1VcmwpO1xuXG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgaWYgKGlzTmFOKHBvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcG9ydCBpbiBhcHBpdW1Vcmw6ICR7dXJsLnBvcnR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gICAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZW11bGF0b3JQcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdGFydEFwcGl1bUFuZEVtdWxhdG9yKHtcbiAgICAgICAgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVBcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyhvcHRpb25zKSxcbiAgICAgICAgYXBwaXVtVXJsOiB1cmwsXG4gICAgICAgIGF2ZE5hbWU6IG9wdGlvbnMuYXZkTmFtZSxcbiAgICAgICAgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogcmVzb2x2ZURldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgIGlzQXBwaXVtQ29uc29sZVZpc2libGU6IG9wdGlvbnMuaXNBcHBpdW1Db25zb2xlVmlzaWJsZSxcbiAgICAgICAgaXNFbXVsYXRvclZpc2libGU6IG9wdGlvbnMuaXNFbXVsYXRvclZpc2libGUsXG4gICAgICAgIHBvcnQsXG4gICAgICAgIHNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzOiByZXNvbHZlU2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXMob3B0aW9ucyksXG4gICAgICAgIHNob3VsZEF1dG9TdGFydEFwcGl1bTogb3B0aW9ucy5zaG91bGRBdXRvU3RhcnRBcHBpdW1cbiAgICAgIH0pO1xuXG4gICAgICBhcHBpdW1Qcm9jZXNzID0gcmVzdWx0LmFwcGl1bVByb2Nlc3M7XG4gICAgICBlbXVsYXRvclByb2Nlc3MgPSByZXN1bHQuZW11bGF0b3JQcm9jZXNzO1xuICAgICAgY29uc3QgYWN0dWFsRGV2aWNlSWQgPSByZXN1bHQuYWN0dWFsRGV2aWNlSWQ7XG5cbiAgICAgIGNvbnN0IHNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0ID0gcmVzb2x2ZVNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyk7XG4gICAgICB0aGlzLmxvZyhcbiAgICAgICAgYENvbm5lY3RpbmcgdG8gQXBwaXVtIChkZXZpY2U9JHthY3R1YWxEZXZpY2VJZH0sIGFwcD0ke2FwcElkfSwgcmV0cnlUaW1lb3V0OiAke1N0cmluZyhzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCl9bXMsIHJldHJpZXM6ICR7U3RyaW5nKEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UKX0pLi4uYFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCByZW1vdGUoe1xuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAnYXBwaXVtOmFwcEFjdGl2aXR5JzogQVBQX0FDVElWSVRZLFxuICAgICAgICAgICdhcHBpdW06YXBwUGFja2FnZSc6IGFwcElkLFxuICAgICAgICAgICdhcHBpdW06YXV0b0dyYW50UGVybWlzc2lvbnMnOiB0cnVlLFxuICAgICAgICAgICdhcHBpdW06YXV0b21hdGlvbk5hbWUnOiAnVWlBdXRvbWF0b3IyJyxcbiAgICAgICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAnYXBwaXVtOm5vUmVzZXQnOiB0cnVlLFxuICAgICAgICAgICdhcHBpdW06dWRpZCc6IGFjdHVhbERldmljZUlkLFxuICAgICAgICAgICdhcHBpdW06dWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQnOiBTRVJWRVJfSU5TVEFMTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQnOiBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnQW5kcm9pZCdcbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5ULFxuICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiBzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCxcbiAgICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgICBwb3J0LFxuICAgICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVyc1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2Vzc2lvbiBlc3RhYmxpc2hlZC4nKTtcbiAgICAgIGNvbnN0IGFwcGl1bVRyYW5zcG9ydCA9IG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgICAgICBhcHBJZCxcbiAgICAgICAgYnJvd3NlcixcbiAgICAgICAgZGV2aWNlSWQ6IGFjdHVhbERldmljZUlkLFxuICAgICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgICAuLi4ob3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAgIC4uLihvcHRpb25zLnZhdWx0QmFzZVBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCB9KSxcbiAgICAgICAgLi4uKG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3JpZ2luYWxEaXNwb3NlID0gYXBwaXVtVHJhbnNwb3J0LmRpc3Bvc2UuYmluZChhcHBpdW1UcmFuc3BvcnQpO1xuICAgICAgY29uc3QgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCA9IGFwcGl1bVRyYW5zcG9ydDtcbiAgICAgIHRyYW5zcG9ydC5kaXNwb3NlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsRGlzcG9zZSgpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZVN5bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRyYW5zcG9ydDtcblxuICAgICAgZnVuY3Rpb24ga2lsbEF1dG9TdGFydGVkUHJvY2Vzc2VzKCk6IHZvaWQge1xuICAgICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICAgIGtpbGxQcm9jZXNzVHJlZShhcHBpdW1Qcm9jZXNzKTtcbiAgICAgICAgICAvLyBDYW5ub3QgdXNlIHRoaXMubG9nIGluc2lkZSBuZXN0ZWQgZnVuY3Rpb24gXHUyMDE0IGB0aGlzYCBpcyBub3QgY2FwdHVyZWQuXG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBzdG9wcGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbXVsYXRvclByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke29wdGlvbnMudHlwZX1dIEF1dG8tc3RhcnRlZCBlbXVsYXRvciBzdG9wcGVkLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICAgIGtpbGxQcm9jZXNzVHJlZShhcHBpdW1Qcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgICB9XG4gICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgIGtpbGxQcm9jZXNzVHJlZShlbXVsYXRvclByb2Nlc3MpO1xuICAgICAgICB0aGlzLmxvZygnS2lsbGVkIGF1dG8tc3RhcnRlZCBlbXVsYXRvciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgQXBwaXVtIHRvb2xjaGFpbiBpcyBwcmVzZW50IGJlZm9yZSB0aGUgc2VydmVyIGlzIGF1dG8tc3RhcnRlZDpcbiAgICogQXBwaXVtIGl0c2VsZiwgdGhlbiB0aGUgYHVpYXV0b21hdG9yMmAgZHJpdmVyLiBFYWNoIGlzIGNoZWNrZWQgZmlyc3QgYW5kXG4gICAqIGluc3RhbGxlZCBvbmx5IHdoZW4gbWlzc2luZywgc28gYSBmdWxseS1wcm92aXNpb25lZCBtYWNoaW5lIGluY3VycyBqdXN0IHR3b1xuICAgKiBmYXN0IHZlcnNpb24vbGlzdCBwcm9iZXMuXG4gICAqXG4gICAqIE9ubHkgaW52b2tlZCB3aGVuIHRoZSBoYXJuZXNzIGlzIGFib3V0IHRvIGF1dG8tc3RhcnQgdGhlIHNlcnZlciBhbmRcbiAgICoge0BsaW5rIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMuc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXN9XG4gICAqIGlzIGVuYWJsZWQuIENvbW1hbmRzIGFyZSBwYXNzZWQgYXMgc3RyaW5ncyBzbyBgZXhlY2AgcnVucyB0aGVtIHRocm91Z2ggdGhlXG4gICAqIHNoZWxsLCB3aGljaCByZXNvbHZlcyB0aGUgYG5wbWAvYG5weGAgYC5jbWRgIHNoaW1zIG9uIFdpbmRvd3MgKHRoZSBhcnJheVxuICAgKiBwYXRoIHNwYXducyB3aXRob3V0IGEgc2hlbGwgYW5kIGNhbm5vdCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUFwcGl1bURlcGVuZGVuY2llcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUFwcGl1bUluc3RhbGxlZCgpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlVWlhdXRvbWF0b3IyRHJpdmVySW5zdGFsbGVkKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZUFwcGl1bUluc3RhbGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZygnQ2hlY2tpbmcgd2hldGhlciBBcHBpdW0gaXMgaW5zdGFsbGVkLi4uJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYygnbnB4IC0tbm8taW5zdGFsbCBhcHBpdW0gLS12ZXJzaW9uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLFxuICAgICAgc2hvdWxkSW5jbHVkZURldGFpbHM6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQuZXhpdENvZGUgPT09IDApIHtcbiAgICAgIHRoaXMubG9nKGBBcHBpdW0gaXMgaW5zdGFsbGVkICh2ZXJzaW9uICR7cmVzdWx0LnN0ZG91dC50cmltKCkgfHwgJ3Vua25vd24nfSkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2coJ0FwcGl1bSBpcyBub3QgaW5zdGFsbGVkLiBJbnN0YWxsaW5nIGdsb2JhbGx5IHZpYSBgbnBtIGluc3RhbGwgLWcgYXBwaXVtYC4uLicpO1xuICAgIGF3YWl0IGV4ZWMoJ25wbSBpbnN0YWxsIC1nIGFwcGl1bScpO1xuICAgIHRoaXMubG9nKCdBcHBpdW0gaW5zdGFsbGVkLicpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXZpY2VDb25uZWN0ZWQocGFyYW1zOiBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMpOiBQcm9taXNlPEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNFbXVsYXRvclZpc2libGUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBkZXZpY2VJZHNCZWZvcmUgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZUlkcygpO1xuICAgIHRoaXMubG9nKGBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCIke2F2ZE5hbWV9XCIuLi4gKGNvbm5lY3RlZDogWyR7ZGV2aWNlSWRzQmVmb3JlLmpvaW4oJywgJyl9XSlgKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlSWQgPSBhd2FpdCB0aGlzLmZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZSwgZGV2aWNlSWRzQmVmb3JlKTtcblxuICAgIGlmIChleGlzdGluZ0RldmljZUlkKSB7XG4gICAgICB0aGlzLmxvZyhgQVZEIFwiJHthdmROYW1lfVwiIGlzIGFscmVhZHkgcnVubmluZyBvbiBkZXZpY2UgJHtleGlzdGluZ0RldmljZUlkfSwgcmV1c2luZy5gKTtcbiAgICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoZXhpc3RpbmdEZXZpY2VJZCk7XG4gICAgICByZXR1cm4geyBhY3R1YWxEZXZpY2VJZDogZXhpc3RpbmdEZXZpY2VJZCB9O1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBBVkQgXCIke2F2ZE5hbWV9XCIgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2UsIHN0YXJ0aW5nIGEgbmV3IGVtdWxhdG9yLi4uYCk7XG4gICAgY29uc3QgZW11bGF0b3IgPSB0aGlzLnN0YXJ0RW11bGF0b3IoYXZkTmFtZSwgaXNFbXVsYXRvclZpc2libGUpO1xuXG4gICAgbGV0IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGFjdHVhbERldmljZUlkID0gYXdhaXQgdGhpcy53YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZSwgZW11bGF0b3IsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbXVsYXRvci5zdG9wQ2FwdHVyZSgpO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBFbXVsYXRvciBcIiR7YXZkTmFtZX1cIiBzdGFydGVkLCBkZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gaXMgY29ubmVjdGVkLmApO1xuICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoYWN0dWFsRGV2aWNlSWQpO1xuICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkLCBlbXVsYXRvclByb2Nlc3M6IGVtdWxhdG9yLnByb2Nlc3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlVWlhdXRvbWF0b3IyRHJpdmVySW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nKGBDaGVja2luZyB3aGV0aGVyIHRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGlzIGluc3RhbGxlZC4uLmApO1xuICAgIGNvbnN0IGRyaXZlckxpc3RKc29uID0gYXdhaXQgZXhlYygnbnB4IC0tbm8taW5zdGFsbCBhcHBpdW0gZHJpdmVyIGxpc3QgLS1pbnN0YWxsZWQgLS1qc29uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAoY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZCh7IGRyaXZlckxpc3RKc29uLCBkcml2ZXJOYW1lOiBVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUUgfSkpIHtcbiAgICAgIHRoaXMubG9nKGBUaGUgJHtVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUV9IGRyaXZlciBpcyBpbnN0YWxsZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYFRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGlzIG5vdCBpbnN0YWxsZWQuIEluc3RhbGxpbmcgdmlhIFxcYGFwcGl1bSBkcml2ZXIgaW5zdGFsbCAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX1cXGAuLi5gKTtcbiAgICBhd2FpdCBleGVjKGBucHggLS1uby1pbnN0YWxsIGFwcGl1bSBkcml2ZXIgaW5zdGFsbCAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX1gKTtcbiAgICB0aGlzLmxvZyhgVGhlICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfSBkcml2ZXIgaW5zdGFsbGVkLmApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kRGV2aWNlQnlBdmROYW1lKGF2ZE5hbWU6IHN0cmluZywgZGV2aWNlSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgZm9yIChjb25zdCBkZXZpY2VJZCBvZiBkZXZpY2VJZHMpIHtcbiAgICAgIGNvbnN0IHJ1bm5pbmdBdmQgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAgICdhZGInLFxuICAgICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ2VtdScsICdhdmQnLCAnbmFtZSddLFxuICAgICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAgIChfZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQuc3BsaXQoJ1xcbicpWzBdPy50cmltKCkgPz8gJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocnVubmluZ0F2ZCA9PT0gYXZkTmFtZSkge1xuICAgICAgICByZXR1cm4gZGV2aWNlSWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGV4ZWNGaWxlKCdhZGInLCBbJ2RldmljZXMnXSwgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAnYWRiIGRldmljZXMnOiAke2Vycm9yLm1lc3NhZ2V9LiBJcyBBREIgaW5zdGFsbGVkIGFuZCBpbiBQQVRIP2ApKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIHRoaXMubG9nKGBBREIgc3RkZXJyOiAke3N0ZGVyci50cmltKCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBsaW5lcyA9IG91dHB1dC5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSkuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuICAgIHJldHVybiBsaW5lc1xuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5pbmNsdWRlcygnXFx0ZGV2aWNlJykpXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNwbGl0KCdcXHQnKVswXSA/PyAnJyk7XG4gIH1cblxuICBwcml2YXRlIGdldERldmljZVByb3AoZGV2aWNlSWQ6IHN0cmluZywgcHJvcDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnZ2V0cHJvcCcsIHByb3BdLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAvLyBSZXR1cm4gbm8gb3V0cHV0IG9uIHRpbWVvdXQvZXJyb3IgKG5vdCBwYXJ0aWFsIHN0ZG91dCkgc28gYSBub24tcmVzcG9uc2l2ZSBndWVzdCByZWFkcyBhcyBcIm5vdCBpZGxlXCIuXG4gICAgICAgICAgcmVzb2x2ZShlcnJvciA/ICcnIDogc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdEluc3RhbGxlZFBhY2thZ2VzKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdjbWQnLCAncGFja2FnZScsICdsaXN0JywgJ3BhY2thZ2VzJ10sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgIC8vIFJldHVybiBubyBvdXRwdXQgb24gdGltZW91dC9lcnJvciBzbyBhIGNodXJuaW5nIGd1ZXN0J3Mgc2xvdy9wYXJ0aWFsIHBhY2thZ2UgbGlzdCBjYW4ndCBmYWxzZWx5IHJlYWQgYXMgaWRsZS5cbiAgICAgICAgICByZXNvbHZlKGVycm9yID8gJycgOiBzdGRvdXQpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2cobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHt0aGlzLnR5cGV9XSAke21lc3NhZ2V9YCk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVFbXVsYXRvckJpbmFyeSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNka1Jvb3QgPSBwcm9jZXNzLmVudlsnQU5EUk9JRF9IT01FJ10gPz8gcHJvY2Vzcy5lbnZbJ0FORFJPSURfU0RLX1JPT1QnXTtcbiAgICBpZiAoIXNka1Jvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBmaW5kIEFuZHJvaWQgZW11bGF0b3I6IG5laXRoZXIgQU5EUk9JRF9IT01FIG5vciBBTkRST0lEX1NES19ST09UIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldC4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gam9pbihzZGtSb290LCAnZW11bGF0b3InLCAnZW11bGF0b3InKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZEtleUV2ZW50KGRldmljZUlkOiBzdHJpbmcsIGtleUNvZGU6IG51bWJlciwgZGVzY3JpcHRpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2lucHV0JywgJ2tleWV2ZW50JywgU3RyaW5nKGtleUNvZGUpXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgICAgIGBXYXJuaW5nOiBmYWlsZWQgdG8gJHtkZXNjcmlwdGlvbn0gKGtleWV2ZW50ICR7U3RyaW5nKGtleUNvZGUpfSk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0YXJ0QXBwaXVtQW5kRW11bGF0b3IocGFyYW1zOiBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUGFyYW1zKTogUHJvbWlzZTxTdGFydEFwcGl1bUFuZEVtdWxhdG9yUmVzdWx0PiB7XG4gICAgY29uc3QgeyBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcywgYXBwaXVtVXJsLCBhdmROYW1lLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzLCBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlLCBpc0VtdWxhdG9yVmlzaWJsZSwgcG9ydCwgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXMsIHNob3VsZEF1dG9TdGFydEFwcGl1bSB9ID0gcGFyYW1zO1xuXG4gICAgbGV0IG5lZWRzQXBwaXVtU3RhcnQgPSBmYWxzZTtcblxuICAgIHRoaXMubG9nKGBDaGVja2luZyBBcHBpdW0gc2VydmVyIGF0ICR7YXBwaXVtVXJsLmhyZWZ9Li4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUoYXBwaXVtVXJsKTtcbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2VydmVyIGlzIHJlYWNoYWJsZS4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKHNob3VsZEF1dG9TdGFydEFwcGl1bSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBuZWVkc0FwcGl1bVN0YXJ0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5lZWRzQXBwaXVtU3RhcnQpIHtcbiAgICAgIGlmIChzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcykge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUFwcGl1bURlcGVuZGVuY2llcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2coYEFwcGl1bSBub3QgcmVhY2hhYmxlLCBhdXRvLXN0YXJ0aW5nIG9uIHBvcnQgJHtTdHJpbmcocG9ydCl9Li4uYCk7XG4gICAgICBhcHBpdW1Qcm9jZXNzID0gdGhpcy5zdGFydEFwcGl1bVNlcnZlcihwb3J0LCBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgWywgZGV2aWNlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgbmVlZHNBcHBpdW1TdGFydFxuICAgICAgICAgID8gdGhpcy53YWl0Rm9yQXBwaXVtUmVhZHkoYXBwaXVtVXJsLCBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZygnQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgaXMgcmVhZHkuJyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgICB0aGlzLmVuc3VyZURldmljZUNvbm5lY3RlZCh7IGF2ZE5hbWUsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGlzRW11bGF0b3JWaXNpYmxlIH0pXG4gICAgICBdKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0dWFsRGV2aWNlSWQ6IGRldmljZVJlc3VsdC5hY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgYXBwaXVtUHJvY2VzcyxcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzOiBkZXZpY2VSZXN1bHQuZW11bGF0b3JQcm9jZXNzXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgc3RhcnR1cCBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEFwcGl1bVNlcnZlcihwb3J0OiBudW1iZXIsIGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuKTogQ2hpbGRQcm9jZXNzIHtcbiAgICBjb25zdCBpc0NvbnNvbGVIaWRkZW4gPSBzaG91bGRIaWRlQXBwaXVtQ29uc29sZShpc0FwcGl1bUNvbnNvbGVWaXNpYmxlKTtcbiAgICBjb25zdCB7IGRldGFjaGVkLCB3aW5kb3dzSGlkZSB9ID0gcmVzb2x2ZUFwcGl1bVNwYXduRmxhZ3MoaXNDb25zb2xlSGlkZGVuKTtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGBucHggYXBwaXVtIC0tbG9nLXRpbWVzdGFtcCAtLXBvcnQgJHtTdHJpbmcocG9ydCl9IC0tYWxsb3ctaW5zZWN1cmU9JHtDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkV9YCwge1xuICAgICAgZGV0YWNoZWQsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiBpc0NvbnNvbGVIaWRkZW4gPyAnaWdub3JlJyA6IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgd2luZG93c0hpZGVcbiAgICB9KTtcblxuICAgIGNoaWxkLnVucmVmKCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEVtdWxhdG9yKGF2ZE5hbWU6IHN0cmluZywgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuKTogRW11bGF0b3JMYXVuY2gge1xuICAgIGNvbnN0IGVtdWxhdG9yQmluYXJ5ID0gdGhpcy5yZXNvbHZlRW11bGF0b3JCaW5hcnkoKTtcbiAgICBjb25zdCBpc1dpbmRvd0hpZGRlbiA9IHNob3VsZEhpZGVFbXVsYXRvcldpbmRvdyhpc0VtdWxhdG9yVmlzaWJsZSk7XG4gICAgY29uc3QgYXJncyA9IGJ1aWxkRW11bGF0b3JBcmdzKHsgYXZkTmFtZSwgaXNIaWRkZW46IGlzV2luZG93SGlkZGVuIH0pO1xuICAgIGNvbnN0IHsgZGV0YWNoZWQsIHdpbmRvd3NIaWRlIH0gPSByZXNvbHZlRW11bGF0b3JTcGF3bkZsYWdzKGlzV2luZG93SGlkZGVuKTtcbiAgICB0aGlzLmxvZyhgUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAvKlxuICAgICAqIFBpcGUgKHJhdGhlciB0aGFuIGlnbm9yZSkgc3Rkb3V0L3N0ZGVyciBzbyBhbiBlYXJseSBmYWlsdXJlIHN1Y2ggYXNcbiAgICAgKiBcIng4Nl82NCBlbXVsYXRpb24gY3VycmVudGx5IHJlcXVpcmVzIGhhcmR3YXJlIGFjY2VsZXJhdGlvblwiIGNhbiBiZVxuICAgICAqIHN1cmZhY2VkIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlIGZ1bGwgYm9vdCB0aW1lb3V0LlxuICAgICAqL1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZW11bGF0b3JCaW5hcnksIGFyZ3MsIHtcbiAgICAgIGRldGFjaGVkLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgICAgd2luZG93c0hpZGVcbiAgICB9KTtcblxuICAgIGxldCBjYXB0dXJlZE91dHB1dCA9ICcnO1xuICAgIGxldCBleGl0SW5mbzogRW11bGF0b3JFeGl0SW5mbyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaXNDYXB0dXJpbmcgPSB0cnVlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgYXBwZW5kT3V0cHV0KTtcbiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBhcHBlbmRPdXRwdXQpO1xuICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICBleGl0SW5mbyA9IHsgY29kZSwgc2lnbmFsIH07XG4gICAgfSk7XG5cbiAgICBjaGlsZC51bnJlZigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2Nlc3M6IGNoaWxkLFxuICAgICAgcmVhZEV4aXRJbmZvOiAoKSA9PiBleGl0SW5mbyxcbiAgICAgIHJlYWRPdXRwdXQ6ICgpID0+IGNhcHR1cmVkT3V0cHV0LFxuICAgICAgc3RvcENhcHR1cmU6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgICogTGVhdmUgdGhlIGBkYXRhYCBsaXN0ZW5lcnMgYXR0YWNoZWQgc28gdGhlIHBpcGVzIGtlZXAgZHJhaW5pbmcgKGFcbiAgICAgICAgICogZnVsbCBPUyBwaXBlIGJ1ZmZlciB3b3VsZCBibG9jayB0aGUgbG9uZy1ydW5uaW5nIGVtdWxhdG9yKTsgdGhlIGZsYWdcbiAgICAgICAgICoganVzdCBmcmVlemVzIHRoZSBjYXB0dXJlZCB0YWlsIG9uY2Ugc3RhcnR1cCBoYXMgc3VjY2VlZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgaXNDYXB0dXJpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYXBwZW5kT3V0cHV0KGNodW5rOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgIGlmICghaXNDYXB0dXJpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FwdHVyZWRPdXRwdXQgPSAoY2FwdHVyZWRPdXRwdXQgKyBjaHVuay50b1N0cmluZygpKS5zbGljZSgtRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIHRoZSBndWVzdCdzIGNyYXNoL0FOUiBkaWFsb2dzIG9uIHRoZSBnaXZlbiBkZXZpY2UuXG4gICAqXG4gICAqIEEgcmVzb3VyY2Utc3RhcnZlZCBlbXVsYXRvciBjYW4gcmFpc2UgYSBcIlByb2Nlc3Mgc3lzdGVtIGlzbid0IHJlc3BvbmRpbmdcIlxuICAgKiBBTlIgKGFuIGBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlYCB0aW1lb3V0KSB3aG9zZSBkaWFsb2cgb3ZlcmxheXMgdGhlIFVJLiBJZlxuICAgKiBpdCBhcHBlYXJzIGJlZm9yZSBBcHBpdW0gYXR0YWNoZXMsIG5vdGhpbmcgY2FuIGRpc21pc3MgaXQgYW5kIHRoZSBydW4gaGFuZ3NcbiAgICogb3IgZmFpbHMgaW50ZXJtaXR0ZW50bHkuIFNldHRpbmcgdGhlIGBoaWRlX2Vycm9yX2RpYWxvZ3NgIGdsb2JhbCBcdTIwMTQgdGhlIHNhbWVcbiAgICogZmxhZyBBbmRyb2lkJ3Mgb3duIHRlc3QgaW5mcmEgdXNlcyBcdTIwMTQgdGVsbHMgYEFjdGl2aXR5TWFuYWdlclNlcnZpY2VgIHRvXG4gICAqIG5ldmVyIGRyYXcgY3Jhc2gvQU5SIGRpYWxvZ3MsIHNvIHRoZSBBTlIgY2FuIG5vIGxvbmdlciBibG9jayBhdXRvbWF0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBlYXJsaWVzdCBwb2ludCBhdCB3aGljaCB0aGUgZmxhZyBjYW4gYmUgc2V0OiB0aGUgZnJhbWV3b3JrXG4gICAqIChgc3lzdGVtX3NlcnZlcmApIG11c3QgYmUgdXAgYmVmb3JlIGBzZXR0aW5ncyBwdXRgIHdvcmtzLCBzbyBjYWxsZXJzIGludm9rZVxuICAgKiBpdCBvbmx5IGFmdGVyIGBzeXMuYm9vdF9jb21wbGV0ZWRgLiBJdCBuYXJyb3dzIFx1MjAxNCBidXQgY2Fubm90IGZ1bGx5IGNsb3NlIFx1MjAxNFxuICAgKiB0aGUgcmFjZSB3aXRoIGFuIEFOUiB0aGF0IGZpcmVzIGJldHdlZW4gYm9vdCBjb21wbGV0aW5nIGFuZCB0aGlzIGNhbGw7IGFcbiAgICogcHJlLWJha2VkIHNuYXBzaG90IHdpdGggdGhlIGZsYWcgYWxyZWFkeSBzZXQgaXMgdGhlIG9ubHkgd2F5IHRvIGVsaW1pbmF0ZVxuICAgKiBpdCBlbnRpcmVseS4gQmVzdC1lZmZvcnQ6IGEgZmFpbHVyZSBpcyBsb2dnZWQsIG5vdCB0aHJvd24sIHNpbmNlIGl0IG9ubHlcbiAgICogc3VwcHJlc3NlcyBhIHN5bXB0b20uXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBjb25maWd1cmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN1cHByZXNzRXJyb3JEaWFsb2dzKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgRGlzYWJsaW5nIGNyYXNoL0FOUiBkaWFsb2dzIG9uIGRldmljZSAke2RldmljZUlkfSAoc2V0dGluZ3MgcHV0IGdsb2JhbCBoaWRlX2Vycm9yX2RpYWxvZ3MgMSkuLi5gKTtcblxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ3NldHRpbmdzJywgJ3B1dCcsICdnbG9iYWwnLCAnaGlkZV9lcnJvcl9kaWFsb2dzJywgJzEnXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgICAgIGBXYXJuaW5nOiBmYWlsZWQgdG8gZGlzYWJsZSBjcmFzaC9BTlIgZGlhbG9nczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckFwcGl1bVJlYWR5KHVybDogVVJMLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBBcHBpdW0gYXQgJHt1cmwuaHJlZn0gKHRpbWVvdXQ6ICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMsIHBvbGw6ICR7U3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICAgICAgdGhpcy5sb2coYEFwcGl1bSBzZXJ2ZXIgcmVhZHkgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRoaXMubG9nKGBBcHBpdW0gc2VydmVyIG5vdCByZWFkeSB5ZXQgKGVsYXBzZWQ6ICR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMpLiBSZXRyeWluZy4uLmApO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGRpZCBub3QgYmVjb21lIHJlYWR5IHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zYFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JCb290KGRldmljZUlkOiBzdHJpbmcsIGRlYWRsaW5lOiBudW1iZXIsIGVtdWxhdG9yOiBFbXVsYXRvckxhdW5jaCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlbWFpbmluZ01zID0gTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKTtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gZmluaXNoIGJvb3RpbmcgKHJlbWFpbmluZzogJHtTdHJpbmcocmVtYWluaW5nTXMpfW1zLCBwb2xsOiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IGlzQm9vdGVkID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICAgJ2FkYicsXG4gICAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnZ2V0cHJvcCcsICdzeXMuYm9vdF9jb21wbGV0ZWQnXSxcbiAgICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgICAoX2Vycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnRyaW0oKSA9PT0gJzEnKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzQm9vdGVkKSB7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gYm9vdCBjb21wbGV0ZWQuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhpdEluZm8gPSBlbXVsYXRvci5yZWFkRXhpdEluZm8oKTtcbiAgICAgIGlmIChleGl0SW5mbykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYnVpbGRFbXVsYXRvckV4aXRNZXNzYWdlKGV4aXRJbmZvLCBlbXVsYXRvci5yZWFkT3V0cHV0KCkpKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBEZXZpY2UgXCIke2RldmljZUlkfVwiIGNvbm5lY3RlZCBidXQgZGlkIG5vdCBmaW5pc2ggYm9vdGluZyB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIGEgZnJlc2hseS1ib290ZWQgZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBzZXNzaW9uIGlzXG4gICAqIGVzdGFibGlzaGVkLlxuICAgKlxuICAgKiBgc3lzLmJvb3RfY29tcGxldGVkYCBmaXJlcyBiZWZvcmUgdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGUgXHUyMDE0IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzZXJ2aWNlcyBrZWVwIGNodXJuaW5nIFx1MjAxNCBzbyBlc3RhYmxpc2hpbmcgdGhlIEFwcGl1bVxuICAgKiBzZXNzaW9uIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IHNlcmlhbGl6ZWQgVWlBdXRvbWF0b3IyIGBhZGJgIHJvdW5kLXRyaXBcbiAgICogY29udGVuZCB3aXRoIHRoYXQgd29yayBhbmQgaW5mbGF0ZXMgc2Vzc2lvbiBlc3RhYmxpc2htZW50IH4zeC4gVGhpcyBwb2xsc1xuICAgKiBhIGxhdGVyLCBxdWlldGVyIHNpZ25hbCAoYm9vdCBhbmltYXRpb24gc3RvcHBlZCArIHBhY2thZ2UgbWFuYWdlciBzZXJ2aW5nLFxuICAgKiB2aWEge0BsaW5rIGNoZWNrRGV2aWNlSWRsZX0pIGFuZCByZXR1cm5zIGFzIHNvb24gYXMgaXQgaXMgc2F0aXNmaWVkLlxuICAgKlxuICAgKiBCZXN0LWVmZm9ydDogaWYgdGhlIGd1ZXN0IGRvZXMgbm90IHJlcG9ydCBpZGxlIHdpdGhpbiB0aGUgYnVkZ2V0IGl0IGxvZ3MgYVxuICAgKiB3YXJuaW5nIGFuZCBwcm9jZWVkcyAoYSBzbG93IHNlc3Npb24gaXMgYmV0dGVyIHRoYW4gYSBmYWlsZWQgcnVuKSwgYW5kIGFcbiAgICogYnVkZ2V0IG9mIGAwYCBza2lwcyB0aGUgd2FpdCBlbnRpcmVseS5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGRldmljZSBVRElEIHRvIHBvbGwuXG4gICAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBNYXhpbXVtIHRpbWUgdG8gd2FpdDsgYDBgIHNraXBzIHRoZSB3YWl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yRGV2aWNlSWRsZShkZXZpY2VJZDogc3RyaW5nLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aW1lb3V0SW5NaWxsaXNlY29uZHMgPD0gMCkge1xuICAgICAgdGhpcy5sb2coYFNraXBwaW5nIHBvc3QtYm9vdCBpZGxlIHdhaXQgZm9yIGRldmljZSAke2RldmljZUlkfSAodGltZW91dCBpcyAwKS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gYmVjb21lIGlkbGUgKHRpbWVvdXQ6ICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMsIHBvbGw6ICR7U3RyaW5nKERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IFtib290QW5pbWF0aW9uUHJvcCwgcGFja2FnZUxpc3RPdXRwdXRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLmdldERldmljZVByb3AoZGV2aWNlSWQsICdpbml0LnN2Yy5ib290YW5pbScpLFxuICAgICAgICB0aGlzLmxpc3RJbnN0YWxsZWRQYWNrYWdlcyhkZXZpY2VJZClcbiAgICAgIF0pO1xuXG4gICAgICBpZiAoY2hlY2tEZXZpY2VJZGxlKHsgYm9vdEFuaW1hdGlvblByb3AsIHBhY2thZ2VMaXN0T3V0cHV0IH0pKSB7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gaXMgaWRsZSBhZnRlciAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gbm90IGlkbGUgeWV0IChlbGFwc2VkOiAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zKS4gUmV0cnlpbmcuLi5gKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgREVWSUNFX0lETEVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FybmluZzogZGV2aWNlICR7ZGV2aWNlSWR9IGRpZCBub3QgcmVwb3J0IGlkbGUgd2l0aGluICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXM7IHByb2NlZWRpbmcgd2l0aCBzZXNzaW9uIGVzdGFibGlzaG1lbnQgYW55d2F5LmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZTogc3RyaW5nW10sIGVtdWxhdG9yOiBFbXVsYXRvckxhdW5jaCwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBhIG5ldyBkZXZpY2UgdG8gYXBwZWFyIGluIEFEQiAodGltZW91dDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHBvbGw6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBjdXJyZW50SWRzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHMoKTtcbiAgICAgIGNvbnN0IG5ld0lkcyA9IGN1cnJlbnRJZHMuZmlsdGVyKChpZCkgPT4gIWRldmljZUlkc0JlZm9yZS5pbmNsdWRlcyhpZCkpO1xuXG4gICAgICBpZiAobmV3SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWN0dWFsRGV2aWNlSWQgPSBuZXdJZHNbMF0gPz8gJyc7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gYXBwZWFyZWQgaW4gQURCLCB3YWl0aW5nIGZvciBib290IHRvIGNvbXBsZXRlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckJvb3QoYWN0dWFsRGV2aWNlSWQsIGRlYWRsaW5lLCBlbXVsYXRvcik7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZUlkbGUoYWN0dWFsRGV2aWNlSWQsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgICAgICBhd2FpdCB0aGlzLndha2VTY3JlZW4oYWN0dWFsRGV2aWNlSWQpO1xuICAgICAgICByZXR1cm4gYWN0dWFsRGV2aWNlSWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbywgZW11bGF0b3IucmVhZE91dHB1dCgpKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gbmV3IGVtdWxhdG9yIGRldmljZSBhcHBlYXJlZCB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdha2VTY3JlZW4oZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nKGBXYWtpbmcgc2NyZWVuIG9uIGRldmljZSAke2RldmljZUlkfS4uLmApO1xuXG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfV0FLRVVQLCAnd2FrZSBzY3JlZW4nKTtcbiAgICBhd2FpdCB0aGlzLnNlbmRLZXlFdmVudChkZXZpY2VJZCwgS0VZQ09ERV9NRU5VLCAnZGlzbWlzcyBsb2NrIHNjcmVlbicpO1xuXG4gICAgdGhpcy5sb2coYFNjcmVlbiB3YWtlIGNvbXBsZXRlIG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gYW4gb3duZWQgZGVza3RvcCBDRFAgdHJhbnNwb3J0LlxuICogQHJldHVybnMgQSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgY29uc3QgdHlwZSA9IG9wdGlvbnM/LnR5cGUgPz8gREVGQVVMVF9UUkFOU1BPUlRfVFlQRTtcblxuICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2RwJykge1xuICAgIHJldHVybiBjcmVhdGVDZHBUcmFuc3BvcnQob3B0aW9ucyk7XG4gIH1cblxuICBjb25zdCBmYWN0b3J5ID0gbmV3IEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkodHlwZSk7XG4gIHJldHVybiBmYWN0b3J5LmNyZWF0ZShvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlIGZvciBhbiBlbXVsYXRvciBwcm9jZXNzIHRoYXQgZXhpdGVkIGR1cmluZ1xuICogc3RhcnR1cCwgYXBwZW5kaW5nIHRoZSBjYXB0dXJlZCBvdXRwdXQgdGFpbCB3aGVuIGF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0gZXhpdEluZm8gLSBUaGUgZW11bGF0b3IncyBleGl0IGRldGFpbHMuXG4gKiBAcGFyYW0gb3V0cHV0IC0gVGhlIGNhcHR1cmVkIHN0ZG91dCtzdGRlcnIgdGFpbC5cbiAqIEByZXR1cm5zIEEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRFbXVsYXRvckV4aXRNZXNzYWdlKGV4aXRJbmZvOiBFbXVsYXRvckV4aXRJbmZvLCBvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlYXNvbiA9IGV4aXRJbmZvLnNpZ25hbCA9PT0gbnVsbFxuICAgID8gYGV4aXRlZCBwcmVtYXR1cmVseSB3aXRoIGNvZGUgJHtTdHJpbmcoZXhpdEluZm8uY29kZSl9YFxuICAgIDogYHdhcyB0ZXJtaW5hdGVkIGJ5IHNpZ25hbCAke2V4aXRJbmZvLnNpZ25hbH1gO1xuICBjb25zdCB0cmltbWVkT3V0cHV0ID0gb3V0cHV0LnRyaW0oKTtcbiAgY29uc3QgZGV0YWlscyA9IHRyaW1tZWRPdXRwdXQubGVuZ3RoID4gMFxuICAgID8gYFxcblxcbkVtdWxhdG9yIG91dHB1dCAodGFpbCk6XFxuJHt0cmltbWVkT3V0cHV0fWBcbiAgICA6ICcnO1xuICByZXR1cm4gYEFuZHJvaWQgZW11bGF0b3IgJHtyZWFzb259IGR1cmluZyBzdGFydHVwLiR7ZGV0YWlsc31gO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHByb2FjdGl2ZSBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSBjaGVjayBmb3IgYW4gYXNhci1zd2FwIGFuZCBhY3RzXG4gKiBvbiB0aGUgdmVyZGljdDogZm9yIGFuIGluc3RhbGxlciBiZWxvdyB0aGUgYXBwJ3MgcnVuIGZsb29yIGVpdGhlciB0aHJvd3NcbiAqIHtAbGluayBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3J9ICh3aGVuXG4gKiB7QGxpbmsgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zLnNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXJ9KVxuICogb3IgcHJvY2VlZHMgdG8gbGF1bmNoIHdpdGggYSB3YXJuaW5nOyBmb3IgYSBydW5uYWJsZS1idXQtYmVsb3ctcmVjb21tZW5kZWRcbiAqIGluc3RhbGxlciBsb2dzIGEgd2FybmluZy4gQm90aCB3YXJuaW5ncyBhcmUgc3VwcHJlc3NlZCB3aGVuXG4gKiB7QGxpbmsgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXN9IGlzXG4gKiBgZmFsc2VgLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcmVzb2x2ZWQgdmVyc2lvbnMgYW5kIHRoZSB3YXJuL3Rocm93IGtub2JzLlxuICogQHJldHVybnMgVGhlIHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gYXNhci1zd2FwIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHkocGFyYW1zOiBDaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHlQYXJhbXMpOiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBhcHBWZXJzaW9uLCBpbnN0YWxsZXJWZXJzaW9uLCBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLCBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzIH0gPSBwYXJhbXM7XG4gIGlmIChhcHBWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgY29tcGF0aWJpbGl0eSA9IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSh7XG4gICAgYXBwVmVyc2lvbixcbiAgICBpbnN0YWxsZXJWZXJzaW9uLFxuICAgIG1ldGFkYXRhOiBnZXRWZXJzaW9uTWV0YWRhdGEoYXBwVmVyc2lvbilcbiAgfSk7XG5cbiAgY29uc3QgYWN0aW9uID0gcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlBY3Rpb24oe1xuICAgIHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIsXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyxcbiAgICB0aWVyOiBjb21wYXRpYmlsaXR5LnRpZXJcbiAgfSk7XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ3Rocm93Jykge1xuICAgIHRocm93IG5ldyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3Ioe1xuICAgICAgYXBwVmVyc2lvbjogY29tcGF0aWJpbGl0eS5hcHBWZXJzaW9uLFxuICAgICAgaW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5pbnN0YWxsZXJWZXJzaW9uKSxcbiAgICAgIG1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5taW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb24pXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnd2Fybi11bnJ1bm5hYmxlJykge1xuICAgIGxvZyhcbiAgICAgIGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBPYnNpZGlhbiBpbnN0YWxsZXIgJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lmluc3RhbGxlclZlcnNpb24pfSBpcyBiZWxvdyB0aGUgYFxuICAgICAgICArIGBydW4gZmxvb3IgJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lm1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbil9IGZvciBPYnNpZGlhbiAke2NvbXBhdGliaWxpdHkuYXBwVmVyc2lvbn07IGBcbiAgICAgICAgKyAncHJvY2VlZGluZyB0byBsYXVuY2ggKHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIgaXMgZmFsc2UpIFx1MjAxNCB0aGUgYm9vdCB3aWxsIGxpa2VseSBkZWFkLWJvb3QuJ1xuICAgICk7XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnd2Fybi1uYWdnZWQnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSAke2Vuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkubWVzc2FnZSl9YCk7XG4gIH1cblxuICByZXR1cm4gY29tcGF0aWJpbGl0eTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVza3RvcCBDRFAgdHJhbnNwb3J0LiBXaGVuIGFuIGV4cGxpY2l0IGBwb3J0YCBpcyBnaXZlbiB0aGVcbiAqIHRyYW5zcG9ydCBhdHRhY2hlcyB0byBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gb24gdGhhdCBwb3J0OyBvdGhlcndpc2UgaXRcbiAqIGxhdW5jaGVzIGFuZCBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlICh0aGUgZGVmYXVsdCwgaGVybWV0aWMgbW9kZSkuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQ0RQIHRyYW5zcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ2RwVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChvcHRpb25zPy5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBvd25lZFN1ZmZpeCA9IG9wdGlvbnMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSA/ICcgKGhhcm5lc3Mtb3duZWQpJyA6ICcnO1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gQXR0YWNoaW5nIHRvIHJ1bm5pbmcgT2JzaWRpYW4ke293bmVkU3VmZml4fSAoaG9zdD0ke29wdGlvbnMuaG9zdCA/PyAnbG9jYWxob3N0J30sIHBvcnQ9JHtTdHJpbmcob3B0aW9ucy5wb3J0KX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnPih7XG4gICAgICBjZHBIb3N0OiBvcHRpb25zLmhvc3QsXG4gICAgICBjZHBQb3J0OiBvcHRpb25zLnBvcnQsXG4gICAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiBvcHRpb25zLmlzSGFybmVzc093bmVkSW5zdGFuY2VcbiAgICB9KSk7XG4gIH1cblxuICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIENyZWF0aW5nIG93bmVkIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlJyk7XG4gIGNvbnN0IG93bmVkSW5zdGFuY2UgPSBhd2FpdCByZXNvbHZlT3duZWRJbnN0YW5jZUNvbmZpZyhvcHRpb25zKTtcbiAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnPih7XG4gICAgY2RwSG9zdDogb3B0aW9ucz8uaG9zdCxcbiAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogcmVzb2x2ZURlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyhvcHRpb25zKSxcbiAgICBpc09ic2lkaWFuQXBwVmlzaWJsZTogb3B0aW9ucz8uaXNPYnNpZGlhbkFwcFZpc2libGUsXG4gICAgb3duZWRJbnN0YW5jZSxcbiAgICBzaG91bGREaXNhYmxlU2FuZGJveDogb3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3gsXG4gICAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjazogcmVzb2x2ZVNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2sob3B0aW9ucz8uc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayksXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMob3B0aW9ucz8uc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgfSkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmcmVzaCwgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBmb3IgYW4gb3duZWQgaW5zdGFuY2UuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG5ldyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG4gIG1rZGlyU3luYyhyb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIG1rZHRlbXBTeW5jKGpvaW4ocm9vdCwgT1dORURfVVNFUl9EQVRBX1BSRUZJWCkpO1xufVxuXG4vKipcbiAqIERlY2lkZXMgaG93IHRoZSByZXF1ZXN0ZWQgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCB0byBhbiBvd25lZFxuICogaW5zdGFuY2UsIHdpdGhvdXQgZG93bmxvYWRpbmcgYW55dGhpbmcgeWV0OiBhbiB1cGdyYWRlLW9ubHkgYXNhci1zd2FwIG9udG8gdGhlXG4gKiBzaGVsbCwgYSBkb3duZ3JhZGUgdG8gdGhlIGFwcCdzIG93biBpbnN0YWxsZXIgc2hlbGwsIG9yIHRoZSB1c2VyJ3MgbmV3ZXN0XG4gKiBpbnN0YWxsZWQgYXNhciB3aGVuIG5laXRoZXIgdmVyc2lvbiBpcyBwaW5uZWQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gc2hlbGxWZXJzaW9uIC0gVGhlIHJlc29sdmVkIGluc3RhbGxlci9zaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC5cbiAqIEByZXR1cm5zIFRoZSBhc2FyIHBsYW4gKGF0IG1vc3Qgb25lIG9mIGl0cyBmaWVsZHMgaXMgc2V0KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUFzYXJQbGFuKFxuICBvcHRpb25zOiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPEFzYXJQbGFuPiB7XG4gIGlmIChvcHRpb25zPy5vYnNpZGlhblZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGFzYXJWZXJzaW9uID0gYXdhaXQgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihvcHRpb25zLm9ic2lkaWFuVmVyc2lvbik7XG4gICAgaWYgKHNoZWxsVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmVWZXJzaW9ucyhhc2FyVmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSB7XG4gICAgICByZXR1cm4geyBhc2FyVmVyc2lvblRvU3dhcDogYXNhclZlcnNpb24gfTtcbiAgICB9XG5cbiAgICAvLyBBc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5LCBzbyBpdCBjYW5ub3QgYXBwbHkgYSB2ZXJzaW9uIG9sZGVyIHRoYW4gdGhlXG4gICAgLy8gU2hlbGwncyBidW5kbGVkIG9uZSBcdTIwMTQgYW5kIHdoZW4gdGhlIHNoZWxsIHZlcnNpb24gaXMgdW5rbm93biAoYSBMaW51eFxuICAgIC8vIFBhdGgtcGFyc2UgbWlzcykgd2UgY2Fubm90IHByb3ZlIHRoZSBzd2FwIHdvdWxkIGFwcGx5IGF0IGFsbC4gSW4gYm90aFxuICAgIC8vIENhc2VzIHVzZSB0aGUgcmVxdWVzdGVkIHZlcnNpb24ncyBvd24gaW5zdGFsbGVyIHNoZWxsLCB3aG9zZSBidW5kbGVkIGFzYXJcbiAgICAvLyBJcyBleGFjdGx5IHRoaXMgdmVyc2lvbiwgc28gdGhlIHBpbiBpcyBhbHdheXMgaG9ub3JlZC5cbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIFVzaW5nIHRoZSAke2FzYXJWZXJzaW9ufSBpbnN0YWxsZXIgc2hlbGwgKHNoZWxsIHZlcnNpb24gJHtzaGVsbFZlcnNpb24gPz8gJ3Vua25vd24nfTsgYXNhci1zd2FwIGlzIHVwZ3JhZGUtb25seSkuYCk7XG4gICAgcmV0dXJuIHsgZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbjogYXNhclZlcnNpb24gfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5ld2VzdCA9IGZpbmROZXdlc3RBc2FyKGdldE9ic2lkaWFuQ29uZmlnRGlyKCkpO1xuICAgIGlmIChuZXdlc3QgJiYgKHNoZWxsVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGNvbXBhcmVWZXJzaW9ucyhuZXdlc3QudmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSkge1xuICAgICAgcmV0dXJuIHsgYXNhcjogeyBwYXRoOiBuZXdlc3QucGF0aCwgdmVyc2lvbjogbmV3ZXN0LnZlcnNpb24gfSB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbG9jYWxseS1pbnN0YWxsZWQgT2JzaWRpYW4gc2hlbGwsIHRvbGVyYXRpbmcgaXRzIGFic2VuY2UuXG4gKlxuICogVW5saWtlIHtAbGluayByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlfSAod2hpY2ggdGhyb3dzIHdoZW4gT2JzaWRpYW4gaXMgbm90XG4gKiBpbnN0YWxsZWQpLCB0aGlzIHJldHVybnMgYHVuZGVmaW5lZGAgaW4gdGhhdCBjYXNlLCBzbyBhIGNhbGxlciBwaW5uaW5nIGFuXG4gKiBpbnN0YWxsZXIgdmVyc2lvbiBjYW4gZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nIHRoZSBwaW5uZWQgc2hlbGwgaW5zdGVhZCBvZlxuICogZmFpbGluZyBvbiBhIGhvc3Qgd2l0aCBubyBPYnNpZGlhbiBpbnN0YWxsZWQgKGUuZy4gQ0kpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsZWQgc2hlbGwncyBwYXRoIGFuZCBkZXRlY3RlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuXG4gKiAgIG5vIE9ic2lkaWFuIGlzIGluc3RhbGxlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsKCk6IFByb21pc2U8SW5zdGFsbGVkU2hlbGwgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBleGVQYXRoID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSgpO1xuICAgIHJldHVybiB7IGV4ZVBhdGgsIHNoZWxsVmVyc2lvbjogZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgc2hlbGwgZXhlY3V0YWJsZSwgYXNhciBwcm92aXNpb25pbmcsIGFuZCBpc29sYXRlZCB1c2VyLWRhdGEgZGlyXG4gKiBmb3IgYSBoYXJuZXNzLW93bmVkIGluc3RhbmNlIGZyb20gdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGtub2JzLlxuICpcbiAqIC0gYG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbmAgcGlucyB0aGUgRWxlY3Ryb24gc2hlbGwgKGRvd25sb2FkcyArIGV4dHJhY3RzIGFcbiAqICAgcG9ydGFibGUgYnVpbGQgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIGluc3RhbGxlZCBzaGVsbCkuXG4gKiAtIGBvYnNpZGlhblZlcnNpb25gIHBpbnMgdGhlIGFwcDogYW4gYXNhci1zd2FwIHdoZW4gaXQgaXMgPj0gdGhlIHNoZWxsIHZlcnNpb25cbiAqICAgKGNoZWFwKSwgb3RoZXJ3aXNlIHRoZSBtYXRjaGluZyBpbnN0YWxsZXIgc2hlbGwgaXMgdXNlZCAoZG93bmdyYWRlKS5cbiAqIC0gV2hlbiBuZWl0aGVyIGlzIHNldCwgdGhlIHVzZXIncyBuZXdlc3QgaW5zdGFsbGVkIGFzYXIgaXMgY29waWVkIGluIChzbyB0aGVcbiAqICAgb3duZWQgaW5zdGFuY2UgbWF0Y2hlcyB0aGUgdmVyc2lvbiB0aGUgdXNlciBjdXJyZW50bHkgcnVucykgd2l0aCB6ZXJvIG5ldHdvcmsuXG4gKlxuICogVGhlIGNvbmNyZXRlIChhcHAsIGluc3RhbGxlcikgdmVyc2lvbiBwYWlyIGlzIHJlc29sdmVkICpiZWZvcmUqIGFueSBzaGVsbC9hc2FyXG4gKiBkb3dubG9hZCwgc28gYSBwcm9hY3RpdmUgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgY2hlY2tcbiAqICh7QGxpbmsgY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5fSkgY2FuIGZhaWwgZmFzdDogYW4gaW5zdGFsbGVyIGJlbG93IHRoZVxuICogYXBwJ3MgcnVuIGZsb29yIHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBiZWZvcmVcbiAqIGFueXRoaW5nIGlzIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQgKHN1cGVyc2VkaW5nIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3RcbiAqIGZhc3QtZmFpbCBmb3IgdGFibGUta25vd24gY29tYm9zKSwgYW5kIGEgcnVubmFibGUtYnV0LWJlbG93LXJlY29tbWVuZGVkXG4gKiBpbnN0YWxsZXIgbG9ncyBhIHdhcm5pbmcuIFRoZSB2ZXJkaWN0IGlzIHRocmVhZGVkIG9udG8gdGhlIHJldHVybmVkIGNvbmZpZyBzb1xuICogdGhlIHRyYW5zcG9ydCBjYW4gc3VyZmFjZSBpdCBhcyBkYXRhLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0RQIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIG93bmVkLWluc3RhbmNlIGNvbmZpZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU93bmVkSW5zdGFuY2VDb25maWcob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T3duZWRJbnN0YW5jZUNvbmZpZz4ge1xuICAvLyBSZXNvbHZlIHRoZSBjb25jcmV0ZSBzaGVsbCAoaW5zdGFsbGVyKSB2ZXJzaW9uIGZpcnN0LCBidXQgZm9yIGEgcGlubmVkXG4gIC8vIEluc3RhbGxlciBERUZFUiByZXNvbHZpbmcvZG93bmxvYWRpbmcgdGhlIGFjdHVhbCBzaGVsbCB1bnRpbCBhZnRlciB0aGVcbiAgLy8gUHJvYWN0aXZlIGNvbXBhdGliaWxpdHkgY2hlY2ssIHNvIGFuIHVucnVubmFibGUgcGluIGZhaWxzIGZhc3QgXHUyMDE0IGJlZm9yZSB0aGVcbiAgLy8gKHBvc3NpYmx5IHNsb3cpIGluc3RhbGxlZC1zaGVsbCBkZXRlY3Rpb24gYW5kIGFueSBkb3dubG9hZC5cbiAgbGV0IGV4ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgcGlubmVkSW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gICAgc2hlbGxWZXJzaW9uID0gZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEEgcGlubmVkIGluc3RhbGxlciB2ZXJzaW9uIGZ1bGx5IGRldGVybWluZXMgdGhlIHNoZWxsIHZlcnNpb24gdXAgZnJvbnQsXG4gICAgLy8gV2l0aG91dCByZXF1aXJpbmcgYSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiAoYSBDSSBydW5uZXIgaGFzIG5vbmUpLlxuICAgIHBpbm5lZEluc3RhbGxlclZlcnNpb24gPSBhd2FpdCByZXNvbHZlQ29uY3JldGVWZXJzaW9uKG9wdGlvbnMub2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uKTtcbiAgICBzaGVsbFZlcnNpb24gPSBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uO1xuICB9XG5cbiAgLy8gRGVjaWRlIGhvdyB0aGUgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCwgc3RpbGwgV0lUSE9VVCBkb3dubG9hZGluZy5cbiAgY29uc3QgcGxhbiA9IGF3YWl0IHJlc29sdmVBc2FyUGxhbihvcHRpb25zLCBzaGVsbFZlcnNpb24pO1xuXG4gIC8vIFRoZSBhcHAgdmVyc2lvbiB0aGF0IHdpbGwgcnVuIGFzIGFuIGFzYXItc3dhcCBvbnRvIGBzaGVsbFZlcnNpb25gIFx1MjAxNCB0aGUgb25seVxuICAvLyBDb21iaW5hdGlvbiB0aGF0IGNhbiBkZWFkLWJvb3QuIFRoZSBkb3duZ3JhZGUgLyBvd24taW5zdGFsbGVyIHBhdGhzIHJ1biB0aGVcbiAgLy8gQXBwJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgc28gdGhleSBhbHdheXMgYm9vdCBhbmQgYXJlIG5vdCBjaGVja2VkLlxuICBjb25zdCBzd2FwQXBwVmVyc2lvbiA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPz8gcGxhbi5hc2FyPy52ZXJzaW9uO1xuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gY2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5KHtcbiAgICBhcHBWZXJzaW9uOiBzd2FwQXBwVmVyc2lvbixcbiAgICBpbnN0YWxsZXJWZXJzaW9uOiBzaGVsbFZlcnNpb24sXG4gICAgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogcmVzb2x2ZVNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIob3B0aW9ucz8uc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlciksXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMob3B0aW9ucz8uc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgfSk7XG5cbiAgLy8gVGhlIHBpbiBpcyBrbm93biBydW5uYWJsZSBcdTIwMTQgcmVzb2x2ZS9kb3dubG9hZCB0aGUgZGVmZXJyZWQgc2hlbGwgKyBhc2FyIG5vdy5cbiAgLy8gUmV1c2UgdGhlIGluc3RhbGxlZCBzaGVsbCBvbmx5IHdoZW4gaXQgYWxyZWFkeSBtYXRjaGVzIHRoZSBwaW4gKHNhdmVzIHRoZVxuICAvLyBEb3dubG9hZCk7IG90aGVyd2lzZSBkb3dubG9hZCBhbmQgZXh0cmFjdCB0aGUgcGlubmVkIGluc3RhbGxlci5cbiAgaWYgKHBpbm5lZEluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IHJlc29sdmVJbnN0YWxsZWRTaGVsbE9yTnVsbCgpO1xuICAgIGV4ZVBhdGggPSBpbnN0YWxsZWQ/LnNoZWxsVmVyc2lvbiA9PT0gcGlubmVkSW5zdGFsbGVyVmVyc2lvbiA/IGluc3RhbGxlZC5leGVQYXRoIDogYXdhaXQgZW5zdXJlU2hlbGxDYWNoZWQocGlubmVkSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cbiAgaWYgKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlUGF0aCA9IGF3YWl0IGVuc3VyZVNoZWxsQ2FjaGVkKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cblxuICBjb25zdCBhc2FyID0gcGxhbi5hc2FyVmVyc2lvblRvU3dhcCA9PT0gdW5kZWZpbmVkXG4gICAgPyBwbGFuLmFzYXJcbiAgICA6IHsgcGF0aDogYXdhaXQgZW5zdXJlQXNhckNhY2hlZChwbGFuLmFzYXJWZXJzaW9uVG9Td2FwKSwgdmVyc2lvbjogcGxhbi5hc2FyVmVyc2lvblRvU3dhcCB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uKGFzYXIgJiYgeyBhc2FyIH0pLFxuICAgIC4uLihjb21wYXRpYmlsaXR5ICYmIHsgY29tcGF0aWJpbGl0eSB9KSxcbiAgICBleGVQYXRoOiBlbnN1cmVOb25OdWxsYWJsZShleGVQYXRoKSxcbiAgICB1c2VyRGF0YURpcjogY3JlYXRlT3duZWRVc2VyRGF0YURpcigpXG4gIH07XG59XG5cbi8qKlxuICogUmVtb3ZlcyBgQ29ubmVjdGlvbmAgYW5kIGBDb250ZW50LUxlbmd0aGAgZnJvbSBhIFdlYkRyaXZlciByZXF1ZXN0J3MgaGVhZGVycy5cbiAqXG4gKiBUaGUgYnVuZGxlZCBgd2ViZHJpdmVyYCBwYWNrYWdlIHNldHMgYm90aCBoZWFkZXJzIGV4cGxpY2l0bHkuIFRoZXkgYXJlXG4gKiBmb3JiaWRkZW4gcmVxdWVzdCBoZWFkZXJzIHBlciB0aGUgRmV0Y2ggc3BlYzogTm9kZSB1cCB0byAyNSBhY2NlcHRlZCB0aGVtXG4gKiBzaWxlbnRseSwgYnV0IE5vZGUgMjYgcmVqZWN0cyB0aGVtIHdpdGggYFVORF9FUlJfSU5WQUxJRF9BUkdgLCBicmVha2luZyB0aGVcbiAqIEFwcGl1bSBgL3Nlc3Npb25gIHJlcXVlc3QuIFRoZSB0cmFuc3BvcnQgbGF5ZXIgbWFuYWdlcyBjb25uZWN0aW9uIHJldXNlIGFuZFxuICogdGhlIEZldGNoIEFQSSBjb21wdXRlcyBgQ29udGVudC1MZW5ndGhgIGZyb20gdGhlIGJvZHksIHNvIGRyb3BwaW5nIGJvdGggaXNcbiAqIHNhZmUgb24gZXZlcnkgTm9kZSB2ZXJzaW9uLiBTZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJkcml2ZXJpby93ZWJkcml2ZXJpby9pc3N1ZXMvMTUyNjV9LlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0T3B0aW9ucyAtIFRoZSByZXF1ZXN0IG9wdGlvbnMgYWJvdXQgdG8gYmUgc2VudCBieSBXZWJEcml2ZXJJTy5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIHJlcXVlc3Qgb3B0aW9ucyB3aXRoIHRoZSBmb3JiaWRkZW4gaGVhZGVycyByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVycyhyZXF1ZXN0T3B0aW9uczogUmVxdWVzdEluaXQpOiBSZXF1ZXN0SW5pdCB7XG4gIGlmIChyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb25uZWN0aW9uJyk7XG4gICAgcmVxdWVzdE9wdGlvbnMuaGVhZGVycy5kZWxldGUoJ0NvbnRlbnQtTGVuZ3RoJyk7XG4gIH1cblxuICByZXR1cm4gcmVxdWVzdE9wdGlvbnM7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7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Qix3Q0FBb0Msd0VBQTBDLFNBQVMsa0NBQWtDO0FBQUEsSUFDekgscUNBQWlDLHFFQUF1QyxTQUFTLCtCQUErQjtBQUFBLEVBQ2xILENBQUM7QUFLRCxNQUFJLDJCQUEyQixRQUFXO0FBQ3hDLFVBQU0sWUFBWSxNQUFNLDRCQUE0QjtBQUNwRCxjQUFVLFdBQVcsaUJBQWlCLHlCQUF5QixVQUFVLFVBQVUsVUFBTSw2Q0FBa0Isc0JBQXNCO0FBQUEsRUFDbkk7QUFDQSxNQUFJLEtBQUssOEJBQThCLFFBQVc7QUFDaEQsY0FBVSxVQUFNLDZDQUFrQixLQUFLLHlCQUF5QjtBQUFBLEVBQ2xFO0FBRUEsUUFBTSxPQUFPLEtBQUssc0JBQXNCLFNBQ3BDLEtBQUssT0FDTCxFQUFFLE1BQU0sVUFBTSxpREFBaUIsS0FBSyxpQkFBaUIsR0FBRyxTQUFTLEtBQUssa0JBQWtCO0FBRTVGLFNBQU87QUFBQSxJQUNMLEdBQUksUUFBUSxFQUFFLEtBQUs7QUFBQSxJQUNuQixHQUFJLGlCQUFpQixFQUFFLGNBQWM7QUFBQSxJQUNyQyxhQUFTLHNDQUFrQixPQUFPO0FBQUEsSUFDbEMsYUFBYSx1QkFBdUI7QUFBQSxFQUN0QztBQUNGO0FBZUEsU0FBUywyQkFBMkIsZ0JBQTBDO0FBQzVFLE1BQUksZUFBZSxtQkFBbUIsU0FBUztBQUM3QyxtQkFBZSxRQUFRLE9BQU8sWUFBWTtBQUMxQyxtQkFBZSxRQUFRLE9BQU8sZ0JBQWdCO0FBQUEsRUFDaEQ7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbImh0dHAiLCAia2lsbEF1dG9TdGFydGVkUHJvY2Vzc2VzIiwgInByb2Nlc3MiXQp9Cg==
|