You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
aggregation-platform/dist/hawtio-kubernetes.js

21442 lines
3.2 MiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/// <reference path="../libs/hawtio-forms/defs.d.ts"/>
/// <reference path="../libs/hawtio-kubernetes-api/defs.d.ts"/>
/// <reference path="../libs/hawtio-oauth/defs.d.ts"/>
/// <reference path="../libs/hawtio-ui/defs.d.ts"/>
/// <reference path="../libs/hawtio-utilities/defs.d.ts"/>
/// <reference path="../../includes.ts"/>
var Configs;
(function (Configs) {
Configs.pluginName = "Configs";
Configs.context = "/config";
Configs.pluginPath = 'plugins/configs/';
Configs.templatePath = Configs.pluginPath + 'html/';
Configs._module = angular.module(Configs.pluginName, ['hawtio-core', 'hawtio-ui', 'ui.codemirror', 'nvd3', 'ngTable', 'ngDialog']);
Configs.route = PluginHelpers.createRoutingFunction(Configs.templatePath);
Configs.controller = PluginHelpers.createControllerFunction(Configs._module, Configs.pluginName);
Configs._module.config(['$provide', '$routeProvider', function ($provide, $routeProvider) {
$routeProvider.when(UrlHelpers.join(Configs.context, 'gluster-fs/setting'), Configs.route('glusterfsSetting.html', false))
.when(UrlHelpers.join(Configs.context, 'kube-cluster/setting'), Configs.route('kubeClusterSetting.html', false))
.when(Configs.context, { redirectTo: UrlHelpers.join(Configs.context, '/kube-cluster/setting') });
}]);
Configs._module.run(['viewRegistry', '$templateCache', 'HawtioExtension', '$compile', function (viewRegistry, $templateCache, ext, $compile) {
ext.add('config-setting', function ($scope) {
var template = $templateCache.get(UrlHelpers.join(Configs.templatePath, "configMenuItem.html"));
return $compile(template)($scope);
});
viewRegistry['config'] = Configs.templatePath + "shareLayout.html";
}]);
Configs._module.directive('gfsConfigTable', [function () {
return {
restrict: 'AE',
replace: true,
scope: {
tableTitle: '=',
tableContent: '='
},
template: "<table class=\"table table-hover\">\n <tr>\n <th ng-repeat=\"column in tableTitle.column\" class=\"no-fade table-header\">\n \t<span class=\"{{column.class}}\">{{column.title}}</span>\n </th> \n </tr>\n <tr ng-repeat = \"row in tableContent\" class=\"row.class\">\n \t<td ng-repeat=\"col in row\" class=\"col.class\">\n \t\t<span class=\"col.class\">{{col.title}}</span>\n \t</td>\n </tr> \n </table> \n ",
link: function (scope, element, attr) {
}
};
}]);
hawtioPluginLoader.addModule(Configs.pluginName);
})(Configs || (Configs = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="configPlugin.ts"/>
var Configs;
(function (Configs) {
//字节大小转换成字符大小
function getStringSize(size) {
var result = size;
var suffix = ["B", "KB", "MB", "GB", "TB", "PB"];
var count = 1;
while (result >= 1024) {
result = result / 1024;
count++;
}
return result.toFixed(2) + suffix[count];
}
function formatVolume(volume) {
volume["formatTotalSize"] = getStringSize(volume.allSize);
volume["formatUsedSize"] = getStringSize(volume.usedSize);
volume["editable"] = false;
angular.forEach(volume.brick, function (brock) {
brock["formatUsedSize"] = getStringSize(brock.usedSize);
brock["formatAllSize"] = getStringSize(brock.availableSize);
brock["editable"] = false;
});
}
function formatVolumes(volumes) {
angular.forEach(volumes, function (volume) {
formatVolume(volume);
});
}
Configs.formatVolumes = formatVolumes;
function IsBrockEquals(brock1, brock2) {
return brock1.ip == brock2.ip && brock1.path == brock2.path;
}
/**
刪除volume中指定的brock
*/
function deleteBrock(volume, brock) {
for (var i = 0; i < volume.brick.length; i++) {
var brick = volume.brick[i];
if (IsBrockEquals(brick, brock)) {
volume.brick.splice(i, 1);
break;
}
}
}
Configs.deleteBrock = deleteBrock;
/**
volume添加brock
*/
function addBrock(volume, brock) {
if (brock != null && brock != undefined)
volume.brick.push(brock);
}
Configs.addBrock = addBrock;
var ConfigsModelService = (function () {
function ConfigsModelService() {
this.cluster = [];
this.oracleParam = [];
this.systemInfo = [];
this.regionalismInfo = [];
this.updateAllData();
}
ConfigsModelService.prototype.updateAllData = function () {
this.updateVolumeData();
this.updateOracleParam();
//this.updateCodeInfo();
};
ConfigsModelService.prototype.updateVolumeData = function () {
var result = null;
$.ajax({
async: false,
type: "POST",
url: "/java/console/api/volume/list",
success: function (data) {
if (data) {
result = data;
}
}
});
this.cluster = JSON.parse(result);
formatVolumes(this.cluster);
};
/*public updateCodeInfo(){
var result=null;
$.ajax({
async: false,
type : "POST",
url : "/java/console/api/code/list",
success : function(data) {
if(data){
result = data;
}
}
});
this.regionalismInfo = result.regionalism;
this.systemInfo = result.system;
}*/
ConfigsModelService.prototype.updateOracleParam = function () {
var result = null;
$.ajax({
async: false,
type: "POST",
url: "/java/console/api/oracle/list",
success: function (data) {
if (data) {
result = data;
}
}
});
this.oracleParam = result;
};
ConfigsModelService.prototype.getFolderByVolumeName = function (name) {
if (this.cluster === null)
return null;
for (var i = 0; i < this.cluster.length; i++) {
if (this.cluster[i].name === name)
return this.cluster[i].folder;
}
};
return ConfigsModelService;
}());
Configs.ConfigsModelService = ConfigsModelService;
Configs._module.factory('ConfigsModel', ['$rootScope', '$http', '$location', '$resource', function ($rootScope, $http, $location, $resource) {
var $scope = new ConfigsModelService();
return $scope;
}]);
})(Configs || (Configs = {}));
/// <reference path="../../includes.ts"/>
var Developer;
(function (Developer) {
var log = Logger.get('developer-navigation');
function developBreadcrumb() {
return {
href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces"),
label: "Teams",
title: "View all the available teams",
isActive: function (subTab, path) { return false; }
};
}
function operateBreadcrumb() {
return {
href: UrlHelpers.join(HawtioCore.documentBase(), "/namespaces"),
label: "Manage",
title: "Manage the projects and resources inside them"
};
}
function workspaceLink() {
return UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", Kubernetes.currentKubernetesNamespace());
}
Developer.workspaceLink = workspaceLink;
function projectLink(projectId) {
var link = workspaceLink();
if (projectId) {
return UrlHelpers.join(link, "/projects", projectId);
}
else {
return link;
}
}
Developer.projectLink = projectLink;
function createWorkspacesBreadcrumbs(developPerspective) {
return [developBreadcrumb()];
}
Developer.createWorkspacesBreadcrumbs = createWorkspacesBreadcrumbs;
function createWorkspacesSubNavBars(developPerspective) {
return activateCurrent([
developBreadcrumb(),
operateBreadcrumb()
]);
}
Developer.createWorkspacesSubNavBars = createWorkspacesSubNavBars;
function createWorkspaceBreadcrumbs(children, workspaceName) {
if (children === void 0) { children = null; }
if (workspaceName === void 0) { workspaceName = null; }
var answer = createWorkspacesBreadcrumbs(true);
if (!workspaceName) {
workspaceName = Kubernetes.currentKubernetesNamespace();
}
if (workspaceName) {
answer.push({
href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces/", workspaceName),
label: workspaceName,
title: "View the project: " + workspaceName,
isActive: function (subTab, path) { return false; }
});
return processChildren(answer, children);
}
return answer;
}
Developer.createWorkspaceBreadcrumbs = createWorkspaceBreadcrumbs;
function createEnvironmentBreadcrumbs($scope, $location, $routeParams) {
var ns = Kubernetes.currentKubernetesNamespace();
var namespacesLink = UrlHelpers.join(HawtioCore.documentBase(), "/kubernetes/namespace");
var workspaceName = $routeParams.workspace;
var project = $routeParams.project;
var environment = $routeParams.namespace;
if (workspaceName && project) {
var projectLink = UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects", project);
$scope.$projectLink = projectLink;
$scope.$projectNamespaceLink = UrlHelpers.join(projectLink, "namespace", ns);
namespacesLink = UrlHelpers.join(projectLink, "namespace");
var children = [
{
href: UrlHelpers.join(projectLink, "environments"),
label: "Environments",
title: "View the environments for this project"
},
{
href: UrlHelpers.join(namespacesLink, ns, "apps"),
label: function () { return environmentName(workspaceName, ns); },
title: "View the runtime of the workspace: " + ns
}
];
return createProjectBreadcrumbs(project, children, workspaceName);
}
else if (workspaceName && environment && workspaceName != environment) {
// find label for namespace environment
var children = [
{
href: environmentsLink(workspaceName),
label: "Environments",
title: "View the environments for this project"
},
{
href: environmentLink(workspaceName, environment),
label: function () { return environmentName(workspaceName, environment); },
title: "View this environment"
}
];
return createProjectBreadcrumbs(project, children, workspaceName);
}
else if (!workspaceName) {
workspaceName = Kubernetes.currentKubernetesNamespace();
}
var answer = createWorkspaceBreadcrumbs(workspaceName);
answer.push({
href: UrlHelpers.join(HawtioCore.documentBase(), "workspaces", workspaceName, "namespace", ns, "apps"),
label: 'Runtime',
title: "View the runtime of the workspace: " + ns
});
return activateCurrent(answer);
}
Developer.createEnvironmentBreadcrumbs = createEnvironmentBreadcrumbs;
/**
* Returns the name of the given environment namespace
*/
function environmentName(workspaceName, environment) {
/*var model = Kubernetes.getKubernetesModel();
if (model) {
return model.environmentName(workspaceName, environment);
}*/
return environment;
}
function createProjectBreadcrumbs(projectName, children, workspaceName) {
if (projectName === void 0) { projectName = null; }
if (children === void 0) { children = null; }
if (workspaceName === void 0) { workspaceName = null; }
if (!workspaceName) {
workspaceName = Kubernetes.currentKubernetesNamespace();
}
var answer = createWorkspaceBreadcrumbs(null, workspaceName);
if (workspaceName) {
if (projectName) {
answer.push({
href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects"),
label: "Apps",
title: "View all the apps in this project"
});
answer.push({
href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects", projectName),
label: projectName,
title: "View the project: " + projectName
});
}
return processChildren(answer, children);
}
return answer;
}
Developer.createProjectBreadcrumbs = createProjectBreadcrumbs;
function createProjectSettingsBreadcrumbs(projectName, workspaceName) {
if (workspaceName === void 0) { workspaceName = null; }
var children = [];
if (!projectName) {
children = [{
label: "New App",
title: "Lets make a new app"
}];
}
return createProjectBreadcrumbs(projectName, children, workspaceName);
}
Developer.createProjectSettingsBreadcrumbs = createProjectSettingsBreadcrumbs;
function createWorkspaceSubNavBars() {
var workspaceName = Kubernetes.currentKubernetesNamespace();
return activateCurrent([
{
href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName),
label: "Dashboard",
class: "fa fa-tachometer",
title: "View the dashboard for the apps, environments and pipelines in this project"
},
{
href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "apps"),
label: "Apps",
class: "fa fa-rocket",
title: "View the apps in this project"
},
{
isValid: function () { return Developer.jenkinsLink(); },
href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "jenkinsJob"),
label: "Builds",
class: "fa fa-code",
title: "View the builds in this project"
},
{
href: environmentsLink(),
label: "Environments",
class: "fa fa-cubes",
title: "View the environments for this project"
},
{
href: namespaceRuntimeLink(workspaceName),
label: "Runtime",
class: "fa fa-cube",
title: "View the Runtime perspective for this project"
}
]);
}
Developer.createWorkspaceSubNavBars = createWorkspaceSubNavBars;
function namespaceRuntimeLink(workspaceName) {
if (workspaceName === void 0) { workspaceName = null; }
if (!workspaceName) {
workspaceName = Kubernetes.currentKubernetesNamespace();
}
return UrlHelpers.join(HawtioCore.documentBase(), "workspaces", workspaceName, "namespace", workspaceName, "apps");
}
Developer.namespaceRuntimeLink = namespaceRuntimeLink;
function createBuildsLink(workspaceName, projectName, jenkinsJobId) {
workspaceName = workspaceName || Kubernetes.currentKubernetesNamespace();
return UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects", projectName, "jenkinsJob", jenkinsJobId);
}
/**
* Creates a routing function that loads a template and inject the needed directives to properly
* display/update the Developer module managed tabs and bread crumbs for when the route is active.
*
* Example Usage:
*
* var route = Developer.createTabRoutingFunction("/app/somedir");
* $routeProvider.when('/profiles', route('view.html', false, [{
* label: "Profiles",
* title: "Browse the profiles of this project"
* }]
* ));
*
* @param baseURL
* @returns {function(string, boolean=, Array<Developer.BreadcrumbConfig>=): {template: string, reloadOnSearch: boolean, controller: string|string|(function(any, ng.route.IRouteParamsService): undefined)[]}}
*/
function createTabRoutingFunction(baseURL) {
return function (templateName, reloadOnSearch, children) {
if (reloadOnSearch === void 0) { reloadOnSearch = true; }
return {
template: "<div hawtio-breadcrumbs></div><div hawtio-tabs></div><ng-include src='contentTemplateUrl'></ng-include>",
reloadOnSearch: reloadOnSearch,
controller: ["$scope", "$routeParams", function ($scope, $routeParams) {
if ($routeParams["namespace"] == null) {
log.error("The :namespace route parameter was not defined for the route.");
}
if ($routeParams["projectId"] == null) {
log.error("The :projectId route parameter was not defined for the route.");
}
$scope.namespace = $routeParams["namespace"];
$scope.projectId = $routeParams["projectId"];
$scope.contentTemplateUrl = UrlHelpers.join(baseURL, templateName);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.projectId, children);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.projectId);
}]
};
};
}
Developer.createTabRoutingFunction = createTabRoutingFunction;
function createProjectSubNavBars(projectName, jenkinsJobId, $scope) {
if (jenkinsJobId === void 0) { jenkinsJobId = null; }
if ($scope === void 0) { $scope = null; }
var workspaceName = Kubernetes.currentKubernetesNamespace();
var projectLink = UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects", projectName);
var buildsLink = UrlHelpers.join(projectLink, "builds");
if (!jenkinsJobId) {
jenkinsJobId = projectName;
}
var jenkinsBuildLink = null;
var pipelinesLink = null;
if (projectName && jenkinsJobId) {
jenkinsBuildLink = createBuildsLink(workspaceName, projectName, jenkinsJobId);
pipelinesLink = UrlHelpers.join(jenkinsBuildLink, "pipelines");
}
function isJenkinsBuild() {
var answer = Developer.jenkinsLink() && jenkinsBuildLink;
if (answer && $scope) {
var entity = Developer.projectForScope($scope);
if (entity) {
return answer && entity.$jenkinsJob;
}
}
return answer;
}
var answer = [
/*
{
href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName),
label: "All Apps",
class: 'fa fa-angle-double-left',
title: "View the apps in this project"
},
{
template: `<div ng-include="'plugins/developer/html/projectSelector.html'"></div>`
},
*/
{
href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects", projectName, "environments"),
isActive: function (subTab, path) {
var href = normalizeHref(subTab.href);
//console.log("subTab: ", subTab, " path: ", path);
if (path === href) {
return true;
}
var rootPath = href.replace(/\/environments/, '');
if (path === rootPath) {
return true;
}
return false;
},
//href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects", projectName),
label: "Dashboard",
class: "fa fa-tachometer",
title: "View the app dashboard for the activity, environments and pipelines"
},
{
isValid: function () { return isJenkinsBuild() && pipelinesLink; },
id: "pipelines",
href: pipelinesLink,
label: "Pipelines",
class: "fa fa-ellipsis-h",
title: "View the pipeline builds for this app"
},
{
isValid: function () { return !isJenkinsBuild(); },
href: buildsLink,
label: "Builds",
class: "fa fa-bars",
title: "View the builds for this app"
},
{
isValid: function () { return isJenkinsBuild(); },
isActive: function (item, path) {
if (path.indexOf('/log/') > 0) {
return false;
}
if (path.indexOf('/jenkinsJob/') > 0) {
return true;
}
return false;
},
id: "builds",
href: jenkinsBuildLink,
label: "Builds",
class: "fa fa-bars",
title: "View the Jenkins builds for this app"
},
{
isValid: function () { return isJenkinsBuild(); },
href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects", projectName, "jenkinsJob", jenkinsJobId, "metrics"),
label: "Metrics",
class: "fa fa-bar-chart",
title: "View the metrics for this project"
},
/*
{
href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects", projectName, "tools"),
label: "Tools",
title: "View the tools for this project"
},
*/
{
href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects", projectName, "buildConfigEdit"),
label: "Settings",
class: "fa fa-cog",
title: "View the app configuration",
isActive: function (subTab, path) {
if (_.endsWith(path, '/buildConfigEdit')) {
return true;
}
if (_.endsWith(path, '/forge/secrets')) {
return true;
}
if (_.endsWith(path, '/forge/command/devops-edit')) {
return true;
}
return false;
}
}
];
var context = {
workspaceName: workspaceName,
projectName: projectName,
projectLink: projectLink,
jenkinsJobId: jenkinsJobId,
$scope: $scope
};
angular.forEach(Developer.customProjectSubTabFactories, function (fn) {
if (angular.isFunction(fn)) {
var subtab = fn(context);
if (subtab) {
if (angular.isArray(subtab)) {
angular.forEach(subtab, function (t) {
answer.push(t);
});
}
else {
answer.push(subtab);
}
}
}
});
return activateCurrent(answer);
}
Developer.createProjectSubNavBars = createProjectSubNavBars;
function createProjectSettingsSubNavBars(projectName, jenkinsJobId) {
if (jenkinsJobId === void 0) { jenkinsJobId = null; }
if (!projectName) {
return [];
}
var workspaceName = Kubernetes.currentKubernetesNamespace();
var projectLink = UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects", projectName);
if (!jenkinsJobId) {
jenkinsJobId = projectName;
}
var answer = [
{
href: UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects", projectName, "buildConfigEdit"),
label: "Core",
title: "View the core build configuration"
},
{
href: projectSecretsLink(workspaceName, projectName),
label: "Secrets",
title: "View or change the secrets used to edit source code in the source control system"
},
{
href: editPipelineLink(workspaceName, projectName),
label: "Pipeline",
title: "View the DevOps and pipeline configuration"
},
{
isValid: function () { return forgeProjectHasBuilder("maven"); },
href: editMavenBuildLink(workspaceName, projectName),
label: "Maven",
title: "View the Maven build configuration"
}
];
return activateCurrent(answer);
}
Developer.createProjectSettingsSubNavBars = createProjectSettingsSubNavBars;
function forgeProjectHasBuilder(name) {
var forgeProject = Kubernetes.inject("ForgeProject");
if (forgeProject) {
return forgeProject.hasBuilder(name);
}
return false;
}
Developer.forgeProjectHasBuilder = forgeProjectHasBuilder;
function forgeProjectHasPerspective(name) {
var forgeProject = Kubernetes.inject("ForgeProject");
if (forgeProject) {
return forgeProject.hasPerspective(name);
}
return false;
}
Developer.forgeProjectHasPerspective = forgeProjectHasPerspective;
function editPipelineLinkScope($scope) {
return editPipelineLink($scope.namespace, $scope.projectId || $scope.projectName || $scope.project);
}
Developer.editPipelineLinkScope = editPipelineLinkScope;
function createProjectLink(workspaceName) {
if (workspaceName === void 0) { workspaceName = null; }
if (!workspaceName) {
workspaceName = Kubernetes.currentKubernetesNamespace();
}
return UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "/forge/createProject");
}
Developer.createProjectLink = createProjectLink;
function editPipelineLink(workspaceName, projectName) {
return projectWorkspaceLink(workspaceName, projectName, "forge/command/devops-edit");
}
Developer.editPipelineLink = editPipelineLink;
function editMavenBuildLink(workspaceName, projectName) {
return projectWorkspaceLink(workspaceName, projectName, "forge/command/fabric8-setup");
}
Developer.editMavenBuildLink = editMavenBuildLink;
function projectSecretsLink(workspaceName, projectName) {
return projectWorkspaceLink(workspaceName, projectName, "forge/secrets", false);
}
Developer.projectSecretsLink = projectSecretsLink;
function secretsNamespaceLink(workspaceName, projectName, secretsNamespace) {
var prefix = projectWorkspaceLink(workspaceName, projectName, "") || "kubernetes";
return UrlHelpers.join(prefix, "namespace", secretsNamespace, "secrets");
}
Developer.secretsNamespaceLink = secretsNamespaceLink;
function projectWorkspaceLink(workspaceName, projectName, path, ignoreBlankProject) {
if (ignoreBlankProject === void 0) { ignoreBlankProject = true; }
if (ignoreBlankProject && !projectName) {
return "";
}
if (!workspaceName) {
workspaceName = Kubernetes.currentKubernetesNamespace();
}
return UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects", projectName, path);
}
Developer.projectWorkspaceLink = projectWorkspaceLink;
function environmentsLink(workspaceName) {
if (workspaceName === void 0) { workspaceName = null; }
if (!workspaceName) {
workspaceName = Kubernetes.currentKubernetesNamespace();
}
return UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "environments");
}
Developer.environmentsLink = environmentsLink;
function environmentLink(workspaceName, environmentNamespace, path, ignoreBlankProject) {
if (path === void 0) { path = ""; }
if (ignoreBlankProject === void 0) { ignoreBlankProject = true; }
if (ignoreBlankProject && !environmentNamespace) {
return "";
}
if (!workspaceName) {
workspaceName = Kubernetes.currentKubernetesNamespace();
}
return UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "namespace", environmentNamespace, path);
}
Developer.environmentLink = environmentLink;
Developer.customProjectSubTabFactories = [];
function createJenkinsBreadcrumbs(projectName, jobId, buildId) {
var workspaceName = Kubernetes.currentKubernetesNamespace();
var children = [
{
id: "builds",
href: createBuildsLink(workspaceName, projectName, jobId),
label: "Builds",
title: "View the builds for this app"
}
];
if (buildId) {
children.push({
id: "",
href: "",
label: "#" + buildId,
title: "Build #" + buildId
});
}
return createProjectBreadcrumbs(projectName, children);
}
Developer.createJenkinsBreadcrumbs = createJenkinsBreadcrumbs;
function createJenkinsSubNavBars(projectName, jenkinsJobId, buildId, extraOption) {
if (extraOption === void 0) { extraOption = null; }
var answer = createProjectSubNavBars(projectName, jenkinsJobId);
if (extraOption) {
// extraOption.active = true;
answer.push(extraOption);
}
return answer;
}
Developer.createJenkinsSubNavBars = createJenkinsSubNavBars;
function createEnvironmentSubNavBars($scope, $location, $routeParams) {
var ns = Kubernetes.currentKubernetesNamespace();
var workspaceName = $routeParams.workspace;
var project = $routeParams.project;
var environment = $routeParams.namespace;
var projectLink = UrlHelpers.join(HawtioCore.documentBase(), "/kubernetes");
/*console.log("=====================")
console.log(projectLink);
if (workspaceName && project) {
projectLink = UrlHelpers.join(HawtioCore.documentBase(), "/kubernetes", workspaceName, "projects", project);
} else {
projectLink = UrlHelpers.join(HawtioCore.documentBase(), "/kubernetes", workspaceName || ns);
}*/
var namespacesLink = UrlHelpers.join(projectLink, "namespace");
return activateCurrent([
{
href: UrlHelpers.join(namespacesLink, ns, "replicationControllers"),
label: "服务管理",
class: "fa fa-clone",
title: "View the Replicas for this project"
},
]);
}
Developer.createEnvironmentSubNavBars = createEnvironmentSubNavBars;
function environmentInstanceLink(env, projectName) {
if (projectName === void 0) { projectName = null; }
if (env) {
var envNamespace = env["namespace"];
if (envNamespace) {
if (projectName) {
return UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", Kubernetes.currentKubernetesNamespace(), "projects", projectName, "namespace", envNamespace);
}
else {
return UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", Kubernetes.currentKubernetesNamespace(), "namespace", envNamespace);
}
}
}
return "";
}
Developer.environmentInstanceLink = environmentInstanceLink;
function namespaceLink($scope, $routeParams, path) {
if (path === void 0) { path = null; }
var ns = Kubernetes.currentKubernetesNamespace();
var workspaceName = $routeParams.workspace;
var project = $routeParams.project;
var projectLink = UrlHelpers.join(HawtioCore.documentBase(), "/kubernetes");
if (workspaceName && project) {
projectLink = UrlHelpers.join(HawtioCore.documentBase(), "/workspaces", workspaceName, "projects", project);
}
return UrlHelpers.join(projectLink, "namespace", ns, path);
}
Developer.namespaceLink = namespaceLink;
/**
* Removes the URL query string if its inside the given text
*/
function trimQuery(text) {
if (text) {
var idx = text.indexOf("?");
if (idx >= 0) {
return text.substring(0, idx);
}
}
return text;
}
// Cater for the app running at some weird document base
function normalizeHref(href) {
if (!href) {
return null;
}
var regex = new RegExp('^' + HawtioCore.documentBase().replace('/', '\\/'));
return href.replace(regex, '/');
}
Developer.normalizeHref = normalizeHref;
function activateCurrent(navBarItems) {
navBarItems = _.compact(navBarItems);
var injector = HawtioCore.injector;
var $location = injector ? injector.get("$location") : null;
if ($location) {
var path = normalizeHref(trimQuery($location.path()));
var found = false;
function makeActive(item) {
item.active = true;
found = true;
}
function getHref(item) {
var href = item.href;
var trimHref = trimQuery(href);
return normalizeHref(trimHref);
}
angular.forEach(navBarItems, function (item) {
if (!found && item) {
if (angular.isFunction(item.isActive)) {
if (item.isActive(item, path)) {
makeActive(item);
}
}
else {
var trimHref = getHref(item);
if (!trimHref) {
return;
}
if (trimHref === path) {
makeActive(item);
}
}
}
});
// Maybe it's a sub-item of a tab, let's fall back to that maybe
if (!found) {
angular.forEach(navBarItems, function (item) {
if (!found) {
if (!angular.isFunction(item.isActive)) {
var trimHref = getHref(item);
if (!trimHref) {
return;
}
if (_.startsWith(path, trimHref)) {
makeActive(item);
}
}
}
});
}
// still not found, let's log it
if (!found) {
log.debug("No navigation tab found for path:", path);
}
}
return navBarItems;
}
Developer.activateCurrent = activateCurrent;
function processChildren(answer, children) {
if (children) {
if (angular.isArray(children)) {
answer = answer.concat(children);
}
else {
answer.push(children);
}
}
activateCurrent(answer);
return answer;
}
})(Developer || (Developer = {}));
var Kubernetes;
(function (Kubernetes) {
var consts = (function () {
function consts() {
}
Object.defineProperty(consts.prototype, "NAMESPACE_STORAGE_KEY", {
get: function () { return "k8sSelectedNamespace"; },
enumerable: true,
configurable: true
});
return consts;
}());
Kubernetes.consts = consts;
Kubernetes.Constants = new consts();
var WatchTypes = (function () {
function WatchTypes() {
}
Object.defineProperty(WatchTypes, "ENDPOINTS", {
get: function () { return "endpoints"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "EVENTS", {
get: function () { return "events"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "NAMESPACES", {
get: function () { return "namespaces"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "NODES", {
get: function () { return "nodes"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "PERSISTENT_VOLUMES", {
get: function () { return "persistentvolumes"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "PERSISTENT_VOLUME_CLAIMS", {
get: function () { return "persistentvolumeclaims"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "PODS", {
get: function () { return "pods"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "REPLICATION_CONTROLLERS", {
get: function () { return "replicationcontrollers"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "RESOURCE_QUOTAS", {
get: function () { return "resourcequotas"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "OAUTH_CLIENTS", {
get: function () { return "oauthclients"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "SECRETS", {
get: function () { return "secrets"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "SERVICES", {
get: function () { return "services"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "SERVICE_ACCOUNTS", {
get: function () { return "serviceaccounts"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "TEMPLATES", {
get: function () { return "templates"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "ROUTES", {
get: function () { return "routes"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "BUILD_CONFIGS", {
get: function () { return "buildconfigs"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "BUILDS", {
get: function () { return "builds"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "DEPLOYMENT_CONFIGS", {
get: function () { return "deploymentconfigs"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "IMAGE_STREAMS", {
get: function () { return "imagestreams"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "POLICIES", {
get: function () { return "policies"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "POLICY_BINDINGS", {
get: function () { return "policybindings"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "PROJECTS", {
get: function () { return "projects"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "ROLE_BINDINGS", {
get: function () { return "rolebindings"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchTypes, "ROLES", {
get: function () { return "roles"; },
enumerable: true,
configurable: true
});
return WatchTypes;
}());
Kubernetes.WatchTypes = WatchTypes;
var NamespacedTypes = (function () {
function NamespacedTypes() {
}
Object.defineProperty(NamespacedTypes, "k8sTypes", {
get: function () {
return [
WatchTypes.ENDPOINTS,
WatchTypes.EVENTS,
WatchTypes.NODES,
WatchTypes.PERSISTENT_VOLUMES,
WatchTypes.PERSISTENT_VOLUME_CLAIMS,
WatchTypes.PODS,
WatchTypes.REPLICATION_CONTROLLERS,
WatchTypes.RESOURCE_QUOTAS,
WatchTypes.PERSISTENT_VOLUMES,
WatchTypes.SECRETS,
WatchTypes.SERVICES,
WatchTypes.SERVICE_ACCOUNTS
];
},
enumerable: true,
configurable: true
});
Object.defineProperty(NamespacedTypes, "osTypes", {
get: function () {
return [
WatchTypes.TEMPLATES,
WatchTypes.BUILD_CONFIGS,
WatchTypes.ROUTES,
WatchTypes.BUILDS,
WatchTypes.BUILD_CONFIGS,
WatchTypes.DEPLOYMENT_CONFIGS,
WatchTypes.IMAGE_STREAMS,
WatchTypes.OAUTH_CLIENTS,
WatchTypes.POLICIES,
WatchTypes.POLICY_BINDINGS,
WatchTypes.PROJECTS,
];
},
enumerable: true,
configurable: true
});
return NamespacedTypes;
}());
Kubernetes.NamespacedTypes = NamespacedTypes;
var WatchActions = (function () {
function WatchActions() {
}
Object.defineProperty(WatchActions, "ANY", {
get: function () { return "*"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchActions, "ADDED", {
get: function () { return "ADDED"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchActions, "MODIFIED", {
get: function () { return "MODIFIED"; },
enumerable: true,
configurable: true
});
Object.defineProperty(WatchActions, "DELETED", {
get: function () { return "DELETED"; },
enumerable: true,
configurable: true
});
return WatchActions;
}());
Kubernetes.WatchActions = WatchActions;
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="./kubernetesHelpers.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.hostPorts = [];
/**
* Sorts the the ip field
*
* @param ip the ip such as '10.1.2.13'
* @returns {any}
*/
function sortByPodIp(ip) {
// i guess there is maybe nicer ways of sort this without parsing and slicing
var regex = /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/;
var groups = regex.exec(ip);
if (angular.isDefined(groups)) {
var g1 = ("00" + groups[1]).slice(-3);
var g2 = ("00" + groups[2]).slice(-3);
var g3 = ("00" + groups[3]).slice(-3);
var g4 = ("00" + groups[4]).slice(-3);
var answer = g1 + g2 + g3 + g4;
return answer;
}
else {
return 0;
}
}
Kubernetes.sortByPodIp = sortByPodIp;
function ramdomPort() {
var hostPort = Math.floor(30000 + Math.random() * (65535 - 30000));
while (Kubernetes.hostPorts.indexOf(hostPort) === 0) {
hostPort = Math.floor(30000 + Math.random() * (65535 - 30000));
}
Kubernetes.hostPorts.push(hostPort);
return hostPort;
}
Kubernetes.ramdomPort = ramdomPort;
function getRandomString(len) {
len = len || 32;
var $chars = 'abcdefhijkmnprstwxyz'; // 默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1
var maxPos = $chars.length;
var pwd = '';
for (var i = 0; i < len; i++) {
pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
}
return pwd;
}
Kubernetes.getRandomString = getRandomString;
var resourceRCTemplate = (function () {
function resourceRCTemplate() {
this.image = "oracle:utf8";
this.names = ["oradata"];
}
resourceRCTemplate.prototype.createRC = function (Obj) {
var labels = {
"style": "oracle",
"status": "0",
"isExtract": Obj.isExtract + "" || "0",
"isTarget": Obj.isTarget
};
for (var item in Obj.labels)
labels[item] = Obj.labels[item];
return {
"apiVersion": Kubernetes.defaultApiVersion,
"kind": "ReplicationController",
"metadata": {
"name": Obj.name,
"labels": labels,
"annotations": Obj.annotations
},
"spec": {
replicas: Obj.replicas || 1,
"template": this.createTemplate(Obj)
}
};
};
resourceRCTemplate.prototype.createVolumeMounts = function () {
var volumeMounts = [];
for (var item in this.names) {
if (this.names[item] === 'flash-recovery-area')
volumeMounts.push({
"name": this.names[item],
"mountPath": "/opt/oracle/app/flash_recovery_area"
});
else
volumeMounts.push({
"name": this.names[item],
"mountPath": "/opt/oracle/app/" + this.names[item]
});
}
return volumeMounts;
};
resourceRCTemplate.prototype.createVolumes = function (rootPath) {
var volumes = [];
for (var item in this.names) {
if (this.names[item] === 'flash-recovery-area')
volumes.push({
"name": this.names[item],
"hostPath": {
"path": rootPath + "flash_recovery_area"
}
});
else
volumes.push({
"name": this.names[item],
"hostPath": {
"path": rootPath + this.names[item]
}
});
}
return volumes;
};
resourceRCTemplate.prototype.createContainers = function (Obj) {
var containers = [];
containers.push({
"name": "oracle",
"image": this.image,
"imagePullPolicy": "IfNotPresent",
"command": ["/assets/entrypoint.sh"],
"ports": [
{
"containerPort": 1521,
"hostPort": Obj.port || ramdomPort()
}],
"volumeMounts": this.createVolumeMounts()
});
return containers;
};
resourceRCTemplate.prototype.createTemplate = function (Obj) {
return {
"metadata": {
//"name": Obj.name,
"labels": Obj.labels
},
"spec": {
"terminationGracePeriodSeconds": 0,
"containers": this.createContainers(Obj),
"volumes": this.createVolumes(Obj.path)
}
};
};
return resourceRCTemplate;
}());
Kubernetes.resourceRCTemplate = resourceRCTemplate;
function labelToChinese(labels) {
var answer = {};
angular.forEach(labels, function (value, key) {
answer[key] = labelChangeToChines(value, key);
});
return answer;
}
Kubernetes.labelToChinese = labelToChinese;
function findSameNameReplicationControllers(replicationControllers, name) {
var names = [];
replicationControllers.forEach(function (rc) {
var rcName = Kubernetes.getName(rc);
if (rcName.indexof(name) !== -1)
names.push(rcName);
});
if (names.length === 0) {
return name + "_1";
}
else {
var max = 0;
names.forEach(function (value) {
var answer = value.split("_");
var key = parseInt(answer[1]);
if (max < key)
max = key;
});
return name + (max + 1);
}
}
Kubernetes.findSameNameReplicationControllers = findSameNameReplicationControllers;
function isFilterRC(rc) {
var answer = false;
angular.forEach(Core.pathGet(rc, ["metadata", "labels"]), function (value, key) {
if (key === 'isTarget' && value === 'true') {
answer = true;
}
});
return answer;
}
Kubernetes.isFilterRC = isFilterRC;
function isInclude(rcs, rc) {
for (var i in rcs) {
if (Kubernetes.getName(rcs[i]) === Kubernetes.getName(rc))
return true;
}
return false;
}
Kubernetes.isInclude = isInclude;
function labelChangeToChines(value, key) {
var trueValue = '';
switch (key) {
case 'type':
if (value === '01')
trueValue = '财政';
else if (value === '02')
trueValue = '社保';
else
trueValue = value;
break;
case 'batch':
if (value === 'A')
trueValue = '批次A';
else if (value === 'B')
trueValue = '批次B';
else
trueValue = value;
break;
case 'region':
trueValue = Kubernetes.getCountyByCode(value);
break;
case 'system':
trueValue = Kubernetes.getSystemNameById(value);
break;
case 'version':
var reg = new RegExp('^[0-9]$').exec(value);
if (reg)
trueValue = '版本' + reg[0];
else
trueValue = value;
break;
case 'isTarget':
if (value === 'true')
trueValue = '汇总数据库';
else
trueValue = value;
break;
default:
trueValue = value;
}
return trueValue;
}
Kubernetes.labelChangeToChines = labelChangeToChines;
/*
检查迁移,是否有已启动的oracle
export function checkForMigration(replicationControllers:Array<KubePod>, selectItem:Array<any>){
var result = [];
angular.forEach(selectItem, (item) => {
if(checkForExit(replicationControllers, item))
result.push(item);
});
return result;
} */
function checkForExit(replicationControllers, selectItem) {
for (var index in replicationControllers) {
var replicas = replicationControllers[index];
if (Kubernetes.getName(replicas) == selectItem._key && getAnnotationValueBykey(replicas, "year") == selectItem["year"])
return true;
}
return false;
}
Kubernetes.checkForExit = checkForExit;
function getAnnotationValueBykey(replicationController, key) {
var annotations = Kubernetes.getAnnotations(replicationController);
if (annotations && annotations != undefined) {
return annotations[key];
}
}
/*
启动oracle时检查是否正在迁移
*/
function checkForCreateOracle(transferTasks, selectItems) {
var result = [];
angular.forEach(selectItems, function (item) {
if (checkForExitTask(transferTasks, item))
result.push(item);
});
return result;
}
Kubernetes.checkForCreateOracle = checkForCreateOracle;
function checkForExitTask(transferTasks, selectItem) {
for (var index in transferTasks) {
var task = transferTasks[index];
if (task["_key"] == selectItem["_key"] && selectItem["year"] == task.labels.dataYear) {
return true;
}
}
return false;
}
/**
**/
function checkForExtract(replicationControllers) {
var result = [];
angular.forEach(replicationControllers, function (replicas) {
var labels = Kubernetes.getLabels(replicas);
if (labels["isExtract"] == "1")
result.push(replicas);
});
return result;
}
Kubernetes.checkForExtract = checkForExtract;
function checkIsStartSuccess(replicationControllers) {
var result = [];
angular.forEach(replicationControllers, function (replicas) {
var labels = Kubernetes.getLabels(replicas);
if (labels["status"] != "2")
result.push(replicas);
});
return result;
}
Kubernetes.checkIsStartSuccess = checkIsStartSuccess;
;
/*
检查数据否已挂载使用或正在迁移。
*/
function checkForMigration(replicationControllers, transferTasks, selectItem) {
var message = "";
for (var index in selectItem) {
var item = selectItem[index];
/*
检查迁移文件是否已挂载使用
*/
for (var i in replicationControllers) {
var labels = Kubernetes.getLabels(replicationControllers[i]);
if (Kubernetes.getName(replicationControllers[i]) == item._key && getAnnotationValueBykey(replicationControllers[i], "year") == item["year"] && labels.version == item.labels.version) {
message = "数据正在使用";
return message;
}
}
/*
检查迁移文件是否正在迁移
*/
for (i in transferTasks) {
if (transferTasks[i]["_key"] == item["_key"] && (transferTasks[i]["status"] == "1" || transferTasks[i]["status"] == "0") && item["year"] == transferTasks[i].labels.dataYear && item.labels.version == transferTasks[i].labels.dataVersion) {
message = "数据正在迁移";
return message;
}
}
}
return message;
}
Kubernetes.checkForMigration = checkForMigration;
function eliminateChechBoxClick() {
var element = $("#tableConfig > thead > tr input:checkbox");
if (element.is(':checked'))
element.click();
}
Kubernetes.eliminateChechBoxClick = eliminateChechBoxClick;
/*
是否已存在当前
*/
function alreadyExitInFolder(selectedItems, selectNode) {
var childNodes = selectNode.childNodes;
for (var i in selectedItems) {
var itemName = selectedItems[i].regionalismCode + "_" + selectedItems[i].systemCode;
for (var j in childNodes) {
if (childNodes[j].name == itemName) {
var childrens = childNodes[j].childNodes;
for (var k in childrens)
if (childrens[k].name == selectedItems[i].dataVersion)
return true;
}
}
}
return false;
}
Kubernetes.alreadyExitInFolder = alreadyExitInFolder;
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
var Configs;
(function (Configs) {
function customAlert(title, content, func, cancel, focus, icon) {
/*
自定义 alert框
title :
text :
func :
cancel:
focus :
icon :
*/
icon = "../../../new/images/msgbox_" + icon + ".png";
create_mask();
var temp = "<div class=\"custom-alert\" >"
+ "<div class=\"custom-alert-title\">" + title + "</div>"
+ "<table class=\"custom-alert-body\"><tr><td class=\"custom-alert-td\"><img src=\""
+ icon + "\" class=\"custom-alert-img\"></td>"
+ "<td ><div calss=\"custom-alert-content\">"
+ content + "</div></td></tr></table>"
+ "<div class=\"custom-alert-bottom\"><input type='button' "
+ " class=\"custom-alert-ok\" value='确认' id=\"msgconfirmb\" onclick=\"Configs.remove();"
+ func + ";\">";
if (null != cancel) {
temp += "&nbsp;&nbsp;&nbsp;<input type='button' class=\"custom-alert-cancel\" onClick='Configs.remove()'>";
}
temp += "</div></div>";
create_msgbox(400, 200, temp);
if (focus == 0 || focus == "0" || null == focus) {
document.getElementById("msgconfirmb").focus();
}
else if (focus == 1 || focus == "1") {
document.getElementById("msgcancelb").focus();
}
}
Configs.customAlert = customAlert;
function get_width() {
return (document.body.clientWidth + document.body.scrollLeft);
}
function get_height() {
return (document.body.clientHeight + document.body.scrollTop);
}
function get_left(w) {
var bw = document.body.clientWidth;
var bh = document.body.clientHeight;
w = parseFloat(w);
return (bw / 2 - w / 2 + document.body.scrollLeft);
}
function get_top(h) {
var bw = document.body.clientWidth;
var bh = document.body.clientHeight;
h = parseFloat(h);
return (bh / 2 - h / 2 + document.body.scrollTop);
}
function create_mask() {
var mask = document.createElement("div");
mask.id = "mask";
mask.style.position = "absolute";
mask.style.filter = "progid:DXImageTransform.Microsoft.Alpha(style=4,opacity=25)";
mask.style.opacity = "0.4";
mask.style.background = "black";
mask.style.top = "0px";
mask.style.left = "0px";
mask.style.width = get_width() + "px";
mask.style.height = get_height() + "px";
mask.style.zIndex = "1000000000";
document.body.appendChild(mask);
}
Configs.create_mask = create_mask;
function create_msgbox(w, h, t) {
var box = document.createElement("div");
box.id = "msgbox";
box.style.position = "absolute";
box.style.width = w + "px";
box.style.height = h + "px";
box.style.overflow = "visible";
box.innerHTML = t;
box.style.zIndex = "1000000001";
document.body.appendChild(box);
re_pos();
}
function re_mask() {
var mask = document.getElementById("mask");
if (null == mask)
return;
mask.style.width = get_width() + "px";
mask.style.height = get_height() + "px";
}
function re_pos() {
var box = document.getElementById("msgbox");
if (null != box) {
var w = box.style.width;
var h = box.style.height;
box.style.left = get_left(w) + "px";
box.style.top = get_top(h) + "px";
}
}
function remove() {
var mask = document.getElementById("mask");
var msgbox = document.getElementById("msgbox");
if (null == mask && null == msgbox)
return;
document.body.removeChild(mask);
document.body.removeChild(msgbox);
}
Configs.remove = remove;
function re_show() {
re_pos();
re_mask();
}
function load_func() {
window.onresize = re_show;
window.onscroll = re_show;
}
})(Configs || (Configs = {}));
/*
read a object from jiangsu province , such as nanjing with some information
读取江苏的某个地区的信息,以及系统信息
*/
var Kubernetes;
(function (Kubernetes) {
Kubernetes.system_arr = [{ "sys_name": "部门预算", "sys_id": "1" }, { "sys_name": "非税收入收缴管理系统", "sys_id": "2" },
{ "sys_name": "预算执行系统", "sys_id": "3" }, { "sys_name": "资产管理系统", "sys_id": "4" }, { "sys_name": "用友财政综合管理信息系统", "sys_id": "5" },
{ "sys_name": "用友A++", "sys_id": "6" }, { "sys_name": "浦口财政一体化", "sys_id": "7" }, { "sys_name": "栖霞区财政业务信息管理系统", "sys_id": "8" },
{ "sys_name": "一体化系统", "sys_id": "9" }, { "sys_name": "财政管理一体化系统", "sys_id": "10" }, { "sys_name": "滨江开发区财政分局", "sys_id": "11" },
{ "sys_name": "江宁经济技术开发区财政分局", "sys_id": "12" }, { "sys_name": "江宁科学园财政分局", "sys_id": "13" }, { "sys_name": "财政一体化系统", "sys_id": "14" },
{ "sys_name": "A++财政一体化平台", "sys_id": "15" }, { "sys_name": "非税系统", "sys_id": "16" }, { "sys_name": "一体化预算执行系统", "sys_id": "17" },
{ "sys_name": "一体化", "sys_id": "18" }, { "sys_name": "国库集中支付管理信息系统", "sys_id": "19" }, { "sys_name": "国库集中支付", "sys_id": "20" },
{ "sys_name": "财政专户核算及非税系统", "sys_id": "21" }, { "sys_name": "集中支付系统", "sys_id": "22" }, { "sys_name": "财政专户核算系统", "sys_id": "23" },
{ "sys_name": "非税收缴系统", "sys_id": "24" }, { "sys_name": "财政一体化平台", "sys_id": "25" }, { "sys_name": "富深预算执行", "sys_id": "26" },
{ "sys_name": "用友非税及票据", "sys_id": "27" }, { "sys_name": "用友预算执行", "sys_id": "28" }, { "sys_name": "江苏省财政预算执行系统", "sys_id": "29" },
{ "sys_name": "用友通用软件", "sys_id": "30" }, { "sys_name": "联友软件/通用财务", "sys_id": "31" }, { "sys_name": "用友GRPG-U8R10财政管理软件", "sys_id": "32" },
{ "sys_name": "用友GPP-R10财政管理软件", "sys_id": "33" }, { "sys_name": "富深协通财政一体化管理信息系统", "sys_id": "34" }, { "sys_name": "财务统一核算系统", "sys_id": "35" },
{ "sys_name": "公共财政管理软件", "sys_id": "36" }, { "sys_name": "A++财政一体化信息平台", "sys_id": "37" }, { "sys_name": "新中大公共财务管理软件", "sys_id": "38" },
{ "sys_name": "富深财政一体化管理系统", "sys_id": "39" }, { "sys_name": "新中大公共财政管理系统", "sys_id": "40" }, { "sys_name": "富深协通财政一体化业务管理系统软件", "sys_id": "41" },
{ "sys_name": "新中大公共财政管理软件Gsoft", "sys_id": "42" }, { "sys_name": "财政一体化业务系统", "sys_id": "43" }, { "sys_name": "财政一体化软件", "sys_id": "44" },
{ "sys_name": "非税收入系统", "sys_id": "45" }, { "sys_name": "总预算系统", "sys_id": "46" }, { "sys_name": "国库集中支付系统", "sys_id": "47" }, { "sys_name": "用款计划系统", "sys_id": "48" },
{ "sys_name": "指标管理系统", "sys_id": "49" }, { "sys_name": "财政综合业务管理平台", "sys_id": "50" }, { "sys_name": "财政一体化管理信息系统", "sys_id": "51" }, { "sys_name": "工资统发", "sys_id": "52" },
{ "sys_name": "国有资产", "sys_id": "53" }, { "sys_name": "乡镇非税收入", "sys_id": "54" }, { "sys_name": "乡镇集中支付", "sys_id": "55" }, { "sys_name": "非税征缴系统", "sys_id": "56" },
{ "sys_name": "预算编制与执行系统", "sys_id": "57" }, { "sys_name": "预算管理综合业务平台", "sys_id": "58" }, { "sys_name": "u8管理软件", "sys_id": "59" }, { "sys_name": "财政指标管理系统", "sys_id": "60" },
{ "sys_name": "用友GRP-R9财务管理软件", "sys_id": "61" }, { "sys_name": "用友GRP-U8财政管理软件", "sys_id": "62" }, { "sys_name": "账务处理系统", "sys_id": "63" }, { "sys_name": "R9i财政管理软件", "sys_id": "64" },
{ "sys_name": "u8财政管理软件", "sys_id": "65" }, { "sys_name": "相城区财政综合管理信息系统", "sys_id": "66" }, { "sys_name": "财政非税综合管理系统", "sys_id": "67" }, { "sys_name": "财政综合管理平台", "sys_id": "68" },
{ "sys_name": "吴江区财政一体化", "sys_id": "69" }, { "sys_name": "用友R9", "sys_id": "70" }, { "sys_name": "财政公共应用服务平台", "sys_id": "71" }, { "sys_name": "金蝶K/3创新管理平台", "sys_id": "72" }, { "sys_name": "账务数据系统", "sys_id": "73" },
{ "sys_name": "公共财政服务平台", "sys_id": "74" }, { "sys_name": "会计核算系统", "sys_id": "75" }, { "sys_name": "项目库", "sys_id": "76" }, { "sys_name": "财政总预算(外)专户管理系统", "sys_id": "77" },
{ "sys_name": "城建资金专户管理系统", "sys_id": "78" }, { "sys_name": "农保专户管理系统", "sys_id": "79" }, { "sys_name": "农业发展基金专户管理系统", "sys_id": "80" },
{ "sys_name": "失地农民保障资金专户", "sys_id": "81" }, { "sys_name": "非税收入征管系统", "sys_id": "82" }, { "sys_name": "工资统发人员信息", "sys_id": "83" },
{ "sys_name": "预算指标-国库集中支付系统", "sys_id": "84" }, { "sys_name": "总预算会计核算系统", "sys_id": "85" }, { "sys_name": "部门预算编审系统", "sys_id": "86" },
{ "sys_name": "公务消费管理系统", "sys_id": "87" }, { "sys_name": "国有资产管理系统", "sys_id": "88" }, { "sys_name": "区镇财政管理“一体化”系统", "sys_id": "89" },
{ "sys_name": "县本级财政管理“一体化”系统", "sys_id": "90" }, { "sys_name": "用友政务", "sys_id": "91" }, { "sys_name": "财政专户核算(行政口专项资金)", "sys_id": "92" },
{ "sys_name": "财政专户核算(经建口专项资金)", "sys_id": "93" }, { "sys_name": "财政专户核算(农业保险专账)", "sys_id": "94" }, { "sys_name": "财政专户核算(农业综合开发专账)", "sys_id": "95" },
{ "sys_name": "财政专户核算(社保资金专账)", "sys_id": "96" }, { "sys_name": "财政专户核算(土地出让专账)", "sys_id": "97" }, { "sys_name": "财政专户核算(综合口专项资金)", "sys_id": "98" },
{ "sys_name": "非税收入管理系统", "sys_id": "99" }, { "sys_name": "农业专向及农业发展基金专项", "sys_id": "100" }, { "sys_name": "总预算会计核算", "sys_id": "101" }, { "sys_name": "金财工程一体化支撑平台", "sys_id": "102" },
{ "sys_name": "非税收缴", "sys_id": "103" }, { "sys_name": "学校预算执行", "sys_id": "104" }, { "sys_name": "预算执行", "sys_id": "105" }, { "sys_name": "专项资金", "sys_id": "106" },
{ "sys_name": "总预算", "sys_id": "107" }, { "sys_name": "部门预算系统", "sys_id": "108" }, { "sys_name": "财政专户核算", "sys_id": "109" }, { "sys_name": "财政专户账务系统", "sys_id": "110" },
{ "sys_name": "富深财政一体化业务管理系统", "sys_id": "111" }, { "sys_name": "国有资产系统", "sys_id": "112" }, { "sys_name": "国库专项资金管理系统", "sys_id": "113" },
{ "sys_name": "非税收缴管理系统", "sys_id": "114" }, { "sys_name": "财政管理系统(新农保)", "sys_id": "115" }, { "sys_name": "财政管理系统(城市居民医疗统筹)", "sys_id": "116" },
{ "sys_name": "财政管理系统(集中支付中心)", "sys_id": "117" }, { "sys_name": "财政管理系统(解困金)", "sys_id": "118" }, { "sys_name": "财政管理系统(旧城改造)", "sys_id": "119" },
{ "sys_name": "财政管理系统(社保资金账户)", "sys_id": "120" }, { "sys_name": "财政管理系统(土地出让专帐)", "sys_id": "121" }, { "sys_name": "财政管理系统(预拨及非集中支付中心)", "sys_id": "122" },
{ "sys_name": "财政管理系统(预算外资金)", "sys_id": "123" }, { "sys_name": "总预算会计", "sys_id": "124" }, { "sys_name": "财务核算系统", "sys_id": "125" }, { "sys_name": "工资统发系统", "sys_id": "126" },
{ "sys_name": "预算编审系统", "sys_id": "127" }, { "sys_name": "预算管理系统", "sys_id": "128" }, { "sys_name": "预算外资金(从联网审计中取数)", "sys_id": "129" },
{ "sys_name": "G6-E财务管理系统", "sys_id": "130" }, { "sys_name": "新中大公共财政管理软件", "sys_id": "131" }, { "sys_name": "用友GRP/R9财政管理软件", "sys_id": "132" },
{ "sys_name": "用友GRP-U8R10", "sys_id": "133" }, { "sys_name": "财政一体化管理系统(基建户)", "sys_id": "134" }, { "sys_name": "财政一体化管理系统(集中支付中心)", "sys_id": "135" },
{ "sys_name": "财政一体化管理系统(农业综合开发)", "sys_id": "136" }, { "sys_name": "财政一体化管理系统(预算外资金)", "sys_id": "137" }, { "sys_name": "财政一体化管理系统(支农专户)", "sys_id": "138" },
{ "sys_name": "财政一体化管理系统(总预算)", "sys_id": "139" }, { "sys_name": "国资管理系统", "sys_id": "140" }, { "sys_name": "乡财县管系统", "sys_id": "141" }, { "sys_name": "预算编制管理系统", "sys_id": "142" },
{ "sys_name": "盐城市_市本级_部门预算", "sys_id": "143" }, { "sys_name": "盐城市_市本级_非税收管理系统", "sys_id": "144" }, { "sys_name": "盐城市_市本级_预算执行系统", "sys_id": "145" },
{ "sys_name": "盐城市_亭湖区_财政专户", "sys_id": "146" }, { "sys_name": "盐城市_亭湖区_非税收入管理", "sys_id": "147" }, { "sys_name": "盐城市_亭湖区_国库集中支付管理", "sys_id": "148" },
{ "sys_name": "盐城市_亭湖区_预算指标管理", "sys_id": "149" }, { "sys_name": "盐城市_亭湖区_总预算会计核算", "sys_id": "150" }, { "sys_name": "盐城市_盐都区_财政专户核算系统", "sys_id": "151" },
{ "sys_name": "盐城市_盐都区_非税收入管理系统", "sys_id": "152" }, { "sys_name": "盐城市_盐都区_国库集中支付系统", "sys_id": "153" }, { "sys_name": "盐城市_盐都区_总预算会计核算系统", "sys_id": "154" },
{ "sys_name": "盐城市_响水县_部门预算管理系统", "sys_id": "155" }, { "sys_name": "盐城市_响水县_财政一体化信息系统", "sys_id": "156" }, { "sys_name": "盐城市_响水县_非税收入收缴管理系统", "sys_id": "157" },
{ "sys_name": "盐城市_滨海县财政一体化", "sys_id": "158" }, { "sys_name": "盐城市_阜宁县_财政管理软件", "sys_id": "159" }, { "sys_name": "盐城市_阜宁县_财政管理软件用友U8", "sys_id": "160" },
{ "sys_name": "盐城市_射阳县_财政预算执行一体化系统", "sys_id": "161" }, { "sys_name": "盐城市_建湖县_非税收缴", "sys_id": "162" },
{ "sys_name": "盐城市_建湖县_财政一体化", "sys_id": "163" }, { "sys_name": "盐城市_建湖县_国库集中支付", "sys_id": "164" },
{ "sys_name": "盐城市_东台市_部门预算编审系统", "sys_id": "165" }, { "sys_name": "盐城市_东台市_财政一体化信息系统", "sys_id": "166" },
{ "sys_name": "盐城市_东台市_财政专户核算系统", "sys_id": "167" }, { "sys_name": "盐城市_东台市_非税收入收缴管理系统", "sys_id": "168" },
{ "sys_name": "盐城市_东台市_总预算会计核算系统", "sys_id": "169" }, { "sys_name": "盐城市_大丰区_部门预算系统", "sys_id": "170" },
{ "sys_name": "盐城市_大丰区_财政一体化", "sys_id": "171" }, { "sys_name": "盐城市_大丰区_总预算会计核算财务软件", "sys_id": "172" },
{ "sys_name": "盐城市_经济技术开发区_部门预算软件", "sys_id": "173" }, { "sys_name": "盐城市_经济技术开发区_国库集中支付", "sys_id": "174" },
{ "sys_name": "老非税收入征缴系统", "sys_id": "175" }, { "sys_name": "扬州财政一体化信息管理系统", "sys_id": "176" }, { "sys_name": "非税收入征收", "sys_id": "177" },
{ "sys_name": "部门预算编制", "sys_id": "178" }, { "sys_name": "非税收入收缴", "sys_id": "179" }, { "sys_name": "行政事业性单位国有资产管理", "sys_id": "180" },
{ "sys_name": "财政业务系统", "sys_id": "181" }, { "sys_name": "财政业务综合系统", "sys_id": "182" }, { "sys_name": "江都开发区预算执行系统", "sys_id": "183" },
{ "sys_name": "财政一体化", "sys_id": "184" }, { "sys_name": "富深协通财政一体化业务管理系统", "sys_id": "185" }, { "sys_name": "富深协通非税收缴系统", "sys_id": "186" },
{ "sys_name": "富深协通工资统发系统", "sys_id": "187" }, { "sys_name": "非税收入", "sys_id": "188" }, { "sys_name": "财政综合业务系统", "sys_id": "189" },
{ "sys_name": "泰州市_市本级_部门预算系统", "sys_id": "190" }, { "sys_name": "泰州市_市本级_非税收入系统", "sys_id": "191" }, { "sys_name": "泰州市_市本级_绩效管理系统", "sys_id": "192" },
{ "sys_name": "泰州市_市本级_预算执行系统", "sys_id": "193" }, { "sys_name": "泰州市_市本级_综合治税系统", "sys_id": "194" }, { "sys_name": "泰州市_海陵区_部门预算编制系统", "sys_id": "195" },
{ "sys_name": "泰州市_海陵区_县区财政一体化", "sys_id": "196" }, { "sys_name": "泰州市_高港区_预算执行系统", "sys_id": "197" },
{ "sys_name": "泰州市_姜堰区_部门预算系统", "sys_id": "198" }, { "sys_name": "泰州市_姜堰区_财政一体化系统", "sys_id": "199" },
{ "sys_name": "泰州市_姜堰区_非税收缴系统", "sys_id": "200" }, { "sys_name": "泰州市_姜堰区_预算执行系统", "sys_id": "201" },
{ "sys_name": "泰州市_医药高新区_财政一体化系统", "sys_id": "202" }, { "sys_name": "泰州市_兴化市_部门预算", "sys_id": "203" },
{ "sys_name": "泰州市_兴化市_非税收缴", "sys_id": "204" }, { "sys_name": "泰州市_兴化市_国库集中支付", "sys_id": "205" },
{ "sys_name": "泰州市_靖江市_预算执行系统", "sys_id": "206" }, { "sys_name": "泰州市_靖江市_非税收入收缴", "sys_id": "207" },
{ "sys_name": "泰州市_靖江市_部门预算编审系统", "sys_id": "208" }, { "sys_name": "泰州市_泰兴市_部门预算系统", "sys_id": "209" },
{ "sys_name": "泰州市_泰兴市_非税收入管理系统", "sys_id": "210" }, { "sys_name": "泰州市_泰兴市_预算执行系统", "sys_id": "211" },
{ "sys_name": "部门预算管理系统", "sys_id": "212" }, { "sys_name": "财政一体化平台及国库集中支付系统", "sys_id": "213" },
{ "sys_name": "新中大非税收入管理", "sys_id": "214" }, { "sys_name": "联友财务管理系统", "sys_id": "215" }, { "sys_name": "国库集中支付、指标管理系统", "sys_id": "216" },
{ "sys_name": "开发区总预算系统", "sys_id": "217" }, { "sys_name": "国库账务系统", "sys_id": "218" }, { "sys_name": "化学工业园区非税收入管理系统", "sys_id": "219" },
{ "sys_name": "非税收入账套", "sys_id": "220" }, { "sys_name": "化学工业园区预算执行系统", "sys_id": "221" }, { "sys_name": "会计核算", "sys_id": "222" },
{ "sys_name": "总预算会计账", "sys_id": "223" }, { "sys_name": "预算内外收支核算系统", "sys_id": "224" }, { "sys_name": "账户核算系统", "sys_id": "225" },
{ "sys_name": "总预算核算系统", "sys_id": "226" }, { "sys_name": "账务处理系统(收支分类改革升级版)", "sys_id": "227" }, { "sys_name": "财政预算外业务", "sys_id": "228" },
{ "sys_name": "用友U8R10财政一体化平台", "sys_id": "229" }, { "sys_name": "开发区财政系统", "sys_id": "230" }, { "sys_name": "高新区总预算系统", "sys_id": "231" },
{ "sys_name": "开发区公共财政服务平台", "sys_id": "232" }, { "sys_name": "用友GRP-U8管理软件", "sys_id": "233" }, { "sys_name": "盐城市_城南新区_国库集中支付系统", "sys_id": "234" },
{ "sys_name": "盐城市_城南新区_总预算账务处理系统", "sys_id": "235" }, { "sys_name": "财政预算指标管理", "sys_id": "236" }, { "sys_name": "泰州市_市本级_行政管理系统", "sys_id": "237" },
{ "sys_name": "新中大财务软件", "sys_id": "238" }, { "sys_name": "开发区新中大财务核算系统", "sys_id": "239" }, { "sys_name": "开发区账务系统", "sys_id": "240" }];
Kubernetes.origin_place_arr = [{ "city_code": "3201", "city": "南京市", "county": "市本级", "county_code": "320100", "sys_name": "部门预算", "sys_code": "BMYS" },
{ "city_code": "3201", "city": "南京市", "county": "市本级", "county_code": "320100", "sys_name": "非税收入收缴管理系统", "sys_code": "FSSR" },
{ "city_code": "3201", "city": "南京市", "county": "市本级", "county_code": "320100", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3201", "city": "南京市", "county": "市本级", "county_code": "320100", "sys_name": "资产管理系统", "sys_code": "ZCGL" },
{ "city_code": "3201", "city": "南京市", "county": "玄武区", "county_code": "320102", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3201", "city": "南京市", "county": "秦淮区", "county_code": "320104", "sys_name": "用友财政综合管理信息系统", "sys_code": "YTH" },
{ "city_code": "3201", "city": "南京市", "county": "建邺区", "county_code": "320105", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3201", "city": "南京市", "county": "鼓楼区", "county_code": "320106", "sys_name": "用友A++", "sys_code": "YTH" },
{ "city_code": "3201", "city": "南京市", "county": "浦口区", "county_code": "320111", "sys_name": "浦口财政一体化", "sys_code": "YTH" },
{ "city_code": "3201", "city": "南京市", "county": "栖霞区", "county_code": "320113", "sys_name": "栖霞区财政业务信息管理系统", "sys_code": "YTH" },
{ "city_code": "3201", "city": "南京市", "county": "雨花台区", "county_code": "320114", "sys_name": "一体化系统", "sys_code": "YTH" },
{ "city_code": "3201", "city": "南京市", "county": "江宁区", "county_code": "320115", "sys_name": "财政管理一体化系统", "sys_code": "YTH" },
{ "city_code": "3201", "city": "南京市", "county": "江宁区", "county_code": "320115", "sys_name": "滨江开发区财政分局", "sys_code": "YTH" },
{ "city_code": "3201", "city": "南京市", "county": "江宁区", "county_code": "320115", "sys_name": "江宁经济技术开发区财政分局", "sys_code": "YTH" },
{ "city_code": "3201", "city": "南京市", "county": "江宁区", "county_code": "320115", "sys_name": "江宁科学园财政分局", "sys_code": "YTH" },
{ "city_code": "3201", "city": "南京市", "county": "六合区", "county_code": "320116", "sys_name": "一体化系统", "sys_code": "YTH" },
{ "city_code": "3201", "city": "南京市", "county": "高淳区", "county_code": "320118", "sys_name": "财政一体化系统", "sys_code": "YTH" },
{ "city_code": "3201", "city": "南京市", "county": "溧水区", "county_code": "320124", "sys_name": "A++财政一体化平台", "sys_code": "YTH" },
{ "city_code": "3202", "city": "无锡市", "county": "市本级", "county_code": "320200", "sys_name": "财政一体化系统", "sys_code": "YTH" },
{ "city_code": "3202", "city": "无锡市", "county": "市本级", "county_code": "320200", "sys_name": "非税收入收缴管理系统", "sys_code": "FSSR" },
{ "city_code": "3202", "city": "无锡市", "county": "崇安区", "county_code": "320202", "sys_name": "非税系统", "sys_code": "FSSR" },
{ "city_code": "3202", "city": "无锡市", "county": "崇安区", "county_code": "320202", "sys_name": "一体化预算执行系统", "sys_code": "YTH" },
{ "city_code": "3202", "city": "无锡市", "county": "南长区", "county_code": "320203", "sys_name": "非税系统", "sys_code": "FSSR" },
{ "city_code": "3202", "city": "无锡市", "county": "南长区", "county_code": "320203", "sys_name": "一体化", "sys_code": "YTH" },
{ "city_code": "3202", "city": "无锡市", "county": "北塘区", "county_code": "320204", "sys_name": "国库集中支付管理信息系统", "sys_code": "GKZF" },
{ "city_code": "3202", "city": "无锡市", "county": "锡山区", "county_code": "320205", "sys_name": "国库集中支付", "sys_code": "GKZF" },
{ "city_code": "3202", "city": "无锡市", "county": "锡山区", "county_code": "320205", "sys_name": "财政专户核算及非税系统", "sys_code": "ZHHS_FSSR" },
{ "city_code": "3202", "city": "无锡市", "county": "惠山区", "county_code": "320206", "sys_name": "财政一体化系统", "sys_code": "YTH" },
{ "city_code": "3202", "city": "无锡市", "county": "滨湖区", "county_code": "320211", "sys_name": "集中支付系统", "sys_code": "GKZF" },
{ "city_code": "3202", "city": "无锡市", "county": "滨湖区", "county_code": "320211", "sys_name": "非税系统", "sys_code": "FSSR" },
{ "city_code": "3202", "city": "无锡市", "county": "滨湖区", "county_code": "320211", "sys_name": "财政专户核算系统", "sys_code": "ZHHS" },
{ "city_code": "3202", "city": "无锡市", "county": "新区", "county_code": "320214", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3202", "city": "无锡市", "county": "新区", "county_code": "320214", "sys_name": "非税收缴系统", "sys_code": "FSSR" },
{ "city_code": "3202", "city": "无锡市", "county": "新区", "county_code": "320214", "sys_name": "财政专户核算系统", "sys_code": "ZHHS" },
{ "city_code": "3202", "city": "无锡市", "county": "江阴市", "county_code": "320281", "sys_name": "财政一体化平台", "sys_code": "YTH" },
{ "city_code": "3202", "city": "无锡市", "county": "宜兴市", "county_code": "320282", "sys_name": "非税收缴系统", "sys_code": "FSSR" },
{ "city_code": "3202", "city": "无锡市", "county": "宜兴市", "county_code": "320282", "sys_name": "财政一体化平台", "sys_code": "YTH" },
{ "city_code": "3203", "city": "徐州市", "county": "市本级", "county_code": "320300", "sys_name": "富深预算执行", "sys_code": "YSZX" },
{ "city_code": "3203", "city": "徐州市", "county": "市本级", "county_code": "320300", "sys_name": "用友非税及票据", "sys_code": "FSSR" },
{ "city_code": "3203", "city": "徐州市", "county": "市本级", "county_code": "320300", "sys_name": "用友预算执行", "sys_code": "YSZX" },
{ "city_code": "3203", "city": "徐州市", "county": "鼓楼区", "county_code": "320302", "sys_name": "江苏省财政预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3203", "city": "徐州市", "county": "鼓楼区", "county_code": "320302", "sys_name": "用友通用软件", "sys_code": "KJHS" },
{ "city_code": "3203", "city": "徐州市", "county": "云龙区", "county_code": "320303", "sys_name": "江苏省财政预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3203", "city": "徐州市", "county": "云龙区", "county_code": "320303", "sys_name": "联友软件/通用财务", "sys_code": "KJHS" },
{ "city_code": "3203", "city": "徐州市", "county": "云龙区", "county_code": "320303", "sys_name": "用友GRPG-U8R10财政管理软件", "sys_code": "YSZX" },
{ "city_code": "3203", "city": "徐州市", "county": "贾汪区", "county_code": "320305", "sys_name": "用友GPP-R10财政管理软件", "sys_code": "KJHS" },
{ "city_code": "3203", "city": "徐州市", "county": "泉山区", "county_code": "320311", "sys_name": "富深协通财政一体化管理信息系统", "sys_code": "YTH" },
{ "city_code": "3203", "city": "徐州市", "county": "铜山区", "county_code": "320312", "sys_name": "财务统一核算系统", "sys_code": "KJHS" },
{ "city_code": "3203", "city": "徐州市", "county": "铜山区", "county_code": "320312", "sys_name": "非税收入收缴管理系统", "sys_code": "FSSR" },
{ "city_code": "3203", "city": "徐州市", "county": "铜山区", "county_code": "320312", "sys_name": "公共财政管理软件", "sys_code": "YSZX" },
{ "city_code": "3203", "city": "徐州市", "county": "丰县", "county_code": "320321", "sys_name": "A++财政一体化信息平台", "sys_code": "YTH" },
{ "city_code": "3203", "city": "徐州市", "county": "丰县", "county_code": "320321", "sys_name": "新中大公共财务管理软件", "sys_code": "KJHS" },
{ "city_code": "3203", "city": "徐州市", "county": "沛县", "county_code": "320322", "sys_name": "富深财政一体化管理系统", "sys_code": "YTH" },
{ "city_code": "3203", "city": "徐州市", "county": "沛县", "county_code": "320322", "sys_name": "新中大公共财政管理系统", "sys_code": "KJHS" },
{ "city_code": "3203", "city": "徐州市", "county": "睢宁县", "county_code": "320324", "sys_name": "富深协通财政一体化业务管理系统软件", "sys_code": "YTH" },
{ "city_code": "3203", "city": "徐州市", "county": "睢宁县", "county_code": "320324", "sys_name": "新中大公共财政管理软件Gsoft", "sys_code": "KJHS" },
{ "city_code": "3203", "city": "徐州市", "county": "新沂市", "county_code": "320381", "sys_name": "江苏省财政预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3203", "city": "徐州市", "county": "邳州", "county_code": "320382", "sys_name": "财政一体化系统", "sys_code": "YTH" },
{ "city_code": "3204", "city": "常州市", "county": "本级", "county_code": "320400", "sys_name": "财政一体化业务系统", "sys_code": "YTH" },
{ "city_code": "3204", "city": "常州市", "county": "天宁区", "county_code": "320402", "sys_name": "财政一体化软件", "sys_code": "YTH" },
{ "city_code": "3204", "city": "常州市", "county": "天宁区", "county_code": "320402", "sys_name": "非税收入系统", "sys_code": "FSSR" },
{ "city_code": "3204", "city": "常州市", "county": "天宁区", "county_code": "320402", "sys_name": "总预算系统", "sys_code": "YSZX" },
{ "city_code": "3204", "city": "常州市", "county": "钟楼区", "county_code": "320404", "sys_name": "非税收入系统", "sys_code": "FSSR" },
{ "city_code": "3204", "city": "常州市", "county": "钟楼区", "county_code": "320404", "sys_name": "国库集中支付系统", "sys_code": "GKZF" },
{ "city_code": "3204", "city": "常州市", "county": "钟楼区", "county_code": "320404", "sys_name": "用款计划系统", "sys_code": "JHGL" },
{ "city_code": "3204", "city": "常州市", "county": "钟楼区", "county_code": "320404", "sys_name": "指标管理系统", "sys_code": "ZBGL" },
{ "city_code": "3204", "city": "常州市", "county": "钟楼区", "county_code": "320404", "sys_name": "总预算系统", "sys_code": "ZYS" },
{ "city_code": "3204", "city": "常州市", "county": "新北区", "county_code": "320411", "sys_name": "财政综合业务管理平台", "sys_code": "YTH" },
{ "city_code": "3204", "city": "常州市", "county": "武进区", "county_code": "320412", "sys_name": "财政一体化管理信息系统", "sys_code": "YTH" },
{ "city_code": "3204", "city": "常州市", "county": "溧阳市", "county_code": "320481", "sys_name": "部门预算", "sys_code": "BMYS" },
{ "city_code": "3204", "city": "常州市", "county": "溧阳市", "county_code": "320481", "sys_name": "工资统发", "sys_code": "GZTF" },
{ "city_code": "3204", "city": "常州市", "county": "溧阳市", "county_code": "320481", "sys_name": "国有资产", "sys_code": "ZCGL" },
{ "city_code": "3204", "city": "常州市", "county": "溧阳市", "county_code": "320481", "sys_name": "乡镇非税收入", "sys_code": "XZFS" },
{ "city_code": "3204", "city": "常州市", "county": "溧阳市", "county_code": "320481", "sys_name": "乡镇集中支付", "sys_code": "XZGK" },
{ "city_code": "3204", "city": "常州市", "county": "金坛区", "county_code": "320482", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3205", "city": "苏州市", "county": "市本级", "county_code": "320500", "sys_name": "非税征缴系统", "sys_code": "FSSR" },
{ "city_code": "3205", "city": "苏州市", "county": "市本级", "county_code": "320500", "sys_name": "预算编制与执行系统", "sys_code": "YSZX" },
{ "city_code": "3205", "city": "苏州市", "county": "工业园区", "county_code": "320501", "sys_name": "预算管理综合业务平台", "sys_code": "YSGL" },
{ "city_code": "3205", "city": "苏州市", "county": "虎丘区", "county_code": "320505", "sys_name": "u8管理软件", "sys_code": "CZGL" },
{ "city_code": "3205", "city": "苏州市", "county": "虎丘区", "county_code": "320505", "sys_name": "财政指标管理系统", "sys_code": "ZBGL" },
{ "city_code": "3205", "city": "苏州市", "county": "虎丘区", "county_code": "320505", "sys_name": "国库集中支付系统", "sys_code": "GKZF" },
{ "city_code": "3205", "city": "苏州市", "county": "虎丘区", "county_code": "320505", "sys_name": "用友GRP-R9财务管理软件", "sys_code": "CWGL" },
{ "city_code": "3205", "city": "苏州市", "county": "虎丘区", "county_code": "320505", "sys_name": "用友GRP-U8财政管理软件", "sys_code": "CWGL" },
{ "city_code": "3205", "city": "苏州市", "county": "虎丘区", "county_code": "320505", "sys_name": "账务处理系统", "sys_code": "ZWCL" },
{ "city_code": "3205", "city": "苏州市", "county": "吴中区", "county_code": "320506", "sys_name": "R9i财政管理软件", "sys_code": "CZGL" },
{ "city_code": "3205", "city": "苏州市", "county": "吴中区", "county_code": "320506", "sys_name": "部门预算", "sys_code": "BMYS" },
{ "city_code": "3205", "city": "苏州市", "county": "吴中区", "county_code": "320506", "sys_name": "财政一体化平台", "sys_code": "YTH" },
{ "city_code": "3205", "city": "苏州市", "county": "吴中区", "county_code": "320506", "sys_name": "非税系统", "sys_code": "FSSR" },
{ "city_code": "3205", "city": "苏州市", "county": "相城区", "county_code": "320507", "sys_name": "u8财政管理软件", "sys_code": "CZGL" },
{ "city_code": "3205", "city": "苏州市", "county": "相城区", "county_code": "320507", "sys_name": "相城区财政综合管理信息系统", "sys_code": "YTH" },
{ "city_code": "3205", "city": "苏州市", "county": "姑苏区", "county_code": "320508", "sys_name": "财政非税综合管理系统", "sys_code": "FSSR" },
{ "city_code": "3205", "city": "苏州市", "county": "姑苏区", "county_code": "320508", "sys_name": "财政综合管理平台", "sys_code": "YTH" },
{ "city_code": "3205", "city": "苏州市", "county": "吴江区", "county_code": "320509", "sys_name": "吴江区财政一体化", "sys_code": "YTH" },
{ "city_code": "3205", "city": "苏州市", "county": "常熟市", "county_code": "320581", "sys_name": "非税收入收缴管理系统", "sys_code": "FSSR" },
{ "city_code": "3205", "city": "苏州市", "county": "常熟市", "county_code": "320581", "sys_name": "用友R9", "sys_code": "KJHS" },
{ "city_code": "3205", "city": "苏州市", "county": "常熟市", "county_code": "320581", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3205", "city": "苏州市", "county": "张家港市", "county_code": "320582", "sys_name": "财政公共应用服务平台", "sys_code": "GGFW" },
{ "city_code": "3205", "city": "苏州市", "county": "张家港市", "county_code": "320582", "sys_name": "金蝶K/3创新管理平台", "sys_code": "CZGL" },
{ "city_code": "3205", "city": "苏州市", "county": "张家港市", "county_code": "320582", "sys_name": "账务数据系统", "sys_code": "KJHS" },
{ "city_code": "3205", "city": "苏州市", "county": "昆山市", "county_code": "320583", "sys_name": "非税收入收缴管理系统", "sys_code": "FSSR" },
{ "city_code": "3205", "city": "苏州市", "county": "昆山市", "county_code": "320583", "sys_name": "公共财政服务平台", "sys_code": "GGFW" },
{ "city_code": "3205", "city": "苏州市", "county": "昆山市", "county_code": "320583", "sys_name": "国库集中支付系统", "sys_code": "GKZF" },
{ "city_code": "3205", "city": "苏州市", "county": "太仓市", "county_code": "320585", "sys_name": "非税收入系统", "sys_code": "FSSR" },
{ "city_code": "3205", "city": "苏州市", "county": "太仓市", "county_code": "320585", "sys_name": "会计核算系统", "sys_code": "KJHS" },
{ "city_code": "3205", "city": "苏州市", "county": "太仓市", "county_code": "320585", "sys_name": "项目库", "sys_code": "XMK" },
{ "city_code": "3205", "city": "苏州市", "county": "太仓市", "county_code": "320585", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3206", "city": "南通市", "county": "本级", "county_code": "320600", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3206", "city": "南通市", "county": "崇川区", "county_code": "320602", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3206", "city": "南通市", "county": "港闸区", "county_code": "320611", "sys_name": "财政总预算(外)专户管理系统", "sys_code": "YSWZH" },
{ "city_code": "3206", "city": "南通市", "county": "港闸区", "county_code": "320611", "sys_name": "城建资金专户管理系统", "sys_code": "CJZH" },
{ "city_code": "3206", "city": "南通市", "county": "港闸区", "county_code": "320611", "sys_name": "农保专户管理系统", "sys_code": "NBZH" },
{ "city_code": "3206", "city": "南通市", "county": "港闸区", "county_code": "320611", "sys_name": "农业发展基金专户管理系统", "sys_code": "NFJJ" },
{ "city_code": "3206", "city": "南通市", "county": "港闸区", "county_code": "320611", "sys_name": "失地农民保障资金专户", "sys_code": "SDNM" },
{ "city_code": "3206", "city": "南通市", "county": "港闸区", "county_code": "320611", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3206", "city": "南通市", "county": "通州区", "county_code": "320612", "sys_name": "非税收入征管系统", "sys_code": "FSSR" },
{ "city_code": "3206", "city": "南通市", "county": "通州区", "county_code": "320612", "sys_name": "工资统发人员信息", "sys_code": "GZTF" },
{ "city_code": "3206", "city": "南通市", "county": "通州区", "county_code": "320612", "sys_name": "预算指标-国库集中支付系统", "sys_code": "YSZX" },
{ "city_code": "3206", "city": "南通市", "county": "通州区", "county_code": "320612", "sys_name": "总预算会计核算系统", "sys_code": "KJHS" },
{ "city_code": "3206", "city": "南通市", "county": "海安县", "county_code": "320621", "sys_name": "部门预算编审系统", "sys_code": "BMYS" },
{ "city_code": "3206", "city": "南通市", "county": "海安县", "county_code": "320621", "sys_name": "公务消费管理系统", "sys_code": "GWXF" },
{ "city_code": "3206", "city": "南通市", "county": "海安县", "county_code": "320621", "sys_name": "国有资产管理系统", "sys_code": "ZCGL" },
{ "city_code": "3206", "city": "南通市", "county": "海安县", "county_code": "320621", "sys_name": "区镇财政管理“一体化”系统", "sys_code": "XZYTH" },
{ "city_code": "3206", "city": "南通市", "county": "海安县", "county_code": "320621", "sys_name": "县本级财政管理“一体化”系统", "sys_code": "YTH" },
{ "city_code": "3206", "city": "南通市", "county": "如东县", "county_code": "320623", "sys_name": "用友政务", "sys_code": "YTH" },
{ "city_code": "3206", "city": "南通市", "county": "启东市", "county_code": "320681", "sys_name": "财政专户核算(行政口专项资金)", "sys_code": "ZHXZ" },
{ "city_code": "3206", "city": "南通市", "county": "启东市", "county_code": "320681", "sys_name": "财政专户核算(经建口专项资金)", "sys_code": "ZHJJ" },
{ "city_code": "3206", "city": "南通市", "county": "启东市", "county_code": "320681", "sys_name": "财政专户核算(农业保险专账)", "sys_code": "ZHNB" },
{ "city_code": "3206", "city": "南通市", "county": "启东市", "county_code": "320681", "sys_name": "财政专户核算(农业综合开发专账)", "sys_code": "ZHNF" },
{ "city_code": "3206", "city": "南通市", "county": "启东市", "county_code": "320681", "sys_name": "财政专户核算(社保资金专账)", "sys_code": "ZHSB" },
{ "city_code": "3206", "city": "南通市", "county": "启东市", "county_code": "320681", "sys_name": "财政专户核算(土地出让专账)", "sys_code": "ZHTD" },
{ "city_code": "3206", "city": "南通市", "county": "启东市", "county_code": "320681", "sys_name": "财政专户核算(综合口专项资金)", "sys_code": "ZHZH" },
{ "city_code": "3206", "city": "南通市", "county": "启东市", "county_code": "320681", "sys_name": "非税收入管理系统", "sys_code": "FSSR" },
{ "city_code": "3206", "city": "南通市", "county": "启东市", "county_code": "320681", "sys_name": "农业专向及农业发展基金专项", "sys_code": "NFZX" },
{ "city_code": "3206", "city": "南通市", "county": "启东市", "county_code": "320681", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3206", "city": "南通市", "county": "启东市", "county_code": "320681", "sys_name": "总预算会计核算", "sys_code": "KJHS" },
{ "city_code": "3206", "city": "南通市", "county": "如皋市", "county_code": "320682", "sys_name": "金财工程一体化支撑平台", "sys_code": "YTH" },
{ "city_code": "3206", "city": "南通市", "county": "海门市", "county_code": "320684", "sys_name": "非税收缴", "sys_code": "FSSR" },
{ "city_code": "3206", "city": "南通市", "county": "海门市", "county_code": "320684", "sys_name": "学校预算执行", "sys_code": "YSZXXX" },
{ "city_code": "3206", "city": "南通市", "county": "海门市", "county_code": "320684", "sys_name": "预算执行", "sys_code": "YSZX" },
{ "city_code": "3206", "city": "南通市", "county": "海门市", "county_code": "320684", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3206", "city": "南通市", "county": "海门市", "county_code": "320684", "sys_name": "专项资金", "sys_code": "ZXZJ" },
{ "city_code": "3206", "city": "南通市", "county": "海门市", "county_code": "320684", "sys_name": "总预算", "sys_code": "ZYS" },
{ "city_code": "3207", "city": "连云港市", "county": "市本级", "county_code": "320700", "sys_name": "部门预算系统", "sys_code": "BMYS" },
{ "city_code": "3207", "city": "连云港市", "county": "市本级", "county_code": "320700", "sys_name": "财政专户核算", "sys_code": "ZHHS" },
{ "city_code": "3207", "city": "连云港市", "county": "市本级", "county_code": "320700", "sys_name": "非税收入系统", "sys_code": "FSSR" },
{ "city_code": "3207", "city": "连云港市", "county": "市本级", "county_code": "320700", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3207", "city": "连云港市", "county": "连云区", "county_code": "320703", "sys_name": "财政专户账务系统", "sys_code": "ZHHS" },
{ "city_code": "3207", "city": "连云港市", "county": "连云区", "county_code": "320703", "sys_name": "富深财政一体化管理系统", "sys_code": "YTH" },
{ "city_code": "3207", "city": "连云港市", "county": "海州区", "county_code": "320706", "sys_name": "富深财政一体化业务管理系统", "sys_code": "" },
{ "city_code": "3207", "city": "连云港市", "county": "海州区", "county_code": "320706", "sys_name": "新中大公共财政管理系统", "sys_code": "" },
{ "city_code": "3207", "city": "连云港市", "county": "赣榆区", "county_code": "320721", "sys_name": "财政一体化平台", "sys_code": "YTH" },
{ "city_code": "3207", "city": "连云港市", "county": "赣榆区", "county_code": "320721", "sys_name": "国有资产系统", "sys_code": "CZGL" },
{ "city_code": "3207", "city": "连云港市", "county": "东海县", "county_code": "320722", "sys_name": "部门预算系统", "sys_code": "BMYS" },
{ "city_code": "3207", "city": "连云港市", "county": "东海县", "county_code": "320722", "sys_name": "国库专项资金管理系统", "sys_code": "ZXZJ" },
{ "city_code": "3207", "city": "连云港市", "county": "东海县", "county_code": "320722", "sys_name": "国有资产管理系统", "sys_code": "ZCGL" },
{ "city_code": "3207", "city": "连云港市", "county": "东海县", "county_code": "320722", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3207", "city": "连云港市", "county": "灌云县", "county_code": "320723", "sys_name": "财政一体化平台", "sys_code": "YTH" },
{ "city_code": "3207", "city": "连云港市", "county": "灌南县", "county_code": "320724", "sys_name": "非税系统", "sys_code": "FSSR" },
{ "city_code": "3207", "city": "连云港市", "county": "灌南县", "county_code": "320724", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3208", "city": "淮安市", "county": "市本级", "county_code": "320800", "sys_name": "非税收缴管理系统", "sys_code": "FSSR" },
{ "city_code": "3208", "city": "淮安市", "county": "市本级", "county_code": "320800", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3208", "city": "淮安市", "county": "清河区", "county_code": "320802", "sys_name": "财政管理系统(新农保)", "sys_code": "ZHNB" },
{ "city_code": "3208", "city": "淮安市", "county": "清河区", "county_code": "320802", "sys_name": "财政管理系统(城市居民医疗统筹)", "sys_code": "ZHYB" },
{ "city_code": "3208", "city": "淮安市", "county": "清河区", "county_code": "320802", "sys_name": "财政管理系统(集中支付中心)", "sys_code": "GKZF" },
{ "city_code": "3208", "city": "淮安市", "county": "清河区", "county_code": "320802", "sys_name": "财政管理系统(解困金)", "sys_code": "ZHJK" },
{ "city_code": "3208", "city": "淮安市", "county": "清河区", "county_code": "320802", "sys_name": "财政管理系统(旧城改造)", "sys_code": "ZHCG" },
{ "city_code": "3208", "city": "淮安市", "county": "清河区", "county_code": "320802", "sys_name": "财政管理系统(社保资金账户)", "sys_code": "ZHSB" },
{ "city_code": "3208", "city": "淮安市", "county": "清河区", "county_code": "320802", "sys_name": "财政管理系统(土地出让专帐)", "sys_code": "ZHTD" },
{ "city_code": "3208", "city": "淮安市", "county": "清河区", "county_code": "320802", "sys_name": "财政管理系统(预拨及非集中支付中心)", "sys_code": "ZHYB" },
{ "city_code": "3208", "city": "淮安市", "county": "清河区", "county_code": "320802", "sys_name": "财政管理系统(预算外资金)", "sys_code": "YSW" },
{ "city_code": "3208", "city": "淮安市", "county": "清河区", "county_code": "320802", "sys_name": "总预算会计", "sys_code": "KJHS" },
{ "city_code": "3208", "city": "淮安市", "county": "淮安区", "county_code": "320803", "sys_name": "财务核算系统", "sys_code": "KJHS" },
{ "city_code": "3208", "city": "淮安市", "county": "淮安区", "county_code": "320803", "sys_name": "非税收入管理系统", "sys_code": "FSSR" },
{ "city_code": "3208", "city": "淮安市", "county": "淮安区", "county_code": "320803", "sys_name": "工资统发系统", "sys_code": "GZTF" },
{ "city_code": "3208", "city": "淮安市", "county": "淮安区", "county_code": "320803", "sys_name": "用友政务", "sys_code": "YYZW" },
{ "city_code": "3208", "city": "淮安市", "county": "淮安区", "county_code": "320803", "sys_name": "预算编审系统", "sys_code": "BMYS" },
{ "city_code": "3208", "city": "淮安市", "county": "淮安区", "county_code": "320803", "sys_name": "预算管理系统", "sys_code": "YSGL" },
{ "city_code": "3208", "city": "淮安市", "county": "淮安区", "county_code": "320803", "sys_name": "预算外资金(从联网审计中取数)", "sys_code": "YSW" },
{ "city_code": "3208", "city": "淮安市", "county": "淮安区", "county_code": "320803", "sys_name": "预算编审系统", "sys_code": "YSBS" },
{ "city_code": "3208", "city": "淮安市", "county": "淮阴区", "county_code": "320804", "sys_name": "G6-E财务管理系统", "sys_code": "CWGL" },
{ "city_code": "3208", "city": "淮安市", "county": "淮阴区", "county_code": "320804", "sys_name": "江苏省财政预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3208", "city": "淮安市", "county": "淮阴区", "county_code": "320804", "sys_name": "新中大公共财政管理软件", "sys_code": "CZGL" },
{ "city_code": "3208", "city": "淮安市", "county": "淮阴区", "county_code": "320804", "sys_name": "用友GRP/R9财政管理软件", "sys_code": "CZGL" },
{ "city_code": "3208", "city": "淮安市", "county": "淮阴区", "county_code": "320804", "sys_name": "用友GRP-U8R10", "sys_code": "CWGL" },
{ "city_code": "3208", "city": "淮安市", "county": "淮安区", "county_code": "320803", "sys_name": "预算编审系统", "sys_code": "YSBS" },
{ "city_code": "3208", "city": "淮安市", "county": "清浦区", "county_code": "320811", "sys_name": "财政一体化管理系统(基建户)", "sys_code": "ZHJJ" },
{ "city_code": "3208", "city": "淮安市", "county": "清浦区", "county_code": "320811", "sys_name": "财政一体化管理系统(集中支付中心)", "sys_code": "GKZF" },
{ "city_code": "3208", "city": "淮安市", "county": "清浦区", "county_code": "320811", "sys_name": "财政一体化管理系统(农业综合开发)", "sys_code": "ZHNF" },
{ "city_code": "3208", "city": "淮安市", "county": "清浦区", "county_code": "320811", "sys_name": "财政一体化管理系统(预算外资金)", "sys_code": "YSW" },
{ "city_code": "3208", "city": "淮安市", "county": "清浦区", "county_code": "320811", "sys_name": "财政一体化管理系统(支农专户)", "sys_code": "ZHZN" },
{ "city_code": "3208", "city": "淮安市", "county": "清浦区", "county_code": "320811", "sys_name": "财政一体化管理系统(总预算)", "sys_code": "KJHS" },
{ "city_code": "3208", "city": "淮安市", "county": "涟水县", "county_code": "320826", "sys_name": "非税征缴系统", "sys_code": "FSSR" },
{ "city_code": "3208", "city": "淮安市", "county": "涟水县", "county_code": "320826", "sys_name": "国资管理系统", "sys_code": "ZCGL" },
{ "city_code": "3208", "city": "淮安市", "county": "涟水县", "county_code": "320826", "sys_name": "乡财县管系统", "sys_code": "XCXG" },
{ "city_code": "3208", "city": "淮安市", "county": "涟水县", "county_code": "320826", "sys_name": "乡财县管系统", "sys_code": "XCXG" },
{ "city_code": "3208", "city": "淮安市", "county": "涟水县", "county_code": "320826", "sys_name": "预算编制管理系统", "sys_code": "YSBS" },
{ "city_code": "3208", "city": "淮安市", "county": "涟水县", "county_code": "320826", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3208", "city": "淮安市", "county": "洪泽县", "county_code": "320829", "sys_name": "非税收入管理系统", "sys_code": "FSSR" },
{ "city_code": "3208", "city": "淮安市", "county": "洪泽县", "county_code": "320829", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3208", "city": "淮安市", "county": "盱眙县", "county_code": "320830", "sys_name": "财政一体化平台", "sys_code": "YTH" },
{ "city_code": "3208", "city": "淮安市", "county": "金湖县", "county_code": "320831", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3209", "city": "盐城市", "county": "市本级", "county_code": "320900", "sys_name": "盐城市_市本级_部门预算", "sys_code": "BMYS" },
{ "city_code": "3209", "city": "盐城市", "county": "市本级", "county_code": "320900", "sys_name": "盐城市_市本级_非税收管理系统", "sys_code": "FSSR" },
{ "city_code": "3209", "city": "盐城市", "county": "市本级", "county_code": "320900", "sys_name": "盐城市_市本级_预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3209", "city": "盐城市", "county": "亭湖区", "county_code": "320902", "sys_name": "盐城市_亭湖区_财政专户", "sys_code": "ZHHS" },
{ "city_code": "3209", "city": "盐城市", "county": "亭湖区", "county_code": "320902", "sys_name": "盐城市_亭湖区_非税收入管理", "sys_code": "FSSR" },
{ "city_code": "3209", "city": "盐城市", "county": "亭湖区", "county_code": "320902", "sys_name": "盐城市_亭湖区_国库集中支付管理", "sys_code": "GKZF" },
{ "city_code": "3209", "city": "盐城市", "county": "亭湖区", "county_code": "320902", "sys_name": "盐城市_亭湖区_预算指标管理", "sys_code": "ZBGL" },
{ "city_code": "3209", "city": "盐城市", "county": "亭湖区", "county_code": "320902", "sys_name": "盐城市_亭湖区_总预算会计核算", "sys_code": "KJHS" },
{ "city_code": "3209", "city": "盐城市", "county": "盐都区", "county_code": "320903", "sys_name": "盐城市_盐都区_财政专户核算系统", "sys_code": "ZHHS" },
{ "city_code": "3209", "city": "盐城市", "county": "盐都区", "county_code": "320903", "sys_name": "盐城市_盐都区_非税收入管理系统", "sys_code": "FSSR" },
{ "city_code": "3209", "city": "盐城市", "county": "盐都区", "county_code": "320903", "sys_name": "盐城市_盐都区_国库集中支付系统", "sys_code": "GKZF" },
{ "city_code": "3209", "city": "盐城市", "county": "盐都区", "county_code": "320903", "sys_name": "盐城市_盐都区_总预算会计核算系统", "sys_code": "KJHS" },
{ "city_code": "3209", "city": "盐城市", "county": "响水县", "county_code": "320921", "sys_name": "盐城市_响水县_部门预算管理系统", "sys_code": "BMYS" },
{ "city_code": "3209", "city": "盐城市", "county": "响水县", "county_code": "320921", "sys_name": "盐城市_响水县_财政一体化信息系统", "sys_code": "YTH" },
{ "city_code": "3209", "city": "盐城市", "county": "响水县", "county_code": "320921", "sys_name": "盐城市_响水县_非税收入收缴管理系统", "sys_code": "FSSR" },
{ "city_code": "3209", "city": "盐城市", "county": "滨海县", "county_code": "320922", "sys_name": "盐城市_滨海县财政一体化", "sys_code": "YTH" },
{ "city_code": "3209", "city": "盐城市", "county": "阜宁县", "county_code": "320923", "sys_name": "盐城市_阜宁县_财政管理软件", "sys_code": "CZGL" },
{ "city_code": "3209", "city": "盐城市", "county": "阜宁县", "county_code": "320923", "sys_name": "盐城市_阜宁县_财政管理软件用友U8", "sys_code": "YYZW" },
{ "city_code": "3209", "city": "盐城市", "county": "射阳县", "county_code": "320924", "sys_name": "盐城市_射阳县_财政预算执行一体化系统", "sys_code": "YTH" },
{ "city_code": "3209", "city": "盐城市", "county": "建湖县", "county_code": "320925", "sys_name": "盐城市_建湖县_非税收缴", "sys_code": "FSSR" },
{ "city_code": "3209", "city": "盐城市", "county": "建湖县", "county_code": "320925", "sys_name": "盐城市_建湖县_财政一体化", "sys_code": "YTH" },
{ "city_code": "3209", "city": "盐城市", "county": "建湖县", "county_code": "320925", "sys_name": "盐城市_建湖县_国库集中支付", "sys_code": "GKZF" },
{ "city_code": "3209", "city": "盐城市", "county": "东台市", "county_code": "320981", "sys_name": "盐城市_东台市_部门预算编审系统", "sys_code": "BMYS" },
{ "city_code": "3209", "city": "盐城市", "county": "东台市", "county_code": "320981", "sys_name": "盐城市_东台市_财政一体化信息系统", "sys_code": "YTH" },
{ "city_code": "3209", "city": "盐城市", "county": "东台市", "county_code": "320981", "sys_name": "盐城市_东台市_财政专户核算系统", "sys_code": "ZHHS" },
{ "city_code": "3209", "city": "盐城市", "county": "东台市", "county_code": "320981", "sys_name": "盐城市_东台市_非税收入收缴管理系统", "sys_code": "FSSR" },
{ "city_code": "3209", "city": "盐城市", "county": "东台市", "county_code": "320981", "sys_name": "盐城市_东台市_总预算会计核算系统", "sys_code": "KJHS" },
{ "city_code": "3209", "city": "盐城市", "county": "大丰区", "county_code": "320982", "sys_name": "盐城市_大丰区_部门预算系统", "sys_code": "BMYS" },
{ "city_code": "3209", "city": "盐城市", "county": "大丰区", "county_code": "320982", "sys_name": "盐城市_大丰区_财政一体化", "sys_code": "YTH" },
{ "city_code": "3209", "city": "盐城市", "county": "大丰区", "county_code": "320982", "sys_name": "盐城市_大丰区_总预算会计核算财务软件", "sys_code": "KJHS" },
{ "city_code": "3209", "city": "盐城市", "county": "经济技术开发区", "county_code": "320991", "sys_name": "盐城市_经济技术开发区_部门预算软件", "sys_code": "BMYS" },
{ "city_code": "3209", "city": "盐城市", "county": "经济技术开发区", "county_code": "320991", "sys_name": "盐城市_经济技术开发区_国库集中支付", "sys_code": "GKZF" },
{ "city_code": "3210", "city": "扬州市", "county": "市本级", "county_code": "321000", "sys_name": "财政专户核算", "sys_code": "ZHHS" },
{ "city_code": "3210", "city": "扬州市", "county": "市本级", "county_code": "321000", "sys_name": "老非税收入征缴系统", "sys_code": "FSSR" },
{ "city_code": "3210", "city": "扬州市", "county": "市本级", "county_code": "321000", "sys_name": "扬州财政一体化信息管理系统", "sys_code": "YTH" },
{ "city_code": "3210", "city": "扬州市", "county": "广陵区", "county_code": "321002", "sys_name": "财政一体化系统", "sys_code": "YTH" },
{ "city_code": "3210", "city": "扬州市", "county": "广陵区", "county_code": "321002", "sys_name": "非税收入管理系统", "sys_code": "FSSR" },
{ "city_code": "3210", "city": "扬州市", "county": "邗江区", "county_code": "321003", "sys_name": "财政一体化系统", "sys_code": "YTH" },
{ "city_code": "3210", "city": "扬州市", "county": "邗江区", "county_code": "321003", "sys_name": "非税系统", "sys_code": "FSSR" },
{ "city_code": "3210", "city": "扬州市", "county": "邗江区", "county_code": "321003", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3210", "city": "扬州市", "county": "宝应县", "county_code": "321023", "sys_name": "非税收入征收", "sys_code": "FSSR" },
{ "city_code": "3210", "city": "扬州市", "county": "宝应县", "county_code": "321023", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3210", "city": "扬州市", "county": "仪征市", "county_code": "321081", "sys_name": "部门预算编制", "sys_code": "BMYS" },
{ "city_code": "3210", "city": "扬州市", "county": "仪征市", "county_code": "321081", "sys_name": "非税收入收缴", "sys_code": "FSSR" },
{ "city_code": "3210", "city": "扬州市", "county": "仪征市", "county_code": "321081", "sys_name": "行政事业性单位国有资产管理", "sys_code": "ZCGL" },
{ "city_code": "3210", "city": "扬州市", "county": "仪征市", "county_code": "321081", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3210", "city": "扬州市", "county": "高邮市", "county_code": "321084", "sys_name": "财政业务系统", "sys_code": "YTH" },
{ "city_code": "3210", "city": "扬州市", "county": "江都区", "county_code": "321088", "sys_name": "财政业务综合系统", "sys_code": "ZHYW" },
{ "city_code": "3210", "city": "扬州市", "county": "江都区", "county_code": "321088", "sys_name": "江都开发区预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3211", "city": "镇江市", "county": "市本级", "county_code": "321100", "sys_name": "财政一体化", "sys_code": "YTH" },
{ "city_code": "3211", "city": "镇江市", "county": "京口区", "county_code": "321102", "sys_name": "富深协通财政一体化业务管理系统", "sys_code": "YTH" },
{ "city_code": "3211", "city": "镇江市", "county": "京口区", "county_code": "321102", "sys_name": "富深协通非税收缴系统", "sys_code": "FSSR" },
{ "city_code": "3211", "city": "镇江市", "county": "京口区", "county_code": "321102", "sys_name": "富深协通工资统发系统", "sys_code": "GZTF" },
{ "city_code": "3211", "city": "镇江市", "county": "润州区", "county_code": "321111", "sys_name": "部门预算系统", "sys_code": "BMYS" },
{ "city_code": "3211", "city": "镇江市", "county": "润州区", "county_code": "321111", "sys_name": "财政一体化", "sys_code": "YTH" },
{ "city_code": "3211", "city": "镇江市", "county": "润州区", "county_code": "321111", "sys_name": "非税收入", "sys_code": "FSSR" },
{ "city_code": "3211", "city": "镇江市", "county": "丹徒区", "county_code": "321112", "sys_name": "财政综合业务系统", "sys_code": "YTH" },
{ "city_code": "3211", "city": "镇江市", "county": "丹阳市", "county_code": "321181", "sys_name": "部门预算系统", "sys_code": "BMYS" },
{ "city_code": "3211", "city": "镇江市", "county": "丹阳市", "county_code": "321181", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3211", "city": "镇江市", "county": "扬中市", "county_code": "321182", "sys_name": "部门预算系统", "sys_code": "BMYS" },
{ "city_code": "3211", "city": "镇江市", "county": "扬中市", "county_code": "321182", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3211", "city": "镇江市", "county": "句容市", "county_code": "321183", "sys_name": "非税收入", "sys_code": "FSSR" },
{ "city_code": "3211", "city": "镇江市", "county": "句容市", "county_code": "321183", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3212", "city": "泰州市", "county": "市本级", "county_code": "321200", "sys_name": "泰州市_市本级_部门预算系统", "sys_code": "BMYS" },
{ "city_code": "3212", "city": "泰州市", "county": "市本级", "county_code": "321200", "sys_name": "泰州市_市本级_非税收入系统", "sys_code": "FSSR" },
{ "city_code": "3212", "city": "泰州市", "county": "市本级", "county_code": "321200", "sys_name": "泰州市_市本级_绩效管理系统", "sys_code": "JXGL" },
{ "city_code": "3212", "city": "泰州市", "county": "市本级", "county_code": "321200", "sys_name": "泰州市_市本级_预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3212", "city": "泰州市", "county": "市本级", "county_code": "321200", "sys_name": "泰州市_市本级_综合治税系统", "sys_code": "ZHZS" },
{ "city_code": "3212", "city": "泰州市", "county": "海陵区", "county_code": "321202", "sys_name": "泰州市_海陵区_部门预算编制系统", "sys_code": "BMYS" },
{ "city_code": "3212", "city": "泰州市", "county": "海陵区", "county_code": "321202", "sys_name": "泰州市_海陵区_县区财政一体化", "sys_code": "YTH" },
{ "city_code": "3212", "city": "泰州市", "county": "高港区", "county_code": "321203", "sys_name": "泰州市_高港区_预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3212", "city": "泰州市", "county": "姜堰区", "county_code": "321204", "sys_name": "泰州市_姜堰区_部门预算系统", "sys_code": "BMYS" },
{ "city_code": "3212", "city": "泰州市", "county": "姜堰区", "county_code": "321204", "sys_name": "泰州市_姜堰区_财政一体化系统", "sys_code": "YTH" },
{ "city_code": "3212", "city": "泰州市", "county": "姜堰区", "county_code": "321204", "sys_name": "泰州市_姜堰区_非税收缴系统", "sys_code": "FSSR" },
{ "city_code": "3212", "city": "泰州市", "county": "姜堰区", "county_code": "321204", "sys_name": "泰州市_姜堰区_预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3212", "city": "泰州市", "county": "医药高新区", "county_code": "321205", "sys_name": "泰州市_医药高新区_财政一体化系统", "sys_code": "YTH" },
{ "city_code": "3212", "city": "泰州市", "county": "兴化市", "county_code": "321281", "sys_name": "泰州市_兴化市_部门预算", "sys_code": "BMYS" },
{ "city_code": "3212", "city": "泰州市", "county": "兴化市", "county_code": "321281", "sys_name": "泰州市_兴化市_非税收缴", "sys_code": "FSSR" },
{ "city_code": "3212", "city": "泰州市", "county": "兴化市", "county_code": "321281", "sys_name": "泰州市_兴化市_国库集中支付", "sys_code": "GKZF" },
{ "city_code": "3212", "city": "泰州市", "county": "靖江市", "county_code": "321282", "sys_name": "泰州市_靖江市_预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3212", "city": "泰州市", "county": "靖江市", "county_code": "321282", "sys_name": "泰州市_靖江市_非税收入收缴", "sys_code": "FSSR" },
{ "city_code": "3212", "city": "泰州市", "county": "靖江市", "county_code": "321282", "sys_name": "泰州市_靖江市_部门预算编审系统", "sys_code": "BMYS" },
{ "city_code": "3212", "city": "泰州市", "county": "泰兴市", "county_code": "321283", "sys_name": "泰州市_泰兴市_部门预算系统", "sys_code": "BMYS" },
{ "city_code": "3212", "city": "泰州市", "county": "泰兴市", "county_code": "321283", "sys_name": "泰州市_泰兴市_非税收入管理系统", "sys_code": "FSSR" },
{ "city_code": "3212", "city": "泰州市", "county": "泰兴市", "county_code": "321283", "sys_name": "泰州市_泰兴市_预算执行系统", "sys_code": "BMYS" },
{ "city_code": "3213", "city": "宿迁市", "county": "市本级", "county_code": "321300", "sys_name": "部门预算管理系统", "sys_code": "BMYS" },
{ "city_code": "3213", "city": "宿迁市", "county": "市本级", "county_code": "321300", "sys_name": "非税收入管理系统", "sys_code": "FSSR" },
{ "city_code": "3213", "city": "宿迁市", "county": "市本级", "county_code": "321300", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3213", "city": "宿迁市", "county": "宿城区", "county_code": "321302", "sys_name": "财政一体化平台及国库集中支付系统", "sys_code": "GKZF" },
{ "city_code": "3213", "city": "宿迁市", "county": "宿城区", "county_code": "321302", "sys_name": "新中大非税收入管理", "sys_code": "FSSR" },
{ "city_code": "3213", "city": "宿迁市", "county": "宿城区", "county_code": "321302", "sys_name": "总预算会计核算系统", "sys_code": "KJHS" },
{ "city_code": "3213", "city": "宿迁市", "county": "宿豫区", "county_code": "321311", "sys_name": "非税收缴管理系统", "sys_code": "FSSR" },
{ "city_code": "3213", "city": "宿迁市", "county": "宿豫区", "county_code": "321311", "sys_name": "联友财务管理系统", "sys_code": "CWGL" },
{ "city_code": "3213", "city": "宿迁市", "county": "宿豫区", "county_code": "321311", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3213", "city": "宿迁市", "county": "沭阳县", "county_code": "321322", "sys_name": "非税收入管理系统", "sys_code": "FSSR" },
{ "city_code": "3213", "city": "宿迁市", "county": "沭阳县", "county_code": "321322", "sys_name": "国库集中支付、指标管理系统", "sys_code": "YSZX" },
{ "city_code": "3213", "city": "宿迁市", "county": "沭阳县", "county_code": "321322", "sys_name": "开发区总预算系统", "sys_code": "BMYS" },
{ "city_code": "3213", "city": "宿迁市", "county": "沭阳县", "county_code": "321322", "sys_name": "总预算会计核算", "sys_code": "KJHS" },
{ "city_code": "3213", "city": "宿迁市", "county": "泗阳县", "county_code": "321323", "sys_name": "预算执行", "sys_code": "YSZX" },
{ "city_code": "3213", "city": "宿迁市", "county": "泗洪县", "county_code": "321324", "sys_name": "部门预算系统", "sys_code": "BMYS" },
{ "city_code": "3213", "city": "宿迁市", "county": "泗洪县", "county_code": "321324", "sys_name": "非税收入管理系统", "sys_code": "FSSR" },
{ "city_code": "3213", "city": "宿迁市", "county": "泗洪县", "county_code": "321324", "sys_name": "国库集中支付系统", "sys_code": "GKZF" },
{ "city_code": "3213", "city": "宿迁市", "county": "泗洪县", "county_code": "321324", "sys_name": "国库账务系统", "sys_code": "KJHS" },
{ "city_code": "3201", "city": "南京市", "county": "高新区", "county_code": "320100GXQ", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3201", "city": "南京市", "county": "化工园区", "county_code": "320100HGY", "sys_name": "化学工业园区非税收入管理系统", "sys_code": "FSSR" },
{ "city_code": "3201", "city": "南京市", "county": "经济技术开发区", "county_code": "320100JKQ", "sys_name": "非税收入账套", "sys_code": "FSZT" },
{ "city_code": "3201", "city": "南京市", "county": "化工园区", "county_code": "320101HGY", "sys_name": "化学工业园区预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3201", "city": "南京市", "county": "经济技术开发区", "county_code": "320101JKQ", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3201", "city": "南京市", "county": "化工园区", "county_code": "320102HGY", "sys_name": "会计核算", "sys_code": "KYHS" },
{ "city_code": "3201", "city": "南京市", "county": "经济技术开发区", "county_code": "320102JKQ", "sys_name": "总预算会计账", "sys_code": "KJHS" },
{ "city_code": "3202", "city": "无锡市", "county": "锡山开发区", "county_code": "320205KFQ", "sys_name": "预算内外收支核算系统", "sys_code": "KJHS" },
{ "city_code": "3202", "city": "无锡市", "county": "滨湖区马山开发区", "county_code": "320211KFQ", "sys_name": "账户核算系统", "sys_code": "ZHHS" },
{ "city_code": "3202", "city": "无锡市", "county": "江阴开发区", "county_code": "320281kfq", "sys_name": "财政一体化平台", "sys_code": "YTH" },
{ "city_code": "3202", "city": "无锡市", "county": "江阴开发区", "county_code": "320281kfq", "sys_name": "账户核算系统", "sys_code": "ZHHS" },
{ "city_code": "3202", "city": "无锡市", "county": "宜兴环科园", "county_code": "320282KFQ", "sys_name": "财务核算系统", "sys_code": "ZHHS" },
{ "city_code": "3202", "city": "无锡市", "county": "宜兴开发区", "county_code": "320282KFQ", "sys_name": "总预算核算系统", "sys_code": "ZHHS" },
{ "city_code": "3203", "city": "徐州市", "county": "经济技术开发区", "county_code": "320300JKQ", "sys_name": "富深协通财政一体化业务管理系统软件", "sys_code": "YTH" },
{ "city_code": "3203", "city": "徐州市", "county": "经济技术开发区", "county_code": "320300JKQ", "sys_name": "账务处理系统(收支分类改革升级版)", "sys_code": "KJHS" },
{ "city_code": "3204", "city": "常州市", "county": "天宁经开区", "county_code": "320402JKQ", "sys_name": "账务处理系统", "sys_code": "KJHS" },
{ "city_code": "3204", "city": "常州市", "county": "钟楼区开发区", "county_code": "320404KFQ", "sys_name": "国库集中支付系统", "sys_code": "GKZF" },
{ "city_code": "3204", "city": "常州市", "county": "钟楼区开发区", "county_code": "320405KFQ", "sys_name": "用款计划系统", "sys_code": "JHGL" },
{ "city_code": "3204", "city": "常州市", "county": "钟楼区开发区", "county_code": "320406KFQ", "sys_name": "指标管理系统", "sys_code": "ZBGL" },
{ "city_code": "3204", "city": "常州市", "county": "钟楼区开发区", "county_code": "320407KFQ", "sys_name": "总预算系统", "sys_code": "ZYS" },
{ "city_code": "3204", "city": "常州市", "county": "经开区", "county_code": "320412JKQ", "sys_name": "财政预算外业务", "sys_code": "YSW" },
{ "city_code": "3204", "city": "常州市", "county": "经开区", "county_code": "320412JKQ", "sys_name": "非税收缴系统", "sys_code": "FSSR" },
{ "city_code": "3204", "city": "常州市", "county": "经开区", "county_code": "320412JKQ", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3204", "city": "常州市", "county": "武进高新区", "county_code": "320413GXQ", "sys_name": "财政一体化管理信息系统", "sys_code": "YTH" },
{ "city_code": "3204", "city": "常州市", "county": "溧阳中关村", "county_code": "320481ZGC", "sys_name": "用友U8R10财政一体化平台", "sys_code": "YTH" },
{ "city_code": "3204", "city": "常州市", "county": "溧阳中关村开发区", "county_code": "320481ZGCKF", "sys_name": "用友U8R10财政一体化平台", "sys_code": "YTH" },
{ "city_code": "3205", "city": "苏州市", "county": "相城区开发区", "county_code": "320507KFQ", "sys_name": "开发区财政系统", "sys_code": "YTH" },
{ "city_code": "3205", "city": "苏州市", "county": "常熟市高新区", "county_code": "320581GXQ", "sys_name": "高新区总预算系统", "sys_code": "ZYS" },
{ "city_code": "3205", "city": "苏州市", "county": "昆山市开发区", "county_code": "320583KFQ", "sys_name": "开发区公共财政服务平台", "sys_code": "YTH" },
{ "city_code": "3205", "city": "苏州市", "county": "太仓市新区", "county_code": "320585XQ", "sys_name": "非税收入系统", "sys_code": "FSSR" },
{ "city_code": "3205", "city": "苏州市", "county": "太仓市新区", "county_code": "320586XQ", "sys_name": "会计核算系统", "sys_code": "KJHS" },
{ "city_code": "3205", "city": "苏州市", "county": "太仓市新区", "county_code": "320587XQ", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3206", "city": "南通市", "county": "开发区", "county_code": "320600KFQ", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3206", "city": "南通市", "county": "苏通园区", "county_code": "320600STY", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3206", "city": "南通市", "county": "通州湾示范区", "county_code": "320600TZW", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3207", "city": "连云港市", "county": "开发区", "county_code": "320701KFQ", "sys_name": "非税收入", "sys_code": "FSSR" },
{ "city_code": "3208", "city": "淮安市", "county": "开发区", "county_code": "320800KFQ", "sys_name": "用友GRP-U8管理软件", "sys_code": "YTH" },
{ "city_code": "3209", "city": "盐城市", "county": "城南新区", "county_code": "320900CZXQ", "sys_name": "盐城市_城南新区_国库集中支付系统", "sys_code": "GKZF" },
{ "city_code": "3209", "city": "盐城市", "county": "城南新区", "county_code": "320901CZXQ", "sys_name": "盐城市_城南新区_总预算账务处理系统", "sys_code": "KJHS" },
{ "city_code": "3210", "city": "扬州市", "county": "化工园区", "county_code": "321000HGY", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3210", "city": "扬州市", "county": "开发区", "county_code": "321000KFQ", "sys_name": "非税收入收缴", "sys_code": "FSSR" },
{ "city_code": "3210", "city": "扬州市", "county": "科技新城", "county_code": "321000KJC", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3210", "city": "扬州市", "county": "蜀冈-瘦西湖风景名胜区", "county_code": "321000SXH", "sys_name": "财政预算指标管理", "sys_code": "ZBGL" },
{ "city_code": "3210", "city": "扬州市", "county": "蜀冈-瘦西湖风景名胜区", "county_code": "321000SXH", "sys_name": "总预算会计核算", "sys_code": "KJHS" },
{ "city_code": "3210", "city": "扬州市", "county": "开发区", "county_code": "321001KFQ", "sys_name": "一体化系统", "sys_code": "YTH" },
{ "city_code": "3210", "city": "扬州市", "county": "开发区", "county_code": "321002KFQ", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3210", "city": "扬州市", "county": "高邮开发区", "county_code": "321084KFQ", "sys_name": "财政业务系统", "sys_code": "YTH" },
{ "city_code": "3211", "city": "镇江市", "county": "新区", "county_code": "321100XQ", "sys_name": "财政一体化", "sys_code": "YTH" },
{ "city_code": "3212", "city": "泰州市", "county": "市本级", "county_code": "321200", "sys_name": "泰州市_市本级_行政管理系统", "sys_code": "XZGL" },
{ "city_code": "3213", "city": "宿迁市", "county": "湖滨新城", "county_code": "321300HBXC", "sys_name": "新中大财务软件", "sys_code": "KJHS" },
{ "city_code": "3213", "city": "宿迁市", "county": "经开区", "county_code": "321300JKQ", "sys_name": "新中大公共财政管理软件", "sys_code": "YTH" },
{ "city_code": "3213", "city": "宿迁市", "county": "洋河新区", "county_code": "321300YHXQ", "sys_name": "预算执行系统", "sys_code": "YSZX" },
{ "city_code": "3213", "city": "宿迁市", "county": "宿豫区开发区", "county_code": "321311KFQ", "sys_name": "开发区新中大财务核算系统", "sys_code": "KJHS" },
{ "city_code": "3213", "city": "宿迁市", "county": "泗洪县开发区", "county_code": "321324KFQ", "sys_name": "开发区账务系统", "sys_code": "KJHS" }];
function getCountyByCode(code) {
//var jsobj = JSON.parse(origin_place_arr);
var jsobj = Kubernetes.origin_place_arr;
var jsonlength = jsobj.length;
for (var i = 0; i < jsonlength; i++) {
if (jsobj[i].county_code == code) {
return jsobj[i].city + jsobj[i].county;
}
}
return code;
}
Kubernetes.getCountyByCode = getCountyByCode;
function getCodeByCounty(place) {
place = place.replace(/\s*\t*/gim, "");
//var jsobj = JSON.parse(origin_place_arr);
var jsobj = Kubernetes.origin_place_arr;
var jsonlength = jsobj.length;
for (var i = 0; i < jsonlength; i++) {
if (jsobj[i].city === "" || jsobj[i].city == undefined)
continue;
if (jsobj[i].county === "" || jsobj[i].county == undefined)
continue;
if ((place.indexOf(jsobj[i].city) != -1) && (place.indexOf(jsobj[i].county) != -1)) {
return jsobj[i].county_code;
}
}
return place;
}
Kubernetes.getCodeByCounty = getCodeByCounty;
function getSystemNameById(id) {
var temJson = Kubernetes.system_arr;
var sys_size = temJson.length;
for (var i = 0; i < sys_size; i++) {
if (temJson[i].sys_id == id) {
return temJson[i].sys_name;
}
}
return id;
}
Kubernetes.getSystemNameById = getSystemNameById;
function getIdBySystemName(name) {
var temJson = Kubernetes.system_arr;
var sys_size = temJson.length;
for (var i = 0; i < sys_size; i++) {
if (temJson[i].sys_name == name) {
return temJson[i].sys_id;
}
}
return name;
}
Kubernetes.getIdBySystemName = getIdBySystemName;
function getCodeBySystemName(name) {
var jsobj = Kubernetes.origin_place_arr;
var jsonlength = jsobj.length;
for (var i = 0; i < jsonlength; i++) {
if (jsobj[i].sys_name == name) {
return jsobj[i].sys_code;
}
}
return name;
}
Kubernetes.getCodeBySystemName = getCodeBySystemName;
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesInterfaces.ts"/>
/// <reference path="utilHelpers.ts"/>
/// <reference path="../../configs/ts/customAlert.ts"/>
/// <reference path="readPlacedivision.ts"/>
/// <reference path="../../configs/ts/ConfigsHelper.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.context = '/kubernetes';
Kubernetes.hash = '#' + Kubernetes.context;
Kubernetes.defaultRoute = Kubernetes.hash + '/apps';
Kubernetes.pluginName = 'Kubernetes';
Kubernetes.pluginPath = 'plugins/kubernetes/';
Kubernetes.templatePath = Kubernetes.pluginPath + 'html/';
Kubernetes.log = Logger.get(Kubernetes.pluginName);
Kubernetes.keepPollingModel = true;
Kubernetes.defaultIconUrl = Core.url("/img/kubernetes.svg");
Kubernetes.hostIconUrl = Core.url("/img/host.svg");
// this gets set as a pre-bootstrap task
Kubernetes.osConfig = undefined;
Kubernetes.masterUrl = "";
Kubernetes.defaultApiVersion = "v1";
Kubernetes.defaultOSApiVersion = "v1";
Kubernetes.labelFilterTextSeparator = ",";
Kubernetes.defaultNamespace = "default";
Kubernetes.appSuffix = ".app";
// kubernetes service names
Kubernetes.kibanaServiceName = "kibana";
Kubernetes.fabric8ForgeServiceName = "fabric8-forge";
Kubernetes.gogsServiceName = "gogs";
Kubernetes.jenkinsServiceName = "jenkins";
Kubernetes.apimanServiceName = 'apiman';
Kubernetes.isOpenShift = true;
Kubernetes.sshSecretDataKeys = ["ssh-key", "ssh-key.pub"];
Kubernetes.httpsSecretDataKeys = ["username", "password"];
function kubernetesNamespacePath() {
var ns = currentKubernetesNamespace();
if (ns) {
return "/namespaces/" + ns;
}
else {
return "";
}
}
Kubernetes.kubernetesNamespacePath = kubernetesNamespacePath;
function apiPrefix() {
var prefix = Core.pathGet(Kubernetes.osConfig, ['api', 'k8s', 'prefix']);
if (!prefix) {
prefix = 'api';
}
return Core.trimLeading(prefix, '/');
}
Kubernetes.apiPrefix = apiPrefix;
function osApiPrefix() {
var prefix = Core.pathGet(Kubernetes.osConfig, ['api', 'openshift', 'prefix']);
if (!prefix) {
prefix = 'oapi';
}
var answer = Core.trimLeading(prefix, '/');
if (!Kubernetes.isOpenShift) {
return UrlHelpers.join(apiPrefix(), Kubernetes.defaultOSApiVersion, "proxy", kubernetesNamespacePath(), "services/templates", answer);
}
return answer;
}
Kubernetes.osApiPrefix = osApiPrefix;
function masterApiUrl() {
return Kubernetes.masterUrl || "";
}
Kubernetes.masterApiUrl = masterApiUrl;
/** WARNING - this excludes the host name - you probably want to use: kubernetesApiUrl() instead!! */
function kubernetesApiPrefix() {
return UrlHelpers.join(apiPrefix(), Kubernetes.defaultApiVersion);
}
Kubernetes.kubernetesApiPrefix = kubernetesApiPrefix;
function openshiftApiPrefix() {
return UrlHelpers.join(osApiPrefix(), Kubernetes.defaultOSApiVersion);
}
Kubernetes.openshiftApiPrefix = openshiftApiPrefix;
function prefixForType(type) {
if (type === Kubernetes.WatchTypes.NAMESPACES) {
return kubernetesApiPrefix();
}
if (_.any(Kubernetes.NamespacedTypes.k8sTypes, function (t) { return t === type; })) {
return kubernetesApiPrefix();
}
if (_.any(Kubernetes.NamespacedTypes.osTypes, function (t) { return t === type; })) {
return openshiftApiPrefix();
}
// lets assume its an OpenShift extension type
return openshiftApiPrefix();
}
Kubernetes.prefixForType = prefixForType;
function kubernetesApiUrl() {
return UrlHelpers.join(masterApiUrl(), kubernetesApiPrefix());
}
Kubernetes.kubernetesApiUrl = kubernetesApiUrl;
function openshiftApiUrl() {
return UrlHelpers.join(masterApiUrl(), openshiftApiPrefix());
}
Kubernetes.openshiftApiUrl = openshiftApiUrl;
function resourcesUriForKind(type, ns) {
if (ns === void 0) { ns = null; }
if (!ns) {
ns = currentKubernetesNamespace();
}
return UrlHelpers.join(masterApiUrl(), prefixForType(type), namespacePathForKind(type, ns));
}
Kubernetes.resourcesUriForKind = resourcesUriForKind;
function uriTemplateForKubernetesKind(type) {
var urlTemplate = '';
switch (type) {
case Kubernetes.WatchTypes.NAMESPACES:
case "Namespaces":
urlTemplate = UrlHelpers.join('namespaces');
break;
case Kubernetes.WatchTypes.OAUTH_CLIENTS:
case "OAuthClients":
case "OAuthClient":
return UrlHelpers.join('oauthclients');
case Kubernetes.WatchTypes.PROJECTS:
case "Projects":
urlTemplate = UrlHelpers.join('projects');
break;
default:
urlTemplate = UrlHelpers.join('namespaces/:namespace', type, ':id');
}
return urlTemplate;
}
Kubernetes.uriTemplateForKubernetesKind = uriTemplateForKubernetesKind;
function namespacePathForKind(type, ns) {
var urlTemplate = '';
switch (type) {
case Kubernetes.WatchTypes.NAMESPACES:
case "Namespaces":
case "Namespace":
return UrlHelpers.join('namespaces');
case Kubernetes.WatchTypes.NODES:
case "Nodes":
case "node":
return UrlHelpers.join('nodes');
case Kubernetes.WatchTypes.PROJECTS:
case "Projects":
case "Project":
return UrlHelpers.join('projects');
case Kubernetes.WatchTypes.OAUTH_CLIENTS:
case "OAuthClients":
case "OAuthClient":
return UrlHelpers.join('oauthclients');
case Kubernetes.WatchTypes.PERSISTENT_VOLUMES:
case "PersistentVolumes":
case "PersistentVolume":
return UrlHelpers.join('persistentvolumes');
default:
return UrlHelpers.join('namespaces', ns, type);
}
}
Kubernetes.namespacePathForKind = namespacePathForKind;
/**
* Returns thevalue from the injector if its available or null
*/
function inject(name) {
var injector = HawtioCore.injector;
return injector ? injector.get(name) : null;
}
Kubernetes.inject = inject;
function createResource(thing, urlTemplate, $resource, KubernetesModel) {
var prefix = prefixForType(thing);
if (!prefix) {
Kubernetes.log.debug("Invalid type given: ", thing);
return null;
}
var params = {
namespace: currentKubernetesNamespace
};
switch (thing) {
case Kubernetes.WatchTypes.NAMESPACES:
case Kubernetes.WatchTypes.OAUTH_CLIENTS:
case Kubernetes.WatchTypes.NODES:
case Kubernetes.WatchTypes.PROJECTS:
case Kubernetes.WatchTypes.OAUTH_CLIENTS:
case Kubernetes.WatchTypes.PERSISTENT_VOLUMES:
params = {};
}
var url = UrlHelpers.join(masterApiUrl(), prefix, urlTemplate);
Kubernetes.log.debug("Url for ", thing, ": ", url);
var resource = $resource(url, null, {
query: { method: 'GET', isArray: false, params: params },
create: { method: 'POST', params: params },
save: { method: 'PUT', params: params },
delete: { method: 'DELETE', params: _.extend({
id: '@id'
}, params) }
});
return resource;
}
Kubernetes.createResource = createResource;
function imageRepositoriesRestURL() {
return UrlHelpers.join(openshiftApiUrl(), kubernetesNamespacePath(), "/imagestreams");
}
Kubernetes.imageRepositoriesRestURL = imageRepositoriesRestURL;
function deploymentConfigsRestURL() {
return UrlHelpers.join(openshiftApiUrl(), kubernetesNamespacePath(), "/deploymentconfigs");
}
Kubernetes.deploymentConfigsRestURL = deploymentConfigsRestURL;
function buildsRestURL() {
return UrlHelpers.join(openshiftApiUrl(), kubernetesNamespacePath(), "/builds");
}
Kubernetes.buildsRestURL = buildsRestURL;
function buildConfigHooksRestURL() {
return UrlHelpers.join(openshiftApiUrl(), kubernetesNamespacePath(), "/buildconfighooks");
}
Kubernetes.buildConfigHooksRestURL = buildConfigHooksRestURL;
function buildConfigsRestURL() {
return UrlHelpers.join(openshiftApiUrl(), kubernetesNamespacePath(), "/buildconfigs");
}
Kubernetes.buildConfigsRestURL = buildConfigsRestURL;
function routesRestURL() {
return UrlHelpers.join(openshiftApiUrl(), kubernetesNamespacePath(), "/routes");
}
Kubernetes.routesRestURL = routesRestURL;
function templatesRestURL() {
return UrlHelpers.join(openshiftApiUrl(), kubernetesNamespacePath(), "/templates");
}
Kubernetes.templatesRestURL = templatesRestURL;
function getNamespace(entity) {
var answer = Core.pathGet(entity, ["metadata", "namespace"]);
return answer ? answer : currentKubernetesNamespace();
}
Kubernetes.getNamespace = getNamespace;
function getLabels(entity) {
var answer = Core.pathGet(entity, ["metadata", "labels"]);
return answer ? answer : {};
}
Kubernetes.getLabels = getLabels;
function getName(entity) {
if (angular.isString(entity)) {
return entity;
}
return Core.pathGet(entity, ["metadata", "name"]) || Core.pathGet(entity, "name") || Core.pathGet(entity, "id");
}
Kubernetes.getName = getName;
function getKind(entity) {
return Core.pathGet(entity, ["metadata", "kind"]) || Core.pathGet(entity, "kind");
}
Kubernetes.getKind = getKind;
function getSelector(entity) {
return Core.pathGet(entity, ["spec", "selector"]);
}
Kubernetes.getSelector = getSelector;
function getHost(pod) {
return Core.pathGet(pod, ["spec", "host"]) || Core.pathGet(pod, ["spec", "nodeName"]) || Core.pathGet(pod, ["status", "hostIP"]);
}
Kubernetes.getHost = getHost;
function getStatus(pod) {
return Core.pathGet(pod, ["status", "phase"]);
}
Kubernetes.getStatus = getStatus;
function getPorts(service) {
return Core.pathGet(service, ["spec", "ports"]);
}
Kubernetes.getPorts = getPorts;
function getCreationTimestamp(entity) {
return Core.pathGet(entity, ["metadata", "creationTimestamp"]);
}
Kubernetes.getCreationTimestamp = getCreationTimestamp;
;
function getAnnotations(entity) {
return Core.pathGet(entity, ["metadata", "annotations"]);
}
Kubernetes.getAnnotations = getAnnotations;
//var fabricDomain = Fabric.jmxDomain;
var fabricDomain = "io.fabric8";
Kubernetes.mbean = fabricDomain + ":type=Kubernetes";
Kubernetes.managerMBean = fabricDomain + ":type=KubernetesManager";
Kubernetes.appViewMBean = fabricDomain + ":type=AppView";
function isKubernetes(workspace) {
// return workspace.treeContainsDomainAndProperties(fabricDomain, {type: "Kubernetes"});
return true;
}
Kubernetes.isKubernetes = isKubernetes;
function isKubernetesTemplateManager(workspace) {
// return workspace.treeContainsDomainAndProperties(fabricDomain, {type: "KubernetesTemplateManager"});
return true;
}
Kubernetes.isKubernetesTemplateManager = isKubernetesTemplateManager;
function isAppView(workspace) {
// return workspace.treeContainsDomainAndProperties(fabricDomain, {type: "AppView"});
return true;
}
Kubernetes.isAppView = isAppView;
function getStrippedPathName() {
var pathName = Core.trimLeading((this.$location.path() || '/'), "#");
pathName = pathName.replace(/^\//, '');
return pathName;
}
Kubernetes.getStrippedPathName = getStrippedPathName;
function linkContains() {
var words = [];
for (var _i = 0; _i < arguments.length; _i++) {
words[_i - 0] = arguments[_i];
}
var pathName = this.getStrippedPathName();
return _.every(words, function (word) { return pathName.indexOf(word) !== 0; });
}
Kubernetes.linkContains = linkContains;
/**
* Returns true if the given link is active. The link can omit the leading # or / if necessary.
* The query parameters of the URL are ignored in the comparison.
* @method isLinkActive
* @param {String} href
* @return {Boolean} true if the given link is active
*/
function isLinkActive(href) {
// lets trim the leading slash
var pathName = getStrippedPathName();
var link = Core.trimLeading(href, "#");
link = link.replace(/^\//, '');
// strip any query arguments
var idx = link.indexOf('?');
if (idx >= 0) {
link = link.substring(0, idx);
}
if (!pathName.length) {
return link === pathName;
}
else {
return _.startsWith(pathName, link);
}
}
Kubernetes.isLinkActive = isLinkActive;
function setJson($scope, id, collection) {
$scope.id = id;
if (!$scope.fetched) {
return;
}
if (!id) {
$scope.json = '';
return;
}
if (!collection) {
return;
}
var item = collection.find(function (item) { return getName(item) === id; });
if (item) {
$scope.json = angular.toJson(item, true);
$scope.item = item;
}
else {
$scope.id = undefined;
$scope.json = '';
$scope.item = undefined;
}
}
Kubernetes.setJson = setJson;
/**
* Returns the labels text string using the <code>key1=value1,key2=value2,....</code> format
*/
function labelsToString(labels, seperatorText) {
if (seperatorText === void 0) { seperatorText = Kubernetes.labelFilterTextSeparator; }
var answer = "";
angular.forEach(labels, function (value, key) {
var separator = answer ? seperatorText : "";
answer += separator + key + "=" + value;
});
return answer;
}
Kubernetes.labelsToString = labelsToString;
function labelsFormat(replicas) {
var annotion = getAnnotations(replicas);
var lables = getLabels(replicas);
var hasChineseVersion = lables["version"].indexOf("版本") == -1 ? "版本" + lables["version"] : lables["version"];
return {
isExtract: lables["isExtract"],
isTarget: lables["isTarget"],
status: lables["status"],
style: lables["style"],
cityName: annotion["cityName"],
districtName: annotion["districtName"],
systemName: annotion["systemName"],
year: annotion["year"],
version: hasChineseVersion
};
}
Kubernetes.labelsFormat = labelsFormat;
function initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL) {
$scope.baseUri = Core.trimTrailing(Core.url("/") || "", "/") || "";
var injector = HawtioCore.injector;
function hasService(name) {
if (injector) {
var ServiceRegistry = injector.get("ServiceRegistry");
if (ServiceRegistry) {
return ServiceRegistry.hasService(name);
}
}
return false;
}
$scope.hasServiceKibana = function () { return hasService(Kubernetes.kibanaServiceName); };
$scope.hasServiceGogs = function () { return hasService(Kubernetes.gogsServiceName); };
$scope.hasServiceForge = function () { return hasService(Kubernetes.fabric8ForgeServiceName); };
$scope.hasServiceApiman = function () { return hasService(Kubernetes.apimanServiceName); };
$scope.viewTemplates = function () {
var returnTo = $location.url();
$location.path('/kubernetes/templates').search({ 'returnTo': returnTo });
};
$scope.namespace = $routeParams.namespace || $scope.namespace || KubernetesState.selectedNamespace || Kubernetes.defaultNamespace;
if ($scope.namespace != KubernetesState.selectedNamespace) {
KubernetesState.selectedNamespace = $scope.namespace;
// lets show page is going to reload
if ($scope.model) {
$scope.model.fetched = false;
}
}
Kubernetes.setCurrentKubernetesNamespace($scope.namespace);
$scope.forgeEnabled = isForgeEnabled();
$scope.projectId = $routeParams["project"] || $scope.projectId || $scope.id;
var showProjectNavBars = false;
if ($scope.projectId && showProjectNavBars) {
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.projectId);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.projectId, null, $scope);
}
else {
$scope.breadcrumbConfig = Developer.createEnvironmentBreadcrumbs($scope, $location, $routeParams);
$scope.subTabConfig = Developer.createEnvironmentSubNavBars($scope, $location, $routeParams);
}
if ($scope.projectId) {
$scope.$projectLink = Developer.projectLink($scope.projectId);
}
$scope.link = function (href) {
if (!href) {
return href;
}
if ($scope.$projectLink) {
return Developer.namespaceLink($scope, $routeParams, href.replace(/^\/kubernetes/, ''));
}
else {
return href;
}
};
$scope.codeMirrorOptions = {
lineWrapping: true,
lineNumbers: true,
readOnly: 'nocursor',
mode: { name: "javascript", json: true }
};
$scope.resizeDialog = {
controller: null,
newReplicas: 0,
dialog: new UI.Dialog(),
onOk: function () {
var resizeDialog = $scope.resizeDialog;
resizeDialog.dialog.close();
resizeController($http, KubernetesApiURL, resizeDialog.controller, resizeDialog.newReplicas, function () { Kubernetes.log.debug("updated number of replicas"); });
},
open: function (controller) {
var resizeDialog = $scope.resizeDialog;
resizeDialog.controller = controller;
resizeDialog.newReplicas = Core.pathGet(controller, ["status", "replicas"]);
resizeDialog.dialog.open();
$timeout(function () {
$('#replicas').focus();
}, 50);
},
close: function () {
$scope.resizeDialog.dialog.close();
}
};
$scope.triggerBuild = function (buildConfig) {
var url = buildConfig.$triggerUrl;
console.log("triggering build at url: " + url);
if (url) {
//var data = {};
var data = null;
var config = {
headers: {
'Content-Type': "application/json"
}
};
var name = Core.pathGet(buildConfig, ["metadata", "name"]);
Core.notification('info', "Triggering build " + name);
$http.post(url, data, config).
success(function (data, status, headers, config) {
console.log("trigger worked! got data " + angular.toJson(data, true));
// TODO should we show some link to the build
Core.notification('info', "Building " + name);
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
Core.notification('error', "Failed to trigger build for " + name + ". Returned code: " + status + " " + data);
});
}
;
};
// update the URL if the filter is changed
$scope.$watch("tableConfig.filterOptions.filterText", function (text) {
//var filterText = Kubernetes.findValeOfLabels(text);
$location.search("q", text);
});
$scope.$on("labelFilterUpdate", function ($event, text) {
var filterOptions = ($scope.tableConfig || {}).filterOptions || {};
var currentFilter = filterOptions.filterText;
if (Core.isBlank(currentFilter)) {
filterOptions.filterText = text;
}
else {
var expressions = currentFilter.split(/\s+/);
if (expressions.indexOf(text) !== -1) {
// lets exclude this filter expression
expressions = expressions.remove(text);
filterOptions.filterText = expressions.join(" ");
}
else {
filterOptions.filterText = currentFilter + " " + text;
}
}
$scope.id = undefined;
});
}
Kubernetes.initShared = initShared;
/**
* Returns the number of pods that are ready
*/
function readyPodCount(service) {
var count = 0;
angular.forEach((service || {}).$pods, function (pod) {
if (pod.$ready) {
count++;
}
});
return count;
}
Kubernetes.readyPodCount = readyPodCount;
/**
* Returns the service link URL for either the service name or the service object
*/
function serviceLinkUrl(service, httpOnly) {
if (httpOnly === void 0) { httpOnly = false; }
if (angular.isObject(service)) {
var portalIP = service.$host;
// lets assume no custom port for now for external routes
var port = null;
var protocol = "http://";
var spec = service.spec;
if (spec) {
if (!portalIP) {
portalIP = spec.portalIP;
}
var hasHttps = false;
var hasHttp = false;
angular.forEach(spec.ports, function (portSpec) {
var p = portSpec.port;
if (p) {
if (p === 443) {
hasHttps = true;
}
else if (p === 80) {
hasHttp = true;
}
if (!port) {
port = p;
}
}
});
if (!hasHttps && !hasHttp && port) {
// lets treat 8080 as http which is a common service to export
if (port === 8080) {
hasHttp = true;
}
else if (port === 8443) {
hasHttps = true;
}
}
}
if (portalIP) {
if (hasHttps) {
return "https://" + portalIP;
}
else if (hasHttp) {
return "http://" + portalIP;
}
else if (!httpOnly) {
if (port) {
return protocol + portalIP + ":" + port + "/";
}
else {
return protocol + portalIP;
}
}
}
}
else if (service) {
var serviceId = service.toString();
if (serviceId) {
var ServiceRegistry = getServiceRegistry();
if (ServiceRegistry) {
return ServiceRegistry.serviceLink(serviceId) || "";
}
}
}
return "";
}
Kubernetes.serviceLinkUrl = serviceLinkUrl;
/**
* Returns the total number of counters for the podCounters object
*/
function podCounterTotal($podCounters) {
var answer = 0;
if ($podCounters) {
angular.forEach(["ready", "valid", "waiting", "error"], function (name) {
var value = $podCounters[name] || 0;
answer += value;
});
}
return answer;
}
Kubernetes.podCounterTotal = podCounterTotal;
/**
* Given the list of pods lets iterate through them and find all pods matching the selector
* and return counters based on the status of the pod
*/
function createPodCounters(selector, pods, outputPods, podLinkQuery, podLinkUrl) {
if (outputPods === void 0) { outputPods = []; }
if (podLinkQuery === void 0) { podLinkQuery = null; }
if (podLinkUrl === void 0) { podLinkUrl = null; }
if (!podLinkUrl) {
podLinkUrl = "/kubernetes/pods";
}
var filterFn;
if (angular.isFunction(selector)) {
filterFn = selector;
}
else {
filterFn = function (pod) { return selectorMatches(selector, getLabels(pod)); };
}
var answer = {
podsLink: "",
ready: 0,
valid: 0,
waiting: 0,
error: 0
};
if (selector) {
if (!podLinkQuery) {
podLinkQuery = Kubernetes.labelsToString(selector, " ");
}
answer.podsLink = podLinkUrl + "?q=" + encodeURIComponent(podLinkQuery);
angular.forEach(pods, function (pod) {
if (filterFn(pod)) {
outputPods.push(pod);
var status = getStatus(pod);
if (status) {
var lower = status.toLowerCase();
if (lower.startsWith("run")) {
if (isReady(pod)) {
answer.ready += 1;
}
else {
answer.valid += 1;
}
}
else if (lower.startsWith("wait") || lower.startsWith("pend")) {
answer.waiting += 1;
}
else if (lower.startsWith("term") || lower.startsWith("error") || lower.startsWith("fail")) {
answer.error += 1;
}
}
else {
answer.error += 1;
}
}
});
}
return answer;
}
Kubernetes.createPodCounters = createPodCounters;
/**
* Converts the given json into an array of items. If the json contains a nested set of items then that is sorted; so that services
* are processed first; then turned into an array. Otherwise the json is put into an array so it can be processed polymorphically
*/
function convertKubernetesJsonToItems(json) {
var items = json.items;
if (angular.isArray(items)) {
// TODO we could check for List or Config types here and warn if not
// sort the services first
var answer = [];
items.forEach(function (item) {
if (item.kind === "Service") {
answer.push(item);
}
});
items.forEach(function (item) {
if (item.kind !== "Service") {
answer.push(item);
}
});
return answer;
}
else {
return [json];
}
}
Kubernetes.convertKubernetesJsonToItems = convertKubernetesJsonToItems;
function isV1beta1Or2() {
return Kubernetes.defaultApiVersion === "v1beta1" || Kubernetes.defaultApiVersion === "v1beta2";
}
Kubernetes.isV1beta1Or2 = isV1beta1Or2;
/**
* Returns a link to the detail page for the given entity
*/
function entityPageLink(obj) {
if (obj) {
function getLink(entity) {
var viewLink = entity["$viewLink"];
if (viewLink) {
return viewLink;
}
var id = getName(entity);
var kind = getKind(entity);
if (kind && id) {
var path = kind.substring(0, 1).toLowerCase() + kind.substring(1) + "s";
var namespace = getNamespace(entity);
if (namespace && !isIgnoreNamespaceKind(kind)) {
return Core.url(UrlHelpers.join('/kubernetes/namespace', namespace, path, id));
}
else {
return Core.url(UrlHelpers.join('/kubernetes', path, id));
}
}
}
var baseLink = getLink(obj);
if (!HawtioCore.injector || !baseLink) {
return baseLink;
}
var $routeParams = HawtioCore.injector.get('$routeParams');
var projectId = $routeParams['project'] || $routeParams['project'];
if (!projectId) {
return baseLink;
}
return UrlHelpers.join(Developer.projectLink(projectId), baseLink.replace(/^\/kubernetes\//, ''));
}
return null;
}
Kubernetes.entityPageLink = entityPageLink;
function resourceKindToUriPath(kind) {
var kindPath = kind.toLowerCase() + "s";
if (kindPath === "replicationControllers" && !isV1beta1Or2()) {
kindPath = "replicationcontrollers";
}
return kindPath;
}
Kubernetes.resourceKindToUriPath = resourceKindToUriPath;
function isIgnoreNamespaceKind(kind) {
return kind === "Host" || kind === "Minion";
}
/**
* Returns the root URL for the kind
*/
function kubernetesUrlForKind(KubernetesApiURL, kind, namespace, path) {
if (namespace === void 0) { namespace = null; }
if (path === void 0) { path = null; }
var pathSegment = "";
if (path) {
pathSegment = "/" + Core.trimLeading(path, "/");
}
var kindPath = resourceKindToUriPath(kind);
var ignoreNamespace = isIgnoreNamespaceKind(kind);
if (isV1beta1Or2() || ignoreNamespace) {
var postfix = "";
if (namespace && !ignoreNamespace) {
postfix = "?namespace=" + namespace;
}
return UrlHelpers.join(KubernetesApiURL, kindPath, pathSegment, postfix);
}
else {
return UrlHelpers.join(KubernetesApiURL, "/namespaces/", namespace, kindPath, pathSegment);
}
}
Kubernetes.kubernetesUrlForKind = kubernetesUrlForKind;
;
/**
* Returns the base URL for the kind of kubernetes resource or null if it cannot be found
*/
function kubernetesUrlForItemKind(KubernetesApiURL, json) {
var kind = json.kind;
if (kind) {
return kubernetesUrlForKind(KubernetesApiURL, kind, json.namespace);
}
else {
Kubernetes.log.warn("Ignoring missing kind " + kind + " for kubernetes json: " + angular.toJson(json));
return null;
}
}
Kubernetes.kubernetesUrlForItemKind = kubernetesUrlForItemKind;
function kubernetesProxyUrlForService(KubernetesApiURL, service, path) {
if (path === void 0) { path = null; }
var pathSegment = "";
if (path) {
pathSegment = "/" + Core.trimLeading(path, "/");
}
else {
pathSegment = "/";
}
var namespace = getNamespace(service);
if (isV1beta1Or2()) {
var postfix = "?namespace=" + namespace;
return UrlHelpers.join(KubernetesApiURL, "/proxy", kubernetesNamespacePath(), "/services/" + getName(service) + pathSegment + postfix);
}
else {
return UrlHelpers.join(KubernetesApiURL, "/proxy/namespaces/", namespace, "/services/" + getName(service) + pathSegment);
}
}
Kubernetes.kubernetesProxyUrlForService = kubernetesProxyUrlForService;
function kubernetesProxyUrlForServiceCurrentNamespace(service, path) {
if (path === void 0) { path = null; }
var apiPrefix = UrlHelpers.join(kubernetesApiUrl());
return kubernetesProxyUrlForService(apiPrefix, service, path);
}
Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace = kubernetesProxyUrlForServiceCurrentNamespace;
function buildConfigRestUrl(id) {
return UrlHelpers.join(buildConfigsRestURL(), id);
}
Kubernetes.buildConfigRestUrl = buildConfigRestUrl;
function deploymentConfigRestUrl(id) {
return UrlHelpers.join(deploymentConfigsRestURL(), id);
}
Kubernetes.deploymentConfigRestUrl = deploymentConfigRestUrl;
function imageRepositoryRestUrl(id) {
return UrlHelpers.join(imageRepositoriesRestURL(), id);
}
Kubernetes.imageRepositoryRestUrl = imageRepositoryRestUrl;
function buildRestUrl(id) {
return UrlHelpers.join(buildsRestURL(), id);
}
Kubernetes.buildRestUrl = buildRestUrl;
function buildLogsRestUrl(id) {
return UrlHelpers.join(buildsRestURL(), id, "log");
}
Kubernetes.buildLogsRestUrl = buildLogsRestUrl;
/**
* Runs the given application JSON
*/
function runApp($location, $scope, $http, KubernetesApiURL, json, name, onSuccessFn, namespace, onCompleteFn) {
if (name === void 0) { name = "App"; }
if (onSuccessFn === void 0) { onSuccessFn = null; }
if (namespace === void 0) { namespace = null; }
if (onCompleteFn === void 0) { onCompleteFn = null; }
if (json) {
if (angular.isString(json)) {
json = angular.fromJson(json);
}
name = name || "App";
var postfix = namespace ? " in namespace " + namespace : "";
Core.notification('info', "Running " + name + postfix);
var items = convertKubernetesJsonToItems(json);
angular.forEach(items, function (item) {
var url = kubernetesUrlForItemKind(KubernetesApiURL, item);
if (url) {
$http.post(url, item).
success(function (data, status, headers, config) {
Kubernetes.log.debug("Got status: " + status + " on url: " + url + " data: " + data + " after posting: " + angular.toJson(item));
if (angular.isFunction(onCompleteFn)) {
onCompleteFn();
}
Core.$apply($scope);
}).
error(function (data, status, headers, config) {
var message = null;
if (angular.isObject(data)) {
message = data.message;
var reason = data.reason;
if (reason === "AlreadyExists") {
// lets ignore duplicates
Kubernetes.log.debug("entity already exists at " + url);
return;
}
}
if (!message) {
message = "Failed to POST to " + url + " got status: " + status;
}
Kubernetes.log.warn("Failed to save " + url + " status: " + status + " response: " + angular.toJson(data, true));
Core.notification('error', message);
});
}
});
}
}
Kubernetes.runApp = runApp;
/**
* Returns true if the current status of the pod is running
*/
function isRunning(podCurrentState) {
var status = (podCurrentState || {}).phase;
if (status) {
var lower = status.toLowerCase();
return lower.startsWith("run");
}
else {
return false;
}
}
Kubernetes.isRunning = isRunning;
/**
* Returns true if the labels object has all of the key/value pairs from the selector
*/
function selectorMatches(selector, labels) {
if (angular.isObject(labels)) {
var answer = true;
var count = 0;
angular.forEach(selector, function (value, key) {
count++;
if (answer && labels[key] !== value) {
answer = false;
}
});
return answer && count > 0;
}
else {
return false;
}
}
Kubernetes.selectorMatches = selectorMatches;
/**
* Returns the service registry
*/
function getServiceRegistry() {
var injector = HawtioCore.injector;
return injector ? injector.get("ServiceRegistry") : null;
}
Kubernetes.getServiceRegistry = getServiceRegistry;
/**
* Returns a link to the kibana logs web application
*/
function kibanaLogsLink(ServiceRegistry) {
var link = ServiceRegistry.serviceLink(Kubernetes.kibanaServiceName);
if (link) {
if (!link.endsWith("/")) {
link += "/";
}
return link + "#/dashboard/Fabric8";
}
else {
return null;
}
}
Kubernetes.kibanaLogsLink = kibanaLogsLink;
function openLogsForPods(ServiceRegistry, $window, namespace, pods) {
var link = kibanaLogsLink(ServiceRegistry);
if (link) {
var query = "";
var count = 0;
angular.forEach(pods, function (item) {
var id = getName(item);
if (id) {
var space = query ? " OR " : "";
count++;
query += space + '"' + id + '"';
}
});
if (query) {
if (count > 1) {
query = "(" + query + ")";
}
query = 'kubernetes.namespace_name:"' + namespace + '" AND kubernetes.pod_name:' + query;
link += "?_a=(query:(query_string:(query:'" + query + "')))";
var newWindow = $window.open(link, "viewLogs");
}
}
}
Kubernetes.openLogsForPods = openLogsForPods;
function resizeController($http, KubernetesApiURL, replicationController, newReplicas, onCompleteFn) {
if (onCompleteFn === void 0) { onCompleteFn = null; }
var id = getName(replicationController);
var namespace = getNamespace(replicationController) || "";
var url = kubernetesUrlForKind(KubernetesApiURL, "ReplicationController", namespace, id);
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
var desiredState = data.spec;
if (!desiredState) {
desiredState = {};
data.spec = desiredState;
}
desiredState.replicas = newReplicas;
$http.put(url, data).
success(function (data, status, headers, config) {
Kubernetes.log.debug("updated controller " + url);
if (angular.isFunction(onCompleteFn)) {
onCompleteFn();
}
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to save " + url + " " + data + " " + status);
});
}
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
});
}
Kubernetes.resizeController = resizeController;
function statusTextToCssClass(text, ready) {
if (ready === void 0) { ready = false; }
if (text) {
var lower = text.toLowerCase();
if (lower.startsWith("run") || lower.startsWith("ok")) {
if (!ready) {
return "fa fa-spinner fa-spin green";
}
return 'fa fa-play-circle green';
}
else if (lower.startsWith("wait") || lower.startsWith("pend")) {
return 'fa fa-download';
}
else if (lower.startsWith("term") || lower.startsWith("error") || lower.startsWith("fail")) {
return 'fa fa-off orange';
}
else if (lower.startsWith("succeeded")) {
return 'fa fa-check-circle-o green';
}
}
return 'fa fa-question red';
}
Kubernetes.statusTextToCssClass = statusTextToCssClass;
function podStatus(pod) {
return getStatus(pod);
}
Kubernetes.podStatus = podStatus;
function isReady(pod) {
var status = pod.status || {};
var answer = false;
angular.forEach(status.conditions, function (condition) {
var t = condition.type;
if (t && t === "Ready") {
var status = condition.status;
if (status === "True") {
answer = true;
}
}
});
return answer;
}
Kubernetes.isReady = isReady;
function createAppViewPodCounters(appView) {
var array = [];
var map = {};
var pods = appView.pods;
var lowestDate = null;
angular.forEach(pods, function (pod) {
var selector = getLabels(pod);
var selectorText = Kubernetes.labelsToString(selector, " ");
var answer = map[selector];
if (!answer) {
answer = {
labelText: selectorText,
podsLink: UrlHelpers.join("/kubernetes/namespace/", pod.metadata.namespace, "pods?q=" + encodeURIComponent(selectorText)),
valid: 0,
waiting: 0,
error: 0
};
map[selector] = answer;
array.push(answer);
}
var status = (podStatus(pod) || "Error").toLowerCase();
if (status.startsWith("run") || status.startsWith("ok")) {
answer.valid += 1;
}
else if (status.startsWith("wait") || status.startsWith("pwnd")) {
answer.waiting += 1;
}
else {
answer.error += 1;
}
var creationTimestamp = getCreationTimestamp(pod);
if (creationTimestamp) {
var d = new Date(creationTimestamp);
if (!lowestDate || d < lowestDate) {
lowestDate = d;
}
}
});
appView.$creationDate = lowestDate;
return array;
}
Kubernetes.createAppViewPodCounters = createAppViewPodCounters;
function createAppViewServiceViews(appView) {
var array = [];
var pods = appView.pods;
angular.forEach(pods, function (pod) {
var id = getName(pod);
if (id) {
var abbrev = id;
var idx = id.indexOf("-");
if (idx > 1) {
abbrev = id.substring(0, idx);
}
pod.idAbbrev = abbrev;
}
pod.statusClass = statusTextToCssClass(podStatus(pod), isReady(pod));
});
var services = appView.services || [];
var replicationControllers = appView.replicationControllers || [];
var size = Math.max(services.length, replicationControllers.length, 1);
var appName = appView.$info.name;
for (var i = 0; i < size; i++) {
var service = services[i];
var replicationController = replicationControllers[i];
var controllerId = getName(replicationController);
var name = getName(service) || controllerId;
var address = Core.pathGet(service, ["spec", "portalIP"]);
if (!name && pods.length) {
name = pods[0].idAbbrev;
}
if (!appView.$info.name) {
appView.$info.name = name;
}
if (!appView.id && pods.length) {
appView.id = getName(pods[0]);
}
if (i > 0) {
appName = name;
}
var podCount = pods.length;
var podCountText = podCount + " pod" + (podCount > 1 ? "s" : "");
var view = {
appName: appName || name,
name: name,
createdDate: appView.$creationDate,
podCount: podCount,
podCountText: podCountText,
address: address,
controllerId: controllerId,
service: service,
replicationController: replicationController,
pods: pods
};
array.push(view);
}
return array;
}
Kubernetes.createAppViewServiceViews = createAppViewServiceViews;
/**
* converts a git path into an accessible URL for the browser
*/
function gitPathToUrl(iconPath, branch) {
if (branch === void 0) { branch = "master"; }
return (HawtioCore.injector.get('AppLibraryURL') || '') + "/git/" + branch + iconPath;
}
Kubernetes.gitPathToUrl = gitPathToUrl;
function asDate(value) {
return value ? new Date(value) : null;
}
function enrichBuildConfig(buildConfig, sortedBuilds) {
if (buildConfig) {
var triggerUrl = null;
var metadata = buildConfig.metadata || {};
var name = metadata.name;
buildConfig.$name = name;
var projectLink = Developer.projectLink(name);
var ns = metadata.namespace || currentKubernetesNamespace();
buildConfig.$namespace = ns;
buildConfig.environments = [];
buildConfig.$creationDate = asDate(Kubernetes.getCreationTimestamp(buildConfig));
buildConfig.$labelsText = Kubernetes.labelsToString(getLabels(buildConfig));
if (name) {
buildConfig.$viewLink = UrlHelpers.join("workspaces", ns, "projects", name, "environments");
buildConfig.$editLink = UrlHelpers.join("workspaces", ns, "projects", name, "buildConfigEdit");
angular.forEach([false, true], function (flag) {
angular.forEach(buildConfig.triggers, function (trigger) {
if (!triggerUrl) {
var type = trigger.type;
if (type === "generic" || flag) {
var generic = trigger[type];
if (type && generic) {
var secret = generic.secret;
if (secret) {
triggerUrl = UrlHelpers.join(buildConfigHooksRestURL(), name, secret, type);
buildConfig.$triggerUrl = triggerUrl;
}
}
}
}
});
});
// lets find the latest build...
if (sortedBuilds) {
buildConfig.$lastBuild = _.find(sortedBuilds, {
metadata: {
labels: {
buildconfig: name
}
}
});
}
}
var $fabric8Views = {};
function defaultPropertiesIfNotExist(name, object, autoCreate) {
if (autoCreate === void 0) { autoCreate = false; }
var view = $fabric8Views[name];
if (autoCreate && !view) {
view = {};
$fabric8Views[name] = view;
}
if (view) {
angular.forEach(object, function (value, property) {
var current = view[property];
if (!current) {
view[property] = value;
}
});
}
}
function defaultPropertiesIfNotExistStartsWith(prefix, object, autoCreate) {
if (autoCreate === void 0) { autoCreate = false; }
angular.forEach($fabric8Views, function (view, name) {
if (view && name.startsWith(prefix)) {
angular.forEach(object, function (value, property) {
var current = view[property];
if (!current) {
view[property] = value;
}
});
}
});
}
var labels = metadata.labels || {};
var annotations = metadata.annotations || {};
// lets default the repo and user
buildConfig.$user = annotations["fabric8.jenkins/user"] || labels["user"];
buildConfig.$repo = annotations["fabric8.jenkins/repo"] || labels["repo"];
angular.forEach(annotations, function (value, key) {
var parts = key.split('/', 2);
if (parts.length > 1) {
var linkId = parts[0];
var property = parts[1];
if (linkId && property && linkId.startsWith("fabric8.link")) {
var link = $fabric8Views[linkId];
if (!link) {
link = {
class: linkId
};
$fabric8Views[linkId] = link;
}
link[property] = value;
}
}
});
if (buildConfig.$user && buildConfig.$repo) {
// browse gogs repo view
var gogsUrl = serviceLinkUrl(Kubernetes.gogsServiceName);
if (gogsUrl) {
defaultPropertiesIfNotExist("fabric8.link.browseGogs.view", {
label: "Browse...",
url: UrlHelpers.join(gogsUrl, buildConfig.$user, buildConfig.$repo),
description: "Browse the source code of this repository",
iconClass: "fa fa-external-link"
}, true);
}
// run forge commands view
defaultPropertiesIfNotExist("fabric8.link.forgeCommand.view", {
label: "Command...",
url: UrlHelpers.join(projectLink, "/forge/commands/user", buildConfig.$user, buildConfig.$repo),
description: "Perform an action on this project",
iconClass: "fa fa-play-circle"
}, true);
// configure devops view
defaultPropertiesIfNotExist("fabric8.link.forgeCommand.devops.settings", {
label: "Settings",
url: UrlHelpers.join(projectLink, "/forge/command/devops-edit/user", buildConfig.$user, buildConfig.$repo),
description: "Configure the DevOps settings for this project",
iconClass: "fa fa-pencil-square-o"
}, true);
}
// add some icons and descriptions
defaultPropertiesIfNotExist("fabric8.link.repository.browse", {
label: "Browse...",
description: "Browse the source code of this repository",
iconClass: "fa fa-external-link"
});
defaultPropertiesIfNotExist("fabric8.link.jenkins.job", {
iconClass: "fa fa-tasks",
description: "View the Jenkins Job for this build"
});
defaultPropertiesIfNotExist("fabric8.link.jenkins.monitor", {
iconClass: "fa fa-tachometer",
description: "View the Jenkins Monitor dashboard for this project"
});
defaultPropertiesIfNotExist("fabric8.link.jenkins.pipeline", {
iconClass: "fa fa-arrow-circle-o-right",
description: "View the Jenkins Pipeline for this project"
});
defaultPropertiesIfNotExist("fabric8.link.letschat.room", {
iconClass: "fa fa-comment",
description: "Chat room for this project"
});
defaultPropertiesIfNotExist("fabric8.link.letschat.room", {
iconClass: "fa fa-comment",
description: "Chat room for this project"
});
defaultPropertiesIfNotExist("fabric8.link.taiga", {
iconClass: "fa fa-check-square-o",
description: "Issue tracker for this project"
});
defaultPropertiesIfNotExist("fabric8.link.issues", {
iconClass: "fa fa-check-square-o",
description: "Issues for this project"
});
defaultPropertiesIfNotExist("fabric8.link.releases", {
iconClass: "fa fa-tag",
description: "Issues for this project"
});
defaultPropertiesIfNotExist("fabric8.link.taiga.team", {
iconClass: "fa fa-users",
description: "Team members for this project"
});
defaultPropertiesIfNotExist("fabric8.link.team", {
iconClass: "fa fa-users",
description: "Team members for this project"
});
defaultPropertiesIfNotExistStartsWith("fabric8.link.environment.", {
iconClass: "fa fa-cloud",
description: "The kubernetes namespace for this environment"
});
// lets put the views into sections...
var $fabric8CodeViews = {};
var $fabric8BuildViews = {};
var $fabric8TeamViews = {};
var $fabric8EnvironmentViews = {};
angular.forEach($fabric8Views, function (value, key) {
var view;
if (key.indexOf("taiga") > 0 || key.indexOf(".issue") > 0 || key.indexOf("letschat") > 0 || key.indexOf(".team") > 0) {
view = $fabric8TeamViews;
}
else if (key.indexOf("jenkins") > 0) {
view = $fabric8BuildViews;
}
else if (key.indexOf(".environment.") > 0) {
view = $fabric8EnvironmentViews;
}
else {
view = $fabric8CodeViews;
}
view[key] = value;
});
buildConfig.$fabric8Views = $fabric8Views;
buildConfig.$fabric8CodeViews = $fabric8CodeViews;
buildConfig.$fabric8BuildViews = $fabric8BuildViews;
buildConfig.$fabric8EnvironmentViews = $fabric8EnvironmentViews;
buildConfig.$fabric8TeamViews = $fabric8TeamViews;
var $jenkinsJob = annotations["fabric8.io/jenkins-job"];
if (!$jenkinsJob && $fabric8Views["fabric8.link.jenkins.job"]) {
$jenkinsJob = name;
}
buildConfig.$jenkinsJob = $jenkinsJob;
angular.forEach($fabric8EnvironmentViews, function (env) {
var c = env.class;
var prefix = "fabric8.link.environment.";
if (c && c.startsWith(prefix)) {
var ens = c.substring(prefix.length);
env.namespace = ens;
env.url = UrlHelpers.join("/workspaces", ns, "projects", name, "namespace", ens);
}
buildConfig.environments.push(env);
});
if (!buildConfig.environments.length) {
// lets create a single environment
var ens = ns;
var env = {
namespace: ens,
label: "Current",
description: "The environemnt that this project is built and run inside",
iconClass: "fa fa-cloud",
url: UrlHelpers.join("/workspaces", ns, "projects", name, "namespace", ens)
};
buildConfig.environments.push(env);
}
buildConfig.environments = buildConfig.environments.reverse();
buildConfig.tools = [];
angular.forEach($fabric8CodeViews, function (env) {
buildConfig.tools.push(env);
});
angular.forEach($fabric8TeamViews, function (env) {
buildConfig.tools.push(env);
});
}
}
Kubernetes.enrichBuildConfig = enrichBuildConfig;
function enrichBuildConfigs(buildConfigs, sortedBuilds) {
if (sortedBuilds === void 0) { sortedBuilds = null; }
angular.forEach(buildConfigs, function (buildConfig) {
enrichBuildConfig(buildConfig, sortedBuilds);
});
return buildConfigs;
}
Kubernetes.enrichBuildConfigs = enrichBuildConfigs;
function enrichBuilds(builds) {
angular.forEach(builds, function (build) {
enrichBuild(build);
});
return _.sortBy(builds, "$creationDate").reverse();
}
Kubernetes.enrichBuilds = enrichBuilds;
function enrichBuild(build) {
if (build) {
var metadata = build.metadata || {};
var annotations = metadata.annotations || {};
var name = getName(build);
var namespace = getNamespace(build);
build.$name = name;
build.$namespace = namespace;
var nameArray = name.split("-");
var nameArrayLength = nameArray.length;
build.$shortName = (nameArrayLength > 4) ? nameArray.slice(0, nameArrayLength - 4).join("-") : name.substring(0, 30);
var labels = getLabels(build);
var configId = labels.buildconfig;
build.$configId = configId;
if (configId) {
//build.$configLink = UrlHelpers.join("kubernetes/buildConfigs", configId);
build.$configLink = UrlHelpers.join("workspaces", currentKubernetesNamespace(), "projects", configId);
}
var creationTimestamp = getCreationTimestamp(build);
if (creationTimestamp) {
var d = new Date(creationTimestamp);
build.$creationDate = d;
}
if (name) {
//build.$viewLink = UrlHelpers.join("kubernetes/builds", name);
var projectLink = UrlHelpers.join("workspaces", currentKubernetesNamespace(), "projects", configId);
build.$viewLink = UrlHelpers.join(projectLink, "builds", name);
//build.$logsLink = UrlHelpers.join("kubernetes/buildLogs", name);
build.$logsLink = UrlHelpers.join(projectLink, "buildLogs", name);
}
build.podName = build.podName || annotations["openshift.io/build.pod-name"];
var podName = build.podName;
if (podName && namespace) {
var podNameArray = podName.split("-");
var podNameArrayLength = podNameArray.length;
build.$podShortName = (podNameArrayLength > 5) ? podNameArray[podNameArrayLength - 5] : podName.substring(0, 30);
build.$podLink = UrlHelpers.join("kubernetes/namespace", namespace, "pods", podName);
}
}
return build;
}
Kubernetes.enrichBuild = enrichBuild;
function enrichDeploymentConfig(deploymentConfig) {
if (deploymentConfig) {
var triggerUrl = null;
var name = Core.pathGet(deploymentConfig, ["metadata", "name"]);
deploymentConfig.$name = name;
var found = false;
angular.forEach(deploymentConfig.triggers, function (trigger) {
var type = trigger.type;
if (!deploymentConfig.$imageChangeParams && type === "ImageChange") {
var imageChangeParams = trigger.imageChangeParams;
if (imageChangeParams) {
var containerNames = imageChangeParams.containerNames || [];
imageChangeParams.$containerNames = containerNames.join(" ");
deploymentConfig.$imageChangeParams = imageChangeParams;
}
}
});
}
}
Kubernetes.enrichDeploymentConfig = enrichDeploymentConfig;
function enrichDeploymentConfigs(deploymentConfigs) {
angular.forEach(deploymentConfigs, function (deploymentConfig) {
enrichDeploymentConfig(deploymentConfig);
});
return deploymentConfigs;
}
Kubernetes.enrichDeploymentConfigs = enrichDeploymentConfigs;
function enrichEvent(event) {
if (event) {
var metadata = event.metadata || {};
var firstTimestamp = event.firstTimestamp;
if (firstTimestamp) {
var d = new Date(firstTimestamp);
event.$firstTimestamp = d;
}
var lastTimestamp = event.lastTimestamp;
if (lastTimestamp) {
var d = new Date(lastTimestamp);
event.$lastTimestamp = d;
}
var labels = angular.copy(event.source || {});
var involvedObject = event.involvedObject || {};
var name = involvedObject.name;
var kind = involvedObject.kind;
if (name) {
labels['name'] = name;
}
if (kind) {
labels['kind'] = kind;
}
event.$labelsText = Kubernetes.labelsToString(labels);
}
}
Kubernetes.enrichEvent = enrichEvent;
function enrichEvents(events, model) {
if (model === void 0) { model = null; }
angular.forEach(events, function (event) {
enrichEvent(event);
});
// lets update links to the events for each pod and RC
if (model) {
function clearEvents(entity) {
entity.$events = [];
entity.$eventsLink = null;
entity.$eventCount = 0;
}
function updateEvent(entity, event) {
if (entity) {
entity.$events.push(event);
if (!entity.$eventsLink) {
entity.$eventsLink = UrlHelpers.join("/kubernetes/namespace/", currentKubernetesNamespace(), "events") + "?q=kind%3D" + entity.kind + "%20name%3D" + entity.metadata.name;
}
entity.$eventCount = entity.$events.length;
}
}
var pods = model.pods || [];
var rcs = model.replicationControllers || [];
angular.forEach(pods, clearEvents);
angular.forEach(rcs, clearEvents);
angular.forEach(events, function (event) {
var involvedObject = event.involvedObject || {};
var name = involvedObject.name;
var kind = involvedObject.kind;
var ns = model.currentNamespace();
if (name && kind && ns) {
var entity = null;
if (kind === "ReplicationController") {
entity = model.getReplicationController(ns, name);
}
else if (kind === "Pod") {
entity = model.getPod(ns, name);
}
if (entity) {
updateEvent(entity, event);
}
}
});
}
return events;
}
Kubernetes.enrichEvents = enrichEvents;
function enrichImageRepository(imageRepository) {
if (imageRepository) {
var triggerUrl = null;
var name = Core.pathGet(imageRepository, ["metadata", "name"]);
imageRepository.$name = name;
}
}
Kubernetes.enrichImageRepository = enrichImageRepository;
function enrichImageRepositories(imageRepositories) {
angular.forEach(imageRepositories, function (imageRepository) {
enrichImageRepository(imageRepository);
});
return imageRepositories;
}
Kubernetes.enrichImageRepositories = enrichImageRepositories;
var labelColors = {
'region': 'k8s-badge-region',
'system': 'k8s-badge-system',
'isTarget': 'k8s-badge-target',
};
function containerLabelClass(labelType) {
if (!(labelType in labelColors)) {
return 'mouse-pointer';
}
else
return labelColors[labelType] + ' mouse-pointer';
}
Kubernetes.containerLabelClass = containerLabelClass;
/**
* Returns true if the fabric8 forge plugin is enabled
*/
function isForgeEnabled() {
// TODO should return true if the service "fabric8-forge" is valid
return true;
}
Kubernetes.isForgeEnabled = isForgeEnabled;
/**
* Returns the current kubernetes selected namespace or the default one
*/
function currentKubernetesNamespace() {
var injector = HawtioCore.injector;
if (injector) {
var KubernetesState = injector.get("KubernetesState") || {};
return KubernetesState.selectedNamespace || Kubernetes.defaultNamespace;
}
return Kubernetes.defaultNamespace;
}
Kubernetes.currentKubernetesNamespace = currentKubernetesNamespace;
function setCurrentKubernetesNamespace(ns) {
if (ns) {
var KubernetesState = inject("KubernetesState") || {};
KubernetesState.selectedNamespace = ns;
}
}
Kubernetes.setCurrentKubernetesNamespace = setCurrentKubernetesNamespace;
/**
* Configures the json schema
*/
function configureSchema() {
angular.forEach(Kubernetes.schema.definitions, function (definition, name) {
var properties = definition.properties;
if (properties) {
var hideProperties = ["creationTimestamp", "kind", "apiVersion", "annotations", "additionalProperties", "namespace", "resourceVersion", "selfLink", "uid"];
angular.forEach(hideProperties, function (propertyName) {
var property = properties[propertyName];
if (property) {
property["hidden"] = true;
}
});
angular.forEach(properties, function (property, propertyName) {
var ref = property["$ref"];
var type = property["type"];
if (ref && (!type || type === "object")) {
property["type"] = ref;
}
if (type === "array") {
var items = property["items"];
if (items) {
var ref = items["$ref"];
var type = items["type"];
if (ref && (!type || type === "object")) {
items["type"] = ref;
}
}
}
});
}
Kubernetes.schema.definitions.os_build_WebHookTrigger.properties.secret.type = "password";
});
}
Kubernetes.configureSchema = configureSchema;
/**
* Lets remove any enriched data to leave the original json intact
*/
function unenrich(item) {
var o = _.cloneDeep(item);
angular.forEach(o, function (value, key) {
if (key.startsWith("$") || key.startsWith("_")) {
delete o[key];
}
});
delete o['connectTo'];
return o;
}
Kubernetes.unenrich = unenrich;
/**
* Returns the unenriched JSON representation of an object
*/
function toRawJson(item) {
var o = unenrich(item);
return JSON.stringify(o, null, 2); // spacing level = 2
}
Kubernetes.toRawJson = toRawJson;
/**
* Returns the unenriched YAML representation of an object
*/
function toRawYaml(item) {
var o = unenrich(item);
return jsyaml.dump(o, { indent: 2 });
}
Kubernetes.toRawYaml = toRawYaml;
function watch($scope, $element, kind, ns, fn, labelSelector) {
if (labelSelector === void 0) { labelSelector = null; }
var connection = KubernetesAPI.watch({
kind: kind,
namespace: ns,
labelSelector: labelSelector,
success: function (objects) {
fn(objects);
Core.$apply($scope);
}
});
$element.on('$destroy', function () {
console.log("Static controller[" + kind + ", " + ns + "] element destroyed");
$scope.$destroy();
});
$scope.$on('$destroy', function () {
console.log("Static controller[" + kind + ", " + ns + "] scope destroyed");
connection.disconnect();
});
var oldDeleteScopeFn = $scope.deleteScope;
$scope.deleteScope = function () {
$element.remove();
if (angular.isFunction(oldDeleteScopeFn)) {
oldDeleteScopeFn();
}
};
}
Kubernetes.watch = watch;
function createKubernetesClient(kind, ns) {
if (ns === void 0) { ns = null; }
var K8SClientFactory = inject("K8SClientFactory");
if (!K8SClientFactory) {
Kubernetes.log.warn("Could not find injected K8SClientFactory!");
return null;
}
if (kind === "projects" || kind === "namespaces") {
ns = null;
}
else if (!ns) {
ns = Kubernetes.currentKubernetesNamespace();
}
return K8SClientFactory.create(kind, ns);
}
Kubernetes.createKubernetesClient = createKubernetesClient;
function currentUserName() {
var userDetails = HawtioOAuth.getUserProfile();
var answer = null;
if (userDetails) {
answer = getName(userDetails);
}
return answer || "admin";
}
Kubernetes.currentUserName = currentUserName;
function createNamespace(ns, client) {
if (!client) {
client = Kubernetes.isOpenShift ? Kubernetes.createKubernetesClient('projects') : Kubernetes.createKubernetesClient('namespaces');
}
if (ns && ns !== currentKubernetesNamespace()) {
var object = {
apiVersion: Kubernetes.defaultApiVersion,
kind: Kubernetes.isOpenShift ? 'Project' : 'Namespace',
metadata: {
name: ns,
labels: {}
}
};
client.put(object, function (data) {
Kubernetes.log.info("Created namespace: " + ns);
}, function (err) {
Kubernetes.log.warn("Failed to create namespace: " + ns + ": " + angular.toJson(err));
});
}
}
Kubernetes.createNamespace = createNamespace;
function createRC(obj, onCompleteFn) {
if (onCompleteFn === void 0) { onCompleteFn = null; }
var client = Kubernetes.createKubernetesClient('replicationcontrollers', 'default');
var RCTemplate = new Kubernetes.resourceRCTemplate();
var rcTemplate = RCTemplate.createRC(obj);
client.put(rcTemplate, function (obj) {
if (angular.isFunction(onCompleteFn)) {
onCompleteFn(obj);
}
}, function (err) {
console.log(err);
});
}
Kubernetes.createRC = createRC;
function connectOracle($http, $timeout, url, operation, replicas, delayTime) {
$timeout(function () {
$http({
url: url,
method: 'POST',
params: { oracleName: getName(replicas), operation: operation },
}).success(function (data, header, config, status) {
console.log("success");
}).error(function (data, header, config, status) {
//log.warn("Failed to connect " + connectParam + " " + data + " " + status);
});
}, delayTime);
}
Kubernetes.connectOracle = connectOracle;
function getOracleStatus(labels) {
var answer = -1;
if (typeof (labels) === 'object' && labels.hasOwnProperty("status")) {
switch (labels.status) {
case '0':
answer = 0;
break;
case '1':
answer = 1;
break;
case '2':
answer = 2;
break;
default:
answer = -1;
}
}
return answer;
}
Kubernetes.getOracleStatus = getOracleStatus;
function getExtractStatus(labels) {
if (labels.isTarget === 'false') {
return parseInt(labels.isExtract);
}
else {
return 10;
}
}
Kubernetes.getExtractStatus = getExtractStatus;
function getOracleName(replicas) {
var annotation = getAnnotations(replicas);
return annotation["cityName"] + "-" + annotation["districtName"] + "-" + annotation["systemName"];
}
Kubernetes.getOracleName = getOracleName;
function extractDataToOracle($http, url, selectedReplicationControllers, targetOracle, fn) {
//console.log(targetReplicationController.length);
var answer = targetOracle && true;
var inneedOracle = [];
selectedReplicationControllers.forEach(function (rc) {
var annotations = getAnnotations(rc);
answer = answer && checkoutOracleIsRunning(rc);
inneedOracle.push({
"name": getName(rc),
"ip": getHost(rc.$pods[0]),
"port": rc.$pods[0].spec.containers[0].ports[0].hostPort,
"dataId": annotations["id"]
});
});
if (answer) {
var data = { "name": targetOracle.id, "target": targetOracle, "inneed": inneedOracle };
var spinner;
$.ajax({
type: "POST",
url: UrlHelpers.join(url, targetOracle.id + "", "extract"),
timeout: 8000,
dataType: 'json',
//async: false,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
beforeSend: function () {
Configs.create_mask(); //创建遮罩层
create_locadEffect("正在验证汇总库配置信息,请稍等!"); //创建数据加载效果层
var target = document.getElementById('loading');
spinner = new Spinner(loadConfigs()).spin(target);
},
complete: function (XMLHttpRequest, textStatus) {
if (XMLHttpRequest.status == 200) {
//spinner.spin();
Kubernetes.createSuccessInfo("success", "连接汇总库成功,即将执行汇总或抽取操作!");
setTimeout("Kubernetes.removeMask()", 1500);
}
else {
//spinner.spin();
Kubernetes.createSuccessInfo("error", "连接汇总库失败,请检查服务集群中的汇总库配置是否正确!");
setTimeout("Kubernetes.removeMask()", 1500);
}
},
success: function (data) {
}
});
}
else {
//alert("您选择的汇总数据库或需要汇总的数据库中存在未启动成功的数据库,导致汇总操作失败,请重新选择!");
Configs.customAlert("提示", "操作失败:需要汇总的数据库中存在未启动成功的数据库!", '', null, 0, "error");
}
}
Kubernetes.extractDataToOracle = extractDataToOracle;
function checkoutOracleIsRunning(rc) {
if (rc.$podCounters.ready && rc.$oracleStatus == 2) {
return true;
}
else {
return false;
}
}
Kubernetes.checkoutOracleIsRunning = checkoutOracleIsRunning;
function replicasIsCreated(replicationcontrollers, name) {
var result = false;
if (replicationcontrollers != null || replicationcontrollers.length <= 0) {
for (var i = 0; i < replicationcontrollers.length; i++) {
if (getName(replicationcontrollers[i]) === name) {
result = true;
break;
}
}
}
return result;
}
Kubernetes.replicasIsCreated = replicasIsCreated;
function loadConfigs() {
return {
lines: 9,
length: 0,
width: 13,
radius: 38,
scale: 1,
corners: 1,
color: '#ffffff',
opacity: 0,
rotate: 90,
direction: 1,
speed: 0.5,
trail: 50,
zIndex: 1000000002,
className: 'spinner',
top: '40%',
left: '50%',
shadow: false,
hwaccel: false,
position: 'absolute'
};
}
Kubernetes.loadConfigs = loadConfigs;
/*
创建加载效果层
*/
function create_locadEffect(msg) {
var tmp = "<div id=\"loading\"></div>"
+ "<span id=\"loadmsg\">" + msg + "</span>";
var load = document.createElement("div");
load.id = "load";
load.innerHTML = tmp;
document.body.appendChild(load);
$("#load").addClass("load-effect-msg");
}
Kubernetes.create_locadEffect = create_locadEffect;
function createSuccessInfo(icon, msg) {
$("#load").remove();
Configs.customAlert("提示", msg, '', null, 0, icon);
/*var tmp = "<div class=\"load-result\" ><img src=\""
+ icon + "\" class=\"custom-alert-img\"></div>"
+ "<span class=\"load-result-msg\">" + msg +"</span>";
var result = document.createElement("div");
result.id = "exe_result";
result.innerHTML = tmp;
document.body.appendChild(result);*/
}
Kubernetes.createSuccessInfo = createSuccessInfo;
function removeMask() {
var mask = document.getElementById("mask");
//var result = document.getElementById("exe_result");
if (null == mask)
return;
document.body.removeChild(mask);
//document.body.removeChild(result);
}
Kubernetes.removeMask = removeMask;
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts" />
var Developer;
(function (Developer) {
Developer.context = '/workspaces';
Developer.hash = '#' + Developer.context;
Developer.pluginName = 'Developer';
Developer.pluginPath = 'plugins/developer/';
Developer.templatePath = Developer.pluginPath + 'html/';
Developer.log = Logger.get(Developer.pluginName);
Developer.jenkinsServiceName = "jenkins";
Developer.jenkinsServiceNameAndPort = Developer.jenkinsServiceName + ":http";
Developer.jenkinsHttpConfig = {
headers: {
Accept: "application/json, text/x-json, text/plain"
}
};
/**
* Returns true if the value hasn't changed from the last cached JSON version of this object
*/
function hasObjectChanged(value, state) {
var json = angular.toJson(value || "");
var oldJson = state.json;
state.json = json;
return !oldJson || json !== oldJson;
}
Developer.hasObjectChanged = hasObjectChanged;
function projectForScope($scope) {
if ($scope) {
return $scope.buildConfig || $scope.entity || ($scope.model || {}).project;
}
return null;
}
Developer.projectForScope = projectForScope;
/**
* Lets load the project versions for the given namespace
*/
function loadProjectVersions($scope, $element, project, env, ns, answer, caches) {
var projectAnnotation = "project";
var versionAnnotation = "version";
var projectNamespace = project.$namespace;
var projectName = project.$name;
var cache = caches[ns];
if (!cache) {
cache = {};
caches[ns] = cache;
}
var status = {
rcs: [],
pods: [],
routes: [],
services: []
};
var imageStreamTags = [];
function updateModel() {
var projectInfos = {};
var model = $scope.model || {};
angular.forEach(status.rcs, function (item) {
var metadata = item.metadata || {};
var name = metadata.name;
var labels = metadata.labels || {};
var annotations = metadata.annotations || {};
var spec = item.spec || {};
var selector = spec.selector;
var project = labels[projectAnnotation];
var version = labels[versionAnnotation];
// lets try the S2I defaults...
if (!project) {
project = labels["app"];
}
if (!version) {
version = annotations["openshift.io/deployment-config.latest-version"];
}
if (project && version && project === projectName) {
var projects = projectInfos[project];
if (!projects) {
projects = {
project: project,
versions: {}
};
projectInfos[project] = projects;
}
var versionInfo = projects.versions[version];
if (!versionInfo) {
versionInfo = {
replicationControllers: {}
};
projects.versions[version] = versionInfo;
}
if (name) {
versionInfo.replicationControllers[name] = item;
item.$name = name;
if (projectNamespace && projectName) {
item.$viewLink = UrlHelpers.join("/workspaces/", projectNamespace, "projects", projectName, "namespace", ns, "replicationControllers", name);
}
else {
Developer.log.warn("Missing project data! " + projectNamespace + " name " + projectName);
}
item.$services = [];
var rcLink = null;
status.services.forEach(function (service) {
var repSelector = Kubernetes.getSelector(item);
var serviceSelector = Kubernetes.getSelector(service);
if (serviceSelector && repSelector &&
Kubernetes.selectorMatches(serviceSelector, repSelector) &&
Kubernetes.getNamespace(service) === Kubernetes.getNamespace(item)) {
status.routes.forEach(function (route) {
var serviceName = Kubernetes.getName(service);
if (serviceName === Kubernetes.getName(route)) {
service["$route"] = route;
service["$host"] = Core.pathGet(route, ["spec", "host"]);
item.$services.push(service);
if (!rcLink) {
var url = Kubernetes.serviceLinkUrl(service, true);
if (url) {
// TODO find icon etc?
rcLink = {
name: serviceName,
href: url
};
}
}
}
});
}
});
item["$serviceLink"] = rcLink;
}
item.$buildId = annotations["fabric8.io/build-id"] || item.$buildId;
item.$buildUrl = annotations["fabric8.io/build-url"] || item.$buildUrl;
item.$gitCommit = annotations["fabric8.io/git-commit"] || item.$gitCommit;
item.$gitUrl = annotations["fabric8.io/git-url"] || item.$gitUrl;
item.$gitBranch = annotations["fabric8.io/git-branch"] || item.$gitBranch;
if (!item.$gitCommit) {
var image = getImage(item);
if (image) {
if (!$scope.$isWatchImages) {
$scope.$isWatchImages = true;
Kubernetes.watch($scope, $element, "images", null, function (data) {
imageStreamTags = data;
checkForMissingMetadata();
});
}
else {
checkForMissingMetadata();
}
}
function getImage(item) {
var image = "";
// lets see if we can find the commit id from a S2I image name
// TODO needs this issue fixed to find it via an OpenShift annotation:
// https://github.com/openshift/origin/issues/6241
var containers = Core.pathGet(item, ["spec", "template", "spec", "containers"]);
if (containers && containers.length) {
var container = containers[0];
if (container) {
image = container.image;
}
}
return image;
}
function checkForMissingMetadata() {
angular.forEach(projects.versions, function (vi) {
angular.forEach(vi.replicationControllers, function (item, name) {
if (!item.$gitCommit) {
var image = getImage(item);
if (image) {
angular.forEach(imageStreamTags, function (imageStreamTag) {
var imageName = imageStreamTag.dockerImageReference;
if (imageName && imageName === image) {
var foundISTag = imageStreamTag;
var manifestJSON = imageStreamTag.dockerImageManifest;
if (manifestJSON) {
var manifest = angular.fromJson(manifestJSON) || {};
var history = manifest.history;
if (history && history.length) {
var v1 = history[0].v1Compatibility;
if (v1) {
var data = angular.fromJson(v1);
var env = Core.pathGet(data, ["config", "Env"]);
angular.forEach(env, function (envExp) {
if (envExp) {
var values = envExp.split("=");
if (values.length === 2 && values[0] == "OPENSHIFT_BUILD_NAME") {
var buildName = values[1];
if (buildName) {
item.$buildId = buildName;
item.$buildUrl = Developer.projectWorkspaceLink(ns, projectName, "buildLogs/" + buildName);
}
}
}
});
var labels = Core.pathGet(data, ["config", "Labels"]);
if (labels) {
item.$gitCommit = labels["io.openshift.build.commit.id"] || item.$gitCommit;
item.$gitCommitAuthor = labels["io.openshift.build.commit.author"] || item.$gitCommitAuthor;
item.$gitCommitDate = labels["io.openshift.build.commit.date"] || item.$gitCommitDate;
item.$gitCommitMessage = labels["io.openshift.build.commit.message"] || item.$gitCommitMessage;
item.$gitBranch = labels["io.openshift.build.commit.ref"] || item.$gitBranch;
if (!item.$gitUrl && item.$gitCommit) {
item.$gitUrl = Developer.projectWorkspaceLink(ns, projectName, "wiki/commitDetail///" + item.$gitCommit);
}
}
}
}
}
}
});
}
}
});
});
}
}
if (selector) {
var selectorText = Kubernetes.labelsToString(selector, ",");
var podLinkUrl = UrlHelpers.join(Developer.projectLink(projectName), "namespace", ns, "pods");
item.pods = [];
item.$podCounters = Kubernetes.createPodCounters(selector, status.pods, item.pods, selectorText, podLinkUrl);
}
}
});
// lets check for a project name if we have lots of RCs with no pods, lets remove them!
angular.forEach(projectInfos, function (project, projectName) {
var rcsNoPods = [];
var rcsWithPods = [];
angular.forEach(project.versions, function (versionInfo) {
var rcs = versionInfo.replicationControllers;
angular.forEach(rcs, function (item, name) {
var count = Kubernetes.podCounterTotal(item.$podCounters);
if (count) {
rcsWithPods.push(name);
}
else {
rcsNoPods.push(function () {
delete rcs[name];
});
}
});
});
if (rcsWithPods.length) {
// lets remove all the empty RCs
angular.forEach(rcsNoPods, function (fn) {
fn();
});
}
});
if (hasObjectChanged(projectInfos, cache)) {
Developer.log.debug("project versions has changed!");
answer[ns] = projectInfos;
}
}
Kubernetes.watch($scope, $element, "replicationcontrollers", ns, function (data) {
if (data) {
status.rcs = data;
updateModel();
}
});
Kubernetes.watch($scope, $element, "services", ns, function (data) {
if (data) {
status.services = data;
updateModel();
}
});
Kubernetes.watch($scope, $element, "routes", ns, function (data) {
if (data) {
status.routes = data;
updateModel();
}
});
Kubernetes.watch($scope, $element, "pods", ns, function (data) {
if (data) {
status.pods = data;
updateModel();
}
});
}
Developer.loadProjectVersions = loadProjectVersions;
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="developerNavigation.ts"/>
/// <reference path="developerHelpers.ts"/>
var Developer;
(function (Developer) {
var log = Logger.get('developer-navigation');
function createCurrentSubNavBar($scope, $location, $routeParams) {
return Developer.activateCurrent([
{
href: UrlHelpers.join(Developer.context, "Overview", "cold/data-type/all"),
label: "冷区数据管理",
title: "数据汇总任务",
items: [{
href: UrlHelpers.join(Developer.context, "Overview", "cold/data-type/all"),
label: "全部",
title: "全部数据"
},
{
href: UrlHelpers.join(Developer.context, "Overview", "cold/data-type/financial"),
label: "财政",
title: "财政数据"
},
{
href: UrlHelpers.join(Developer.context, "Overview/", "cold/data-type/social-security"),
label: "社保",
title: "社保数据"
}]
},
{
href: UrlHelpers.join(Developer.context, "Overview", "hot/data-type/all"),
label: "热区数据管理",
title: "查看所有数据",
items: [{
href: UrlHelpers.join(Developer.context, "Overview", "hot/data-type/all"),
label: "全部",
title: "全部数据"
},
{
href: UrlHelpers.join(Developer.context, "Overview", "hot/data-type/financial"),
label: "财政",
title: "财政数据"
},
{
href: UrlHelpers.join(Developer.context, "Overview/", "hot/data-type/social-security"),
label: "社保",
title: "社保数据"
}]
},
{
href: UrlHelpers.join(Developer.context, "Overview/", "task"),
label: "任务",
title: "任务查看"
},
]);
}
Developer.createCurrentSubNavBar = createCurrentSubNavBar;
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="configPlugin.ts"/>
/// <reference path="configsDataService.ts"/>
/// <reference path="../../developer/ts/developerNavigation.ts"/>
/// <reference path="../../developer/ts/dataManagerHelper.ts"/>
var Configs;
(function (Configs) {
var OperateType = (function () {
function OperateType() {
}
Object.defineProperty(OperateType, "DELETE", {
get: function () { return "delete"; },
enumerable: true,
configurable: true
});
Object.defineProperty(OperateType, "UPDATE", {
get: function () { return "update"; },
enumerable: true,
configurable: true
});
Object.defineProperty(OperateType, "PUT", {
get: function () { return "put"; },
enumerable: true,
configurable: true
});
Object.defineProperty(OperateType, "MOVE", {
get: function () { return "move"; },
enumerable: true,
configurable: true
});
Object.defineProperty(OperateType, "EXTRACT", {
get: function () { return "extract"; },
enumerable: true,
configurable: true
});
return OperateType;
}());
Configs.OperateType = OperateType;
Configs._module.controller('Configs.MenuItemController', ['$scope', '$location', function ($scope, $location) {
$scope.menuItem = [{
icon: "glyphicon glyphicon-cloud-upload",
label: "数据管理配置",
title: "配置数据存储信息",
href: UrlHelpers.join(Configs.context, "/gluster-fs/setting")
},
{
icon: "glyphicon glyphicon-th-list",
label: "服务集群配置",
title: "配置服务集群信息",
href: UrlHelpers.join(Configs.context, "/kube-cluster/setting")
}];
}]);
function createConfigBreadcrumbs($scope, $location, $routeParams) {
var url = $location.url();
var label, title;
switch (url) {
case "/config/gluster-fs/setting":
label = "数据管理配置";
title = "配置数据存储信息";
break;
case "/config/kube-cluster/setting":
label = "服务集群配置";
title = "配置服务集群信息";
break;
default:
break;
}
return Developer.activateCurrent([{
href: url,
label: label,
title: title //item.title
}]);
}
function createOracleInfo(array, id) {
var result = { "id": id };
angular.forEach(array, function (arr) {
result[arr.field] = arr.value;
});
return result;
}
Configs.createOracleInfo = createOracleInfo;
function shareInit($scope, $location, $routeParams) {
$scope.subTabConfig = Developer.createCurrentSubNavBar($scope, $location, $routeParams);
$scope.mask = true;
/**
创建全屏遮挡
*/
$("#mask").css("position", "absolute");
$("#mask").css("background", "black");
$("#mask").css("opacity", 0.4);
$("#mask").css("filter", "progid:DXImageTransform.Microsoft.Alpha(style=4,opacity=25)");
$("#mask").css("top", "0px");
$("#mask").css("left", "0px");
$("#mask").css("width", document.body.clientWidth + document.body.scrollLeft);
$("#mask").css("height", document.body.clientHeight + document.body.scrollTop);
$("#mask").css("zIndex", 1000);
}
Configs.shareInit = shareInit;
function createNewObejct(array, obj) {
var result = [];
if (obj) {
angular.forEach(array, function (arr) {
result.push({
field: arr.field,
name: arr.displayName,
value: obj[arr.field]
});
});
}
else {
angular.forEach(array, function (arr) {
result.push({
field: arr.field,
name: arr.displayName,
value: null
});
});
}
return result;
}
Configs.createNewObejct = createNewObejct;
function oracleInfoOperate($http, url, operate, resource, fn) {
if (resource === null)
throw "不能操作空资源对象";
var id = resource["id"] || resource["name"] || resource["_id"] || resource["_key"];
var RESTfulUrl = url;
if (id == "undefined") {
RESTfulUrl = UrlHelpers.join(url, operate);
}
else {
RESTfulUrl = UrlHelpers.join(url, id + "", operate);
}
$http({
method: "POST",
dataType: 'json',
url: RESTfulUrl,
data: JSON.stringify(resource),
}).success(function (data, header, config, status) {
if (angular.isFunction(fn))
fn(data, header);
}).error(function (data, header, config, status) {
if (angular.isFunction(fn))
fn(data, header);
});
}
Configs.oracleInfoOperate = oracleInfoOperate;
function createConfigHelperNavBar($scope, $location, $routeParams) {
return Developer.activateCurrent([
{
href: UrlHelpers.join(Configs.context, "regionalism-code/searching"),
label: "行政区划检索",
title: "检索行政区划代码"
},
{
href: UrlHelpers.join(Configs.context, "system-code/searching"),
label: "系统编码检索",
title: "检索系统编码"
}
]);
}
Configs.createConfigHelperNavBar = createConfigHelperNavBar;
function formatVolume(volume) {
var brick = [];
angular.forEach(volume.brick, function (block) {
brick.push({
ip: block.ip.split("."),
status: block.status,
path: block.path,
editable: block.editable || false
});
});
return {
name: volume.name,
path: volume.path,
brick: brick,
status: volume.status,
editable: volume.editable || false
};
}
Configs.formatVolume = formatVolume;
function volumesFormat(volumes) {
var result = [];
angular.forEach(volumes, function (volume) {
result.push(formatVolume(volume));
});
return result;
}
Configs.volumesFormat = volumesFormat;
})(Configs || (Configs = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="customAlert.ts"/>
var Configs;
(function (Configs) {
function removeElementByValue(array, value, key) {
if (key) {
for (var i = 0; i < array.length; i++) {
if (array[i][key] === value) {
array.splice(i, 1);
break;
}
}
}
else {
for (var i = 0; i < array.length; i++) {
if (array[i] === value) {
array.splice(i, 1);
break;
}
}
}
}
Configs.removeElementByValue = removeElementByValue;
function removeElementsByValue(array, elements) {
angular.forEach(elements, function (element) {
removeElementByValue(array, element.value, element.key);
});
}
Configs.removeElementsByValue = removeElementsByValue;
/**
对象的深拷贝
*/
function deepCopy(object) {
var n, i;
if (object instanceof Array) {
n = [];
for (i = 0; i < object.length; ++i) {
n[i] = deepCopy(object[i]);
}
return n;
}
else if (object instanceof Object) {
n = {};
for (i in object) {
n[i] = deepCopy(object[i]);
}
return n;
}
else {
return object;
}
}
Configs.deepCopy = deepCopy;
function downloadFile($scope, $http, url, fn) {
$http.get(url, { responseType: 'arraybuffer' })
.success(function (data, status, headers) {
if (angular.isFunction(fn))
fn();
var octetStreamMime = 'application/octet-stream';
var success = false;
// Get the headers
headers = headers();
// Get the filename from the x-filename header or default to "服务列表"
var filename = "服务文件";
var params = headers['content-disposition'].split(";");
for (var i = 0; i < params.length; i++) {
if (params[i].indexOf("filename") != -1) {
var tmp = params[i].split("=");
if (tmp.length == 2)
filename = tmp[1].replace(new RegExp("\"", "gm"), "");
}
}
// Determine the content type from the header or default to "application/octet-stream"
var contentType = headers['content-type'] || octetStreamMime;
try {
// Try using msSaveBlob if supported
console.log("Trying saveBlob method ...");
var blob = new Blob([data], { type: contentType });
if (navigator.msSaveBlob)
navigator.msSaveBlob(blob, filename);
else {
// Try using other saveBlob implementations, if available
var saveBlob = navigator["webkitSaveBlob"] || navigator["mozSaveBlob"] || navigator["saveBlob"];
if (saveBlob === undefined)
throw "Not supported";
saveBlob(blob, filename);
}
console.log("saveBlob succeeded");
success = true;
}
catch (ex) {
console.log("saveBlob method failed with the following exception:");
console.log(ex);
}
if (!success) {
// Get the blob url creator
var urlCreator = window.URL || window["webkitURL"] || window["mozURL"] || window["msURL"];
if (urlCreator) {
// Try to use a download link
var link = document.createElement('a');
if ('download' in link) {
// Try to simulate a click
try {
// Prepare a blob URL
console.log("Trying download link method with simulated click ...");
var blob = new Blob([data], { type: contentType });
var url = urlCreator.createObjectURL(blob);
link.setAttribute('href', url);
// Set the download attribute (Supported in Chrome 14+ / Firefox 20+)
link.setAttribute("download", filename);
// Simulate clicking the download link
var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
link.dispatchEvent(event);
console.log("Download link method with simulated click succeeded");
success = true;
}
catch (ex) {
console.log("Download link method with simulated click failed with the following exception:");
console.log(ex);
}
}
if (!success) {
// Fallback to window.location method
try {
// Prepare a blob URL
// Use application/octet-stream when using window.location to force download
console.log("Trying download link method with window.location ...");
var blob = new Blob([data], { type: octetStreamMime });
var url = urlCreator.createObjectURL(blob);
window.location = url;
console.log("Download link method with window.location succeeded");
success = true;
}
catch (ex) {
console.log("Download link method with window.location failed with the following exception:");
console.log(ex);
}
}
}
}
if (!success) {
// Fallback to window.open method
console.log("No methods worked for saving the arraybuffer, using last resort window.open");
window.open('_blank', '');
Configs.customAlert("提示", "文件下载失败", '', null, 0, "error");
}
}).error(function (data, status) {
console.log("Request failed with status: " + status);
// Optionally write the error out to scope
fn();
Configs.customAlert("提示", "文件下载失败", '', null, 0, "error");
$scope.errorDetails = "Request failed with status: " + status;
});
}
Configs.downloadFile = downloadFile;
function FileInputPlugin(fn, isMultiple) {
var inputObj = document.createElement('input');
inputObj.setAttribute('id', 'myFileInput');
inputObj.setAttribute('type', 'file');
inputObj.setAttribute("style", 'visibility:hidden');
if (isMultiple)
inputObj.setAttribute("multiple", "multiple");
document.body.appendChild(inputObj);
inputObj.click();
inputObj.onchange = function (element) {
fn(element.target["files"]);
var my = document.getElementById("myFileInput");
if (null != my)
document.body.removeChild(my);
};
}
Configs.FileInputPlugin = FileInputPlugin;
})(Configs || (Configs = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes._module = angular.module(Kubernetes.pluginName, ['hawtio-core', 'hawtio-ui', 'ui.codemirror', 'ui.validate', 'kubernetesUI']);
Kubernetes.controller = PluginHelpers.createControllerFunction(Kubernetes._module, Kubernetes.pluginName);
Kubernetes.route = PluginHelpers.createRoutingFunction(Kubernetes.templatePath);
Kubernetes._module.config(['$routeProvider', function ($routeProvider) {
$routeProvider
.when(UrlHelpers.join(Kubernetes.context, '/pods'), Kubernetes.route('pods.html', false))
.when(UrlHelpers.join(Kubernetes.context, 'replicationControllers'), Kubernetes.route('replicationControllers.html', false))
.when(UrlHelpers.join(Kubernetes.context, 'services'), Kubernetes.route('services.html', false))
.when(UrlHelpers.join(Kubernetes.context, 'events'), Kubernetes.route('events.html', false))
.when(UrlHelpers.join(Kubernetes.context, 'apps'), Kubernetes.route('apps.html', false))
.when(UrlHelpers.join(Kubernetes.context, 'apps/:namespace'), Kubernetes.route('apps.html', false))
.when(UrlHelpers.join(Kubernetes.context, 'templates'), Kubernetes.route('templates.html', false))
.when(UrlHelpers.join(Kubernetes.context, 'hosts'), Kubernetes.route('hosts.html', false))
.when(UrlHelpers.join(Kubernetes.context, 'hosts/:id'), Kubernetes.route('host.html', true))
.when(UrlHelpers.join(Kubernetes.context, 'pipelines'), Kubernetes.route('pipelines.html', false))
.when(UrlHelpers.join(Kubernetes.context, 'overview'), Kubernetes.route('overview.html', true))
.when(Kubernetes.context, { redirectTo: UrlHelpers.join(Kubernetes.context, 'replicationControllers') });
angular.forEach([Kubernetes.context, "/workspaces/:workspace/projects/:project"], function (context) {
$routeProvider
.when(UrlHelpers.join(context, '/namespace/:namespace/podCreate'), Kubernetes.route('podCreate.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/podEdit/:id'), Kubernetes.route('podEdit.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/pods'), Kubernetes.route('pods.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/pods/:id'), Kubernetes.route('pod.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/replicationControllers'), Kubernetes.route('replicationControllers.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/replicationControllers/:id'), Kubernetes.route('replicationController.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/replicationControllerCreate'), Kubernetes.route('replicationControllerCreate.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/replicationControllerEdit/:id'), Kubernetes.route('replicationControllerEdit.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/secrets'), Kubernetes.route('secrets.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/secrets/:id'), Kubernetes.route('secret.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/secretCreate'), Kubernetes.route('secret.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/services'), Kubernetes.route('services.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/services/:id'), Kubernetes.route('service.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/serviceCreate'), Kubernetes.route('serviceCreate.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/serviceEdit/:id'), Kubernetes.route('serviceEdit.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/events'), Kubernetes.route('events.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/apps'), Kubernetes.route('apps.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace/overview'), Kubernetes.route('overview.html', true))
.when(UrlHelpers.join(context, '/namespace/:namespace/templates/:targetNamespace'), Kubernetes.route('templates.html', false))
.when(UrlHelpers.join(context, '/namespace/:namespace'), Kubernetes.route('apps.html', false))
.when(UrlHelpers.join(context, 'builds'), Kubernetes.route('builds.html', false))
.when(UrlHelpers.join(context, 'builds/:id'), Kubernetes.route('build.html', true))
.when(UrlHelpers.join(context, 'buildLogs/:id'), Kubernetes.route('buildLogs.html', true))
.when(UrlHelpers.join(context, 'buildConfigs'), Kubernetes.route('buildConfigs.html', false))
.when(UrlHelpers.join(context, 'buildConfigs/:id'), Kubernetes.route('buildConfig.html', true))
.when(UrlHelpers.join(context, 'buildConfigEdit/:id'), Kubernetes.route('buildConfigEdit.html', true))
.when(UrlHelpers.join(context, 'deploymentConfigs'), Kubernetes.route('deploymentConfigs.html', false))
.when(UrlHelpers.join(context, 'deploymentConfigs/:id'), Kubernetes.route('deploymentConfig.html', true))
.when(UrlHelpers.join(context, 'imageRepositories'), Kubernetes.route('imageRepositories.html', false));
});
angular.forEach([Kubernetes.context, "/workspaces/:workspace", "/workspaces/:workspace/projects/:project"], function (context) {
$routeProvider
.when(UrlHelpers.join(context, 'buildConfigEdit'), Kubernetes.route('buildConfigEdit.html', true))
.when(UrlHelpers.join(context, 'buildConfigEdit/:id'), Kubernetes.route('buildConfigEdit.html', true))
.when(UrlHelpers.join(context, 'importProject'), Kubernetes.route('importProject.html', true));
});
}]);
Kubernetes._module.factory('AppLibraryURL', ['$rootScope', function ($rootScope) {
return UrlHelpers.join(Kubernetes.kubernetesApiUrl(), "/proxy", Kubernetes.kubernetesNamespacePath(), "/services/app-library");
}]);
Kubernetes._module.factory('WikiGitUrlPrefix', function () {
return UrlHelpers.join(Kubernetes.kubernetesApiUrl(), "/proxy", Kubernetes.kubernetesNamespacePath(), "services/app-library");
});
Kubernetes._module.factory('wikiRepository', ["$location", "localStorage", function ($location, localStorage) {
return false;
}]);
Kubernetes._module.factory('ConnectDialogService', ['$rootScope', function ($rootScope) {
return {
dialog: new UI.Dialog(),
saveCredentials: false,
userName: null,
password: null,
jolokiaUrl: null,
containerName: null,
view: null
};
}]);
Kubernetes._module.filter('kubernetesPageLink', function () { return Kubernetes.entityPageLink; });
Kubernetes._module.filter('relativeTime', function () {
return function (date) {
return humandate.relativeTime(date);
};
});
Kubernetes._module.run(['viewRegistry', 'ServiceRegistry', 'HawtioNav', 'KubernetesModel', '$templateCache', function (viewRegistry, ServiceRegistry, HawtioNav, KubernetesModel, $templateCache) {
Kubernetes.log.debug("Running");
viewRegistry['kubernetes'] = Kubernetes.templatePath + 'layoutKubernetes.html';
//viewRegistry['kubernetes'] = Configs.templatePath + 'shareLayout.html';
var builder = HawtioNav.builder();
var apps = builder.id('kube-apps')
.href(function () { return UrlHelpers.join(Kubernetes.context, 'apps'); })
.title(function () { return 'Apps'; })
.build();
var services = builder.id('kube-services')
.href(function () { return UrlHelpers.join(Kubernetes.context, 'services'); })
.title(function () { return 'Services'; })
.build();
var controllers = builder.id('kube-controllers')
.href(function () { return UrlHelpers.join(Kubernetes.context, 'replicationControllers'); })
.title(function () { return 'oracle服务'; })
.build();
var pods = builder.id('kube-pods')
.href(function () { return UrlHelpers.join(Kubernetes.context, 'pods'); })
.title(function () { return '测试页面'; })
.build();
var events = builder.id('kube-events')
.href(function () { return UrlHelpers.join(Kubernetes.context, 'events'); })
.title(function () { return '服务启动日志'; })
.build();
var hosts = builder.id('kube-hosts')
.href(function () { return UrlHelpers.join(Kubernetes.context, 'hosts'); })
.title(function () { return '集群节点'; })
.build();
var overview = builder.id('kube-overview')
.href(function () { return UrlHelpers.join(Kubernetes.context, 'overview'); })
.title(function () { return 'Diagram'; })
.build();
var builds = builder.id('kube-builds')
.href(function () { return UrlHelpers.join(Kubernetes.context, 'builds'); })
.title(function () { return 'Builds'; })
.build();
var buildConfigs = builder.id('kube-buildConfigs')
.href(function () { return UrlHelpers.join(Kubernetes.context, 'buildConfigs'); })
.title(function () { return 'Build Configs'; })
.build();
var deploys = builder.id('kube-deploys')
.href(function () { return UrlHelpers.join(Kubernetes.context, 'deploymentConfigs'); })
.title(function () { return 'Deploys'; })
.build();
var imageRepositories = builder.id('kube-imageRepositories')
.href(function () { return UrlHelpers.join(Kubernetes.context, 'imageRepositories'); })
.title(function () { return 'Registries'; })
.build();
var pipelines = builder.id('kube-pipelines')
.href(function () { return UrlHelpers.join(Kubernetes.context, 'pipelines'); })
.title(function () { return 'Pipelines'; })
.build();
var repos = builder.id('kube-repos')
.href(function () { return "/forge/repos"; })
.isValid(function () { return ServiceRegistry.hasService(Kubernetes.fabric8ForgeServiceName) && ServiceRegistry.hasService(Kubernetes.gogsServiceName); })
.title(function () { return 'Repositories'; })
.build();
var mainTab = builder.id('kubernetes')
.rank(100)
.defaultPage({
rank: 20,
isValid: function (yes, no) {
yes();
}
})
.href(function () { return UrlHelpers.join(Kubernetes.context, "/namespace/default/replicationControllers"); })
.title(function () { return '服务集群'; })
.tabs(controllers, pods, events)
.build();
HawtioNav.add(mainTab);
/* testKubernetesModel
HawtioNav.add({
id: 'k8sAppSwitcher',
title: () => '', // not used as 'template' below overrides this
isValid: () => KubernetesModel.serviceApps.length > 0,
context: true,
template: () => $templateCache.get(UrlHelpers.join(templatePath, 'serviceApps.html'))
});
*/
var projectsTab = builder.id('openshift')
.rank(100)
.href(function () { return UrlHelpers.join(Kubernetes.context, 'buildConfigs') + '?sub-tab=kube-buildConfigs'; })
.title(function () { return 'Projects'; })
.tabs(repos, buildConfigs, builds, deploys, imageRepositories)
.build();
//HawtioNav.add(projectsTab);
}]);
hawtioPluginLoader.registerPreBootstrapTask({
name: 'KubernetesInit',
task: function (next) {
$.getScript('osconsole/config.js')
.done(function (script, textStatus) {
var config = Kubernetes.osConfig = window['OPENSHIFT_CONFIG'];
Kubernetes.log.debug("Fetched OAuth config: ", config);
var master = config.master_uri;
if (!master && config.api && config.api.k8s) {
var masterUri = new URI().host(config.api.k8s.hostPort).path("").query("");
if (config.api.k8s.proto) {
masterUri.protocol(config.api.k8s.proto);
}
master = masterUri.toString();
}
OSOAuthConfig = config.openshift;
GoogleOAuthConfig = config.google;
KeycloakConfig = config.keycloak;
if (OSOAuthConfig && !master) {
// TODO auth.master_uri no longer used right?
// master = OSOAuthConfig.master_uri;
if (!master) {
var oauth_authorize_uri = OSOAuthConfig.oauth_authorize_uri;
if (oauth_authorize_uri) {
var text = oauth_authorize_uri;
var idx = text.indexOf("://");
if (idx > 0) {
idx += 3;
idx = text.indexOf("/", idx);
if (idx > 0) {
master = text.substring(0, ++idx);
}
}
}
}
}
if ((!Kubernetes.masterUrl || Kubernetes.masterUrl === "/") && (!master || master === "/")) {
// lets default the master to the current protocol and host/port
// in case the master url is "/" and we are
// serving up static content from inside /api/v1/namespaces/default/services/fabric8 or something like that
var href = location.href;
if (href) {
master = new URI(href).query("").path("").toString();
}
}
if (master) {
Kubernetes.masterUrl = master;
next();
return;
}
})
.fail(function (response) {
Kubernetes.log.debug("Error fetching OAUTH config: ", response);
})
.always(function () {
next();
});
}
}, true);
hawtioPluginLoader.addModule('ngResource');
hawtioPluginLoader.addModule(Kubernetes.pluginName);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
var log = Logger.get('kubernetes-watcher');
var k8sTypes = KubernetesAPI.NamespacedTypes.k8sTypes;
var osTypes = KubernetesAPI.NamespacedTypes.osTypes;
var self = {};
var updateFunction = function () {
log.debug("Objects changed, firing listeners");
var objects = {};
_.forEach(self.getTypes(), function (type) {
objects[type] = self.getObjects(type);
});
_.forEach(self.listeners, function (listener) {
listener(objects);
});
};
var debouncedUpdate = _.debounce(updateFunction, 75, { trailing: true });
var namespaceWatch = {
selected: undefined,
watch: undefined,
objects: [],
objectMap: {},
watches: {}
};
hawtioPluginLoader.registerPreBootstrapTask({
name: 'KubernetesWatcherInit',
depends: ['KubernetesApiDiscovery'],
task: function (next) {
var booted = false;
if (Kubernetes.isOpenShift) {
log.info("Backend is an Openshift instance");
}
else {
log.info("Backend is a vanilla Kubernetes instance");
}
namespaceWatch.watch = KubernetesAPI.watch({
kind: KubernetesAPI.WatchTypes.NAMESPACES,
success: function (objects) {
namespaceWatch.objects = objects;
if (!booted) {
booted = true;
self.setNamespace(localStorage[Kubernetes.Constants.NAMESPACE_STORAGE_KEY] || Kubernetes.defaultNamespace);
next();
}
log.debug("Got namespaces: ", namespaceWatch.objects);
}, error: function (error) {
log.warn("Error fetching namespaces: ", error);
// TODO is this necessary?
//HawtioOAuth.doLogout();
if (!booted) {
booted = true;
next();
}
}
});
}
});
hawtioPluginLoader.registerPreBootstrapTask({
name: 'KubernetesApiDiscovery',
depends: ['hawtio-oauth'],
task: function (next) {
Kubernetes.isOpenShift = false;
var userProfile = HawtioOAuth.getUserProfile();
log.debug("User profile: ", userProfile);
if (userProfile && userProfile.provider === "hawtio-google-oauth") {
log.debug("Possibly running on GCE");
// api master is on GCE
$.ajax({
url: UrlHelpers.join(Kubernetes.masterApiUrl(), 'api', 'v1', 'namespaces'),
complete: function (jqXHR, textStatus) {
if (textStatus === "success") {
log.debug("jqXHR: ", jqXHR);
userProfile.oldToken = userProfile.token;
userProfile.token = undefined;
$.ajaxSetup({
beforeSend: function (request) {
}
});
}
next();
},
beforeSend: function (request) {
}
});
}
else {
log.debug("Not running on GCE");
// double-check if we're on vanilla k8s or openshift
var rootUri = new URI(Kubernetes.masterApiUrl()).path("/oapi").query("").toString();
log.debug("Checking for an openshift backend");
HawtioOAuth.authenticatedHttpRequest({
url: rootUri,
success: function (data) {
if (data) {
Kubernetes.isOpenShift = true;
}
next();
},
error: function (jqXHR, textStatus, errorThrown) {
var error = KubernetesAPI.getErrorObject(jqXHR);
if (!error) {
log.debug("Failed to find root paths: ", textStatus, ": ", errorThrown);
}
else {
log.debug("Failed to find root paths: ", error);
}
Kubernetes.isOpenShift = false;
next();
}
});
}
}
});
var customUrlHandlers = {};
self.setNamespace = function (namespace) {
if (namespace === namespaceWatch.selected) {
return;
}
if (namespaceWatch.selected) {
log.debug("Stopping current watches");
_.forOwn(namespaceWatch.watches, function (watch, key) {
if (!KubernetesAPI.namespaced(key)) {
return;
}
log.debug("Disconnecting watch: ", key);
watch.disconnect();
});
_.forEach(_.keys(namespaceWatch.watches), function (key) {
if (!KubernetesAPI.namespaced(key)) {
return;
}
log.debug("Deleting kind: ", key);
delete namespaceWatch.watches[key];
});
}
namespaceWatch.selected = namespace;
if (namespace) {
_.forEach(self.getTypes(), function (kind) {
if (kind === KubernetesAPI.WatchTypes.NAMESPACES) {
return;
}
if (!namespaceWatch.watches[kind]) {
log.debug("Creating watch for kind: ", kind);
var config = {
kind: kind,
namespace: KubernetesAPI.namespaced(kind) ? namespace : undefined,
success: function (objects) {
watch.objects = objects;
debouncedUpdate();
}
};
if (kind in customUrlHandlers) {
config.urlFunction = customUrlHandlers[kind];
}
var watch = KubernetesAPI.watch(config);
watch.config = config;
namespaceWatch.watches[kind] = watch;
}
});
}
};
self.hasWebSocket = true;
self.getNamespace = function () { return namespaceWatch.selected; };
self.registerCustomUrlFunction = function (kind, url) {
customUrlHandlers[kind] = url;
if (kind in namespaceWatch.watches) {
var watch = namespaceWatch.watches[kind];
var config = watch.config;
config.urlFunction = url;
watch.disconnect();
delete namespaceWatch.watches[kind];
config.success = function (objects) {
watch.objects = objects;
debouncedUpdate();
};
watch = KubernetesAPI.watch(config);
watch.config = config;
namespaceWatch.watches[kind] = watch;
}
};
self.getTypes = function () {
var filter = function (kind) {
// filter out stuff we don't care about yet
switch (kind) {
case KubernetesAPI.WatchTypes.OAUTH_CLIENTS:
case KubernetesAPI.WatchTypes.IMAGE_STREAMS:
case KubernetesAPI.WatchTypes.POLICIES:
case KubernetesAPI.WatchTypes.ROLES:
case KubernetesAPI.WatchTypes.ROLE_BINDINGS:
case KubernetesAPI.WatchTypes.POLICY_BINDINGS:
case KubernetesAPI.WatchTypes.PERSISTENT_VOLUME_CLAIMS:
case KubernetesAPI.WatchTypes.PERSISTENT_VOLUMES:
case KubernetesAPI.WatchTypes.ENDPOINTS:
case KubernetesAPI.WatchTypes.RESOURCE_QUOTAS:
case KubernetesAPI.WatchTypes.SERVICE_ACCOUNTS:
return false;
default:
return true;
}
};
var answer = k8sTypes.concat([Kubernetes.WatchTypes.NAMESPACES]);
if (Kubernetes.isOpenShift) {
answer = answer.concat(osTypes);
}
else {
answer = answer.concat(KubernetesAPI.WatchTypes.TEMPLATES);
answer = answer.concat(KubernetesAPI.WatchTypes.BUILD_CONFIGS);
}
return _.filter(answer, filter);
};
self.getObjects = function (kind) {
if (kind === Kubernetes.WatchTypes.NAMESPACES) {
return namespaceWatch.objects;
}
if (kind in namespaceWatch.watches) {
return namespaceWatch.watches[kind].objects;
}
else {
return undefined;
}
};
self.listeners = [];
// listener gets notified after a bunch of changes have occurred
self.registerListener = function (fn) {
self.listeners.push(fn);
};
var projectsHandle = undefined;
// kick off the project watcher a bit sooner also
hawtioPluginLoader.registerPreBootstrapTask({
name: 'ProjectsWatcher',
depends: ['KubernetesApiDiscovery'],
task: function (next) {
if (Kubernetes.isOpenShift) {
projectsHandle = KubernetesAPI.watch({
kind: KubernetesAPI.WatchTypes.PROJECTS,
namespace: undefined,
success: function (objects) {
if (self.listeners && self.listeners.length) {
log.debug("got projects: ", objects);
_.forEach(self.listeners, function (listener) {
listener({
projects: objects
});
});
}
}
});
}
next();
}
});
Kubernetes._module.service('WatcherService', ['userDetails', '$rootScope', '$timeout', function (userDetails, $rootScope, $timeout) {
return self;
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="kubernetesPlugin.ts"/>
/// <reference path="watcher.ts"/>
var Kubernetes;
(function (Kubernetes) {
var log = Logger.get("kubernetes-term-windows");
Kubernetes._module.config(["kubernetesContainerSocketProvider", function (kubernetesContainerSocketProvider) {
kubernetesContainerSocketProvider.WebSocketFactory = "CustomWebSockets";
}]);
Kubernetes._module.factory('CustomWebSockets', ["userDetails", function (userDetails) {
return function CustomWebSocket(url, protocols) {
var paths = url.split('?');
if (!_.startsWith(paths[0], Kubernetes.masterApiUrl())) {
paths[0] = UrlHelpers.join(Kubernetes.masterApiUrl(), paths[0]);
}
url = KubernetesAPI.wsUrl(paths[0]);
url.search(paths[1] + '&access_token=' + userDetails.token);
log.debug("Using ws url: ", url.toString());
return new WebSocket(url.toString(), protocols);
};
}]);
Kubernetes._module.service('TerminalService', ["$rootScope", "$document", "$compile", "$interval", "$templateCache", function ($rootScope, $document, $compile, $interval, $templateCache) {
var body = $document.find('body');
function positionTerminals(terminals) {
var total = _.keys(terminals).length;
var dist = (body.width() - 225) / total;
var position = 5;
angular.forEach(terminals, function (value, key) {
if (!value.scope.docked) {
return;
}
value.el.css('left', position + 'px');
position = position + dist;
});
}
var defaultTemplate = $templateCache.get(UrlHelpers.join(Kubernetes.templatePath, 'termShell.html'));
var self = {
positionTerminals: function () {
positionTerminals(self.terminals);
},
terminals: {},
httpTask: {},
newTerminal: function ($interval, podLink, containerName, entity, url, template) {
if (template === void 0) { template = defaultTemplate; }
var terminalId = UrlHelpers.join(podLink, containerName);
if (terminalId in self.terminals) {
log.debug("Already a terminal with id: ", terminalId);
self.raiseTerminal(terminalId);
return terminalId;
}
var scope = $rootScope.$new();
getLogs(entity, scope, url);
scope.podLink = podLink;
scope.containerName = containerName;
scope.id = terminalId;
scope.docked = true;
if (terminalId in self.httpTask) {
self.raiseTerminal(terminalId);
return terminalId;
}
else {
self.httpTask[terminalId] = $interval(function () {
getLogs(entity, scope, url);
}, 2000);
}
var el = $($compile(template)(scope));
var term = {
scope: scope,
el: el
};
body.append(el);
self.terminals[terminalId] = term;
positionTerminals(self.terminals);
return terminalId;
},
closeTerminal: function (id) {
var term = self.terminals[id];
var timer = self.httpTask[id];
if (timer) {
$interval.cancel(timer);
delete self.httpTask[id];
}
if (term) {
term.el.remove();
delete self.terminals[id];
positionTerminals(self.terminals);
}
},
raiseTerminal: function (id) {
angular.forEach(self.terminals, function (value, key) {
if (key === id) {
value.el.css('z-index', '4000');
value.el.find('.terminal').focus();
}
else {
value.el.css('z-index', '3000');
}
});
}
};
return self;
}]);
function addWindowActions(scope, element, TerminalService) {
var moved = false;
var lastX = 0;
var lastY = 0;
var header = element.find('.terminal-title');
var body = element.find('.terminal-body');
element.on('$destroy', function () {
$('#main').css({ display: 'inherit' });
});
var HEIGHT = 348;
var WIDTH = 600;
var TITLE_HEIGHT = 35;
var NAV_OFFSET = 46;
element.css({
height: HEIGHT,
width: WIDTH
});
header.css({
height: TITLE_HEIGHT
});
body.css({
position: 'absolute',
top: 35,
left: 0,
right: 0,
bottom: 0
});
scope.close = function () {
TerminalService.closeTerminal(scope.id);
};
scope.raise = function () {
TerminalService.raiseTerminal(scope.id);
};
scope.$watch('docked', function (docked) {
if (docked) {
element.width(WIDTH);
if (!element.hasClass('minimized')) {
element.height(HEIGHT);
}
}
});
scope.startResize = function (e) {
e.preventDefault();
log.debug("Start resize");
scope.resizing = true;
element.on('mouseup', scope.stopResize);
$(document).on('mousemove', scope.doResize);
$(document).on('mouseleave', scope.stopResize);
};
scope.doResize = function (e) {
if (scope.resizing) {
log.debug("Resizing, e: ", e);
if (!moved) {
lastX = e.clientX;
lastY = e.clientY;
moved = true;
return;
}
var height = element.height();
var width = element.width();
var deltaX = e.clientX - lastX;
var deltaY = e.clientY - lastY;
var newHeight = height + deltaY;
var newWidth = width + deltaX;
if (newHeight > 35 && newWidth > 80) {
element.height(height + deltaY);
element.width(width + deltaX);
}
lastX = e.clientX;
lastY = e.clientY;
}
};
scope.stopResize = function (e) {
scope.resizing = false;
moved = false;
element.off('mouseup', scope.stopResize);
$(document).off('mousemove', scope.doResize);
$(document).off('mouseleave', scope.stopResize);
};
scope.mouseDown = function (e) {
e.preventDefault();
if (element.hasClass('minimized') || element.hasClass('maximized')) {
return;
}
scope.dragging = true;
element.on('mouseup', scope.mouseUp);
$(document).on('mousemove', scope.mouseMove);
$(document).on('mouseleave', scope.mouseUp);
};
scope.mouseUp = function (e) {
e.preventDefault();
scope.dragging = false;
moved = false;
var height = element.height();
var offset = element.offset();
var winHeight = $(window).height();
if (offset.top > (winHeight - height - 20)) {
element.css({ top: "inherit", left: "inherit" });
scope.docked = true;
TerminalService.positionTerminals();
}
else {
scope.docked = false;
}
element.off('mouseup', scope.mouseUp);
$(document).off('mousemove', scope.mouseMove);
$(document).off('mouseleave', scope.mouseUp);
};
scope.mouseMove = function (e) {
if (scope.dragging) {
if (!moved) {
lastX = e.clientX;
lastY = e.clientY;
moved = true;
return;
}
var deltaX = e.clientX - lastX;
var deltaY = e.clientY - lastY;
var elOffset = element.offset();
element.offset({ top: elOffset.top + deltaY, left: elOffset.left + deltaX });
lastX = e.clientX;
lastY = e.clientY;
}
};
function restoreWindow(scope, element) {
if (scope.offset) {
element.offset(scope.offset);
scope.docked = false;
}
if (scope.height) {
element.height(scope.height);
}
if (scope.width) {
element.width(scope.width);
}
}
function saveWindow(scope, element) {
scope.offset = element.offset();
scope.height = element.height();
scope.width = element.width();
}
scope.maximized = function () {
return element.hasClass('maximized');
};
scope.maximize = function ($e) {
$e.preventDefault();
if (element.hasClass('minimized')) {
scope.minimize();
}
if (element.hasClass('maximized')) {
restoreWindow(scope, element);
$('#main').css({ display: 'inherit' });
}
else {
saveWindow(scope, element);
$('#main').css({ display: 'none' });
element.css({
height: 'inherit',
bottom: 0,
width: '100%',
top: NAV_OFFSET,
left: 0
});
}
element.toggleClass('maximized');
};
scope.minimize = function ($e) {
$e.preventDefault();
if (element.hasClass('maximized')) {
scope.maximize();
}
if (element.hasClass('minimized')) {
restoreWindow(scope, element);
}
else {
saveWindow(scope, element);
scope.docked = true;
element.css({ height: TITLE_HEIGHT, top: "inherit", left: "inherit" });
TerminalService.positionTerminals();
}
element.toggleClass('minimized');
};
}
Kubernetes.addWindowActions = addWindowActions;
Kubernetes._module.directive('terminalWindow', ["$compile", "TerminalService", function ($compile, TerminalService) {
return {
restrict: 'A',
scope: false,
link: function (scope, element, attr) {
addWindowActions(scope, element, TerminalService);
var body = element.find('.terminal-body');
body.append($compile('<kubernetes-container-terminal pod="podLink" container="containerName" command="bash"></kubernetes-container-terminal>')(scope));
}
};
}]);
function getLogs(rc, scope, url) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
if (xhr.responseText != "" && xhr.responseText != null) {
var logObject = JSON.parse(xhr.responseText);
scope.logs = logObject[Kubernetes.getName(rc)];
}
else {
scope.logs = "当前没有可以查看的日志信息";
}
}
else {
}
}
};
xhr.open("POST", url, false);
//xhr.open("POST", "/java/console/api/oracle/extract/log?rcName=" + getName(rc),false);
xhr.send(null);
}
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="configPlugin.ts"/>
/// <reference path="configsDataService.ts"/>
/// <reference path="../../configs/ts/configsUtils.ts"/>
/// <reference path="../../configs/ts/customAlert.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
var Configs;
(function (Configs) {
Configs.TableEdit = Configs.controller('TableEdit', ['$scope', function ($scope) {
$scope.editRow = function (entity) {
$scope.$emit('editRow', entity);
};
$scope.deleteRowOne = {
show: false,
item: null,
open: function (entity) {
var deleteRowOne = $scope.deleteRowOne;
deleteRowOne.show = true;
deleteRowOne.item = entity;
},
onOk: function () {
var deleteRowOne = $scope.deleteRowOne;
$scope.$emit('deleteRow', deleteRowOne.item);
},
onCancel: function () {
var deleteRowOne = $scope.deleteRowOne;
deleteRowOne.show = false;
deleteRowOne.item = null;
}
};
}]);
Configs.VolumeController = Configs.controller('VolumeController', ['$scope', '$http', function ($scope, $http) {
$scope.submitted = false;
$scope.status = $scope.ngDialogData.status;
$scope.cancel = function () {
$scope.closeThisDialog();
$scope.submitted = false;
};
$scope.deleteBrock = function (volume, brock) {
if (volume.brick.length > 1)
Configs.deleteBrock(volume, brock);
else
$scope.showMessage = true;
};
$scope.addBrock = function (volume) {
var block = {
ip: "",
path: "",
status: false,
editable: true
};
Configs.addBrock(volume, block);
$scope.showMessage = false;
};
$scope.stopVolume = function (volume) {
volume.status = false;
};
$scope.startVolume = function (volume) {
volume.status = true;
};
$scope.onSubmit = function (entity) {
if ($scope.volumeForm.$valid) {
$scope.$emit('update', entity);
$scope.closeThisDialog();
}
else {
$scope.submitted = true;
}
};
}]);
Configs.SystemInfoController = Configs.controller('SystemInfoController', ['$scope', function ($scope) {
}]);
Configs.SqlViewController = Configs.controller('SqlViewController', ['$scope', '$http', function ($scope, $http) {
$scope.title = shareInit($scope.ngDialogData);
$scope.content = "";
getSqlContent();
function getSqlContent() {
$http({
url: "/java/console/api/filePackage/readSqlFile",
method: 'POST',
params: { type: $scope.ngDialogData.type },
data: JSON.stringify($scope.ngDialogData.item)
}).success(function (data, header, config, status) {
$scope.old_content = data.data1;
//响应成功
}).error(function (data, header, config, status) {
//处理响应失败
$scope.old_content = "获取脚本内容失败";
});
}
$scope.upLoadSqlFile = function () {
if (typeof FileReader == 'undefined') {
throw "浏览器不支持FileReader读取文件";
}
else {
Configs.FileInputPlugin(function (file) {
$scope.enable = true;
if (typeof typeof FileReader == 'undefined')
throw "浏览器不支持FileReader读取文件";
else {
var fr = new FileReader();
fr.onloadend = function (e) {
$scope.new_content = e.target["result"];
};
fr.onloadstart = function () {
$scope.$apply(function () {
$scope.content = "正在读取数据请稍等...";
});
$scope.content = "正在读取数据请稍等...";
};
fr.readAsText(file[0], "GBK");
}
});
}
};
$scope.onOk = function () {
$scope.enable = false;
if (null == $scope.new_content || $scope.new_content == "") {
console.log("上传的内容不能为空");
$scope.closeThisDialog();
}
else {
$scope.$emit("onOk", {
url: "/java/console/api/filePackage/handleSqlFile",
item: $scope.ngDialogData.item,
content: $scope.new_content,
opt: "add",
type: $scope.ngDialogData.type
});
$scope.closeThisDialog();
}
};
$scope.cancel = function () {
$scope.enable = false;
$scope.closeThisDialog();
};
}]);
Configs.SqlAddController = Configs.controller('SqlAddController', ['$scope', '$http', function ($scope, $http) {
$scope.content = "";
$scope.title = shareInit($scope.ngDialogData);
$scope.sqlFileUpload = function () {
Configs.FileInputPlugin(function (file) {
$scope.enable = true;
if (typeof typeof FileReader == 'undefined')
throw "浏览器不支持FileReader读取文件";
else {
var fr = new FileReader();
fr.onloadend = function (e) {
$scope.content = e.target["result"];
};
fr.onloadstart = function () {
$scope.$apply(function () {
$scope.content = "正在读取数据请稍等...";
});
$scope.content = "正在读取数据请稍等...";
};
fr.readAsText(file[0], "GBK");
}
});
};
$scope.onOk = function () {
$scope.enable = false;
if (null == $scope.content || $scope.content == "") {
console.log("上传的内容不能为空");
$scope.closeThisDialog();
}
else {
$scope.$emit("onOk", {
url: "/java/console/api/filePackage/handleSqlFile",
item: $scope.ngDialogData.item,
content: $scope.content,
opt: "add",
type: $scope.ngDialogData.type
});
$scope.closeThisDialog();
}
};
$scope.cancel = function () {
$scope.enable = false;
$scope.closeThisDialog();
};
}]);
Configs.sqlVerificationController = Configs.controller('sqlVerificationController', ['$scope', '$http', function ($scope, $http) {
getSqlContent();
$scope.title = shareInit($scope.ngDialogData);
$scope.replace = function () {
$scope.$emit("replace", {
url: "/java/console/api/filePackage/handleSqlFile",
item: $scope.ngDialogData.item,
content: $scope.content,
opt: "replace",
type: $scope.ngDialogData.type
});
$scope.closeThisDialog();
};
function getSqlContent() {
$http({
url: "/java/console/api/filePackage/readSqlFile",
method: 'POST',
params: { type: $scope.ngDialogData.type },
data: JSON.stringify($scope.ngDialogData.item)
}).success(function (data, header, config, status) {
$scope.standard = data.data1;
$scope.unnormal = data.data2;
//响应成功
}).error(function (data, header, config, status) {
//处理响应失败
$scope.unnormal = $scope.standard = "获取脚本内容失败";
});
}
$scope.cancel = function () {
//$scope.closeThisDialog();
$scope.$emit("replace", {
url: "/java/console/api/filePackage/handleSqlFile",
item: $scope.ngDialogData.item,
content: $scope.content,
opt: "delete",
type: $scope.ngDialogData.type
});
$scope.closeThisDialog();
};
}]);
Configs.sqlMoveController = Configs.controller("sqlMoveController", ['$scope', '$http', function ($scope, $http) {
getSqlContent();
$scope.title = shareInit($scope.ngDialogData);
$scope.move = function () {
$scope.$emit("replace", {
url: "/java/console/api/filePackage/handleSqlFile",
item: $scope.ngDialogData.item,
content: $scope.content,
opt: "replace",
type: $scope.ngDialogData.type
});
$scope.closeThisDialog();
};
$scope.cancel = function () {
$scope.closeThisDialog();
};
function getSqlContent() {
$http({
url: "/java/console/api/filePackage/readSqlFile",
method: 'POST',
params: { type: $scope.ngDialogData.type },
data: JSON.stringify($scope.ngDialogData.item)
}).success(function (data, header, config, status) {
$scope.content = data.data2;
//响应成功
}).error(function (data, header, config, status) {
//处理响应失败
$scope.content = "获取脚本内容失败";
});
}
}]);
Configs.sysVerUpdateController = Configs.controller('sysVerUpdateController', ['$scope', '$http', function ($scope, $http) {
$scope.checkboxItmes = [];
$scope.click = function ($event, name) {
if ($event.target.checked) {
if ($scope.checkboxItmes.indexOf(name) == -1)
$scope.checkboxItmes.push(name);
}
else {
for (var i = 0; i < $scope.checkboxItmes.length; i++) {
if ($scope.checkboxItmes[i] === name) {
$scope.checkboxItmes.splice(i, 1);
break;
}
}
}
};
getData();
$scope.replace = function () {
$scope.requestBody = $scope.data1;
angular.forEach($scope.checkboxItmes, function (item) {
$scope.requestBody[item] = $scope.data2[item];
});
$scope.$emit("updateRow", $scope.requestBody);
$scope.closeThisDialog();
};
$scope.cancel = function () {
$scope.closeThisDialog();
};
function getData() {
$http({
url: "/java/console/api/checkout/findDetails",
method: 'POST',
data: JSON.stringify($scope.ngDialogData)
}).success(function (data, header, config, status) {
$scope.data1 = data.data1;
$scope.data2 = data.data2;
//响应成功
}).error(function (data, header, config, status) {
//处理响应失败
$scope.content = "获取脚本内容失败";
});
}
}]);
function shareInit(ngDialogData) {
var title = "";
if (ngDialogData.type != 'undefined') {
switch (ngDialogData.type) {
case "userTableStatus":
title = "UserTablespace";
break;
case "ckPayStatus":
title = "Chechout_Pay";
break;
case "ckIndicateStatus":
title = "Chechout_Indicate";
break;
}
}
return title;
}
})(Configs || (Configs = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="configPlugin.ts"/>
/// <reference path="configsHelper.ts"/>
/// <reference path="configsUtils.ts"/>
/// <reference path="configsDataService.ts"/>
/// <reference path="../../kubernetes/ts/term.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="shareController.ts"/>
var Configs;
(function (Configs) {
Configs.GfsController = Configs.controller('GfsController', ["$scope", "$templateCache", "$location", "$routeParams", "$http", "$timeout", 'ConfigsModel', 'ngDialog',
function ($scope, $templateCache, $location, $routeParams, $http, $timeout, ConfigsModel, ngDialog) {
$scope.model = ConfigsModel;
$scope.volumes = ConfigsModel.cluster;
Configs.shareInit($scope, $location, $routeParams);
$scope.createGfs = function () {
ngDialog.open({
template: 'newDialog.html',
controller: 'Configs.VolumeController',
width: 1005,
scope: $scope,
closeByDocument: false,
data: {
name: '',
path: '',
status: true,
brick: [{
ip: ["0", "0", "0", "0"],
path: '',
status: false,
editable: true
}],
editable: true
},
className: 'ngdialog-theme-default'
});
};
$scope.editRow = function (volume) {
var fVolume = Configs.formatVolume(volume);
ngDialog.open({
template: 'newDialog.html',
width: 1005,
data: fVolume,
scope: $scope,
className: 'ngdialog-theme-default',
controller: 'Configs.VolumeController',
closeByDocument: false
});
};
$scope.showDeleteVolume = {
show: false,
item: null,
open: function (entity) {
var showDeleteVolume = $scope.showDeleteVolume;
showDeleteVolume.show = true;
showDeleteVolume.item = entity;
},
onOk: function () {
var showDeleteVolume = $scope.showDeleteVolume;
$timeout(function () {
console.log(showDeleteVolume.item);
var spinner;
$.ajax({
type: "POST",
url: "/java/console/api/volume/delete",
timeout: 8000,
dataType: 'json',
//async: false,
data: JSON.stringify(showDeleteVolume.item),
contentType: "application/json; charset=utf-8",
beforeSend: function () {
Configs.create_mask(); //创建遮罩层
Kubernetes.create_locadEffect("正在更新云盘信息,请稍等!"); //创建数据加载效果层
var target = document.getElementById('loading');
spinner = new Spinner(Kubernetes.loadConfigs()).spin(target);
},
complete: function (XMLHttpRequest, textStatus) {
if (XMLHttpRequest.status == 200) {
Kubernetes.createSuccessInfo("success", "更新成功!");
setTimeout("Kubernetes.removeMask()", 1500);
}
else {
Kubernetes.createSuccessInfo("error", "更新失败!");
setTimeout("Kubernetes.removeMask()", 1500);
}
},
success: function (data) {
if (data) {
ConfigsModel.cluster = data;
Configs.formatVolumes(ConfigsModel.cluster);
$scope.$apply(function () {
$scope.volumes = ConfigsModel.cluster;
});
}
}
});
/*$http({
url: "/java/console/api/volume/delete",
method: 'POST',
data: showDeleteVolume.item
}).success(function(data,header,config,status){
/*
更新volume信息
*/
/*$scope.model.updateVolumeData();
}).error(function(data,header,config,status){
Configs.customAlert("提示", "删除Volume失败", '',null, 0, "error");
});*/
}, 100);
},
onCancel: function () {
var showDeleteVolume = $scope.showDeleteVolume;
showDeleteVolume.show = false;
showDeleteVolume.item = null;
}
};
$scope.$on('update', function (event, data) {
angular.forEach(data["brick"], function (brick) {
var ip = [];
if (brick["ip"] instanceof Object) {
for (var key in brick["ip"])
ip.push(brick["ip"][key]);
brick["ip"] = ip.join("\.");
}
});
var spinner;
$.ajax({
type: "POST",
url: "/java/console/api/volume/update",
timeout: 15000,
dataType: 'json',
//async: false,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
beforeSend: function () {
Configs.create_mask(); //创建遮罩层
Kubernetes.create_locadEffect("正在更新云盘信息,请稍等!"); //创建数据加载效果层
var target = document.getElementById('loading');
spinner = new Spinner(Kubernetes.loadConfigs()).spin(target);
},
complete: function (XMLHttpRequest, textStatus) {
if (XMLHttpRequest.status == 200) {
Kubernetes.createSuccessInfo("success", "更新成功!");
setTimeout("Kubernetes.removeMask()", 1500);
}
else {
Kubernetes.createSuccessInfo("error", "更新失败!");
setTimeout("Kubernetes.removeMask()", 1500);
}
},
success: function (data) {
if (data) {
ConfigsModel.cluster = data;
Configs.formatVolumes(ConfigsModel.cluster);
$scope.$apply(function () {
$scope.volumes = ConfigsModel.cluster;
});
}
}
});
/*$http({
url: "/java/console/api/volume/update",
method: 'POST',
data: data
}).success(function(data,header,config,status){
$scope.model.updateVolumeData();
}).error(function(data,header,config,status){
});*/
});
}]);
})(Configs || (Configs = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="configPlugin.ts"/>
/// <reference path="configsHelper.ts"/>
/// <reference path="configsUtils.ts"/>
var Configs;
(function (Configs) {
Configs.KubeController = Configs.controller('KubeController', ["$scope", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "ConfigsModel",
function ($scope, $templateCache, $location, $routeParams, $http, $timeout, ConfigsModel) {
$scope.model = ConfigsModel;
$scope.model.updateOracleParam();
$scope.submitted = false;
$scope.tableConfig = {
data: 'model.oracleParam',
selectedItems: [],
columnDefs: [{
field: "name",
displayName: "名称"
},
{
field: "ip",
displayName: "IP"
},
{
field: "port",
displayName: "端口号"
},
{
field: "user",
displayName: "用户名"
},
{
field: "password",
displayName: "密码"
},
{
field: "databaseName",
displayName: "服务名"
},
{
field: "tableName",
displayName: "表空间名"
},
{
field: "suffix",
displayName: "表后缀"
},
{
field: "type",
displayName: "标准表汇总库",
cellTemplate: $templateCache.get("strandColumn.html")
},
{
field: "entity",
displayName: "操作",
cellTemplate: $templateCache.get("tableEdit.html")
}],
enableRowClickSelection: false,
showSelectionCheckbox: false,
multiSelect: false,
sortInfo: {
sortBy: "name",
ascending: true
}
};
Configs.shareInit($scope, $location, $routeParams);
$scope.create = function () {
$scope.submitted = false;
$scope.add = true;
$scope.edit = false;
$scope.tableForm = {};
$scope.tableForm["id"] = 0;
$scope.tableForm["type"] = 0;
};
$scope.cancel = function () {
$scope.tableForm = null;
$scope.add = false;
$scope.edit = false;
$scope.submitted = false;
};
$scope.onSubmit = function (oracle) {
if ($scope.validForm.$valid && $scope.validForm.$dirty) {
$scope.edit = false;
$scope.add = false;
Configs.oracleInfoOperate($http, "/java/console/api/oracle", Configs.OperateType.UPDATE, oracle, function (result, status) {
if (status === 200) {
$scope.model.updateOracleParam();
}
else {
throw "资源请求失败";
}
});
}
else {
$scope.submitted = true;
}
};
$scope.$on("editRow", function (event, data) {
$scope.submitted = false;
$scope.tableForm = Configs.deepCopy(data);
$scope.edit = true;
$scope.add = false;
//$scope.rowId = data.id
//createNewObejct($scope.tableConfig.columnDefs, data);
//removeElementsByValue($scope.tableForm, [{key: "name", value: "序号"},{key: "name", value: "连接状态"},{key: "name", value: "操作"}]);
});
$scope.$on("deleteRow", function (event, data) {
Configs.oracleInfoOperate($http, "/java/console/api/oracle", Configs.OperateType.DELETE, data, function (result, status) {
if (status === 200) {
console.log("准备更新");
$scope.model.updateOracleParam();
}
else {
throw "资源请求失败";
}
});
//removeElementByValue($scope.model, data._id, "_id");
});
}]);
})(Configs || (Configs = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
var Developer;
(function (Developer) {
Developer._module = angular.module(Developer.pluginName, ['hawtio-core', 'hawtio-ui', 'ui.codemirror', 'nvd3', 'treeControl', 'ngDialog']);
Developer.controller = PluginHelpers.createControllerFunction(Developer._module, Developer.pluginName);
Developer.route = PluginHelpers.createRoutingFunction(Developer.templatePath);
Developer._module.config(['$routeProvider', function ($routeProvider) {
$routeProvider.when(Developer.context, Developer.route('workspaces.html', false))
.when("/data-manager", Developer.route('workspaces.html', false))
.when(UrlHelpers.join(Developer.context, 'Overview/:type/data-type/all'), Developer.route('workspaces.html', false))
.when(UrlHelpers.join(Developer.context, 'Overview/:type/data-type/financial'), Developer.route('workspaces.html', false))
.when(UrlHelpers.join(Developer.context, 'Overview/:type/data-type/social-security'), Developer.route('workspaces.html', false))
.when(UrlHelpers.join(Developer.context, 'Overview/task'), Developer.route('fileMigrationTask.html', false))
.otherwise(Developer.context);
}]);
Developer._module.run(['viewRegistry', 'ServiceRegistry', 'HawtioNav', 'KubernetesModel', '$templateCache', function (viewRegistry, ServiceRegistry, HawtioNav, KubernetesModel, $templateCache) {
Developer.log.debug("Running");
viewRegistry['workspaces'] = Kubernetes.templatePath + 'layoutKubernetes.html';
viewRegistry['namespaces'] = Kubernetes.templatePath + 'layoutKubernetes.html';
// viewRegistry['workspaces'] = Configs.templatePath + 'shareLayout.html';
var builder = HawtioNav.builder();
var dmanagerTab = builder.id('dmanager')
.rank(200)
.href(function () { return Developer.context; })
.title(function () { return '数据管理'; })
.build();
HawtioNav.add(dmanagerTab);
}]);
Developer._module.filter('asTrustedHtml', ['$sce', function ($sce) {
return function (text) {
return $sce.trustAsHtml(text);
};
}]);
hawtioPluginLoader.addModule(Developer.pluginName);
// for scroll-glue directive
hawtioPluginLoader.addModule('luegg.directives');
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="developerPlugin.ts"/>
var Developer;
(function (Developer) {
var OptionsParams = (function () {
function OptionsParams() {
this.pagerSizeOption = [20, 50, 100];
this.dataType = null;
this.currentTableSize = 20;
this.dataBatch = null;
this.labels = {};
this.currentPageNum = 1;
this.totalSize = null;
this.priorTableSize = 20;
this.keyQuery = null;
this.volumeType = 1;
}
OptionsParams.prototype.createParamData = function () {
var extendValue = ["cityName", "districtName", "dataVersion", "systemName", "dataYear"];
var result = {
currentPageNum: this.currentPageNum,
dataType: this.dataType,
submittedBatch: this.dataBatch,
limit: this.currentTableSize,
priorTableSize: this.priorTableSize,
keyQuery: this.keyQuery,
volumeType: this.volumeType
};
angular.forEach(this.labels, function (value, key) {
if (extendValue.indexOf(key))
result[key] = value;
});
return result;
};
OptionsParams.prototype.getPageSizeNum = function () {
var num = Math.ceil(this.totalSize / this.currentTableSize);
if (num < this.currentPageNum)
num = this.currentPageNum;
return num;
};
return OptionsParams;
}());
Developer.OptionsParams = OptionsParams;
function createLabel(cityName, districtName, systemName, version, year) {
return {
cityName: cityName,
districtName: districtName,
systemName: systemName,
version: "版本" + version,
year: year
};
}
function createAlias(cityName, districtName, systemName, version, year) {
return cityName + "_" + districtName + "_" + systemName + "_" + year + "_版本" + version;
}
function createKey(regionalismCode, systemId, version) {
return regionalismCode + "-" + systemId + "-" + version;
}
function populateKey(item) {
var result = item;
result["_key"] = createKey(item.regionalismCode, item.systemCode, item.dataVersion);
return result;
}
function createItemsAlias(items) {
var result = [];
angular.forEach(items, function (item) {
item.alias = createAlias(item.cityName, item.districtName, item.systemName, item.dataVersion, item.year);
result.push(item);
});
return result;
}
function populateLabel(item) {
var result = item;
result["labels"] = createLabel(item.cityName, item.districtName, item.systemName, item.dataVersion, item.year);
return result;
}
function populateLabels(items) {
var result = [];
angular.forEach(items, function (item) {
result.push(populateLabel(item));
});
return result;
}
function populateKeys(items) {
var result = [];
angular.forEach(items, function (item) {
result.push(populateKey(item));
});
return result;
}
function createName(cityName, districtName) {
return cityName + "-" + districtName;
}
function populateName(item) {
var result = item;
result["name"] = createName(item.cityName, item.districtName);
return result;
}
function populateNames(items) {
var result = [];
angular.forEach(items, function (item) {
result.push(populateName(item));
});
return result;
}
function createParamData(options) {
return options.createParamData();
}
function formatTask(items) {
var result = [];
angular.forEach(items, function (item) {
var tmp_batch = "";
if (item.submittedBatch.indexOf("批次") == -1) {
tmp_batch = "批次" + item.submittedBatch;
}
else {
tmp_batch = item.submittedBatch;
}
result.push({
id: item.id,
_key: item.regionalismCode + "-" + item.systemCode + "-" + item.dataVersion,
name: item.cityName + "-" + item.districtName,
systemName: item.systemName,
status: item.completeStatus,
process: item.rate,
from: item.dataPath,
to: item.dstPath,
labels: {
dataType: item.dataType,
batch: tmp_batch,
dataVersion: "版本" + item.dataVersion,
dataYear: item.year
}
});
});
return result;
}
var DataModelService = (function () {
function DataModelService() {
this.data = [];
this.paramOptions = new OptionsParams();
this.transferTasks = [];
this.updateModel();
}
//更新数据模型
DataModelService.prototype.getDataModel = function (paramOptions) {
var result;
$.ajax({
async: false,
type: "POST",
url: "/java/console/api/data.json",
dataType: 'json',
data: createParamData(paramOptions),
success: function (data) {
result = data.data;
paramOptions.totalSize = data.length;
}
});
return result;
};
DataModelService.prototype.initParamOptions = function () {
this.paramOptions = new OptionsParams();
};
DataModelService.prototype.updateModel = function () {
this.data = this.getDataModel(this.paramOptions);
this.maybeFormat();
};
//格式数据模型中的每个单条记录
DataModelService.prototype.maybeFormat = function () {
this.data = populateKeys(this.data);
this.data = populateNames(this.data);
this.data = populateLabels(this.data);
this.data = createItemsAlias(this.data);
};
//更新用户选择参数
DataModelService.prototype.updateParamOption = function (option, value) {
this.paramOptions[option] = value;
};
//根据key获取用户选择参数
DataModelService.prototype.getParamOption = function (key) {
return this.paramOptions[key];
};
DataModelService.prototype.startIntervalTask = function ($interval, $http) {
var _this = this;
var result;
var timer = $interval(function () {
$.ajax({
async: false,
type: "POST",
url: "/java/console/api/task/transfer/list",
success: function (data) {
if (data) {
result = data;
}
}
});
_this.transferTasks = formatTask(result);
}, 1500);
timer.then(function () {
console.log("Done!");
}, function () {
console.log("error");
}, function () {
console.log("每次都更新");
});
};
return DataModelService;
}());
Developer.DataModelService = DataModelService;
//创建数据模型服务
Developer._module.factory("DataModel", ['$rootScope', '$http', '$interval', '$location', '$resource', function ($rootScope, $http, $interval, $location, $resource) {
var $scope = new DataModelService();
$scope.startIntervalTask($interval, $http);
return $scope;
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
var Developer;
(function (Developer) {
function enrichWorkspaces(projects) {
angular.forEach(projects, function (project) {
enrichWorkspace(project);
});
return projects;
}
Developer.enrichWorkspaces = enrichWorkspaces;
function enrichWorkspace(build) {
if (build) {
var name = Kubernetes.getName(build);
build.$name = name;
build.$sortOrder = 0 - build.number;
var nameArray = name.split("-");
var nameArrayLength = nameArray.length;
build.$shortName = (nameArrayLength > 4) ? nameArray.slice(0, nameArrayLength - 4).join("-") : name.substring(0, 30);
var labels = Kubernetes.getLabels(build);
build.$creationDate = asDate(Kubernetes.getCreationTimestamp(build));
build.$labelsText = Kubernetes.labelsToString(labels);
if (name) {
build.$projectsLink = UrlHelpers.join("workspaces", name);
build.$runtimeLink = UrlHelpers.join("kubernetes/namespace/", name, "/apps");
build.$viewLink = build.$projectsLink;
}
}
return build;
}
Developer.enrichWorkspace = enrichWorkspace;
function asDate(value) {
return value ? new Date(value) : null;
}
Developer.asDate = asDate;
function enrichJenkinsJobs(jobsData, projectId, jobName) {
if (jobsData) {
angular.forEach(jobsData.jobs, function (job) {
enrichJenkinsJob(job, projectId, jobName);
});
}
return jobsData;
}
Developer.enrichJenkinsJobs = enrichJenkinsJobs;
function enrichJenkinsJob(job, projectId, jobName) {
if (job) {
jobName = jobName || job.name || projectId;
job.$jobId = jobName;
job.$project = projectId || jobName;
var lastBuild = job.lastBuild;
var lastBuildResult = lastBuild ? lastBuild.result : "NOT_STARTED";
var $iconClass = createBuildStatusIconClass(lastBuildResult);
job.$lastBuildNumber = enrichJenkinsBuild(job, lastBuild);
job.$lastSuccessfulBuildNumber = enrichJenkinsBuild(job, job.lastSuccessfulBuild);
job.$lastFailedlBuildNumber = enrichJenkinsBuild(job, job.lastFailedlBuild);
if (lastBuild) {
job.$duration = lastBuild.duration;
job.$timestamp = asDate(lastBuild.timestamp);
}
var jobUrl = (job || {}).url;
if (!jobUrl || !jobUrl.startsWith("http")) {
var jenkinsUrl = jenkinsLink();
if (jenkinsUrl) {
jobUrl = UrlHelpers.join(jenkinsUrl, "job", jobName);
}
}
if (jobUrl) {
job.$jobLink = jobUrl;
var workspaceName = Kubernetes.currentKubernetesNamespace();
job.$pipelinesLink = UrlHelpers.join("/workspaces", workspaceName, "projects", job.$project, "jenkinsJob", jobName, "pipelines");
job.$buildsLink = UrlHelpers.join("/workspaces", workspaceName, "projects", job.$project, "jenkinsJob", jobName);
}
job.$iconClass = $iconClass;
angular.forEach(job.builds, function (build) {
enrichJenkinsBuild(job, build);
});
}
return job;
}
Developer.enrichJenkinsJob = enrichJenkinsJob;
function createBuildStatusIconClass(result) {
var $iconClass = "fa fa-spinner fa-spin";
if (result) {
if (result === "FAILURE" || result === "FAILED") {
// TODO not available yet
$iconClass = "fa fa-exclamation-circle red";
}
else if (result === "ABORTED" || result === "INTERUPTED") {
$iconClass = "fa fa-circle grey";
}
else if (result === "SUCCESS" || result === "COMPLETE" || result === "COMPLETED") {
$iconClass = "fa fa-check-circle green";
}
else if (result === "NOT_STARTED") {
$iconClass = "fa fa-circle-thin grey";
}
}
return $iconClass;
}
Developer.createBuildStatusIconClass = createBuildStatusIconClass;
function createBuildStatusBackgroundClass(result) {
var $iconClass = "build-pending";
if (result) {
if (result === "FAILURE" || result === "FAILED") {
$iconClass = "build-fail";
}
else if (result === "ABORTED" || result === "INTERUPTED") {
$iconClass = "build-aborted";
}
else if (result === "SUCCESS" || result === "COMPLETE" || result === "COMPLETED") {
$iconClass = "build-success";
}
else if (result === "NOT_STARTED") {
$iconClass = "build-not-started";
}
}
return $iconClass;
}
Developer.createBuildStatusBackgroundClass = createBuildStatusBackgroundClass;
function enrichJenkinsBuild(job, build) {
var number = null;
if (build) {
build.$duration = build.duration;
build.$timestamp = asDate(build.timestamp);
var projectId = job.$project;
var jobName = job.$jobId || projectId;
var buildId = build.id;
number = build.number;
var workspaceName = Kubernetes.currentKubernetesNamespace();
var $iconClass = createBuildStatusIconClass(build.result);
var jobUrl = (job || {}).url;
if (!jobUrl || !jobUrl.startsWith("http")) {
var jenkinsUrl = jenkinsLink();
if (jenkinsUrl) {
jobUrl = UrlHelpers.join(jenkinsUrl, "job", jobName);
}
}
if (jobUrl) {
build.$jobLink = jobUrl;
if (buildId) {
//build.$logsLink = UrlHelpers.join(build.$buildLink, "console");
build.$logsLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName, "log", buildId);
build.$pipelineLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName, "pipeline", buildId);
build.$buildsLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName);
//build.$buildLink = UrlHelpers.join(jobUrl, build.id);
build.$buildLink = build.$logsLink;
}
}
build.$iconClass = $iconClass;
}
return number;
}
Developer.enrichJenkinsBuild = enrichJenkinsBuild;
function jenkinsLink() {
var ServiceRegistry = Kubernetes.inject("ServiceRegistry");
if (ServiceRegistry) {
return ServiceRegistry.serviceLink(Developer.jenkinsServiceName);
}
return null;
}
Developer.jenkinsLink = jenkinsLink;
function forgeReadyLink() {
var ServiceRegistry = Kubernetes.inject("ServiceRegistry");
if (ServiceRegistry) {
return ServiceRegistry.serviceReadyLink(Kubernetes.fabric8ForgeServiceName);
}
return null;
}
Developer.forgeReadyLink = forgeReadyLink;
function enrichJenkinsPipelineJob(job, projectId, jobId) {
if (job) {
job.$project = projectId;
job.$jobId = jobId;
angular.forEach(job.builds, function (build) {
enrichJenkinsStages(build, projectId, jobId);
});
}
}
Developer.enrichJenkinsPipelineJob = enrichJenkinsPipelineJob;
function enrichJenkinsStages(build, projectId, jobName) {
if (build) {
build.$project = projectId;
build.$jobId = jobName;
build.$timestamp = asDate(build.timeInMillis);
build.$iconClass = createBuildStatusIconClass(build.result || "NOT_STARTED");
var workspaceName = Kubernetes.currentKubernetesNamespace();
var parameters = build.parameters;
var $parameterCount = 0;
var $parameterText = "No parameters";
if (parameters) {
$parameterCount = _.keys(parameters).length || 0;
$parameterText = Kubernetes.labelsToString(parameters, " ");
}
build.$parameterCount = $parameterCount;
build.$parameterText = $parameterText;
var jenkinsUrl = jenkinsLink();
if (jenkinsUrl) {
var url = build.url;
if (url) {
}
}
build.$logLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName, "log", build.id);
build.$viewLink = build.$logLink;
angular.forEach(build.stages, function (stage) {
enrichJenkinsStage(stage, build);
});
}
return build;
}
Developer.enrichJenkinsStages = enrichJenkinsStages;
function enrichJenkinsStage(stage, build) {
if (build === void 0) { build = null; }
if (stage) {
if (build) {
stage.$buildId = build.id;
stage.$project = build.$project;
}
var projectId = build.$project;
var jobName = build.$jobId || projectId;
var buildId = build.id;
var workspaceName = Kubernetes.currentKubernetesNamespace();
stage.$backgroundClass = createBuildStatusBackgroundClass(stage.status);
stage.$iconClass = createBuildStatusIconClass(stage.status);
stage.$startTime = asDate(stage.startTime);
if (!stage.duration) {
stage.duration = 0;
}
var jenkinsUrl = jenkinsLink();
if (jenkinsUrl) {
var url = stage.url;
if (url) {
stage.$viewLink = UrlHelpers.join(jenkinsUrl, url);
stage.$logLink = UrlHelpers.join(stage.$viewLink, "log");
if (projectId && buildId) {
stage.$logLink = UrlHelpers.join("/workspaces", workspaceName, "projects", projectId, "jenkinsJob", jobName, "log", buildId);
}
}
}
}
}
Developer.enrichJenkinsStage = enrichJenkinsStage;
})(Developer || (Developer = {}));
/// <reference path="developerPlugin.ts"/>
var Developer;
(function (Developer) {
Developer._module.controller('Developer.EnvironmentPanelController', ["$scope", "$element", "$location", "$routeParams", "KubernetesModel", "$http", "$timeout", "KubernetesState", "KubernetesApiURL", function ($scope, $element, $location, $routeParams, KubernetesModel, $http, $timeout, KubernetesState, KubernetesApiURL) {
$scope.envVersions = {};
$scope.model = KubernetesModel;
$scope.env = $scope.$eval('env');
$scope.buildConfig = $scope.$eval('entity');
$scope.open = true;
$scope.toggle = function () { return $scope.open = !$scope.open; };
var caches = {};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
Developer.loadProjectVersions($scope, $element, $scope.buildConfig, $scope.env, $scope.env.namespace, $scope.envVersions, caches);
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="developerPlugin.ts"/>
/// <reference path="dataManagerModel.ts"/>
/// <reference path="dataManagerHelper.ts"/>
/// <reference path="../../configs/ts/ConfigsHelper.ts"/>
var Developer;
(function (Developer) {
Developer.KubeTaskController = Developer.controller("KubeTaskController", ["$scope", "$http", "$location", "$routeParams", "DataModel", "$templateCache", function ($scope, $http, $location, $routeParams, DataModel, $templateCache) {
$scope.model = DataModel;
$scope.subTabConfig = Developer.createCurrentSubNavBar($scope, $location, $routeParams);
$scope.tableConfig = {
data: 'model.transferTasks',
showSelectionCheckbox: false,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [{
field: "_key",
displayName: '编码',
customSortField: function (field) {
return field.id;
}
},
{
field: "name",
displayName: '市-区/县'
},
{
field: "systemName",
displayName: '系统名称'
},
{
field: "labels",
displayName: '数据标签',
cellTemplate: $templateCache.get("dataLabelsTemplate.html")
},
{
field: "from",
displayName: '源集群',
},
{
field: "to",
displayName: '目的集群',
},
{
field: "status",
displayName: '迁移状态',
cellTemplate: $templateCache.get("taskStatus.html")
},
{
field: "process",
displayName: '迁移进度',
cellTemplate: $templateCache.get("taskProcess.html")
},
{
field: "entity",
displayName: '操作',
cellTemplate: $templateCache.get("taskEdit.html")
}
] };
$scope.$on("deleteRow", function (event, data) {
Configs.oracleInfoOperate($http, "/java/console/api/task/transfer", Configs.OperateType.DELETE, data, function (data, status) {
if (status === 200)
console.log("删除成功");
});
});
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
var Developer;
(function (Developer) {
Developer.HomeController = Developer.controller("HomeController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL) {
$scope.namespace = Kubernetes.currentKubernetesNamespace();
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
var Developer;
(function (Developer) {
Developer.JenkinsJobController = Developer.controller("JenkinsJobController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "ServiceRegistry",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["id"];
$scope.jobId = $routeParams["job"];
$scope.schema = KubernetesSchema;
$scope.entityChangedCache = {};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, $scope.jobId);
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
$scope.tableConfig = {
data: 'job.builds',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{
field: '$sortOrder',
displayName: 'Name',
cellTemplate: $templateCache.get("jenkinsBuildIdTemplate.html")
},
{
field: '$buildLink',
displayName: 'Views',
cellTemplate: $templateCache.get("jenkinsBuildButtonsTemplate.html")
},
{
field: '$duration',
displayName: 'Duration',
cellTemplate: $templateCache.get("jenkinsBuildDurationTemplate.html")
},
{
field: '$timestamp',
displayName: 'Time Started',
cellTemplate: $templateCache.get("jenkinsBuildTimestampTemplate.html")
}
]
};
updateData();
function updateData() {
if ($scope.jobId) {
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(Developer.jenkinsServiceNameAndPort, UrlHelpers.join("job", $scope.jobId, "api/json?depth=1"));
if (url && (!$scope.job || Kubernetes.keepPollingModel)) {
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
Developer.enrichJenkinsJob(data, $scope.id, $scope.jobId);
if (Developer.hasObjectChanged(data, $scope.entityChangedCache)) {
Developer.log.info("entity has changed!");
$scope.job = data;
}
}
$scope.model.fetched = true;
Core.$apply($scope);
}).
error(function (data, status, headers, config) {
Developer.log.warn("Failed to load " + url + " " + data + " " + status);
});
}
}
else {
$scope.model.fetched = true;
Core.$apply($scope);
}
}
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
var Developer;
(function (Developer) {
Developer.JenkinsJobsController = Developer.controller("JenkinsJobsController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "ServiceRegistry",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["id"];
$scope.schema = KubernetesSchema;
$scope.jenkins = null;
$scope.entityChangedCache = {};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs();
$scope.subTabConfig = Developer.createWorkspaceSubNavBars();
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
$scope.tableConfig = {
data: 'jenkins.jobs',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{
field: 'name',
displayName: 'Name',
cellTemplate: $templateCache.get("jenkinsJobNameTemplate.html")
},
{
field: '$buildLink',
displayName: 'Views',
cellTemplate: $templateCache.get("jenkinsJobButtonsTemplate.html")
},
{
field: '$lastSuccessfulBuildNumber',
displayName: 'Last Success',
cellTemplate: $templateCache.get("jenkinsLastSuccessTemplate.html")
},
{
field: '$lastFailedlBuildNumber',
displayName: 'Last Failure',
cellTemplate: $templateCache.get("jenkinsLastFailureTemplate.html")
},
{
field: '$duration',
displayName: 'Last Duration',
cellTemplate: $templateCache.get("jenkinsBuildDurationTemplate.html")
},
{
field: '$timestamp',
displayName: 'Time Started',
cellTemplate: $templateCache.get("jenkinsBuildTimestampTemplate.html")
}
]
};
updateData();
function updateData() {
// TODO only need depth 2 to be able to fetch the lastBuild
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(Developer.jenkinsServiceNameAndPort, "api/json?depth=2");
Developer.log.info("");
if (url && (!$scope.jenkins || Kubernetes.keepPollingModel)) {
$http.get(url, Developer.jenkinsHttpConfig).
success(function (data, status, headers, config) {
if (data) {
Developer.enrichJenkinsJobs(data, $scope.id, $scope.id);
if (Developer.hasObjectChanged(data, $scope.entityChangedCache)) {
Developer.log.info("entity has changed!");
$scope.jenkins = data;
}
}
$scope.model.fetched = true;
Core.$apply($scope);
}).
error(function (data, status, headers, config) {
Developer.log.warn("Failed to load " + url + " " + data + " " + status);
});
}
}
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.FABRIC8_PROJECT_JSON = "fabric8ProjectJson";
function byId(thing) {
return thing.id;
}
function createKey(namespace, id, kind) {
return (namespace || "") + "-" + (kind || 'undefined').toLowerCase() + '-' + (id || 'undefined').replace(/\./g, '-');
}
function populateKey(item) {
var result = item;
result['_key'] = createKey(Kubernetes.getNamespace(item), Kubernetes.getName(item), Kubernetes.getKind(item));
return result;
}
function populateKeys(items) {
var result = [];
angular.forEach(items, function (item) {
result.push(populateKey(item));
});
return result;
}
function selectPods(pods, namespace, labels) {
return pods.filter(function (pod) {
return Kubernetes.getNamespace(pod) === namespace && Kubernetes.selectorMatches(labels, Kubernetes.getLabels(pod));
});
}
/**
* The object which keeps track of all the pods, replication controllers, services and their associations
*/
var KubernetesModelService = (function () {
function KubernetesModelService() {
this.kubernetes = null;
this.apps = [];
this.services = [];
this.replicationcontrollers = [];
this.filterReplicationcontrollers = [];
this.pods = [];
this.hosts = [];
//public namespaces = [];
this.routes = [];
this.templates = [];
this.redraw = false;
this.resourceVersions = {};
// various views on the data
this.podsByHost = {};
this.servicesByKey = {};
this.replicationControllersByKey = {};
this.podsByKey = {};
this.appInfos = [];
this.appViews = [];
this.appFolders = [];
this.fetched = false;
this.buildconfigs = [];
this.events = [];
this.workspaces = [];
this.projects = [];
this.project = null;
}
Object.defineProperty(KubernetesModelService.prototype, "replicationControllers", {
/*public get filterReplicationcontrollers():Array<any> {
return this.filterReplicationcontrollers;
}
public set filterReplicationcontrollers(filterReplicationcontrollers:Array<any>) {
this.filterReplicationcontrollers = filterReplicationcontrollers;
}*/
get: function () {
return this.replicationcontrollers;
},
set: function (replicationControllers) {
this.replicationcontrollers = replicationControllers;
},
enumerable: true,
configurable: true
});
Object.defineProperty(KubernetesModelService.prototype, "namespaces", {
get: function () {
return this.kubernetes.namespaces;
},
enumerable: true,
configurable: true
});
Object.defineProperty(KubernetesModelService.prototype, "showRunButton", {
get: function () {
if (Kubernetes.isOpenShift) {
return true;
}
return _.any(this.services, function (service) {
var name = Kubernetes.getName(service);
if (name === "templates") {
var podCounters = service.$podCounters;
return podCounters && (podCounters.valid || podCounters.ready);
}
else {
return false;
}
});
},
enumerable: true,
configurable: true
});
Object.defineProperty(KubernetesModelService.prototype, "serviceApps", {
get: function () {
return _.filter(this.services, function (s) {
return s.$host && s.$serviceUrl && s.$podCount;
});
},
enumerable: true,
configurable: true
});
KubernetesModelService.prototype.$keepPolling = function () {
return Kubernetes.keepPollingModel;
};
KubernetesModelService.prototype.orRedraw = function (flag) {
this.redraw = this.redraw || flag;
};
KubernetesModelService.prototype.getService = function (namespace, id) {
return this.servicesByKey[createKey(namespace, id, 'service')];
};
KubernetesModelService.prototype.getReplicationController = function (namespace, id) {
return this.replicationControllersByKey[createKey(namespace, id, 'replicationController')];
};
KubernetesModelService.prototype.getPod = function (namespace, id) {
return this.podsByKey[createKey(namespace, id, 'pod')];
};
KubernetesModelService.prototype.podsForNamespace = function (namespace) {
if (namespace === void 0) { namespace = this.currentNamespace(); }
return _.filter(this.pods, { namespace: namespace });
};
KubernetesModelService.prototype.getBuildConfig = function (name) {
return _.find(this.buildconfigs, { $name: name });
};
KubernetesModelService.prototype.getProject = function (name, ns) {
if (ns === void 0) { ns = this.currentNamespace(); }
var buildConfig = this.project;
if (!buildConfig) {
var text = localStorage[Kubernetes.FABRIC8_PROJECT_JSON];
if (text) {
try {
buildConfig = angular.fromJson(text);
}
catch (e) {
Kubernetes.log.warn("Could not parse json for " + Kubernetes.FABRIC8_PROJECT_JSON + ". Was: " + text + ". " + e, e);
}
}
}
if (buildConfig && ns != Kubernetes.getNamespace(buildConfig) && name != buildConfig.$name) {
buildConfig = this.getBuildConfig(name);
}
return buildConfig;
};
KubernetesModelService.prototype.setProject = function (buildConfig) {
this.project = buildConfig;
if (buildConfig) {
// lets store in local storage
var localStorage = Kubernetes.inject("localStorage");
if (localStorage) {
localStorage[Kubernetes.FABRIC8_PROJECT_JSON] = angular.toJson(buildConfig);
}
}
};
/**
* Returns the current selected namespace or the default namespace
*/
KubernetesModelService.prototype.currentNamespace = function () {
var answer = null;
if (this.kubernetes) {
answer = this.kubernetes.selectedNamespace;
}
return answer || Kubernetes.defaultNamespace;
};
KubernetesModelService.prototype.updateIconUrlAndAppInfo = function (entity, nameField) {
var answer = null;
var id = Kubernetes.getName(entity);
entity.$iconUrl = Core.pathGet(entity, ['metadata', 'annotations', 'fabric8.' + id + '/iconUrl']);
entity.$info = Core.pathGet(entity, ['metadata', 'annotations', 'fabric8.' + id + '/summary']);
if (entity.$iconUrl) {
return;
}
if (id && nameField) {
(this.templates || []).forEach(function (template) {
var metadata = template.metadata;
if (metadata) {
var annotations = metadata.annotations || {};
var iconUrl = annotations["fabric8." + id + "/iconUrl"] || annotations["fabric8/iconUrl"];
if (iconUrl) {
(template.objects || []).forEach(function (item) {
var entityName = Kubernetes.getName(item);
if (id === entityName) {
entity.$iconUrl = iconUrl;
}
});
}
}
});
(this.appInfos || []).forEach(function (appInfo) {
var iconPath = appInfo.iconPath;
if (iconPath && !answer && iconPath !== "null") {
var iconUrl = Kubernetes.gitPathToUrl(iconPath);
var ids = Core.pathGet(appInfo, ["names", nameField]);
angular.forEach(ids, function (appId) {
if (appId === id) {
entity.$iconUrl = iconUrl;
entity.appPath = appInfo.appPath;
entity.$info = appInfo;
}
});
}
});
}
if (!entity.$iconUrl) {
entity.$iconUrl = Kubernetes.defaultIconUrl;
}
};
KubernetesModelService.prototype.maybeInit = function () {
var _this = this;
this.fetched = true;
this.servicesByKey = {};
this.podsByKey = {};
this.replicationControllersByKey = {};
this.pods.forEach(function (pod) {
if (!pod.kind)
pod.kind = "Pod";
_this.podsByKey[pod._key] = pod;
var host = Kubernetes.getHost(pod);
pod.$labelsText = Kubernetes.labelsToString(Kubernetes.getLabels(pod));
if (host) {
pod.$labelsText += Kubernetes.labelFilterTextSeparator + "host=" + host;
}
pod.$iconUrl = Kubernetes.defaultIconUrl;
_this.discoverPodConnections(pod);
pod.$containerPorts = [];
var podStatus = pod.status || {};
var startTime = podStatus.startTime;
pod.$startTime = null;
if (startTime) {
pod.$startTime = new Date(startTime);
}
var createdTime = Kubernetes.getCreationTimestamp(pod);
pod.$createdTime = null;
pod.$age = null;
if (createdTime) {
pod.$createdTime = new Date(createdTime);
pod.$age = humandate.relativeTime(pod.$createdTime);
}
var ready = Kubernetes.isReady(pod);
pod.$ready = ready;
pod.$statusCss = Kubernetes.statusTextToCssClass(podStatus.phase, ready);
var maxRestartCount = 0;
angular.forEach(Core.pathGet(pod, ["status", "containerStatuses"]), function (status) {
var restartCount = status.restartCount;
if (restartCount) {
if (restartCount > maxRestartCount) {
maxRestartCount = restartCount;
}
}
});
if (maxRestartCount) {
pod.$restartCount = maxRestartCount;
}
var imageNames = "";
angular.forEach(Core.pathGet(pod, ["spec", "containers"]), function (container) {
var image = container.image;
if (image) {
if (!imageNames) {
imageNames = image;
}
else {
imageNames = imageNames + " " + image;
}
var idx = image.lastIndexOf(":");
if (idx > 0) {
image = image.substring(0, idx);
}
var paths = image.split("/", 3);
if (paths.length) {
var answer = null;
if (paths.length == 3) {
answer = paths[1] + "/" + paths[2];
}
else if (paths.length == 2) {
answer = paths[0] + "/" + paths[1];
}
else {
answer = paths[0] + "/" + paths[1];
}
container.$imageLink = UrlHelpers.join("https://registry.hub.docker.com/u/", answer);
}
}
angular.forEach(container.ports, function (port) {
var containerPort = port.containerPort;
if (containerPort) {
pod.$containerPorts.push(containerPort);
}
});
});
pod.$imageNames = imageNames;
var podStatus = podStatus;
var podSpec = (pod.spec || {});
pod.$podIP = podStatus.podIP;
pod.$host = podSpec.host || podSpec.nodeName || podStatus.hostIP;
});
this.services.forEach(function (service) {
if (!service.kind)
service.kind = "Service";
_this.servicesByKey[service._key] = service;
var selector = Kubernetes.getSelector(service);
service.$pods = [];
if (!service.$podCounters) {
service.$podCounters = {};
}
var podLinkUrl = UrlHelpers.join("/kubernetes/namespace", service.metadata.namespace, "pods");
_.assign(service.$podCounters, selector ? Kubernetes.createPodCounters(selector, _this.pods, service.$pods, Kubernetes.labelsToString(selector, ","), podLinkUrl) : {});
service.$podCount = service.$pods.length;
var selectedPods = service.$pods;
service.connectTo = selectedPods.map(function (pod) {
return pod._key;
}).join(',');
service.$labelsText = Kubernetes.labelsToString(Kubernetes.getLabels(service));
_this.updateIconUrlAndAppInfo(service, "serviceNames");
var spec = service.spec || {};
service.$portalIP = spec.portalIP;
service.$selectorText = Kubernetes.labelsToString(spec.selector);
var ports = _.map(spec.ports || [], "port");
service.$ports = ports;
service.$portsText = ports.join(", ");
var iconUrl = service.$iconUrl;
if (iconUrl && selectedPods) {
selectedPods.forEach(function (pod) {
pod.$iconUrl = iconUrl;
});
}
service.$serviceUrl = Kubernetes.serviceLinkUrl(service);
});
this.replicationControllers.forEach(function (replicationController) {
if (!replicationController.kind)
replicationController.kind = "ReplicationController";
_this.replicationControllersByKey[replicationController._key] = replicationController;
var selector = Kubernetes.getSelector(replicationController);
replicationController.$pods = [];
if (Kubernetes.isFilterRC(replicationController) && !Kubernetes.isInclude(_this.filterReplicationcontrollers, replicationController))
_this.filterReplicationcontrollers.push(replicationController);
replicationController.$podCounters = selector ? Kubernetes.createPodCounters(selector, _this.pods, replicationController.$pods) : null;
replicationController.$podCount = replicationController.$pods.length;
replicationController.$replicas = (replicationController.spec || {}).replicas;
replicationController.$oracleName = Kubernetes.getOracleName(replicationController);
//console.log(getName(replicationController));
replicationController.$oracleStatus = Kubernetes.getOracleStatus(Kubernetes.getLabels(replicationController));
replicationController.$extractStatus = Kubernetes.getExtractStatus(Kubernetes.getLabels(replicationController));
//
var annotation = Kubernetes.getAnnotations(replicationController);
var label = Kubernetes.getLabels(replicationController);
replicationController.$alias = annotation.cityName + "_" + annotation.districtName + "_" + annotation.systemName + "_" + annotation.year + "_" + label.version;
var selectedPods = replicationController.$pods;
replicationController.connectTo = selectedPods.map(function (pod) {
return pod._key;
}).join(',');
//console.log(getLabels(replicationController));
replicationController.$labelsText = Kubernetes.labelsToString(Kubernetes.getLabels(replicationController));
replicationController.metadata.labels = Kubernetes.labelsFormat(replicationController);
_this.updateIconUrlAndAppInfo(replicationController, "replicationControllerNames");
var iconUrl = replicationController.$iconUrl;
if (iconUrl && selectedPods) {
selectedPods.forEach(function (pod) {
pod.$iconUrl = iconUrl;
});
}
});
// services may not map to an icon but their pods may do via the RC
// so lets default it...
this.services.forEach(function (service) {
var iconUrl = service.$iconUrl;
var selectedPods = service.$pods;
if (selectedPods) {
if (!iconUrl || iconUrl === Kubernetes.defaultIconUrl) {
iconUrl = null;
selectedPods.forEach(function (pod) {
if (!iconUrl) {
iconUrl = pod.$iconUrl;
if (iconUrl) {
service.$iconUrl = iconUrl;
}
}
});
}
}
});
this.updateApps();
var podsByHost = {};
this.pods.forEach(function (pod) {
var host = Kubernetes.getHost(pod);
var podsForHost = podsByHost[host];
if (!podsForHost) {
podsForHost = [];
podsByHost[host] = podsForHost;
}
podsForHost.push(pod);
});
this.podsByHost = podsByHost;
var tmpHosts = [];
for (var hostKey in podsByHost) {
var hostPods = [];
var podCounters = Kubernetes.createPodCounters(function (pod) { return Kubernetes.getHost(pod) === hostKey; }, this.pods, hostPods, "host=" + hostKey);
var hostIP = null;
if (hostPods.length) {
var pod = hostPods[0];
var currentState = pod.status;
if (currentState) {
hostIP = currentState.hostIP;
}
}
var hostDetails = {
name: hostKey,
id: hostKey,
elementId: hostKey.replace(/\./g, '_'),
hostIP: hostIP,
pods: hostPods,
kind: "Host",
$podCounters: podCounters,
$iconUrl: Kubernetes.hostIconUrl
};
tmpHosts.push(hostDetails);
}
this.hosts = tmpHosts;
Kubernetes.enrichBuildConfigs(this.buildconfigs);
Kubernetes.enrichEvents(this.events, this);
};
KubernetesModelService.prototype.updateApps = function () {
var _this = this;
try {
// lets create the app views by trying to join controllers / services / pods that are related
var appViews = [];
this.replicationControllers.forEach(function (replicationController) {
var name = Kubernetes.getName(replicationController);
var $iconUrl = replicationController.$iconUrl;
appViews.push({
appPath: "/dummyPath/" + name,
$name: name,
$info: {
$iconUrl: $iconUrl
},
$iconUrl: $iconUrl,
replicationControllers: [replicationController],
pods: replicationController.$pods || [],
services: []
});
});
var noMatches = [];
this.services.forEach(function (service) {
// now lets see if we can find an app with an RC of the same selector
var matchesApp = null;
appViews.forEach(function (appView) {
appView.replicationControllers.forEach(function (replicationController) {
var repSelector = Kubernetes.getSelector(replicationController);
if (repSelector &&
Kubernetes.selectorMatches(repSelector, Kubernetes.getSelector(service)) &&
Kubernetes.getNamespace(service) === Kubernetes.getNamespace(replicationController)) {
matchesApp = appView;
}
});
});
if (matchesApp) {
matchesApp.services.push(service);
}
else {
noMatches.push(service);
}
});
Kubernetes.log.debug("no matches: ", noMatches);
noMatches.forEach(function (service) {
var appView = _.find(appViews, function (appView) {
return _.any(appView.replicationControllers, function (rc) {
return _.startsWith(Kubernetes.getName(rc), Kubernetes.getName(service));
});
});
if (appView) {
appView.services.push(service);
}
else {
var $iconUrl = service.$iconUrl;
appViews.push({
appPath: "/dummyPath/" + name,
$name: name,
$info: {
$iconUrl: $iconUrl
},
$iconUrl: $iconUrl,
replicationControllers: [],
pods: service.$pods || [],
services: [service]
});
}
});
angular.forEach(this.routes, function (route) {
var metadata = route.metadata || {};
var spec = route.spec || {};
var serviceName = Core.pathGet(spec, ["to", "name"]);
var host = spec.host;
var namespace = Kubernetes.getNamespace(route);
if (serviceName && host) {
var service = _this.getService(namespace, serviceName);
if (service) {
service.$host = host;
// TODO we could use some annotations / metadata to deduce what URL we should use to open this
// service in the console. For now just assume its http:
if (host) {
var hostUrl = host;
if (hostUrl.indexOf("://") < 0) {
hostUrl = "http://" + host;
}
service.$connectUrl = UrlHelpers.join(hostUrl, "/");
}
// TODO definitely need that annotation, temp hack for apiman link
if (Kubernetes.getName(service) === 'apiman' && host) {
service.$connectUrl = new URI().host(service.$host)
.path('apimanui/index.html')
.query({})
.hash(URI.encode(angular.toJson({
backTo: new URI().toString(),
token: HawtioOAuth.getOAuthToken()
}))).toString();
}
}
else {
Kubernetes.log.debug("Could not find service " + serviceName + " namespace " + namespace + " for route: " + metadata.name);
}
}
});
appViews = _.sortBy(populateKeys(appViews), function (appView) { return appView._key; });
ArrayHelpers.sync(this.appViews, appViews, '$name');
if (this.appInfos && this.appViews) {
var folderMap = {};
var folders = [];
var appMap = {};
angular.forEach(this.appInfos, function (appInfo) {
if (!appInfo.$iconUrl && appInfo.iconPath && appInfo.iconPath !== "null") {
appInfo.$iconUrl = Kubernetes.gitPathToUrl(appInfo.iconPath);
}
var appPath = appInfo.appPath;
if (appPath) {
appMap[appPath] = appInfo;
var idx = appPath.lastIndexOf("/");
var folderPath = "";
if (idx >= 0) {
folderPath = appPath.substring(0, idx);
}
folderPath = Core.trimLeading(folderPath, "/");
var folder = folderMap[folderPath];
if (!folder) {
folder = {
path: folderPath,
expanded: true,
apps: []
};
folders.push(folder);
folderMap[folderPath] = folder;
}
folder.apps.push(appInfo);
}
});
this.appFolders = _.sortBy(folders, "path");
var apps = [];
var defaultInfo = {
$iconUrl: Kubernetes.defaultIconUrl
};
angular.forEach(this.appViews, function (appView) {
try {
var appPath = appView.appPath;
/*
TODO
appView.$select = () => {
Kubernetes.setJson($scope, appView.id, $scope.model.apps);
};
*/
var appInfo = angular.copy(defaultInfo);
if (appPath) {
appInfo = appMap[appPath] || appInfo;
}
if (!appView.$info) {
appView.$info = defaultInfo;
appView.$info = appInfo;
}
appView.id = appPath;
if (!appView.$name) {
appView.$name = appInfo.name || appView.$name;
}
if (!appView.$iconUrl) {
appView.$iconUrl = appInfo.$iconUrl;
}
apps.push(appView);
appView.$podCounters = Kubernetes.createAppViewPodCounters(appView);
appView.$podCount = (appView.pods || []).length;
appView.$replicationControllersText = (appView.replicationControllers || []).map(function (i) { return i["_key"]; }).join(" ");
appView.$servicesText = (appView.services || []).map(function (i) { return i["_key"]; }).join(" ");
appView.$serviceViews = Kubernetes.createAppViewServiceViews(appView);
}
catch (e) {
Kubernetes.log.warn("Failed to update appViews: " + e);
}
});
//this.apps = apps;
this.apps = this.appViews;
}
}
catch (e) {
Kubernetes.log.warn("Caught error: " + e);
}
};
KubernetesModelService.prototype.discoverPodConnections = function (entity) {
var info = Core.pathGet(entity, ["status", "info"]);
var hostPort = null;
var currentState = entity.status || {};
var desiredState = entity.spec || {};
var podId = Kubernetes.getName(entity);
var host = currentState["hostIP"];
var podIP = currentState["podIP"];
var hasDocker = false;
var foundContainerPort = null;
if (desiredState) {
var containers = desiredState.containers;
angular.forEach(containers, function (container) {
if (!hostPort) {
var ports = container.ports;
angular.forEach(ports, function (port) {
if (!hostPort) {
var containerPort = port.containerPort;
var portName = port.name;
var containerHostPort = port.hostPort;
if (containerPort === 8778 || "jolokia" === portName) {
if (containerPort) {
if (podIP) {
foundContainerPort = containerPort;
}
if (containerHostPort) {
hostPort = containerHostPort;
}
}
}
}
});
}
});
}
if (foundContainerPort && podId && Kubernetes.isRunning(currentState)) {
if (!Kubernetes.isOpenShift) {
// TODO temp workaround for k8s on GKE https://github.com/kubernetes/kubernetes/issues/17172
entity.$jolokiaUrl = UrlHelpers.join(Kubernetes.masterApiUrl(), "api", Kubernetes.defaultApiVersion, "proxy", "namespaces", entity.metadata.namespace, "pods",
//"https:" + podId + ":" + foundContainerPort,
podId + ":" + foundContainerPort, "jolokia/");
}
else {
entity.$jolokiaUrl = UrlHelpers.join(Kubernetes.masterApiUrl(), "api", Kubernetes.defaultApiVersion, "namespaces", entity.metadata.namespace, "pods", "https:" + podId + ":" + foundContainerPort, "proxy/jolokia/");
}
}
};
return KubernetesModelService;
}());
Kubernetes.KubernetesModelService = KubernetesModelService;
function getTemplateService(model) {
var key = createKey('default', 'templates', 'service');
var answer = model.servicesByKey[key];
Kubernetes.log.debug("found template service: ", answer);
return answer;
}
/**
* Creates a model service which keeps track of all the pods, replication controllers and services along
* with their associations and status
*/
Kubernetes._module.factory('KubernetesModel', ['$rootScope', '$http', 'KubernetesApiURL', 'KubernetesState', 'WatcherService', '$location', '$resource', function ($rootScope, $http, AppLibraryURL, KubernetesState, watcher, $location, $resource) {
var $scope = new KubernetesModelService();
$scope.kubernetes = KubernetesState;
// create all of our resource classes
var typeNames = watcher.getTypes();
_.forEach(typeNames, function (type) {
var urlTemplate = Kubernetes.uriTemplateForKubernetesKind(type);
$scope[type + 'Resource'] = Kubernetes.createResource(type, urlTemplate, $resource, $scope);
});
if (!Kubernetes.isOpenShift) {
// register custom URL factories for templates/projects
watcher.registerCustomUrlFunction(KubernetesAPI.WatchTypes.BUILD_CONFIGS, function (options) {
var templateService = getTemplateService($scope);
if (templateService) {
return UrlHelpers.join(templateService.proxyUrl, '/oapi/v1/namespaces/default/buildconfigs/');
}
return null;
});
// register custom URL factories for templates/projects
watcher.registerCustomUrlFunction(KubernetesAPI.WatchTypes.TEMPLATES, function (options) {
var templateService = getTemplateService($scope);
if (templateService) {
return UrlHelpers.join(templateService.proxyUrl, '/oapi/v1/namespaces/default/templates/');
}
return null;
});
}
// register for all updates on objects
watcher.registerListener(function (objects) {
var types = watcher.getTypes();
_.forEach(types, function (type) {
switch (type) {
case Kubernetes.WatchTypes.SERVICES:
var items = populateKeys(objects[type]);
angular.forEach(items, function (item) {
item.proxyUrl = Kubernetes.kubernetesProxyUrlForService(Kubernetes.kubernetesApiUrl(), item);
});
$scope[type] = items;
break;
case Kubernetes.WatchTypes.TEMPLATES:
case Kubernetes.WatchTypes.ROUTES:
case Kubernetes.WatchTypes.BUILDS:
case Kubernetes.WatchTypes.BUILD_CONFIGS:
case Kubernetes.WatchTypes.IMAGE_STREAMS:
// don't put a break here :-)
default:
$scope[type] = populateKeys(objects[type]);
}
Kubernetes.log.debug("Type: ", type, " object: ", $scope[type]);
});
$scope.maybeInit();
$rootScope.$broadcast('kubernetesModelUpdated', $scope);
Core.$apply($rootScope);
});
// set the selected namespace if set in the location bar
// otherwise use whatever previously selected namespace is
// available
var search = $location.search();
if ('namespace' in search) {
watcher.setNamespace(search['namespace']);
}
function selectPods(pods, namespace, labels) {
return pods.filter(function (pod) {
return Kubernetes.getNamespace(pod) === namespace && Kubernetes.selectorMatches(labels, Kubernetes.getLabels(pod));
});
}
return $scope;
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesInterfaces.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesModel.ts"/>
/// <reference path="developerPlugin.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
var Developer;
(function (Developer) {
function clickApprove(element, url) {
var $scope = angular.element(element).scope();
if ($scope) {
$scope.approve(url, element.text);
}
}
Developer.clickApprove = clickApprove;
Developer.JenkinsLogController = Developer._module.controller("Developer.JenkinsLogController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "$modal", "KubernetesApiURL", "ServiceRegistry", "$element", function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, $modal, KubernetesApiURL, ServiceRegistry, $element) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.selectedBuild = $scope.$eval('build') || $scope.$eval('selectedBuild');
$scope.id = $scope.$eval('build.id') || $routeParams["id"];
$scope.schema = KubernetesSchema;
$scope.entityChangedCache = {};
$element.on('$destroy', function () {
$scope.$destroy();
});
$scope.log = {
html: "",
start: 0,
firstIdx: null
};
$scope.$on('kubernetesModelUpdated', function () {
updateJenkinsLink();
Core.$apply($scope);
});
$scope.$on('jenkinsSelectedBuild', function (event, build) {
Developer.log.info("==== jenkins build selected! " + build.id + " " + build.$jobId);
$scope.selectedBuild = build;
});
$scope.$watch('selectedBuild', function (selectedBuild) {
Developer.log.info("Selected build updated: ", selectedBuild);
$scope.fetch();
});
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createJenkinsBreadcrumbs($scope.id, getJobId(), getBuildId());
$scope.subTabConfig = Developer.createJenkinsSubNavBars($scope.id, getJobId(), getBuildId(), {
label: "Log",
title: "Views the logs of this build"
});
function getJobId() {
// lets allow the parent scope to be used too for when this is used as a panel
return $routeParams["job"] || ($scope.selectedBuild || {}).$jobId;
}
$scope.getJobId = getJobId;
function getBuildId() {
// lets allow the parent scope to be used too for when this is used as a panel
return $routeParams["build"] || ($scope.selectedBuild || {}).id;
}
$scope.getBuildId = getBuildId;
function updateJenkinsLink() {
var jenkinsUrl = Developer.jenkinsLink();
if (jenkinsUrl) {
$scope.$viewJenkinsBuildLink = UrlHelpers.join(jenkinsUrl, "job", getJobId(), getBuildId());
$scope.$viewJenkinsLogLink = UrlHelpers.join($scope.$viewJenkinsBuildLink, "console");
}
}
var querySize = 50000;
$scope.approve = function (url, operation) {
var modal = $modal.open({
templateUrl: UrlHelpers.join(Developer.templatePath, 'jenkinsApproveModal.html'),
controller: ['$scope', '$modalInstance', function ($scope, $modalInstance) {
$scope.operation = operation;
$scope.header = operation + "?";
$scope.ok = function () {
modal.close();
postToJenkins(url, operation);
};
$scope.cancel = function () {
modal.dismiss();
};
}]
});
};
function postToJenkins(uri, operation) {
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(Developer.jenkinsServiceNameAndPort, uri);
if (url) {
var body = null;
var config = {
headers: {}
};
Developer.log.info("posting to jenkinsUrl: " + url);
$http.post(url, body, config).
success(function (data, status, headers, config) {
Developer.log.info("Managed to " + operation + " at " + url);
}).
error(function (data, status, headers, config) {
Developer.log.warn("Failed " + operation + " job at " + url + " " + data + " " + status);
});
}
else {
Developer.log.warn("Cannot post to jenkins URI: " + uri + " as no jenkins found!");
}
}
$scope.$keepPolling = function () { return Kubernetes.keepPollingModel; };
$scope.fetch = PollHelpers.setupPolling($scope, function (next) {
if ($scope.$eval('hideLogs && !build.building')) {
Developer.log.debug("Log hidden, not fetching logs");
return;
}
else {
Developer.log.debug("Fetching logs for build: ", $scope.$eval('build'));
}
var buildId = getBuildId();
var jobId = getJobId();
//log.info("=== jenkins log querying job " + jobId + " build " + buildId + " selected build " + $scope.selectedBuild);
if (jobId && buildId) {
if ($scope.buildId !== buildId || $scope.jobId !== jobId) {
// lets clear the query
$scope.log = {
html: "",
start: 0,
firstIdx: null
};
}
$scope.buildId = buildId;
$scope.jobId = jobId;
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(Developer.jenkinsServiceNameAndPort, UrlHelpers.join("job", jobId, buildId, "fabric8/logHtml?tail=1&start=" + $scope.log.start + "&size=" + querySize));
if ($scope.log.firstIdx !== null) {
url += "&first=" + $scope.log.firstIdx;
}
if (url && (!$scope.log.fetched || Kubernetes.keepPollingModel)) {
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
var replaceClusterIPsInHtml = replaceClusterIpFunction();
if (!$scope.log.logs) {
$scope.log.logs = [];
}
var lines = data.lines;
var returnedLength = data.returnedLength;
var logLength = data.logLength;
var returnedStart = data.start;
var earlierLog = false;
if (angular.isDefined(returnedStart)) {
earlierLog = returnedStart < $scope.log.start;
}
var lineSplit = data.lineSplit;
// log.info("start was: " + $scope.log.start + " first: " + $scope.log.firstIdx + " => returnedLength: " + returnedLength + " logLength: " + logLength + " returnedStart: " + returnedStart + " earlierLog: " + earlierLog + " lineSplit: " + lineSplit);
if (lines) {
var currentLogs = $scope.log.logs;
// lets re-join split lines
if (lineSplit && currentLogs.length) {
var lastIndex;
var restOfLine;
if (earlierLog) {
lastIndex = 0;
restOfLine = lines.pop();
if (restOfLine) {
currentLogs[lastIndex] = replaceClusterIPsInHtml(restOfLine + currentLogs[lastIndex]);
}
}
else {
lastIndex = currentLogs.length - 1;
restOfLine = lines.shift();
if (restOfLine) {
currentLogs[lastIndex] = replaceClusterIPsInHtml(currentLogs[lastIndex] + restOfLine);
}
}
}
for (var i = 0; i < lines.length; i++) {
lines[i] = replaceClusterIPsInHtml(lines[i]);
}
if (earlierLog) {
$scope.log.logs = lines.concat(currentLogs);
}
else {
$scope.log.logs = currentLogs.concat(lines);
}
}
var moveForward = true;
if (angular.isDefined(returnedStart)) {
if (returnedStart > $scope.log.start && $scope.log.start === 0) {
// we've jumped to the end of the file to read the tail of it
$scope.log.start = returnedStart;
$scope.log.firstIdx = returnedStart;
}
else if ($scope.log.firstIdx === null) {
// lets remember where the first request started
$scope.log.firstIdx = returnedStart;
}
else if (returnedStart < $scope.log.firstIdx) {
// we've got an earlier bit of the log
// after starting at the tail
// so lets move firstIdx backwards and leave start as it is (at the end of the file)
$scope.log.firstIdx = returnedStart;
moveForward = false;
}
}
if (moveForward && returnedLength && !earlierLog) {
$scope.log.start += returnedLength;
if (logLength && $scope.log.start > logLength) {
$scope.log.start = logLength;
}
}
updateJenkinsLink();
}
$scope.log.fetched = true;
// Core.$apply($scope);
next();
}).
error(function (data, status, headers, config) {
Developer.log.warn("Failed to load " + url + " " + data + " " + status);
next();
});
}
}
else {
$scope.log.fetched = true;
Core.$apply($scope);
next();
}
});
if (angular.isFunction($scope.fetch)) {
$scope.fetch();
}
function replaceClusterIpFunction() {
function createReplaceFunction(from, to) {
return function (text) { return replaceText(text, from, to); };
}
var replacements = [];
angular.forEach($scope.model.services, function (service) {
var $portalIP = service.$portalIP;
var $serviceUrl = service.$serviceUrl;
var $portsText = service.$portsText;
if ($portalIP && $serviceUrl) {
var idx = $serviceUrl.indexOf("://");
if (idx > 0) {
var replaceWith = $serviceUrl.substring(idx, $serviceUrl.length);
if (!replaceWith.endsWith("/")) {
replaceWith += "/";
}
if (replaceWith.length > 4) {
replacements.push(createReplaceFunction("://" + $portalIP + "/", replaceWith));
if ($portsText) {
var suffix = ":" + $portsText;
var serviceWithPort = replaceWith.substring(0, replaceWith.length - 1);
if (!serviceWithPort.endsWith(suffix)) {
serviceWithPort += suffix;
}
serviceWithPort += "/";
replacements.push(createReplaceFunction("://" + $portalIP + ":" + $portsText + "/", serviceWithPort));
}
}
}
}
});
function addReplaceFn(from, to) {
replacements.push(function (text) {
return replaceText(text, from, to);
});
}
addReplaceFn("[INFO]", "<span class='log-success'>[INFO]</span>");
addReplaceFn("[WARN]", "<span class='log-warn'>[WARN]</span>");
addReplaceFn("[WARNING]", "<span class='log-warn'>[WARNING]</span>");
addReplaceFn("[ERROR]", "<span class='log-error'>[ERROR]</span>");
addReplaceFn("FAILURE", "<span class='log-error'>FAILURE</span>");
addReplaceFn("SUCCESS", "<span class='log-success'>SUCCESS</span>");
// lets try convert the Proceed / Abort links
replacements.push(function (text) {
var prefix = "<a href='#' onclick=\"new Ajax.Request('";
var idx = 0;
while (idx >= 0) {
idx = text.indexOf(prefix, idx);
if (idx >= 0) {
var start = idx + prefix.length;
var endQuote = text.indexOf("'", start + 1);
if (endQuote <= 0) {
break;
}
var endDoubleQuote = text.indexOf('"', endQuote + 1);
if (endDoubleQuote <= 0) {
break;
}
var url = text.substring(start, endQuote);
// TODO using $compile is a tad complex, for now lets cheat with a little onclick ;)
//text = text.substring(0, idx) + "<a class='btn btn-default btn-lg' ng-click=\"approve('" + url + "')\"" + text.substring(endDoubleQuote + 1);
text = text.substring(0, idx) + "<a class='btn btn-default btn-lg' onclick=\"Developer.clickApprove(this, '" + url + "')\"" + text.substring(endDoubleQuote + 1);
}
}
return text;
});
return function (text) {
var answer = text;
angular.forEach(replacements, function (fn) {
answer = fn(answer);
});
return answer;
};
}
function replaceText(text, from, to) {
if (from && to && text) {
//log.info("Replacing '" + from + "' => '" + to + "'");
var idx = 0;
while (true) {
idx = text.indexOf(from, idx);
if (idx >= 0) {
text = text.substring(0, idx) + to + text.substring(idx + from.length);
idx += to.length;
}
else {
break;
}
}
}
return text;
}
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
var Developer;
(function (Developer) {
Developer.JenkinsMetricsController = Developer.controller("JenkinsMetricsController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "ServiceRegistry",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["id"];
$scope.jobId = $routeParams["job"];
$scope.schema = KubernetesSchema;
$scope.jenkins = null;
$scope.entityChangedCache = {};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, $scope.jobId);
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
$scope.options = {
chart: {
type: 'discreteBarChart',
autorefresh: false,
height: 450,
margin: {
top: 20,
right: 20,
bottom: 60,
left: 45
},
clipEdge: true,
staggerLabels: false,
transitionDuration: 500,
stacked: false,
interactive: true,
tooltip: {
enabled: true,
contentGenerator: function (args) {
var data = args.data || {};
return data.tooltip;
},
},
color: function (d, i) {
return d.color;
},
xAxis: {
axisLabel: 'Builds',
showMaxMin: false,
tickFormat: function (d) {
return "#" + d;
}
},
yAxis: {
axisLabel: 'Build Duration (seconds)',
tickFormat: function (d) {
return d3.format(',.1f')(d);
}
}
}
};
$scope.data = [];
updateData();
function barColourForBuildResult(result) {
if (result) {
if (result === "FAILURE" || result === "FAILED") {
return "red";
}
else if (result === "ABORTED" || result === "INTERUPTED") {
return "tan";
}
else if (result === "SUCCESS") {
return "green";
}
else if (result === "NOT_STARTED") {
return "lightgrey";
}
}
return "darkgrey";
}
function updateChartData() {
var useSingleSet = true;
var buildsSucceeded = [];
var buildsFailed = [];
var successBuildKey = "Succeeded builds";
var failedBuildKey = "Failed builds";
if (useSingleSet) {
successBuildKey = "Builds";
}
var count = 0;
var builds = _.sortBy($scope.metrics.builds || [], "number");
angular.forEach(builds, function (build) {
var x = build.number;
var y = build.duration / 1000;
var date = Developer.asDate(build.timeInMillis);
var result = build.result || "NOT_STARTED";
var color = barColourForBuildResult(result);
var iconClass = Developer.createBuildStatusIconClass(result);
var tooltip = '<h3><i class="' + iconClass + '"></i> ' + build.displayName + '</h3>' +
'<p>duration: <b>' + y + '</b> seconds</p>';
if (date) {
tooltip += '<p>started: <b>' + date + '</b></p>';
}
if (result) {
tooltip += '<p>result: <b>' + result + '</b></p>';
}
if (x) {
var data = buildsSucceeded;
var key = successBuildKey;
if (!successBuildKey && (!result || !result.startsWith("SUCC"))) {
data = buildsFailed;
key = failedBuildKey;
}
data.push({
tooltip: tooltip,
color: color,
x: x, y: y });
}
});
$scope.data = [];
if (buildsSucceeded.length) {
$scope.data.push({
key: successBuildKey,
values: buildsSucceeded
});
}
if (buildsFailed.length) {
$scope.data.push({
key: failedBuildKey,
values: buildsFailed
});
}
$scope.api.updateWithData($scope.data);
$timeout(function () {
$scope.api.update();
}, 50);
}
function updateData() {
var metricsPath = $scope.jobId ? UrlHelpers.join("job", $scope.jobId, "fabric8/metrics") : "fabric8/metrics";
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(Developer.jenkinsServiceNameAndPort, metricsPath);
Developer.log.info("");
if (url && (!$scope.jenkins || Kubernetes.keepPollingModel)) {
$http.get(url, Developer.jenkinsHttpConfig).
success(function (data, status, headers, config) {
if (data) {
if (Developer.hasObjectChanged(data, $scope.entityChangedCache)) {
Developer.log.info("entity has changed!");
$scope.metrics = data;
updateChartData();
}
}
$scope.model.fetched = true;
Core.$apply($scope);
}).
error(function (data, status, headers, config) {
Developer.log.warn("Failed to load " + url + " " + data + " " + status);
});
}
}
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
var Developer;
(function (Developer) {
Developer.NavBarController = Developer.controller("NavBarController", ["$scope", "$location", "$routeParams", "$timeout", "KubernetesApiURL",
function ($scope, $location, $routeParams, $timeout) {
$scope.isValid = function (item) {
if (item) {
var value = item.isValid;
if (angular.isFunction(value)) {
return value(item);
}
else {
return angular.isUndefined(value) || value;
}
}
return false;
};
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
var Developer;
(function (Developer) {
Developer.PipelineController = Developer.controller("PipelineController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "ServiceRegistry",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry) {
$scope.kubernetes = KubernetesState;
$scope.kubeModel = KubernetesModel;
$scope.id = $routeParams["id"];
$scope.jobId = $routeParams["job"];
$scope.buildId = $routeParams["build"];
$scope.schema = KubernetesSchema;
$scope.entityChangedCache = {};
$scope.model = {
stages: null
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, $scope.jobId);
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
updateData();
function updateData() {
if ($scope.jobId) {
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(Developer.jenkinsServiceNameAndPort, UrlHelpers.join("job", $scope.jobId, $scope.buildId, "fabric8/stages/"));
if (url && (!$scope.model.stages || Kubernetes.keepPollingModel)) {
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
Developer.enrichJenkinsStages(data, $scope.id, $scope.jobId);
if (Developer.hasObjectChanged(data, $scope.entityChangedCache)) {
Developer.log.info("entity has changed!");
$scope.build = data;
$scope.model.stages = data.stages;
}
}
$scope.model.fetched = true;
Core.$apply($scope);
}).
error(function (data, status, headers, config) {
Developer.log.warn("Failed to load " + url + " " + data + " " + status);
$scope.model.fetched = true;
});
}
}
else {
$scope.model.fetched = true;
Core.$apply($scope);
}
}
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
var Developer;
(function (Developer) {
Developer._module.directive("pipelineView", function () {
return {
templateUrl: Developer.templatePath + 'pipelineView.html'
};
});
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerPlugin.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
var Developer;
(function (Developer) {
Developer.PipelinesController = Developer._module.controller("Developer.PipelinesController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "ServiceRegistry", "$element", function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL, ServiceRegistry, $element) {
$scope.kubernetes = KubernetesState;
$scope.kubeModel = KubernetesModel;
$scope.id = $routeParams["id"];
$scope.jobId = $scope.jobId || $routeParams["job"];
$scope.schema = KubernetesSchema;
$scope.entityChangedCache = {};
$element.on('$destroy', function () {
$scope.$destroy();
});
$scope.model = {
job: null,
pendingOnly: $scope.pendingPipelinesOnly
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, $scope.jobId);
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
$scope.$watch('model.pendingOnly', function ($event) {
updateData();
});
$scope.selectBuild = function (build) {
var id = build.id;
if (id) {
if (id !== $scope.selectedBuildId) {
$scope.selectedBuildId = id;
$scope.$broadcast("jenkinsSelectedBuild", build);
}
}
};
var updateData = _.debounce(function () {
var entity = $scope.entity;
if ($scope.jobId) {
if ((!entity || entity.$jenkinsJob)) {
var queryPath = "fabric8/stages/";
if ($scope.model.pendingOnly) {
queryPath = "fabric8/pendingStages/";
}
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(Developer.jenkinsServiceNameAndPort, UrlHelpers.join("job", $scope.jobId, queryPath));
if (url && (!$scope.model.job || Kubernetes.keepPollingModel)) {
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
Developer.enrichJenkinsPipelineJob(data, $scope.id, $scope.jobId);
if (Developer.hasObjectChanged(data, $scope.entityChangedCache)) {
Developer.log.info("entity has changed!");
$scope.model.job = data;
var builds = data.builds;
if (builds && builds.length) {
$scope.selectBuild(builds[0]);
}
}
}
$scope.model.fetched = true;
Core.$apply($scope);
}).
error(function (data, status, headers, config) {
Developer.log.warn("Failed to load " + url + " " + data + " " + status);
$scope.model.fetched = true;
});
}
}
else {
if ($scope.model) {
Kubernetes.enrichBuilds($scope.kubeModel.builds);
var builds = [];
angular.forEach($scope.kubeModel.builds, function (build) {
var labels = Kubernetes.getLabels(build);
var app = labels["app"];
if (app === $scope.projectId) {
builds.push(build);
}
});
builds = _.sortBy(builds, "$creationDate").reverse();
var allBuilds = builds;
if (allBuilds.length > 1) {
builds = _.filter(allBuilds, function (b) { return !b.$creationDate; });
if (!builds.length) {
builds = [allBuilds[0]];
}
}
var pipelines = [];
angular.forEach(builds, function (build) {
var buildStatus = build.status || {};
var result = buildStatus.phase || "";
var resultUpperCase = result.toUpperCase();
var description = "";
var $viewLink = build.$viewLink;
var $logLink = build.$logsLink;
var $timestamp = build.$creationDate;
var duration = buildStatus.duration;
if (duration) {
// 17s = 17,000,000,000 on openshift
duration = duration / 1000000;
}
var displayName = Kubernetes.getName(build);
var $iconClass = Developer.createBuildStatusIconClass(resultUpperCase);
var $backgroundClass = Developer.createBuildStatusBackgroundClass(resultUpperCase);
var stage = {
stageName: "OpenShift Build",
$viewLink: $viewLink,
$logLink: $logLink,
$startTime: $timestamp,
duration: duration,
status: result,
$iconClass: $iconClass,
$backgroundClass: $backgroundClass
};
var pipeline = {
description: description,
displayName: displayName,
$viewLink: $viewLink,
$logLink: $logLink,
$timestamp: $timestamp,
duration: duration,
stages: [stage]
};
pipelines.push(pipeline);
});
// lets filter the OpenShift builds and make a pipeline from that
$scope.model.job = {
$jobId: $scope.jobId,
$project: $scope.projectId,
builds: pipelines
};
}
$scope.model.fetched = true;
Core.$apply($scope);
}
}
else {
$scope.model.fetched = true;
Core.$apply($scope);
}
}, 50);
updateData();
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
var Developer;
(function (Developer) {
Developer.ProjectController = Developer.controller("ProjectController", ["$scope", "$element", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
function ($scope, $element, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["id"];
$scope.schema = KubernetesSchema;
$scope.config = KubernetesSchema.definitions.os_build_BuildConfig;
$scope.entityChangedCache = {};
$scope.envVersionsCache = {};
$scope.envNSCaches = {};
$scope.envVersions = {};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = []; //Developer.createProjectBreadcrumbs($scope.id);
updateTabs();
// this is used for the pendingPipelines view
$scope.jobId = $scope.id;
$scope.pendingPipelinesOnly = true;
$scope.$on('jenkinsSelectedBuild', function (event, build) {
$scope.selectedBuild = build;
});
// TODO this should be unnecessary but seems sometiems this watch doesn't always trigger unless you hit reload on this page
if ($scope.model.buildconfigs) {
onBuildConfigs($scope.model.buildconfigs);
}
Kubernetes.watch($scope, $element, "buildconfigs", $scope.namespace, onBuildConfigs);
function onBuildConfigs(buildConfigs) {
angular.forEach(buildConfigs, function (data) {
var name = Kubernetes.getName(data);
if (name === $scope.id) {
var sortedBuilds = null;
Kubernetes.enrichBuildConfig(data, sortedBuilds);
if (Developer.hasObjectChanged(data, $scope.entityChangedCache)) {
Developer.log.info("entity has changed!");
$scope.entity = data;
$scope.entity.$build = (data.$fabric8CodeViews || {})['fabric8.link.browseGogs.view'];
$scope.model.setProject($scope.entity);
}
updateEnvironmentWatch();
updateTabs();
}
});
$scope.model.fetched = true;
Core.$apply($scope);
}
/**
* We have updated the entity so lets make sure we are watching all the environments to find
* the project versions for each namespace
*/
function updateEnvironmentWatch() {
var project = $scope.entity;
if (project) {
var jenkinsJob = project.$jenkinsJob;
if (jenkinsJob) {
var buildsTab = _.find($scope.subTabConfig, { id: "builds" });
if (buildsTab) {
buildsTab["href"] = UrlHelpers.join("/workspaces", Kubernetes.currentKubernetesNamespace(), "projects", $scope.id, "jenkinsJob", jenkinsJob);
}
}
angular.forEach(project.environments, function (env) {
var ns = env.namespace;
var caches = $scope.envNSCaches[ns];
if (!caches) {
caches = {};
$scope.envNSCaches[ns] = caches;
Developer.loadProjectVersions($scope, $element, project, env, ns, $scope.envVersions, caches);
}
});
}
}
function updateTabs() {
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, null, $scope);
}
}]);
})(Developer || (Developer = {}));
/// <reference path="developerPlugin.ts"/>
var Developer;
(function (Developer) {
Developer._module.controller('Developer.ProjectSelector', ['$scope', '$routeParams', 'KubernetesModel', function ($scope, $routeParams, KubernetesModel) {
var projectId = $routeParams['projectId'] || $routeParams['project'] || $routeParams['id'];
if (projectId) {
$scope.projectId = projectId;
$scope.model = KubernetesModel;
$scope.$watch('model.buildconfigs', function (buildconfigs) {
$scope.projects = buildconfigs;
});
}
else {
Developer.log.info("no project ID in routeParams: ", $routeParams);
}
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
var Developer;
(function (Developer) {
Developer.ProjectsController = Developer.controller("ProjectsController", ["$scope", "KubernetesModel", "KubernetesState", "$dialog", "$window", "$templateCache", "$routeParams", "$location", "localStorage", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, $dialog, $window, $templateCache, $routeParams, $location, localStorage, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.tableConfig = {
data: 'model.buildconfigs',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{
field: '$name',
displayName: 'Name',
cellTemplate: $templateCache.get("idTemplate.html")
},
/*
{
field: 'spec.source.type',
displayName: 'Source'
},
*/
{
field: 'spec.source.git.uri',
displayName: 'Repository'
},
/*
{
field: 'spec.strategy.type',
displayName: 'Strategy'
},
{
field: 'spec.strategy.stiStrategy.image',
displayName: 'Source Image'
},
{
field: 'spec.output.imageTag',
displayName: 'Output Image'
},
*/
{
field: 'metadata.description',
displayName: 'Description'
},
{
field: '$creationDate',
displayName: 'Created',
cellTemplate: $templateCache.get("creationTimeTemplate.html")
},
{
field: '$labelsText',
displayName: 'Labels',
cellTemplate: $templateCache.get("labelTemplate.html")
}
]
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs();
$scope.subTabConfig = Developer.createWorkspaceSubNavBars();
// TODO
//$scope.isLoggedIntoGogs = Forge.isLoggedIntoGogs;
$scope.deletePrompt = function (selected) {
UI.multiItemConfirmActionDialog({
collection: selected,
index: '$name',
onClose: function (result) {
if (result) {
function deleteSelected(selected, next) {
if (next) {
deleteEntity(next, function () {
deleteSelected(selected, selected.shift());
});
}
else {
}
}
deleteSelected(selected, selected.shift());
}
},
title: 'Delete Apps',
action: 'The following Apps will be deleted:',
okText: 'Delete',
okClass: 'btn-danger',
custom: "This operation is permanent once completed!",
customClass: "alert alert-warning"
}).open();
};
function deleteEntity(selection, nextCallback) {
var name = (selection || {}).$name;
var jenkinsJob = selection.$jenkinsJob;
var publicJenkinsUrl = Developer.jenkinsLink();
//var jenkinsUrl = Core.pathGet(selection, ["$fabric8Views", "fabric8.link.jenkins.job", "url"]);
if (name) {
console.log("About to delete build config: " + name);
var url = Kubernetes.buildConfigRestUrl(name);
$http.delete(url).
success(function (data, status, headers, config) {
nextCallback();
}).
error(function (data, status, headers, config) {
Developer.log.warn("Failed to delete build config on " + url + " " + data + " " + status);
nextCallback();
});
}
else {
console.log("warning: no name for selection: " + angular.toJson(selection));
}
if (jenkinsJob && publicJenkinsUrl) {
var url = Kubernetes.kubernetesProxyUrlForServiceCurrentNamespace(Developer.jenkinsServiceNameAndPort, UrlHelpers.join("job", jenkinsJob, "doDelete"));
var body = "";
var config = {
headers: {
'Content-Type': "text/plain"
}
};
Developer.log.info("posting to jenkinsUrl: " + url);
$http.post(url, body, config).
success(function (data, status, headers, config) {
Developer.log.info("Managed to delete " + url);
}).
error(function (data, status, headers, config) {
Developer.log.warn("Failed to delete jenkins job at " + url + " " + data + " " + status);
});
}
}
/*
$scope.$keepPolling = () => Kubernetes.keepPollingModel;
$scope.fetch = PollHelpers.setupPolling($scope, (next:() => void) => {
var url = Kubernetes.buildConfigsRestURL();
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
//console.log("got data " + angular.toJson(data, true));
var sortedBuilds = null;
$scope.buildConfigs = Kubernetes.enrichBuildConfigs(data.items, sortedBuilds);
$scope.model.fetched = true;
Core.$apply($scope);
next();
}
}).
error(function (data, status, headers, config) {
log.warn("Failed to load " + url + " " + data + " " + status);
next();
});
});
$scope.fetch();
*/
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="developerNavigation.ts"/>
var Developer;
(function (Developer) {
Developer.WorkspaceController = Developer.controller("WorkspaceController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["namespace"];
$scope.schema = KubernetesSchema;
$scope.config = KubernetesSchema.definitions.kubernetes_Namespace;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createWorkspaceBreadcrumbs();
$scope.subTabConfig = Developer.createWorkspaceSubNavBars();
$scope.$keepPolling = function () { return Kubernetes.keepPollingModel; };
$scope.fetch = PollHelpers.setupPolling($scope, function (next) {
$scope.item = null;
if ($scope.id) {
var url = UrlHelpers.join(Kubernetes.resourcesUriForKind("Projects"), $scope.id);
Developer.log.info("Loading url: " + url);
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
$scope.entity = Developer.enrichWorkspace(data);
}
$scope.model.fetched = true;
Core.$apply($scope);
next();
}).
error(function (data, status, headers, config) {
Developer.log.warn("Failed to load " + url + " " + data + " " + status);
next();
});
}
else {
$scope.model.fetched = true;
Core.$apply($scope);
next();
}
});
$scope.fetch();
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesModel.ts"/>
/// <reference path="../../configs/ts/configsDataService.ts"/>
/// <reference path="developerEnrichers.ts"/>
/// <reference path="developerHelpers.ts"/>
/// <reference path="dataManagerHelper.ts"/>
/// <reference path="dataManagerModel.ts"/>
/// <reference path="../../configs/ts/configsHelper.ts"/>
/// <reference path="../../configs/ts/customAlert.ts"/>
var Developer;
(function (Developer) {
Developer.WorkspacesController = Developer.controller("WorkspacesController", ["$scope", "KubernetesModel", "DataModel", "ConfigsModel", "KubernetesState", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "$element", "ngDialog",
function ($scope, KubernetesModel, DataModel, ConfigsModel, KubernetesState, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL, $element, ngDialog) {
$scope.model = DataModel;
$scope.replicasModel = KubernetesModel;
init($scope, $location, $routeParams);
$scope.options = DataModel.paramOptions;
$scope.pageSizeChoses = DataModel.paramOptions.pagerSizeOption;
var result = getDataType($location);
$scope.options.dataType = result["dataType"];
$scope.options.volumeType = result["volumeType"];
$scope.treeOptions = {
nodeChildren: "childNodes",
dirSelectable: true,
injectClasses: {
ul: "a1",
li: "a2",
liSelected: "a7",
iExpanded: "a3",
iCollapsed: "a4",
iLeaf: "a5",
label: "a6",
labelSelected: "a8"
}
};
//配置数据表格需要显示的内容及显示格式
$scope.tableConfig = {
data: 'model.data',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{
field: "_key",
displayName: '编码'
},
{
field: "name",
displayName: '市-区/县',
customSortField: function (field) {
return field.regionalismCode;
}
},
{
field: "systemName",
displayName: '系统名称',
customSortField: function (field) {
return field.systemCode;
}
},
{
field: "dataBaseType",
displayName: '数据库类型',
},
{
field: "labels",
displayName: '数据标签',
cellTemplate: $templateCache.get("dataLabelsTemplate.html")
},
{
field: "year",
displayName: '年度',
},
{
field: "collectingTime",
displayName: '采集时间'
},
{
field: "extractStatus",
displayName: '汇总状态',
cellTemplate: $templateCache.get("dataExtractTemplate.html")
}
],
sortInfo: {
sortBy: "_key",
ascending: true
}
};
$scope.$on("dataLabelFilterUpdate", function ($event, text, key) {
$scope.keyQuery += " " + text;
});
$scope.selectBatchItem = function (item) {
$scope.navbarItems.forEach(function (nav) {
nav.class = "";
});
item.class = "active";
$scope.model.updateParamOption("currentPageNum", 1);
$scope.model.updateParamOption("keyQuery", $scope.keyQuery);
$scope.model.updateParamOption("dataBatch", item.alias);
};
$scope.isEmptyOrFirst = function () {
var idx = $scope.model.getParamOption("currentPageNum");
var length = $scope.options.getPageSizeNum();
return length <= 0 || idx <= 1;
};
$scope.isEmptyOrLast = function () {
var idx = $scope.model.getParamOption("currentPageNum");
var length = $scope.options.getPageSizeNum();
return length < 1 || idx >= length;
};
$scope.first = function () {
var idx = $scope.model.getParamOption("currentPageNum");
if (idx > 1) {
Kubernetes.eliminateChechBoxClick();
$scope.model.updateParamOption("currentPageNum", 1);
}
};
$scope.last = function () {
var idx = $scope.model.getParamOption("currentPageNum");
var length = $scope.options.getPageSizeNum();
if (idx < length) {
Kubernetes.eliminateChechBoxClick();
$scope.model.updateParamOption("currentPageNum", length);
}
};
$scope.previous = function () {
var idx = $scope.model.getParamOption("currentPageNum");
var length = $scope.options.getPageSizeNum();
if (idx > 1) {
Kubernetes.eliminateChechBoxClick();
$scope.model.updateParamOption("currentPageNum", idx - 1);
}
};
$scope.next = function () {
var length = $scope.options.getPageSizeNum();
var idx = $scope.model.getParamOption("currentPageNum");
if (idx < length) {
Kubernetes.eliminateChechBoxClick();
$scope.model.updateParamOption("currentPageNum", idx + 1);
}
};
$scope.$watch('options', function (newValue, oldValue) {
if (newValue) {
if (newValue.currentTableSize !== oldValue.currentTableSize)
$scope.options.priorTableSize = oldValue.currentTableSize;
else
$scope.options.priorTableSize = newValue.currentTableSize;
DataModel.updateModel();
}
}, true);
$scope.search = function () {
//$scope.model.initParamOptions();
$scope.model.paramOptions.currentPageNum = 1;
$scope.model.updateParamOption("keyQuery", $scope.keyQuery);
};
$scope.deletePrompt = function (selected) {
if (angular.isString(selected)) {
selected = [{
id: selected
}];
}
/*
判断数据是否已挂载使用和正在迁移。
*/
var message = Kubernetes.checkForMigration($scope.replicasModel.replicationControllers, $scope.model.transferTasks, $scope.tableConfig.selectedItems);
if (message != "") {
Configs.customAlert("提示", "操作失败:" + message + ",不能删除!", '', null, 0, "error");
return;
}
UI.multiItemConfirmActionDialog({
collection: selected,
index: 'alias',
onClose: function (result) {
var idColl = [];
if (result) {
angular.forEach(selected, function (select) {
idColl.push(select.id);
});
$http({
method: "POST",
url: "/java/console/api/delete/data",
params: { "data": idColl }
}).success(function (data, status, headers, config) {
//成功之后做一些事情
DataModel.updateModel();
}).error(function (data, status, headers, config) {
});
}
},
title: '是否需要删除采集数据?',
action: '以下采集数据文件将会被删除:',
okText: '删除',
okClass: 'btn-danger sj_btn_cir',
custom: "该删除操作将会彻底删除数据文件,是否删除,请确认!",
customClass: "alert alert-warning sj_alert-warning",
cancelText: "取消",
cancelClass: 'sj_btn_grey'
}).open();
};
$scope.migrationClick = {
items: null,
selectedItem: { "name": "当前没有可以迁移的集群" },
dialog: new UI.Dialog(),
onOk: function () {
var migrationClick = $scope.migrationClick;
/*
向后台发生数据迁移请求,$http:发生http异步请求第二个参数请求url;第三个参数:请求操作类型;第四个参数:请求携带的数据;第五个参数:
一个回调函数,请求响应后的回调函数。
*/
if (Kubernetes.alreadyExitInFolder($scope.tableConfig.selectedItems, $scope.selectNode)) {
migrationClick.close();
Configs.customAlert("提示", "操作失败:" + "数据已在当前目录!", '', null, 0, "error");
return;
}
;
Configs.oracleInfoOperate($http, "/java/console/api/volume", Configs.OperateType.MOVE, {
"name": migrationClick.selectedItem.name,
"selectItems": $scope.tableConfig.selectedItems,
"selectNode": $scope.selectNode
}, function (result, status) {
if (status === 200) {
}
else
throw "资源请求失败";
});
/*
页面跳转
*/
$timeout(function () {
$location.path("/workspaces/Overview/task");
}, 250);
migrationClick.close();
},
open: function (selected) {
var migrationClick = $scope.migrationClick;
/*
判断数据是否已挂载使用和正在迁移。
*/
var message = Kubernetes.checkForMigration($scope.replicasModel.replicationControllers, $scope.model.transferTasks, $scope.tableConfig.selectedItems);
if (message == "") {
if ($scope.volumes && $scope.volumes instanceof Array && $scope.volumes.length > 0)
migrationClick.selectedItem = $scope.volumes[0];
migrationClick.dialog.open();
}
else {
Configs.customAlert("提示", "操作失败:" + message + ", 不能迁移!", '', null, 0, "error");
}
},
close: function () {
$scope.migrationClick.selectedItem = { "name": "当前没有可以迁移的集群" };
$scope.migrationClick.dialog.close();
}
};
$scope.createOracleService = function (items) {
var exitedItems = Kubernetes.checkForCreateOracle($scope.model.transferTasks, items);
for (var i = 0; i < items.length; ++i) {
// code...
if (items[i].dataBaseType != 'ORACLE') {
Configs.customAlert("提示", "操作失败: 非ORACLE数据不需要挂载启动", '', null, 0, "error");
return;
}
}
if (exitedItems.length == 0) {
angular.forEach(items, function (item) {
console.log(item);
var isExited = Kubernetes.checkForExit($scope.replicasModel.replicationControllers, item);
if (!isExited) {
Kubernetes.createRC({
name: item._key,
labels: {
system: item.systemCode.toString(),
version: item.dataVersion.toString(),
region: item.regionalismCode.toString()
},
annotations: {
cityName: item.cityName,
districtName: item.districtName,
systemName: item.systemName,
id: item.id + "",
year: item.year,
checkoutFlag: item.checkoutFlag
},
path: item.dataPath + "app/",
isTarget: "false",
isExtract: item.extractStatus
}, function (rc) {
Kubernetes.connectOracle($http, $timeout, "/java/console/api/connectOracle", "create", rc, 0);
});
}
});
$timeout(function () {
$location.path('/kubernetes/namespace/default/replicationControllers');
}, 200);
}
else {
var name = "";
angular.forEach(exitedItems, function (item) {
name += item.name + "-" + item.systemName + ",";
});
Configs.customAlert("提示", "操作失败: 正在迁移的数据不能被启动!", '', null, 0, "error");
}
};
function init($scope, $location, $routeParams) {
//$scope.model.updateModel();
//console.log($scope.options.currentPageNum);
console.log("==============================");
$scope.keyQuery = "";
$scope.model.initParamOptions();
$scope.model.updateParamOption("keyQuery", $scope.keyQuery);
if (ConfigsModel.cluster != null)
$scope.volumes = ConfigsModel.cluster;
//创建二级菜单
$scope.subTabConfig = Developer.createCurrentSubNavBar($scope, $location, $routeParams);
$scope.navbarItems = [{
herf: "",
label: "全部",
title: "查看全部数据",
class: "active",
alias: null
},
{
herf: "",
label: "批次A",
title: "查看批次A的数据",
class: "",
alias: "A"
},
{
herf: "",
label: "批次B",
title: "查看批次B的数据",
class: "",
alias: "B"
}];
}
function getDataType($location) {
var path = $location.path();
var dataType;
var volumeType;
var subPath = path.split("/");
switch (subPath[subPath.length - 1]) {
case "financial":
dataType = "财政";
break;
case "social-security":
dataType = "社保";
break;
default:
dataType = null;
break;
}
;
switch (subPath[3]) {
case "hot":
volumeType = 0;
break;
default:
volumeType = 1;
}
return {
"dataType": dataType,
"volumeType": volumeType
};
}
}]);
})(Developer || (Developer = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.Apps = Kubernetes.controller("Apps", ["$scope", "KubernetesModel", "KubernetesServices", "KubernetesReplicationControllers", "KubernetesPods", "KubernetesState", "KubernetesApiURL", "$templateCache", "$location", "$routeParams", "$http", "$dialog", "$timeout",
function ($scope, KubernetesModel, KubernetesServices, KubernetesReplicationControllers, KubernetesPods, KubernetesState, KubernetesApiURL, $templateCache, $location, $routeParams, $http, $dialog, $timeout) {
$scope.model = KubernetesModel;
$scope.apps = [];
$scope.allApps = [];
$scope.kubernetes = KubernetesState;
$scope.fetched = false;
$scope.json = '';
ControllerHelpers.bindModelToSearchParam($scope, $location, 'id', '_id', undefined);
ControllerHelpers.bindModelToSearchParam($scope, $location, 'appSelectorShow', 'openApp', undefined);
ControllerHelpers.bindModelToSearchParam($scope, $location, 'mode', 'mode', 'detail');
var branch = $scope.branch || "master";
var namespace = null;
function appMatches(app) {
var filterText = $scope.appSelector.filterText;
if (filterText) {
return Core.matchFilterIgnoreCase(app.groupId, filterText) ||
Core.matchFilterIgnoreCase(app.artifactId, filterText) ||
Core.matchFilterIgnoreCase(app.name, filterText) ||
Core.matchFilterIgnoreCase(app.description, filterText);
}
else {
return true;
}
}
function appRunning(app) {
return $scope.model.apps.any(function (running) { return running.appPath === app.appPath; });
}
$scope.tableConfig = {
data: 'model.apps',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{ field: '$name', displayName: 'App', cellTemplate: $templateCache.get(UrlHelpers.join(Kubernetes.templatePath, "appIconTemlate.html")) },
{ field: '$servicesText', displayName: 'Services', cellTemplate: $templateCache.get(UrlHelpers.join(Kubernetes.templatePath, "appServicesTemplate.html")) },
{ field: '$replicationControllersText', displayName: 'Controllers', cellTemplate: $templateCache.get(UrlHelpers.join(Kubernetes.templatePath, "appReplicationControllerTemplate.html")) },
{ field: '$podCount', displayName: 'Pods', cellTemplate: $templateCache.get(UrlHelpers.join(Kubernetes.templatePath, "appPodCountsAndLinkTemplate.html")) },
{ field: '$creationDate', displayName: 'Deployed', cellTemplate: $templateCache.get(UrlHelpers.join(Kubernetes.templatePath, "appDeployedTemplate.html")) }
]
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.expandedPods = [];
$scope.$on('do-resize', function ($event, controller) {
$scope.resizeDialog.open(controller);
});
$scope.podExpanded = function (pod) {
var id = Kubernetes.getName(pod);
return id && ($scope.expandedPods || []).indexOf(id) >= 0;
};
$scope.expandPod = function (pod) {
var id = Kubernetes.getName(pod);
if (id) {
$scope.expandedPods.push(id);
}
};
$scope.collapsePod = function (pod) {
var id = Kubernetes.getName(pod);
if (id) {
_.remove($scope.expandedPods, function (v) { return id === v; });
}
};
$scope.$on('$routeUpdate', function ($event) {
Kubernetes.setJson($scope, $location.search()['_id'], $scope.model.apps);
});
function deleteApp(app, onCompleteFn) {
function deleteServices(services, service, onCompletedFn) {
if (!service || !services) {
return onCompletedFn();
}
var id = Kubernetes.getName(service);
if (!id) {
Kubernetes.log.warn("No ID for service " + angular.toJson(service));
}
else {
KubernetesServices.delete({
id: id
}, undefined, function () {
Kubernetes.log.debug("Deleted service: ", id);
deleteServices(services, services.shift(), onCompletedFn);
}, function (error) {
Kubernetes.log.debug("Error deleting service: ", error);
deleteServices(services, services.shift(), onCompletedFn);
});
}
}
function deleteReplicationControllers(replicationControllers, replicationController, onCompletedFn) {
if (!replicationController || !replicationControllers) {
return onCompletedFn();
}
var id = Kubernetes.getName(replicationController);
if (!id) {
Kubernetes.log.warn("No ID for replicationController " + angular.toJson(replicationController));
}
else {
KubernetesReplicationControllers.delete({
id: id
}, undefined, function () {
Kubernetes.log.debug("Deleted replicationController: ", id);
deleteReplicationControllers(replicationControllers, replicationControllers.shift(), onCompletedFn);
}, function (error) {
Kubernetes.log.debug("Error deleting replicationController: ", error);
deleteReplicationControllers(replicationControllers, replicationControllers.shift(), onCompletedFn);
});
}
}
function deletePods(pods, pod, onCompletedFn) {
if (!pod || !pods) {
return onCompletedFn();
}
var id = Kubernetes.getName(pod);
if (!id) {
Kubernetes.log.warn("No ID for pod " + angular.toJson(pod));
}
else {
KubernetesPods.delete({
id: id
}, undefined, function () {
Kubernetes.log.debug("Deleted pod: ", id);
deletePods(pods, pods.shift(), onCompletedFn);
}, function (error) {
Kubernetes.log.debug("Error deleting pod: ", error);
deletePods(pods, pods.shift(), onCompletedFn);
});
}
}
var services = [].concat(app.services);
deleteServices(services, services.shift(), function () {
var replicationControllers = [].concat(app.replicationControllers);
deleteReplicationControllers(replicationControllers, replicationControllers.shift(), function () {
var pods = [].concat(app.pods);
deletePods(pods, pods.shift(), onCompleteFn);
});
});
}
$scope.deleteSingleApp = function (app) {
$scope.deletePrompt([app]);
};
$scope.deletePrompt = function (selected) {
if (angular.isString(selected)) {
selected = [{
id: selected
}];
}
UI.multiItemConfirmActionDialog({
collection: selected,
index: '$name',
onClose: function (result) {
if (result) {
function deleteSelected(selected, next) {
if (next) {
var id = next.name;
Kubernetes.log.debug("deleting: ", id);
deleteApp(next, function () {
Kubernetes.log.debug("deleted: ", id);
deleteSelected(selected, selected.shift());
});
}
}
deleteSelected(selected, selected.shift());
}
},
title: 'Delete Apps?',
action: 'The following Apps will be deleted:',
okText: 'Delete',
okClass: 'btn-danger',
custom: "This operation is permanent once completed!",
customClass: "alert alert-warning"
}).open();
};
$scope.appSelector = {
filterText: "",
folders: [],
selectedApps: [],
isOpen: function (folder) {
if ($scope.appSelector.filterText !== '' || folder.expanded) {
return "opened";
}
return "closed";
},
getSelectedClass: function (app) {
if (app.abstract) {
return "abstract";
}
if (app.selected) {
return "selected";
}
return "";
},
showApp: function (app) {
return appMatches(app) && !appRunning(app);
},
showFolder: function (folder) {
return !$scope.appSelector.filterText || folder.apps.some(function (app) { return appMatches(app) && !appRunning(app); });
},
clearSelected: function () {
angular.forEach($scope.model.appFolders, function (folder) {
angular.forEach(folder.apps, function (app) {
app.selected = false;
});
});
$scope.appSelector.selectedApps = [];
Core.$apply($scope);
},
updateSelected: function () {
// lets update the selected apps
var selectedApps = [];
angular.forEach($scope.model.appFolders, function (folder) {
var apps = folder.apps.filter(function (app) { return app.selected; });
if (apps) {
selectedApps = selectedApps.concat(apps);
}
});
$scope.appSelector.selectedApps = _.sortBy(selectedApps, "name");
},
select: function (app, flag) {
app.selected = flag;
$scope.appSelector.updateSelected();
},
hasSelection: function () {
return $scope.model.appFolders.any(function (folder) { return folder.apps.any(function (app) { return app.selected; }); });
},
runSelectedApps: function () {
// lets run all the selected apps
angular.forEach($scope.appSelector.selectedApps, function (app) {
var name = app.name;
var metadataPath = app.metadataPath;
if (metadataPath) {
// lets load the json/yaml
//var url = gitPathToUrl(Wiki.gitRelativeURL(branch, metadataPath));
var url = Kubernetes.gitPathToUrl(metadataPath, branch);
if (url) {
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
// lets convert the json object structure into a string
var json = angular.toJson(data);
var fn = function () { };
Kubernetes.runApp($location, $scope, $http, KubernetesApiURL, json, name, fn, namespace);
}
}).
error(function (data, status, headers, config) {
$scope.summaryHtml = null;
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
});
}
}
});
// lets go back to the apps view
$scope.appSelector.clearSelected();
$scope.appSelectorShow = false;
}
};
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes._module.directive("hawtioBreadcrumbs", ['HawtioBreadcrumbs', function (HawtioBreadcrumbs) {
return {
/*
templateUrl: Kubernetes.templatePath + 'breadcrumbs.html'
*/
link: function (scope, element, attrs) {
HawtioBreadcrumbs.apply(scope.$eval('breadcrumbConfig'));
}
};
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.BuildController = Kubernetes.controller("BuildController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["id"];
$scope.schema = KubernetesSchema;
$scope.config = KubernetesSchema.definitions.os_build_Build;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.id, null, $scope);
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
updateData();
function updateData() {
$scope.item = null;
if ($scope.id) {
var url = Kubernetes.buildRestUrl($scope.id);
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
$scope.entity = Kubernetes.enrichBuild(data);
}
$scope.fetched = true;
Core.$apply($scope);
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
});
}
else {
$scope.fetched = true;
Core.$apply($scope);
}
}
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.BuildConfigController = Kubernetes.controller("BuildConfigController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["id"];
$scope.schema = KubernetesSchema;
$scope.config = KubernetesSchema.definitions.os_build_BuildConfig;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.id);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.id);
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
updateData();
function updateData() {
$scope.item = null;
if ($scope.id) {
var url = Kubernetes.buildConfigRestUrl($scope.id);
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
$scope.entity = data;
var sortedBuilds = null;
Kubernetes.enrichBuildConfig(data, sortedBuilds);
$scope.model.setProject($scope.entity);
}
$scope.fetched = true;
Core.$apply($scope);
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
});
}
else {
$scope.fetched = true;
Core.$apply($scope);
}
}
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.BuildConfigEditController = Kubernetes._module.controller("Kubernetes.BuildConfigEditController", ["$scope", "$element", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "K8SClientFactory", "SchemaRegistry", function ($scope, $element, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL, K8SClientFactory, SchemaRegistry) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["project"] || $routeParams["id"];
$scope.schema = KubernetesSchema;
var mode = $scope.$eval('mode') || 'edit';
Kubernetes.log.debug("Mode: ", mode);
var specConfig = SchemaRegistry.getSchema('io.fabric8.openshift.api.model.BuildConfigSpec');
var gitBuildSource = SchemaRegistry.getSchema('io.fabric8.openshift.api.model.GitBuildSource');
var buildSource = SchemaRegistry.getSchema('io.fabric8.openshift.api.model.BuildSource');
var buildOutput = SchemaRegistry.getSchema('io.fabric8.openshift.api.model.BuildOutput');
var resources = SchemaRegistry.getSchema('io.fabric8.kubernetes.api.model.ResourceRequirements');
var revision = SchemaRegistry.getSchema('io.fabric8.openshift.api.model.SourceRevision');
var strategy = SchemaRegistry.getSchema('io.fabric8.openshift.api.model.BuildStrategy');
var customStrategy = SchemaRegistry.getSchema('io.fabric8.openshift.api.model.CustomBuildStrategy');
var buildTriggerPolicy = SchemaRegistry.getSchema('io.fabric8.openshift.api.model.BuildTriggerPolicy');
var getSecrets = function () {
return $scope.secrets;
};
var secretSchemaType = "fabric8_SecretReference";
var secretSchemaRef = "#/definitions/" + secretSchemaType;
var secretSchemaJavaType = "io.fabric8.console.SecretReference";
var secretNameElement = {
"type": "string",
"enum": getSecrets,
required: true
};
var secretSchema = {
"type": "object",
properties: {
"name": secretNameElement
},
javaType: secretSchemaJavaType
};
SchemaRegistry.addSchema(secretSchemaType, secretSchema);
// lets switch to the new secrets types:
var sourceSecretProperty = Core.pathGet(buildSource, ["properties", "sourceSecret"]);
angular.forEach([
Core.pathGet(customStrategy, ["properties", "pullSecret"]),
sourceSecretProperty,
], function (schemaType) {
if (schemaType) {
schemaType["type"] = secretSchemaType;
schemaType["$ref"] = secretSchemaRef;
schemaType["javaType"] = secretSchemaJavaType;
}
});
// lets try make the buildSource's sourceSecret mandatory
//schemaSetRequired(customStrategy, 'pullSecret');
Kubernetes.schemaSetRequired(buildSource, 'sourceSecret');
if (sourceSecretProperty) {
Core.pathSet(sourceSecretProperty, ['properties', 'required'], true);
Core.pathSet(sourceSecretProperty, ['properties', 'input-attributes', 'required'], true);
}
$scope.customStrategy = customStrategy;
$scope.buildSource = buildSource;
$scope.secrets = [];
// $scope.config = KubernetesSchema.definitions.os_build_BuildConfig;
//$scope.specConfig = KubernetesSchema.definitions.os_build_BuildConfigSpec;
//
specConfig.style = HawtioForms.FormStyle.STANDARD;
specConfig.properties['triggers']['label-attributes'] = {
style: 'display: none;'
};
gitBuildSource.controls = ['uri', 'ref', '*'];
buildSource.properties['type'].type = 'hidden';
buildSource.properties['type']['default'] = 'Git';
buildSource.controls = ['git', 'contextDir', 'sourceSecret', '*'];
gitBuildSource['hideLegend'] = true;
buildSource['hideLegend'] = true;
buildOutput['hideLegend'] = true;
resources['hideLegend'] = true;
revision['hideLegend'] = true;
strategy['hideLegend'] = true;
strategy.controls = ['type', '*'];
strategy.properties['type'] = {
type: 'text',
enum: [{
'value': 'Custom',
'label': 'Custom'
}, {
'value': 'Docker',
'label': 'Docker'
}, {
'value': 'Source',
'label': 'Source'
}]
};
customStrategy['control-group-attributes'] = {
'ng-show': "entity.type == 'Custom'"
};
strategy.properties['dockerStrategy']['control-group-attributes'] = {
'ng-show': "entity.type == 'Docker'"
};
strategy.properties['sourceStrategy']['control-group-attributes'] = {
'ng-show': "entity.type == 'Source'"
};
buildTriggerPolicy.controls = ['type', '*'];
buildTriggerPolicy.properties['type'] = {
type: 'string',
enum: [{
'value': 'Github',
'label': 'Github'
}, {
'value': 'ImageChange',
'label': 'Image Change'
}, {
'value': 'Generic',
'label': 'Generic'
}]
};
buildTriggerPolicy.properties['generic']['control-group-attributes'] = {
'ng-show': "entity.type == 'Generic'"
};
buildTriggerPolicy.properties['github']['control-group-attributes'] = {
'ng-show': "entity.type == 'Github'"
};
buildTriggerPolicy.properties['imageChange']['control-group-attributes'] = {
'ng-show': "entity.type == 'ImageChange'"
};
// re-arranging the controls
//specConfig.controls = ['source', '*'];
// tabs
specConfig.tabs = {
"Source": ["source"],
"Revision": ["revision"],
"Output": ["output"],
"Resources": ["resources"],
"Strategy": ["strategy"],
"Triggers": ["triggers"],
"Service Account": ["serviceAccount"]
};
/*
* wizard, needs an 'onFinish' function in the scope
specConfig.wizard = <any>{
pages: {
Source: {
controls: ["source"]
},
Revision: {
controls: ["revision"]
},
Output: {
controls: ["output"]
},
Resources: {
controls: ["resources"]
},
Strategy: {
controls: ["strategy"]
},
Triggers: {
controls: ["triggers"]
},
"Service Account": {
controls: ["serviceAccount"]
}
}
};
*/
$scope.entity = {
"apiVersion": "v1",
"kind": "BuildConfig",
"metadata": {
"name": "",
"labels": {}
},
"spec": {
"source": {
"type": "Git"
},
"strategy": {
"type": "Custom",
"customStrategy": {
"from": {
"kind": "DockerImage",
"name": "fabric8/openshift-s2i-jenkins-trigger"
},
"env": [
{
"name": "BASE_URI",
"value": jenkinsUrl
},
{
"name": "JOB_NAME",
"value": jobName
}
]
}
}
}
};
$scope.$watch('entity.spec.source.git.uri', function (val) {
if (!val) {
return;
}
var lastBit = val.match(/[^\/]+$/)[0];
if (lastBit) {
var name = lastBit.replace(/\.git$/, '');
Kubernetes.log.debug("name: ", name);
if (!Core.isBlank(name)
&& Core.isBlank(Core.pathGet($scope.entity, ['metadata', 'name']))) {
Core.pathSet($scope.entity, ['metadata', 'name'], name);
}
}
});
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectSettingsBreadcrumbs($scope.projectId);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.projectId);
$scope.tabs = Developer.createProjectSettingsSubNavBars($scope.projectId);
Kubernetes.watch($scope, $element, "secrets", $scope.namespace, onSecrets);
$scope.buildConfigClient = K8SClientFactory.create("buildconfigs", $scope.namespace);
$element.on('$destroy', function () {
$scope.$destroy();
});
$scope.$on('$destroy', function () {
K8SClientFactory.destroy($scope.buildConfigClient);
});
/*
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
*/
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
$scope.save = function () {
Kubernetes.log.info("Saving!");
var entity = $scope.entity;
var spec = (entity || {}).spec || {};
// TODO update the jenkins job name!
// lets delete lots of cruft
var strategy = spec.strategy || {};
delete strategy["dockerStrategy"];
delete strategy["sourceStrategy"];
delete spec["revision"];
delete spec["output"];
delete spec["resources"];
var strategyPullSecretName = Core.pathGet(spec, ["strategy", "customStrategy", "pullSecret", "name"]);
var sourceSecretName = Core.pathGet(spec, ["source", "sourceSecret", "name"]);
Kubernetes.log.info("sourceSecretName: " + sourceSecretName);
Kubernetes.log.info("strategyPullSecretName: " + strategyPullSecretName);
if (!strategyPullSecretName && sourceSecretName) {
Core.pathSet(spec, ["strategy", "customStrategy", "pullSecret", "name"], sourceSecretName);
}
/*
// TODO hack until the put deals with updates
var metadata = entity.metadata;
if (metadata) {
delete metadata["resourceVersion"];
}
*/
Kubernetes.log.info(angular.toJson(entity, true));
$scope.buildConfigClient.put(entity, function (obj) {
Kubernetes.log.info("build config created!");
var link = Developer.projectSecretsLink($scope.namespace, Kubernetes.getName(entity));
if (link) {
Kubernetes.log.info("Navigating to: " + link);
$location.path(link);
}
else {
Kubernetes.log.warn("Could not find the edit pipeline link!");
}
});
};
updateData();
var jenkinsUrl = Developer.jenkinsLink();
var jobName = "";
function updateData() {
$scope.item = null;
if ($scope.id) {
var url = Kubernetes.buildConfigRestUrl($scope.id);
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
$scope.entity = data;
var buildConfig = angular.copy(data);
var sortedBuilds = null;
Kubernetes.enrichBuildConfig(buildConfig, sortedBuilds);
$scope.buildConfig = buildConfig;
}
$scope.spec = ($scope.entity || {}).spec || {};
$scope.fetched = true;
// lets update the tabs
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.projectId, null, $scope);
Core.$apply($scope);
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
});
}
else {
$scope.fetched = true;
$scope.spec = $scope.entity.spec;
Core.$apply($scope);
}
}
function onSecrets(secrets) {
var array = [];
angular.forEach(secrets, function (secret) {
var name = Kubernetes.getName(secret);
if (name) {
array.push({
label: name,
value: name,
"attributes": {
"title": name
},
$secret: secret
});
}
});
$scope.secrets = _.sortBy(array, "label");
var specSourceSecretNamePath = ['spec', 'source', 'sourceSecret', 'name'];
if ($scope.entity && !Core.pathGet($scope.entity, specSourceSecretNamePath)) {
var defaultSecretName = findDefaultImportSecretName(secrets);
Core.pathSet($scope.entity, specSourceSecretNamePath, defaultSecretName);
}
}
function findDefaultImportSecretName(secrets) {
var answer = null;
angular.forEach(secrets, function (secret) {
var name = Kubernetes.getName(secret);
if (!answer && name && name.startsWith("jenkins-login")) {
answer = name;
}
});
if (!answer) {
angular.forEach(secrets, function (secret) {
var name = Kubernetes.getName(secret);
if (!answer && name && name.startsWith("jenkins-token")) {
answer = name;
}
});
}
return answer;
}
switch (mode) {
case 'create':
delete specConfig.tabs;
_.forIn(buildSource.properties, function (property, name) {
if (name !== 'git') {
Kubernetes.log.info("Hiding property: ", name);
property.hidden = true;
}
});
_.forIn(gitBuildSource.properties, function (property, name) {
if (name !== 'uri') {
Kubernetes.log.info("Hiding property: ", name);
property.hidden = true;
}
else {
property.label = "Git URL";
property['input-attributes'] = {
'required': true
};
}
});
_.forIn(specConfig.properties, function (property, name) {
if (name !== 'source') {
Kubernetes.log.info("Hiding property: ", name);
property.hidden = true;
}
});
break;
case 'edit':
default:
}
$scope.specConfig = specConfig;
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.BuildConfigsController = Kubernetes.controller("BuildConfigsController", ["$scope", "KubernetesModel", "KubernetesState", "$dialog", "$window", "$templateCache", "$routeParams", "$location", "localStorage", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, $dialog, $window, $templateCache, $routeParams, $location, localStorage, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.tableConfig = {
data: 'model.buildconfigs',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{
field: 'metadata.name',
displayName: 'Name',
cellTemplate: $templateCache.get("buildConfigLinkTemplate.html")
},
/*
{
field: 'spec.source.type',
displayName: 'Source'
},
*/
{
field: 'spec.source.git.uri',
displayName: 'Repository'
},
/*
{
field: 'spec.strategy.type',
displayName: 'Strategy'
},
{
field: 'spec.strategy.stiStrategy.image',
displayName: 'Source Image'
},
{
field: 'spec.output.imageTag',
displayName: 'Output Image'
},
*/
{
field: '$fabric8CodeViews',
displayName: 'Code',
width: "***",
minWidth: 500,
cellTemplate: $templateCache.get("buildConfigCodeViewsTemplate.html")
},
{
field: '$fabric8BuildViews',
displayName: 'Builds',
width: "***",
minWidth: 500,
cellTemplate: $templateCache.get("buildConfigBuildViewsTemplate.html")
},
{
field: '$fabric8EnvironmentViews',
displayName: 'Environments',
width: "***",
minWidth: 500,
cellTemplate: $templateCache.get("buildConfigEnvironmentViewsTemplate.html")
},
{
field: '$fabric8TeamViews',
displayName: 'People',
width: "***",
minWidth: 500,
cellTemplate: $templateCache.get("buildConfigTeamViewsTemplate.html")
}
]
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
// TODO
// $scope.isLoggedIntoGogs = Forge.isLoggedIntoGogs;
$scope.deletePrompt = function (selected) {
UI.multiItemConfirmActionDialog({
collection: selected,
index: '$name',
onClose: function (result) {
if (result) {
function deleteSelected(selected, next) {
if (next) {
deleteEntity(next, function () {
deleteSelected(selected, selected.shift());
});
}
else {
updateData();
}
}
deleteSelected(selected, selected.shift());
}
},
title: 'Delete Build Configs?',
action: 'The following Build Configs will be deleted:',
okText: 'Delete',
okClass: 'btn-danger',
custom: "This operation is permanent once completed!",
customClass: "alert alert-warning"
}).open();
};
function deleteEntity(selection, nextCallback) {
var name = (selection || {}).$name;
if (name) {
console.log("About to delete build config: " + name);
var url = Kubernetes.buildConfigRestUrl(name);
$http.delete(url).
success(function (data, status, headers, config) {
nextCallback();
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to delete build config on " + url + " " + data + " " + status);
});
}
else {
console.log("warning: no name for selection: " + angular.toJson(selection));
}
}
function updateData() {
}
updateData();
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.BuildLogsController = Kubernetes.controller("BuildLogsController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["id"];
$scope.schema = KubernetesSchema;
$scope.config = KubernetesSchema.definitions.os_build_Build;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
$scope.logsText = "Loading logs...";
updateData();
function updateData() {
$scope.item = null;
if ($scope.id) {
var url = Kubernetes.buildRestUrl($scope.id);
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
$scope.entity = Kubernetes.enrichBuild(data);
}
$scope.fetched = true;
Core.$apply($scope);
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
});
url = Kubernetes.buildLogsRestUrl($scope.id);
$http.get(url).
success(function (data, status) {
$scope.logsText = data;
Core.$apply($scope);
}).
error(function (data, status) {
$scope.logsText = "Failed to load logs from: " + url + " " + data + " status: " + status;
Core.$apply($scope);
}).
catch(function (error) {
$scope.logsText = "Failed to load logs: " + angular.toJson(error, true);
Core.$apply($scope);
});
}
else {
$scope.fetched = true;
Core.$apply($scope);
}
}
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.BuildsController = Kubernetes.controller("BuildsController", ["$scope", "KubernetesModel", "KubernetesState", "$dialog", "$window", "$templateCache", "$routeParams", "$location", "localStorage", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, $dialog, $window, $templateCache, $routeParams, $location, localStorage, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.buildConfigId = $routeParams["id"];
$scope.$on('kubernetesModelUpdated', function () {
Core.$apply($scope);
});
$scope.tableConfig = {
data: 'model.builds',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{
field: 'metadata.name',
displayName: 'Name',
cellTemplate: $templateCache.get("buildLinkTemplate.html")
},
{
field: '$creationDate',
displayName: 'Time',
defaultSort: true,
cellTemplate: $templateCache.get("buildTimeTemplate.html")
},
{
field: 'status',
displayName: 'Status',
cellTemplate: $templateCache.get("buildStatusTemplate.html")
},
{
field: '$logsLink',
displayName: 'Logs',
cellTemplate: $templateCache.get("buildLogsTemplate.html")
},
{
field: '$podLink',
displayName: 'Build Pod',
cellTemplate: $templateCache.get("buildPodTemplate.html")
},
/*
{
field: 'parameters.source.type',
displayName: 'Source'
},
*/
{
field: 'spec.source.git.uri',
displayName: 'Repository',
cellTemplate: $templateCache.get("buildRepositoryTemplate.html")
},
{
field: 'spec.strategy.type',
displayName: 'Strategy'
},
{
field: 'spec.strategy.sourceStrategy.from.name',
displayName: 'Source Image'
},
{
field: 'spec.output.to.name',
displayName: 'Output Image'
}]
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.breadcrumbConfig = Developer.createProjectBreadcrumbs($scope.buildConfigId);
$scope.subTabConfig = Developer.createProjectSubNavBars($scope.buildConfigId, null, $scope);
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
function updateData() {
if ($scope.model) {
var builds = $scope.model.builds;
var buildConfigId = $scope.buildConfigId;
Kubernetes.enrichBuilds(builds);
$scope.fetched = true;
if (buildConfigId) {
$scope.buildConfig = $scope.model.getBuildConfig(buildConfigId);
}
}
}
updateData();
/*
$scope.$keepPolling = () => keepPollingModel;
$scope.fetch = PollHelpers.setupPolling($scope, (next:() => void) => {
var url = buildsRestURL();
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
//console.log("got data " + angular.toJson(data, true));
$scope.builds = enrichBuilds(data.items);
$scope.fetched = true;
if ($scope.model) {
$scope.buildConfig = $scope.model.getBuildConfig($scope.buildConfigId);
}
}
Core.$apply($scope);
next();
}).
error(function (data, status, headers, config) {
log.warn("Failed to load " + url + " " + data + " " + status);
Core.$apply($scope);
next();
});
});
$scope.fetch();
*/
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
// controller for connecting to a remote container via jolokia
Kubernetes.ConnectController = Kubernetes.controller("ConnectController", [
"$scope", "localStorage", "userDetails", "ConnectDialogService", "$browser",
function ($scope, localStorage, userDetails, ConnectDialogService, $browser) {
$scope.doConnect = function (entity) {
var connectUrl = new URI().path(UrlHelpers.join(HawtioCore.documentBase(), '/java/index.html'));
var returnTo = new URI().toString();
var title = entity.metadata.name || 'Untitled Container';
var token = userDetails.token || '';
connectUrl.hash(token).query({
jolokiaUrl: entity.$jolokiaUrl,
title: title,
returnTo: returnTo
});
Kubernetes.log.debug("Connect URI: ", connectUrl.toString());
window.open(connectUrl.toString());
};
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.DeploymentConfigController = Kubernetes.controller("DeploymentConfigController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["id"];
$scope.schema = KubernetesSchema;
$scope.config = KubernetesSchema.definitions.os_deploy_DeploymentConfig;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
updateData();
function updateData() {
$scope.item = null;
if ($scope.id) {
var url = Kubernetes.deploymentConfigRestUrl($scope.id);
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
$scope.entity = data;
Kubernetes.enrichDeploymentConfig(data);
}
$scope.fetched = true;
Core.$apply($scope);
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
});
}
else {
$scope.fetched = true;
Core.$apply($scope);
}
}
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.DeploymentConfigsController = Kubernetes.controller("DeploymentConfigsController", ["$scope", "KubernetesModel", "KubernetesState", "$dialog", "$window", "$templateCache", "$routeParams", "$location", "localStorage", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, $dialog, $window, $templateCache, $routeParams, $location, localStorage, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.$on('kubernetesModelUpdated', function () {
Core.$apply($scope);
});
$scope.labelClass = Kubernetes.containerLabelClass;
$scope.tableConfig = {
data: 'deploymentConfigs',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{
field: 'metadata.name',
displayName: 'Name',
cellTemplate: $templateCache.get("deploymentConfigLinkTemplate.html")
},
{
field: 'metadata.namespace',
displayName: 'Namespace'
},
{
field: '$imageChangeParams.automatic',
displayName: 'Automatic'
},
{
field: '$imageChangeParams.$containerNames',
displayName: 'Container Names'
},
{
field: '$imageChangeParams.from.name',
displayName: 'From image'
},
{
field: '$imageChangeParams.tag',
displayName: 'Tag'
},
{
field: 'template.controllerTemplate.podTemplate.tags',
displayName: 'Labels',
cellTemplate: $templateCache.get("deploymentConfigLabelTemplate.html")
}
]
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.deletePrompt = function (selected) {
UI.multiItemConfirmActionDialog({
collection: selected,
index: '$name',
onClose: function (result) {
if (result) {
function deleteSelected(selected, next) {
if (next) {
deleteEntity(next, function () {
deleteSelected(selected, selected.shift());
});
}
else {
updateData();
}
}
deleteSelected(selected, selected.shift());
}
},
title: 'Delete Deployment?',
action: 'The following Deployments will be deleted:',
okText: 'Delete',
okClass: 'btn-danger',
custom: "This operation is permanent once completed!",
customClass: "alert alert-warning"
}).open();
};
function deleteEntity(selection, nextCallback) {
var name = (selection || {}).$name;
if (name) {
console.log("About to delete deployment config: " + name);
var url = Kubernetes.deploymentConfigRestUrl(name);
$http.delete(url).
success(function (data, status, headers, config) {
nextCallback();
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to delete deployment config on " + url + " " + data + " " + status);
});
}
else {
console.log("warning: no name for selection: " + angular.toJson(selection));
}
}
function updateData() {
var url = Kubernetes.deploymentConfigsRestURL();
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
//console.log("got data " + angular.toJson(data, true));
$scope.deploymentConfigs = Kubernetes.enrichDeploymentConfigs(data.items);
$scope.fetched = true;
Core.$apply($scope);
}
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
});
}
updateData();
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.EventsController = Kubernetes.controller("EventsController", ["$scope", "KubernetesModel", "KubernetesServices", "KubernetesPods", "KubernetesState", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesServices, KubernetesPods, KubernetesState, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
ControllerHelpers.bindModelToSearchParam($scope, $location, 'mode', 'mode', 'list');
$scope.tableConfig = {
data: 'model.events',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{ field: '$firstTimestamp',
displayName: 'First Seen',
cellTemplate: $templateCache.get("firstTimestampTemplate.html")
},
{ field: '$lastTimestamp',
displayName: 'Last Seen',
cellTemplate: $templateCache.get("lastTimestampTemplate.html")
},
{ field: 'count',
displayName: 'Count'
},
{ field: 'involvedObject.name',
displayName: 'Name',
cellTemplate: $templateCache.get("eventNameTemplate.html")
},
{ field: 'involvedObject.kind',
displayName: 'Kind',
cellTemplate: $templateCache.get("eventKindTemplate.html")
},
{ field: 'involvedObject.fieldPath',
displayName: 'Subject'
},
{ field: 'reason',
displayName: 'Reason'
},
{ field: 'source',
displayName: 'Source',
cellTemplate: $templateCache.get("eventSourceTemplate.html")
},
{ field: 'message',
displayName: 'Message'
}
]
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
/// <reference path="kubernetesModel.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.HostController = Kubernetes.controller("HostController", ["$scope", "KubernetesModel", "KubernetesState", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.rawModel = null;
$scope.itemConfig = {
properties: {}
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
$scope.flipRaw = function () {
$scope.rawMode = !$scope.rawMode;
Core.$apply($scope);
};
updateData();
function updateData() {
$scope.id = $routeParams["id"];
$scope.item = null;
if ($scope.id) {
var url = UrlHelpers.join(KubernetesApiURL, "nodes", $scope.id);
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
$scope.item = data;
}
if ($scope.item) {
$scope.rawModel = Kubernetes.toRawYaml($scope.item);
}
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
});
}
else {
$scope.rawModel = null;
Core.$apply($scope);
}
}
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
/// <reference path="kubernetesModel.ts"/>
/// <reference path="utilHelpers.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.HostsController = Kubernetes.controller("HostsController", ["$scope", "KubernetesModel", "KubernetesPods", "KubernetesState", "ServiceRegistry", "$dialog", "$window", "$templateCache", "$routeParams", "$location", "localStorage", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesPods, KubernetesState, ServiceRegistry, $dialog, $window, $templateCache, $routeParams, $location, localStorage, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.$on('kubernetesModelUpdated', function () {
Core.$apply($scope);
});
$scope.tableConfig = {
data: 'model.hosts',
showSelectionCheckbox: false,
enableRowClickSelection: false,
multiSelect: false,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{
field: 'id',
displayName: 'Name',
defaultSort: true,
cellTemplate: $templateCache.get("idTemplate.html")
},
{
field: 'hostIP',
displayName: 'IP',
customSortField: function (field) {
// use a custom sort to sort ip address
return Kubernetes.sortByPodIp(field.hostIP);
}
},
{ field: '$podsLink',
displayName: 'Pods',
cellTemplate: $templateCache.get("podCountsAndLinkTemplate.html"),
customSortField: function (field) {
// need to concat all the pod counters
var ready = field.$podCounters.ready || 0;
var valid = field.$podCounters.valid || 0;
var waiting = field.$podCounters.waiting || 0;
var error = field.$podCounters.error || 0;
return ready + valid + waiting + error;
}
}
]
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.ImageRepositoriesController = Kubernetes.controller("ImageRepositoriesController", ["$scope", "KubernetesModel", "KubernetesState", "$dialog", "$window", "$templateCache", "$routeParams", "$location", "localStorage", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, $dialog, $window, $templateCache, $routeParams, $location, localStorage, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.$on('kubernetesModelUpdated', function () {
Core.$apply($scope);
});
$scope.tableConfig = {
data: 'imageRepositories',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{
field: 'metadata.name',
displayName: 'Name'
},
{
field: 'metadata.namespace',
displayName: 'Namespace'
},
{
field: 'status.dockerImageRepository',
displayName: 'Docker Registry'
},
{
field: 'tags',
displayName: 'Tags',
cellTemplate: $templateCache.get('imageRegistryLabelTemplate.html')
}
]
};
var labelColors = {
'prod': 'background-blue',
'valid': 'background-light-green',
'test': 'background-light-grey'
};
$scope.labelClass = function (labelType) {
if (!(labelType in labelColors)) {
return 'mouse-pointer';
}
else
return labelColors[labelType] + ' mouse-pointer';
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.deletePrompt = function (selected) {
UI.multiItemConfirmActionDialog({
collection: selected,
index: '$name',
onClose: function (result) {
if (result) {
function deleteSelected(selected, next) {
if (next) {
deleteEntity(next, function () {
deleteSelected(selected, selected.shift());
});
}
else {
updateData();
}
}
deleteSelected(selected, selected.shift());
}
},
title: 'Delete Image Repository?',
action: 'The following Image Repositories will be deleted:',
okText: 'Delete',
okClass: 'btn-danger',
custom: "This operation is permanent once completed!",
customClass: "alert alert-warning"
}).open();
};
function deleteEntity(selection, nextCallback) {
var name = (selection || {}).$name;
if (name) {
console.log("About to delete image repository: " + name);
var url = Kubernetes.imageRepositoryRestUrl(name);
$http.delete(url).
success(function (data, status, headers, config) {
nextCallback();
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to delete image repository on " + url + " " + data + " " + status);
});
}
else {
console.log("warning: no name for selection: " + angular.toJson(selection));
}
}
function updateData() {
var url = Kubernetes.imageRepositoriesRestURL();
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
//console.log("got data " + angular.toJson(data, true));
$scope.imageRepositories = Kubernetes.enrichImageRepositories(data.items);
$scope.fetched = true;
Core.$apply($scope);
}
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
});
}
updateData();
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
var Kubernetes;
(function (Kubernetes) {
function selectSubNavBar($scope, tabName, newSubTabLabel) {
var foundTab = null;
angular.forEach($scope.subTabConfig, function (tab) {
if (tabName === tab.label || tabName === tab.id) {
foundTab = tab;
}
});
var breadcrumbConfig = $scope.breadcrumbConfig;
if (foundTab && breadcrumbConfig) {
breadcrumbConfig.push(foundTab);
$scope.subTabConfig = [
{
label: newSubTabLabel
}
];
}
}
Kubernetes.selectSubNavBar = selectSubNavBar;
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.schema = {
"id": "http://fabric8.io/fabric8/v2/Schema#",
"$schema": "http://json-schema.org/schema#",
"definitions": {
"api_RootPaths": {
"type": "object",
"description": "",
"properties": {
"paths": {
"type": "array",
"description": "",
"items": {
"type": "string",
"description": ""
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.RootPaths"
},
"kubernetes_AWSElasticBlockStoreVolumeSource": {
"type": "object",
"description": "",
"properties": {
"fsType": {
"type": "string",
"description": "file system type to mount"
},
"partition": {
"type": "integer",
"description": "partition on the disk to mount (e.g."
},
"readOnly": {
"type": "boolean",
"description": "read-only if true"
},
"volumeID": {
"type": "string",
"description": "unique id of the PD resource in AWS; see http://releases.k8s.io/HEAD/docs/user-guide/volumes.md#awselasticblockstore"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.AWSElasticBlockStoreVolumeSource"
},
"kubernetes_Capabilities": {
"type": "object",
"description": "",
"properties": {
"add": {
"type": "array",
"description": "added capabilities",
"items": {
"type": "string",
"description": "added capabilities"
}
},
"drop": {
"type": "array",
"description": "droped capabilities",
"items": {
"type": "string",
"description": "droped capabilities"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Capabilities"
},
"kubernetes_CephFSVolumeSource": {
"type": "object",
"description": "",
"properties": {
"monitors": {
"type": "array",
"description": "a collection of Ceph monitors",
"items": {
"type": "string",
"description": "a collection of Ceph monitors"
}
},
"readOnly": {
"type": "boolean",
"description": "Ceph fs to be mounted with read-only permissions"
},
"secretFile": {
"type": "string",
"description": "path to secret for rados user; default is /etc/ceph/user.secret; optional"
},
"secretRef": {
"$ref": "#/definitions/kubernetes_LocalObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.LocalObjectReference"
},
"user": {
"type": "string",
"description": "rados user name; default is admin; optional"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.CephFSVolumeSource"
},
"kubernetes_Container": {
"type": "object",
"description": "",
"properties": {
"args": {
"type": "array",
"description": "command array; the docker image's cmd is used if this is not provided; arguments to the entrypoint; cannot be updated; variable references $(VAR_NAME) are expanded using the container's environment variables; if a variable cannot be resolved",
"items": {
"type": "string",
"description": "command array; the docker image's cmd is used if this is not provided; arguments to the entrypoint; cannot be updated; variable references $(VAR_NAME) are expanded using the container's environment variables; if a variable cannot be resolved"
}
},
"command": {
"type": "array",
"description": "entrypoint array; not executed within a shell; the docker image's entrypoint is used if this is not provided; cannot be updated; variable references $(VAR_NAME) are expanded using the container's environment variables; if a variable cannot be resolved",
"items": {
"type": "string",
"description": "entrypoint array; not executed within a shell; the docker image's entrypoint is used if this is not provided; cannot be updated; variable references $(VAR_NAME) are expanded using the container's environment variables; if a variable cannot be resolved"
}
},
"env": {
"type": "array",
"description": "list of environment variables to set in the container; cannot be updated",
"items": {
"$ref": "#/definitions/kubernetes_EnvVar",
"javaType": "io.fabric8.kubernetes.api.model.EnvVar"
}
},
"image": {
"type": "string",
"description": "Docker image name; see http://releases.k8s.io/HEAD/docs/user-guide/images.md"
},
"imagePullPolicy": {
"type": "string",
"description": "image pull policy; one of Always"
},
"lifecycle": {
"$ref": "#/definitions/kubernetes_Lifecycle",
"javaType": "io.fabric8.kubernetes.api.model.Lifecycle"
},
"livenessProbe": {
"$ref": "#/definitions/kubernetes_Probe",
"javaType": "io.fabric8.kubernetes.api.model.Probe"
},
"name": {
"type": "string",
"description": "name of the container; must be a DNS_LABEL and unique within the pod; cannot be updated",
"maxLength": 63,
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"
},
"ports": {
"type": "array",
"description": "list of ports to expose from the container; cannot be updated",
"items": {
"$ref": "#/definitions/kubernetes_ContainerPort",
"javaType": "io.fabric8.kubernetes.api.model.ContainerPort"
}
},
"readinessProbe": {
"$ref": "#/definitions/kubernetes_Probe",
"javaType": "io.fabric8.kubernetes.api.model.Probe"
},
"resources": {
"$ref": "#/definitions/kubernetes_ResourceRequirements",
"javaType": "io.fabric8.kubernetes.api.model.ResourceRequirements"
},
"securityContext": {
"$ref": "#/definitions/kubernetes_SecurityContext",
"javaType": "io.fabric8.kubernetes.api.model.SecurityContext"
},
"stdin": {
"type": "boolean",
"description": "Whether this container should allocate a buffer for stdin in the container runtime; default is false"
},
"terminationMessagePath": {
"type": "string",
"description": "path at which the file to which the container's termination message will be written is mounted into the container's filesystem; message written is intended to be brief final status"
},
"tty": {
"type": "boolean",
"description": "Whether this container should allocate a TTY for itself"
},
"volumeMounts": {
"type": "array",
"description": "pod volumes to mount into the container's filesyste; cannot be updated",
"items": {
"$ref": "#/definitions/kubernetes_VolumeMount",
"javaType": "io.fabric8.kubernetes.api.model.VolumeMount"
}
},
"workingDir": {
"type": "string",
"description": "container's working directory; defaults to image's default; cannot be updated"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Container"
},
"kubernetes_ContainerPort": {
"type": "object",
"description": "",
"properties": {
"containerPort": {
"type": "integer",
"description": "number of port to expose on the pod's IP address"
},
"hostIP": {
"type": "string",
"description": "host IP to bind the port to"
},
"hostPort": {
"type": "integer",
"description": "number of port to expose on the host; most containers do not need this"
},
"name": {
"type": "string",
"description": "name for the port that can be referred to by services; must be an IANA_SVC_NAME and unique within the pod"
},
"protocol": {
"type": "string",
"description": "protocol for port; must be UDP or TCP; TCP if unspecified"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ContainerPort"
},
"kubernetes_ContainerState": {
"type": "object",
"description": "",
"properties": {
"running": {
"$ref": "#/definitions/kubernetes_ContainerStateRunning",
"javaType": "io.fabric8.kubernetes.api.model.ContainerStateRunning"
},
"terminated": {
"$ref": "#/definitions/kubernetes_ContainerStateTerminated",
"javaType": "io.fabric8.kubernetes.api.model.ContainerStateTerminated"
},
"waiting": {
"$ref": "#/definitions/kubernetes_ContainerStateWaiting",
"javaType": "io.fabric8.kubernetes.api.model.ContainerStateWaiting"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ContainerState"
},
"kubernetes_ContainerStateRunning": {
"type": "object",
"description": "",
"properties": {
"startedAt": {
"type": "string",
"description": "time at which the container was last (re-)started"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ContainerStateRunning"
},
"kubernetes_ContainerStateTerminated": {
"type": "object",
"description": "",
"properties": {
"containerID": {
"type": "string",
"description": "container's ID in the format 'docker://\u003ccontainer_id\u003e'"
},
"exitCode": {
"type": "integer",
"description": "exit status from the last termination of the container"
},
"finishedAt": {
"type": "string",
"description": "time at which the container last terminated"
},
"message": {
"type": "string",
"description": "message regarding the last termination of the container"
},
"reason": {
"type": "string",
"description": "(brief) reason from the last termination of the container"
},
"signal": {
"type": "integer",
"description": "signal from the last termination of the container"
},
"startedAt": {
"type": "string",
"description": "time at which previous execution of the container started"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ContainerStateTerminated"
},
"kubernetes_ContainerStateWaiting": {
"type": "object",
"description": "",
"properties": {
"reason": {
"type": "string",
"description": "(brief) reason the container is not yet running"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ContainerStateWaiting"
},
"kubernetes_ContainerStatus": {
"type": "object",
"description": "",
"properties": {
"containerID": {
"type": "string",
"description": "container's ID in the format 'docker://\u003ccontainer_id\u003e'; see http://releases.k8s.io/HEAD/docs/user-guide/container-environment.md#container-information"
},
"image": {
"type": "string",
"description": "image of the container; see http://releases.k8s.io/HEAD/docs/user-guide/images.md"
},
"imageID": {
"type": "string",
"description": "ID of the container's image"
},
"lastState": {
"$ref": "#/definitions/kubernetes_ContainerState",
"javaType": "io.fabric8.kubernetes.api.model.ContainerState"
},
"name": {
"type": "string",
"description": "name of the container; must be a DNS_LABEL and unique within the pod; cannot be updated",
"maxLength": 63,
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"
},
"ready": {
"type": "boolean",
"description": "specifies whether the container has passed its readiness probe"
},
"restartCount": {
"type": "integer",
"description": "the number of times the container has been restarted"
},
"state": {
"$ref": "#/definitions/kubernetes_ContainerState",
"javaType": "io.fabric8.kubernetes.api.model.ContainerState"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ContainerStatus"
},
"kubernetes_EmptyDirVolumeSource": {
"type": "object",
"description": "",
"properties": {
"medium": {
"type": "string",
"description": "type of storage used to back the volume; must be an empty string (default) or Memory; see http://releases.k8s.io/HEAD/docs/user-guide/volumes.md#emptydir"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.EmptyDirVolumeSource"
},
"kubernetes_EndpointAddress": {
"type": "object",
"description": "",
"properties": {
"ip": {
"type": "string",
"description": "IP address of the endpoint"
},
"targetRef": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.EndpointAddress"
},
"kubernetes_EndpointPort": {
"type": "object",
"description": "",
"properties": {
"name": {
"type": "string",
"description": "name of this port",
"maxLength": 63,
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"
},
"port": {
"type": "integer",
"description": "port number of the endpoint"
},
"protocol": {
"type": "string",
"description": "protocol for this port; must be UDP or TCP; TCP if unspecified"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.EndpointPort"
},
"kubernetes_EndpointSubset": {
"type": "object",
"description": "",
"properties": {
"addresses": {
"type": "array",
"description": "IP addresses which offer the related ports",
"items": {
"$ref": "#/definitions/kubernetes_EndpointAddress",
"javaType": "io.fabric8.kubernetes.api.model.EndpointAddress"
}
},
"ports": {
"type": "array",
"description": "port numbers available on the related IP addresses",
"items": {
"$ref": "#/definitions/kubernetes_EndpointPort",
"javaType": "io.fabric8.kubernetes.api.model.EndpointPort"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.EndpointSubset"
},
"kubernetes_Endpoints": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "Endpoints",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"subsets": {
"type": "array",
"description": "sets of addresses and ports that comprise a service",
"items": {
"$ref": "#/definitions/kubernetes_EndpointSubset",
"javaType": "io.fabric8.kubernetes.api.model.EndpointSubset"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Endpoints",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_EndpointsList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of endpoints",
"items": {
"$ref": "#/definitions/kubernetes_Endpoints",
"javaType": "io.fabric8.kubernetes.api.model.Endpoints"
}
},
"kind": {
"type": "string",
"description": "",
"default": "EndpointsList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.EndpointsList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_EnvVar": {
"type": "object",
"description": "",
"properties": {
"name": {
"type": "string",
"description": "name of the environment variable; must be a C_IDENTIFIER",
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
},
"value": {
"type": "string",
"description": "value of the environment variable; defaults to empty string; variable references $(VAR_NAME) are expanded using the previously defined environment varibles in the container and any service environment variables; if a variable cannot be resolved"
},
"valueFrom": {
"$ref": "#/definitions/kubernetes_EnvVarSource",
"javaType": "io.fabric8.kubernetes.api.model.EnvVarSource"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.EnvVar"
},
"kubernetes_EnvVarSource": {
"type": "object",
"description": "",
"properties": {
"fieldRef": {
"$ref": "#/definitions/kubernetes_ObjectFieldSelector",
"javaType": "io.fabric8.kubernetes.api.model.ObjectFieldSelector"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.EnvVarSource"
},
"kubernetes_Event": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"count": {
"type": "integer",
"description": "the number of times this event has occurred"
},
"firstTimestamp": {
"type": "string",
"description": "the time at which the event was first recorded"
},
"involvedObject": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"kind": {
"type": "string",
"description": "",
"default": "Event",
"required": true
},
"lastTimestamp": {
"type": "string",
"description": "the time at which the most recent occurrence of this event was recorded"
},
"message": {
"type": "string",
"description": "human-readable description of the status of this operation"
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"reason": {
"type": "string",
"description": "short"
},
"source": {
"$ref": "#/definitions/kubernetes_EventSource",
"javaType": "io.fabric8.kubernetes.api.model.EventSource"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Event",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_EventList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of events",
"items": {
"$ref": "#/definitions/kubernetes_Event",
"javaType": "io.fabric8.kubernetes.api.model.Event"
}
},
"kind": {
"type": "string",
"description": "",
"default": "EventList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.EventList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_EventSource": {
"type": "object",
"description": "",
"properties": {
"component": {
"type": "string",
"description": "component that generated the event"
},
"host": {
"type": "string",
"description": "name of the host where the event is generated"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.EventSource"
},
"kubernetes_ExecAction": {
"type": "object",
"description": "",
"properties": {
"command": {
"type": "array",
"description": "command line to execute inside the container; working directory for the command is root ('/') in the container's file system; the command is exec'd",
"items": {
"type": "string",
"description": "command line to execute inside the container; working directory for the command is root ('/') in the container's file system; the command is exec'd"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ExecAction"
},
"kubernetes_GCEPersistentDiskVolumeSource": {
"type": "object",
"description": "",
"properties": {
"fsType": {
"type": "string",
"description": "file system type to mount"
},
"partition": {
"type": "integer",
"description": "partition on the disk to mount (e.g."
},
"pdName": {
"type": "string",
"description": "unique name of the PD resource in GCE; see http://releases.k8s.io/HEAD/docs/user-guide/volumes.md#gcepersistentdisk"
},
"readOnly": {
"type": "boolean",
"description": "read-only if true"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.GCEPersistentDiskVolumeSource"
},
"kubernetes_GitRepoVolumeSource": {
"type": "object",
"description": "",
"properties": {
"repository": {
"type": "string",
"description": "repository URL"
},
"revision": {
"type": "string",
"description": "commit hash for the specified revision"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.GitRepoVolumeSource"
},
"kubernetes_GlusterfsVolumeSource": {
"type": "object",
"description": "",
"properties": {
"endpoints": {
"type": "string",
"description": "gluster hosts endpoints name; see http://releases.k8s.io/HEAD/examples/glusterfs/README.md#create-a-pod"
},
"path": {
"type": "string",
"description": "path to gluster volume; see http://releases.k8s.io/HEAD/examples/glusterfs/README.md#create-a-pod"
},
"readOnly": {
"type": "boolean",
"description": "glusterfs volume to be mounted with read-only permissions; see http://releases.k8s.io/HEAD/examples/glusterfs/README.md#create-a-pod"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.GlusterfsVolumeSource"
},
"kubernetes_HTTPGetAction": {
"type": "object",
"description": "",
"properties": {
"host": {
"type": "string",
"description": "hostname to connect to; defaults to pod IP"
},
"path": {
"type": "string",
"description": "path to access on the HTTP server"
},
"port": {
"$ref": "#/definitions/kubernetes_util_IntOrString",
"javaType": "io.fabric8.kubernetes.api.model.IntOrString"
},
"scheme": {
"type": "string",
"description": "scheme to connect with"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.HTTPGetAction"
},
"kubernetes_Handler": {
"type": "object",
"description": "",
"properties": {
"exec": {
"$ref": "#/definitions/kubernetes_ExecAction",
"javaType": "io.fabric8.kubernetes.api.model.ExecAction"
},
"httpGet": {
"$ref": "#/definitions/kubernetes_HTTPGetAction",
"javaType": "io.fabric8.kubernetes.api.model.HTTPGetAction"
},
"tcpSocket": {
"$ref": "#/definitions/kubernetes_TCPSocketAction",
"javaType": "io.fabric8.kubernetes.api.model.TCPSocketAction"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Handler"
},
"kubernetes_HostPathVolumeSource": {
"type": "object",
"description": "",
"properties": {
"path": {
"type": "string",
"description": "path of the directory on the host; see http://releases.k8s.io/HEAD/docs/user-guide/volumes.md#hostpath"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.HostPathVolumeSource"
},
"kubernetes_ISCSIVolumeSource": {
"type": "object",
"description": "",
"properties": {
"fsType": {
"type": "string",
"description": "file system type to mount"
},
"iqn": {
"type": "string",
"description": "iSCSI Qualified Name"
},
"lun": {
"type": "integer",
"description": "iscsi target lun number"
},
"readOnly": {
"type": "boolean",
"description": "read-only if true"
},
"targetPortal": {
"type": "string",
"description": "iSCSI target portal"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ISCSIVolumeSource"
},
"kubernetes_Lifecycle": {
"type": "object",
"description": "",
"properties": {
"postStart": {
"$ref": "#/definitions/kubernetes_Handler",
"javaType": "io.fabric8.kubernetes.api.model.Handler"
},
"preStop": {
"$ref": "#/definitions/kubernetes_Handler",
"javaType": "io.fabric8.kubernetes.api.model.Handler"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Lifecycle"
},
"kubernetes_List": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of objects",
"items": {
"$ref": "#/definitions/kubernetes_runtime_RawExtension",
"javaType": "io.fabric8.kubernetes.api.model.HasMetadata"
}
},
"kind": {
"type": "string",
"description": "",
"default": "List",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.BaseKubernetesList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_ListMeta": {
"type": "object",
"description": "",
"properties": {
"resourceVersion": {
"type": "string",
"description": "string that identifies the internal version of this object that can be used by clients to determine when objects have changed; populated by the system"
},
"selfLink": {
"type": "string",
"description": "URL for the object; populated by the system"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
},
"kubernetes_LoadBalancerIngress": {
"type": "object",
"description": "",
"properties": {
"hostname": {
"type": "string",
"description": "hostname of ingress point"
},
"ip": {
"type": "string",
"description": "IP address of ingress point"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.LoadBalancerIngress"
},
"kubernetes_LoadBalancerStatus": {
"type": "object",
"description": "",
"properties": {
"ingress": {
"type": "array",
"description": "load-balancer ingress points",
"items": {
"$ref": "#/definitions/kubernetes_LoadBalancerIngress",
"javaType": "io.fabric8.kubernetes.api.model.LoadBalancerIngress"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.LoadBalancerStatus"
},
"kubernetes_LocalObjectReference": {
"type": "object",
"description": "",
"properties": {
"name": {
"type": "string",
"description": "name of the referent; see http://releases.k8s.io/HEAD/docs/user-guide/identifiers.md#names"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.LocalObjectReference"
},
"kubernetes_MetadataFile": {
"type": "object",
"description": "",
"properties": {
"fieldRef": {
"$ref": "#/definitions/kubernetes_ObjectFieldSelector",
"javaType": "io.fabric8.kubernetes.api.model.ObjectFieldSelector"
},
"name": {
"type": "string",
"description": "the name of the file to be created"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.MetadataFile"
},
"kubernetes_MetadataVolumeSource": {
"type": "object",
"description": "",
"properties": {
"items": {
"type": "array",
"description": "list of metadata files",
"items": {
"$ref": "#/definitions/kubernetes_MetadataFile",
"javaType": "io.fabric8.kubernetes.api.model.MetadataFile"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.MetadataVolumeSource"
},
"kubernetes_NFSVolumeSource": {
"type": "object",
"description": "",
"properties": {
"path": {
"type": "string",
"description": "the path that is exported by the NFS server; see http://releases.k8s.io/HEAD/docs/user-guide/volumes.md#nfs"
},
"readOnly": {
"type": "boolean",
"description": "forces the NFS export to be mounted with read-only permissions; see http://releases.k8s.io/HEAD/docs/user-guide/volumes.md#nfs"
},
"server": {
"type": "string",
"description": "the hostname or IP address of the NFS server; see http://releases.k8s.io/HEAD/docs/user-guide/volumes.md#nfs"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NFSVolumeSource"
},
"kubernetes_Namespace": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "Namespace",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/kubernetes_NamespaceSpec",
"javaType": "io.fabric8.kubernetes.api.model.NamespaceSpec"
},
"status": {
"$ref": "#/definitions/kubernetes_NamespaceStatus",
"javaType": "io.fabric8.kubernetes.api.model.NamespaceStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Namespace",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_NamespaceList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "items is the list of Namespace objects in the list; see http://releases.k8s.io/HEAD/docs/user-guide/namespaces.md",
"items": {
"$ref": "#/definitions/kubernetes_Namespace",
"javaType": "io.fabric8.kubernetes.api.model.Namespace"
}
},
"kind": {
"type": "string",
"description": "",
"default": "NamespaceList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NamespaceList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_NamespaceSpec": {
"type": "object",
"description": "",
"properties": {
"finalizers": {
"type": "array",
"description": "an opaque list of values that must be empty to permanently remove object from storage; see http://releases.k8s.io/HEAD/docs/design/namespaces.md#finalizers",
"items": {
"type": "string",
"description": "an opaque list of values that must be empty to permanently remove object from storage; see http://releases.k8s.io/HEAD/docs/design/namespaces.md#finalizers"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NamespaceSpec"
},
"kubernetes_NamespaceStatus": {
"type": "object",
"description": "",
"properties": {
"phase": {
"type": "string",
"description": "phase is the current lifecycle phase of the namespace; see http://releases.k8s.io/HEAD/docs/design/namespaces.md#phases"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NamespaceStatus"
},
"kubernetes_Node": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "Node",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/kubernetes_NodeSpec",
"javaType": "io.fabric8.kubernetes.api.model.NodeSpec"
},
"status": {
"$ref": "#/definitions/kubernetes_NodeStatus",
"javaType": "io.fabric8.kubernetes.api.model.NodeStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Node",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_NodeAddress": {
"type": "object",
"description": "",
"properties": {
"address": {
"type": "string",
"description": "the node address"
},
"type": {
"type": "string",
"description": "node address type"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NodeAddress"
},
"kubernetes_NodeCondition": {
"type": "object",
"description": "",
"properties": {
"lastHeartbeatTime": {
"type": "string",
"description": "last time we got an update on a given condition"
},
"lastTransitionTime": {
"type": "string",
"description": "last time the condition transit from one status to another"
},
"message": {
"type": "string",
"description": "human readable message indicating details about last transition"
},
"reason": {
"type": "string",
"description": "(brief) reason for the condition's last transition"
},
"status": {
"type": "string",
"description": "status of the condition"
},
"type": {
"type": "string",
"description": "type of node condition"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NodeCondition"
},
"kubernetes_NodeList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of nodes",
"items": {
"$ref": "#/definitions/kubernetes_Node",
"javaType": "io.fabric8.kubernetes.api.model.Node"
}
},
"kind": {
"type": "string",
"description": "",
"default": "NodeList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NodeList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_NodeSpec": {
"type": "object",
"description": "",
"properties": {
"externalID": {
"type": "string",
"description": "deprecated. External ID assigned to the node by some machine database (e.g. a cloud provider). Defaults to node name when empty."
},
"podCIDR": {
"type": "string",
"description": "pod IP range assigned to the node"
},
"providerID": {
"type": "string",
"description": "ID of the node assigned by the cloud provider in the format: \u003cProviderName\u003e://\u003cProviderSpecificNodeID\u003e"
},
"unschedulable": {
"type": "boolean",
"description": "disable pod scheduling on the node; see http://releases.k8s.io/HEAD/docs/admin/node.md#manual-node-administration"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NodeSpec"
},
"kubernetes_NodeStatus": {
"type": "object",
"description": "",
"properties": {
"addresses": {
"type": "array",
"description": "list of addresses reachable to the node; see http://releases.k8s.io/HEAD/docs/admin/node.md#node-addresses",
"items": {
"$ref": "#/definitions/kubernetes_NodeAddress",
"javaType": "io.fabric8.kubernetes.api.model.NodeAddress"
}
},
"capacity": {
"type": "object",
"description": "compute resource capacity of the node; see http://releases.k8s.io/HEAD/docs/user-guide/compute-resources.md",
"additionalProperties": {
"$ref": "#/definitions/kubernetes_resource_Quantity",
"javaType": "io.fabric8.kubernetes.api.model.Quantity"
},
"javaType": "java.util.Map\u003cString,io.fabric8.kubernetes.api.model.Quantity\u003e"
},
"conditions": {
"type": "array",
"description": "list of node conditions observed; see http://releases.k8s.io/HEAD/docs/admin/node.md#node-condition",
"items": {
"$ref": "#/definitions/kubernetes_NodeCondition",
"javaType": "io.fabric8.kubernetes.api.model.NodeCondition"
}
},
"nodeInfo": {
"$ref": "#/definitions/kubernetes_NodeSystemInfo",
"javaType": "io.fabric8.kubernetes.api.model.NodeSystemInfo"
},
"phase": {
"type": "string",
"description": "most recently observed lifecycle phase of the node; see http://releases.k8s.io/HEAD/docs/admin/node.md#node-phase"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NodeStatus"
},
"kubernetes_NodeSystemInfo": {
"type": "object",
"description": "",
"properties": {
"bootID": {
"type": "string",
"description": "boot id is the boot-id reported by the node"
},
"containerRuntimeVersion": {
"type": "string",
"description": "Container runtime version reported by the node through runtime remote API (e.g. docker://1.5.0)"
},
"kernelVersion": {
"type": "string",
"description": "Kernel version reported by the node from 'uname -r' (e.g. 3.16.0-0.bpo.4-amd64)"
},
"kubeProxyVersion": {
"type": "string",
"description": "Kube-proxy version reported by the node"
},
"kubeletVersion": {
"type": "string",
"description": "Kubelet version reported by the node"
},
"machineID": {
"type": "string",
"description": "machine-id reported by the node"
},
"osImage": {
"type": "string",
"description": "OS image used reported by the node from /etc/os-release (e.g. Debian GNU/Linux 7 (wheezy))"
},
"systemUUID": {
"type": "string",
"description": "system-uuid reported by the node"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NodeSystemInfo"
},
"kubernetes_ObjectFieldSelector": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "version of the schema that fieldPath is written in terms of; defaults to v1"
},
"fieldPath": {
"type": "string",
"description": "path of the field to select in the specified API version"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ObjectFieldSelector"
},
"kubernetes_ObjectMeta": {
"type": "object",
"description": "",
"properties": {
"annotations": {
"type": "object",
"description": "map of string keys and values that can be used by external tooling to store and retrieve arbitrary metadata about objects; see http://releases.k8s.io/HEAD/docs/user-guide/annotations.md",
"additionalProperties": {
"type": "string",
"description": "map of string keys and values that can be used by external tooling to store and retrieve arbitrary metadata about objects; see http://releases.k8s.io/HEAD/docs/user-guide/annotations.md"
},
"javaType": "java.util.Map\u003cString,String\u003e"
},
"creationTimestamp": {
"type": "string",
"description": "RFC 3339 date and time at which the object was created; populated by the system"
},
"deletionTimestamp": {
"type": "string",
"description": "RFC 3339 date and time at which the object will be deleted; populated by the system when a graceful deletion is requested"
},
"generateName": {
"type": "string",
"description": "an optional prefix to use to generate a unique name; has the same validation rules as name; optional"
},
"generation": {
"type": "integer",
"description": "a sequence number representing a specific generation of the desired state; populated by the system; read-only",
"javaType": "Long"
},
"labels": {
"type": "object",
"description": "map of string keys and values that can be used to organize and categorize objects; may match selectors of replication controllers and services; see http://releases.k8s.io/HEAD/docs/user-guide/labels.md",
"additionalProperties": {
"type": "string",
"description": "map of string keys and values that can be used to organize and categorize objects; may match selectors of replication controllers and services; see http://releases.k8s.io/HEAD/docs/user-guide/labels.md"
},
"javaType": "java.util.Map\u003cString,String\u003e"
},
"name": {
"type": "string",
"description": "string that identifies an object. Must be unique within a namespace; cannot be updated; see http://releases.k8s.io/HEAD/docs/user-guide/identifiers.md#names",
"maxLength": 63,
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"
},
"namespace": {
"type": "string",
"description": "namespace of the object; must be a DNS_LABEL; cannot be updated; see http://releases.k8s.io/HEAD/docs/user-guide/namespaces.md",
"maxLength": 253,
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"
},
"resourceVersion": {
"type": "string",
"description": "string that identifies the internal version of this object that can be used by clients to determine when objects have changed; populated by the system"
},
"selfLink": {
"type": "string",
"description": "URL for the object; populated by the system"
},
"uid": {
"type": "string",
"description": "unique UUID across space and time; populated by the system; read-only; see http://releases.k8s.io/HEAD/docs/user-guide/identifiers.md#uids"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"kubernetes_ObjectReference": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "API version of the referent"
},
"fieldPath": {
"type": "string",
"description": "if referring to a piece of an object instead of an entire object"
},
"kind": {
"type": "string",
"description": "kind of the referent; see http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds"
},
"name": {
"type": "string",
"description": "name of the referent; see http://releases.k8s.io/HEAD/docs/user-guide/identifiers.md#names"
},
"namespace": {
"type": "string",
"description": "namespace of the referent; see http://releases.k8s.io/HEAD/docs/user-guide/namespaces.md"
},
"resourceVersion": {
"type": "string",
"description": "specific resourceVersion to which this reference is made"
},
"uid": {
"type": "string",
"description": "uid of the referent; see http://releases.k8s.io/HEAD/docs/user-guide/identifiers.md#uids"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"kubernetes_PersistentVolume": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "PersistentVolume",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/kubernetes_PersistentVolumeSpec",
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeSpec"
},
"status": {
"$ref": "#/definitions/kubernetes_PersistentVolumeStatus",
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolume",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_PersistentVolumeClaim": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "PersistentVolumeClaim",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/kubernetes_PersistentVolumeClaimSpec",
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeClaimSpec"
},
"status": {
"$ref": "#/definitions/kubernetes_PersistentVolumeClaimStatus",
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeClaimStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeClaim",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_PersistentVolumeClaimList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "a list of persistent volume claims; see http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#persistentvolumeclaims",
"items": {
"$ref": "#/definitions/kubernetes_PersistentVolumeClaim",
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeClaim"
}
},
"kind": {
"type": "string",
"description": "",
"default": "PersistentVolumeClaimList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeClaimList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_PersistentVolumeClaimSpec": {
"type": "object",
"description": "",
"properties": {
"accessModes": {
"type": "array",
"description": "the desired access modes the volume should have; see http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1",
"items": {
"type": "string",
"description": "the desired access modes the volume should have; see http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1"
}
},
"resources": {
"$ref": "#/definitions/kubernetes_ResourceRequirements",
"javaType": "io.fabric8.kubernetes.api.model.ResourceRequirements"
},
"volumeName": {
"type": "string",
"description": "the binding reference to the persistent volume backing this claim"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeClaimSpec"
},
"kubernetes_PersistentVolumeClaimStatus": {
"type": "object",
"description": "",
"properties": {
"accessModes": {
"type": "array",
"description": "the actual access modes the volume has; see http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1",
"items": {
"type": "string",
"description": "the actual access modes the volume has; see http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes-1"
}
},
"capacity": {
"type": "object",
"description": "the actual resources the volume has",
"additionalProperties": {
"$ref": "#/definitions/kubernetes_resource_Quantity",
"javaType": "io.fabric8.kubernetes.api.model.Quantity"
},
"javaType": "java.util.Map\u003cString,io.fabric8.kubernetes.api.model.Quantity\u003e"
},
"phase": {
"type": "string",
"description": "the current phase of the claim"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeClaimStatus"
},
"kubernetes_PersistentVolumeClaimVolumeSource": {
"type": "object",
"description": "",
"properties": {
"claimName": {
"type": "string",
"description": "the name of the claim in the same namespace to be mounted as a volume; see http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#persistentvolumeclaims"
},
"readOnly": {
"type": "boolean",
"description": "mount volume as read-only when true; default false"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeClaimVolumeSource"
},
"kubernetes_PersistentVolumeList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of persistent volumes; see http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md",
"items": {
"$ref": "#/definitions/kubernetes_PersistentVolume",
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolume"
}
},
"kind": {
"type": "string",
"description": "",
"default": "PersistentVolumeList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_PersistentVolumeSource": {
"type": "object",
"description": "",
"properties": {
"awsElasticBlockStore": {
"$ref": "#/definitions/kubernetes_AWSElasticBlockStoreVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.AWSElasticBlockStoreVolumeSource"
},
"cephfs": {
"$ref": "#/definitions/kubernetes_CephFSVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.CephFSVolumeSource"
},
"gcePersistentDisk": {
"$ref": "#/definitions/kubernetes_GCEPersistentDiskVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.GCEPersistentDiskVolumeSource"
},
"glusterfs": {
"$ref": "#/definitions/kubernetes_GlusterfsVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.GlusterfsVolumeSource"
},
"hostPath": {
"$ref": "#/definitions/kubernetes_HostPathVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.HostPathVolumeSource"
},
"iscsi": {
"$ref": "#/definitions/kubernetes_ISCSIVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.ISCSIVolumeSource"
},
"nfs": {
"$ref": "#/definitions/kubernetes_NFSVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.NFSVolumeSource"
},
"rbd": {
"$ref": "#/definitions/kubernetes_RBDVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.RBDVolumeSource"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeSource"
},
"kubernetes_PersistentVolumeSpec": {
"type": "object",
"description": "",
"properties": {
"accessModes": {
"type": "array",
"description": "all ways the volume can be mounted; see http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes",
"items": {
"type": "string",
"description": "all ways the volume can be mounted; see http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#access-modes"
}
},
"awsElasticBlockStore": {
"$ref": "#/definitions/kubernetes_AWSElasticBlockStoreVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.AWSElasticBlockStoreVolumeSource"
},
"capacity": {
"type": "object",
"description": "a description of the persistent volume's resources and capacityr; see http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#capacity",
"additionalProperties": {
"$ref": "#/definitions/kubernetes_resource_Quantity",
"javaType": "io.fabric8.kubernetes.api.model.Quantity"
},
"javaType": "java.util.Map\u003cString,io.fabric8.kubernetes.api.model.Quantity\u003e"
},
"cephfs": {
"$ref": "#/definitions/kubernetes_CephFSVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.CephFSVolumeSource"
},
"claimRef": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"gcePersistentDisk": {
"$ref": "#/definitions/kubernetes_GCEPersistentDiskVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.GCEPersistentDiskVolumeSource"
},
"glusterfs": {
"$ref": "#/definitions/kubernetes_GlusterfsVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.GlusterfsVolumeSource"
},
"hostPath": {
"$ref": "#/definitions/kubernetes_HostPathVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.HostPathVolumeSource"
},
"iscsi": {
"$ref": "#/definitions/kubernetes_ISCSIVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.ISCSIVolumeSource"
},
"nfs": {
"$ref": "#/definitions/kubernetes_NFSVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.NFSVolumeSource"
},
"persistentVolumeReclaimPolicy": {
"type": "string",
"description": "what happens to a volume when released from its claim; Valid options are Retain (default) and Recycle. Recyling must be supported by the volume plugin underlying this persistent volume. See http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#recycling-policy"
},
"rbd": {
"$ref": "#/definitions/kubernetes_RBDVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.RBDVolumeSource"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeSpec"
},
"kubernetes_PersistentVolumeStatus": {
"type": "object",
"description": "",
"properties": {
"message": {
"type": "string",
"description": "human-readable message indicating details about why the volume is in this state"
},
"phase": {
"type": "string",
"description": "the current phase of a persistent volume; see http://releases.k8s.io/HEAD/docs/user-guide/persistent-volumes.md#phase"
},
"reason": {
"type": "string",
"description": "(brief) reason the volume is not is not available"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeStatus"
},
"kubernetes_Pod": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "Pod",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/kubernetes_PodSpec",
"javaType": "io.fabric8.kubernetes.api.model.PodSpec"
},
"status": {
"$ref": "#/definitions/kubernetes_PodStatus",
"javaType": "io.fabric8.kubernetes.api.model.PodStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Pod",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_PodCondition": {
"type": "object",
"description": "",
"properties": {
"status": {
"type": "string",
"description": "status of the condition"
},
"type": {
"type": "string",
"description": "kind of the condition"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PodCondition"
},
"kubernetes_PodList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of pods; see http://releases.k8s.io/HEAD/docs/user-guide/pods.md",
"items": {
"$ref": "#/definitions/kubernetes_Pod",
"javaType": "io.fabric8.kubernetes.api.model.Pod"
}
},
"kind": {
"type": "string",
"description": "",
"default": "PodList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PodList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_PodSpec": {
"type": "object",
"description": "",
"properties": {
"activeDeadlineSeconds": {
"type": "integer",
"description": "",
"javaType": "Long"
},
"containers": {
"type": "array",
"description": "list of containers belonging to the pod; cannot be updated; containers cannot currently be added or removed; there must be at least one container in a Pod; see http://releases.k8s.io/HEAD/docs/user-guide/containers.md",
"items": {
"$ref": "#/definitions/kubernetes_Container",
"javaType": "io.fabric8.kubernetes.api.model.Container"
}
},
"dnsPolicy": {
"type": "string",
"description": "DNS policy for containers within the pod; one of 'ClusterFirst' or 'Default'"
},
"host": {
"type": "string",
"description": "deprecated"
},
"hostNetwork": {
"type": "boolean",
"description": "host networking requested for this pod"
},
"imagePullSecrets": {
"type": "array",
"description": "list of references to secrets in the same namespace available for pulling the container images; see http://releases.k8s.io/HEAD/docs/user-guide/images.md#specifying-imagepullsecrets-on-a-pod",
"items": {
"$ref": "#/definitions/kubernetes_LocalObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.LocalObjectReference"
}
},
"nodeName": {
"type": "string",
"description": "node requested for this pod"
},
"nodeSelector": {
"type": "object",
"description": "selector which must match a node's labels for the pod to be scheduled on that node; see http://releases.k8s.io/HEAD/docs/user-guide/node-selection/README.md",
"additionalProperties": {
"type": "string",
"description": "selector which must match a node's labels for the pod to be scheduled on that node; see http://releases.k8s.io/HEAD/docs/user-guide/node-selection/README.md"
},
"javaType": "java.util.Map\u003cString,String\u003e"
},
"restartPolicy": {
"type": "string",
"description": "restart policy for all containers within the pod; one of Always"
},
"serviceAccount": {
"type": "string",
"description": "deprecated; use serviceAccountName instead"
},
"serviceAccountName": {
"type": "string",
"description": "name of the ServiceAccount to use to run this pod; see http://releases.k8s.io/HEAD/docs/design/service_accounts.md"
},
"terminationGracePeriodSeconds": {
"type": "integer",
"description": "optional duration in seconds the pod needs to terminate gracefully; may be decreased in delete request; value must be non-negative integer; the value zero indicates delete immediately; if this value is not set",
"javaType": "Long"
},
"volumes": {
"type": "array",
"description": "list of volumes that can be mounted by containers belonging to the pod; see http://releases.k8s.io/HEAD/docs/user-guide/volumes.md",
"items": {
"$ref": "#/definitions/kubernetes_Volume",
"javaType": "io.fabric8.kubernetes.api.model.Volume"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PodSpec"
},
"kubernetes_PodStatus": {
"type": "object",
"description": "",
"properties": {
"conditions": {
"type": "array",
"description": "current service state of pod; see http://releases.k8s.io/HEAD/docs/user-guide/pod-states.md#pod-conditions",
"items": {
"$ref": "#/definitions/kubernetes_PodCondition",
"javaType": "io.fabric8.kubernetes.api.model.PodCondition"
}
},
"containerStatuses": {
"type": "array",
"description": "list of container statuses; see http://releases.k8s.io/HEAD/docs/user-guide/pod-states.md#container-statuses",
"items": {
"$ref": "#/definitions/kubernetes_ContainerStatus",
"javaType": "io.fabric8.kubernetes.api.model.ContainerStatus"
}
},
"hostIP": {
"type": "string",
"description": "IP address of the host to which the pod is assigned; empty if not yet scheduled"
},
"message": {
"type": "string",
"description": "human readable message indicating details about why the pod is in this condition"
},
"phase": {
"type": "string",
"description": "current condition of the pod; see http://releases.k8s.io/HEAD/docs/user-guide/pod-states.md#pod-phase"
},
"podIP": {
"type": "string",
"description": "IP address allocated to the pod; routable at least within the cluster; empty if not yet allocated"
},
"reason": {
"type": "string",
"description": "(brief-CamelCase) reason indicating details about why the pod is in this condition"
},
"startTime": {
"type": "string",
"description": "RFC 3339 date and time at which the object was acknowledged by the Kubelet. This is before the Kubelet pulled the container image(s) for the pod."
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PodStatus"
},
"kubernetes_PodTemplateSpec": {
"type": "object",
"description": "",
"properties": {
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/kubernetes_PodSpec",
"javaType": "io.fabric8.kubernetes.api.model.PodSpec"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.PodTemplateSpec"
},
"kubernetes_Probe": {
"type": "object",
"description": "",
"properties": {
"exec": {
"$ref": "#/definitions/kubernetes_ExecAction",
"javaType": "io.fabric8.kubernetes.api.model.ExecAction"
},
"httpGet": {
"$ref": "#/definitions/kubernetes_HTTPGetAction",
"javaType": "io.fabric8.kubernetes.api.model.HTTPGetAction"
},
"initialDelaySeconds": {
"type": "integer",
"description": "number of seconds after the container has started before liveness probes are initiated; see http://releases.k8s.io/HEAD/docs/user-guide/pod-states.md#container-probes",
"javaType": "Long"
},
"tcpSocket": {
"$ref": "#/definitions/kubernetes_TCPSocketAction",
"javaType": "io.fabric8.kubernetes.api.model.TCPSocketAction"
},
"timeoutSeconds": {
"type": "integer",
"description": "number of seconds after which liveness probes timeout; defaults to 1 second; see http://releases.k8s.io/HEAD/docs/user-guide/pod-states.md#container-probes",
"javaType": "Long"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Probe"
},
"kubernetes_RBDVolumeSource": {
"type": "object",
"description": "",
"properties": {
"fsType": {
"type": "string",
"description": "file system type to mount"
},
"image": {
"type": "string",
"description": "rados image name; see http://releases.k8s.io/HEAD/examples/rbd/README.md#how-to-use-it"
},
"keyring": {
"type": "string",
"description": "keyring is the path to key ring for rados user; default is /etc/ceph/keyring; optional; see http://releases.k8s.io/HEAD/examples/rbd/README.md#how-to-use-it"
},
"monitors": {
"type": "array",
"description": "a collection of Ceph monitors; see http://releases.k8s.io/HEAD/examples/rbd/README.md#how-to-use-it",
"items": {
"type": "string",
"description": "a collection of Ceph monitors; see http://releases.k8s.io/HEAD/examples/rbd/README.md#how-to-use-it"
}
},
"pool": {
"type": "string",
"description": "rados pool name; default is rbd; optional; see http://releases.k8s.io/HEAD/examples/rbd/README.md#how-to-use-it"
},
"readOnly": {
"type": "boolean",
"description": "rbd volume to be mounted with read-only permissions; see http://releases.k8s.io/HEAD/examples/rbd/README.md#how-to-use-it"
},
"secretRef": {
"$ref": "#/definitions/kubernetes_LocalObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.LocalObjectReference"
},
"user": {
"type": "string",
"description": "rados user name; default is admin; optional; see http://releases.k8s.io/HEAD/examples/rbd/README.md#how-to-use-it"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.RBDVolumeSource"
},
"kubernetes_ReplicationController": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "ReplicationController",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/kubernetes_ReplicationControllerSpec",
"javaType": "io.fabric8.kubernetes.api.model.ReplicationControllerSpec"
},
"status": {
"$ref": "#/definitions/kubernetes_ReplicationControllerStatus",
"javaType": "io.fabric8.kubernetes.api.model.ReplicationControllerStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ReplicationController",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_ReplicationControllerList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of replication controllers; see http://releases.k8s.io/HEAD/docs/user-guide/replication-controller.md",
"items": {
"$ref": "#/definitions/kubernetes_ReplicationController",
"javaType": "io.fabric8.kubernetes.api.model.ReplicationController"
}
},
"kind": {
"type": "string",
"description": "",
"default": "ReplicationControllerList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ReplicationControllerList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_ReplicationControllerSpec": {
"type": "object",
"description": "",
"properties": {
"replicas": {
"type": "integer",
"description": "number of replicas desired; defaults to 1; see http://releases.k8s.io/HEAD/docs/user-guide/replication-controller.md#what-is-a-replication-controller"
},
"selector": {
"type": "object",
"description": "label keys and values that must match in order to be controlled by this replication controller",
"additionalProperties": {
"type": "string",
"description": "label keys and values that must match in order to be controlled by this replication controller"
},
"javaType": "java.util.Map\u003cString,String\u003e"
},
"template": {
"$ref": "#/definitions/kubernetes_PodTemplateSpec",
"javaType": "io.fabric8.kubernetes.api.model.PodTemplateSpec"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ReplicationControllerSpec"
},
"kubernetes_ReplicationControllerStatus": {
"type": "object",
"description": "",
"properties": {
"observedGeneration": {
"type": "integer",
"description": "reflects the generation of the most recently observed replication controller",
"javaType": "Long"
},
"replicas": {
"type": "integer",
"description": "most recently oberved number of replicas; see http://releases.k8s.io/HEAD/docs/user-guide/replication-controller.md#what-is-a-replication-controller"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ReplicationControllerStatus"
},
"kubernetes_ResourceQuota": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "ResourceQuota",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/kubernetes_ResourceQuotaSpec",
"javaType": "io.fabric8.kubernetes.api.model.ResourceQuotaSpec"
},
"status": {
"$ref": "#/definitions/kubernetes_ResourceQuotaStatus",
"javaType": "io.fabric8.kubernetes.api.model.ResourceQuotaStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ResourceQuota",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_ResourceQuotaList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "items is a list of ResourceQuota objects; see http://releases.k8s.io/HEAD/docs/design/admission_control_resource_quota.md#admissioncontrol-plugin-resourcequota",
"items": {
"$ref": "#/definitions/kubernetes_ResourceQuota",
"javaType": "io.fabric8.kubernetes.api.model.ResourceQuota"
}
},
"kind": {
"type": "string",
"description": "",
"default": "ResourceQuotaList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ResourceQuotaList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_ResourceQuotaSpec": {
"type": "object",
"description": "",
"properties": {
"hard": {
"type": "object",
"description": "hard is the set of desired hard limits for each named resource; see http://releases.k8s.io/HEAD/docs/design/admission_control_resource_quota.md#admissioncontrol-plugin-resourcequota",
"additionalProperties": {
"$ref": "#/definitions/kubernetes_resource_Quantity",
"javaType": "io.fabric8.kubernetes.api.model.Quantity"
},
"javaType": "java.util.Map\u003cString,io.fabric8.kubernetes.api.model.Quantity\u003e"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ResourceQuotaSpec"
},
"kubernetes_ResourceQuotaStatus": {
"type": "object",
"description": "",
"properties": {
"hard": {
"type": "object",
"description": "hard is the set of enforced hard limits for each named resource; see http://releases.k8s.io/HEAD/docs/design/admission_control_resource_quota.md#admissioncontrol-plugin-resourcequota",
"additionalProperties": {
"$ref": "#/definitions/kubernetes_resource_Quantity",
"javaType": "io.fabric8.kubernetes.api.model.Quantity"
},
"javaType": "java.util.Map\u003cString,io.fabric8.kubernetes.api.model.Quantity\u003e"
},
"used": {
"type": "object",
"description": "used is the current observed total usage of the resource in the namespace",
"additionalProperties": {
"$ref": "#/definitions/kubernetes_resource_Quantity",
"javaType": "io.fabric8.kubernetes.api.model.Quantity"
},
"javaType": "java.util.Map\u003cString,io.fabric8.kubernetes.api.model.Quantity\u003e"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ResourceQuotaStatus"
},
"kubernetes_ResourceRequirements": {
"type": "object",
"description": "",
"properties": {
"limits": {
"type": "object",
"description": "Maximum amount of compute resources allowed; see http://releases.k8s.io/HEAD/docs/design/resources.md#resource-specifications",
"additionalProperties": {
"$ref": "#/definitions/kubernetes_resource_Quantity",
"javaType": "io.fabric8.kubernetes.api.model.Quantity"
},
"javaType": "java.util.Map\u003cString,io.fabric8.kubernetes.api.model.Quantity\u003e"
},
"requests": {
"type": "object",
"description": "Minimum amount of resources requested; if Requests is omitted for a container",
"additionalProperties": {
"$ref": "#/definitions/kubernetes_resource_Quantity",
"javaType": "io.fabric8.kubernetes.api.model.Quantity"
},
"javaType": "java.util.Map\u003cString,io.fabric8.kubernetes.api.model.Quantity\u003e"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ResourceRequirements"
},
"kubernetes_RunAsUserStrategyOptions": {
"type": "object",
"description": "",
"properties": {
"type": {
"type": "string",
"description": "strategy used to generate RunAsUser"
},
"uid": {
"type": "integer",
"description": "the uid to always run as; required for MustRunAs",
"javaType": "Long"
},
"uidRangeMax": {
"type": "integer",
"description": "max value for range based allocators",
"javaType": "Long"
},
"uidRangeMin": {
"type": "integer",
"description": "min value for range based allocators",
"javaType": "Long"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.RunAsUserStrategyOptions"
},
"kubernetes_SELinuxContextStrategyOptions": {
"type": "object",
"description": "",
"properties": {
"seLinuxOptions": {
"$ref": "#/definitions/kubernetes_SELinuxOptions",
"javaType": "io.fabric8.kubernetes.api.model.SELinuxOptions"
},
"type": {
"type": "string",
"description": "strategy used to generate the SELinux context"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.SELinuxContextStrategyOptions"
},
"kubernetes_SELinuxOptions": {
"type": "object",
"description": "",
"properties": {
"level": {
"type": "string",
"description": "the level label to apply to the container; see http://releases.k8s.io/HEAD/docs/user-guide/labels.md"
},
"role": {
"type": "string",
"description": "the role label to apply to the container; see http://releases.k8s.io/HEAD/docs/user-guide/labels.md"
},
"type": {
"type": "string",
"description": "the type label to apply to the container; see http://releases.k8s.io/HEAD/docs/user-guide/labels.md"
},
"user": {
"type": "string",
"description": "the user label to apply to the container; see http://releases.k8s.io/HEAD/docs/user-guide/labels.md"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.SELinuxOptions"
},
"kubernetes_Secret": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"data": {
"type": "object",
"description": "data contains the secret data. Each key must be a valid DNS_SUBDOMAIN or leading dot followed by valid DNS_SUBDOMAIN. Each value must be a base64 encoded string as described in https://tools.ietf.org/html/rfc4648#section-4",
"additionalProperties": {
"type": "string",
"description": "data contains the secret data. Each key must be a valid DNS_SUBDOMAIN or leading dot followed by valid DNS_SUBDOMAIN. Each value must be a base64 encoded string as described in https://tools.ietf.org/html/rfc4648#section-4"
},
"javaType": "java.util.Map\u003cString,String\u003e"
},
"kind": {
"type": "string",
"description": "",
"default": "Secret",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"type": {
"type": "string",
"description": "type facilitates programmatic handling of secret data"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Secret",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_SecretList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "items is a list of secret objects; see http://releases.k8s.io/HEAD/docs/user-guide/secrets.md",
"items": {
"$ref": "#/definitions/kubernetes_Secret",
"javaType": "io.fabric8.kubernetes.api.model.Secret"
}
},
"kind": {
"type": "string",
"description": "",
"default": "SecretList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.SecretList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_SecretVolumeSource": {
"type": "object",
"description": "",
"properties": {
"secretName": {
"type": "string",
"description": "secretName is the name of a secret in the pod's namespace; see http://releases.k8s.io/HEAD/docs/user-guide/volumes.md#secrets"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.SecretVolumeSource"
},
"kubernetes_SecurityContext": {
"type": "object",
"description": "",
"properties": {
"capabilities": {
"$ref": "#/definitions/kubernetes_Capabilities",
"javaType": "io.fabric8.kubernetes.api.model.Capabilities"
},
"privileged": {
"type": "boolean",
"description": "run the container in privileged mode; see http://releases.k8s.io/HEAD/docs/design/security_context.md#security-context"
},
"runAsNonRoot": {
"type": "boolean",
"description": "indicates the container must be run as a non-root user either by specifying the runAsUser or in the image specification"
},
"runAsUser": {
"type": "integer",
"description": "the user id that runs the first process in the container; see http://releases.k8s.io/HEAD/docs/design/security_context.md#security-context",
"javaType": "Long"
},
"seLinuxOptions": {
"$ref": "#/definitions/kubernetes_SELinuxOptions",
"javaType": "io.fabric8.kubernetes.api.model.SELinuxOptions"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.SecurityContext"
},
"kubernetes_SecurityContextConstraints": {
"type": "object",
"description": "",
"properties": {
"allowHostDirVolumePlugin": {
"type": "boolean",
"description": "allow the use of the host dir volume plugin"
},
"allowHostNetwork": {
"type": "boolean",
"description": "allow the use of the hostNetwork in the pod spec"
},
"allowHostPorts": {
"type": "boolean",
"description": "allow the use of the host ports in the containers"
},
"allowPrivilegedContainer": {
"type": "boolean",
"description": "allow containers to run as privileged"
},
"allowedCapabilities": {
"type": "array",
"description": "capabilities that are allowed to be added",
"items": {
"type": "string",
"description": "capabilities that are allowed to be added"
}
},
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"groups": {
"type": "array",
"description": "groups allowed to use this SecurityContextConstraints",
"items": {
"type": "string",
"description": "groups allowed to use this SecurityContextConstraints"
}
},
"kind": {
"type": "string",
"description": "",
"default": "SecurityContextConstraints",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"runAsUser": {
"$ref": "#/definitions/kubernetes_RunAsUserStrategyOptions",
"javaType": "io.fabric8.kubernetes.api.model.RunAsUserStrategyOptions"
},
"seLinuxContext": {
"$ref": "#/definitions/kubernetes_SELinuxContextStrategyOptions",
"javaType": "io.fabric8.kubernetes.api.model.SELinuxContextStrategyOptions"
},
"users": {
"type": "array",
"description": "users allowed to use this SecurityContextConstraints",
"items": {
"type": "string",
"description": "users allowed to use this SecurityContextConstraints"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.SecurityContextConstraints",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_SecurityContextConstraintsList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "",
"items": {
"$ref": "#/definitions/kubernetes_SecurityContextConstraints",
"javaType": "io.fabric8.kubernetes.api.model.SecurityContextConstraints"
}
},
"kind": {
"type": "string",
"description": "",
"default": "SecurityContextConstraintsList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.SecurityContextConstraintsList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_Service": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "Service",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/kubernetes_ServiceSpec",
"javaType": "io.fabric8.kubernetes.api.model.ServiceSpec"
},
"status": {
"$ref": "#/definitions/kubernetes_ServiceStatus",
"javaType": "io.fabric8.kubernetes.api.model.ServiceStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Service",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_ServiceAccount": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"imagePullSecrets": {
"type": "array",
"description": "list of references to secrets in the same namespace available for pulling container images; see http://releases.k8s.io/HEAD/docs/user-guide/secrets.md#manually-specifying-an-imagepullsecret",
"items": {
"$ref": "#/definitions/kubernetes_LocalObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.LocalObjectReference"
}
},
"kind": {
"type": "string",
"description": "",
"default": "ServiceAccount",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"secrets": {
"type": "array",
"description": "list of secrets that can be used by pods running as this service account; see http://releases.k8s.io/HEAD/docs/user-guide/secrets.md",
"items": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ServiceAccount",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"kubernetes_ServiceAccountList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of ServiceAccounts; see http://releases.k8s.io/HEAD/docs/design/service_accounts.md#service-accounts",
"items": {
"$ref": "#/definitions/kubernetes_ServiceAccount",
"javaType": "io.fabric8.kubernetes.api.model.ServiceAccount"
}
},
"kind": {
"type": "string",
"description": "",
"default": "ServiceAccountList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ServiceAccountList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_ServiceList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of services",
"items": {
"$ref": "#/definitions/kubernetes_Service",
"javaType": "io.fabric8.kubernetes.api.model.Service"
}
},
"kind": {
"type": "string",
"description": "",
"default": "ServiceList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ServiceList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"kubernetes_ServicePort": {
"type": "object",
"description": "",
"properties": {
"name": {
"type": "string",
"description": "the name of this port; optional if only one port is defined",
"maxLength": 63,
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"
},
"nodePort": {
"type": "integer",
"description": "the port on each node on which this service is exposed when type=NodePort or LoadBalancer; usually assigned by the system; if specified"
},
"port": {
"type": "integer",
"description": "the port number that is exposed"
},
"protocol": {
"type": "string",
"description": "the protocol used by this port; must be UDP or TCP; TCP if unspecified"
},
"targetPort": {
"$ref": "#/definitions/kubernetes_util_IntOrString",
"javaType": "io.fabric8.kubernetes.api.model.IntOrString"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ServicePort"
},
"kubernetes_ServiceSpec": {
"type": "object",
"description": "",
"properties": {
"clusterIP": {
"type": "string",
"description": "IP address of the service; usually assigned by the system; if specified"
},
"deprecatedPublicIPs": {
"type": "array",
"description": "deprecated. externally visible IPs (e.g. load balancers) that should be proxied to this service",
"items": {
"type": "string",
"description": "deprecated. externally visible IPs (e.g. load balancers) that should be proxied to this service"
}
},
"portalIP": {
"type": "string",
"description": "deprecated"
},
"ports": {
"type": "array",
"description": "ports exposed by the service; see http://releases.k8s.io/HEAD/docs/user-guide/services.md#virtual-ips-and-service-proxies",
"items": {
"$ref": "#/definitions/kubernetes_ServicePort",
"javaType": "io.fabric8.kubernetes.api.model.ServicePort"
}
},
"selector": {
"type": "object",
"description": "label keys and values that must match in order to receive traffic for this service; if empty",
"additionalProperties": {
"type": "string",
"description": "label keys and values that must match in order to receive traffic for this service; if empty"
},
"javaType": "java.util.Map\u003cString,String\u003e"
},
"sessionAffinity": {
"type": "string",
"description": "enable client IP based session affinity; must be ClientIP or None; defaults to None; see http://releases.k8s.io/HEAD/docs/user-guide/services.md#virtual-ips-and-service-proxies"
},
"type": {
"type": "string",
"description": "type of this service; must be ClusterIP"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ServiceSpec"
},
"kubernetes_ServiceStatus": {
"type": "object",
"description": "",
"properties": {
"loadBalancer": {
"$ref": "#/definitions/kubernetes_LoadBalancerStatus",
"javaType": "io.fabric8.kubernetes.api.model.LoadBalancerStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.ServiceStatus"
},
"kubernetes_Status": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"code": {
"type": "integer",
"description": "suggested HTTP return code for this status; 0 if not set"
},
"details": {
"$ref": "#/definitions/kubernetes_StatusDetails",
"javaType": "io.fabric8.kubernetes.api.model.StatusDetails"
},
"kind": {
"type": "string",
"description": "",
"default": "Status",
"required": true
},
"message": {
"type": "string",
"description": "human-readable description of the status of this operation"
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
},
"reason": {
"type": "string",
"description": "machine-readable description of why this operation is in the 'Failure' status; if this value is empty there is no information available; a reason clarifies an HTTP status code but does not override it"
},
"status": {
"type": "string",
"description": "status of the operation; either Success"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Status"
},
"kubernetes_StatusCause": {
"type": "object",
"description": "",
"properties": {
"field": {
"type": "string",
"description": "field of the resource that has caused this error"
},
"message": {
"type": "string",
"description": "human-readable description of the cause of the error; this field may be presented as-is to a reader"
},
"reason": {
"type": "string",
"description": "machine-readable description of the cause of the error; if this value is empty there is no information available"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.StatusCause"
},
"kubernetes_StatusDetails": {
"type": "object",
"description": "",
"properties": {
"causes": {
"type": "array",
"description": "the Causes array includes more details associated with the StatusReason failure; not all StatusReasons may provide detailed causes",
"items": {
"$ref": "#/definitions/kubernetes_StatusCause",
"javaType": "io.fabric8.kubernetes.api.model.StatusCause"
}
},
"kind": {
"type": "string",
"description": "the kind attribute of the resource associated with the status StatusReason; on some operations may differ from the requested resource Kind; see http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds"
},
"name": {
"type": "string",
"description": "the name attribute of the resource associated with the status StatusReason (when there is a single name which can be described)"
},
"retryAfterSeconds": {
"type": "integer",
"description": "the number of seconds before the client should attempt to retry this operation"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.StatusDetails"
},
"kubernetes_TCPSocketAction": {
"type": "object",
"description": "",
"properties": {
"port": {
"$ref": "#/definitions/kubernetes_util_IntOrString",
"javaType": "io.fabric8.kubernetes.api.model.IntOrString"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.TCPSocketAction"
},
"kubernetes_TypeMeta": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "version of the schema the object should have; see http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources"
},
"kind": {
"type": "string",
"description": "kind of object"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.TypeMeta"
},
"kubernetes_Volume": {
"type": "object",
"description": "",
"properties": {
"awsElasticBlockStore": {
"$ref": "#/definitions/kubernetes_AWSElasticBlockStoreVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.AWSElasticBlockStoreVolumeSource"
},
"cephfs": {
"$ref": "#/definitions/kubernetes_CephFSVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.CephFSVolumeSource"
},
"emptyDir": {
"$ref": "#/definitions/kubernetes_EmptyDirVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.EmptyDirVolumeSource"
},
"gcePersistentDisk": {
"$ref": "#/definitions/kubernetes_GCEPersistentDiskVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.GCEPersistentDiskVolumeSource"
},
"gitRepo": {
"$ref": "#/definitions/kubernetes_GitRepoVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.GitRepoVolumeSource"
},
"glusterfs": {
"$ref": "#/definitions/kubernetes_GlusterfsVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.GlusterfsVolumeSource"
},
"hostPath": {
"$ref": "#/definitions/kubernetes_HostPathVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.HostPathVolumeSource"
},
"iscsi": {
"$ref": "#/definitions/kubernetes_ISCSIVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.ISCSIVolumeSource"
},
"metadata": {
"$ref": "#/definitions/kubernetes_MetadataVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.MetadataVolumeSource"
},
"name": {
"type": "string",
"description": "volume name; must be a DNS_LABEL and unique within the pod; see http://releases.k8s.io/HEAD/docs/user-guide/identifiers.md#names",
"maxLength": 63,
"pattern": "^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"
},
"nfs": {
"$ref": "#/definitions/kubernetes_NFSVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.NFSVolumeSource"
},
"persistentVolumeClaim": {
"$ref": "#/definitions/kubernetes_PersistentVolumeClaimVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeClaimVolumeSource"
},
"rbd": {
"$ref": "#/definitions/kubernetes_RBDVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.RBDVolumeSource"
},
"secret": {
"$ref": "#/definitions/kubernetes_SecretVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.SecretVolumeSource"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Volume"
},
"kubernetes_VolumeMount": {
"type": "object",
"description": "",
"properties": {
"mountPath": {
"type": "string",
"description": "path within the container at which the volume should be mounted"
},
"name": {
"type": "string",
"description": "name of the volume to mount"
},
"readOnly": {
"type": "boolean",
"description": "mounted read-only if true"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.VolumeMount"
},
"kubernetes_VolumeSource": {
"type": "object",
"description": "",
"properties": {
"awsElasticBlockStore": {
"$ref": "#/definitions/kubernetes_AWSElasticBlockStoreVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.AWSElasticBlockStoreVolumeSource"
},
"cephfs": {
"$ref": "#/definitions/kubernetes_CephFSVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.CephFSVolumeSource"
},
"emptyDir": {
"$ref": "#/definitions/kubernetes_EmptyDirVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.EmptyDirVolumeSource"
},
"gcePersistentDisk": {
"$ref": "#/definitions/kubernetes_GCEPersistentDiskVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.GCEPersistentDiskVolumeSource"
},
"gitRepo": {
"$ref": "#/definitions/kubernetes_GitRepoVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.GitRepoVolumeSource"
},
"glusterfs": {
"$ref": "#/definitions/kubernetes_GlusterfsVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.GlusterfsVolumeSource"
},
"hostPath": {
"$ref": "#/definitions/kubernetes_HostPathVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.HostPathVolumeSource"
},
"iscsi": {
"$ref": "#/definitions/kubernetes_ISCSIVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.ISCSIVolumeSource"
},
"metadata": {
"$ref": "#/definitions/kubernetes_MetadataVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.MetadataVolumeSource"
},
"nfs": {
"$ref": "#/definitions/kubernetes_NFSVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.NFSVolumeSource"
},
"persistentVolumeClaim": {
"$ref": "#/definitions/kubernetes_PersistentVolumeClaimVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeClaimVolumeSource"
},
"rbd": {
"$ref": "#/definitions/kubernetes_RBDVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.RBDVolumeSource"
},
"secret": {
"$ref": "#/definitions/kubernetes_SecretVolumeSource",
"javaType": "io.fabric8.kubernetes.api.model.SecretVolumeSource"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.VolumeSource"
},
"kubernetes_config_AuthInfo": {
"type": "object",
"description": "",
"properties": {
"client-certificate": {
"type": "string",
"description": ""
},
"client-certificate-data": {
"type": "string",
"description": ""
},
"client-key": {
"type": "string",
"description": ""
},
"client-key-data": {
"type": "string",
"description": ""
},
"extensions": {
"type": "array",
"description": "",
"items": {
"$ref": "#/definitions/kubernetes_config_NamedExtension",
"javaType": "io.fabric8.kubernetes.api.model.NamedExtension"
}
},
"password": {
"type": "string",
"description": ""
},
"token": {
"type": "string",
"description": ""
},
"username": {
"type": "string",
"description": ""
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.AuthInfo"
},
"kubernetes_config_Cluster": {
"type": "object",
"description": "",
"properties": {
"api-version": {
"type": "string",
"description": ""
},
"certificate-authority": {
"type": "string",
"description": ""
},
"certificate-authority-data": {
"type": "string",
"description": ""
},
"extensions": {
"type": "array",
"description": "",
"items": {
"$ref": "#/definitions/kubernetes_config_NamedExtension",
"javaType": "io.fabric8.kubernetes.api.model.NamedExtension"
}
},
"insecure-skip-tls-verify": {
"type": "boolean",
"description": ""
},
"server": {
"type": "string",
"description": ""
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Cluster"
},
"kubernetes_config_Config": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": ""
},
"clusters": {
"type": "array",
"description": "",
"items": {
"$ref": "#/definitions/kubernetes_config_NamedCluster",
"javaType": "io.fabric8.kubernetes.api.model.NamedCluster"
}
},
"contexts": {
"type": "array",
"description": "",
"items": {
"$ref": "#/definitions/kubernetes_config_NamedContext",
"javaType": "io.fabric8.kubernetes.api.model.NamedContext"
}
},
"current-context": {
"type": "string",
"description": ""
},
"extensions": {
"type": "array",
"description": "",
"items": {
"$ref": "#/definitions/kubernetes_config_NamedExtension",
"javaType": "io.fabric8.kubernetes.api.model.NamedExtension"
}
},
"kind": {
"type": "string",
"description": ""
},
"preferences": {
"$ref": "#/definitions/kubernetes_config_Preferences",
"javaType": "io.fabric8.kubernetes.api.model.Preferences"
},
"users": {
"type": "array",
"description": "",
"items": {
"$ref": "#/definitions/kubernetes_config_NamedAuthInfo",
"javaType": "io.fabric8.kubernetes.api.model.NamedAuthInfo"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Config"
},
"kubernetes_config_Context": {
"type": "object",
"description": "",
"properties": {
"cluster": {
"type": "string",
"description": ""
},
"extensions": {
"type": "array",
"description": "",
"items": {
"$ref": "#/definitions/kubernetes_config_NamedExtension",
"javaType": "io.fabric8.kubernetes.api.model.NamedExtension"
}
},
"namespace": {
"type": "string",
"description": ""
},
"user": {
"type": "string",
"description": ""
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Context"
},
"kubernetes_config_NamedAuthInfo": {
"type": "object",
"description": "",
"properties": {
"name": {
"type": "string",
"description": ""
},
"user": {
"$ref": "#/definitions/kubernetes_config_AuthInfo",
"javaType": "io.fabric8.kubernetes.api.model.AuthInfo"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NamedAuthInfo"
},
"kubernetes_config_NamedCluster": {
"type": "object",
"description": "",
"properties": {
"cluster": {
"$ref": "#/definitions/kubernetes_config_Cluster",
"javaType": "io.fabric8.kubernetes.api.model.Cluster"
},
"name": {
"type": "string",
"description": ""
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NamedCluster"
},
"kubernetes_config_NamedContext": {
"type": "object",
"description": "",
"properties": {
"context": {
"$ref": "#/definitions/kubernetes_config_Context",
"javaType": "io.fabric8.kubernetes.api.model.Context"
},
"name": {
"type": "string",
"description": ""
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NamedContext"
},
"kubernetes_config_NamedExtension": {
"type": "object",
"description": "",
"properties": {
"extension": {
"$ref": "#/definitions/kubernetes_runtime_RawExtension",
"javaType": "io.fabric8.kubernetes.api.model.HasMetadata"
},
"name": {
"type": "string",
"description": ""
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.NamedExtension"
},
"kubernetes_config_Preferences": {
"type": "object",
"description": "",
"properties": {
"colors": {
"type": "boolean",
"description": ""
},
"extensions": {
"type": "array",
"description": "",
"items": {
"$ref": "#/definitions/kubernetes_config_NamedExtension",
"javaType": "io.fabric8.kubernetes.api.model.NamedExtension"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Preferences"
},
"kubernetes_resource_Quantity": {
"type": "object",
"description": "",
"properties": {
"Amount": {
"$ref": "#/definitions/speter_inf_Dec",
"javaType": "io.fabric8.openshift.api.model.Dec"
},
"Format": {
"type": "string",
"description": ""
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.Quantity"
},
"kubernetes_runtime_RawExtension": {
"type": "object",
"description": "",
"properties": {
"RawJSON": {
"type": "string",
"description": ""
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.HasMetadata"
},
"kubernetes_util_IntOrString": {
"type": "object",
"description": "",
"properties": {
"IntVal": {
"type": "integer",
"description": ""
},
"Kind": {
"type": "integer",
"description": ""
},
"StrVal": {
"type": "string",
"description": ""
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.IntOrString"
},
"kubernetes_watch_WatchEvent": {
"type": "object",
"description": "",
"properties": {
"object": {
"$ref": "#/definitions/kubernetes_runtime_RawExtension",
"javaType": "io.fabric8.kubernetes.api.model.HasMetadata"
},
"type": {
"type": "string",
"description": "the type of watch event; may be ADDED"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.kubernetes.api.model.WatchEvent"
},
"os_authorization_AuthorizationAttributes": {
"type": "object",
"description": "",
"properties": {
"content": {
"$ref": "#/definitions/kubernetes_runtime_RawExtension",
"javaType": "io.fabric8.kubernetes.api.model.HasMetadata"
},
"namespace": {
"type": "string",
"description": "namespace of the action being requested"
},
"resource": {
"type": "string",
"description": "one of the existing resource types"
},
"resourceName": {
"type": "string",
"description": "name of the resource being requested for a get or delete"
},
"verb": {
"type": "string",
"description": "one of get"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.AuthorizationAttributes"
},
"os_authorization_ClusterPolicy": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "ClusterPolicy",
"required": true
},
"lastModified": {
"type": "string",
"description": "last time any part of the object was created"
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"roles": {
"type": "array",
"description": "all the roles held by this policy",
"items": {
"$ref": "#/definitions/os_authorization_NamedClusterRole",
"javaType": "io.fabric8.openshift.api.model.NamedClusterRole"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ClusterPolicy",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_authorization_ClusterPolicyBinding": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "ClusterPolicyBinding",
"required": true
},
"lastModified": {
"type": "string",
"description": "last time any part of the object was created"
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"policyRef": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"roleBindings": {
"type": "array",
"description": "all the role bindings held by this policy",
"items": {
"$ref": "#/definitions/os_authorization_NamedClusterRoleBinding",
"javaType": "io.fabric8.openshift.api.model.NamedClusterRoleBinding"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ClusterPolicyBinding",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_authorization_ClusterPolicyBindingList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of cluster policy bindings",
"items": {
"$ref": "#/definitions/os_authorization_ClusterPolicyBinding",
"javaType": "io.fabric8.openshift.api.model.ClusterPolicyBinding"
}
},
"kind": {
"type": "string",
"description": "",
"default": "ClusterPolicyBindingList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ClusterPolicyBindingList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_authorization_ClusterPolicyList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of cluster policies",
"items": {
"$ref": "#/definitions/os_authorization_ClusterPolicy",
"javaType": "io.fabric8.openshift.api.model.ClusterPolicy"
}
},
"kind": {
"type": "string",
"description": "",
"default": "ClusterPolicyList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ClusterPolicyList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_authorization_ClusterRole": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "ClusterRole",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"rules": {
"type": "array",
"description": "list of policy rules",
"items": {
"$ref": "#/definitions/os_authorization_PolicyRule",
"javaType": "io.fabric8.openshift.api.model.PolicyRule"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ClusterRole",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_authorization_ClusterRoleBinding": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"groupNames": {
"type": "array",
"description": "all the groups directly bound to the role",
"items": {
"type": "string",
"description": "all the groups directly bound to the role"
}
},
"kind": {
"type": "string",
"description": "",
"default": "ClusterRoleBinding",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"roleRef": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"subjects": {
"type": "array",
"description": "references to subjects bound to the role. Only User",
"items": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
}
},
"userNames": {
"type": "array",
"description": "all user names directly bound to the role",
"items": {
"type": "string",
"description": "all user names directly bound to the role"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ClusterRoleBinding",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_authorization_ClusterRoleBindingList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of cluster role bindings",
"items": {
"$ref": "#/definitions/os_authorization_ClusterRoleBinding",
"javaType": "io.fabric8.openshift.api.model.ClusterRoleBinding"
}
},
"kind": {
"type": "string",
"description": "",
"default": "ClusterRoleBindingList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ClusterRoleBindingList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_authorization_LocalSubjectAccessReview": {
"type": "object",
"description": "",
"properties": {
"TypeMeta": {
"$ref": "#/definitions/kubernetes_TypeMeta",
"javaType": "io.fabric8.kubernetes.api.model.TypeMeta"
},
"content": {
"$ref": "#/definitions/kubernetes_runtime_RawExtension",
"javaType": "io.fabric8.kubernetes.api.model.HasMetadata"
},
"groups": {
"type": "array",
"description": "optional",
"items": {
"type": "string",
"description": "optional"
}
},
"namespace": {
"type": "string",
"description": "namespace of the action being requested"
},
"resource": {
"type": "string",
"description": "one of the existing resource types"
},
"resourceName": {
"type": "string",
"description": "name of the resource being requested for a get or delete"
},
"user": {
"type": "string",
"description": "optional"
},
"verb": {
"type": "string",
"description": "one of get"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.LocalSubjectAccessReview"
},
"os_authorization_NamedClusterRole": {
"type": "object",
"description": "",
"properties": {
"name": {
"type": "string",
"description": "name of the cluster role"
},
"role": {
"$ref": "#/definitions/os_authorization_ClusterRole",
"javaType": "io.fabric8.openshift.api.model.ClusterRole"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.NamedClusterRole"
},
"os_authorization_NamedClusterRoleBinding": {
"type": "object",
"description": "",
"properties": {
"name": {
"type": "string",
"description": "name of the cluster role binding"
},
"roleBinding": {
"$ref": "#/definitions/os_authorization_ClusterRoleBinding",
"javaType": "io.fabric8.openshift.api.model.ClusterRoleBinding"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.NamedClusterRoleBinding"
},
"os_authorization_NamedRole": {
"type": "object",
"description": "",
"properties": {
"name": {
"type": "string",
"description": "name of the role"
},
"role": {
"$ref": "#/definitions/os_authorization_Role",
"javaType": "io.fabric8.openshift.api.model.Role"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.NamedRole"
},
"os_authorization_NamedRoleBinding": {
"type": "object",
"description": "",
"properties": {
"name": {
"type": "string",
"description": "name of the roleBinding"
},
"roleBinding": {
"$ref": "#/definitions/os_authorization_RoleBinding",
"javaType": "io.fabric8.openshift.api.model.RoleBinding"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.NamedRoleBinding"
},
"os_authorization_Policy": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "Policy",
"required": true
},
"lastModified": {
"type": "string",
"description": "last time that any part of the policy was created"
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"roles": {
"type": "array",
"description": "roles held by this policy",
"items": {
"$ref": "#/definitions/os_authorization_NamedRole",
"javaType": "io.fabric8.openshift.api.model.NamedRole"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.Policy",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_authorization_PolicyBinding": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "PolicyBinding",
"required": true
},
"lastModified": {
"type": "string",
"description": "last time that any part of the object was created"
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"policyRef": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"roleBindings": {
"type": "array",
"description": "all roleBindings held by this policyBinding",
"items": {
"$ref": "#/definitions/os_authorization_NamedRoleBinding",
"javaType": "io.fabric8.openshift.api.model.NamedRoleBinding"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.PolicyBinding",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_authorization_PolicyBindingList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of policy bindings",
"items": {
"$ref": "#/definitions/os_authorization_PolicyBinding",
"javaType": "io.fabric8.openshift.api.model.PolicyBinding"
}
},
"kind": {
"type": "string",
"description": "",
"default": "PolicyBindingList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.PolicyBindingList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_authorization_PolicyList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of policies",
"items": {
"$ref": "#/definitions/os_authorization_Policy",
"javaType": "io.fabric8.openshift.api.model.Policy"
}
},
"kind": {
"type": "string",
"description": "",
"default": "PolicyList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.PolicyList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_authorization_PolicyRule": {
"type": "object",
"description": "",
"properties": {
"attributeRestrictions": {
"$ref": "#/definitions/kubernetes_runtime_RawExtension",
"javaType": "io.fabric8.kubernetes.api.model.HasMetadata"
},
"nonResourceURLs": {
"type": "array",
"description": "set of partial urls that a user should have access to. *s are allowed",
"items": {
"type": "string",
"description": "set of partial urls that a user should have access to. *s are allowed"
}
},
"resourceNames": {
"type": "array",
"description": "optional white list of names that the rule applies to. An empty set means that everything is allowed.",
"items": {
"type": "string",
"description": "optional white list of names that the rule applies to. An empty set means that everything is allowed."
}
},
"resources": {
"type": "array",
"description": "list of resources this rule applies to. * represents all resources.",
"items": {
"type": "string",
"description": "list of resources this rule applies to. * represents all resources."
}
},
"verbs": {
"type": "array",
"description": "list of verbs that apply to ALL the resourceKinds and attributeRestrictions contained in this rule. The verb * represents all kinds.",
"items": {
"type": "string",
"description": "list of verbs that apply to ALL the resourceKinds and attributeRestrictions contained in this rule. The verb * represents all kinds."
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.PolicyRule"
},
"os_authorization_Role": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "Role",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"rules": {
"type": "array",
"description": "all the rules for this role",
"items": {
"$ref": "#/definitions/os_authorization_PolicyRule",
"javaType": "io.fabric8.openshift.api.model.PolicyRule"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.Role",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_authorization_RoleBinding": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"groupNames": {
"type": "array",
"description": "all the groups directly bound to the role",
"items": {
"type": "string",
"description": "all the groups directly bound to the role"
}
},
"kind": {
"type": "string",
"description": "",
"default": "RoleBinding",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"roleRef": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"subjects": {
"type": "array",
"description": "references to subjects bound to the role. Only User",
"items": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
}
},
"userNames": {
"type": "array",
"description": "all the usernames directly bound to the role",
"items": {
"type": "string",
"description": "all the usernames directly bound to the role"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.RoleBinding",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_authorization_RoleBindingList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of role bindings",
"items": {
"$ref": "#/definitions/os_authorization_RoleBinding",
"javaType": "io.fabric8.openshift.api.model.RoleBinding"
}
},
"kind": {
"type": "string",
"description": "",
"default": "RoleBindingList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.RoleBindingList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_authorization_RoleList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of roles",
"items": {
"$ref": "#/definitions/os_authorization_Role",
"javaType": "io.fabric8.openshift.api.model.Role"
}
},
"kind": {
"type": "string",
"description": "",
"default": "RoleList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.RoleList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_authorization_SubjectAccessReview": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"content": {
"$ref": "#/definitions/kubernetes_runtime_RawExtension",
"javaType": "io.fabric8.kubernetes.api.model.HasMetadata"
},
"groups": {
"type": "array",
"description": "optional",
"items": {
"type": "string",
"description": "optional"
}
},
"kind": {
"type": "string",
"description": "",
"default": "SubjectAccessReview",
"required": true
},
"namespace": {
"type": "string",
"description": "namespace of the action being requested"
},
"resource": {
"type": "string",
"description": "one of the existing resource types"
},
"resourceName": {
"type": "string",
"description": "name of the resource being requested for a get or delete"
},
"user": {
"type": "string",
"description": "optional"
},
"verb": {
"type": "string",
"description": "one of get"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.SubjectAccessReview"
},
"os_authorization_SubjectAccessReviewResponse": {
"type": "object",
"description": "",
"properties": {
"allowed": {
"type": "boolean",
"description": "true if the action would be allowed"
},
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "SubjectAccessReviewResponse",
"required": true
},
"namespace": {
"type": "string",
"description": "the namespace used for the access review"
},
"reason": {
"type": "string",
"description": "reason is optional"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.SubjectAccessReviewResponse"
},
"os_build_Build": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "Build",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/os_build_BuildSpec",
"javaType": "io.fabric8.openshift.api.model.BuildSpec"
},
"status": {
"$ref": "#/definitions/os_build_BuildStatus",
"javaType": "io.fabric8.openshift.api.model.BuildStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.Build",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_build_BuildConfig": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "BuildConfig",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/os_build_BuildConfigSpec",
"javaType": "io.fabric8.openshift.api.model.BuildConfigSpec"
},
"status": {
"$ref": "#/definitions/os_build_BuildConfigStatus",
"javaType": "io.fabric8.openshift.api.model.BuildConfigStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.BuildConfig",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_build_BuildConfigList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of build configs",
"items": {
"$ref": "#/definitions/os_build_BuildConfig",
"javaType": "io.fabric8.openshift.api.model.BuildConfig"
}
},
"kind": {
"type": "string",
"description": "",
"default": "BuildConfigList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.BuildConfigList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_build_BuildConfigSpec": {
"type": "object",
"description": "",
"properties": {
"output": {
"$ref": "#/definitions/os_build_BuildOutput",
"javaType": "io.fabric8.openshift.api.model.BuildOutput"
},
"resources": {
"$ref": "#/definitions/kubernetes_ResourceRequirements",
"javaType": "io.fabric8.kubernetes.api.model.ResourceRequirements"
},
"revision": {
"$ref": "#/definitions/os_build_SourceRevision",
"javaType": "io.fabric8.openshift.api.model.SourceRevision"
},
"serviceAccount": {
"type": "string",
"description": "the name of the service account to use to run pods created by the build"
},
"source": {
"$ref": "#/definitions/os_build_BuildSource",
"javaType": "io.fabric8.openshift.api.model.BuildSource"
},
"strategy": {
"$ref": "#/definitions/os_build_BuildStrategy",
"javaType": "io.fabric8.openshift.api.model.BuildStrategy"
},
"triggers": {
"type": "array",
"description": "determines how new builds can be launched from a build config. if no triggers are defined",
"items": {
"$ref": "#/definitions/os_build_BuildTriggerPolicy",
"javaType": "io.fabric8.openshift.api.model.BuildTriggerPolicy"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.BuildConfigSpec"
},
"os_build_BuildConfigStatus": {
"type": "object",
"description": "",
"properties": {
"lastVersion": {
"type": "integer",
"description": "used to inform about number of last triggered build"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.BuildConfigStatus"
},
"os_build_BuildList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of builds",
"items": {
"$ref": "#/definitions/os_build_Build",
"javaType": "io.fabric8.openshift.api.model.Build"
}
},
"kind": {
"type": "string",
"description": "",
"default": "BuildList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.BuildList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_build_BuildOutput": {
"type": "object",
"description": "",
"properties": {
"pushSecret": {
"$ref": "#/definitions/kubernetes_LocalObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.LocalObjectReference"
},
"to": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.BuildOutput"
},
"os_build_BuildRequest": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"from": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"kind": {
"type": "string",
"description": "",
"default": "BuildRequest",
"required": true
},
"lastVersion": {
"type": "integer",
"description": "LastVersion of the BuildConfig that triggered this build"
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"revision": {
"$ref": "#/definitions/os_build_SourceRevision",
"javaType": "io.fabric8.openshift.api.model.SourceRevision"
},
"triggeredByImage": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.BuildRequest",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_build_BuildSource": {
"type": "object",
"description": "",
"properties": {
"contextDir": {
"type": "string",
"description": "specifies sub-directory where the source code for the application exists"
},
"git": {
"$ref": "#/definitions/os_build_GitBuildSource",
"javaType": "io.fabric8.openshift.api.model.GitBuildSource"
},
"sourceSecret": {
"$ref": "#/definitions/kubernetes_LocalObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.LocalObjectReference"
},
"type": {
"type": "string",
"description": "type of source control management system"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.BuildSource"
},
"os_build_BuildSpec": {
"type": "object",
"description": "",
"properties": {
"output": {
"$ref": "#/definitions/os_build_BuildOutput",
"javaType": "io.fabric8.openshift.api.model.BuildOutput"
},
"resources": {
"$ref": "#/definitions/kubernetes_ResourceRequirements",
"javaType": "io.fabric8.kubernetes.api.model.ResourceRequirements"
},
"revision": {
"$ref": "#/definitions/os_build_SourceRevision",
"javaType": "io.fabric8.openshift.api.model.SourceRevision"
},
"serviceAccount": {
"type": "string",
"description": "the name of the service account to use to run pods created by the build"
},
"source": {
"$ref": "#/definitions/os_build_BuildSource",
"javaType": "io.fabric8.openshift.api.model.BuildSource"
},
"strategy": {
"$ref": "#/definitions/os_build_BuildStrategy",
"javaType": "io.fabric8.openshift.api.model.BuildStrategy"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.BuildSpec"
},
"os_build_BuildStatus": {
"type": "object",
"description": "",
"properties": {
"cancelled": {
"type": "boolean",
"description": "describes if a canceling event was triggered for the build"
},
"completionTimestamp": {
"type": "string",
"description": "server time when the pod running this build stopped running"
},
"config": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"duration": {
"type": "integer",
"description": "amount of time the build has been running",
"javaType": "Long"
},
"message": {
"type": "string",
"description": "human-readable message indicating details about why the build has this status"
},
"phase": {
"type": "string",
"description": "observed point in the build lifecycle"
},
"startTimestamp": {
"type": "string",
"description": "server time when this build started running in a pod"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.BuildStatus"
},
"os_build_BuildStrategy": {
"type": "object",
"description": "",
"properties": {
"customStrategy": {
"$ref": "#/definitions/os_build_CustomBuildStrategy",
"javaType": "io.fabric8.openshift.api.model.CustomBuildStrategy"
},
"dockerStrategy": {
"$ref": "#/definitions/os_build_DockerBuildStrategy",
"javaType": "io.fabric8.openshift.api.model.DockerBuildStrategy"
},
"sourceStrategy": {
"$ref": "#/definitions/os_build_SourceBuildStrategy",
"javaType": "io.fabric8.openshift.api.model.SourceBuildStrategy"
},
"type": {
"type": "string",
"description": "identifies the type of build strategy"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.BuildStrategy"
},
"os_build_BuildTriggerPolicy": {
"type": "object",
"description": "",
"properties": {
"generic": {
"$ref": "#/definitions/os_build_WebHookTrigger",
"javaType": "io.fabric8.openshift.api.model.WebHookTrigger"
},
"github": {
"$ref": "#/definitions/os_build_WebHookTrigger",
"javaType": "io.fabric8.openshift.api.model.WebHookTrigger"
},
"imageChange": {
"$ref": "#/definitions/os_build_ImageChangeTrigger",
"javaType": "io.fabric8.openshift.api.model.ImageChangeTrigger"
},
"type": {
"type": "string",
"description": "type of build trigger"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.BuildTriggerPolicy"
},
"os_build_CustomBuildStrategy": {
"type": "object",
"description": "",
"properties": {
"env": {
"type": "array",
"description": "additional environment variables you want to pass into a builder container",
"items": {
"$ref": "#/definitions/kubernetes_EnvVar",
"javaType": "io.fabric8.kubernetes.api.model.EnvVar"
}
},
"exposeDockerSocket": {
"type": "boolean",
"description": "allow running Docker commands (and build Docker images) from inside the container"
},
"forcePull": {
"type": "boolean",
"description": "forces pulling of builder image from remote registry if true"
},
"from": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"pullSecret": {
"$ref": "#/definitions/kubernetes_LocalObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.LocalObjectReference"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.CustomBuildStrategy"
},
"os_build_DockerBuildStrategy": {
"type": "object",
"description": "",
"properties": {
"env": {
"type": "array",
"description": "additional environment variables you want to pass into a builder container",
"items": {
"$ref": "#/definitions/kubernetes_EnvVar",
"javaType": "io.fabric8.kubernetes.api.model.EnvVar"
}
},
"forcePull": {
"type": "boolean",
"description": "forces the source build to pull the image if true"
},
"from": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"noCache": {
"type": "boolean",
"description": "if true"
},
"pullSecret": {
"$ref": "#/definitions/kubernetes_LocalObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.LocalObjectReference"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.DockerBuildStrategy"
},
"os_build_GitBuildSource": {
"type": "object",
"description": "",
"properties": {
"httpProxy": {
"type": "string",
"description": "specifies a http proxy to be used during git clone operations"
},
"httpsProxy": {
"type": "string",
"description": "specifies a https proxy to be used during git clone operations"
},
"ref": {
"type": "string",
"description": "identifies the branch/tag/ref to build"
},
"uri": {
"type": "string",
"description": "points to the source that will be built"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.GitBuildSource"
},
"os_build_GitSourceRevision": {
"type": "object",
"description": "",
"properties": {
"author": {
"$ref": "#/definitions/os_build_SourceControlUser",
"javaType": "io.fabric8.openshift.api.model.SourceControlUser"
},
"commit": {
"type": "string",
"description": "hash identifying a specific commit"
},
"committer": {
"$ref": "#/definitions/os_build_SourceControlUser",
"javaType": "io.fabric8.openshift.api.model.SourceControlUser"
},
"message": {
"type": "string",
"description": "description of a specific commit"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.GitSourceRevision"
},
"os_build_ImageChangeTrigger": {
"type": "object",
"description": "",
"properties": {
"from": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"lastTriggeredImageID": {
"type": "string",
"description": "used internally to save last used image ID for build"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ImageChangeTrigger"
},
"os_build_SourceBuildStrategy": {
"type": "object",
"description": "",
"properties": {
"env": {
"type": "array",
"description": "additional environment variables you want to pass into a builder container",
"items": {
"$ref": "#/definitions/kubernetes_EnvVar",
"javaType": "io.fabric8.kubernetes.api.model.EnvVar"
}
},
"forcePull": {
"type": "boolean",
"description": "forces the source build to pull the image if true"
},
"from": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"incremental": {
"type": "boolean",
"description": "forces the source build to do incremental builds if true"
},
"pullSecret": {
"$ref": "#/definitions/kubernetes_LocalObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.LocalObjectReference"
},
"scripts": {
"type": "string",
"description": "location of the source scripts"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.SourceBuildStrategy"
},
"os_build_SourceControlUser": {
"type": "object",
"description": "",
"properties": {
"email": {
"type": "string",
"description": "e-mail of the source control user"
},
"name": {
"type": "string",
"description": "name of the source control user"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.SourceControlUser"
},
"os_build_SourceRevision": {
"type": "object",
"description": "",
"properties": {
"git": {
"$ref": "#/definitions/os_build_GitSourceRevision",
"javaType": "io.fabric8.openshift.api.model.GitSourceRevision"
},
"type": {
"type": "string",
"description": "type of the build source"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.SourceRevision"
},
"os_build_WebHookTrigger": {
"type": "object",
"description": "",
"properties": {
"secret": {
"type": "string",
"description": "secret used to validate requests"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.WebHookTrigger"
},
"os_deploy_CustomDeploymentStrategyParams": {
"type": "object",
"description": "",
"properties": {
"command": {
"type": "array",
"description": "optionally overrides the container command (default is specified by the image)",
"items": {
"type": "string",
"description": "optionally overrides the container command (default is specified by the image)"
}
},
"environment": {
"type": "array",
"description": "environment variables provided to the deployment process container",
"items": {
"$ref": "#/definitions/kubernetes_EnvVar",
"javaType": "io.fabric8.kubernetes.api.model.EnvVar"
}
},
"image": {
"type": "string",
"description": "a Docker image which can carry out a deployment"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.CustomDeploymentStrategyParams"
},
"os_deploy_DeploymentCause": {
"type": "object",
"description": "",
"properties": {
"imageTrigger": {
"$ref": "#/definitions/os_deploy_DeploymentCauseImageTrigger",
"javaType": "io.fabric8.openshift.api.model.DeploymentCauseImageTrigger"
},
"type": {
"type": "string",
"description": "the type of trigger that resulted in a new deployment"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.DeploymentCause"
},
"os_deploy_DeploymentCauseImageTrigger": {
"type": "object",
"description": "",
"properties": {
"from": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.DeploymentCauseImageTrigger"
},
"os_deploy_DeploymentConfig": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "DeploymentConfig",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/os_deploy_DeploymentConfigSpec",
"javaType": "io.fabric8.openshift.api.model.DeploymentConfigSpec"
},
"status": {
"$ref": "#/definitions/os_deploy_DeploymentConfigStatus",
"javaType": "io.fabric8.openshift.api.model.DeploymentConfigStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.DeploymentConfig",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_deploy_DeploymentConfigList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "a list of deployment configs",
"items": {
"$ref": "#/definitions/os_deploy_DeploymentConfig",
"javaType": "io.fabric8.openshift.api.model.DeploymentConfig"
}
},
"kind": {
"type": "string",
"description": "",
"default": "DeploymentConfigList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.DeploymentConfigList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_deploy_DeploymentConfigSpec": {
"type": "object",
"description": "",
"properties": {
"replicas": {
"type": "integer",
"description": "the desired number of replicas"
},
"selector": {
"type": "object",
"description": "a label query over pods that should match the replicas count",
"additionalProperties": {
"type": "string",
"description": "a label query over pods that should match the replicas count"
},
"javaType": "java.util.Map\u003cString,String\u003e"
},
"strategy": {
"$ref": "#/definitions/os_deploy_DeploymentStrategy",
"javaType": "io.fabric8.openshift.api.model.DeploymentStrategy"
},
"template": {
"$ref": "#/definitions/kubernetes_PodTemplateSpec",
"javaType": "io.fabric8.kubernetes.api.model.PodTemplateSpec"
},
"triggers": {
"type": "array",
"description": "how new deployments are triggered",
"items": {
"$ref": "#/definitions/os_deploy_DeploymentTriggerPolicy",
"javaType": "io.fabric8.openshift.api.model.DeploymentTriggerPolicy"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.DeploymentConfigSpec"
},
"os_deploy_DeploymentConfigStatus": {
"type": "object",
"description": "",
"properties": {
"details": {
"$ref": "#/definitions/os_deploy_DeploymentDetails",
"javaType": "io.fabric8.openshift.api.model.DeploymentDetails"
},
"latestVersion": {
"type": "integer",
"description": "used to determine whether the current deployment is out of sync"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.DeploymentConfigStatus"
},
"os_deploy_DeploymentDetails": {
"type": "object",
"description": "",
"properties": {
"causes": {
"type": "array",
"description": "extended data associated with all the causes for creating a new deployment",
"items": {
"$ref": "#/definitions/os_deploy_DeploymentCause",
"javaType": "io.fabric8.openshift.api.model.DeploymentCause"
}
},
"message": {
"type": "string",
"description": "a user specified change message"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.DeploymentDetails"
},
"os_deploy_DeploymentStrategy": {
"type": "object",
"description": "",
"properties": {
"customParams": {
"$ref": "#/definitions/os_deploy_CustomDeploymentStrategyParams",
"javaType": "io.fabric8.openshift.api.model.CustomDeploymentStrategyParams"
},
"recreateParams": {
"$ref": "#/definitions/os_deploy_RecreateDeploymentStrategyParams",
"javaType": "io.fabric8.openshift.api.model.RecreateDeploymentStrategyParams"
},
"resources": {
"$ref": "#/definitions/kubernetes_ResourceRequirements",
"javaType": "io.fabric8.kubernetes.api.model.ResourceRequirements"
},
"rollingParams": {
"$ref": "#/definitions/os_deploy_RollingDeploymentStrategyParams",
"javaType": "io.fabric8.openshift.api.model.RollingDeploymentStrategyParams"
},
"type": {
"type": "string",
"description": "the name of a deployment strategy"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.DeploymentStrategy"
},
"os_deploy_DeploymentTriggerImageChangeParams": {
"type": "object",
"description": "",
"properties": {
"automatic": {
"type": "boolean",
"description": "whether detection of a new tag value should trigger a deployment"
},
"containerNames": {
"type": "array",
"description": "restricts tag updates to a set of container names in the pod",
"items": {
"type": "string",
"description": "restricts tag updates to a set of container names in the pod"
}
},
"from": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"lastTriggeredImage": {
"type": "string",
"description": "the last image to be triggered"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.DeploymentTriggerImageChangeParams"
},
"os_deploy_DeploymentTriggerPolicy": {
"type": "object",
"description": "",
"properties": {
"imageChangeParams": {
"$ref": "#/definitions/os_deploy_DeploymentTriggerImageChangeParams",
"javaType": "io.fabric8.openshift.api.model.DeploymentTriggerImageChangeParams"
},
"type": {
"type": "string",
"description": "the type of the trigger"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.DeploymentTriggerPolicy"
},
"os_deploy_ExecNewPodHook": {
"type": "object",
"description": "",
"properties": {
"command": {
"type": "array",
"description": "the hook command and its arguments",
"items": {
"type": "string",
"description": "the hook command and its arguments"
}
},
"containerName": {
"type": "string",
"description": "the name of a container from the pod template whose image will be used for the hook container"
},
"env": {
"type": "array",
"description": "environment variables provided to the hook container",
"items": {
"$ref": "#/definitions/kubernetes_EnvVar",
"javaType": "io.fabric8.kubernetes.api.model.EnvVar"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ExecNewPodHook"
},
"os_deploy_LifecycleHook": {
"type": "object",
"description": "",
"properties": {
"execNewPod": {
"$ref": "#/definitions/os_deploy_ExecNewPodHook",
"javaType": "io.fabric8.openshift.api.model.ExecNewPodHook"
},
"failurePolicy": {
"type": "string",
"description": "what action to take if the hook fails"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.LifecycleHook"
},
"os_deploy_RecreateDeploymentStrategyParams": {
"type": "object",
"description": "",
"properties": {
"post": {
"$ref": "#/definitions/os_deploy_LifecycleHook",
"javaType": "io.fabric8.openshift.api.model.LifecycleHook"
},
"pre": {
"$ref": "#/definitions/os_deploy_LifecycleHook",
"javaType": "io.fabric8.openshift.api.model.LifecycleHook"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.RecreateDeploymentStrategyParams"
},
"os_deploy_RollingDeploymentStrategyParams": {
"type": "object",
"description": "",
"properties": {
"intervalSeconds": {
"type": "integer",
"description": "the time to wait between polling deployment status after update",
"javaType": "Long"
},
"post": {
"$ref": "#/definitions/os_deploy_LifecycleHook",
"javaType": "io.fabric8.openshift.api.model.LifecycleHook"
},
"pre": {
"$ref": "#/definitions/os_deploy_LifecycleHook",
"javaType": "io.fabric8.openshift.api.model.LifecycleHook"
},
"timeoutSeconds": {
"type": "integer",
"description": "the time to wait for updates before giving up",
"javaType": "Long"
},
"updatePercent": {
"type": "integer",
"description": "the percentage of replicas to scale up or down each interval (negative value switches scale order to down/up instead of up/down)"
},
"updatePeriodSeconds": {
"type": "integer",
"description": "the time to wait between individual pod updates",
"javaType": "Long"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.RollingDeploymentStrategyParams"
},
"os_image_Image": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"dockerImageManifest": {
"type": "string",
"description": "raw JSON of the manifest"
},
"dockerImageMetadata": {
"$ref": "#/definitions/kubernetes_runtime_RawExtension",
"javaType": "io.fabric8.kubernetes.api.model.HasMetadata"
},
"dockerImageMetadataVersion": {
"type": "string",
"description": "conveys version of the object"
},
"dockerImageReference": {
"type": "string",
"description": "string that can be used to pull this image"
},
"kind": {
"type": "string",
"description": "",
"default": "Image",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.Image",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_image_ImageList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of image objects",
"items": {
"$ref": "#/definitions/os_image_Image",
"javaType": "io.fabric8.openshift.api.model.Image"
}
},
"kind": {
"type": "string",
"description": "",
"default": "ImageList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ImageList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_image_ImageStream": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "ImageStream",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/os_image_ImageStreamSpec",
"javaType": "io.fabric8.openshift.api.model.ImageStreamSpec"
},
"status": {
"$ref": "#/definitions/os_image_ImageStreamStatus",
"javaType": "io.fabric8.openshift.api.model.ImageStreamStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ImageStream",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_image_ImageStreamList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of image stream objects",
"items": {
"$ref": "#/definitions/os_image_ImageStream",
"javaType": "io.fabric8.openshift.api.model.ImageStream"
}
},
"kind": {
"type": "string",
"description": "",
"default": "ImageStreamList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ImageStreamList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_image_ImageStreamSpec": {
"type": "object",
"description": "",
"properties": {
"dockerImageRepository": {
"type": "string",
"description": "optional field if specified this stream is backed by a Docker repository on this server"
},
"tags": {
"type": "array",
"description": "map arbitrary string values to specific image locators",
"items": {
"$ref": "#/definitions/os_image_NamedTagReference",
"javaType": "io.fabric8.openshift.api.model.NamedTagReference"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ImageStreamSpec"
},
"os_image_ImageStreamStatus": {
"type": "object",
"description": "",
"properties": {
"dockerImageRepository": {
"type": "string",
"description": "represents the effective location this stream may be accessed at"
},
"tags": {
"type": "array",
"description": "historical record of images associated with each tag",
"items": {
"$ref": "#/definitions/os_image_NamedTagEventList",
"javaType": "io.fabric8.openshift.api.model.NamedTagEventList"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ImageStreamStatus"
},
"os_image_NamedTagEventList": {
"type": "object",
"description": "",
"properties": {
"items": {
"type": "array",
"description": "list of tag events related to the tag",
"items": {
"$ref": "#/definitions/os_image_TagEvent",
"javaType": "io.fabric8.openshift.api.model.TagEvent"
}
},
"tag": {
"type": "string",
"description": "the tag"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.NamedTagEventList"
},
"os_image_NamedTagReference": {
"type": "object",
"description": "",
"properties": {
"annotations": {
"type": "object",
"description": "annotations associated with images using this tag",
"additionalProperties": {
"type": "string",
"description": "annotations associated with images using this tag"
},
"javaType": "java.util.Map\u003cString,String\u003e"
},
"from": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
},
"name": {
"type": "string",
"description": "name of tag"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.NamedTagReference"
},
"os_image_TagEvent": {
"type": "object",
"description": "",
"properties": {
"created": {
"type": "string",
"description": "when the event was created"
},
"dockerImageReference": {
"type": "string",
"description": "the string that can be used to pull this image"
},
"image": {
"type": "string",
"description": "the image"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.TagEvent"
},
"os_oauth_OAuthAccessToken": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"authorizeToken": {
"type": "string",
"description": "contains the token that authorized this token"
},
"clientName": {
"type": "string",
"description": "references the client that created this token"
},
"expiresIn": {
"type": "integer",
"description": "is the seconds from creation time before this token expires",
"javaType": "Long"
},
"kind": {
"type": "string",
"description": "",
"default": "OAuthAccessToken",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"redirectURI": {
"type": "string",
"description": "redirection URI associated with the token"
},
"refreshToken": {
"type": "string",
"description": "optional value by which this token can be renewed"
},
"scopes": {
"type": "array",
"description": "list of requested scopes",
"items": {
"type": "string",
"description": "list of requested scopes"
}
},
"userName": {
"type": "string",
"description": "user name associated with this token"
},
"userUID": {
"type": "string",
"description": "unique UID associated with this token"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.OAuthAccessToken",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_oauth_OAuthAccessTokenList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of oauth access tokens",
"items": {
"$ref": "#/definitions/os_oauth_OAuthAccessToken",
"javaType": "io.fabric8.openshift.api.model.OAuthAccessToken"
}
},
"kind": {
"type": "string",
"description": "",
"default": "OAuthAccessTokenList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.OAuthAccessTokenList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_oauth_OAuthAuthorizeToken": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"clientName": {
"type": "string",
"description": "references the client that created this token"
},
"expiresIn": {
"type": "integer",
"description": "seconds from creation time before this token expires",
"javaType": "Long"
},
"kind": {
"type": "string",
"description": "",
"default": "OAuthAuthorizeToken",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"redirectURI": {
"type": "string",
"description": "redirection URI associated with the token"
},
"scopes": {
"type": "array",
"description": "list of requested scopes",
"items": {
"type": "string",
"description": "list of requested scopes"
}
},
"state": {
"type": "string",
"description": "state data from request"
},
"userName": {
"type": "string",
"description": "user name associated with this token"
},
"userUID": {
"type": "string",
"description": "unique UID associated with this token. userUID and userName must both match for this token to be valid"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.OAuthAuthorizeToken",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_oauth_OAuthAuthorizeTokenList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of oauth authorization tokens",
"items": {
"$ref": "#/definitions/os_oauth_OAuthAuthorizeToken",
"javaType": "io.fabric8.openshift.api.model.OAuthAuthorizeToken"
}
},
"kind": {
"type": "string",
"description": "",
"default": "OAuthAuthorizeTokenList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.OAuthAuthorizeTokenList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_oauth_OAuthClient": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "OAuthClient",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"redirectURIs": {
"type": "array",
"description": "valid redirection URIs associated with a client",
"items": {
"type": "string",
"description": "valid redirection URIs associated with a client"
}
},
"respondWithChallenges": {
"type": "boolean",
"description": "indicates whether the client wants authentication needed responses made in the form of challenges instead of redirects"
},
"secret": {
"type": "string",
"description": "unique secret associated with a client"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.OAuthClient",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_oauth_OAuthClientAuthorization": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"clientName": {
"type": "string",
"description": "references the client that created this authorization"
},
"kind": {
"type": "string",
"description": "",
"default": "OAuthClientAuthorization",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"scopes": {
"type": "array",
"description": "list of granted scopes",
"items": {
"type": "string",
"description": "list of granted scopes"
}
},
"userName": {
"type": "string",
"description": "user name that authorized this client"
},
"userUID": {
"type": "string",
"description": "unique UID associated with this authorization. userUID and userName must both match for this authorization to be valid"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.OAuthClientAuthorization",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_oauth_OAuthClientAuthorizationList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of oauth client authorizations",
"items": {
"$ref": "#/definitions/os_oauth_OAuthClientAuthorization",
"javaType": "io.fabric8.openshift.api.model.OAuthClientAuthorization"
}
},
"kind": {
"type": "string",
"description": "",
"default": "OAuthClientAuthorizationList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.OAuthClientAuthorizationList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_oauth_OAuthClientList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of oauth clients",
"items": {
"$ref": "#/definitions/os_oauth_OAuthClient",
"javaType": "io.fabric8.openshift.api.model.OAuthClient"
}
},
"kind": {
"type": "string",
"description": "",
"default": "OAuthClientList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.OAuthClientList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_project_Project": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "Project",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/os_project_ProjectSpec",
"javaType": "io.fabric8.openshift.api.model.ProjectSpec"
},
"status": {
"$ref": "#/definitions/os_project_ProjectStatus",
"javaType": "io.fabric8.openshift.api.model.ProjectStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.Project",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_project_ProjectList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of projects",
"items": {
"$ref": "#/definitions/os_project_Project",
"javaType": "io.fabric8.openshift.api.model.Project"
}
},
"kind": {
"type": "string",
"description": "",
"default": "ProjectList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ProjectList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_project_ProjectRequest": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"description": {
"type": "string",
"description": "description to apply to a project"
},
"displayName": {
"type": "string",
"description": "display name to apply to a project"
},
"kind": {
"type": "string",
"description": "",
"default": "ProjectRequest",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ProjectRequest",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_project_ProjectSpec": {
"type": "object",
"description": "",
"properties": {
"finalizers": {
"type": "array",
"description": "an opaque list of values that must be empty to permanently remove object from storage",
"items": {
"type": "string",
"description": "an opaque list of values that must be empty to permanently remove object from storage"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ProjectSpec"
},
"os_project_ProjectStatus": {
"type": "object",
"description": "",
"properties": {
"phase": {
"type": "string",
"description": "phase is the current lifecycle phase of the project"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.ProjectStatus"
},
"os_route_Route": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "Route",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"spec": {
"$ref": "#/definitions/os_route_RouteSpec",
"javaType": "io.fabric8.openshift.api.model.RouteSpec"
},
"status": {
"$ref": "#/definitions/os_route_RouteStatus",
"javaType": "io.fabric8.openshift.api.model.RouteStatus"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.Route",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_route_RouteList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of routes",
"items": {
"$ref": "#/definitions/os_route_Route",
"javaType": "io.fabric8.openshift.api.model.Route"
}
},
"kind": {
"type": "string",
"description": "",
"default": "RouteList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.RouteList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_route_RouteSpec": {
"type": "object",
"description": "",
"properties": {
"host": {
"type": "string",
"description": "optional: alias/dns that points to the service"
},
"path": {
"type": "string",
"description": "optional: path that the router watches to route traffic to the service"
},
"tls": {
"$ref": "#/definitions/os_route_TLSConfig",
"javaType": "io.fabric8.openshift.api.model.TLSConfig"
},
"to": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.RouteSpec"
},
"os_route_RouteStatus": {
"type": "object",
"description": "",
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.RouteStatus"
},
"os_route_TLSConfig": {
"type": "object",
"description": "",
"properties": {
"caCertificate": {
"type": "string",
"description": "provides the cert authority certificate contents"
},
"certificate": {
"type": "string",
"description": "provides certificate contents"
},
"destinationCACertificate": {
"type": "string",
"description": "provides the contents of the ca certificate of the final destination. When using re-encrypt termination this file should be provided in order to have routers use it for health checks on the secure connection"
},
"key": {
"type": "string",
"description": "provides key file contents"
},
"termination": {
"type": "string",
"description": "indicates termination type. if not set"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.TLSConfig"
},
"os_template_Parameter": {
"type": "object",
"description": "",
"properties": {
"description": {
"type": "string",
"description": "optional: describes the parameter"
},
"from": {
"type": "string",
"description": "input value for the generator"
},
"generate": {
"type": "string",
"description": "optional: generate specifies the generator to be used to generate random string from an input value specified by the from field. the result string is stored in the value field. if not specified"
},
"name": {
"type": "string",
"description": "name of the parameter"
},
"required": {
"type": "boolean",
"description": "indicates the parameter must have a non-empty value or be generated"
},
"value": {
"type": "string",
"description": "optional: holds the parameter data. if specified"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.Parameter"
},
"os_template_Template": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "Template",
"required": true
},
"labels": {
"type": "object",
"description": "optional: list of lables that are applied to every object during the template to config transformation",
"additionalProperties": {
"type": "string",
"description": "optional: list of lables that are applied to every object during the template to config transformation"
},
"javaType": "java.util.Map\u003cString,String\u003e"
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"objects": {
"type": "array",
"description": "list of objects to include in the template",
"items": {
"$ref": "#/definitions/kubernetes_runtime_RawExtension",
"javaType": "io.fabric8.kubernetes.api.model.HasMetadata"
}
},
"parameters": {
"type": "array",
"description": "optional: list of parameters used during template to config transformation",
"items": {
"$ref": "#/definitions/os_template_Parameter",
"javaType": "io.fabric8.openshift.api.model.Parameter"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.Template",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_template_TemplateList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of templates",
"items": {
"$ref": "#/definitions/os_template_Template",
"javaType": "io.fabric8.openshift.api.model.Template"
}
},
"kind": {
"type": "string",
"description": "",
"default": "TemplateList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.TemplateList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_user_Group": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"kind": {
"type": "string",
"description": "",
"default": "Group",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"users": {
"type": "array",
"description": "list of users in this group",
"items": {
"type": "string",
"description": "list of users in this group"
}
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.Group",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_user_GroupList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of groups",
"items": {
"$ref": "#/definitions/os_user_Group",
"javaType": "io.fabric8.openshift.api.model.Group"
}
},
"kind": {
"type": "string",
"description": "",
"default": "GroupList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.GroupList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_user_Identity": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"extra": {
"type": "object",
"description": "extra information for this identity",
"additionalProperties": {
"type": "string",
"description": "extra information for this identity"
},
"javaType": "java.util.Map\u003cString,String\u003e"
},
"kind": {
"type": "string",
"description": "",
"default": "Identity",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"providerName": {
"type": "string",
"description": "source of identity information"
},
"providerUserName": {
"type": "string",
"description": "uniquely represents this identity in the scope of the provider"
},
"user": {
"$ref": "#/definitions/kubernetes_ObjectReference",
"javaType": "io.fabric8.kubernetes.api.model.ObjectReference"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.Identity",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_user_IdentityList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of identities",
"items": {
"$ref": "#/definitions/os_user_Identity",
"javaType": "io.fabric8.openshift.api.model.Identity"
}
},
"kind": {
"type": "string",
"description": "",
"default": "IdentityList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.IdentityList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"os_user_User": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"fullName": {
"type": "string",
"description": "full name of user"
},
"groups": {
"type": "array",
"description": "list of groups",
"items": {
"type": "string",
"description": "list of groups"
}
},
"identities": {
"type": "array",
"description": "list of identities",
"items": {
"type": "string",
"description": "list of identities"
}
},
"kind": {
"type": "string",
"description": "",
"default": "User",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.User",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.HasMetadata"
]
},
"os_user_UserList": {
"type": "object",
"description": "",
"properties": {
"apiVersion": {
"type": "string",
"description": "",
"default": "v1",
"required": true,
"enum": [
"v1"
]
},
"items": {
"type": "array",
"description": "list of users",
"items": {
"$ref": "#/definitions/os_user_User",
"javaType": "io.fabric8.openshift.api.model.User"
}
},
"kind": {
"type": "string",
"description": "",
"default": "UserList",
"required": true
},
"metadata": {
"$ref": "#/definitions/kubernetes_ListMeta",
"javaType": "io.fabric8.kubernetes.api.model.ListMeta"
}
},
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.UserList",
"javaInterfaces": [
"io.fabric8.kubernetes.api.model.KubernetesResource",
"io.fabric8.kubernetes.api.model.KubernetesResourceList"
]
},
"speter_inf_Dec": {
"type": "object",
"description": "",
"additionalProperties": true,
"javaType": "io.fabric8.openshift.api.model.Dec"
}
},
"type": "object",
"properties": {
"BaseKubernetesList": {
"$ref": "#/definitions/kubernetes_List",
"javaType": "io.fabric8.kubernetes.api.model.BaseKubernetesList"
},
"BuildConfigList": {
"$ref": "#/definitions/os_build_BuildConfigList",
"javaType": "io.fabric8.openshift.api.model.BuildConfigList"
},
"BuildList": {
"$ref": "#/definitions/os_build_BuildList",
"javaType": "io.fabric8.openshift.api.model.BuildList"
},
"BuildRequest": {
"$ref": "#/definitions/os_build_BuildRequest",
"javaType": "io.fabric8.openshift.api.model.BuildRequest"
},
"ClusterPolicy": {
"$ref": "#/definitions/os_authorization_ClusterPolicy",
"javaType": "io.fabric8.openshift.api.model.ClusterPolicy"
},
"ClusterPolicyBinding": {
"$ref": "#/definitions/os_authorization_ClusterPolicyBinding",
"javaType": "io.fabric8.openshift.api.model.ClusterPolicyBinding"
},
"ClusterPolicyBindingList": {
"$ref": "#/definitions/os_authorization_ClusterPolicyBindingList",
"javaType": "io.fabric8.openshift.api.model.ClusterPolicyBindingList"
},
"ClusterPolicyList": {
"$ref": "#/definitions/os_authorization_ClusterPolicyList",
"javaType": "io.fabric8.openshift.api.model.ClusterPolicyList"
},
"ClusterRoleBinding": {
"$ref": "#/definitions/os_authorization_ClusterRoleBinding",
"javaType": "io.fabric8.openshift.api.model.ClusterRoleBinding"
},
"ClusterRoleBindingList": {
"$ref": "#/definitions/os_authorization_ClusterRoleBindingList",
"javaType": "io.fabric8.openshift.api.model.ClusterRoleBindingList"
},
"Config": {
"$ref": "#/definitions/kubernetes_config_Config",
"javaType": "io.fabric8.kubernetes.api.model.Config"
},
"ContainerStatus": {
"$ref": "#/definitions/kubernetes_ContainerStatus",
"javaType": "io.fabric8.kubernetes.api.model.ContainerStatus"
},
"DeploymentConfigList": {
"$ref": "#/definitions/os_deploy_DeploymentConfigList",
"javaType": "io.fabric8.openshift.api.model.DeploymentConfigList"
},
"Endpoints": {
"$ref": "#/definitions/kubernetes_Endpoints",
"javaType": "io.fabric8.kubernetes.api.model.Endpoints"
},
"EndpointsList": {
"$ref": "#/definitions/kubernetes_EndpointsList",
"javaType": "io.fabric8.kubernetes.api.model.EndpointsList"
},
"EnvVar": {
"$ref": "#/definitions/kubernetes_EnvVar",
"javaType": "io.fabric8.kubernetes.api.model.EnvVar"
},
"EventList": {
"$ref": "#/definitions/kubernetes_EventList",
"javaType": "io.fabric8.kubernetes.api.model.EventList"
},
"Group": {
"$ref": "#/definitions/os_user_Group",
"javaType": "io.fabric8.openshift.api.model.Group"
},
"GroupList": {
"$ref": "#/definitions/os_user_GroupList",
"javaType": "io.fabric8.openshift.api.model.GroupList"
},
"Identity": {
"$ref": "#/definitions/os_user_Identity",
"javaType": "io.fabric8.openshift.api.model.Identity"
},
"IdentityList": {
"$ref": "#/definitions/os_user_IdentityList",
"javaType": "io.fabric8.openshift.api.model.IdentityList"
},
"ImageList": {
"$ref": "#/definitions/os_image_ImageList",
"javaType": "io.fabric8.openshift.api.model.ImageList"
},
"ImageStreamList": {
"$ref": "#/definitions/os_image_ImageStreamList",
"javaType": "io.fabric8.openshift.api.model.ImageStreamList"
},
"LocalSubjectAccessReview": {
"$ref": "#/definitions/os_authorization_LocalSubjectAccessReview",
"javaType": "io.fabric8.openshift.api.model.LocalSubjectAccessReview"
},
"Namespace": {
"$ref": "#/definitions/kubernetes_Namespace",
"javaType": "io.fabric8.kubernetes.api.model.Namespace"
},
"NamespaceList": {
"$ref": "#/definitions/kubernetes_NamespaceList",
"javaType": "io.fabric8.kubernetes.api.model.NamespaceList"
},
"Node": {
"$ref": "#/definitions/kubernetes_Node",
"javaType": "io.fabric8.kubernetes.api.model.Node"
},
"NodeList": {
"$ref": "#/definitions/kubernetes_NodeList",
"javaType": "io.fabric8.kubernetes.api.model.NodeList"
},
"OAuthAccessToken": {
"$ref": "#/definitions/os_oauth_OAuthAccessToken",
"javaType": "io.fabric8.openshift.api.model.OAuthAccessToken"
},
"OAuthAccessTokenList": {
"$ref": "#/definitions/os_oauth_OAuthAccessTokenList",
"javaType": "io.fabric8.openshift.api.model.OAuthAccessTokenList"
},
"OAuthAuthorizeToken": {
"$ref": "#/definitions/os_oauth_OAuthAuthorizeToken",
"javaType": "io.fabric8.openshift.api.model.OAuthAuthorizeToken"
},
"OAuthAuthorizeTokenList": {
"$ref": "#/definitions/os_oauth_OAuthAuthorizeTokenList",
"javaType": "io.fabric8.openshift.api.model.OAuthAuthorizeTokenList"
},
"OAuthClient": {
"$ref": "#/definitions/os_oauth_OAuthClient",
"javaType": "io.fabric8.openshift.api.model.OAuthClient"
},
"OAuthClientAuthorization": {
"$ref": "#/definitions/os_oauth_OAuthClientAuthorization",
"javaType": "io.fabric8.openshift.api.model.OAuthClientAuthorization"
},
"OAuthClientAuthorizationList": {
"$ref": "#/definitions/os_oauth_OAuthClientAuthorizationList",
"javaType": "io.fabric8.openshift.api.model.OAuthClientAuthorizationList"
},
"OAuthClientList": {
"$ref": "#/definitions/os_oauth_OAuthClientList",
"javaType": "io.fabric8.openshift.api.model.OAuthClientList"
},
"ObjectMeta": {
"$ref": "#/definitions/kubernetes_ObjectMeta",
"javaType": "io.fabric8.kubernetes.api.model.ObjectMeta"
},
"PersistentVolume": {
"$ref": "#/definitions/kubernetes_PersistentVolume",
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolume"
},
"PersistentVolumeClaim": {
"$ref": "#/definitions/kubernetes_PersistentVolumeClaim",
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeClaim"
},
"PersistentVolumeClaimList": {
"$ref": "#/definitions/kubernetes_PersistentVolumeClaimList",
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeClaimList"
},
"PersistentVolumeList": {
"$ref": "#/definitions/kubernetes_PersistentVolumeList",
"javaType": "io.fabric8.kubernetes.api.model.PersistentVolumeList"
},
"PodList": {
"$ref": "#/definitions/kubernetes_PodList",
"javaType": "io.fabric8.kubernetes.api.model.PodList"
},
"Policy": {
"$ref": "#/definitions/os_authorization_Policy",
"javaType": "io.fabric8.openshift.api.model.Policy"
},
"PolicyBinding": {
"$ref": "#/definitions/os_authorization_PolicyBinding",
"javaType": "io.fabric8.openshift.api.model.PolicyBinding"
},
"PolicyBindingList": {
"$ref": "#/definitions/os_authorization_PolicyBindingList",
"javaType": "io.fabric8.openshift.api.model.PolicyBindingList"
},
"PolicyList": {
"$ref": "#/definitions/os_authorization_PolicyList",
"javaType": "io.fabric8.openshift.api.model.PolicyList"
},
"Project": {
"$ref": "#/definitions/os_project_Project",
"javaType": "io.fabric8.openshift.api.model.Project"
},
"ProjectList": {
"$ref": "#/definitions/os_project_ProjectList",
"javaType": "io.fabric8.openshift.api.model.ProjectList"
},
"ProjectRequest": {
"$ref": "#/definitions/os_project_ProjectRequest",
"javaType": "io.fabric8.openshift.api.model.ProjectRequest"
},
"Quantity": {
"$ref": "#/definitions/kubernetes_resource_Quantity",
"javaType": "io.fabric8.kubernetes.api.model.Quantity"
},
"ReplicationControllerList": {
"$ref": "#/definitions/kubernetes_ReplicationControllerList",
"javaType": "io.fabric8.kubernetes.api.model.ReplicationControllerList"
},
"ResourceQuota": {
"$ref": "#/definitions/kubernetes_ResourceQuota",
"javaType": "io.fabric8.kubernetes.api.model.ResourceQuota"
},
"ResourceQuotaList": {
"$ref": "#/definitions/kubernetes_ResourceQuotaList",
"javaType": "io.fabric8.kubernetes.api.model.ResourceQuotaList"
},
"Role": {
"$ref": "#/definitions/os_authorization_Role",
"javaType": "io.fabric8.openshift.api.model.Role"
},
"RoleBinding": {
"$ref": "#/definitions/os_authorization_RoleBinding",
"javaType": "io.fabric8.openshift.api.model.RoleBinding"
},
"RoleBindingList": {
"$ref": "#/definitions/os_authorization_RoleBindingList",
"javaType": "io.fabric8.openshift.api.model.RoleBindingList"
},
"RoleList": {
"$ref": "#/definitions/os_authorization_RoleList",
"javaType": "io.fabric8.openshift.api.model.RoleList"
},
"RootPaths": {
"$ref": "#/definitions/api_RootPaths",
"javaType": "io.fabric8.kubernetes.api.model.RootPaths"
},
"RouteList": {
"$ref": "#/definitions/os_route_RouteList",
"javaType": "io.fabric8.openshift.api.model.RouteList"
},
"Secret": {
"$ref": "#/definitions/kubernetes_Secret",
"javaType": "io.fabric8.kubernetes.api.model.Secret"
},
"SecretList": {
"$ref": "#/definitions/kubernetes_SecretList",
"javaType": "io.fabric8.kubernetes.api.model.SecretList"
},
"SecurityContextConstraints": {
"$ref": "#/definitions/kubernetes_SecurityContextConstraints",
"javaType": "io.fabric8.kubernetes.api.model.SecurityContextConstraints"
},
"SecurityContextConstraintsList": {
"$ref": "#/definitions/kubernetes_SecurityContextConstraintsList",
"javaType": "io.fabric8.kubernetes.api.model.SecurityContextConstraintsList"
},
"ServiceAccount": {
"$ref": "#/definitions/kubernetes_ServiceAccount",
"javaType": "io.fabric8.kubernetes.api.model.ServiceAccount"
},
"ServiceAccountList": {
"$ref": "#/definitions/kubernetes_ServiceAccountList",
"javaType": "io.fabric8.kubernetes.api.model.ServiceAccountList"
},
"ServiceList": {
"$ref": "#/definitions/kubernetes_ServiceList",
"javaType": "io.fabric8.kubernetes.api.model.ServiceList"
},
"Status": {
"$ref": "#/definitions/kubernetes_Status",
"javaType": "io.fabric8.kubernetes.api.model.Status"
},
"SubjectAccessReview": {
"$ref": "#/definitions/os_authorization_SubjectAccessReview",
"javaType": "io.fabric8.openshift.api.model.SubjectAccessReview"
},
"SubjectAccessReviewResponse": {
"$ref": "#/definitions/os_authorization_SubjectAccessReviewResponse",
"javaType": "io.fabric8.openshift.api.model.SubjectAccessReviewResponse"
},
"TagEvent": {
"$ref": "#/definitions/os_image_TagEvent",
"javaType": "io.fabric8.openshift.api.model.TagEvent"
},
"Template": {
"$ref": "#/definitions/os_template_Template",
"javaType": "io.fabric8.openshift.api.model.Template"
},
"TemplateList": {
"$ref": "#/definitions/os_template_TemplateList",
"javaType": "io.fabric8.openshift.api.model.TemplateList"
},
"User": {
"$ref": "#/definitions/os_user_User",
"javaType": "io.fabric8.openshift.api.model.User"
},
"UserList": {
"$ref": "#/definitions/os_user_UserList",
"javaType": "io.fabric8.openshift.api.model.UserList"
},
"WatchEvent": {
"$ref": "#/definitions/kubernetes_watch_WatchEvent",
"javaType": "io.fabric8.kubernetes.api.model.WatchEvent"
}
},
"additionalProperties": true
};
})(Kubernetes || (Kubernetes = {}));
/// <reference path="schema.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
var hiddenProperties = ['status', 'deletionTimestamp'];
function withProperty(schema, name, action) {
if (schema.properties[name]) {
action(schema.properties[name]);
}
}
function hideProperties(schema) {
_.forEach(hiddenProperties, function (property) {
withProperty(schema, property, function (property) {
property.hidden = true;
});
});
}
Kubernetes._module.factory('KubernetesSchema', ['SchemaRegistry', function (schemas) {
Kubernetes.configureSchema();
schemas.addListener("k8s schema customizer", function (name, schema) {
if (schema.properties) {
if (schema.properties.name) {
schema.controls = ['name', '*'];
}
withProperty(schema, 'portalIP', function (property) {
property.label = "Portal IP";
});
withProperty(schema, 'publicIPs', function (property) {
property.label = "Public IPs";
});
withProperty(schema, 'Spec', function (property) {
property.label = 'false';
});
withProperty(schema, 'Metadata', function (property) {
property.label = 'false';
});
hideProperties(schema);
}
if (_.endsWith(name, "ServiceSpec")) {
schema.controls = ["portalIP", "createExternalLoadBalancer", "sessionAffinity", "publicIPs", "ports", "selector", "*"];
withProperty(schema, 'sessionAffinity', function (property) {
Kubernetes.log.debug("Schema: ", schema);
property.enum = ['None', 'ClientIP'];
property.default = 'None';
});
}
if (_.endsWith(name, "Service")) {
schema.controls = undefined;
schema.tabs = {
'Basic Information': ['metadata'],
'Details': ['*']
};
Kubernetes.log.debug("Name: ", name, " Schema: ", schema);
}
});
schemas.addSchema('kubernetes', Kubernetes.schema);
// now lets iterate and add all the definitions too
angular.forEach(Kubernetes.schema.definitions, function (definition, typeName) {
//schemas.addSchema(typeName, definition);
schemas.addSchema("#/definitions/" + typeName, definition);
});
return Kubernetes.schema;
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
// facade this to the watcher service
var KubernetesStateImpl = (function () {
function KubernetesStateImpl(watcher) {
this.watcher = watcher;
}
Object.defineProperty(KubernetesStateImpl.prototype, "namespaces", {
get: function () {
return _.map(this.watcher.getObjects(Kubernetes.WatchTypes.NAMESPACES), function (namespace) {
return namespace.metadata.name;
});
},
enumerable: true,
configurable: true
});
Object.defineProperty(KubernetesStateImpl.prototype, "selectedNamespace", {
get: function () {
return this.watcher.getNamespace();
},
set: function (namespace) {
this.watcher.setNamespace(namespace);
},
enumerable: true,
configurable: true
});
return KubernetesStateImpl;
}());
Kubernetes._module.factory('KubernetesState', ['WatcherService', function (watcher) {
return new KubernetesStateImpl(watcher);
}]);
// TODO this doesn't need to be a service really
Kubernetes._module.factory('KubernetesApiURL', function () { return Kubernetes.kubernetesApiUrl(); });
// TODO we'll get rid of this...
Kubernetes._module.factory('KubernetesVersion', [function () {
return {
query: function () { return null; }
};
}]);
// TODO let's move these into KubernetesModel so controllers don't have to inject them separately
Kubernetes._module.factory('KubernetesPods', ['KubernetesModel', function (KubernetesModel) {
return KubernetesModel['podsResource'];
}]);
Kubernetes._module.factory('KubernetesReplicationControllers', ['KubernetesModel', function (KubernetesModel) {
return KubernetesModel['replicationcontrollersResource'];
}]);
Kubernetes._module.factory('KubernetesServices', ['KubernetesModel', function (KubernetesModel) {
return KubernetesModel['servicesResource'];
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
/// <reference path="kubernetesModel.ts"/>
///
var Kubernetes;
(function (Kubernetes) {
Kubernetes.FileDropController = Kubernetes.controller("FileDropController", ["$scope", "KubernetesModel", "FileUploader", '$http', function ($scope, model, FileUploader, $http) {
var log = Logger.get('kubernetes-file-uploader');
var uploader = $scope.uploader = new FileUploader({
autoUpload: false,
removeAfterUpload: true,
url: Kubernetes.kubernetesApiUrl()
});
$scope.uploader.onAfterAddingFile = function (file) {
var reader = new FileReader();
reader.onload = function () {
if (reader.readyState === 2) {
log.debug("File added: ", file);
var data = reader.result;
var obj = null;
if (_.endsWith(file._file.name, '.json')) {
log.debug("Parsing JSON file");
try {
obj = angular.fromJson(data);
}
catch (err) {
log.debug("Failed to read dropped file ", file._file.name, ": ", err);
return;
}
}
else if (_.endsWith(file._file.name, '.yaml')) {
log.debug("Parsing YAML file");
try {
obj = jsyaml.load(data);
}
catch (err) {
log.debug("Failed to read dropped file ", file._file.name, ": ", err);
return;
}
}
else {
log.debug("Unknown file type for file: ", file._file.name);
return;
}
log.debug("Dropped object: ", obj);
if (!KubernetesAPI.getNamespace(obj)) {
obj.metadata.namespace = model.currentNamespace();
}
KubernetesAPI.put({
object: obj,
success: function (data) {
Core.notification("success", "Applied " + file._file.name);
},
error: function (err) {
log.info("Got error applying", file._file.name, ": ", err);
Core.notification("warning", "Failed to apply " + file._file.name + ", error: " + err.message);
}
});
}
};
reader.readAsText(file._file);
};
$scope.uploader.onBeforeUploadItem = function (item) {
log.debug("Uploading: ", item);
//Core.notification('info', 'Uploading ' + item);
};
$scope.uploader.onSuccessItem = function (item) {
log.debug("onSuccessItem: ", item);
};
$scope.uploader.onErrorItem = function (item, response, status) {
log.debug("Failed to apply, response: ", response, " status: ", status);
};
}]);
Kubernetes.NamespaceController = Kubernetes.controller('NamespaceController', ['$scope', 'WatcherService', function ($scope, watcher) {
$scope.namespaces = watcher.getObjects('namespaces');
$scope.$watchCollection('namespaces', function (newValue, oldValue) {
if (newValue !== oldValue) {
$scope.namespace = watcher.getNamespace();
}
});
$scope.$watch('namespace', function (newValue, oldValue) {
if (newValue !== oldValue) {
if (newValue !== oldValue) {
watcher.setNamespace(newValue);
}
}
});
}]);
Kubernetes.TopLevel = Kubernetes.controller("TopLevel", ["$scope", "KubernetesVersion", "KubernetesState", function ($scope, KubernetesVersion, KubernetesState) {
$scope.version = undefined;
$scope.showAppView = Kubernetes.isAppView();
$scope.isActive = function (href) {
return Kubernetes.isLinkActive(href);
};
$scope.mode = 'yaml';
$scope.rawMode = true;
$scope.dirty = false;
$scope.readOnly = true;
$scope.rawModel = null;
$scope.$on('hawtioEditor_default_dirty', function ($event, dirty) {
$scope.dirty = dirty;
});
$scope.save = function (rawModel) {
var obj = null;
var str = rawModel.replace(/\t/g, " ");
try {
obj = jsyaml.load(str);
}
catch (err) {
Core.notification("warning", "Failed to save object, error: \"" + err + "\"");
}
if (!obj) {
return;
}
$scope.readOnly = true;
KubernetesAPI.put({
object: obj,
success: function (data) {
$scope.dirty = false;
Core.notification("success", "Saved object " + Kubernetes.getName(obj));
Core.$apply($scope);
},
error: function (err) {
console.log("Got error: ", err);
Core.notification("warning", "Failed to save object, error: \"" + err.message + "\"");
$scope.dirty = false;
Core.$apply($scope);
}
});
};
$scope.kubernetes = KubernetesState;
KubernetesVersion.query(function (response) {
$scope.version = response;
});
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.NamespaceController = Kubernetes.controller("NamespaceController", ["$scope", "WatcherService", function ($scope, watcher) {
$scope.watcher = watcher;
$scope.namespaceObjects = watcher.getObjects('namespaces');
$scope.namespace = watcher.getNamespace();
$scope.namespaces = [];
$scope.$watch('namespace', function (newValue, oldValue) {
if (newValue !== oldValue) {
watcher.setNamespace(newValue);
}
});
$scope.$watch('watcher.getNamespace()', function (newValue, oldValue) {
if (newValue !== oldValue) {
$scope.namespace = newValue;
}
});
$scope.$watchCollection('namespaceObjects', function (namespaceObjects) {
$scope.namespaces = _.map(namespaceObjects, function (namespace) { return namespace.metadata.name; });
});
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
var OverviewDirective = Kubernetes._module.directive("kubernetesOverview", ["$templateCache", "$compile", "$interpolate", "$timeout", "$window", "KubernetesState", 'KubernetesModel', function ($templateCache, $compile, $interpolate, $timeout, $window, KubernetesState, KubernetesModel) {
var log = Logger.get('kubernetes-overview');
var model = KubernetesModel;
var state = KubernetesState;
return {
restrict: 'E',
replace: true,
link: function (scope, element, attr) {
scope.model = model;
element.css({ visibility: 'hidden' });
scope.getEntity = function (type, key) {
switch (type) {
case 'host':
return model.podsByHost[key];
case 'pod':
return model.podsByKey[key];
case 'replicationController':
return model.replicationControllersByKey[key];
case 'service':
return model.servicesByKey[key];
default:
return undefined;
}
};
scope.kubernetes = state;
scope.customizeDefaultOptions = function (options) {
options.Endpoint = ['Blank', {}];
};
scope.mouseEnter = function ($event) {
if (scope.jsPlumb) {
angular.element($event.currentTarget).addClass("hovered");
scope.jsPlumb.getEndpoints($event.currentTarget).forEach(function (endpoint) {
endpoint.connections.forEach(function (connection) {
if (!connection.isHover()) {
connection.setHover(true);
connection.endpoints.forEach(function (e) {
scope.mouseEnter({
currentTarget: e.element
});
});
}
});
});
}
};
scope.mouseLeave = function ($event) {
if (scope.jsPlumb) {
angular.element($event.currentTarget).removeClass("hovered");
scope.jsPlumb.getEndpoints($event.currentTarget).forEach(function (endpoint) {
endpoint.connections.forEach(function (connection) {
if (connection.isHover()) {
connection.setHover(false);
connection.endpoints.forEach(function (e) {
scope.mouseLeave({
currentTarget: e.element
});
});
}
});
});
}
};
/*
scope.customizeEndpointOptions = (jsPlumb, node, options) => {
var type = node.el.attr('data-type');
// log.debug("endpoint type: ", type);
switch (type) {
case 'pod':
break;
case 'service':
break;
case 'replicationController':
break;
}
};
*/
scope.customizeConnectionOptions = function (jsPlumb, edge, params, options) {
var type = edge.source.el.attr('data-type');
options.connector = ["Bezier", { curviness: 50, stub: 25, alwaysRespectStubs: true }];
params.paintStyle = {
lineWidth: 2,
strokeStyle: '#5555cc'
};
switch (type) {
case 'pod':
break;
case 'service':
params.anchors = [
["Continuous", { faces: ["right"] }],
["Continuous", { faces: ["left"] }]
];
break;
case 'replicationController':
params.anchors = [
["Perimeter", { shape: "Circle" }],
["Continuous", { faces: ["right"] }]
];
break;
}
//log.debug("connection source type: ", type);
return options;
};
function interpolate(template, config) {
return $interpolate(template)(config);
}
function createElement(template, thingName, thing) {
var config = {};
config[thingName] = thing;
return interpolate(template, config);
}
function createElements(template, thingName, things) {
return things.map(function (thing) {
return createElement(template, thingName, thing);
});
}
function appendNewElements(parentEl, template, thingName, things) {
things.forEach(function (thing) {
var key = thing['_key'] || thing['elementId'] || thing['id'];
var existing = parentEl.find("#" + key);
if (!existing.length) {
log.debug("existing: ", existing, " key: ", key);
parentEl.append($compile(createElement(template, thingName, thing))(scope));
}
});
}
function namespaceFilter(item) {
return Kubernetes.getNamespace(item) === scope.kubernetes.selectedNamespace;
}
function firstDraw() {
log.debug("First draw");
element.empty();
var services = model.services;
var replicationControllers = model.replicationControllers;
var pods = model.pods;
var hosts = model.hosts;
// log.debug("hosts: ", model.hosts);
var parentEl = angular.element($templateCache.get("overviewTemplate.html"));
var servicesEl = parentEl.find(".services");
var hostsEl = parentEl.find(".hosts");
var replicationControllersEl = parentEl.find(".replicationControllers");
servicesEl.append(createElements($templateCache.get("serviceTemplate.html"), 'service', services.filter(namespaceFilter)));
replicationControllersEl.append(createElements($templateCache.get("replicationControllerTemplate.html"), 'replicationController', replicationControllers.filter(namespaceFilter)));
hosts.forEach(function (host) {
var hostEl = angular.element(createElement($templateCache.get("overviewHostTemplate.html"), 'host', host));
var podContainer = angular.element(hostEl.find('.pod-container'));
podContainer.append(createElements($templateCache.get("podTemplate.html"), "pod", host.pods));
hostsEl.append(hostEl);
});
//parentEl.append(createElements($templateCache.get("podTemplate.html"), 'pod', pods));
element.append($compile(parentEl)(scope));
$timeout(function () { element.css({ visibility: 'visible' }); }, 250);
}
function update() {
scope.$emit('jsplumbDoWhileSuspended', function () {
log.debug("Update");
var services = model.services;
var replicationControllers = model.replicationControllers;
var pods = model.pods;
var hosts = model.hosts;
var parentEl = element.find('[hawtio-jsplumb]');
var children = parentEl.find('.jsplumb-node');
children.each(function (index, c) {
var child = angular.element(c);
var key = child.attr('id');
log.debug('key: ', key);
if (Core.isBlank(key)) {
return;
}
var type = child.attr('data-type');
switch (type) {
case 'host':
if (key in model.podsByHost) {
return;
}
break;
case 'service':
if (key in model.servicesByKey && Kubernetes.getNamespace(model.servicesByKey[key]) == scope.kubernetes.selectedNamespace) {
var service = model.servicesByKey[key];
child.attr('connect-to', service.connectTo);
return;
}
break;
case 'pod':
/*
if (hasId(pods, id)) {
return;
}
*/
if (key in model.podsByKey) {
return;
}
break;
case 'replicationController':
if (key in model.replicationControllersByKey) {
var replicationController = model.replicationControllersByKey[key];
child.attr('connect-to', replicationController.connectTo);
return;
}
break;
default:
log.debug("Ignoring element with unknown type");
return;
}
log.debug("Removing: ", key);
child.remove();
});
var servicesEl = element.find(".services");
var replicationControllersEl = element.find(".replicationControllers");
var hostsEl = element.find(".hosts");
appendNewElements(servicesEl, $templateCache.get("serviceTemplate.html"), "service", services);
appendNewElements(replicationControllersEl, $templateCache.get("replicationControllerTemplate.html"), "replicationController", replicationControllers);
appendNewElements(hostsEl, $templateCache.get("overviewHostTemplate.html"), "host", hosts);
hosts.forEach(function (host) {
var hostEl = angular.element(hostsEl.find("#" + host.elementId));
var podContainer = angular.element(hostEl.find('.pod-container'));
appendNewElements(podContainer, $templateCache.get("podTemplate.html"), "pod", host.pods);
});
});
}
function refreshDrawing() {
log.debug("Refreshing drawing");
if (element.children().length === 0) {
firstDraw();
}
else {
update();
}
Core.$apply(scope);
}
scope.$on('kubernetesModelUpdated', _.debounce(refreshDrawing, 500, { trailing: true }));
setTimeout(refreshDrawing, 100);
}
};
}]);
var OverviewBoxController = Kubernetes.controller("OverviewBoxController", ["$scope", "$location", function ($scope, $location) {
$scope.viewDetails = function (entity, path) {
if (entity) {
var namespace = Kubernetes.getNamespace(entity);
var id = Kubernetes.getName(entity);
$location.path(UrlHelpers.join('/kubernetes/namespace', namespace, path, id));
}
else {
Kubernetes.log.warn("No entity for viewDetails!");
}
};
}]);
var scopeName = "OverviewController";
var OverviewController = Kubernetes.controller(scopeName, ["$scope", "$location", "$http", "$timeout", "$routeParams", "KubernetesModel", "KubernetesState", "KubernetesApiURL", function ($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL) {
$scope.name = scopeName;
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
//$scope.subTabConfig = [];
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.PipelinesController = Kubernetes.controller("PipelinesController", ["$scope", "KubernetesModel", "KubernetesState", "$dialog", "$window", "$templateCache", "$routeParams", "$location", "localStorage", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, $dialog, $window, $templateCache, $routeParams, $location, localStorage, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
/**
* Lets update the various data to join them together to a pipeline model
*/
function updateData() {
var pipelineSteps = {};
if ($scope.buildConfigs && $scope.builds && $scope.deploymentConfigs) {
Kubernetes.enrichBuildConfigs($scope.buildConfigs, $scope.builds);
$scope.fetched = true;
angular.forEach($scope.buildConfigs, function (buildConfig) {
var pipelineKey = createPipelineKey(buildConfig);
if (pipelineKey) {
pipelineSteps[pipelineKey] = {
buildConfig: buildConfig,
builds: [],
triggeredBy: null,
triggersSteps: [],
$class: 'pipeline-build'
};
}
});
angular.forEach($scope.builds, function (build) {
var pipelineKey = createPipelineKey(build);
if (pipelineKey) {
var pipeline = pipelineSteps[pipelineKey];
if (!pipeline) {
//console.log("warning no pipeline generated for buildConfig for key " + pipelineKey + " for build " + angular.toJson(build, true));
console.log("warning no pipeline generated for buildConfig for key " + pipelineKey + " for build " + build.$name);
}
else {
pipeline.builds.push(build);
}
}
});
// TODO now we need to look at the triggers to figure out which pipelineSteps triggers each pipelineStep
// now lets create an array of all pipelines, starting from the first known step with a list of the steps
var pipelines = [];
angular.forEach(pipelineSteps, function (pipelineStep, key) {
if (!pipelineStep.triggeredBy) {
// we are a root step....
pipelines.push(pipelineStep);
// now lets add all the steps for this key...
pipelineStep.triggersSteps.push(pipelineStep);
angular.forEach(pipelineSteps, function (step) {
if (step.triggeredBy === key) {
pipelineStep.triggersSteps.push(step);
}
});
}
});
angular.forEach($scope.deploymentConfigs, function (deploymentConfig) {
if (!deploymentConfig.kind) {
deploymentConfig.kind = "DeploymentConfig";
}
angular.forEach(deploymentConfig.triggers, function (trigger) {
var type = trigger.type;
var imageChangeParams = trigger.imageChangeParams;
if (imageChangeParams && type === "ImageChange") {
var from = imageChangeParams.from;
if (from) {
var name = from.name;
if (from.kind === "ImageRepository") {
var tag = imageChangeParams.tag || "latest";
if (name) {
// now lets find a pipeline step which fires from this
angular.forEach(pipelineSteps, function (pipelineStep, key) {
var to = Core.pathGet(pipelineStep, ["buildConfig", "parameters", "output", "to"]);
if (to && (to.kind === "ImageRepository" || to.kind === "ImageStream")) {
var toName = to.name;
if (toName === name) {
var selector = Core.pathGet(deploymentConfig, ["template", "controllerTemplate", "selector"]);
var pods = [];
var $podCounters = selector ? Kubernetes.createPodCounters(selector, KubernetesModel.podsForNamespace(), pods) : null;
var deployPipelineStep = {
buildConfig: deploymentConfig,
$class: 'pipeline-deploy',
$podCounters: $podCounters,
$pods: pods
};
pipelineStep.triggersSteps.push(deployPipelineStep);
}
}
});
}
}
}
}
});
});
$scope.pipelines = pipelines;
}
}
/**
* Lets create a unique key for build / config we can use to do linking of builds / configs / triggers
*/
function createPipelineKey(buildConfig) {
return Core.pathGet(buildConfig, ["parameters", "source", "git", "uri"]);
}
$scope.$keepPolling = function () { return Kubernetes.keepPollingModel; };
$scope.fetch = PollHelpers.setupPolling($scope, function (next) {
var ready = 0;
var numServices = 3;
function maybeNext() {
if (++ready >= numServices) {
next();
}
}
var url = Kubernetes.buildsRestURL();
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
$scope.builds = Kubernetes.enrichBuilds(data.items);
updateData();
}
maybeNext();
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
maybeNext();
});
url = Kubernetes.buildConfigsRestURL();
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
$scope.buildConfigs = data.items;
updateData();
}
maybeNext();
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
maybeNext();
});
url = Kubernetes.deploymentConfigsRestURL();
$http.get(url).
success(function (data, status, headers, config) {
if (data) {
$scope.deploymentConfigs = data.items;
updateData();
}
maybeNext();
}).
error(function (data, status, headers, config) {
Kubernetes.log.warn("Failed to load " + url + " " + data + " " + status);
maybeNext();
});
});
$scope.fetch();
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.PodController = Kubernetes.controller("PodController", ["$scope", "KubernetesModel", "KubernetesState", "ServiceRegistry", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "$window", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, ServiceRegistry, $templateCache, $location, $routeParams, $http, $timeout, $window, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.rawModel = null;
$scope.itemConfig = {
properties: {
'containers/image$': {
template: $templateCache.get('imageTemplate.html')
},
'status/phase': {
template: $templateCache.get('statusTemplate.html')
},
'\\/Env\\/': {
template: $templateCache.get('envItemTemplate.html')
},
'^\\/labels$': {
template: $templateCache.get('labelTemplate.html')
},
'\\/env\\/key$': {
hidden: true
}
}
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
$scope.$watch('model.pods', function (newValue, oldValue) {
updateData();
}, true);
$scope.flipRaw = function () {
$scope.rawMode = !$scope.rawMode;
Core.$apply($scope);
};
$scope.openLogs = function () {
var pods = [$scope.item];
Kubernetes.openLogsForPods(ServiceRegistry, $window, KubernetesModel.currentNamespace(), pods);
};
updateData();
function updateData() {
$scope.id = $routeParams["id"];
$scope.item = $scope.model.getPod(KubernetesState.selectedNamespace, $scope.id);
if ($scope.item) {
$scope.rawModel = Kubernetes.toRawYaml($scope.item);
}
Core.$apply($scope);
}
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.PodEditController = Kubernetes.controller("PodEditController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "SchemaRegistry",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL, schemas) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["id"];
$scope.schema = KubernetesSchema;
$scope.config = schemas.cloneSchema("io.fabric8.kubernetes.api.model.Pod");
//$scope.config = KubernetesSchema.definitions.kubernetes_v1beta2_Pod;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
updateData();
function updateData() {
if ($scope.id) {
$scope.entity = $scope.model.getPod(KubernetesState.selectedNamespace, $scope.id);
Core.$apply($scope);
$scope.fetched = true;
}
else {
$scope.fetched = true;
}
}
$scope.save = function () {
console.log($scope.entity);
};
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="kubernetesPlugin.ts"/>
/// <reference path="term.ts"/>
var Kubernetes;
(function (Kubernetes) {
var log = Logger.get("kubernetes-pod-logs");
Kubernetes._module.service("PodLogReplacements", function () {
return [];
});
Kubernetes._module.run(["PodLogReplacements", function (PodLogReplacements) {
var log = Logger.get("pod-log-replacers");
// Add ANSI escape character replacer
// adapted from https://github.com/mmalecki/ansispan
var colors = {
'30': 'black',
'31': 'red',
'32': 'green',
'33': 'yellow',
'34': 'blue',
'35': 'purple',
'36': 'cyan',
'37': 'white'
};
PodLogReplacements.push(function (msg) {
if (!msg) {
return msg;
}
var end = "</span>";
_.forOwn(colors, function (color, code) {
var start = "<span class=\"" + color + "\">";
msg = msg.replace(new RegExp('\033\\[' + code + 'm', 'g'), start);
msg = msg.replace(new RegExp('\033\\[0;' + code + 'm', 'g'), start);
});
msg = msg.replace(/\033\[1m/g, '<b>').replace(/\033\[22m/g, '</b>');
msg = msg.replace(/\033\[3m/g, '<i>').replace(/\033\[23m/g, '</i>');
msg = msg.replace(/\033\[m/g, end);
msg = msg.replace(/\033\[0m/g, end);
msg = msg.replace(/\033\[39m/g, end);
msg = msg.replace(/\033\[2m/g, '<span>');
msg = msg.replace(/\033\[0;39m/g, end);
log.debug("Running replacement on message: ", msg);
return msg;
});
}]);
Kubernetes._module.controller("Kubernetes.PodLogLinkController", ["$scope", "$interval", "TerminalService", "$templateCache", function ($scope, $interval, TerminalService, $templateCache) {
$scope.openLogs = function (entity) {
log.debug("Open logs: ", entity);
TerminalService.newTerminal($interval, entity.metadata.selfLink, entity.$oracleName, entity, "/java/console/api/oracle/extract/log?rcName=" + Kubernetes.getName(entity), $templateCache.get(UrlHelpers.join(Kubernetes.templatePath, 'logShell.html')));
};
}]);
Kubernetes._module.directive('podLogDisplay', ["userDetails", "PodLogReplacements", function (userDetails, PodLogReplacements) {
return {
restrict: 'E',
template: "\n <div class=\"pod-log-lines\">\n <p ng-hide=\"fetched\">Please wait, fetching logs...</p>\n <p ng-hide=\"messages.length || previous\">View <a href=\"\" ng-click=\"previous=!previous\">previous container logs</a>?</p>\n <p ng-repeat=\"message in messages track by $index\" ng-bind-html=\"message\"></p>\n </div>\n ",
link: function (scope, element, attr) {
var link = scope.$eval('podLink');
var name = scope.$eval('containerName');
if (!link) {
return;
}
scope.fetched = false;
scope.previous = false;
scope.messages = [];
link = UrlHelpers.join(Kubernetes.masterApiUrl(), link, 'log');
link = KubernetesAPI.wsUrl(link);
link.search({
follow: true,
tailLines: 1000,
access_token: userDetails.token
});
var messages = [];
var pullMessages = _.debounce(function () {
scope.messages = scope.messages.concat(_.remove(messages, function () { return true; }).map(function (msg) {
PodLogReplacements.forEach(function (replFunc) {
if (angular.isFunction(replFunc)) {
msg = replFunc(msg);
}
});
return msg;
}));
if (!scope.fetched) {
scope.fetched = true;
}
Core.$apply(scope);
}, 1000);
function initSocket(link) {
scope.fetched = false;
messages.length = 0;
scope.messages.length = 0;
var ws = new WebSocket(link.toString(), 'base64.binary.k8s.io');
ws.onmessage = function (event) {
try {
var message = window.atob(event.data);
messages.push(message);
pullMessages();
}
catch (err) {
}
};
return ws;
}
var ws = initSocket(link);
scope.$watch('previous', function (value, old) {
if (value !== old) {
if (link.hasSearch('previous')) {
link.removeSearch('previous').addSearch('previous', scope.previous);
}
else {
link.addSearch('previous', scope.previous);
}
ws.close();
ws = initSocket(link);
}
});
element.on('$destroy', function () {
if (ws) {
try {
ws.close();
}
catch (err) {
}
delete ws;
}
});
}
};
}]);
Kubernetes._module.directive('podLogWindow', ["$compile", "TerminalService", function ($compile, TerminalService) {
return {
restrict: 'A',
scope: false,
link: function (scope, element, attr) {
Kubernetes.addWindowActions(scope, element, TerminalService);
scope.atBottom = true;
scope.$watch('atBottom', function (val) {
});
}
};
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
/// <reference path="utilHelpers.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.EnvItem = Kubernetes.controller("EnvItem", ["$scope", function ($scope) {
var parts = $scope.data.split('=');
$scope.key = parts.shift();
$scope.value = parts.join('=');
}]);
// main controller for the page
Kubernetes.Pods = Kubernetes.controller("Pods", ["$scope", "KubernetesModel", "KubernetesPods", "KubernetesState", "ServiceRegistry", "$dialog", "$window", "$templateCache", "$routeParams", "$location", "localStorage", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesPods, KubernetesState, ServiceRegistry, $dialog, $window, $templateCache, $routeParams, $location, localStorage, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.$on('kubernetesModelUpdated', function () {
Core.$apply($scope);
});
$scope.itemSchema = Forms.createFormConfiguration();
$scope.tableConfig = {
data: 'model.pods',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{
field: '_key',
displayName: 'Name',
defaultSort: true,
cellTemplate: $templateCache.get("idTemplate.html")
},
{
field: '$statusCss',
displayName: 'Status',
cellTemplate: $templateCache.get("statusTemplate.html")
},
{ field: '$eventCount',
displayName: 'Events',
cellTemplate: $templateCache.get("eventSummaryTemplate.html")
},
{
field: '$restartCount',
displayName: 'Restarts'
},
{
field: '$createdTime',
displayName: 'Age',
cellTemplate: $templateCache.get("ageTemplate.html")
},
{
field: '$imageNames',
displayName: 'Images',
cellTemplate: $templateCache.get("imageTemplate.html")
},
{
field: '$host',
displayName: 'Host',
cellTemplate: $templateCache.get("hostTemplate.html")
},
{
field: '$labelsText',
displayName: 'Labels',
cellTemplate: $templateCache.get("labelTemplate.html")
},
{
field: '$podIP',
displayName: 'Pod IP',
customSortField: function (field) {
return Kubernetes.sortByPodIp(field.$podIP);
}
}
]
};
$scope.openLogs = function () {
var pods = $scope.tableConfig.selectedItems;
if (!pods || !pods.length) {
if ($scope.id) {
var item = $scope.item;
if (item) {
pods = [item];
}
}
}
Kubernetes.openLogsForPods(ServiceRegistry, $window, KubernetesModel.currentNamespace(), pods);
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.deletePrompt = function (selected) {
if (angular.isString(selected)) {
selected = [{
id: selected
}];
}
UI.multiItemConfirmActionDialog({
collection: selected,
index: 'metadata.name',
onClose: function (result) {
if (result) {
function deleteSelected(selected, next) {
if (next) {
Kubernetes.log.debug("deleting: ", Kubernetes.getName(next));
KubernetesPods.delete({
id: Kubernetes.getName(next)
}, undefined, function () {
Kubernetes.log.debug("deleted: ", Kubernetes.getName(next));
deleteSelected(selected, selected.shift());
}, function (error) {
Kubernetes.log.debug("Error deleting: ", error);
deleteSelected(selected, selected.shift());
});
}
}
deleteSelected(selected, selected.shift());
}
},
title: 'Delete pods?',
action: 'The following pods will be deleted:',
okText: 'Delete',
okClass: 'btn-danger',
custom: "This operation is permanent once completed!",
customClass: "alert alert-warning"
}).open();
};
$scope.createPods = function () {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var obj = JSON.parse(xhr.responseText);
var object = {
"name": "newpod",
"labels": {
"aim": "test",
"app": "oracle"
},
"path": '/home/',
"port": 1525
};
Kubernetes.createRC(object);
}
else {
}
}
};
xhr.open("POST", "/oracleAppPath", false); //与服务器连接并发送
xhr.send(null);
};
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.ReplicationControllerController = Kubernetes.controller("ReplicationControllerController", ["$scope", "KubernetesModel", "KubernetesState", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.rawModel = null;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.itemConfig = {
properties: {
'^\\/labels$': {
template: $templateCache.get('labelTemplate.html')
}
}
};
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
$scope.$watch('model.pods', function (newValue, oldValue) {
updateData();
}, true);
$scope.flipRaw = function () {
$scope.rawMode = !$scope.rawMode;
Core.$apply($scope);
};
updateData();
function updateData() {
if ($scope.dirty) {
return;
}
$scope.id = $routeParams["id"];
$scope.item = $scope.model.getReplicationController(KubernetesState.selectedNamespace, $scope.id);
if ($scope.item) {
$scope.rawModel = Kubernetes.toRawYaml($scope.item);
}
Core.$apply($scope);
}
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.ReplicationControllerEditController = Kubernetes.controller("ReplicationControllerEditController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "SchemaRegistry",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL, schemas) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["id"];
$scope.schema = KubernetesSchema;
Kubernetes.log.debug("Schema: ", $scope.schema);
$scope.config = schemas.cloneSchema("io.fabric8.kubernetes.api.model.ReplicationController");
//$$scope.config = KubernetesSchema.definitions.kubernetes_v1beta3_ReplicationController;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
updateData();
function updateData() {
if ($scope.id) {
$scope.entity = $scope.model.getReplicationController(KubernetesState.selectedNamespace, $scope.id);
Core.$apply($scope);
$scope.fetched = true;
}
else {
$scope.fetched = true;
}
}
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
/// <reference path="kubernetesModel.ts"/>
/// <reference path="../../configs/ts/customAlert.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.ReplicationControllers = Kubernetes.controller("ReplicationControllers", ["$scope", "KubernetesModel", "KubernetesReplicationControllers", "KubernetesPods", "ConfigsModel", "KubernetesState", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesReplicationControllers, KubernetesPods, ConfigsModel, KubernetesState, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.configs = ConfigsModel;
$scope.model = KubernetesModel;
$scope.tableConfig = {
data: 'model.replicationControllers',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{ field: '$oracleName',
displayName: '服务名称',
cellTemplate: $templateCache.get("idTemplate.html"),
customSortField: function (field) {
return field;
}
},
//{ field: '$replicas',
// displayName: 'Scale',
// cellTemplate:$templateCache.get("desiredReplicas.html")
//},
{ field: '$pods.age',
displayName: '启动时间',
cellTemplate: $templateCache.get("ageTemplate.html")
},
{ field: '$labelsText',
displayName: '数据标签',
cellTemplate: $templateCache.get("labelTemplate.html")
},
{ field: '$pods',
displayName: '连接参数',
cellTemplate: $templateCache.get("connectParamTemplate.html")
},
{ field: '$podCounters',
displayName: '服务状态',
cellTemplate: $templateCache.get("podCountsAndLinkTemplate.html"),
customSortField: function (field) {
console.log(field);
if (field.$podCounters.ready) {
return 3;
}
else if (field.$podCounters.valid || field.$podCounters.waiting) {
return 2;
}
else if (field.$podCounters.error) {
return 0;
}
else {
return 1;
}
}
},
{ field: '$extractStatus',
displayName: '数据汇总状态',
cellTemplate: $templateCache.get("dataSummaryTemplate.html")
},
{
field: '$checkStatus',
displayName: '检验状态',
cellTemplate: $templateCache.get("dataCheckStatus.html")
}
],
sortInfo: {
sortBy: "$oracleName",
ascending: false
}
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.deletePrompt = function (selected) {
if (angular.isString(selected)) {
selected = [{
id: selected
}];
}
var extractItems = Kubernetes.checkForExtract(selected);
if (extractItems.length == 0) {
UI.multiItemConfirmActionDialog({
collection: selected,
index: '$alias',
onClose: function (result) {
if (result) {
function deleteSelected(selected, next) {
if (next) {
Kubernetes.resizeController($http, KubernetesApiURL, next, 0, function () {
KubernetesReplicationControllers.delete({
id: Kubernetes.getName(next)
}, undefined, function () {
if (next.metadata.labels.style === "oracle") {
Kubernetes.connectOracle($http, $timeout, "/java/console/api/cancelOracleConection", "delete", next, 0);
}
deleteSelected(selected, selected.shift());
}, function (error) {
Kubernetes.log.debug("Error deleting: ", error);
deleteSelected(selected, selected.shift());
});
});
}
}
deleteSelected(selected, selected.shift());
}
},
title: '是否需要删除oracle服务',
action: '以下的oracle服务将会被删除:',
okText: '删除',
okClass: 'btn-danger sj_btn_cir',
custom: "该服务删除后将会清除oracle对应服务的端口等资源占用但不删除数据文件是否删除请确认",
customClass: "alert alert-warning sj_alert-warning",
cancelText: "取消",
cancelClass: 'sj_btn_grey'
}).open();
}
else {
var name = "";
angular.forEach(extractItems, function (item) {
name += item.$oracleName + ",";
});
//alert("删除服务失败:" + name + "服务正在执行汇总操作,不能被删除");
Configs.customAlert("提示", "操作失败:正在执行汇总操作的服务不能被删除!", '', null, 0, "error");
}
};
$scope.createRCs = function () {
$http({
url: '/java/console/api/cancelOracleConection',
dataType: 'json',
method: 'POST',
params: { param: "data" }
}).success(function (data, header, config, status) {
console.log("success");
}).error(function (data, header, config, status) {
//log.warn("Failed to connect " + connectParam + " " + data + " " + status);
});
};
$scope.stopPrompt = function (selected) {
if (angular.isString(selected)) {
selected = [{
id: selected
}];
}
var extractItems = Kubernetes.checkForExtract(selected);
if (extractItems.length == 0) {
UI.multiItemConfirmActionDialog({
collection: selected,
index: '$alias',
onClose: function (result) {
if (result) {
function stopSelected(selected, next) {
if (next) {
Kubernetes.resizeController($http, KubernetesApiURL, next, 0, function () {
if (next.metadata.labels.style === "oracle") {
Kubernetes.connectOracle($http, $timeout, "/java/console/api/cancelOracleConection", "stop", next, 0);
}
stopSelected(selected, selected.shift());
});
}
}
stopSelected(selected, selected.shift());
}
},
title: '是否需要停止oracle服务',
action: '以下的oracle服务将会被停止:',
okText: '停止',
okClass: 'btn-danger sj_btn_cir',
custom: "该服务停止后将无法继续提供连接访问服务,但可通过启动按钮重新启动该服务以进行访问。是否停止,请确认",
customClass: "alert alert-warning sj_alert-warning",
cancelText: "取消",
cancelClass: 'sj_btn_grey'
}).open();
}
else {
var name = "";
angular.forEach(extractItems, function (item) {
name += item.$oracleName + ",";
});
//alert("停止服务失败:" + name + "服务正在执行汇总操作,不能停止");
Configs.customAlert("提示", "操作失败:正在执行汇总操作的服务不能被停止!", '', null, 0, "error");
}
};
$scope.reStartPrompt = function (selected) {
function startSelected(selected, next) {
if (next) {
console.log(Kubernetes.getLabels(next).status);
if (next.$replicas === 0) {
Kubernetes.resizeController($http, KubernetesApiURL, next, 1, function () {
Kubernetes.connectOracle($http, $timeout, "/java/console/api/connectOracle", "reStart", next, 200);
startSelected(selected, selected.shift());
});
}
else {
if (Kubernetes.getLabels(next).status == "1")
Kubernetes.connectOracle($http, $timeout, "/java/console/api/connectOracle", "reStart", next, 200);
startSelected(selected, selected.shift());
}
}
}
startSelected(selected, selected.shift());
};
/**
处理抽取标准表
**/
$scope.extractOracle = function (selected) {
var answer = false;
for (var i = 0; i < ConfigsModel.oracleParam.length; ++i) {
if (ConfigsModel.oracleParam[i].type == 1) {
answer = true;
break;
}
}
if (answer == false) {
/**
提示没有配置标准表汇总库
**/
Configs.customAlert("提示", "操作失败:没有配置默认的标准表汇总库", '', null, 0, "error");
return;
}
// 检查数据库是否已启动
var result = Kubernetes.checkIsStartSuccess(selected);
if (result.length > 0) {
Configs.customAlert("提示", "操作失败:选择服务中存在未启动的数据库,请先启动服务", '', null, 0, "error");
return;
}
var answer = false;
var selectedItem = null;
for (var i = 0; i < ConfigsModel.oracleParam.length; ++i) {
if (ConfigsModel.oracleParam[i].type == 1) {
selectedItem = ConfigsModel.oracleParam[i];
answer = true;
break;
}
}
if (answer == false) {
/**
提示没有配置标准表汇总库
**/
Configs.customAlert("提示", "操作失败:没有配置默认的标准表汇总库", '', null, 0, "error");
return;
}
Kubernetes.extractDataToOracle($http, "/java/console/api/oracle/standardextract", selected, selectedItem);
};
$scope.extractClick = {
items: null,
selectedItem: { name: "当前没有可用的汇总库" },
dialog: new UI.Dialog(),
onOk: function () {
var extractClick = $scope.extractClick;
extractClick.items = $scope.tableConfig.selectedItems;
Kubernetes.extractDataToOracle($http, "/java/console/api/oracle", extractClick.items, extractClick.selectedItem);
//extractClick.selectedItem = $scope.filterReplicationControllers[0] || "";
extractClick.dialog.close();
},
open: function (selected) {
var extractClick = $scope.extractClick;
if ($scope.configs && $scope.configs.oracleParam instanceof Array && $scope.configs.oracleParam.length > 0)
extractClick.selectedItem = $scope.configs.oracleParam[0];
var result = Kubernetes.checkIsStartSuccess($scope.tableConfig.selectedItems);
if (result.length > 0) {
Configs.customAlert("提示", "操作失败:选择服务中存在未启动的数据库,请先启动服务", '', null, 0, "error");
return;
}
extractClick.dialog.open();
/*extractData.selectedItem = $scope.filterReplicationControllers[0] || "";
extractData.items = selected;*/
$timeout(function () {
$('#newDataName').focus();
}, 50);
},
close: function () {
$scope.extractClick.selectedItem = { name: "当前没有可用的汇总库" };
$scope.extractClick.dialog.close();
}
};
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesInterfaces.ts"/>
var Kubernetes;
(function (Kubernetes) {
function schemaSetRequired(schema, propertyName, isRequired) {
if (isRequired === void 0) { isRequired = true; }
if (schema && propertyName) {
var required = schema.required;
if (isRequired) {
if (!required) {
required = [];
schema.required = required;
}
if (!_.contains(required, propertyName)) {
required.push(propertyName);
}
}
else {
if (required) {
var idx = required.indexOf(propertyName);
if (idx >= 0) {
required.splice(idx, 1);
}
}
}
}
}
Kubernetes.schemaSetRequired = schemaSetRequired;
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.SecretController = Kubernetes.controller("SecretController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "K8SClientFactory",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL, K8SClientFactory) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["id"];
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
Kubernetes.selectSubNavBar($scope, "Secrets", $scope.id ? "Edit Secret: " + $scope.id : "Create Secret");
var kubeClient = Kubernetes.createKubernetesClient("secrets");
var onSaveUrl = $location.search()["savedUrl"];
var createKind = $location.search()["kind"];
$scope.sshKeys = Kubernetes.sshSecretDataKeys;
$scope.httpsKeys = Kubernetes.httpsSecretDataKeys;
var secretLabels = {
"ssh-key": "SSH private key",
"ssh-key.pub": "SSH public key",
"ca.crt": "CA Certificate",
".dockercfg": "Docker config",
"username": "User name"
};
var secretTooltips = {
"ssh-key": "SSH private key text contents",
"ca.crt": "Certificate Authority (CA) Certificate",
".dockercfg": "Docker configuration token"
};
$scope.$on('kubernetesModelUpdated', function () {
if ($scope.id && !$scope.secret) {
updateData();
}
});
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
$scope.propertyKeys = function () {
return _.keys(secretLabels);
};
$scope.checkNameUnique = function (value) {
var answer = true;
angular.forEach($scope.model.secrets, function (secret) {
var name = Kubernetes.getName(secret);
if (value === name) {
answer = false;
}
});
return answer;
};
$scope.checkFieldUnique = function (key) {
return $scope.entity.properties[key] ? false : true;
};
$scope.hasAllKeys = function (keys) {
var answer = keys && keys.length;
angular.forEach(keys, function (key) {
if (!$scope.entity.properties[key]) {
answer = false;
}
});
return answer;
};
$scope.addFieldDialog = {
controller: null,
newReplicas: 0,
dialog: new UI.Dialog(),
onOk: function () {
$scope.addFieldDialog.dialog.close();
$scope.addDataField();
},
open: function (controller) {
var addFieldDialog = $scope.addFieldDialog;
addFieldDialog.dialog.open();
$timeout(function () {
$('#newDataName').focus();
}, 50);
},
close: function () {
$scope.addFieldDialog.dialog.close();
}
};
$scope.entityChanged = function () {
$scope.changed = true;
};
$scope.addFields = function (keys) {
angular.forEach(keys, function (key) { return addField(key); });
Core.$apply($scope);
};
function addField(key) {
var property = createProperty(key, "");
$scope.entity.properties[key] = property;
$scope.entity.newDataKey = "";
$scope.showAddDataFieldForm = false;
$scope.entityChanged();
}
$scope.addDataField = function () {
var key = $scope.entity.newDataKey;
if (key) {
addField(key);
Core.$apply($scope);
}
};
$scope.deleteProperty = function (key) {
if (key) {
delete $scope.entity.properties[key];
$scope.entityChanged();
Core.$apply($scope);
}
};
$scope.cancel = function () {
updateData();
};
$scope.save = function () {
var entity = $scope.entity || {};
var name = entity.name;
if (name) {
if (!$scope.secret) {
$scope.secret = {
apiVersion: Kubernetes.defaultApiVersion,
kind: "Secret",
metadata: {
name: ""
},
data: {}
};
}
var data = {};
angular.forEach(entity.properties, function (property) {
var key = property.key;
var value = property.value || "";
if (key) {
data[key] = window.btoa(value);
}
});
$scope.secret.metadata.name = name;
$scope.secret.data = data;
Core.notification('info', "Saving secret " + name);
kubeClient.put($scope.secret, function (data) {
var secretsLink = onSaveUrl || Developer.namespaceLink($scope, $routeParams, "secrets");
var params = {};
if (onSaveUrl) {
params['secret'] = name;
}
$location.path(secretsLink);
$location.search(params);
Kubernetes.log.info("navigating to URL: " + secretsLink + " with params " + angular.toJson($location.search()));
}, function (err) {
Core.notification('error', "Failed to secret " + name + "\n" + err);
});
}
};
updateData();
function createProperty(key, text) {
var label = secretLabels[key] || Core.humanizeValue(key);
var tooltip = secretTooltips[key] || "Value of the " + label;
var rows = 5;
var lines = text.split("\n").length + 1;
if (lines > rows) {
rows = lines;
}
var type = "textarea";
if (key === "username") {
type = "text";
if (!text) {
text = Kubernetes.currentUserName();
}
}
else if (key === "password") {
type = "password";
}
var property = {
key: key,
label: label,
tooltip: tooltip,
rows: rows,
value: text,
type: type
};
return property;
}
function updateData() {
$scope.item = null;
$scope.changed = false;
$scope.entity = {
name: $scope.id,
properties: {}
};
if ($scope.id) {
angular.forEach($scope.model.secrets, function (secret) {
var name = Kubernetes.getName(secret);
if (name === $scope.id) {
$scope.secret = secret;
angular.forEach(secret.data, function (value, key) {
var text = "";
if (angular.isString(value) && value) {
text = window.atob(value);
}
var property = createProperty(key, text);
$scope.entity.properties[key] = property;
});
$scope.fetched = true;
Core.$apply($scope);
}
});
}
else {
if (createKind === "ssh") {
$scope.addFields($scope.sshKeys);
}
else if (createKind === "https") {
$scope.addFields($scope.httpsKeys);
}
$scope.fetched = true;
Core.$apply($scope);
}
}
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
/// <reference path="kubernetesModel.ts"/>
/// <reference path="utilHelpers.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.SecretsController = Kubernetes.controller("SecretsController", ["$scope", "KubernetesModel", "KubernetesState", "ServiceRegistry", "$dialog", "$window", "$templateCache", "$routeParams", "$location", "localStorage", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, ServiceRegistry, $dialog, $window, $templateCache, $routeParams, $location, localStorage, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.$on('kubernetesModelUpdated', function () {
Core.$apply($scope);
});
$scope.$createSecretLink = Developer.namespaceLink($scope, $routeParams, "secretCreate");
var kubeClient = Kubernetes.createKubernetesClient("secrets");
$scope.tableConfig = {
data: 'model.secrets',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{
field: '_key',
displayName: 'Name',
defaultSort: true,
cellTemplate: $templateCache.get("idTemplate.html")
},
{
field: '$labelsText',
displayName: 'Labels',
cellTemplate: $templateCache.get("labelTemplate.html")
},
]
};
$scope.deletePrompt = function (selected) {
UI.multiItemConfirmActionDialog({
collection: selected,
index: 'metadata.name',
onClose: function (result) {
if (result) {
function deleteSelected(selected, next) {
if (next) {
kubeClient.delete(next, function () {
deleteSelected(selected, selected.shift());
});
}
else {
}
}
deleteSelected(selected, selected.shift());
}
},
title: 'Delete Secrets',
action: 'The following Secrets will be deleted:',
okText: 'Delete',
okClass: 'btn-danger',
custom: "This operation is permanent once completed!",
customClass: "alert alert-warning"
}).open();
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.ServiceController = Kubernetes.controller("ServiceController", ["$scope", "KubernetesModel", "KubernetesState", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesState, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.rawModel = null;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.itemConfig = {
properties: {
'^\\/labels$': {
template: $templateCache.get('labelTemplate.html')
}
}
};
$scope.$on('kubernetesModelUpdated', function () {
updateData();
});
$scope.$watch('model.services', function (newValue, oldValue) {
updateData();
}, true);
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
$scope.flipRaw = function () {
$scope.rawMode = !$scope.rawMode;
Core.$apply($scope);
};
updateData();
function updateData() {
$scope.id = $routeParams["id"];
$scope.namespace = $routeParams["namespace"] || KubernetesState.selectedNamespace;
$scope.item = $scope.model.getService($scope.namespace, $scope.id);
if ($scope.item) {
$scope.rawModel = Kubernetes.toRawYaml($scope.item);
}
Core.$apply($scope);
}
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.ServiceEditController = Kubernetes.controller("ServiceEditController", ["$scope", "KubernetesModel", "KubernetesState", "KubernetesSchema", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL", "SchemaRegistry",
function ($scope, KubernetesModel, KubernetesState, KubernetesSchema, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL, schemas) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
$scope.id = $routeParams["id"];
$scope.schema = KubernetesSchema;
$scope.config = schemas.cloneSchema("io.fabric8.kubernetes.api.model.Service");
//$scope.config = KubernetesSchema.definitions.kubernetes_v1beta2_Service;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.$on('$routeUpdate', function ($event) {
updateData();
});
updateData();
function updateData() {
if ($scope.id) {
$scope.entity = $scope.model.getService(KubernetesState.selectedNamespace, $scope.id);
Core.$apply($scope);
$scope.fetched = true;
}
else {
$scope.fetched = true;
}
}
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
/// <reference path="kubernetesModel.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes._module.factory('ServiceRegistry', [function () {
return new ServiceRegistryService();
}]);
/**
* Represents a simple interface to service discovery that can be used early on in the application lifecycle before the
* underlying model has been created via dependency injection
*/
var ServiceRegistryService = (function () {
function ServiceRegistryService() {
this.model = null;
}
/**
* Returns true if there is a service available for the given ID or false
*/
ServiceRegistryService.prototype.hasService = function (serviceName) {
return this.findService(serviceName) ? true : false;
};
/**
* Returns the service for the given service name (ID) or null if it cannot be found
*
* @param serviceName the name of the service to look for
* @return {null}
*/
ServiceRegistryService.prototype.findService = function (serviceName) {
var answer = null;
if (serviceName) {
var model = this.getModel();
if (model) {
var namespace = model.currentNamespace();
return model.getService(namespace, serviceName);
}
}
return answer;
};
/**
* Returns the service link for the given service name
*
* @param serviceName the name of the service
* @return {null}
*/
ServiceRegistryService.prototype.serviceLink = function (serviceName) {
var service = this.findService(serviceName);
return Kubernetes.serviceLinkUrl(service);
};
/**
* Returns the service link for the given service name if its ready (has at least one ready pod)
*
* @param serviceName the name of the service
* @return {null}
*/
ServiceRegistryService.prototype.serviceReadyLink = function (serviceName) {
var service = this.findService(serviceName);
if (Kubernetes.readyPodCount(service)) {
return Kubernetes.serviceLinkUrl(service);
}
else {
return null;
}
};
ServiceRegistryService.prototype.getModel = function () {
var answer = this.model;
// lets allow lazy load so we can be invoked before the injector has been created
if (!answer) {
var injector = HawtioCore.injector;
if (injector) {
this.model = injector.get('KubernetesModel');
}
}
answer = this.model;
return answer;
};
return ServiceRegistryService;
}());
Kubernetes.ServiceRegistryService = ServiceRegistryService;
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.ServiceApps = Kubernetes._module.controller('Kubernetes.ServiceApps', ["$scope", "KubernetesModel", function ($scope, KubernetesModel) {
$scope.model = KubernetesModel;
}]);
Kubernetes.Services = Kubernetes.controller("Services", ["$scope", "KubernetesModel", "KubernetesServices", "KubernetesPods", "KubernetesState", "$templateCache", "$location", "$routeParams", "$http", "$timeout", "KubernetesApiURL",
function ($scope, KubernetesModel, KubernetesServices, KubernetesPods, KubernetesState, $templateCache, $location, $routeParams, $http, $timeout, KubernetesApiURL) {
$scope.kubernetes = KubernetesState;
$scope.model = KubernetesModel;
ControllerHelpers.bindModelToSearchParam($scope, $location, 'mode', 'mode', 'list');
$scope.tableConfig = {
data: 'model.services',
showSelectionCheckbox: true,
enableRowClickSelection: false,
multiSelect: true,
selectedItems: [],
filterOptions: {
filterText: $location.search()["q"] || ''
},
columnDefs: [
{ field: '_key',
displayName: 'Name',
cellTemplate: $templateCache.get("idTemplate.html")
},
{ field: '$serviceUrl',
displayName: 'Address',
cellTemplate: $templateCache.get("portalAddress.html")
},
{ field: '$podCount',
displayName: 'Pods',
cellTemplate: $templateCache.get("podCountsAndLinkTemplate.html"),
customSortField: function (field) {
// need to concat all the pod counters
var ready = field.$podCounters.ready || 0;
var valid = field.$podCounters.valid || 0;
var waiting = field.$podCounters.waiting || 0;
var error = field.$podCounters.error || 0;
return ready + valid + waiting + error;
}
},
{ field: '$selectorText',
displayName: 'Selector',
cellTemplate: $templateCache.get("selectorTemplate.html")
},
{ field: '$labelsText',
displayName: 'Labels',
cellTemplate: $templateCache.get("labelTemplate.html")
}
]
};
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.deletePrompt = function (selected) {
if (angular.isString(selected)) {
selected = [{
id: selected
}];
}
UI.multiItemConfirmActionDialog({
collection: selected,
index: 'metadata.name',
onClose: function (result) {
if (result) {
function deleteSelected(selected, next) {
if (next) {
Kubernetes.log.debug("deleting: ", Kubernetes.getName(next));
KubernetesServices.delete({
id: Kubernetes.getName(next)
}, undefined, function () {
Kubernetes.log.debug("deleted: ", Kubernetes.getName(next));
deleteSelected(selected, selected.shift());
}, function (error) {
Kubernetes.log.debug("Error deleting: ", error);
deleteSelected(selected, selected.shift());
});
}
}
deleteSelected(selected, selected.shift());
}
},
title: 'Delete services?',
action: 'The following services will be deleted:',
okText: 'Delete',
okClass: 'btn-danger',
custom: "This operation is permanent once completed!",
customClass: "alert alert-warning"
}).open();
};
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
// controller for the status icon cell
Kubernetes.PodStatus = Kubernetes.controller("PodStatus", ["$scope", function ($scope) {
$scope.statusMapping = function (text) {
return Kubernetes.statusTextToCssClass(text);
};
}]);
Kubernetes._module.controller("Kubernetes.TermController", ["$scope", "TerminalService", function ($scope, TerminalService) {
$scope.canConnectTo = function (container) {
if (container.securityContext && container.securityContext.privileged) {
return false;
}
return true;
};
$scope.openTerminal = function (selfLink, containerName) {
var id = TerminalService.newTerminal(selfLink, containerName);
Kubernetes.log.debug("Created terminal, id: ", id);
};
}]);
Kubernetes.DataLabels = Kubernetes.controller("DataLabels", ['$scope', '$location', function ($scope, $location) {
$scope.labelClick = function (entity, key, value) {
$scope.$emit('dataLabelFilterUpdate', value, key);
};
$scope.labelClass = Kubernetes.containerLabelClass;
}]);
// controller that deals with the labels per pod
Kubernetes.Labels = Kubernetes.controller("Labels", ["$scope", "$location", function ($scope, $location) {
$scope.labels = [];
var labelKeyWeights = {
"cityName": 1,
"districtName": 2,
"systemName": 3,
"year": 4,
"version": 5
};
$scope.$watch('entity', function (newValue, oldValue) {
if (newValue) {
// log.debug("labels: ", newValue);
// massage the labels a bit
$scope.labels = [];
angular.forEach(Core.pathGet($scope.entity, ["metadata", "labels"]), function (value, key) {
if (key === 'fabric8' || key === 'style' || key === 'status' || (key === 'isTarget' && value === 'false') || key === 'isExtract' || key === 'name') {
// TODO not sure what this is for, the container type?
return;
}
$scope.labels.push({
key: key,
title: value
});
});
// lets sort by key but lets make sure that we weight certain labels so they are first
$scope.labels = $scope.labels.sort(function (a, b) {
function getWeight(key) {
return labelKeyWeights[key] || 0;
}
var n1 = a["key"];
var n2 = b["key"];
var w1 = getWeight(n1);
var w2 = getWeight(n2);
var diff = w1 - w2;
if (diff < 0) {
return -1;
}
else if (diff > 0) {
return 1;
}
if (n1 && n2) {
if (n1 > n2) {
return 1;
}
else if (n1 < n2) {
return -1;
}
else {
return 0;
}
}
else {
if (n1 === n2) {
return 0;
}
else if (n1) {
return 1;
}
else {
return -1;
}
}
});
}
});
$scope.handleClick = function (entity, labelType, value) {
// log.debug("handleClick, entity: ", entity, " key: ", labelType, " value: ", value);
$scope.$emit('labelFilterUpdate', value.title);
};
$scope.labelClass = Kubernetes.containerLabelClass;
}]);
//服务状态过滤
Kubernetes.Status = Kubernetes.controller('Status', ["$scope", "$http", "$interval", "$location", "KubernetesApiURL", function ($scope, $http, $interval, $location, KubernetesApiURL) {
/*$scope.$watch('entity', (newValue, oldValue) => {
if(newValue)
console.log(newValue);
},true);*/
}]);
Kubernetes.TaskEdit = Kubernetes.controller('TaskEdit', ['$scope', function ($scope) {
$scope.showDeleteOne = {
show: false,
item: null,
open: function (entity) {
if (entity.status == 1)
Configs.customAlert("提示", "操作失败: 正在迁移的任务,不能删除!", '', null, 0, "error");
else {
var showDeleteOne = $scope.showDeleteOne;
showDeleteOne.show = true;
showDeleteOne.item = entity;
}
},
onOk: function () {
var showDeleteOne = $scope.showDeleteOne;
$scope.$emit('deleteRow', showDeleteOne.item);
},
onCancel: function () {
var showDeleteOne = $scope.showDeleteOne;
showDeleteOne.show = false;
showDeleteOne.item = null;
}
};
/*$scope.deleteRow = (entity) =>{
$scope.$emit('deleteRow', entity);
}*/
}]);
Kubernetes.LoadMask = Kubernetes.controller('LoadMask', ['$scope', function ($scope) {
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="kubernetesHelpers.ts"/>
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes._module.directive("hawtioTabs", ['HawtioSubTabs', function (HawtioSubTabs) {
return {
link: function (scope, element, attrs) {
HawtioSubTabs.apply(scope.$eval('subTabConfig'));
}
};
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="kubernetesPlugin.ts"/>
var Kubernetes;
(function (Kubernetes) {
Kubernetes.TemplateController = Kubernetes.controller("TemplateController", [
"$scope", "$location", "$http", "$timeout", "$routeParams", "marked", "$templateCache", "$modal", "KubernetesModel", "KubernetesState", "KubernetesApiURL",
function ($scope, $location, $http, $timeout, $routeParams, marked, $templateCache, $modal, KubernetesModel, KubernetesState, KubernetesApiURL) {
var model = $scope.model = KubernetesModel;
$scope.filterText = $location.search()["q"];
$scope.targetNamespace = $routeParams.targetNamespace;
Kubernetes.initShared($scope, $location, $http, $timeout, $routeParams, KubernetesModel, KubernetesState, KubernetesApiURL);
$scope.$watchCollection('model.namespaces', function () {
if (!$scope.targetNamespace) {
$scope.targetNamespace = model.currentNamespace();
}
});
var returnTo = new URI($location.search()['returnTo'] || '/kubernetes/apps');
function goBack() {
$location.path(returnTo.path()).search(returnTo.query(true));
}
function getAnnotations(obj) {
return Core.pathGet(obj, ['metadata', 'annotations']);
}
function getValueFor(obj, key) {
var annotations = getAnnotations(obj);
if (!annotations) {
return "";
}
var name = Kubernetes.getName(obj);
if (name) {
var fullKey = "fabric8." + name + "/" + key;
var answer = annotations[fullKey];
if (answer) {
return answer;
}
}
var key = _.find(_.keys(annotations), function (k) { return _.endsWith(k, key); });
if (key) {
return annotations[key];
}
else {
return "";
}
}
$scope.cancel = function () {
if ($scope.formConfig) {
delete $scope.formConfig;
delete $scope.entity;
$scope.objects = undefined;
return;
}
goBack();
};
/*
$scope.$watch('model.templates.length', (newValue) => {
if (newValue === 0) {
goBack();
}
});
*/
$scope.filterTemplates = function (template) {
if (Core.isBlank($scope.filterText)) {
return true;
}
return _.contains(angular.toJson(template), $scope.filterText.toLowerCase());
};
$scope.openFullDescription = function (template) {
var text = marked(getValueFor(template, 'description') || 'No description');
var modal = $modal.open({
templateUrl: UrlHelpers.join(Kubernetes.templatePath, 'templateDescription.html'),
controller: ['$scope', '$modalInstance', function ($scope, $modalInstance) {
$scope.text = text,
$scope.ok = function () {
modal.close();
};
}]
});
};
$scope.getDescription = function (template) {
var answer = $(marked(getValueFor(template, 'description') || 'No description'));
var textDefault = answer.html();
var maxLength = 200;
if (textDefault.length > maxLength) {
var truncated = $.trim(textDefault).substring(0, maxLength).split(' ').slice(0, -1).join(' ');
answer.html(truncated + '...');
answer.append($templateCache.get('truncatedDescriptionTag.html'));
}
return answer.html();
};
$scope.getIconUrl = function (template) {
return getValueFor(template, 'iconUrl') || Kubernetes.defaultIconUrl;
};
$scope.deployTemplate = function (template) {
Kubernetes.log.debug("Template parameters: ", template.parameters);
Kubernetes.log.debug("Template objects: ", template.objects);
Kubernetes.log.debug("Template annotations: ", template.metadata.annotations);
var templateAnnotations = template.metadata.annotations;
if (templateAnnotations) {
_.forEach(template.objects, function (object) {
var annotations = object.metadata.annotations || {};
var name = Kubernetes.getName(object);
var matches = _.filter(_.keys(templateAnnotations), function (key) { return key.match('.' + name + '/'); });
matches.forEach(function (match) {
if (!(match in annotations)) {
annotations[match] = templateAnnotations[match];
}
});
object.metadata.annotations = annotations;
});
}
var routeServiceName = undefined;
var service = _.find(template.objects, function (obj) {
if (Kubernetes.getKind(obj) === "Service") {
var ports = Kubernetes.getPorts(obj);
if (ports && ports.length === 1) {
return true;
}
}
else {
return false;
}
});
if (service) {
routeServiceName = Kubernetes.getName(service);
}
Kubernetes.log.debug("Service: ", service);
if ((!routeServiceName || !Kubernetes.isOpenShift) && (!template.parameters || template.parameters.length === 0)) {
Kubernetes.log.debug("No parameters required, deploying objects");
applyObjects(template.objects);
return;
}
var formConfig = {
style: HawtioForms.FormStyle.STANDARD,
hideLegend: true,
properties: {}
};
var params = template.parameters;
_.forEach(params, function (param) {
var property = {};
property.label = _.startCase(param.name);
property.description = param.description;
property.default = param.value;
// TODO, do parameters support types?
property.type = 'string';
formConfig.properties[param.name] = property;
});
if (routeServiceName && Kubernetes.isOpenShift) {
formConfig.properties.createRoute = {
type: 'boolean',
default: true,
label: "Create Route"
};
/*
formConfig.properties.routeName = {
type: 'string',
label: 'Route Name',
default: routeServiceName,
'control-group-attributes': {
'ng-show': 'entity.createRoute'
}
};
*/
formConfig.properties.routeServiceName = {
type: 'hidden',
default: routeServiceName
};
var namespace = Kubernetes.currentKubernetesNamespace();
// TODO store this in localStorage!
var domain = "vagrant.f8";
var defaultRouteHostSuffix = '.' + (namespace === "default" ? "" : namespace + ".") + domain;
formConfig.properties.routeHostname = {
type: 'string',
default: defaultRouteHostSuffix,
label: "Route host name suffix",
'control-group-attributes': {
'ng-show': 'entity.createRoute'
}
};
}
$scope.entity = {};
$scope.formConfig = formConfig;
$scope.objects = template.objects;
Kubernetes.log.debug("Form config: ", formConfig);
};
function substitute(str, data) {
return str.replace(/\${\w*}/g, function (match) {
var key = match.replace(/\${/, '').replace(/}/, '').trim();
return data[key] || match;
});
}
;
$scope.substituteAndDeployTemplate = function () {
var objects = $scope.objects;
var objectsText = angular.toJson(objects, true);
// pull these out of the entity object so they're not used in substitutions
var createRoute = $scope.entity.createRoute;
var routeHostnameSuffix = $scope.entity.routeHostname || "";
var routeName = $scope.entity.routeName;
var routeServiceName = $scope.entity.routeServiceName;
delete $scope.entity.createRoute;
delete $scope.entity.routeHostname;
delete $scope.entity.routeName;
delete $scope.entity.routeServiceName;
objectsText = substitute(objectsText, $scope.entity);
objects = angular.fromJson(objectsText);
if (createRoute) {
var routes = [];
angular.forEach(objects, function (object) {
var kind = object.kind;
var name = Kubernetes.getName(object);
if (name && "Service" === kind) {
var routeHostname = name + routeHostnameSuffix;
var route = {
kind: "Route",
apiVersion: Kubernetes.defaultOSApiVersion,
metadata: {
name: name,
},
spec: {
host: routeHostname,
to: {
kind: "Service",
name: name
}
}
};
routes.push(route);
}
});
objects = objects.concat(routes);
}
if ($scope.targetNamespace !== model.currentNamespace()) {
$scope.$on('WatcherNamespaceChanged', function () {
Kubernetes.log.debug("Namespace changed");
setTimeout(function () {
applyObjects(objects);
Core.$apply($scope);
}, 500);
});
Core.notification('info', "Switching to namespace " + $scope.targetNamespace + " and deploying template");
model.kubernetes.selectedNamespace = $scope.targetNamespace;
}
else {
applyObjects(objects);
}
};
function applyObjects(objects) {
var projectClient = Kubernetes.createKubernetesClient("projects");
_.forEach(objects, function (object) {
Kubernetes.log.debug("Object: ", object);
var kind = Kubernetes.getKind(object);
var name = Kubernetes.getName(object);
var ns = Kubernetes.getNamespace(object);
if (kind && name) {
if (ns && ns !== Kubernetes.currentKubernetesNamespace()) {
var project = {
apiVersion: Kubernetes.defaultApiVersion,
kind: "Project",
metadata: {
name: ns,
labels: {}
}
};
projectClient.put(project, function (data) {
Kubernetes.log.info("Created namespace: " + ns);
}, function (err) {
Kubernetes.log.warn("Failed to create namespace: " + ns + ": " + angular.toJson(err));
});
}
var pluralKind = kind.toLowerCase() + "s";
var kubeClient = Kubernetes.createKubernetesClient(pluralKind, ns);
kubeClient.put(object, function (data) {
Kubernetes.log.info("updated " + kind + " name: " + name + (ns ? " ns: " + ns : ""));
}, function (err) {
Kubernetes.log.warn("Failed to update " + kind + " name: " + name + (ns ? " ns: " + ns : "") + " error: " + angular.toJson(err));
});
}
});
goBack();
}
$scope.deleteTemplate = function (template) {
UI.multiItemConfirmActionDialog({
collection: [template],
index: 'metadata.name',
onClose: function (result) {
if (result) {
KubernetesModel['templatesResource'].delete({
id: template.metadata.name
}, undefined, function () {
KubernetesModel['templatesResource'].query(function (data) {
KubernetesModel.templates = data.items;
});
}, function (error) {
Kubernetes.log.debug("Error deleting template: ", error);
});
}
},
title: 'Delete Template?',
action: 'The following template will be deleted:',
okText: 'Delete',
okClass: 'btn-danger',
custom: "This operation is permanent once completed!",
customClass: "alert alert-warning"
}).open();
};
}]);
})(Kubernetes || (Kubernetes = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="../../developer/ts/developerNavigation.ts"/>
var System;
(function (System) {
System.pluginName = "System";
System.context = "/system";
System.pluginPath = "plugins/system/";
System.templatePath = System.pluginPath + 'html/';
function shareInit($scope) {
//创建二级子菜单
$scope.subTabConfig = Developer.activateCurrent([
{
href: UrlHelpers.join(System.context, 'system-list'),
label: '信息系统清单',
title: '查看信息系统清单'
},
{
href: UrlHelpers.join(System.context, 'system-verification'),
label: '信息系统校验',
title: '校验信息系统'
},
{
href: UrlHelpers.join(System.context, 'system-sqlManagement'),
label: '信息系统脚本管理',
title: '管理sql脚本'
},
{
href: UrlHelpers.join(System.context, 'system-help'),
label: '帮助',
title: '行政区划代码或系统代码检索',
items: [{
href: UrlHelpers.join(System.context, 'system-help', 'regionalism-search'),
title: '行政区划代码检索',
label: '行政区划检索'
},
{
href: UrlHelpers.join(System.context, 'system-help', 'system-search'),
title: '系统代码检索',
label: '系统代码检索'
}]
}]);
}
System.shareInit = shareInit;
})(System || (System = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="systemHelpers.ts"/>
/// <reference path="../../configs/ts/configPlugin.ts"/>
var System;
(function (System) {
System._module = angular.module(System.pluginName, ['hawtio-core', 'hawtio-ui', 'ui.codemirror', 'ui.validate', 'kubernetesUI', 'ngFileUpload', 'ngDialog']);
System.controller = PluginHelpers.createControllerFunction(System._module, System.pluginName);
System.route = PluginHelpers.createRoutingFunction(System.templatePath);
/*
页面路由配置
*/
System._module.config(['$provide', '$routeProvider', function ($provide, $routeProvider) {
$routeProvider.when(UrlHelpers.join(System.context, '/'), System.route('systemList.html', false))
.when(UrlHelpers.join(System.context, 'system-list'), System.route('systemList.html', false))
.when(UrlHelpers.join(System.context, 'system-help'), System.route('regionalismCodeSearch.html', false))
.when(UrlHelpers.join(System.context, 'system-help', 'regionalism-search'), System.route('regionalismCodeSearch.html', false))
.when(UrlHelpers.join(System.context, 'system-help', 'system-search'), System.route('systemCodeSearch.html', false))
.when(UrlHelpers.join(System.context, 'system-verification'), System.route('systemVerification.html', false))
.when(UrlHelpers.join(System.context, 'system-sqlManagement'), System.route('systemSQLManagement.html', false))
.when(System.context, { redirectTo: UrlHelpers.join(System.context, 'system-list') });
}]);
/*
模块加载后初始化配置
*/
System._module.run(['viewRegistry', '$templateCache', 'HawtioNav', '$compile', function (viewRegistry, $templateCache, HawtioNav, $compile) {
viewRegistry['system'] = Configs.templatePath + "shareLayout.html";
/*
信息系统一级菜单导航
*/
var builder = HawtioNav.builder();
var systemTab = builder.id('systemTab')
.rank(10)
.href(function () { return System.context; })
.title(function () { return '信息系统'; })
.build();
HawtioNav.add(systemTab);
}]);
// 加载模块
hawtioPluginLoader.addModule(System.pluginName);
})(System || (System = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="systemPlugin.ts"/>
/// <reference path="systemHelpers.ts"/>\
/// <reference path="../../configs/ts/configsDataService.ts"/>
var System;
(function (System) {
System.RegionalismCodeController = System.controller('RegionalismCodeController', ["$scope", "$templateCache", "$location", "$routeParams", "$http", "$timeout", 'SystemModel', 'NgTableParams',
function ($scope, $templateCache, $location, $routeParams, $http, $timeout, SystemModel, NgTableParams) {
System.shareInit($scope);
$scope.model = SystemModel;
//console.log($scope.model.regionalismInfo);
$scope.tableParams = new NgTableParams({ count: 25 }, {
counts: [25, 50, 100],
dataset: $scope.model.regionalismInfo
});
}]);
})(System || (System = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="systemPlugin.ts"/>
var System;
(function (System) {
function classifyCity(regionalismInfo) {
var result = [];
angular.forEach(regionalismInfo, function (item) {
if (result.indexOf(item.cityName) == -1)
result.push(item.cityName);
});
return result;
}
System.classifyCity = classifyCity;
function classifyCountry(regionalismInfo, cityName) {
var result = [];
angular.forEach(regionalismInfo, function (item) {
if (item.cityName == cityName)
result.push({
name: item.districtName,
code: item.code
});
});
return result;
}
System.classifyCountry = classifyCountry;
var systemModelServices = (function () {
//public checkInfo: Array<any> = [];
function systemModelServices() {
this.systemInfoList = [];
this.systemInfo = [];
this.regionalismInfo = [];
this.sqlInfo = [];
this.updateCodeInfo();
this.updateExcelInfo();
this.updateSqlInfo();
//this.updateCheckInfo();
//console.log(classifyCountry(this.regionalismInfo, '南京市'));
}
systemModelServices.prototype.updateExcelInfo = function () {
var result = [];
$.ajax({
async: false,
type: "POST",
url: "/java/console/api/fileOperation/findAll",
success: function (data) {
if (data)
result = data.data;
}
});
this.systemInfoList = result;
};
systemModelServices.prototype.updateSqlInfo = function () {
var result = [];
$.ajax({
async: false,
type: "POST",
url: "/java/console/api/filePackage/findAll",
success: function (data) {
if (data)
result = data.data;
}
});
this.sqlInfo = result;
};
systemModelServices.prototype.updateCodeInfo = function () {
var result = [];
$.ajax({
async: false,
type: "POST",
url: "/java/console/api/code/list",
success: function (data) {
if (data) {
result = data;
}
}
});
this.regionalismInfo = result["regionalism"];
this.systemInfo = result["system"];
};
return systemModelServices;
}());
System._module.factory('SystemModel', ['$rootScope', '$http', function ($rootScope, $http) {
return new systemModelServices();
}]);
})(System || (System = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="systemPlugin.ts"/>
/// <reference path="systemHelpers.ts"/>
/// <reference path="systemServices.ts"/>
/// <reference path="../../configs/ts/configsUtils.ts"/>
/// <reference path="../../configs/ts/customAlert.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
var System;
(function (System) {
System.SystemSQLManagement = System.controller('SystemSQLManagement', ['$scope', '$location', '$http', '$element', '$templateCache', 'NgTableParams', 'ngDialog', 'SystemModel', function ($scope, $location, $http, $element, $templateCache, NgTableParams, ngDialog, SystemModel) {
System.shareInit($scope);
$scope.cities = System.classifyCity(SystemModel.regionalismInfo);
$scope.status = [{ id: 0, label: "有缺失" }, { id: 1, label: "正常" }, { id: 2, label: "待归档" }, { id: 3, label: "待审核" }];
SystemModel.updateSqlInfo();
$scope.cityFilter = $scope.model = SystemModel.sqlInfo;
$scope.checkboxes = {
checked: false,
items: {}
};
$scope.tableParams = new NgTableParams({ count: 25 }, {
counts: [25, 50, 100],
dataset: $scope.model
});
$scope.citySelect = function (x) {
if ($scope.z != 'all') {
$scope.statusFilter = [];
angular.forEach($scope.model, function (item) {
if ($scope.status[item.sysStatus].label == $scope.z)
$scope.statusFilter.push(item);
});
}
else
$scope.statusFilter = $scope.model;
if (x != 'all') {
$scope.countries = System.classifyCountry(SystemModel.regionalismInfo, x); //获取当前市下所有区县
$scope.cityFilter = [];
angular.forEach($scope.statusFilter, function (item) {
if (x == item.cityName)
$scope.cityFilter.push(item);
});
}
else {
$scope.countries = [];
$scope.y = 'all';
$scope.cityFilter = $scope.statusFilter;
}
$scope.countryFilter = $scope.cityFilter;
$scope.tableParams.settings({
dataset: $scope.cityFilter
});
};
$scope.countrySelect = function (y) {
if (y != 'all') {
$scope.countryFilter = [];
angular.forEach($scope.cityFilter, function (item) {
if (item.districtName == y)
$scope.countryFilter.push(item);
});
}
else
$scope.countryFilter = $scope.cityFilter;
$scope.tableParams.settings({
dataset: $scope.countryFilter
});
};
$scope.statusSelect = function (z) {
var tmp = [];
if ($scope.x == 'all')
tmp = $scope.model;
else
tmp = $scope.countryFilter;
var result = [];
if (z != 'all') {
angular.forEach(tmp, function (item) {
if ($scope.status[item.sysStatus].label == z)
result.push(item);
});
$scope.tableParams.settings({
dataset: result
});
}
else {
$scope.tableParams.settings({
dataset: tmp
});
}
};
$scope.quickCheck = function () {
updateSqlStatus("/java/console/api/filePackage/totalVerifySqlFile");
};
$scope.quitFile = function () {
updateSqlStatus("/java/console/api/filePackage/totalOnholeSqlFile");
};
$scope.help = function () {
ngDialog.open({
template: 'statusHelp.html',
width: 600,
height: 370,
closeByDocument: false,
className: 'ngdialog-theme-default'
});
};
// watch for check all checkbox
$scope.$watch(function () {
return $scope.checkboxes.checked;
}, function (value) {
angular.forEach($scope.model, function (item) {
$scope.checkboxes.items[item.id] = value;
});
});
// watch for data checkboxes
$scope.$watch(function () {
return $scope.checkboxes.items;
}, function (values) {
$scope.checkable = false;
for (var index in values) {
if (values[index] == true) {
$scope.checkable = true;
break;
}
}
var checked = 0, unchecked = 0, total = $scope.model.length;
angular.forEach($scope.model, function (item) {
checked += ($scope.checkboxes.items[item.id]) || 0;
unchecked += Number((!$scope.checkboxes.items[item.id])) || 0;
});
if ((unchecked == 0) || (checked == 0)) {
$scope.checkboxes.checked = (checked == total);
}
// grayed checkbox
angular.element($element[0].getElementsByClassName("select-all")).prop("indeterminate", (checked != 0 && unchecked != 0));
}, true);
//查看
$scope.viewSql = function (selected, type) {
ngDialog.open({
template: 'sqlView.html',
controller: 'Configs.SqlViewController',
width: 1000,
height: 600,
scope: $scope,
closeByDocument: false,
data: { type: type, item: selected },
className: 'ngdialog-theme-default'
});
};
//上传
$scope.addSql = function (selected, type) {
ngDialog.open({
template: 'sqlAdd.html',
controller: 'Configs.SqlAddController',
width: 600,
height: 600,
scope: $scope,
closeByDocument: false,
data: { type: type, item: selected },
className: 'ngdialog-theme-default'
});
};
$scope.verifySql = function (selected, type) {
ngDialog.open({
template: 'sqlVerification.html',
controller: 'Configs.sqlVerificationController',
width: 1000,
height: 600,
scope: $scope,
closeByDocument: false,
data: { type: type, item: selected },
className: 'ngdialog-theme-default'
});
};
$scope.moveSql = function (selected, type) {
ngDialog.open({
template: 'sqlMove.html',
controller: 'Configs.sqlMoveController',
width: 600,
height: 600,
scope: $scope,
closeByDocument: false,
data: { type: type, item: selected },
className: 'ngdialog-theme-default'
});
};
$scope.$on('onOk', function (event, data) {
Configs.create_mask(); //创建遮罩层
Kubernetes.create_locadEffect("正在更新文件,请稍等!"); //创建数据加载效果层
var target = document.getElementById('loading');
var spinner = new Spinner(Kubernetes.loadConfigs()).spin(target);
$http({
url: "/java/console/api/filePackage/handleSqlFile",
method: "POST",
params: { type: data.type, opt: data.opt },
data: JSON.stringify({
item: data.item,
content: data.content
})
}).success(function (data, header, config, status) {
$("#load").remove();
Kubernetes.removeMask();
shareUpdate(data);
}).error(function (data, header, config, status) {
$("#load").remove();
Kubernetes.removeMask();
});
});
$scope.$on("replace", function (event, data) {
$http({
url: "/java/console/api/filePackage/handleSqlFile",
method: "POST",
params: { type: data.type, opt: data.opt },
data: JSON.stringify({
item: data.item,
content: data.content
})
}).success(function (data, header, config, status) {
shareUpdate(data);
}).error(function (data, header, config, status) {
Configs.customAlert("提示", "脚本替换或归档失败!", '', null, 0, "error");
});
});
function shareUpdate(data) {
$scope.filterResult = $scope.model = SystemModel.sqlInfo = data.data;
var result = [];
if ($scope.x != "all") {
angular.forEach($scope.filterResult, function (item) {
if (item.cityName == $scope.x)
result.push(item);
});
$scope.filterResult = result;
result = [];
}
if ($scope.y != "all") {
angular.forEach($scope.filterResult, function (item) {
if (item.districtName == $scope.y)
result.push(item);
});
$scope.filterResult = result;
result = [];
}
$scope.tableParams.settings({
dataset: $scope.filterResult
});
}
function updateSqlStatus(url) {
var items = [];
if ($scope.model && $scope.model.length > 0) {
angular.forEach($scope.model, function (item) {
if ($scope.checkboxes.items[item.id])
items.push(item);
});
}
if (items.length <= 0)
return;
Configs.create_mask(); //创建遮罩层
Kubernetes.create_locadEffect("正在更新文件,请稍等!"); //创建数据加载效果层
$http({
url: url,
method: 'POST',
data: JSON.stringify(items)
}).success(function (data, header, config, status) {
var result = data.data, filter;
if ($scope.z != 'all') {
result = [];
angular.forEach(data.data, function (item) {
if ($scope.status[item.sysStatus].label == $scope.z)
result.push(item);
});
}
filter = result;
if ($scope.x != 'all') {
filter = [];
var tmp = [];
angular.forEach(result, function (item) {
if ($scope.x == item.cityName)
tmp.push(item);
});
filter = tmp;
if ($scope.y != 'all') {
filter = [];
angular.forEach(tmp, function (item) {
if ($scope.y == item.districtName)
filter.push(item);
});
}
}
$("#load").remove();
Kubernetes.removeMask();
$scope.tableParams.settings({
dataset: filter
});
//响应成功
}).error(function (data, header, config, status) {
//处理响应失败
$("#load").remove();
Kubernetes.removeMask();
Configs.customAlert("提示", "一键审核或归档失败!", '', null, 0, "error");
});
}
}]);
})(System || (System = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="systemPlugin.ts"/>
/// <reference path="systemHelpers.ts"/>
var System;
(function (System) {
System.SystemCodeController = System.controller('SystemCodeController', ["$scope", "$templateCache", "$location", "$routeParams", "$http", "$timeout", 'SystemModel', 'NgTableParams',
function ($scope, $templateCache, $location, $routeParams, $http, $timeout, SystemModel, NgTableParams) {
System.shareInit($scope);
$scope.model = SystemModel;
$scope.tableParams = new NgTableParams({ count: 25 }, {
counts: [25, 50, 100],
dataset: $scope.model.systemInfo
});
}]);
})(System || (System = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="systemPlugin.ts"/>
/// <reference path="systemHelpers.ts"/>
/// <reference path="../../configs/ts/customAlert.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="systemHelpers.ts"/>
/// <reference path="../../configs/ts/configsUtils.ts"/>
var System;
(function (System) {
System.SystemListController = System.controller('SystemListController', ['$scope', '$location', '$http', '$templateCache', 'Upload', 'NgTableParams', 'ngDialog', 'SystemModel', function ($scope, $location, $http, $templateCache, Upload, NgTableParams, ngDialog, SystemModel) {
System.shareInit($scope);
$scope.modelServices = SystemModel;
$scope.modelServices.updateExcelInfo();
$scope.model = SystemModel.systemInfoList;
// 表头显示的信息
$scope.columns = [
{ field: 'id', title: '操作', show: true },
{ field: "collection", title: "采集对象", filter: { collection: "select" }, filterData: booleanChoose(), show: true },
{ field: "cityName", title: "市", filter: { cityName: 'text' }, show: true },
{ field: "districtName", title: "区/县", filter: { districtName: 'text' }, show: true },
{ field: "areaCode", title: "行政区划代码", filter: { areaCode: 'text' }, show: true },
{ field: "areaLevel", title: "地区级次", filter: { areaLevel: "select" }, filterData: levelType(), show: true },
{ field: "sysName", title: "信息系统名称", filter: { sysName: "text" }, show: true },
{ field: "departmentManager", title: "联系人", filter: { departmentManager: "text" }, show: true },
{ field: "managerContacts", title: "联系方式", filter: { managerContacts: "text" }, show: true },
{ field: "dataBaseType", title: "数据库类型", filter: { dataBaseType: "select" }, filterData: databaseType(), show: true },
{ field: "userTablespaceStatus", title: "oracle用户名表空间", filter: { userTablespaceStatus: "select" }, filterData: booleanChoose(), show: true },
{ field: "checkoutPayStatus", title: "支付信息标准表脚本", filter: { checkoutPayStatus: "select" }, filterData: booleanChoose(), show: true },
{ field: "checkoutIndicateStatus", title: "可执行标准表脚本", filter: { checkoutIndicateStatus: "select" }, filterData: booleanChoose(), show: true },
];
// 点击查看按钮事件处理函数
$scope.viewClick = function (selected) {
ngDialog.open({
template: 'systemInfo.html',
controller: 'Configs.SystemInfoController',
width: 790,
closeByDocument: false,
data: selected,
className: 'ngdialog-theme-default'
});
};
// 表数据
$scope.tableParams = new NgTableParams({ count: 25 }, {
counts: [25, 50, 100],
dataset: $scope.model
});
// 文件上传
$scope.upLoadExcelFile = function () {
Configs.FileInputPlugin(function (files) {
var fileNameList = []; //获取文件名列表
angular.forEach(files, function (file) {
fileNameList.push(file.name);
});
Configs.create_mask();
Kubernetes.create_locadEffect("正在上传文件...");
var target = document.getElementById('loading');
var spinner = new Spinner(Kubernetes.loadConfigs()).spin(target);
var r = new Resumable({
target: '/java/console/api/fileOperation/file/upload',
chunkSize: 1 * 1024 * 1024,
simultaneousUploads: 4,
testChunks: false,
throttleProgressCallbacks: 1,
method: "octet"
});
if (!r.support) {
throw "当前浏览器不支持Resumable.js文件上传";
}
else {
angular.forEach(files, function (file) {
r.addFile(file);
});
r.on('fileAdded', function (file) {
r.upload();
});
r.on('complete', function () {
$('#loadmsg').html("所以文件上传完毕,正在读取文件中的数据,此过程时间可能会较长,请稍等...");
$.ajax({
type: "POST",
url: UrlHelpers.join("/java/console/api/fileOperation/importExcel"),
timeout: 8000 * fileNameList.length,
dataType: 'json',
data: JSON.stringify(fileNameList),
contentType: "application/json; charset=utf-8",
complete: function (XMLHttpRequest, textStatus) {
$("#load").remove();
Kubernetes.removeMask();
if (XMLHttpRequest.status == 200) {
Configs.customAlert("提示", "操作成功: 本次excel文件录入成功", '', null, 0, "success");
}
else {
Configs.customAlert("提示", "操作失败: 本次excel文件录入失败", '', null, 0, "error");
}
},
success: function (data) {
$scope.model = SystemModel.systemInfoList = data.data;
$scope.tableParams.settings({
dataset: $scope.model
});
},
error: function (MLHttpRequest, textStatus, errorThrown) {
//Configs.customAlert("提示", "操作失败: 本次excel文件录入失败, " + textStatus, '',null, 0, "error");
}
});
});
r.on('fileProgress', function (file) {
$('#loadmsg').html("上传文件:" + file.fileName + " " + Math.floor(r.progress() * 100) + '%');
//Kubernetes.create_locadEffect("上传文件:" + file.name + " " + Math.floor(r.progress()*100) + '%'); //创建数据加载效果层
});
//解决不同重复选择相同文件
var element = document.getElementById("file-uploads");
if (null != element)
element.outerHTML = element.outerHTML;
}
}, true);
};
$scope.upLoadExcelFiles = function (files) {
var fileNameList = []; //获取文件名列表
angular.forEach(files, function (file) {
fileNameList.push(file.name);
});
Configs.create_mask();
Kubernetes.create_locadEffect("正在上传文件...");
var target = document.getElementById('loading');
var spinner = new Spinner(Kubernetes.loadConfigs()).spin(target);
var r = new Resumable({
target: '/java/console/api/fileOperation/file/upload',
chunkSize: 1 * 1024 * 1024,
simultaneousUploads: 4,
testChunks: false,
throttleProgressCallbacks: 1,
method: "octet"
});
if (!r.support) {
throw "当前浏览器不支持Resumable.js文件上传";
}
else {
angular.forEach(files, function (file) {
r.addFile(file);
});
r.on('fileAdded', function (file) {
r.upload();
});
r.on('complete', function () {
$('#loadmsg').html("所以文件上传完毕,正在读取文件中的数据,此过程时间可能会较长,请稍等...");
$.ajax({
type: "POST",
url: UrlHelpers.join("/java/console/api/fileOperation/importExcel"),
timeout: 8000 * fileNameList.length,
dataType: 'json',
data: JSON.stringify(fileNameList),
contentType: "application/json; charset=utf-8",
complete: function (XMLHttpRequest, textStatus) {
$("#load").remove();
Kubernetes.removeMask();
if (XMLHttpRequest.status == 200) {
Configs.customAlert("提示", "操作成功: 本次excel文件录入成功", '', null, 0, "success");
}
else {
Configs.customAlert("提示", "操作失败: 本次excel文件录入失败", '', null, 0, "error");
}
},
success: function (data) {
$scope.model = SystemModel.systemInfoList = data.data;
$scope.tableParams.settings({
dataset: $scope.model
});
},
error: function (MLHttpRequest, textStatus, errorThrown) {
//Configs.customAlert("提示", "操作失败: 本次excel文件录入失败, " + textStatus, '',null, 0, "error");
}
});
});
r.on('fileProgress', function (file) {
$('#loadmsg').html("上传文件:" + file.fileName + " " + Math.floor(r.progress() * 100) + '%');
//Kubernetes.create_locadEffect("上传文件:" + file.name + " " + Math.floor(r.progress()*100) + '%'); //创建数据加载效果层
});
//解决不同重复选择相同文件
var element = document.getElementById("file-uploads");
element.outerHTML = element.outerHTML;
}
};
//excel下载
$scope.downLoadExcelFile = function () {
Configs.downloadFile($scope, $http, '/java/console/api/fileOperation/file/download');
};
$scope.downloadFilePackage = function () {
Configs.create_mask();
Kubernetes.create_locadEffect("正在下载文件,请稍等...");
var target = document.getElementById('loading');
var spinner = new Spinner(Kubernetes.loadConfigs()).spin(target);
Configs.downloadFile($scope, $http, '/java/console/api/filePackage/download', function () {
$("#load").remove();
Kubernetes.removeMask();
});
};
//boolean选择条件是/否
function booleanChoose() {
return [{ id: '是', title: '是' }, { id: '否', title: '否' }];
}
// 数据库类型选择条件oracle/sql Server
function databaseType() {
return [{ id: 'oracle', title: 'ORACLE' }, { id: 'sql Server', title: 'SQL SERVER' }];
}
//level选择条件
function levelType() {
return [{ id: '省', title: '省' }, { id: '市', title: '市' }, { id: '县', title: '县' }];
}
}]);
})(System || (System = {}));
/// <reference path="../../includes.ts"/>
/// <reference path="systemPlugin.ts"/>
/// <reference path="systemHelpers.ts"/>
/// <reference path="systemServices.ts"/>
/// <reference path="../../configs/ts/configsUtils.ts"/>
/// <reference path="../../kubernetes/ts/kubernetesHelpers.ts"/>
/// <reference path="../../configs/ts/customAlert.ts"/>
/// <reference path="../../configs/ts/configsDataService.ts"/>
/// <reference path="../../kubernetes/ts/term.ts"/>
var System;
(function (System) {
System.SystemVerificationController = System.controller('SystemVerificationController', ['$scope', '$interval', '$location', '$http', '$templateCache', 'Upload', 'NgTableParams', 'ngDialog', 'SystemModel', '$element', '$timeout', 'ConfigsModel', 'DataModel', 'TerminalService', function ($scope, $interval, $location, $http, $templateCache, Upload, NgTableParams, ngDialog, SystemModel, $element, $timeout, ConfigsModel, DataModel, TerminalService) {
System.shareInit($scope);
$scope.cities = System.classifyCity(SystemModel.regionalismInfo);
$scope.model = SystemModel;
$scope.tableData = null;
$scope.checkboxes = {
checked: false,
items: {}
};
// 表数据
$scope.tableParams = new NgTableParams({ count: 25 }, {
counts: [25, 50, 100],
dataset: $scope.tableData
});
$scope.citySelect = function (x) {
if (x != 'all') {
$scope.countries = System.classifyCountry(SystemModel.regionalismInfo, x);
$http({
url: "/java/console/api/checkout/findByCity",
method: "POST",
data: x
}).success(function (data, header, config, status) {
$scope.tableData = data.data;
$scope.tableParams.settings({
dataset: $scope.tableData
});
}).error(function (data, header, config, status) {
throw "请求失败";
});
}
else {
$scope.countries = [];
$scope.y = "all";
$scope.tableData = null;
$scope.checkboxes = {
checked: false,
items: {}
};
}
};
$scope.countrySelect = function (y) {
if (y != 'all') {
var result = [];
angular.forEach($scope.tableData, function (item) {
if (item.districtName == y)
result.push(item);
});
$scope.tableParams.settings({
dataset: result
});
}
else {
$scope.tableParams.settings({
dataset: $scope.tableData
});
}
};
$scope.checkSQLSERVER = function () {
/**
** 检查是否有默认标准表汇总库
**/
var answer = false;
for (var i = 0; i < ConfigsModel.oracleParam.length; ++i) {
if (ConfigsModel.oracleParam[i].type == 1) {
answer = true;
break;
}
}
if (answer == false) {
/**
提示没有配置标准表汇总库
**/
Configs.customAlert("提示", "操作失败:没有配置默认的标准表汇总库", '', null, 0, "error");
return;
}
var selectedItems = [];
if ($scope.tableData && $scope.tableData.length > 0) {
for (var i = 0; i < $scope.tableData.length; ++i) {
var item = $scope.tableData[i];
if ($scope.checkboxes.items[item.id]) {
if (item.collection == '否') {
/*
**提示出现没有采集数据的信息系统
code
*/
Configs.customAlert("提示", "操作失败:选择的系统存在没有数据的系统", '', null, 0, "error");
return;
}
item["_key"] = item.areaCode + "-" + item.sysCode + "-" + item.dataVersion;
if (item.dataBaseType == 'ORACLE') {
Configs.customAlert("提示", "操作失败:ORACLE数据请在服务集群界面中抽取标准表", '', null, 0, "error");
return;
}
selectedItems.push(item);
}
}
$http({
url: "/java/console/api/checkout/extractList",
method: "POST",
data: selectedItems
}).success(function (data, header, config, status) {
//console.log(data);
}).error(function (data, header, config, status) {
throw "请求失败";
});
}
};
$scope.deleteRows = function () {
var filter = [];
if ($scope.tableData && $scope.tableData.length > 0) {
angular.forEach($scope.tableData, function (item) {
if ($scope.checkboxes.items[item.id]) {
item["index"] = item.cityName + "_" + item.districtName + "_" + item.sysName + "_" + item.year + "_版本" + item.dataVersion;
filter.push(item);
}
});
}
UI.multiItemConfirmActionDialog({
collection: filter,
index: 'index',
onClose: function (result) {
if (result) {
$http({
url: "/java/console/api/checkout/deleteList",
method: "POST",
data: filter
}).success(function (data, header, config, status) {
$scope.tableData = data.data;
var result = [];
if ($scope.y != 'all') {
angular.forEach($scope.tableData, function (item) {
if (item.districtName == $scope.y)
result.push(item);
});
}
else {
result = $scope.tableData;
}
$scope.tableParams.settings({
dataset: result
});
}).error(function (data, header, config, status) {
throw "请求失败";
});
}
},
title: '是否需要删除采集数据?',
action: '以下采集数据文件将会被删除:',
okText: '删除',
okClass: 'btn-danger sj_btn_cir',
custom: "该删除操作将会彻底删除数据文件,是否删除,请确认!",
customClass: "alert alert-warning sj_alert-warning",
cancelText: "取消",
cancelClass: 'sj_btn_grey'
}).open();
};
$scope.check = function () {
//var sqlServerDB = [];
var oracleDB = [];
var selectedItems = [];
/**
** 检查是否有默认标准表汇总库
**/
var answer = false;
for (var i = 0; i < ConfigsModel.oracleParam.length; ++i) {
if (ConfigsModel.oracleParam[i].type == 1) {
answer = true;
break;
}
}
if (answer == false) {
/**
提示没有配置标准表汇总库
**/
Configs.customAlert("提示", "操作失败:没有配置默认的标准表汇总库", '', null, 0, "error");
return;
}
if ($scope.tableData && $scope.tableData.length > 0) {
for (var i = 0; i < $scope.tableData.length; ++i) {
var item = $scope.tableData[i];
if ($scope.checkboxes.items[item.id]) {
if (item.collection == '否') {
/*
**提示出现没有采集数据的信息系统
code
*/
Configs.customAlert("提示", "操作失败:选择的系统存在没有数据的系统", '', null, 0, "error");
return;
}
item["_key"] = item.areaCode + "-" + item.sysCode + "-" + item.dataVersion;
selectedItems.push(item);
if (item.dataBaseType == 'ORACLE') {
oracleDB.push(item);
}
}
}
/*
此处需要检查数据是否已挂载、正在迁移。
*/
var exited = Kubernetes.checkForCreateOracle(DataModel.transferTasks, selectedItems);
if (exited.length > 0) {
Configs.customAlert("提示", "操作失败: 正在迁移的数据不能执行校验操作!", '', null, 0, "error");
return;
}
/*
如果是Oracle数据先启动oracle数据
*/
if (oracleDB.length > 0) {
angular.forEach(oracleDB, function (item) {
Kubernetes.createRC({
name: item._key,
labels: {
system: item.sysCode.toString(),
version: item.dataVersion.toString(),
region: item.areaCode.toString()
},
annotations: {
cityName: item.cityName,
districtName: item.districtName,
systemName: item.sysName,
id: item.dataId + "",
year: item.year,
checkoutFlag: item.checkoutFlag
},
path: item.path + "app/",
isTarget: "false",
isExtract: item.extractStatus
}, function (rc) {
//Kubernetes.connectOracle($http, $timeout, "/java/console/api/connectOracle", "create", rc, 0);
});
});
$timeout(function () {
$location.path('/kubernetes/namespace/default/replicationControllers');
}, 500);
}
$http({
url: "/java/console/api/checkout/checkList",
method: "POST",
data: selectedItems
}).success(function (data, header, config, status) {
$scope.tableData = data.data;
var result = [];
if ($scope.y != 'all') {
angular.forEach($scope.tableData, function (item) {
if (item.districtName == $scope.y)
result.push(item);
});
}
else {
result = $scope.tableData;
}
$scope.tableParams.settings({
dataset: result
});
}).error(function (data, header, config, status) {
throw "请求失败";
});
}
};
// watch for check all checkbox
$scope.$watch(function () {
return $scope.checkboxes.checked;
}, function (value) {
angular.forEach($scope.tableData, function (item) {
$scope.checkboxes.items[item.id] = value;
});
});
// watch for data checkboxes
$scope.$watch(function () {
return $scope.checkboxes.items;
}, function (values) {
$scope.checkable = false;
for (var index in values) {
if (values[index] == true) {
$scope.checkable = true;
break;
}
}
var checked = 0, unchecked = 0, total = -1;
if ($scope.tableData && ($scope.tableData instanceof Array))
total = $scope.tableData.length;
angular.forEach($scope.tableData, function (item) {
checked += ($scope.checkboxes.items[item.id]) || 0;
unchecked += Number(!$scope.checkboxes.items[item.id]) || 0;
});
if ((unchecked == 0) || (checked == 0)) {
$scope.checkboxes.checked = (checked == total);
}
// grayed checkbox
angular.element($element[0].getElementsByClassName("select-all")).prop("indeterminate", (checked != 0 && unchecked != 0));
}, true);
$scope.update = function (entity) {
ngDialog.open({
template: 'sysVerificationUpdate.html',
controller: 'Configs.sysVerUpdateController',
width: 900,
height: 600,
closeByDocument: false,
data: entity,
scope: $scope,
className: 'ngdialog-theme-default'
});
};
$scope.$on('updateRow', function (event, data) {
$http({
url: "/java/console/api/checkout/update",
method: 'POST',
data: JSON.stringify(data)
}).success(function (data, header, config, status) {
if (header == 200) {
Configs.customAlert("提示", "操作成功!", '', null, 0, "success");
var result = [];
if ($scope.y != 'all') {
angular.forEach(data.data, function (item) {
if ($scope.y == item.districtName)
result.push(item);
});
}
else
result = data.data;
$scope.tableParams.settings({
dataset: result
});
}
else
Configs.customAlert("提示", "操作失败!", '', null, 0, "error");
}).error(function (data, header, config, status) {
Configs.customAlert("提示", "操作失败:发生请求失败,不能删除!", '', null, 0, "error");
});
});
$scope.openLog = function (entity) {
console.log(entity);
var name = entity.areaCode + "_" + entity.sysCode + "_" + entity.dataVersion;
var containerName = entity.cityName + "-" + entity.districtName + "-" + entity.sysName + "-版本" + entity.dataVersion;
entity["name"] = name;
TerminalService.newTerminal($interval, entity.id + "", containerName, entity, "/java/console/api/standardextract/log?rcName=" + name, $templateCache.get(UrlHelpers.join(Kubernetes.templatePath, 'logShell.html')));
};
}]);
})(System || (System = {}));
/// <reference path="../../includes.ts"/>
var Navigation;
(function (Navigation) {
Navigation.pluginName = 'hawtio-navigation';
Navigation.log = Logger.get(Navigation.pluginName);
Navigation._module = angular.module(Navigation.pluginName, []);
Navigation._module.run(function () {
});
Navigation._module.service('HawtioBreadcrumbs', function () {
var _config = [];
var self = {
apply: function (config) {
_config.length = 0;
_.forEach(config, function (crumb) {
_config.push(crumb);
});
},
get: function () {
return _config;
}
};
return self;
});
Navigation._module.service('HawtioSubTabs', function () {
var _config = [];
var self = {
apply: function (config) {
_config.length = 0;
_.forEach(config, function (crumb) {
_config.push(crumb);
});
},
get: function () {
return _config;
}
};
return self;
});
Navigation._module.directive('hawtioRelativeHref', ['$location', function ($location) {
return {
restrict: 'A',
link: function (scope, element, attr) {
var targetPath = attr['hawtioRelativeHref'];
var targetHref = new URI($location.url());
targetHref.segment(targetPath);
element.attr('href', targetHref.toString());
}
};
}]);
Navigation._module.directive('viewportHeight', ['$window', '$document', function ($window, $document) {
return {
restrict: 'A',
link: function (scope, element, attr) {
// log.debug("Window: ", $window);
// log.debug("element: ", element);
var win = $($window);
var resizeFunc = function () {
var viewportHeight = win.innerHeight();
// log.debug("Viewport height: ", viewportHeight);
var elTop = element.offset().top;
// log.debug("Element top: ", elTop);
var height = viewportHeight - elTop;
element.css('height', height);
};
win.on('resize', resizeFunc);
element.on('$destroy', function () {
win.off('resize', resizeFunc);
});
setTimeout(resizeFunc, 50);
}
};
}]);
Navigation._module.directive('hawtioMainOutlet', ['HawtioSubTabs', function (HawtioSubTabs) {
return {
restrict: 'A',
link: function (scope, element, attrs) {
scope.tabs = HawtioSubTabs;
scope.$watchCollection('tabs.get()', function (tabs) {
// log.debug("subTabConfig: ", subTabConfig);
if (tabs && tabs.length > 0) {
element.removeClass('hidden-nav');
element.css({ 'margin-left': '' });
}
else {
element.addClass('hidden-nav');
element.css({ 'margin-left': 'auto' });
}
});
}
};
}]);
Navigation._module.directive('hawtioTabsOutlet', ['HawtioSubTabs', function (HawtioSubTabs) {
var initialized = false;
return {
restrict: 'AE',
replace: true,
template: "\n <div class=\"nav-pf-vertical nav-pf-vertical-with-secondary-nav\" ng-controller=\"Developer.NavBarController\" ng-class=\"getClass()\">\n <div class=\"list-group\">\n <div ng-repeat=\"subTab in subTabConfig\" ng-show=\"true\"\n class=\"list-group-item {{subTab.active ? 'active' : ''}}\" >\n <a ng-hide=\"subTab.template\" href=\"{{subTab.href}}\">\n <span ng-show=\"subTab.class\" ng-class=\"subTab.class\"></span>\n <img ng-show=\"subTab.icon\" ng-src=\"{{subTab.icon}}\">\n {{subTab.label}}\n </a>\n <div ng-show=\"subTab.template\" compile=\"subTab.template\"></div>\n </div>\n </>\n </div>\n ",
link: function (scope, element, attrs) {
if (!initialized) {
try {
}
catch (err) {
}
initialized = true;
}
scope.HawtioSubTabs = HawtioSubTabs;
var collapsed = false;
scope.getClass = function () {
//log.debug("My class: ", element.attr('class'));
if (!scope.subTabConfig || !scope.subTabConfig.length) {
return 'hidden';
}
if (collapsed) {
return 'collapsed';
}
return '';
};
scope.$on('hawtioCollapseNav', function () {
collapsed = !collapsed;
});
scope.$watch('HawtioSubTabs.get()', function (subTabConfig) {
scope.subTabConfig = subTabConfig;
});
}
};
}]);
Navigation._module.directive('hawtioBreadcrumbsOutlet', ['HawtioBreadcrumbs', 'HawtioSubTabs', function (HawtioBreadcrumbs, HawtioSubTabs) {
return {
restrict: 'E',
scope: {},
template: "\n <div class=\"nav navbar-nav nav-breadcrumb nav-breadcrumbs\" ng-show=\"breadcrumbConfig\" ng-controller=\"Developer.NavBarController\">\n <ol class=\"breadcrumb\">\n <li ng-repeat=\"breadcrumb in breadcrumbConfig\" ng-show=\"isValid(breadcrumb) && label(breadcrumb)\"\n class=\"{{breadcrumb.active ? 'active' : ''}}\"\n ng-class=\"$last ? 'dropdown' : ''\"\n >\n <a ng-show=\"breadcrumb.href\" href=\"{{breadcrumb.href}}\">{{label(breadcrumb)}}</a>\n <span ng-hide=\"breadcrumb.href\">{{label(breadcrumb)}}</span>\n </li>\n <li ng-show=\"pageTitle\">\n <span ng-bind=\"pageTitle\"></span>\n </li>\n </ol>\n </div>\n ",
link: function (scope, element, attrs) {
scope.breadcrumbs = HawtioBreadcrumbs;
scope.tabs = HawtioSubTabs;
scope.$watchCollection('breadcrumbs.get()', function (breadcrumbConfig) {
scope.breadcrumbConfig = breadcrumbConfig;
});
scope.$watchCollection('tabs.get()', function (tabs) {
var active = _.find(tabs, function (tab) { return tab.active; });
if (active) {
scope.pageTitle = active.label;
}
else {
scope.pageTitle = undefined;
}
});
}
};
}]);
Navigation._module.directive('platformSubTabsOutlet', ['HawtioSubTabs', function (HawtioSubTabs) {
var initialized = false;
return {
restrict: 'AE',
replace: true,
template: "\n <div class=\"nav-pf-vertical nav-pf-vertical-with-secondary-nav sj_menu\" ng-controller=\"Developer.NavBarController\" ng-class=\"getClass()\">\n <ul class=\"navbar-lf-menu \" >\n <li ng-repeat=\"subTab in subTabConfig \" >\n <div class=\"expandable closed \" ng-show=\"subTab.items.length\" style=\" padding:0;\">\n <div class=\"title sj_menu_nav\" >\n <i class=\" sj_menu_01\" >{{subTab.label}}</i> \n </div>\n <ul class=\"expandable-body sj_menu_ul\" >\n <li ng-repeat=\"item in subTab.items\" >\n <a href=\"{{item.href}}\" >{{item.label}}</a>\n </li>\n </ul>\n </div>\n <div ng-hide=\"subTab.items.length\" class=\"sj_menu_nav\" >\n <i class=\" sj_menu_02\" ></i><a href=\"{{subTab.href}}\">{{subTab.label}}</a> \n </div>\n </li> \n </ul>\n </div> \n ",
link: function (scope, element, attrs) {
if (!initialized) {
try {
}
catch (err) {
}
initialized = true;
}
scope.HawtioSubTabs = HawtioSubTabs;
var collapsed = false;
scope.getClass = function () {
//log.debug("My class: ", element.attr('class'));
if (!scope.subTabConfig || !scope.subTabConfig.length) {
return 'hidden';
}
if (collapsed) {
return 'collapsed';
}
return '';
};
scope.$on('hawtioCollapseNav', function () {
collapsed = !collapsed;
});
scope.$watch('HawtioSubTabs.get()', function (subTabConfig) {
scope.subTabConfig = subTabConfig;
});
}
};
}]);
//hawtioPluginLoader.addModule('patternfly');
hawtioPluginLoader.addModule(Navigation.pluginName);
})(Navigation || (Navigation = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluY2x1ZGVzLnRzIiwiY29uZmlncy90cy9jb25maWdQbHVnaW4udHMiLCJjb25maWdzL3RzL2NvbmZpZ3NEYXRhU2VydmljZS50cyIsImRldmVsb3Blci90cy9kZXZlbG9wZXJOYXZpZ2F0aW9uLnRzIiwia3ViZXJuZXRlcy90cy9rdWJlcm5ldGVzSW50ZXJmYWNlcy50cyIsImt1YmVybmV0ZXMvdHMvdXRpbEhlbHBlcnMudHMiLCJjb25maWdzL3RzL2N1c3RvbUFsZXJ0LnRzIiwia3ViZXJuZXRlcy90cy9yZWFkUGxhY2VkaXZpc2lvbi50cyIsImt1YmVybmV0ZXMvdHMva3ViZXJuZXRlc0hlbHBlcnMudHMiLCJkZXZlbG9wZXIvdHMvZGV2ZWxvcGVySGVscGVycy50cyIsImRldmVsb3Blci90cy9kYXRhTWFuYWdlckhlbHBlci50cyIsImNvbmZpZ3MvdHMvQ29uZmlnc0hlbHBlci50cyIsImNvbmZpZ3MvdHMvY29uZmlnc1V0aWxzLnRzIiwia3ViZXJuZXRlcy90cy9rdWJlcm5ldGVzUGx1Z2luLnRzIiwia3ViZXJuZXRlcy90cy93YXRjaGVyLnRzIiwia3ViZXJuZXRlcy90cy90ZXJtLnRzIiwiY29uZmlncy90cy9zaGFyZUNvbnRyb2xsZXIudHMiLCJjb25maWdzL3RzL2dsdXN0ZXJmc1NldHRpbmcudHMiLCJjb25maWdzL3RzL2t1YmVDbHVzdGVyU2V0dGluZy50cyIsImRldmVsb3Blci90cy9kZXZlbG9wZXJQbHVnaW4udHMiLCJkZXZlbG9wZXIvdHMvZGF0YU1hbmFnZXJNb2RlbC50cyIsImRldmVsb3Blci90cy9kZXZlbG9wZXJFbnJpY2hlcnMudHMiLCJkZXZlbG9wZXIvdHMvZW52aXJvbm1lbnRQYW5lbC50cyIsImRldmVsb3Blci90cy9maWxlTWlncmF0aW9uVGFzay50cyIsImRldmVsb3Blci90cy9ob21lLnRzIiwiZGV2ZWxvcGVyL3RzL2plbmtpbnNKb2IudHMiLCJkZXZlbG9wZXIvdHMvamVua2luc0pvYnMudHMiLCJrdWJlcm5ldGVzL3RzL2t1YmVybmV0ZXNNb2RlbC50cyIsImRldmVsb3Blci90cy9qZW5raW5zTG9nLnRzIiwiZGV2ZWxvcGVyL3RzL2plbmtpbnNNZXRyaWNzLnRzIiwiZGV2ZWxvcGVyL3RzL25hdmJhci50cyIsImRldmVsb3Blci90cy9waXBlbGluZS50cyIsImRldmVsb3Blci90cy9waXBlbGluZURpcmVjdGl2ZS50cyIsImRldmVsb3Blci90cy9waXBlbGluZXMudHMiLCJkZXZlbG9wZXIvdHMvcHJvamVjdC50cyIsImRldmVsb3Blci90cy9wcm9qZWN0U2VsZWN0b3IudHMiLCJkZXZlbG9wZXIvdHMvcHJvamVjdHMudHMiLCJkZXZlbG9wZXIvdHMvd29ya3NwYWNlLnRzIiwiZGV2ZWxvcGVyL3RzL3dvcmtzcGFjZXMudHMiLCJrdWJlcm5ldGVzL3RzL2FwcHMudHMiLCJrdWJlcm5ldGVzL3RzL2JyZWFkY3J1bWJzLnRzIiwia3ViZXJuZXRlcy90cy9idWlsZC50cyIsImt1YmVybmV0ZXMvdHMvYnVpbGRDb25maWcudHMiLCJrdWJlcm5ldGVzL3RzL2J1aWxkQ29uZmlnRWRpdC50cyIsImt1YmVybmV0ZXMvdHMvYnVpbGRDb25maWdzLnRzIiwia3ViZXJuZXRlcy90cy9idWlsZExvZ3MudHMiLCJrdWJlcm5ldGVzL3RzL2J1aWxkcy50cyIsImt1YmVybmV0ZXMvdHMvY29ubmVjdC50cyIsImt1YmVybmV0ZXMvdHMvZGVwbG95bWVudENvbmZpZy50cyIsImt1YmVybmV0ZXMvdHMvZGVwbG95bWVudENvbmZpZ3MudHMiLCJrdWJlcm5ldGVzL3RzL2V2ZW50cy50cyIsImt1YmVybmV0ZXMvdHMvaG9zdC50cyIsImt1YmVybmV0ZXMvdHMvaG9zdHMudHMiLCJrdWJlcm5ldGVzL3RzL2ltYWdlUmVwb3NpdG9yaWVzLnRzIiwia3ViZXJuZXRlcy90cy9rdWJlcm5ldGVzTmF2aWdhdGlvbi50cyIsImt1YmVybmV0ZXMvdHMvc2NoZW1hLnRzIiwia3ViZXJuZXRlcy90cy9rdWJlcm5ldGVzU2NoZW1hLnRzIiwia3ViZXJuZXRlcy90cy9rdWJlcm5ldGVzU2VydmljZXMudHMiLCJrdWJlcm5ldGVzL3RzL2t1YmVybmV0ZXNUb3BMZXZlbC50cyIsImt1YmVybmV0ZXMvdHMvbmFtZXNwYWNlLnRzIiwia3ViZXJuZXRlcy90cy9vdmVydmlldy50cyIsImt1YmVybmV0ZXMvdHMvcGlwZWxpbmVzLnRzIiwia3ViZXJuZXRlcy90cy9wb2QudHMiLCJrdWJlcm5ldGVzL3RzL3BvZEVkaXQudHMiLCJrdWJlcm5ldGVzL3RzL3BvZExvZ3MudHMiLCJrdWJlcm5ldGVzL3RzL3BvZHMudHMiLCJrdWJlcm5ldGVzL3RzL3JlcGxpY2F0aW9uQ29udHJvbGxlci50cyIsImt1YmVybmV0ZXMvdHMvcmVwbGljYXRpb25Db250cm9sbGVyRWRpdC50cyIsImt1YmVybmV0ZXMvdHMvcmVwbGljYXRpb25Db250cm9sbGVycy50cyIsImt1YmVybmV0ZXMvdHMvc2NoZW1hSGVscGVycy50cyIsImt1YmVybmV0ZXMvdHMvc2VjcmV0LnRzIiwia3ViZXJuZXRlcy90cy9zZWNyZXRzLnRzIiwia3ViZXJuZXRlcy90cy9zZXJ2aWNlLnRzIiwia3ViZXJuZXRlcy90cy9zZXJ2aWNlRWRpdC50cyIsImt1YmVybmV0ZXMvdHMvc2VydmljZVJlZ2lzdHJ5LnRzIiwia3ViZXJuZXRlcy90cy9zZXJ2aWNlcy50cyIsImt1YmVybmV0ZXMvdHMvc2hhcmVkQ29udHJvbGxlcnMudHMiLCJrdWJlcm5ldGVzL3RzL3RhYnMudHMiLCJrdWJlcm5ldGVzL3RzL3RlbXBsYXRlcy50cyIsInN5c3RlbS90cy9zeXN0ZW1IZWxwZXJzLnRzIiwic3lzdGVtL3RzL3N5c3RlbVBsdWdpbi50cyIsInN5c3RlbS90cy9yZWdpb25hbGlzbUNvZGVTZWFyY2gudHMiLCJzeXN0ZW0vdHMvc3lzdGVtU2VydmljZXMudHMiLCJzeXN0ZW0vdHMvc3FsTWFuYWdlbWVudC50cyIsInN5c3RlbS90cy9zeXN0ZW1Db2RlU2VhcmNoLnRzIiwic3lzdGVtL3RzL3N5c3RlbUxpc3QudHMiLCJzeXN0ZW0vdHMvc3lzdGVtVmVyaWZpY2F0aW9uLnRzIiwibmF2aWdhdGlvbi90cy9uYXZpZ2F0aW9uUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNEQUFzRDtBQUN0RCwrREFBK0Q7QUFDL0Qsc0RBQXNEO0FBQ3RELG1EQUFtRDtBQUNuRCwwREFBMEQ7O0FDSjFELHlDQUF5QztBQUV6QyxJQUFPLE9BQU8sQ0FvRGI7QUFwREQsV0FBTyxPQUFPLEVBQUMsQ0FBQztJQUVKLGtCQUFVLEdBQUcsU0FBUyxDQUFDO0lBQ3ZCLGVBQU8sR0FBRyxTQUFTLENBQUM7SUFDcEIsa0JBQVUsR0FBRyxrQkFBa0IsQ0FBQztJQUM3QixvQkFBWSxHQUFHLGtCQUFVLEdBQUcsT0FBTyxDQUFDO0lBQ3ZDLGVBQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGtCQUFVLEVBQUUsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDbkgsYUFBSyxHQUFHLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBWSxDQUFDLENBQUM7SUFDMUQsa0JBQVUsR0FBRyxhQUFhLENBQUMsd0JBQXdCLENBQUMsZUFBTyxFQUFFLGtCQUFVLENBQUMsQ0FBQztJQUVwRixlQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFVBQUMsUUFBUSxFQUFFLGNBQWM7WUFDdEUsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQU8sRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLGFBQUssQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDcEcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBTyxFQUFFLHNCQUFzQixDQUFDLEVBQUUsYUFBSyxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUMvRixJQUFJLENBQUMsZUFBTyxFQUFFLEVBQUMsVUFBVSxFQUFFLFVB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RUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxTQUFTLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQztRQUN6SCxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLE9BQU8sRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQztRQUNoSixFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFlBQVksRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQztRQUN0SixFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQztRQUM3SSxFQUFDLFVBQVUsRUFBQyxXQUFXLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFlBQVksRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQztRQUN4SixFQUFDLFVBQVUsRUFBQyxnQkFBZ0IsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsZ0JBQWdCLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsV0FBVyxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUM7UUFDbEssRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxlQUFlLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFlBQVksRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUM7UUFDOUosRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFlBQVksRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQztRQUM1TCxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxnQkFBZ0IsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDO1FBQ3RKLEVBQUMsVUFBVSxFQUFDLFlBQVksRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxjQUFjLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQztRQUN2SCxFQUFDLFVBQVUsRUFBQyxZQUFZLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUM7UUFDbkgsRUFBQyxVQUFVLEVBQUMsZUFBZSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxXQUFXLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDO1FBQ3ZILEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxlQUFlLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQztRQUN0SCxFQUFDLFVBQVUsRUFBQyxnQkFBZ0IsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxpQkFBaUIsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDO1FBQzFILEVBQUMsVUFBVSxFQUFDLGlCQUFpQixFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxnQkFBZ0IsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsa0JBQWtCLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQztRQUN0SSxFQUFDLFVBQVUsRUFBQyxnQkFBZ0IsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsZ0JBQWdCLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLGlCQUFpQixFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUM7UUFDcEksRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxlQUFlLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFNBQVMsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUM7UUFDakssRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUM7UUFDN0ksRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUM7UUFDbEosRUFBQyxVQUFVLEVBQUMsZUFBZSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFlBQVksRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDO1FBQ3pILEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsS0FB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S0FBSyxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsaUJBQWlCLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFlBQVksRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDO1FBQzFILEVBQUMsVUFBVSxFQUFDLFlBQVksRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQztRQUNsSCxFQUFDLFVBQVUsRUFBQyxnQkFBZ0IsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsZ0JBQWdCLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLGdCQUFnQixFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUM7UUFDdEksRUFBQyxVQUFVLEVBQUMsZ0JBQWdCLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLGdCQUFnQixFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxrQkFBa0IsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDO1FBQ3hJLEVBQUMsVUFBVSxFQUFDLGlCQUFpQixFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxnQkFBZ0IsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDO1FBQzFGLEVBQUMsVUFBVSxFQUFDLGdCQUFnQixFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxpQkFBaUIsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDO1FBQzFGLEVBQUMsVUFBVSxFQUFDLGdCQUFnQixFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxnQkFBZ0IsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDO1FBQ3pGLEVBQUMsVUFBVSxFQUFDLG1CQUFtQixFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxjQUFjLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQztRQUMxRixFQUFDLFVBQVUsRUFBQyxjQUFjLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLGdCQUFnQixFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUM7UUFDdkYsRUFBQyxVQUFVLEVBQUMsZ0JBQWdCLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLGdCQUFnQixFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUM7UUFDekYsRUFBQyxVQUFVLEVBQUMsa0JBQWtCLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLGdCQUFnQixFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUM7UUFDM0YsRUFBQyxVQUFVLEVBQUMsa0JBQWtCLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLGdCQUFnQixFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUM7UUFDM0YsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxrQkFBa0IsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDO1FBQ3JGLEVBQUMsVUFBVSxFQUFDLFdBQVcsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxlQUFlLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQztRQUMxSCxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsZ0JBQWdCLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQztRQUN4SCxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLGNBQWMsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUM7UUFDbEgsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxZQUFZLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDO1FBQ2xILEVBQUMsVUFBVSxFQUFDLFNBQVMsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsbUJBQW1CLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFNBQVMsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDO1FBQzNILEVBQUMsVUFBVSxFQUFDLGdCQUFnQixFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxTQUFTLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDO1FBQ3pILEVBQUMsVUFBVSxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsY0FBYyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxtQkFBbUIsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDO1FBQ3BJLEVBQUMsVUFBVSxFQUFDLG9CQUFvQixFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLGdCQUFnQixFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUM7UUFDcEksRUFBQyxVQUFVLEVBQUMsU0FBUyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsRUFBQyxFQUFDLFVBQVUsRUFBQyxjQUFjLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLFNBQVMsRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQztJQUU5RywyQkFBZ0IsR0FBRyxDQUFDLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDekksRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxZQUFZLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNqSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLGNBQWMsRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQ2xILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxPQUFPLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUMzRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFNBQVMsRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsZUFBZSxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUM7UUFDbkgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLE1BQU0sRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxPQUFPLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUM1RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFdBQVcsRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQy9HLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsV0FBVyxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxlQUFlLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUNuSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFdBQVcsRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQy9HLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsT0FBTyxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUM7UUFDM0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxTQUFTLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFlBQVksRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQ2hILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsU0FBUyxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxZQUFZLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNqSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzNHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsV0FBVyxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUMzRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQ3pHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsY0FBYyxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDbkgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLGFBQWEsRUFBQyxVQUFVLEVBQUMsV0FBVyxFQUFDO1FBQ3ZILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsU0FBUyxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzNHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM1RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzVHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDOUcsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxTQUFTLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsU0FBUyxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFNBQVMsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzlHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxF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RUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDNUcsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQy9HLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE9BQU8sRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQzNHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsWUFBWSxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUM7UUFDaEgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxhQUFhLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUNqSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzNHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDM0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUMzRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsV0FBVyxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDaEgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLE1BQU0sRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxZQUFZLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNsSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUMvRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLGdCQUFnQixFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDckgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxnQkFBZ0IsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ3JILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxXQUFXLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNoSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzNHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsU0FBUyxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUMzRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQy9HLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsZUFBZSxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUM7UUFDbkgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxZQUFZLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNqSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQzlHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUM7UUFDOUcsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxZQUFZLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNqSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzNHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLE1BQU0sRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxZQUFZLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNsSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsTUFBTSxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLGFBQWEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ25ILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxNQUFNLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDOUcsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxZQUFZLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNqSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQy9HLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUM7UUFDekcsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzVHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxnQkFBZ0IsRUFBQyxVQUFVLEVBQUMsT0FBTyxFQUFDO1FBQ3RILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsWUFBWSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDakgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUMvRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLGNBQWMsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ25ILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsWUFBWSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDakgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQy9HLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxlQUFlLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNwSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFdBQVcsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ2hILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUMvRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQy9HLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsZUFBZSxFQUFDLFVBQVUsRUFB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QyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxhQUFhLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUNqSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzNHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUMzRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDM0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUN6RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzlHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDOUcsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM5RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzlHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDaEgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxhQUFhLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUNsSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLGVBQWUsRUFBQyxVQUFVLEVBQUMsRUFBRSxFQUFDO1FBQ2pILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsYUFBYSxFQUFDLFVBQVUsRUFBQyxFQUFFLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxTQUFTLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUM5RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzlHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDOUcsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxZQUFZLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNsSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ2hILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDOUcsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxTQUFTLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUM5RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzVHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDOUcsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUMvRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsYUFBYSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDbEgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxrQkFBa0IsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ3ZILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsZ0JBQWdCLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNySCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLGFBQWEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ2xILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsY0FBYyxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDbkgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxnQkFBZ0IsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ3JILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsZ0JBQWdCLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNySCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLG9CQUFvQixFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDekgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxlQUFlLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUNuSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzVHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUMvRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDM0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsaUJBQWlCLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUNySCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsWUFBWSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDakgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxhQUFhLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNsSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLGFBQWEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ2xILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsZ0JBQWdCLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNySCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLGFBQWEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ2xILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxnQkFBZ0IsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ3JILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsbUJBQW1CLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUN4SCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLG1CQUFtQixFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDeEgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxrQkFBa0IsRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQ3RILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsaUJBQWlCLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUN0SCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLGdCQUFnQixFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDckgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQy9HLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMs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QztRQUMvRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFNBQVMsRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDM0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsZUFBZSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDcEgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQzVHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxhQUFhLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNsSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE9BQU8sRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQzNHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsaUJBQWlCLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUNySCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFlBQVksRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ2pILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsWUFBWSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDakgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE9BQU8sRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQzNHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDM0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUM5RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDN0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDM0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUM3RyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLGdCQUFnQixFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDckgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxF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LFFBQVEsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUMvRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxlQUFlLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNwSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQy9HLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsU0FBUyxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDOUcsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUMzRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUMvRyxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQzdHLEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFdBQVcsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDaEgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLE1BQU0sRUFBQyxhQUFhLEVBQUMsV0FBVyxFQUFDLFVBQVUsRUFBQyxnQkFBZ0IsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ3pILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxTQUFTLEVBQUMsYUFBYSxFQUFDLFdBQVcsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDcEgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLE1BQU0sRUFBQyxhQUFhLEVBQUMsV0FBVyxFQUFDLFVBQVUsRUFBQyxjQUFjLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUN2SCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsU0FBUyxFQUFDLGFBQWEsRUFBQyxXQUFXLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ3BILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxNQUFNLEVBQUMsYUFBYSxFQUFDLFdBQVcsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDL0csRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLFNBQVMsRUFBQyxhQUFhLEVBQUMsV0FBVyxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNwSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxXQUFXLEVBQUMsVUFBVSxFQUFDLFlBQVksRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ3RILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsYUFBYSxFQUFDLFdBQVcsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDckgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLE9BQU8sRUFBQyxhQUFhLEVBQUMsV0FBVyxFQUFDLFVBQVUsRUFBQyxTQUFTLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUNsSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxXQUFXLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ2xILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUMsYUFBYSxFQUFDLFdBQVcsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDbEgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLE9BQU8sRUFBQyxhQUFhLEVBQUMsV0FBVyxFQUFDLFVBQVUsRUFBQyxTQUFTLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNuSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsU0FBUyxFQUFDLGFBQWEsRUFBQyxXQUFXLEVBQUMsVUFBVSxFQUFDLG1CQUFtQixFQUFDLFVBQVUsRUFBQyxLQUFLLEVBQUM7UUFDOUgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLFNBQVMsRUFBQyxhQUFhLEVBQUMsV0FBVyxFQUFDLFVBQVUsRUFBQyxtQkFBbUIsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQy9ILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxPQUFPLEVBQUMsYUFBYSxFQUFDLFdBQVcsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDbEgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLFFBQVEsRUFBQyxhQUFhLEVBQUMsV0FBVyxFQUFDLFVBQVUsRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLE1BQU0sRUFBQztRQUNySCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsUUFBUSxFQUFDLGFBQWEsRUFBQyxXQUFXLEVBQUMsVUFBVSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUMsTUFBTSxFQUFDO1FBQ25ILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxRQUFRLEVBQUMsYUFBYSxFQUFDLFdBQVcsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDbkgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLFFBQVEsRUFBQyxhQUFhLEVBQUMsV0FBVyxFQUFDLFVBQVUsRUFBQyxPQUFPLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQztRQUNqSCxFQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLEtBQUssRUFBQyxRQUFRLEVBQUMsS0FBSyxFQUFDLGFBQWEsRUFBQyxXQUFXLEVBQUMsVUFBVSxFQUFDLFNBQVMsRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDO1FBQ2hILEVBQUMsV0FBVyxFQUFDLE1BQU0sRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLFFBQVEsRUFBQyxLQUFLLEVBQUMsYUFBYSxFQUFDLFdBQVcsRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLFVBQVUsRUFBQyxNQUFNLEVBQUM7UUFDaEgsRUFBQyxXQUFXLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsUUFBUSxFQUFDLEtBQUssRUFBQyxhQUFhLEVBQUMsV0FBVyxFQUFDLFVBQVUsRUFBQyxRQUFRLEVBQUMsVUFBVSxFQUFD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QkFDdEQsTUFBTSxDQUFDLFFBQVEsQ0FBQzt3QkFDbEIsQ0FBQzt3QkFDRCxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDOzRCQUNkLE1BQU0sQ0FBQyxXQUFXLENBQUM7d0JBQ3JCLENBQUM7d0JBQ0QsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDWixDQUFDLENBQUE7b0JBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRTt3QkFDN0IsU0FBUyxHQUFHLENBQUMsU0FBUyxDQUFDO29CQUN6QixDQUFDLENBQUMsQ0FBQztvQkFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFLFVBQUMsWUFBWTt3QkFDL0MsS0FBSyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7b0JBRXBDLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7YUFDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVKLDZDQUE2QztJQUU3QyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMscUJBQVUsQ0FBQyxDQUFDO0FBRTNDLENBQUMsRUEzUE0sVUFBVSxLQUFWLFVBQVUsUUEyUGhCIiwiZmlsZSI6ImNvbXBpbGVkLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL2xpYnMvaGF3dGlvLWZvcm1zL2RlZnMuZC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL2xpYnMvaGF3dGlvLWt1YmVybmV0ZXMtYXBpL2RlZnMuZC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL2xpYnMvaGF3dGlvLW9hdXRoL2RlZnMuZC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL2xpYnMvaGF3dGlvLXVpL2RlZnMuZC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL2xpYnMvaGF3dGlvLXV0aWxpdGllcy9kZWZzLmQudHNcIi8+XHJcblxyXG5kZWNsYXJlIHZhciBodW1hbmRhdGU7XHJcbmRlY2xhcmUgdmFyIGpzeWFtbDphbnk7XHJcblxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcblxyXG5tb2R1bGUgQ29uZmlncyB7XHJcblxyXG5cdGV4cG9ydCB2YXIgcGx1Z2luTmFtZSA9IFwiQ29uZmlnc1wiO1xyXG5cdGV4cG9ydCB2YXIgY29udGV4dCA9IFwiL2NvbmZpZ1wiO1x0XHJcblx0ZXhwb3J0IHZhciBwbHVnaW5QYXRoID0gJ3BsdWdpbnMvY29uZmlncy8nO1xyXG4gICAgZXhwb3J0IHZhciB0ZW1wbGF0ZVBhdGggPSBwbHVnaW5QYXRoICsgJ2h0bWwvJztcclxuXHRleHBvcnQgdmFyIF9tb2R1bGUgPSBhbmd1bGFyLm1vZHVsZShwbHVnaW5OYW1lLCBbJ2hhd3Rpby1jb3JlJywgJ2hhd3Rpby11aScsICd1aS5jb2RlbWlycm9yJywgJ252ZDMnLCAnbmdUYWJsZScsICduZ0RpYWxvZyddKTtcclxuXHRleHBvcnQgdmFyIHJvdXRlID0gUGx1Z2luSGVscGVycy5jcmVhdGVSb3V0aW5nRnVuY3Rpb24odGVtcGxhdGVQYXRoKTtcclxuXHRleHBvcnQgdmFyIGNvbnRyb2xsZXIgPSBQbHVnaW5IZWxwZXJzLmNyZWF0ZUNvbnRyb2xsZXJGdW5jdGlvbihfbW9kdWxlLCBwbHVnaW5OYW1lKTtcclxuXHJcblx0X21vZHVsZS5jb25maWcoWyckcHJvdmlkZScsICckcm91dGVQcm92aWRlcicsICgkcHJvdmlkZSwgJHJvdXRlUHJvdmlkZXIpID0+e1xyXG5cdFx0JHJvdXRlUHJvdmlkZXIud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ2dsdXN0ZXItZnMvc2V0dGluZycpLCByb3V0ZSgnZ2x1c3RlcmZzU2V0dGluZy5odG1sJywgZmFsc2UpKVxyXG5cdFx0XHRcdFx0ICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ2t1YmUtY2x1c3Rlci9zZXR0aW5nJyksIHJvdXRlKCdrdWJlQ2x1c3RlclNldHRpbmcuaHRtbCcsIGZhbHNlKSlcclxuXHRcdFx0XHRcdCAgLndoZW4oY29udGV4dCwge3JlZGlyZWN0VG86IFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnL2t1YmUtY2x1c3Rlci9zZXR0aW5nJyl9KTtcdFx0ICAgXHRcdFx0ICBcclxuXHR9XSk7XHJcblxyXG5cdCBfbW9kdWxlLnJ1bihbJ3ZpZXdSZWdpc3RyeScsICckdGVtcGxhdGVDYWNoZScsICdIYXd0aW9FeHRlbnNpb24nLCAnJGNvbXBpbGUnLCAodmlld1JlZ2lzdHJ5LCAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsIGV4dCwgICRjb21waWxlOm5nLklDb21waWxlU2VydmljZSkgPT4ge1xyXG4gICAgICAgIGV4dC5hZGQoJ2NvbmZpZy1zZXR0aW5nJywgKCRzY29wZSkgPT4ge1xyXG4gICAgICAgIFx0dmFyIHRlbXBsYXRlICA9ICR0ZW1wbGF0ZUNhY2hlLmdldDxzdHJpbmc+KFVybEhlbHBlcnMuam9pbih0ZW1wbGF0ZVBhdGgsIFwiY29uZmlnTWVudUl0ZW0uaHRtbFwiKSk7XHJcbiAgICAgICAgXHRyZXR1cm4gJGNvbXBpbGUodGVtcGxhdGUpKCRzY29wZSk7XHJcbiAgICAgICAgfSk7IFxyXG5cclxuICAgICAgICB2aWV3UmVnaXN0cnlbJ2NvbmZpZyddID0gdGVtcGxhdGVQYXRoICsgXCJzaGFyZUxheW91dC5odG1sXCI7ICAgICAgICAgIFxyXG4gICAgfV0pO1xyXG5cclxuXHQgX21vZHVsZS5kaXJlY3RpdmUoJ2dmc0NvbmZpZ1RhYmxlJywgWygpID0+e1xyXG5cdCBcdHJldHVybntcclxuXHQgXHRcdHJlc3RyaWN0OiAnQUUnLFxyXG5cdCBcdFx0cmVwbGFjZSA6IHRydWUsIFxyXG5cdCBcdFx0c2NvcGU6IHtcclxuXHQgXHRcdFx0dGFibGVUaXRsZTogJz0nLFxyXG5cdCBcdFx0XHR0YWJsZUNvbnRlbnQ6ICc9J1xyXG5cdCBcdFx0fSxcclxuXHQgXHRcdHRlbXBsYXRlOiBgPHRhYmxlIGNsYXNzPVwidGFibGUgIHRhYmxlLWhvdmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIG5nLXJlcGVhdD1cImNvbHVtbiBpbiB0YWJsZVRpdGxlLmNvbHVtblwiIGNsYXNzPVwibm8tZmFkZSB0YWJsZS1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICBcdDxzcGFuIGNsYXNzPVwie3tjb2x1bW4uY2xhc3N9fVwiPnt7Y29sdW1uLnRpdGxlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDx0ciBuZy1yZXBlYXQgPSBcInJvdyBpbiB0YWJsZUNvbnRlbnRcIiBjbGFzcz1cInJvdy5jbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgXHQ8dGQgbmctcmVwZWF0PVwiY29sIGluIHJvd1wiIGNsYXNzPVwiY29sLmNsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICBcdFx0PHNwYW4gY2xhc3M9XCJjb2wuY2xhc3NcIj57e2NvbC50aXRsZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgXHQ8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDwvdGFibGU+ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgIGxpbms6IChzY29wZSwgZWxlbWVudCwgYXR0cikgPT57ICAgICAgICAgICAgXHRcclxuICAgICAgICAgICAgfVxyXG5cdCBcdH1cdCBcdFxyXG5cdCB9XSk7XHJcblxyXG5cdGhhd3Rpb1BsdWdpbkxvYWRlci5hZGRNb2R1bGUocGx1Z2luTmFtZSk7XHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiY29uZmlnUGx1Z2luLnRzXCIvPlxyXG5tb2R1bGUgQ29uZmlnc3tcclxuXHJcblx0ZXhwb3J0IGludGVyZmFjZSBCbG9ja3tcclxuXHRcdGlwOnN0cmluZzsgLy/lrZjlgqjlnZfnmoTmnLrlmahpcOWcsOWdgFxyXG5cdFx0cGF0aDogc3RyaW5nOyAvL+WtmOWCqOWdl+i3r+W+hFxyXG5cdFx0c3RhdHVzOiBib29sZWFuOyAvL+WtmOWCqOWdl+eahOeKtuaAgVxyXG5cdFx0YXZhaWxhYmxlU2l6ZT86IG51bWJlciwgLy/lrZjlgqjlnZfnmoTlpKflsI9cclxuXHRcdHVzZWRTaXplPzogbnVtYmVyIC8v5a2Y5YKo5Z2X5bey5L2/55So56m66Ze0XHJcblx0XHRlZGl0YWJsZT86IGJvb2xlYW5cdFxyXG5cdH1cclxuXHJcblx0ZXhwb3J0IGludGVyZmFjZSBvcmFjbGVQYXJhbXtcclxuXHRcdG5hbWU6IHN0cmluZ1xyXG5cdFx0aXA6IHN0cmluZztcclxuXHRcdHBvcnQ6IHN0cmluZztcclxuXHRcdHNlcnZpY2VOYW1lOiBzdHJpbmc7XHJcblx0XHR0YWJsZU5hbWU6IHN0cmluZztcclxuXHRcdHN0YXR1czogc3RyaW5nO1x0XHJcblx0XHRpZD86bnVtYmVyO1x0XHJcblx0fVxyXG5cclxuXHRleHBvcnQgaW50ZXJmYWNlIHZvbHVtZXtcclxuXHRcdG5hbWU6IHN0cmluZzsgLy92b2x1bWXnmoTlkI3lrZdcclxuXHRcdGFsbFNpemU6IG51bWJlcjsgLy92b2x1bWXnqbrpl7TlpKflsI9cclxuXHRcdHVzZWRTaXplOiBudW1iZXI7IC8vIHZvbHVtZeW3suS9v+eUqOepuumXtOWkp+Wwj1xyXG5cdFx0YnJpY2s6IEFycmF5PEJsb2NrPjsgLy92b2x1bWXkuK3nmoTlrZjlgqjlnZdcclxuXHRcdGZvbGRlcj86IEFycmF5PGFueT47XHQvL3ZvbHVtZeeahOaWh+S7tlx0XHJcblx0XHRzdGF0dXM6IGJvb2xlYW47XHJcblx0XHRwYXRoOiBzdHJpbmc7XHJcblx0XHRlZGl0YWJsZT86IGJvb2xlYW5cdFx0XHJcblx0fVx0XHJcblxyXG4gICAgLy/lrZfoioLlpKflsI/ovazmjaLmiJDlrZfnrKblpKflsI9cclxuXHRmdW5jdGlvbiBnZXRTdHJpbmdTaXplKHNpemU6IG51bWJlcil7XHJcblx0XHR2YXIgcmVzdWx0ID0gc2l6ZTsgXHJcblx0XHR2YXIgc3VmZml4ID1bXCJCXCIsIFwiS0JcIiAsXCJNQlwiLCBcIkdCXCIsIFwiVEJcIiwgXCJQQlwiXTtcclxuXHRcdHZhciBjb3VudD0xOyBcclxuXHRcdHdoaWxlKHJlc3VsdCA+PSAxMDI0KXtcclxuXHRcdFx0cmVzdWx0ID0gcmVzdWx0LzEwMjQ7XHJcblx0XHRcdGNvdW50ICsrO1x0XHRcdFxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdC50b0ZpeGVkKDIpICsgc3VmZml4W2NvdW50XTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGZvcm1hdFZvbHVtZSh2b2x1bWU6dm9sdW1lKXtcclxuXHRcdHZvbHVtZVtcImZvcm1hdFRvdGFsU2l6ZVwiXSA9IGdldFN0cmluZ1NpemUodm9sdW1lLmFsbFNpemUpO1xyXG5cdFx0dm9sdW1lW1wiZm9ybWF0VXNlZFNpemVcIl0gPSBnZXRTdHJpbmdTaXplKHZvbHVtZS51c2VkU2l6ZSk7XHJcblx0XHR2b2x1bWVbXCJlZGl0YWJsZVwiXSA9IGZhbHNlO1xyXG5cdFx0XHJcblx0XHRhbmd1bGFyLmZvckVhY2godm9sdW1lLmJyaWNrLCAoYnJvY2spID0+e1xyXG5cdFx0XHRicm9ja1tcImZvcm1hdFVzZWRTaXplXCJdID0gZ2V0U3RyaW5nU2l6ZShicm9jay51c2VkU2l6ZSk7XHJcblx0XHRcdGJyb2NrW1wiZm9ybWF0QWxsU2l6ZVwiXSA9IGdldFN0cmluZ1NpemUoYnJvY2suYXZhaWxhYmxlU2l6ZSk7XHJcblx0XHRcdGJyb2NrW1wiZWRpdGFibGVcIl0gPSBmYWxzZTtcclxuXHRcdH0pXHJcblx0fVxyXG5cclxuXHRleHBvcnQgZnVuY3Rpb24gZm9ybWF0Vm9sdW1lcyh2b2x1bWVzOkFycmF5PHZvbHVtZT4pe1x0XHRcclxuXHRcdGFuZ3VsYXIuZm9yRWFjaCh2b2x1bWVzLCAodm9sdW1lKSA9PiB7XHRcdFx0XHJcblx0XHRcdGZvcm1hdFZvbHVtZSh2b2x1bWUpO1xyXG5cdFx0fSlcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIElzQnJvY2tFcXVhbHMoYnJvY2sxOiBCbG9jaywgYnJvY2syOiBCbG9jayl7XHJcblx0XHRyZXR1cm4gYnJvY2sxLmlwID09IGJyb2NrMi5pcCAmJiBicm9jazEucGF0aCA9PSBicm9jazIucGF0aDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdFx05Yiq6Zmkdm9sdW1l5Lit5oyH5a6a55qEYnJvY2tcclxuXHQqL1xyXG5cdGV4cG9ydCBmdW5jdGlvbiBkZWxldGVCcm9jayh2b2x1bWU6dm9sdW1lLCBicm9jazpCbG9jayl7XHRcdFxyXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHZvbHVtZS5icmljay5sZW5ndGg7IGkrKyl7XHJcblx0XHRcdHZhciBicmljayA9IHZvbHVtZS5icmlja1tpXTtcclxuXHRcdFx0aWYoSXNCcm9ja0VxdWFscyhicmljaywgYnJvY2spKXtcclxuXHRcdFx0XHR2b2x1bWUuYnJpY2suc3BsaWNlKGksIDEpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHRcdHZvbHVtZea3u+WKoGJyb2NrXHJcblx0Ki9cclxuXHRleHBvcnQgZnVuY3Rpb24gYWRkQnJvY2sodm9sdW1lOnZvbHVtZSwgYnJvY2s6QmxvY2spe1xyXG5cdFx0aWYoYnJvY2sgIT0gbnVsbCAmJiBicm9jayAhPSB1bmRlZmluZWQpXHJcblx0XHRcdHZvbHVtZS5icmljay5wdXNoKGJyb2NrKTtcclxuXHR9XHJcblxyXG5cdGV4cG9ydCBjbGFzcyBDb25maWdzTW9kZWxTZXJ2aWNle1xyXG5cdFx0cHVibGljIGNsdXN0ZXI6IEFycmF5PHZvbHVtZT49W107XHJcblx0XHRwdWJsaWMgb3JhY2xlUGFyYW06IEFycmF5PG9yYWNsZVBhcmFtPj1bXTtcclxuXHRcdHB1YmxpYyBzeXN0ZW1JbmZvOiBBcnJheTxhbnk+ID1bXTtcclxuXHRcdHB1YmxpYyByZWdpb25hbGlzbUluZm86IEFycmF5PGFueT4gPSBbXTtcclxuXHJcblx0XHRwdWJsaWMgY29uc3RydWN0b3IoKXtcclxuXHRcdFx0dGhpcy51cGRhdGVBbGxEYXRhKCk7XHRcdFxyXG5cdFx0fVxyXG5cclxuXHRcdHB1YmxpYyB1cGRhdGVBbGxEYXRhKCl7XHJcblx0XHRcdHRoaXMudXBkYXRlVm9sdW1lRGF0YSgpO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZU9yYWNsZVBhcmFtKCk7XHJcblx0XHRcdC8vdGhpcy51cGRhdGVDb2RlSW5mbygpO1xyXG5cdFx0fVxyXG5cdCAgICBwdWJsaWMgdXBkYXRlVm9sdW1lRGF0YSgpe1xyXG5cdCAgICBcdHZhciByZXN1bHQ9bnVsbDtcclxuXHQgICAgXHQkLmFqYXgoeyBcclxuXHRcdFx0XHRhc3luYzogZmFsc2UsIFxyXG5cdFx0XHRcdHR5cGUgOiBcIlBPU1RcIiwgXHJcblx0XHRcdFx0dXJsIDogXCIvamF2YS9jb25zb2xlL2FwaS92b2x1bWUvbGlzdFwiLFx0XHRcdFx0XHRcclxuXHRcdFx0XHRzdWNjZXNzIDogZnVuY3Rpb24oZGF0YSkgeyBcclxuXHRcdFx0XHQgICAgaWYoZGF0YSl7XHRcdFx0XHJcblx0XHRcdFx0XHQgICAgcmVzdWx0ID0gZGF0YTtcclxuXHRcdFx0XHRcdH1cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHR9IFxyXG5cdFx0XHR9KTtcdFx0XHRcclxuXHRcdFx0dGhpcy5jbHVzdGVyID1KU09OLnBhcnNlKHJlc3VsdCk7XHRcdFx0XHRcdFx0XHRcclxuXHQgICAgXHRmb3JtYXRWb2x1bWVzKHRoaXMuY2x1c3Rlcik7XHJcblx0XHR9XHJcblxyXG5cdFx0LypwdWJsaWMgdXBkYXRlQ29kZUluZm8oKXtcclxuXHRcdFx0XHR2YXIgcmVzdWx0PW51bGw7XHJcblx0ICAgIFx0JC5hamF4KHsgXHJcblx0XHRcdFx0YXN5bmM6IGZhbHNlLCBcclxuXHRcdFx0XHR0eXBlIDogXCJQT1NUXCIsIFxyXG5cdFx0XHRcdHVybCA6IFwiL2phdmEvY29uc29sZS9hcGkvY29kZS9saXN0XCIsXHRcdFx0XHRcdFxyXG5cdFx0XHRcdHN1Y2Nlc3MgOiBmdW5jdGlvbihkYXRhKSB7IFxyXG5cdFx0XHRcdCAgICBpZihkYXRhKXtcdFx0XHRcdCAgICBcdFx0XHJcblx0XHRcdFx0XHQgICAgcmVzdWx0ID0gZGF0YTtcclxuXHRcdFx0XHRcdH1cdFx0XHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHR9IFxyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5yZWdpb25hbGlzbUluZm8gPSByZXN1bHQucmVnaW9uYWxpc207XHJcblx0XHRcdHRoaXMuc3lzdGVtSW5mbyA9IHJlc3VsdC5zeXN0ZW07XHJcblx0XHR9Ki9cclxuXHJcblx0XHRwdWJsaWMgdXBkYXRlT3JhY2xlUGFyYW0oKXtcclxuXHRcdFx0dmFyIHJlc3VsdD1udWxsO1xyXG5cdFx0XHQkLmFqYXgoe1xyXG5cdFx0XHRcdGFzeW5jOiBmYWxzZSxcclxuXHRcdFx0XHR0eXBlIDogXCJQT1NUXCIsXHJcblx0XHRcdFx0dXJsIDogXCIvamF2YS9jb25zb2xlL2FwaS9vcmFjbGUvbGlzdFwiLFxyXG5cdFx0XHRcdHN1Y2Nlc3MgOiBmdW5jdGlvbihkYXRhKSB7IFxyXG5cdFx0XHRcdCAgICBpZihkYXRhKXtcdFx0XHRcdCAgICBcdFxyXG5cdFx0XHRcdFx0ICAgIHJlc3VsdCA9IGRhdGE7XHRcdFx0XHRcdCAgIFxyXG5cdFx0XHRcdFx0fVx0XHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHR9IFx0XHJcblx0XHRcdH0pO1x0XHRcdFxyXG5cdFx0XHR0aGlzLm9yYWNsZVBhcmFtID0gcmVzdWx0O1x0XHRcdFxyXG5cdFx0fVxyXG5cclxuXHRcdHB1YmxpYyBnZXRGb2xkZXJCeVZvbHVtZU5hbWUobmFtZTogc3RyaW5nKXtcclxuXHRcdFx0aWYodGhpcy5jbHVzdGVyPT09bnVsbClcclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0Zm9yKHZhciAgaT0wOyBpPCB0aGlzLmNsdXN0ZXIubGVuZ3RoOyBpKyspe1xyXG5cdFx0XHRcdGlmKHRoaXMuY2x1c3RlcltpXS5uYW1lID09PSBuYW1lKVxyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY2x1c3RlcltpXS5mb2xkZXI7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG4gICAgX21vZHVsZS5mYWN0b3J5KCdDb25maWdzTW9kZWwnLCBbJyRyb290U2NvcGUnLCAnJGh0dHAnLCAnJGxvY2F0aW9uJywgJyRyZXNvdXJjZScsICgkcm9vdFNjb3BlLCAkaHR0cCwgJGxvY2F0aW9uLCAkcmVzb3VyY2UpID0+eyAgICBcdFxyXG4gICAgXHR2YXIgJHNjb3BlID0gbmV3IENvbmZpZ3NNb2RlbFNlcnZpY2UoKTtcclxuICAgIFx0cmV0dXJuICRzY29wZTtcclxuICAgIH1dKTtcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxubW9kdWxlIERldmVsb3BlciB7XHJcblxyXG4gIHZhciBsb2cgPSBMb2dnZXIuZ2V0KCdkZXZlbG9wZXItbmF2aWdhdGlvbicpO1xyXG5cclxuICBleHBvcnQgdHlwZSBMYWJlbFJlc29sdmVyID0gKCkgPT4gc3RyaW5nO1xyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIEJyZWFkY3J1bWJDb25maWcge1xyXG4gICAgICBocmVmPzogc3RyaW5nO1xyXG4gICAgICBsYWJlbD86IHN0cmluZyB8IExhYmVsUmVzb2x2ZXI7XHJcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xyXG4gICAgICBjbGFzcz86IHN0cmluZztcclxuICAgICAgaXNWYWxpZD86ICgpID0+IGJvb2xlYW47XHJcbiAgICAgIGlzQWN0aXZlPzogKHN1YlRhYiwgcGF0aCkgPT4gYm9vbGVhbjtcclxuICB9XHJcblxyXG5cclxuICBmdW5jdGlvbiBkZXZlbG9wQnJlYWRjcnVtYigpIDogQnJlYWRjcnVtYkNvbmZpZyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBocmVmOiBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIvd29ya3NwYWNlc1wiKSxcclxuICAgICAgbGFiZWw6IFwiVGVhbXNcIixcclxuICAgICAgdGl0bGU6IFwiVmlldyBhbGwgdGhlIGF2YWlsYWJsZSB0ZWFtc1wiLFxyXG4gICAgICBpc0FjdGl2ZTogKHN1YlRhYiwgcGF0aCkgPT4gZmFsc2VcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBvcGVyYXRlQnJlYWRjcnVtYigpIDogQnJlYWRjcnVtYkNvbmZpZyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBocmVmOiBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIvbmFtZXNwYWNlc1wiKSxcclxuICAgICAgbGFiZWw6IFwiTWFuYWdlXCIsXHJcbiAgICAgIHRpdGxlOiBcIk1hbmFnZSB0aGUgcHJvamVjdHMgYW5kIHJlc291cmNlcyBpbnNpZGUgdGhlbVwiXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIHdvcmtzcGFjZUxpbmsoKSB7XHJcbiAgICByZXR1cm4gVXJsSGVscGVycy5qb2luKEhhd3Rpb0NvcmUuZG9jdW1lbnRCYXNlKCksIFwiL3dvcmtzcGFjZXNcIiwgS3ViZXJuZXRlcy5jdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0TGluayhwcm9qZWN0SWQpIHtcclxuICAgIHZhciBsaW5rID0gd29ya3NwYWNlTGluaygpO1xyXG4gICAgaWYgKHByb2plY3RJZCkge1xyXG4gICAgICByZXR1cm4gVXJsSGVscGVycy5qb2luKGxpbmssIFwiL3Byb2plY3RzXCIsIHByb2plY3RJZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbGluaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXb3Jrc3BhY2VzQnJlYWRjcnVtYnMoZGV2ZWxvcFBlcnNwZWN0aXZlPykge1xyXG4gICAgcmV0dXJuIFtkZXZlbG9wQnJlYWRjcnVtYigpXTtcclxuICB9XHJcblxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlV29ya3NwYWNlc1N1Yk5hdkJhcnMoZGV2ZWxvcFBlcnNwZWN0aXZlKSB7XHJcbiAgICAgIHJldHVybiBhY3RpdmF0ZUN1cnJlbnQoW1xyXG4gICAgICAgIGRldmVsb3BCcmVhZGNydW1iKCksXHJcbiAgICAgICAgb3BlcmF0ZUJyZWFkY3J1bWIoKVxyXG4gICAgICBdKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXb3Jrc3BhY2VCcmVhZGNydW1icyhjaGlsZHJlbiA9IG51bGwsIHdvcmtzcGFjZU5hbWUgPSBudWxsKSB7XHJcbiAgICB2YXIgYW5zd2VyID0gY3JlYXRlV29ya3NwYWNlc0JyZWFkY3J1bWJzKHRydWUpO1xyXG4gICAgaWYgKCF3b3Jrc3BhY2VOYW1lKSB7XHJcbiAgICAgIHdvcmtzcGFjZU5hbWUgPSBLdWJlcm5ldGVzLmN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAod29ya3NwYWNlTmFtZSkge1xyXG4gICAgICBhbnN3ZXIucHVzaChcclxuICAgICAgICB7XHJcbiAgICAgICAgICBocmVmOiBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIvd29ya3NwYWNlcy9cIiwgd29ya3NwYWNlTmFtZSksXHJcbiAgICAgICAgICBsYWJlbDogd29ya3NwYWNlTmFtZSxcclxuICAgICAgICAgIHRpdGxlOiBcIlZpZXcgdGhlIHByb2plY3Q6IFwiICsgd29ya3NwYWNlTmFtZSxcclxuICAgICAgICAgIGlzQWN0aXZlOiAoc3ViVGFiLCBwYXRoKSA9PiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHByb2Nlc3NDaGlsZHJlbihhbnN3ZXIsIGNoaWxkcmVuKTtcclxuICAgIH1cclxuICAgIHJldHVybiBhbnN3ZXI7XHJcbiAgfVxyXG5cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudmlyb25tZW50QnJlYWRjcnVtYnMoJHNjb3BlLCAkbG9jYXRpb24sICRyb3V0ZVBhcmFtcykge1xyXG4gICAgdmFyIG5zID0gS3ViZXJuZXRlcy5jdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG4gICAgdmFyIG5hbWVzcGFjZXNMaW5rID0gVXJsSGVscGVycy5qb2luKEhhd3Rpb0NvcmUuZG9jdW1lbnRCYXNlKCksIFwiL2t1YmVybmV0ZXMvbmFtZXNwYWNlXCIpO1xyXG4gICAgdmFyIHdvcmtzcGFjZU5hbWUgPSAkcm91dGVQYXJhbXMud29ya3NwYWNlO1xyXG4gICAgdmFyIHByb2plY3QgPSAkcm91dGVQYXJhbXMucHJvamVjdDtcclxuICAgIHZhciBlbnZpcm9ubWVudCA9ICRyb3V0ZVBhcmFtcy5uYW1lc3BhY2U7XHJcbiAgICBpZiAod29ya3NwYWNlTmFtZSAmJiBwcm9qZWN0KSB7XHJcbiAgICAgIHZhciBwcm9qZWN0TGluayA9IFVybEhlbHBlcnMuam9pbihIYXd0aW9Db3JlLmRvY3VtZW50QmFzZSgpLCBcIi93b3Jrc3BhY2VzXCIsIHdvcmtzcGFjZU5hbWUsIFwicHJvamVjdHNcIiwgcHJvamVjdCk7XHJcbiAgICAgICRzY29wZS4kcHJvamVjdExpbmsgPSBwcm9qZWN0TGluaztcclxuICAgICAgJHNjb3BlLiRwcm9qZWN0TmFtZXNwYWNlTGluayA9IFVybEhlbHBlcnMuam9pbihwcm9qZWN0TGluaywgXCJuYW1lc3BhY2VcIiwgbnMpO1xyXG4gICAgICBuYW1lc3BhY2VzTGluayA9IFVybEhlbHBlcnMuam9pbihwcm9qZWN0TGluaywgXCJuYW1lc3BhY2VcIik7XHJcbiAgICAgIHZhciBjaGlsZHJlbjogQXJyYXk8QnJlYWRjcnVtYkNvbmZpZz4gPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaHJlZjogVXJsSGVscGVycy5qb2luKHByb2plY3RMaW5rLCBcImVudmlyb25tZW50c1wiKSxcclxuICAgICAgICAgIGxhYmVsOiBcIkVudmlyb25tZW50c1wiLFxyXG4gICAgICAgICAgdGl0bGU6IFwiVmlldyB0aGUgZW52aXJvbm1lbnRzIGZvciB0aGlzIHByb2plY3RcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaHJlZjogVXJsSGVscGVycy5qb2luKG5hbWVzcGFjZXNMaW5rLCBucywgXCJhcHBzXCIpLFxyXG4gICAgICAgICAgbGFiZWw6ICgpID0+ICBlbnZpcm9ubWVudE5hbWUod29ya3NwYWNlTmFtZSwgbnMpLFxyXG4gICAgICAgICAgdGl0bGU6IFwiVmlldyB0aGUgcnVudGltZSBvZiB0aGUgd29ya3NwYWNlOiBcIiArIG5zXHJcbiAgICAgICAgfVxyXG4gICAgICBdO1xyXG4gICAgICByZXR1cm4gY3JlYXRlUHJvamVjdEJyZWFkY3J1bWJzKHByb2plY3QsIGNoaWxkcmVuLCB3b3Jrc3BhY2VOYW1lKTtcclxuICAgIH0gZWxzZSBpZiAod29ya3NwYWNlTmFtZSAmJiBlbnZpcm9ubWVudCAmJiB3b3Jrc3BhY2VOYW1lICE9IGVudmlyb25tZW50KSB7XHJcbiAgICAgIC8vIGZpbmQgbGFiZWwgZm9yIG5hbWVzcGFjZSBlbnZpcm9ubWVudFxyXG4gICAgICB2YXIgY2hpbGRyZW46IEFycmF5PEJyZWFkY3J1bWJDb25maWc+ID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhyZWY6IGVudmlyb25tZW50c0xpbmsod29ya3NwYWNlTmFtZSksXHJcbiAgICAgICAgICBsYWJlbDogXCJFbnZpcm9ubWVudHNcIixcclxuICAgICAgICAgIHRpdGxlOiBcIlZpZXcgdGhlIGVudmlyb25tZW50cyBmb3IgdGhpcyBwcm9qZWN0XCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhyZWY6IGVudmlyb25tZW50TGluayh3b3Jrc3BhY2VOYW1lLCBlbnZpcm9ubWVudCksXHJcbiAgICAgICAgICBsYWJlbDogKCkgPT4gIGVudmlyb25tZW50TmFtZSh3b3Jrc3BhY2VOYW1lLCBlbnZpcm9ubWVudCksXHJcbiAgICAgICAgICB0aXRsZTogXCJWaWV3IHRoaXMgZW52aXJvbm1lbnRcIlxyXG4gICAgICAgIH1cclxuICAgICAgXTtcclxuICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RCcmVhZGNydW1icyhwcm9qZWN0LCBjaGlsZHJlbiwgd29ya3NwYWNlTmFtZSk7XHJcbiAgICB9IGVsc2UgaWYgKCF3b3Jrc3BhY2VOYW1lKSB7XHJcbiAgICAgIHdvcmtzcGFjZU5hbWUgPSBLdWJlcm5ldGVzLmN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCk7XHJcbiAgICB9XHJcbiAgICB2YXIgYW5zd2VyID0gY3JlYXRlV29ya3NwYWNlQnJlYWRjcnVtYnMod29ya3NwYWNlTmFtZSk7XHJcbiAgICBhbnN3ZXIucHVzaCh7XHJcbiAgICAgIGhyZWY6IFVybEhlbHBlcnMuam9pbihIYXd0aW9Db3JlLmRvY3VtZW50QmFzZSgpLCBcIndvcmtzcGFjZXNcIiwgd29ya3NwYWNlTmFtZSwgXCJuYW1lc3BhY2VcIiwgbnMsIFwiYXBwc1wiKSxcclxuICAgICAgbGFiZWw6ICdSdW50aW1lJyxcclxuICAgICAgdGl0bGU6IFwiVmlldyB0aGUgcnVudGltZSBvZiB0aGUgd29ya3NwYWNlOiBcIiArIG5zXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBhY3RpdmF0ZUN1cnJlbnQoYW5zd2VyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGdpdmVuIGVudmlyb25tZW50IG5hbWVzcGFjZVxyXG4gICAqL1xyXG4gIGZ1bmN0aW9uIGVudmlyb25tZW50TmFtZSh3b3Jrc3BhY2VOYW1lLCBlbnZpcm9ubWVudCkge1xyXG4gICAgLyp2YXIgbW9kZWwgPSBLdWJlcm5ldGVzLmdldEt1YmVybmV0ZXNNb2RlbCgpO1xyXG4gICAgaWYgKG1vZGVsKSB7XHJcbiAgICAgIHJldHVybiBtb2RlbC5lbnZpcm9ubWVudE5hbWUod29ya3NwYWNlTmFtZSwgZW52aXJvbm1lbnQpO1xyXG4gICAgfSovXHJcbiAgICByZXR1cm4gZW52aXJvbm1lbnQ7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvamVjdEJyZWFkY3J1bWJzKHByb2plY3ROYW1lID0gbnVsbCwgY2hpbGRyZW46IEFycmF5PEJyZWFkY3J1bWJDb25maWc+ID0gbnVsbCwgd29ya3NwYWNlTmFtZSA9IG51bGwpIHtcclxuICAgIGlmICghd29ya3NwYWNlTmFtZSkge1xyXG4gICAgICB3b3Jrc3BhY2VOYW1lID0gS3ViZXJuZXRlcy5jdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG4gICAgfVxyXG4gICAgdmFyIGFuc3dlciA9IGNyZWF0ZVdvcmtzcGFjZUJyZWFkY3J1bWJzKG51bGwsIHdvcmtzcGFjZU5hbWUpO1xyXG4gICAgaWYgKHdvcmtzcGFjZU5hbWUpIHtcclxuICAgICAgaWYgKHByb2plY3ROYW1lKSB7XHJcbiAgICAgICAgYW5zd2VyLnB1c2goXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGhyZWY6IFVybEhlbHBlcnMuam9pbihIYXd0aW9Db3JlLmRvY3VtZW50QmFzZSgpLCBcIi93b3Jrc3BhY2VzXCIsIHdvcmtzcGFjZU5hbWUsIFwicHJvamVjdHNcIiksXHJcbiAgICAgICAgICAgIGxhYmVsOiBcIkFwcHNcIixcclxuICAgICAgICAgICAgdGl0bGU6IFwiVmlldyBhbGwgdGhlIGFwcHMgaW4gdGhpcyBwcm9qZWN0XCJcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBhbnN3ZXIucHVzaChcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaHJlZjogVXJsSGVscGVycy5qb2luKEhhd3Rpb0NvcmUuZG9jdW1lbnRCYXNlKCksIFwiL3dvcmtzcGFjZXNcIiwgd29ya3NwYWNlTmFtZSwgXCJwcm9qZWN0c1wiLCBwcm9qZWN0TmFtZSksXHJcbiAgICAgICAgICAgIGxhYmVsOiBwcm9qZWN0TmFtZSxcclxuICAgICAgICAgICAgdGl0bGU6IFwiVmlldyB0aGUgcHJvamVjdDogXCIgKyBwcm9qZWN0TmFtZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHByb2Nlc3NDaGlsZHJlbihhbnN3ZXIsIGNoaWxkcmVuKTtcclxuICAgIH1cclxuICAgIHJldHVybiBhbnN3ZXI7XHJcbiAgfVxyXG5cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb2plY3RTZXR0aW5nc0JyZWFkY3J1bWJzKHByb2plY3ROYW1lLCB3b3Jrc3BhY2VOYW1lID0gbnVsbCkge1xyXG4gICAgdmFyIGNoaWxkcmVuID0gW107XHJcbiAgICBpZiAoIXByb2plY3ROYW1lKSB7XHJcbiAgICAgIGNoaWxkcmVuID0gW3tcclxuICAgICAgICBsYWJlbDogXCJOZXcgQXBwXCIsXHJcbiAgICAgICAgdGl0bGU6IFwiTGV0cyBtYWtlIGEgbmV3IGFwcFwiXHJcbiAgICAgIH1dO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNyZWF0ZVByb2plY3RCcmVhZGNydW1icyhwcm9qZWN0TmFtZSwgY2hpbGRyZW4sIHdvcmtzcGFjZU5hbWUpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdvcmtzcGFjZVN1Yk5hdkJhcnMoKSB7XHJcbiAgICB2YXIgd29ya3NwYWNlTmFtZSA9IEt1YmVybmV0ZXMuY3VycmVudEt1YmVybmV0ZXNOYW1lc3BhY2UoKTtcclxuICAgIHJldHVybiBhY3RpdmF0ZUN1cnJlbnQoW1xyXG4gICAgICB7XHJcbiAgICAgICAgaHJlZjogVXJsSGVscGVycy5qb2luKEhhd3Rpb0NvcmUuZG9jdW1lbnRCYXNlKCksIFwiL3dvcmtzcGFjZXNcIiwgd29ya3NwYWNlTmFtZSksXHJcbiAgICAgICAgbGFiZWw6IFwiRGFzaGJvYXJkXCIsXHJcbiAgICAgICAgY2xhc3M6IFwiZmEgZmEtdGFjaG9tZXRlclwiLFxyXG4gICAgICAgIHRpdGxlOiBcIlZpZXcgdGhlIGRhc2hib2FyZCBmb3IgdGhlIGFwcHMsIGVudmlyb25tZW50cyBhbmQgcGlwZWxpbmVzIGluIHRoaXMgcHJvamVjdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBocmVmOiBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIvd29ya3NwYWNlc1wiLCB3b3Jrc3BhY2VOYW1lLCBcImFwcHNcIiksXHJcbiAgICAgICAgbGFiZWw6IFwiQXBwc1wiLFxyXG4gICAgICAgIGNsYXNzOiBcImZhIGZhLXJvY2tldFwiLFxyXG4gICAgICAgIHRpdGxlOiBcIlZpZXcgdGhlIGFwcHMgaW4gdGhpcyBwcm9qZWN0XCJcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlzVmFsaWQ6ICgpID0+IGplbmtpbnNMaW5rKCksXHJcbiAgICAgICAgaHJlZjogVXJsSGVscGVycy5qb2luKEhhd3Rpb0NvcmUuZG9jdW1lbnRCYXNlKCksIFwiL3dvcmtzcGFjZXNcIiwgd29ya3NwYWNlTmFtZSwgXCJqZW5raW5zSm9iXCIpLFxyXG4gICAgICAgIGxhYmVsOiBcIkJ1aWxkc1wiLFxyXG4gICAgICAgIGNsYXNzOiBcImZhIGZhLWNvZGVcIixcclxuICAgICAgICB0aXRsZTogXCJWaWV3IHRoZSBidWlsZHMgaW4gdGhpcyBwcm9qZWN0XCJcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGhyZWY6IGVudmlyb25tZW50c0xpbmsoKSxcclxuICAgICAgICBsYWJlbDogXCJFbnZpcm9ubWVudHNcIixcclxuICAgICAgICBjbGFzczogXCJmYSBmYS1jdWJlc1wiLFxyXG4gICAgICAgIHRpdGxlOiBcIlZpZXcgdGhlIGVudmlyb25tZW50cyBmb3IgdGhpcyBwcm9qZWN0XCJcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGhyZWY6IG5hbWVzcGFjZVJ1bnRpbWVMaW5rKHdvcmtzcGFjZU5hbWUpLFxyXG4gICAgICAgIGxhYmVsOiBcIlJ1bnRpbWVcIixcclxuICAgICAgICBjbGFzczogXCJmYSBmYS1jdWJlXCIsXHJcbiAgICAgICAgdGl0bGU6IFwiVmlldyB0aGUgUnVudGltZSBwZXJzcGVjdGl2ZSBmb3IgdGhpcyBwcm9qZWN0XCJcclxuICAgICAgfVxyXG4vKlxyXG4gICAgICB7XHJcbiAgICAgICAgaHJlZjogVXJsSGVscGVycy5qb2luKEhhd3Rpb0NvcmUuZG9jdW1lbnRCYXNlKCksIFwiL3dvcmtzcGFjZXNcIiwgd29ya3NwYWNlTmFtZSwgXCJkZXRhaWxcIiksXHJcbiAgICAgICAgbGFiZWw6IFwiRGV0YWlsc1wiLFxyXG4gICAgICAgIGNsYXNzOiBcImZhIGZhLWdlYXJcIixcclxuICAgICAgICB0aXRsZTogXCJWaWV3IHRoZSBwcm9qZWN0IGRldGFpbHNcIlxyXG4gICAgICB9XHJcbiovXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBuYW1lc3BhY2VSdW50aW1lTGluayh3b3Jrc3BhY2VOYW1lID0gbnVsbCkge1xyXG4gICAgaWYgKCF3b3Jrc3BhY2VOYW1lKSB7XHJcbiAgICAgIHdvcmtzcGFjZU5hbWUgPSBLdWJlcm5ldGVzLmN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVXJsSGVscGVycy5qb2luKEhhd3Rpb0NvcmUuZG9jdW1lbnRCYXNlKCksIFwid29ya3NwYWNlc1wiLCB3b3Jrc3BhY2VOYW1lLCBcIm5hbWVzcGFjZVwiLCB3b3Jrc3BhY2VOYW1lLCBcImFwcHNcIik7XHJcbiAgfVxyXG4gIFxyXG4gIGZ1bmN0aW9uIGNyZWF0ZUJ1aWxkc0xpbmsod29ya3NwYWNlTmFtZSwgcHJvamVjdE5hbWUsIGplbmtpbnNKb2JJZCkge1xyXG4gICAgd29ya3NwYWNlTmFtZSA9IHdvcmtzcGFjZU5hbWUgfHwgS3ViZXJuZXRlcy5jdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG4gICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihIYXd0aW9Db3JlLmRvY3VtZW50QmFzZSgpLCBcIi93b3Jrc3BhY2VzXCIsIHdvcmtzcGFjZU5hbWUsIFwicHJvamVjdHNcIiwgcHJvamVjdE5hbWUsIFwiamVua2luc0pvYlwiLCBqZW5raW5zSm9iSWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIHJvdXRpbmcgZnVuY3Rpb24gdGhhdCBsb2FkcyBhIHRlbXBsYXRlIGFuZCBpbmplY3QgdGhlIG5lZWRlZCBkaXJlY3RpdmVzIHRvIHByb3Blcmx5XHJcbiAgICogZGlzcGxheS91cGRhdGUgdGhlIERldmVsb3BlciBtb2R1bGUgbWFuYWdlZCB0YWJzIGFuZCBicmVhZCBjcnVtYnMgZm9yIHdoZW4gdGhlIHJvdXRlIGlzIGFjdGl2ZS5cclxuICAgKlxyXG4gICAqIEV4YW1wbGUgVXNhZ2U6XHJcbiAgICpcclxuICAgKiB2YXIgcm91dGUgPSBEZXZlbG9wZXIuY3JlYXRlVGFiUm91dGluZ0Z1bmN0aW9uKFwiL2FwcC9zb21lZGlyXCIpO1xyXG4gICAqICRyb3V0ZVByb3ZpZGVyLndoZW4oJy9wcm9maWxlcycsIHJvdXRlKCd2aWV3Lmh0bWwnLCBmYWxzZSwgW3tcclxuICAgKiAgICAgbGFiZWw6IFwiUHJvZmlsZXNcIixcclxuICAgKiAgICAgdGl0bGU6IFwiQnJvd3NlIHRoZSBwcm9maWxlcyBvZiB0aGlzIHByb2plY3RcIlxyXG4gICAqICAgfV1cclxuICAgKiApKTtcclxuICAgKlxyXG4gICAqIEBwYXJhbSBiYXNlVVJMXHJcbiAgICogQHJldHVybnMge2Z1bmN0aW9uKHN0cmluZywgYm9vbGVhbj0sIEFycmF5PERldmVsb3Blci5CcmVhZGNydW1iQ29uZmlnPj0pOiB7dGVtcGxhdGU6IHN0cmluZywgcmVsb2FkT25TZWFyY2g6IGJvb2xlYW4sIGNvbnRyb2xsZXI6IHN0cmluZ3xzdHJpbmd8KGZ1bmN0aW9uKGFueSwgbmcucm91dGUuSVJvdXRlUGFyYW1zU2VydmljZSk6IHVuZGVmaW5lZClbXX19XHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhYlJvdXRpbmdGdW5jdGlvbihiYXNlVVJMOnN0cmluZykge1xyXG4gICAgcmV0dXJuICh0ZW1wbGF0ZU5hbWU6c3RyaW5nLCByZWxvYWRPblNlYXJjaDpib29sZWFuID0gdHJ1ZSwgY2hpbGRyZW4/OiBBcnJheTxEZXZlbG9wZXIuQnJlYWRjcnVtYkNvbmZpZz4pID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0ZW1wbGF0ZTogXCI8ZGl2IGhhd3Rpby1icmVhZGNydW1icz48L2Rpdj48ZGl2IGhhd3Rpby10YWJzPjwvZGl2PjxuZy1pbmNsdWRlIHNyYz0nY29udGVudFRlbXBsYXRlVXJsJz48L25nLWluY2x1ZGU+XCIsXHJcbiAgICAgICAgcmVsb2FkT25TZWFyY2g6IHJlbG9hZE9uU2VhcmNoLFxyXG4gICAgICAgIGNvbnRyb2xsZXI6IFtcIiRzY29wZVwiLCBcIiRyb3V0ZVBhcmFtc1wiLCAoJHNjb3BlLCAkcm91dGVQYXJhbXM6bmcucm91dGUuSVJvdXRlUGFyYW1zU2VydmljZSkgPT4ge1xyXG4gICAgICAgICAgaWYoICRyb3V0ZVBhcmFtc1tcIm5hbWVzcGFjZVwiXT09bnVsbCApIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKFwiVGhlIDpuYW1lc3BhY2Ugcm91dGUgcGFyYW1ldGVyIHdhcyBub3QgZGVmaW5lZCBmb3IgdGhlIHJvdXRlLlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKCAkcm91dGVQYXJhbXNbXCJwcm9qZWN0SWRcIl0gPT0gbnVsbCApIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKFwiVGhlIDpwcm9qZWN0SWQgcm91dGUgcGFyYW1ldGVyIHdhcyBub3QgZGVmaW5lZCBmb3IgdGhlIHJvdXRlLlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICRzY29wZS5uYW1lc3BhY2UgPSAkcm91dGVQYXJhbXNbXCJuYW1lc3BhY2VcIl07XHJcbiAgICAgICAgICAkc2NvcGUucHJvamVjdElkID0gJHJvdXRlUGFyYW1zW1wicHJvamVjdElkXCJdO1xyXG4gICAgICAgICAgJHNjb3BlLmNvbnRlbnRUZW1wbGF0ZVVybCA9IFVybEhlbHBlcnMuam9pbihiYXNlVVJMLCB0ZW1wbGF0ZU5hbWUpO1xyXG4gICAgICAgICAgJHNjb3BlLmJyZWFkY3J1bWJDb25maWcgPSBEZXZlbG9wZXIuY3JlYXRlUHJvamVjdEJyZWFkY3J1bWJzKCRzY29wZS5wcm9qZWN0SWQsIGNoaWxkcmVuKTtcclxuICAgICAgICAgICRzY29wZS5zdWJUYWJDb25maWcgPSBEZXZlbG9wZXIuY3JlYXRlUHJvamVjdFN1Yk5hdkJhcnMoJHNjb3BlLnByb2plY3RJZCk7XHJcbiAgICAgICAgfV1cclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0U3ViTmF2QmFycyhwcm9qZWN0TmFtZSwgamVua2luc0pvYklkID0gbnVsbCwgJHNjb3BlID0gbnVsbCkge1xyXG4gICAgdmFyIHdvcmtzcGFjZU5hbWUgPSBLdWJlcm5ldGVzLmN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCk7XHJcbiAgICB2YXIgcHJvamVjdExpbmsgPSBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIvd29ya3NwYWNlc1wiLCB3b3Jrc3BhY2VOYW1lLCBcInByb2plY3RzXCIsIHByb2plY3ROYW1lKTtcclxuICAgIHZhciBidWlsZHNMaW5rID0gVXJsSGVscGVycy5qb2luKHByb2plY3RMaW5rLCBcImJ1aWxkc1wiKTtcclxuICAgIGlmICghamVua2luc0pvYklkKSB7XHJcbiAgICAgIGplbmtpbnNKb2JJZCA9IHByb2plY3ROYW1lO1xyXG4gICAgfVxyXG4gICAgdmFyIGplbmtpbnNCdWlsZExpbmsgPSBudWxsO1xyXG4gICAgdmFyIHBpcGVsaW5lc0xpbmsgPSBudWxsO1xyXG4gICAgaWYgKHByb2plY3ROYW1lICYmIGplbmtpbnNKb2JJZCkge1xyXG4gICAgICBqZW5raW5zQnVpbGRMaW5rID0gY3JlYXRlQnVpbGRzTGluayh3b3Jrc3BhY2VOYW1lLCBwcm9qZWN0TmFtZSwgamVua2luc0pvYklkKTtcclxuICAgICAgcGlwZWxpbmVzTGluayA9IFVybEhlbHBlcnMuam9pbihqZW5raW5zQnVpbGRMaW5rLCBcInBpcGVsaW5lc1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpc0plbmtpbnNCdWlsZCgpIHtcclxuICAgICAgdmFyIGFuc3dlciA9IGplbmtpbnNMaW5rKCkgJiYgamVua2luc0J1aWxkTGluaztcclxuICAgICAgaWYgKGFuc3dlciAmJiAkc2NvcGUpIHtcclxuICAgICAgICB2YXIgZW50aXR5ID0gRGV2ZWxvcGVyLnByb2plY3RGb3JTY29wZSgkc2NvcGUpO1xyXG4gICAgICAgIGlmIChlbnRpdHkpIHtcclxuICAgICAgICAgIHJldHVybiBhbnN3ZXIgJiYgZW50aXR5LiRqZW5raW5zSm9iO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYW5zd2VyO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBhbnN3ZXIgPSBbXHJcbiAgICAgIC8qXHJcbiAgICAgIHtcclxuICAgICAgICBocmVmOiBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIvd29ya3NwYWNlc1wiLCB3b3Jrc3BhY2VOYW1lKSxcclxuICAgICAgICBsYWJlbDogXCJBbGwgQXBwc1wiLFxyXG4gICAgICAgIGNsYXNzOiAnZmEgZmEtYW5nbGUtZG91YmxlLWxlZnQnLFxyXG4gICAgICAgIHRpdGxlOiBcIlZpZXcgdGhlIGFwcHMgaW4gdGhpcyBwcm9qZWN0XCJcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRlbXBsYXRlOiBgPGRpdiBuZy1pbmNsdWRlPVwiJ3BsdWdpbnMvZGV2ZWxvcGVyL2h0bWwvcHJvamVjdFNlbGVjdG9yLmh0bWwnXCI+PC9kaXY+YFxyXG4gICAgICB9LFxyXG4qL1xyXG4gICAgICB7XHJcbiAgICAgICAgaHJlZjogVXJsSGVscGVycy5qb2luKEhhd3Rpb0NvcmUuZG9jdW1lbnRCYXNlKCksIFwiL3dvcmtzcGFjZXNcIiwgd29ya3NwYWNlTmFtZSwgXCJwcm9qZWN0c1wiLCBwcm9qZWN0TmFtZSwgXCJlbnZpcm9ubWVudHNcIiksXHJcbiAgICAgICAgaXNBY3RpdmU6IChzdWJUYWIsIHBhdGgpID0+IHtcclxuICAgICAgICAgIHZhciBocmVmID0gbm9ybWFsaXplSHJlZihzdWJUYWIuaHJlZik7XHJcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKFwic3ViVGFiOiBcIiwgc3ViVGFiLCBcIiBwYXRoOiBcIiwgcGF0aCk7XHJcbiAgICAgICAgICBpZiAocGF0aCA9PT0gaHJlZikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhciByb290UGF0aCA9IGhyZWYucmVwbGFjZSgvXFwvZW52aXJvbm1lbnRzLywgJycpO1xyXG4gICAgICAgICAgaWYgKHBhdGggPT09IHJvb3RQYXRoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy9ocmVmOiBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIvd29ya3NwYWNlc1wiLCB3b3Jrc3BhY2VOYW1lLCBcInByb2plY3RzXCIsIHByb2plY3ROYW1lKSxcclxuICAgICAgICBsYWJlbDogXCJEYXNoYm9hcmRcIixcclxuICAgICAgICBjbGFzczogXCJmYSBmYS10YWNob21ldGVyXCIsXHJcbiAgICAgICAgdGl0bGU6IFwiVmlldyB0aGUgYXBwIGRhc2hib2FyZCBmb3IgdGhlIGFjdGl2aXR5LCBlbnZpcm9ubWVudHMgYW5kIHBpcGVsaW5lc1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpc1ZhbGlkOiAoKSA9PiBpc0plbmtpbnNCdWlsZCgpICYmIHBpcGVsaW5lc0xpbmssXHJcbiAgICAgICAgaWQ6IFwicGlwZWxpbmVzXCIsXHJcbiAgICAgICAgaHJlZjogcGlwZWxpbmVzTGluayxcclxuICAgICAgICBsYWJlbDogXCJQaXBlbGluZXNcIixcclxuICAgICAgICBjbGFzczogXCJmYSBmYS1lbGxpcHNpcy1oXCIsXHJcbiAgICAgICAgdGl0bGU6IFwiVmlldyB0aGUgcGlwZWxpbmUgYnVpbGRzIGZvciB0aGlzIGFwcFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpc1ZhbGlkOiAoKSA9PiAhaXNKZW5raW5zQnVpbGQoKSxcclxuICAgICAgICBocmVmOiBidWlsZHNMaW5rLFxyXG4gICAgICAgIGxhYmVsOiBcIkJ1aWxkc1wiLFxyXG4gICAgICAgIGNsYXNzOiBcImZhIGZhLWJhcnNcIixcclxuICAgICAgICB0aXRsZTogXCJWaWV3IHRoZSBidWlsZHMgZm9yIHRoaXMgYXBwXCJcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlzVmFsaWQ6ICgpID0+IGlzSmVua2luc0J1aWxkKCksXHJcbiAgICAgICAgaXNBY3RpdmU6IChpdGVtLCBwYXRoKSA9PiB7XHJcbiAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKCcvbG9nLycpID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKCcvamVua2luc0pvYi8nKSA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpZDogXCJidWlsZHNcIixcclxuICAgICAgICBocmVmOiBqZW5raW5zQnVpbGRMaW5rLFxyXG4gICAgICAgIGxhYmVsOiBcIkJ1aWxkc1wiLFxyXG4gICAgICAgIGNsYXNzOiBcImZhIGZhLWJhcnNcIixcclxuICAgICAgICB0aXRsZTogXCJWaWV3IHRoZSBKZW5raW5zIGJ1aWxkcyBmb3IgdGhpcyBhcHBcIlxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaXNWYWxpZDogKCkgPT4gaXNKZW5raW5zQnVpbGQoKSxcclxuICAgICAgICBocmVmOiBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIvd29ya3NwYWNlc1wiLCB3b3Jrc3BhY2VOYW1lLCBcInByb2plY3RzXCIsIHByb2plY3ROYW1lLCBcImplbmtpbnNKb2JcIiwgamVua2luc0pvYklkLCBcIm1ldHJpY3NcIiksXHJcbiAgICAgICAgbGFiZWw6IFwiTWV0cmljc1wiLFxyXG4gICAgICAgIGNsYXNzOiBcImZhIGZhLWJhci1jaGFydFwiLFxyXG4gICAgICAgIHRpdGxlOiBcIlZpZXcgdGhlIG1ldHJpY3MgZm9yIHRoaXMgcHJvamVjdFwiXHJcbiAgICAgIH0sXHJcbi8qXHJcbiAgICAgIHtcclxuICAgICAgICBocmVmOiBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIvd29ya3NwYWNlc1wiLCB3b3Jrc3BhY2VOYW1lLCBcInByb2plY3RzXCIsIHByb2plY3ROYW1lLCBcInRvb2xzXCIpLFxyXG4gICAgICAgIGxhYmVsOiBcIlRvb2xzXCIsXHJcbiAgICAgICAgdGl0bGU6IFwiVmlldyB0aGUgdG9vbHMgZm9yIHRoaXMgcHJvamVjdFwiXHJcbiAgICAgIH0sXHJcbiovXHJcbiAgICAgIHtcclxuICAgICAgICBocmVmOiBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIvd29ya3NwYWNlc1wiLCB3b3Jrc3BhY2VOYW1lLCBcInByb2plY3RzXCIsIHByb2plY3ROYW1lLCBcImJ1aWxkQ29uZmlnRWRpdFwiKSxcclxuICAgICAgICBsYWJlbDogXCJTZXR0aW5nc1wiLFxyXG4gICAgICAgIGNsYXNzOiBcImZhIGZhLWNvZ1wiLFxyXG4gICAgICAgIHRpdGxlOiBcIlZpZXcgdGhlIGFwcCBjb25maWd1cmF0aW9uXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IChzdWJUYWIsIHBhdGgpID0+IHtcclxuICAgICAgICAgIGlmIChfLmVuZHNXaXRoKHBhdGgsICcvYnVpbGRDb25maWdFZGl0JykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoXy5lbmRzV2l0aChwYXRoLCAnL2ZvcmdlL3NlY3JldHMnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChfLmVuZHNXaXRoKHBhdGgsICcvZm9yZ2UvY29tbWFuZC9kZXZvcHMtZWRpdCcpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgXTtcclxuXHJcbiAgICB2YXIgY29udGV4dCA9IHtcclxuICAgICAgd29ya3NwYWNlTmFtZTogd29ya3NwYWNlTmFtZSxcclxuICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lLFxyXG4gICAgICBwcm9qZWN0TGluazogcHJvamVjdExpbmssXHJcbiAgICAgIGplbmtpbnNKb2JJZDogamVua2luc0pvYklkLFxyXG4gICAgICAkc2NvcGU6ICRzY29wZVxyXG4gICAgfTtcclxuICAgIGFuZ3VsYXIuZm9yRWFjaChjdXN0b21Qcm9qZWN0U3ViVGFiRmFjdG9yaWVzLCAoZm4pID0+IHtcclxuICAgICAgaWYgKGFuZ3VsYXIuaXNGdW5jdGlvbihmbikpIHtcclxuICAgICAgICB2YXIgc3VidGFiID0gZm4oY29udGV4dCk7XHJcbiAgICAgICAgaWYgKHN1YnRhYikge1xyXG4gICAgICAgICAgaWYgKGFuZ3VsYXIuaXNBcnJheShzdWJ0YWIpKSB7XHJcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChzdWJ0YWIsICh0KSA9PiB7XHJcbiAgICAgICAgICAgICAgYW5zd2VyLnB1c2godCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYW5zd2VyLnB1c2goc3VidGFiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBhY3RpdmF0ZUN1cnJlbnQoYW5zd2VyKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0U2V0dGluZ3NTdWJOYXZCYXJzKHByb2plY3ROYW1lLCBqZW5raW5zSm9iSWQgPSBudWxsKSB7XHJcbiAgICBpZiAoIXByb2plY3ROYW1lKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIHZhciB3b3Jrc3BhY2VOYW1lID0gS3ViZXJuZXRlcy5jdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG4gICAgdmFyIHByb2plY3RMaW5rID0gVXJsSGVscGVycy5qb2luKEhhd3Rpb0NvcmUuZG9jdW1lbnRCYXNlKCksIFwiL3dvcmtzcGFjZXNcIiwgd29ya3NwYWNlTmFtZSwgXCJwcm9qZWN0c1wiLCBwcm9qZWN0TmFtZSk7XHJcbiAgICBpZiAoIWplbmtpbnNKb2JJZCkge1xyXG4gICAgICBqZW5raW5zSm9iSWQgPSBwcm9qZWN0TmFtZTtcclxuICAgIH1cclxuICAgIHZhciBhbnN3ZXIgPSBbXHJcbiAgICAgIHtcclxuICAgICAgICBocmVmOiBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIvd29ya3NwYWNlc1wiLCB3b3Jrc3BhY2VOYW1lLCBcInByb2plY3RzXCIsIHByb2plY3ROYW1lLCBcImJ1aWxkQ29uZmlnRWRpdFwiKSxcclxuICAgICAgICBsYWJlbDogXCJDb3JlXCIsXHJcbiAgICAgICAgdGl0bGU6IFwiVmlldyB0aGUgY29yZSBidWlsZCBjb25maWd1cmF0aW9uXCJcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGhyZWY6IHByb2plY3RTZWNyZXRzTGluayh3b3Jrc3BhY2VOYW1lLCBwcm9qZWN0TmFtZSksXHJcbiAgICAgICAgbGFiZWw6IFwiU2VjcmV0c1wiLFxyXG4gICAgICAgIHRpdGxlOiBcIlZpZXcgb3IgY2hhbmdlIHRoZSBzZWNyZXRzIHVzZWQgdG8gZWRpdCBzb3VyY2UgY29kZSBpbiB0aGUgc291cmNlIGNvbnRyb2wgc3lzdGVtXCJcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGhyZWY6IGVkaXRQaXBlbGluZUxpbmsod29ya3NwYWNlTmFtZSwgcHJvamVjdE5hbWUpLFxyXG4gICAgICAgIGxhYmVsOiBcIlBpcGVsaW5lXCIsXHJcbiAgICAgICAgdGl0bGU6IFwiVmlldyB0aGUgRGV2T3BzIGFuZCBwaXBlbGluZSBjb25maWd1cmF0aW9uXCJcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlzVmFsaWQ6ICgpID0+IGZvcmdlUHJvamVjdEhhc0J1aWxkZXIoXCJtYXZlblwiKSxcclxuICAgICAgICBocmVmOiBlZGl0TWF2ZW5CdWlsZExpbmsod29ya3NwYWNlTmFtZSwgcHJvamVjdE5hbWUpLFxyXG4gICAgICAgIGxhYmVsOiBcIk1hdmVuXCIsXHJcbiAgICAgICAgdGl0bGU6IFwiVmlldyB0aGUgTWF2ZW4gYnVpbGQgY29uZmlndXJhdGlvblwiXHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgICByZXR1cm4gYWN0aXZhdGVDdXJyZW50KGFuc3dlcik7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZm9yZ2VQcm9qZWN0SGFzQnVpbGRlcihuYW1lKSB7XHJcbiAgICB2YXIgZm9yZ2VQcm9qZWN0ID0gS3ViZXJuZXRlcy5pbmplY3Q8YW55PihcIkZvcmdlUHJvamVjdFwiKTtcclxuICAgIGlmIChmb3JnZVByb2plY3QpIHtcclxuICAgICAgcmV0dXJuIGZvcmdlUHJvamVjdC5oYXNCdWlsZGVyKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGZvcmdlUHJvamVjdEhhc1BlcnNwZWN0aXZlKG5hbWUpIHtcclxuICAgIHZhciBmb3JnZVByb2plY3QgPSBLdWJlcm5ldGVzLmluamVjdDxhbnk+KFwiRm9yZ2VQcm9qZWN0XCIpO1xyXG4gICAgaWYgKGZvcmdlUHJvamVjdCkge1xyXG4gICAgICByZXR1cm4gZm9yZ2VQcm9qZWN0Lmhhc1BlcnNwZWN0aXZlKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGVkaXRQaXBlbGluZUxpbmtTY29wZSgkc2NvcGUpIHtcclxuICAgIHJldHVybiBlZGl0UGlwZWxpbmVMaW5rKCRzY29wZS5uYW1lc3BhY2UsICRzY29wZS5wcm9qZWN0SWQgfHwgJHNjb3BlLnByb2plY3ROYW1lIHx8ICRzY29wZS5wcm9qZWN0KTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0TGluayh3b3Jrc3BhY2VOYW1lID0gbnVsbCkge1xyXG4gICAgaWYgKCF3b3Jrc3BhY2VOYW1lKSB7XHJcbiAgICAgIHdvcmtzcGFjZU5hbWUgPSBLdWJlcm5ldGVzLmN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVXJsSGVscGVycy5qb2luKEhhd3Rpb0NvcmUuZG9jdW1lbnRCYXNlKCksIFwiL3dvcmtzcGFjZXNcIiwgd29ya3NwYWNlTmFtZSwgXCIvZm9yZ2UvY3JlYXRlUHJvamVjdFwiKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBlZGl0UGlwZWxpbmVMaW5rKHdvcmtzcGFjZU5hbWUsIHByb2plY3ROYW1lKSB7XHJcbiAgICByZXR1cm4gcHJvamVjdFdvcmtzcGFjZUxpbmsod29ya3NwYWNlTmFtZSwgcHJvamVjdE5hbWUsIFwiZm9yZ2UvY29tbWFuZC9kZXZvcHMtZWRpdFwiKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBlZGl0TWF2ZW5CdWlsZExpbmsod29ya3NwYWNlTmFtZSwgcHJvamVjdE5hbWUpIHtcclxuICAgIHJldHVybiBwcm9qZWN0V29ya3NwYWNlTGluayh3b3Jrc3BhY2VOYW1lLCBwcm9qZWN0TmFtZSwgXCJmb3JnZS9jb21tYW5kL2ZhYnJpYzgtc2V0dXBcIik7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gcHJvamVjdFNlY3JldHNMaW5rKHdvcmtzcGFjZU5hbWUsIHByb2plY3ROYW1lKSB7XHJcbiAgICByZXR1cm4gcHJvamVjdFdvcmtzcGFjZUxpbmsod29ya3NwYWNlTmFtZSwgcHJvamVjdE5hbWUsIFwiZm9yZ2Uvc2VjcmV0c1wiLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gc2VjcmV0c05hbWVzcGFjZUxpbmsod29ya3NwYWNlTmFtZSwgcHJvamVjdE5hbWUsIHNlY3JldHNOYW1lc3BhY2UpIHtcclxuICAgIHZhciBwcmVmaXggPSBwcm9qZWN0V29ya3NwYWNlTGluayh3b3Jrc3BhY2VOYW1lLCBwcm9qZWN0TmFtZSwgXCJcIikgfHwgXCJrdWJlcm5ldGVzXCI7XHJcbiAgICByZXR1cm4gVXJsSGVscGVycy5qb2luKHByZWZpeCwgXCJuYW1lc3BhY2VcIiwgc2VjcmV0c05hbWVzcGFjZSwgXCJzZWNyZXRzXCIpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIHByb2plY3RXb3Jrc3BhY2VMaW5rKHdvcmtzcGFjZU5hbWUsIHByb2plY3ROYW1lLCBwYXRoLCBpZ25vcmVCbGFua1Byb2plY3QgPSB0cnVlKSB7XHJcbiAgICBpZiAoaWdub3JlQmxhbmtQcm9qZWN0ICYmICFwcm9qZWN0TmFtZSkge1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICAgIGlmICghd29ya3NwYWNlTmFtZSkge1xyXG4gICAgICB3b3Jrc3BhY2VOYW1lID0gS3ViZXJuZXRlcy5jdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihIYXd0aW9Db3JlLmRvY3VtZW50QmFzZSgpLCBcIi93b3Jrc3BhY2VzXCIsIHdvcmtzcGFjZU5hbWUsIFwicHJvamVjdHNcIiwgcHJvamVjdE5hbWUsIHBhdGgpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGVudmlyb25tZW50c0xpbmsod29ya3NwYWNlTmFtZSA9IG51bGwpIHtcclxuICAgIGlmICghd29ya3NwYWNlTmFtZSkge1xyXG4gICAgICB3b3Jrc3BhY2VOYW1lID0gS3ViZXJuZXRlcy5jdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihIYXd0aW9Db3JlLmRvY3VtZW50QmFzZSgpLCBcIi93b3Jrc3BhY2VzXCIsIHdvcmtzcGFjZU5hbWUsIFwiZW52aXJvbm1lbnRzXCIpXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZW52aXJvbm1lbnRMaW5rKHdvcmtzcGFjZU5hbWUsIGVudmlyb25tZW50TmFtZXNwYWNlLCBwYXRoID0gXCJcIiwgaWdub3JlQmxhbmtQcm9qZWN0ID0gdHJ1ZSkge1xyXG4gICAgaWYgKGlnbm9yZUJsYW5rUHJvamVjdCAmJiAhZW52aXJvbm1lbnROYW1lc3BhY2UpIHtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAoIXdvcmtzcGFjZU5hbWUpIHtcclxuICAgICAgd29ya3NwYWNlTmFtZSA9IEt1YmVybmV0ZXMuY3VycmVudEt1YmVybmV0ZXNOYW1lc3BhY2UoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIvd29ya3NwYWNlc1wiLCB3b3Jrc3BhY2VOYW1lLCBcIm5hbWVzcGFjZVwiLCBlbnZpcm9ubWVudE5hbWVzcGFjZSwgcGF0aCk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgdmFyIGN1c3RvbVByb2plY3RTdWJUYWJGYWN0b3JpZXMgPSBbXTtcclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUplbmtpbnNCcmVhZGNydW1icyhwcm9qZWN0TmFtZSwgam9iSWQsIGJ1aWxkSWQpIHtcclxuICAgIHZhciB3b3Jrc3BhY2VOYW1lID0gS3ViZXJuZXRlcy5jdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG4gICAgdmFyIGNoaWxkcmVuID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6IFwiYnVpbGRzXCIsXHJcbiAgICAgICAgaHJlZjogY3JlYXRlQnVpbGRzTGluayh3b3Jrc3BhY2VOYW1lLCBwcm9qZWN0TmFtZSwgam9iSWQpLFxyXG4gICAgICAgIGxhYmVsOiBcIkJ1aWxkc1wiLFxyXG4gICAgICAgIHRpdGxlOiBcIlZpZXcgdGhlIGJ1aWxkcyBmb3IgdGhpcyBhcHBcIlxyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gICAgaWYgKGJ1aWxkSWQpIHtcclxuICAgICAgY2hpbGRyZW4ucHVzaCh7XHJcbiAgICAgICAgaWQ6IFwiXCIsXHJcbiAgICAgICAgaHJlZjogXCJcIixcclxuICAgICAgICBsYWJlbDogXCIjXCIgKyBidWlsZElkLFxyXG4gICAgICAgIHRpdGxlOiBcIkJ1aWxkICNcIiArIGJ1aWxkSWRcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3JlYXRlUHJvamVjdEJyZWFkY3J1bWJzKHByb2plY3ROYW1lLCBjaGlsZHJlbik7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlSmVua2luc1N1Yk5hdkJhcnMocHJvamVjdE5hbWUsIGplbmtpbnNKb2JJZCwgYnVpbGRJZCwgZXh0cmFPcHRpb246IGFueSA9IG51bGwpIHtcclxuICAgIHZhciBhbnN3ZXIgPSBjcmVhdGVQcm9qZWN0U3ViTmF2QmFycyhwcm9qZWN0TmFtZSwgamVua2luc0pvYklkKTtcclxuICAgIGlmIChleHRyYU9wdGlvbikge1xyXG4gICAgICAvLyBleHRyYU9wdGlvbi5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICBhbnN3ZXIucHVzaChleHRyYU9wdGlvbik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYW5zd2VyO1xyXG4gIH1cclxuXHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFN1Yk5hdkJhcnMoJHNjb3BlLCAkbG9jYXRpb24sICRyb3V0ZVBhcmFtcykge1xyXG4gICAgdmFyIG5zID0gS3ViZXJuZXRlcy5jdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG4gICAgdmFyIHdvcmtzcGFjZU5hbWUgPSAkcm91dGVQYXJhbXMud29ya3NwYWNlO1xyXG4gICAgdmFyIHByb2plY3QgPSAkcm91dGVQYXJhbXMucHJvamVjdDtcclxuICAgIHZhciBlbnZpcm9ubWVudCA9ICRyb3V0ZVBhcmFtcy5uYW1lc3BhY2U7XHJcbiAgICB2YXIgcHJvamVjdExpbmsgPSBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIva3ViZXJuZXRlc1wiKTtcclxuICAgIC8qY29uc29sZS5sb2coXCI9PT09PT09PT09PT09PT09PT09PT1cIilcclxuICAgIGNvbnNvbGUubG9nKHByb2plY3RMaW5rKTtcclxuICAgIGlmICh3b3Jrc3BhY2VOYW1lICYmIHByb2plY3QpIHtcclxuICAgICAgcHJvamVjdExpbmsgPSBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIva3ViZXJuZXRlc1wiLCB3b3Jrc3BhY2VOYW1lLCBcInByb2plY3RzXCIsIHByb2plY3QpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcHJvamVjdExpbmsgPSBVcmxIZWxwZXJzLmpvaW4oSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKSwgXCIva3ViZXJuZXRlc1wiLCB3b3Jrc3BhY2VOYW1lIHx8IG5zKTtcclxuICAgIH0qL1xyXG4gICAgdmFyIG5hbWVzcGFjZXNMaW5rID0gVXJsSGVscGVycy5qb2luKHByb2plY3RMaW5rLCBcIm5hbWVzcGFjZVwiKTsgICAgXHJcbiAgICByZXR1cm4gYWN0aXZhdGVDdXJyZW50KFsgICAgIFxyXG4gICAgICB7XHJcbiAgICAgICAgaHJlZjogVXJsSGVscGVycy5qb2luKG5hbWVzcGFjZXNMaW5rLCBucywgXCJyZXBsaWNhdGlvbkNvbnRyb2xsZXJzXCIpLFxyXG4gICAgICAgIGxhYmVsOiBcIuacjeWKoeeuoeeQhlwiLFxyXG4gICAgICAgIGNsYXNzOiBcImZhIGZhLWNsb25lXCIsXHJcbiAgICAgICAgdGl0bGU6IFwiVmlldyB0aGUgUmVwbGljYXMgZm9yIHRoaXMgcHJvamVjdFwiXHJcbiAgICAgIH0sICAgICBcclxuICAgICAgLyp7XHJcbiAgICAgICAgaHJlZjogVXJsSGVscGVycy5qb2luKG5hbWVzcGFjZXNMaW5rLCBucywgXCJldmVudHNcIiksXHJcbiAgICAgICAgbGFiZWw6IFwi5pel5b+X5L+h5oGvXCIsXHJcbiAgICAgICAgY2xhc3M6IFwiZmEgZmEtbmV3c3BhcGVyLW9cIixcclxuICAgICAgICB0aXRsZTogXCJWaWV3IHRoZSBldmVudHMgZm9yIHRoaXMgcHJvamVjdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFxyXG4gICAgICB7XHJcbiAgICAgICAgaHJlZjogVXJsSGVscGVycy5qb2luKHByb2plY3RMaW5rLCBcImhvc3RzXCIpLFxyXG4gICAgICAgIGxhYmVsOiBcIumbhue+pOiKgueCuVwiLFxyXG4gICAgICAgIGNsYXNzOiBcImZhIGZhLXNlcnZlclwiLFxyXG4gICAgICAgIHRpdGxlOiBcIlZpZXcgdGhlIG5vZGVzIGZvciB0aGlzIHByb2plY3RcIlxyXG4gICAgICB9ICovICAgIFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZW52aXJvbm1lbnRJbnN0YW5jZUxpbmsoZW52LCBwcm9qZWN0TmFtZSA9IG51bGwpIHtcclxuICAgIGlmIChlbnYpIHtcclxuICAgICAgdmFyIGVudk5hbWVzcGFjZSA9IGVudltcIm5hbWVzcGFjZVwiXTtcclxuICAgICAgaWYgKGVudk5hbWVzcGFjZSkge1xyXG4gICAgICAgIGlmIChwcm9qZWN0TmFtZSkge1xyXG4gICAgICAgICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihIYXd0aW9Db3JlLmRvY3VtZW50QmFzZSgpLCBcIi93b3Jrc3BhY2VzXCIsIEt1YmVybmV0ZXMuY3VycmVudEt1YmVybmV0ZXNOYW1lc3BhY2UoKSwgXCJwcm9qZWN0c1wiLCBwcm9qZWN0TmFtZSwgXCJuYW1lc3BhY2VcIiwgZW52TmFtZXNwYWNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihIYXd0aW9Db3JlLmRvY3VtZW50QmFzZSgpLCBcIi93b3Jrc3BhY2VzXCIsIEt1YmVybmV0ZXMuY3VycmVudEt1YmVybmV0ZXNOYW1lc3BhY2UoKSwgXCJuYW1lc3BhY2VcIiwgZW52TmFtZXNwYWNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxuXHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBuYW1lc3BhY2VMaW5rKCRzY29wZSwgJHJvdXRlUGFyYW1zLCBwYXRoID0gbnVsbCkge1xyXG4gICAgdmFyIG5zID0gS3ViZXJuZXRlcy5jdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG4gICAgdmFyIHdvcmtzcGFjZU5hbWUgPSAkcm91dGVQYXJhbXMud29ya3NwYWNlO1xyXG4gICAgdmFyIHByb2plY3QgPSAkcm91dGVQYXJhbXMucHJvamVjdDtcclxuICAgIHZhciBwcm9qZWN0TGluayA9IFVybEhlbHBlcnMuam9pbihIYXd0aW9Db3JlLmRvY3VtZW50QmFzZSgpLCBcIi9rdWJlcm5ldGVzXCIpO1xyXG4gICAgaWYgKHdvcmtzcGFjZU5hbWUgJiYgcHJvamVjdCkge1xyXG4gICAgICBwcm9qZWN0TGluayA9IFVybEhlbHBlcnMuam9pbihIYXd0aW9Db3JlLmRvY3VtZW50QmFzZSgpLCBcIi93b3Jrc3BhY2VzXCIsIHdvcmtzcGFjZU5hbWUsIFwicHJvamVjdHNcIiwgcHJvamVjdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVXJsSGVscGVycy5qb2luKHByb2plY3RMaW5rLCBcIm5hbWVzcGFjZVwiLCBucywgcGF0aCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIHRoZSBVUkwgcXVlcnkgc3RyaW5nIGlmIGl0cyBpbnNpZGUgdGhlIGdpdmVuIHRleHRcclxuICAgKi9cclxuICBmdW5jdGlvbiB0cmltUXVlcnkodGV4dCkge1xyXG4gICAgaWYgKHRleHQpIHtcclxuICAgICAgdmFyIGlkeCA9IHRleHQuaW5kZXhPZihcIj9cIik7XHJcbiAgICAgIGlmIChpZHggPj0gMCkge1xyXG4gICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygwLCBpZHgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGV4dDtcclxuICB9XHJcblxyXG4gIC8vIENhdGVyIGZvciB0aGUgYXBwIHJ1bm5pbmcgYXQgc29tZSB3ZWlyZCBkb2N1bWVudCBiYXNlXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUhyZWYoaHJlZjpzdHJpbmcpIHtcclxuICAgIGlmICghaHJlZikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgSGF3dGlvQ29yZS5kb2N1bWVudEJhc2UoKS5yZXBsYWNlKCcvJywgJ1xcXFwvJykpO1xyXG4gICAgcmV0dXJuIGhyZWYucmVwbGFjZShyZWdleCwgJy8nKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBhY3RpdmF0ZUN1cnJlbnQobmF2QmFySXRlbXMpIHtcclxuICAgIG5hdkJhckl0ZW1zID0gXy5jb21wYWN0KG5hdkJhckl0ZW1zKTtcclxuICAgIHZhciBpbmplY3RvciA9IEhhd3Rpb0NvcmUuaW5qZWN0b3I7XHJcbiAgICB2YXIgJGxvY2F0aW9uID0gaW5qZWN0b3IgPyBpbmplY3Rvci5nZXQ8bmcuSUxvY2F0aW9uU2VydmljZT4oXCIkbG9jYXRpb25cIikgOiBudWxsO1xyXG4gICAgaWYgKCRsb2NhdGlvbikge1xyXG4gICAgICB2YXIgcGF0aCA9IG5vcm1hbGl6ZUhyZWYodHJpbVF1ZXJ5KCRsb2NhdGlvbi5wYXRoKCkpKTtcclxuICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgIGZ1bmN0aW9uIG1ha2VBY3RpdmUoaXRlbSkge1xyXG4gICAgICAgIGl0ZW0uYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZnVuY3Rpb24gZ2V0SHJlZihpdGVtKSB7XHJcbiAgICAgICAgdmFyIGhyZWYgPSBpdGVtLmhyZWY7XHJcbiAgICAgICAgdmFyIHRyaW1IcmVmID0gdHJpbVF1ZXJ5KGhyZWYpO1xyXG4gICAgICAgIHJldHVybiBub3JtYWxpemVIcmVmKHRyaW1IcmVmKTtcclxuICAgICAgfVxyXG4gICAgICBhbmd1bGFyLmZvckVhY2gobmF2QmFySXRlbXMsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgaWYgKCFmb3VuZCAmJiBpdGVtKSB7XHJcbiAgICAgICAgICBpZiAoYW5ndWxhci5pc0Z1bmN0aW9uKGl0ZW0uaXNBY3RpdmUpKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmlzQWN0aXZlKGl0ZW0sIHBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgbWFrZUFjdGl2ZShpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIHRyaW1IcmVmID0gZ2V0SHJlZihpdGVtKTtcclxuICAgICAgICAgICAgaWYgKCF0cmltSHJlZikge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHJpbUhyZWYgPT09IHBhdGgpIHtcclxuICAgICAgICAgICAgICBtYWtlQWN0aXZlKGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgLy8gTWF5YmUgaXQncyBhIHN1Yi1pdGVtIG9mIGEgdGFiLCBsZXQncyBmYWxsIGJhY2sgdG8gdGhhdCBtYXliZVxyXG4gICAgICBpZiAoIWZvdW5kKSB7XHJcbiAgICAgICAgYW5ndWxhci5mb3JFYWNoKG5hdkJhckl0ZW1zLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFmb3VuZCkge1xyXG4gICAgICAgICAgICBpZiAoIWFuZ3VsYXIuaXNGdW5jdGlvbihpdGVtLmlzQWN0aXZlKSkge1xyXG4gICAgICAgICAgICAgIHZhciB0cmltSHJlZiA9IGdldEhyZWYoaXRlbSk7XHJcbiAgICAgICAgICAgICAgaWYgKCF0cmltSHJlZikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoXy5zdGFydHNXaXRoKHBhdGgsIHRyaW1IcmVmKSkge1xyXG4gICAgICAgICAgICAgICAgbWFrZUFjdGl2ZShpdGVtKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICAvLyBzdGlsbCBub3QgZm91bmQsIGxldCdzIGxvZyBpdFxyXG4gICAgICBpZiAoIWZvdW5kKSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKFwiTm8gbmF2aWdhdGlvbiB0YWIgZm91bmQgZm9yIHBhdGg6XCIsIHBhdGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmF2QmFySXRlbXM7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBwcm9jZXNzQ2hpbGRyZW4oYW5zd2VyLCBjaGlsZHJlbikge1xyXG4gICAgaWYgKGNoaWxkcmVuKSB7XHJcbiAgICAgIGlmIChhbmd1bGFyLmlzQXJyYXkoY2hpbGRyZW4pKSB7XHJcbiAgICAgICAgYW5zd2VyID0gYW5zd2VyLmNvbmNhdChjaGlsZHJlbik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYW5zd2VyLnB1c2goY2hpbGRyZW4pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhY3RpdmF0ZUN1cnJlbnQoYW5zd2VyKTtcclxuICAgIHJldHVybiBhbnN3ZXI7XHJcbiAgfVxyXG59XHJcbiIsIm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgZXhwb3J0IGNsYXNzIGNvbnN0cyB7XHJcbiAgICBnZXQgTkFNRVNQQUNFX1NUT1JBR0VfS0VZKCk6c3RyaW5nIHsgcmV0dXJuIFwiazhzU2VsZWN0ZWROYW1lc3BhY2VcIjsgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IHZhciBDb25zdGFudHMgPSBuZXcgY29uc3RzKCk7XHJcblx0XHJcbiAgZXhwb3J0IGludGVyZmFjZSBBcGlMb2NhdGlvbiB7XHJcbiAgICBwcm90bz86c3RyaW5nO1xyXG4gICAgaG9zdFBvcnQ6c3RyaW5nO1xyXG4gICAgcHJlZml4OnN0cmluZztcclxuICB9XHJcbiAgXHJcbiAgZXhwb3J0IGludGVyZmFjZSBBcGlMb2NhdGlvbnMge1xyXG4gICAgb3BlbnNoaWZ0PzogQXBpTG9jYXRpb247XHJcbiAgICBrOHM/OiBBcGlMb2NhdGlvbjtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgS3ViZXJuZXRlc0NvbmZpZyB7XHJcbiAgICBtYXN0ZXJfdXJpPzogc3RyaW5nO1xyXG4gICAgYXBpPzogQXBpTG9jYXRpb25zO1xyXG4gICAgb3BlbnNoaWZ0PzogT3BlblNoaWZ0T0F1dGhDb25maWc7XHJcbiAgICBnb29nbGU/OiBHb29nbGVPQXV0aENvbmZpZztcclxuICAgIGtleWNsb2FrPzogS2V5Q2xvYWtBdXRoQ29uZmlnO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGludGVyZmFjZSBPcGVuU2hpZnRPQXV0aENvbmZpZyB7XHJcbiAgICBvYXV0aF9hdXRob3JpemVfdXJpOnN0cmluZztcclxuICAgIG9hdXRoX2NsaWVudF9pZDpzdHJpbmc7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIEdvb2dsZU9BdXRoQ29uZmlnIHtcclxuICAgIGF1dGhlbnRpY2F0aW9uVVJJOnN0cmluZztcclxuICAgIGF1dGhvcml6YXRpb25VUkk6c3RyaW5nO1xyXG4gICAgY2xpZW50SWQ6c3RyaW5nO1xyXG4gICAgY2xpZW50U2VjcmV0OnN0cmluZztcclxuICAgIHJlZGlyZWN0VVJJOnN0cmluZztcclxuICAgIHNjb3BlOnN0cmluZztcclxuICAgIHRva2VuVVJJPzpzdHJpbmc7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIEtleUNsb2FrQXV0aENvbmZpZyB7XHJcbiAgICBvYXV0aF9hdXRob3JpemVfdXJpOnN0cmluZztcclxuICAgIG9hdXRoX2NsaWVudF9pZDpzdHJpbmc7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgaW50ZXJmYWNlIEt1YmVybmV0ZXNTdGF0ZSB7XHJcbiAgICBuYW1lc3BhY2VzOiBBcnJheTxzdHJpbmc+O1xyXG4gICAgc2VsZWN0ZWROYW1lc3BhY2U6IHN0cmluZztcclxuICB9XHJcblxyXG5cdGV4cG9ydCBjbGFzcyBXYXRjaFR5cGVzIHtcclxuXHRcdHB1YmxpYyBzdGF0aWMgZ2V0IEVORFBPSU5UUygpOnN0cmluZyB7IHJldHVybiBcImVuZHBvaW50c1wiOyB9XHJcblx0XHRwdWJsaWMgc3RhdGljIGdldCBFVkVOVFMoKTpzdHJpbmcgeyByZXR1cm4gXCJldmVudHNcIjsgfVxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgTkFNRVNQQUNFUygpOnN0cmluZyB7IHJldHVybiBcIm5hbWVzcGFjZXNcIjsgfVxyXG5cdFx0cHVibGljIHN0YXRpYyBnZXQgTk9ERVMoKTpzdHJpbmcgeyByZXR1cm4gXCJub2Rlc1wiOyB9XHJcblx0XHRwdWJsaWMgc3RhdGljIGdldCBQRVJTSVNURU5UX1ZPTFVNRVMoKTpzdHJpbmcgeyByZXR1cm4gXCJwZXJzaXN0ZW50dm9sdW1lc1wiOyB9XHJcblx0XHRwdWJsaWMgc3RhdGljIGdldCBQRVJTSVNURU5UX1ZPTFVNRV9DTEFJTVMoKTpzdHJpbmcgeyByZXR1cm4gXCJwZXJzaXN0ZW50dm9sdW1lY2xhaW1zXCI7IH1cclxuXHRcdHB1YmxpYyBzdGF0aWMgZ2V0IFBPRFMoKTpzdHJpbmcgeyByZXR1cm4gXCJwb2RzXCI7IH1cclxuXHRcdHB1YmxpYyBzdGF0aWMgZ2V0IFJFUExJQ0FUSU9OX0NPTlRST0xMRVJTKCk6c3RyaW5nIHsgcmV0dXJuIFwicmVwbGljYXRpb25jb250cm9sbGVyc1wiOyB9XHJcblx0XHRwdWJsaWMgc3RhdGljIGdldCBSRVNPVVJDRV9RVU9UQVMoKTpzdHJpbmcgeyByZXR1cm4gXCJyZXNvdXJjZXF1b3Rhc1wiOyB9XHJcblx0XHRwdWJsaWMgc3RhdGljIGdldCBPQVVUSF9DTElFTlRTKCk6c3RyaW5nIHsgcmV0dXJuIFwib2F1dGhjbGllbnRzXCI7IH1cclxuXHRcdHB1YmxpYyBzdGF0aWMgZ2V0IFNFQ1JFVFMoKTpzdHJpbmcgeyByZXR1cm4gXCJzZWNyZXRzXCI7IH1cclxuXHRcdHB1YmxpYyBzdGF0aWMgZ2V0IFNFUlZJQ0VTKCk6c3RyaW5nIHsgcmV0dXJuIFwic2VydmljZXNcIjsgfVxyXG5cdFx0cHVibGljIHN0YXRpYyBnZXQgU0VSVklDRV9BQ0NPVU5UUygpOnN0cmluZyB7IHJldHVybiBcInNlcnZpY2VhY2NvdW50c1wiOyB9XHJcblxyXG5cdFx0cHVibGljIHN0YXRpYyBnZXQgVEVNUExBVEVTKCk6c3RyaW5nIHsgcmV0dXJuIFwidGVtcGxhdGVzXCI7IH1cclxuXHRcdHB1YmxpYyBzdGF0aWMgZ2V0IFJPVVRFUygpOnN0cmluZyB7IHJldHVybiBcInJvdXRlc1wiOyB9XHJcblx0XHRwdWJsaWMgc3RhdGljIGdldCBCVUlMRF9DT05GSUdTKCk6c3RyaW5nIHsgcmV0dXJuIFwiYnVpbGRjb25maWdzXCI7IH1cclxuXHRcdHB1YmxpYyBzdGF0aWMgZ2V0IEJVSUxEUygpOnN0cmluZyB7IHJldHVybiBcImJ1aWxkc1wiOyB9XHJcblx0XHRwdWJsaWMgc3RhdGljIGdldCBERVBMT1lNRU5UX0NPTkZJR1MoKTpzdHJpbmcgeyByZXR1cm4gXCJkZXBsb3ltZW50Y29uZmlnc1wiOyB9XHJcblx0XHRwdWJsaWMgc3RhdGljIGdldCBJTUFHRV9TVFJFQU1TKCk6c3RyaW5nIHsgcmV0dXJuIFwiaW1hZ2VzdHJlYW1zXCI7IH1cclxuXHRcdHB1YmxpYyBzdGF0aWMgZ2V0IFBPTElDSUVTKCk6c3RyaW5nIHsgcmV0dXJuIFwicG9saWNpZXNcIjsgfVxyXG5cdFx0cHVibGljIHN0YXRpYyBnZXQgUE9MSUNZX0JJTkRJTkdTKCk6c3RyaW5nIHsgcmV0dXJuIFwicG9saWN5YmluZGluZ3NcIjsgfVxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgUFJPSkVDVFMoKTpzdHJpbmcgeyByZXR1cm4gXCJwcm9qZWN0c1wiOyB9XHJcblx0XHRwdWJsaWMgc3RhdGljIGdldCBST0xFX0JJTkRJTkdTKCk6c3RyaW5nIHsgcmV0dXJuIFwicm9sZWJpbmRpbmdzXCI7IH1cclxuXHRcdHB1YmxpYyBzdGF0aWMgZ2V0IFJPTEVTKCk6c3RyaW5nIHsgcmV0dXJuIFwicm9sZXNcIjsgfVxyXG5cdH1cclxuXHJcbiAgZXhwb3J0IGNsYXNzIE5hbWVzcGFjZWRUeXBlcyB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBrOHNUeXBlcygpOkFycmF5PHN0cmluZz4ge1xyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgIFdhdGNoVHlwZXMuRU5EUE9JTlRTLFxyXG4gICAgICAgIFdhdGNoVHlwZXMuRVZFTlRTLFxyXG4gICAgICAgIFdhdGNoVHlwZXMuTk9ERVMsXHJcbiAgICAgICAgV2F0Y2hUeXBlcy5QRVJTSVNURU5UX1ZPTFVNRVMsXHJcbiAgICAgICAgV2F0Y2hUeXBlcy5QRVJTSVNURU5UX1ZPTFVNRV9DTEFJTVMsXHJcbiAgICAgICAgV2F0Y2hUeXBlcy5QT0RTLFxyXG4gICAgICAgIFdhdGNoVHlwZXMuUkVQTElDQVRJT05fQ09OVFJPTExFUlMsXHJcbiAgICAgICAgV2F0Y2hUeXBlcy5SRVNPVVJDRV9RVU9UQVMsXHJcbiAgICAgICAgV2F0Y2hUeXBlcy5QRVJTSVNURU5UX1ZPTFVNRVMsXHJcbiAgICAgICAgV2F0Y2hUeXBlcy5TRUNSRVRTLFxyXG4gICAgICAgIFdhdGNoVHlwZXMuU0VSVklDRVMsXHJcbiAgICAgICAgV2F0Y2hUeXBlcy5TRVJWSUNFX0FDQ09VTlRTXHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBvc1R5cGVzKCk6QXJyYXk8c3RyaW5nPiB7XHJcbiAgICAgIHJldHVybiBbXHJcbiAgICAgICAgV2F0Y2hUeXBlcy5URU1QTEFURVMsXHJcbiAgICAgICAgV2F0Y2hUeXBlcy5CVUlMRF9DT05GSUdTLFxyXG4gICAgICAgIFdhdGNoVHlwZXMuUk9VVEVTLFxyXG4gICAgICAgIFdhdGNoVHlwZXMuQlVJTERTLFxyXG4gICAgICAgIFdhdGNoVHlwZXMuQlVJTERfQ09ORklHUyxcclxuICAgICAgICBXYXRjaFR5cGVzLkRFUExPWU1FTlRfQ09ORklHUyxcclxuICAgICAgICBXYXRjaFR5cGVzLklNQUdFX1NUUkVBTVMsXHJcbiAgICAgICAgV2F0Y2hUeXBlcy5PQVVUSF9DTElFTlRTLFxyXG4gICAgICAgIFdhdGNoVHlwZXMuUE9MSUNJRVMsXHJcbiAgICAgICAgV2F0Y2hUeXBlcy5QT0xJQ1lfQklORElOR1MsXHJcbiAgICAgICAgV2F0Y2hUeXBlcy5QUk9KRUNUUyxcclxuICAgICAgICAvL1dhdGNoVHlwZXMuUk9MRV9CSU5ESU5HUyxcclxuICAgICAgICAvL1dhdGNoVHlwZXMuUk9MRVNcclxuICAgICAgXTtcclxuICAgIH1cclxuICB9XHJcblx0XHJcblx0ZXhwb3J0IGNsYXNzIFdhdGNoQWN0aW9ucyB7XHJcblx0XHRwdWJsaWMgc3RhdGljIGdldCBBTlkoKTpzdHJpbmcgeyByZXR1cm4gXCIqXCI7IH1cclxuXHRcdHB1YmxpYyBzdGF0aWMgZ2V0IEFEREVEKCk6c3RyaW5nIHsgcmV0dXJuIFwiQURERURcIjsgfVxyXG5cdFx0cHVibGljIHN0YXRpYyBnZXQgTU9ESUZJRUQoKTpzdHJpbmcgeyByZXR1cm4gXCJNT0RJRklFRFwiOyB9XHJcblx0XHRwdWJsaWMgc3RhdGljIGdldCBERUxFVEVEKCk6c3RyaW5nIHsgcmV0dXJuIFwiREVMRVRFRFwiOyB9XHJcblx0fVxyXG5cdFxyXG5cdGV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0TWFwIHtcclxuXHRcdFt1aWQ6c3RyaW5nXTogYW55O1x0XHRcclxuXHR9XHJcblx0XHJcblx0ZXhwb3J0IGludGVyZmFjZSBXYXRjaGVyU2VydmljZSB7XHJcblx0XHRoYXNXZWJTb2NrZXQ6IGJvb2xlYW47XHJcblx0XHRhZGRDdXN0b21pemVyOiAodHlwZTogc3RyaW5nLCBjdXN0b21pemVyOiAob2JqOmFueSkgPT4gdm9pZCkgPT4gdm9pZDtcclxuXHRcdGdldFR5cGVzOiAoKSA9PiBBcnJheTxzdHJpbmc+O1xyXG5cdFx0Z2V0TmFtZXNwYWNlOiAoKSA9PiBzdHJpbmc7XHJcblx0XHRzZXROYW1lc3BhY2U6IChuYW1lc3BhY2U6IHN0cmluZykgPT4gdm9pZDtcclxuXHRcdGdldE9iamVjdHM6ICh0eXBlOiBzdHJpbmcpID0+IEFycmF5PGFueT47XHJcblx0XHRnZXRPYmplY3RNYXA6ICh0eXBlOiBzdHJpbmcpID0+IE9iamVjdE1hcDtcclxuXHRcdGFkZEFjdGlvbjogKHR5cGU6IHN0cmluZywgYWN0aW9uOiBzdHJpbmcsIGZuOiAob2JqOmFueSkgPT4gdm9pZCkgPT4gdm9pZDtcclxuXHRcdHJlZ2lzdGVyTGlzdGVuZXI6IChmbjoob2JqZWN0czpPYmplY3RNYXApID0+IHZvaWQpID0+IHZvaWQ7XHJcbiAgICByZWdpc3RlckN1c3RvbVVybEZ1bmN0aW9uOiAoa2luZDpzdHJpbmcsIHVybDooa2luZDpzdHJpbmcpID0+IHN0cmluZykgPT4gdm9pZDtcclxuXHR9XHJcblxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgS3ViZVBvZCB7XHJcbiAgICBpZDpzdHJpbmc7XHJcbiAgICBuYW1lc3BhY2U6c3RyaW5nO1xyXG4gICAgbWV0YWRhdGE7XHJcbiAgICAkcmVwbGljYXM6IG51bWJlcjtcclxuICB9XHJcblxyXG5cdFxyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4va3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuICBleHBvcnQgdmFyIGhvc3RQb3J0cyA9W107XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvcnRzIHRoZSB0aGUgaXAgZmllbGRcclxuICAgKlxyXG4gICAqIEBwYXJhbSBpcCB0aGUgaXAgc3VjaCBhcyAnMTAuMS4yLjEzJ1xyXG4gICAqIEByZXR1cm5zIHthbnl9XHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIHNvcnRCeVBvZElwKGlwKSA6IGFueSB7XHJcbiAgICAvLyBpIGd1ZXNzIHRoZXJlIGlzIG1heWJlIG5pY2VyIHdheXMgb2Ygc29ydCB0aGlzIHdpdGhvdXQgcGFyc2luZyBhbmQgc2xpY2luZ1xyXG4gICAgdmFyIHJlZ2V4ID0gLyhcXGR7MSwzfSlcXC4oXFxkezEsM30pXFwuKFxcZHsxLDN9KVxcLihcXGR7MSwzfSkvO1xyXG4gICAgdmFyIGdyb3VwcyA9IHJlZ2V4LmV4ZWMoaXApO1xyXG4gICAgaWYgKGFuZ3VsYXIuaXNEZWZpbmVkKGdyb3VwcykpIHtcclxuICAgICAgdmFyIGcxID0gKFwiMDBcIiArIGdyb3Vwc1sxXSkuc2xpY2UoLTMpO1xyXG4gICAgICB2YXIgZzIgPSAoXCIwMFwiICsgZ3JvdXBzWzJdKS5zbGljZSgtMyk7XHJcbiAgICAgIHZhciBnMyA9IChcIjAwXCIgKyBncm91cHNbM10pLnNsaWNlKC0zKTtcclxuICAgICAgdmFyIGc0ID0gKFwiMDBcIiArIGdyb3Vwc1s0XSkuc2xpY2UoLTMpO1xyXG4gICAgICB2YXIgYW5zd2VyID0gZzEgKyBnMiArIGczICsgZzQ7XHJcbiAgICAgIHJldHVybiBhbnN3ZXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiByYW1kb21Qb3J0KCk6IG51bWJlcntcclxuICAgICB2YXIgaG9zdFBvcnQ9TWF0aC5mbG9vcigzMDAwMCtNYXRoLnJhbmRvbSgpKig2NTUzNS0zMDAwMCkpO1xyXG4gICAgIHdoaWxlKGhvc3RQb3J0cy5pbmRleE9mKGhvc3RQb3J0KSA9PT0gMCl7XHJcbiAgICAgICAgaG9zdFBvcnQgPSBNYXRoLmZsb29yKDMwMDAwK01hdGgucmFuZG9tKCkqKDY1NTM1LTMwMDAwKSk7XHJcbiAgICAgfVxyXG4gICAgIGhvc3RQb3J0cy5wdXNoKGhvc3RQb3J0KTtcclxuICAgICByZXR1cm4gaG9zdFBvcnRcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRSYW5kb21TdHJpbmcobGVuIDogbnVtYmVyKSA6IHN0cmluZ3tcclxuICAgICAgbGVuID0gbGVuIHx8IDMyO1xyXG4gICAgICB2YXIgJGNoYXJzID0gJ2FiY2RlZmhpamttbnByc3R3eHl6JzsgLy8g6buY6K6k5Y675o6J5LqG5a655piT5re35reG55qE5a2X56ymb09MbCw5Z3EsVnYsVXUsSTFcclxuICAgICAgdmFyIG1heFBvcyA9ICRjaGFycy5sZW5ndGg7XHJcbiAgICAgIHZhciBwd2QgPSAnJztcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgcHdkICs9ICRjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbWF4UG9zKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHB3ZDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBjbGFzcyByZXNvdXJjZVJDVGVtcGxhdGV7XHJcblxyXG4gICAgIHB1YmxpYyBpbWFnZT1cIm9yYWNsZTp1dGY4XCI7XHJcbiAgICAgcHVibGljIG5hbWVzID0gW1wib3JhZGF0YVwiXTtcclxuXHJcbiAgICAgcHVibGljIGNyZWF0ZVJDKE9iail7XHJcbiAgICAgICAgdmFyIGxhYmVscyA9IHtcclxuICAgICAgICAgICBcInN0eWxlXCI6IFwib3JhY2xlXCIsXHJcbiAgICAgICAgICAgXCJzdGF0dXNcIjogXCIwXCIsXHJcbiAgICAgICAgICAgXCJpc0V4dHJhY3RcIjogT2JqLmlzRXh0cmFjdCtcIlwiIHx8IFwiMFwiLFxyXG4gICAgICAgICAgIFwiaXNUYXJnZXRcIjogT2JqLmlzVGFyZ2V0XHJcbiAgICAgICAgfTtcclxuICAgICAgICBmb3IodmFyIGl0ZW0gaW4gT2JqLmxhYmVscylcclxuICAgICAgICAgICBsYWJlbHNbaXRlbV0gPSBPYmoubGFiZWxzW2l0ZW1dO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgIFwiYXBpVmVyc2lvblwiIDogIEt1YmVybmV0ZXMuZGVmYXVsdEFwaVZlcnNpb24sXHJcbiAgICAgICAgICAgXCJraW5kXCIgOiBcIlJlcGxpY2F0aW9uQ29udHJvbGxlclwiLFxyXG4gICAgICAgICAgIFwibWV0YWRhdGFcIiA6IHtcclxuICAgICAgICAgICAgICBcIm5hbWVcIiA6IE9iai5uYW1lLFxyXG4gICAgICAgICAgICAgIFwibGFiZWxzXCIgOiBsYWJlbHMsXHJcbiAgICAgICAgICAgICAgXCJhbm5vdGF0aW9uc1wiOiBPYmouYW5ub3RhdGlvbnNcclxuICAgICAgICAgICB9LFxyXG4gICAgICAgICAgIFwic3BlY1wiIDoge1xyXG4gICAgICAgICAgICAgIHJlcGxpY2FzIDogT2JqLnJlcGxpY2FzIHx8IDEsXHJcbiAgICAgICAgICAgICAgXCJ0ZW1wbGF0ZVwiIDogdGhpcy5jcmVhdGVUZW1wbGF0ZShPYmopXHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICB9XHJcblxyXG4gICAgIHB1YmxpYyBjcmVhdGVWb2x1bWVNb3VudHMoKXtcclxuICAgICAgICB2YXIgdm9sdW1lTW91bnRzID0gW107XHJcbiAgICAgICAgZm9yKHZhciBpdGVtIGluIHRoaXMubmFtZXMpe1xyXG4gICAgICAgICAgIGlmKHRoaXMubmFtZXNbaXRlbV0gPT09ICdmbGFzaC1yZWNvdmVyeS1hcmVhJylcclxuICAgICAgICAgICAgICB2b2x1bWVNb3VudHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgXCJuYW1lXCIgOiB0aGlzLm5hbWVzW2l0ZW1dLFxyXG4gICAgICAgICAgICAgICAgIFwibW91bnRQYXRoXCIgOiBcIi9vcHQvb3JhY2xlL2FwcC9mbGFzaF9yZWNvdmVyeV9hcmVhXCJcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdm9sdW1lTW91bnRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgIFwibmFtZVwiIDogdGhpcy5uYW1lc1tpdGVtXSxcclxuICAgICAgICAgICAgICAgICBcIm1vdW50UGF0aFwiIDogXCIvb3B0L29yYWNsZS9hcHAvXCIgKyB0aGlzLm5hbWVzW2l0ZW1dXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2b2x1bWVNb3VudHM7XHJcbiAgICAgfVxyXG5cclxuICAgICBwdWJsaWMgY3JlYXRlVm9sdW1lcyhyb290UGF0aCA6c3RyaW5nKXtcclxuICAgICAgICB2YXIgdm9sdW1lcyA9IFtdO1xyXG4gICAgICAgIGZvcih2YXIgaXRlbSBpbiB0aGlzLm5hbWVzKXtcclxuICAgICAgICAgICAgaWYodGhpcy5uYW1lc1tpdGVtXSA9PT0gJ2ZsYXNoLXJlY292ZXJ5LWFyZWEnKVxyXG4gICAgICAgICAgICAgICB2b2x1bWVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICBcIm5hbWVcIiA6IHRoaXMubmFtZXNbaXRlbV0sXHJcbiAgICAgICAgICAgICAgICAgIFwiaG9zdFBhdGhcIiA6e1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCJwYXRoXCIgOiByb290UGF0aCArIFwiZmxhc2hfcmVjb3ZlcnlfYXJlYVwiXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgdm9sdW1lcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgXCJuYW1lXCIgOiB0aGlzLm5hbWVzW2l0ZW1dLFxyXG4gICAgICAgICAgICAgICAgICBcImhvc3RQYXRoXCIgOntcclxuICAgICAgICAgICAgICAgICAgICAgIFwicGF0aFwiIDogcm9vdFBhdGggKyB0aGlzLm5hbWVzW2l0ZW1dXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2b2x1bWVzO1xyXG4gICAgIH1cclxuXHJcbiAgICAgcHVibGljIGNyZWF0ZUNvbnRhaW5lcnMoT2JqKXtcclxuICAgICAgICB2YXIgY29udGFpbmVycyA9IFtdO1xyXG4gICAgICAgIGNvbnRhaW5lcnMucHVzaChcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgXCJuYW1lXCIgOiBcIm9yYWNsZVwiLFxyXG4gICAgICAgICAgIFwiaW1hZ2VcIjogdGhpcy5pbWFnZSxcclxuICAgICAgICAgICBcImltYWdlUHVsbFBvbGljeVwiOiBcIklmTm90UHJlc2VudFwiLFxyXG4gICAgICAgICAgIFwiY29tbWFuZFwiOltcIi9hc3NldHMvZW50cnlwb2ludC5zaFwiXSxcclxuICAgICAgICAgICBcInBvcnRzXCI6IFtcclxuICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICBcImNvbnRhaW5lclBvcnRcIjogMTUyMSxcclxuICAgICAgICAgICAgIFwiaG9zdFBvcnRcIjogT2JqLnBvcnQgfHwgcmFtZG9tUG9ydCgpXHJcbiAgICAgICAgICAgfV0sXHJcbiAgICAgICAgICAgXCJ2b2x1bWVNb3VudHNcIiA6IHRoaXMuY3JlYXRlVm9sdW1lTW91bnRzKClcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gY29udGFpbmVyc1xyXG4gICAgIH1cclxuXHJcbiAgICAgcHVibGljIGNyZWF0ZVRlbXBsYXRlKE9iail7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgXCJtZXRhZGF0YVwiOlxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgIC8vXCJuYW1lXCI6IE9iai5uYW1lLFxyXG4gICAgICAgICAgICAgICBcImxhYmVsc1wiOiBPYmoubGFiZWxzXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFwic3BlY1wiIDoge1xyXG4gICAgICAgICAgICAgICAgXCJ0ZXJtaW5hdGlvbkdyYWNlUGVyaW9kU2Vjb25kc1wiIDogMCxcclxuICAgICAgICAgICAgICAgIFwiY29udGFpbmVyc1wiIDogIHRoaXMuY3JlYXRlQ29udGFpbmVycyhPYmopLFxyXG4gICAgICAgICAgICAgICAgXCJ2b2x1bWVzXCIgOiAgdGhpcy5jcmVhdGVWb2x1bWVzKE9iai5wYXRoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBsYWJlbFRvQ2hpbmVzZShsYWJlbHMpe1xyXG4gICAgIHZhciBhbnN3ZXIgPSB7fTtcclxuICAgICBhbmd1bGFyLmZvckVhY2gobGFiZWxzLCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgICAgYW5zd2VyW2tleV0gPSBsYWJlbENoYW5nZVRvQ2hpbmVzKHZhbHVlLCBrZXkpO1xyXG4gICAgIH0pO1xyXG4gICAgIHJldHVybiBhbnN3ZXJcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiAgZmluZFNhbWVOYW1lUmVwbGljYXRpb25Db250cm9sbGVycyhyZXBsaWNhdGlvbkNvbnRyb2xsZXJzLCBuYW1lKXtcclxuICAgICAgdmFyIG5hbWVzID0gW107XHJcbiAgICAgIHJlcGxpY2F0aW9uQ29udHJvbGxlcnMuZm9yRWFjaCgocmMpID0+IHtcclxuICAgICAgICAgIHZhciByY05hbWUgPSBnZXROYW1lKHJjKTtcclxuICAgICAgICAgIGlmKHJjTmFtZS5pbmRleG9mKG5hbWUpICE9PSAtMSlcclxuICAgICAgICAgICAgICBuYW1lcy5wdXNoKHJjTmFtZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYobmFtZXMubGVuZ3RoID09PSAwKXtcclxuICAgICAgICAgIHJldHVybiBuYW1lICsgXCJfMVwiO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICAgIHZhciBtYXggPSAwO1xyXG4gICAgICAgICAgbmFtZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgIHZhciBhbnN3ZXIgPSB2YWx1ZS5zcGxpdChcIl9cIik7XHJcbiAgICAgICAgICAgICB2YXIga2V5ID0gcGFyc2VJbnQoYW5zd2VyWzFdKTtcclxuICAgICAgICAgICAgIGlmKG1heCA8IGtleSlcclxuICAgICAgICAgICAgICAgIG1heCA9IGtleTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuIG5hbWUgKyAobWF4KzEpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gaXNGaWx0ZXJSQyhyYyl7XHJcbiAgICAgIHZhciBhbnN3ZXIgPSBmYWxzZTtcclxuICAgICAgYW5ndWxhci5mb3JFYWNoKENvcmUucGF0aEdldChyYywgW1wibWV0YWRhdGFcIiwgXCJsYWJlbHNcIl0pLCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgICAgICBpZihrZXkgPT09ICdpc1RhcmdldCcgJiYgdmFsdWUgPT09ICd0cnVlJyl7XHJcbiAgICAgICAgICAgICBhbnN3ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGFuc3dlcjtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBpc0luY2x1ZGUocmNzLCByYyl7XHJcbiAgICAgZm9yKHZhciBpIGluIHJjcyl7XHJcbiAgICAgICAgIGlmKGdldE5hbWUocmNzW2ldKSA9PT0gZ2V0TmFtZShyYykpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgIH1cclxuICAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gbGFiZWxDaGFuZ2VUb0NoaW5lcyh2YWx1ZTpzdHJpbmcsIGtleTpzdHJpbmcpe1xyXG4gIFx0dmFyIHRydWVWYWx1ZSA9ICcnO1xyXG4gIFx0c3dpdGNoKGtleSl7XHJcbiAgXHRcdGNhc2UgJ3R5cGUnOlxyXG4gIFx0XHQgICBpZih2YWx1ZSA9PT0gJzAxJylcclxuICBcdFx0ICAgXHQgIHRydWVWYWx1ZSA9ICfotKLmlL8nO1xyXG4gIFx0XHQgICBlbHNlIGlmKHZhbHVlID09PSAnMDInKVxyXG4gIFx0XHQgICAgICB0cnVlVmFsdWUgPSAn56S+5L+dJztcclxuICBcdFx0ICAgZWxzZVxyXG4gIFx0XHQgICBcdCAgdHJ1ZVZhbHVlID0gdmFsdWU7XHJcbiAgXHRcdCAgIGJyZWFrO1xyXG4gIFx0XHRjYXNlICdiYXRjaCc6XHJcbiAgXHQgICAgICAgaWYodmFsdWUgPT09ICdBJylcclxuICBcdCAgICAgICBcdCAgdHJ1ZVZhbHVlID0gJ+aJueasoUEnO1xyXG4gIFx0ICAgICAgIGVsc2UgaWYodmFsdWUgPT09ICdCJylcclxuICBcdCAgICAgICBcdCAgdHJ1ZVZhbHVlID0gJ+aJueasoUInO1xyXG4gIFx0ICAgICAgIGVsc2VcclxuICBcdCAgICAgICBcdCAgdHJ1ZVZhbHVlID0gdmFsdWU7XHJcblxyXG4gIFx0XHQgICBicmVhaztcclxuICBcdFx0Y2FzZSAncmVnaW9uJzpcclxuICBcdFx0ICAgdHJ1ZVZhbHVlID0gS3ViZXJuZXRlcy5nZXRDb3VudHlCeUNvZGUodmFsdWUpO1xyXG4gIFx0XHQgICBicmVhaztcclxuICBcdFx0Y2FzZSAnc3lzdGVtJzpcclxuICBcdFx0ICAgdHJ1ZVZhbHVlID0gS3ViZXJuZXRlcy5nZXRTeXN0ZW1OYW1lQnlJZCh2YWx1ZSk7XHJcbiAgXHRcdCAgIGJyZWFrO1xyXG4gIFx0XHRjYXNlICd2ZXJzaW9uJzpcclxuICBcdFx0ICAgdmFyIHJlZz0gbmV3IFJlZ0V4cCgnXlswLTldJCcpLmV4ZWModmFsdWUpO1xyXG4gIFx0XHQgICBpZihyZWcpXHJcbiAgXHRcdCAgICAgICB0cnVlVmFsdWUgPSAn54mI5pysJyArIHJlZ1swXTtcclxuICBcdFx0ICAgZWxzZVxyXG4gIFx0XHQgICBcdCAgIHRydWVWYWx1ZSA9IHZhbHVlO1xyXG4gIFx0ICAgICAgIGJyZWFrO1xyXG4gIFx0ICAgIGNhc2UgJ2lzVGFyZ2V0JzpcclxuICBcdCAgICAgICBpZih2YWx1ZSA9PT0gJ3RydWUnKVxyXG4gIFx0ICAgICAgIFx0ICAgdHJ1ZVZhbHVlID0gJ+axh+aAu+aVsOaNruW6kyc7XHJcbiAgXHQgICAgICAgZWxzZVxyXG4gIFx0ICAgICAgICAgICB0cnVlVmFsdWUgPSB2YWx1ZTtcclxuICBcdCAgICAgICBicmVhaztcclxuICBcdCAgICBkZWZhdWx0OlxyXG4gIFx0ICAgICAgIHRydWVWYWx1ZSA9IHZhbHVlO1xyXG4gIFx0fVxyXG4gIFx0cmV0dXJuIHRydWVWYWx1ZTtcclxuICB9XHJcblxyXG4gLypcclxuICAg5qOA5p+l6L+B56e7LOaYr+WQpuacieW3suWQr+WKqOeahG9yYWNsZVxyXG4gXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRm9yTWlncmF0aW9uKHJlcGxpY2F0aW9uQ29udHJvbGxlcnM6QXJyYXk8S3ViZVBvZD4sIHNlbGVjdEl0ZW06QXJyYXk8YW55Pil7XHJcbiAgICB2YXIgcmVzdWx0ID0gW107XHJcbiAgICBhbmd1bGFyLmZvckVhY2goc2VsZWN0SXRlbSwgKGl0ZW0pID0+IHsgICAgICBcclxuICAgICAgaWYoY2hlY2tGb3JFeGl0KHJlcGxpY2F0aW9uQ29udHJvbGxlcnMsIGl0ZW0pKVxyXG4gICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH0gICovXHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGVja0ZvckV4aXQocmVwbGljYXRpb25Db250cm9sbGVyczpBcnJheTxLdWJlUG9kPiwgc2VsZWN0SXRlbSl7XHJcbiAgICBmb3IodmFyIGluZGV4IGluIHJlcGxpY2F0aW9uQ29udHJvbGxlcnMpIHtcclxuICAgICAgdmFyIHJlcGxpY2FzID0gcmVwbGljYXRpb25Db250cm9sbGVyc1tpbmRleF07XHJcbiAgICAgIGlmKGdldE5hbWUocmVwbGljYXMpPT1zZWxlY3RJdGVtLl9rZXkgJiYgZ2V0QW5ub3RhdGlvblZhbHVlQnlrZXkocmVwbGljYXMsXCJ5ZWFyXCIpID09IHNlbGVjdEl0ZW1bXCJ5ZWFyXCJdKVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlOyBcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldEFubm90YXRpb25WYWx1ZUJ5a2V5KHJlcGxpY2F0aW9uQ29udHJvbGxlciwga2V5OnN0cmluZyl7XHJcbiAgICB2YXIgYW5ub3RhdGlvbnMgPSBnZXRBbm5vdGF0aW9ucyhyZXBsaWNhdGlvbkNvbnRyb2xsZXIpOyAgIFxyXG4gICAgaWYoYW5ub3RhdGlvbnMgJiYgYW5ub3RhdGlvbnMgIT0gdW5kZWZpbmVkKXtcclxuICAgICAgcmV0dXJuIGFubm90YXRpb25zW2tleV07XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIC8qXHJcbiAgICDlkK/liqhvcmFjbGXml7bmo4Dmn6XmmK/lkKbmraPlnKjov4Hnp7tcclxuICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGVja0ZvckNyZWF0ZU9yYWNsZSh0cmFuc2ZlclRhc2tzOkFycmF5PGFueT4sIHNlbGVjdEl0ZW1zOkFycmF5PGFueT4pe1xyXG4gICAgdmFyIHJlc3VsdCA9IFtdO1xyXG4gICAgYW5ndWxhci5mb3JFYWNoKHNlbGVjdEl0ZW1zLCAoaXRlbSkgPT4ge1xyXG4gICAgICBpZihjaGVja0ZvckV4aXRUYXNrKHRyYW5zZmVyVGFza3MsIGl0ZW0pKVxyXG4gICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gY2hlY2tGb3JFeGl0VGFzayh0cmFuc2ZlclRhc2tzOkFycmF5PGFueT4sIHNlbGVjdEl0ZW0pe1xyXG4gICAgZm9yKHZhciBpbmRleCBpbiB0cmFuc2ZlclRhc2tzKXtcclxuICAgICAgdmFyIHRhc2sgPSB0cmFuc2ZlclRhc2tzW2luZGV4XTsgICAgICBcclxuICAgICAgaWYodGFza1tcIl9rZXlcIl0gPT0gc2VsZWN0SXRlbVtcIl9rZXlcIl0gICYmIHNlbGVjdEl0ZW1bXCJ5ZWFyXCJdID09IHRhc2subGFiZWxzLmRhdGFZZWFyKXtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICBcclxuICAqKi9cclxuICBleHBvcnQgZnVuY3Rpb24gY2hlY2tGb3JFeHRyYWN0KHJlcGxpY2F0aW9uQ29udHJvbGxlcnM6IEFycmF5PGFueT4pe1xyXG4gICAgdmFyIHJlc3VsdCA9IFtdO1xyXG4gICAgYW5ndWxhci5mb3JFYWNoKHJlcGxpY2F0aW9uQ29udHJvbGxlcnMsIChyZXBsaWNhcykgPT4ge1xyXG4gICAgICB2YXIgbGFiZWxzID0gZ2V0TGFiZWxzKHJlcGxpY2FzKTtcclxuICAgICAgaWYobGFiZWxzW1wiaXNFeHRyYWN0XCJdID09IFwiMVwiKVxyXG4gICAgICAgIHJlc3VsdC5wdXNoKHJlcGxpY2FzKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGVja0lzU3RhcnRTdWNjZXNzKHJlcGxpY2F0aW9uQ29udHJvbGxlcnM6IEFycmF5PGFueT4pe1xyXG4gICAgdmFyIHJlc3VsdCA9IFtdO1xyXG4gICAgIGFuZ3VsYXIuZm9yRWFjaChyZXBsaWNhdGlvbkNvbnRyb2xsZXJzLCAocmVwbGljYXMpID0+IHtcclxuICAgICAgdmFyIGxhYmVscyA9IGdldExhYmVscyhyZXBsaWNhcyk7XHJcbiAgICAgIGlmKGxhYmVsc1tcInN0YXR1c1wiXSAhPSBcIjJcIilcclxuICAgICAgICByZXN1bHQucHVzaChyZXBsaWNhcyk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfTtcclxuXHJcbiAgLypcclxuICAgIOajgOafpeaVsOaNruWQpuW3suaMgui9veS9v+eUqOaIluato+WcqOi/geenu+OAglxyXG4gICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRm9yTWlncmF0aW9uKHJlcGxpY2F0aW9uQ29udHJvbGxlcnM6QXJyYXk8S3ViZVBvZD4sIHRyYW5zZmVyVGFza3M6IEFycmF5PGFueT4sIHNlbGVjdEl0ZW06QXJyYXk8YW55Pil7XHJcbiAgICB2YXIgbWVzc2FnZSA9IFwiXCI7XHJcbiAgICBmb3IgKHZhciBpbmRleCBpbiBzZWxlY3RJdGVtKSB7XHJcbiAgICAgIHZhciBpdGVtID0gc2VsZWN0SXRlbVtpbmRleF07XHJcblxyXG4gICAgICAvKlxyXG4gICAgICAgIOajgOafpei/geenu+aWh+S7tuaYr+WQpuW3suaMgui9veS9v+eUqFxyXG4gICAgICAqL1xyXG4gICAgICBmb3IgKHZhciBpIGluIHJlcGxpY2F0aW9uQ29udHJvbGxlcnMpIHtcclxuICAgICAgICB2YXIgbGFiZWxzID0gZ2V0TGFiZWxzKHJlcGxpY2F0aW9uQ29udHJvbGxlcnNbaV0pOyAgICAgICBcclxuICAgICAgICBpZihnZXROYW1lKHJlcGxpY2F0aW9uQ29udHJvbGxlcnNbaV0pID09IGl0ZW0uX2tleSAmJiBnZXRBbm5vdGF0aW9uVmFsdWVCeWtleShyZXBsaWNhdGlvbkNvbnRyb2xsZXJzW2ldLFwieWVhclwiKSA9PSBpdGVtW1wieWVhclwiXSAmJiBsYWJlbHMudmVyc2lvbiA9PSBpdGVtLmxhYmVscy52ZXJzaW9uKXtcclxuICAgICAgICAgIG1lc3NhZ2UgPSBcIuaVsOaNruato+WcqOS9v+eUqFwiO1xyXG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvKlxyXG4gICAgICAgIOajgOafpei/geenu+aWh+S7tuaYr+WQpuato+WcqOi/geenu1xyXG4gICAgICAqL1xyXG4gICAgICBmb3IoaSBpbiB0cmFuc2ZlclRhc2tzKXsgICAgICAgXHJcbiAgICAgICAgaWYodHJhbnNmZXJUYXNrc1tpXVtcIl9rZXlcIl0gPT0gaXRlbVtcIl9rZXlcIl0gJiYgKHRyYW5zZmVyVGFza3NbaV1bXCJzdGF0dXNcIl0gPT0gXCIxXCIgfHwgdHJhbnNmZXJUYXNrc1tpXVtcInN0YXR1c1wiXSA9PSBcIjBcIikgJiYgaXRlbVtcInllYXJcIl0gPT0gdHJhbnNmZXJUYXNrc1tpXS5sYWJlbHMuZGF0YVllYXIgJiYgaXRlbS5sYWJlbHMudmVyc2lvbiA9PSB0cmFuc2ZlclRhc2tzW2ldLmxhYmVscy5kYXRhVmVyc2lvbil7XHJcbiAgICAgICAgICBtZXNzYWdlID0gXCLmlbDmja7mraPlnKjov4Hnp7tcIlxyXG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWVzc2FnZTtcclxuICB9XHJcblxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZWxpbWluYXRlQ2hlY2hCb3hDbGljaygpe1xyXG4gICAgdmFyIGVsZW1lbnQgPSAkKFwiI3RhYmxlQ29uZmlnID4gdGhlYWQgPiB0ciBpbnB1dDpjaGVja2JveFwiKTsgICBcclxuICAgIGlmKGVsZW1lbnQuaXMoJzpjaGVja2VkJykpXHJcbiAgICAgIGVsZW1lbnQuY2xpY2soKTsgICAgXHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAg5piv5ZCm5bey5a2Y5Zyo5b2T5YmNXHJcbiAgKi9cclxuICBleHBvcnQgZnVuY3Rpb24gYWxyZWFkeUV4aXRJbkZvbGRlcihzZWxlY3RlZEl0ZW1zOiBBcnJheTxhbnk+LCBzZWxlY3ROb2RlKXsgICAgXHJcbiAgICB2YXIgY2hpbGROb2RlcyA9IHNlbGVjdE5vZGUuY2hpbGROb2RlcztcclxuICAgIGZvcih2YXIgaSBpbiBzZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICB2YXIgaXRlbU5hbWUgPSBzZWxlY3RlZEl0ZW1zW2ldLnJlZ2lvbmFsaXNtQ29kZSArIFwiX1wiICsgc2VsZWN0ZWRJdGVtc1tpXS5zeXN0ZW1Db2RlO1xyXG4gICAgICAgZm9yICh2YXIgaiBpbiBjaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgIGlmKGNoaWxkTm9kZXNbal0ubmFtZSA9PSBpdGVtTmFtZSl7XHJcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbnMgPSBjaGlsZE5vZGVzW2pdLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgIGZvcih2YXIgayBpbiBjaGlsZHJlbnMpXHJcbiAgICAgICAgICAgICAgaWYoY2hpbGRyZW5zW2tdLm5hbWUgPT0gc2VsZWN0ZWRJdGVtc1tpXS5kYXRhVmVyc2lvbilcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICB9XHJcbiAgICAgfSBcclxuICAgICByZXR1cm4gZmFsc2U7XHJcbiAgfSAgXHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbm1vZHVsZSBDb25maWdze1xyXG5cdGV4cG9ydCBmdW5jdGlvbiBjdXN0b21BbGVydCh0aXRsZSwgY29udGVudCwgZnVuYywgY2FuY2VsLCBmb2N1cywgaWNvbil7XHJcblx0XHQvKlx0XHRcclxuXHQgICAgICAgIOiHquWumuS5iSBhbGVydOahhlxyXG5cdCAgICAgICAgdGl0bGUgOlx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcclxuXHQgICAgICAgIHRleHQgIDpcclxuXHQgICAgICAgIGZ1bmMgIDpcclxuXHQgICAgICAgIGNhbmNlbDpcclxuXHQgICAgICAgIGZvY3VzIDpcclxuXHQgICAgICAgIGljb24gIDogICAgIFxyXG4gICAgICAgICovXHJcbiAgICAgICAgaWNvbiA9IFwiLi4vLi4vLi4vbmV3L2ltYWdlcy9tc2dib3hfXCIgKyBpY29uICsgXCIucG5nXCI7XHJcbiAgICAgICAgY3JlYXRlX21hc2soKTtcclxuICAgICAgICB2YXIgdGVtcCA9IFwiPGRpdiBjbGFzcz1cXFwiY3VzdG9tLWFsZXJ0XFxcIiA+XCIgXHJcbiAgICAgICAgXHQrIFwiPGRpdiBjbGFzcz1cXFwiY3VzdG9tLWFsZXJ0LXRpdGxlXFxcIj5cIiArIHRpdGxlICsgXCI8L2Rpdj5cIiBcclxuICAgICAgICBcdCsgXCI8dGFibGUgIGNsYXNzPVxcXCJjdXN0b20tYWxlcnQtYm9keVxcXCI+PHRyPjx0ZCBjbGFzcz1cXFwiY3VzdG9tLWFsZXJ0LXRkXFxcIj48aW1nIHNyYz1cXFwiXCIgXHJcbiAgICAgICAgXHQrIGljb24gKyBcIlxcXCIgY2xhc3M9XFxcImN1c3RvbS1hbGVydC1pbWdcXFwiPjwvdGQ+XCIgXHJcbiAgICAgICAgXHQrIFwiPHRkID48ZGl2IGNhbHNzPVxcXCJjdXN0b20tYWxlcnQtY29udGVudFxcXCI+XCIgXHJcbiAgICAgICAgXHQrIGNvbnRlbnQgKyBcIjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPlwiIFxyXG4gICAgICAgIFx0KyBcIjxkaXYgY2xhc3M9XFxcImN1c3RvbS1hbGVydC1ib3R0b21cXFwiPjxpbnB1dCB0eXBlPSdidXR0b24nIFwiIFxyXG4gICAgICAgIFx0KyBcIiBjbGFzcz1cXFwiY3VzdG9tLWFsZXJ0LW9rXFxcIiB2YWx1ZT0n56Gu6K6kJyBpZD1cXFwibXNnY29uZmlybWJcXFwiIG9uY2xpY2s9XFxcIkNvbmZpZ3MucmVtb3ZlKCk7XCIgXHJcbiAgICAgICAgXHQrIGZ1bmMgKyBcIjtcXFwiPlwiO1xyXG4gICAgICAgIGlmIChudWxsICE9IGNhbmNlbCkge1xyXG4gICAgICAgICAgICB0ZW1wICs9IFwiJm5ic3A7Jm5ic3A7Jm5ic3A7PGlucHV0IHR5cGU9J2J1dHRvbicgY2xhc3M9XFxcImN1c3RvbS1hbGVydC1jYW5jZWxcXFwiIG9uQ2xpY2s9J0NvbmZpZ3MucmVtb3ZlKCknPlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0ZW1wICs9IFwiPC9kaXY+PC9kaXY+XCI7XHJcblxyXG4gICAgICAgIGNyZWF0ZV9tc2dib3goNDAwLCAyMDAsIHRlbXApO1xyXG5cclxuICAgICAgICBpZiAoZm9jdXMgPT0gMCB8fCBmb2N1cyA9PSBcIjBcIiB8fCBudWxsID09IGZvY3VzKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibXNnY29uZmlybWJcIikuZm9jdXMoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGZvY3VzID09IDEgfHwgZm9jdXMgPT0gXCIxXCIpIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtc2djYW5jZWxiXCIpLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldF93aWR0aCgpIHtcclxuICAgICAgICByZXR1cm4gKGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldF9oZWlnaHQoKSB7ICAgICBcclxuICAgICAgICByZXR1cm4gKGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldF9sZWZ0KHcpIHtcclxuICAgICAgICB2YXIgYncgPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO1xyXG4gICAgICAgIHZhciBiaCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgIHcgPSBwYXJzZUZsb2F0KHcpO1xyXG4gICAgICAgIHJldHVybiAoYncgLyAyIC0gdyAvIDIgKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldF90b3AoaCkge1xyXG4gICAgICAgIHZhciBidyA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgdmFyIGJoID0gZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgaCA9IHBhcnNlRmxvYXQoaCk7XHJcbiAgICAgICAgcmV0dXJuIChiaCAvIDIgLSBoIC8gMiArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlX21hc2soKSB7IFxyXG4gICAgICAgIHZhciBtYXNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBtYXNrLmlkID0gXCJtYXNrXCI7XHJcbiAgICAgICAgbWFzay5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuICAgICAgICBtYXNrLnN0eWxlLmZpbHRlciA9IFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKHN0eWxlPTQsb3BhY2l0eT0yNSlcIjsgXHJcbiAgICAgICAgbWFzay5zdHlsZS5vcGFjaXR5ID0gXCIwLjRcIjsgXHJcbiAgICAgICAgbWFzay5zdHlsZS5iYWNrZ3JvdW5kID0gXCJibGFja1wiO1xyXG4gICAgICAgIG1hc2suc3R5bGUudG9wID0gXCIwcHhcIjtcclxuICAgICAgICBtYXNrLnN0eWxlLmxlZnQgPSBcIjBweFwiOyAgICAgIFxyXG4gICAgICAgIG1hc2suc3R5bGUud2lkdGggPSBnZXRfd2lkdGgoKSArIFwicHhcIjsgICAgICAgXHJcbiAgICAgICAgbWFzay5zdHlsZS5oZWlnaHQgPSBnZXRfaGVpZ2h0KCkgKyBcInB4XCI7XHJcbiAgICAgICAgbWFzay5zdHlsZS56SW5kZXggPSBcIjEwMDAwMDAwMDBcIjtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1hc2spO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNyZWF0ZV9tc2dib3godywgaCwgdCkgeyBcclxuICAgICAgICB2YXIgYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBib3guaWQgPSBcIm1zZ2JveFwiO1xyXG4gICAgICAgIGJveC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuICAgICAgICBib3guc3R5bGUud2lkdGggPSB3ICsgXCJweFwiO1xyXG4gICAgICAgIGJveC5zdHlsZS5oZWlnaHQgPSBoICsgXCJweFwiO1xyXG4gICAgICAgIGJveC5zdHlsZS5vdmVyZmxvdyA9IFwidmlzaWJsZVwiO1xyXG4gICAgICAgIGJveC5pbm5lckhUTUwgPSB0O1xyXG4gICAgICAgIGJveC5zdHlsZS56SW5kZXggPSBcIjEwMDAwMDAwMDFcIjtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJveCk7XHJcbiAgICAgICAgcmVfcG9zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVfbWFzaygpIHtcclxuICAgICAgICB2YXIgbWFzayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWFza1wiKTtcclxuICAgICAgICBpZiAobnVsbCA9PSBtYXNrKSByZXR1cm47XHJcbiAgICAgICAgbWFzay5zdHlsZS53aWR0aCA9IGdldF93aWR0aCgpICsgXCJweFwiO1xyXG4gICAgICAgIG1hc2suc3R5bGUuaGVpZ2h0ID0gZ2V0X2hlaWdodCgpICsgXCJweFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlX3BvcygpIHtcclxuICAgICAgICB2YXIgYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtc2dib3hcIik7XHJcbiAgICAgICAgaWYgKG51bGwgIT0gYm94KSB7XHJcbiAgICAgICAgICAgIHZhciB3ID0gYm94LnN0eWxlLndpZHRoO1xyXG4gICAgICAgICAgICB2YXIgaCA9IGJveC5zdHlsZS5oZWlnaHQ7XHJcbiAgICAgICAgICAgIGJveC5zdHlsZS5sZWZ0ID0gZ2V0X2xlZnQodykgKyBcInB4XCI7XHJcbiAgICAgICAgICAgIGJveC5zdHlsZS50b3AgPSBnZXRfdG9wKGgpICsgXCJweFwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVtb3ZlKCkge1xyXG4gICAgICAgIHZhciBtYXNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYXNrXCIpO1xyXG4gICAgICAgIHZhciBtc2dib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1zZ2JveFwiKTtcclxuICAgICAgICBpZiAobnVsbCA9PSBtYXNrICYmIG51bGwgPT0gbXNnYm94KSByZXR1cm47XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChtYXNrKTtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG1zZ2JveCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVfc2hvdygpIHtcclxuICAgICAgICByZV9wb3MoKTtcclxuICAgICAgICByZV9tYXNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbG9hZF9mdW5jKCkge1xyXG4gICAgICAgIHdpbmRvdy5vbnJlc2l6ZSA9IHJlX3Nob3c7XHJcbiAgICAgICAgd2luZG93Lm9uc2Nyb2xsID0gcmVfc2hvdztcclxuICAgIH1cdFxyXG59IiwiLypcclxucmVhZCBhIG9iamVjdCBmcm9tIGppYW5nc3UgcHJvdmluY2UgLCBzdWNoIGFzIG5hbmppbmcgd2l0aCBzb21lIGluZm9ybWF0aW9uXHJcbuivu+WPluaxn+iLj+eahOafkOS4quWcsOWMuueahOS/oeaBr++8jOS7peWPiuezu+e7n+S/oeaBr1xyXG4gKi9cclxubW9kdWxlIEt1YmVybmV0ZXN7XHJcblx0ZXhwb3J0IHZhciBzeXN0ZW1fYXJyID0gW3tcInN5c19uYW1lXCI6XCLpg6jpl6jpooTnrpdcIixcInN5c19pZFwiOlwiMVwifSx7XCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl5pS257y0566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjJcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfaWRcIjpcIjNcIn0se1wic3lzX25hbWVcIjpcIui1hOS6p+euoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCI0XCJ9LHtcInN5c19uYW1lXCI6XCLnlKjlj4votKLmlL/nu7zlkIjnrqHnkIbkv6Hmga/ns7vnu59cIixcInN5c19pZFwiOlwiNVwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLnlKjlj4tBKytcIixcInN5c19pZFwiOlwiNlwifSx7XCJzeXNfbmFtZVwiOlwi5rWm5Y+j6LSi5pS/5LiA5L2T5YyWXCIsXCJzeXNfaWRcIjpcIjdcIn0se1wic3lzX25hbWVcIjpcIuaglumcnuWMuui0ouaUv+S4muWKoeS/oeaBr+euoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCI4XCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIuS4gOS9k+WMluezu+e7n1wiLFwic3lzX2lkXCI6XCI5XCJ9LHtcInN5c19uYW1lXCI6XCLotKLmlL/nrqHnkIbkuIDkvZPljJbns7vnu59cIixcInN5c19pZFwiOlwiMTBcIn0se1wic3lzX25hbWVcIjpcIua7qOaxn+W8gOWPkeWMuui0ouaUv+WIhuWxgFwiLFwic3lzX2lkXCI6XCIxMVwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLmsZ/lroHnu4/mtY7mioDmnK/lvIDlj5HljLrotKLmlL/liIblsYBcIixcInN5c19pZFwiOlwiMTJcIn0se1wic3lzX25hbWVcIjpcIuaxn+WugeenkeWtpuWbrei0ouaUv+WIhuWxgFwiLFwic3lzX2lkXCI6XCIxM1wifSx7XCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW57O757ufXCIsXCJzeXNfaWRcIjpcIjE0XCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIkErK+i0ouaUv+S4gOS9k+WMluW5s+WPsFwiLFwic3lzX2lkXCI6XCIxNVwifSx7XCJzeXNfbmFtZVwiOlwi6Z2e56iO57O757ufXCIsXCJzeXNfaWRcIjpcIjE2XCJ9LHtcInN5c19uYW1lXCI6XCLkuIDkvZPljJbpooTnrpfmiafooYzns7vnu59cIixcInN5c19pZFwiOlwiMTdcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi5LiA5L2T5YyWXCIsXCJzeXNfaWRcIjpcIjE4XCJ9LHtcInN5c19uYW1lXCI6XCLlm73lupPpm4bkuK3mlK/ku5jnrqHnkIbkv6Hmga/ns7vnu59cIixcInN5c19pZFwiOlwiMTlcIn0se1wic3lzX25hbWVcIjpcIuWbveW6k+mbhuS4reaUr+S7mFwiLFwic3lzX2lkXCI6XCIyMFwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLotKLmlL/kuJPmiLfmoLjnrpflj4rpnZ7nqI7ns7vnu59cIixcInN5c19pZFwiOlwiMjFcIn0se1wic3lzX25hbWVcIjpcIumbhuS4reaUr+S7mOezu+e7n1wiLFwic3lzX2lkXCI6XCIyMlwifSx7XCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiT5oi35qC4566X57O757ufXCIsXCJzeXNfaWRcIjpcIjIzXCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIumdnueojuaUtue8tOezu+e7n1wiLFwic3lzX2lkXCI6XCIyNFwifSx7XCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW5bmz5Y+wXCIsXCJzeXNfaWRcIjpcIjI1XCJ9LHtcInN5c19uYW1lXCI6XCLlr4zmt7HpooTnrpfmiafooYxcIixcInN5c19pZFwiOlwiMjZcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi55So5Y+L6Z2e56iO5Y+K56Wo5o2uXCIsXCJzeXNfaWRcIjpcIjI3XCJ9LHtcInN5c19uYW1lXCI6XCLnlKjlj4vpooTnrpfmiafooYxcIixcInN5c19pZFwiOlwiMjhcIn0se1wic3lzX25hbWVcIjpcIuaxn+iLj+ecgei0ouaUv+mihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2lkXCI6XCIyOVwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLnlKjlj4vpgJrnlKjova/ku7ZcIixcInN5c19pZFwiOlwiMzBcIn0se1wic3lzX25hbWVcIjpcIuiBlOWPi+i9r+S7ti/pgJrnlKjotKLliqFcIixcInN5c19pZFwiOlwiMzFcIn0se1wic3lzX25hbWVcIjpcIueUqOWPi0dSUEctVThSMTDotKLmlL/nrqHnkIbova/ku7ZcIixcInN5c19pZFwiOlwiMzJcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi55So5Y+LR1BQLVIxMOi0ouaUv+euoeeQhui9r+S7tlwiLFwic3lzX2lkXCI6XCIzM1wifSx7XCJzeXNfbmFtZVwiOlwi5a+M5rex5Y2P6YCa6LSi5pS/5LiA5L2T5YyW566h55CG5L+h5oGv57O757ufXCIsXCJzeXNfaWRcIjpcIjM0XCJ9LHtcInN5c19uYW1lXCI6XCLotKLliqHnu5/kuIDmoLjnrpfns7vnu59cIixcInN5c19pZFwiOlwiMzVcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi5YWs5YWx6LSi5pS/566h55CG6L2v5Lu2XCIsXCJzeXNfaWRcIjpcIjM2XCJ9LHtcInN5c19uYW1lXCI6XCJBKyvotKLmlL/kuIDkvZPljJbkv6Hmga/lubPlj7BcIixcInN5c19pZFwiOlwiMzdcIn0se1wic3lzX25hbWVcIjpcIuaWsOS4reWkp+WFrOWFsei0ouWKoeeuoeeQhui9r+S7tlwiLFwic3lzX2lkXCI6XCIzOFwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLlr4zmt7HotKLmlL/kuIDkvZPljJbnrqHnkIbns7vnu59cIixcInN5c19pZFwiOlwiMzlcIn0se1wic3lzX25hbWVcIjpcIuaWsOS4reWkp+WFrOWFsei0ouaUv+euoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCI0MFwifSx7XCJzeXNfbmFtZVwiOlwi5a+M5rex5Y2P6YCa6LSi5pS/5LiA5L2T5YyW5Lia5Yqh566h55CG57O757uf6L2v5Lu2XCIsXCJzeXNfaWRcIjpcIjQxXCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIuaWsOS4reWkp+WFrOWFsei0ouaUv+euoeeQhui9r+S7tkdzb2Z0XCIsXCJzeXNfaWRcIjpcIjQyXCJ9LHtcInN5c19uYW1lXCI6XCLotKLmlL/kuIDkvZPljJbkuJrliqHns7vnu59cIixcInN5c19pZFwiOlwiNDNcIn0se1wic3lzX25hbWVcIjpcIui0ouaUv+S4gOS9k+WMlui9r+S7tlwiLFwic3lzX2lkXCI6XCI0NFwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLblhaXns7vnu59cIixcInN5c19pZFwiOlwiNDVcIn0se1wic3lzX25hbWVcIjpcIuaAu+mihOeul+ezu+e7n1wiLFwic3lzX2lkXCI6XCI0NlwifSx7XCJzeXNfbmFtZVwiOlwi5Zu95bqT6ZuG5Lit5pSv5LuY57O757ufXCIsXCJzeXNfaWRcIjpcIjQ3XCJ9LHtcInN5c19uYW1lXCI6XCLnlKjmrL7orqHliJLns7vnu59cIixcInN5c19pZFwiOlwiNDhcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi5oyH5qCH566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjQ5XCJ9LHtcInN5c19uYW1lXCI6XCLotKLmlL/nu7zlkIjkuJrliqHnrqHnkIblubPlj7BcIixcInN5c19pZFwiOlwiNTBcIn0se1wic3lzX25hbWVcIjpcIui0ouaUv+S4gOS9k+WMlueuoeeQhuS/oeaBr+ezu+e7n1wiLFwic3lzX2lkXCI6XCI1MVwifSx7XCJzeXNfbmFtZVwiOlwi5bel6LWE57uf5Y+RXCIsXCJzeXNfaWRcIjpcIjUyXCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIuWbveaciei1hOS6p1wiLFwic3lzX2lkXCI6XCI1M1wifSx7XCJzeXNfbmFtZVwiOlwi5Lmh6ZWH6Z2e56iO5pS25YWlXCIsXCJzeXNfaWRcIjpcIjU0XCJ9LHtcInN5c19uYW1lXCI6XCLkuaHplYfpm4bkuK3mlK/ku5hcIixcInN5c19pZFwiOlwiNTVcIn0se1wic3lzX25hbWVcIjpcIumdnueojuW+gee8tOezu+e7n1wiLFwic3lzX2lkXCI6XCI1NlwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLpooTnrpfnvJbliLbkuI7miafooYzns7vnu59cIixcInN5c19pZFwiOlwiNTdcIn0se1wic3lzX25hbWVcIjpcIumihOeul+euoeeQhue7vOWQiOS4muWKoeW5s+WPsFwiLFwic3lzX2lkXCI6XCI1OFwifSx7XCJzeXNfbmFtZVwiOlwidTjnrqHnkIbova/ku7ZcIixcInN5c19pZFwiOlwiNTlcIn0se1wic3lzX25hbWVcIjpcIui0ouaUv+aMh+agh+euoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCI2MFwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLnlKjlj4tHUlAtUjnotKLliqHnrqHnkIbova/ku7ZcIixcInN5c19pZFwiOlwiNjFcIn0se1wic3lzX25hbWVcIjpcIueUqOWPi0dSUC1VOOi0ouaUv+euoeeQhui9r+S7tlwiLFwic3lzX2lkXCI6XCI2MlwifSx7XCJzeXNfbmFtZVwiOlwi6LSm5Yqh5aSE55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjYzXCJ9LHtcInN5c19uYW1lXCI6XCJSOWnotKLmlL/nrqHnkIbova/ku7ZcIixcInN5c19pZFwiOlwiNjRcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwidTjotKLmlL/nrqHnkIbova/ku7ZcIixcInN5c19pZFwiOlwiNjVcIn0se1wic3lzX25hbWVcIjpcIuebuOWfjuWMuui0ouaUv+e7vOWQiOeuoeeQhuS/oeaBr+ezu+e7n1wiLFwic3lzX2lkXCI6XCI2NlwifSx7XCJzeXNfbmFtZVwiOlwi6LSi5pS/6Z2e56iO57u85ZCI566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjY3XCJ9LHtcInN5c19uYW1lXCI6XCLotKLmlL/nu7zlkIjnrqHnkIblubPlj7BcIixcInN5c19pZFwiOlwiNjhcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi5ZC05rGf5Yy66LSi5pS/5LiA5L2T5YyWXCIsXCJzeXNfaWRcIjpcIjY5XCJ9LHtcInN5c19uYW1lXCI6XCLnlKjlj4tSOVwiLFwic3lzX2lkXCI6XCI3MFwifSx7XCJzeXNfbmFtZVwiOlwi6LSi5pS/5YWs5YWx5bqU55So5pyN5Yqh5bmz5Y+wXCIsXCJzeXNfaWRcIjpcIjcxXCJ9LHtcInN5c19uYW1lXCI6XCLph5HonbZLLzPliJvmlrDnrqHnkIblubPlj7BcIixcInN5c19pZFwiOlwiNzJcIn0se1wic3lzX25hbWVcIjpcIui0puWKoeaVsOaNruezu+e7n1wiLFwic3lzX2lkXCI6XCI3M1wifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLlhazlhbHotKLmlL/mnI3liqHlubPlj7BcIixcInN5c19pZFwiOlwiNzRcIn0se1wic3lzX25hbWVcIjpcIuS8muiuoeaguOeul+ezu+e7n1wiLFwic3lzX2lkXCI6XCI3NVwifSx7XCJzeXNfbmFtZVwiOlwi6aG555uu5bqTXCIsXCJzeXNfaWRcIjpcIjc2XCJ9LHtcInN5c19uYW1lXCI6XCLotKLmlL/mgLvpooTnrpfvvIjlpJbvvInkuJPmiLfnrqHnkIbns7vnu59cIixcInN5c19pZFwiOlwiNzdcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi5Z+O5bu66LWE6YeR5LiT5oi3566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjc4XCJ9LHtcInN5c19uYW1lXCI6XCLlhpzkv53kuJPmiLfnrqHnkIbns7vnu59cIixcInN5c19pZFwiOlwiNzlcIn0se1wic3lzX25hbWVcIjpcIuWGnOS4muWPkeWxleWfuumHkeS4k+aIt+euoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCI4MFwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLlpLHlnLDlhpzmsJHkv53pmpzotYTph5HkuJPmiLdcIixcInN5c19pZFwiOlwiODFcIn0se1wic3lzX25hbWVcIjpcIumdnueojuaUtuWFpeW+geeuoeezu+e7n1wiLFwic3lzX2lkXCI6XCI4MlwifSx7XCJzeXNfbmFtZVwiOlwi5bel6LWE57uf5Y+R5Lq65ZGY5L+h5oGvXCIsXCJzeXNfaWRcIjpcIjgzXCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIumihOeul+aMh+aghy3lm73lupPpm4bkuK3mlK/ku5jns7vnu59cIixcInN5c19pZFwiOlwiODRcIn0se1wic3lzX25hbWVcIjpcIuaAu+mihOeul+S8muiuoeaguOeul+ezu+e7n1wiLFwic3lzX2lkXCI6XCI4NVwifSx7XCJzeXNfbmFtZVwiOlwi6YOo6Zeo6aKE566X57yW5a6h57O757ufXCIsXCJzeXNfaWRcIjpcIjg2XCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIuWFrOWKoea2iOi0ueeuoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCI4N1wifSx7XCJzeXNfbmFtZVwiOlwi5Zu95pyJ6LWE5Lqn566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjg4XCJ9LHtcInN5c19uYW1lXCI6XCLljLrplYfotKLmlL/nrqHnkIbigJzkuIDkvZPljJbigJ3ns7vnu59cIixcInN5c19pZFwiOlwiODlcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi5Y6/5pys57qn6LSi5pS/566h55CG4oCc5LiA5L2T5YyW4oCd57O757ufXCIsXCJzeXNfaWRcIjpcIjkwXCJ9LHtcInN5c19uYW1lXCI6XCLnlKjlj4vmlL/liqFcIixcInN5c19pZFwiOlwiOTFcIn0se1wic3lzX25hbWVcIjpcIui0ouaUv+S4k+aIt+aguOeul++8iOihjOaUv+WPo+S4k+mhuei1hOmHke+8iVwiLFwic3lzX2lkXCI6XCI5MlwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLotKLmlL/kuJPmiLfmoLjnrpfvvIjnu4/lu7rlj6PkuJPpobnotYTph5HvvIlcIixcInN5c19pZFwiOlwiOTNcIn0se1wic3lzX25hbWVcIjpcIui0ouaUv+S4k+aIt+aguOeul++8iOWGnOS4muS/nemZqeS4k+i0pu+8iVwiLFwic3lzX2lkXCI6XCI5NFwifSx7XCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiT5oi35qC4566X77yI5Yac5Lia57u85ZCI5byA5Y+R5LiT6LSm77yJXCIsXCJzeXNfaWRcIjpcIjk1XCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIui0ouaUv+S4k+aIt+aguOeul++8iOekvuS/nei1hOmHkeS4k+i0pu+8iVwiLFwic3lzX2lkXCI6XCI5NlwifSx7XCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiT5oi35qC4566X77yI5Zyf5Zyw5Ye66K6p5LiT6LSm77yJXCIsXCJzeXNfaWRcIjpcIjk3XCJ9LHtcInN5c19uYW1lXCI6XCLotKLmlL/kuJPmiLfmoLjnrpfvvIjnu7zlkIjlj6PkuJPpobnotYTph5HvvIlcIixcInN5c19pZFwiOlwiOThcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjk5XCJ9LHtcInN5c19uYW1lXCI6XCLlhpzkuJrkuJPlkJHlj4rlhpzkuJrlj5HlsZXln7rph5HkuJPpoblcIixcInN5c19pZFwiOlwiMTAwXCJ9LHtcInN5c19uYW1lXCI6XCLmgLvpooTnrpfkvJrorqHmoLjnrpdcIixcInN5c19pZFwiOlwiMTAxXCJ9LHtcInN5c19uYW1lXCI6XCLph5HotKLlt6XnqIvkuIDkvZPljJbmlK/mkpHlubPlj7BcIixcInN5c19pZFwiOlwiMTAyXCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIumdnueojuaUtue8tFwiLFwic3lzX2lkXCI6XCIxMDNcIn0se1wic3lzX25hbWVcIjpcIuWtpuagoemihOeul+aJp+ihjFwiLFwic3lzX2lkXCI6XCIxMDRcIn0se1wic3lzX25hbWVcIjpcIumihOeul+aJp+ihjFwiLFwic3lzX2lkXCI6XCIxMDVcIn0se1wic3lzX25hbWVcIjpcIuS4k+mhuei1hOmHkVwiLFwic3lzX2lkXCI6XCIxMDZcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi5oC76aKE566XXCIsXCJzeXNfaWRcIjpcIjEwN1wifSx7XCJzeXNfbmFtZVwiOlwi6YOo6Zeo6aKE566X57O757ufXCIsXCJzeXNfaWRcIjpcIjEwOFwifSx7XCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiT5oi35qC4566XXCIsXCJzeXNfaWRcIjpcIjEwOVwifSx7XCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiT5oi36LSm5Yqh57O757ufXCIsXCJzeXNfaWRcIjpcIjExMFwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLlr4zmt7HotKLmlL/kuIDkvZPljJbkuJrliqHnrqHnkIbns7vnu59cIixcInN5c19pZFwiOlwiMTExXCJ9LHtcInN5c19uYW1lXCI6XCLlm73mnInotYTkuqfns7vnu59cIixcInN5c19pZFwiOlwiMTEyXCJ9LHtcInN5c19uYW1lXCI6XCLlm73lupPkuJPpobnotYTph5HnrqHnkIbns7vnu59cIixcInN5c19pZFwiOlwiMTEzXCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIumdnueojuaUtue8tOeuoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCIxMTRcIn0se1wic3lzX25hbWVcIjpcIui0ouaUv+euoeeQhuezu+e7n++8iOaWsOWGnOS/ne+8iVwiLFwic3lzX2lkXCI6XCIxMTVcIn0se1wic3lzX25hbWVcIjpcIui0ouaUv+euoeeQhuezu+e7n++8iOWfjuW4guWxheawkeWMu+eWl+e7n+etue+8iVwiLFwic3lzX2lkXCI6XCIxMTZcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi6LSi5pS/566h55CG57O757uf77yI6ZuG5Lit5pSv5LuY5Lit5b+D77yJXCIsXCJzeXNfaWRcIjpcIjExN1wifSx7XCJzeXNfbmFtZVwiOlwi6LSi5pS/566h55CG57O757uf77yI6Kej5Zuw6YeR77yJXCIsXCJzeXNfaWRcIjpcIjExOFwifSx7XCJzeXNfbmFtZVwiOlwi6LSi5pS/566h55CG57O757uf77yI5pen5Z+O5pS56YCg77yJXCIsXCJzeXNfaWRcIjpcIjExOVwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLotKLmlL/nrqHnkIbns7vnu5/vvIjnpL7kv53otYTph5HotKbmiLfvvIlcIixcInN5c19pZFwiOlwiMTIwXCJ9LHtcInN5c19uYW1lXCI6XCLotKLmlL/nrqHnkIbns7vnu5/vvIjlnJ/lnLDlh7rorqnkuJPluJDvvIlcIixcInN5c19pZFwiOlwiMTIxXCJ9LHtcInN5c19uYW1lXCI6XCLotKLmlL/nrqHnkIbns7vnu5/vvIjpooTmi6jlj4rpnZ7pm4bkuK3mlK/ku5jkuK3lv4PvvIlcIixcInN5c19pZFwiOlwiMTIyXCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIui0ouaUv+euoeeQhuezu+e7n++8iOmihOeul+Wklui1hOmHke+8iVwiLFwic3lzX2lkXCI6XCIxMjNcIn0se1wic3lzX25hbWVcIjpcIuaAu+mihOeul+S8muiuoVwiLFwic3lzX2lkXCI6XCIxMjRcIn0se1wic3lzX25hbWVcIjpcIui0ouWKoeaguOeul+ezu+e7n1wiLFwic3lzX2lkXCI6XCIxMjVcIn0se1wic3lzX25hbWVcIjpcIuW3pei1hOe7n+WPkeezu+e7n1wiLFwic3lzX2lkXCI6XCIxMjZcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi6aKE566X57yW5a6h57O757ufXCIsXCJzeXNfaWRcIjpcIjEyN1wifSx7XCJzeXNfbmFtZVwiOlwi6aKE566X566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjEyOFwifSx7XCJzeXNfbmFtZVwiOlwi6aKE566X5aSW6LWE6YeR77yI5LuO6IGU572R5a6h6K6h5Lit5Y+W5pWw77yJXCIsXCJzeXNfaWRcIjpcIjEyOVwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCJHNi1F6LSi5Yqh566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjEzMFwifSx7XCJzeXNfbmFtZVwiOlwi5paw5Lit5aSn5YWs5YWx6LSi5pS/566h55CG6L2v5Lu2XCIsXCJzeXNfaWRcIjpcIjEzMVwifSx7XCJzeXNfbmFtZVwiOlwi55So5Y+LR1JQL1I56LSi5pS/566h55CG6L2v5Lu2XCIsXCJzeXNfaWRcIjpcIjEzMlwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLnlKjlj4tHUlAtVThSMTBcIixcInN5c19pZFwiOlwiMTMzXCJ9LHtcInN5c19uYW1lXCI6XCLotKLmlL/kuIDkvZPljJbnrqHnkIbns7vnu5/vvIjln7rlu7rmiLfvvIlcIixcInN5c19pZFwiOlwiMTM0XCJ9LHtcInN5c19uYW1lXCI6XCLotKLmlL/kuIDkvZPljJbnrqHnkIbns7vnu5/vvIjpm4bkuK3mlK/ku5jkuK3lv4PvvIlcIixcInN5c19pZFwiOlwiMTM1XCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIui0ouaUv+S4gOS9k+WMlueuoeeQhuezu+e7n++8iOWGnOS4mue7vOWQiOW8gOWPke+8iVwiLFwic3lzX2lkXCI6XCIxMzZcIn0se1wic3lzX25hbWVcIjpcIui0ouaUv+S4gOS9k+WMlueuoeeQhuezu+e7n++8iOmihOeul+Wklui1hOmHke+8iVwiLFwic3lzX2lkXCI6XCIxMzdcIn0se1wic3lzX25hbWVcIjpcIui0ouaUv+S4gOS9k+WMlueuoeeQhuezu+e7n++8iOaUr+WGnOS4k+aIt++8iVwiLFwic3lzX2lkXCI6XCIxMzhcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW566h55CG57O757uf77yI5oC76aKE566X77yJXCIsXCJzeXNfaWRcIjpcIjEzOVwifSx7XCJzeXNfbmFtZVwiOlwi5Zu96LWE566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjE0MFwifSx7XCJzeXNfbmFtZVwiOlwi5Lmh6LSi5Y6/566h57O757ufXCIsXCJzeXNfaWRcIjpcIjE0MVwifSx7XCJzeXNfbmFtZVwiOlwi6aKE566X57yW5Yi2566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjE0MlwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5biC5pys57qnX+mDqOmXqOmihOeul1wiLFwic3lzX2lkXCI6XCIxNDNcIn0se1wic3lzX25hbWVcIjpcIuebkOWfjuW4gl/luILmnKznuqdf6Z2e56iO5pS2566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjE0NFwifSx7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+W4guacrOe6p1/pooTnrpfmiafooYzns7vnu59cIixcInN5c19pZFwiOlwiMTQ1XCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIuebkOWfjuW4gl/kuq3muZbljLpf6LSi5pS/5LiT5oi3XCIsXCJzeXNfaWRcIjpcIjE0NlwifSx7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+S6rea5luWMul/pnZ7nqI7mlLblhaXnrqHnkIZcIixcInN5c19pZFwiOlwiMTQ3XCJ9LHtcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5Lqt5rmW5Yy6X+WbveW6k+mbhuS4reaUr+S7mOeuoeeQhlwiLFwic3lzX2lkXCI6XCIxNDhcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+S6rea5luWMul/pooTnrpfmjIfmoIfnrqHnkIZcIixcInN5c19pZFwiOlwiMTQ5XCJ9LHtcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5Lqt5rmW5Yy6X+aAu+mihOeul+S8muiuoeaguOeul1wiLFwic3lzX2lkXCI6XCIxNTBcIn0se1wic3lzX25hbWVcIjpcIuebkOWfjuW4gl/nm5Dpg73ljLpf6LSi5pS/5LiT5oi35qC4566X57O757ufXCIsXCJzeXNfaWRcIjpcIjE1MVwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLnm5Dln47luIJf55uQ6YO95Yy6X+mdnueojuaUtuWFpeeuoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCIxNTJcIn0se1wic3lzX25hbWVcIjpcIuebkOWfjuW4gl/nm5Dpg73ljLpf5Zu95bqT6ZuG5Lit5pSv5LuY57O757ufXCIsXCJzeXNfaWRcIjpcIjE1M1wifSx7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+ebkOmDveWMul/mgLvpooTnrpfkvJrorqHmoLjnrpfns7vnu59cIixcInN5c19pZFwiOlwiMTU0XCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIuebkOWfjuW4gl/lk43msLTljr9f6YOo6Zeo6aKE566X566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjE1NVwifSx7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+WTjeawtOWOv1/otKLmlL/kuIDkvZPljJbkv6Hmga/ns7vnu59cIixcInN5c19pZFwiOlwiMTU2XCJ9LHtcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5ZON5rC05Y6/X+mdnueojuaUtuWFpeaUtue8tOeuoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCIxNTdcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+a7qOa1t+WOv+i0ouaUv+S4gOS9k+WMllwiLFwic3lzX2lkXCI6XCIxNThcIn0se1wic3lzX25hbWVcIjpcIuebkOWfjuW4gl/pmJzlroHljr9f6LSi5pS/566h55CG6L2v5Lu2XCIsXCJzeXNfaWRcIjpcIjE1OVwifSx7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+mYnOWugeWOv1/otKLmlL/nrqHnkIbova/ku7bnlKjlj4tVOFwiLFwic3lzX2lkXCI6XCIxNjBcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+WwhOmYs+WOv1/otKLmlL/pooTnrpfmiafooYzkuIDkvZPljJbns7vnu59cIixcInN5c19pZFwiOlwiMTYxXCJ9LHtcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5bu65rmW5Y6/X+mdnueojuaUtue8tFwiLFwic3lzX2lkXCI6XCIxNjJcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+W7uua5luWOv1/otKLmlL/kuIDkvZPljJZcIixcInN5c19pZFwiOlwiMTYzXCJ9LHtcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5bu65rmW5Y6/X+WbveW6k+mbhuS4reaUr+S7mFwiLFwic3lzX2lkXCI6XCIxNjRcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+S4nOWPsOW4gl/pg6jpl6jpooTnrpfnvJblrqHns7vnu59cIixcInN5c19pZFwiOlwiMTY1XCJ9LHtcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5Lic5Y+w5biCX+i0ouaUv+S4gOS9k+WMluS/oeaBr+ezu+e7n1wiLFwic3lzX2lkXCI6XCIxNjZcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+S4nOWPsOW4gl/otKLmlL/kuJPmiLfmoLjnrpfns7vnu59cIixcInN5c19pZFwiOlwiMTY3XCJ9LHtcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5Lic5Y+w5biCX+mdnueojuaUtuWFpeaUtue8tOeuoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCIxNjhcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+S4nOWPsOW4gl/mgLvpooTnrpfkvJrorqHmoLjnrpfns7vnu59cIixcInN5c19pZFwiOlwiMTY5XCJ9LHtcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5aSn5Liw5Yy6X+mDqOmXqOmihOeul+ezu+e7n1wiLFwic3lzX2lkXCI6XCIxNzBcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+Wkp+S4sOWMul/otKLmlL/kuIDkvZPljJZcIixcInN5c19pZFwiOlwiMTcxXCJ9LHtcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5aSn5Liw5Yy6X+aAu+mihOeul+S8muiuoeaguOeul+i0ouWKoei9r+S7tlwiLFwic3lzX2lkXCI6XCIxNzJcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+e7j+a1juaKgOacr+W8gOWPkeWMul/pg6jpl6jpooTnrpfova/ku7ZcIixcInN5c19pZFwiOlwiMTczXCJ9LHtcInN5c19uYW1lXCI6XCLnm5Dln47luIJf57uP5rWO5oqA5pyv5byA5Y+R5Yy6X+WbveW6k+mbhuS4reaUr+S7mFwiLFwic3lzX2lkXCI6XCIxNzRcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi6ICB6Z2e56iO5pS25YWl5b6B57y057O757ufXCIsXCJzeXNfaWRcIjpcIjE3NVwifSx7XCJzeXNfbmFtZVwiOlwi5oms5bee6LSi5pS/5LiA5L2T5YyW5L+h5oGv566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjE3NlwifSx7XCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl5b6B5pS2XCIsXCJzeXNfaWRcIjpcIjE3N1wifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLpg6jpl6jpooTnrpfnvJbliLZcIixcInN5c19pZFwiOlwiMTc4XCJ9LHtcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLblhaXmlLbnvLRcIixcInN5c19pZFwiOlwiMTc5XCJ9LHtcInN5c19uYW1lXCI6XCLooYzmlL/kuovkuJrmgKfljZXkvY3lm73mnInotYTkuqfnrqHnkIZcIixcInN5c19pZFwiOlwiMTgwXCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIui0ouaUv+S4muWKoeezu+e7n1wiLFwic3lzX2lkXCI6XCIxODFcIn0se1wic3lzX25hbWVcIjpcIui0ouaUv+S4muWKoee7vOWQiOezu+e7n1wiLFwic3lzX2lkXCI6XCIxODJcIn0se1wic3lzX25hbWVcIjpcIuaxn+mDveW8gOWPkeWMuumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2lkXCI6XCIxODNcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyWXCIsXCJzeXNfaWRcIjpcIjE4NFwifSx7XCJzeXNfbmFtZVwiOlwi5a+M5rex5Y2P6YCa6LSi5pS/5LiA5L2T5YyW5Lia5Yqh566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjE4NVwifSx7XCJzeXNfbmFtZVwiOlwi5a+M5rex5Y2P6YCa6Z2e56iO5pS257y057O757ufXCIsXCJzeXNfaWRcIjpcIjE4NlwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLlr4zmt7HljY/pgJrlt6XotYTnu5/lj5Hns7vnu59cIixcInN5c19pZFwiOlwiMTg3XCJ9LHtcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLblhaVcIixcInN5c19pZFwiOlwiMTg4XCJ9LHtcInN5c19uYW1lXCI6XCLotKLmlL/nu7zlkIjkuJrliqHns7vnu59cIixcInN5c19pZFwiOlwiMTg5XCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIuazsOW3nuW4gl/luILmnKznuqdf6YOo6Zeo6aKE566X57O757ufXCIsXCJzeXNfaWRcIjpcIjE5MFwifSx7XCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+W4guacrOe6p1/pnZ7nqI7mlLblhaXns7vnu59cIixcInN5c19pZFwiOlwiMTkxXCJ9LHtcInN5c19uYW1lXCI6XCLms7Dlt57luIJf5biC5pys57qnX+e7qeaViOeuoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCIxOTJcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+W4guacrOe6p1/pooTnrpfmiafooYzns7vnu59cIixcInN5c19pZFwiOlwiMTkzXCJ9LHtcInN5c19uYW1lXCI6XCLms7Dlt57luIJf5biC5pys57qnX+e7vOWQiOayu+eojuezu+e7n1wiLFwic3lzX2lkXCI6XCIxOTRcIn0se1wic3lzX25hbWVcIjpcIuazsOW3nuW4gl/mtbfpmbXljLpf6YOo6Zeo6aKE566X57yW5Yi257O757ufXCIsXCJzeXNfaWRcIjpcIjE5NVwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLms7Dlt57luIJf5rW36Zm15Yy6X+WOv+WMuui0ouaUv+S4gOS9k+WMllwiLFwic3lzX2lkXCI6XCIxOTZcIn0se1wic3lzX25hbWVcIjpcIuazsOW3nuW4gl/pq5jmuK/ljLpf6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfaWRcIjpcIjE5N1wifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLms7Dlt57luIJf5aec5aCw5Yy6X+mDqOmXqOmihOeul+ezu+e7n1wiLFwic3lzX2lkXCI6XCIxOThcIn0se1wic3lzX25hbWVcIjpcIuazsOW3nuW4gl/lp5zloLDljLpf6LSi5pS/5LiA5L2T5YyW57O757ufXCIsXCJzeXNfaWRcIjpcIjE5OVwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLms7Dlt57luIJf5aec5aCw5Yy6X+mdnueojuaUtue8tOezu+e7n1wiLFwic3lzX2lkXCI6XCIyMDBcIn0se1wic3lzX25hbWVcIjpcIuazsOW3nuW4gl/lp5zloLDljLpf6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfaWRcIjpcIjIwMVwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLms7Dlt57luIJf5Yy76I2v6auY5paw5Yy6X+i0ouaUv+S4gOS9k+WMluezu+e7n1wiLFwic3lzX2lkXCI6XCIyMDJcIn0se1wic3lzX25hbWVcIjpcIuazsOW3nuW4gl/lhbTljJbluIJf6YOo6Zeo6aKE566XXCIsXCJzeXNfaWRcIjpcIjIwM1wifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLms7Dlt57luIJf5YW05YyW5biCX+mdnueojuaUtue8tFwiLFwic3lzX2lkXCI6XCIyMDRcIn0se1wic3lzX25hbWVcIjpcIuazsOW3nuW4gl/lhbTljJbluIJf5Zu95bqT6ZuG5Lit5pSv5LuYXCIsXCJzeXNfaWRcIjpcIjIwNVwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLms7Dlt57luIJf6Z2W5rGf5biCX+mihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2lkXCI6XCIyMDZcIn0se1wic3lzX25hbWVcIjpcIuazsOW3nuW4gl/pnZbmsZ/luIJf6Z2e56iO5pS25YWl5pS257y0XCIsXCJzeXNfaWRcIjpcIjIwN1wifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLms7Dlt57luIJf6Z2W5rGf5biCX+mDqOmXqOmihOeul+e8luWuoeezu+e7n1wiLFwic3lzX2lkXCI6XCIyMDhcIn0se1wic3lzX25hbWVcIjpcIuazsOW3nuW4gl/ms7DlhbTluIJf6YOo6Zeo6aKE566X57O757ufXCIsXCJzeXNfaWRcIjpcIjIwOVwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLms7Dlt57luIJf5rOw5YW05biCX+mdnueojuaUtuWFpeeuoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCIyMTBcIn0se1wic3lzX25hbWVcIjpcIuazsOW3nuW4gl/ms7DlhbTluIJf6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfaWRcIjpcIjIxMVwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLpg6jpl6jpooTnrpfnrqHnkIbns7vnu59cIixcInN5c19pZFwiOlwiMjEyXCJ9LHtcInN5c19uYW1lXCI6XCLotKLmlL/kuIDkvZPljJblubPlj7Dlj4rlm73lupPpm4bkuK3mlK/ku5jns7vnu59cIixcInN5c19pZFwiOlwiMjEzXCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIuaWsOS4reWkp+mdnueojuaUtuWFpeeuoeeQhlwiLFwic3lzX2lkXCI6XCIyMTRcIn0se1wic3lzX25hbWVcIjpcIuiBlOWPi+i0ouWKoeeuoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCIyMTVcIn0se1wic3lzX25hbWVcIjpcIuWbveW6k+mbhuS4reaUr+S7mOOAgeaMh+agh+euoeeQhuezu+e7n1wiLFwic3lzX2lkXCI6XCIyMTZcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi5byA5Y+R5Yy65oC76aKE566X57O757ufXCIsXCJzeXNfaWRcIjpcIjIxN1wifSx7XCJzeXNfbmFtZVwiOlwi5Zu95bqT6LSm5Yqh57O757ufXCIsXCJzeXNfaWRcIjpcIjIxOFwifSx7XCJzeXNfbmFtZVwiOlwi5YyW5a2m5bel5Lia5Zut5Yy66Z2e56iO5pS25YWl566h55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjIxOVwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLblhaXotKblpZdcIixcInN5c19pZFwiOlwiMjIwXCJ9LHtcInN5c19uYW1lXCI6XCLljJblrablt6XkuJrlm63ljLrpooTnrpfmiafooYzns7vnu59cIixcInN5c19pZFwiOlwiMjIxXCJ9LHtcInN5c19uYW1lXCI6XCLkvJrorqHmoLjnrpdcIixcInN5c19pZFwiOlwiMjIyXCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIuaAu+mihOeul+S8muiuoei0plwiLFwic3lzX2lkXCI6XCIyMjNcIn0se1wic3lzX25hbWVcIjpcIumihOeul+WGheWkluaUtuaUr+aguOeul+ezu+e7n1wiLFwic3lzX2lkXCI6XCIyMjRcIn0se1wic3lzX25hbWVcIjpcIui0puaIt+aguOeul+ezu+e7n1wiLFwic3lzX2lkXCI6XCIyMjVcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi5oC76aKE566X5qC4566X57O757ufXCIsXCJzeXNfaWRcIjpcIjIyNlwifSx7XCJzeXNfbmFtZVwiOlwi6LSm5Yqh5aSE55CG57O757uf77yI5pS25pSv5YiG57G75pS56Z2p5Y2H57qn54mI77yJXCIsXCJzeXNfaWRcIjpcIjIyN1wifSx7XCJzeXNfbmFtZVwiOlwi6LSi5pS/6aKE566X5aSW5Lia5YqhXCIsXCJzeXNfaWRcIjpcIjIyOFwifSxcclxuXHRcdHtcInN5c19uYW1lXCI6XCLnlKjlj4tVOFIxMOi0ouaUv+S4gOS9k+WMluW5s+WPsFwiLFwic3lzX2lkXCI6XCIyMjlcIn0se1wic3lzX25hbWVcIjpcIuW8gOWPkeWMuui0ouaUv+ezu+e7n1wiLFwic3lzX2lkXCI6XCIyMzBcIn0se1wic3lzX25hbWVcIjpcIumrmOaWsOWMuuaAu+mihOeul+ezu+e7n1wiLFwic3lzX2lkXCI6XCIyMzFcIn0sXHJcblx0XHR7XCJzeXNfbmFtZVwiOlwi5byA5Y+R5Yy65YWs5YWx6LSi5pS/5pyN5Yqh5bmz5Y+wXCIsXCJzeXNfaWRcIjpcIjIzMlwifSx7XCJzeXNfbmFtZVwiOlwi55So5Y+LR1JQLVU4566h55CG6L2v5Lu2XCIsXCJzeXNfaWRcIjpcIjIzM1wifSx7XCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+WfjuWNl+aWsOWMul/lm73lupPpm4bkuK3mlK/ku5jns7vnu59cIixcInN5c19pZFwiOlwiMjM0XCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIuebkOWfjuW4gl/ln47ljZfmlrDljLpf5oC76aKE566X6LSm5Yqh5aSE55CG57O757ufXCIsXCJzeXNfaWRcIjpcIjIzNVwifSx7XCJzeXNfbmFtZVwiOlwi6LSi5pS/6aKE566X5oyH5qCH566h55CGXCIsXCJzeXNfaWRcIjpcIjIzNlwifSx7XCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+W4guacrOe6p1/ooYzmlL/nrqHnkIbns7vnu59cIixcInN5c19pZFwiOlwiMjM3XCJ9LFxyXG5cdFx0e1wic3lzX25hbWVcIjpcIuaWsOS4reWkp+i0ouWKoei9r+S7tlwiLFwic3lzX2lkXCI6XCIyMzhcIn0se1wic3lzX25hbWVcIjpcIuW8gOWPkeWMuuaWsOS4reWkp+i0ouWKoeaguOeul+ezu+e7n1wiLFwic3lzX2lkXCI6XCIyMzlcIn0se1wic3lzX25hbWVcIjpcIuW8gOWPkeWMuui0puWKoeezu+e7n1wiLFwic3lzX2lkXCI6XCIyNDBcIn1dO1xyXG5cclxuXHRleHBvcnQgdmFyIG9yaWdpbl9wbGFjZV9hcnIgPSBbe1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTAwXCIsXCJzeXNfbmFtZVwiOlwi6YOo6Zeo6aKE566XXCIsXCJzeXNfY29kZVwiOlwiQk1ZU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwMVwiLFwiY2l0eVwiOlwi5Y2X5Lqs5biCXCIsXCJjb3VudHlcIjpcIuW4guacrOe6p1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDEwMFwiLFwic3lzX25hbWVcIjpcIumdnueojuaUtuWFpeaUtue8tOeuoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDFcIixcImNpdHlcIjpcIuWNl+S6rOW4glwiLFwiY291bnR5XCI6XCLluILmnKznuqdcIixcImNvdW50eV9jb2RlXCI6XCIzMjAxMDBcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTAwXCIsXCJzeXNfbmFtZVwiOlwi6LWE5Lqn566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiWkNHTFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwMVwiLFwiY2l0eVwiOlwi5Y2X5Lqs5biCXCIsXCJjb3VudHlcIjpcIueOhOatpuWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDEwMlwiLFwic3lzX25hbWVcIjpcIumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDFcIixcImNpdHlcIjpcIuWNl+S6rOW4glwiLFwiY291bnR5XCI6XCLnp6bmt67ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAxMDRcIixcInN5c19uYW1lXCI6XCLnlKjlj4votKLmlL/nu7zlkIjnrqHnkIbkv6Hmga/ns7vnu59cIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDFcIixcImNpdHlcIjpcIuWNl+S6rOW4glwiLFwiY291bnR5XCI6XCLlu7rpgrrljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAxMDVcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi6byT5qW85Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTA2XCIsXCJzeXNfbmFtZVwiOlwi55So5Y+LQSsrXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi5rWm5Y+j5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTExXCIsXCJzeXNfbmFtZVwiOlwi5rWm5Y+j6LSi5pS/5LiA5L2T5YyWXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi5qCW6Zye5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTEzXCIsXCJzeXNfbmFtZVwiOlwi5qCW6Zye5Yy66LSi5pS/5Lia5Yqh5L+h5oGv566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi6Zuo6Iqx5Y+w5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTE0XCIsXCJzeXNfbmFtZVwiOlwi5LiA5L2T5YyW57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi5rGf5a6B5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTE1XCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/566h55CG5LiA5L2T5YyW57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi5rGf5a6B5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTE1XCIsXCJzeXNfbmFtZVwiOlwi5ruo5rGf5byA5Y+R5Yy66LSi5pS/5YiG5bGAXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi5rGf5a6B5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTE1XCIsXCJzeXNfbmFtZVwiOlwi5rGf5a6B57uP5rWO5oqA5pyv5byA5Y+R5Yy66LSi5pS/5YiG5bGAXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi5rGf5a6B5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTE1XCIsXCJzeXNfbmFtZVwiOlwi5rGf5a6B56eR5a2m5Zut6LSi5pS/5YiG5bGAXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi5YWt5ZCI5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTE2XCIsXCJzeXNfbmFtZVwiOlwi5LiA5L2T5YyW57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi6auY5rez5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTE4XCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi5rqn5rC05Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTI0XCIsXCJzeXNfbmFtZVwiOlwiQSsr6LSi5pS/5LiA5L2T5YyW5bmz5Y+wXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAyXCIsXCJjaXR5XCI6XCLml6DplKHluIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMjAwXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAyXCIsXCJjaXR5XCI6XCLml6DplKHluIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMjAwXCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl5pS257y0566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwMlwiLFwiY2l0eVwiOlwi5peg6ZSh5biCXCIsXCJjb3VudHlcIjpcIuW0h+WuieWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDIwMlwiLFwic3lzX25hbWVcIjpcIumdnueojuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDJcIixcImNpdHlcIjpcIuaXoOmUoeW4glwiLFwiY291bnR5XCI6XCLltIflronljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAyMDJcIixcInN5c19uYW1lXCI6XCLkuIDkvZPljJbpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDJcIixcImNpdHlcIjpcIuaXoOmUoeW4glwiLFwiY291bnR5XCI6XCLljZfplb/ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAyMDNcIixcInN5c19uYW1lXCI6XCLpnZ7nqI7ns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAyXCIsXCJjaXR5XCI6XCLml6DplKHluIJcIixcImNvdW50eVwiOlwi5Y2X6ZW/5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMjAzXCIsXCJzeXNfbmFtZVwiOlwi5LiA5L2T5YyWXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAyXCIsXCJjaXR5XCI6XCLml6DplKHluIJcIixcImNvdW50eVwiOlwi5YyX5aGY5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMjA0XCIsXCJzeXNfbmFtZVwiOlwi5Zu95bqT6ZuG5Lit5pSv5LuY566h55CG5L+h5oGv57O757ufXCIsXCJzeXNfY29kZVwiOlwiR0taRlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwMlwiLFwiY2l0eVwiOlwi5peg6ZSh5biCXCIsXCJjb3VudHlcIjpcIumUoeWxseWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDIwNVwiLFwic3lzX25hbWVcIjpcIuWbveW6k+mbhuS4reaUr+S7mFwiLFwic3lzX2NvZGVcIjpcIkdLWkZcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDJcIixcImNpdHlcIjpcIuaXoOmUoeW4glwiLFwiY291bnR5XCI6XCLplKHlsbHljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAyMDVcIixcInN5c19uYW1lXCI6XCLotKLmlL/kuJPmiLfmoLjnrpflj4rpnZ7nqI7ns7vnu59cIixcInN5c19jb2RlXCI6XCJaSEhTX0ZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDJcIixcImNpdHlcIjpcIuaXoOmUoeW4glwiLFwiY291bnR5XCI6XCLmg6DlsbHljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAyMDZcIixcInN5c19uYW1lXCI6XCLotKLmlL/kuIDkvZPljJbns7vnu59cIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDJcIixcImNpdHlcIjpcIuaXoOmUoeW4glwiLFwiY291bnR5XCI6XCLmu6jmuZbljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAyMTFcIixcInN5c19uYW1lXCI6XCLpm4bkuK3mlK/ku5jns7vnu59cIixcInN5c19jb2RlXCI6XCJHS1pGXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAyXCIsXCJjaXR5XCI6XCLml6DplKHluIJcIixcImNvdW50eVwiOlwi5ruo5rmW5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMjExXCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO57O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwMlwiLFwiY2l0eVwiOlwi5peg6ZSh5biCXCIsXCJjb3VudHlcIjpcIua7qOa5luWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDIxMVwiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4k+aIt+aguOeul+ezu+e7n1wiLFwic3lzX2NvZGVcIjpcIlpISFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDJcIixcImNpdHlcIjpcIuaXoOmUoeW4glwiLFwiY291bnR5XCI6XCLmlrDljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAyMTRcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAyXCIsXCJjaXR5XCI6XCLml6DplKHluIJcIixcImNvdW50eVwiOlwi5paw5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMjE0XCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS257y057O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwMlwiLFwiY2l0eVwiOlwi5peg6ZSh5biCXCIsXCJjb3VudHlcIjpcIuaWsOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDIxNFwiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4k+aIt+aguOeul+ezu+e7n1wiLFwic3lzX2NvZGVcIjpcIlpISFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDJcIixcImNpdHlcIjpcIuaXoOmUoeW4glwiLFwiY291bnR5XCI6XCLmsZ/pmLTluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjAyODFcIixcInN5c19uYW1lXCI6XCLotKLmlL/kuIDkvZPljJblubPlj7BcIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDJcIixcImNpdHlcIjpcIuaXoOmUoeW4glwiLFwiY291bnR5XCI6XCLlrpzlhbTluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjAyODJcIixcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLbnvLTns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAyXCIsXCJjaXR5XCI6XCLml6DplKHluIJcIixcImNvdW50eVwiOlwi5a6c5YW05biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMjgyXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW5bmz5Y+wXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAzXCIsXCJjaXR5XCI6XCLlvpDlt57luIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMzAwXCIsXCJzeXNfbmFtZVwiOlwi5a+M5rex6aKE566X5omn6KGMXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwM1wiLFwiY2l0eVwiOlwi5b6Q5bee5biCXCIsXCJjb3VudHlcIjpcIuW4guacrOe6p1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDMwMFwiLFwic3lzX25hbWVcIjpcIueUqOWPi+mdnueojuWPiuelqOaNrlwiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDNcIixcImNpdHlcIjpcIuW+kOW3nuW4glwiLFwiY291bnR5XCI6XCLluILmnKznuqdcIixcImNvdW50eV9jb2RlXCI6XCIzMjAzMDBcIixcInN5c19uYW1lXCI6XCLnlKjlj4vpooTnrpfmiafooYxcIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAzXCIsXCJjaXR5XCI6XCLlvpDlt57luIJcIixcImNvdW50eVwiOlwi6byT5qW85Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMzAyXCIsXCJzeXNfbmFtZVwiOlwi5rGf6IuP55yB6LSi5pS/6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwM1wiLFwiY2l0eVwiOlwi5b6Q5bee5biCXCIsXCJjb3VudHlcIjpcIum8k+alvOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDMwMlwiLFwic3lzX25hbWVcIjpcIueUqOWPi+mAmueUqOi9r+S7tlwiLFwic3lzX2NvZGVcIjpcIktKSFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDNcIixcImNpdHlcIjpcIuW+kOW3nuW4glwiLFwiY291bnR5XCI6XCLkupHpvpnljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAzMDNcIixcInN5c19uYW1lXCI6XCLmsZ/oi4/nnIHotKLmlL/pooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAzXCIsXCJjaXR5XCI6XCLlvpDlt57luIJcIixcImNvdW50eVwiOlwi5LqR6b6Z5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMzAzXCIsXCJzeXNfbmFtZVwiOlwi6IGU5Y+L6L2v5Lu2L+mAmueUqOi0ouWKoVwiLFwic3lzX2NvZGVcIjpcIktKSFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDNcIixcImNpdHlcIjpcIuW+kOW3nuW4glwiLFwiY291bnR5XCI6XCLkupHpvpnljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAzMDNcIixcInN5c19uYW1lXCI6XCLnlKjlj4tHUlBHLVU4UjEw6LSi5pS/566h55CG6L2v5Lu2XCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwM1wiLFwiY2l0eVwiOlwi5b6Q5bee5biCXCIsXCJjb3VudHlcIjpcIui0vuaxquWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDMwNVwiLFwic3lzX25hbWVcIjpcIueUqOWPi0dQUC1SMTDotKLmlL/nrqHnkIbova/ku7ZcIixcInN5c19jb2RlXCI6XCJLSkhTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAzXCIsXCJjaXR5XCI6XCLlvpDlt57luIJcIixcImNvdW50eVwiOlwi5rOJ5bGx5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMzExXCIsXCJzeXNfbmFtZVwiOlwi5a+M5rex5Y2P6YCa6LSi5pS/5LiA5L2T5YyW566h55CG5L+h5oGv57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAzXCIsXCJjaXR5XCI6XCLlvpDlt57luIJcIixcImNvdW50eVwiOlwi6ZOc5bGx5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMzEyXCIsXCJzeXNfbmFtZVwiOlwi6LSi5Yqh57uf5LiA5qC4566X57O757ufXCIsXCJzeXNfY29kZVwiOlwiS0pIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwM1wiLFwiY2l0eVwiOlwi5b6Q5bee5biCXCIsXCJjb3VudHlcIjpcIumTnOWxseWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDMxMlwiLFwic3lzX25hbWVcIjpcIumdnueojuaUtuWFpeaUtue8tOeuoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDNcIixcImNpdHlcIjpcIuW+kOW3nuW4glwiLFwiY291bnR5XCI6XCLpk5zlsbHljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAzMTJcIixcInN5c19uYW1lXCI6XCLlhazlhbHotKLmlL/nrqHnkIbova/ku7ZcIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAzXCIsXCJjaXR5XCI6XCLlvpDlt57luIJcIixcImNvdW50eVwiOlwi5Liw5Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMzIxXCIsXCJzeXNfbmFtZVwiOlwiQSsr6LSi5pS/5LiA5L2T5YyW5L+h5oGv5bmz5Y+wXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAzXCIsXCJjaXR5XCI6XCLlvpDlt57luIJcIixcImNvdW50eVwiOlwi5Liw5Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMzIxXCIsXCJzeXNfbmFtZVwiOlwi5paw5Lit5aSn5YWs5YWx6LSi5Yqh566h55CG6L2v5Lu2XCIsXCJzeXNfY29kZVwiOlwiS0pIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwM1wiLFwiY2l0eVwiOlwi5b6Q5bee5biCXCIsXCJjb3VudHlcIjpcIuaym+WOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDMyMlwiLFwic3lzX25hbWVcIjpcIuWvjOa3sei0ouaUv+S4gOS9k+WMlueuoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllUSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwM1wiLFwiY2l0eVwiOlwi5b6Q5bee5biCXCIsXCJjb3VudHlcIjpcIuaym+WOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDMyMlwiLFwic3lzX25hbWVcIjpcIuaWsOS4reWkp+WFrOWFsei0ouaUv+euoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIktKSFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDNcIixcImNpdHlcIjpcIuW+kOW3nuW4glwiLFwiY291bnR5XCI6XCLnnaLlroHljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjAzMjRcIixcInN5c19uYW1lXCI6XCLlr4zmt7HljY/pgJrotKLmlL/kuIDkvZPljJbkuJrliqHnrqHnkIbns7vnu5/ova/ku7ZcIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDNcIixcImNpdHlcIjpcIuW+kOW3nuW4glwiLFwiY291bnR5XCI6XCLnnaLlroHljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjAzMjRcIixcInN5c19uYW1lXCI6XCLmlrDkuK3lpKflhazlhbHotKLmlL/nrqHnkIbova/ku7ZHc29mdFwiLFwic3lzX2NvZGVcIjpcIktKSFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDNcIixcImNpdHlcIjpcIuW+kOW3nuW4glwiLFwiY291bnR5XCI6XCLmlrDmsoLluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjAzODFcIixcInN5c19uYW1lXCI6XCLmsZ/oi4/nnIHotKLmlL/pooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAzXCIsXCJjaXR5XCI6XCLlvpDlt57luIJcIixcImNvdW50eVwiOlwi6YKz5beeXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMzgyXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA0XCIsXCJjaXR5XCI6XCLluLjlt57luIJcIixcImNvdW50eVwiOlwi5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNDAwXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW5Lia5Yqh57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA0XCIsXCJjaXR5XCI6XCLluLjlt57luIJcIixcImNvdW50eVwiOlwi5aSp5a6B5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNDAyXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW6L2v5Lu2XCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA0XCIsXCJjaXR5XCI6XCLluLjlt57luIJcIixcImNvdW50eVwiOlwi5aSp5a6B5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNDAyXCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl57O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNFwiLFwiY2l0eVwiOlwi5bi45bee5biCXCIsXCJjb3VudHlcIjpcIuWkqeWugeWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDQwMlwiLFwic3lzX25hbWVcIjpcIuaAu+mihOeul+ezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDRcIixcImNpdHlcIjpcIuW4uOW3nuW4glwiLFwiY291bnR5XCI6XCLpkp/mpbzljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA0MDRcIixcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLblhaXns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA0XCIsXCJjaXR5XCI6XCLluLjlt57luIJcIixcImNvdW50eVwiOlwi6ZKf5qW85Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNDA0XCIsXCJzeXNfbmFtZVwiOlwi5Zu95bqT6ZuG5Lit5pSv5LuY57O757ufXCIsXCJzeXNfY29kZVwiOlwiR0taRlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNFwiLFwiY2l0eVwiOlwi5bi45bee5biCXCIsXCJjb3VudHlcIjpcIumSn+alvOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDQwNFwiLFwic3lzX25hbWVcIjpcIueUqOasvuiuoeWIkuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkpIR0xcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDRcIixcImNpdHlcIjpcIuW4uOW3nuW4glwiLFwiY291bnR5XCI6XCLpkp/mpbzljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA0MDRcIixcInN5c19uYW1lXCI6XCLmjIfmoIfnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJaQkdMXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA0XCIsXCJjaXR5XCI6XCLluLjlt57luIJcIixcImNvdW50eVwiOlwi6ZKf5qW85Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNDA0XCIsXCJzeXNfbmFtZVwiOlwi5oC76aKE566X57O757ufXCIsXCJzeXNfY29kZVwiOlwiWllTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA0XCIsXCJjaXR5XCI6XCLluLjlt57luIJcIixcImNvdW50eVwiOlwi5paw5YyX5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNDExXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/57u85ZCI5Lia5Yqh566h55CG5bmz5Y+wXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA0XCIsXCJjaXR5XCI6XCLluLjlt57luIJcIixcImNvdW50eVwiOlwi5q2m6L+b5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNDEyXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW566h55CG5L+h5oGv57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA0XCIsXCJjaXR5XCI6XCLluLjlt57luIJcIixcImNvdW50eVwiOlwi5rqn6Ziz5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNDgxXCIsXCJzeXNfbmFtZVwiOlwi6YOo6Zeo6aKE566XXCIsXCJzeXNfY29kZVwiOlwiQk1ZU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNFwiLFwiY2l0eVwiOlwi5bi45bee5biCXCIsXCJjb3VudHlcIjpcIua6p+mYs+W4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDQ4MVwiLFwic3lzX25hbWVcIjpcIuW3pei1hOe7n+WPkVwiLFwic3lzX2NvZGVcIjpcIkdaVEZcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDRcIixcImNpdHlcIjpcIuW4uOW3nuW4glwiLFwiY291bnR5XCI6XCLmuqfpmLPluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjA0ODFcIixcInN5c19uYW1lXCI6XCLlm73mnInotYTkuqdcIixcInN5c19jb2RlXCI6XCJaQ0dMXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA0XCIsXCJjaXR5XCI6XCLluLjlt57luIJcIixcImNvdW50eVwiOlwi5rqn6Ziz5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNDgxXCIsXCJzeXNfbmFtZVwiOlwi5Lmh6ZWH6Z2e56iO5pS25YWlXCIsXCJzeXNfY29kZVwiOlwiWFpGU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNFwiLFwiY2l0eVwiOlwi5bi45bee5biCXCIsXCJjb3VudHlcIjpcIua6p+mYs+W4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDQ4MVwiLFwic3lzX25hbWVcIjpcIuS5oemVh+mbhuS4reaUr+S7mFwiLFwic3lzX2NvZGVcIjpcIlhaR0tcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDRcIixcImNpdHlcIjpcIuW4uOW3nuW4glwiLFwiY291bnR5XCI6XCLph5HlnZvljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA0ODJcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA1XCIsXCJjaXR5XCI6XCLoi4/lt57luIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNTAwXCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5b6B57y057O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuW4guacrOe6p1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDUwMFwiLFwic3lzX25hbWVcIjpcIumihOeul+e8luWItuS4juaJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDVcIixcImNpdHlcIjpcIuiLj+W3nuW4glwiLFwiY291bnR5XCI6XCLlt6XkuJrlm63ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA1MDFcIixcInN5c19uYW1lXCI6XCLpooTnrpfnrqHnkIbnu7zlkIjkuJrliqHlubPlj7BcIixcInN5c19jb2RlXCI6XCJZU0dMXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA1XCIsXCJjaXR5XCI6XCLoi4/lt57luIJcIixcImNvdW50eVwiOlwi6JmO5LiY5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNTA1XCIsXCJzeXNfbmFtZVwiOlwidTjnrqHnkIbova/ku7ZcIixcInN5c19jb2RlXCI6XCJDWkdMXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA1XCIsXCJjaXR5XCI6XCLoi4/lt57luIJcIixcImNvdW50eVwiOlwi6JmO5LiY5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNTA1XCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5oyH5qCH566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiWkJHTFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuiZjuS4mOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDUwNVwiLFwic3lzX25hbWVcIjpcIuWbveW6k+mbhuS4reaUr+S7mOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkdLWkZcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDVcIixcImNpdHlcIjpcIuiLj+W3nuW4glwiLFwiY291bnR5XCI6XCLomY7kuJjljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA1MDVcIixcInN5c19uYW1lXCI6XCLnlKjlj4tHUlAtUjnotKLliqHnrqHnkIbova/ku7ZcIixcInN5c19jb2RlXCI6XCJDV0dMXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA1XCIsXCJjaXR5XCI6XCLoi4/lt57luIJcIixcImNvdW50eVwiOlwi6JmO5LiY5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNTA1XCIsXCJzeXNfbmFtZVwiOlwi55So5Y+LR1JQLVU46LSi5pS/566h55CG6L2v5Lu2XCIsXCJzeXNfY29kZVwiOlwiQ1dHTFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuiZjuS4mOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDUwNVwiLFwic3lzX25hbWVcIjpcIui0puWKoeWkhOeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIlpXQ0xcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDVcIixcImNpdHlcIjpcIuiLj+W3nuW4glwiLFwiY291bnR5XCI6XCLlkLTkuK3ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA1MDZcIixcInN5c19uYW1lXCI6XCJSOWnotKLmlL/nrqHnkIbova/ku7ZcIixcInN5c19jb2RlXCI6XCJDWkdMXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA1XCIsXCJjaXR5XCI6XCLoi4/lt57luIJcIixcImNvdW50eVwiOlwi5ZC05Lit5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNTA2XCIsXCJzeXNfbmFtZVwiOlwi6YOo6Zeo6aKE566XXCIsXCJzeXNfY29kZVwiOlwiQk1ZU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuWQtOS4reWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDUwNlwiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4gOS9k+WMluW5s+WPsFwiLFwic3lzX2NvZGVcIjpcIllUSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuWQtOS4reWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDUwNlwiLFwic3lzX25hbWVcIjpcIumdnueojuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDVcIixcImNpdHlcIjpcIuiLj+W3nuW4glwiLFwiY291bnR5XCI6XCLnm7jln47ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA1MDdcIixcInN5c19uYW1lXCI6XCJ1OOi0ouaUv+euoeeQhui9r+S7tlwiLFwic3lzX2NvZGVcIjpcIkNaR0xcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDVcIixcImNpdHlcIjpcIuiLj+W3nuW4glwiLFwiY291bnR5XCI6XCLnm7jln47ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA1MDdcIixcInN5c19uYW1lXCI6XCLnm7jln47ljLrotKLmlL/nu7zlkIjnrqHnkIbkv6Hmga/ns7vnu59cIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDVcIixcImNpdHlcIjpcIuiLj+W3nuW4glwiLFwiY291bnR5XCI6XCLlp5Hoi4/ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA1MDhcIixcInN5c19uYW1lXCI6XCLotKLmlL/pnZ7nqI7nu7zlkIjnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA1XCIsXCJjaXR5XCI6XCLoi4/lt57luIJcIixcImNvdW50eVwiOlwi5aeR6IuP5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNTA4XCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/57u85ZCI566h55CG5bmz5Y+wXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA1XCIsXCJjaXR5XCI6XCLoi4/lt57luIJcIixcImNvdW50eVwiOlwi5ZC05rGf5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNTA5XCIsXCJzeXNfbmFtZVwiOlwi5ZC05rGf5Yy66LSi5pS/5LiA5L2T5YyWXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA1XCIsXCJjaXR5XCI6XCLoi4/lt57luIJcIixcImNvdW50eVwiOlwi5bi454af5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNTgxXCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl5pS257y0566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuW4uOeGn+W4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDU4MVwiLFwic3lzX25hbWVcIjpcIueUqOWPi1I5XCIsXCJzeXNfY29kZVwiOlwiS0pIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuW4uOeGn+W4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDU4MVwiLFwic3lzX25hbWVcIjpcIumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDVcIixcImNpdHlcIjpcIuiLj+W3nuW4glwiLFwiY291bnR5XCI6XCLlvKDlrrbmuK/luIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjA1ODJcIixcInN5c19uYW1lXCI6XCLotKLmlL/lhazlhbHlupTnlKjmnI3liqHlubPlj7BcIixcInN5c19jb2RlXCI6XCJHR0ZXXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA1XCIsXCJjaXR5XCI6XCLoi4/lt57luIJcIixcImNvdW50eVwiOlwi5byg5a625riv5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNTgyXCIsXCJzeXNfbmFtZVwiOlwi6YeR6J22Sy8z5Yib5paw566h55CG5bmz5Y+wXCIsXCJzeXNfY29kZVwiOlwiQ1pHTFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuW8oOWutua4r+W4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDU4MlwiLFwic3lzX25hbWVcIjpcIui0puWKoeaVsOaNruezu+e7n1wiLFwic3lzX2NvZGVcIjpcIktKSFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDVcIixcImNpdHlcIjpcIuiLj+W3nuW4glwiLFwiY291bnR5XCI6XCLmmIblsbHluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjA1ODNcIixcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLblhaXmlLbnvLTnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA1XCIsXCJjaXR5XCI6XCLoi4/lt57luIJcIixcImNvdW50eVwiOlwi5piG5bGx5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNTgzXCIsXCJzeXNfbmFtZVwiOlwi5YWs5YWx6LSi5pS/5pyN5Yqh5bmz5Y+wXCIsXCJzeXNfY29kZVwiOlwiR0dGV1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuaYhuWxseW4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDU4M1wiLFwic3lzX25hbWVcIjpcIuWbveW6k+mbhuS4reaUr+S7mOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkdLWkZcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDVcIixcImNpdHlcIjpcIuiLj+W3nuW4glwiLFwiY291bnR5XCI6XCLlpKrku5PluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjA1ODVcIixcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLblhaXns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA1XCIsXCJjaXR5XCI6XCLoi4/lt57luIJcIixcImNvdW50eVwiOlwi5aSq5LuT5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNTg1XCIsXCJzeXNfbmFtZVwiOlwi5Lya6K6h5qC4566X57O757ufXCIsXCJzeXNfY29kZVwiOlwiS0pIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuWkquS7k+W4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDU4NVwiLFwic3lzX25hbWVcIjpcIumhueebruW6k1wiLFwic3lzX2NvZGVcIjpcIlhNS1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuWkquS7k+W4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDU4NVwiLFwic3lzX25hbWVcIjpcIumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDZcIixcImNpdHlcIjpcIuWNl+mAmuW4glwiLFwiY291bnR5XCI6XCLmnKznuqdcIixcImNvdW50eV9jb2RlXCI6XCIzMjA2MDBcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi5bSH5bed5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjAyXCIsXCJzeXNfbmFtZVwiOlwi6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNlwiLFwiY2l0eVwiOlwi5Y2X6YCa5biCXCIsXCJjb3VudHlcIjpcIua4r+mXuOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDYxMVwiLFwic3lzX25hbWVcIjpcIui0ouaUv+aAu+mihOeul++8iOWklu+8ieS4k+aIt+euoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTV1pIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi5riv6Ze45Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjExXCIsXCJzeXNfbmFtZVwiOlwi5Z+O5bu66LWE6YeR5LiT5oi3566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiQ0paSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNlwiLFwiY2l0eVwiOlwi5Y2X6YCa5biCXCIsXCJjb3VudHlcIjpcIua4r+mXuOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDYxMVwiLFwic3lzX25hbWVcIjpcIuWGnOS/neS4k+aIt+euoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIk5CWkhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDZcIixcImNpdHlcIjpcIuWNl+mAmuW4glwiLFwiY291bnR5XCI6XCLmuK/pl7jljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA2MTFcIixcInN5c19uYW1lXCI6XCLlhpzkuJrlj5HlsZXln7rph5HkuJPmiLfnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJORkpKXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi5riv6Ze45Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjExXCIsXCJzeXNfbmFtZVwiOlwi5aSx5Zyw5Yac5rCR5L+d6Zqc6LWE6YeR5LiT5oi3XCIsXCJzeXNfY29kZVwiOlwiU0ROTVwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNlwiLFwiY2l0eVwiOlwi5Y2X6YCa5biCXCIsXCJjb3VudHlcIjpcIua4r+mXuOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDYxMVwiLFwic3lzX25hbWVcIjpcIumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDZcIixcImNpdHlcIjpcIuWNl+mAmuW4glwiLFwiY291bnR5XCI6XCLpgJrlt57ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA2MTJcIixcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLblhaXlvoHnrqHns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi6YCa5bee5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjEyXCIsXCJzeXNfbmFtZVwiOlwi5bel6LWE57uf5Y+R5Lq65ZGY5L+h5oGvXCIsXCJzeXNfY29kZVwiOlwiR1pURlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNlwiLFwiY2l0eVwiOlwi5Y2X6YCa5biCXCIsXCJjb3VudHlcIjpcIumAmuW3nuWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDYxMlwiLFwic3lzX25hbWVcIjpcIumihOeul+aMh+aghy3lm73lupPpm4bkuK3mlK/ku5jns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi6YCa5bee5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjEyXCIsXCJzeXNfbmFtZVwiOlwi5oC76aKE566X5Lya6K6h5qC4566X57O757ufXCIsXCJzeXNfY29kZVwiOlwiS0pIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNlwiLFwiY2l0eVwiOlwi5Y2X6YCa5biCXCIsXCJjb3VudHlcIjpcIua1t+WuieWOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDYyMVwiLFwic3lzX25hbWVcIjpcIumDqOmXqOmihOeul+e8luWuoeezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkJNWVNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDZcIixcImNpdHlcIjpcIuWNl+mAmuW4glwiLFwiY291bnR5XCI6XCLmtbflronljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjA2MjFcIixcInN5c19uYW1lXCI6XCLlhazliqHmtojotLnnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJHV1hGXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi5rW35a6J5Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjIxXCIsXCJzeXNfbmFtZVwiOlwi5Zu95pyJ6LWE5Lqn566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiWkNHTFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNlwiLFwiY2l0eVwiOlwi5Y2X6YCa5biCXCIsXCJjb3VudHlcIjpcIua1t+WuieWOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDYyMVwiLFwic3lzX25hbWVcIjpcIuWMuumVh+i0ouaUv+euoeeQhuKAnOS4gOS9k+WMluKAneezu+e7n1wiLFwic3lzX2NvZGVcIjpcIlhaWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi5rW35a6J5Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjIxXCIsXCJzeXNfbmFtZVwiOlwi5Y6/5pys57qn6LSi5pS/566h55CG4oCc5LiA5L2T5YyW4oCd57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi5aaC5Lic5Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjIzXCIsXCJzeXNfbmFtZVwiOlwi55So5Y+L5pS/5YqhXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi5ZCv5Lic5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjgxXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiT5oi35qC4566X77yI6KGM5pS/5Y+j5LiT6aG56LWE6YeR77yJXCIsXCJzeXNfY29kZVwiOlwiWkhYWlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNlwiLFwiY2l0eVwiOlwi5Y2X6YCa5biCXCIsXCJjb3VudHlcIjpcIuWQr+S4nOW4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDY4MVwiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4k+aIt+aguOeul++8iOe7j+W7uuWPo+S4k+mhuei1hOmHke+8iVwiLFwic3lzX2NvZGVcIjpcIlpISkpcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDZcIixcImNpdHlcIjpcIuWNl+mAmuW4glwiLFwiY291bnR5XCI6XCLlkK/kuJzluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjA2ODFcIixcInN5c19uYW1lXCI6XCLotKLmlL/kuJPmiLfmoLjnrpfvvIjlhpzkuJrkv53pmankuJPotKbvvIlcIixcInN5c19jb2RlXCI6XCJaSE5CXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi5ZCv5Lic5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjgxXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiT5oi35qC4566X77yI5Yac5Lia57u85ZCI5byA5Y+R5LiT6LSm77yJXCIsXCJzeXNfY29kZVwiOlwiWkhORlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNlwiLFwiY2l0eVwiOlwi5Y2X6YCa5biCXCIsXCJjb3VudHlcIjpcIuWQr+S4nOW4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDY4MVwiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4k+aIt+aguOeul++8iOekvuS/nei1hOmHkeS4k+i0pu+8iVwiLFwic3lzX2NvZGVcIjpcIlpIU0JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDZcIixcImNpdHlcIjpcIuWNl+mAmuW4glwiLFwiY291bnR5XCI6XCLlkK/kuJzluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjA2ODFcIixcInN5c19uYW1lXCI6XCLotKLmlL/kuJPmiLfmoLjnrpfvvIjlnJ/lnLDlh7rorqnkuJPotKbvvIlcIixcInN5c19jb2RlXCI6XCJaSFREXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi5ZCv5Lic5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjgxXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiT5oi35qC4566X77yI57u85ZCI5Y+j5LiT6aG56LWE6YeR77yJXCIsXCJzeXNfY29kZVwiOlwiWkhaSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNlwiLFwiY2l0eVwiOlwi5Y2X6YCa5biCXCIsXCJjb3VudHlcIjpcIuWQr+S4nOW4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDY4MVwiLFwic3lzX25hbWVcIjpcIumdnueojuaUtuWFpeeuoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDZcIixcImNpdHlcIjpcIuWNl+mAmuW4glwiLFwiY291bnR5XCI6XCLlkK/kuJzluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjA2ODFcIixcInN5c19uYW1lXCI6XCLlhpzkuJrkuJPlkJHlj4rlhpzkuJrlj5HlsZXln7rph5HkuJPpoblcIixcInN5c19jb2RlXCI6XCJORlpYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi5ZCv5Lic5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjgxXCIsXCJzeXNfbmFtZVwiOlwi6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNlwiLFwiY2l0eVwiOlwi5Y2X6YCa5biCXCIsXCJjb3VudHlcIjpcIuWQr+S4nOW4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDY4MVwiLFwic3lzX25hbWVcIjpcIuaAu+mihOeul+S8muiuoeaguOeul1wiLFwic3lzX2NvZGVcIjpcIktKSFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDZcIixcImNpdHlcIjpcIuWNl+mAmuW4glwiLFwiY291bnR5XCI6XCLlpoLnmovluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjA2ODJcIixcInN5c19uYW1lXCI6XCLph5HotKLlt6XnqIvkuIDkvZPljJbmlK/mkpHlubPlj7BcIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDZcIixcImNpdHlcIjpcIuWNl+mAmuW4glwiLFwiY291bnR5XCI6XCLmtbfpl6jluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjA2ODRcIixcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLbnvLRcIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi5rW36Zeo5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjg0XCIsXCJzeXNfbmFtZVwiOlwi5a2m5qCh6aKE566X5omn6KGMXCIsXCJzeXNfY29kZVwiOlwiWVNaWFhYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi5rW36Zeo5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjg0XCIsXCJzeXNfbmFtZVwiOlwi6aKE566X5omn6KGMXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNlwiLFwiY2l0eVwiOlwi5Y2X6YCa5biCXCIsXCJjb3VudHlcIjpcIua1t+mXqOW4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDY4NFwiLFwic3lzX25hbWVcIjpcIumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDZcIixcImNpdHlcIjpcIuWNl+mAmuW4glwiLFwiY291bnR5XCI6XCLmtbfpl6jluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjA2ODRcIixcInN5c19uYW1lXCI6XCLkuJPpobnotYTph5FcIixcInN5c19jb2RlXCI6XCJaWFpKXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi5rW36Zeo5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjg0XCIsXCJzeXNfbmFtZVwiOlwi5oC76aKE566XXCIsXCJzeXNfY29kZVwiOlwiWllTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA3XCIsXCJjaXR5XCI6XCLov57kupHmuK/luIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNzAwXCIsXCJzeXNfbmFtZVwiOlwi6YOo6Zeo6aKE566X57O757ufXCIsXCJzeXNfY29kZVwiOlwiQk1ZU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwN1wiLFwiY2l0eVwiOlwi6L+e5LqR5riv5biCXCIsXCJjb3VudHlcIjpcIuW4guacrOe6p1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDcwMFwiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4k+aIt+aguOeul1wiLFwic3lzX2NvZGVcIjpcIlpISFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDdcIixcImNpdHlcIjpcIui/nuS6kea4r+W4glwiLFwiY291bnR5XCI6XCLluILmnKznuqdcIixcImNvdW50eV9jb2RlXCI6XCIzMjA3MDBcIixcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLblhaXns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA3XCIsXCJjaXR5XCI6XCLov57kupHmuK/luIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNzAwXCIsXCJzeXNfbmFtZVwiOlwi6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwN1wiLFwiY2l0eVwiOlwi6L+e5LqR5riv5biCXCIsXCJjb3VudHlcIjpcIui/nuS6keWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDcwM1wiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4k+aIt+i0puWKoeezu+e7n1wiLFwic3lzX2NvZGVcIjpcIlpISFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDdcIixcImNpdHlcIjpcIui/nuS6kea4r+W4glwiLFwiY291bnR5XCI6XCLov57kupHljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA3MDNcIixcInN5c19uYW1lXCI6XCLlr4zmt7HotKLmlL/kuIDkvZPljJbnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDdcIixcImNpdHlcIjpcIui/nuS6kea4r+W4glwiLFwiY291bnR5XCI6XCLmtbflt57ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA3MDZcIixcInN5c19uYW1lXCI6XCLlr4zmt7HotKLmlL/kuIDkvZPljJbkuJrliqHnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDdcIixcImNpdHlcIjpcIui/nuS6kea4r+W4glwiLFwiY291bnR5XCI6XCLmtbflt57ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA3MDZcIixcInN5c19uYW1lXCI6XCLmlrDkuK3lpKflhazlhbHotKLmlL/nrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDdcIixcImNpdHlcIjpcIui/nuS6kea4r+W4glwiLFwiY291bnR5XCI6XCLotaPmpobljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA3MjFcIixcInN5c19uYW1lXCI6XCLotKLmlL/kuIDkvZPljJblubPlj7BcIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDdcIixcImNpdHlcIjpcIui/nuS6kea4r+W4glwiLFwiY291bnR5XCI6XCLotaPmpobljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA3MjFcIixcInN5c19uYW1lXCI6XCLlm73mnInotYTkuqfns7vnu59cIixcInN5c19jb2RlXCI6XCJDWkdMXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA3XCIsXCJjaXR5XCI6XCLov57kupHmuK/luIJcIixcImNvdW50eVwiOlwi5Lic5rW35Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNzIyXCIsXCJzeXNfbmFtZVwiOlwi6YOo6Zeo6aKE566X57O757ufXCIsXCJzeXNfY29kZVwiOlwiQk1ZU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwN1wiLFwiY2l0eVwiOlwi6L+e5LqR5riv5biCXCIsXCJjb3VudHlcIjpcIuS4nOa1t+WOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDcyMlwiLFwic3lzX25hbWVcIjpcIuWbveW6k+S4k+mhuei1hOmHkeeuoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIlpYWkpcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDdcIixcImNpdHlcIjpcIui/nuS6kea4r+W4glwiLFwiY291bnR5XCI6XCLkuJzmtbfljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjA3MjJcIixcInN5c19uYW1lXCI6XCLlm73mnInotYTkuqfnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJaQ0dMXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA3XCIsXCJjaXR5XCI6XCLov57kupHmuK/luIJcIixcImNvdW50eVwiOlwi5Lic5rW35Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNzIyXCIsXCJzeXNfbmFtZVwiOlwi6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwN1wiLFwiY2l0eVwiOlwi6L+e5LqR5riv5biCXCIsXCJjb3VudHlcIjpcIueBjOS6keWOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDcyM1wiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4gOS9k+WMluW5s+WPsFwiLFwic3lzX2NvZGVcIjpcIllUSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwN1wiLFwiY2l0eVwiOlwi6L+e5LqR5riv5biCXCIsXCJjb3VudHlcIjpcIueBjOWNl+WOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDcyNFwiLFwic3lzX25hbWVcIjpcIumdnueojuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDdcIixcImNpdHlcIjpcIui/nuS6kea4r+W4glwiLFwiY291bnR5XCI6XCLngYzljZfljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjA3MjRcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA4XCIsXCJjaXR5XCI6XCLmt67lronluIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwODAwXCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS257y0566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIuW4guacrOe6p1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgwMFwiLFwic3lzX25hbWVcIjpcIumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLmuIXmsrPljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MDJcIixcInN5c19uYW1lXCI6XCLotKLmlL/nrqHnkIbns7vnu5/vvIjmlrDlhpzkv53vvIlcIixcInN5c19jb2RlXCI6XCJaSE5CXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA4XCIsXCJjaXR5XCI6XCLmt67lronluIJcIixcImNvdW50eVwiOlwi5riF5rKz5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwODAyXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/566h55CG57O757uf77yI5Z+O5biC5bGF5rCR5Yy755aX57uf562577yJXCIsXCJzeXNfY29kZVwiOlwiWkhZQlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIua4heays+WMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgwMlwiLFwic3lzX25hbWVcIjpcIui0ouaUv+euoeeQhuezu+e7n++8iOmbhuS4reaUr+S7mOS4reW/g++8iVwiLFwic3lzX2NvZGVcIjpcIkdLWkZcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLmuIXmsrPljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MDJcIixcInN5c19uYW1lXCI6XCLotKLmlL/nrqHnkIbns7vnu5/vvIjop6Plm7Dph5HvvIlcIixcInN5c19jb2RlXCI6XCJaSEpLXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA4XCIsXCJjaXR5XCI6XCLmt67lronluIJcIixcImNvdW50eVwiOlwi5riF5rKz5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwODAyXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/566h55CG57O757uf77yI5pen5Z+O5pS56YCg77yJXCIsXCJzeXNfY29kZVwiOlwiWkhDR1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIua4heays+WMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgwMlwiLFwic3lzX25hbWVcIjpcIui0ouaUv+euoeeQhuezu+e7n++8iOekvuS/nei1hOmHkei0puaIt++8iVwiLFwic3lzX2NvZGVcIjpcIlpIU0JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLmuIXmsrPljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MDJcIixcInN5c19uYW1lXCI6XCLotKLmlL/nrqHnkIbns7vnu5/vvIjlnJ/lnLDlh7rorqnkuJPluJDvvIlcIixcInN5c19jb2RlXCI6XCJaSFREXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA4XCIsXCJjaXR5XCI6XCLmt67lronluIJcIixcImNvdW50eVwiOlwi5riF5rKz5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwODAyXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/566h55CG57O757uf77yI6aKE5ouo5Y+K6Z2e6ZuG5Lit5pSv5LuY5Lit5b+D77yJXCIsXCJzeXNfY29kZVwiOlwiWkhZQlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIua4heays+WMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgwMlwiLFwic3lzX25hbWVcIjpcIui0ouaUv+euoeeQhuezu+e7n++8iOmihOeul+Wklui1hOmHke+8iVwiLFwic3lzX2NvZGVcIjpcIllTV1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIua4heays+WMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgwMlwiLFwic3lzX25hbWVcIjpcIuaAu+mihOeul+S8muiuoVwiLFwic3lzX2NvZGVcIjpcIktKSFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLmt67lronljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MDNcIixcInN5c19uYW1lXCI6XCLotKLliqHmoLjnrpfns7vnu59cIixcInN5c19jb2RlXCI6XCJLSkhTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA4XCIsXCJjaXR5XCI6XCLmt67lronluIJcIixcImNvdW50eVwiOlwi5reu5a6J5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwODAzXCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIua3ruWuieWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgwM1wiLFwic3lzX25hbWVcIjpcIuW3pei1hOe7n+WPkeezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkdaVEZcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLmt67lronljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MDNcIixcInN5c19uYW1lXCI6XCLnlKjlj4vmlL/liqFcIixcInN5c19jb2RlXCI6XCJZWVpXXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA4XCIsXCJjaXR5XCI6XCLmt67lronluIJcIixcImNvdW50eVwiOlwi5reu5a6J5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwODAzXCIsXCJzeXNfbmFtZVwiOlwi6aKE566X57yW5a6h57O757ufXCIsXCJzeXNfY29kZVwiOlwiQk1ZU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIua3ruWuieWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgwM1wiLFwic3lzX25hbWVcIjpcIumihOeul+euoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTR0xcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLmt67lronljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MDNcIixcInN5c19uYW1lXCI6XCLpooTnrpflpJbotYTph5HvvIjku47ogZTnvZHlrqHorqHkuK3lj5bmlbDvvIlcIixcInN5c19jb2RlXCI6XCJZU1dcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLmt67lronljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MDNcIixcInN5c19uYW1lXCI6XCLpooTnrpfnvJblrqHns7vnu59cIixcInN5c19jb2RlXCI6XCJZU0JTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA4XCIsXCJjaXR5XCI6XCLmt67lronluIJcIixcImNvdW50eVwiOlwi5reu6Zi05Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwODA0XCIsXCJzeXNfbmFtZVwiOlwiRzYtRei0ouWKoeeuoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkNXR0xcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLmt67pmLTljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MDRcIixcInN5c19uYW1lXCI6XCLmsZ/oi4/nnIHotKLmlL/pooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA4XCIsXCJjaXR5XCI6XCLmt67lronluIJcIixcImNvdW50eVwiOlwi5reu6Zi05Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwODA0XCIsXCJzeXNfbmFtZVwiOlwi5paw5Lit5aSn5YWs5YWx6LSi5pS/566h55CG6L2v5Lu2XCIsXCJzeXNfY29kZVwiOlwiQ1pHTFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIua3rumYtOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgwNFwiLFwic3lzX25hbWVcIjpcIueUqOWPi0dSUC9SOei0ouaUv+euoeeQhui9r+S7tlwiLFwic3lzX2NvZGVcIjpcIkNaR0xcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLmt67pmLTljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MDRcIixcInN5c19uYW1lXCI6XCLnlKjlj4tHUlAtVThSMTBcIixcInN5c19jb2RlXCI6XCJDV0dMXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA4XCIsXCJjaXR5XCI6XCLmt67lronluIJcIixcImNvdW50eVwiOlwi5reu5a6J5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwODAzXCIsXCJzeXNfbmFtZVwiOlwi6aKE566X57yW5a6h57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNCU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIua4hea1puWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgxMVwiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4gOS9k+WMlueuoeeQhuezu+e7n++8iOWfuuW7uuaIt++8iVwiLFwic3lzX2NvZGVcIjpcIlpISkpcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLmuIXmtabljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MTFcIixcInN5c19uYW1lXCI6XCLotKLmlL/kuIDkvZPljJbnrqHnkIbns7vnu5/vvIjpm4bkuK3mlK/ku5jkuK3lv4PvvIlcIixcInN5c19jb2RlXCI6XCJHS1pGXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA4XCIsXCJjaXR5XCI6XCLmt67lronluIJcIixcImNvdW50eVwiOlwi5riF5rWm5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwODExXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW566h55CG57O757uf77yI5Yac5Lia57u85ZCI5byA5Y+R77yJXCIsXCJzeXNfY29kZVwiOlwiWkhORlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIua4hea1puWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgxMVwiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4gOS9k+WMlueuoeeQhuezu+e7n++8iOmihOeul+Wklui1hOmHke+8iVwiLFwic3lzX2NvZGVcIjpcIllTV1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIua4hea1puWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgxMVwiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4gOS9k+WMlueuoeeQhuezu+e7n++8iOaUr+WGnOS4k+aIt++8iVwiLFwic3lzX2NvZGVcIjpcIlpIWk5cIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLmuIXmtabljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MTFcIixcInN5c19uYW1lXCI6XCLotKLmlL/kuIDkvZPljJbnrqHnkIbns7vnu5/vvIjmgLvpooTnrpfvvIlcIixcInN5c19jb2RlXCI6XCJLSkhTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA4XCIsXCJjaXR5XCI6XCLmt67lronluIJcIixcImNvdW50eVwiOlwi5raf5rC05Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwODI2XCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5b6B57y057O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIua2n+awtOWOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgyNlwiLFwic3lzX25hbWVcIjpcIuWbvei1hOeuoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIlpDR0xcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLmtp/msLTljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MjZcIixcInN5c19uYW1lXCI6XCLkuaHotKLljr/nrqHns7vnu59cIixcInN5c19jb2RlXCI6XCJYQ1hHXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA4XCIsXCJjaXR5XCI6XCLmt67lronluIJcIixcImNvdW50eVwiOlwi5raf5rC05Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwODI2XCIsXCJzeXNfbmFtZVwiOlwi5Lmh6LSi5Y6/566h57O757ufXCIsXCJzeXNfY29kZVwiOlwiWENYR1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIua2n+awtOWOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgyNlwiLFwic3lzX25hbWVcIjpcIumihOeul+e8luWItueuoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTQlNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLmtp/msLTljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MjZcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA4XCIsXCJjaXR5XCI6XCLmt67lronluIJcIixcImNvdW50eVwiOlwi5rSq5rO95Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwODI5XCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOFwiLFwiY2l0eVwiOlwi5reu5a6J5biCXCIsXCJjb3VudHlcIjpcIua0quazveWOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDgyOVwiLFwic3lzX25hbWVcIjpcIumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLnm7HnnJnljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MzBcIixcInN5c19uYW1lXCI6XCLotKLmlL/kuIDkvZPljJblubPlj7BcIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLph5HmuZbljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MzFcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTAwXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+W4guacrOe6p1/pg6jpl6jpooTnrpdcIixcInN5c19jb2RlXCI6XCJCTVlTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTAwXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+W4guacrOe6p1/pnZ7nqI7mlLbnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTAwXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+W4guacrOe6p1/pooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5Lqt5rmW5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTAyXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+S6rea5luWMul/otKLmlL/kuJPmiLdcIixcInN5c19jb2RlXCI6XCJaSEhTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5Lqt5rmW5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTAyXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+S6rea5luWMul/pnZ7nqI7mlLblhaXnrqHnkIZcIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5Lqt5rmW5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTAyXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+S6rea5luWMul/lm73lupPpm4bkuK3mlK/ku5jnrqHnkIZcIixcInN5c19jb2RlXCI6XCJHS1pGXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5Lqt5rmW5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTAyXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+S6rea5luWMul/pooTnrpfmjIfmoIfnrqHnkIZcIixcInN5c19jb2RlXCI6XCJaQkdMXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5Lqt5rmW5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTAyXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+S6rea5luWMul/mgLvpooTnrpfkvJrorqHmoLjnrpdcIixcInN5c19jb2RlXCI6XCJLSkhTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi55uQ6YO95Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTAzXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+ebkOmDveWMul/otKLmlL/kuJPmiLfmoLjnrpfns7vnu59cIixcInN5c19jb2RlXCI6XCJaSEhTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi55uQ6YO95Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTAzXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+ebkOmDveWMul/pnZ7nqI7mlLblhaXnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi55uQ6YO95Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTAzXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+ebkOmDveWMul/lm73lupPpm4bkuK3mlK/ku5jns7vnu59cIixcInN5c19jb2RlXCI6XCJHS1pGXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi55uQ6YO95Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTAzXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+ebkOmDveWMul/mgLvpooTnrpfkvJrorqHmoLjnrpfns7vnu59cIixcInN5c19jb2RlXCI6XCJLSkhTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5ZON5rC05Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTIxXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+WTjeawtOWOv1/pg6jpl6jpooTnrpfnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJCTVlTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5ZON5rC05Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTIxXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+WTjeawtOWOv1/otKLmlL/kuIDkvZPljJbkv6Hmga/ns7vnu59cIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDlcIixcImNpdHlcIjpcIuebkOWfjuW4glwiLFwiY291bnR5XCI6XCLlk43msLTljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjA5MjFcIixcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5ZON5rC05Y6/X+mdnueojuaUtuWFpeaUtue8tOeuoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDlcIixcImNpdHlcIjpcIuebkOWfjuW4glwiLFwiY291bnR5XCI6XCLmu6jmtbfljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjA5MjJcIixcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5ruo5rW35Y6/6LSi5pS/5LiA5L2T5YyWXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi6Zic5a6B5Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTIzXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+mYnOWugeWOv1/otKLmlL/nrqHnkIbova/ku7ZcIixcInN5c19jb2RlXCI6XCJDWkdMXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi6Zic5a6B5Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTIzXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+mYnOWugeWOv1/otKLmlL/nrqHnkIbova/ku7bnlKjlj4tVOFwiLFwic3lzX2NvZGVcIjpcIllZWldcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDlcIixcImNpdHlcIjpcIuebkOWfjuW4glwiLFwiY291bnR5XCI6XCLlsITpmLPljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjA5MjRcIixcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5bCE6Ziz5Y6/X+i0ouaUv+mihOeul+aJp+ihjOS4gOS9k+WMluezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllUSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOVwiLFwiY2l0eVwiOlwi55uQ5Z+O5biCXCIsXCJjb3VudHlcIjpcIuW7uua5luWOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDkyNVwiLFwic3lzX25hbWVcIjpcIuebkOWfjuW4gl/lu7rmuZbljr9f6Z2e56iO5pS257y0XCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOVwiLFwiY2l0eVwiOlwi55uQ5Z+O5biCXCIsXCJjb3VudHlcIjpcIuW7uua5luWOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMDkyNVwiLFwic3lzX25hbWVcIjpcIuebkOWfjuW4gl/lu7rmuZbljr9f6LSi5pS/5LiA5L2T5YyWXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5bu65rmW5Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTI1XCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+W7uua5luWOv1/lm73lupPpm4bkuK3mlK/ku5hcIixcInN5c19jb2RlXCI6XCJHS1pGXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5Lic5Y+w5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTgxXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+S4nOWPsOW4gl/pg6jpl6jpooTnrpfnvJblrqHns7vnu59cIixcInN5c19jb2RlXCI6XCJCTVlTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5Lic5Y+w5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTgxXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+S4nOWPsOW4gl/otKLmlL/kuIDkvZPljJbkv6Hmga/ns7vnu59cIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDlcIixcImNpdHlcIjpcIuebkOWfjuW4glwiLFwiY291bnR5XCI6XCLkuJzlj7DluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjA5ODFcIixcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5Lic5Y+w5biCX+i0ouaUv+S4k+aIt+aguOeul+ezu+e7n1wiLFwic3lzX2NvZGVcIjpcIlpISFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDlcIixcImNpdHlcIjpcIuebkOWfjuW4glwiLFwiY291bnR5XCI6XCLkuJzlj7DluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjA5ODFcIixcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5Lic5Y+w5biCX+mdnueojuaUtuWFpeaUtue8tOeuoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDlcIixcImNpdHlcIjpcIuebkOWfjuW4glwiLFwiY291bnR5XCI6XCLkuJzlj7DluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjA5ODFcIixcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5Lic5Y+w5biCX+aAu+mihOeul+S8muiuoeaguOeul+ezu+e7n1wiLFwic3lzX2NvZGVcIjpcIktKSFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDlcIixcImNpdHlcIjpcIuebkOWfjuW4glwiLFwiY291bnR5XCI6XCLlpKfkuLDljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA5ODJcIixcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5aSn5Liw5Yy6X+mDqOmXqOmihOeul+ezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkJNWVNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDlcIixcImNpdHlcIjpcIuebkOWfjuW4glwiLFwiY291bnR5XCI6XCLlpKfkuLDljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA5ODJcIixcInN5c19uYW1lXCI6XCLnm5Dln47luIJf5aSn5Liw5Yy6X+i0ouaUv+S4gOS9k+WMllwiLFwic3lzX2NvZGVcIjpcIllUSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOVwiLFwiY2l0eVwiOlwi55uQ5Z+O5biCXCIsXCJjb3VudHlcIjpcIuWkp+S4sOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDk4MlwiLFwic3lzX25hbWVcIjpcIuebkOWfjuW4gl/lpKfkuLDljLpf5oC76aKE566X5Lya6K6h5qC4566X6LSi5Yqh6L2v5Lu2XCIsXCJzeXNfY29kZVwiOlwiS0pIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOVwiLFwiY2l0eVwiOlwi55uQ5Z+O5biCXCIsXCJjb3VudHlcIjpcIue7j+a1juaKgOacr+W8gOWPkeWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDk5MVwiLFwic3lzX25hbWVcIjpcIuebkOWfjuW4gl/nu4/mtY7mioDmnK/lvIDlj5HljLpf6YOo6Zeo6aKE566X6L2v5Lu2XCIsXCJzeXNfY29kZVwiOlwiQk1ZU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwOVwiLFwiY2l0eVwiOlwi55uQ5Z+O5biCXCIsXCJjb3VudHlcIjpcIue7j+a1juaKgOacr+W8gOWPkeWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDk5MVwiLFwic3lzX25hbWVcIjpcIuebkOWfjuW4gl/nu4/mtY7mioDmnK/lvIDlj5HljLpf5Zu95bqT6ZuG5Lit5pSv5LuYXCIsXCJzeXNfY29kZVwiOlwiR0taRlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMFwiLFwiY2l0eVwiOlwi5oms5bee5biCXCIsXCJjb3VudHlcIjpcIuW4guacrOe6p1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMTAwMFwiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4k+aIt+aguOeul1wiLFwic3lzX2NvZGVcIjpcIlpISFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTBcIixcImNpdHlcIjpcIuaJrOW3nuW4glwiLFwiY291bnR5XCI6XCLluILmnKznuqdcIixcImNvdW50eV9jb2RlXCI6XCIzMjEwMDBcIixcInN5c19uYW1lXCI6XCLogIHpnZ7nqI7mlLblhaXlvoHnvLTns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEwXCIsXCJjaXR5XCI6XCLmiazlt57luIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMDAwXCIsXCJzeXNfbmFtZVwiOlwi5oms5bee6LSi5pS/5LiA5L2T5YyW5L+h5oGv566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEwXCIsXCJjaXR5XCI6XCLmiazlt57luIJcIixcImNvdW50eVwiOlwi5bm/6Zm15Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMDAyXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEwXCIsXCJjaXR5XCI6XCLmiazlt57luIJcIixcImNvdW50eVwiOlwi5bm/6Zm15Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMDAyXCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMFwiLFwiY2l0eVwiOlwi5oms5bee5biCXCIsXCJjb3VudHlcIjpcIumCl+axn+WMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTAwM1wiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4gOS9k+WMluezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllUSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMFwiLFwiY2l0eVwiOlwi5oms5bee5biCXCIsXCJjb3VudHlcIjpcIumCl+axn+WMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTAwM1wiLFwic3lzX25hbWVcIjpcIumdnueojuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTBcIixcImNpdHlcIjpcIuaJrOW3nuW4glwiLFwiY291bnR5XCI6XCLpgpfmsZ/ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjEwMDNcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEwXCIsXCJjaXR5XCI6XCLmiazlt57luIJcIixcImNvdW50eVwiOlwi5a6d5bqU5Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMDIzXCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl5b6B5pS2XCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMFwiLFwiY2l0eVwiOlwi5oms5bee5biCXCIsXCJjb3VudHlcIjpcIuWuneW6lOWOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMTAyM1wiLFwic3lzX25hbWVcIjpcIumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTBcIixcImNpdHlcIjpcIuaJrOW3nuW4glwiLFwiY291bnR5XCI6XCLku6rlvoHluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjEwODFcIixcInN5c19uYW1lXCI6XCLpg6jpl6jpooTnrpfnvJbliLZcIixcInN5c19jb2RlXCI6XCJCTVlTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEwXCIsXCJjaXR5XCI6XCLmiazlt57luIJcIixcImNvdW50eVwiOlwi5Luq5b6B5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMDgxXCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl5pS257y0XCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMFwiLFwiY2l0eVwiOlwi5oms5bee5biCXCIsXCJjb3VudHlcIjpcIuS7quW+geW4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTA4MVwiLFwic3lzX25hbWVcIjpcIuihjOaUv+S6i+S4muaAp+WNleS9jeWbveaciei1hOS6p+euoeeQhlwiLFwic3lzX2NvZGVcIjpcIlpDR0xcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTBcIixcImNpdHlcIjpcIuaJrOW3nuW4glwiLFwiY291bnR5XCI6XCLku6rlvoHluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjEwODFcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEwXCIsXCJjaXR5XCI6XCLmiazlt57luIJcIixcImNvdW50eVwiOlwi6auY6YKu5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMDg0XCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5Lia5Yqh57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEwXCIsXCJjaXR5XCI6XCLmiazlt57luIJcIixcImNvdW50eVwiOlwi5rGf6YO95Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMDg4XCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5Lia5Yqh57u85ZCI57O757ufXCIsXCJzeXNfY29kZVwiOlwiWkhZV1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMFwiLFwiY2l0eVwiOlwi5oms5bee5biCXCIsXCJjb3VudHlcIjpcIuaxn+mDveWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTA4OFwiLFwic3lzX25hbWVcIjpcIuaxn+mDveW8gOWPkeWMuumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTFcIixcImNpdHlcIjpcIumVh+axn+W4glwiLFwiY291bnR5XCI6XCLluILmnKznuqdcIixcImNvdW50eV9jb2RlXCI6XCIzMjExMDBcIixcInN5c19uYW1lXCI6XCLotKLmlL/kuIDkvZPljJZcIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTFcIixcImNpdHlcIjpcIumVh+axn+W4glwiLFwiY291bnR5XCI6XCLkuqzlj6PljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjExMDJcIixcInN5c19uYW1lXCI6XCLlr4zmt7HljY/pgJrotKLmlL/kuIDkvZPljJbkuJrliqHnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTFcIixcImNpdHlcIjpcIumVh+axn+W4glwiLFwiY291bnR5XCI6XCLkuqzlj6PljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjExMDJcIixcInN5c19uYW1lXCI6XCLlr4zmt7HljY/pgJrpnZ7nqI7mlLbnvLTns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjExXCIsXCJjaXR5XCI6XCLplYfmsZ/luIJcIixcImNvdW50eVwiOlwi5Lqs5Y+j5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMTAyXCIsXCJzeXNfbmFtZVwiOlwi5a+M5rex5Y2P6YCa5bel6LWE57uf5Y+R57O757ufXCIsXCJzeXNfY29kZVwiOlwiR1pURlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMVwiLFwiY2l0eVwiOlwi6ZWH5rGf5biCXCIsXCJjb3VudHlcIjpcIua2puW3nuWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTExMVwiLFwic3lzX25hbWVcIjpcIumDqOmXqOmihOeul+ezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkJNWVNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTFcIixcImNpdHlcIjpcIumVh+axn+W4glwiLFwiY291bnR5XCI6XCLmtqblt57ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjExMTFcIixcInN5c19uYW1lXCI6XCLotKLmlL/kuIDkvZPljJZcIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTFcIixcImNpdHlcIjpcIumVh+axn+W4glwiLFwiY291bnR5XCI6XCLmtqblt57ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjExMTFcIixcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLblhaVcIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjExXCIsXCJjaXR5XCI6XCLplYfmsZ/luIJcIixcImNvdW50eVwiOlwi5Li55b6S5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMTEyXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/57u85ZCI5Lia5Yqh57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjExXCIsXCJjaXR5XCI6XCLplYfmsZ/luIJcIixcImNvdW50eVwiOlwi5Li56Ziz5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMTgxXCIsXCJzeXNfbmFtZVwiOlwi6YOo6Zeo6aKE566X57O757ufXCIsXCJzeXNfY29kZVwiOlwiQk1ZU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMVwiLFwiY2l0eVwiOlwi6ZWH5rGf5biCXCIsXCJjb3VudHlcIjpcIuS4uemYs+W4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTE4MVwiLFwic3lzX25hbWVcIjpcIumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTFcIixcImNpdHlcIjpcIumVh+axn+W4glwiLFwiY291bnR5XCI6XCLmiazkuK3luIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjExODJcIixcInN5c19uYW1lXCI6XCLpg6jpl6jpooTnrpfns7vnu59cIixcInN5c19jb2RlXCI6XCJCTVlTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjExXCIsXCJjaXR5XCI6XCLplYfmsZ/luIJcIixcImNvdW50eVwiOlwi5oms5Lit5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMTgyXCIsXCJzeXNfbmFtZVwiOlwi6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMVwiLFwiY2l0eVwiOlwi6ZWH5rGf5biCXCIsXCJjb3VudHlcIjpcIuWPpeWuueW4glwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTE4M1wiLFwic3lzX25hbWVcIjpcIumdnueojuaUtuWFpVwiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTFcIixcImNpdHlcIjpcIumVh+axn+W4glwiLFwiY291bnR5XCI6XCLlj6XlrrnluIJcIixcImNvdW50eV9jb2RlXCI6XCIzMjExODNcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjAwXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+W4guacrOe6p1/pg6jpl6jpooTnrpfns7vnu59cIixcInN5c19jb2RlXCI6XCJCTVlTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjAwXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+W4guacrOe6p1/pnZ7nqI7mlLblhaXns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjAwXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+W4guacrOe6p1/nu6nmlYjnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJKWEdMXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjAwXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+W4guacrOe6p1/pooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjAwXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+W4guacrOe6p1/nu7zlkIjmsrvnqI7ns7vnu59cIixcInN5c19jb2RlXCI6XCJaSFpTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi5rW36Zm15Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjAyXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+a1t+mZteWMul/pg6jpl6jpooTnrpfnvJbliLbns7vnu59cIixcInN5c19jb2RlXCI6XCJCTVlTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi5rW36Zm15Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjAyXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+a1t+mZteWMul/ljr/ljLrotKLmlL/kuIDkvZPljJZcIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTJcIixcImNpdHlcIjpcIuazsOW3nuW4glwiLFwiY291bnR5XCI6XCLpq5jmuK/ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjEyMDNcIixcInN5c19uYW1lXCI6XCLms7Dlt57luIJf6auY5riv5Yy6X+mihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTJcIixcImNpdHlcIjpcIuazsOW3nuW4glwiLFwiY291bnR5XCI6XCLlp5zloLDljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjEyMDRcIixcInN5c19uYW1lXCI6XCLms7Dlt57luIJf5aec5aCw5Yy6X+mDqOmXqOmihOeul+ezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkJNWVNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTJcIixcImNpdHlcIjpcIuazsOW3nuW4glwiLFwiY291bnR5XCI6XCLlp5zloLDljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjEyMDRcIixcInN5c19uYW1lXCI6XCLms7Dlt57luIJf5aec5aCw5Yy6X+i0ouaUv+S4gOS9k+WMluezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllUSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMlwiLFwiY2l0eVwiOlwi5rOw5bee5biCXCIsXCJjb3VudHlcIjpcIuWnnOWgsOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTIwNFwiLFwic3lzX25hbWVcIjpcIuazsOW3nuW4gl/lp5zloLDljLpf6Z2e56iO5pS257y057O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMlwiLFwiY2l0eVwiOlwi5rOw5bee5biCXCIsXCJjb3VudHlcIjpcIuWnnOWgsOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTIwNFwiLFwic3lzX25hbWVcIjpcIuazsOW3nuW4gl/lp5zloLDljLpf6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMlwiLFwiY2l0eVwiOlwi5rOw5bee5biCXCIsXCJjb3VudHlcIjpcIuWMu+iNr+mrmOaWsOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTIwNVwiLFwic3lzX25hbWVcIjpcIuazsOW3nuW4gl/ljLvoja/pq5jmlrDljLpf6LSi5pS/5LiA5L2T5YyW57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi5YW05YyW5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjgxXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+WFtOWMluW4gl/pg6jpl6jpooTnrpdcIixcInN5c19jb2RlXCI6XCJCTVlTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi5YW05YyW5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjgxXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+WFtOWMluW4gl/pnZ7nqI7mlLbnvLRcIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi5YW05YyW5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjgxXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+WFtOWMluW4gl/lm73lupPpm4bkuK3mlK/ku5hcIixcInN5c19jb2RlXCI6XCJHS1pGXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi6Z2W5rGf5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjgyXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+mdluaxn+W4gl/pooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi6Z2W5rGf5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjgyXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+mdluaxn+W4gl/pnZ7nqI7mlLblhaXmlLbnvLRcIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi6Z2W5rGf5biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjgyXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+mdluaxn+W4gl/pg6jpl6jpooTnrpfnvJblrqHns7vnu59cIixcInN5c19jb2RlXCI6XCJCTVlTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi5rOw5YW05biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjgzXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+azsOWFtOW4gl/pg6jpl6jpooTnrpfns7vnu59cIixcInN5c19jb2RlXCI6XCJCTVlTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi5rOw5YW05biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjgzXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+azsOWFtOW4gl/pnZ7nqI7mlLblhaXnrqHnkIbns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEyXCIsXCJjaXR5XCI6XCLms7Dlt57luIJcIixcImNvdW50eVwiOlwi5rOw5YW05biCXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMjgzXCIsXCJzeXNfbmFtZVwiOlwi5rOw5bee5biCX+azsOWFtOW4gl/pooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJCTVlTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEzXCIsXCJjaXR5XCI6XCLlrr/ov4HluIJcIixcImNvdW50eVwiOlwi5biC5pys57qnXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMzAwXCIsXCJzeXNfbmFtZVwiOlwi6YOo6Zeo6aKE566X566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiQk1ZU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxM1wiLFwiY2l0eVwiOlwi5a6/6L+B5biCXCIsXCJjb3VudHlcIjpcIuW4guacrOe6p1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMTMwMFwiLFwic3lzX25hbWVcIjpcIumdnueojuaUtuWFpeeuoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTNcIixcImNpdHlcIjpcIuWuv+i/geW4glwiLFwiY291bnR5XCI6XCLluILmnKznuqdcIixcImNvdW50eV9jb2RlXCI6XCIzMjEzMDBcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEzXCIsXCJjaXR5XCI6XCLlrr/ov4HluIJcIixcImNvdW50eVwiOlwi5a6/5Z+O5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMzAyXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW5bmz5Y+w5Y+K5Zu95bqT6ZuG5Lit5pSv5LuY57O757ufXCIsXCJzeXNfY29kZVwiOlwiR0taRlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxM1wiLFwiY2l0eVwiOlwi5a6/6L+B5biCXCIsXCJjb3VudHlcIjpcIuWuv+WfjuWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTMwMlwiLFwic3lzX25hbWVcIjpcIuaWsOS4reWkp+mdnueojuaUtuWFpeeuoeeQhlwiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTNcIixcImNpdHlcIjpcIuWuv+i/geW4glwiLFwiY291bnR5XCI6XCLlrr/ln47ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjEzMDJcIixcInN5c19uYW1lXCI6XCLmgLvpooTnrpfkvJrorqHmoLjnrpfns7vnu59cIixcInN5c19jb2RlXCI6XCJLSkhTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEzXCIsXCJjaXR5XCI6XCLlrr/ov4HluIJcIixcImNvdW50eVwiOlwi5a6/6LGr5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMzExXCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS257y0566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxM1wiLFwiY2l0eVwiOlwi5a6/6L+B5biCXCIsXCJjb3VudHlcIjpcIuWuv+ixq+WMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTMxMVwiLFwic3lzX25hbWVcIjpcIuiBlOWPi+i0ouWKoeeuoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkNXR0xcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTNcIixcImNpdHlcIjpcIuWuv+i/geW4glwiLFwiY291bnR5XCI6XCLlrr/osavljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjEzMTFcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEzXCIsXCJjaXR5XCI6XCLlrr/ov4HluIJcIixcImNvdW50eVwiOlwi5rKt6Ziz5Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMzIyXCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxM1wiLFwiY2l0eVwiOlwi5a6/6L+B5biCXCIsXCJjb3VudHlcIjpcIuayremYs+WOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMTMyMlwiLFwic3lzX25hbWVcIjpcIuWbveW6k+mbhuS4reaUr+S7mOOAgeaMh+agh+euoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTNcIixcImNpdHlcIjpcIuWuv+i/geW4glwiLFwiY291bnR5XCI6XCLmsq3pmLPljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjEzMjJcIixcInN5c19uYW1lXCI6XCLlvIDlj5HljLrmgLvpooTnrpfns7vnu59cIixcInN5c19jb2RlXCI6XCJCTVlTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEzXCIsXCJjaXR5XCI6XCLlrr/ov4HluIJcIixcImNvdW50eVwiOlwi5rKt6Ziz5Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMzIyXCIsXCJzeXNfbmFtZVwiOlwi5oC76aKE566X5Lya6K6h5qC4566XXCIsXCJzeXNfY29kZVwiOlwiS0pIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxM1wiLFwiY2l0eVwiOlwi5a6/6L+B5biCXCIsXCJjb3VudHlcIjpcIuazl+mYs+WOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMTMyM1wiLFwic3lzX25hbWVcIjpcIumihOeul+aJp+ihjFwiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTNcIixcImNpdHlcIjpcIuWuv+i/geW4glwiLFwiY291bnR5XCI6XCLms5fmtKrljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjEzMjRcIixcInN5c19uYW1lXCI6XCLpg6jpl6jpooTnrpfns7vnu59cIixcInN5c19jb2RlXCI6XCJCTVlTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEzXCIsXCJjaXR5XCI6XCLlrr/ov4HluIJcIixcImNvdW50eVwiOlwi5rOX5rSq5Y6/XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMzI0XCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl566h55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxM1wiLFwiY2l0eVwiOlwi5a6/6L+B5biCXCIsXCJjb3VudHlcIjpcIuazl+a0quWOv1wiLFwiY291bnR5X2NvZGVcIjpcIjMyMTMyNFwiLFwic3lzX25hbWVcIjpcIuWbveW6k+mbhuS4reaUr+S7mOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkdLWkZcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTNcIixcImNpdHlcIjpcIuWuv+i/geW4glwiLFwiY291bnR5XCI6XCLms5fmtKrljr9cIixcImNvdW50eV9jb2RlXCI6XCIzMjEzMjRcIixcInN5c19uYW1lXCI6XCLlm73lupPotKbliqHns7vnu59cIixcInN5c19jb2RlXCI6XCJLSkhTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi6auY5paw5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTAwR1hRXCIsXCJzeXNfbmFtZVwiOlwi6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwMVwiLFwiY2l0eVwiOlwi5Y2X5Lqs5biCXCIsXCJjb3VudHlcIjpcIuWMluW3peWbreWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDEwMEhHWVwiLFwic3lzX25hbWVcIjpcIuWMluWtpuW3peS4muWbreWMuumdnueojuaUtuWFpeeuoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDFcIixcImNpdHlcIjpcIuWNl+S6rOW4glwiLFwiY291bnR5XCI6XCLnu4/mtY7mioDmnK/lvIDlj5HljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAxMDBKS1FcIixcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLblhaXotKblpZdcIixcInN5c19jb2RlXCI6XCJGU1pUXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi5YyW5bel5Zut5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTAxSEdZXCIsXCJzeXNfbmFtZVwiOlwi5YyW5a2m5bel5Lia5Zut5Yy66aKE566X5omn6KGM57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwMVwiLFwiY2l0eVwiOlwi5Y2X5Lqs5biCXCIsXCJjb3VudHlcIjpcIue7j+a1juaKgOacr+W8gOWPkeWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDEwMUpLUVwiLFwic3lzX25hbWVcIjpcIumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDFcIixcImNpdHlcIjpcIuWNl+S6rOW4glwiLFwiY291bnR5XCI6XCLljJblt6Xlm63ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAxMDJIR1lcIixcInN5c19uYW1lXCI6XCLkvJrorqHmoLjnrpdcIixcInN5c19jb2RlXCI6XCJLWUhTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAxXCIsXCJjaXR5XCI6XCLljZfkuqzluIJcIixcImNvdW50eVwiOlwi57uP5rWO5oqA5pyv5byA5Y+R5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMTAySktRXCIsXCJzeXNfbmFtZVwiOlwi5oC76aKE566X5Lya6K6h6LSmXCIsXCJzeXNfY29kZVwiOlwiS0pIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwMlwiLFwiY2l0eVwiOlwi5peg6ZSh5biCXCIsXCJjb3VudHlcIjpcIumUoeWxseW8gOWPkeWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDIwNUtGUVwiLFwic3lzX25hbWVcIjpcIumihOeul+WGheWkluaUtuaUr+aguOeul+ezu+e7n1wiLFwic3lzX2NvZGVcIjpcIktKSFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDJcIixcImNpdHlcIjpcIuaXoOmUoeW4glwiLFwiY291bnR5XCI6XCLmu6jmuZbljLrpqazlsbHlvIDlj5HljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAyMTFLRlFcIixcInN5c19uYW1lXCI6XCLotKbmiLfmoLjnrpfns7vnu59cIixcInN5c19jb2RlXCI6XCJaSEhTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAyXCIsXCJjaXR5XCI6XCLml6DplKHluIJcIixcImNvdW50eVwiOlwi5rGf6Zi05byA5Y+R5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMjgxa2ZxXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5LiA5L2T5YyW5bmz5Y+wXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAyXCIsXCJjaXR5XCI6XCLml6DplKHluIJcIixcImNvdW50eVwiOlwi5rGf6Zi05byA5Y+R5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMjgxa2ZxXCIsXCJzeXNfbmFtZVwiOlwi6LSm5oi35qC4566X57O757ufXCIsXCJzeXNfY29kZVwiOlwiWkhIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwMlwiLFwiY2l0eVwiOlwi5peg6ZSh5biCXCIsXCJjb3VudHlcIjpcIuWunOWFtOeOr+enkeWbrVwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDI4MktGUVwiLFwic3lzX25hbWVcIjpcIui0ouWKoeaguOeul+ezu+e7n1wiLFwic3lzX2NvZGVcIjpcIlpISFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDJcIixcImNpdHlcIjpcIuaXoOmUoeW4glwiLFwiY291bnR5XCI6XCLlrpzlhbTlvIDlj5HljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjAyODJLRlFcIixcInN5c19uYW1lXCI6XCLmgLvpooTnrpfmoLjnrpfns7vnu59cIixcInN5c19jb2RlXCI6XCJaSEhTXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAzXCIsXCJjaXR5XCI6XCLlvpDlt57luIJcIixcImNvdW50eVwiOlwi57uP5rWO5oqA5pyv5byA5Y+R5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMzAwSktRXCIsXCJzeXNfbmFtZVwiOlwi5a+M5rex5Y2P6YCa6LSi5pS/5LiA5L2T5YyW5Lia5Yqh566h55CG57O757uf6L2v5Lu2XCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjAzXCIsXCJjaXR5XCI6XCLlvpDlt57luIJcIixcImNvdW50eVwiOlwi57uP5rWO5oqA5pyv5byA5Y+R5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwMzAwSktRXCIsXCJzeXNfbmFtZVwiOlwi6LSm5Yqh5aSE55CG57O757uf77yI5pS25pSv5YiG57G75pS56Z2p5Y2H57qn54mI77yJXCIsXCJzeXNfY29kZVwiOlwiS0pIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNFwiLFwiY2l0eVwiOlwi5bi45bee5biCXCIsXCJjb3VudHlcIjpcIuWkqeWugee7j+W8gOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDQwMkpLUVwiLFwic3lzX25hbWVcIjpcIui0puWKoeWkhOeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIktKSFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDRcIixcImNpdHlcIjpcIuW4uOW3nuW4glwiLFwiY291bnR5XCI6XCLpkp/mpbzljLrlvIDlj5HljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA0MDRLRlFcIixcInN5c19uYW1lXCI6XCLlm73lupPpm4bkuK3mlK/ku5jns7vnu59cIixcInN5c19jb2RlXCI6XCJHS1pGXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA0XCIsXCJjaXR5XCI6XCLluLjlt57luIJcIixcImNvdW50eVwiOlwi6ZKf5qW85Yy65byA5Y+R5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNDA1S0ZRXCIsXCJzeXNfbmFtZVwiOlwi55So5qy+6K6h5YiS57O757ufXCIsXCJzeXNfY29kZVwiOlwiSkhHTFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNFwiLFwiY2l0eVwiOlwi5bi45bee5biCXCIsXCJjb3VudHlcIjpcIumSn+alvOWMuuW8gOWPkeWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDQwNktGUVwiLFwic3lzX25hbWVcIjpcIuaMh+agh+euoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIlpCR0xcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDRcIixcImNpdHlcIjpcIuW4uOW3nuW4glwiLFwiY291bnR5XCI6XCLpkp/mpbzljLrlvIDlj5HljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA0MDdLRlFcIixcInN5c19uYW1lXCI6XCLmgLvpooTnrpfns7vnu59cIixcInN5c19jb2RlXCI6XCJaWVNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDRcIixcImNpdHlcIjpcIuW4uOW3nuW4glwiLFwiY291bnR5XCI6XCLnu4/lvIDljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA0MTJKS1FcIixcInN5c19uYW1lXCI6XCLotKLmlL/pooTnrpflpJbkuJrliqFcIixcInN5c19jb2RlXCI6XCJZU1dcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDRcIixcImNpdHlcIjpcIuW4uOW3nuW4glwiLFwiY291bnR5XCI6XCLnu4/lvIDljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA0MTJKS1FcIixcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLbnvLTns7vnu59cIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA0XCIsXCJjaXR5XCI6XCLluLjlt57luIJcIixcImNvdW50eVwiOlwi57uP5byA5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNDEySktRXCIsXCJzeXNfbmFtZVwiOlwi6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNFwiLFwiY2l0eVwiOlwi5bi45bee5biCXCIsXCJjb3VudHlcIjpcIuatpui/m+mrmOaWsOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDQxM0dYUVwiLFwic3lzX25hbWVcIjpcIui0ouaUv+S4gOS9k+WMlueuoeeQhuS/oeaBr+ezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllUSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNFwiLFwiY2l0eVwiOlwi5bi45bee5biCXCIsXCJjb3VudHlcIjpcIua6p+mYs+S4reWFs+adkVwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDQ4MVpHQ1wiLFwic3lzX25hbWVcIjpcIueUqOWPi1U4UjEw6LSi5pS/5LiA5L2T5YyW5bmz5Y+wXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA0XCIsXCJjaXR5XCI6XCLluLjlt57luIJcIixcImNvdW50eVwiOlwi5rqn6Ziz5Lit5YWz5p2R5byA5Y+R5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNDgxWkdDS0ZcIixcInN5c19uYW1lXCI6XCLnlKjlj4tVOFIxMOi0ouaUv+S4gOS9k+WMluW5s+WPsFwiLFwic3lzX2NvZGVcIjpcIllUSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuebuOWfjuWMuuW8gOWPkeWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDUwN0tGUVwiLFwic3lzX25hbWVcIjpcIuW8gOWPkeWMuui0ouaUv+ezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllUSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuW4uOeGn+W4gumrmOaWsOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDU4MUdYUVwiLFwic3lzX25hbWVcIjpcIumrmOaWsOWMuuaAu+mihOeul+ezu+e7n1wiLFwic3lzX2NvZGVcIjpcIlpZU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuaYhuWxseW4guW8gOWPkeWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDU4M0tGUVwiLFwic3lzX25hbWVcIjpcIuW8gOWPkeWMuuWFrOWFsei0ouaUv+acjeWKoeW5s+WPsFwiLFwic3lzX2NvZGVcIjpcIllUSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuWkquS7k+W4guaWsOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDU4NVhRXCIsXCJzeXNfbmFtZVwiOlwi6Z2e56iO5pS25YWl57O757ufXCIsXCJzeXNfY29kZVwiOlwiRlNTUlwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuWkquS7k+W4guaWsOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDU4NlhRXCIsXCJzeXNfbmFtZVwiOlwi5Lya6K6h5qC4566X57O757ufXCIsXCJzeXNfY29kZVwiOlwiS0pIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNVwiLFwiY2l0eVwiOlwi6IuP5bee5biCXCIsXCJjb3VudHlcIjpcIuWkquS7k+W4guaWsOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDU4N1hRXCIsXCJzeXNfbmFtZVwiOlwi6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwNlwiLFwiY2l0eVwiOlwi5Y2X6YCa5biCXCIsXCJjb3VudHlcIjpcIuW8gOWPkeWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDYwMEtGUVwiLFwic3lzX25hbWVcIjpcIumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDZcIixcImNpdHlcIjpcIuWNl+mAmuW4glwiLFwiY291bnR5XCI6XCLoi4/pgJrlm63ljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA2MDBTVFlcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA2XCIsXCJjaXR5XCI6XCLljZfpgJrluIJcIixcImNvdW50eVwiOlwi6YCa5bee5rm+56S66IyD5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwNjAwVFpXXCIsXCJzeXNfbmFtZVwiOlwi6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIwN1wiLFwiY2l0eVwiOlwi6L+e5LqR5riv5biCXCIsXCJjb3VudHlcIjpcIuW8gOWPkeWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMDcwMUtGUVwiLFwic3lzX25hbWVcIjpcIumdnueojuaUtuWFpVwiLFwic3lzX2NvZGVcIjpcIkZTU1JcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDhcIixcImNpdHlcIjpcIua3ruWuieW4glwiLFwiY291bnR5XCI6XCLlvIDlj5HljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA4MDBLRlFcIixcInN5c19uYW1lXCI6XCLnlKjlj4tHUlAtVTjnrqHnkIbova/ku7ZcIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMDlcIixcImNpdHlcIjpcIuebkOWfjuW4glwiLFwiY291bnR5XCI6XCLln47ljZfmlrDljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjA5MDBDWlhRXCIsXCJzeXNfbmFtZVwiOlwi55uQ5Z+O5biCX+WfjuWNl+aWsOWMul/lm73lupPpm4bkuK3mlK/ku5jns7vnu59cIixcInN5c19jb2RlXCI6XCJHS1pGXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjA5XCIsXCJjaXR5XCI6XCLnm5Dln47luIJcIixcImNvdW50eVwiOlwi5Z+O5Y2X5paw5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIwOTAxQ1pYUVwiLFwic3lzX25hbWVcIjpcIuebkOWfjuW4gl/ln47ljZfmlrDljLpf5oC76aKE566X6LSm5Yqh5aSE55CG57O757ufXCIsXCJzeXNfY29kZVwiOlwiS0pIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMFwiLFwiY2l0eVwiOlwi5oms5bee5biCXCIsXCJjb3VudHlcIjpcIuWMluW3peWbreWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTAwMEhHWVwiLFwic3lzX25hbWVcIjpcIumihOeul+aJp+ihjOezu+e7n1wiLFwic3lzX2NvZGVcIjpcIllTWlhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTBcIixcImNpdHlcIjpcIuaJrOW3nuW4glwiLFwiY291bnR5XCI6XCLlvIDlj5HljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjEwMDBLRlFcIixcInN5c19uYW1lXCI6XCLpnZ7nqI7mlLblhaXmlLbnvLRcIixcInN5c19jb2RlXCI6XCJGU1NSXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEwXCIsXCJjaXR5XCI6XCLmiazlt57luIJcIixcImNvdW50eVwiOlwi56eR5oqA5paw5Z+OXCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMDAwS0pDXCIsXCJzeXNfbmFtZVwiOlwi6aKE566X5omn6KGM57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVNaWFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxMFwiLFwiY2l0eVwiOlwi5oms5bee5biCXCIsXCJjb3VudHlcIjpcIuicgOWGiC3nmKbopb/muZbpo47mma/lkI3og5zljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjEwMDBTWEhcIixcInN5c19uYW1lXCI6XCLotKLmlL/pooTnrpfmjIfmoIfnrqHnkIZcIixcInN5c19jb2RlXCI6XCJaQkdMXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEwXCIsXCJjaXR5XCI6XCLmiazlt57luIJcIixcImNvdW50eVwiOlwi6JyA5YaILeeYpuilv+a5lumjjuaZr+WQjeiDnOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTAwMFNYSFwiLFwic3lzX25hbWVcIjpcIuaAu+mihOeul+S8muiuoeaguOeul1wiLFwic3lzX2NvZGVcIjpcIktKSFNcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTBcIixcImNpdHlcIjpcIuaJrOW3nuW4glwiLFwiY291bnR5XCI6XCLlvIDlj5HljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjEwMDFLRlFcIixcInN5c19uYW1lXCI6XCLkuIDkvZPljJbns7vnu59cIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTBcIixcImNpdHlcIjpcIuaJrOW3nuW4glwiLFwiY291bnR5XCI6XCLlvIDlj5HljLpcIixcImNvdW50eV9jb2RlXCI6XCIzMjEwMDJLRlFcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEwXCIsXCJjaXR5XCI6XCLmiazlt57luIJcIixcImNvdW50eVwiOlwi6auY6YKu5byA5Y+R5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMDg0S0ZRXCIsXCJzeXNfbmFtZVwiOlwi6LSi5pS/5Lia5Yqh57O757ufXCIsXCJzeXNfY29kZVwiOlwiWVRIXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjExXCIsXCJjaXR5XCI6XCLplYfmsZ/luIJcIixcImNvdW50eVwiOlwi5paw5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMTAwWFFcIixcInN5c19uYW1lXCI6XCLotKLmlL/kuIDkvZPljJZcIixcInN5c19jb2RlXCI6XCJZVEhcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTJcIixcImNpdHlcIjpcIuazsOW3nuW4glwiLFwiY291bnR5XCI6XCLluILmnKznuqdcIixcImNvdW50eV9jb2RlXCI6XCIzMjEyMDBcIixcInN5c19uYW1lXCI6XCLms7Dlt57luIJf5biC5pys57qnX+ihjOaUv+euoeeQhuezu+e7n1wiLFwic3lzX2NvZGVcIjpcIlhaR0xcIn0sXHJcblx0XHR7XCJjaXR5X2NvZGVcIjpcIjMyMTNcIixcImNpdHlcIjpcIuWuv+i/geW4glwiLFwiY291bnR5XCI6XCLmuZbmu6jmlrDln45cIixcImNvdW50eV9jb2RlXCI6XCIzMjEzMDBIQlhDXCIsXCJzeXNfbmFtZVwiOlwi5paw5Lit5aSn6LSi5Yqh6L2v5Lu2XCIsXCJzeXNfY29kZVwiOlwiS0pIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxM1wiLFwiY2l0eVwiOlwi5a6/6L+B5biCXCIsXCJjb3VudHlcIjpcIue7j+W8gOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTMwMEpLUVwiLFwic3lzX25hbWVcIjpcIuaWsOS4reWkp+WFrOWFsei0ouaUv+euoeeQhui9r+S7tlwiLFwic3lzX2NvZGVcIjpcIllUSFwifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxM1wiLFwiY2l0eVwiOlwi5a6/6L+B5biCXCIsXCJjb3VudHlcIjpcIua0i+ays+aWsOWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTMwMFlIWFFcIixcInN5c19uYW1lXCI6XCLpooTnrpfmiafooYzns7vnu59cIixcInN5c19jb2RlXCI6XCJZU1pYXCJ9LFxyXG5cdFx0e1wiY2l0eV9jb2RlXCI6XCIzMjEzXCIsXCJjaXR5XCI6XCLlrr/ov4HluIJcIixcImNvdW50eVwiOlwi5a6/6LGr5Yy65byA5Y+R5Yy6XCIsXCJjb3VudHlfY29kZVwiOlwiMzIxMzExS0ZRXCIsXCJzeXNfbmFtZVwiOlwi5byA5Y+R5Yy65paw5Lit5aSn6LSi5Yqh5qC4566X57O757ufXCIsXCJzeXNfY29kZVwiOlwiS0pIU1wifSxcclxuXHRcdHtcImNpdHlfY29kZVwiOlwiMzIxM1wiLFwiY2l0eVwiOlwi5a6/6L+B5biCXCIsXCJjb3VudHlcIjpcIuazl+a0quWOv+W8gOWPkeWMulwiLFwiY291bnR5X2NvZGVcIjpcIjMyMTMyNEtGUVwiLFwic3lzX25hbWVcIjpcIuW8gOWPkeWMuui0puWKoeezu+e7n1wiLFwic3lzX2NvZGVcIjpcIktKSFNcIn1dO1xyXG5cclxuXHJcblxyXG5cclxuXHRleHBvcnQgZnVuY3Rpb24gZ2V0Q291bnR5QnlDb2RlKGNvZGUpe1xyXG5cdFx0Ly92YXIganNvYmogPSBKU09OLnBhcnNlKG9yaWdpbl9wbGFjZV9hcnIpO1xyXG5cdFx0dmFyIGpzb2JqID0gb3JpZ2luX3BsYWNlX2FycjtcclxuXHJcblx0XHR2YXIganNvbmxlbmd0aCA9IGpzb2JqLmxlbmd0aDtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwganNvbmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmKGpzb2JqW2ldLmNvdW50eV9jb2RlID09IGNvZGUpe1xyXG5cdFx0XHRcdHJldHVybiBqc29ialtpXS5jaXR5K2pzb2JqW2ldLmNvdW50eTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGNvZGU7XHJcblx0fVxyXG5cclxuXHRleHBvcnQgZnVuY3Rpb24gZ2V0Q29kZUJ5Q291bnR5KHBsYWNlKXtcclxuXHRcdHBsYWNlID0gcGxhY2UucmVwbGFjZSgvXFxzKlxcdCovZ2ltLFwiXCIpO1xyXG5cdFx0Ly92YXIganNvYmogPSBKU09OLnBhcnNlKG9yaWdpbl9wbGFjZV9hcnIpO1xyXG5cdFx0dmFyIGpzb2JqID0gb3JpZ2luX3BsYWNlX2FycjtcclxuXHJcblx0XHR2YXIganNvbmxlbmd0aCA9IGpzb2JqLmxlbmd0aDtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwganNvbmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmKGpzb2JqW2ldLmNpdHkgPT09IFwiXCIgfHwganNvYmpbaV0uY2l0eSA9PSB1bmRlZmluZWQpXHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdGlmKGpzb2JqW2ldLmNvdW50eSA9PT0gXCJcIiB8fCBqc29ialtpXS5jb3VudHkgPT0gdW5kZWZpbmVkKVxyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRpZigocGxhY2UuaW5kZXhPZihqc29ialtpXS5jaXR5KSAhPSAtMSkgJiYgKHBsYWNlLmluZGV4T2YoanNvYmpbaV0uY291bnR5KSAhPSAtMSkpe1xyXG5cdFx0XHRcdHJldHVybiBqc29ialtpXS5jb3VudHlfY29kZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHBsYWNlO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0IGZ1bmN0aW9uIGdldFN5c3RlbU5hbWVCeUlkKGlkKXtcclxuXHRcdHZhciB0ZW1Kc29uID0gc3lzdGVtX2FycjtcclxuXHRcdHZhciBzeXNfc2l6ZSA9IHRlbUpzb24ubGVuZ3RoO1xyXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeXNfc2l6ZTsgaSsrKSB7XHJcblx0XHRcdGlmKHRlbUpzb25baV0uc3lzX2lkID09IGlkKXtcclxuXHRcdFx0XHRyZXR1cm4gdGVtSnNvbltpXS5zeXNfbmFtZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGlkO1xyXG5cdH1cclxuXHJcblxyXG5cclxuXHRleHBvcnQgZnVuY3Rpb24gZ2V0SWRCeVN5c3RlbU5hbWUobmFtZSl7XHJcblx0XHR2YXIgdGVtSnNvbiA9IHN5c3RlbV9hcnI7XHJcblx0XHR2YXIgc3lzX3NpemUgPSB0ZW1Kc29uLmxlbmd0aDtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3lzX3NpemU7IGkrKykge1xyXG5cdFx0XHRpZih0ZW1Kc29uW2ldLnN5c19uYW1lID09IG5hbWUpe1xyXG5cdFx0XHRcdHJldHVybiB0ZW1Kc29uW2ldLnN5c19pZDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG5hbWU7XHJcblx0fVxyXG5cclxuXHRleHBvcnQgZnVuY3Rpb24gZ2V0Q29kZUJ5U3lzdGVtTmFtZShuYW1lKXtcclxuXHRcdHZhciBqc29iaiA9IG9yaWdpbl9wbGFjZV9hcnI7XHJcblxyXG5cdFx0dmFyIGpzb25sZW5ndGggPSBqc29iai5sZW5ndGg7XHJcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGpzb25sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRpZihqc29ialtpXS5zeXNfbmFtZSA9PSBuYW1lKXtcclxuXHRcdFx0XHRyZXR1cm4ganNvYmpbaV0uc3lzX2NvZGU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBuYW1lO1xyXG5cdH1cclxufVxyXG5cclxuXHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNJbnRlcmZhY2VzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwidXRpbEhlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9jb25maWdzL3RzL2N1c3RvbUFsZXJ0LnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwicmVhZFBsYWNlZGl2aXNpb24udHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9jb25maWdzL3RzL0NvbmZpZ3NIZWxwZXIudHNcIi8+XHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgZXhwb3J0IHZhciBjb250ZXh0ID0gJy9rdWJlcm5ldGVzJztcclxuICBleHBvcnQgdmFyIGhhc2ggPSAnIycgKyBjb250ZXh0O1xyXG4gIGV4cG9ydCB2YXIgZGVmYXVsdFJvdXRlID0gaGFzaCArICcvYXBwcyc7XHJcbiAgZXhwb3J0IHZhciBwbHVnaW5OYW1lID0gJ0t1YmVybmV0ZXMnO1xyXG4gIGV4cG9ydCB2YXIgcGx1Z2luUGF0aCA9ICdwbHVnaW5zL2t1YmVybmV0ZXMvJztcclxuICBleHBvcnQgdmFyIHRlbXBsYXRlUGF0aCA9IHBsdWdpblBhdGggKyAnaHRtbC8nO1xyXG4gIGV4cG9ydCB2YXIgbG9nOkxvZ2dpbmcuTG9nZ2VyID0gTG9nZ2VyLmdldChwbHVnaW5OYW1lKTtcclxuXHJcbiAgZXhwb3J0IHZhciBrZWVwUG9sbGluZ01vZGVsID0gdHJ1ZTtcclxuXHJcbiAgZXhwb3J0IHZhciBkZWZhdWx0SWNvblVybCA9IENvcmUudXJsKFwiL2ltZy9rdWJlcm5ldGVzLnN2Z1wiKTtcclxuICBleHBvcnQgdmFyIGhvc3RJY29uVXJsID0gQ29yZS51cmwoXCIvaW1nL2hvc3Quc3ZnXCIpO1xyXG5cclxuICAvLyB0aGlzIGdldHMgc2V0IGFzIGEgcHJlLWJvb3RzdHJhcCB0YXNrXHJcbiAgZXhwb3J0IHZhciBvc0NvbmZpZzpLdWJlcm5ldGVzQ29uZmlnID0gdW5kZWZpbmVkO1xyXG4gIGV4cG9ydCB2YXIgbWFzdGVyVXJsID0gXCJcIjtcclxuXHJcbiAgZXhwb3J0IHZhciBkZWZhdWx0QXBpVmVyc2lvbiA9IFwidjFcIjtcclxuICBleHBvcnQgdmFyIGRlZmF1bHRPU0FwaVZlcnNpb24gPSBcInYxXCI7XHJcbiAgZXhwb3J0IHZhciBsYWJlbEZpbHRlclRleHRTZXBhcmF0b3IgPSBcIixcIjtcclxuXHJcbiAgZXhwb3J0IHZhciBkZWZhdWx0TmFtZXNwYWNlID0gXCJkZWZhdWx0XCI7XHJcblxyXG4gIGV4cG9ydCB2YXIgYXBwU3VmZml4ID0gXCIuYXBwXCI7XHJcblxyXG4gIC8vIGt1YmVybmV0ZXMgc2VydmljZSBuYW1lc1xyXG4gIGV4cG9ydCB2YXIga2liYW5hU2VydmljZU5hbWUgPSBcImtpYmFuYVwiO1xyXG4gIGV4cG9ydCB2YXIgZmFicmljOEZvcmdlU2VydmljZU5hbWUgPSBcImZhYnJpYzgtZm9yZ2VcIjtcclxuICBleHBvcnQgdmFyIGdvZ3NTZXJ2aWNlTmFtZSA9IFwiZ29nc1wiO1xyXG4gIGV4cG9ydCB2YXIgamVua2luc1NlcnZpY2VOYW1lID0gXCJqZW5raW5zXCI7XHJcbiAgZXhwb3J0IHZhciBhcGltYW5TZXJ2aWNlTmFtZSA9ICdhcGltYW4nO1xyXG4gIGV4cG9ydCB2YXIgaXNPcGVuU2hpZnQgPSB0cnVlO1xyXG5cclxuICBleHBvcnQgdmFyIHNzaFNlY3JldERhdGFLZXlzID0gW1wic3NoLWtleVwiLCBcInNzaC1rZXkucHViXCJdO1xyXG4gIGV4cG9ydCB2YXIgaHR0cHNTZWNyZXREYXRhS2V5cyA9IFtcInVzZXJuYW1lXCIsIFwicGFzc3dvcmRcIl07XHJcblxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24ga3ViZXJuZXRlc05hbWVzcGFjZVBhdGgoKSB7XHJcbiAgICB2YXIgbnMgPSBjdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG4gICAgaWYgKG5zKSB7XHJcbiAgICAgIHJldHVybiBcIi9uYW1lc3BhY2VzL1wiICsgbnM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBhcGlQcmVmaXgoKSB7XHJcbiAgICB2YXIgcHJlZml4ID0gQ29yZS5wYXRoR2V0KG9zQ29uZmlnLCBbJ2FwaScsICdrOHMnLCAncHJlZml4J10pO1xyXG4gICAgaWYgKCFwcmVmaXgpIHtcclxuICAgICAgcHJlZml4ID0gJ2FwaSc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gQ29yZS50cmltTGVhZGluZyhwcmVmaXgsICcvJyk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gb3NBcGlQcmVmaXgoKSB7XHJcbiAgICB2YXIgcHJlZml4ID0gQ29yZS5wYXRoR2V0KG9zQ29uZmlnLCBbJ2FwaScsICdvcGVuc2hpZnQnLCAncHJlZml4J10pO1xyXG4gICAgaWYgKCFwcmVmaXgpIHtcclxuICAgICAgcHJlZml4ID0gJ29hcGknO1xyXG4gICAgfVxyXG4gICAgdmFyIGFuc3dlciA9IENvcmUudHJpbUxlYWRpbmcocHJlZml4LCAnLycpO1xyXG4gICAgaWYgKCFpc09wZW5TaGlmdCkge1xyXG4gICAgICByZXR1cm4gVXJsSGVscGVycy5qb2luKGFwaVByZWZpeCgpLCBkZWZhdWx0T1NBcGlWZXJzaW9uLCBcInByb3h5XCIsIGt1YmVybmV0ZXNOYW1lc3BhY2VQYXRoKCksIFwic2VydmljZXMvdGVtcGxhdGVzXCIsIGFuc3dlcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYW5zd2VyO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIG1hc3RlckFwaVVybCgpIHtcclxuICAgIHJldHVybiBtYXN0ZXJVcmwgfHwgXCJcIjtcclxuICB9XHJcblxyXG4gIC8qKiBXQVJOSU5HIC0gdGhpcyBleGNsdWRlcyB0aGUgaG9zdCBuYW1lIC0geW91IHByb2JhYmx5IHdhbnQgdG8gdXNlOiBrdWJlcm5ldGVzQXBpVXJsKCkgaW5zdGVhZCEhICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGt1YmVybmV0ZXNBcGlQcmVmaXgoKSB7XHJcbiAgICByZXR1cm4gVXJsSGVscGVycy5qb2luKGFwaVByZWZpeCgpLCBkZWZhdWx0QXBpVmVyc2lvbik7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gb3BlbnNoaWZ0QXBpUHJlZml4KCkge1xyXG4gICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihvc0FwaVByZWZpeCgpLCBkZWZhdWx0T1NBcGlWZXJzaW9uKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBwcmVmaXhGb3JUeXBlKHR5cGU6c3RyaW5nKSB7XHJcbiAgICBpZiAodHlwZSA9PT0gV2F0Y2hUeXBlcy5OQU1FU1BBQ0VTKSB7XHJcbiAgICAgIHJldHVybiBrdWJlcm5ldGVzQXBpUHJlZml4KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoXy5hbnkoTmFtZXNwYWNlZFR5cGVzLms4c1R5cGVzLCAodCkgPT4gdCA9PT0gdHlwZSkpIHtcclxuICAgICAgcmV0dXJuIGt1YmVybmV0ZXNBcGlQcmVmaXgoKTtcclxuICAgIH1cclxuICAgIGlmIChfLmFueShOYW1lc3BhY2VkVHlwZXMub3NUeXBlcywgKHQpID0+IHQgPT09IHR5cGUpKSB7XHJcbiAgICAgIHJldHVybiBvcGVuc2hpZnRBcGlQcmVmaXgoKTtcclxuICAgIH1cclxuICAgIC8vIGxldHMgYXNzdW1lIGl0cyBhbiBPcGVuU2hpZnQgZXh0ZW5zaW9uIHR5cGVcclxuICAgIHJldHVybiBvcGVuc2hpZnRBcGlQcmVmaXgoKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBrdWJlcm5ldGVzQXBpVXJsKCkge1xyXG4gICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihtYXN0ZXJBcGlVcmwoKSwga3ViZXJuZXRlc0FwaVByZWZpeCgpKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBvcGVuc2hpZnRBcGlVcmwoKSB7XHJcbiAgICByZXR1cm4gVXJsSGVscGVycy5qb2luKG1hc3RlckFwaVVybCgpLCBvcGVuc2hpZnRBcGlQcmVmaXgoKSk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gcmVzb3VyY2VzVXJpRm9yS2luZCh0eXBlLCBucyA9IG51bGwpIHtcclxuICAgIGlmICghbnMpIHtcclxuICAgICAgbnMgPSBjdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihtYXN0ZXJBcGlVcmwoKSwgcHJlZml4Rm9yVHlwZSh0eXBlKSwgbmFtZXNwYWNlUGF0aEZvcktpbmQodHlwZSwgbnMpKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiB1cmlUZW1wbGF0ZUZvckt1YmVybmV0ZXNLaW5kKHR5cGUpIHtcclxuICAgIHZhciB1cmxUZW1wbGF0ZSA9ICcnO1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgV2F0Y2hUeXBlcy5OQU1FU1BBQ0VTOlxyXG4gICAgICBjYXNlIFwiTmFtZXNwYWNlc1wiOlxyXG4gICAgICAgIHVybFRlbXBsYXRlID0gVXJsSGVscGVycy5qb2luKCduYW1lc3BhY2VzJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgV2F0Y2hUeXBlcy5PQVVUSF9DTElFTlRTOlxyXG4gICAgICBjYXNlIFwiT0F1dGhDbGllbnRzXCI6XHJcbiAgICAgIGNhc2UgXCJPQXV0aENsaWVudFwiOlxyXG4gICAgICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4oJ29hdXRoY2xpZW50cycpO1xyXG4gICAgICBjYXNlIFdhdGNoVHlwZXMuUFJPSkVDVFM6XHJcbiAgICAgIGNhc2UgXCJQcm9qZWN0c1wiOlxyXG4gICAgICAgIHVybFRlbXBsYXRlID0gVXJsSGVscGVycy5qb2luKCdwcm9qZWN0cycpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHVybFRlbXBsYXRlID0gVXJsSGVscGVycy5qb2luKCduYW1lc3BhY2VzLzpuYW1lc3BhY2UnLCB0eXBlLCAnOmlkJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXJsVGVtcGxhdGU7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gbmFtZXNwYWNlUGF0aEZvcktpbmQodHlwZSwgbnMpIHtcclxuICAgIHZhciB1cmxUZW1wbGF0ZSA9ICcnO1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgV2F0Y2hUeXBlcy5OQU1FU1BBQ0VTOlxyXG4gICAgICBjYXNlIFwiTmFtZXNwYWNlc1wiOlxyXG4gICAgICBjYXNlIFwiTmFtZXNwYWNlXCI6XHJcbiAgICAgICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbignbmFtZXNwYWNlcycpO1xyXG4gICAgICBjYXNlIFdhdGNoVHlwZXMuTk9ERVM6XHJcbiAgICAgIGNhc2UgXCJOb2Rlc1wiOlxyXG4gICAgICBjYXNlIFwibm9kZVwiOlxyXG4gICAgICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4oJ25vZGVzJyk7XHJcbiAgICAgIGNhc2UgV2F0Y2hUeXBlcy5QUk9KRUNUUzpcclxuICAgICAgY2FzZSBcIlByb2plY3RzXCI6XHJcbiAgICAgIGNhc2UgXCJQcm9qZWN0XCI6XHJcbiAgICAgICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbigncHJvamVjdHMnKTtcclxuICAgICAgY2FzZSBXYXRjaFR5cGVzLk9BVVRIX0NMSUVOVFM6XHJcbiAgICAgIGNhc2UgXCJPQXV0aENsaWVudHNcIjpcclxuICAgICAgY2FzZSBcIk9BdXRoQ2xpZW50XCI6XHJcbiAgICAgICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbignb2F1dGhjbGllbnRzJyk7XHJcbiAgICAgIGNhc2UgV2F0Y2hUeXBlcy5QRVJTSVNURU5UX1ZPTFVNRVM6XHJcbiAgICAgIGNhc2UgXCJQZXJzaXN0ZW50Vm9sdW1lc1wiOlxyXG4gICAgICBjYXNlIFwiUGVyc2lzdGVudFZvbHVtZVwiOlxyXG4gICAgICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4oJ3BlcnNpc3RlbnR2b2x1bWVzJyk7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbignbmFtZXNwYWNlcycsIG5zLCB0eXBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhldmFsdWUgZnJvbSB0aGUgaW5qZWN0b3IgaWYgaXRzIGF2YWlsYWJsZSBvciBudWxsXHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGluamVjdDxUPihuYW1lKTpUIHtcclxuICAgIHZhciBpbmplY3RvciA9IEhhd3Rpb0NvcmUuaW5qZWN0b3I7XHJcbiAgICByZXR1cm4gaW5qZWN0b3IgPyBpbmplY3Rvci5nZXQ8VD4obmFtZSkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc291cmNlKHRoaW5nOnN0cmluZywgdXJsVGVtcGxhdGU6c3RyaW5nLCAkcmVzb3VyY2U6IG5nLnJlc291cmNlLklSZXNvdXJjZVNlcnZpY2UsIEt1YmVybmV0ZXNNb2RlbCkge1xyXG4gICAgdmFyIHByZWZpeCA9IHByZWZpeEZvclR5cGUodGhpbmcpO1xyXG4gICAgaWYgKCFwcmVmaXgpIHtcclxuICAgICAgbG9nLmRlYnVnKFwiSW52YWxpZCB0eXBlIGdpdmVuOiBcIiwgdGhpbmcpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgcGFyYW1zID0gPGFueT4ge1xyXG4gICAgICBuYW1lc3BhY2U6IGN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlXHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKHRoaW5nKSB7XHJcbiAgICAgIGNhc2UgV2F0Y2hUeXBlcy5OQU1FU1BBQ0VTOlxyXG4gICAgICBjYXNlIFdhdGNoVHlwZXMuT0FVVEhfQ0xJRU5UUzpcclxuICAgICAgY2FzZSBXYXRjaFR5cGVzLk5PREVTOlxyXG4gICAgICBjYXNlIFdhdGNoVHlwZXMuUFJPSkVDVFM6XHJcbiAgICAgIGNhc2UgV2F0Y2hUeXBlcy5PQVVUSF9DTElFTlRTOlxyXG4gICAgICBjYXNlIFdhdGNoVHlwZXMuUEVSU0lTVEVOVF9WT0xVTUVTOlxyXG4gICAgICBwYXJhbXMgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgdXJsID0gVXJsSGVscGVycy5qb2luKG1hc3RlckFwaVVybCgpLCBwcmVmaXgsIHVybFRlbXBsYXRlKTtcclxuICAgIGxvZy5kZWJ1ZyhcIlVybCBmb3IgXCIsIHRoaW5nLCBcIjogXCIsIHVybCk7XHJcbiAgICB2YXIgcmVzb3VyY2UgPSAkcmVzb3VyY2UodXJsLCBudWxsLCB7XHJcbiAgICAgIHF1ZXJ5OiB7IG1ldGhvZDogJ0dFVCcsIGlzQXJyYXk6IGZhbHNlLCBwYXJhbXM6IHBhcmFtc30sXHJcbiAgICAgIGNyZWF0ZTogeyBtZXRob2Q6ICdQT1NUJywgcGFyYW1zOiBwYXJhbXN9LFxyXG4gICAgICBzYXZlOiB7IG1ldGhvZDogJ1BVVCcsIHBhcmFtczogcGFyYW1zfSxcclxuICAgICAgZGVsZXRlOiB7IG1ldGhvZDogJ0RFTEVURScsIHBhcmFtczogXy5leHRlbmQoe1xyXG4gICAgICAgIGlkOiAnQGlkJ1xyXG4gICAgICB9LCBwYXJhbXMpfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzb3VyY2U7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gaW1hZ2VSZXBvc2l0b3JpZXNSZXN0VVJMKCkge1xyXG4gICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihvcGVuc2hpZnRBcGlVcmwoKSwga3ViZXJuZXRlc05hbWVzcGFjZVBhdGgoKSwgXCIvaW1hZ2VzdHJlYW1zXCIpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGRlcGxveW1lbnRDb25maWdzUmVzdFVSTCgpIHtcclxuICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4ob3BlbnNoaWZ0QXBpVXJsKCksIGt1YmVybmV0ZXNOYW1lc3BhY2VQYXRoKCksIFwiL2RlcGxveW1lbnRjb25maWdzXCIpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkc1Jlc3RVUkwoKSB7XHJcbiAgICByZXR1cm4gVXJsSGVscGVycy5qb2luKG9wZW5zaGlmdEFwaVVybCgpLCBrdWJlcm5ldGVzTmFtZXNwYWNlUGF0aCgpLCBcIi9idWlsZHNcIik7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gYnVpbGRDb25maWdIb29rc1Jlc3RVUkwoKSB7XHJcbiAgICByZXR1cm4gVXJsSGVscGVycy5qb2luKG9wZW5zaGlmdEFwaVVybCgpLCBrdWJlcm5ldGVzTmFtZXNwYWNlUGF0aCgpLCBcIi9idWlsZGNvbmZpZ2hvb2tzXCIpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29uZmlnc1Jlc3RVUkwoKSB7XHJcbiAgICByZXR1cm4gVXJsSGVscGVycy5qb2luKG9wZW5zaGlmdEFwaVVybCgpLCBrdWJlcm5ldGVzTmFtZXNwYWNlUGF0aCgpLCBcIi9idWlsZGNvbmZpZ3NcIik7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gcm91dGVzUmVzdFVSTCgpIHtcclxuICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4ob3BlbnNoaWZ0QXBpVXJsKCksIGt1YmVybmV0ZXNOYW1lc3BhY2VQYXRoKCksIFwiL3JvdXRlc1wiKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZXNSZXN0VVJMKCkge1xyXG4gICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihvcGVuc2hpZnRBcGlVcmwoKSwga3ViZXJuZXRlc05hbWVzcGFjZVBhdGgoKSwgXCIvdGVtcGxhdGVzXCIpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVzcGFjZShlbnRpdHkpIHtcclxuICAgIHZhciBhbnN3ZXIgPSBDb3JlLnBhdGhHZXQoZW50aXR5LCBbXCJtZXRhZGF0YVwiLCBcIm5hbWVzcGFjZVwiXSk7XHJcbiAgICByZXR1cm4gYW5zd2VyID8gYW5zd2VyIDogY3VycmVudEt1YmVybmV0ZXNOYW1lc3BhY2UoKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRMYWJlbHMoZW50aXR5KSB7XHJcbiAgICB2YXIgYW5zd2VyID0gQ29yZS5wYXRoR2V0KGVudGl0eSwgW1wibWV0YWRhdGFcIiwgXCJsYWJlbHNcIl0pO1xyXG4gICAgcmV0dXJuIGFuc3dlciA/IGFuc3dlciA6IHt9O1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWUoZW50aXR5KSB7XHJcbiAgICBpZiAoYW5ndWxhci5pc1N0cmluZyhlbnRpdHkpKSB7XHJcbiAgICAgIHJldHVybiBlbnRpdHk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gQ29yZS5wYXRoR2V0KGVudGl0eSwgW1wibWV0YWRhdGFcIiwgXCJuYW1lXCJdKSB8fCBDb3JlLnBhdGhHZXQoZW50aXR5LCBcIm5hbWVcIikgfHwgQ29yZS5wYXRoR2V0KGVudGl0eSwgXCJpZFwiKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRLaW5kKGVudGl0eSkge1xyXG4gICAgcmV0dXJuIENvcmUucGF0aEdldChlbnRpdHksIFtcIm1ldGFkYXRhXCIsIFwia2luZFwiXSkgfHwgQ29yZS5wYXRoR2V0KGVudGl0eSwgXCJraW5kXCIpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdG9yKGVudGl0eSkge1xyXG4gICAgcmV0dXJuIENvcmUucGF0aEdldChlbnRpdHksIFtcInNwZWNcIiwgXCJzZWxlY3RvclwiXSk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZ2V0SG9zdChwb2QpIHtcclxuICAgIHJldHVybiBDb3JlLnBhdGhHZXQocG9kLCBbXCJzcGVjXCIsIFwiaG9zdFwiXSkgfHwgQ29yZS5wYXRoR2V0KHBvZCwgW1wic3BlY1wiLCBcIm5vZGVOYW1lXCJdKSB8fCBDb3JlLnBhdGhHZXQocG9kLCBbXCJzdGF0dXNcIiwgXCJob3N0SVBcIl0pO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXR1cyhwb2QpIHtcclxuICAgIHJldHVybiBDb3JlLnBhdGhHZXQocG9kLCBbXCJzdGF0dXNcIiwgXCJwaGFzZVwiXSk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZ2V0UG9ydHMoc2VydmljZSkge1xyXG4gICAgcmV0dXJuIENvcmUucGF0aEdldChzZXJ2aWNlLCBbXCJzcGVjXCIsIFwicG9ydHNcIl0pO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0aW9uVGltZXN0YW1wKGVudGl0eSkge1xyXG4gICAgcmV0dXJuIENvcmUucGF0aEdldChlbnRpdHksIFtcIm1ldGFkYXRhXCIsIFwiY3JlYXRpb25UaW1lc3RhbXBcIl0pO1xyXG4gIH07XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRBbm5vdGF0aW9ucyhlbnRpdHkpe1xyXG4gICAgcmV0dXJuIENvcmUucGF0aEdldChlbnRpdHksW1wibWV0YWRhdGFcIixcImFubm90YXRpb25zXCJdKTtcclxuICB9XHJcblxyXG4gIC8vdmFyIGZhYnJpY0RvbWFpbiA9IEZhYnJpYy5qbXhEb21haW47XHJcbiAgdmFyIGZhYnJpY0RvbWFpbiA9IFwiaW8uZmFicmljOFwiO1xyXG4gIGV4cG9ydCB2YXIgbWJlYW4gPSBmYWJyaWNEb21haW4gKyBcIjp0eXBlPUt1YmVybmV0ZXNcIjtcclxuICBleHBvcnQgdmFyIG1hbmFnZXJNQmVhbiA9IGZhYnJpY0RvbWFpbiArIFwiOnR5cGU9S3ViZXJuZXRlc01hbmFnZXJcIjtcclxuICBleHBvcnQgdmFyIGFwcFZpZXdNQmVhbiA9IGZhYnJpY0RvbWFpbiArIFwiOnR5cGU9QXBwVmlld1wiO1xyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gaXNLdWJlcm5ldGVzKHdvcmtzcGFjZT8pIHtcclxuICAgIC8vIHJldHVybiB3b3Jrc3BhY2UudHJlZUNvbnRhaW5zRG9tYWluQW5kUHJvcGVydGllcyhmYWJyaWNEb21haW4sIHt0eXBlOiBcIkt1YmVybmV0ZXNcIn0pO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gaXNLdWJlcm5ldGVzVGVtcGxhdGVNYW5hZ2VyKHdvcmtzcGFjZT8pIHtcclxuICAgIC8vIHJldHVybiB3b3Jrc3BhY2UudHJlZUNvbnRhaW5zRG9tYWluQW5kUHJvcGVydGllcyhmYWJyaWNEb21haW4sIHt0eXBlOiBcIkt1YmVybmV0ZXNUZW1wbGF0ZU1hbmFnZXJcIn0pO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gaXNBcHBWaWV3KHdvcmtzcGFjZT8pIHtcclxuICAgIC8vIHJldHVybiB3b3Jrc3BhY2UudHJlZUNvbnRhaW5zRG9tYWluQW5kUHJvcGVydGllcyhmYWJyaWNEb21haW4sIHt0eXBlOiBcIkFwcFZpZXdcIn0pO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZ2V0U3RyaXBwZWRQYXRoTmFtZSgpOnN0cmluZyB7XHJcbiAgICB2YXIgcGF0aE5hbWUgPSBDb3JlLnRyaW1MZWFkaW5nKCh0aGlzLiRsb2NhdGlvbi5wYXRoKCkgfHwgJy8nKSwgXCIjXCIpO1xyXG4gICAgcGF0aE5hbWUgPSBwYXRoTmFtZS5yZXBsYWNlKC9eXFwvLywgJycpO1xyXG4gICAgcmV0dXJuIHBhdGhOYW1lO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGxpbmtDb250YWlucyguLi53b3JkczpTdHJpbmdbXSk6Ym9vbGVhbiB7XHJcbiAgICB2YXIgcGF0aE5hbWUgPSB0aGlzLmdldFN0cmlwcGVkUGF0aE5hbWUoKTtcclxuICAgIHJldHVybiBfLmV2ZXJ5KHdvcmRzLCAod29yZDpzdHJpbmcpID0+IHBhdGhOYW1lLmluZGV4T2Yod29yZCkgIT09IDApO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbGluayBpcyBhY3RpdmUuIFRoZSBsaW5rIGNhbiBvbWl0IHRoZSBsZWFkaW5nICMgb3IgLyBpZiBuZWNlc3NhcnkuXHJcbiAgICogVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgb2YgdGhlIFVSTCBhcmUgaWdub3JlZCBpbiB0aGUgY29tcGFyaXNvbi5cclxuICAgKiBAbWV0aG9kIGlzTGlua0FjdGl2ZVxyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBocmVmXHJcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbGluayBpcyBhY3RpdmVcclxuICAgKi9cclxuICBleHBvcnQgZnVuY3Rpb24gaXNMaW5rQWN0aXZlKGhyZWY6c3RyaW5nKTpib29sZWFuIHtcclxuICAgIC8vIGxldHMgdHJpbSB0aGUgbGVhZGluZyBzbGFzaFxyXG4gICAgdmFyIHBhdGhOYW1lID0gZ2V0U3RyaXBwZWRQYXRoTmFtZSgpO1xyXG5cclxuICAgIHZhciBsaW5rID0gQ29yZS50cmltTGVhZGluZyhocmVmLCBcIiNcIik7XHJcbiAgICBsaW5rID0gbGluay5yZXBsYWNlKC9eXFwvLywgJycpO1xyXG4gICAgLy8gc3RyaXAgYW55IHF1ZXJ5IGFyZ3VtZW50c1xyXG4gICAgdmFyIGlkeCA9IGxpbmsuaW5kZXhPZignPycpO1xyXG4gICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgIGxpbmsgPSBsaW5rLnN1YnN0cmluZygwLCBpZHgpO1xyXG4gICAgfVxyXG4gICAgaWYgKCFwYXRoTmFtZS5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGxpbmsgPT09IHBhdGhOYW1lO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIF8uc3RhcnRzV2l0aChwYXRoTmFtZSwgbGluayk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gc2V0SnNvbigkc2NvcGUsIGlkLCBjb2xsZWN0aW9uKSB7XHJcbiAgICAkc2NvcGUuaWQgPSBpZDtcclxuICAgIGlmICghJHNjb3BlLmZldGNoZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpZCkge1xyXG4gICAgICAkc2NvcGUuanNvbiA9ICcnO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIWNvbGxlY3Rpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIGl0ZW0gPSBjb2xsZWN0aW9uLmZpbmQoKGl0ZW0pID0+IHsgcmV0dXJuIGdldE5hbWUoaXRlbSkgPT09IGlkOyB9KTtcclxuICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICRzY29wZS5qc29uID0gYW5ndWxhci50b0pzb24oaXRlbSwgdHJ1ZSk7XHJcbiAgICAgICRzY29wZS5pdGVtID0gaXRlbTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICRzY29wZS5pZCA9IHVuZGVmaW5lZDtcclxuICAgICAgJHNjb3BlLmpzb24gPSAnJztcclxuICAgICAgJHNjb3BlLml0ZW0gPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBsYWJlbHMgdGV4dCBzdHJpbmcgdXNpbmcgdGhlIDxjb2RlPmtleTE9dmFsdWUxLGtleTI9dmFsdWUyLC4uLi48L2NvZGU+IGZvcm1hdFxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBsYWJlbHNUb1N0cmluZyhsYWJlbHMsIHNlcGVyYXRvclRleHQgPSBsYWJlbEZpbHRlclRleHRTZXBhcmF0b3IpIHtcclxuICAgIHZhciBhbnN3ZXIgPSBcIlwiO1xyXG4gICAgYW5ndWxhci5mb3JFYWNoKGxhYmVscywgKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgdmFyIHNlcGFyYXRvciA9IGFuc3dlciA/IHNlcGVyYXRvclRleHQgOiBcIlwiO1xyXG5cclxuICAgICAgYW5zd2VyICs9IHNlcGFyYXRvciArIGtleSArIFwiPVwiICsgdmFsdWU7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBhbnN3ZXI7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gbGFiZWxzRm9ybWF0KHJlcGxpY2FzKXsgICBcclxuICAgIHZhciBhbm5vdGlvbiA9IGdldEFubm90YXRpb25zKHJlcGxpY2FzKTtcclxuICAgIHZhciBsYWJsZXMgPSBnZXRMYWJlbHMocmVwbGljYXMpOyAgICBcclxuICAgIHZhciBoYXNDaGluZXNlVmVyc2lvbiA9IGxhYmxlc1tcInZlcnNpb25cIl0uaW5kZXhPZihcIueJiOacrFwiKSA9PSAtMSA/IFwi54mI5pysXCIgKyBsYWJsZXNbXCJ2ZXJzaW9uXCJdIDogbGFibGVzW1widmVyc2lvblwiXSA7ICAgXHJcbiAgICByZXR1cm57XHJcbiAgICAgIGlzRXh0cmFjdDogbGFibGVzW1wiaXNFeHRyYWN0XCJdLFxyXG4gICAgICBpc1RhcmdldDogbGFibGVzW1wiaXNUYXJnZXRcIl0sXHJcbiAgICAgIHN0YXR1czogbGFibGVzW1wic3RhdHVzXCJdLFxyXG4gICAgICBzdHlsZTogbGFibGVzW1wic3R5bGVcIl0sXHJcbiAgICAgIGNpdHlOYW1lOiBhbm5vdGlvbltcImNpdHlOYW1lXCJdLFxyXG4gICAgICBkaXN0cmljdE5hbWU6IGFubm90aW9uW1wiZGlzdHJpY3ROYW1lXCJdLFxyXG4gICAgICBzeXN0ZW1OYW1lOiBhbm5vdGlvbltcInN5c3RlbU5hbWVcIl0sXHJcbiAgICAgIHllYXI6IGFubm90aW9uW1wieWVhclwiXSxcclxuICAgICAgdmVyc2lvbjogaGFzQ2hpbmVzZVZlcnNpb25cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKSB7XHJcbiAgICAkc2NvcGUuYmFzZVVyaSA9IENvcmUudHJpbVRyYWlsaW5nKENvcmUudXJsKFwiL1wiKSB8fCBcIlwiLCBcIi9cIikgfHwgXCJcIjtcclxuXHJcbiAgICB2YXIgaW5qZWN0b3IgPSBIYXd0aW9Db3JlLmluamVjdG9yO1xyXG5cclxuICAgIGZ1bmN0aW9uIGhhc1NlcnZpY2UobmFtZSkge1xyXG4gICAgICBpZiAoaW5qZWN0b3IpIHtcclxuICAgICAgICB2YXIgU2VydmljZVJlZ2lzdHJ5ID0gaW5qZWN0b3IuZ2V0PGFueT4oXCJTZXJ2aWNlUmVnaXN0cnlcIik7XHJcbiAgICAgICAgaWYgKFNlcnZpY2VSZWdpc3RyeSkge1xyXG4gICAgICAgICAgcmV0dXJuIFNlcnZpY2VSZWdpc3RyeS5oYXNTZXJ2aWNlKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgJHNjb3BlLmhhc1NlcnZpY2VLaWJhbmEgPSAoKSA9PiBoYXNTZXJ2aWNlKGtpYmFuYVNlcnZpY2VOYW1lKTtcclxuICAgICRzY29wZS5oYXNTZXJ2aWNlR29ncyA9ICgpID0+IGhhc1NlcnZpY2UoZ29nc1NlcnZpY2VOYW1lKTtcclxuICAgICRzY29wZS5oYXNTZXJ2aWNlRm9yZ2UgPSAoKSA9PiBoYXNTZXJ2aWNlKGZhYnJpYzhGb3JnZVNlcnZpY2VOYW1lKTtcclxuICAgICRzY29wZS5oYXNTZXJ2aWNlQXBpbWFuID0gKCkgPT4gaGFzU2VydmljZShhcGltYW5TZXJ2aWNlTmFtZSk7XHJcblxyXG4gICAgJHNjb3BlLnZpZXdUZW1wbGF0ZXMgPSAoKSA9PiB7XHJcbiAgICAgIHZhciByZXR1cm5UbyA9ICRsb2NhdGlvbi51cmwoKTtcclxuICAgICAgJGxvY2F0aW9uLnBhdGgoJy9rdWJlcm5ldGVzL3RlbXBsYXRlcycpLnNlYXJjaCh7J3JldHVyblRvJzogcmV0dXJuVG99KTtcclxuICAgIH07XHJcblxyXG4gICAgJHNjb3BlLm5hbWVzcGFjZSA9ICRyb3V0ZVBhcmFtcy5uYW1lc3BhY2UgfHwgJHNjb3BlLm5hbWVzcGFjZSB8fCBLdWJlcm5ldGVzU3RhdGUuc2VsZWN0ZWROYW1lc3BhY2UgfHwgZGVmYXVsdE5hbWVzcGFjZTtcclxuICAgIGlmICgkc2NvcGUubmFtZXNwYWNlICE9IEt1YmVybmV0ZXNTdGF0ZS5zZWxlY3RlZE5hbWVzcGFjZSkge1xyXG4gICAgICBLdWJlcm5ldGVzU3RhdGUuc2VsZWN0ZWROYW1lc3BhY2UgPSAkc2NvcGUubmFtZXNwYWNlO1xyXG5cclxuICAgICAgLy8gbGV0cyBzaG93IHBhZ2UgaXMgZ29pbmcgdG8gcmVsb2FkXHJcbiAgICAgIGlmICgkc2NvcGUubW9kZWwpIHtcclxuICAgICAgICAkc2NvcGUubW9kZWwuZmV0Y2hlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBLdWJlcm5ldGVzLnNldEN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCRzY29wZS5uYW1lc3BhY2UpO1xyXG5cclxuICAgICRzY29wZS5mb3JnZUVuYWJsZWQgPSBpc0ZvcmdlRW5hYmxlZCgpO1xyXG5cclxuICAgICRzY29wZS5wcm9qZWN0SWQgPSAkcm91dGVQYXJhbXNbXCJwcm9qZWN0XCJdIHx8ICRzY29wZS5wcm9qZWN0SWQgfHwgJHNjb3BlLmlkO1xyXG4gICAgdmFyIHNob3dQcm9qZWN0TmF2QmFycyA9IGZhbHNlO1xyXG4gICAgaWYgKCRzY29wZS5wcm9qZWN0SWQgJiYgc2hvd1Byb2plY3ROYXZCYXJzKSB7XHJcbiAgICAgICRzY29wZS5icmVhZGNydW1iQ29uZmlnID0gRGV2ZWxvcGVyLmNyZWF0ZVByb2plY3RCcmVhZGNydW1icygkc2NvcGUucHJvamVjdElkKTtcclxuICAgICAgJHNjb3BlLnN1YlRhYkNvbmZpZyA9IERldmVsb3Blci5jcmVhdGVQcm9qZWN0U3ViTmF2QmFycygkc2NvcGUucHJvamVjdElkLCBudWxsLCAkc2NvcGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgJHNjb3BlLmJyZWFkY3J1bWJDb25maWcgPSBEZXZlbG9wZXIuY3JlYXRlRW52aXJvbm1lbnRCcmVhZGNydW1icygkc2NvcGUsICRsb2NhdGlvbiwgJHJvdXRlUGFyYW1zKTtcclxuICAgICAgJHNjb3BlLnN1YlRhYkNvbmZpZyA9IERldmVsb3Blci5jcmVhdGVFbnZpcm9ubWVudFN1Yk5hdkJhcnMoJHNjb3BlLCAkbG9jYXRpb24sICRyb3V0ZVBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCRzY29wZS5wcm9qZWN0SWQpIHtcclxuICAgICAgJHNjb3BlLiRwcm9qZWN0TGluayA9IERldmVsb3Blci5wcm9qZWN0TGluaygkc2NvcGUucHJvamVjdElkKTtcclxuICAgIH1cclxuXHJcbiAgICAkc2NvcGUubGluayA9IChocmVmKSA9PiB7XHJcbiAgICAgIGlmICghaHJlZikge1xyXG4gICAgICAgIHJldHVybiBocmVmO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICgkc2NvcGUuJHByb2plY3RMaW5rKSB7XHJcbiAgICAgICAgcmV0dXJuIERldmVsb3Blci5uYW1lc3BhY2VMaW5rKCRzY29wZSwgJHJvdXRlUGFyYW1zLCBocmVmLnJlcGxhY2UoL15cXC9rdWJlcm5ldGVzLywgJycpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gaHJlZjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgICRzY29wZS5jb2RlTWlycm9yT3B0aW9ucyA9IHtcclxuICAgICAgbGluZVdyYXBwaW5nIDogdHJ1ZSxcclxuICAgICAgbGluZU51bWJlcnM6IHRydWUsXHJcbiAgICAgIHJlYWRPbmx5OiAnbm9jdXJzb3InLFxyXG4gICAgICBtb2RlOiB7bmFtZTogXCJqYXZhc2NyaXB0XCIsIGpzb246IHRydWV9XHJcbiAgICB9O1xyXG5cclxuICAgICRzY29wZS5yZXNpemVEaWFsb2cgPSB7XHJcbiAgICAgIGNvbnRyb2xsZXI6IG51bGwsXHJcbiAgICAgIG5ld1JlcGxpY2FzOiAwLFxyXG4gICAgICBkaWFsb2c6IG5ldyBVSS5EaWFsb2coKSxcclxuICAgICAgb25PazogKCkgPT4ge1xyXG4gICAgICAgIHZhciByZXNpemVEaWFsb2cgPSAkc2NvcGUucmVzaXplRGlhbG9nO1xyXG4gICAgICAgIHJlc2l6ZURpYWxvZy5kaWFsb2cuY2xvc2UoKTtcclxuICAgICAgICByZXNpemVDb250cm9sbGVyKCRodHRwLCBLdWJlcm5ldGVzQXBpVVJMLCByZXNpemVEaWFsb2cuY29udHJvbGxlciwgcmVzaXplRGlhbG9nLm5ld1JlcGxpY2FzLCAoKSA9PiB7IGxvZy5kZWJ1ZyhcInVwZGF0ZWQgbnVtYmVyIG9mIHJlcGxpY2FzXCIpOyB9KVxyXG4gICAgICB9LFxyXG4gICAgICBvcGVuOiAoY29udHJvbGxlcikgPT4ge1xyXG4gICAgICAgIHZhciByZXNpemVEaWFsb2cgPSAkc2NvcGUucmVzaXplRGlhbG9nO1xyXG4gICAgICAgIHJlc2l6ZURpYWxvZy5jb250cm9sbGVyID0gY29udHJvbGxlcjtcclxuICAgICAgICByZXNpemVEaWFsb2cubmV3UmVwbGljYXMgPSBDb3JlLnBhdGhHZXQoY29udHJvbGxlciwgW1wic3RhdHVzXCIsIFwicmVwbGljYXNcIl0pO1xyXG4gICAgICAgIHJlc2l6ZURpYWxvZy5kaWFsb2cub3BlbigpO1xyXG5cclxuICAgICAgICAkdGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAkKCcjcmVwbGljYXMnKS5mb2N1cygpO1xyXG4gICAgICAgIH0sIDUwKTtcclxuICAgICAgfSxcclxuICAgICAgY2xvc2U6ICgpID0+IHtcclxuICAgICAgICAkc2NvcGUucmVzaXplRGlhbG9nLmRpYWxvZy5jbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgICRzY29wZS50cmlnZ2VyQnVpbGQgPSAoYnVpbGRDb25maWcpID0+IHtcclxuICAgICAgdmFyIHVybCA9IGJ1aWxkQ29uZmlnLiR0cmlnZ2VyVXJsO1xyXG4gICAgICBjb25zb2xlLmxvZyhcInRyaWdnZXJpbmcgYnVpbGQgYXQgdXJsOiBcIiArIHVybCk7XHJcbiAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAvL3ZhciBkYXRhID0ge307XHJcbiAgICAgICAgdmFyIGRhdGEgPSBudWxsO1xyXG4gICAgICAgIHZhciBjb25maWcgPSB7XHJcbiAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiBcImFwcGxpY2F0aW9uL2pzb25cIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIG5hbWUgPSBDb3JlLnBhdGhHZXQoYnVpbGRDb25maWcsIFtcIm1ldGFkYXRhXCIsIFwibmFtZVwiXSk7XHJcbiAgICAgICAgQ29yZS5ub3RpZmljYXRpb24oJ2luZm8nLCBcIlRyaWdnZXJpbmcgYnVpbGQgXCIgKyBuYW1lKTtcclxuICAgICAgICAkaHR0cC5wb3N0KHVybCwgZGF0YSwgY29uZmlnKS5cclxuICAgICAgICAgIHN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlciB3b3JrZWQhIGdvdCBkYXRhIFwiICsgYW5ndWxhci50b0pzb24oZGF0YSwgdHJ1ZSkpO1xyXG4gICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB3ZSBzaG93IHNvbWUgbGluayB0byB0aGUgYnVpbGRcclxuICAgICAgICAgICAgQ29yZS5ub3RpZmljYXRpb24oJ2luZm8nLCBcIkJ1aWxkaW5nIFwiICsgbmFtZSk7XHJcbiAgICAgICAgICB9KS5cclxuICAgICAgICAgIGVycm9yKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byBsb2FkIFwiICsgdXJsICsgXCIgXCIgKyBkYXRhICsgXCIgXCIgKyBzdGF0dXMpO1xyXG4gICAgICAgICAgICBDb3JlLm5vdGlmaWNhdGlvbignZXJyb3InLCBcIkZhaWxlZCB0byB0cmlnZ2VyIGJ1aWxkIGZvciBcIiArIG5hbWUgKyBcIi4gUmV0dXJuZWQgY29kZTogXCIgKyBzdGF0dXMgKyBcIiBcIiArIGRhdGEpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXBkYXRlIHRoZSBVUkwgaWYgdGhlIGZpbHRlciBpcyBjaGFuZ2VkXHJcbiAgICAkc2NvcGUuJHdhdGNoKFwidGFibGVDb25maWcuZmlsdGVyT3B0aW9ucy5maWx0ZXJUZXh0XCIsICh0ZXh0KSA9PiB7XHJcbiAgICAgIC8vdmFyIGZpbHRlclRleHQgPSBLdWJlcm5ldGVzLmZpbmRWYWxlT2ZMYWJlbHModGV4dCk7XHJcbiAgICAgICRsb2NhdGlvbi5zZWFyY2goXCJxXCIsIHRleHQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgJHNjb3BlLiRvbihcImxhYmVsRmlsdGVyVXBkYXRlXCIsICgkZXZlbnQsIHRleHQpID0+IHtcclxuICAgICAgdmFyIGZpbHRlck9wdGlvbnMgPSAoJHNjb3BlLnRhYmxlQ29uZmlnIHx8IHt9KS5maWx0ZXJPcHRpb25zIHx8IHt9O1xyXG4gICAgICB2YXIgY3VycmVudEZpbHRlciA9IGZpbHRlck9wdGlvbnMuZmlsdGVyVGV4dDtcclxuICAgICAgaWYgKENvcmUuaXNCbGFuayhjdXJyZW50RmlsdGVyKSkge1xyXG4gICAgICAgIGZpbHRlck9wdGlvbnMuZmlsdGVyVGV4dCA9IHRleHQ7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHZhciBleHByZXNzaW9ucyA9IGN1cnJlbnRGaWx0ZXIuc3BsaXQoL1xccysvKTtcclxuICAgICAgICBpZiAoZXhwcmVzc2lvbnMuaW5kZXhPZih0ZXh0KSAhPT0gLTEpIHtcclxuICAgICAgICAgIC8vIGxldHMgZXhjbHVkZSB0aGlzIGZpbHRlciBleHByZXNzaW9uXHJcbiAgICAgICAgICBleHByZXNzaW9ucyA9IGV4cHJlc3Npb25zLnJlbW92ZSh0ZXh0KTtcclxuICAgICAgICAgIGZpbHRlck9wdGlvbnMuZmlsdGVyVGV4dCA9IGV4cHJlc3Npb25zLmpvaW4oXCIgXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmaWx0ZXJPcHRpb25zLmZpbHRlclRleHQgPSBjdXJyZW50RmlsdGVyICsgXCIgXCIgKyB0ZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAkc2NvcGUuaWQgPSB1bmRlZmluZWQ7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcG9kcyB0aGF0IGFyZSByZWFkeVxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiByZWFkeVBvZENvdW50KHNlcnZpY2UpIHtcclxuICAgIHZhciBjb3VudCA9IDA7XHJcbiAgICBhbmd1bGFyLmZvckVhY2goKHNlcnZpY2UgfHwge30pLiRwb2RzLCAocG9kKT0+IHtcclxuICAgICAgaWYgKHBvZC4kcmVhZHkpIHtcclxuICAgICAgICBjb3VudCsrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb3VudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHNlcnZpY2UgbGluayBVUkwgZm9yIGVpdGhlciB0aGUgc2VydmljZSBuYW1lIG9yIHRoZSBzZXJ2aWNlIG9iamVjdFxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlTGlua1VybChzZXJ2aWNlLCBodHRwT25seSA9IGZhbHNlKSB7XHJcbiAgICBpZiAoYW5ndWxhci5pc09iamVjdChzZXJ2aWNlKSkge1xyXG4gICAgICB2YXIgcG9ydGFsSVAgPSBzZXJ2aWNlLiRob3N0O1xyXG4gICAgICAvLyBsZXRzIGFzc3VtZSBubyBjdXN0b20gcG9ydCBmb3Igbm93IGZvciBleHRlcm5hbCByb3V0ZXNcclxuICAgICAgdmFyIHBvcnQgPSBudWxsO1xyXG4gICAgICB2YXIgcHJvdG9jb2wgPSBcImh0dHA6Ly9cIjtcclxuICAgICAgdmFyIHNwZWMgPSBzZXJ2aWNlLnNwZWM7XHJcbiAgICAgIGlmIChzcGVjKSB7XHJcbiAgICAgICAgaWYgKCFwb3J0YWxJUCkge1xyXG4gICAgICAgICAgcG9ydGFsSVAgPSBzcGVjLnBvcnRhbElQO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaGFzSHR0cHMgPSBmYWxzZTtcclxuICAgICAgICB2YXIgaGFzSHR0cCA9IGZhbHNlO1xyXG4gICAgICAgIGFuZ3VsYXIuZm9yRWFjaChzcGVjLnBvcnRzLCAocG9ydFNwZWMpID0+IHtcclxuICAgICAgICAgIHZhciBwID0gcG9ydFNwZWMucG9ydDtcclxuICAgICAgICAgIGlmIChwKSB7XHJcbiAgICAgICAgICAgIGlmIChwID09PSA0NDMpIHtcclxuICAgICAgICAgICAgICBoYXNIdHRwcyA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocCA9PT0gODApIHtcclxuICAgICAgICAgICAgICBoYXNIdHRwID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXBvcnQpIHtcclxuICAgICAgICAgICAgICBwb3J0ID0gcDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICghaGFzSHR0cHMgJiYgIWhhc0h0dHAgJiYgcG9ydCkge1xyXG4gICAgICAgICAgLy8gbGV0cyB0cmVhdCA4MDgwIGFzIGh0dHAgd2hpY2ggaXMgYSBjb21tb24gc2VydmljZSB0byBleHBvcnRcclxuICAgICAgICAgIGlmIChwb3J0ID09PSA4MDgwKSB7XHJcbiAgICAgICAgICAgIGhhc0h0dHAgPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChwb3J0ID09PSA4NDQzKSB7XHJcbiAgICAgICAgICAgIGhhc0h0dHBzID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHBvcnRhbElQKSB7XHJcbiAgICAgICAgaWYgKGhhc0h0dHBzKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJodHRwczovL1wiICsgcG9ydGFsSVA7XHJcbiAgICAgICAgfSBlbHNlIGlmIChoYXNIdHRwKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJodHRwOi8vXCIgKyBwb3J0YWxJUDtcclxuICAgICAgICB9IGVsc2UgaWYgKCFodHRwT25seSkge1xyXG4gICAgICAgICAgaWYgKHBvcnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sICsgcG9ydGFsSVAgKyBcIjpcIiArIHBvcnQgKyBcIi9cIjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcm90b2NvbCArIHBvcnRhbElQO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlKSB7XHJcbiAgICAgIHZhciBzZXJ2aWNlSWQgPSBzZXJ2aWNlLnRvU3RyaW5nKCk7XHJcbiAgICAgIGlmIChzZXJ2aWNlSWQpIHtcclxuICAgICAgICB2YXIgU2VydmljZVJlZ2lzdHJ5ID0gZ2V0U2VydmljZVJlZ2lzdHJ5KCk7XHJcbiAgICAgICAgaWYgKFNlcnZpY2VSZWdpc3RyeSkge1xyXG4gICAgICAgICAgcmV0dXJuIFNlcnZpY2VSZWdpc3RyeS5zZXJ2aWNlTGluayhzZXJ2aWNlSWQpIHx8IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gXCJcIjtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY291bnRlcnMgZm9yIHRoZSBwb2RDb3VudGVycyBvYmplY3RcclxuICAgKi9cclxuICBleHBvcnQgZnVuY3Rpb24gcG9kQ291bnRlclRvdGFsKCRwb2RDb3VudGVycykge1xyXG4gICAgdmFyIGFuc3dlciA9IDA7XHJcbiAgICBpZiAoJHBvZENvdW50ZXJzKSB7XHJcbiAgICAgIGFuZ3VsYXIuZm9yRWFjaChbXCJyZWFkeVwiLCBcInZhbGlkXCIsIFwid2FpdGluZ1wiLCBcImVycm9yXCJdLCAobmFtZSkgPT4ge1xyXG4gICAgICAgIHZhciB2YWx1ZSA9ICRwb2RDb3VudGVyc1tuYW1lXSB8fCAwO1xyXG4gICAgICAgIGFuc3dlciArPSB2YWx1ZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYW5zd2VyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2l2ZW4gdGhlIGxpc3Qgb2YgcG9kcyBsZXRzIGl0ZXJhdGUgdGhyb3VnaCB0aGVtIGFuZCBmaW5kIGFsbCBwb2RzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxyXG4gICAqIGFuZCByZXR1cm4gY291bnRlcnMgYmFzZWQgb24gdGhlIHN0YXR1cyBvZiB0aGUgcG9kXHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBvZENvdW50ZXJzKHNlbGVjdG9yLCBwb2RzLCBvdXRwdXRQb2RzID0gW10sIHBvZExpbmtRdWVyeSA9IG51bGwsIHBvZExpbmtVcmwgPSBudWxsKSB7XHJcbiAgICBpZiAoIXBvZExpbmtVcmwpIHtcclxuICAgICAgcG9kTGlua1VybCA9IFwiL2t1YmVybmV0ZXMvcG9kc1wiO1xyXG4gICAgfVxyXG4gICAgdmFyIGZpbHRlckZuO1xyXG4gICAgaWYgKGFuZ3VsYXIuaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcclxuICAgICAgZmlsdGVyRm4gPSBzZWxlY3RvcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpbHRlckZuID0gKHBvZCkgPT4gc2VsZWN0b3JNYXRjaGVzKHNlbGVjdG9yLCBnZXRMYWJlbHMocG9kKSk7XHJcbiAgICB9XHJcbiAgICB2YXIgYW5zd2VyID0ge1xyXG4gICAgICBwb2RzTGluazogXCJcIixcclxuICAgICAgcmVhZHk6IDAsXHJcbiAgICAgIHZhbGlkOiAwLFxyXG4gICAgICB3YWl0aW5nOiAwLFxyXG4gICAgICBlcnJvcjogMFxyXG4gICAgfTtcclxuICAgIGlmIChzZWxlY3Rvcikge1xyXG4gICAgICBpZiAoIXBvZExpbmtRdWVyeSkge1xyXG4gICAgICAgIHBvZExpbmtRdWVyeSA9IEt1YmVybmV0ZXMubGFiZWxzVG9TdHJpbmcoc2VsZWN0b3IsIFwiIFwiKTtcclxuICAgICAgfVxyXG4gICAgICBhbnN3ZXIucG9kc0xpbmsgPSBwb2RMaW5rVXJsICsgXCI/cT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChwb2RMaW5rUXVlcnkpO1xyXG4gICAgICBhbmd1bGFyLmZvckVhY2gocG9kcywgcG9kID0+IHtcclxuICAgICAgICBpZiAoZmlsdGVyRm4ocG9kKSkge1xyXG4gICAgICAgICAgb3V0cHV0UG9kcy5wdXNoKHBvZCk7XHJcbiAgICAgICAgICB2YXIgc3RhdHVzID0gZ2V0U3RhdHVzKHBvZCk7XHJcbiAgICAgICAgICBpZiAoc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHZhciBsb3dlciA9IHN0YXR1cy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICBpZiAobG93ZXIuc3RhcnRzV2l0aChcInJ1blwiKSkge1xyXG4gICAgICAgICAgICAgIGlmIChpc1JlYWR5KHBvZCkpIHtcclxuICAgICAgICAgICAgICAgIGFuc3dlci5yZWFkeSArPSAxO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhbnN3ZXIudmFsaWQgKz0gMTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXIuc3RhcnRzV2l0aChcIndhaXRcIikgfHwgbG93ZXIuc3RhcnRzV2l0aChcInBlbmRcIikpIHtcclxuICAgICAgICAgICAgICBhbnN3ZXIud2FpdGluZyArPSAxO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxvd2VyLnN0YXJ0c1dpdGgoXCJ0ZXJtXCIpIHx8IGxvd2VyLnN0YXJ0c1dpdGgoXCJlcnJvclwiKSB8fCBsb3dlci5zdGFydHNXaXRoKFwiZmFpbFwiKSkge1xyXG4gICAgICAgICAgICAgIGFuc3dlci5lcnJvciArPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhbnN3ZXIuZXJyb3IgKz0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFuc3dlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnRzIHRoZSBnaXZlbiBqc29uIGludG8gYW4gYXJyYXkgb2YgaXRlbXMuIElmIHRoZSBqc29uIGNvbnRhaW5zIGEgbmVzdGVkIHNldCBvZiBpdGVtcyB0aGVuIHRoYXQgaXMgc29ydGVkOyBzbyB0aGF0IHNlcnZpY2VzXHJcbiAgICogYXJlIHByb2Nlc3NlZCBmaXJzdDsgdGhlbiB0dXJuZWQgaW50byBhbiBhcnJheS4gT3RoZXJ3aXNlIHRoZSBqc29uIGlzIHB1dCBpbnRvIGFuIGFycmF5IHNvIGl0IGNhbiBiZSBwcm9jZXNzZWQgcG9seW1vcnBoaWNhbGx5XHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRLdWJlcm5ldGVzSnNvblRvSXRlbXMoanNvbikge1xyXG4gICAgdmFyIGl0ZW1zID0ganNvbi5pdGVtcztcclxuICAgIGlmIChhbmd1bGFyLmlzQXJyYXkoaXRlbXMpKSB7XHJcbiAgICAgIC8vIFRPRE8gd2UgY291bGQgY2hlY2sgZm9yIExpc3Qgb3IgQ29uZmlnIHR5cGVzIGhlcmUgYW5kIHdhcm4gaWYgbm90XHJcblxyXG4gICAgICAvLyBzb3J0IHRoZSBzZXJ2aWNlcyBmaXJzdFxyXG4gICAgICB2YXIgYW5zd2VyID0gW107XHJcbiAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBpZiAoaXRlbS5raW5kID09PSBcIlNlcnZpY2VcIikge1xyXG4gICAgICAgICAgYW5zd2VyLnB1c2goaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmtpbmQgIT09IFwiU2VydmljZVwiKSB7XHJcbiAgICAgICAgICBhbnN3ZXIucHVzaChpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gYW5zd2VyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFtqc29uXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBpc1YxYmV0YTFPcjIoKSB7XHJcbiAgICByZXR1cm4gZGVmYXVsdEFwaVZlcnNpb24gPT09IFwidjFiZXRhMVwiIHx8IGRlZmF1bHRBcGlWZXJzaW9uID09PSBcInYxYmV0YTJcIjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBsaW5rIHRvIHRoZSBkZXRhaWwgcGFnZSBmb3IgdGhlIGdpdmVuIGVudGl0eVxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBlbnRpdHlQYWdlTGluayhvYmopIHtcclxuICAgIGlmIChvYmopIHtcclxuICAgICAgZnVuY3Rpb24gZ2V0TGluayhlbnRpdHkpIHtcclxuICAgICAgICB2YXIgdmlld0xpbmsgPSBlbnRpdHlbXCIkdmlld0xpbmtcIl07XHJcbiAgICAgICAgaWYgKHZpZXdMaW5rKSB7XHJcbiAgICAgICAgICByZXR1cm4gdmlld0xpbms7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpZCA9IGdldE5hbWUoZW50aXR5KTtcclxuICAgICAgICB2YXIga2luZCA9IGdldEtpbmQoZW50aXR5KTtcclxuICAgICAgICBpZiAoa2luZCAmJiBpZCkge1xyXG4gICAgICAgICAgdmFyIHBhdGggPSBraW5kLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsga2luZC5zdWJzdHJpbmcoMSkgKyBcInNcIjtcclxuICAgICAgICAgIHZhciBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2UoZW50aXR5KTtcclxuICAgICAgICAgIGlmIChuYW1lc3BhY2UgJiYgIWlzSWdub3JlTmFtZXNwYWNlS2luZChraW5kKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gQ29yZS51cmwoVXJsSGVscGVycy5qb2luKCcva3ViZXJuZXRlcy9uYW1lc3BhY2UnLCBuYW1lc3BhY2UsIHBhdGgsIGlkKSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gQ29yZS51cmwoVXJsSGVscGVycy5qb2luKCcva3ViZXJuZXRlcycsIHBhdGgsIGlkKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHZhciBiYXNlTGluayA9IGdldExpbmsob2JqKTtcclxuICAgICAgaWYgKCFIYXd0aW9Db3JlLmluamVjdG9yIHx8ICFiYXNlTGluaykge1xyXG4gICAgICAgIHJldHVybiBiYXNlTGluaztcclxuICAgICAgfVxyXG4gICAgICB2YXIgJHJvdXRlUGFyYW1zID0gSGF3dGlvQ29yZS5pbmplY3Rvci5nZXQ8bmcucm91dGUuSVJvdXRlUGFyYW1zU2VydmljZT4oJyRyb3V0ZVBhcmFtcycpO1xyXG4gICAgICB2YXIgcHJvamVjdElkID0gJHJvdXRlUGFyYW1zWydwcm9qZWN0J10gfHwgJHJvdXRlUGFyYW1zWydwcm9qZWN0J107XHJcbiAgICAgIGlmICghcHJvamVjdElkKSB7XHJcbiAgICAgICAgcmV0dXJuIGJhc2VMaW5rO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4oRGV2ZWxvcGVyLnByb2plY3RMaW5rKHByb2plY3RJZCksIGJhc2VMaW5rLnJlcGxhY2UoL15cXC9rdWJlcm5ldGVzXFwvLywgJycpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiByZXNvdXJjZUtpbmRUb1VyaVBhdGgoa2luZCkge1xyXG4gICAgdmFyIGtpbmRQYXRoID0ga2luZC50b0xvd2VyQ2FzZSgpICsgXCJzXCI7XHJcbiAgICBpZiAoa2luZFBhdGggPT09IFwicmVwbGljYXRpb25Db250cm9sbGVyc1wiICYmICFpc1YxYmV0YTFPcjIoKSkge1xyXG4gICAgICBraW5kUGF0aCA9IFwicmVwbGljYXRpb25jb250cm9sbGVyc1wiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGtpbmRQYXRoO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gaXNJZ25vcmVOYW1lc3BhY2VLaW5kKGtpbmQpIHtcclxuICAgIHJldHVybiBraW5kID09PSBcIkhvc3RcIiB8fCBraW5kID09PSBcIk1pbmlvblwiO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgcm9vdCBVUkwgZm9yIHRoZSBraW5kXHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGt1YmVybmV0ZXNVcmxGb3JLaW5kKEt1YmVybmV0ZXNBcGlVUkwsIGtpbmQsIG5hbWVzcGFjZSA9IG51bGwsIHBhdGggPSBudWxsKSB7XHJcbiAgICB2YXIgcGF0aFNlZ21lbnQgPSBcIlwiO1xyXG4gICAgaWYgKHBhdGgpIHtcclxuICAgICAgcGF0aFNlZ21lbnQgPSBcIi9cIiArIENvcmUudHJpbUxlYWRpbmcocGF0aCwgXCIvXCIpO1xyXG4gICAgfVxyXG4gICAgdmFyIGtpbmRQYXRoID0gcmVzb3VyY2VLaW5kVG9VcmlQYXRoKGtpbmQpO1xyXG4gICAgdmFyIGlnbm9yZU5hbWVzcGFjZSA9IGlzSWdub3JlTmFtZXNwYWNlS2luZChraW5kKTtcclxuICAgIGlmIChpc1YxYmV0YTFPcjIoKSB8fCBpZ25vcmVOYW1lc3BhY2UpIHtcclxuICAgICAgdmFyIHBvc3RmaXggPSBcIlwiO1xyXG4gICAgICBpZiAobmFtZXNwYWNlICYmICFpZ25vcmVOYW1lc3BhY2UpIHtcclxuICAgICAgICBwb3N0Zml4ID0gXCI/bmFtZXNwYWNlPVwiICsgbmFtZXNwYWNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4oS3ViZXJuZXRlc0FwaVVSTCwga2luZFBhdGgsIHBhdGhTZWdtZW50LCBwb3N0Zml4KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4oS3ViZXJuZXRlc0FwaVVSTCwgXCIvbmFtZXNwYWNlcy9cIiwgbmFtZXNwYWNlICwga2luZFBhdGgsIHBhdGhTZWdtZW50KTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBiYXNlIFVSTCBmb3IgdGhlIGtpbmQgb2Yga3ViZXJuZXRlcyByZXNvdXJjZSBvciBudWxsIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBrdWJlcm5ldGVzVXJsRm9ySXRlbUtpbmQoS3ViZXJuZXRlc0FwaVVSTCwganNvbikge1xyXG4gICAgdmFyIGtpbmQgPSBqc29uLmtpbmQ7XHJcbiAgICBpZiAoa2luZCkge1xyXG4gICAgICByZXR1cm4ga3ViZXJuZXRlc1VybEZvcktpbmQoS3ViZXJuZXRlc0FwaVVSTCwga2luZCwganNvbi5uYW1lc3BhY2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbG9nLndhcm4oXCJJZ25vcmluZyBtaXNzaW5nIGtpbmQgXCIgKyBraW5kICsgXCIgZm9yIGt1YmVybmV0ZXMganNvbjogXCIgKyBhbmd1bGFyLnRvSnNvbihqc29uKSk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGt1YmVybmV0ZXNQcm94eVVybEZvclNlcnZpY2UoS3ViZXJuZXRlc0FwaVVSTCwgc2VydmljZSwgcGF0aCA9IG51bGwpIHtcclxuICAgIHZhciBwYXRoU2VnbWVudCA9IFwiXCI7XHJcbiAgICBpZiAocGF0aCkge1xyXG4gICAgICBwYXRoU2VnbWVudCA9IFwiL1wiICsgQ29yZS50cmltTGVhZGluZyhwYXRoLCBcIi9cIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwYXRoU2VnbWVudCA9IFwiL1wiO1xyXG4gICAgfVxyXG4gICAgdmFyIG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZShzZXJ2aWNlKTtcclxuICAgIGlmIChpc1YxYmV0YTFPcjIoKSkge1xyXG4gICAgICB2YXIgcG9zdGZpeCA9IFwiP25hbWVzcGFjZT1cIiArIG5hbWVzcGFjZTtcclxuICAgICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihLdWJlcm5ldGVzQXBpVVJMLCBcIi9wcm94eVwiLCAga3ViZXJuZXRlc05hbWVzcGFjZVBhdGgoKSwgXCIvc2VydmljZXMvXCIgKyBnZXROYW1lKHNlcnZpY2UpICsgcGF0aFNlZ21lbnQgKyBwb3N0Zml4KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4oS3ViZXJuZXRlc0FwaVVSTCwgXCIvcHJveHkvbmFtZXNwYWNlcy9cIiwgbmFtZXNwYWNlLCBcIi9zZXJ2aWNlcy9cIiArIGdldE5hbWUoc2VydmljZSkgKyBwYXRoU2VnbWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGt1YmVybmV0ZXNQcm94eVVybEZvclNlcnZpY2VDdXJyZW50TmFtZXNwYWNlKHNlcnZpY2UsIHBhdGggPSBudWxsKSB7XHJcbiAgICB2YXIgYXBpUHJlZml4ID0gVXJsSGVscGVycy5qb2luKGt1YmVybmV0ZXNBcGlVcmwoKSk7XHJcbiAgICByZXR1cm4ga3ViZXJuZXRlc1Byb3h5VXJsRm9yU2VydmljZShhcGlQcmVmaXgsIHNlcnZpY2UsIHBhdGgpO1xyXG5cclxuICB9XHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29uZmlnUmVzdFVybChpZCkge1xyXG4gICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihidWlsZENvbmZpZ3NSZXN0VVJMKCksIGlkKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBkZXBsb3ltZW50Q29uZmlnUmVzdFVybChpZCkge1xyXG4gICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihkZXBsb3ltZW50Q29uZmlnc1Jlc3RVUkwoKSwgaWQpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGltYWdlUmVwb3NpdG9yeVJlc3RVcmwoaWQpIHtcclxuICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4oaW1hZ2VSZXBvc2l0b3JpZXNSZXN0VVJMKCksIGlkKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBidWlsZFJlc3RVcmwoaWQpIHtcclxuICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4oYnVpbGRzUmVzdFVSTCgpLCBpZCk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gYnVpbGRMb2dzUmVzdFVybChpZCkge1xyXG4gICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbihidWlsZHNSZXN0VVJMKCksIGlkLCBcImxvZ1wiKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJ1bnMgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIEpTT05cclxuICAgKi9cclxuICBleHBvcnQgZnVuY3Rpb24gcnVuQXBwKCRsb2NhdGlvbiwgJHNjb3BlLCAkaHR0cCwgS3ViZXJuZXRlc0FwaVVSTCwganNvbiwgbmFtZSA9IFwiQXBwXCIsIG9uU3VjY2Vzc0ZuID0gbnVsbCwgbmFtZXNwYWNlID0gbnVsbCwgb25Db21wbGV0ZUZuID0gbnVsbCkge1xyXG4gICAgaWYgKGpzb24pIHtcclxuICAgICAgaWYgKGFuZ3VsYXIuaXNTdHJpbmcoanNvbikpIHtcclxuICAgICAgICBqc29uID0gYW5ndWxhci5mcm9tSnNvbihqc29uKTtcclxuICAgICAgfVxyXG4gICAgICBuYW1lID0gbmFtZSB8fCBcIkFwcFwiO1xyXG4gICAgICB2YXIgcG9zdGZpeCA9IG5hbWVzcGFjZSA/IFwiIGluIG5hbWVzcGFjZSBcIiArIG5hbWVzcGFjZSA6IFwiXCI7XHJcbiAgICAgIENvcmUubm90aWZpY2F0aW9uKCdpbmZvJywgXCJSdW5uaW5nIFwiICsgbmFtZSArIHBvc3RmaXgpO1xyXG5cclxuICAgICAgdmFyIGl0ZW1zID0gY29udmVydEt1YmVybmV0ZXNKc29uVG9JdGVtcyhqc29uKTtcclxuICAgICAgYW5ndWxhci5mb3JFYWNoKGl0ZW1zLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgIHZhciB1cmwgPSBrdWJlcm5ldGVzVXJsRm9ySXRlbUtpbmQoS3ViZXJuZXRlc0FwaVVSTCwgaXRlbSk7XHJcbiAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgJGh0dHAucG9zdCh1cmwsIGl0ZW0pLlxyXG4gICAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcIkdvdCBzdGF0dXM6IFwiICsgc3RhdHVzICsgXCIgb24gdXJsOiBcIiArIHVybCArIFwiIGRhdGE6IFwiICsgZGF0YSArIFwiIGFmdGVyIHBvc3Rpbmc6IFwiICsgYW5ndWxhci50b0pzb24oaXRlbSkpO1xyXG4gICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRnVuY3Rpb24ob25Db21wbGV0ZUZuKSkge1xyXG4gICAgICAgICAgICAgICAgb25Db21wbGV0ZUZuKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNPYmplY3QoZGF0YSkpIHtcclxuICAgICAgICAgICAgICBtZXNzYWdlID0gZGF0YS5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgIHZhciByZWFzb24gPSBkYXRhLnJlYXNvbjtcclxuICAgICAgICAgICAgICBpZiAocmVhc29uID09PSBcIkFscmVhZHlFeGlzdHNcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gbGV0cyBpZ25vcmUgZHVwbGljYXRlc1xyXG4gICAgICAgICAgICAgICAgbG9nLmRlYnVnKFwiZW50aXR5IGFscmVhZHkgZXhpc3RzIGF0IFwiICsgdXJsKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFtZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiRmFpbGVkIHRvIFBPU1QgdG8gXCIgKyB1cmwgKyBcIiBnb3Qgc3RhdHVzOiBcIiArIHN0YXR1cztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byBzYXZlIFwiICsgdXJsICsgXCIgc3RhdHVzOiBcIiArIHN0YXR1cyArIFwiIHJlc3BvbnNlOiBcIiArIGFuZ3VsYXIudG9Kc29uKGRhdGEsIHRydWUpKTtcclxuICAgICAgICAgICAgQ29yZS5ub3RpZmljYXRpb24oJ2Vycm9yJywgbWVzc2FnZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHBvZCBpcyBydW5uaW5nXHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGlzUnVubmluZyhwb2RDdXJyZW50U3RhdGUpIHtcclxuICAgIHZhciBzdGF0dXMgPSAocG9kQ3VycmVudFN0YXRlIHx8IHt9KS5waGFzZTtcclxuICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgdmFyIGxvd2VyID0gc3RhdHVzLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIHJldHVybiBsb3dlci5zdGFydHNXaXRoKFwicnVuXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBsYWJlbHMgb2JqZWN0IGhhcyBhbGwgb2YgdGhlIGtleS92YWx1ZSBwYWlycyBmcm9tIHRoZSBzZWxlY3RvclxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBzZWxlY3Rvck1hdGNoZXMoc2VsZWN0b3IsIGxhYmVscykge1xyXG4gICAgaWYgKGFuZ3VsYXIuaXNPYmplY3QobGFiZWxzKSkge1xyXG4gICAgICB2YXIgYW5zd2VyID0gdHJ1ZTtcclxuICAgICAgdmFyIGNvdW50ID0gMDtcclxuICAgICAgYW5ndWxhci5mb3JFYWNoKHNlbGVjdG9yLCAodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgaWYgKGFuc3dlciAmJiBsYWJlbHNba2V5XSAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgIGFuc3dlciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBhbnN3ZXIgJiYgY291bnQgPiAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgc2VydmljZSByZWdpc3RyeVxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRTZXJ2aWNlUmVnaXN0cnkoKSB7XHJcbiAgICB2YXIgaW5qZWN0b3IgPSBIYXd0aW9Db3JlLmluamVjdG9yO1xyXG4gICAgcmV0dXJuIGluamVjdG9yID8gaW5qZWN0b3IuZ2V0PGFueT4oXCJTZXJ2aWNlUmVnaXN0cnlcIikgOiBudWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBsaW5rIHRvIHRoZSBraWJhbmEgbG9ncyB3ZWIgYXBwbGljYXRpb25cclxuICAgKi9cclxuICBleHBvcnQgZnVuY3Rpb24ga2liYW5hTG9nc0xpbmsoU2VydmljZVJlZ2lzdHJ5KSB7XHJcbiAgICB2YXIgbGluayA9IFNlcnZpY2VSZWdpc3RyeS5zZXJ2aWNlTGluayhraWJhbmFTZXJ2aWNlTmFtZSk7XHJcbiAgICBpZiAobGluaykge1xyXG4gICAgICBpZiAoIWxpbmsuZW5kc1dpdGgoXCIvXCIpKSB7XHJcbiAgICAgICAgbGluayArPSBcIi9cIjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbGluayArIFwiIy9kYXNoYm9hcmQvRmFicmljOFwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gb3BlbkxvZ3NGb3JQb2RzKFNlcnZpY2VSZWdpc3RyeSwgJHdpbmRvdywgbmFtZXNwYWNlLCBwb2RzKSB7XHJcbiAgICB2YXIgbGluayA9IGtpYmFuYUxvZ3NMaW5rKFNlcnZpY2VSZWdpc3RyeSk7XHJcbiAgICBpZiAobGluaykge1xyXG4gICAgICB2YXIgcXVlcnkgPSBcIlwiO1xyXG4gICAgICB2YXIgY291bnQgPSAwO1xyXG4gICAgICBhbmd1bGFyLmZvckVhY2gocG9kcywgKGl0ZW0pID0+IHtcclxuICAgICAgICB2YXIgaWQgPSBnZXROYW1lKGl0ZW0pO1xyXG4gICAgICAgIGlmIChpZCkge1xyXG4gICAgICAgICAgdmFyIHNwYWNlID0gcXVlcnkgPyBcIiBPUiBcIiA6IFwiXCI7XHJcbiAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgcXVlcnkgKz0gc3BhY2UgKyAnXCInICsgaWQgKyAnXCInO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChxdWVyeSkge1xyXG4gICAgICAgIGlmIChjb3VudCA+IDEpIHtcclxuICAgICAgICAgIHF1ZXJ5ID0gXCIoXCIgKyBxdWVyeSArIFwiKVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBxdWVyeSA9ICdrdWJlcm5ldGVzLm5hbWVzcGFjZV9uYW1lOlwiJyArIG5hbWVzcGFjZSArICdcIiBBTkQga3ViZXJuZXRlcy5wb2RfbmFtZTonICsgcXVlcnk7XHJcbiAgICAgICAgbGluayArPSBcIj9fYT0ocXVlcnk6KHF1ZXJ5X3N0cmluZzoocXVlcnk6J1wiICsgcXVlcnkgKyBcIicpKSlcIjtcclxuICAgICAgICB2YXIgbmV3V2luZG93ID0gJHdpbmRvdy5vcGVuKGxpbmssIFwidmlld0xvZ3NcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiByZXNpemVDb250cm9sbGVyKCRodHRwLCBLdWJlcm5ldGVzQXBpVVJMLCByZXBsaWNhdGlvbkNvbnRyb2xsZXIsIG5ld1JlcGxpY2FzLCBvbkNvbXBsZXRlRm4gPSBudWxsKSB7XHJcbiAgICB2YXIgaWQgPSBnZXROYW1lKHJlcGxpY2F0aW9uQ29udHJvbGxlcik7XHJcbiAgICB2YXIgbmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlKHJlcGxpY2F0aW9uQ29udHJvbGxlcikgfHwgXCJcIjtcclxuICAgIHZhciB1cmwgPSBrdWJlcm5ldGVzVXJsRm9yS2luZChLdWJlcm5ldGVzQXBpVVJMLCBcIlJlcGxpY2F0aW9uQ29udHJvbGxlclwiLCBuYW1lc3BhY2UsIGlkKTtcclxuICAgICRodHRwLmdldCh1cmwpLlxyXG4gICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgIGlmIChkYXRhKSB7ICAgICAgICAgICBcclxuICAgICAgICAgIHZhciBkZXNpcmVkU3RhdGUgPSBkYXRhLnNwZWM7XHJcbiAgICAgICAgICBpZiAoIWRlc2lyZWRTdGF0ZSkge1xyXG4gICAgICAgICAgICBkZXNpcmVkU3RhdGUgPSB7fTtcclxuICAgICAgICAgICAgZGF0YS5zcGVjID0gZGVzaXJlZFN0YXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGVzaXJlZFN0YXRlLnJlcGxpY2FzID0gbmV3UmVwbGljYXM7XHJcbiAgICAgICAgICAkaHR0cC5wdXQodXJsLCBkYXRhKS5cclxuICAgICAgICAgICAgc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICBsb2cuZGVidWcoXCJ1cGRhdGVkIGNvbnRyb2xsZXIgXCIgKyB1cmwpO1xyXG4gICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRnVuY3Rpb24ob25Db21wbGV0ZUZuKSkge1xyXG4gICAgICAgICAgICAgICAgb25Db21wbGV0ZUZuKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5cclxuICAgICAgICAgIGVycm9yKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byBzYXZlIFwiICsgdXJsICsgXCIgXCIgKyBkYXRhICsgXCIgXCIgKyBzdGF0dXMpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5cclxuICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgbG9nLndhcm4oXCJGYWlsZWQgdG8gbG9hZCBcIiArIHVybCArIFwiIFwiICsgZGF0YSArIFwiIFwiICsgc3RhdHVzKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gc3RhdHVzVGV4dFRvQ3NzQ2xhc3ModGV4dCwgcmVhZHkgPSBmYWxzZSkge1xyXG4gICAgaWYgKHRleHQpIHtcclxuICAgICAgdmFyIGxvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBpZiAobG93ZXIuc3RhcnRzV2l0aChcInJ1blwiKSB8fCBsb3dlci5zdGFydHNXaXRoKFwib2tcIikpIHtcclxuICAgICAgICBpZiAoIXJlYWR5KSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJmYSBmYS1zcGlubmVyIGZhLXNwaW4gZ3JlZW5cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICdmYSBmYS1wbGF5LWNpcmNsZSBncmVlbic7XHJcbiAgICAgIH0gZWxzZSBpZiAobG93ZXIuc3RhcnRzV2l0aChcIndhaXRcIikgfHwgbG93ZXIuc3RhcnRzV2l0aChcInBlbmRcIikpIHtcclxuICAgICAgICByZXR1cm4gJ2ZhIGZhLWRvd25sb2FkJztcclxuICAgICAgfSBlbHNlIGlmIChsb3dlci5zdGFydHNXaXRoKFwidGVybVwiKSB8fCBsb3dlci5zdGFydHNXaXRoKFwiZXJyb3JcIikgfHwgbG93ZXIuc3RhcnRzV2l0aChcImZhaWxcIikpIHtcclxuICAgICAgICByZXR1cm4gJ2ZhIGZhLW9mZiBvcmFuZ2UnO1xyXG4gICAgICB9IGVsc2UgaWYgKGxvd2VyLnN0YXJ0c1dpdGgoXCJzdWNjZWVkZWRcIikpIHtcclxuICAgICAgICByZXR1cm4gJ2ZhIGZhLWNoZWNrLWNpcmNsZS1vIGdyZWVuJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICdmYSBmYS1xdWVzdGlvbiByZWQnO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIHBvZFN0YXR1cyhwb2QpIHtcclxuICAgIHJldHVybiBnZXRTdGF0dXMocG9kKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBpc1JlYWR5KHBvZCkge1xyXG4gICAgdmFyIHN0YXR1cyA9IHBvZC5zdGF0dXMgfHwge307XHJcbiAgICB2YXIgYW5zd2VyID0gZmFsc2U7XHJcbiAgICBhbmd1bGFyLmZvckVhY2goc3RhdHVzLmNvbmRpdGlvbnMsIChjb25kaXRpb24pID0+IHtcclxuICAgICAgdmFyIHQgPSBjb25kaXRpb24udHlwZTtcclxuICAgICAgaWYgKHQgJiYgdCA9PT0gXCJSZWFkeVwiKSB7XHJcbiAgICAgICAgdmFyIHN0YXR1cyA9IGNvbmRpdGlvbi5zdGF0dXM7XHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJUcnVlXCIpIHtcclxuICAgICAgICAgIGFuc3dlciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBhbnN3ZXI7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBwVmlld1BvZENvdW50ZXJzKGFwcFZpZXcpIHtcclxuICAgIHZhciBhcnJheSA9IFtdO1xyXG4gICAgdmFyIG1hcCA9IHt9O1xyXG4gICAgdmFyIHBvZHMgPSBhcHBWaWV3LnBvZHM7XHJcbiAgICB2YXIgbG93ZXN0RGF0ZSA9IG51bGw7XHJcbiAgICBhbmd1bGFyLmZvckVhY2gocG9kcywgcG9kID0+IHtcclxuICAgICAgdmFyIHNlbGVjdG9yID0gZ2V0TGFiZWxzKHBvZCk7XHJcbiAgICAgIHZhciBzZWxlY3RvclRleHQgPSBLdWJlcm5ldGVzLmxhYmVsc1RvU3RyaW5nKHNlbGVjdG9yLCBcIiBcIik7XHJcbiAgICAgIHZhciBhbnN3ZXIgPSBtYXBbc2VsZWN0b3JdO1xyXG4gICAgICBpZiAoIWFuc3dlcikge1xyXG4gICAgICAgIGFuc3dlciA9IHtcclxuICAgICAgICAgIGxhYmVsVGV4dDogc2VsZWN0b3JUZXh0LFxyXG4gICAgICAgICAgcG9kc0xpbms6IFVybEhlbHBlcnMuam9pbihcIi9rdWJlcm5ldGVzL25hbWVzcGFjZS9cIiwgcG9kLm1ldGFkYXRhLm5hbWVzcGFjZSwgXCJwb2RzP3E9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoc2VsZWN0b3JUZXh0KSksXHJcbiAgICAgICAgICB2YWxpZDogMCxcclxuICAgICAgICAgIHdhaXRpbmc6IDAsXHJcbiAgICAgICAgICBlcnJvcjogMFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbWFwW3NlbGVjdG9yXSA9IGFuc3dlcjtcclxuICAgICAgICBhcnJheS5wdXNoKGFuc3dlcik7XHJcbiAgICAgIH1cclxuICAgICAgdmFyIHN0YXR1cyA9IChwb2RTdGF0dXMocG9kKSB8fCBcIkVycm9yXCIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGlmIChzdGF0dXMuc3RhcnRzV2l0aChcInJ1blwiKSB8fCBzdGF0dXMuc3RhcnRzV2l0aChcIm9rXCIpKSB7XHJcbiAgICAgICAgYW5zd2VyLnZhbGlkICs9IDE7XHJcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzLnN0YXJ0c1dpdGgoXCJ3YWl0XCIpIHx8IHN0YXR1cy5zdGFydHNXaXRoKFwicHduZFwiKSkge1xyXG4gICAgICAgIGFuc3dlci53YWl0aW5nICs9IDE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYW5zd2VyLmVycm9yICs9IDE7XHJcbiAgICAgIH1cclxuICAgICAgdmFyIGNyZWF0aW9uVGltZXN0YW1wID0gZ2V0Q3JlYXRpb25UaW1lc3RhbXAocG9kKTtcclxuICAgICAgaWYgKGNyZWF0aW9uVGltZXN0YW1wKSB7XHJcbiAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZShjcmVhdGlvblRpbWVzdGFtcCk7XHJcbiAgICAgICAgaWYgKCFsb3dlc3REYXRlIHx8IGQgPCBsb3dlc3REYXRlKSB7XHJcbiAgICAgICAgICBsb3dlc3REYXRlID0gZDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgYXBwVmlldy4kY3JlYXRpb25EYXRlID0gbG93ZXN0RGF0ZTtcclxuICAgIHJldHVybiBhcnJheTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcHBWaWV3U2VydmljZVZpZXdzKGFwcFZpZXcpIHtcclxuICAgIHZhciBhcnJheSA9IFtdO1xyXG4gICAgdmFyIHBvZHMgPSBhcHBWaWV3LnBvZHM7XHJcbiAgICBhbmd1bGFyLmZvckVhY2gocG9kcywgcG9kID0+IHtcclxuICAgICAgdmFyIGlkID0gZ2V0TmFtZShwb2QpO1xyXG4gICAgICBpZiAoaWQpIHtcclxuICAgICAgICB2YXIgYWJicmV2ID0gaWQ7XHJcbiAgICAgICAgdmFyIGlkeCA9IGlkLmluZGV4T2YoXCItXCIpO1xyXG4gICAgICAgIGlmIChpZHggPiAxKSB7XHJcbiAgICAgICAgICBhYmJyZXYgPSBpZC5zdWJzdHJpbmcoMCwgaWR4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcG9kLmlkQWJicmV2ID0gYWJicmV2O1xyXG4gICAgICB9XHJcbiAgICAgIHBvZC5zdGF0dXNDbGFzcyA9IHN0YXR1c1RleHRUb0Nzc0NsYXNzKHBvZFN0YXR1cyhwb2QpLCBpc1JlYWR5KHBvZCkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdmFyIHNlcnZpY2VzID0gYXBwVmlldy5zZXJ2aWNlcyB8fCBbXTtcclxuICAgIHZhciByZXBsaWNhdGlvbkNvbnRyb2xsZXJzID0gYXBwVmlldy5yZXBsaWNhdGlvbkNvbnRyb2xsZXJzIHx8IFtdO1xyXG4gICAgdmFyIHNpemUgPSBNYXRoLm1heChzZXJ2aWNlcy5sZW5ndGgsIHJlcGxpY2F0aW9uQ29udHJvbGxlcnMubGVuZ3RoLCAxKTtcclxuICAgIHZhciBhcHBOYW1lID0gYXBwVmlldy4kaW5mby5uYW1lO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcclxuICAgICAgdmFyIHNlcnZpY2UgPSBzZXJ2aWNlc1tpXTtcclxuICAgICAgdmFyIHJlcGxpY2F0aW9uQ29udHJvbGxlciA9IHJlcGxpY2F0aW9uQ29udHJvbGxlcnNbaV07XHJcbiAgICAgIHZhciBjb250cm9sbGVySWQgPSBnZXROYW1lKHJlcGxpY2F0aW9uQ29udHJvbGxlcik7XHJcbiAgICAgIHZhciBuYW1lID0gZ2V0TmFtZShzZXJ2aWNlKSB8fCBjb250cm9sbGVySWQ7XHJcbiAgICAgIHZhciBhZGRyZXNzID0gQ29yZS5wYXRoR2V0KHNlcnZpY2UsIFtcInNwZWNcIiwgXCJwb3J0YWxJUFwiXSk7XHJcbiAgICAgIGlmICghbmFtZSAmJiBwb2RzLmxlbmd0aCkge1xyXG4gICAgICAgIG5hbWUgPSBwb2RzWzBdLmlkQWJicmV2O1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghYXBwVmlldy4kaW5mby5uYW1lKSB7XHJcbiAgICAgICAgYXBwVmlldy4kaW5mby5uYW1lID0gbmFtZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWFwcFZpZXcuaWQgJiYgcG9kcy5sZW5ndGgpIHtcclxuICAgICAgICBhcHBWaWV3LmlkID0gZ2V0TmFtZShwb2RzWzBdKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaSA+IDApIHtcclxuICAgICAgICBhcHBOYW1lID0gbmFtZTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgcG9kQ291bnQgPSBwb2RzLmxlbmd0aDtcclxuICAgICAgdmFyIHBvZENvdW50VGV4dCA9IHBvZENvdW50ICsgXCIgcG9kXCIgKyAocG9kQ291bnQgPiAxID8gXCJzXCIgOiBcIlwiKTtcclxuICAgICAgdmFyIHZpZXcgPSB7XHJcbiAgICAgICAgYXBwTmFtZTogYXBwTmFtZSB8fCBuYW1lLFxyXG4gICAgICAgIG5hbWU6IG5hbWUsXHJcbiAgICAgICAgY3JlYXRlZERhdGU6IGFwcFZpZXcuJGNyZWF0aW9uRGF0ZSxcclxuICAgICAgICBwb2RDb3VudDogcG9kQ291bnQsXHJcbiAgICAgICAgcG9kQ291bnRUZXh0OiBwb2RDb3VudFRleHQsXHJcbiAgICAgICAgYWRkcmVzczogYWRkcmVzcyxcclxuICAgICAgICBjb250cm9sbGVySWQ6IGNvbnRyb2xsZXJJZCxcclxuICAgICAgICBzZXJ2aWNlOiBzZXJ2aWNlLFxyXG4gICAgICAgIHJlcGxpY2F0aW9uQ29udHJvbGxlcjogcmVwbGljYXRpb25Db250cm9sbGVyLFxyXG4gICAgICAgIHBvZHM6IHBvZHNcclxuICAgICAgfTtcclxuICAgICAgYXJyYXkucHVzaCh2aWV3KTtcclxuICAgIH1cclxuICAgIHJldHVybiBhcnJheTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNvbnZlcnRzIGEgZ2l0IHBhdGggaW50byBhbiBhY2Nlc3NpYmxlIFVSTCBmb3IgdGhlIGJyb3dzZXJcclxuICAgKi9cclxuICBleHBvcnQgZnVuY3Rpb24gZ2l0UGF0aFRvVXJsKGljb25QYXRoLCBicmFuY2ggPSBcIm1hc3RlclwiKSB7XHJcbiAgICByZXR1cm4gKEhhd3Rpb0NvcmUuaW5qZWN0b3IuZ2V0PHN0cmluZz4oJ0FwcExpYnJhcnlVUkwnKSB8fCAnJykgKyBcIi9naXQvXCIgKyBicmFuY2ggKyBpY29uUGF0aDtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGFzRGF0ZSh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHZhbHVlID8gbmV3IERhdGUodmFsdWUpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBlbnJpY2hCdWlsZENvbmZpZyhidWlsZENvbmZpZywgc29ydGVkQnVpbGRzKSB7XHJcbiAgICBpZiAoYnVpbGRDb25maWcpIHtcclxuICAgICAgdmFyIHRyaWdnZXJVcmw6c3RyaW5nID0gbnVsbDtcclxuICAgICAgdmFyIG1ldGFkYXRhID0gYnVpbGRDb25maWcubWV0YWRhdGEgfHwge307XHJcbiAgICAgIHZhciBuYW1lID0gbWV0YWRhdGEubmFtZTtcclxuICAgICAgYnVpbGRDb25maWcuJG5hbWUgPSBuYW1lO1xyXG4gICAgICB2YXIgcHJvamVjdExpbmsgPSBEZXZlbG9wZXIucHJvamVjdExpbmsobmFtZSk7XHJcbiAgICAgIHZhciBucyA9IG1ldGFkYXRhLm5hbWVzcGFjZSB8fCBjdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG4gICAgICBidWlsZENvbmZpZy4kbmFtZXNwYWNlID0gbnM7XHJcbiAgICAgIGJ1aWxkQ29uZmlnLmVudmlyb25tZW50cyA9IFtdO1xyXG4gICAgICBidWlsZENvbmZpZy4kY3JlYXRpb25EYXRlID0gYXNEYXRlKEt1YmVybmV0ZXMuZ2V0Q3JlYXRpb25UaW1lc3RhbXAoYnVpbGRDb25maWcpKTtcclxuICAgICAgYnVpbGRDb25maWcuJGxhYmVsc1RleHQgPSBLdWJlcm5ldGVzLmxhYmVsc1RvU3RyaW5nKGdldExhYmVscyhidWlsZENvbmZpZykpO1xyXG5cclxuICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICBidWlsZENvbmZpZy4kdmlld0xpbmsgPSBVcmxIZWxwZXJzLmpvaW4oXCJ3b3Jrc3BhY2VzXCIsIG5zLCBcInByb2plY3RzXCIsIG5hbWUsIFwiZW52aXJvbm1lbnRzXCIpO1xyXG4gICAgICAgIGJ1aWxkQ29uZmlnLiRlZGl0TGluayA9IFVybEhlbHBlcnMuam9pbihcIndvcmtzcGFjZXNcIiwgbnMsIFwicHJvamVjdHNcIiwgbmFtZSwgXCJidWlsZENvbmZpZ0VkaXRcIik7XHJcblxyXG4gICAgICAgIGFuZ3VsYXIuZm9yRWFjaChbZmFsc2UsIHRydWVdLCAoZmxhZykgPT4ge1xyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGJ1aWxkQ29uZmlnLnRyaWdnZXJzLCAodHJpZ2dlcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRyaWdnZXJVcmwpIHtcclxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IHRyaWdnZXIudHlwZTtcclxuICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJnZW5lcmljXCIgfHwgZmxhZykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGdlbmVyaWMgPSB0cmlnZ2VyW3R5cGVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgJiYgZ2VuZXJpYykge1xyXG4gICAgICAgICAgICAgICAgICB2YXIgc2VjcmV0ID0gZ2VuZXJpYy5zZWNyZXQ7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChzZWNyZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyVXJsID0gVXJsSGVscGVycy5qb2luKGJ1aWxkQ29uZmlnSG9va3NSZXN0VVJMKCksIG5hbWUsIHNlY3JldCwgdHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnVpbGRDb25maWcuJHRyaWdnZXJVcmwgPSB0cmlnZ2VyVXJsO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gbGV0cyBmaW5kIHRoZSBsYXRlc3QgYnVpbGQuLi5cclxuICAgICAgICBpZiAoc29ydGVkQnVpbGRzKSB7XHJcbiAgICAgICAgICBidWlsZENvbmZpZy4kbGFzdEJ1aWxkID0gXy5maW5kKHNvcnRlZEJ1aWxkcywge1xyXG4gICAgICAgICAgICBtZXRhZGF0YToge1xyXG4gICAgICAgICAgICAgIGxhYmVsczoge1xyXG4gICAgICAgICAgICAgICAgYnVpbGRjb25maWc6IG5hbWVcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB2YXIgJGZhYnJpYzhWaWV3cyA9IHt9O1xyXG5cclxuICAgICAgZnVuY3Rpb24gZGVmYXVsdFByb3BlcnRpZXNJZk5vdEV4aXN0KG5hbWUsIG9iamVjdCwgYXV0b0NyZWF0ZSA9IGZhbHNlKSB7XHJcbiAgICAgICAgdmFyIHZpZXcgPSAkZmFicmljOFZpZXdzW25hbWVdO1xyXG4gICAgICAgIGlmIChhdXRvQ3JlYXRlICYmICF2aWV3KSB7XHJcbiAgICAgICAgICB2aWV3ID0ge31cclxuICAgICAgICAgICRmYWJyaWM4Vmlld3NbbmFtZV0gPSB2aWV3O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmlldykge1xyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKG9iamVjdCwgKHZhbHVlLCBwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudCA9IHZpZXdbcHJvcGVydHldO1xyXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICB2aWV3W3Byb3BlcnR5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIGRlZmF1bHRQcm9wZXJ0aWVzSWZOb3RFeGlzdFN0YXJ0c1dpdGgocHJlZml4LCBvYmplY3QsIGF1dG9DcmVhdGUgPSBmYWxzZSkge1xyXG4gICAgICAgIGFuZ3VsYXIuZm9yRWFjaCgkZmFicmljOFZpZXdzLCAodmlldywgbmFtZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHZpZXcgJiYgbmFtZS5zdGFydHNXaXRoKHByZWZpeCkpIHtcclxuICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKG9iamVjdCwgKHZhbHVlLCBwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgICAgIHZhciBjdXJyZW50ID0gdmlld1twcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgaWYgKCFjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICB2aWV3W3Byb3BlcnR5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBsYWJlbHMgPSBtZXRhZGF0YS5sYWJlbHMgfHwge307XHJcbiAgICAgIHZhciBhbm5vdGF0aW9ucyA9IG1ldGFkYXRhLmFubm90YXRpb25zIHx8IHt9O1xyXG5cclxuICAgICAgLy8gbGV0cyBkZWZhdWx0IHRoZSByZXBvIGFuZCB1c2VyXHJcbiAgICAgIGJ1aWxkQ29uZmlnLiR1c2VyID0gYW5ub3RhdGlvbnNbXCJmYWJyaWM4LmplbmtpbnMvdXNlclwiXSB8fCBsYWJlbHNbXCJ1c2VyXCJdO1xyXG4gICAgICBidWlsZENvbmZpZy4kcmVwbyA9IGFubm90YXRpb25zW1wiZmFicmljOC5qZW5raW5zL3JlcG9cIl0gfHwgbGFiZWxzW1wicmVwb1wiXTtcclxuXHJcbiAgICAgIGFuZ3VsYXIuZm9yRWFjaChhbm5vdGF0aW9ucywgKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgICB2YXIgcGFydHMgPSBrZXkuc3BsaXQoJy8nLCAyKTtcclxuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgdmFyIGxpbmtJZCA9IHBhcnRzWzBdO1xyXG4gICAgICAgICAgdmFyIHByb3BlcnR5ID0gcGFydHNbMV07XHJcbiAgICAgICAgICBpZiAobGlua0lkICYmIHByb3BlcnR5ICYmIGxpbmtJZC5zdGFydHNXaXRoKFwiZmFicmljOC5saW5rXCIpKSB7XHJcbiAgICAgICAgICAgIHZhciBsaW5rID0gJGZhYnJpYzhWaWV3c1tsaW5rSWRdO1xyXG4gICAgICAgICAgICBpZiAoIWxpbmspIHtcclxuICAgICAgICAgICAgICBsaW5rID0ge1xyXG4gICAgICAgICAgICAgICAgY2xhc3M6IGxpbmtJZFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgJGZhYnJpYzhWaWV3c1tsaW5rSWRdID0gbGluaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaW5rW3Byb3BlcnR5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoYnVpbGRDb25maWcuJHVzZXIgJiYgYnVpbGRDb25maWcuJHJlcG8pIHtcclxuICAgICAgICAvLyBicm93c2UgZ29ncyByZXBvIHZpZXdcclxuICAgICAgICB2YXIgZ29nc1VybCA9IHNlcnZpY2VMaW5rVXJsKGdvZ3NTZXJ2aWNlTmFtZSk7XHJcbiAgICAgICAgaWYgKGdvZ3NVcmwpIHtcclxuICAgICAgICAgIGRlZmF1bHRQcm9wZXJ0aWVzSWZOb3RFeGlzdChcImZhYnJpYzgubGluay5icm93c2VHb2dzLnZpZXdcIiwge1xyXG4gICAgICAgICAgICBsYWJlbDogXCJCcm93c2UuLi5cIixcclxuICAgICAgICAgICAgdXJsOiBVcmxIZWxwZXJzLmpvaW4oZ29nc1VybCwgYnVpbGRDb25maWcuJHVzZXIsIGJ1aWxkQ29uZmlnLiRyZXBvKSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQnJvd3NlIHRoZSBzb3VyY2UgY29kZSBvZiB0aGlzIHJlcG9zaXRvcnlcIixcclxuICAgICAgICAgICAgaWNvbkNsYXNzOiBcImZhIGZhLWV4dGVybmFsLWxpbmtcIlxyXG4gICAgICAgICAgfSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBydW4gZm9yZ2UgY29tbWFuZHMgdmlld1xyXG4gICAgICAgIGRlZmF1bHRQcm9wZXJ0aWVzSWZOb3RFeGlzdChcImZhYnJpYzgubGluay5mb3JnZUNvbW1hbmQudmlld1wiLCB7XHJcbiAgICAgICAgICBsYWJlbDogXCJDb21tYW5kLi4uXCIsXHJcbiAgICAgICAgICB1cmw6IFVybEhlbHBlcnMuam9pbihwcm9qZWN0TGluaywgXCIvZm9yZ2UvY29tbWFuZHMvdXNlclwiLCBidWlsZENvbmZpZy4kdXNlciwgYnVpbGRDb25maWcuJHJlcG8pLFxyXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiUGVyZm9ybSBhbiBhY3Rpb24gb24gdGhpcyBwcm9qZWN0XCIsXHJcbiAgICAgICAgICBpY29uQ2xhc3M6IFwiZmEgZmEtcGxheS1jaXJjbGVcIlxyXG4gICAgICAgIH0sIHRydWUpO1xyXG5cclxuXHJcbiAgICAgICAgLy8gY29uZmlndXJlIGRldm9wcyB2aWV3XHJcbiAgICAgICAgZGVmYXVsdFByb3BlcnRpZXNJZk5vdEV4aXN0KFwiZmFicmljOC5saW5rLmZvcmdlQ29tbWFuZC5kZXZvcHMuc2V0dGluZ3NcIiwge1xyXG4gICAgICAgICAgbGFiZWw6IFwiU2V0dGluZ3NcIixcclxuICAgICAgICAgIHVybDogVXJsSGVscGVycy5qb2luKHByb2plY3RMaW5rLCBcIi9mb3JnZS9jb21tYW5kL2Rldm9wcy1lZGl0L3VzZXJcIiwgYnVpbGRDb25maWcuJHVzZXIsIGJ1aWxkQ29uZmlnLiRyZXBvKSxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbmZpZ3VyZSB0aGUgRGV2T3BzIHNldHRpbmdzIGZvciB0aGlzIHByb2plY3RcIixcclxuICAgICAgICAgIGljb25DbGFzczogXCJmYSBmYS1wZW5jaWwtc3F1YXJlLW9cIlxyXG4gICAgICAgIH0sIHRydWUpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWRkIHNvbWUgaWNvbnMgYW5kIGRlc2NyaXB0aW9uc1xyXG4gICAgICBkZWZhdWx0UHJvcGVydGllc0lmTm90RXhpc3QoXCJmYWJyaWM4LmxpbmsucmVwb3NpdG9yeS5icm93c2VcIiwge1xyXG4gICAgICAgIGxhYmVsOiBcIkJyb3dzZS4uLlwiLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkJyb3dzZSB0aGUgc291cmNlIGNvZGUgb2YgdGhpcyByZXBvc2l0b3J5XCIsXHJcbiAgICAgICAgaWNvbkNsYXNzOiBcImZhIGZhLWV4dGVybmFsLWxpbmtcIlxyXG4gICAgICB9KTtcclxuICAgICAgZGVmYXVsdFByb3BlcnRpZXNJZk5vdEV4aXN0KFwiZmFicmljOC5saW5rLmplbmtpbnMuam9iXCIsIHtcclxuICAgICAgICBpY29uQ2xhc3M6IFwiZmEgZmEtdGFza3NcIixcclxuICAgICAgICBkZXNjcmlwdGlvbjogXCJWaWV3IHRoZSBKZW5raW5zIEpvYiBmb3IgdGhpcyBidWlsZFwiXHJcbiAgICAgIH0pO1xyXG4gICAgICBkZWZhdWx0UHJvcGVydGllc0lmTm90RXhpc3QoXCJmYWJyaWM4LmxpbmsuamVua2lucy5tb25pdG9yXCIsIHtcclxuICAgICAgICBpY29uQ2xhc3M6IFwiZmEgZmEtdGFjaG9tZXRlclwiLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlZpZXcgdGhlIEplbmtpbnMgTW9uaXRvciBkYXNoYm9hcmQgZm9yIHRoaXMgcHJvamVjdFwiXHJcbiAgICAgIH0pO1xyXG4gICAgICBkZWZhdWx0UHJvcGVydGllc0lmTm90RXhpc3QoXCJmYWJyaWM4LmxpbmsuamVua2lucy5waXBlbGluZVwiLCB7XHJcbiAgICAgICAgaWNvbkNsYXNzOiBcImZhIGZhLWFycm93LWNpcmNsZS1vLXJpZ2h0XCIsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IFwiVmlldyB0aGUgSmVua2lucyBQaXBlbGluZSBmb3IgdGhpcyBwcm9qZWN0XCJcclxuICAgICAgfSk7XHJcbiAgICAgIGRlZmF1bHRQcm9wZXJ0aWVzSWZOb3RFeGlzdChcImZhYnJpYzgubGluay5sZXRzY2hhdC5yb29tXCIsIHtcclxuICAgICAgICBpY29uQ2xhc3M6IFwiZmEgZmEtY29tbWVudFwiLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkNoYXQgcm9vbSBmb3IgdGhpcyBwcm9qZWN0XCJcclxuICAgICAgfSk7XHJcbiAgICAgIGRlZmF1bHRQcm9wZXJ0aWVzSWZOb3RFeGlzdChcImZhYnJpYzgubGluay5sZXRzY2hhdC5yb29tXCIsIHtcclxuICAgICAgICBpY29uQ2xhc3M6IFwiZmEgZmEtY29tbWVudFwiLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkNoYXQgcm9vbSBmb3IgdGhpcyBwcm9qZWN0XCJcclxuICAgICAgfSk7XHJcbiAgICAgIGRlZmF1bHRQcm9wZXJ0aWVzSWZOb3RFeGlzdChcImZhYnJpYzgubGluay50YWlnYVwiLCB7XHJcbiAgICAgICAgaWNvbkNsYXNzOiBcImZhIGZhLWNoZWNrLXNxdWFyZS1vXCIsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IFwiSXNzdWUgdHJhY2tlciBmb3IgdGhpcyBwcm9qZWN0XCJcclxuICAgICAgfSk7XHJcbiAgICAgIGRlZmF1bHRQcm9wZXJ0aWVzSWZOb3RFeGlzdChcImZhYnJpYzgubGluay5pc3N1ZXNcIiwge1xyXG4gICAgICAgIGljb25DbGFzczogXCJmYSBmYS1jaGVjay1zcXVhcmUtb1wiLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIklzc3VlcyBmb3IgdGhpcyBwcm9qZWN0XCJcclxuICAgICAgfSk7XHJcbiAgICAgIGRlZmF1bHRQcm9wZXJ0aWVzSWZOb3RFeGlzdChcImZhYnJpYzgubGluay5yZWxlYXNlc1wiLCB7XHJcbiAgICAgICAgaWNvbkNsYXNzOiBcImZhIGZhLXRhZ1wiLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIklzc3VlcyBmb3IgdGhpcyBwcm9qZWN0XCJcclxuICAgICAgfSk7XHJcbiAgICAgIGRlZmF1bHRQcm9wZXJ0aWVzSWZOb3RFeGlzdChcImZhYnJpYzgubGluay50YWlnYS50ZWFtXCIsIHtcclxuICAgICAgICBpY29uQ2xhc3M6IFwiZmEgZmEtdXNlcnNcIixcclxuICAgICAgICBkZXNjcmlwdGlvbjogXCJUZWFtIG1lbWJlcnMgZm9yIHRoaXMgcHJvamVjdFwiXHJcbiAgICAgIH0pO1xyXG4gICAgICBkZWZhdWx0UHJvcGVydGllc0lmTm90RXhpc3QoXCJmYWJyaWM4LmxpbmsudGVhbVwiLCB7XHJcbiAgICAgICAgaWNvbkNsYXNzOiBcImZhIGZhLXVzZXJzXCIsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IFwiVGVhbSBtZW1iZXJzIGZvciB0aGlzIHByb2plY3RcIlxyXG4gICAgICB9KTtcclxuICAgICAgZGVmYXVsdFByb3BlcnRpZXNJZk5vdEV4aXN0U3RhcnRzV2l0aChcImZhYnJpYzgubGluay5lbnZpcm9ubWVudC5cIiwge1xyXG4gICAgICAgIGljb25DbGFzczogXCJmYSBmYS1jbG91ZFwiLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBrdWJlcm5ldGVzIG5hbWVzcGFjZSBmb3IgdGhpcyBlbnZpcm9ubWVudFwiXHJcbiAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgIC8vIGxldHMgcHV0IHRoZSB2aWV3cyBpbnRvIHNlY3Rpb25zLi4uXHJcbiAgICAgIHZhciAkZmFicmljOENvZGVWaWV3cyA9IHt9O1xyXG4gICAgICB2YXIgJGZhYnJpYzhCdWlsZFZpZXdzID0ge307XHJcbiAgICAgIHZhciAkZmFicmljOFRlYW1WaWV3cyA9IHt9O1xyXG4gICAgICB2YXIgJGZhYnJpYzhFbnZpcm9ubWVudFZpZXdzID0ge307XHJcbiAgICAgIGFuZ3VsYXIuZm9yRWFjaCgkZmFicmljOFZpZXdzLCAodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAgIHZhciB2aWV3O1xyXG4gICAgICAgIGlmIChrZXkuaW5kZXhPZihcInRhaWdhXCIpID4gMCB8fCBrZXkuaW5kZXhPZihcIi5pc3N1ZVwiKSA+IDAgfHwga2V5LmluZGV4T2YoXCJsZXRzY2hhdFwiKSA+IDB8fCBrZXkuaW5kZXhPZihcIi50ZWFtXCIpID4gMCkge1xyXG4gICAgICAgICAgdmlldyA9ICRmYWJyaWM4VGVhbVZpZXdzO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5LmluZGV4T2YoXCJqZW5raW5zXCIpID4gMCkge1xyXG4gICAgICAgICAgdmlldyA9ICRmYWJyaWM4QnVpbGRWaWV3cztcclxuICAgICAgICB9IGVsc2UgaWYgKGtleS5pbmRleE9mKFwiLmVudmlyb25tZW50LlwiKSA+IDApIHtcclxuICAgICAgICAgIHZpZXcgPSAkZmFicmljOEVudmlyb25tZW50Vmlld3M7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZpZXcgPSAkZmFicmljOENvZGVWaWV3cztcclxuICAgICAgICB9XHJcbiAgICAgICAgdmlld1trZXldID0gdmFsdWU7XHJcbiAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgIGJ1aWxkQ29uZmlnLiRmYWJyaWM4Vmlld3MgPSAkZmFicmljOFZpZXdzO1xyXG4gICAgICBidWlsZENvbmZpZy4kZmFicmljOENvZGVWaWV3cyA9ICRmYWJyaWM4Q29kZVZpZXdzO1xyXG4gICAgICBidWlsZENvbmZpZy4kZmFicmljOEJ1aWxkVmlld3MgPSAkZmFicmljOEJ1aWxkVmlld3M7XHJcbiAgICAgIGJ1aWxkQ29uZmlnLiRmYWJyaWM4RW52aXJvbm1lbnRWaWV3cyA9ICRmYWJyaWM4RW52aXJvbm1lbnRWaWV3cztcclxuICAgICAgYnVpbGRDb25maWcuJGZhYnJpYzhUZWFtVmlld3MgPSAkZmFicmljOFRlYW1WaWV3cztcclxuXHJcbiAgICAgIHZhciAkamVua2luc0pvYiA9IGFubm90YXRpb25zW1wiZmFicmljOC5pby9qZW5raW5zLWpvYlwiXTtcclxuICAgICAgaWYgKCEkamVua2luc0pvYiAmJiAkZmFicmljOFZpZXdzW1wiZmFicmljOC5saW5rLmplbmtpbnMuam9iXCJdKSB7XHJcbiAgICAgICAgJGplbmtpbnNKb2IgPSBuYW1lO1xyXG4gICAgICB9XHJcbiAgICAgIGJ1aWxkQ29uZmlnLiRqZW5raW5zSm9iID0gJGplbmtpbnNKb2I7XHJcblxyXG4gICAgICBhbmd1bGFyLmZvckVhY2goJGZhYnJpYzhFbnZpcm9ubWVudFZpZXdzLCAoZW52KSA9PiB7XHJcbiAgICAgICAgdmFyIGMgPSBlbnYuY2xhc3M7XHJcbiAgICAgICAgdmFyIHByZWZpeCA9IFwiZmFicmljOC5saW5rLmVudmlyb25tZW50LlwiO1xyXG4gICAgICAgIGlmIChjICYmIGMuc3RhcnRzV2l0aChwcmVmaXgpKSB7XHJcbiAgICAgICAgICB2YXIgZW5zID0gYy5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCk7XHJcbiAgICAgICAgICBlbnYubmFtZXNwYWNlID0gZW5zO1xyXG4gICAgICAgICAgZW52LnVybCA9IFVybEhlbHBlcnMuam9pbihcIi93b3Jrc3BhY2VzXCIsIG5zLCBcInByb2plY3RzXCIsIG5hbWUsIFwibmFtZXNwYWNlXCIsIGVucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJ1aWxkQ29uZmlnLmVudmlyb25tZW50cy5wdXNoKGVudik7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoIWJ1aWxkQ29uZmlnLmVudmlyb25tZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAvLyBsZXRzIGNyZWF0ZSBhIHNpbmdsZSBlbnZpcm9ubWVudFxyXG4gICAgICAgIHZhciBlbnMgPSBucztcclxuICAgICAgICB2YXIgZW52ID0ge1xyXG4gICAgICAgICAgbmFtZXNwYWNlOiBlbnMsXHJcbiAgICAgICAgICBsYWJlbDogXCJDdXJyZW50XCIsXHJcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZW52aXJvbmVtbnQgdGhhdCB0aGlzIHByb2plY3QgaXMgYnVpbHQgYW5kIHJ1biBpbnNpZGVcIixcclxuICAgICAgICAgIGljb25DbGFzczogXCJmYSBmYS1jbG91ZFwiLFxyXG4gICAgICAgICAgdXJsOiBVcmxIZWxwZXJzLmpvaW4oXCIvd29ya3NwYWNlc1wiLCBucywgXCJwcm9qZWN0c1wiLCBuYW1lLCBcIm5hbWVzcGFjZVwiLCBlbnMpXHJcbiAgICAgICAgfTtcclxuICAgICAgICBidWlsZENvbmZpZy5lbnZpcm9ubWVudHMucHVzaChlbnYpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgYnVpbGRDb25maWcuZW52aXJvbm1lbnRzID0gYnVpbGRDb25maWcuZW52aXJvbm1lbnRzLnJldmVyc2UoKTtcclxuXHJcbiAgICAgIGJ1aWxkQ29uZmlnLnRvb2xzID0gW107XHJcbiAgICAgIGFuZ3VsYXIuZm9yRWFjaCgkZmFicmljOENvZGVWaWV3cywgKGVudikgPT4ge1xyXG4gICAgICAgIGJ1aWxkQ29uZmlnLnRvb2xzLnB1c2goZW52KTtcclxuICAgICAgfSk7XHJcbiAgICAgIGFuZ3VsYXIuZm9yRWFjaCgkZmFicmljOFRlYW1WaWV3cywgKGVudikgPT4ge1xyXG4gICAgICAgIGJ1aWxkQ29uZmlnLnRvb2xzLnB1c2goZW52KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGVucmljaEJ1aWxkQ29uZmlncyhidWlsZENvbmZpZ3MsIHNvcnRlZEJ1aWxkcyA9IG51bGwpIHtcclxuICAgIGFuZ3VsYXIuZm9yRWFjaChidWlsZENvbmZpZ3MsIChidWlsZENvbmZpZykgPT4ge1xyXG4gICAgICBlbnJpY2hCdWlsZENvbmZpZyhidWlsZENvbmZpZywgc29ydGVkQnVpbGRzKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGJ1aWxkQ29uZmlncztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBlbnJpY2hCdWlsZHMoYnVpbGRzKSB7XHJcbiAgICBhbmd1bGFyLmZvckVhY2goYnVpbGRzLCAoYnVpbGQpID0+IHtcclxuICAgICAgZW5yaWNoQnVpbGQoYnVpbGQpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gXy5zb3J0QnkoYnVpbGRzLCBcIiRjcmVhdGlvbkRhdGVcIikucmV2ZXJzZSgpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGVucmljaEJ1aWxkKGJ1aWxkKSB7XHJcbiAgICBpZiAoYnVpbGQpIHtcclxuICAgICAgdmFyIG1ldGFkYXRhID0gYnVpbGQubWV0YWRhdGEgfHwge307XHJcbiAgICAgIHZhciBhbm5vdGF0aW9ucyA9IG1ldGFkYXRhLmFubm90YXRpb25zIHx8IHt9O1xyXG4gICAgICB2YXIgbmFtZSA9IGdldE5hbWUoYnVpbGQpO1xyXG4gICAgICB2YXIgbmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlKGJ1aWxkKTtcclxuICAgICAgYnVpbGQuJG5hbWUgPSBuYW1lO1xyXG4gICAgICBidWlsZC4kbmFtZXNwYWNlID0gbmFtZXNwYWNlO1xyXG5cclxuICAgICAgdmFyIG5hbWVBcnJheSA9IG5hbWUuc3BsaXQoXCItXCIpO1xyXG4gICAgICB2YXIgbmFtZUFycmF5TGVuZ3RoID0gbmFtZUFycmF5Lmxlbmd0aDtcclxuICAgICAgYnVpbGQuJHNob3J0TmFtZSA9IChuYW1lQXJyYXlMZW5ndGggPiA0KSA/IG5hbWVBcnJheS5zbGljZSgwLCBuYW1lQXJyYXlMZW5ndGggLSA0KS5qb2luKFwiLVwiKSA6IG5hbWUuc3Vic3RyaW5nKDAsIDMwKTtcclxuXHJcbiAgICAgIHZhciBsYWJlbHMgPSBnZXRMYWJlbHMoYnVpbGQpO1xyXG4gICAgICB2YXIgY29uZmlnSWQgPSBsYWJlbHMuYnVpbGRjb25maWc7XHJcbiAgICAgIGJ1aWxkLiRjb25maWdJZCA9IGNvbmZpZ0lkO1xyXG4gICAgICBpZiAoY29uZmlnSWQpIHtcclxuICAgICAgICAvL2J1aWxkLiRjb25maWdMaW5rID0gVXJsSGVscGVycy5qb2luKFwia3ViZXJuZXRlcy9idWlsZENvbmZpZ3NcIiwgY29uZmlnSWQpO1xyXG4gICAgICAgIGJ1aWxkLiRjb25maWdMaW5rID0gVXJsSGVscGVycy5qb2luKFwid29ya3NwYWNlc1wiLCBjdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpLCBcInByb2plY3RzXCIsIGNvbmZpZ0lkKTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgY3JlYXRpb25UaW1lc3RhbXAgPSBnZXRDcmVhdGlvblRpbWVzdGFtcChidWlsZCk7XHJcbiAgICAgIGlmIChjcmVhdGlvblRpbWVzdGFtcCkge1xyXG4gICAgICAgIHZhciBkID0gbmV3IERhdGUoY3JlYXRpb25UaW1lc3RhbXApO1xyXG4gICAgICAgIGJ1aWxkLiRjcmVhdGlvbkRhdGUgPSBkO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgLy9idWlsZC4kdmlld0xpbmsgPSBVcmxIZWxwZXJzLmpvaW4oXCJrdWJlcm5ldGVzL2J1aWxkc1wiLCBuYW1lKTtcclxuICAgICAgICB2YXIgcHJvamVjdExpbmsgPSBVcmxIZWxwZXJzLmpvaW4oXCJ3b3Jrc3BhY2VzXCIsIGN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCksIFwicHJvamVjdHNcIiwgY29uZmlnSWQpO1xyXG4gICAgICAgIGJ1aWxkLiR2aWV3TGluayA9IFVybEhlbHBlcnMuam9pbihwcm9qZWN0TGluaywgXCJidWlsZHNcIiwgbmFtZSk7XHJcbiAgICAgICAgLy9idWlsZC4kbG9nc0xpbmsgPSBVcmxIZWxwZXJzLmpvaW4oXCJrdWJlcm5ldGVzL2J1aWxkTG9nc1wiLCBuYW1lKTtcclxuICAgICAgICBidWlsZC4kbG9nc0xpbmsgPSBVcmxIZWxwZXJzLmpvaW4ocHJvamVjdExpbmssIFwiYnVpbGRMb2dzXCIsIG5hbWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGJ1aWxkLnBvZE5hbWUgPSBidWlsZC5wb2ROYW1lIHx8IGFubm90YXRpb25zW1wib3BlbnNoaWZ0LmlvL2J1aWxkLnBvZC1uYW1lXCJdO1xyXG4gICAgICB2YXIgcG9kTmFtZSA9IGJ1aWxkLnBvZE5hbWU7XHJcbiAgICAgIGlmIChwb2ROYW1lICYmIG5hbWVzcGFjZSkge1xyXG4gICAgICAgIHZhciBwb2ROYW1lQXJyYXkgPSBwb2ROYW1lLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICB2YXIgcG9kTmFtZUFycmF5TGVuZ3RoID0gcG9kTmFtZUFycmF5Lmxlbmd0aDtcclxuICAgICAgICBidWlsZC4kcG9kU2hvcnROYW1lID0gKHBvZE5hbWVBcnJheUxlbmd0aCA+IDUpID8gcG9kTmFtZUFycmF5W3BvZE5hbWVBcnJheUxlbmd0aCAtIDVdIDogcG9kTmFtZS5zdWJzdHJpbmcoMCwgMzApO1xyXG4gICAgICAgIGJ1aWxkLiRwb2RMaW5rID0gVXJsSGVscGVycy5qb2luKFwia3ViZXJuZXRlcy9uYW1lc3BhY2VcIiwgbmFtZXNwYWNlLCBcInBvZHNcIiwgcG9kTmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBidWlsZDtcclxuICB9XHJcblxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZW5yaWNoRGVwbG95bWVudENvbmZpZyhkZXBsb3ltZW50Q29uZmlnKSB7XHJcbiAgICBpZiAoZGVwbG95bWVudENvbmZpZykge1xyXG4gICAgICB2YXIgdHJpZ2dlclVybDpzdHJpbmcgPSBudWxsO1xyXG4gICAgICB2YXIgbmFtZSA9IENvcmUucGF0aEdldChkZXBsb3ltZW50Q29uZmlnLCBbXCJtZXRhZGF0YVwiLCBcIm5hbWVcIl0pO1xyXG4gICAgICBkZXBsb3ltZW50Q29uZmlnLiRuYW1lID0gbmFtZTtcclxuICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgIGFuZ3VsYXIuZm9yRWFjaChkZXBsb3ltZW50Q29uZmlnLnRyaWdnZXJzLCAodHJpZ2dlcikgPT4ge1xyXG4gICAgICAgIHZhciB0eXBlID0gdHJpZ2dlci50eXBlO1xyXG4gICAgICAgIGlmICghZGVwbG95bWVudENvbmZpZy4kaW1hZ2VDaGFuZ2VQYXJhbXMgJiYgdHlwZSA9PT0gXCJJbWFnZUNoYW5nZVwiKSB7XHJcbiAgICAgICAgICB2YXIgaW1hZ2VDaGFuZ2VQYXJhbXMgPSB0cmlnZ2VyLmltYWdlQ2hhbmdlUGFyYW1zO1xyXG4gICAgICAgICAgaWYgKGltYWdlQ2hhbmdlUGFyYW1zKSB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXJOYW1lcyA9IGltYWdlQ2hhbmdlUGFyYW1zLmNvbnRhaW5lck5hbWVzIHx8IFtdO1xyXG4gICAgICAgICAgICBpbWFnZUNoYW5nZVBhcmFtcy4kY29udGFpbmVyTmFtZXMgPSBjb250YWluZXJOYW1lcy5qb2luKFwiIFwiKTtcclxuICAgICAgICAgICAgZGVwbG95bWVudENvbmZpZy4kaW1hZ2VDaGFuZ2VQYXJhbXMgPSBpbWFnZUNoYW5nZVBhcmFtcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGVucmljaERlcGxveW1lbnRDb25maWdzKGRlcGxveW1lbnRDb25maWdzKSB7XHJcbiAgICBhbmd1bGFyLmZvckVhY2goZGVwbG95bWVudENvbmZpZ3MsIChkZXBsb3ltZW50Q29uZmlnKSA9PiB7XHJcbiAgICAgIGVucmljaERlcGxveW1lbnRDb25maWcoZGVwbG95bWVudENvbmZpZyk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBkZXBsb3ltZW50Q29uZmlncztcclxuICB9XHJcblxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZW5yaWNoRXZlbnQoZXZlbnQpIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICB2YXIgbWV0YWRhdGEgPSBldmVudC5tZXRhZGF0YSB8fCB7fTtcclxuXHJcbiAgICAgIHZhciBmaXJzdFRpbWVzdGFtcCA9IGV2ZW50LmZpcnN0VGltZXN0YW1wO1xyXG4gICAgICBpZiAoZmlyc3RUaW1lc3RhbXApIHtcclxuICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKGZpcnN0VGltZXN0YW1wKTtcclxuICAgICAgICBldmVudC4kZmlyc3RUaW1lc3RhbXAgPSBkO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciBsYXN0VGltZXN0YW1wID0gZXZlbnQubGFzdFRpbWVzdGFtcDtcclxuICAgICAgaWYgKGxhc3RUaW1lc3RhbXApIHtcclxuICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKGxhc3RUaW1lc3RhbXApO1xyXG4gICAgICAgIGV2ZW50LiRsYXN0VGltZXN0YW1wID0gZDtcclxuICAgICAgfVxyXG4gICAgICB2YXIgbGFiZWxzID0gYW5ndWxhci5jb3B5KGV2ZW50LnNvdXJjZSB8fCB7fSk7XHJcbiAgICAgIHZhciBpbnZvbHZlZE9iamVjdCA9IGV2ZW50Lmludm9sdmVkT2JqZWN0IHx8IHt9O1xyXG4gICAgICB2YXIgbmFtZSA9IGludm9sdmVkT2JqZWN0Lm5hbWU7XHJcbiAgICAgIHZhciBraW5kID0gaW52b2x2ZWRPYmplY3Qua2luZDtcclxuICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICBsYWJlbHNbJ25hbWUnXSA9IG5hbWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGtpbmQpIHtcclxuICAgICAgICBsYWJlbHNbJ2tpbmQnXSA9IGtpbmQ7XHJcbiAgICAgIH1cclxuICAgICAgZXZlbnQuJGxhYmVsc1RleHQgPSBLdWJlcm5ldGVzLmxhYmVsc1RvU3RyaW5nKGxhYmVscyk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGVucmljaEV2ZW50cyhldmVudHMsIG1vZGVsID0gbnVsbCkge1xyXG4gICAgYW5ndWxhci5mb3JFYWNoKGV2ZW50cywgKGV2ZW50KSA9PiB7XHJcbiAgICAgIGVucmljaEV2ZW50KGV2ZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGxldHMgdXBkYXRlIGxpbmtzIHRvIHRoZSBldmVudHMgZm9yIGVhY2ggcG9kIGFuZCBSQ1xyXG4gICAgaWYgKG1vZGVsKSB7XHJcbiAgICAgIGZ1bmN0aW9uIGNsZWFyRXZlbnRzKGVudGl0eSkge1xyXG4gICAgICAgIGVudGl0eS4kZXZlbnRzID0gW107XHJcbiAgICAgICAgZW50aXR5LiRldmVudHNMaW5rID0gbnVsbDtcclxuICAgICAgICBlbnRpdHkuJGV2ZW50Q291bnQgPSAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiB1cGRhdGVFdmVudChlbnRpdHksIGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGVudGl0eSkge1xyXG4gICAgICAgICAgZW50aXR5LiRldmVudHMucHVzaChldmVudCk7XHJcbiAgICAgICAgICBpZiAoIWVudGl0eS4kZXZlbnRzTGluaykge1xyXG4gICAgICAgICAgICBlbnRpdHkuJGV2ZW50c0xpbmsgPSBVcmxIZWxwZXJzLmpvaW4oXCIva3ViZXJuZXRlcy9uYW1lc3BhY2UvXCIsIGN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCksIFwiZXZlbnRzXCIpICsgXCI/cT1raW5kJTNEXCIgKyBlbnRpdHkua2luZCArIFwiJTIwbmFtZSUzRFwiICsgZW50aXR5Lm1ldGFkYXRhLm5hbWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbnRpdHkuJGV2ZW50Q291bnQgPSBlbnRpdHkuJGV2ZW50cy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgcG9kcyA9IG1vZGVsLnBvZHMgfHwgW107XHJcbiAgICAgIHZhciByY3MgPSBtb2RlbC5yZXBsaWNhdGlvbkNvbnRyb2xsZXJzIHx8IFtdO1xyXG4gICAgICBhbmd1bGFyLmZvckVhY2gocG9kcywgY2xlYXJFdmVudHMpO1xyXG4gICAgICBhbmd1bGFyLmZvckVhY2gocmNzLCBjbGVhckV2ZW50cyk7XHJcblxyXG4gICAgICBhbmd1bGFyLmZvckVhY2goZXZlbnRzLCAoZXZlbnQpID0+IHtcclxuICAgICAgICB2YXIgaW52b2x2ZWRPYmplY3QgPSBldmVudC5pbnZvbHZlZE9iamVjdCB8fCB7fTtcclxuICAgICAgICB2YXIgbmFtZSA9IGludm9sdmVkT2JqZWN0Lm5hbWU7XHJcbiAgICAgICAgdmFyIGtpbmQgPSBpbnZvbHZlZE9iamVjdC5raW5kO1xyXG4gICAgICAgIHZhciBucyA9IG1vZGVsLmN1cnJlbnROYW1lc3BhY2UoKTtcclxuICAgICAgICBpZiAobmFtZSAmJiBraW5kICYmIG5zKSB7XHJcbiAgICAgICAgICB2YXIgZW50aXR5ID0gbnVsbDtcclxuICAgICAgICAgIGlmIChraW5kID09PSBcIlJlcGxpY2F0aW9uQ29udHJvbGxlclwiKSB7XHJcbiAgICAgICAgICAgIGVudGl0eSA9IG1vZGVsLmdldFJlcGxpY2F0aW9uQ29udHJvbGxlcihucywgbmFtZSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IFwiUG9kXCIpIHtcclxuICAgICAgICAgICAgZW50aXR5ID0gbW9kZWwuZ2V0UG9kKG5zLCBuYW1lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlbnRpdHkpIHtcclxuICAgICAgICAgICAgdXBkYXRlRXZlbnQoZW50aXR5LCBldmVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBldmVudHM7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZW5yaWNoSW1hZ2VSZXBvc2l0b3J5KGltYWdlUmVwb3NpdG9yeSkge1xyXG4gICAgaWYgKGltYWdlUmVwb3NpdG9yeSkge1xyXG4gICAgICB2YXIgdHJpZ2dlclVybDpzdHJpbmcgPSBudWxsO1xyXG4gICAgICB2YXIgbmFtZSA9IENvcmUucGF0aEdldChpbWFnZVJlcG9zaXRvcnksIFtcIm1ldGFkYXRhXCIsIFwibmFtZVwiXSk7XHJcbiAgICAgIGltYWdlUmVwb3NpdG9yeS4kbmFtZSA9IG5hbWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZW5yaWNoSW1hZ2VSZXBvc2l0b3JpZXMoaW1hZ2VSZXBvc2l0b3JpZXMpIHtcclxuICAgIGFuZ3VsYXIuZm9yRWFjaChpbWFnZVJlcG9zaXRvcmllcywgKGltYWdlUmVwb3NpdG9yeSkgPT4ge1xyXG4gICAgICBlbnJpY2hJbWFnZVJlcG9zaXRvcnkoaW1hZ2VSZXBvc2l0b3J5KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGltYWdlUmVwb3NpdG9yaWVzO1xyXG4gIH1cclxuXHJcblxyXG4gIHZhciBsYWJlbENvbG9ycyA9IHsgICAgXHJcbiAgICAncmVnaW9uJzogJ2s4cy1iYWRnZS1yZWdpb24nLCAgICBcclxuICAgICdzeXN0ZW0nOiAnazhzLWJhZGdlLXN5c3RlbScsXHJcbiAgICAnaXNUYXJnZXQnOiAnazhzLWJhZGdlLXRhcmdldCcsXHJcbiAgfTtcclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5lckxhYmVsQ2xhc3MobGFiZWxUeXBlOnN0cmluZykgeyAgICBcclxuICAgIGlmICghKGxhYmVsVHlwZSBpbiBsYWJlbENvbG9ycykpIHtcclxuICAgICAgcmV0dXJuICdtb3VzZS1wb2ludGVyJztcclxuICAgIH1cclxuICAgIGVsc2UgcmV0dXJuIGxhYmVsQ29sb3JzW2xhYmVsVHlwZV0gKyAnIG1vdXNlLXBvaW50ZXInO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmFicmljOCBmb3JnZSBwbHVnaW4gaXMgZW5hYmxlZFxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBpc0ZvcmdlRW5hYmxlZCgpIHtcclxuICAgIC8vIFRPRE8gc2hvdWxkIHJldHVybiB0cnVlIGlmIHRoZSBzZXJ2aWNlIFwiZmFicmljOC1mb3JnZVwiIGlzIHZhbGlkXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQga3ViZXJuZXRlcyBzZWxlY3RlZCBuYW1lc3BhY2Ugb3IgdGhlIGRlZmF1bHQgb25lXHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCkge1xyXG4gICAgdmFyIGluamVjdG9yID0gSGF3dGlvQ29yZS5pbmplY3RvcjtcclxuICAgIGlmIChpbmplY3Rvcikge1xyXG4gICAgICB2YXIgS3ViZXJuZXRlc1N0YXRlID0gaW5qZWN0b3IuZ2V0PGFueT4oXCJLdWJlcm5ldGVzU3RhdGVcIikgfHwge307XHJcbiAgICAgIHJldHVybiBLdWJlcm5ldGVzU3RhdGUuc2VsZWN0ZWROYW1lc3BhY2UgfHwgZGVmYXVsdE5hbWVzcGFjZTtcclxuICAgIH1cclxuICAgIHJldHVybiBkZWZhdWx0TmFtZXNwYWNlO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIHNldEN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKG5zKSB7XHJcbiAgICBpZiAobnMpIHtcclxuICAgICAgdmFyIEt1YmVybmV0ZXNTdGF0ZSA9IGluamVjdDxhbnk+KFwiS3ViZXJuZXRlc1N0YXRlXCIpIHx8IHt9O1xyXG4gICAgICBLdWJlcm5ldGVzU3RhdGUuc2VsZWN0ZWROYW1lc3BhY2UgPSBucztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbmZpZ3VyZXMgdGhlIGpzb24gc2NoZW1hXHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZVNjaGVtYSgpIHtcclxuICAgIGFuZ3VsYXIuZm9yRWFjaChzY2hlbWEuZGVmaW5pdGlvbnMsIChkZWZpbml0aW9uLCBuYW1lKSA9PiB7XHJcbiAgICAgIHZhciBwcm9wZXJ0aWVzID0gZGVmaW5pdGlvbi5wcm9wZXJ0aWVzO1xyXG4gICAgICBpZiAocHJvcGVydGllcykge1xyXG4gICAgICAgIHZhciBoaWRlUHJvcGVydGllcyA9IFtcImNyZWF0aW9uVGltZXN0YW1wXCIsIFwia2luZFwiLCBcImFwaVZlcnNpb25cIiwgXCJhbm5vdGF0aW9uc1wiLCBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCIsIFwibmFtZXNwYWNlXCIsIFwicmVzb3VyY2VWZXJzaW9uXCIsIFwic2VsZkxpbmtcIiwgXCJ1aWRcIl07XHJcbiAgICAgICAgYW5ndWxhci5mb3JFYWNoKGhpZGVQcm9wZXJ0aWVzLCAocHJvcGVydHlOYW1lKSA9PiB7XHJcbiAgICAgICAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XHJcbiAgICAgICAgICBpZiAocHJvcGVydHkpIHtcclxuICAgICAgICAgICAgcHJvcGVydHlbXCJoaWRkZW5cIl0gID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBhbmd1bGFyLmZvckVhY2gocHJvcGVydGllcywgKHByb3BlcnR5LCBwcm9wZXJ0eU5hbWUpID0+IHtcclxuICAgICAgICAgIHZhciByZWYgPSBwcm9wZXJ0eVtcIiRyZWZcIl07XHJcbiAgICAgICAgICB2YXIgdHlwZSA9IHByb3BlcnR5W1widHlwZVwiXTtcclxuICAgICAgICAgIGlmIChyZWYgJiYgKCF0eXBlIHx8IHR5cGUgPT09IFwib2JqZWN0XCIpKSB7XHJcbiAgICAgICAgICAgIHByb3BlcnR5W1widHlwZVwiXSA9IHJlZjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0eXBlID09PSBcImFycmF5XCIpIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW1zID0gcHJvcGVydHlbXCJpdGVtc1wiXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgdmFyIHJlZiA9IGl0ZW1zW1wiJHJlZlwiXTtcclxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGl0ZW1zW1widHlwZVwiXTtcclxuICAgICAgICAgICAgICBpZiAocmVmICYmICghdHlwZSB8fCB0eXBlID09PSBcIm9iamVjdFwiKSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbXNbXCJ0eXBlXCJdID0gcmVmO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzY2hlbWEuZGVmaW5pdGlvbnMub3NfYnVpbGRfV2ViSG9va1RyaWdnZXIucHJvcGVydGllcy5zZWNyZXQudHlwZSA9IFwicGFzc3dvcmRcIjtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMZXRzIHJlbW92ZSBhbnkgZW5yaWNoZWQgZGF0YSB0byBsZWF2ZSB0aGUgb3JpZ2luYWwganNvbiBpbnRhY3RcclxuICAgKi9cclxuICBleHBvcnQgZnVuY3Rpb24gdW5lbnJpY2goaXRlbSkge1xyXG4gICAgdmFyIG8gPSBfLmNsb25lRGVlcChpdGVtKTtcclxuICAgIGFuZ3VsYXIuZm9yRWFjaChvLCAodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCIkXCIpIHx8IGtleS5zdGFydHNXaXRoKFwiX1wiKSkge1xyXG4gICAgICAgIGRlbGV0ZSBvW2tleV07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgZGVsZXRlIG9bJ2Nvbm5lY3RUbyddO1xyXG4gICAgcmV0dXJuIG87XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSB1bmVucmljaGVkIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0XHJcbiAgICovXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIHRvUmF3SnNvbihpdGVtKSB7XHJcbiAgICB2YXIgbyA9IHVuZW5yaWNoKGl0ZW0pO1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG8sIG51bGwsIDIpOyAvLyBzcGFjaW5nIGxldmVsID0gMlxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdW5lbnJpY2hlZCBZQU1MIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdFxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiB0b1Jhd1lhbWwoaXRlbSkge1xyXG4gICAgdmFyIG8gPSB1bmVucmljaChpdGVtKTtcclxuICAgIHJldHVybiBqc3lhbWwuZHVtcChvLCB7IGluZGVudDogMiB9KTtcclxuICB9XHJcblxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gd2F0Y2goJHNjb3BlOiBhbnksICRlbGVtZW50OiBhbnksIGtpbmQsIG5zLCBmbiwgbGFiZWxTZWxlY3RvciA9IG51bGwpIHtcclxuICAgICB2YXIgY29ubmVjdGlvbiA9IEt1YmVybmV0ZXNBUEkud2F0Y2goe1xyXG4gICAgICAgIGtpbmQ6IGtpbmQsXHJcbiAgICAgICAgbmFtZXNwYWNlOiBucyxcclxuICAgICAgICBsYWJlbFNlbGVjdG9yOiBsYWJlbFNlbGVjdG9yLFxyXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChvYmplY3RzKSB7XHJcbiAgICAgICAgICBmbihvYmplY3RzKTtcclxuICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgJGVsZW1lbnQub24oJyRkZXN0cm95JywgKCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiU3RhdGljIGNvbnRyb2xsZXJbXCIgKyBraW5kICsgXCIsIFwiICsgbnMgKyBcIl0gZWxlbWVudCBkZXN0cm95ZWRcIik7XHJcbiAgICAgICAgJHNjb3BlLiRkZXN0cm95KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICAkc2NvcGUuJG9uKCckZGVzdHJveScsICgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlN0YXRpYyBjb250cm9sbGVyW1wiICsga2luZCArIFwiLCBcIiArIG5zICsgXCJdIHNjb3BlIGRlc3Ryb3llZFwiKTtcclxuICAgICAgICBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHZhciBvbGREZWxldGVTY29wZUZuID0gJHNjb3BlLmRlbGV0ZVNjb3BlO1xyXG4gICAgICAkc2NvcGUuZGVsZXRlU2NvcGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgJGVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICAgICAgaWYgKGFuZ3VsYXIuaXNGdW5jdGlvbihvbGREZWxldGVTY29wZUZuKSkge1xyXG4gICAgICAgICAgb2xkRGVsZXRlU2NvcGVGbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUt1YmVybmV0ZXNDbGllbnQoa2luZCwgbnMgPSBudWxsKSB7XHJcbiAgICB2YXIgSzhTQ2xpZW50RmFjdG9yeSA9IGluamVjdDxhbnk+KFwiSzhTQ2xpZW50RmFjdG9yeVwiKTtcclxuICAgIGlmICghSzhTQ2xpZW50RmFjdG9yeSkge1xyXG4gICAgICBsb2cud2FybihcIkNvdWxkIG5vdCBmaW5kIGluamVjdGVkIEs4U0NsaWVudEZhY3RvcnkhXCIpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGlmIChraW5kID09PSBcInByb2plY3RzXCIgfHwga2luZCA9PT0gXCJuYW1lc3BhY2VzXCIpIHtcclxuICAgICAgbnMgPSBudWxsO1xyXG4gICAgfSBlbHNlIGlmICghbnMpIHtcclxuICAgICAgbnMgPSBLdWJlcm5ldGVzLmN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSzhTQ2xpZW50RmFjdG9yeS5jcmVhdGUoa2luZCwgbnMpO1xyXG4gIH1cclxuXHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBjdXJyZW50VXNlck5hbWUoKSB7XHJcbiAgICB2YXIgdXNlckRldGFpbHMgPSBIYXd0aW9PQXV0aC5nZXRVc2VyUHJvZmlsZSgpO1xyXG4gICAgdmFyIGFuc3dlciA9IG51bGw7XHJcbiAgICBpZiAodXNlckRldGFpbHMpIHtcclxuICAgICAgYW5zd2VyID0gZ2V0TmFtZSh1c2VyRGV0YWlscyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYW5zd2VyIHx8IFwiYWRtaW5cIjtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOYW1lc3BhY2UobnMsIGNsaWVudD8pIHtcclxuICAgIGlmICghY2xpZW50KSB7XHJcbiAgICAgIGNsaWVudCA9IGlzT3BlblNoaWZ0ID8gS3ViZXJuZXRlcy5jcmVhdGVLdWJlcm5ldGVzQ2xpZW50KCdwcm9qZWN0cycpIDogS3ViZXJuZXRlcy5jcmVhdGVLdWJlcm5ldGVzQ2xpZW50KCduYW1lc3BhY2VzJyk7XHJcbiAgICB9XHJcbiAgICBpZiAobnMgJiYgbnMgIT09IGN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCkpIHtcclxuICAgICAgdmFyIG9iamVjdCA9IHtcclxuICAgICAgICBhcGlWZXJzaW9uOiBLdWJlcm5ldGVzLmRlZmF1bHRBcGlWZXJzaW9uLFxyXG4gICAgICAgIGtpbmQ6IGlzT3BlblNoaWZ0ID8gJ1Byb2plY3QnIDogJ05hbWVzcGFjZScsXHJcbiAgICAgICAgbWV0YWRhdGE6IHtcclxuICAgICAgICAgIG5hbWU6IG5zLFxyXG4gICAgICAgICAgbGFiZWxzOiB7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBjbGllbnQucHV0KG9iamVjdCxcclxuICAgICAgICAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgbG9nLmluZm8oXCJDcmVhdGVkIG5hbWVzcGFjZTogXCIgKyBucylcclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgIGxvZy53YXJuKFwiRmFpbGVkIHRvIGNyZWF0ZSBuYW1lc3BhY2U6IFwiICsgbnMgKyBcIjogXCIgKyBhbmd1bGFyLnRvSnNvbihlcnIpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSQyhvYmosIG9uQ29tcGxldGVGbiA9IG51bGwpe1xyXG4gICAgdmFyIGNsaWVudCA9ICBLdWJlcm5ldGVzLmNyZWF0ZUt1YmVybmV0ZXNDbGllbnQoJ3JlcGxpY2F0aW9uY29udHJvbGxlcnMnLCdkZWZhdWx0Jyk7XHJcbiAgICB2YXIgUkNUZW1wbGF0ZSA9IG5ldyByZXNvdXJjZVJDVGVtcGxhdGUoKTtcclxuICAgIHZhciByY1RlbXBsYXRlID0gUkNUZW1wbGF0ZS5jcmVhdGVSQyhvYmopOyAgXHJcbiAgICBjbGllbnQucHV0KHJjVGVtcGxhdGUsIGZ1bmN0aW9uKG9iaikgeyAgICAgICBcclxuICAgICAgIGlmIChhbmd1bGFyLmlzRnVuY3Rpb24ob25Db21wbGV0ZUZuKSkge1xyXG4gICAgICAgICAgIG9uQ29tcGxldGVGbihvYmopO1xyXG4gICAgICAgfVxyXG4gICAgfSwoZXJyKSA9PntcclxuICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gICBleHBvcnQgZnVuY3Rpb24gY29ubmVjdE9yYWNsZSgkaHR0cCwgJHRpbWVvdXQsIHVybCwgb3BlcmF0aW9uLCByZXBsaWNhcywgZGVsYXlUaW1lKXtcclxuICAgICAgJHRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAkaHR0cCh7XHJcbiAgICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgIG1ldGhvZDonUE9TVCcsXHJcbiAgICAgICAgICAgICBwYXJhbXM6e29yYWNsZU5hbWU6IGdldE5hbWUocmVwbGljYXMpLCBvcGVyYXRpb246IG9wZXJhdGlvbn0sICAgICAgICAgICAgXHJcbiAgICAgICAgIH0pLnN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSxoZWFkZXIsY29uZmlnLHN0YXR1cyl7XHJcbiAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1Y2Nlc3NcIik7XHJcbiAgICAgICAgIH0pLmVycm9yKGZ1bmN0aW9uKGRhdGEsaGVhZGVyLGNvbmZpZyxzdGF0dXMpe1xyXG4gICAgICAgICAgICAgLy9sb2cud2FybihcIkZhaWxlZCB0byBjb25uZWN0IFwiICsgY29ubmVjdFBhcmFtICsgXCIgXCIgKyBkYXRhICsgXCIgXCIgKyBzdGF0dXMpO1xyXG4gICAgICAgICB9KTtcclxuICAgIH0sIGRlbGF5VGltZSk7XHJcbiAgIH1cclxuXHJcbiAgIGV4cG9ydCBmdW5jdGlvbiBnZXRPcmFjbGVTdGF0dXMobGFiZWxzKXtcclxuICAgICAgIHZhciBhbnN3ZXIgPSAtMTtcclxuICAgICAgIGlmKHR5cGVvZihsYWJlbHMpID09PSAnb2JqZWN0JyAmJiBsYWJlbHMuaGFzT3duUHJvcGVydHkoXCJzdGF0dXNcIikpe1xyXG4gICAgICAgICAgIHN3aXRjaChsYWJlbHMuc3RhdHVzKXtcclxuICAgICAgICAgICAgICAgY2FzZSAnMCc6XHJcbiAgICAgICAgICAgICAgICAgIGFuc3dlciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICBjYXNlICcxJzpcclxuICAgICAgICAgICAgICAgICAgYW5zd2VyID0gMTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgIGNhc2UgJzInOlxyXG4gICAgICAgICAgICAgICAgICBhbnN3ZXIgPSAyO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgYW5zd2VyID0gLTE7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgfVxyXG4gICAgICAgcmV0dXJuIGFuc3dlcjtcclxuICAgfVxyXG5cclxuICAgZXhwb3J0IGZ1bmN0aW9uIGdldEV4dHJhY3RTdGF0dXMobGFiZWxzKXtcclxuICAgICAgIGlmKGxhYmVscy5pc1RhcmdldCA9PT0gJ2ZhbHNlJyl7XHJcbiAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGxhYmVscy5pc0V4dHJhY3QpO1xyXG4gICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgcmV0dXJuIDEwO1xyXG4gICAgICAgfVxyXG4gICB9XHJcblxyXG4gICBleHBvcnQgZnVuY3Rpb24gZ2V0T3JhY2xlTmFtZShyZXBsaWNhcyk6c3RyaW5nIHtcclxuICAgICAgdmFyIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9ucyhyZXBsaWNhcyk7XHJcbiAgICAgIHJldHVybiBhbm5vdGF0aW9uW1wiY2l0eU5hbWVcIl0gKyBcIi1cIiArIGFubm90YXRpb25bXCJkaXN0cmljdE5hbWVcIl0gKyBcIi1cIiArIGFubm90YXRpb25bXCJzeXN0ZW1OYW1lXCJdO1xyXG4gICB9XHJcblxyXG4gICBleHBvcnQgZnVuY3Rpb24gZXh0cmFjdERhdGFUb09yYWNsZSgkaHR0cCwgdXJsLCBzZWxlY3RlZFJlcGxpY2F0aW9uQ29udHJvbGxlcnMsIHRhcmdldE9yYWNsZTogQ29uZmlncy5vcmFjbGVQYXJhbSwgZm4/OihkYXRhLCBzdGF0dXMpID0+IHZvaWQpe1xyXG4gICAgICAgLy9jb25zb2xlLmxvZyh0YXJnZXRSZXBsaWNhdGlvbkNvbnRyb2xsZXIubGVuZ3RoKTsgICAgICBcclxuICAgICAgdmFyIGFuc3dlciA9IHRhcmdldE9yYWNsZSAmJiB0cnVlOyBcclxuICAgICAgdmFyIGlubmVlZE9yYWNsZSA9IFtdOyAgICAgXHJcbiAgICAgIHNlbGVjdGVkUmVwbGljYXRpb25Db250cm9sbGVycy5mb3JFYWNoKChyYykgPT4geyBcclxuICAgICAgICAgdmFyIGFubm90YXRpb25zID0gZ2V0QW5ub3RhdGlvbnMocmMpOyAgICAgICAgICAgIFxyXG4gICAgICAgICBhbnN3ZXIgPSBhbnN3ZXIgJiYgY2hlY2tvdXRPcmFjbGVJc1J1bm5pbmcocmMpO1xyXG4gICAgICAgICAgICAgIGlubmVlZE9yYWNsZS5wdXNoKHtcclxuICAgICAgICAgICAgICBcIm5hbWVcIjogZ2V0TmFtZShyYyksXHJcbiAgICAgICAgICAgICAgXCJpcFwiOiBnZXRIb3N0KHJjLiRwb2RzWzBdKSxcclxuICAgICAgICAgICAgICBcInBvcnRcIjogcmMuJHBvZHNbMF0uc3BlYy5jb250YWluZXJzWzBdLnBvcnRzWzBdLmhvc3RQb3J0LFxyXG4gICAgICAgICAgICAgIFwiZGF0YUlkXCI6IGFubm90YXRpb25zW1wiaWRcIl1cclxuICAgICAgICAgIH0pOyAgICAgICAgICBcclxuICAgICAgfSk7XHJcbiAgICAgXHJcbiAgICAgIGlmKGFuc3dlcil7XHJcbiAgICAgICAgICB2YXIgZGF0YSA9e1wibmFtZVwiOiB0YXJnZXRPcmFjbGUuaWQsIFwidGFyZ2V0XCI6IHRhcmdldE9yYWNsZSwgXCJpbm5lZWRcIjogaW5uZWVkT3JhY2xlfTsgICAgXHJcbiAgICAgICAgICB2YXIgc3Bpbm5lcjtcclxuICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgIHR5cGU6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICB1cmw6IFVybEhlbHBlcnMuam9pbih1cmwsIHRhcmdldE9yYWNsZS5pZCtcIlwiLCBcImV4dHJhY3RcIiksXHJcbiAgICAgICAgICAgIHRpbWVvdXQ6IDgwMDAsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIC8vYXN5bmM6IGZhbHNlLFxyXG4gICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxyXG4gICAgICAgICAgICBiZWZvcmVTZW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgQ29uZmlncy5jcmVhdGVfbWFzaygpOyAgLy/liJvlu7rpga7nvanlsYJcclxuICAgICAgICAgICAgICBjcmVhdGVfbG9jYWRFZmZlY3QoXCLmraPlnKjpqozor4HmsYfmgLvlupPphY3nva7kv6Hmga8s6K+356iN562J77yBXCIpOyAvL+WIm+W7uuaVsOaNruWKoOi9veaViOaenOWxglxyXG4gICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGluZycpXHJcbiAgICAgICAgICAgICAgc3Bpbm5lciA9IG5ldyBTcGlubmVyKGxvYWRDb25maWdzKCkpLnNwaW4odGFyZ2V0KTsgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY29tcGxldGU6IChYTUxIdHRwUmVxdWVzdCwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICAgICAgICAgIGlmKFhNTEh0dHBSZXF1ZXN0LnN0YXR1cyA9PSAyMDApe1xyXG4gICAgICAgICAgICAgICAgLy9zcGlubmVyLnNwaW4oKTtcclxuICAgICAgICAgICAgICAgIEt1YmVybmV0ZXMuY3JlYXRlU3VjY2Vzc0luZm8oXCJzdWNjZXNzXCIsIFwi6L+e5o6l5rGH5oC75bqT5oiQ5Yqf77yM5Y2z5bCG5omn6KGM5rGH5oC75oiW5oq95Y+W5pON5L2c77yBXCIpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChcIkt1YmVybmV0ZXMucmVtb3ZlTWFzaygpXCIsIDE1MDApO1xyXG4gICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgLy9zcGlubmVyLnNwaW4oKTsgXHJcbiAgICAgICAgICAgICAgICBLdWJlcm5ldGVzLmNyZWF0ZVN1Y2Nlc3NJbmZvKFwiZXJyb3JcIiwgXCLov57mjqXmsYfmgLvlupPlpLHotKXvvIzor7fmo4Dmn6XmnI3liqHpm4bnvqTkuK3nmoTmsYfmgLvlupPphY3nva7mmK/lkKbmraPnoa7vvIFcIik7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KFwiS3ViZXJuZXRlcy5yZW1vdmVNYXNrKClcIiwgMTUwMCk7IFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3VjY2VzczogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICB9KTsgICAgICAgIFxyXG4gICAgICAgICAgLy9Db25maWdzLm9yYWNsZUluZm9PcGVyYXRlKCRodHRwLCBcIi9qYXZhL2NvbnNvbGUvYXBpL29yYWNsZVwiLCBDb25maWdzLk9wZXJhdGVUeXBlLkVYVFJBQ1QsIGRhdGEsIGZuKTtcclxuICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgIC8vYWxlcnQoXCLmgqjpgInmi6nnmoTmsYfmgLvmlbDmja7lupPmiJbpnIDopoHmsYfmgLvnmoTmlbDmja7lupPkuK3lrZjlnKjmnKrlkK/liqjmiJDlip/nmoTmlbDmja7lupPvvIzlr7zoh7TmsYfmgLvmk43kvZzlpLHotKXvvIzor7fph43mlrDpgInmi6nvvIFcIik7XHJcbiAgICAgICAgICAgQ29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuaTjeS9nOWksei0pTrpnIDopoHmsYfmgLvnmoTmlbDmja7lupPkuK3lrZjlnKjmnKrlkK/liqjmiJDlip/nmoTmlbDmja7lupPvvIFcIiwgJycsbnVsbCwgMCwgXCJlcnJvclwiKTtcclxuICAgICAgIH1cclxuICAgfVxyXG5cclxuICAgZXhwb3J0IGZ1bmN0aW9uIGNoZWNrb3V0T3JhY2xlSXNSdW5uaW5nKHJjKXtcclxuICAgICAgaWYocmMuJHBvZENvdW50ZXJzLnJlYWR5ICYmIHJjLiRvcmFjbGVTdGF0dXMgPT0gMil7XHJcbiAgICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgIH1cclxuICAgfVxyXG5cclxuICAgZXhwb3J0IGZ1bmN0aW9uIHJlcGxpY2FzSXNDcmVhdGVkIChyZXBsaWNhdGlvbmNvbnRyb2xsZXJzOkFycmF5PGFueT4sIG5hbWU6c3RyaW5nKXtcclxuICAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgaWYoIHJlcGxpY2F0aW9uY29udHJvbGxlcnMgIT1udWxsIHx8IHJlcGxpY2F0aW9uY29udHJvbGxlcnMubGVuZ3RoPD0wKXtcclxuICAgICAgIGZvcih2YXIgaT0wOyBpPHJlcGxpY2F0aW9uY29udHJvbGxlcnMubGVuZ3RoO2krKyl7XHJcbiAgICAgICAgIGlmKGdldE5hbWUocmVwbGljYXRpb25jb250cm9sbGVyc1tpXSkgPT09IG5hbWUpe1xyXG4gICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgICB9XHJcbiAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBsb2FkQ29uZmlncygpe1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbGluZXM6IDksXHJcbiAgICAgICAgICBsZW5ndGg6IDAsXHJcbiAgICAgICAgICB3aWR0aDogMTMsIFxyXG4gICAgICAgICAgcmFkaXVzOiAzOCxcclxuICAgICAgICAgIHNjYWxlOiAxLFxyXG4gICAgICAgICAgY29ybmVyczogMSwgXHJcbiAgICAgICAgICBjb2xvcjogJyNmZmZmZmYnLCBcclxuICAgICAgICAgIG9wYWNpdHk6IDAsIFxyXG4gICAgICAgICAgcm90YXRlOiA5MCwgXHJcbiAgICAgICAgICBkaXJlY3Rpb246IDEsIFxyXG4gICAgICAgICAgc3BlZWQ6IDAuNSwgXHJcbiAgICAgICAgICB0cmFpbDogNTAsICAgICAgICAgICBcclxuICAgICAgICAgIHpJbmRleDogMTAwMDAwMDAwMiwgXHJcbiAgICAgICAgICBjbGFzc05hbWU6ICdzcGlubmVyJywgXHJcbiAgICAgICAgICB0b3A6ICc0MCUnICwgXHJcbiAgICAgICAgICBsZWZ0OiAnNTAlJywgXHJcbiAgICAgICAgICBzaGFkb3c6IGZhbHNlLCBcclxuICAgICAgICAgIGh3YWNjZWw6IGZhbHNlLCBcclxuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXHJcbiAgICAgIH1cclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICDliJvlu7rliqDovb3mlYjmnpzlsYJcclxuICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVfbG9jYWRFZmZlY3QobXNnKXtcclxuICAgIHZhciB0bXAgID0gXCI8ZGl2IGlkPVxcXCJsb2FkaW5nXFxcIj48L2Rpdj5cIlxyXG4gICAgICAgICsgXCI8c3BhbiBpZD1cXFwibG9hZG1zZ1xcXCI+XCIgKyBtc2cgKyBcIjwvc3Bhbj5cIjtcclxuICAgIHZhciBsb2FkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTsgXHJcbiAgICBsb2FkLmlkID0gXCJsb2FkXCI7ICAgIFxyXG4gICAgbG9hZC5pbm5lckhUTUwgPSB0bXA7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxvYWQpO1xyXG4gICAgJChcIiNsb2FkXCIpLmFkZENsYXNzKFwibG9hZC1lZmZlY3QtbXNnXCIpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1Y2Nlc3NJbmZvKGljb246c3RyaW5nLCBtc2c6c3RyaW5nKXtcclxuICAgICQoXCIjbG9hZFwiKS5yZW1vdmUoKTtcclxuICAgICBDb25maWdzLmN1c3RvbUFsZXJ0KFwi5o+Q56S6XCIsIG1zZywgJycsbnVsbCwgMCwgaWNvbik7XHJcbiAgICAvKnZhciB0bXAgPSBcIjxkaXYgY2xhc3M9XFxcImxvYWQtcmVzdWx0XFxcIiA+PGltZyBzcmM9XFxcIlwiIFxyXG4gICAgICArIGljb24gKyBcIlxcXCIgY2xhc3M9XFxcImN1c3RvbS1hbGVydC1pbWdcXFwiPjwvZGl2PlwiXHJcbiAgICAgICsgXCI8c3BhbiBjbGFzcz1cXFwibG9hZC1yZXN1bHQtbXNnXFxcIj5cIiArIG1zZyArXCI8L3NwYW4+XCI7IFxyXG4gICAgdmFyIHJlc3VsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICByZXN1bHQuaWQgPSBcImV4ZV9yZXN1bHRcIjsgXHJcbiAgICByZXN1bHQuaW5uZXJIVE1MID0gdG1wOyAgICAgICBcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocmVzdWx0KTsqL1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU1hc2soKXtcclxuICAgIHZhciBtYXNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYXNrXCIpO1xyXG4gICAgLy92YXIgcmVzdWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJleGVfcmVzdWx0XCIpO1xyXG4gICAgaWYobnVsbCA9PSBtYXNrKVxyXG4gICAgICByZXR1cm47ICAgIFxyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChtYXNrKTtcclxuICAgIC8vZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChyZXN1bHQpO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4va3ViZXJuZXRlcy90cy9rdWJlcm5ldGVzSGVscGVycy50c1wiIC8+XHJcblxyXG5tb2R1bGUgRGV2ZWxvcGVyIHtcclxuXHJcbiAgZXhwb3J0IHZhciBjb250ZXh0ID0gJy93b3Jrc3BhY2VzJztcclxuICBleHBvcnQgdmFyIGhhc2ggPSAnIycgKyBjb250ZXh0O1xyXG4gIGV4cG9ydCB2YXIgcGx1Z2luTmFtZSA9ICdEZXZlbG9wZXInO1xyXG4gIGV4cG9ydCB2YXIgcGx1Z2luUGF0aCA9ICdwbHVnaW5zL2RldmVsb3Blci8nO1xyXG4gIGV4cG9ydCB2YXIgdGVtcGxhdGVQYXRoID0gcGx1Z2luUGF0aCArICdodG1sLyc7XHJcbiAgZXhwb3J0IHZhciBsb2c6TG9nZ2luZy5Mb2dnZXIgPSBMb2dnZXIuZ2V0KHBsdWdpbk5hbWUpO1xyXG5cclxuICBleHBvcnQgdmFyIGplbmtpbnNTZXJ2aWNlTmFtZSA9IFwiamVua2luc1wiO1xyXG4gIGV4cG9ydCB2YXIgamVua2luc1NlcnZpY2VOYW1lQW5kUG9ydCA9IGplbmtpbnNTZXJ2aWNlTmFtZSArIFwiOmh0dHBcIjtcclxuXHJcbiAgZXhwb3J0IHZhciBqZW5raW5zSHR0cENvbmZpZyA9IHtcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQveC1qc29uLCB0ZXh0L3BsYWluXCJcclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGhhc24ndCBjaGFuZ2VkIGZyb20gdGhlIGxhc3QgY2FjaGVkIEpTT04gdmVyc2lvbiBvZiB0aGlzIG9iamVjdFxyXG4gICAqL1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBoYXNPYmplY3RDaGFuZ2VkKHZhbHVlLCBzdGF0ZSkge1xyXG4gICAgdmFyIGpzb24gPSBhbmd1bGFyLnRvSnNvbih2YWx1ZSB8fCBcIlwiKTtcclxuICAgIHZhciBvbGRKc29uID0gc3RhdGUuanNvbjtcclxuICAgIHN0YXRlLmpzb24gPSBqc29uO1xyXG4gICAgcmV0dXJuICFvbGRKc29uIHx8IGpzb24gIT09IG9sZEpzb247XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gcHJvamVjdEZvclNjb3BlKCRzY29wZSkge1xyXG4gICAgaWYgKCRzY29wZSkge1xyXG4gICAgICByZXR1cm4gJHNjb3BlLmJ1aWxkQ29uZmlnIHx8ICRzY29wZS5lbnRpdHkgfHwgKCRzY29wZS5tb2RlbCB8fCB7fSkucHJvamVjdDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBMZXRzIGxvYWQgdGhlIHByb2plY3QgdmVyc2lvbnMgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2VcclxuICAgKi9cclxuICBleHBvcnQgZnVuY3Rpb24gbG9hZFByb2plY3RWZXJzaW9ucygkc2NvcGUsICRlbGVtZW50LCBwcm9qZWN0LCBlbnYsIG5zLCBhbnN3ZXIsIGNhY2hlcykge1xyXG4gICAgdmFyIHByb2plY3RBbm5vdGF0aW9uID0gXCJwcm9qZWN0XCI7XHJcbiAgICB2YXIgdmVyc2lvbkFubm90YXRpb24gPSBcInZlcnNpb25cIjtcclxuXHJcbiAgICB2YXIgcHJvamVjdE5hbWVzcGFjZSA9IHByb2plY3QuJG5hbWVzcGFjZTtcclxuICAgIHZhciBwcm9qZWN0TmFtZSA9IHByb2plY3QuJG5hbWU7XHJcblxyXG4gICAgdmFyIGNhY2hlID0gY2FjaGVzW25zXTtcclxuICAgIGlmICghY2FjaGUpIHtcclxuICAgICAgY2FjaGUgPSB7fTtcclxuICAgICAgY2FjaGVzW25zXSA9IGNhY2hlO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBzdGF0dXMgPSB7XHJcbiAgICAgIHJjczogW10sXHJcbiAgICAgIHBvZHM6IFtdLFxyXG4gICAgICByb3V0ZXM6IFtdLFxyXG4gICAgICBzZXJ2aWNlczogW11cclxuICAgIH07XHJcblxyXG4gICAgdmFyIGltYWdlU3RyZWFtVGFncyA9IFtdO1xyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZU1vZGVsKCkge1xyXG4gICAgICB2YXIgcHJvamVjdEluZm9zID0ge307XHJcbiAgICAgIHZhciBtb2RlbCA9ICRzY29wZS5tb2RlbCB8fCB7fTtcclxuXHJcbiAgICAgIGFuZ3VsYXIuZm9yRWFjaChzdGF0dXMucmNzLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgIHZhciBtZXRhZGF0YSA9IGl0ZW0ubWV0YWRhdGEgfHwge307XHJcbiAgICAgICAgdmFyIG5hbWUgPSBtZXRhZGF0YS5uYW1lO1xyXG4gICAgICAgIHZhciBsYWJlbHMgPSBtZXRhZGF0YS5sYWJlbHMgfHwge307XHJcbiAgICAgICAgdmFyIGFubm90YXRpb25zID0gbWV0YWRhdGEuYW5ub3RhdGlvbnMgfHwge307XHJcbiAgICAgICAgdmFyIHNwZWMgPSBpdGVtLnNwZWMgfHwge307XHJcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gc3BlYy5zZWxlY3RvcjtcclxuXHJcbiAgICAgICAgdmFyIHByb2plY3QgPSBsYWJlbHNbcHJvamVjdEFubm90YXRpb25dO1xyXG4gICAgICAgIHZhciB2ZXJzaW9uID0gbGFiZWxzW3ZlcnNpb25Bbm5vdGF0aW9uXTtcclxuXHJcbiAgICAgICAgLy8gbGV0cyB0cnkgdGhlIFMySSBkZWZhdWx0cy4uLlxyXG4gICAgICAgIGlmICghcHJvamVjdCkge1xyXG4gICAgICAgICAgcHJvamVjdCA9IGxhYmVsc1tcImFwcFwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF2ZXJzaW9uKSB7XHJcbiAgICAgICAgICB2ZXJzaW9uID0gYW5ub3RhdGlvbnNbXCJvcGVuc2hpZnQuaW8vZGVwbG95bWVudC1jb25maWcubGF0ZXN0LXZlcnNpb25cIl1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb2plY3QgJiYgdmVyc2lvbiAmJiBwcm9qZWN0ID09PSBwcm9qZWN0TmFtZSkge1xyXG4gICAgICAgICAgdmFyIHByb2plY3RzID0gcHJvamVjdEluZm9zW3Byb2plY3RdO1xyXG4gICAgICAgICAgaWYgKCFwcm9qZWN0cykge1xyXG4gICAgICAgICAgICBwcm9qZWN0cyA9IHtcclxuICAgICAgICAgICAgICBwcm9qZWN0OiBwcm9qZWN0LFxyXG4gICAgICAgICAgICAgIHZlcnNpb25zOiB7fVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBwcm9qZWN0SW5mb3NbcHJvamVjdF0gPSBwcm9qZWN0cztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhciB2ZXJzaW9uSW5mbyA9IHByb2plY3RzLnZlcnNpb25zW3ZlcnNpb25dO1xyXG4gICAgICAgICAgaWYgKCF2ZXJzaW9uSW5mbykge1xyXG4gICAgICAgICAgICB2ZXJzaW9uSW5mbyA9IHtcclxuICAgICAgICAgICAgICByZXBsaWNhdGlvbkNvbnRyb2xsZXJzOiB7fVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBwcm9qZWN0cy52ZXJzaW9uc1t2ZXJzaW9uXSA9IHZlcnNpb25JbmZvO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICAgICAgdmVyc2lvbkluZm8ucmVwbGljYXRpb25Db250cm9sbGVyc1tuYW1lXSA9IGl0ZW07XHJcbiAgICAgICAgICAgIGl0ZW0uJG5hbWUgPSBuYW1lO1xyXG4gICAgICAgICAgICBpZiAocHJvamVjdE5hbWVzcGFjZSAmJiBwcm9qZWN0TmFtZSkge1xyXG4gICAgICAgICAgICAgIGl0ZW0uJHZpZXdMaW5rID0gVXJsSGVscGVycy5qb2luKFwiL3dvcmtzcGFjZXMvXCIsIHByb2plY3ROYW1lc3BhY2UsIFwicHJvamVjdHNcIiwgcHJvamVjdE5hbWUsIFwibmFtZXNwYWNlXCIsIG5zLCBcInJlcGxpY2F0aW9uQ29udHJvbGxlcnNcIiwgbmFtZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbG9nLndhcm4oXCJNaXNzaW5nIHByb2plY3QgZGF0YSEgXCIgKyBwcm9qZWN0TmFtZXNwYWNlICsgXCIgbmFtZSBcIiArIHByb2plY3ROYW1lKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaXRlbS4kc2VydmljZXMgPSBbXTtcclxuICAgICAgICAgICAgdmFyIHJjTGluayA9IG51bGw7XHJcbiAgICAgICAgICAgIHN0YXR1cy5zZXJ2aWNlcy5mb3JFYWNoKChzZXJ2aWNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdmFyIHJlcFNlbGVjdG9yID0gS3ViZXJuZXRlcy5nZXRTZWxlY3RvcihpdGVtKTtcclxuICAgICAgICAgICAgICB2YXIgc2VydmljZVNlbGVjdG9yID0gS3ViZXJuZXRlcy5nZXRTZWxlY3RvcihzZXJ2aWNlKTtcclxuICAgICAgICAgICAgICBpZiAoc2VydmljZVNlbGVjdG9yICYmIHJlcFNlbGVjdG9yICYmXHJcbiAgICAgICAgICAgICAgICBLdWJlcm5ldGVzLnNlbGVjdG9yTWF0Y2hlcyhzZXJ2aWNlU2VsZWN0b3IsIHJlcFNlbGVjdG9yKSAmJlxyXG4gICAgICAgICAgICAgICAgS3ViZXJuZXRlcy5nZXROYW1lc3BhY2Uoc2VydmljZSkgPT09IEt1YmVybmV0ZXMuZ2V0TmFtZXNwYWNlKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXMucm91dGVzLmZvckVhY2goKHJvdXRlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHZhciBzZXJ2aWNlTmFtZSA9IEt1YmVybmV0ZXMuZ2V0TmFtZShzZXJ2aWNlKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09PSBLdWJlcm5ldGVzLmdldE5hbWUocm91dGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZVtcIiRyb3V0ZVwiXSA9IHJvdXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VbXCIkaG9zdFwiXSA9IENvcmUucGF0aEdldChyb3V0ZSwgW1wic3BlY1wiLCBcImhvc3RcIl0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uJHNlcnZpY2VzLnB1c2goc2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyY0xpbmspIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSBLdWJlcm5ldGVzLnNlcnZpY2VMaW5rVXJsKHNlcnZpY2UsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGZpbmQgaWNvbiBldGM/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJjTGluayA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzZXJ2aWNlTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmOiB1cmxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGl0ZW1bXCIkc2VydmljZUxpbmtcIl0gPSByY0xpbms7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpdGVtLiRidWlsZElkID0gYW5ub3RhdGlvbnNbXCJmYWJyaWM4LmlvL2J1aWxkLWlkXCJdIHx8IGl0ZW0uJGJ1aWxkSWQ7XHJcbiAgICAgICAgICBpdGVtLiRidWlsZFVybCA9IGFubm90YXRpb25zW1wiZmFicmljOC5pby9idWlsZC11cmxcIl0gfHwgaXRlbS4kYnVpbGRVcmw7XHJcbiAgICAgICAgICBpdGVtLiRnaXRDb21taXQgPSBhbm5vdGF0aW9uc1tcImZhYnJpYzguaW8vZ2l0LWNvbW1pdFwiXSB8fCBpdGVtLiRnaXRDb21taXQ7XHJcbiAgICAgICAgICBpdGVtLiRnaXRVcmwgPSBhbm5vdGF0aW9uc1tcImZhYnJpYzguaW8vZ2l0LXVybFwiXSB8fCBpdGVtLiRnaXRVcmw7XHJcbiAgICAgICAgICBpdGVtLiRnaXRCcmFuY2ggPSBhbm5vdGF0aW9uc1tcImZhYnJpYzguaW8vZ2l0LWJyYW5jaFwiXSB8fCBpdGVtLiRnaXRCcmFuY2g7XHJcbiAgICAgICAgICBpZiAoIWl0ZW0uJGdpdENvbW1pdCkge1xyXG4gICAgICAgICAgICB2YXIgaW1hZ2UgPSBnZXRJbWFnZShpdGVtKTtcclxuICAgICAgICAgICAgaWYgKGltYWdlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCEkc2NvcGUuJGlzV2F0Y2hJbWFnZXMpIHtcclxuICAgICAgICAgICAgICAgICRzY29wZS4kaXNXYXRjaEltYWdlcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBLdWJlcm5ldGVzLndhdGNoKCRzY29wZSwgJGVsZW1lbnQsIFwiaW1hZ2VzXCIsIG51bGwsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGltYWdlU3RyZWFtVGFncyA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICAgIGNoZWNrRm9yTWlzc2luZ01ldGFkYXRhKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2hlY2tGb3JNaXNzaW5nTWV0YWRhdGEoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEltYWdlKGl0ZW0pIHtcclxuICAgICAgICAgICAgICB2YXIgaW1hZ2UgPSBcIlwiO1xyXG4gICAgICAgICAgICAgIC8vIGxldHMgc2VlIGlmIHdlIGNhbiBmaW5kIHRoZSBjb21taXQgaWQgZnJvbSBhIFMySSBpbWFnZSBuYW1lXHJcbiAgICAgICAgICAgICAgLy8gVE9ETyBuZWVkcyB0aGlzIGlzc3VlIGZpeGVkIHRvIGZpbmQgaXQgdmlhIGFuIE9wZW5TaGlmdCBhbm5vdGF0aW9uOlxyXG4gICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuc2hpZnQvb3JpZ2luL2lzc3Vlcy82MjQxXHJcbiAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lcnMgPSBDb3JlLnBhdGhHZXQoaXRlbSwgW1wic3BlY1wiLCBcInRlbXBsYXRlXCIsIFwic3BlY1wiLCBcImNvbnRhaW5lcnNcIl0pO1xyXG4gICAgICAgICAgICAgIGlmIChjb250YWluZXJzICYmIGNvbnRhaW5lcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0gY29udGFpbmVyc1swXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgaW1hZ2UgPSBjb250YWluZXIuaW1hZ2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiBpbWFnZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tGb3JNaXNzaW5nTWV0YWRhdGEoKSB7XHJcbiAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHByb2plY3RzLnZlcnNpb25zLCAodmkpID0+IHtcclxuICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaCh2aS5yZXBsaWNhdGlvbkNvbnRyb2xsZXJzLCAoaXRlbSwgbmFtZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0uJGdpdENvbW1pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbWFnZSA9IGdldEltYWdlKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGltYWdlU3RyZWFtVGFncywgKGltYWdlU3RyZWFtVGFnKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbWFnZU5hbWUgPSBpbWFnZVN0cmVhbVRhZy5kb2NrZXJJbWFnZVJlZmVyZW5jZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlTmFtZSAmJiBpbWFnZU5hbWUgPT09IGltYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvdW5kSVNUYWcgPSBpbWFnZVN0cmVhbVRhZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFuaWZlc3RKU09OID0gaW1hZ2VTdHJlYW1UYWcuZG9ja2VySW1hZ2VNYW5pZmVzdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3RKU09OKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFuaWZlc3QgPSBhbmd1bGFyLmZyb21Kc29uKG1hbmlmZXN0SlNPTikgfHwge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGlzdG9yeSA9IG1hbmlmZXN0Lmhpc3Rvcnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlzdG9yeSAmJiBoaXN0b3J5Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdjEgPSBoaXN0b3J5WzBdLnYxQ29tcGF0aWJpbGl0eTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBhbmd1bGFyLmZyb21Kc29uKHYxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW52ID0gQ29yZS5wYXRoR2V0KGRhdGEsIFtcImNvbmZpZ1wiLCBcIkVudlwiXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGVudiwgKGVudkV4cCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudkV4cCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gZW52RXhwLnNwbGl0KFwiPVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDIgJiYgdmFsdWVzWzBdID09IFwiT1BFTlNISUZUX0JVSUxEX05BTUVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBidWlsZE5hbWUgPSB2YWx1ZXNbMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS4kYnVpbGRJZCA9IGJ1aWxkTmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uJGJ1aWxkVXJsID0gRGV2ZWxvcGVyLnByb2plY3RXb3Jrc3BhY2VMaW5rKG5zLCBwcm9qZWN0TmFtZSwgXCJidWlsZExvZ3MvXCIgKyBidWlsZE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbHMgPSBDb3JlLnBhdGhHZXQoZGF0YSwgW1wiY29uZmlnXCIsIFwiTGFiZWxzXCJdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLiRnaXRDb21taXQgPSBsYWJlbHNbXCJpby5vcGVuc2hpZnQuYnVpbGQuY29tbWl0LmlkXCJdIHx8IGl0ZW0uJGdpdENvbW1pdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uJGdpdENvbW1pdEF1dGhvciA9IGxhYmVsc1tcImlvLm9wZW5zaGlmdC5idWlsZC5jb21taXQuYXV0aG9yXCJdIHx8IGl0ZW0uJGdpdENvbW1pdEF1dGhvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uJGdpdENvbW1pdERhdGUgPSBsYWJlbHNbXCJpby5vcGVuc2hpZnQuYnVpbGQuY29tbWl0LmRhdGVcIl0gfHwgaXRlbS4kZ2l0Q29tbWl0RGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uJGdpdENvbW1pdE1lc3NhZ2UgPSBsYWJlbHNbXCJpby5vcGVuc2hpZnQuYnVpbGQuY29tbWl0Lm1lc3NhZ2VcIl0gfHwgaXRlbS4kZ2l0Q29tbWl0TWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uJGdpdEJyYW5jaCA9IGxhYmVsc1tcImlvLm9wZW5zaGlmdC5idWlsZC5jb21taXQucmVmXCJdIHx8IGl0ZW0uJGdpdEJyYW5jaDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0uJGdpdFVybCAmJiBpdGVtLiRnaXRDb21taXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS4kZ2l0VXJsID0gRGV2ZWxvcGVyLnByb2plY3RXb3Jrc3BhY2VMaW5rKG5zLCBwcm9qZWN0TmFtZSwgXCJ3aWtpL2NvbW1pdERldGFpbC8vL1wiICsgaXRlbS4kZ2l0Q29tbWl0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoc2VsZWN0b3IpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVGV4dCA9IEt1YmVybmV0ZXMubGFiZWxzVG9TdHJpbmcoc2VsZWN0b3IsIFwiLFwiKTtcclxuICAgICAgICAgICAgdmFyIHBvZExpbmtVcmwgPSBVcmxIZWxwZXJzLmpvaW4ocHJvamVjdExpbmsocHJvamVjdE5hbWUpLCBcIm5hbWVzcGFjZVwiLCBucywgXCJwb2RzXCIpO1xyXG4gICAgICAgICAgICBpdGVtLnBvZHMgPSBbXTtcclxuICAgICAgICAgICAgaXRlbS4kcG9kQ291bnRlcnMgPSBLdWJlcm5ldGVzLmNyZWF0ZVBvZENvdW50ZXJzKHNlbGVjdG9yLCBzdGF0dXMucG9kcywgaXRlbS5wb2RzLCBzZWxlY3RvclRleHQsIHBvZExpbmtVcmwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBsZXRzIGNoZWNrIGZvciBhIHByb2plY3QgbmFtZSBpZiB3ZSBoYXZlIGxvdHMgb2YgUkNzIHdpdGggbm8gcG9kcywgbGV0cyByZW1vdmUgdGhlbSFcclxuICAgICAgYW5ndWxhci5mb3JFYWNoKHByb2plY3RJbmZvcywgKHByb2plY3QsIHByb2plY3ROYW1lKSA9PiB7XHJcbiAgICAgICAgdmFyIHJjc05vUG9kcyA9IFtdO1xyXG4gICAgICAgIHZhciByY3NXaXRoUG9kcyA9IFtdO1xyXG4gICAgICAgIGFuZ3VsYXIuZm9yRWFjaChwcm9qZWN0LnZlcnNpb25zLCAodmVyc2lvbkluZm8pID0+IHtcclxuICAgICAgICAgIHZhciByY3MgPSB2ZXJzaW9uSW5mby5yZXBsaWNhdGlvbkNvbnRyb2xsZXJzO1xyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHJjcywgKGl0ZW0sIG5hbWUpID0+IHtcclxuICAgICAgICAgICAgdmFyIGNvdW50ID0gS3ViZXJuZXRlcy5wb2RDb3VudGVyVG90YWwoaXRlbS4kcG9kQ291bnRlcnMpO1xyXG4gICAgICAgICAgICBpZiAoY291bnQpIHtcclxuICAgICAgICAgICAgICByY3NXaXRoUG9kcy5wdXNoKG5hbWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJjc05vUG9kcy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSByY3NbbmFtZV07XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChyY3NXaXRoUG9kcy5sZW5ndGgpIHtcclxuICAgICAgICAgIC8vIGxldHMgcmVtb3ZlIGFsbCB0aGUgZW1wdHkgUkNzXHJcbiAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocmNzTm9Qb2RzLCAoZm4pID0+IHtcclxuICAgICAgICAgICAgZm4oKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoaGFzT2JqZWN0Q2hhbmdlZChwcm9qZWN0SW5mb3MsIGNhY2hlKSkge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhcInByb2plY3QgdmVyc2lvbnMgaGFzIGNoYW5nZWQhXCIpO1xyXG4gICAgICAgIGFuc3dlcltuc10gPSBwcm9qZWN0SW5mb3M7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBLdWJlcm5ldGVzLndhdGNoKCRzY29wZSwgJGVsZW1lbnQsIFwicmVwbGljYXRpb25jb250cm9sbGVyc1wiLCBucywgKGRhdGEpID0+IHtcclxuICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICBzdGF0dXMucmNzID0gZGF0YTtcclxuICAgICAgICB1cGRhdGVNb2RlbCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIEt1YmVybmV0ZXMud2F0Y2goJHNjb3BlLCAkZWxlbWVudCwgXCJzZXJ2aWNlc1wiLCBucywgKGRhdGEpID0+IHtcclxuICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICBzdGF0dXMuc2VydmljZXMgPSBkYXRhO1xyXG4gICAgICAgIHVwZGF0ZU1vZGVsKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgS3ViZXJuZXRlcy53YXRjaCgkc2NvcGUsICRlbGVtZW50LCBcInJvdXRlc1wiLCBucywgKGRhdGEpID0+IHtcclxuICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICBzdGF0dXMucm91dGVzID0gZGF0YTtcclxuICAgICAgICB1cGRhdGVNb2RlbCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIEt1YmVybmV0ZXMud2F0Y2goJHNjb3BlLCAkZWxlbWVudCwgXCJwb2RzXCIsIG5zLCAoZGF0YSkgPT4ge1xyXG4gICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgIHN0YXR1cy5wb2RzID0gZGF0YTtcclxuICAgICAgICB1cGRhdGVNb2RlbCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRldmVsb3Blck5hdmlnYXRpb24udHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJIZWxwZXJzLnRzXCIvPlxyXG5tb2R1bGUgRGV2ZWxvcGVye1xyXG4gICAgdmFyIGxvZyA9IExvZ2dlci5nZXQoJ2RldmVsb3Blci1uYXZpZ2F0aW9uJyk7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ3VycmVudFN1Yk5hdkJhcigkc2NvcGUsICRsb2NhdGlvbiwgJHJvdXRlUGFyYW1zKXsgICAgXHRcclxuXHRcdHJldHVybiBhY3RpdmF0ZUN1cnJlbnQoW1xyXG5cdFx0XHR7XHJcblx0XHRcdCBocmVmOiBVcmxIZWxwZXJzLmpvaW4oY29udGV4dCxcIk92ZXJ2aWV3XCIsXCJjb2xkL2RhdGEtdHlwZS9hbGxcIiksXHJcblx0XHRcdCBsYWJlbDogXCLlhrfljLrmlbDmja7nrqHnkIZcIixcclxuXHRcdFx0IHRpdGxlOiBcIuaVsOaNruaxh+aAu+S7u+WKoVwiLFxyXG5cdFx0XHQgaXRlbXM6IFt7XHJcblx0XHRcdCBcdGhyZWY6IFVybEhlbHBlcnMuam9pbihjb250ZXh0LFwiT3ZlcnZpZXdcIixcImNvbGQvZGF0YS10eXBlL2FsbFwiKSxcclxuXHRcdFx0IFx0bGFiZWw6IFwi5YWo6YOoXCIsXHJcblx0XHRcdCBcdHRpdGxlOiBcIuWFqOmDqOaVsOaNrlwiXHJcblx0XHRcdCB9LFxyXG5cdFx0XHQge1xyXG5cdFx0XHRcdGhyZWY6IFVybEhlbHBlcnMuam9pbihjb250ZXh0LFwiT3ZlcnZpZXdcIixcImNvbGQvZGF0YS10eXBlL2ZpbmFuY2lhbFwiKSxcclxuXHRcdFx0IFx0bGFiZWw6IFwi6LSi5pS/XCIsXHJcblx0XHRcdCBcdHRpdGxlOiBcIui0ouaUv+aVsOaNrlwiXHJcblx0XHRcdCB9LFxyXG5cdFx0XHQge1xyXG5cdFx0XHQgXHRocmVmOiBVcmxIZWxwZXJzLmpvaW4oY29udGV4dCxcIk92ZXJ2aWV3L1wiLFwiY29sZC9kYXRhLXR5cGUvc29jaWFsLXNlY3VyaXR5XCIpLFxyXG5cdFx0XHQgXHRsYWJlbDogXCLnpL7kv51cIixcclxuXHRcdFx0IFx0dGl0bGU6IFwi56S+5L+d5pWw5o2uXCJcclxuXHRcdFx0IH1dXHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0XHRocmVmOiBVcmxIZWxwZXJzLmpvaW4oY29udGV4dCxcIk92ZXJ2aWV3XCIsXCJob3QvZGF0YS10eXBlL2FsbFwiKSxcclxuXHRcdFx0XHRsYWJlbDogXCLng63ljLrmlbDmja7nrqHnkIZcIixcclxuXHRcdFx0XHR0aXRsZTogXCLmn6XnnIvmiYDmnInmlbDmja5cIixcclxuXHRcdFx0XHRpdGVtczogW3tcclxuXHRcdFx0IFx0aHJlZjogVXJsSGVscGVycy5qb2luKGNvbnRleHQsXCJPdmVydmlld1wiLFwiaG90L2RhdGEtdHlwZS9hbGxcIiksXHJcblx0XHRcdCBcdGxhYmVsOiBcIuWFqOmDqFwiLFxyXG5cdFx0XHQgXHR0aXRsZTogXCLlhajpg6jmlbDmja5cIlxyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0aHJlZjogVXJsSGVscGVycy5qb2luKGNvbnRleHQsXCJPdmVydmlld1wiLFwiaG90L2RhdGEtdHlwZS9maW5hbmNpYWxcIiksXHJcblx0XHRcdCBcdGxhYmVsOiBcIui0ouaUv1wiLFxyXG5cdFx0XHQgXHR0aXRsZTogXCLotKLmlL/mlbDmja5cIlxyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdCBcdGhyZWY6IFVybEhlbHBlcnMuam9pbihjb250ZXh0LFwiT3ZlcnZpZXcvXCIsXCJob3QvZGF0YS10eXBlL3NvY2lhbC1zZWN1cml0eVwiKSxcclxuXHRcdFx0IFx0bGFiZWw6IFwi56S+5L+dXCIsXHJcblx0XHRcdCBcdHRpdGxlOiBcIuekvuS/neaVsOaNrlwiXHJcblx0XHRcdCB9XVxyXG5cdFx0XHR9LFx0XHRcdFxyXG5cdFx0XHR7XHJcblx0XHRcdCBcdGhyZWY6IFVybEhlbHBlcnMuam9pbihjb250ZXh0LFwiT3ZlcnZpZXcvXCIsXCJ0YXNrXCIpLFxyXG5cdFx0XHQgXHRsYWJlbDogXCLku7vliqFcIixcclxuXHRcdFx0IFx0dGl0bGU6IFwi5Lu75Yqh5p+l55yLXCJcclxuXHRcdFx0fSxcdFx0XHRcclxuXHRcdF0pO1xyXG5cdH1cclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImNvbmZpZ1BsdWdpbi50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImNvbmZpZ3NEYXRhU2VydmljZS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2RldmVsb3Blci90cy9kZXZlbG9wZXJOYXZpZ2F0aW9uLnRzXCIvPlxyXG4vLy8gIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2RldmVsb3Blci90cy9kYXRhTWFuYWdlckhlbHBlci50c1wiLz5cclxubW9kdWxlIENvbmZpZ3N7XHJcblx0ZXhwb3J0IGNsYXNzIE9wZXJhdGVUeXBle1xyXG5cdFx0cHVibGljIHN0YXRpYyBnZXQgREVMRVRFKCk6c3RyaW5nIHtyZXR1cm4gXCJkZWxldGVcIn1cclxuXHRcdHB1YmxpYyBzdGF0aWMgZ2V0IFVQREFURSgpOnN0cmluZyB7cmV0dXJuIFwidXBkYXRlXCJ9XHJcblx0XHRwdWJsaWMgc3RhdGljIGdldCBQVVQoKTpzdHJpbmd7cmV0dXJuIFwicHV0XCJ9IFxyXG5cdFx0cHVibGljIHN0YXRpYyBnZXQgTU9WRSgpOnN0cmluZ3tyZXR1cm4gXCJtb3ZlXCJ9XHJcblx0XHRwdWJsaWMgc3RhdGljIGdldCBFWFRSQUNUKCk6c3RyaW5ne3JldHVybiBcImV4dHJhY3RcIn1cclxuXHR9XHJcblxyXG5cdF9tb2R1bGUuY29udHJvbGxlcignQ29uZmlncy5NZW51SXRlbUNvbnRyb2xsZXInLFsnJHNjb3BlJywgJyRsb2NhdGlvbicsICgkc2NvcGUsICRsb2NhdGlvbikgPT4ge1x0XHRcclxuXHRcdCRzY29wZS5tZW51SXRlbT1be1xyXG5cdFx0XHRpY29uOiBcImdseXBoaWNvbiBnbHlwaGljb24tY2xvdWQtdXBsb2FkXCIsXHJcblx0XHRcdGxhYmVsOiBcIuaVsOaNrueuoeeQhumFjee9rlwiLFxyXG5cdFx0XHR0aXRsZTogXCLphY3nva7mlbDmja7lrZjlgqjkv6Hmga9cIixcdFx0XHRcclxuXHRcdFx0aHJlZjogVXJsSGVscGVycy5qb2luKGNvbnRleHQsIFwiL2dsdXN0ZXItZnMvc2V0dGluZ1wiKVxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0aWNvbjogXCJnbHlwaGljb24gZ2x5cGhpY29uLXRoLWxpc3RcIixcclxuXHRcdFx0bGFiZWw6IFwi5pyN5Yqh6ZuG576k6YWN572uXCIsXHJcblx0XHRcdHRpdGxlOiBcIumFjee9ruacjeWKoembhue+pOS/oeaBr1wiLFxyXG5cdFx0XHRocmVmOiBVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgXCIva3ViZS1jbHVzdGVyL3NldHRpbmdcIilcclxuXHRcdH1dXHRcdFxyXG5cdH1dKTtcclxuXHJcblx0ZnVuY3Rpb24gY3JlYXRlQ29uZmlnQnJlYWRjcnVtYnMoJHNjb3BlLCAkbG9jYXRpb24sICRyb3V0ZVBhcmFtcyl7XHJcblx0XHR2YXIgdXJsID0gJGxvY2F0aW9uLnVybCgpO1xyXG5cdFx0dmFyIGxhYmVsLCB0aXRsZTtcclxuXHRcdHN3aXRjaCAodXJsKSB7XHJcblx0XHRcdGNhc2UgXCIvY29uZmlnL2dsdXN0ZXItZnMvc2V0dGluZ1wiOlxyXG5cdFx0XHRcdGxhYmVsID0gXCLmlbDmja7nrqHnkIbphY3nva5cIjtcclxuXHRcdFx0XHR0aXRsZT0gXCLphY3nva7mlbDmja7lrZjlgqjkv6Hmga9cIjtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSBcIi9jb25maWcva3ViZS1jbHVzdGVyL3NldHRpbmdcIjpcclxuXHRcdFx0ICAgIGxhYmVsID0gXCLmnI3liqHpm4bnvqTphY3nva5cIjtcclxuXHRcdFx0XHR0aXRsZT0gXCLphY3nva7mnI3liqHpm4bnvqTkv6Hmga9cIjtcclxuXHRcdFx0ICAgIGJyZWFrO1x0XHRcdCAgICBcdFx0XHRcclxuXHRcdFx0ZGVmYXVsdDpcdFx0XHRcdFxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHRyZXR1cm4gRGV2ZWxvcGVyLmFjdGl2YXRlQ3VycmVudChbe1xyXG5cdFx0XHRocmVmOiB1cmwsXHJcblx0XHRcdGxhYmVsOiBsYWJlbCwvL2l0ZW0ubGFiZWwsXHJcblx0XHRcdHRpdGxlOiB0aXRsZS8vaXRlbS50aXRsZVxyXG5cdFx0fV0pOyBcclxuXHR9XHJcblxyXG5cdGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPcmFjbGVJbmZvKGFycmF5OkFycmF5PGFueT4sIGlkOm51bWJlcil7XHJcblx0XHR2YXIgcmVzdWx0ID17XCJpZFwiOiBpZH07XHJcblx0XHRhbmd1bGFyLmZvckVhY2goYXJyYXksIChhcnIpID0+IHtcclxuXHRcdFx0cmVzdWx0W2Fyci5maWVsZF0gID0gYXJyLnZhbHVlO1xyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0IGZ1bmN0aW9uIHNoYXJlSW5pdCgkc2NvcGUsICRsb2NhdGlvbiwgJHJvdXRlUGFyYW1zKXtcclxuXHRcdCRzY29wZS4gc3ViVGFiQ29uZmlnID0gRGV2ZWxvcGVyLmNyZWF0ZUN1cnJlbnRTdWJOYXZCYXIoJHNjb3BlLCAkbG9jYXRpb24sICRyb3V0ZVBhcmFtcyk7IFxyXG5cdFx0JHNjb3BlLm1hc2sgPSB0cnVlO1xyXG5cdFx0LyoqXHJcblx0XHQgIOWIm+W7uuWFqOWxj+mBruaMoVxyXG5cdFx0Ki9cclxuXHRcdCQoXCIjbWFza1wiKS5jc3MoXCJwb3NpdGlvblwiLCBcImFic29sdXRlXCIpO1xyXG5cdFx0JChcIiNtYXNrXCIpLmNzcyhcImJhY2tncm91bmRcIiwgXCJibGFja1wiKTtcclxuXHRcdCQoXCIjbWFza1wiKS5jc3MoXCJvcGFjaXR5XCIsIDAuNCk7XHJcblx0XHQkKFwiI21hc2tcIikuY3NzKFwiZmlsdGVyXCIsIFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKHN0eWxlPTQsb3BhY2l0eT0yNSlcIik7XHJcblx0XHQkKFwiI21hc2tcIikuY3NzKFwidG9wXCIsIFwiMHB4XCIpO1xyXG5cdFx0JChcIiNtYXNrXCIpLmNzcyhcImxlZnRcIiwgXCIwcHhcIik7XHJcblx0XHQkKFwiI21hc2tcIikuY3NzKFwid2lkdGhcIiwgZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCk7XHJcblx0XHQkKFwiI21hc2tcIikuY3NzKFwiaGVpZ2h0XCIsIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApO1xyXG5cdFx0JChcIiNtYXNrXCIpLmNzcyhcInpJbmRleFwiLCAxMDAwKTtcclxuXHR9XHJcblxyXG5cdGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOZXdPYmVqY3QoYXJyYXk6QXJyYXk8YW55Piwgb2JqKXtcclxuXHRcdHZhciByZXN1bHQgPVtdO1xyXG5cdFx0aWYob2JqKXtcclxuXHRcdFx0YW5ndWxhci5mb3JFYWNoKGFycmF5LCAoYXJyKSA9PntcdFx0XHRcclxuXHRcdFx0XHRyZXN1bHQucHVzaCh7XHJcblx0XHRcdFx0XHRmaWVsZDogYXJyLmZpZWxkLFxyXG5cdFx0XHRcdFx0bmFtZTogYXJyLmRpc3BsYXlOYW1lLFxyXG5cdFx0XHRcdFx0dmFsdWU6IG9ialthcnIuZmllbGRdXHJcblx0XHRcdFx0fSk7XHRcdFx0XHJcblx0XHRcdH0pO1xyXG5cdFx0fWVsc2V7XHJcblx0XHRcdGFuZ3VsYXIuZm9yRWFjaChhcnJheSwgKGFycikgPT57XHRcdFx0XHJcblx0XHRcdFx0cmVzdWx0LnB1c2goe1xyXG5cdFx0XHRcdFx0ZmllbGQ6IGFyci5maWVsZCxcclxuXHRcdFx0XHRcdG5hbWU6IGFyci5kaXNwbGF5TmFtZSxcclxuXHRcdFx0XHRcdHZhbHVlOiBudWxsXHJcblx0XHRcdFx0fSk7XHRcdFx0XHJcblx0XHRcdH0pO1xyXG5cdFx0fVx0XHJcblx0XHRyZXR1cm4gcmVzdWx0O1x0XHRcclxuXHR9XHJcblxyXG5cdGV4cG9ydCBmdW5jdGlvbiBvcmFjbGVJbmZvT3BlcmF0ZSgkaHR0cCwgdXJsOnN0cmluZywgb3BlcmF0ZTpzdHJpbmcsIHJlc291cmNlLCBmbj86IChkYXRhLCBzdGF0dXMpPT52b2lkICl7XHJcblx0XHRpZihyZXNvdXJjZSA9PT0gbnVsbClcclxuXHRcdFx0dGhyb3cgXCLkuI3og73mk43kvZznqbrotYTmupDlr7nosaFcIjtcdFx0XHRcdFxyXG5cdFx0dmFyIGlkID0gcmVzb3VyY2VbXCJpZFwiXSB8fCByZXNvdXJjZVtcIm5hbWVcIl0gfHwgcmVzb3VyY2VbXCJfaWRcIl0gfHwgcmVzb3VyY2VbXCJfa2V5XCJdO1x0XHRcclxuXHRcdHZhciBSRVNUZnVsVXJsPXVybDtcclxuXHRcdGlmKGlkID09IFwidW5kZWZpbmVkXCIpe1xyXG5cdFx0XHRSRVNUZnVsVXJsID0gIFVybEhlbHBlcnMuam9pbih1cmwsIG9wZXJhdGUpO1xyXG5cdFx0fWVsc2V7XHJcblx0XHRcdFJFU1RmdWxVcmwgPSBVcmxIZWxwZXJzLmpvaW4odXJsLCBpZCtcIlwiLCBvcGVyYXRlKTtcclxuXHRcdH1cdFx0XHJcblx0XHRcclxuXHRcdCRodHRwKHsgIFxyXG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLCBcclxuICAgICAgICAgICAgdXJsOiBSRVNUZnVsVXJsLCAgICBcclxuICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocmVzb3VyY2UpLCAgICAgXHJcbiAgICAgICAgfSkuc3VjY2VzcygoZGF0YSxoZWFkZXIsY29uZmlnLHN0YXR1cykgPT4geyAgICAgICAgXHRcclxuICAgICAgICBcdGlmKGFuZ3VsYXIuaXNGdW5jdGlvbihmbikpXHJcbiAgICAgICAgICAgIFx0Zm4oZGF0YSwgaGVhZGVyKTsgIFxyXG4gICAgICAgIH0pLmVycm9yKChkYXRhLGhlYWRlcixjb25maWcsc3RhdHVzKSA9PiB7XHJcblx0XHRcdGlmKGFuZ3VsYXIuaXNGdW5jdGlvbihmbikpXHJcbiAgICAgICAgICAgIFx0Zm4oZGF0YSwgaGVhZGVyKTsgICBcclxuICAgICAgICB9KTtcclxuXHR9XHJcblxyXG5cdGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25maWdIZWxwZXJOYXZCYXIoJHNjb3BlLCAkbG9jYXRpb24sICRyb3V0ZVBhcmFtcyl7XHJcblx0XHRyZXR1cm4gRGV2ZWxvcGVyLmFjdGl2YXRlQ3VycmVudChbXHJcblx0XHRcdHtcclxuXHRcdFx0IGhyZWY6IFVybEhlbHBlcnMuam9pbihjb250ZXh0LCBcInJlZ2lvbmFsaXNtLWNvZGUvc2VhcmNoaW5nXCIpLFxyXG5cdFx0XHQgbGFiZWw6IFwi6KGM5pS/5Yy65YiS5qOA57SiXCIsXHJcblx0XHRcdCB0aXRsZTogXCLmo4DntKLooYzmlL/ljLrliJLku6PnoIFcIlx0XHRcdFxyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdCBcdGhyZWY6IFVybEhlbHBlcnMuam9pbihjb250ZXh0LFwic3lzdGVtLWNvZGUvc2VhcmNoaW5nXCIpLFxyXG5cdFx0XHQgXHRsYWJlbDogXCLns7vnu5/nvJbnoIHmo4DntKJcIixcclxuXHRcdFx0IFx0dGl0bGU6IFwi5qOA57Si57O757uf57yW56CBXCJcclxuXHRcdFx0fVx0XHRcdFxyXG5cdFx0XSk7XHJcblx0fVxyXG5cclxuXHRleHBvcnQgZnVuY3Rpb24gZm9ybWF0Vm9sdW1lKHZvbHVtZTogdm9sdW1lKTogZm9ybWF0ZWRWb2x1bWV7XHJcblx0XHR2YXIgYnJpY2s6QXJyYXk8QnJpY2s+ID0gW107XHJcblx0XHRhbmd1bGFyLmZvckVhY2godm9sdW1lLmJyaWNrLCAoYmxvY2s6QmxvY2spID0+IHtcclxuXHRcdFx0YnJpY2sucHVzaCh7XHJcblx0XHRcdFx0aXA6IGJsb2NrLmlwLnNwbGl0KFwiLlwiKSxcclxuXHRcdFx0XHRzdGF0dXM6IGJsb2NrLnN0YXR1cyxcclxuXHRcdFx0XHRwYXRoOiBibG9jay5wYXRoLFxyXG5cdFx0XHRcdGVkaXRhYmxlOiBibG9jay5lZGl0YWJsZSB8fCBmYWxzZVx0XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRuYW1lOiB2b2x1bWUubmFtZSxcclxuXHRcdFx0cGF0aDogdm9sdW1lLnBhdGgsXHJcblx0XHRcdGJyaWNrOiBicmljayxcclxuXHRcdFx0c3RhdHVzOiB2b2x1bWUuc3RhdHVzLFxyXG5cdFx0XHRlZGl0YWJsZTogdm9sdW1lLmVkaXRhYmxlIHx8IGZhbHNlXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRleHBvcnQgZnVuY3Rpb24gdm9sdW1lc0Zvcm1hdCh2b2x1bWVzOiBBcnJheTx2b2x1bWU+KTogQXJyYXk8Zm9ybWF0ZWRWb2x1bWU+e1xyXG5cdFx0dmFyIHJlc3VsdDpBcnJheTxmb3JtYXRlZFZvbHVtZT4gPSBbXTtcclxuXHRcdGFuZ3VsYXIuZm9yRWFjaCh2b2x1bWVzLCAodm9sdW1lKSA9PiB7XHJcblx0XHRcdHJlc3VsdC5wdXNoKGZvcm1hdFZvbHVtZSh2b2x1bWUpKTtcclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdGV4cG9ydCBpbnRlcmZhY2UgZm9ybWF0ZWRWb2x1bWV7XHJcblx0XHRuYW1lOiBzdHJpbmdcdFx0XHJcblx0XHRwYXRoOiBzdHJpbmdcclxuXHRcdGJyaWNrOiBBcnJheTxCcmljaz47XHJcblx0XHRzdGF0dXM6IGJvb2xlYW47XHJcblx0XHRlZGl0YWJsZTogYm9vbGVhblxyXG5cdH1cclxuXHJcblx0ZXhwb3J0IGludGVyZmFjZSBCcmlja3tcclxuXHRcdGlwOiBBcnJheTxzdHJpbmc+O1xyXG5cdFx0c3RhdHVzOiBib29sZWFuO1xyXG5cdFx0cGF0aDogc3RyaW5nO1xyXG5cdFx0ZWRpdGFibGU6IGJvb2xlYW5cclxuXHR9XHJcblxyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImN1c3RvbUFsZXJ0LnRzXCIvPlxyXG5tb2R1bGUgQ29uZmlnc3tcclxuXHRleHBvcnQgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudEJ5VmFsdWUoYXJyYXk6QXJyYXk8YW55PiAsdmFsdWU6YW55LCBrZXk/OnN0cmluZyApe1xyXG5cdFx0aWYoa2V5KXtcclxuXHRcdFx0Zm9yKHZhciBpPTA7IGk8YXJyYXkubGVuZ3RoOyBpKyspe1xyXG5cdFx0XHRcdGlmKGFycmF5W2ldW2tleV0gPT09IHZhbHVlKXtcclxuXHRcdFx0XHRcdGFycmF5LnNwbGljZShpICwxKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fWVsc2V7XHJcblx0XHRcdGZvcih2YXIgaT0wIDsgaTxhcnJheS5sZW5ndGg7IGkrKyl7XHJcblx0XHRcdFx0aWYoYXJyYXlbaV0gPT09IHZhbHVlKXtcclxuXHRcdFx0XHRcdGFycmF5LnNwbGljZShpICwxKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnRzQnlWYWx1ZShhcnJheTogQXJyYXk8YW55PiwgZWxlbWVudHM6QXJyYXk8YW55Pil7XHJcblx0XHRhbmd1bGFyLmZvckVhY2goZWxlbWVudHMsIChlbGVtZW50KSA9PntcclxuXHRcdFx0cmVtb3ZlRWxlbWVudEJ5VmFsdWUoYXJyYXksIGVsZW1lbnQudmFsdWUsIGVsZW1lbnQua2V5KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0XHTlr7nosaHnmoTmt7Hmi7fotJ1cclxuXHQqL1xyXG5cclxuXHRleHBvcnQgZnVuY3Rpb24gZGVlcENvcHkob2JqZWN0KSB7XHJcblx0XHR2YXIgbixpO1xyXG5cdCAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJyYXkpIHtcclxuXHQgICAgICAgIG4gPSBbXTtcclxuXHQgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyArK2kpIHtcclxuXHQgICAgICAgICAgICBuW2ldID0gZGVlcENvcHkob2JqZWN0W2ldKTtcclxuXHQgICAgICAgIH1cclxuXHQgICAgICAgIHJldHVybiBuO1xyXG5cclxuXHQgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBPYmplY3QpIHtcclxuXHQgICAgICAgIG4gPSB7fVxyXG5cdCAgICAgICAgZm9yIChpIGluIG9iamVjdCkge1xyXG5cdCAgICAgICAgICAgIG5baV0gPSBkZWVwQ29weShvYmplY3RbaV0pO1xyXG5cdCAgICAgICAgfVxyXG5cdCAgICAgICAgcmV0dXJuIG47XHJcblx0ICAgIH0gZWxzZSB7XHJcblx0ICAgICAgICByZXR1cm4gb2JqZWN0O1xyXG5cdCAgICB9XHJcblx0fVxyXG5cclxuXHRleHBvcnQgZnVuY3Rpb24gZG93bmxvYWRGaWxlKCRzY29wZSwgJGh0dHAsIHVybCwgZm4/KXtcclxuXHRcdCRodHRwLmdldCh1cmwsIHsgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInfSlcclxuICAgICAgICAgIC5zdWNjZXNzKCBmdW5jdGlvbihkYXRhLCBzdGF0dXMsIGhlYWRlcnMpIHsgICAgICAgICAgXHJcbiAgICAgICAgICBcdGlmKGFuZ3VsYXIuaXNGdW5jdGlvbihmbikpXHJcbiAgICAgICAgICBcdFx0Zm4oKTtcclxuICAgICAgICAgICAgdmFyIG9jdGV0U3RyZWFtTWltZSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xyXG4gICAgICAgICAgICB2YXIgc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGhlYWRlcnNcclxuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMoKTsgICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gR2V0IHRoZSBmaWxlbmFtZSBmcm9tIHRoZSB4LWZpbGVuYW1lIGhlYWRlciBvciBkZWZhdWx0IHRvIFwi5pyN5Yqh5YiX6KGoXCJcclxuICAgICAgICAgICAgdmFyIGZpbGVuYW1lID0gXCLmnI3liqHmlofku7ZcIjtcclxuICAgICAgICAgICAgdmFyIHBhcmFtcyA9IGhlYWRlcnNbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXS5zcGxpdChcIjtcIik7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGk8IHBhcmFtcy5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgIFx0aWYocGFyYW1zW2ldLmluZGV4T2YoXCJmaWxlbmFtZVwiKSAhPSAtMSl7XHJcbiAgICAgICAgICAgIFx0XHR2YXIgdG1wID0gcGFyYW1zW2ldLnNwbGl0KFwiPVwiKTtcclxuICAgICAgICAgICAgXHRcdGlmKHRtcC5sZW5ndGggPT0gMilcclxuICAgICAgICAgICAgXHRcdFx0ZmlsZW5hbWUgPSB0bXBbMV0ucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcIlwiLCBcImdtXCIpLFwiXCIpO1xyXG4gICAgICAgICAgICBcdH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBjb250ZW50IHR5cGUgZnJvbSB0aGUgaGVhZGVyIG9yIGRlZmF1bHQgdG8gXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxyXG4gICAgICAgICAgICB2YXIgY29udGVudFR5cGUgPSBoZWFkZXJzWydjb250ZW50LXR5cGUnXSB8fCBvY3RldFN0cmVhbU1pbWU7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgXHQvLyBUcnkgdXNpbmcgbXNTYXZlQmxvYiBpZiBzdXBwb3J0ZWRcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVHJ5aW5nIHNhdmVCbG9iIG1ldGhvZCAuLi5cIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcclxuICAgICAgICAgICAgICAgICAgXHRpZihuYXZpZ2F0b3IubXNTYXZlQmxvYilcclxuICAgICAgICAgICAgICAgICAgICAgIFx0bmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYiwgZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICBcdGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgXHQvLyBUcnkgdXNpbmcgb3RoZXIgc2F2ZUJsb2IgaW1wbGVtZW50YXRpb25zLCBpZiBhdmFpbGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgIFx0dmFyIHNhdmVCbG9iID0gbmF2aWdhdG9yW1wid2Via2l0U2F2ZUJsb2JcIl0gfHwgbmF2aWdhdG9yW1wibW96U2F2ZUJsb2JcIl0gfHwgbmF2aWdhdG9yW1wic2F2ZUJsb2JcIl07XHJcbiAgICAgICAgICAgICAgICAgICAgICBcdGlmKHNhdmVCbG9iID09PSB1bmRlZmluZWQpIHRocm93IFwiTm90IHN1cHBvcnRlZFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgXHRzYXZlQmxvYihibG9iLCBmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgIFx0fVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2F2ZUJsb2Igc3VjY2VlZGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIFx0fSBjYXRjaChleCl7XHJcbiAgICAgICAgICAgICAgICAgIFx0Y29uc29sZS5sb2coXCJzYXZlQmxvYiBtZXRob2QgZmFpbGVkIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb246XCIpO1xyXG4gICAgICAgICAgICAgICAgICBcdGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgICBcdH1cclxuICAgICAgICAgICAgICBcdGlmKCFzdWNjZXNzKXtcclxuICAgICAgICAgICAgICAgIFx0Ly8gR2V0IHRoZSBibG9iIHVybCBjcmVhdG9yXHJcbiAgICAgICAgICAgICAgICBcdHZhciB1cmxDcmVhdG9yID0gd2luZG93LlVSTCB8fCB3aW5kb3dbXCJ3ZWJraXRVUkxcIl0gfHwgd2luZG93W1wibW96VVJMXCJdIHx8IHdpbmRvd1tcIm1zVVJMXCJdO1xyXG4gICAgICAgICAgICAgIFx0aWYodXJsQ3JlYXRvcil7XHJcbiAgICAgICAgICAgICAgICBcdC8vIFRyeSB0byB1c2UgYSBkb3dubG9hZCBsaW5rXHJcbiAgICAgICAgICAgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgICAgICAgICAgIGlmKCdkb3dubG9hZCcgaW4gbGluayl7XHJcbiAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBzaW11bGF0ZSBhIGNsaWNrXHJcbiAgICAgICAgICAgICAgICAgIFx0dHJ5e1xyXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUHJlcGFyZSBhIGJsb2IgVVJMXHJcblx0ICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRyeWluZyBkb3dubG9hZCBsaW5rIG1ldGhvZCB3aXRoIHNpbXVsYXRlZCBjbGljayAuLi5cIik7XHJcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcclxuXHQgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSB1cmxDcmVhdG9yLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuXHQgICAgICAgICAgICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcclxuXHQgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZG93bmxvYWQgYXR0cmlidXRlIChTdXBwb3J0ZWQgaW4gQ2hyb21lIDE0KyAvIEZpcmVmb3ggMjArKVxyXG5cdCAgICAgICAgICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoXCJkb3dubG9hZFwiLCBmaWxlbmFtZSk7XHJcblx0ICAgICAgICAgICAgICAgICAgICAvLyBTaW11bGF0ZSBjbGlja2luZyB0aGUgZG93bmxvYWQgbGlua1xyXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJyk7XHJcblx0ICAgICAgICAgICAgICAgICAgICBldmVudC5pbml0TW91c2VFdmVudCgnY2xpY2snLCB0cnVlLCB0cnVlLCB3aW5kb3csIDEsIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBudWxsKTtcclxuXHQgICAgICAgICAgICAgICAgICAgIGxpbmsuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcblx0ICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRvd25sb2FkIGxpbmsgbWV0aG9kIHdpdGggc2ltdWxhdGVkIGNsaWNrIHN1Y2NlZWRlZFwiKTtcclxuXHQgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBcdH1jYXRjaChleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICBcdGNvbnNvbGUubG9nKFwiRG93bmxvYWQgbGluayBtZXRob2Qgd2l0aCBzaW11bGF0ZWQgY2xpY2sgZmFpbGVkIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb246XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgXHRjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoIXN1Y2Nlc3Mpe1xyXG4gICAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byB3aW5kb3cubG9jYXRpb24gbWV0aG9kXHJcbiAgICAgICAgICAgICAgICAgIFx0dHJ5e1xyXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUHJlcGFyZSBhIGJsb2IgVVJMXHJcblx0ICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIHdoZW4gdXNpbmcgd2luZG93LmxvY2F0aW9uIHRvIGZvcmNlIGRvd25sb2FkXHJcblx0ICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRyeWluZyBkb3dubG9hZCBsaW5rIG1ldGhvZCB3aXRoIHdpbmRvdy5sb2NhdGlvbiAuLi5cIik7XHJcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlOiBvY3RldFN0cmVhbU1pbWUgfSk7XHJcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gdXJsQ3JlYXRvci5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcblx0ICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB1cmw7XHJcblx0ICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRvd25sb2FkIGxpbmsgbWV0aG9kIHdpdGggd2luZG93LmxvY2F0aW9uIHN1Y2NlZWRlZFwiKTtcclxuXHQgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBcdH1jYXRjaChleCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBcdGNvbnNvbGUubG9nKFwiRG93bmxvYWQgbGluayBtZXRob2Qgd2l0aCB3aW5kb3cubG9jYXRpb24gZmFpbGVkIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb246XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgXHRjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgICAgICAgIFx0fVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZighc3VjY2Vzcyl7XHJcbiAgICAgICAgICAgICAgXHQvLyBGYWxsYmFjayB0byB3aW5kb3cub3BlbiBtZXRob2RcclxuICAgICAgICAgICAgIFx0Y29uc29sZS5sb2coXCJObyBtZXRob2RzIHdvcmtlZCBmb3Igc2F2aW5nIHRoZSBhcnJheWJ1ZmZlciwgdXNpbmcgbGFzdCByZXNvcnQgd2luZG93Lm9wZW5cIik7XHJcbiAgICAgICAgICAgICAgXHR3aW5kb3cub3BlbignX2JsYW5rJywgJycpO1xyXG4gICAgICAgICAgICAgIFx0Q29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuaWh+S7tuS4i+i9veWksei0pVwiLCAnJyxudWxsLCAwLCBcImVycm9yXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkuZXJyb3IoZnVuY3Rpb24oZGF0YSwgc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXM6IFwiICsgc3RhdHVzKTtcclxuICAgICAgICAgICAgLy8gT3B0aW9uYWxseSB3cml0ZSB0aGUgZXJyb3Igb3V0IHRvIHNjb3BlXHJcbiAgICAgICAgICAgIGZuKCk7XHJcbiAgICAgICAgICAgIENvbmZpZ3MuY3VzdG9tQWxlcnQoXCLmj5DnpLpcIiwgXCLmlofku7bkuIvovb3lpLHotKVcIiwgJycsbnVsbCwgMCwgXCJlcnJvclwiKTtcclxuICAgICAgICAgICAgJHNjb3BlLmVycm9yRGV0YWlscyA9IFwiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXM6IFwiICsgc3RhdHVzO1xyXG4gICAgICAgIH0pO1xyXG5cdCAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBGaWxlSW5wdXRQbHVnaW4oZm46IEZ1bmN0aW9uLCBpc011bHRpcGxlPzpib29sZWFuKXtcclxuICAgICAgdmFyIGlucHV0T2JqID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgICAgaW5wdXRPYmouc2V0QXR0cmlidXRlKCdpZCcsJ215RmlsZUlucHV0Jyk7XHJcbiAgICAgIGlucHV0T2JqLnNldEF0dHJpYnV0ZSgndHlwZScsJ2ZpbGUnKTtcclxuICAgICAgaW5wdXRPYmouc2V0QXR0cmlidXRlKFwic3R5bGVcIiwndmlzaWJpbGl0eTpoaWRkZW4nKTsgIFxyXG4gICAgICBpZihpc011bHRpcGxlKVxyXG4gICAgICAgIGlucHV0T2JqLnNldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIsIFwibXVsdGlwbGVcIik7ICAgICAgICAgXHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW5wdXRPYmopO1xyXG4gICAgICBpbnB1dE9iai5jbGljaygpO1xyXG4gICAgICBpbnB1dE9iai5vbmNoYW5nZSA9IChlbGVtZW50KSA9PnsgIFxyXG4gICAgICAgIGZuKGVsZW1lbnQudGFyZ2V0W1wiZmlsZXNcIl0pOyAgIFxyXG4gICAgICAgIHZhciBteSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibXlGaWxlSW5wdXRcIik7XHJcbiAgICAgICAgaWYobnVsbCAhPSBteSlcclxuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobXkpO1xyXG4gICAgICB9ICAgICAgXHJcbiAgICB9XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzSGVscGVycy50c1wiLz5cclxuXHJcblxyXG5kZWNsYXJlIHZhciBPU09BdXRoQ29uZmlnOmFueTtcclxuZGVjbGFyZSB2YXIgR29vZ2xlT0F1dGhDb25maWc6YW55O1xyXG5kZWNsYXJlIHZhciBLZXljbG9ha0NvbmZpZzphbnk7XHJcblxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIGV4cG9ydCB2YXIgX21vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKHBsdWdpbk5hbWUsIFsnaGF3dGlvLWNvcmUnLCAnaGF3dGlvLXVpJywgJ3VpLmNvZGVtaXJyb3InLCAndWkudmFsaWRhdGUnLCdrdWJlcm5ldGVzVUknXSk7XHJcbiAgZXhwb3J0IHZhciBjb250cm9sbGVyID0gUGx1Z2luSGVscGVycy5jcmVhdGVDb250cm9sbGVyRnVuY3Rpb24oX21vZHVsZSwgcGx1Z2luTmFtZSk7XHJcbiAgZXhwb3J0IHZhciByb3V0ZSA9IFBsdWdpbkhlbHBlcnMuY3JlYXRlUm91dGluZ0Z1bmN0aW9uKHRlbXBsYXRlUGF0aCk7XHJcblxyXG4gIF9tb2R1bGUuY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCAoJHJvdXRlUHJvdmlkZXI6bmcucm91dGUuSVJvdXRlUHJvdmlkZXIpID0+IHsgICBcclxuICAgICRyb3V0ZVByb3ZpZGVyXHJcbiAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnL3BvZHMnKSwgcm91dGUoJ3BvZHMuaHRtbCcsIGZhbHNlKSlcclxuICAgICAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdyZXBsaWNhdGlvbkNvbnRyb2xsZXJzJyksIHJvdXRlKCdyZXBsaWNhdGlvbkNvbnRyb2xsZXJzLmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnc2VydmljZXMnKSwgcm91dGUoJ3NlcnZpY2VzLmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnZXZlbnRzJyksIHJvdXRlKCdldmVudHMuaHRtbCcsIGZhbHNlKSlcclxuICAgICAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdhcHBzJyksIHJvdXRlKCdhcHBzLmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnYXBwcy86bmFtZXNwYWNlJyksIHJvdXRlKCdhcHBzLmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAndGVtcGxhdGVzJyksIHJvdXRlKCd0ZW1wbGF0ZXMuaHRtbCcsIGZhbHNlKSlcclxuICAgICAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdob3N0cycpLCByb3V0ZSgnaG9zdHMuaHRtbCcsIGZhbHNlKSlcclxuICAgICAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdob3N0cy86aWQnKSwgcm91dGUoJ2hvc3QuaHRtbCcsIHRydWUpKVxyXG4gICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ3BpcGVsaW5lcycpLCByb3V0ZSgncGlwZWxpbmVzLmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnb3ZlcnZpZXcnKSwgcm91dGUoJ292ZXJ2aWV3Lmh0bWwnLCB0cnVlKSlcclxuICAgICAgLndoZW4oY29udGV4dCwge3JlZGlyZWN0VG86IFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAncmVwbGljYXRpb25Db250cm9sbGVycycpfSk7ICAgICAgXHJcblxyXG4gICAgYW5ndWxhci5mb3JFYWNoKFtjb250ZXh0LCBcIi93b3Jrc3BhY2VzLzp3b3Jrc3BhY2UvcHJvamVjdHMvOnByb2plY3RcIl0sIChjb250ZXh0KSA9PiB7ICAgICBcclxuICAgICAgJHJvdXRlUHJvdmlkZXJcclxuICAgICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJy9uYW1lc3BhY2UvOm5hbWVzcGFjZS9wb2RDcmVhdGUnKSwgcm91dGUoJ3BvZENyZWF0ZS5odG1sJywgZmFsc2UpKVxyXG4gICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnL25hbWVzcGFjZS86bmFtZXNwYWNlL3BvZEVkaXQvOmlkJyksIHJvdXRlKCdwb2RFZGl0Lmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgICAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICcvbmFtZXNwYWNlLzpuYW1lc3BhY2UvcG9kcycpLCByb3V0ZSgncG9kcy5odG1sJywgZmFsc2UpKVxyXG4gICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnL25hbWVzcGFjZS86bmFtZXNwYWNlL3BvZHMvOmlkJyksIHJvdXRlKCdwb2QuaHRtbCcsIGZhbHNlKSlcclxuICAgICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJy9uYW1lc3BhY2UvOm5hbWVzcGFjZS9yZXBsaWNhdGlvbkNvbnRyb2xsZXJzJyksIHJvdXRlKCdyZXBsaWNhdGlvbkNvbnRyb2xsZXJzLmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgICAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICcvbmFtZXNwYWNlLzpuYW1lc3BhY2UvcmVwbGljYXRpb25Db250cm9sbGVycy86aWQnKSwgcm91dGUoJ3JlcGxpY2F0aW9uQ29udHJvbGxlci5odG1sJywgZmFsc2UpKVxyXG4gICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnL25hbWVzcGFjZS86bmFtZXNwYWNlL3JlcGxpY2F0aW9uQ29udHJvbGxlckNyZWF0ZScpLCByb3V0ZSgncmVwbGljYXRpb25Db250cm9sbGVyQ3JlYXRlLmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgICAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICcvbmFtZXNwYWNlLzpuYW1lc3BhY2UvcmVwbGljYXRpb25Db250cm9sbGVyRWRpdC86aWQnKSwgcm91dGUoJ3JlcGxpY2F0aW9uQ29udHJvbGxlckVkaXQuaHRtbCcsIGZhbHNlKSlcclxuICAgICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJy9uYW1lc3BhY2UvOm5hbWVzcGFjZS9zZWNyZXRzJyksIHJvdXRlKCdzZWNyZXRzLmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgICAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICcvbmFtZXNwYWNlLzpuYW1lc3BhY2Uvc2VjcmV0cy86aWQnKSwgcm91dGUoJ3NlY3JldC5odG1sJywgZmFsc2UpKVxyXG4gICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnL25hbWVzcGFjZS86bmFtZXNwYWNlL3NlY3JldENyZWF0ZScpLCByb3V0ZSgnc2VjcmV0Lmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgICAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICcvbmFtZXNwYWNlLzpuYW1lc3BhY2Uvc2VydmljZXMnKSwgcm91dGUoJ3NlcnZpY2VzLmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgICAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICcvbmFtZXNwYWNlLzpuYW1lc3BhY2Uvc2VydmljZXMvOmlkJyksIHJvdXRlKCdzZXJ2aWNlLmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgICAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICcvbmFtZXNwYWNlLzpuYW1lc3BhY2Uvc2VydmljZUNyZWF0ZScpLCByb3V0ZSgnc2VydmljZUNyZWF0ZS5odG1sJywgZmFsc2UpKVxyXG4gICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnL25hbWVzcGFjZS86bmFtZXNwYWNlL3NlcnZpY2VFZGl0LzppZCcpLCByb3V0ZSgnc2VydmljZUVkaXQuaHRtbCcsIGZhbHNlKSlcclxuICAgICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJy9uYW1lc3BhY2UvOm5hbWVzcGFjZS9ldmVudHMnKSwgcm91dGUoJ2V2ZW50cy5odG1sJywgZmFsc2UpKVxyXG4gICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnL25hbWVzcGFjZS86bmFtZXNwYWNlL2FwcHMnKSwgcm91dGUoJ2FwcHMuaHRtbCcsIGZhbHNlKSlcclxuICAgICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJy9uYW1lc3BhY2UvOm5hbWVzcGFjZS9vdmVydmlldycpLCByb3V0ZSgnb3ZlcnZpZXcuaHRtbCcsIHRydWUpKVxyXG4gICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnL25hbWVzcGFjZS86bmFtZXNwYWNlL3RlbXBsYXRlcy86dGFyZ2V0TmFtZXNwYWNlJyksIHJvdXRlKCd0ZW1wbGF0ZXMuaHRtbCcsIGZhbHNlKSlcclxuICAgICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJy9uYW1lc3BhY2UvOm5hbWVzcGFjZScpLCByb3V0ZSgnYXBwcy5odG1sJywgZmFsc2UpKVxyXG4gICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnYnVpbGRzJyksIHJvdXRlKCdidWlsZHMuaHRtbCcsIGZhbHNlKSlcclxuICAgICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ2J1aWxkcy86aWQnKSwgcm91dGUoJ2J1aWxkLmh0bWwnLCB0cnVlKSlcclxuICAgICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ2J1aWxkTG9ncy86aWQnKSwgcm91dGUoJ2J1aWxkTG9ncy5odG1sJywgdHJ1ZSkpXHJcbiAgICAgICAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdidWlsZENvbmZpZ3MnKSwgcm91dGUoJ2J1aWxkQ29uZmlncy5odG1sJywgZmFsc2UpKVxyXG4gICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnYnVpbGRDb25maWdzLzppZCcpLCByb3V0ZSgnYnVpbGRDb25maWcuaHRtbCcsIHRydWUpKVxyXG4gICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnYnVpbGRDb25maWdFZGl0LzppZCcpLCByb3V0ZSgnYnVpbGRDb25maWdFZGl0Lmh0bWwnLCB0cnVlKSlcclxuICAgICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ2RlcGxveW1lbnRDb25maWdzJyksIHJvdXRlKCdkZXBsb3ltZW50Q29uZmlncy5odG1sJywgZmFsc2UpKVxyXG4gICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnZGVwbG95bWVudENvbmZpZ3MvOmlkJyksIHJvdXRlKCdkZXBsb3ltZW50Q29uZmlnLmh0bWwnLCB0cnVlKSlcclxuICAgICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ2ltYWdlUmVwb3NpdG9yaWVzJyksIHJvdXRlKCdpbWFnZVJlcG9zaXRvcmllcy5odG1sJywgZmFsc2UpKVxyXG4gICAgfSk7XHJcblxyXG4gICAgYW5ndWxhci5mb3JFYWNoKFtjb250ZXh0LCBcIi93b3Jrc3BhY2VzLzp3b3Jrc3BhY2VcIiwgXCIvd29ya3NwYWNlcy86d29ya3NwYWNlL3Byb2plY3RzLzpwcm9qZWN0XCJdLCAoY29udGV4dCkgPT4ge1xyXG4gICAgICAkcm91dGVQcm92aWRlclxyXG4gICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnYnVpbGRDb25maWdFZGl0JyksIHJvdXRlKCdidWlsZENvbmZpZ0VkaXQuaHRtbCcsIHRydWUpKVxyXG4gICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnYnVpbGRDb25maWdFZGl0LzppZCcpLCByb3V0ZSgnYnVpbGRDb25maWdFZGl0Lmh0bWwnLCB0cnVlKSlcclxuICAgICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ2ltcG9ydFByb2plY3QnKSwgcm91dGUoJ2ltcG9ydFByb2plY3QuaHRtbCcsIHRydWUpKVxyXG4gICAgfSk7XHJcbiAgfV0pO1xyXG5cclxuXHJcbiAgX21vZHVsZS5mYWN0b3J5KCdBcHBMaWJyYXJ5VVJMJywgWyckcm9vdFNjb3BlJywgKCRyb290U2NvcGU6bmcuSVJvb3RTY29wZVNlcnZpY2UpID0+IHtcclxuICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4oa3ViZXJuZXRlc0FwaVVybCgpLCBcIi9wcm94eVwiLCBrdWJlcm5ldGVzTmFtZXNwYWNlUGF0aCgpLCBcIi9zZXJ2aWNlcy9hcHAtbGlicmFyeVwiKTtcclxuICB9XSk7XHJcblxyXG4gIF9tb2R1bGUuZmFjdG9yeSgnV2lraUdpdFVybFByZWZpeCcsICgpID0+IHtcclxuICAgIHJldHVybiBVcmxIZWxwZXJzLmpvaW4oa3ViZXJuZXRlc0FwaVVybCgpLCBcIi9wcm94eVwiLCBrdWJlcm5ldGVzTmFtZXNwYWNlUGF0aCgpLCBcInNlcnZpY2VzL2FwcC1saWJyYXJ5XCIpO1xyXG4gIH0pO1xyXG5cclxuICBfbW9kdWxlLmZhY3RvcnkoJ3dpa2lSZXBvc2l0b3J5JywgW1wiJGxvY2F0aW9uXCIsIFwibG9jYWxTdG9yYWdlXCIsICgkbG9jYXRpb24sIGxvY2FsU3RvcmFnZSkgPT4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1dKTtcclxuXHJcbiAgX21vZHVsZS5mYWN0b3J5KCdDb25uZWN0RGlhbG9nU2VydmljZScsIFsnJHJvb3RTY29wZScsICgkcm9vdFNjb3BlOm5nLklSb290U2NvcGVTZXJ2aWNlKSA9PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBkaWFsb2c6IG5ldyBVSS5EaWFsb2coKSxcclxuICAgICAgc2F2ZUNyZWRlbnRpYWxzOiBmYWxzZSxcclxuICAgICAgdXNlck5hbWU6IG51bGwsXHJcbiAgICAgIHBhc3N3b3JkOiBudWxsLFxyXG4gICAgICBqb2xva2lhVXJsOiBudWxsLFxyXG4gICAgICBjb250YWluZXJOYW1lOiBudWxsLFxyXG4gICAgICB2aWV3OiBudWxsXHJcbiAgICB9O1xyXG4gIH1dKTtcclxuXHJcbiAgX21vZHVsZS5maWx0ZXIoJ2t1YmVybmV0ZXNQYWdlTGluaycsICgpID0+IGVudGl0eVBhZ2VMaW5rKTtcclxuXHJcbiAgX21vZHVsZS5maWx0ZXIoJ3JlbGF0aXZlVGltZScsICgpID0+IHtcclxuICAgIHJldHVybiAoZGF0ZSkgPT4ge1xyXG4gICAgICByZXR1cm4gaHVtYW5kYXRlLnJlbGF0aXZlVGltZShkYXRlKTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgX21vZHVsZS5ydW4oWyd2aWV3UmVnaXN0cnknLCAnU2VydmljZVJlZ2lzdHJ5JywgJ0hhd3Rpb05hdicsICdLdWJlcm5ldGVzTW9kZWwnLCAnJHRlbXBsYXRlQ2FjaGUnLCAodmlld1JlZ2lzdHJ5LCBTZXJ2aWNlUmVnaXN0cnksIEhhd3Rpb05hdiwgS3ViZXJuZXRlc01vZGVsLCAkdGVtcGxhdGVDYWNoZSkgPT4ge1xyXG4gICAgbG9nLmRlYnVnKFwiUnVubmluZ1wiKTtcclxuICAgIHZpZXdSZWdpc3RyeVsna3ViZXJuZXRlcyddID0gdGVtcGxhdGVQYXRoICsgJ2xheW91dEt1YmVybmV0ZXMuaHRtbCc7XHJcbiAgICAvL3ZpZXdSZWdpc3RyeVsna3ViZXJuZXRlcyddID0gQ29uZmlncy50ZW1wbGF0ZVBhdGggKyAnc2hhcmVMYXlvdXQuaHRtbCc7XHJcblxyXG4gICAgdmFyIGJ1aWxkZXIgPSBIYXd0aW9OYXYuYnVpbGRlcigpO1xyXG4gICAgdmFyIGFwcHMgPSBidWlsZGVyLmlkKCdrdWJlLWFwcHMnKVxyXG4gICAgICAuaHJlZigoKSA9PiBVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ2FwcHMnKSlcclxuICAgICAgLnRpdGxlKCgpID0+ICdBcHBzJylcclxuICAgICAgLmJ1aWxkKCk7XHJcblxyXG4gICAgdmFyIHNlcnZpY2VzID0gYnVpbGRlci5pZCgna3ViZS1zZXJ2aWNlcycpXHJcbiAgICAgIC5ocmVmKCgpID0+IFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnc2VydmljZXMnKSlcclxuICAgICAgLnRpdGxlKCgpID0+ICdTZXJ2aWNlcycpXHJcbiAgICAgIC5idWlsZCgpO1xyXG5cclxuICAgIHZhciBjb250cm9sbGVycyA9IGJ1aWxkZXIuaWQoJ2t1YmUtY29udHJvbGxlcnMnKVxyXG4gICAgICAuaHJlZigoKSA9PiBVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ3JlcGxpY2F0aW9uQ29udHJvbGxlcnMnKSlcclxuICAgICAgLnRpdGxlKCgpID0+ICdvcmFjbGXmnI3liqEnKVxyXG4gICAgICAuYnVpbGQoKTtcclxuXHJcbiAgICB2YXIgcG9kcyA9IGJ1aWxkZXIuaWQoJ2t1YmUtcG9kcycpXHJcbiAgICAgIC5ocmVmKCgpID0+IFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAncG9kcycpKVxyXG4gICAgICAudGl0bGUoKCkgPT4gJ+a1i+ivlemhtemdoicpXHJcbiAgICAgIC5idWlsZCgpO1xyXG5cclxuICAgIHZhciBldmVudHMgPSBidWlsZGVyLmlkKCdrdWJlLWV2ZW50cycpXHJcbiAgICAgIC5ocmVmKCgpID0+IFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnZXZlbnRzJykpXHJcbiAgICAgIC50aXRsZSgoKSA9PiAn5pyN5Yqh5ZCv5Yqo5pel5b+XJylcclxuICAgICAgLmJ1aWxkKCk7XHJcblxyXG4gICAgdmFyIGhvc3RzID0gYnVpbGRlci5pZCgna3ViZS1ob3N0cycpXHJcbiAgICAgIC5ocmVmKCgpID0+IFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnaG9zdHMnKSlcclxuICAgICAgLnRpdGxlKCgpID0+ICfpm4bnvqToioLngrknKVxyXG4gICAgICAuYnVpbGQoKTtcclxuXHJcbiAgICB2YXIgb3ZlcnZpZXcgPSBidWlsZGVyLmlkKCdrdWJlLW92ZXJ2aWV3JylcclxuICAgICAgLmhyZWYoKCkgPT4gVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdvdmVydmlldycpKVxyXG4gICAgICAudGl0bGUoKCkgPT4gJ0RpYWdyYW0nKVxyXG4gICAgICAuYnVpbGQoKTtcclxuXHJcbiAgICB2YXIgYnVpbGRzID0gYnVpbGRlci5pZCgna3ViZS1idWlsZHMnKVxyXG4gICAgICAuaHJlZigoKSA9PiBVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ2J1aWxkcycpKVxyXG4gICAgICAudGl0bGUoKCkgPT4gJ0J1aWxkcycpXHJcbiAgICAgIC5idWlsZCgpO1xyXG5cclxuICAgIHZhciBidWlsZENvbmZpZ3MgPSBidWlsZGVyLmlkKCdrdWJlLWJ1aWxkQ29uZmlncycpXHJcbiAgICAgIC5ocmVmKCgpID0+IFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnYnVpbGRDb25maWdzJykpXHJcbiAgICAgIC50aXRsZSgoKSA9PiAnQnVpbGQgQ29uZmlncycpXHJcbiAgICAgIC5idWlsZCgpO1xyXG5cclxuICAgIHZhciBkZXBsb3lzID0gYnVpbGRlci5pZCgna3ViZS1kZXBsb3lzJylcclxuICAgICAgLmhyZWYoKCkgPT4gVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdkZXBsb3ltZW50Q29uZmlncycpKVxyXG4gICAgICAudGl0bGUoKCkgPT4gJ0RlcGxveXMnKVxyXG4gICAgICAuYnVpbGQoKTtcclxuXHJcbiAgICB2YXIgaW1hZ2VSZXBvc2l0b3JpZXMgPSBidWlsZGVyLmlkKCdrdWJlLWltYWdlUmVwb3NpdG9yaWVzJylcclxuICAgICAgLmhyZWYoKCkgPT4gVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdpbWFnZVJlcG9zaXRvcmllcycpKVxyXG4gICAgICAudGl0bGUoKCkgPT4gJ1JlZ2lzdHJpZXMnKVxyXG4gICAgICAuYnVpbGQoKTtcclxuXHJcbiAgICB2YXIgcGlwZWxpbmVzID0gYnVpbGRlci5pZCgna3ViZS1waXBlbGluZXMnKVxyXG4gICAgICAuaHJlZigoKSA9PiBVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ3BpcGVsaW5lcycpKVxyXG4gICAgICAudGl0bGUoKCkgPT4gJ1BpcGVsaW5lcycpXHJcbiAgICAgIC5idWlsZCgpO1xyXG5cclxuICAgIHZhciByZXBvcyA9IGJ1aWxkZXIuaWQoJ2t1YmUtcmVwb3MnKVxyXG4gICAgICAuaHJlZigoKSA9PiBcIi9mb3JnZS9yZXBvc1wiKVxyXG4gICAgICAuaXNWYWxpZCgoKSA9PiBTZXJ2aWNlUmVnaXN0cnkuaGFzU2VydmljZShmYWJyaWM4Rm9yZ2VTZXJ2aWNlTmFtZSkgJiYgU2VydmljZVJlZ2lzdHJ5Lmhhc1NlcnZpY2UoZ29nc1NlcnZpY2VOYW1lKSlcclxuICAgICAgLnRpdGxlKCgpID0+ICdSZXBvc2l0b3JpZXMnKVxyXG4gICAgICAuYnVpbGQoKTtcclxuXHJcbiAgICB2YXIgbWFpblRhYiA9IGJ1aWxkZXIuaWQoJ2t1YmVybmV0ZXMnKVxyXG4gICAgICAucmFuaygxMDApXHJcbiAgICAgIC5kZWZhdWx0UGFnZSh7XHJcbiAgICAgICAgcmFuazogMjAsXHJcbiAgICAgICAgaXNWYWxpZDogKHllcywgbm8pID0+IHtcclxuICAgICAgICAgIHllcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmhyZWYoKCkgPT4gVXJsSGVscGVycy5qb2luKGNvbnRleHQsIFwiL25hbWVzcGFjZS9kZWZhdWx0L3JlcGxpY2F0aW9uQ29udHJvbGxlcnNcIikpXHJcbiAgICAgIC50aXRsZSgoKSA9PiAn5pyN5Yqh6ZuG576kJylcclxuICAgICAgLnRhYnMoY29udHJvbGxlcnMsIHBvZHMsIGV2ZW50cylcclxuICAgICAgLmJ1aWxkKCk7XHJcbiAgICBIYXd0aW9OYXYuYWRkKG1haW5UYWIpO1xyXG5cclxuICAgIC8qIHRlc3RLdWJlcm5ldGVzTW9kZWxcclxuICAgIEhhd3Rpb05hdi5hZGQoe1xyXG4gICAgICBpZDogJ2s4c0FwcFN3aXRjaGVyJyxcclxuICAgICAgdGl0bGU6ICgpID0+ICcnLCAvLyBub3QgdXNlZCBhcyAndGVtcGxhdGUnIGJlbG93IG92ZXJyaWRlcyB0aGlzXHJcbiAgICAgIGlzVmFsaWQ6ICgpID0+IEt1YmVybmV0ZXNNb2RlbC5zZXJ2aWNlQXBwcy5sZW5ndGggPiAwLFxyXG4gICAgICBjb250ZXh0OiB0cnVlLFxyXG4gICAgICB0ZW1wbGF0ZTogKCkgPT4gJHRlbXBsYXRlQ2FjaGUuZ2V0KFVybEhlbHBlcnMuam9pbih0ZW1wbGF0ZVBhdGgsICdzZXJ2aWNlQXBwcy5odG1sJykpXHJcbiAgICB9KTtcclxuICAgICovXHJcblxyXG4gICAgdmFyIHByb2plY3RzVGFiID0gYnVpbGRlci5pZCgnb3BlbnNoaWZ0JylcclxuICAgICAgLnJhbmsoMTAwKVxyXG4gICAgICAuaHJlZigoKSA9PiBVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ2J1aWxkQ29uZmlncycpICsgJz9zdWItdGFiPWt1YmUtYnVpbGRDb25maWdzJylcclxuICAgICAgLnRpdGxlKCgpID0+ICdQcm9qZWN0cycpXHJcbiAgICAgIC8vIGxldHMgZGlzYWJsZSB0aGUgcGlwZWxpbmVzIHZpZXcgZm9yIG5vd1xyXG4gICAgICAvLyBwaXBlbGluZXMsXHJcbiAgICAgIC50YWJzKHJlcG9zLCBidWlsZENvbmZpZ3MsIGJ1aWxkcywgZGVwbG95cywgaW1hZ2VSZXBvc2l0b3JpZXMpXHJcbiAgICAgIC5idWlsZCgpO1xyXG5cclxuICAgIC8vSGF3dGlvTmF2LmFkZChwcm9qZWN0c1RhYik7XHJcbiAgfV0pO1xyXG5cclxuICBoYXd0aW9QbHVnaW5Mb2FkZXIucmVnaXN0ZXJQcmVCb290c3RyYXBUYXNrKHtcclxuICAgIG5hbWU6ICdLdWJlcm5ldGVzSW5pdCcsXHJcbiAgICB0YXNrOiAobmV4dCkgPT4ge1xyXG4gICAgICAkLmdldFNjcmlwdCgnb3Njb25zb2xlL2NvbmZpZy5qcycpXHJcbiAgICAgICAgLmRvbmUoKHNjcmlwdCwgdGV4dFN0YXR1cykgPT4ge1xyXG4gICAgICAgICAgdmFyIGNvbmZpZzpLdWJlcm5ldGVzQ29uZmlnID0gS3ViZXJuZXRlcy5vc0NvbmZpZyA9IHdpbmRvd1snT1BFTlNISUZUX0NPTkZJRyddO1xyXG4gICAgICAgICAgbG9nLmRlYnVnKFwiRmV0Y2hlZCBPQXV0aCBjb25maWc6IFwiLCBjb25maWcpO1xyXG4gICAgICAgICAgdmFyIG1hc3RlcjpzdHJpbmcgPSBjb25maWcubWFzdGVyX3VyaTtcclxuICAgICAgICAgIGlmICghbWFzdGVyICYmIGNvbmZpZy5hcGkgJiYgY29uZmlnLmFwaS5rOHMpIHtcclxuICAgICAgICAgICAgdmFyIG1hc3RlclVyaSA9IG5ldyBVUkkoKS5ob3N0KGNvbmZpZy5hcGkuazhzLmhvc3RQb3J0KS5wYXRoKFwiXCIpLnF1ZXJ5KFwiXCIpO1xyXG4gICAgICAgICAgICBpZiAoY29uZmlnLmFwaS5rOHMucHJvdG8pIHtcclxuICAgICAgICAgICAgICBtYXN0ZXJVcmkucHJvdG9jb2woY29uZmlnLmFwaS5rOHMucHJvdG8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1hc3RlciA9IG1hc3RlclVyaS50b1N0cmluZygpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIE9TT0F1dGhDb25maWcgPSBjb25maWcub3BlbnNoaWZ0O1xyXG4gICAgICAgICAgR29vZ2xlT0F1dGhDb25maWcgPSBjb25maWcuZ29vZ2xlO1xyXG4gICAgICAgICAgS2V5Y2xvYWtDb25maWcgPSBjb25maWcua2V5Y2xvYWs7XHJcblxyXG4gICAgICAgICAgaWYgKE9TT0F1dGhDb25maWcgJiYgIW1hc3Rlcikge1xyXG4gICAgICAgICAgICAvLyBUT0RPIGF1dGgubWFzdGVyX3VyaSBubyBsb25nZXIgdXNlZCByaWdodD9cclxuICAgICAgICAgICAgLy8gbWFzdGVyID0gT1NPQXV0aENvbmZpZy5tYXN0ZXJfdXJpO1xyXG4gICAgICAgICAgICBpZiAoIW1hc3Rlcikge1xyXG4gICAgICAgICAgICAgIHZhciBvYXV0aF9hdXRob3JpemVfdXJpID0gT1NPQXV0aENvbmZpZy5vYXV0aF9hdXRob3JpemVfdXJpO1xyXG4gICAgICAgICAgICAgIGlmIChvYXV0aF9hdXRob3JpemVfdXJpKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IG9hdXRoX2F1dGhvcml6ZV91cmk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaWR4ID0gdGV4dC5pbmRleE9mKFwiOi8vXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlkeCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgaWR4ICs9IDM7XHJcbiAgICAgICAgICAgICAgICAgIGlkeCA9IHRleHQuaW5kZXhPZihcIi9cIiwgaWR4KTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXN0ZXIgPSB0ZXh0LnN1YnN0cmluZygwLCArK2lkeCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICgoIUt1YmVybmV0ZXMubWFzdGVyVXJsIHx8IEt1YmVybmV0ZXMubWFzdGVyVXJsID09PSBcIi9cIikgJiYgKCFtYXN0ZXIgfHwgbWFzdGVyID09PSBcIi9cIikpIHtcclxuICAgICAgICAgICAgLy8gbGV0cyBkZWZhdWx0IHRoZSBtYXN0ZXIgdG8gdGhlIGN1cnJlbnQgcHJvdG9jb2wgYW5kIGhvc3QvcG9ydFxyXG4gICAgICAgICAgICAvLyBpbiBjYXNlIHRoZSBtYXN0ZXIgdXJsIGlzIFwiL1wiIGFuZCB3ZSBhcmVcclxuICAgICAgICAgICAgLy8gc2VydmluZyB1cCBzdGF0aWMgY29udGVudCBmcm9tIGluc2lkZSAvYXBpL3YxL25hbWVzcGFjZXMvZGVmYXVsdC9zZXJ2aWNlcy9mYWJyaWM4IG9yIHNvbWV0aGluZyBsaWtlIHRoYXRcclxuICAgICAgICAgICAgdmFyIGhyZWYgPSBsb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICBpZiAoaHJlZikge1xyXG4gICAgICAgICAgICAgIG1hc3RlciA9IG5ldyBVUkkoaHJlZikucXVlcnkoXCJcIikucGF0aChcIlwiKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobWFzdGVyKSB7XHJcbiAgICAgICAgICAgIEt1YmVybmV0ZXMubWFzdGVyVXJsID0gbWFzdGVyO1xyXG4gICAgICAgICAgICBuZXh0KCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5mYWlsKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgbG9nLmRlYnVnKFwiRXJyb3IgZmV0Y2hpbmcgT0FVVEggY29uZmlnOiBcIiwgcmVzcG9uc2UpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmFsd2F5cygoKSA9PiB7XHJcbiAgICAgICAgICBuZXh0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSwgdHJ1ZSk7XHJcblxyXG4gIGhhd3Rpb1BsdWdpbkxvYWRlci5hZGRNb2R1bGUoJ25nUmVzb3VyY2UnKTtcclxuICBoYXd0aW9QbHVnaW5Mb2FkZXIuYWRkTW9kdWxlKHBsdWdpbk5hbWUpO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG5cclxubW9kdWxlIEt1YmVybmV0ZXMge1xyXG4gIHZhciBsb2cgPSBMb2dnZXIuZ2V0KCdrdWJlcm5ldGVzLXdhdGNoZXInKTtcclxuXHJcbiAgdmFyIGs4c1R5cGVzID0gS3ViZXJuZXRlc0FQSS5OYW1lc3BhY2VkVHlwZXMuazhzVHlwZXM7XHJcbiAgdmFyIG9zVHlwZXMgID0gS3ViZXJuZXRlc0FQSS5OYW1lc3BhY2VkVHlwZXMub3NUeXBlcztcclxuXHJcbiAgdmFyIHNlbGYgPSA8YW55PiB7fTtcclxuXHJcbiAgdmFyIHVwZGF0ZUZ1bmN0aW9uID0gKCkgPT4ge1xyXG4gICAgXHJcbiAgICBsb2cuZGVidWcoXCJPYmplY3RzIGNoYW5nZWQsIGZpcmluZyBsaXN0ZW5lcnNcIik7XHJcbiAgICB2YXIgb2JqZWN0cyA9IDxPYmplY3RNYXA+e307XHJcbiAgICBfLmZvckVhY2goc2VsZi5nZXRUeXBlcygpLCAodHlwZTpzdHJpbmcpID0+IHtcclxuICAgICAgb2JqZWN0c1t0eXBlXSA9IHNlbGYuZ2V0T2JqZWN0cyh0eXBlKTtcclxuICAgIH0pO1xyXG4gICAgXy5mb3JFYWNoKHNlbGYubGlzdGVuZXJzLCAobGlzdGVuZXI6KE9iamVjdE1hcCkgPT4gdm9pZCkgPT4ge1xyXG4gICAgICBsaXN0ZW5lcihvYmplY3RzKTtcclxuICAgIH0pOyAgXHJcbiAgfTtcclxuICB2YXIgZGVib3VuY2VkVXBkYXRlID0gXy5kZWJvdW5jZSh1cGRhdGVGdW5jdGlvbiwgNzUsIHsgdHJhaWxpbmc6IHRydWUgfSk7XHJcblxyXG4gIHZhciBuYW1lc3BhY2VXYXRjaCA9IHtcclxuICAgIHNlbGVjdGVkOiB1bmRlZmluZWQsXHJcbiAgICB3YXRjaDogdW5kZWZpbmVkLFxyXG4gICAgb2JqZWN0czogW10sXHJcbiAgICBvYmplY3RNYXA6IHt9LFxyXG4gICAgd2F0Y2hlczoge31cclxuICB9O1xyXG5cclxuICBoYXd0aW9QbHVnaW5Mb2FkZXIucmVnaXN0ZXJQcmVCb290c3RyYXBUYXNrKHtcclxuICAgIG5hbWU6ICdLdWJlcm5ldGVzV2F0Y2hlckluaXQnLFxyXG4gICAgZGVwZW5kczogWydLdWJlcm5ldGVzQXBpRGlzY292ZXJ5J10sXHJcbiAgICB0YXNrOiAobmV4dCkgPT4ge1xyXG4gICAgICB2YXIgYm9vdGVkID0gZmFsc2U7XHJcbiAgICAgIGlmIChpc09wZW5TaGlmdCkge1xyXG4gICAgICAgIGxvZy5pbmZvKFwiQmFja2VuZCBpcyBhbiBPcGVuc2hpZnQgaW5zdGFuY2VcIik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbG9nLmluZm8oXCJCYWNrZW5kIGlzIGEgdmFuaWxsYSBLdWJlcm5ldGVzIGluc3RhbmNlXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIG5hbWVzcGFjZVdhdGNoLndhdGNoID0gS3ViZXJuZXRlc0FQSS53YXRjaCh7XHJcbiAgICAgICAga2luZDogS3ViZXJuZXRlc0FQSS5XYXRjaFR5cGVzLk5BTUVTUEFDRVMsXHJcbiAgICAgICAgc3VjY2VzczogKG9iamVjdHMpID0+IHtcclxuICAgICAgICAgIG5hbWVzcGFjZVdhdGNoLm9iamVjdHMgPSBvYmplY3RzO1xyXG4gICAgICAgICAgaWYgKCFib290ZWQpIHtcclxuICAgICAgICAgICAgYm9vdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgc2VsZi5zZXROYW1lc3BhY2UobG9jYWxTdG9yYWdlW0NvbnN0YW50cy5OQU1FU1BBQ0VfU1RPUkFHRV9LRVldIHx8IGRlZmF1bHROYW1lc3BhY2UpO1xyXG4gICAgICAgICAgICBuZXh0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsb2cuZGVidWcoXCJHb3QgbmFtZXNwYWNlczogXCIsIG5hbWVzcGFjZVdhdGNoLm9iamVjdHMpO1xyXG4gICAgICAgIH0sIGVycm9yOiAoZXJyb3I6YW55KSA9PiB7XHJcbiAgICAgICAgICBsb2cud2FybihcIkVycm9yIGZldGNoaW5nIG5hbWVzcGFjZXM6IFwiLCBlcnJvcik7XHJcbiAgICAgICAgICAvLyBUT0RPIGlzIHRoaXMgbmVjZXNzYXJ5P1xyXG4gICAgICAgICAgLy9IYXd0aW9PQXV0aC5kb0xvZ291dCgpO1xyXG4gICAgICAgICAgaWYgKCFib290ZWQpIHtcclxuICAgICAgICAgICAgYm9vdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgbmV4dCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGhhd3Rpb1BsdWdpbkxvYWRlci5yZWdpc3RlclByZUJvb3RzdHJhcFRhc2soe1xyXG4gICAgbmFtZTogJ0t1YmVybmV0ZXNBcGlEaXNjb3ZlcnknLFxyXG4gICAgZGVwZW5kczogWydoYXd0aW8tb2F1dGgnXSxcclxuICAgIHRhc2s6IChuZXh0KSA9PiB7XHJcbiAgICAgIGlzT3BlblNoaWZ0ID0gZmFsc2U7XHJcblxyXG4gICAgICB2YXIgdXNlclByb2ZpbGUgPSBIYXd0aW9PQXV0aC5nZXRVc2VyUHJvZmlsZSgpO1xyXG4gICAgICBsb2cuZGVidWcoXCJVc2VyIHByb2ZpbGU6IFwiLCB1c2VyUHJvZmlsZSk7XHJcbiAgICAgIGlmICh1c2VyUHJvZmlsZSAmJiB1c2VyUHJvZmlsZS5wcm92aWRlciA9PT0gXCJoYXd0aW8tZ29vZ2xlLW9hdXRoXCIpIHtcclxuICAgICAgICBsb2cuZGVidWcoXCJQb3NzaWJseSBydW5uaW5nIG9uIEdDRVwiKTtcclxuICAgICAgICAvLyBhcGkgbWFzdGVyIGlzIG9uIEdDRVxyXG4gICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICB1cmw6IFVybEhlbHBlcnMuam9pbihtYXN0ZXJBcGlVcmwoKSwgJ2FwaScsICd2MScsICduYW1lc3BhY2VzJyksXHJcbiAgICAgICAgICBjb21wbGV0ZTogKGpxWEhSLCB0ZXh0U3RhdHVzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0ZXh0U3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcImpxWEhSOiBcIiwganFYSFIpO1xyXG4gICAgICAgICAgICAgIHVzZXJQcm9maWxlLm9sZFRva2VuID0gdXNlclByb2ZpbGUudG9rZW47XHJcbiAgICAgICAgICAgICAgdXNlclByb2ZpbGUudG9rZW4gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgJC5hamF4U2V0dXAoe1xyXG4gICAgICAgICAgICAgICAgYmVmb3JlU2VuZDogKHJlcXVlc3QpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV4dCgpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGJlZm9yZVNlbmQ6IChyZXF1ZXN0KSA9PiB7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhcIk5vdCBydW5uaW5nIG9uIEdDRVwiKTtcclxuICAgICAgICAvLyBkb3VibGUtY2hlY2sgaWYgd2UncmUgb24gdmFuaWxsYSBrOHMgb3Igb3BlbnNoaWZ0XHJcbiAgICAgICAgdmFyIHJvb3RVcmkgPSBuZXcgVVJJKG1hc3RlckFwaVVybCgpKS5wYXRoKFwiL29hcGlcIikucXVlcnkoXCJcIikudG9TdHJpbmcoKTtcclxuICAgICAgICBsb2cuZGVidWcoXCJDaGVja2luZyBmb3IgYW4gb3BlbnNoaWZ0IGJhY2tlbmRcIik7XHJcbiAgICAgICAgSGF3dGlvT0F1dGguYXV0aGVudGljYXRlZEh0dHBSZXF1ZXN0KHtcclxuICAgICAgICAgIHVybDogcm9vdFVyaSxcclxuICAgICAgICAgIHN1Y2Nlc3M6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgaXNPcGVuU2hpZnQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5leHQoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgPT4ge1xyXG4gICAgICAgICAgICB2YXIgZXJyb3IgPSBLdWJlcm5ldGVzQVBJLmdldEVycm9yT2JqZWN0KGpxWEhSKTtcclxuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xyXG4gICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcIkZhaWxlZCB0byBmaW5kIHJvb3QgcGF0aHM6IFwiLCB0ZXh0U3RhdHVzLCBcIjogXCIsIGVycm9yVGhyb3duKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBsb2cuZGVidWcoXCJGYWlsZWQgdG8gZmluZCByb290IHBhdGhzOiBcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlzT3BlblNoaWZ0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIG5leHQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICB2YXIgY3VzdG9tVXJsSGFuZGxlcnMgPSB7fTtcclxuXHJcbiAgc2VsZi5zZXROYW1lc3BhY2UgPSAobmFtZXNwYWNlOiBzdHJpbmcpID0+IHtcclxuICAgIGlmIChuYW1lc3BhY2UgPT09IG5hbWVzcGFjZVdhdGNoLnNlbGVjdGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChuYW1lc3BhY2VXYXRjaC5zZWxlY3RlZCkge1xyXG4gICAgICBsb2cuZGVidWcoXCJTdG9wcGluZyBjdXJyZW50IHdhdGNoZXNcIik7XHJcbiAgICAgIF8uZm9yT3duKG5hbWVzcGFjZVdhdGNoLndhdGNoZXMsICh3YXRjaCwga2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKCFLdWJlcm5ldGVzQVBJLm5hbWVzcGFjZWQoa2V5KSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsb2cuZGVidWcoXCJEaXNjb25uZWN0aW5nIHdhdGNoOiBcIiwga2V5KTtcclxuICAgICAgICB3YXRjaC5kaXNjb25uZWN0KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBfLmZvckVhY2goXy5rZXlzKG5hbWVzcGFjZVdhdGNoLndhdGNoZXMpLCAoa2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKCFLdWJlcm5ldGVzQVBJLm5hbWVzcGFjZWQoa2V5KSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsb2cuZGVidWcoXCJEZWxldGluZyBraW5kOiBcIiwga2V5KTtcclxuICAgICAgICBkZWxldGUgbmFtZXNwYWNlV2F0Y2gud2F0Y2hlc1trZXldO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIG5hbWVzcGFjZVdhdGNoLnNlbGVjdGVkID0gbmFtZXNwYWNlO1xyXG4gICAgaWYgKG5hbWVzcGFjZSkge1xyXG4gICAgICBfLmZvckVhY2goc2VsZi5nZXRUeXBlcygpLCAoa2luZDpzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoa2luZCA9PT0gS3ViZXJuZXRlc0FQSS5XYXRjaFR5cGVzLk5BTUVTUEFDRVMpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFuYW1lc3BhY2VXYXRjaC53YXRjaGVzW2tpbmRdKSB7XHJcbiAgICAgICAgICBsb2cuZGVidWcoXCJDcmVhdGluZyB3YXRjaCBmb3Iga2luZDogXCIsIGtpbmQpO1xyXG4gICAgICAgICAgdmFyIGNvbmZpZyA9IDxhbnk+IHtcclxuICAgICAgICAgICAga2luZDoga2luZCxcclxuICAgICAgICAgICAgbmFtZXNwYWNlOiBLdWJlcm5ldGVzQVBJLm5hbWVzcGFjZWQoa2luZCkgPyBuYW1lc3BhY2UgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IChvYmplY3RzKSA9PiB7XHJcbiAgICAgICAgICAgICAgd2F0Y2gub2JqZWN0cyA9IG9iamVjdHM7XHJcbiAgICAgICAgICAgICAgZGVib3VuY2VkVXBkYXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBpZiAoa2luZCBpbiBjdXN0b21VcmxIYW5kbGVycykge1xyXG4gICAgICAgICAgICBjb25maWcudXJsRnVuY3Rpb24gPSBjdXN0b21VcmxIYW5kbGVyc1traW5kXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhciB3YXRjaCA9IDxhbnk+IEt1YmVybmV0ZXNBUEkud2F0Y2goY29uZmlnKTtcclxuICAgICAgICAgIHdhdGNoLmNvbmZpZyA9IGNvbmZpZztcclxuICAgICAgICAgIG5hbWVzcGFjZVdhdGNoLndhdGNoZXNba2luZF0gPSB3YXRjaDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHNlbGYuaGFzV2ViU29ja2V0ID0gdHJ1ZTtcclxuXHJcbiAgc2VsZi5nZXROYW1lc3BhY2UgPSAoKSA9PiBuYW1lc3BhY2VXYXRjaC5zZWxlY3RlZDtcclxuXHJcbiAgc2VsZi5yZWdpc3RlckN1c3RvbVVybEZ1bmN0aW9uID0gKGtpbmQ6c3RyaW5nLCB1cmw6KG9wdGlvbnM6S3ViZXJuZXRlc0FQSS5LOFNPcHRpb25zKSA9PiBzdHJpbmcpID0+IHtcclxuICAgIGN1c3RvbVVybEhhbmRsZXJzW2tpbmRdID0gdXJsO1xyXG4gICAgaWYgKGtpbmQgaW4gbmFtZXNwYWNlV2F0Y2gud2F0Y2hlcykge1xyXG4gICAgICB2YXIgd2F0Y2ggPSBuYW1lc3BhY2VXYXRjaC53YXRjaGVzW2tpbmRdO1xyXG4gICAgICB2YXIgY29uZmlnID0gd2F0Y2guY29uZmlnO1xyXG4gICAgICBjb25maWcudXJsRnVuY3Rpb24gPSB1cmw7XHJcbiAgICAgIHdhdGNoLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgZGVsZXRlIG5hbWVzcGFjZVdhdGNoLndhdGNoZXNba2luZF07XHJcbiAgICAgIGNvbmZpZy5zdWNjZXNzID0gKG9iamVjdHMpID0+IHtcclxuICAgICAgICB3YXRjaC5vYmplY3RzID0gb2JqZWN0cztcclxuICAgICAgICBkZWJvdW5jZWRVcGRhdGUoKTtcclxuICAgICAgfVxyXG4gICAgICB3YXRjaCA9IDxhbnk+IEt1YmVybmV0ZXNBUEkud2F0Y2goY29uZmlnKTtcclxuICAgICAgd2F0Y2guY29uZmlnID0gY29uZmlnO1xyXG4gICAgICBuYW1lc3BhY2VXYXRjaC53YXRjaGVzW2tpbmRdID0gd2F0Y2g7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxmLmdldFR5cGVzID0gKCkgPT4ge1xyXG4gICAgdmFyIGZpbHRlciA9IChraW5kOnN0cmluZykgPT4ge1xyXG4gICAgICAvLyBmaWx0ZXIgb3V0IHN0dWZmIHdlIGRvbid0IGNhcmUgYWJvdXQgeWV0XHJcbiAgICAgIHN3aXRjaChraW5kKSB7XHJcbiAgICAgICAgY2FzZSBLdWJlcm5ldGVzQVBJLldhdGNoVHlwZXMuT0FVVEhfQ0xJRU5UUzpcclxuICAgICAgICBjYXNlIEt1YmVybmV0ZXNBUEkuV2F0Y2hUeXBlcy5JTUFHRV9TVFJFQU1TOlxyXG4gICAgICAgIGNhc2UgS3ViZXJuZXRlc0FQSS5XYXRjaFR5cGVzLlBPTElDSUVTOlxyXG4gICAgICAgIGNhc2UgS3ViZXJuZXRlc0FQSS5XYXRjaFR5cGVzLlJPTEVTOlxyXG4gICAgICAgIGNhc2UgS3ViZXJuZXRlc0FQSS5XYXRjaFR5cGVzLlJPTEVfQklORElOR1M6XHJcbiAgICAgICAgY2FzZSBLdWJlcm5ldGVzQVBJLldhdGNoVHlwZXMuUE9MSUNZX0JJTkRJTkdTOlxyXG4gICAgICAgIGNhc2UgS3ViZXJuZXRlc0FQSS5XYXRjaFR5cGVzLlBFUlNJU1RFTlRfVk9MVU1FX0NMQUlNUzpcclxuICAgICAgICBjYXNlIEt1YmVybmV0ZXNBUEkuV2F0Y2hUeXBlcy5QRVJTSVNURU5UX1ZPTFVNRVM6XHJcbiAgICAgICAgY2FzZSBLdWJlcm5ldGVzQVBJLldhdGNoVHlwZXMuRU5EUE9JTlRTOlxyXG4gICAgICAgIGNhc2UgS3ViZXJuZXRlc0FQSS5XYXRjaFR5cGVzLlJFU09VUkNFX1FVT1RBUzpcclxuICAgICAgICBjYXNlIEt1YmVybmV0ZXNBUEkuV2F0Y2hUeXBlcy5TRVJWSUNFX0FDQ09VTlRTOlxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHZhciBhbnN3ZXIgPSBrOHNUeXBlcy5jb25jYXQoW1dhdGNoVHlwZXMuTkFNRVNQQUNFU10pO1xyXG4gICAgaWYgKGlzT3BlblNoaWZ0KSB7XHJcbiAgICAgIGFuc3dlciA9IGFuc3dlci5jb25jYXQob3NUeXBlcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhbnN3ZXIgPSBhbnN3ZXIuY29uY2F0KEt1YmVybmV0ZXNBUEkuV2F0Y2hUeXBlcy5URU1QTEFURVMpO1xyXG4gICAgICBhbnN3ZXIgPSBhbnN3ZXIuY29uY2F0KEt1YmVybmV0ZXNBUEkuV2F0Y2hUeXBlcy5CVUlMRF9DT05GSUdTKTtcclxuICAgIH1cclxuICAgIHJldHVybiBfLmZpbHRlcihhbnN3ZXIsIGZpbHRlcik7XHJcbiAgfVxyXG5cclxuICBzZWxmLmdldE9iamVjdHMgPSAoa2luZDogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAoa2luZCA9PT0gV2F0Y2hUeXBlcy5OQU1FU1BBQ0VTKSB7XHJcbiAgICAgIHJldHVybiBuYW1lc3BhY2VXYXRjaC5vYmplY3RzO1xyXG4gICAgfVxyXG4gICAgaWYgKGtpbmQgaW4gbmFtZXNwYWNlV2F0Y2gud2F0Y2hlcykge1xyXG4gICAgICByZXR1cm4gbmFtZXNwYWNlV2F0Y2gud2F0Y2hlc1traW5kXS5vYmplY3RzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbGYubGlzdGVuZXJzID0gPEFycmF5PChPYmplY3RNYXApID0+IHZvaWQ+PiBbXTtcclxuXHJcbiAgLy8gbGlzdGVuZXIgZ2V0cyBub3RpZmllZCBhZnRlciBhIGJ1bmNoIG9mIGNoYW5nZXMgaGF2ZSBvY2N1cnJlZFxyXG4gIHNlbGYucmVnaXN0ZXJMaXN0ZW5lciA9IChmbjoob2JqZWN0czpPYmplY3RNYXApID0+IHZvaWQpID0+IHtcclxuICAgIHNlbGYubGlzdGVuZXJzLnB1c2goZm4pO1xyXG4gIH1cclxuXHJcbiAgdmFyIHByb2plY3RzSGFuZGxlID0gPGFueT4gdW5kZWZpbmVkO1xyXG5cclxuICAvLyBraWNrIG9mZiB0aGUgcHJvamVjdCB3YXRjaGVyIGEgYml0IHNvb25lciBhbHNvXHJcbiAgaGF3dGlvUGx1Z2luTG9hZGVyLnJlZ2lzdGVyUHJlQm9vdHN0cmFwVGFzayh7XHJcbiAgICBuYW1lOiAnUHJvamVjdHNXYXRjaGVyJyxcclxuICAgIGRlcGVuZHM6IFsnS3ViZXJuZXRlc0FwaURpc2NvdmVyeSddLFxyXG4gICAgdGFzazogKG5leHQpID0+IHtcclxuICAgICAgaWYgKGlzT3BlblNoaWZ0KSB7XHJcblxyXG4gICAgICAgIHByb2plY3RzSGFuZGxlID0gS3ViZXJuZXRlc0FQSS53YXRjaCh7XHJcbiAgICAgICAgICBraW5kOiBLdWJlcm5ldGVzQVBJLldhdGNoVHlwZXMuUFJPSkVDVFMsXHJcbiAgICAgICAgICBuYW1lc3BhY2U6IHVuZGVmaW5lZCxcclxuICAgICAgICAgIHN1Y2Nlc3M6IChvYmplY3RzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLmxpc3RlbmVycyAmJiBzZWxmLmxpc3RlbmVycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICBsb2cuZGVidWcoXCJnb3QgcHJvamVjdHM6IFwiLCBvYmplY3RzKTtcclxuICAgICAgICAgICAgICBfLmZvckVhY2goc2VsZi5saXN0ZW5lcnMsIChsaXN0ZW5lcjoob2JqZWN0czpPYmplY3RNYXApID0+IHZvaWQpID0+IHtcclxuICAgICAgICAgICAgICAgIGxpc3RlbmVyKHtcclxuICAgICAgICAgICAgICAgICAgcHJvamVjdHM6IG9iamVjdHNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgbmV4dCgpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuXHJcbl9tb2R1bGUuc2VydmljZSgnV2F0Y2hlclNlcnZpY2UnLCBbJ3VzZXJEZXRhaWxzJywgJyRyb290U2NvcGUnLCAnJHRpbWVvdXQnLCAodXNlckRldGFpbHMsICRyb290U2NvcGUsICR0aW1lb3V0KSA9PiB7XHJcbiAgICByZXR1cm4gc2VsZjtcclxufV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwid2F0Y2hlci50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgdmFyIGxvZyA9IExvZ2dlci5nZXQoXCJrdWJlcm5ldGVzLXRlcm0td2luZG93c1wiKTtcclxuXHJcbiAgX21vZHVsZS5jb25maWcoKGt1YmVybmV0ZXNDb250YWluZXJTb2NrZXRQcm92aWRlcikgPT4ge1xyXG4gICAga3ViZXJuZXRlc0NvbnRhaW5lclNvY2tldFByb3ZpZGVyLldlYlNvY2tldEZhY3RvcnkgPSBcIkN1c3RvbVdlYlNvY2tldHNcIjtcclxuICB9KTtcclxuXHJcbiAgX21vZHVsZS5mYWN0b3J5KCdDdXN0b21XZWJTb2NrZXRzJywgKHVzZXJEZXRhaWxzOmFueSkgPT4ge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIEN1c3RvbVdlYlNvY2tldCh1cmwsIHByb3RvY29scykge1xyXG4gICAgICB2YXIgcGF0aHMgPSB1cmwuc3BsaXQoJz8nKTtcclxuICAgICAgaWYgKCFfLnN0YXJ0c1dpdGgocGF0aHNbMF0sIG1hc3RlckFwaVVybCgpKSkge1xyXG4gICAgICAgIHBhdGhzWzBdID0gVXJsSGVscGVycy5qb2luKG1hc3RlckFwaVVybCgpLCBwYXRoc1swXSk7XHJcbiAgICAgIH1cclxuICAgICAgdXJsID0gS3ViZXJuZXRlc0FQSS53c1VybChwYXRoc1swXSk7XHJcbiAgICAgIHVybC5zZWFyY2gocGF0aHNbMV0gKyAnJmFjY2Vzc190b2tlbj0nICsgdXNlckRldGFpbHMudG9rZW4pO1xyXG4gICAgICBsb2cuZGVidWcoXCJVc2luZyB3cyB1cmw6IFwiLCB1cmwudG9TdHJpbmcoKSk7XHJcbiAgICAgIHJldHVybiBuZXcgV2ViU29ja2V0KHVybC50b1N0cmluZygpLCBwcm90b2NvbHMpO1xyXG4gICAgfTtcclxuICB9KTtcclxuXHJcbiAgX21vZHVsZS5zZXJ2aWNlKCdUZXJtaW5hbFNlcnZpY2UnLCAoJHJvb3RTY29wZSwgJGRvY3VtZW50LCAkY29tcGlsZSwgJGludGVydmFsLCAkdGVtcGxhdGVDYWNoZSkgPT4ge1xyXG4gICAgdmFyIGJvZHkgPSAkZG9jdW1lbnQuZmluZCgnYm9keScpO1xyXG4gICAgZnVuY3Rpb24gcG9zaXRpb25UZXJtaW5hbHModGVybWluYWxzKSB7XHJcbiAgICAgIHZhciB0b3RhbCA9IF8ua2V5cyh0ZXJtaW5hbHMpLmxlbmd0aDtcclxuICAgICAgdmFyIGRpc3QgPSAoYm9keS53aWR0aCgpIC0gMjI1KSAvIHRvdGFsO1xyXG4gICAgICB2YXIgcG9zaXRpb24gPSA1O1xyXG4gICAgICBhbmd1bGFyLmZvckVhY2godGVybWluYWxzLCAodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAgIGlmICghdmFsdWUuc2NvcGUuZG9ja2VkKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhbHVlLmVsLmNzcygnbGVmdCcsIHBvc2l0aW9uICsgJ3B4Jyk7XHJcbiAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiArIGRpc3Q7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdmFyIGRlZmF1bHRUZW1wbGF0ZSA9ICR0ZW1wbGF0ZUNhY2hlLmdldChVcmxIZWxwZXJzLmpvaW4odGVtcGxhdGVQYXRoLCAndGVybVNoZWxsLmh0bWwnKSk7XHJcbiAgICB2YXIgc2VsZiA9IHtcclxuICAgICAgcG9zaXRpb25UZXJtaW5hbHM6ICgpID0+IHtcclxuICAgICAgICBwb3NpdGlvblRlcm1pbmFscyhzZWxmLnRlcm1pbmFscyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHRlcm1pbmFsczoge30sXHJcbiAgICAgIGh0dHBUYXNrOiB7fSxcclxuICAgICAgbmV3VGVybWluYWw6ICgkaW50ZXJ2YWwsIHBvZExpbmssIGNvbnRhaW5lck5hbWUsIGVudGl0eSwgdXJsICx0ZW1wbGF0ZSA9IGRlZmF1bHRUZW1wbGF0ZSkgPT4ge1xyXG4gICAgICAgIHZhciB0ZXJtaW5hbElkID0gVXJsSGVscGVycy5qb2luKHBvZExpbmssIGNvbnRhaW5lck5hbWUpO1xyXG4gICAgICAgIGlmICh0ZXJtaW5hbElkIGluIHNlbGYudGVybWluYWxzKSB7XHJcbiAgICAgICAgICBsb2cuZGVidWcoXCJBbHJlYWR5IGEgdGVybWluYWwgd2l0aCBpZDogXCIsIHRlcm1pbmFsSWQpO1xyXG4gICAgICAgICAgc2VsZi5yYWlzZVRlcm1pbmFsKHRlcm1pbmFsSWQpO1xyXG4gICAgICAgICAgcmV0dXJuIHRlcm1pbmFsSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzY29wZSA9ICRyb290U2NvcGUuJG5ldygpO1xyXG4gICAgICAgIGdldExvZ3MoZW50aXR5LCBzY29wZSwgdXJsKTtcclxuICAgICAgICBzY29wZS5wb2RMaW5rID0gcG9kTGluaztcclxuICAgICAgICBzY29wZS5jb250YWluZXJOYW1lID0gY29udGFpbmVyTmFtZTtcclxuICAgICAgICBzY29wZS5pZCA9IHRlcm1pbmFsSWQ7XHJcbiAgICAgICAgc2NvcGUuZG9ja2VkID0gdHJ1ZTtcclxuICAgICAgICBpZih0ZXJtaW5hbElkIGluIHNlbGYuaHR0cFRhc2spe1xyXG4gICAgICAgICAgIHNlbGYucmFpc2VUZXJtaW5hbCh0ZXJtaW5hbElkKTtcclxuICAgICAgICAgICByZXR1cm4gdGVybWluYWxJZDtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICBzZWxmLmh0dHBUYXNrW3Rlcm1pbmFsSWRdID0gJGludGVydmFsKCgpID0+e1xyXG4gICAgICAgICAgICAgIGdldExvZ3MoZW50aXR5LCBzY29wZSwgdXJsKTtcclxuICAgICAgICAgICB9LDIwMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZWwgPSAkKCRjb21waWxlKHRlbXBsYXRlKShzY29wZSkpO1xyXG4gICAgICAgIHZhciB0ZXJtID0ge1xyXG4gICAgICAgICAgc2NvcGU6IHNjb3BlLFxyXG4gICAgICAgICAgZWw6IGVsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBib2R5LmFwcGVuZChlbCk7XHJcbiAgICAgICAgc2VsZi50ZXJtaW5hbHNbdGVybWluYWxJZF0gPSB0ZXJtO1xyXG4gICAgICAgIHBvc2l0aW9uVGVybWluYWxzKHNlbGYudGVybWluYWxzKTtcclxuICAgICAgICByZXR1cm4gdGVybWluYWxJZDtcclxuICAgICAgfSxcclxuICAgICAgY2xvc2VUZXJtaW5hbDogKGlkKSA9PiB7XHJcbiAgICAgICAgdmFyIHRlcm0gPSBzZWxmLnRlcm1pbmFsc1tpZF07XHJcbiAgICAgICAgdmFyIHRpbWVyID0gc2VsZi5odHRwVGFza1tpZF07XHJcbiAgICAgICAgaWYodGltZXIpe1xyXG4gICAgICAgICAgJGludGVydmFsLmNhbmNlbCh0aW1lcik7XHJcbiAgICAgICAgICBkZWxldGUgc2VsZi5odHRwVGFza1tpZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0ZXJtKSB7XHJcbiAgICAgICAgICB0ZXJtLmVsLnJlbW92ZSgpO1xyXG4gICAgICAgICAgZGVsZXRlIHNlbGYudGVybWluYWxzW2lkXTtcclxuICAgICAgICAgIHBvc2l0aW9uVGVybWluYWxzKHNlbGYudGVybWluYWxzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHJhaXNlVGVybWluYWw6IChpZCkgPT4ge1xyXG4gICAgICAgIGFuZ3VsYXIuZm9yRWFjaChzZWxmLnRlcm1pbmFscywgKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgICAgIGlmIChrZXkgPT09IGlkKSB7XHJcbiAgICAgICAgICAgIHZhbHVlLmVsLmNzcygnei1pbmRleCcsICc0MDAwJyk7XHJcbiAgICAgICAgICAgIHZhbHVlLmVsLmZpbmQoJy50ZXJtaW5hbCcpLmZvY3VzKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YWx1ZS5lbC5jc3MoJ3otaW5kZXgnLCAnMzAwMCcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHNlbGY7XHJcbiAgfSk7XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBhZGRXaW5kb3dBY3Rpb25zKHNjb3BlLCBlbGVtZW50LCBUZXJtaW5hbFNlcnZpY2UpIHtcclxuICAgIHZhciBtb3ZlZCA9IGZhbHNlO1xyXG4gICAgdmFyIGxhc3RYID0gMDtcclxuICAgIHZhciBsYXN0WSA9IDA7XHJcbiAgICB2YXIgaGVhZGVyID0gZWxlbWVudC5maW5kKCcudGVybWluYWwtdGl0bGUnKTtcclxuICAgIHZhciBib2R5ID0gZWxlbWVudC5maW5kKCcudGVybWluYWwtYm9keScpO1xyXG4gICAgZWxlbWVudC5vbignJGRlc3Ryb3knLCAoKSA9PiB7XHJcbiAgICAgICQoJyNtYWluJykuY3NzKHsgZGlzcGxheTogJ2luaGVyaXQnIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdmFyIEhFSUdIVCA9IDM0ODtcclxuICAgIHZhciBXSURUSCA9IDYwMDtcclxuICAgIHZhciBUSVRMRV9IRUlHSFQgPSAzNTtcclxuICAgIHZhciBOQVZfT0ZGU0VUID0gNDY7XHJcblxyXG4gICAgZWxlbWVudC5jc3Moe1xyXG4gICAgICBoZWlnaHQ6IEhFSUdIVCxcclxuICAgICAgd2lkdGg6IFdJRFRIXHJcbiAgICB9KTtcclxuICAgIGhlYWRlci5jc3Moe1xyXG4gICAgICBoZWlnaHQ6IFRJVExFX0hFSUdIVFxyXG4gICAgfSk7XHJcbiAgICBib2R5LmNzcyh7XHJcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxyXG4gICAgICB0b3A6IDM1LFxyXG4gICAgICBsZWZ0OiAwLFxyXG4gICAgICByaWdodDogMCwgXHJcbiAgICAgIGJvdHRvbTogMFxyXG4gICAgfSk7XHJcbiAgICBzY29wZS5jbG9zZSA9ICgpID0+IHtcclxuICAgICAgVGVybWluYWxTZXJ2aWNlLmNsb3NlVGVybWluYWwoc2NvcGUuaWQpO1xyXG4gICAgfTtcclxuICAgIHNjb3BlLnJhaXNlID0gKCkgPT4ge1xyXG4gICAgICBUZXJtaW5hbFNlcnZpY2UucmFpc2VUZXJtaW5hbChzY29wZS5pZCk7XHJcbiAgICB9O1xyXG4gICAgc2NvcGUuJHdhdGNoKCdkb2NrZWQnLCAoZG9ja2VkKSA9PiB7XHJcbiAgICAgIGlmIChkb2NrZWQpIHtcclxuICAgICAgICBlbGVtZW50LndpZHRoKFdJRFRIKTtcclxuICAgICAgICBpZiAoIWVsZW1lbnQuaGFzQ2xhc3MoJ21pbmltaXplZCcpKSB7XHJcbiAgICAgICAgICBlbGVtZW50LmhlaWdodChIRUlHSFQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBzY29wZS5zdGFydFJlc2l6ZSA9IChlKSA9PiB7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgbG9nLmRlYnVnKFwiU3RhcnQgcmVzaXplXCIpO1xyXG4gICAgICBzY29wZS5yZXNpemluZyA9IHRydWU7XHJcbiAgICAgIGVsZW1lbnQub24oJ21vdXNldXAnLCBzY29wZS5zdG9wUmVzaXplKTtcclxuICAgICAgJChkb2N1bWVudCkub24oJ21vdXNlbW92ZScsIHNjb3BlLmRvUmVzaXplKTtcclxuICAgICAgJChkb2N1bWVudCkub24oJ21vdXNlbGVhdmUnLCBzY29wZS5zdG9wUmVzaXplKTtcclxuICAgIH07XHJcbiAgICBzY29wZS5kb1Jlc2l6ZSA9IChlKSA9PiB7XHJcbiAgICAgIGlmIChzY29wZS5yZXNpemluZykge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhcIlJlc2l6aW5nLCBlOiBcIiwgZSk7XHJcbiAgICAgICAgaWYgKCFtb3ZlZCkge1xyXG4gICAgICAgICAgbGFzdFggPSBlLmNsaWVudFg7XHJcbiAgICAgICAgICBsYXN0WSA9IGUuY2xpZW50WTtcclxuICAgICAgICAgIG1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0KCk7XHJcbiAgICAgICAgdmFyIHdpZHRoID0gZWxlbWVudC53aWR0aCgpO1xyXG4gICAgICAgIHZhciBkZWx0YVggPSBlLmNsaWVudFggLSBsYXN0WDtcclxuICAgICAgICB2YXIgZGVsdGFZID0gZS5jbGllbnRZIC0gbGFzdFk7XHJcbiAgICAgICAgdmFyIG5ld0hlaWdodCA9IGhlaWdodCArIGRlbHRhWTtcclxuICAgICAgICB2YXIgbmV3V2lkdGggPSB3aWR0aCArIGRlbHRhWDtcclxuICAgICAgICBpZiAobmV3SGVpZ2h0ID4gMzUgJiYgbmV3V2lkdGggPiA4MCkge1xyXG4gICAgICAgICAgZWxlbWVudC5oZWlnaHQoaGVpZ2h0ICsgZGVsdGFZKTtcclxuICAgICAgICAgIGVsZW1lbnQud2lkdGgod2lkdGggKyBkZWx0YVgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsYXN0WCA9IGUuY2xpZW50WDtcclxuICAgICAgICBsYXN0WSA9IGUuY2xpZW50WTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHNjb3BlLnN0b3BSZXNpemUgPSAoZSkgPT4ge1xyXG4gICAgICBzY29wZS5yZXNpemluZyA9IGZhbHNlO1xyXG4gICAgICBtb3ZlZCA9IGZhbHNlO1xyXG4gICAgICBlbGVtZW50Lm9mZignbW91c2V1cCcsIHNjb3BlLnN0b3BSZXNpemUpO1xyXG4gICAgICAkKGRvY3VtZW50KS5vZmYoJ21vdXNlbW92ZScsIHNjb3BlLmRvUmVzaXplKTtcclxuICAgICAgJChkb2N1bWVudCkub2ZmKCdtb3VzZWxlYXZlJywgc2NvcGUuc3RvcFJlc2l6ZSk7XHJcbiAgICB9XHJcbiAgICBzY29wZS5tb3VzZURvd24gPSAoZSkgPT4ge1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGlmIChlbGVtZW50Lmhhc0NsYXNzKCdtaW5pbWl6ZWQnKSB8fCBlbGVtZW50Lmhhc0NsYXNzKCdtYXhpbWl6ZWQnKSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBzY29wZS5kcmFnZ2luZyA9IHRydWU7XHJcbiAgICAgIGVsZW1lbnQub24oJ21vdXNldXAnLCBzY29wZS5tb3VzZVVwKTtcclxuICAgICAgJChkb2N1bWVudCkub24oJ21vdXNlbW92ZScsIHNjb3BlLm1vdXNlTW92ZSk7XHJcbiAgICAgICQoZG9jdW1lbnQpLm9uKCdtb3VzZWxlYXZlJywgc2NvcGUubW91c2VVcCk7XHJcbiAgICB9O1xyXG4gICAgc2NvcGUubW91c2VVcCA9IChlKSA9PiB7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgc2NvcGUuZHJhZ2dpbmcgPSBmYWxzZTtcclxuICAgICAgbW92ZWQgPSBmYWxzZTtcclxuICAgICAgdmFyIGhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0KCk7XHJcbiAgICAgIHZhciBvZmZzZXQgPSBlbGVtZW50Lm9mZnNldCgpO1xyXG4gICAgICB2YXIgd2luSGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xyXG4gICAgICBpZiAob2Zmc2V0LnRvcCA+ICh3aW5IZWlnaHQgLSBoZWlnaHQgLSAyMCkpIHtcclxuICAgICAgICBlbGVtZW50LmNzcyh7IHRvcDogXCJpbmhlcml0XCIsIGxlZnQ6IFwiaW5oZXJpdFwiIH0pO1xyXG4gICAgICAgIHNjb3BlLmRvY2tlZCA9IHRydWU7XHJcbiAgICAgICAgVGVybWluYWxTZXJ2aWNlLnBvc2l0aW9uVGVybWluYWxzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2NvcGUuZG9ja2VkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgZWxlbWVudC5vZmYoJ21vdXNldXAnLCBzY29wZS5tb3VzZVVwKTtcclxuICAgICAgJChkb2N1bWVudCkub2ZmKCdtb3VzZW1vdmUnLCBzY29wZS5tb3VzZU1vdmUpO1xyXG4gICAgICAkKGRvY3VtZW50KS5vZmYoJ21vdXNlbGVhdmUnLCBzY29wZS5tb3VzZVVwKTtcclxuICAgIH07XHJcbiAgICBzY29wZS5tb3VzZU1vdmUgPSAoZSkgPT4ge1xyXG4gICAgICBpZiAoc2NvcGUuZHJhZ2dpbmcpIHtcclxuICAgICAgICBpZiAoIW1vdmVkKSB7XHJcbiAgICAgICAgICBsYXN0WCA9IGUuY2xpZW50WDtcclxuICAgICAgICAgIGxhc3RZID0gZS5jbGllbnRZO1xyXG4gICAgICAgICAgbW92ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZGVsdGFYID0gZS5jbGllbnRYIC0gbGFzdFg7XHJcbiAgICAgICAgdmFyIGRlbHRhWSA9IGUuY2xpZW50WSAtIGxhc3RZO1xyXG4gICAgICAgIHZhciBlbE9mZnNldCA9IGVsZW1lbnQub2Zmc2V0KCk7XHJcbiAgICAgICAgZWxlbWVudC5vZmZzZXQoeyB0b3A6IGVsT2Zmc2V0LnRvcCArIGRlbHRhWSwgbGVmdDogZWxPZmZzZXQubGVmdCArIGRlbHRhWCB9KTtcclxuICAgICAgICBsYXN0WCA9IGUuY2xpZW50WDtcclxuICAgICAgICBsYXN0WSA9IGUuY2xpZW50WTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlc3RvcmVXaW5kb3coc2NvcGUsIGVsZW1lbnQpIHtcclxuICAgICAgaWYgKHNjb3BlLm9mZnNldCkge1xyXG4gICAgICAgIGVsZW1lbnQub2Zmc2V0KHNjb3BlLm9mZnNldCk7XHJcbiAgICAgICAgc2NvcGUuZG9ja2VkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNjb3BlLmhlaWdodCkge1xyXG4gICAgICAgIGVsZW1lbnQuaGVpZ2h0KHNjb3BlLmhlaWdodCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNjb3BlLndpZHRoKSB7XHJcbiAgICAgICAgZWxlbWVudC53aWR0aChzY29wZS53aWR0aCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzYXZlV2luZG93KHNjb3BlLCBlbGVtZW50KSB7XHJcbiAgICAgIHNjb3BlLm9mZnNldCA9IGVsZW1lbnQub2Zmc2V0KCk7XHJcbiAgICAgIHNjb3BlLmhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0KCk7XHJcbiAgICAgIHNjb3BlLndpZHRoID0gZWxlbWVudC53aWR0aCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNjb3BlLm1heGltaXplZCA9ICgpID0+IHtcclxuICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQ2xhc3MoJ21heGltaXplZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHNjb3BlLm1heGltaXplID0gKCRlKSA9PiB7XHJcbiAgICAgICRlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGlmIChlbGVtZW50Lmhhc0NsYXNzKCdtaW5pbWl6ZWQnKSkge1xyXG4gICAgICAgIHNjb3BlLm1pbmltaXplKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGVsZW1lbnQuaGFzQ2xhc3MoJ21heGltaXplZCcpKSB7XHJcbiAgICAgICAgcmVzdG9yZVdpbmRvdyhzY29wZSwgZWxlbWVudCk7XHJcbiAgICAgICAgJCgnI21haW4nKS5jc3MoeyBkaXNwbGF5OiAnaW5oZXJpdCcgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2F2ZVdpbmRvdyhzY29wZSwgZWxlbWVudCk7XHJcbiAgICAgICAgJCgnI21haW4nKS5jc3MoeyBkaXNwbGF5OiAnbm9uZScgfSk7XHJcbiAgICAgICAgZWxlbWVudC5jc3MoeyBcclxuICAgICAgICAgIGhlaWdodDogJ2luaGVyaXQnLCBcclxuICAgICAgICAgIGJvdHRvbTogMCwgXHJcbiAgICAgICAgICB3aWR0aDogJzEwMCUnLCBcclxuICAgICAgICAgIHRvcDogTkFWX09GRlNFVCwgXHJcbiAgICAgICAgICBsZWZ0OiAwIFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsZW1lbnQudG9nZ2xlQ2xhc3MoJ21heGltaXplZCcpO1xyXG4gICAgfVxyXG4gICAgc2NvcGUubWluaW1pemUgPSAoJGUpID0+IHtcclxuICAgICAgJGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgaWYgKGVsZW1lbnQuaGFzQ2xhc3MoJ21heGltaXplZCcpKSB7XHJcbiAgICAgICAgc2NvcGUubWF4aW1pemUoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZWxlbWVudC5oYXNDbGFzcygnbWluaW1pemVkJykpIHtcclxuICAgICAgICByZXN0b3JlV2luZG93KHNjb3BlLCBlbGVtZW50KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzYXZlV2luZG93KHNjb3BlLCBlbGVtZW50KTtcclxuICAgICAgICBzY29wZS5kb2NrZWQgPSB0cnVlO1xyXG4gICAgICAgIGVsZW1lbnQuY3NzKHsgaGVpZ2h0OiBUSVRMRV9IRUlHSFQsIHRvcDogXCJpbmhlcml0XCIsIGxlZnQ6IFwiaW5oZXJpdFwiIH0pO1xyXG4gICAgICAgIFRlcm1pbmFsU2VydmljZS5wb3NpdGlvblRlcm1pbmFscygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsZW1lbnQudG9nZ2xlQ2xhc3MoJ21pbmltaXplZCcpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIF9tb2R1bGUuZGlyZWN0aXZlKCd0ZXJtaW5hbFdpbmRvdycsICgkY29tcGlsZSwgVGVybWluYWxTZXJ2aWNlKSA9PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZXN0cmljdDogJ0EnLFxyXG4gICAgICBzY29wZTogZmFsc2UsXHJcbiAgICAgIGxpbms6IChzY29wZTphbnksIGVsZW1lbnQsIGF0dHIpID0+IHtcclxuICAgICAgICBhZGRXaW5kb3dBY3Rpb25zKHNjb3BlLCBlbGVtZW50LCBUZXJtaW5hbFNlcnZpY2UpO1xyXG4gICAgICAgIHZhciBib2R5ID0gZWxlbWVudC5maW5kKCcudGVybWluYWwtYm9keScpO1xyXG4gICAgICAgIGJvZHkuYXBwZW5kKCRjb21waWxlKCc8a3ViZXJuZXRlcy1jb250YWluZXItdGVybWluYWwgcG9kPVwicG9kTGlua1wiIGNvbnRhaW5lcj1cImNvbnRhaW5lck5hbWVcIiBjb21tYW5kPVwiYmFzaFwiPjwva3ViZXJuZXRlcy1jb250YWluZXItdGVybWluYWw+Jykoc2NvcGUpKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9KTtcclxuXHJcbiAgZnVuY3Rpb24gZ2V0TG9ncyhyYywgc2NvcGUsIHVybCl7ICAgIFxyXG4gICAgIHZhciB4aHI9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYoeGhyLnJlYWR5U3RhdGUgPT0gNCl7XHJcbiAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKXtcclxuICAgICAgICAgICAgICAgaWYoeGhyLnJlc3BvbnNlVGV4dCAhPVwiXCIgJiYgeGhyLnJlc3BvbnNlVGV4dCAhPW51bGwpeyAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICB2YXIgbG9nT2JqZWN0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTsgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIHNjb3BlLmxvZ3MgPSBsb2dPYmplY3RbZ2V0TmFtZShyYyldO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIHNjb3BlLmxvZ3MgPSBcIuW9k+WJjeayoeacieWPr+S7peafpeeci+eahOaXpeW/l+S/oeaBr1wiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgLy9yZXR1cm4gKHt0ZXh0OiBcImFhYWFhYVwifSk7XHJcblxyXG4gICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAvL2xvZyA9IFwi5b2T5YmN5rKh5pyJ5Y+v5Lul5p+l55yL55qE5pel5b+X77yBXCI7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICB9XHJcbiAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIHVybCwgZmFsc2UpO1xyXG4gICAgIC8veGhyLm9wZW4oXCJQT1NUXCIsIFwiL2phdmEvY29uc29sZS9hcGkvb3JhY2xlL2V4dHJhY3QvbG9nP3JjTmFtZT1cIiArIGdldE5hbWUocmMpLGZhbHNlKTtcclxuICAgICB4aHIuc2VuZChudWxsKTtcclxuICB9XHJcbn1cclxuXHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImNvbmZpZ1BsdWdpbi50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImNvbmZpZ3NEYXRhU2VydmljZS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2NvbmZpZ3MvdHMvY29uZmlnc1V0aWxzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vY29uZmlncy90cy9jdXN0b21BbGVydC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2t1YmVybmV0ZXMvdHMva3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcblxyXG5tb2R1bGUgQ29uZmlnc3tcclxuXHRleHBvcnQgdmFyIFRhYmxlRWRpdCA9IGNvbnRyb2xsZXIoJ1RhYmxlRWRpdCcsIFsnJHNjb3BlJywgKCRzY29wZSkgPT4ge1xyXG5cdFx0JHNjb3BlLmVkaXRSb3cgPSAoZW50aXR5KT0+e1x0XHRcdFxyXG5cdFx0XHQkc2NvcGUuJGVtaXQoJ2VkaXRSb3cnLCBlbnRpdHkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdCRzY29wZS5kZWxldGVSb3dPbmUgPXtcclxuXHRcdFx0c2hvdzogZmFsc2UsXHJcbiAgICAgICBcdFx0aXRlbTogbnVsbCxcclxuICAgICAgIFx0XHRvcGVuOiAoZW50aXR5KSA9PiB7XHJcbiBcdFx0XHRcdHZhciBkZWxldGVSb3dPbmUgPSAkc2NvcGUuZGVsZXRlUm93T25lO1xyXG4gICAgICAgICBcdFx0ZGVsZXRlUm93T25lLnNob3cgPSB0cnVlO1xyXG4gICAgICAgICBcdFx0ZGVsZXRlUm93T25lLml0ZW0gPSBlbnRpdHk7XHJcbiAgICAgICBcdFx0fSxcclxuICAgICAgIFx0XHRvbk9rOiAoKSA9PiB7XHJcbiAgICAgICBcdFx0XHR2YXIgZGVsZXRlUm93T25lID0gJHNjb3BlLmRlbGV0ZVJvd09uZTtcclxuICAgICAgIFx0XHRcdCRzY29wZS4kZW1pdCgnZGVsZXRlUm93JywgZGVsZXRlUm93T25lLml0ZW0pO1xyXG4gICAgICAgXHRcdH0sXHJcbiAgICAgICBcdFx0b25DYW5jZWw6ICgpID0+IHtcclxuICAgICAgIFx0XHRcdHZhciBkZWxldGVSb3dPbmUgPSAkc2NvcGUuZGVsZXRlUm93T25lO1xyXG4gICAgICAgICBcdFx0ZGVsZXRlUm93T25lLnNob3cgPSBmYWxzZTtcclxuICAgICAgICAgXHRcdGRlbGV0ZVJvd09uZS5pdGVtID0gbnVsbDtcclxuICAgICAgIFx0XHR9XHJcblx0XHR9XHJcblx0fV0pO1xyXG5cclxuXHRleHBvcnQgdmFyIFZvbHVtZUNvbnRyb2xsZXIgPSBjb250cm9sbGVyKCdWb2x1bWVDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGh0dHAnLCAoJHNjb3BlLCAkaHR0cCkgPT4ge1xyXG5cdFx0JHNjb3BlLnN1Ym1pdHRlZCA9IGZhbHNlO1xyXG5cdFx0JHNjb3BlLnN0YXR1cyA9ICRzY29wZS5uZ0RpYWxvZ0RhdGEuc3RhdHVzO1x0XHJcblxyXG5cdFx0JHNjb3BlLiBjYW5jZWwgPSAoKSA9PntcclxuXHRcdFx0JHNjb3BlLmNsb3NlVGhpc0RpYWxvZygpO1xyXG5cdFx0XHQkc2NvcGUuc3VibWl0dGVkID0gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0JHNjb3BlLmRlbGV0ZUJyb2NrID0gKHZvbHVtZTp2b2x1bWUsIGJyb2NrKSA9PiB7XHJcblx0XHRcdGlmKHZvbHVtZS5icmljay5sZW5ndGg+MSlcclxuXHRcdFx0XHRkZWxldGVCcm9jayh2b2x1bWUsIGJyb2NrKTtcclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdCRzY29wZS5zaG93TWVzc2FnZSA9IHRydWU7XHQgICAgXHRcdFx0XHRcclxuXHRcdH1cclxuXHJcblx0XHQkc2NvcGUuYWRkQnJvY2sgPSAodm9sdW1lKSA9PiB7XHJcblx0XHRcdHZhciAgYmxvY2sgPSB7XHJcblx0XHRcdFx0aXA6IFwiXCIsIC8v5a2Y5YKo5Z2X55qE5py65ZmoaXDlnLDlnYBcclxuXHRcdFx0XHRwYXRoOiBcIlwiLCAvL+WtmOWCqOWdl+i3r+W+hFxyXG5cdFx0XHRcdHN0YXR1czogZmFsc2UsIC8v5a2Y5YKo5Z2X55qE54q25oCBXHJcblx0XHRcdFx0ZWRpdGFibGU6dHJ1ZVx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdH07XHJcblx0XHRcdGFkZEJyb2NrKHZvbHVtZSwgYmxvY2spO1xyXG5cdFx0XHQkc2NvcGUuc2hvd01lc3NhZ2UgPSBmYWxzZTtcdFxyXG5cdFx0fVxyXG5cclxuXHRcdCRzY29wZS5zdG9wVm9sdW1lID0gKHZvbHVtZSkgPT57XHJcblx0XHRcdHZvbHVtZS5zdGF0dXMgPSBmYWxzZTtcdFx0XHJcblx0XHR9XHJcblxyXG5cdFx0JHNjb3BlLnN0YXJ0Vm9sdW1lID0gKHZvbHVtZSkgPT57XHJcblx0XHRcdHZvbHVtZS5zdGF0dXMgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQkc2NvcGUub25TdWJtaXQgPSAoZW50aXR5KSA9PiB7XHRcdFx0XHRcdFxyXG5cdFx0XHRpZigkc2NvcGUudm9sdW1lRm9ybS4kdmFsaWQpe1x0XHRcdFx0XHJcblx0XHRcdFx0JHNjb3BlLiRlbWl0KCd1cGRhdGUnLCBlbnRpdHkpO1x0XHRcclxuXHRcdFx0XHQkc2NvcGUuY2xvc2VUaGlzRGlhbG9nKCk7XHJcblx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdCRzY29wZS5zdWJtaXR0ZWQgPSB0cnVlO1xyXG5cdFx0XHR9XHRcdFxyXG5cdFx0fVxyXG5cdH1dKTtcclxuXHJcblx0ZXhwb3J0IHZhciBTeXN0ZW1JbmZvQ29udHJvbGxlciA9IGNvbnRyb2xsZXIoJ1N5c3RlbUluZm9Db250cm9sbGVyJywgWyckc2NvcGUnLCAoJHNjb3BlKSA9PntcdFx0XHJcblx0fV0pO1xyXG5cclxuXHRleHBvcnQgdmFyIFNxbFZpZXdDb250cm9sbGVyID0gY29udHJvbGxlcignU3FsVmlld0NvbnRyb2xsZXInLCBbJyRzY29wZScsICckaHR0cCcsICgkc2NvcGUsICRodHRwKSA9PntcclxuXHQgICAgJHNjb3BlLnRpdGxlID0gc2hhcmVJbml0KCRzY29wZS5uZ0RpYWxvZ0RhdGEpO1x0XHJcblx0XHQkc2NvcGUuY29udGVudCA9IFwiXCI7XHJcblx0XHRnZXRTcWxDb250ZW50KCk7XHRcdFxyXG5cdFx0ZnVuY3Rpb24gZ2V0U3FsQ29udGVudCgpe1xyXG5cdFx0XHQkaHR0cCh7XHJcblx0XHRcdFx0dXJsOiBcIi9qYXZhL2NvbnNvbGUvYXBpL2ZpbGVQYWNrYWdlL3JlYWRTcWxGaWxlXCIsXHJcblx0XHRcdFx0bWV0aG9kOidQT1NUJyxcclxuXHRcdFx0XHRwYXJhbXM6IHt0eXBlOiAkc2NvcGUubmdEaWFsb2dEYXRhLnR5cGV9LFx0XHRcdFx0XHJcblx0XHRcdFx0ZGF0YTogSlNPTi5zdHJpbmdpZnkoJHNjb3BlLm5nRGlhbG9nRGF0YS5pdGVtKVxyXG5cdFx0XHR9KS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsaGVhZGVyLGNvbmZpZyxzdGF0dXMpe1xyXG5cdFx0XHRcdCRzY29wZS5vbGRfY29udGVudCA9IGRhdGEuZGF0YTE7XHJcblx0XHRcdFx0Ly/lk43lupTmiJDlip9cclxuXHRcdFx0fSkuZXJyb3IoZnVuY3Rpb24oZGF0YSxoZWFkZXIsY29uZmlnLHN0YXR1cyl7XHJcblx0XHRcdFx0Ly/lpITnkIblk43lupTlpLHotKVcclxuXHRcdFx0XHQkc2NvcGUub2xkX2NvbnRlbnQgPSBcIuiOt+WPluiEmuacrOWGheWuueWksei0pVwiXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdCRzY29wZS51cExvYWRTcWxGaWxlID0gKCkgPT4ge1x0XHRcdFxyXG5cdFx0XHRpZih0eXBlb2YgRmlsZVJlYWRlciA9PSAndW5kZWZpbmVkJyl7XHJcblx0XHRcdFx0dGhyb3cgXCLmtY/op4jlmajkuI3mlK/mjIFGaWxlUmVhZGVy6K+75Y+W5paH5Lu2XCI7XHJcblx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdENvbmZpZ3MuRmlsZUlucHV0UGx1Z2luKChmaWxlKSA9PntcclxuXHRcdFx0XHRcdCRzY29wZS5lbmFibGUgPSB0cnVlO1xyXG5cdFx0XHRcdFx0aWYodHlwZW9mIHR5cGVvZiBGaWxlUmVhZGVyID09ICd1bmRlZmluZWQnKVxyXG5cdFx0XHRcdFx0XHR0aHJvdyBcIua1j+iniOWZqOS4jeaUr+aMgUZpbGVSZWFkZXLor7vlj5bmlofku7ZcIjtcclxuXHRcdFx0XHRcdGVsc2V7XHJcblx0XHRcdFx0XHRcdHZhciBmciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblx0XHRcdFx0XHRcdGZyLm9ubG9hZGVuZCA9IChlKSA9PntcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0XHQkc2NvcGUubmV3X2NvbnRlbnQgPSBlLnRhcmdldFtcInJlc3VsdFwiXTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0ZnIub25sb2Fkc3RhcnQgPSAoKSA9PntcdFxyXG5cdFx0XHRcdFx0XHRcdCRzY29wZS4kYXBwbHkoKCkgPT57XHJcblx0XHRcdFx0XHRcdFx0XHQkc2NvcGUuY29udGVudCAgPSBcIuato+WcqOivu+WPluaVsOaNruivt+eojeetiS4uLlwiO1xyXG5cdFx0XHRcdFx0XHRcdH0pO1x0XHJcblx0XHRcdFx0XHRcdCRzY29wZS5jb250ZW50ICA9IFwi5q2j5Zyo6K+75Y+W5pWw5o2u6K+356iN562JLi4uXCI7XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0ZnIucmVhZEFzVGV4dChmaWxlWzBdLFwiR0JLXCIpOyBcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdCRzY29wZS5vbk9rID0gKCkgPT4ge1xyXG5cdFx0XHQkc2NvcGUuZW5hYmxlID0gZmFsc2U7XHJcblx0XHRcdGlmKG51bGwgPT0gJHNjb3BlLm5ld19jb250ZW50IHx8ICRzY29wZS5uZXdfY29udGVudCA9PSBcIlwiKXtcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhcIuS4iuS8oOeahOWGheWuueS4jeiDveS4uuepulwiKTtcclxuXHRcdFx0XHQkc2NvcGUuY2xvc2VUaGlzRGlhbG9nKCk7XHJcblx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdCRzY29wZS4kZW1pdChcIm9uT2tcIix7XHJcblx0XHRcdFx0XHR1cmw6IFwiL2phdmEvY29uc29sZS9hcGkvZmlsZVBhY2thZ2UvaGFuZGxlU3FsRmlsZVwiLFxyXG5cdFx0XHRcdFx0aXRlbTogJHNjb3BlLm5nRGlhbG9nRGF0YS5pdGVtLFxyXG5cdFx0XHRcdFx0Y29udGVudDogJHNjb3BlLm5ld19jb250ZW50LFxyXG5cdFx0XHRcdFx0b3B0OiBcImFkZFwiLFxyXG5cdFx0XHRcdFx0dHlwZTogJHNjb3BlLm5nRGlhbG9nRGF0YS50eXBlXHJcblx0XHRcdFx0fSk7XHRcclxuXHRcdFx0XHQkc2NvcGUuY2xvc2VUaGlzRGlhbG9nKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQkc2NvcGUuY2FuY2VsID0gKCkgPT4ge1xyXG5cdFx0XHQkc2NvcGUuZW5hYmxlID0gZmFsc2U7XHJcblx0XHRcdCRzY29wZS5jbG9zZVRoaXNEaWFsb2coKTtcclxuXHRcdH0gXHJcblx0fV0pO1xyXG5cclxuXHRleHBvcnQgdmFyIFNxbEFkZENvbnRyb2xsZXIgPSBjb250cm9sbGVyKCdTcWxBZGRDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGh0dHAnLCAoJHNjb3BlLCAkaHR0cCkgPT4ge1xyXG5cdFx0JHNjb3BlLmNvbnRlbnQgPSAgXCJcIjtcdFxyXG5cdFx0JHNjb3BlLnRpdGxlID0gc2hhcmVJbml0KCRzY29wZS5uZ0RpYWxvZ0RhdGEpO1x0XHRcclxuXHRcdCRzY29wZS5zcWxGaWxlVXBsb2FkID0gKCkgPT57XHJcblx0XHRcdENvbmZpZ3MuRmlsZUlucHV0UGx1Z2luKChmaWxlKSA9PntcclxuXHRcdFx0XHQkc2NvcGUuZW5hYmxlID0gdHJ1ZTtcclxuXHRcdFx0XHRpZih0eXBlb2YgdHlwZW9mIEZpbGVSZWFkZXIgPT0gJ3VuZGVmaW5lZCcpXHJcblx0XHRcdFx0XHR0aHJvdyBcIua1j+iniOWZqOS4jeaUr+aMgUZpbGVSZWFkZXLor7vlj5bmlofku7ZcIjtcclxuXHRcdFx0XHRlbHNle1xyXG5cdFx0XHRcdFx0dmFyIGZyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuXHRcdFx0XHRcdGZyLm9ubG9hZGVuZCA9IChlKSA9PntcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0JHNjb3BlLmNvbnRlbnQgPSBlLnRhcmdldFtcInJlc3VsdFwiXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0ZnIub25sb2Fkc3RhcnQgPSAoKSA9PntcdFxyXG5cdFx0XHRcdFx0XHQkc2NvcGUuJGFwcGx5KCgpID0+e1xyXG5cdFx0XHRcdFx0XHRcdCRzY29wZS5jb250ZW50ICA9IFwi5q2j5Zyo6K+75Y+W5pWw5o2u6K+356iN562JLi4uXCI7XHJcblx0XHRcdFx0XHRcdH0pO1x0XHJcblx0XHRcdFx0XHRcdCRzY29wZS5jb250ZW50ICA9IFwi5q2j5Zyo6K+75Y+W5pWw5o2u6K+356iN562JLi4uXCI7XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRmci5yZWFkQXNUZXh0KGZpbGVbMF0sXCJHQktcIik7IFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0JHNjb3BlLm9uT2sgPSAoKSA9PiB7XHJcblx0XHRcdCRzY29wZS5lbmFibGUgPSBmYWxzZTtcclxuXHRcdFx0aWYobnVsbCA9PSRzY29wZS5jb250ZW50IHx8ICRzY29wZS5jb250ZW50ID09IFwiXCIpe1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKFwi5LiK5Lyg55qE5YaF5a655LiN6IO95Li656m6XCIpO1xyXG5cdFx0XHRcdCRzY29wZS5jbG9zZVRoaXNEaWFsb2coKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNle1xyXG5cdFx0XHRcdCRzY29wZS4kZW1pdChcIm9uT2tcIix7XHJcblx0XHRcdFx0XHR1cmw6IFwiL2phdmEvY29uc29sZS9hcGkvZmlsZVBhY2thZ2UvaGFuZGxlU3FsRmlsZVwiLFxyXG5cdFx0XHRcdFx0aXRlbTogJHNjb3BlLm5nRGlhbG9nRGF0YS5pdGVtLFxyXG5cdFx0XHRcdFx0Y29udGVudDogJHNjb3BlLmNvbnRlbnQsXHJcblx0XHRcdFx0XHRvcHQ6IFwiYWRkXCIsXHJcblx0XHRcdFx0XHR0eXBlOiAkc2NvcGUubmdEaWFsb2dEYXRhLnR5cGVcclxuXHRcdFx0XHR9KTtcdFxyXG5cdFx0XHRcdCRzY29wZS5jbG9zZVRoaXNEaWFsb2coKTtcdFx0XHRcclxuXHRcdFx0fVx0XHRcdFx0XHJcblx0XHR9XHJcblxyXG5cdFx0JHNjb3BlLmNhbmNlbCA9ICgpID0+IHtcclxuXHRcdFx0JHNjb3BlLmVuYWJsZSA9IGZhbHNlO1x0XHRcdFxyXG5cdFx0XHQkc2NvcGUuY2xvc2VUaGlzRGlhbG9nKCk7XHJcblx0XHR9XHJcblx0XHRcdFxyXG5cdH1dKTtcclxuXHJcblx0ZXhwb3J0IHZhciBzcWxWZXJpZmljYXRpb25Db250cm9sbGVyID0gIGNvbnRyb2xsZXIoJ3NxbFZlcmlmaWNhdGlvbkNvbnRyb2xsZXInLCBbJyRzY29wZScsICckaHR0cCcsICgkc2NvcGUsICRodHRwKSA9PiB7XHJcblx0XHRnZXRTcWxDb250ZW50KCk7XHJcblx0XHQkc2NvcGUudGl0bGUgPSBzaGFyZUluaXQoJHNjb3BlLm5nRGlhbG9nRGF0YSk7XHRcclxuXHRcdCRzY29wZS5yZXBsYWNlID0gKCkgPT4ge1xyXG5cdFx0XHQkc2NvcGUuJGVtaXQoXCJyZXBsYWNlXCIsIHtcclxuXHRcdFx0XHR1cmw6IFwiL2phdmEvY29uc29sZS9hcGkvZmlsZVBhY2thZ2UvaGFuZGxlU3FsRmlsZVwiLFxyXG5cdFx0XHRcdGl0ZW06ICRzY29wZS5uZ0RpYWxvZ0RhdGEuaXRlbSxcclxuXHRcdFx0XHRjb250ZW50OiAkc2NvcGUuY29udGVudCxcclxuXHRcdFx0XHRvcHQ6IFwicmVwbGFjZVwiLFxyXG5cdFx0XHRcdHR5cGU6ICRzY29wZS5uZ0RpYWxvZ0RhdGEudHlwZVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0JHNjb3BlLmNsb3NlVGhpc0RpYWxvZygpO1xyXG5cdFx0fVx0XHRcclxuXHRcdGZ1bmN0aW9uIGdldFNxbENvbnRlbnQoKXtcclxuXHRcdFx0JGh0dHAoe1xyXG5cdFx0XHRcdHVybDogXCIvamF2YS9jb25zb2xlL2FwaS9maWxlUGFja2FnZS9yZWFkU3FsRmlsZVwiLFxyXG5cdFx0XHRcdG1ldGhvZDonUE9TVCcsXHJcblx0XHRcdFx0cGFyYW1zOiB7dHlwZTogJHNjb3BlLm5nRGlhbG9nRGF0YS50eXBlfSxcdFx0XHRcdFxyXG5cdFx0XHRcdGRhdGE6IEpTT04uc3RyaW5naWZ5KCRzY29wZS5uZ0RpYWxvZ0RhdGEuaXRlbSlcclxuXHRcdFx0fSkuc3VjY2VzcyhmdW5jdGlvbihkYXRhLGhlYWRlcixjb25maWcsc3RhdHVzKXtcclxuXHRcdFx0XHQkc2NvcGUuc3RhbmRhcmQgPSBkYXRhLmRhdGExO1xyXG5cdFx0XHRcdCRzY29wZS51bm5vcm1hbCA9IGRhdGEuZGF0YTI7XHJcblx0XHRcdFx0Ly/lk43lupTmiJDlip9cclxuXHRcdFx0fSkuZXJyb3IoZnVuY3Rpb24oZGF0YSxoZWFkZXIsY29uZmlnLHN0YXR1cyl7XHJcblx0XHRcdFx0Ly/lpITnkIblk43lupTlpLHotKVcclxuXHRcdFx0XHQkc2NvcGUudW5ub3JtYWwgPSAkc2NvcGUuc3RhbmRhcmQgPSBcIuiOt+WPluiEmuacrOWGheWuueWksei0pVwiO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHQkc2NvcGUuY2FuY2VsID0gKCkgPT4ge1xyXG5cdFx0XHQvLyRzY29wZS5jbG9zZVRoaXNEaWFsb2coKTtcclxuXHRcdFx0JHNjb3BlLiRlbWl0KFwicmVwbGFjZVwiLCB7XHJcblx0XHRcdFx0dXJsOiBcIi9qYXZhL2NvbnNvbGUvYXBpL2ZpbGVQYWNrYWdlL2hhbmRsZVNxbEZpbGVcIixcclxuXHRcdFx0XHRpdGVtOiAkc2NvcGUubmdEaWFsb2dEYXRhLml0ZW0sXHJcblx0XHRcdFx0Y29udGVudDogJHNjb3BlLmNvbnRlbnQsXHJcblx0XHRcdFx0b3B0OiBcImRlbGV0ZVwiLFxyXG5cdFx0XHRcdHR5cGU6ICRzY29wZS5uZ0RpYWxvZ0RhdGEudHlwZVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0JHNjb3BlLmNsb3NlVGhpc0RpYWxvZygpO1x0XHRcdFxyXG5cdFx0fVxyXG5cdH1dKTtcclxuXHJcblx0ZXhwb3J0IHZhciBzcWxNb3ZlQ29udHJvbGxlciA9IGNvbnRyb2xsZXIoXCJzcWxNb3ZlQ29udHJvbGxlclwiLCBbJyRzY29wZScsICckaHR0cCcsICgkc2NvcGUsICRodHRwKSA9PiB7XHJcblx0XHRnZXRTcWxDb250ZW50KCk7XHJcblx0XHQkc2NvcGUudGl0bGUgPSBzaGFyZUluaXQoJHNjb3BlLm5nRGlhbG9nRGF0YSk7XHRcclxuXHRcdCRzY29wZS5tb3ZlID0gKCkgPT4ge1xyXG5cdFx0XHQkc2NvcGUuJGVtaXQoXCJyZXBsYWNlXCIsIHtcclxuXHRcdFx0XHR1cmw6IFwiL2phdmEvY29uc29sZS9hcGkvZmlsZVBhY2thZ2UvaGFuZGxlU3FsRmlsZVwiLFxyXG5cdFx0XHRcdGl0ZW06ICRzY29wZS5uZ0RpYWxvZ0RhdGEuaXRlbSxcclxuXHRcdFx0XHRjb250ZW50OiAkc2NvcGUuY29udGVudCxcclxuXHRcdFx0XHRvcHQ6IFwicmVwbGFjZVwiLFxyXG5cdFx0XHRcdHR5cGU6ICRzY29wZS5uZ0RpYWxvZ0RhdGEudHlwZVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0JHNjb3BlLmNsb3NlVGhpc0RpYWxvZygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdCRzY29wZS5jYW5jZWwgPSAoKSA9PiB7XHJcblx0XHRcdCRzY29wZS5jbG9zZVRoaXNEaWFsb2coKTtcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBnZXRTcWxDb250ZW50KCl7XHJcblx0XHRcdCRodHRwKHtcclxuXHRcdFx0XHR1cmw6IFwiL2phdmEvY29uc29sZS9hcGkvZmlsZVBhY2thZ2UvcmVhZFNxbEZpbGVcIixcclxuXHRcdFx0XHRtZXRob2Q6J1BPU1QnLFxyXG5cdFx0XHRcdHBhcmFtczoge3R5cGU6ICRzY29wZS5uZ0RpYWxvZ0RhdGEudHlwZX0sXHRcdFx0XHRcclxuXHRcdFx0XHRkYXRhOiBKU09OLnN0cmluZ2lmeSgkc2NvcGUubmdEaWFsb2dEYXRhLml0ZW0pXHJcblx0XHRcdH0pLnN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSxoZWFkZXIsY29uZmlnLHN0YXR1cyl7XHJcblx0XHRcdFx0JHNjb3BlLmNvbnRlbnQgPSBkYXRhLmRhdGEyO1x0XHRcdFx0XHJcblx0XHRcdFx0Ly/lk43lupTmiJDlip9cclxuXHRcdFx0fSkuZXJyb3IoZnVuY3Rpb24oZGF0YSxoZWFkZXIsY29uZmlnLHN0YXR1cyl7XHJcblx0XHRcdFx0Ly/lpITnkIblk43lupTlpLHotKVcclxuXHRcdFx0XHQkc2NvcGUuY29udGVudCA9IFwi6I635Y+W6ISa5pys5YaF5a655aSx6LSlXCI7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVx0XHRcdFx0XHJcblx0fV0pO1xyXG5cclxuXHRleHBvcnQgdmFyIHN5c1ZlclVwZGF0ZUNvbnRyb2xsZXIgPSBjb250cm9sbGVyKCdzeXNWZXJVcGRhdGVDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJGh0dHAnLCAoJHNjb3BlLCAkaHR0cCkgPT4ge1xyXG5cdFx0JHNjb3BlLmNoZWNrYm94SXRtZXMgPSBbXTtcclxuXHRcdCRzY29wZS5jbGljayA9ICgkZXZlbnQsIG5hbWUpID0+IHtcdFx0XHRcclxuXHRcdFx0aWYoJGV2ZW50LnRhcmdldC5jaGVja2VkKXtcclxuXHRcdFx0XHRpZigkc2NvcGUuY2hlY2tib3hJdG1lcy5pbmRleE9mKG5hbWUpID09IC0xKVxyXG5cdFx0XHRcdFx0JHNjb3BlLmNoZWNrYm94SXRtZXMucHVzaChuYW1lKVxyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2V7XHJcblx0XHRcdFx0Zm9yKHZhciBpPSAwOyBpIDwgJHNjb3BlLmNoZWNrYm94SXRtZXMubGVuZ3RoOyBpKyspe1xyXG5cdFx0XHRcdFx0aWYoJHNjb3BlLmNoZWNrYm94SXRtZXNbaV0gPT09IG5hbWUpe1xyXG5cdFx0XHRcdFx0XHQkc2NvcGUuY2hlY2tib3hJdG1lcy5zcGxpY2UoaSwxKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHRcdFx0XHJcblx0XHR9XHJcblxyXG5cdFx0Z2V0RGF0YSgpO1xyXG5cclxuXHRcdCRzY29wZS5yZXBsYWNlID0gKCkgPT4ge1x0XHRcdFxyXG5cdFx0XHQkc2NvcGUucmVxdWVzdEJvZHkgPSAkc2NvcGUuZGF0YTE7XHJcblx0XHRcdGFuZ3VsYXIuZm9yRWFjaCgkc2NvcGUuY2hlY2tib3hJdG1lcywgKGl0ZW0pID0+IHtcclxuXHRcdFx0XHQkc2NvcGUucmVxdWVzdEJvZHlbaXRlbV0gPSAkc2NvcGUuZGF0YTJbaXRlbV07XHJcblx0XHRcdH0pO1x0XHRcdFxyXG5cdFx0XHQkc2NvcGUuJGVtaXQoXCJ1cGRhdGVSb3dcIiwgJHNjb3BlLnJlcXVlc3RCb2R5KTtcdFxyXG5cdFx0XHQkc2NvcGUuY2xvc2VUaGlzRGlhbG9nKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0JHNjb3BlLmNhbmNlbCA9ICgpID0+IHtcclxuXHRcdFx0JHNjb3BlLmNsb3NlVGhpc0RpYWxvZygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGdldERhdGEoKXtcclxuXHRcdFx0JGh0dHAoe1xyXG5cdFx0XHRcdHVybDogXCIvamF2YS9jb25zb2xlL2FwaS9jaGVja291dC9maW5kRGV0YWlsc1wiLFxyXG5cdFx0XHRcdG1ldGhvZDonUE9TVCcsXHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0ZGF0YTogSlNPTi5zdHJpbmdpZnkoJHNjb3BlLm5nRGlhbG9nRGF0YSlcclxuXHRcdFx0fSkuc3VjY2VzcyhmdW5jdGlvbihkYXRhLGhlYWRlcixjb25maWcsc3RhdHVzKXtcclxuXHRcdFx0XHQkc2NvcGUuZGF0YTEgPSBkYXRhLmRhdGExO1xyXG5cdFx0XHRcdCRzY29wZS5kYXRhMiA9IGRhdGEuZGF0YTI7XHJcblx0XHRcdFx0Ly/lk43lupTmiJDlip9cclxuXHRcdFx0fSkuZXJyb3IoZnVuY3Rpb24oZGF0YSxoZWFkZXIsY29uZmlnLHN0YXR1cyl7XHJcblx0XHRcdFx0Ly/lpITnkIblk43lupTlpLHotKVcclxuXHRcdFx0XHQkc2NvcGUuY29udGVudCA9IFwi6I635Y+W6ISa5pys5YaF5a655aSx6LSlXCI7XHJcblx0XHRcdH0pO1x0XHRcdFxyXG5cdFx0fVxyXG5cdH1dKTtcclxuXHJcblx0ZnVuY3Rpb24gc2hhcmVJbml0KG5nRGlhbG9nRGF0YSkge1xyXG5cdFx0dmFyIHRpdGxlID0gXCJcIjtcclxuXHRcdGlmKG5nRGlhbG9nRGF0YS50eXBlICE9ICd1bmRlZmluZWQnKXtcclxuXHRcdFx0c3dpdGNoIChuZ0RpYWxvZ0RhdGEudHlwZSkge1xyXG5cdFx0XHRcdGNhc2UgXCJ1c2VyVGFibGVTdGF0dXNcIiA6XHJcblx0XHRcdFx0XHR0aXRsZSA9IFwiVXNlclRhYmxlc3BhY2VcIjtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgXCJja1BheVN0YXR1c1wiOlxyXG5cdFx0XHRcdFx0dGl0bGUgPSBcIkNoZWNob3V0X1BheVwiXHJcblx0XHRcdFx0IFx0YnJlYWs7XHRcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRjYXNlIFwiY2tJbmRpY2F0ZVN0YXR1c1wiOlxyXG5cdFx0XHRcdFx0dGl0bGUgPSBcIkNoZWNob3V0X0luZGljYXRlXCJcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGl0bGU7XHJcblx0fVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiY29uZmlnUGx1Z2luLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiY29uZmlnc0hlbHBlci50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImNvbmZpZ3NVdGlscy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImNvbmZpZ3NEYXRhU2VydmljZS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2t1YmVybmV0ZXMvdHMvdGVybS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2t1YmVybmV0ZXMvdHMva3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJzaGFyZUNvbnRyb2xsZXIudHNcIi8+XHJcbm1vZHVsZSBDb25maWdze1xyXG5cclxuXHRleHBvcnQgdmFyIEdmc0NvbnRyb2xsZXIgPSBjb250cm9sbGVyKCdHZnNDb250cm9sbGVyJywgW1wiJHNjb3BlXCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkbG9jYXRpb25cIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsICdDb25maWdzTW9kZWwnLCAnbmdEaWFsb2cnLFxyXG5cdFx0KCRzY29wZSwgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCAkbG9jYXRpb24sICRyb3V0ZVBhcmFtcywgJGh0dHAsICR0aW1lb3V0LCBDb25maWdzTW9kZWwsIG5nRGlhbG9nKSA9PntcclxuXHRcdCRzY29wZS5tb2RlbCA9IENvbmZpZ3NNb2RlbDtcclxuXHRcdCRzY29wZS52b2x1bWVzID0gQ29uZmlnc01vZGVsLmNsdXN0ZXI7XHJcblx0ICAgIHNoYXJlSW5pdCgkc2NvcGUsICRsb2NhdGlvbiwgJHJvdXRlUGFyYW1zKTtcdCAgICBcdCAgIFxyXG5cclxuXHQgICAgJHNjb3BlLmNyZWF0ZUdmcyA9ICgpID0+IHtcclxuXHQgICAgXHRuZ0RpYWxvZy5vcGVuKHsgXHJcblx0ICAgIFx0XHR0ZW1wbGF0ZTogJ25ld0RpYWxvZy5odG1sJyxcclxuXHQgICAgXHRcdGNvbnRyb2xsZXI6J0NvbmZpZ3MuVm9sdW1lQ29udHJvbGxlcicsXHJcblx0ICAgIFx0XHR3aWR0aDogMTAwNSxcclxuXHQgICAgXHRcdHNjb3BlOiAkc2NvcGUsIFxyXG5cdCAgICBcdFx0Y2xvc2VCeURvY3VtZW50IDogZmFsc2UsXHJcblx0ICAgIFx0XHRkYXRhOiB7XHJcblx0ICAgIFx0XHRcdG5hbWU6ICcnLFxyXG5cdCAgICBcdFx0XHRwYXRoOiAnJyxcclxuXHQgICAgXHRcdFx0c3RhdHVzOiB0cnVlLFxyXG5cdCAgICBcdFx0XHRicmljazogW3tcclxuXHQgICAgXHRcdFx0XHRpcDogW1wiMFwiLCBcIjBcIiwgXCIwXCIsIFwiMFwiXSxcclxuXHQgICAgXHRcdFx0XHRwYXRoOiAnJyxcclxuXHQgICAgXHRcdFx0XHRzdGF0dXM6IGZhbHNlLFxyXG5cdCAgICBcdFx0XHRcdGVkaXRhYmxlOiB0cnVlXHJcblx0ICAgIFx0XHRcdH1dLFxyXG5cdCAgICBcdFx0XHRlZGl0YWJsZTogdHJ1ZVxyXG5cdCAgICBcdFx0fSxcdCAgICBcdFx0XHJcblx0ICAgIFx0XHRjbGFzc05hbWU6ICduZ2RpYWxvZy10aGVtZS1kZWZhdWx0J1xyXG5cdCAgICBcdH0pO1x0ICAgIFx0XHRcclxuXHQgICAgfVxyXG5cclxuXHQgICAgJHNjb3BlLmVkaXRSb3cgPSAodm9sdW1lKSA9PiB7XHQgICAgXHRcclxuXHQgICAgXHR2YXIgZlZvbHVtZSA9IGZvcm1hdFZvbHVtZSh2b2x1bWUpO1x0ICAgIFx0XHRcclxuXHQgICAgXHRuZ0RpYWxvZy5vcGVuKHsgXHJcblx0ICAgIFx0XHR0ZW1wbGF0ZTogJ25ld0RpYWxvZy5odG1sJyxcclxuXHQgICAgXHRcdHdpZHRoOiAxMDA1LCBcclxuXHQgICAgXHRcdGRhdGE6IGZWb2x1bWUsXHRcclxuXHQgICAgXHRcdHNjb3BlOiAkc2NvcGUsICAgIFx0XHRcclxuXHQgICAgXHRcdGNsYXNzTmFtZTogJ25nZGlhbG9nLXRoZW1lLWRlZmF1bHQnLFx0ICAgIFx0XHRcclxuXHQgICAgXHRcdGNvbnRyb2xsZXI6ICdDb25maWdzLlZvbHVtZUNvbnRyb2xsZXInLFxyXG5cdCAgICBcdFx0Y2xvc2VCeURvY3VtZW50IDogZmFsc2VcclxuXHQgICAgXHR9KTtcclxuXHQgICAgfVxyXG5cclxuXHQgICAgJHNjb3BlLnNob3dEZWxldGVWb2x1bWUgPSB7XHJcblx0ICAgIFx0c2hvdzogZmFsc2UsXHJcbiAgICAgICBcdFx0aXRlbTogbnVsbCxcclxuICAgICAgIFx0XHRvcGVuOiAoZW50aXR5KSA9PiB7XHJcbiBcdFx0XHRcdHZhciBzaG93RGVsZXRlVm9sdW1lID0gJHNjb3BlLnNob3dEZWxldGVWb2x1bWU7XHJcbiAgICAgICAgIFx0XHRzaG93RGVsZXRlVm9sdW1lLnNob3cgPSB0cnVlO1xyXG4gICAgICAgICBcdFx0c2hvd0RlbGV0ZVZvbHVtZS5pdGVtID0gZW50aXR5O1xyXG4gICAgICAgXHRcdH0sXHJcbiAgICAgICBcdFx0b25PazogKCkgPT4ge1xyXG4gICAgICAgXHRcdFx0dmFyIHNob3dEZWxldGVWb2x1bWUgPSAkc2NvcGUuc2hvd0RlbGV0ZVZvbHVtZTtcclxuICAgICAgIFx0XHRcdCR0aW1lb3V0KCgpID0+e1xyXG4gICAgICAgXHRcdFx0XHRjb25zb2xlLmxvZyhzaG93RGVsZXRlVm9sdW1lLml0ZW0pO1xyXG4gICAgICAgXHRcdFx0XHR2YXIgc3Bpbm5lcjtcclxuXHRcdFx0XHRcdCQuYWpheCh7XHJcblx0XHRcdFx0XHRcdHR5cGU6IFwiUE9TVFwiLFxyXG5cdFx0XHRcdFx0XHR1cmw6IFwiL2phdmEvY29uc29sZS9hcGkvdm9sdW1lL2RlbGV0ZVwiLFxyXG5cdFx0XHRcdFx0XHR0aW1lb3V0OiA4MDAwLFxyXG5cdFx0XHRcdFx0XHRkYXRhVHlwZTogJ2pzb24nLFxyXG5cdFx0XHRcdFx0XHQvL2FzeW5jOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0ZGF0YTogSlNPTi5zdHJpbmdpZnkoc2hvd0RlbGV0ZVZvbHVtZS5pdGVtKSxcclxuXHRcdFx0XHRcdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxyXG5cdFx0XHRcdFx0XHRiZWZvcmVTZW5kOiAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0Q29uZmlncy5jcmVhdGVfbWFzaygpOyAgLy/liJvlu7rpga7nvanlsYJcclxuXHRcdFx0XHRcdFx0XHRLdWJlcm5ldGVzLmNyZWF0ZV9sb2NhZEVmZmVjdChcIuato+WcqOabtOaWsOS6keebmOS/oeaBryzor7fnqI3nrYnvvIFcIik7IC8v5Yib5bu65pWw5o2u5Yqg6L295pWI5p6c5bGCXHJcblx0XHQgICAgICAgICAgICAgIFx0XHR2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmcnKVxyXG5cdFx0ICAgICAgICAgICAgICBcdFx0c3Bpbm5lciA9IG5ldyBTcGlubmVyKEt1YmVybmV0ZXMubG9hZENvbmZpZ3MoKSkuc3Bpbih0YXJnZXQpOyAgICAgICBcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdGNvbXBsZXRlOiAoWE1MSHR0cFJlcXVlc3QsIHRleHRTdGF0dXMpID0+IHtcdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRcdGlmKFhNTEh0dHBSZXF1ZXN0LnN0YXR1cyA9PSAyMDApe1x0XHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0XHRcdEt1YmVybmV0ZXMuY3JlYXRlU3VjY2Vzc0luZm8oXCJzdWNjZXNzXCIsIFwi5pu05paw5oiQ5Yqf77yBXCIpO1x0XHRcdFx0XHQgIFx0XHJcblx0XHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0KFwiS3ViZXJuZXRlcy5yZW1vdmVNYXNrKClcIiwgMTUwMCk7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyRzY29wZS5tb2RlbC51cGRhdGVWb2x1bWVEYXRhKCk7XHJcblx0XHRcdFx0XHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0XHRcdFx0XHRLdWJlcm5ldGVzLmNyZWF0ZVN1Y2Nlc3NJbmZvKFwiZXJyb3JcIiwgXCLmm7TmlrDlpLHotKXvvIFcIik7XHJcblx0XHQgICAgICAgICAgICAgICAgXHRcdHNldFRpbWVvdXQoXCJLdWJlcm5ldGVzLnJlbW92ZU1hc2soKVwiLCAxNTAwKTsgXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRzdWNjZXNzOiAoZGF0YSkgPT4ge1x0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0aWYoZGF0YSl7XHJcblx0XHRcdFx0XHRcdFx0XHRDb25maWdzTW9kZWwuY2x1c3RlciA9IGRhdGE7XHJcblx0XHRcdFx0XHRcdFx0XHRDb25maWdzLmZvcm1hdFZvbHVtZXMoQ29uZmlnc01vZGVsLmNsdXN0ZXIpO1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0XHQkc2NvcGUuJGFwcGx5KCgpID0+e1x0XHRcdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQkc2NvcGUudm9sdW1lcyA9IENvbmZpZ3NNb2RlbC5jbHVzdGVyO1x0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcdFx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0fVx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdCBcdFx0XHR9KTtcdFxyXG4gICAgICAgXHRcdFx0XHQvKiRodHRwKHtcclxuXHRcdFx0XHRcdFx0dXJsOiBcIi9qYXZhL2NvbnNvbGUvYXBpL3ZvbHVtZS9kZWxldGVcIixcclxuXHRcdFx0XHRcdFx0bWV0aG9kOiAnUE9TVCcsXHJcblx0XHRcdFx0XHRcdGRhdGE6IHNob3dEZWxldGVWb2x1bWUuaXRlbVxyXG5cdFx0XHRcdFx0fSkuc3VjY2VzcyhmdW5jdGlvbihkYXRhLGhlYWRlcixjb25maWcsc3RhdHVzKXtcclxuXHRcdFx0XHRcdFx0LypcclxuXHRcdFx0XHRcdFx0XHTmm7TmlrB2b2x1bWXkv6Hmga9cclxuXHRcdFx0XHRcdFx0Ki9cclxuXHRcdFx0XHRcdFx0Lyokc2NvcGUubW9kZWwudXBkYXRlVm9sdW1lRGF0YSgpO1x0XHRcdFx0XHJcbiAgICAgICAgICAgIFx0XHR9KS5lcnJvcihmdW5jdGlvbihkYXRhLGhlYWRlcixjb25maWcsc3RhdHVzKXtcclxuICAgICAgICAgICAgXHRcdFx0Q29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuWIoOmZpFZvbHVtZeWksei0pe+8gVwiLCAnJyxudWxsLCAwLCBcImVycm9yXCIpOyAgICAgICAgICAgIFxyXG4gICAgICAgICAgIFx0XHRcdCB9KTsqL1x0XHRcclxuICAgICAgIFx0XHRcdH0sIDEwMCk7XHJcbiAgICAgICBcdFx0fSxcclxuICAgICAgIFx0XHRvbkNhbmNlbDogKCkgPT57XHJcbiAgICAgICBcdFx0XHR2YXIgc2hvd0RlbGV0ZVZvbHVtZSA9ICRzY29wZS5zaG93RGVsZXRlVm9sdW1lO1xyXG4gICAgICAgICBcdFx0c2hvd0RlbGV0ZVZvbHVtZS5zaG93ID0gZmFsc2U7XHJcbiAgICAgICAgIFx0XHRzaG93RGVsZXRlVm9sdW1lLml0ZW0gPSBudWxsO1xyXG4gICAgICAgXHRcdH1cclxuXHQgICAgfVxyXG5cclxuXHQgICAgJHNjb3BlLiRvbigndXBkYXRlJywgKGV2ZW50LCBkYXRhKSA9PiB7XHQgICAgXHRcclxuXHQgICAgXHRhbmd1bGFyLmZvckVhY2goZGF0YVtcImJyaWNrXCJdLCAoYnJpY2spID0+e1xyXG5cdFx0XHRcdHZhciBpcCA9IFtdO1xyXG5cdFx0XHRcdGlmKGJyaWNrW1wiaXBcIl0gaW5zdGFuY2VvZiBPYmplY3Qpe1xyXG5cdFx0XHRcdFx0Zm9yKHZhciBrZXkgaW4gYnJpY2tbXCJpcFwiXSlcclxuXHRcdFx0XHRcdFx0aXAucHVzaChicmlja1tcImlwXCJdW2tleV0pO1xyXG5cdFx0XHRcdFx0YnJpY2tbXCJpcFwiXSA9IGlwLmpvaW4oXCJcXC5cIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcdFxyXG5cclxuXHRcdFx0dmFyIHNwaW5uZXI7XHJcblxyXG5cdFx0XHQkLmFqYXgoe1xyXG5cdFx0XHRcdHR5cGU6IFwiUE9TVFwiLFxyXG5cdFx0XHRcdHVybDogXCIvamF2YS9jb25zb2xlL2FwaS92b2x1bWUvdXBkYXRlXCIsXHJcblx0XHRcdFx0dGltZW91dDogMTUwMDAsXHJcblx0XHRcdFx0ZGF0YVR5cGU6ICdqc29uJyxcclxuXHRcdFx0XHQvL2FzeW5jOiBmYWxzZSxcclxuXHRcdFx0XHRkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcclxuXHRcdFx0XHRjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsXHJcblx0XHRcdFx0YmVmb3JlU2VuZDogKCkgPT4ge1xyXG5cdFx0XHRcdFx0Q29uZmlncy5jcmVhdGVfbWFzaygpOyAgLy/liJvlu7rpga7nvanlsYJcclxuXHRcdFx0XHRcdEt1YmVybmV0ZXMuY3JlYXRlX2xvY2FkRWZmZWN0KFwi5q2j5Zyo5pu05paw5LqR55uY5L+h5oGvLOivt+eojeetie+8gVwiKTsgLy/liJvlu7rmlbDmja7liqDovb3mlYjmnpzlsYJcclxuICAgICAgICAgICAgICBcdFx0dmFyIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkaW5nJylcclxuICAgICAgICAgICAgICBcdFx0c3Bpbm5lciA9IG5ldyBTcGlubmVyKEt1YmVybmV0ZXMubG9hZENvbmZpZ3MoKSkuc3Bpbih0YXJnZXQpOyAgICAgICBcdFx0XHRcdFx0XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRjb21wbGV0ZTogKFhNTEh0dHBSZXF1ZXN0LCB0ZXh0U3RhdHVzKSA9PiB7XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0aWYoWE1MSHR0cFJlcXVlc3Quc3RhdHVzID09IDIwMCl7XHJcblx0XHRcdFx0XHRcdEt1YmVybmV0ZXMuY3JlYXRlU3VjY2Vzc0luZm8oXCJzdWNjZXNzXCIsIFwi5pu05paw5oiQ5Yqf77yBXCIpO1x0XHRcdFx0XHQgIFx0XHJcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoXCJLdWJlcm5ldGVzLnJlbW92ZU1hc2soKVwiLCAxNTAwKTtcclxuXHRcdFx0XHRcdFx0Ly8kc2NvcGUubW9kZWwudXBkYXRlVm9sdW1lRGF0YSgpO1xyXG5cdFx0XHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0XHRcdEt1YmVybmV0ZXMuY3JlYXRlU3VjY2Vzc0luZm8oXCJlcnJvclwiLCBcIuabtOaWsOWksei0pe+8gVwiKTtcclxuICAgICAgICAgICAgICAgIFx0XHRzZXRUaW1lb3V0KFwiS3ViZXJuZXRlcy5yZW1vdmVNYXNrKClcIiwgMTUwMCk7IFxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0c3VjY2VzczogKGRhdGEpID0+IHtcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRpZihkYXRhKXtcclxuXHRcdFx0XHRcdFx0Q29uZmlnc01vZGVsLmNsdXN0ZXIgPSBkYXRhO1xyXG5cdFx0XHRcdFx0XHRDb25maWdzLmZvcm1hdFZvbHVtZXMoQ29uZmlnc01vZGVsLmNsdXN0ZXIpO1x0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHQkc2NvcGUuJGFwcGx5KCgpID0+e1x0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRcdCRzY29wZS52b2x1bWVzID0gQ29uZmlnc01vZGVsLmNsdXN0ZXI7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHR9KTtcdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0fVx0XHRcdFx0XHRcclxuXHRcdFx0XHR9XHJcbiBcdFx0XHR9KTtcdFx0XHJcblx0XHRcdFxyXG5cdFx0XHQvKiRodHRwKHtcclxuXHRcdFx0XHR1cmw6IFwiL2phdmEvY29uc29sZS9hcGkvdm9sdW1lL3VwZGF0ZVwiLFxyXG5cdFx0XHRcdG1ldGhvZDogJ1BPU1QnLFxyXG5cdFx0XHRcdGRhdGE6IGRhdGFcclxuXHRcdFx0fSkuc3VjY2VzcyhmdW5jdGlvbihkYXRhLGhlYWRlcixjb25maWcsc3RhdHVzKXtcclxuXHRcdFx0XHQkc2NvcGUubW9kZWwudXBkYXRlVm9sdW1lRGF0YSgpO1x0XHRcdFx0XHJcbiAgICAgICAgICAgIH0pLmVycm9yKGZ1bmN0aW9uKGRhdGEsaGVhZGVyLGNvbmZpZyxzdGF0dXMpe1x0XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9KTsqL1xyXG5cdCAgICB9KTtcclxuXHR9XSk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJjb25maWdQbHVnaW4udHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJjb25maWdzSGVscGVyLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiY29uZmlnc1V0aWxzLnRzXCIvPlxyXG5cclxubW9kdWxlIENvbmZpZ3N7XHJcblxyXG5cdGV4cG9ydCB2YXIgS3ViZUNvbnRyb2xsZXIgPSBjb250cm9sbGVyKCdLdWJlQ29udHJvbGxlcicsIFtcIiRzY29wZVwiLCBcIiR0ZW1wbGF0ZUNhY2hlXCIsIFwiJGxvY2F0aW9uXCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwiJGh0dHBcIiwgXCIkdGltZW91dFwiLFwiQ29uZmlnc01vZGVsXCIsXHJcblx0XHQoJHNjb3BlLCAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRsb2NhdGlvbiwgJHJvdXRlUGFyYW1zLCAkaHR0cCwgJHRpbWVvdXQsIENvbmZpZ3NNb2RlbCkgPT4ge1xyXG5cdFx0JHNjb3BlLm1vZGVsPSBDb25maWdzTW9kZWw7IFxyXG4gICAgICAgICRzY29wZS5tb2RlbC51cGRhdGVPcmFjbGVQYXJhbSgpO1xyXG4gICAgICAgICRzY29wZS5zdWJtaXR0ZWQgPSBmYWxzZTsgICAgICAgXHJcblxyXG5cdFx0JHNjb3BlLnRhYmxlQ29uZmlnPXtcclxuICAgICAgICAgICAgZGF0YTogJ21vZGVsLm9yYWNsZVBhcmFtJyxcclxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtczogW10sXHJcbiAgICAgICAgICAgIGNvbHVtbkRlZnM6IFt7XHJcbiAgICAgICAgICAgICAgICBmaWVsZDogXCJuYW1lXCIsXHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogXCLlkI3np7BcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmaWVsZDogXCJpcFwiLFxyXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IFwiSVBcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgIFx0ZmllbGQ6IFwicG9ydFwiLFxyXG4gICAgICAgICAgICBcdGRpc3BsYXlOYW1lOiBcIuerr+WPo+WPt1wiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgXHRmaWVsZDogXCJ1c2VyXCIsXHJcbiAgICAgICAgICAgIFx0ZGlzcGxheU5hbWU6IFwi55So5oi35ZCNXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICBcdGZpZWxkOiBcInBhc3N3b3JkXCIsXHJcbiAgICAgICAgICAgIFx0ZGlzcGxheU5hbWU6IFwi5a+G56CBXCIgICAgICAgICAgICBcdFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgIFx0ZmllbGQ6IFwiZGF0YWJhc2VOYW1lXCIsXHJcbiAgICAgICAgICAgIFx0ZGlzcGxheU5hbWU6IFwi5pyN5Yqh5ZCNXCIgICAgICAgICAgICAgXHRcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZmllbGQ6IFwidGFibGVOYW1lXCIsXHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogXCLooajnqbrpl7TlkI1cIiAgXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZpZWxkOiBcInN1ZmZpeFwiLFxyXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IFwi6KGo5ZCO57yAXCIgIFxyXG4gICAgICAgICAgICB9LCBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZmllbGQ6IFwidHlwZVwiLFxyXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IFwi5qCH5YeG6KGo5rGH5oC75bqTXCIsXHJcbiAgICAgICAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcInN0cmFuZENvbHVtbi5odG1sXCIpICBcclxuICAgICAgICAgICAgfSwgICAgICAgICAgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgXHRmaWVsZDogXCJlbnRpdHlcIixcclxuICAgICAgICAgICAgXHRkaXNwbGF5TmFtZTogXCLmk43kvZxcIiwgIFxyXG4gICAgICAgICAgICBcdGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwidGFibGVFZGl0Lmh0bWxcIikgICAgICAgICAgIFx0XHJcbiAgICAgICAgICAgIH1dLFxyXG4gICAgICAgICAgICBlbmFibGVSb3dDbGlja1NlbGVjdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICAgIHNob3dTZWxlY3Rpb25DaGVja2JveDogZmFsc2UsXHJcbiAgICAgICAgICAgIG11bHRpU2VsZWN0OiBmYWxzZSxcclxuICAgICAgICAgICAgc29ydEluZm86IHtcclxuICAgICAgICAgICAgICAgIHNvcnRCeTogXCJuYW1lXCIsXHJcbiAgICAgICAgICAgICAgICBhc2NlbmRpbmc6IHRydWVcclxuICAgICAgICAgICAgfSAgICAgICBcclxuICAgICAgICB9ICAgICAgIFxyXG5cclxuICAgICAgICBzaGFyZUluaXQoJHNjb3BlLCAkbG9jYXRpb24sICRyb3V0ZVBhcmFtcyk7XHJcblxyXG4gICAgICAgICRzY29wZS5jcmVhdGUgPSAoKSA9PntcclxuICAgICAgICAgICAgJHNjb3BlLnN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAkc2NvcGUuYWRkPSB0cnVlO1xyXG4gICAgICAgICAgICAkc2NvcGUuZWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAkc2NvcGUudGFibGVGb3JtID0ge307ICBcclxuICAgICAgICAgICAgJHNjb3BlLnRhYmxlRm9ybVtcImlkXCJdPTA7IFxyXG4gICAgICAgICAgICAkc2NvcGUudGFibGVGb3JtW1widHlwZVwiXT0wOyAgICAgICAgIFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJHNjb3BlLmNhbmNlbCAgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICRzY29wZS50YWJsZUZvcm0gPW51bGw7XHJcbiAgICAgICAgICAgICRzY29wZS5hZGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgJHNjb3BlLmVkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgJHNjb3BlLnN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJHNjb3BlLm9uU3VibWl0ID0gKG9yYWNsZSkgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYoJHNjb3BlLnZhbGlkRm9ybS4kdmFsaWQgJiYgJHNjb3BlLnZhbGlkRm9ybS4kZGlydHkpe1xyXG4gICAgICAgICAgICAgICAgJHNjb3BlLmVkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICRzY29wZS5hZGQgPSBmYWxzZTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBvcmFjbGVJbmZvT3BlcmF0ZSgkaHR0cCwgXCIvamF2YS9jb25zb2xlL2FwaS9vcmFjbGVcIiwgT3BlcmF0ZVR5cGUuVVBEQVRFLCBvcmFjbGUsIChyZXN1bHQsIHN0YXR1cykgPT4geyAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cz09PTIwMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5tb2RlbC51cGRhdGVPcmFjbGVQYXJhbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBcIui1hOa6kOivt+axguWksei0pVwiOyAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7IFxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICRzY29wZS5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9ICAgICAgICAgICBcclxuICAgICAgICB9IFxyXG5cclxuICAgICAgICAkc2NvcGUuJG9uKFwiZWRpdFJvd1wiLCAoZXZlbnQsIGRhdGEpID0+eyBcclxuICAgICAgICAgICAgJHNjb3BlLnN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAkc2NvcGUudGFibGVGb3JtID0gZGVlcENvcHkoZGF0YSk7ICAgICAgICAgIFxyXG4gICAgICAgICAgICAkc2NvcGUuZWRpdCA9IHRydWU7XHJcbiAgICAgICAgICAgICRzY29wZS5hZGQgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8kc2NvcGUucm93SWQgPSBkYXRhLmlkXHJcbiAgICAgICAgICAgIC8vY3JlYXRlTmV3T2JlamN0KCRzY29wZS50YWJsZUNvbmZpZy5jb2x1bW5EZWZzLCBkYXRhKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvL3JlbW92ZUVsZW1lbnRzQnlWYWx1ZSgkc2NvcGUudGFibGVGb3JtLCBbe2tleTogXCJuYW1lXCIsIHZhbHVlOiBcIuW6j+WPt1wifSx7a2V5OiBcIm5hbWVcIiwgdmFsdWU6IFwi6L+e5o6l54q25oCBXCJ9LHtrZXk6IFwibmFtZVwiLCB2YWx1ZTogXCLmk43kvZxcIn1dKTsgICAgICAgICAgICBcclxuICAgICAgICB9KSA7XHJcblxyXG4gICAgICAgICRzY29wZS4kb24oXCJkZWxldGVSb3dcIiwgKGV2ZW50LCBkYXRhKSA9PnsgICBcclxuICAgICAgICAgICAgb3JhY2xlSW5mb09wZXJhdGUoJGh0dHAsIFwiL2phdmEvY29uc29sZS9hcGkvb3JhY2xlXCIsIE9wZXJhdGVUeXBlLkRFTEVURSwgZGF0YSwgKHJlc3VsdCwgc3RhdHVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZihzdGF0dXM9PT0yMDApe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YeG5aSH5pu05pawXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5tb2RlbC51cGRhdGVPcmFjbGVQYXJhbSgpO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgXCLotYTmupDor7fmsYLlpLHotKVcIjsgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy9yZW1vdmVFbGVtZW50QnlWYWx1ZSgkc2NvcGUubW9kZWwsIGRhdGEuX2lkLCBcIl9pZFwiKTtcclxuICAgICAgICB9KTtcclxuXHR9XSk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4va3ViZXJuZXRlcy90cy9rdWJlcm5ldGVzSGVscGVycy50c1wiLz5cclxubW9kdWxlIERldmVsb3BlciB7XHJcblxyXG4gIGV4cG9ydCB2YXIgX21vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKHBsdWdpbk5hbWUsIFsnaGF3dGlvLWNvcmUnLCAnaGF3dGlvLXVpJywgJ3VpLmNvZGVtaXJyb3InLCAnbnZkMycsICd0cmVlQ29udHJvbCcsICduZ0RpYWxvZyddKTtcclxuICBleHBvcnQgdmFyIGNvbnRyb2xsZXIgPSBQbHVnaW5IZWxwZXJzLmNyZWF0ZUNvbnRyb2xsZXJGdW5jdGlvbihfbW9kdWxlLCBwbHVnaW5OYW1lKTtcclxuICBleHBvcnQgdmFyIHJvdXRlID0gUGx1Z2luSGVscGVycy5jcmVhdGVSb3V0aW5nRnVuY3Rpb24odGVtcGxhdGVQYXRoKTtcclxuXHJcbiAgX21vZHVsZS5jb25maWcoWyckcm91dGVQcm92aWRlcicsICgkcm91dGVQcm92aWRlcjpuZy5yb3V0ZS5JUm91dGVQcm92aWRlcikgPT4geyAgICAgICBcclxuICAgICRyb3V0ZVByb3ZpZGVyLndoZW4oY29udGV4dCwgcm91dGUoJ3dvcmtzcGFjZXMuaHRtbCcsIGZhbHNlKSlcclxuICAgICAgICAgICAgICAgICAgLndoZW4oXCIvZGF0YS1tYW5hZ2VyXCIsIHJvdXRlKCd3b3Jrc3BhY2VzLmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgICAgICAgICAgICAgIC53aGVuKFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnT3ZlcnZpZXcvOnR5cGUvZGF0YS10eXBlL2FsbCcpLCByb3V0ZSgnd29ya3NwYWNlcy5odG1sJywgZmFsc2UpKVxyXG4gICAgICAgICAgICAgICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ092ZXJ2aWV3Lzp0eXBlL2RhdGEtdHlwZS9maW5hbmNpYWwnKSwgcm91dGUoJ3dvcmtzcGFjZXMuaHRtbCcsIGZhbHNlKSlcclxuICAgICAgICAgICAgICAgICAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdPdmVydmlldy86dHlwZS9kYXRhLXR5cGUvc29jaWFsLXNlY3VyaXR5JyksIHJvdXRlKCd3b3Jrc3BhY2VzLmh0bWwnLCBmYWxzZSkpXHJcbiAgICAgICAgICAgICAgICAgICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ092ZXJ2aWV3L3Rhc2snKSwgcm91dGUoJ2ZpbGVNaWdyYXRpb25UYXNrLmh0bWwnLCBmYWxzZSkpICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgLm90aGVyd2lzZShjb250ZXh0KTsgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gIH1dKTsgIFxyXG5cclxuICBfbW9kdWxlLnJ1bihbJ3ZpZXdSZWdpc3RyeScsICdTZXJ2aWNlUmVnaXN0cnknLCAnSGF3dGlvTmF2JywgJ0t1YmVybmV0ZXNNb2RlbCcsICckdGVtcGxhdGVDYWNoZScsICh2aWV3UmVnaXN0cnksIFNlcnZpY2VSZWdpc3RyeSwgSGF3dGlvTmF2LCBLdWJlcm5ldGVzTW9kZWwsICR0ZW1wbGF0ZUNhY2hlKSA9PiB7XHJcbiAgICBsb2cuZGVidWcoXCJSdW5uaW5nXCIpOyAgIFxyXG4gICAgdmlld1JlZ2lzdHJ5Wyd3b3Jrc3BhY2VzJ10gPSBLdWJlcm5ldGVzLnRlbXBsYXRlUGF0aCArICdsYXlvdXRLdWJlcm5ldGVzLmh0bWwnO1xyXG4gICAgdmlld1JlZ2lzdHJ5WyduYW1lc3BhY2VzJ10gPSBLdWJlcm5ldGVzLnRlbXBsYXRlUGF0aCArICdsYXlvdXRLdWJlcm5ldGVzLmh0bWwnO1xyXG4gICAvLyB2aWV3UmVnaXN0cnlbJ3dvcmtzcGFjZXMnXSA9IENvbmZpZ3MudGVtcGxhdGVQYXRoICsgJ3NoYXJlTGF5b3V0Lmh0bWwnO1xyXG5cclxuICAgIHZhciBidWlsZGVyID0gSGF3dGlvTmF2LmJ1aWxkZXIoKTtcclxuXHJcbiAgICB2YXIgZG1hbmFnZXJUYWIgPSBidWlsZGVyLmlkKCdkbWFuYWdlcicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAucmFuaygyMDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAuaHJlZigoKSA9PiBjb250ZXh0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgLnRpdGxlKCgpID0+ICfmlbDmja7nrqHnkIYnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgLy8uaXNWYWxpZCgoKSA9PiAhQ29yZS5pc1JlbW90ZUNvbm5lY3Rpb24oKSkgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTtcclxuXHJcbiAgICBIYXd0aW9OYXYuYWRkKGRtYW5hZ2VyVGFiKTtcclxuICB9XSk7XHJcblxyXG4gIF9tb2R1bGUuZmlsdGVyKCdhc1RydXN0ZWRIdG1sJywgWyckc2NlJywgZnVuY3Rpb24gKCRzY2UpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGV4dCkge1xyXG4gICAgICByZXR1cm4gJHNjZS50cnVzdEFzSHRtbCh0ZXh0KTtcclxuICAgIH07XHJcbiAgfV0pO1xyXG5cclxuICBoYXd0aW9QbHVnaW5Mb2FkZXIuYWRkTW9kdWxlKHBsdWdpbk5hbWUpO1xyXG5cclxuICAvLyBmb3Igc2Nyb2xsLWdsdWUgZGlyZWN0aXZlXHJcbiAgaGF3dGlvUGx1Z2luTG9hZGVyLmFkZE1vZHVsZSgnbHVlZ2cuZGlyZWN0aXZlcycpO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRldmVsb3BlclBsdWdpbi50c1wiLz5cclxubW9kdWxlIERldmVsb3BlcntcclxuXHRleHBvcnQgY2xhc3MgT3B0aW9uc1BhcmFtc3tcclxuXHRcdHB1YmxpYyBwYWdlclNpemVPcHRpb24gPSBbMjAsNTAsMTAwXTtcclxuXHRcdHB1YmxpYyBkYXRhVHlwZSA9bnVsbDtcclxuXHRcdHB1YmxpYyBjdXJyZW50VGFibGVTaXplID0gMjA7XHJcblx0XHRwdWJsaWMgZGF0YUJhdGNoID0gbnVsbDtcclxuXHRcdHB1YmxpYyBsYWJlbHMgPSB7fTtcclxuXHRcdHB1YmxpYyBjdXJyZW50UGFnZU51bSA9IDE7XHRcdFxyXG5cdFx0cHVibGljIHRvdGFsU2l6ZSA9IG51bGw7XHJcblx0XHRwdWJsaWMgcHJpb3JUYWJsZVNpemUgPSAyMDtcdFxyXG5cdFx0cHVibGljIGtleVF1ZXJ5ID0gbnVsbDtcclxuXHRcdHB1YmxpYyB2b2x1bWVUeXBlID0gMTtcdFxyXG5cclxuXHRcdHB1YmxpYyBjcmVhdGVQYXJhbURhdGEoKXtcclxuXHRcdFx0dmFyIGV4dGVuZFZhbHVlID1bXCJjaXR5TmFtZVwiLCBcImRpc3RyaWN0TmFtZVwiLCBcImRhdGFWZXJzaW9uXCIsIFwic3lzdGVtTmFtZVwiLCBcImRhdGFZZWFyXCJdO1xyXG5cdFx0XHR2YXIgcmVzdWx0PXtcclxuXHRcdFx0XHRjdXJyZW50UGFnZU51bTogdGhpcy5jdXJyZW50UGFnZU51bSxcclxuXHRcdFx0XHRkYXRhVHlwZTogdGhpcy5kYXRhVHlwZSxcclxuXHRcdFx0XHRzdWJtaXR0ZWRCYXRjaDogdGhpcy5kYXRhQmF0Y2gsXHJcblx0XHRcdFx0bGltaXQ6IHRoaXMuY3VycmVudFRhYmxlU2l6ZSxcclxuXHRcdFx0XHRwcmlvclRhYmxlU2l6ZTogdGhpcy5wcmlvclRhYmxlU2l6ZSxcclxuXHRcdFx0XHRrZXlRdWVyeTogdGhpcy5rZXlRdWVyeSxcclxuXHRcdFx0XHR2b2x1bWVUeXBlOiB0aGlzLnZvbHVtZVR5cGVcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YW5ndWxhci5mb3JFYWNoKHRoaXMubGFiZWxzLCh2YWx1ZSwga2V5KSA9PntcclxuXHRcdFx0XHRpZihleHRlbmRWYWx1ZS5pbmRleE9mKGtleSkpXHJcblx0XHRcdFx0XHRyZXN1bHRba2V5XSA9IHZhbHVlO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0cHVibGljIGdldFBhZ2VTaXplTnVtKCl7XHRcdFx0XHJcblx0XHQgICAgdmFyIG51bSA9IE1hdGguY2VpbCh0aGlzLnRvdGFsU2l6ZS90aGlzLmN1cnJlbnRUYWJsZVNpemUpO1x0XHJcblx0XHQgICAgaWYobnVtIDwgdGhpcy5jdXJyZW50UGFnZU51bSlcdFx0ICAgIFx0XHJcblx0XHRcdCAgbnVtID0gIHRoaXMuY3VycmVudFBhZ2VOdW07XHRcdFx0XHJcblx0XHRcdHJldHVybiBudW07XHJcblx0XHR9XHJcblx0fVxyXG5cdGZ1bmN0aW9uIGNyZWF0ZUxhYmVsKGNpdHlOYW1lOnN0cmluZywgZGlzdHJpY3ROYW1lOnN0cmluZywgc3lzdGVtTmFtZTpzdHJpbmcsIHZlcnNpb246c3RyaW5nLCB5ZWFyOnN0cmluZyl7XHJcblx0XHRyZXR1cm57XHJcblx0XHRcdGNpdHlOYW1lOiBjaXR5TmFtZSxcclxuXHRcdFx0ZGlzdHJpY3ROYW1lOiBkaXN0cmljdE5hbWUsXHJcblx0XHRcdHN5c3RlbU5hbWU6IHN5c3RlbU5hbWUsXHJcblx0XHRcdHZlcnNpb246IFwi54mI5pysXCIrdmVyc2lvbixcclxuXHRcdFx0eWVhcjogeWVhclxyXG5cdFx0fVxyXG5cdH1cclxuXHRmdW5jdGlvbiBjcmVhdGVBbGlhcyhjaXR5TmFtZTpzdHJpbmcsICBkaXN0cmljdE5hbWU6c3RyaW5nLCBzeXN0ZW1OYW1lOnN0cmluZywgdmVyc2lvbjpzdHJpbmcsIHllYXI6c3RyaW5nKXtcclxuXHRcdHJldHVybiAgY2l0eU5hbWUgKyBcIl9cIiArIGRpc3RyaWN0TmFtZSArIFwiX1wiICsgc3lzdGVtTmFtZSArIFwiX1wiICsgeWVhciArIFwiX+eJiOacrFwiICsgdmVyc2lvbjtcclxuXHR9XHJcblx0ZnVuY3Rpb24gY3JlYXRlS2V5KHJlZ2lvbmFsaXNtQ29kZSwgc3lzdGVtSWQsIHZlcnNpb24pe1xyXG5cdFx0cmV0dXJuIHJlZ2lvbmFsaXNtQ29kZSArIFwiLVwiICsgc3lzdGVtSWQgKyBcIi1cIiArIHZlcnNpb247XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwb3B1bGF0ZUtleShpdGVtKXtcclxuXHRcdHZhciByZXN1bHQgPSBpdGVtO1xyXG5cdFx0cmVzdWx0W1wiX2tleVwiXSA9IGNyZWF0ZUtleShpdGVtLnJlZ2lvbmFsaXNtQ29kZSwgIGl0ZW0uc3lzdGVtQ29kZSwgaXRlbS5kYXRhVmVyc2lvbik7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gY3JlYXRlSXRlbXNBbGlhcyhpdGVtczogQXJyYXk8YW55Pil7XHJcblx0XHR2YXIgcmVzdWx0ID0gW107XHJcblx0XHRhbmd1bGFyLmZvckVhY2goaXRlbXMsIChpdGVtKSA9PiB7XHJcblx0XHRcdGl0ZW0uYWxpYXMgPSBjcmVhdGVBbGlhcyhpdGVtLmNpdHlOYW1lLCBpdGVtLmRpc3RyaWN0TmFtZSwgaXRlbS5zeXN0ZW1OYW1lLCBpdGVtLmRhdGFWZXJzaW9uLCBpdGVtLnllYXIpO1xyXG5cdFx0XHRyZXN1bHQucHVzaChpdGVtKTtcclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHBvcHVsYXRlTGFiZWwoaXRlbSl7XHJcblx0XHR2YXIgcmVzdWx0ID0gaXRlbVxyXG5cdFx0cmVzdWx0W1wibGFiZWxzXCJdID0gY3JlYXRlTGFiZWwoaXRlbS5jaXR5TmFtZSwgaXRlbS5kaXN0cmljdE5hbWUsIGl0ZW0uc3lzdGVtTmFtZSwgaXRlbS5kYXRhVmVyc2lvbiwgaXRlbS55ZWFyKTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwb3B1bGF0ZUxhYmVscyhpdGVtczpBcnJheTxhbnk+KXtcclxuXHRcdHZhciByZXN1bHQgPSBbXTtcclxuXHRcdGFuZ3VsYXIuZm9yRWFjaChpdGVtcywgKGl0ZW0pID0+IHtcdFx0XHRcclxuXHRcdFx0cmVzdWx0LnB1c2gocG9wdWxhdGVMYWJlbChpdGVtKSk7XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwb3B1bGF0ZUtleXMoaXRlbXM6QXJyYXk8YW55Pil7XHJcblx0XHR2YXIgcmVzdWx0ID1bXTtcclxuXHRcdGFuZ3VsYXIuZm9yRWFjaChpdGVtcywgKGl0ZW0pID0+e1xyXG5cdFx0XHRyZXN1bHQucHVzaChwb3B1bGF0ZUtleShpdGVtKSk7XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjcmVhdGVOYW1lKGNpdHlOYW1lLCBkaXN0cmljdE5hbWUpe1xyXG5cdFx0cmV0dXJuIGNpdHlOYW1lICsgXCItXCIgKyBkaXN0cmljdE5hbWU7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwb3B1bGF0ZU5hbWUoaXRlbSl7XHJcblx0XHR2YXIgcmVzdWx0ID0gaXRlbTtcclxuXHRcdHJlc3VsdFtcIm5hbWVcIl0gPSBjcmVhdGVOYW1lKGl0ZW0uY2l0eU5hbWUsIGl0ZW0uZGlzdHJpY3ROYW1lKTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwb3B1bGF0ZU5hbWVzKGl0ZW1zOkFycmF5PGFueT4pe1xyXG5cdFx0dmFyIHJlc3VsdCA9IFtdO1xyXG5cdFx0YW5ndWxhci5mb3JFYWNoKGl0ZW1zLCAoaXRlbSkgPT57XHRcdFx0XHJcblx0XHRcdHJlc3VsdC5wdXNoKHBvcHVsYXRlTmFtZShpdGVtKSk7XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjcmVhdGVQYXJhbURhdGEob3B0aW9uczogT3B0aW9uc1BhcmFtcyl7XHJcblx0XHRyZXR1cm4gb3B0aW9ucy5jcmVhdGVQYXJhbURhdGEoKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGZvcm1hdFRhc2soaXRlbXM6QXJyYXk8YW55Pil7XHJcblx0XHR2YXIgcmVzdWx0ID0gW107XHJcblx0XHRhbmd1bGFyLmZvckVhY2goaXRlbXMsIChpdGVtKSA9PiB7XHJcblx0XHRcdHZhciB0bXBfYmF0Y2g9XCJcIjtcclxuXHRcdFx0aWYoaXRlbS5zdWJtaXR0ZWRCYXRjaC5pbmRleE9mKFwi5om55qyhXCIpPT0tMSl7XHJcblx0XHRcdFx0dG1wX2JhdGNoPVwi5om55qyhXCIraXRlbS5zdWJtaXR0ZWRCYXRjaDtcclxuXHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0dG1wX2JhdGNoPWl0ZW0uc3VibWl0dGVkQmF0Y2g7XHJcblx0XHRcdH1cclxuXHRcdFx0cmVzdWx0LnB1c2goe1xyXG5cdFx0XHRcdGlkOiBpdGVtLmlkLFxyXG5cdFx0XHRcdF9rZXk6IGl0ZW0ucmVnaW9uYWxpc21Db2RlICsgXCItXCIgKyBpdGVtLnN5c3RlbUNvZGUgKyBcIi1cIiArIGl0ZW0uZGF0YVZlcnNpb24sXHJcblx0XHRcdFx0bmFtZTogaXRlbS5jaXR5TmFtZSsgXCItXCIgKyBpdGVtLmRpc3RyaWN0TmFtZSxcclxuXHRcdFx0XHRzeXN0ZW1OYW1lOiBpdGVtLnN5c3RlbU5hbWUsXHJcblx0XHRcdFx0c3RhdHVzOiBpdGVtLmNvbXBsZXRlU3RhdHVzLFxyXG5cdFx0XHRcdHByb2Nlc3M6IGl0ZW0ucmF0ZSxcclxuXHRcdFx0XHRmcm9tOiBpdGVtLmRhdGFQYXRoLFxyXG5cdFx0XHRcdHRvOiBpdGVtLmRzdFBhdGgsXHJcblx0XHRcdFx0bGFiZWxzOntcclxuXHRcdFx0XHRcdGRhdGFUeXBlOiBpdGVtLmRhdGFUeXBlLFxyXG5cdFx0XHRcdFx0YmF0Y2g6IHRtcF9iYXRjaCxcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRkYXRhVmVyc2lvbjogXCLniYjmnKxcIitpdGVtLmRhdGFWZXJzaW9uLFxyXG5cdFx0XHRcdFx0ZGF0YVllYXI6IGl0ZW0ueWVhclxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRleHBvcnQgY2xhc3MgRGF0YU1vZGVsU2VydmljZXtcclxuXHRcdHB1YmxpYyBkYXRhOkFycmF5PGFueT4gPSBbXTtcclxuXHRcdHB1YmxpYyBwYXJhbU9wdGlvbnM6IE9wdGlvbnNQYXJhbXMgPSBuZXcgT3B0aW9uc1BhcmFtcygpO1xyXG5cdFx0cHVibGljIHRyYW5zZmVyVGFza3M6IEFycmF5PGFueT4gPSBbXTtcclxuXHJcblx0XHRjb25zdHJ1Y3Rvcigpe1x0XHRcdFx0XHJcblx0XHRcdHRoaXMudXBkYXRlTW9kZWwoKTtcdFx0XHRcdFx0XHRcdFxyXG5cdFx0fVxyXG5cclxuXHRcdC8v5pu05paw5pWw5o2u5qih5Z6LXHJcblx0XHRwcm90ZWN0ZWQgZ2V0RGF0YU1vZGVsKHBhcmFtT3B0aW9ucyl7XHRcdFx0XHJcblx0XHRcdHZhciByZXN1bHQgO1xyXG5cdFx0XHQkLmFqYXgoeyBcclxuXHRcdFx0XHRhc3luYzogZmFsc2UsIFxyXG5cdFx0XHRcdHR5cGUgOiBcIlBPU1RcIixcclxuXHRcdFx0XHR1cmwgOiBcIi9qYXZhL2NvbnNvbGUvYXBpL2RhdGEuanNvblwiLCBcclxuXHRcdFx0XHRkYXRhVHlwZSA6ICdqc29uJyxcclxuXHRcdFx0XHRkYXRhOiBjcmVhdGVQYXJhbURhdGEocGFyYW1PcHRpb25zKSxcdFx0XHJcblx0XHRcdFx0c3VjY2VzcyA6IGZ1bmN0aW9uKGRhdGEpIHtcdFx0XHRcdFxyXG5cdFx0XHRcdFx0cmVzdWx0ID0gZGF0YS5kYXRhO1xyXG5cdFx0XHRcdFx0cGFyYW1PcHRpb25zLnRvdGFsU2l6ZT1kYXRhLmxlbmd0aDtcdFx0XHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHR9IFxyXG5cdFx0XHR9KTtcdFx0XHRcclxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcdFxyXG5cdFx0fVxyXG5cclxuXHRcdHB1YmxpYyBpbml0UGFyYW1PcHRpb25zKCl7XHJcblx0XHRcdHRoaXMucGFyYW1PcHRpb25zID0gbmV3IE9wdGlvbnNQYXJhbXMoKTtcclxuXHRcdH1cclxuXHJcblx0XHRwdWJsaWMgdXBkYXRlTW9kZWwoKXtcclxuXHRcdFx0dGhpcy5kYXRhID0gdGhpcy5nZXREYXRhTW9kZWwodGhpcy5wYXJhbU9wdGlvbnMpO1xyXG5cdFx0XHR0aGlzLm1heWJlRm9ybWF0KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly/moLzlvI/mlbDmja7mqKHlnovkuK3nmoTmr4/kuKrljZXmnaHorrDlvZVcclxuXHRcdHB1YmxpYyBtYXliZUZvcm1hdCgpe1xyXG5cdFx0XHR0aGlzLmRhdGEgPSBwb3B1bGF0ZUtleXModGhpcy5kYXRhKTtcclxuXHRcdFx0dGhpcy5kYXRhID0gcG9wdWxhdGVOYW1lcyh0aGlzLmRhdGEpO1xyXG5cdFx0XHR0aGlzLmRhdGEgID0gcG9wdWxhdGVMYWJlbHModGhpcy5kYXRhKTtcclxuXHRcdFx0dGhpcy5kYXRhID0gY3JlYXRlSXRlbXNBbGlhcyh0aGlzLmRhdGEpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8v5pu05paw55So5oi36YCJ5oup5Y+C5pWwXHJcblx0XHRwdWJsaWMgdXBkYXRlUGFyYW1PcHRpb24ob3B0aW9uOnN0cmluZywgdmFsdWU6YW55KXtcclxuXHRcdFx0dGhpcy5wYXJhbU9wdGlvbnNbb3B0aW9uXSA9IHZhbHVlO1xyXG5cdFx0fVx0XHJcblxyXG5cdFx0Ly/moLnmja5rZXnojrflj5bnlKjmiLfpgInmi6nlj4LmlbBcclxuXHRcdHB1YmxpYyBnZXRQYXJhbU9wdGlvbihrZXk6c3RyaW5nKXtcclxuXHRcdFx0cmV0dXJuIHRoaXMucGFyYW1PcHRpb25zW2tleV07XHJcblx0XHR9XHJcblxyXG5cdFx0cHVibGljIHN0YXJ0SW50ZXJ2YWxUYXNrKCRpbnRlcnZhbCwgJGh0dHApe1xyXG5cdFx0XHR2YXIgcmVzdWx0O1xyXG5cdFx0XHR2YXIgdGltZXIgPSAkaW50ZXJ2YWwoKCkgPT4ge1x0IFx0XHRcdFxyXG5cdFx0IFx0XHQkLmFqYXgoe1xyXG5cdFx0XHRcdFx0YXN5bmM6IGZhbHNlLFxyXG5cdFx0XHRcdFx0dHlwZSA6IFwiUE9TVFwiLFxyXG5cdFx0XHRcdFx0dXJsIDogXCIvamF2YS9jb25zb2xlL2FwaS90YXNrL3RyYW5zZmVyL2xpc3RcIixcclxuXHRcdFx0XHRcdHN1Y2Nlc3MgOiBmdW5jdGlvbihkYXRhKSB7IFxyXG5cdFx0XHRcdFx0ICAgIGlmKGRhdGEpe1x0XHRcdFxyXG5cdFx0XHRcdFx0XHQgICAgcmVzdWx0ID0gZGF0YTtcdFx0XHRcdFx0XHQgICBcdFx0XHRcdCAgIFxyXG5cdFx0XHRcdFx0XHR9XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHR9IFx0XHJcblx0XHRcdFx0fSk7XHRcdFx0XHRcclxuXHRcdFx0XHR0aGlzLnRyYW5zZmVyVGFza3MgPSBmb3JtYXRUYXNrKHJlc3VsdCk7XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFxyXG4gXHRcdCAgICB9LDE1MDApO1xyXG5cclxuIFx0XHQgICAgdGltZXIudGhlbigoKSA9PntcclxuIFx0XHQgICAgXHRjb25zb2xlLmxvZyhcIkRvbmUhXCIpO1xyXG4gXHRcdCAgICB9LCAoKSA9PntcclxuIFx0XHQgICAgXHRjb25zb2xlLmxvZyhcImVycm9yXCIpO1xyXG4gXHRcdCAgICB9LCAoKSA9PnsgXHRcdCAgICBcdFxyXG4gXHRcdCAgICBcdGNvbnNvbGUubG9nKFwi5q+P5qyh6YO95pu05pawXCIpOyBcdFx0ICAgIFx0XHJcbiBcdFx0ICAgIH0pO1xyXG5cdFx0fVx0XHJcblx0fVxyXG5cclxuXHQvL+WIm+W7uuaVsOaNruaooeWei+acjeWKoVxyXG4gXHRfbW9kdWxlLmZhY3RvcnkoXCJEYXRhTW9kZWxcIiwgWyckcm9vdFNjb3BlJywgJyRodHRwJywgJyRpbnRlcnZhbCcsICckbG9jYXRpb24nLCAnJHJlc291cmNlJywgKCRyb290U2NvcGUsICRodHRwLCAkaW50ZXJ2YWwsICRsb2NhdGlvbiwgJHJlc291cmNlKSA9PiB7XHJcbiBcdFx0dmFyICRzY29wZSA9IG5ldyBEYXRhTW9kZWxTZXJ2aWNlKCk7ICBcclxuIFx0XHQkc2NvcGUuc3RhcnRJbnRlcnZhbFRhc2soJGludGVydmFsLCAkaHR0cCk7IFx0XHRcclxuIFx0ICAgIHJldHVybiAkc2NvcGU7XHJcbiBcdH1dKTtcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxubW9kdWxlIERldmVsb3BlciB7XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBlbnJpY2hXb3Jrc3BhY2VzKHByb2plY3RzKSB7XHJcbiAgICBhbmd1bGFyLmZvckVhY2gocHJvamVjdHMsIChwcm9qZWN0KSA9PiB7XHJcbiAgICAgIGVucmljaFdvcmtzcGFjZShwcm9qZWN0KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHByb2plY3RzO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGVucmljaFdvcmtzcGFjZShidWlsZCkge1xyXG4gICAgaWYgKGJ1aWxkKSB7XHJcbiAgICAgIHZhciBuYW1lID0gS3ViZXJuZXRlcy5nZXROYW1lKGJ1aWxkKTtcclxuICAgICAgYnVpbGQuJG5hbWUgPSBuYW1lO1xyXG4gICAgICBidWlsZC4kc29ydE9yZGVyID0gMCAtIGJ1aWxkLm51bWJlcjtcclxuXHJcbiAgICAgIHZhciBuYW1lQXJyYXkgPSBuYW1lLnNwbGl0KFwiLVwiKTtcclxuICAgICAgdmFyIG5hbWVBcnJheUxlbmd0aCA9IG5hbWVBcnJheS5sZW5ndGg7XHJcbiAgICAgIGJ1aWxkLiRzaG9ydE5hbWUgPSAobmFtZUFycmF5TGVuZ3RoID4gNCkgPyBuYW1lQXJyYXkuc2xpY2UoMCwgbmFtZUFycmF5TGVuZ3RoIC0gNCkuam9pbihcIi1cIikgOiBuYW1lLnN1YnN0cmluZygwLCAzMCk7XHJcblxyXG4gICAgICB2YXIgbGFiZWxzID0gS3ViZXJuZXRlcy5nZXRMYWJlbHMoYnVpbGQpO1xyXG4gICAgICBidWlsZC4kY3JlYXRpb25EYXRlID0gYXNEYXRlKEt1YmVybmV0ZXMuZ2V0Q3JlYXRpb25UaW1lc3RhbXAoYnVpbGQpKTtcclxuICAgICAgYnVpbGQuJGxhYmVsc1RleHQgPSBLdWJlcm5ldGVzLmxhYmVsc1RvU3RyaW5nKGxhYmVscyk7XHJcblxyXG4gICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgIGJ1aWxkLiRwcm9qZWN0c0xpbmsgPSBVcmxIZWxwZXJzLmpvaW4oXCJ3b3Jrc3BhY2VzXCIsIG5hbWUpO1xyXG4gICAgICAgIGJ1aWxkLiRydW50aW1lTGluayA9IFVybEhlbHBlcnMuam9pbihcImt1YmVybmV0ZXMvbmFtZXNwYWNlL1wiLCBuYW1lLCBcIi9hcHBzXCIpO1xyXG4gICAgICAgIGJ1aWxkLiR2aWV3TGluayA9IGJ1aWxkLiRwcm9qZWN0c0xpbms7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBidWlsZDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBhc0RhdGUodmFsdWUpIHtcclxuICAgIHJldHVybiB2YWx1ZSA/IG5ldyBEYXRlKHZhbHVlKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZW5yaWNoSmVua2luc0pvYnMoam9ic0RhdGEsIHByb2plY3RJZCwgam9iTmFtZSkge1xyXG4gICAgaWYgKGpvYnNEYXRhKSB7XHJcbiAgICAgIGFuZ3VsYXIuZm9yRWFjaChqb2JzRGF0YS5qb2JzLCAoam9iKSA9PiB7XHJcbiAgICAgICAgZW5yaWNoSmVua2luc0pvYihqb2IsIHByb2plY3RJZCwgam9iTmFtZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGpvYnNEYXRhO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGVucmljaEplbmtpbnNKb2Ioam9iLCBwcm9qZWN0SWQsIGpvYk5hbWUpIHtcclxuICAgIGlmIChqb2IpIHtcclxuICAgICAgam9iTmFtZSA9IGpvYk5hbWUgfHwgam9iLm5hbWUgfHwgcHJvamVjdElkO1xyXG4gICAgICBqb2IuJGpvYklkID0gam9iTmFtZTtcclxuICAgICAgam9iLiRwcm9qZWN0ID0gcHJvamVjdElkIHx8IGpvYk5hbWU7XHJcbiAgICAgIHZhciBsYXN0QnVpbGQgPSBqb2IubGFzdEJ1aWxkO1xyXG4gICAgICB2YXIgbGFzdEJ1aWxkUmVzdWx0ID0gbGFzdEJ1aWxkID8gbGFzdEJ1aWxkLnJlc3VsdCA6IFwiTk9UX1NUQVJURURcIjtcclxuICAgICAgdmFyICRpY29uQ2xhc3MgPSBjcmVhdGVCdWlsZFN0YXR1c0ljb25DbGFzcyhsYXN0QnVpbGRSZXN1bHQpO1xyXG5cclxuICAgICAgam9iLiRsYXN0QnVpbGROdW1iZXIgPSBlbnJpY2hKZW5raW5zQnVpbGQoam9iLCBsYXN0QnVpbGQpO1xyXG4gICAgICBqb2IuJGxhc3RTdWNjZXNzZnVsQnVpbGROdW1iZXIgPSBlbnJpY2hKZW5raW5zQnVpbGQoam9iLCBqb2IubGFzdFN1Y2Nlc3NmdWxCdWlsZCk7XHJcbiAgICAgIGpvYi4kbGFzdEZhaWxlZGxCdWlsZE51bWJlciA9IGVucmljaEplbmtpbnNCdWlsZChqb2IsIGpvYi5sYXN0RmFpbGVkbEJ1aWxkKTtcclxuXHJcbiAgICAgIGlmIChsYXN0QnVpbGQpIHtcclxuICAgICAgICBqb2IuJGR1cmF0aW9uID0gbGFzdEJ1aWxkLmR1cmF0aW9uO1xyXG4gICAgICAgIGpvYi4kdGltZXN0YW1wID0gYXNEYXRlKGxhc3RCdWlsZC50aW1lc3RhbXApO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciBqb2JVcmwgPSAoam9iIHx8IHt9KS51cmw7XHJcbiAgICAgIGlmICgham9iVXJsIHx8ICFqb2JVcmwuc3RhcnRzV2l0aChcImh0dHBcIikpIHtcclxuICAgICAgICB2YXIgamVua2luc1VybCA9IGplbmtpbnNMaW5rKCk7XHJcbiAgICAgICAgaWYgKGplbmtpbnNVcmwpIHtcclxuICAgICAgICAgIGpvYlVybCA9IFVybEhlbHBlcnMuam9pbihqZW5raW5zVXJsLCBcImpvYlwiLCBqb2JOYW1lKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoam9iVXJsKSB7XHJcbiAgICAgICAgam9iLiRqb2JMaW5rID0gam9iVXJsO1xyXG4gICAgICAgIHZhciB3b3Jrc3BhY2VOYW1lID0gS3ViZXJuZXRlcy5jdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG4gICAgICAgIGpvYi4kcGlwZWxpbmVzTGluayA9IFVybEhlbHBlcnMuam9pbihcIi93b3Jrc3BhY2VzXCIsIHdvcmtzcGFjZU5hbWUsIFwicHJvamVjdHNcIiwgam9iLiRwcm9qZWN0LCBcImplbmtpbnNKb2JcIiwgam9iTmFtZSwgXCJwaXBlbGluZXNcIik7XHJcbiAgICAgICAgam9iLiRidWlsZHNMaW5rID0gVXJsSGVscGVycy5qb2luKFwiL3dvcmtzcGFjZXNcIiwgd29ya3NwYWNlTmFtZSwgXCJwcm9qZWN0c1wiLCBqb2IuJHByb2plY3QsIFwiamVua2luc0pvYlwiLCBqb2JOYW1lKTtcclxuICAgICAgfVxyXG4gICAgICBqb2IuJGljb25DbGFzcyA9ICRpY29uQ2xhc3M7XHJcblxyXG4gICAgICBhbmd1bGFyLmZvckVhY2goam9iLmJ1aWxkcywgKGJ1aWxkKSA9PiB7XHJcbiAgICAgICAgZW5yaWNoSmVua2luc0J1aWxkKGpvYiwgYnVpbGQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBqb2I7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQnVpbGRTdGF0dXNJY29uQ2xhc3MocmVzdWx0KSB7XHJcbiAgICB2YXIgJGljb25DbGFzcyA9IFwiZmEgZmEtc3Bpbm5lciBmYS1zcGluXCI7XHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIGlmIChyZXN1bHQgPT09IFwiRkFJTFVSRVwiIHx8IHJlc3VsdCA9PT0gXCJGQUlMRURcIikge1xyXG4gICAgICAgIC8vIFRPRE8gbm90IGF2YWlsYWJsZSB5ZXRcclxuICAgICAgICAkaWNvbkNsYXNzID0gXCJmYSBmYS1leGNsYW1hdGlvbi1jaXJjbGUgcmVkXCI7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBcIkFCT1JURURcIiB8fCByZXN1bHQgPT09IFwiSU5URVJVUFRFRFwiKSB7XHJcbiAgICAgICAgJGljb25DbGFzcyA9IFwiZmEgZmEtY2lyY2xlIGdyZXlcIjtcclxuICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IFwiU1VDQ0VTU1wiIHx8IHJlc3VsdCA9PT0gXCJDT01QTEVURVwiIHx8IHJlc3VsdCA9PT0gXCJDT01QTEVURURcIikge1xyXG4gICAgICAgICRpY29uQ2xhc3MgPSBcImZhIGZhLWNoZWNrLWNpcmNsZSBncmVlblwiO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gXCJOT1RfU1RBUlRFRFwiKSB7XHJcbiAgICAgICAgJGljb25DbGFzcyA9IFwiZmEgZmEtY2lyY2xlLXRoaW4gZ3JleVwiO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJGljb25DbGFzcztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdWlsZFN0YXR1c0JhY2tncm91bmRDbGFzcyhyZXN1bHQpIHtcclxuICAgIHZhciAkaWNvbkNsYXNzID0gXCJidWlsZC1wZW5kaW5nXCI7XHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIGlmIChyZXN1bHQgPT09IFwiRkFJTFVSRVwiIHx8IHJlc3VsdCA9PT0gXCJGQUlMRURcIikge1xyXG4gICAgICAgICRpY29uQ2xhc3MgPSBcImJ1aWxkLWZhaWxcIjtcclxuICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IFwiQUJPUlRFRFwiIHx8IHJlc3VsdCA9PT0gXCJJTlRFUlVQVEVEXCIpIHtcclxuICAgICAgICAkaWNvbkNsYXNzID0gXCJidWlsZC1hYm9ydGVkXCI7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBcIlNVQ0NFU1NcIiB8fCByZXN1bHQgPT09IFwiQ09NUExFVEVcIiB8fCByZXN1bHQgPT09IFwiQ09NUExFVEVEXCIpIHtcclxuICAgICAgICAkaWNvbkNsYXNzID0gXCJidWlsZC1zdWNjZXNzXCI7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBcIk5PVF9TVEFSVEVEXCIpIHtcclxuICAgICAgICAkaWNvbkNsYXNzID0gXCJidWlsZC1ub3Qtc3RhcnRlZFwiO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJGljb25DbGFzcztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBlbnJpY2hKZW5raW5zQnVpbGQoam9iLCBidWlsZCkge1xyXG4gICAgdmFyIG51bWJlciA9IG51bGw7XHJcbiAgICBpZiAoYnVpbGQpIHtcclxuICAgICAgYnVpbGQuJGR1cmF0aW9uID0gYnVpbGQuZHVyYXRpb247XHJcbiAgICAgIGJ1aWxkLiR0aW1lc3RhbXAgPSBhc0RhdGUoYnVpbGQudGltZXN0YW1wKTtcclxuICAgICAgdmFyIHByb2plY3RJZCA9IGpvYi4kcHJvamVjdDtcclxuICAgICAgdmFyIGpvYk5hbWUgPSBqb2IuJGpvYklkIHx8IHByb2plY3RJZDtcclxuICAgICAgdmFyIGJ1aWxkSWQgPSBidWlsZC5pZDtcclxuICAgICAgbnVtYmVyID0gYnVpbGQubnVtYmVyO1xyXG4gICAgICB2YXIgd29ya3NwYWNlTmFtZSA9IEt1YmVybmV0ZXMuY3VycmVudEt1YmVybmV0ZXNOYW1lc3BhY2UoKTtcclxuXHJcbiAgICAgIHZhciAkaWNvbkNsYXNzID0gY3JlYXRlQnVpbGRTdGF0dXNJY29uQ2xhc3MoYnVpbGQucmVzdWx0KTtcclxuICAgICAgdmFyIGpvYlVybCA9IChqb2IgfHwge30pLnVybDtcclxuICAgICAgaWYgKCFqb2JVcmwgfHwgIWpvYlVybC5zdGFydHNXaXRoKFwiaHR0cFwiKSkge1xyXG4gICAgICAgIHZhciBqZW5raW5zVXJsID0gamVua2luc0xpbmsoKTtcclxuICAgICAgICBpZiAoamVua2luc1VybCkge1xyXG4gICAgICAgICAgam9iVXJsID0gVXJsSGVscGVycy5qb2luKGplbmtpbnNVcmwsIFwiam9iXCIsIGpvYk5hbWUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChqb2JVcmwpIHtcclxuICAgICAgICBidWlsZC4kam9iTGluayA9IGpvYlVybDtcclxuICAgICAgICBpZiAoYnVpbGRJZCkge1xyXG4gICAgICAgICAgLy9idWlsZC4kbG9nc0xpbmsgPSBVcmxIZWxwZXJzLmpvaW4oYnVpbGQuJGJ1aWxkTGluaywgXCJjb25zb2xlXCIpO1xyXG4gICAgICAgICAgYnVpbGQuJGxvZ3NMaW5rID0gVXJsSGVscGVycy5qb2luKFwiL3dvcmtzcGFjZXNcIiwgd29ya3NwYWNlTmFtZSwgXCJwcm9qZWN0c1wiLCBwcm9qZWN0SWQsIFwiamVua2luc0pvYlwiLCBqb2JOYW1lLCBcImxvZ1wiLCBidWlsZElkKTtcclxuICAgICAgICAgIGJ1aWxkLiRwaXBlbGluZUxpbmsgPSBVcmxIZWxwZXJzLmpvaW4oXCIvd29ya3NwYWNlc1wiLCB3b3Jrc3BhY2VOYW1lLCBcInByb2plY3RzXCIsIHByb2plY3RJZCwgXCJqZW5raW5zSm9iXCIsIGpvYk5hbWUsIFwicGlwZWxpbmVcIiwgYnVpbGRJZCk7XHJcbiAgICAgICAgICBidWlsZC4kYnVpbGRzTGluayA9IFVybEhlbHBlcnMuam9pbihcIi93b3Jrc3BhY2VzXCIsIHdvcmtzcGFjZU5hbWUsIFwicHJvamVjdHNcIiwgcHJvamVjdElkLCBcImplbmtpbnNKb2JcIiwgam9iTmFtZSk7XHJcbiAgICAgICAgICAvL2J1aWxkLiRidWlsZExpbmsgPSBVcmxIZWxwZXJzLmpvaW4oam9iVXJsLCBidWlsZC5pZCk7XHJcbiAgICAgICAgICBidWlsZC4kYnVpbGRMaW5rID0gYnVpbGQuJGxvZ3NMaW5rO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBidWlsZC4kaWNvbkNsYXNzID0gJGljb25DbGFzcztcclxuICAgIH1cclxuICAgIHJldHVybiBudW1iZXI7XHJcbiAgfVxyXG5cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGplbmtpbnNMaW5rKCkge1xyXG4gICAgdmFyIFNlcnZpY2VSZWdpc3RyeSA9IEt1YmVybmV0ZXMuaW5qZWN0PGFueT4oXCJTZXJ2aWNlUmVnaXN0cnlcIik7XHJcbiAgICBpZiAoU2VydmljZVJlZ2lzdHJ5KSB7XHJcbiAgICAgIHJldHVybiBTZXJ2aWNlUmVnaXN0cnkuc2VydmljZUxpbmsoamVua2luc1NlcnZpY2VOYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGZvcmdlUmVhZHlMaW5rKCkge1xyXG4gICAgdmFyIFNlcnZpY2VSZWdpc3RyeSA9IEt1YmVybmV0ZXMuaW5qZWN0PGFueT4oXCJTZXJ2aWNlUmVnaXN0cnlcIik7XHJcbiAgICBpZiAoU2VydmljZVJlZ2lzdHJ5KSB7XHJcbiAgICAgIHJldHVybiBTZXJ2aWNlUmVnaXN0cnkuc2VydmljZVJlYWR5TGluayhLdWJlcm5ldGVzLmZhYnJpYzhGb3JnZVNlcnZpY2VOYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGVucmljaEplbmtpbnNQaXBlbGluZUpvYihqb2IsIHByb2plY3RJZCwgam9iSWQpIHtcclxuICAgIGlmIChqb2IpIHtcclxuICAgICAgam9iLiRwcm9qZWN0ID0gcHJvamVjdElkO1xyXG4gICAgICBqb2IuJGpvYklkID0gam9iSWQ7XHJcbiAgICAgIGFuZ3VsYXIuZm9yRWFjaChqb2IuYnVpbGRzLCAoYnVpbGQpID0+IHtcclxuICAgICAgICBlbnJpY2hKZW5raW5zU3RhZ2VzKGJ1aWxkLCBwcm9qZWN0SWQsIGpvYklkKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZW5yaWNoSmVua2luc1N0YWdlcyhidWlsZCwgcHJvamVjdElkLCBqb2JOYW1lKSB7XHJcbiAgICBpZiAoYnVpbGQpIHtcclxuICAgICAgYnVpbGQuJHByb2plY3QgPSBwcm9qZWN0SWQ7XHJcbiAgICAgIGJ1aWxkLiRqb2JJZCA9IGpvYk5hbWU7XHJcbiAgICAgIGJ1aWxkLiR0aW1lc3RhbXAgPSBhc0RhdGUoYnVpbGQudGltZUluTWlsbGlzKTtcclxuICAgICAgYnVpbGQuJGljb25DbGFzcyA9IGNyZWF0ZUJ1aWxkU3RhdHVzSWNvbkNsYXNzKGJ1aWxkLnJlc3VsdCB8fCBcIk5PVF9TVEFSVEVEXCIpO1xyXG5cclxuICAgICAgdmFyIHdvcmtzcGFjZU5hbWUgPSBLdWJlcm5ldGVzLmN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCk7XHJcbiAgICAgIHZhciBwYXJhbWV0ZXJzID0gYnVpbGQucGFyYW1ldGVycztcclxuICAgICAgdmFyICRwYXJhbWV0ZXJDb3VudCA9IDA7XHJcbiAgICAgIHZhciAkcGFyYW1ldGVyVGV4dCA9IFwiTm8gcGFyYW1ldGVyc1wiO1xyXG4gICAgICBpZiAocGFyYW1ldGVycykge1xyXG4gICAgICAgICRwYXJhbWV0ZXJDb3VudCA9IF8ua2V5cyhwYXJhbWV0ZXJzKS5sZW5ndGggfHwgMDtcclxuICAgICAgICAkcGFyYW1ldGVyVGV4dCA9IEt1YmVybmV0ZXMubGFiZWxzVG9TdHJpbmcocGFyYW1ldGVycywgXCIgXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIGJ1aWxkLiRwYXJhbWV0ZXJDb3VudCA9ICRwYXJhbWV0ZXJDb3VudDtcclxuICAgICAgYnVpbGQuJHBhcmFtZXRlclRleHQgPSAkcGFyYW1ldGVyVGV4dDtcclxuICAgICAgdmFyIGplbmtpbnNVcmwgPSBqZW5raW5zTGluaygpO1xyXG4gICAgICBpZiAoamVua2luc1VybCkge1xyXG4gICAgICAgIHZhciB1cmwgPSBidWlsZC51cmw7XHJcbiAgICAgICAgaWYgKHVybCkge1xyXG4vKlxyXG4gICAgICAgICAgYnVpbGQuJHZpZXdMaW5rID0gVXJsSGVscGVycy5qb2luKGplbmtpbnNVcmwsIHVybCk7XHJcbiAgICAgICAgICBidWlsZC4kbG9nTGluayA9IFVybEhlbHBlcnMuam9pbihidWlsZC4kdmlld0xpbmssIFwibG9nXCIpO1xyXG4qL1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBidWlsZC4kbG9nTGluayA9IFVybEhlbHBlcnMuam9pbihcIi93b3Jrc3BhY2VzXCIsIHdvcmtzcGFjZU5hbWUsIFwicHJvamVjdHNcIiwgcHJvamVjdElkLCBcImplbmtpbnNKb2JcIiwgam9iTmFtZSwgXCJsb2dcIiwgYnVpbGQuaWQpO1xyXG4gICAgICBidWlsZC4kdmlld0xpbmsgPSBidWlsZC4kbG9nTGluaztcclxuXHJcbiAgICAgIGFuZ3VsYXIuZm9yRWFjaChidWlsZC5zdGFnZXMsIChzdGFnZSkgPT4ge1xyXG4gICAgICAgIGVucmljaEplbmtpbnNTdGFnZShzdGFnZSwgYnVpbGQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBidWlsZDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBlbnJpY2hKZW5raW5zU3RhZ2Uoc3RhZ2UsIGJ1aWxkID0gbnVsbCkge1xyXG4gICAgaWYgKHN0YWdlKSB7XHJcbiAgICAgIGlmIChidWlsZCkge1xyXG4gICAgICAgIHN0YWdlLiRidWlsZElkID0gYnVpbGQuaWQ7XHJcbiAgICAgICAgc3RhZ2UuJHByb2plY3QgPSBidWlsZC4kcHJvamVjdDtcclxuICAgICAgfVxyXG4gICAgICB2YXIgcHJvamVjdElkID0gYnVpbGQuJHByb2plY3Q7XHJcbiAgICAgIHZhciBqb2JOYW1lID0gYnVpbGQuJGpvYklkIHx8IHByb2plY3RJZDtcclxuICAgICAgdmFyIGJ1aWxkSWQgPSBidWlsZC5pZDtcclxuICAgICAgdmFyIHdvcmtzcGFjZU5hbWUgPSBLdWJlcm5ldGVzLmN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCk7XHJcbiAgICAgIHN0YWdlLiRiYWNrZ3JvdW5kQ2xhc3MgPSAgY3JlYXRlQnVpbGRTdGF0dXNCYWNrZ3JvdW5kQ2xhc3Moc3RhZ2Uuc3RhdHVzKTtcclxuICAgICAgc3RhZ2UuJGljb25DbGFzcyA9IGNyZWF0ZUJ1aWxkU3RhdHVzSWNvbkNsYXNzKHN0YWdlLnN0YXR1cyk7XHJcbiAgICAgIHN0YWdlLiRzdGFydFRpbWUgPSBhc0RhdGUoc3RhZ2Uuc3RhcnRUaW1lKTtcclxuICAgICAgaWYgKCFzdGFnZS5kdXJhdGlvbikge1xyXG4gICAgICAgIHN0YWdlLmR1cmF0aW9uID0gMDtcclxuICAgICAgfVxyXG4gICAgICB2YXIgamVua2luc1VybCA9IGplbmtpbnNMaW5rKCk7XHJcbiAgICAgIGlmIChqZW5raW5zVXJsKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IHN0YWdlLnVybDtcclxuICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICBzdGFnZS4kdmlld0xpbmsgPSBVcmxIZWxwZXJzLmpvaW4oamVua2luc1VybCwgdXJsKTtcclxuICAgICAgICAgIHN0YWdlLiRsb2dMaW5rID0gVXJsSGVscGVycy5qb2luKHN0YWdlLiR2aWV3TGluaywgXCJsb2dcIik7XHJcbiAgICAgICAgICBpZiAocHJvamVjdElkICYmIGJ1aWxkSWQpIHtcclxuICAgICAgICAgICAgc3RhZ2UuJGxvZ0xpbmsgPSBVcmxIZWxwZXJzLmpvaW4oXCIvd29ya3NwYWNlc1wiLCB3b3Jrc3BhY2VOYW1lLCBcInByb2plY3RzXCIsIHByb2plY3RJZCwgXCJqZW5raW5zSm9iXCIsIGpvYk5hbWUsIFwibG9nXCIsIGJ1aWxkSWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVyUGx1Z2luLnRzXCIvPlxyXG5cclxubW9kdWxlIERldmVsb3BlciB7XHJcbiAgX21vZHVsZS5jb250cm9sbGVyKCdEZXZlbG9wZXIuRW52aXJvbm1lbnRQYW5lbENvbnRyb2xsZXInLCAoJHNjb3BlLCAkZWxlbWVudCwgJGxvY2F0aW9uLCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbDpLdWJlcm5ldGVzLkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UsICRodHRwLCAkdGltZW91dCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKSA9PiB7XHJcblxyXG4gICAgJHNjb3BlLmVudlZlcnNpb25zID0ge307XHJcbiAgICAkc2NvcGUubW9kZWwgPSBLdWJlcm5ldGVzTW9kZWw7XHJcbiAgICAkc2NvcGUuZW52ID0gJHNjb3BlLiRldmFsKCdlbnYnKTtcclxuICAgICRzY29wZS5idWlsZENvbmZpZyA9ICRzY29wZS4kZXZhbCgnZW50aXR5Jyk7XHJcblxyXG4gICAgJHNjb3BlLm9wZW4gPSB0cnVlO1xyXG5cclxuICAgICRzY29wZS50b2dnbGUgPSAoKSA9PiAkc2NvcGUub3BlbiA9ICEkc2NvcGUub3BlbjtcclxuXHJcbiAgICB2YXIgY2FjaGVzID0ge307XHJcblxyXG4gICAgS3ViZXJuZXRlcy5pbml0U2hhcmVkKCRzY29wZSwgJGxvY2F0aW9uLCAkaHR0cCwgJHRpbWVvdXQsICRyb3V0ZVBhcmFtcywgS3ViZXJuZXRlc01vZGVsLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNBcGlVUkwpO1xyXG5cclxuICAgIGxvYWRQcm9qZWN0VmVyc2lvbnMoJHNjb3BlLCAkZWxlbWVudCwgJHNjb3BlLmJ1aWxkQ29uZmlnLCAkc2NvcGUuZW52LCAkc2NvcGUuZW52Lm5hbWVzcGFjZSwgJHNjb3BlLmVudlZlcnNpb25zLCBjYWNoZXMpO1xyXG5cclxuICB9KTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJQbHVnaW4udHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkYXRhTWFuYWdlck1vZGVsLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGF0YU1hbmFnZXJIZWxwZXIudHNcIi8+XHJcbi8vLyAgPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vY29uZmlncy90cy9Db25maWdzSGVscGVyLnRzXCIvPlxyXG5tb2R1bGUgRGV2ZWxvcGVyIHtcclxuXHRleHBvcnQgdmFyIEt1YmVUYXNrQ29udHJvbGxlciA9IGNvbnRyb2xsZXIoXCJLdWJlVGFza0NvbnRyb2xsZXJcIiwgW1wiJHNjb3BlXCIsIFwiJGh0dHBcIiwgXCIkbG9jYXRpb25cIiwgXCIkcm91dGVQYXJhbXNcIiwgXCJEYXRhTW9kZWxcIiwgXCIkdGVtcGxhdGVDYWNoZVwiLCAoJHNjb3BlLCAkaHR0cCwgJGxvY2F0aW9uLCAkcm91dGVQYXJhbXMsIERhdGFNb2RlbCwgJHRlbXBsYXRlQ2FjaGUpID0+IHtcclxuXHRcdCRzY29wZS5tb2RlbCA9IERhdGFNb2RlbDtcdFxyXG4gICAgICAgICRzY29wZS5zdWJUYWJDb25maWcgPSBEZXZlbG9wZXIuY3JlYXRlQ3VycmVudFN1Yk5hdkJhcigkc2NvcGUsICRsb2NhdGlvbiwgJHJvdXRlUGFyYW1zKTsgXHRcdFxyXG5cclxuXHRcdCRzY29wZS50YWJsZUNvbmZpZyA9IHtcclxuXHRcdCAgXHRkYXRhOiAnbW9kZWwudHJhbnNmZXJUYXNrcycsICAgICBcclxuXHRcdFx0c2hvd1NlbGVjdGlvbkNoZWNrYm94OiBmYWxzZSxcclxuXHRcdFx0ZW5hYmxlUm93Q2xpY2tTZWxlY3Rpb246IGZhbHNlLFxyXG5cdFx0XHRtdWx0aVNlbGVjdDogdHJ1ZSwgICAgIFxyXG5cdFx0XHRzZWxlY3RlZEl0ZW1zOiBbXSwgICAgIFxyXG5cdFx0XHRmaWx0ZXJPcHRpb25zOiB7XHJcblx0XHRcdGZpbHRlclRleHQ6ICRsb2NhdGlvbi5zZWFyY2goKVtcInFcIl0gfHwgJydcclxuXHRcdFx0fSxcclxuXHRcdCBcdGNvbHVtbkRlZnM6IFt7XHJcblx0XHQgICAgICBcdGZpZWxkOiBcIl9rZXlcIixcclxuXHRcdCAgICAgIFx0ZGlzcGxheU5hbWU6ICfnvJbnoIEnLFxyXG5cdFx0ICAgICAgXHRjdXN0b21Tb3J0RmllbGQ6IChmaWVsZCkgPT57XHJcblx0XHQgICAgICAgIFx0cmV0dXJuIGZpZWxkLmlkOyAgICAgICAgICAgXHJcblx0XHQgICAgICBcdH0gICAgICAgICBcclxuXHRcdCAgICB9LFxyXG5cdFx0ICAgIHtcclxuXHRcdCAgICAgIFx0ZmllbGQ6IFwibmFtZVwiLFxyXG5cdFx0ICAgICAgXHRkaXNwbGF5TmFtZTogJ+W4gi3ljLov5Y6/JyAgICAgICBcclxuXHRcdCAgICB9LFxyXG5cdFx0ICAgIHsgXHJcblx0XHQgICAgICBcdGZpZWxkOiBcInN5c3RlbU5hbWVcIixcclxuXHRcdCAgICAgIFx0ZGlzcGxheU5hbWU6ICfns7vnu5/lkI3np7AnICAgICAgICAgXHJcblx0XHQgICAgfSxcclxuXHRcdCAgICB7XHJcblx0XHQgICAgICBcdGZpZWxkOiBcImxhYmVsc1wiLFxyXG5cdFx0ICAgICAgXHRkaXNwbGF5TmFtZTogJ+aVsOaNruagh+etvicsXHJcblx0XHQgICAgICBcdGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiZGF0YUxhYmVsc1RlbXBsYXRlLmh0bWxcIikgICAgICBcclxuXHRcdCAgICB9LCBcclxuXHRcdCAgICB7XHJcblx0XHQgICAgXHRmaWVsZDogXCJmcm9tXCIsXHJcblx0XHQgICAgICBcdGRpc3BsYXlOYW1lOiAn5rqQ6ZuG576kJyxcdFx0ICAgICAgXHRcclxuXHRcdCAgICB9LFxyXG5cdFx0ICAgIHtcclxuXHRcdCAgICBcdGZpZWxkOiBcInRvXCIsXHJcblx0XHQgICAgICBcdGRpc3BsYXlOYW1lOiAn55uu55qE6ZuG576kJyxcdFx0ICAgICAgXHRcclxuXHRcdCAgICB9LFxyXG5cdFx0ICAgIHtcclxuXHRcdCAgICBcdGZpZWxkOiBcInN0YXR1c1wiLFxyXG5cdFx0ICAgICAgXHRkaXNwbGF5TmFtZTogJ+i/geenu+eKtuaAgScsXHJcblx0XHQgICAgICBcdGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwidGFza1N0YXR1cy5odG1sXCIpICAgICBcclxuXHRcdCAgICB9LFxyXG5cdFx0ICAgIHtcclxuXHRcdCAgICBcdGZpZWxkOiBcInByb2Nlc3NcIixcclxuXHRcdCAgICAgIFx0ZGlzcGxheU5hbWU6ICfov4Hnp7vov5vluqYnLFxyXG5cdFx0ICAgICAgXHRjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcInRhc2tQcm9jZXNzLmh0bWxcIikgXHRcdCAgICAgIFx0ICAgICAgXHJcblx0XHQgICAgfSxcclxuXHRcdCAgICB7XHJcblx0XHQgICAgXHRmaWVsZDogXCJlbnRpdHlcIixcclxuXHRcdCAgICAgIFx0ZGlzcGxheU5hbWU6ICfmk43kvZwnLFxyXG5cdFx0ICAgICAgXHRjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcInRhc2tFZGl0Lmh0bWxcIikgIFx0XHQgICAgICBcdCAgICAgIFxyXG5cdFx0ICAgIH0gICAgICAgICAgIFxyXG5cdFx0XX07XHJcblxyXG5cclxuXHRcdCRzY29wZS4kb24oXCJkZWxldGVSb3dcIiwgKGV2ZW50LCBkYXRhKSA9PntcdFx0XHRcdFx0XHJcblx0XHRcdENvbmZpZ3Mub3JhY2xlSW5mb09wZXJhdGUoJGh0dHAsIFwiL2phdmEvY29uc29sZS9hcGkvdGFzay90cmFuc2ZlclwiLCBDb25maWdzLk9wZXJhdGVUeXBlLkRFTEVURSwgZGF0YSwgKGRhdGEsIHN0YXR1cykgPT57XHJcblx0XHRcdFx0aWYoc3RhdHVzID09PSAyMDApXHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhcIuWIoOmZpOaIkOWKn1wiKTtcclxuXHRcdFx0fSk7XHRcdFx0XHJcblx0XHR9KTtcdFx0XHJcblx0fV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2t1YmVybmV0ZXMvdHMva3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJFbnJpY2hlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVyTmF2aWdhdGlvbi50c1wiLz5cclxuXHJcbm1vZHVsZSBEZXZlbG9wZXIge1xyXG5cclxuICBleHBvcnQgdmFyIEhvbWVDb250cm9sbGVyID0gY29udHJvbGxlcihcIkhvbWVDb250cm9sbGVyXCIsXHJcbiAgICBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCJLdWJlcm5ldGVzU2NoZW1hXCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkbG9jYXRpb25cIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiS3ViZXJuZXRlc0FwaVVSTFwiLFxyXG4gICAgICAoJHNjb3BlLCBLdWJlcm5ldGVzTW9kZWw6S3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNTY2hlbWEsXHJcbiAgICAgICAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlLCAkcm91dGVQYXJhbXMsICRodHRwLCAkdGltZW91dCwgS3ViZXJuZXRlc0FwaVVSTCkgPT4ge1xyXG5cclxuICAgICAgICAkc2NvcGUubmFtZXNwYWNlID0gS3ViZXJuZXRlcy5jdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpO1xyXG5cclxuICAgICAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2t1YmVybmV0ZXMvdHMva3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJFbnJpY2hlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVyTmF2aWdhdGlvbi50c1wiLz5cclxuXHJcbm1vZHVsZSBEZXZlbG9wZXIge1xyXG5cclxuICBleHBvcnQgdmFyIEplbmtpbnNKb2JDb250cm9sbGVyID0gY29udHJvbGxlcihcIkplbmtpbnNKb2JDb250cm9sbGVyXCIsXHJcbiAgICBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCJLdWJlcm5ldGVzU2NoZW1hXCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkbG9jYXRpb25cIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiS3ViZXJuZXRlc0FwaVVSTFwiLCBcIlNlcnZpY2VSZWdpc3RyeVwiLFxyXG4gICAgICAoJHNjb3BlLCBLdWJlcm5ldGVzTW9kZWw6S3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNTY2hlbWEsXHJcbiAgICAgICAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlLCAkcm91dGVQYXJhbXMsICRodHRwLCAkdGltZW91dCwgS3ViZXJuZXRlc0FwaVVSTCwgU2VydmljZVJlZ2lzdHJ5KSA9PiB7XHJcblxyXG4gICAgICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG4gICAgICAgICRzY29wZS5tb2RlbCA9IEt1YmVybmV0ZXNNb2RlbDtcclxuICAgICAgICAkc2NvcGUuaWQgPSAkcm91dGVQYXJhbXNbXCJpZFwiXTtcclxuICAgICAgICAkc2NvcGUuam9iSWQgPSAkcm91dGVQYXJhbXNbXCJqb2JcIl07XHJcbiAgICAgICAgJHNjb3BlLnNjaGVtYSA9IEt1YmVybmV0ZXNTY2hlbWE7XHJcbiAgICAgICAgJHNjb3BlLmVudGl0eUNoYW5nZWRDYWNoZSA9IHt9O1xyXG5cclxuICAgICAgICBLdWJlcm5ldGVzLmluaXRTaGFyZWQoJHNjb3BlLCAkbG9jYXRpb24sICRodHRwLCAkdGltZW91dCwgJHJvdXRlUGFyYW1zLCBLdWJlcm5ldGVzTW9kZWwsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc0FwaVVSTCk7XHJcbiAgICAgICAgJHNjb3BlLmJyZWFkY3J1bWJDb25maWcgPSBEZXZlbG9wZXIuY3JlYXRlUHJvamVjdEJyZWFkY3J1bWJzKCRzY29wZS5pZCk7XHJcbiAgICAgICAgJHNjb3BlLnN1YlRhYkNvbmZpZyA9IERldmVsb3Blci5jcmVhdGVQcm9qZWN0U3ViTmF2QmFycygkc2NvcGUuaWQsICRzY29wZS5qb2JJZCk7XHJcblxyXG4gICAgICAgICRzY29wZS4kb24oJ2t1YmVybmV0ZXNNb2RlbFVwZGF0ZWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICRzY29wZS4kb24oJyRyb3V0ZVVwZGF0ZScsICgkZXZlbnQpID0+IHtcclxuICAgICAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJHNjb3BlLnRhYmxlQ29uZmlnID0ge1xyXG4gICAgICAgICAgZGF0YTogJ2pvYi5idWlsZHMnLFxyXG4gICAgICAgICAgc2hvd1NlbGVjdGlvbkNoZWNrYm94OiB0cnVlLFxyXG4gICAgICAgICAgZW5hYmxlUm93Q2xpY2tTZWxlY3Rpb246IGZhbHNlLFxyXG4gICAgICAgICAgbXVsdGlTZWxlY3Q6IHRydWUsXHJcbiAgICAgICAgICBzZWxlY3RlZEl0ZW1zOiBbXSxcclxuICAgICAgICAgIGZpbHRlck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgZmlsdGVyVGV4dDogJGxvY2F0aW9uLnNlYXJjaCgpW1wicVwiXSB8fCAnJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGNvbHVtbkRlZnM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGZpZWxkOiAnJHNvcnRPcmRlcicsXHJcbiAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdOYW1lJyxcclxuICAgICAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcImplbmtpbnNCdWlsZElkVGVtcGxhdGUuaHRtbFwiKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZmllbGQ6ICckYnVpbGRMaW5rJyxcclxuICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1ZpZXdzJyxcclxuICAgICAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcImplbmtpbnNCdWlsZEJ1dHRvbnNUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBmaWVsZDogJyRkdXJhdGlvbicsXHJcbiAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdEdXJhdGlvbicsXHJcbiAgICAgICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJqZW5raW5zQnVpbGREdXJhdGlvblRlbXBsYXRlLmh0bWxcIilcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGZpZWxkOiAnJHRpbWVzdGFtcCcsXHJcbiAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdUaW1lIFN0YXJ0ZWQnLFxyXG4gICAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiamVua2luc0J1aWxkVGltZXN0YW1wVGVtcGxhdGUuaHRtbFwiKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfTtcclxuICAgICAgICB1cGRhdGVEYXRhKCk7XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVEYXRhKCkge1xyXG4gICAgICAgICAgaWYgKCRzY29wZS5qb2JJZCkge1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gS3ViZXJuZXRlcy5rdWJlcm5ldGVzUHJveHlVcmxGb3JTZXJ2aWNlQ3VycmVudE5hbWVzcGFjZShqZW5raW5zU2VydmljZU5hbWVBbmRQb3J0LCBVcmxIZWxwZXJzLmpvaW4oXCJqb2JcIiwgJHNjb3BlLmpvYklkLCBcImFwaS9qc29uP2RlcHRoPTFcIikpO1xyXG4gICAgICAgICAgICBpZiAodXJsICYmICghJHNjb3BlLmpvYiB8fCBLdWJlcm5ldGVzLmtlZXBQb2xsaW5nTW9kZWwpKSB7XHJcbiAgICAgICAgICAgICAgJGh0dHAuZ2V0KHVybCkuXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVucmljaEplbmtpbnNKb2IoZGF0YSwgJHNjb3BlLmlkLCAkc2NvcGUuam9iSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNPYmplY3RDaGFuZ2VkKGRhdGEsICRzY29wZS5lbnRpdHlDaGFuZ2VkQ2FjaGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhcImVudGl0eSBoYXMgY2hhbmdlZCFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuam9iID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgJHNjb3BlLm1vZGVsLmZldGNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgICAgICAgICAgfSkuXHJcbiAgICAgICAgICAgICAgICBlcnJvcihmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgbG9nLndhcm4oXCJGYWlsZWQgdG8gbG9hZCBcIiArIHVybCArIFwiIFwiICsgZGF0YSArIFwiIFwiICsgc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkc2NvcGUubW9kZWwuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XSk7XHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4va3ViZXJuZXRlcy90cy9rdWJlcm5ldGVzSGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRldmVsb3BlckVucmljaGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRldmVsb3BlckhlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJOYXZpZ2F0aW9uLnRzXCIvPlxyXG5cclxubW9kdWxlIERldmVsb3BlciB7XHJcblxyXG4gIGV4cG9ydCB2YXIgSmVua2luc0pvYnNDb250cm9sbGVyID0gY29udHJvbGxlcihcIkplbmtpbnNKb2JzQ29udHJvbGxlclwiLFxyXG4gICAgW1wiJHNjb3BlXCIsIFwiS3ViZXJuZXRlc01vZGVsXCIsIFwiS3ViZXJuZXRlc1N0YXRlXCIsIFwiS3ViZXJuZXRlc1NjaGVtYVwiLCBcIiR0ZW1wbGF0ZUNhY2hlXCIsIFwiJGxvY2F0aW9uXCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwiJGh0dHBcIiwgXCIkdGltZW91dFwiLCBcIkt1YmVybmV0ZXNBcGlVUkxcIiwgXCJTZXJ2aWNlUmVnaXN0cnlcIixcclxuICAgICAgKCRzY29wZSwgS3ViZXJuZXRlc01vZGVsOkt1YmVybmV0ZXMuS3ViZXJuZXRlc01vZGVsU2VydmljZSwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzU2NoZW1hLFxyXG4gICAgICAgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJvdXRlUGFyYW1zLCAkaHR0cCwgJHRpbWVvdXQsIEt1YmVybmV0ZXNBcGlVUkwsIFNlcnZpY2VSZWdpc3RyeSkgPT4ge1xyXG5cclxuICAgICAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICAgICAkc2NvcGUubW9kZWwgPSBLdWJlcm5ldGVzTW9kZWw7XHJcbiAgICAgICAgJHNjb3BlLmlkID0gJHJvdXRlUGFyYW1zW1wiaWRcIl07XHJcbiAgICAgICAgJHNjb3BlLnNjaGVtYSA9IEt1YmVybmV0ZXNTY2hlbWE7XHJcbiAgICAgICAgJHNjb3BlLmplbmtpbnMgPSBudWxsO1xyXG4gICAgICAgICRzY29wZS5lbnRpdHlDaGFuZ2VkQ2FjaGUgPSB7fTtcclxuXHJcbiAgICAgICAgS3ViZXJuZXRlcy5pbml0U2hhcmVkKCRzY29wZSwgJGxvY2F0aW9uLCAkaHR0cCwgJHRpbWVvdXQsICRyb3V0ZVBhcmFtcywgS3ViZXJuZXRlc01vZGVsLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNBcGlVUkwpO1xyXG4gICAgICAgICRzY29wZS5icmVhZGNydW1iQ29uZmlnID0gY3JlYXRlUHJvamVjdEJyZWFkY3J1bWJzKCk7XHJcbiAgICAgICAgJHNjb3BlLnN1YlRhYkNvbmZpZyA9IERldmVsb3Blci5jcmVhdGVXb3Jrc3BhY2VTdWJOYXZCYXJzKCk7XHJcblxyXG4gICAgICAgICRzY29wZS4kb24oJ2t1YmVybmV0ZXNNb2RlbFVwZGF0ZWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICRzY29wZS4kb24oJyRyb3V0ZVVwZGF0ZScsICgkZXZlbnQpID0+IHtcclxuICAgICAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJHNjb3BlLnRhYmxlQ29uZmlnID0ge1xyXG4gICAgICAgICAgZGF0YTogJ2plbmtpbnMuam9icycsXHJcbiAgICAgICAgICBzaG93U2VsZWN0aW9uQ2hlY2tib3g6IHRydWUsXHJcbiAgICAgICAgICBlbmFibGVSb3dDbGlja1NlbGVjdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICBtdWx0aVNlbGVjdDogdHJ1ZSxcclxuICAgICAgICAgIHNlbGVjdGVkSXRlbXM6IFtdLFxyXG4gICAgICAgICAgZmlsdGVyT3B0aW9uczoge1xyXG4gICAgICAgICAgICBmaWx0ZXJUZXh0OiAkbG9jYXRpb24uc2VhcmNoKClbXCJxXCJdIHx8ICcnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY29sdW1uRGVmczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZmllbGQ6ICduYW1lJyxcclxuICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ05hbWUnLFxyXG4gICAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiamVua2luc0pvYk5hbWVUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBmaWVsZDogJyRidWlsZExpbmsnLFxyXG4gICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnVmlld3MnLFxyXG4gICAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiamVua2luc0pvYkJ1dHRvbnNUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBmaWVsZDogJyRsYXN0U3VjY2Vzc2Z1bEJ1aWxkTnVtYmVyJyxcclxuICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0xhc3QgU3VjY2VzcycsXHJcbiAgICAgICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJqZW5raW5zTGFzdFN1Y2Nlc3NUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBmaWVsZDogJyRsYXN0RmFpbGVkbEJ1aWxkTnVtYmVyJyxcclxuICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0xhc3QgRmFpbHVyZScsXHJcbiAgICAgICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJqZW5raW5zTGFzdEZhaWx1cmVUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBmaWVsZDogJyRkdXJhdGlvbicsXHJcbiAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdMYXN0IER1cmF0aW9uJyxcclxuICAgICAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcImplbmtpbnNCdWlsZER1cmF0aW9uVGVtcGxhdGUuaHRtbFwiKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZmllbGQ6ICckdGltZXN0YW1wJyxcclxuICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1RpbWUgU3RhcnRlZCcsXHJcbiAgICAgICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJqZW5raW5zQnVpbGRUaW1lc3RhbXBUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHVwZGF0ZURhdGEoKTtcclxuXHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZURhdGEoKSB7XHJcbiAgICAgICAgICAvLyBUT0RPIG9ubHkgbmVlZCBkZXB0aCAyIHRvIGJlIGFibGUgdG8gZmV0Y2ggdGhlIGxhc3RCdWlsZFxyXG4gICAgICAgICAgdmFyIHVybCA9IEt1YmVybmV0ZXMua3ViZXJuZXRlc1Byb3h5VXJsRm9yU2VydmljZUN1cnJlbnROYW1lc3BhY2UoamVua2luc1NlcnZpY2VOYW1lQW5kUG9ydCwgXCJhcGkvanNvbj9kZXB0aD0yXCIpO1xyXG4gICAgICAgICAgbG9nLmluZm8oXCJcIik7XHJcbiAgICAgICAgICBpZiAodXJsICYmICghJHNjb3BlLmplbmtpbnMgfHwgS3ViZXJuZXRlcy5rZWVwUG9sbGluZ01vZGVsKSkge1xyXG4gICAgICAgICAgICAkaHR0cC5nZXQodXJsLCBqZW5raW5zSHR0cENvbmZpZykuXHJcbiAgICAgICAgICAgICAgc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgIGVucmljaEplbmtpbnNKb2JzKGRhdGEsICRzY29wZS5pZCwgJHNjb3BlLmlkKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGhhc09iamVjdENoYW5nZWQoZGF0YSwgJHNjb3BlLmVudGl0eUNoYW5nZWRDYWNoZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhcImVudGl0eSBoYXMgY2hhbmdlZCFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmplbmtpbnMgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAkc2NvcGUubW9kZWwuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgICAgIGVycm9yKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgbG9nLndhcm4oXCJGYWlsZWQgdG8gbG9hZCBcIiArIHVybCArIFwiIFwiICsgZGF0YSArIFwiIFwiICsgc3RhdHVzKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1dKTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG5cclxubW9kdWxlIEt1YmVybmV0ZXMge1xyXG5cclxuICBleHBvcnQgdmFyIEZBQlJJQzhfUFJPSkVDVF9KU09OID0gXCJmYWJyaWM4UHJvamVjdEpzb25cIjtcclxuXHJcbiAgZnVuY3Rpb24gYnlJZCh0aGluZykge1xyXG4gICAgcmV0dXJuIHRoaW5nLmlkO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gY3JlYXRlS2V5KG5hbWVzcGFjZSwgaWQsIGtpbmQpIHtcclxuICAgIHJldHVybiAobmFtZXNwYWNlIHx8IFwiXCIpICsgXCItXCIgKyAoa2luZCB8fCAndW5kZWZpbmVkJykudG9Mb3dlckNhc2UoKSArICctJyArIChpZCB8fCAndW5kZWZpbmVkJykucmVwbGFjZSgvXFwuL2csICctJyk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBwb3B1bGF0ZUtleShpdGVtKSB7XHJcbiAgICB2YXIgcmVzdWx0ID0gaXRlbTtcclxuICAgIHJlc3VsdFsnX2tleSddID0gY3JlYXRlS2V5KGdldE5hbWVzcGFjZShpdGVtKSwgZ2V0TmFtZShpdGVtKSwgZ2V0S2luZChpdGVtKSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcG9wdWxhdGVLZXlzKGl0ZW1zOkFycmF5PGFueT4pIHtcclxuICAgIHZhciByZXN1bHQgPSBbXTtcclxuICAgIGFuZ3VsYXIuZm9yRWFjaChpdGVtcywgKGl0ZW0pID0+IHtcclxuICAgICAgcmVzdWx0LnB1c2gocG9wdWxhdGVLZXkoaXRlbSkpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gc2VsZWN0UG9kcyhwb2RzLCBuYW1lc3BhY2UsIGxhYmVscykge1xyXG4gICAgcmV0dXJuIHBvZHMuZmlsdGVyKChwb2QpID0+IHtcclxuICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZShwb2QpID09PSBuYW1lc3BhY2UgJiYgc2VsZWN0b3JNYXRjaGVzKGxhYmVscywgZ2V0TGFiZWxzKHBvZCkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgb2JqZWN0IHdoaWNoIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgcG9kcywgcmVwbGljYXRpb24gY29udHJvbGxlcnMsIHNlcnZpY2VzIGFuZCB0aGVpciBhc3NvY2lhdGlvbnNcclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgS3ViZXJuZXRlc01vZGVsU2VydmljZSB7XHJcbiAgICBwdWJsaWMga3ViZXJuZXRlcyA9IDxLdWJlcm5ldGVzU3RhdGU+IG51bGw7XHJcbiAgICBwdWJsaWMgYXBwcyA9IFtdO1xyXG4gICAgcHVibGljIHNlcnZpY2VzID0gW107XHJcblxyXG4gICAgcHVibGljIHJlcGxpY2F0aW9uY29udHJvbGxlcnMgPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgZmlsdGVyUmVwbGljYXRpb25jb250cm9sbGVycyA9IFtdO1xyXG5cclxuICAgIC8qcHVibGljIGdldCBmaWx0ZXJSZXBsaWNhdGlvbmNvbnRyb2xsZXJzKCk6QXJyYXk8YW55PiB7XHJcbiAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJSZXBsaWNhdGlvbmNvbnRyb2xsZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZmlsdGVyUmVwbGljYXRpb25jb250cm9sbGVycyhmaWx0ZXJSZXBsaWNhdGlvbmNvbnRyb2xsZXJzOkFycmF5PGFueT4pIHtcclxuICAgICAgICB0aGlzLmZpbHRlclJlcGxpY2F0aW9uY29udHJvbGxlcnMgPSBmaWx0ZXJSZXBsaWNhdGlvbmNvbnRyb2xsZXJzO1xyXG4gICAgfSovXHJcblxyXG4gICAgcHVibGljIGdldCByZXBsaWNhdGlvbkNvbnRyb2xsZXJzKCk6QXJyYXk8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLnJlcGxpY2F0aW9uY29udHJvbGxlcnM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHJlcGxpY2F0aW9uQ29udHJvbGxlcnMocmVwbGljYXRpb25Db250cm9sbGVyczpBcnJheTxhbnk+KSB7XHJcbiAgICAgIHRoaXMucmVwbGljYXRpb25jb250cm9sbGVycyA9IHJlcGxpY2F0aW9uQ29udHJvbGxlcnM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgcG9kcyA9IFtdO1xyXG4gICAgcHVibGljIGhvc3RzID0gW107XHJcbiAgICBwdWJsaWMgZ2V0IG5hbWVzcGFjZXMoKTpBcnJheTxzdHJpbmc+IHtcclxuICAgICAgcmV0dXJuIHRoaXMua3ViZXJuZXRlcy5uYW1lc3BhY2VzO1xyXG4gICAgfVxyXG4gICAgLy9wdWJsaWMgbmFtZXNwYWNlcyA9IFtdO1xyXG4gICAgcHVibGljIHJvdXRlcyA9IFtdO1xyXG4gICAgcHVibGljIHRlbXBsYXRlcyA9IFtdO1xyXG4gICAgcHVibGljIHJlZHJhdyA9IGZhbHNlO1xyXG4gICAgcHVibGljIHJlc291cmNlVmVyc2lvbnMgPSB7fTtcclxuXHJcbiAgICAvLyB2YXJpb3VzIHZpZXdzIG9uIHRoZSBkYXRhXHJcbiAgICBwdWJsaWMgcG9kc0J5SG9zdCA9IHt9O1xyXG4gICAgcHVibGljIHNlcnZpY2VzQnlLZXkgPSB7fTtcclxuICAgIHB1YmxpYyByZXBsaWNhdGlvbkNvbnRyb2xsZXJzQnlLZXkgPSB7fTtcclxuICAgIHB1YmxpYyBwb2RzQnlLZXkgPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgYXBwSW5mb3MgPSBbXTtcclxuICAgIHB1YmxpYyBhcHBWaWV3cyA9IFtdO1xyXG4gICAgcHVibGljIGFwcEZvbGRlcnMgPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgZmV0Y2hlZCA9IGZhbHNlO1xyXG4gICAgcHVibGljIGdldCBzaG93UnVuQnV0dG9uKCk6Ym9vbGVhbiB7XHJcbiAgICAgIGlmIChpc09wZW5TaGlmdCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBfLmFueSh0aGlzLnNlcnZpY2VzLCAoc2VydmljZSkgPT4ge1xyXG4gICAgICAgIHZhciBuYW1lID0gZ2V0TmFtZShzZXJ2aWNlKTtcclxuICAgICAgICBpZiAobmFtZSA9PT0gXCJ0ZW1wbGF0ZXNcIikge1xyXG4gICAgICAgICAgdmFyIHBvZENvdW50ZXJzID0gc2VydmljZS4kcG9kQ291bnRlcnM7XHJcbiAgICAgICAgICByZXR1cm4gcG9kQ291bnRlcnMgJiYgKHBvZENvdW50ZXJzLnZhbGlkIHx8IHBvZENvdW50ZXJzLnJlYWR5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGJ1aWxkY29uZmlncyA9IFtdO1xyXG4gICAgcHVibGljIGV2ZW50cyA9IFtdO1xyXG4gICAgcHVibGljIHdvcmtzcGFjZXMgPSBbXTtcclxuICAgIHB1YmxpYyBwcm9qZWN0cyA9IFtdO1xyXG4gICAgcHVibGljIHByb2plY3QgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgc2VydmljZUFwcHMoKTpBcnJheTxhbnk+IHtcclxuICAgICAgcmV0dXJuIF8uZmlsdGVyKHRoaXMuc2VydmljZXMsIChzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHMuJGhvc3QgJiYgcy4kc2VydmljZVVybCAmJiBzLiRwb2RDb3VudFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgJGtlZXBQb2xsaW5nKCkge1xyXG4gICAgICByZXR1cm4ga2VlcFBvbGxpbmdNb2RlbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3JSZWRyYXcoZmxhZykge1xyXG4gICAgICB0aGlzLnJlZHJhdyA9IHRoaXMucmVkcmF3IHx8IGZsYWc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNlcnZpY2UobmFtZXNwYWNlLCBpZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlc0J5S2V5W2NyZWF0ZUtleShuYW1lc3BhY2UsIGlkLCAnc2VydmljZScpXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UmVwbGljYXRpb25Db250cm9sbGVyKG5hbWVzcGFjZSwgaWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucmVwbGljYXRpb25Db250cm9sbGVyc0J5S2V5W2NyZWF0ZUtleShuYW1lc3BhY2UsIGlkLCAncmVwbGljYXRpb25Db250cm9sbGVyJyldO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQb2QobmFtZXNwYWNlLCBpZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5wb2RzQnlLZXlbY3JlYXRlS2V5KG5hbWVzcGFjZSwgaWQsICdwb2QnKV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBvZHNGb3JOYW1lc3BhY2UobmFtZXNwYWNlID0gdGhpcy5jdXJyZW50TmFtZXNwYWNlKCkpIHtcclxuICAgICAgcmV0dXJuIF8uZmlsdGVyKHRoaXMucG9kcywgeyBuYW1lc3BhY2U6IG5hbWVzcGFjZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QnVpbGRDb25maWcobmFtZSkge1xyXG4gICAgICByZXR1cm4gXy5maW5kKHRoaXMuYnVpbGRjb25maWdzLCB7ICRuYW1lOiBuYW1lIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQcm9qZWN0KG5hbWUsIG5zID0gdGhpcy5jdXJyZW50TmFtZXNwYWNlKCkpIHtcclxuICAgICAgdmFyIGJ1aWxkQ29uZmlnID0gdGhpcy5wcm9qZWN0O1xyXG4gICAgICBpZiAoIWJ1aWxkQ29uZmlnKSB7XHJcbiAgICAgICAgdmFyIHRleHQgPSBsb2NhbFN0b3JhZ2VbRkFCUklDOF9QUk9KRUNUX0pTT05dO1xyXG4gICAgICAgIGlmICh0ZXh0KSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBidWlsZENvbmZpZyA9IGFuZ3VsYXIuZnJvbUpzb24odGV4dCk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy53YXJuKFwiQ291bGQgbm90IHBhcnNlIGpzb24gZm9yIFwiICsgRkFCUklDOF9QUk9KRUNUX0pTT04gKyBcIi4gV2FzOiBcIiArIHRleHQgKyBcIi4gXCIgKyBlLCBlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGJ1aWxkQ29uZmlnICYmIG5zICE9IGdldE5hbWVzcGFjZShidWlsZENvbmZpZykgJiYgbmFtZSAhPSBidWlsZENvbmZpZy4kbmFtZSkge1xyXG4gICAgICAgIGJ1aWxkQ29uZmlnID0gdGhpcy5nZXRCdWlsZENvbmZpZyhuYW1lKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYnVpbGRDb25maWc7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBzZXRQcm9qZWN0KGJ1aWxkQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMucHJvamVjdCA9IGJ1aWxkQ29uZmlnO1xyXG4gICAgICBpZiAoYnVpbGRDb25maWcpIHtcclxuICAgICAgICAvLyBsZXRzIHN0b3JlIGluIGxvY2FsIHN0b3JhZ2VcclxuICAgICAgICB2YXIgbG9jYWxTdG9yYWdlID0gaW5qZWN0KFwibG9jYWxTdG9yYWdlXCIpO1xyXG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UpIHtcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZVtGQUJSSUM4X1BST0pFQ1RfSlNPTl0gPSBhbmd1bGFyLnRvSnNvbihidWlsZENvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIG5hbWVzcGFjZSBvciB0aGUgZGVmYXVsdCBuYW1lc3BhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGN1cnJlbnROYW1lc3BhY2UoKSB7XHJcbiAgICAgIHZhciBhbnN3ZXIgPSBudWxsO1xyXG4gICAgICBpZiAodGhpcy5rdWJlcm5ldGVzKSB7XHJcbiAgICAgICAgYW5zd2VyID0gdGhpcy5rdWJlcm5ldGVzLnNlbGVjdGVkTmFtZXNwYWNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhbnN3ZXIgfHwgZGVmYXVsdE5hbWVzcGFjZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdXBkYXRlSWNvblVybEFuZEFwcEluZm8oZW50aXR5LCBuYW1lRmllbGQ6IHN0cmluZykge1xyXG4gICAgICB2YXIgYW5zd2VyID0gbnVsbDtcclxuICAgICAgdmFyIGlkID0gZ2V0TmFtZShlbnRpdHkpO1xyXG4gICAgICBlbnRpdHkuJGljb25VcmwgPSBDb3JlLnBhdGhHZXQoZW50aXR5LCBbJ21ldGFkYXRhJywgJ2Fubm90YXRpb25zJywgJ2ZhYnJpYzguJyArIGlkICsgJy9pY29uVXJsJ10pO1xyXG4gICAgICBlbnRpdHkuJGluZm8gPSBDb3JlLnBhdGhHZXQoZW50aXR5LCBbJ21ldGFkYXRhJywgJ2Fubm90YXRpb25zJywgJ2ZhYnJpYzguJyArIGlkICsgJy9zdW1tYXJ5J10pO1xyXG4gICAgICBpZiAoZW50aXR5LiRpY29uVXJsKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpZCAmJiBuYW1lRmllbGQpIHtcclxuICAgICAgICAodGhpcy50ZW1wbGF0ZXMgfHwgW10pLmZvckVhY2goKHRlbXBsYXRlKSA9PiB7XHJcbiAgICAgICAgICB2YXIgbWV0YWRhdGEgPSB0ZW1wbGF0ZS5tZXRhZGF0YTtcclxuICAgICAgICAgIGlmIChtZXRhZGF0YSkge1xyXG4gICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSBtZXRhZGF0YS5hbm5vdGF0aW9ucyB8fCB7fTtcclxuICAgICAgICAgICAgdmFyIGljb25VcmwgPSBhbm5vdGF0aW9uc1tcImZhYnJpYzguXCIgKyBpZCArIFwiL2ljb25VcmxcIl0gfHwgYW5ub3RhdGlvbnNbXCJmYWJyaWM4L2ljb25VcmxcIl07XHJcbiAgICAgICAgICAgIGlmIChpY29uVXJsKSB7XHJcbiAgICAgICAgICAgICAgKHRlbXBsYXRlLm9iamVjdHMgfHwgW10pLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBlbnRpdHlOYW1lID0gZ2V0TmFtZShpdGVtKTtcclxuICAgICAgICAgICAgICAgIGlmIChpZCA9PT0gZW50aXR5TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICBlbnRpdHkuJGljb25VcmwgPSBpY29uVXJsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgKHRoaXMuYXBwSW5mb3MgfHwgW10pLmZvckVhY2goKGFwcEluZm8pID0+IHtcclxuICAgICAgICAgIHZhciBpY29uUGF0aCA9IGFwcEluZm8uaWNvblBhdGg7XHJcbiAgICAgICAgICBpZiAoaWNvblBhdGggJiYgIWFuc3dlciAmJiBpY29uUGF0aCAhPT0gXCJudWxsXCIpIHtcclxuICAgICAgICAgICAgdmFyIGljb25VcmwgPSBnaXRQYXRoVG9VcmwoaWNvblBhdGgpO1xyXG4gICAgICAgICAgICB2YXIgaWRzID0gQ29yZS5wYXRoR2V0KGFwcEluZm8sIFtcIm5hbWVzXCIsIG5hbWVGaWVsZF0pO1xyXG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goaWRzLCAoYXBwSWQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoYXBwSWQgPT09IGlkKSB7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHkuJGljb25VcmwgPSBpY29uVXJsO1xyXG4gICAgICAgICAgICAgICAgZW50aXR5LmFwcFBhdGggPSBhcHBJbmZvLmFwcFBhdGg7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHkuJGluZm8gPSBhcHBJbmZvO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFlbnRpdHkuJGljb25VcmwpIHtcclxuICAgICAgICBlbnRpdHkuJGljb25VcmwgPSBkZWZhdWx0SWNvblVybDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBtYXliZUluaXQoKSB7XHJcbiAgICAgIHRoaXMuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VydmljZXNCeUtleSA9IHt9O1xyXG4gICAgICB0aGlzLnBvZHNCeUtleSA9IHt9O1xyXG4gICAgICB0aGlzLnJlcGxpY2F0aW9uQ29udHJvbGxlcnNCeUtleSA9IHt9O1xyXG5cclxuICAgICAgdGhpcy5wb2RzLmZvckVhY2goKHBvZCkgPT4ge1xyXG4gICAgICAgIGlmICghcG9kLmtpbmQpIHBvZC5raW5kID0gXCJQb2RcIjtcclxuICAgICAgICB0aGlzLnBvZHNCeUtleVtwb2QuX2tleV0gPSBwb2Q7XHJcbiAgICAgICAgdmFyIGhvc3QgPSBnZXRIb3N0KHBvZCk7XHJcbiAgICAgICAgcG9kLiRsYWJlbHNUZXh0ID0gS3ViZXJuZXRlcy5sYWJlbHNUb1N0cmluZyhnZXRMYWJlbHMocG9kKSk7XHJcbiAgICAgICAgaWYgKGhvc3QpIHtcclxuICAgICAgICAgIHBvZC4kbGFiZWxzVGV4dCArPSBsYWJlbEZpbHRlclRleHRTZXBhcmF0b3IgKyBcImhvc3Q9XCIgKyBob3N0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBwb2QuJGljb25VcmwgPSBkZWZhdWx0SWNvblVybDtcclxuICAgICAgICB0aGlzLmRpc2NvdmVyUG9kQ29ubmVjdGlvbnMocG9kKTtcclxuICAgICAgICBwb2QuJGNvbnRhaW5lclBvcnRzID0gW107XHJcblxyXG4gICAgICAgIHZhciBwb2RTdGF0dXMgPSBwb2Quc3RhdHVzIHx8IHt9O1xyXG4gICAgICAgIHZhciBzdGFydFRpbWUgPSBwb2RTdGF0dXMuc3RhcnRUaW1lO1xyXG4gICAgICAgIHBvZC4kc3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICBpZiAoc3RhcnRUaW1lKSB7XHJcbiAgICAgICAgICBwb2QuJHN0YXJ0VGltZSA9IG5ldyBEYXRlKHN0YXJ0VGltZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBjcmVhdGVkVGltZSA9IGdldENyZWF0aW9uVGltZXN0YW1wKHBvZCk7XHJcbiAgICAgICAgcG9kLiRjcmVhdGVkVGltZSA9IG51bGw7XHJcbiAgICAgICAgcG9kLiRhZ2UgPSBudWxsO1xyXG4gICAgICAgIGlmIChjcmVhdGVkVGltZSkge1xyXG4gICAgICAgICAgcG9kLiRjcmVhdGVkVGltZSA9IG5ldyBEYXRlKGNyZWF0ZWRUaW1lKTtcclxuICAgICAgICAgIHBvZC4kYWdlID0gaHVtYW5kYXRlLnJlbGF0aXZlVGltZShwb2QuJGNyZWF0ZWRUaW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJlYWR5ID0gaXNSZWFkeShwb2QpO1xyXG4gICAgICAgIHBvZC4kcmVhZHkgPSByZWFkeTtcclxuICAgICAgICBwb2QuJHN0YXR1c0NzcyA9IHN0YXR1c1RleHRUb0Nzc0NsYXNzKHBvZFN0YXR1cy5waGFzZSwgcmVhZHkpO1xyXG5cclxuICAgICAgICB2YXIgbWF4UmVzdGFydENvdW50ID0gMDtcclxuICAgICAgICBhbmd1bGFyLmZvckVhY2goQ29yZS5wYXRoR2V0KHBvZCwgW1wic3RhdHVzXCIsIFwiY29udGFpbmVyU3RhdHVzZXNcIl0pLCAoc3RhdHVzKSA9PiB7XHJcbiAgICAgICAgICB2YXIgcmVzdGFydENvdW50ID0gc3RhdHVzLnJlc3RhcnRDb3VudDtcclxuICAgICAgICAgIGlmIChyZXN0YXJ0Q291bnQpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3RhcnRDb3VudCA+IG1heFJlc3RhcnRDb3VudCkge1xyXG4gICAgICAgICAgICAgIG1heFJlc3RhcnRDb3VudCA9IHJlc3RhcnRDb3VudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChtYXhSZXN0YXJ0Q291bnQgKSB7XHJcbiAgICAgICAgICBwb2QuJHJlc3RhcnRDb3VudCA9IG1heFJlc3RhcnRDb3VudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGltYWdlTmFtZXMgPSBcIlwiO1xyXG4gICAgICAgIGFuZ3VsYXIuZm9yRWFjaChDb3JlLnBhdGhHZXQocG9kLCBbXCJzcGVjXCIsIFwiY29udGFpbmVyc1wiXSksIChjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIHZhciBpbWFnZSA9IGNvbnRhaW5lci5pbWFnZTtcclxuICAgICAgICAgIGlmIChpbWFnZSkge1xyXG4gICAgICAgICAgICBpZiAoIWltYWdlTmFtZXMpIHtcclxuICAgICAgICAgICAgICBpbWFnZU5hbWVzID0gaW1hZ2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaW1hZ2VOYW1lcyA9IGltYWdlTmFtZXMgKyBcIiBcIiArIGltYWdlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBpZHggPSBpbWFnZS5sYXN0SW5kZXhPZihcIjpcIik7XHJcbiAgICAgICAgICAgIGlmIChpZHggPiAwKSB7XHJcbiAgICAgICAgICAgICAgaW1hZ2UgPSBpbWFnZS5zdWJzdHJpbmcoMCwgaWR4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcGF0aHMgPSBpbWFnZS5zcGxpdChcIi9cIiwgMyk7XHJcbiAgICAgICAgICAgIGlmIChwYXRocy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICB2YXIgYW5zd2VyID0gbnVsbDtcclxuICAgICAgICAgICAgICBpZiAocGF0aHMubGVuZ3RoID09IDMpIHtcclxuICAgICAgICAgICAgICAgIGFuc3dlciA9IHBhdGhzWzFdICsgXCIvXCIgKyBwYXRoc1syXTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhzLmxlbmd0aCA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgICBhbnN3ZXIgPSBwYXRoc1swXSArIFwiL1wiICsgcGF0aHNbMV07XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFuc3dlciA9IHBhdGhzWzBdICsgXCIvXCIgKyBwYXRoc1sxXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgY29udGFpbmVyLiRpbWFnZUxpbmsgPSBVcmxIZWxwZXJzLmpvaW4oXCJodHRwczovL3JlZ2lzdHJ5Lmh1Yi5kb2NrZXIuY29tL3UvXCIsIGFuc3dlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChjb250YWluZXIucG9ydHMsIChwb3J0KSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWluZXJQb3J0ID0gcG9ydC5jb250YWluZXJQb3J0O1xyXG4gICAgICAgICAgICBpZiAoY29udGFpbmVyUG9ydCkge1xyXG4gICAgICAgICAgICAgIHBvZC4kY29udGFpbmVyUG9ydHMucHVzaChjb250YWluZXJQb3J0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcG9kLiRpbWFnZU5hbWVzID0gaW1hZ2VOYW1lcztcclxuICAgICAgICB2YXIgcG9kU3RhdHVzID0gcG9kU3RhdHVzO1xyXG4gICAgICAgIHZhciBwb2RTcGVjID0gKHBvZC5zcGVjIHx8IHt9KTtcclxuICAgICAgICBwb2QuJHBvZElQID0gcG9kU3RhdHVzLnBvZElQO1xyXG4gICAgICAgIHBvZC4kaG9zdCA9IHBvZFNwZWMuaG9zdCB8fCBwb2RTcGVjLm5vZGVOYW1lIHx8IHBvZFN0YXR1cy5ob3N0SVA7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5zZXJ2aWNlcy5mb3JFYWNoKChzZXJ2aWNlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzZXJ2aWNlLmtpbmQpIHNlcnZpY2Uua2luZCA9IFwiU2VydmljZVwiO1xyXG4gICAgICAgIHRoaXMuc2VydmljZXNCeUtleVtzZXJ2aWNlLl9rZXldID0gc2VydmljZTtcclxuICAgICAgICB2YXIgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihzZXJ2aWNlKTtcclxuICAgICAgICBzZXJ2aWNlLiRwb2RzID0gW107XHJcbiAgICAgICAgaWYgKCFzZXJ2aWNlLiRwb2RDb3VudGVycykge1xyXG4gICAgICAgICAgc2VydmljZS4kcG9kQ291bnRlcnMgPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHBvZExpbmtVcmwgPSBVcmxIZWxwZXJzLmpvaW4oXCIva3ViZXJuZXRlcy9uYW1lc3BhY2VcIiwgc2VydmljZS5tZXRhZGF0YS5uYW1lc3BhY2UsIFwicG9kc1wiKTtcclxuICAgICAgICBfLmFzc2lnbihzZXJ2aWNlLiRwb2RDb3VudGVycywgc2VsZWN0b3IgPyBjcmVhdGVQb2RDb3VudGVycyhzZWxlY3RvciwgdGhpcy5wb2RzLCBzZXJ2aWNlLiRwb2RzLCBLdWJlcm5ldGVzLmxhYmVsc1RvU3RyaW5nKHNlbGVjdG9yLCBcIixcIiksIHBvZExpbmtVcmwpIDoge30pO1xyXG4gICAgICAgIHNlcnZpY2UuJHBvZENvdW50ID0gc2VydmljZS4kcG9kcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIHZhciBzZWxlY3RlZFBvZHMgPSBzZXJ2aWNlLiRwb2RzO1xyXG4gICAgICAgIHNlcnZpY2UuY29ubmVjdFRvID0gc2VsZWN0ZWRQb2RzLm1hcCgocG9kKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcG9kLl9rZXk7XHJcbiAgICAgICAgfSkuam9pbignLCcpO1xyXG4gICAgICAgIHNlcnZpY2UuJGxhYmVsc1RleHQgPSBLdWJlcm5ldGVzLmxhYmVsc1RvU3RyaW5nKGdldExhYmVscyhzZXJ2aWNlKSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVJY29uVXJsQW5kQXBwSW5mbyhzZXJ2aWNlLCBcInNlcnZpY2VOYW1lc1wiKTtcclxuICAgICAgICB2YXIgc3BlYyA9IHNlcnZpY2Uuc3BlYyB8fCB7fTtcclxuICAgICAgICBzZXJ2aWNlLiRwb3J0YWxJUCA9IHNwZWMucG9ydGFsSVA7XHJcbiAgICAgICAgc2VydmljZS4kc2VsZWN0b3JUZXh0ID0gS3ViZXJuZXRlcy5sYWJlbHNUb1N0cmluZyhzcGVjLnNlbGVjdG9yKTtcclxuICAgICAgICB2YXIgcG9ydHMgPSBfLm1hcChzcGVjLnBvcnRzIHx8IFtdLCBcInBvcnRcIik7XHJcbiAgICAgICAgc2VydmljZS4kcG9ydHMgPSBwb3J0cztcclxuICAgICAgICBzZXJ2aWNlLiRwb3J0c1RleHQgPSBwb3J0cy5qb2luKFwiLCBcIik7XHJcbiAgICAgICAgdmFyIGljb25VcmwgPSBzZXJ2aWNlLiRpY29uVXJsO1xyXG4gICAgICAgIGlmIChpY29uVXJsICYmIHNlbGVjdGVkUG9kcykge1xyXG4gICAgICAgICAgc2VsZWN0ZWRQb2RzLmZvckVhY2goKHBvZCkgPT4ge1xyXG4gICAgICAgICAgICBwb2QuJGljb25VcmwgPSBpY29uVXJsO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlcnZpY2UuJHNlcnZpY2VVcmwgPSBzZXJ2aWNlTGlua1VybChzZXJ2aWNlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnJlcGxpY2F0aW9uQ29udHJvbGxlcnMuZm9yRWFjaCgocmVwbGljYXRpb25Db250cm9sbGVyKSA9PiB7XHJcbiAgICAgICAgaWYgKCFyZXBsaWNhdGlvbkNvbnRyb2xsZXIua2luZCkgcmVwbGljYXRpb25Db250cm9sbGVyLmtpbmQgPSBcIlJlcGxpY2F0aW9uQ29udHJvbGxlclwiO1xyXG4gICAgICAgIHRoaXMucmVwbGljYXRpb25Db250cm9sbGVyc0J5S2V5W3JlcGxpY2F0aW9uQ29udHJvbGxlci5fa2V5XSA9IHJlcGxpY2F0aW9uQ29udHJvbGxlclxyXG4gICAgICAgICAgdmFyIHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IocmVwbGljYXRpb25Db250cm9sbGVyKTtcclxuICAgICAgICByZXBsaWNhdGlvbkNvbnRyb2xsZXIuJHBvZHMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYoaXNGaWx0ZXJSQyhyZXBsaWNhdGlvbkNvbnRyb2xsZXIpICYmICFpc0luY2x1ZGUodGhpcy5maWx0ZXJSZXBsaWNhdGlvbmNvbnRyb2xsZXJzLCByZXBsaWNhdGlvbkNvbnRyb2xsZXIpKVxyXG4gICAgICAgICAgIHRoaXMuZmlsdGVyUmVwbGljYXRpb25jb250cm9sbGVycy5wdXNoKHJlcGxpY2F0aW9uQ29udHJvbGxlcik7XHJcblxyXG4gICAgICAgIHJlcGxpY2F0aW9uQ29udHJvbGxlci4kcG9kQ291bnRlcnMgPSBzZWxlY3RvciA/IGNyZWF0ZVBvZENvdW50ZXJzKHNlbGVjdG9yLCB0aGlzLnBvZHMsIHJlcGxpY2F0aW9uQ29udHJvbGxlci4kcG9kcykgOiBudWxsO1xyXG4gICAgICAgIHJlcGxpY2F0aW9uQ29udHJvbGxlci4kcG9kQ291bnQgPSByZXBsaWNhdGlvbkNvbnRyb2xsZXIuJHBvZHMubGVuZ3RoO1xyXG4gICAgICAgIHJlcGxpY2F0aW9uQ29udHJvbGxlci4kcmVwbGljYXMgPSAocmVwbGljYXRpb25Db250cm9sbGVyLnNwZWMgfHwge30pLnJlcGxpY2FzO1xyXG5cclxuICAgICAgICByZXBsaWNhdGlvbkNvbnRyb2xsZXIuJG9yYWNsZU5hbWUgPSBnZXRPcmFjbGVOYW1lKHJlcGxpY2F0aW9uQ29udHJvbGxlcik7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhnZXROYW1lKHJlcGxpY2F0aW9uQ29udHJvbGxlcikpO1xyXG4gICAgICAgIHJlcGxpY2F0aW9uQ29udHJvbGxlci4kb3JhY2xlU3RhdHVzID0gZ2V0T3JhY2xlU3RhdHVzKGdldExhYmVscyhyZXBsaWNhdGlvbkNvbnRyb2xsZXIpKTtcclxuICAgICAgICByZXBsaWNhdGlvbkNvbnRyb2xsZXIuJGV4dHJhY3RTdGF0dXMgPSBnZXRFeHRyYWN0U3RhdHVzKGdldExhYmVscyhyZXBsaWNhdGlvbkNvbnRyb2xsZXIpKTtcclxuXHJcbiAgICAgICAgLy9cclxuICAgICAgICB2YXIgYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb25zKHJlcGxpY2F0aW9uQ29udHJvbGxlcik7XHJcbiAgICAgICAgdmFyIGxhYmVsID0gZ2V0TGFiZWxzKHJlcGxpY2F0aW9uQ29udHJvbGxlcik7ICAgICAgICBcclxuICAgICAgICByZXBsaWNhdGlvbkNvbnRyb2xsZXIuJGFsaWFzID0gYW5ub3RhdGlvbi5jaXR5TmFtZSArIFwiX1wiICsgYW5ub3RhdGlvbi5kaXN0cmljdE5hbWUgKyBcIl9cIiArIGFubm90YXRpb24uc3lzdGVtTmFtZSArIFwiX1wiICsgYW5ub3RhdGlvbi55ZWFyICsgXCJfXCIgKyBsYWJlbC52ZXJzaW9uOyAgXHJcblxyXG4gICAgICAgIHZhciBzZWxlY3RlZFBvZHMgPSByZXBsaWNhdGlvbkNvbnRyb2xsZXIuJHBvZHM7XHJcbiAgICAgICAgcmVwbGljYXRpb25Db250cm9sbGVyLmNvbm5lY3RUbyA9IHNlbGVjdGVkUG9kcy5tYXAoKHBvZCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHBvZC5fa2V5O1xyXG4gICAgICAgIH0pLmpvaW4oJywnKTtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGdldExhYmVscyhyZXBsaWNhdGlvbkNvbnRyb2xsZXIpKTsgICAgICAgIFxyXG4gICAgICAgIHJlcGxpY2F0aW9uQ29udHJvbGxlci4kbGFiZWxzVGV4dCA9IEt1YmVybmV0ZXMubGFiZWxzVG9TdHJpbmcoZ2V0TGFiZWxzKHJlcGxpY2F0aW9uQ29udHJvbGxlcikpO1xyXG4gICAgICAgIHJlcGxpY2F0aW9uQ29udHJvbGxlci5tZXRhZGF0YS5sYWJlbHMgPSBsYWJlbHNGb3JtYXQocmVwbGljYXRpb25Db250cm9sbGVyKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUljb25VcmxBbmRBcHBJbmZvKHJlcGxpY2F0aW9uQ29udHJvbGxlciwgXCJyZXBsaWNhdGlvbkNvbnRyb2xsZXJOYW1lc1wiKTtcclxuICAgICAgICB2YXIgaWNvblVybCA9ICByZXBsaWNhdGlvbkNvbnRyb2xsZXIuJGljb25Vcmw7XHJcbiAgICAgICAgaWYgKGljb25VcmwgJiYgc2VsZWN0ZWRQb2RzKSB7XHJcbiAgICAgICAgICBzZWxlY3RlZFBvZHMuZm9yRWFjaCgocG9kKSA9PiB7XHJcbiAgICAgICAgICAgIHBvZC4kaWNvblVybCA9IGljb25Vcmw7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gc2VydmljZXMgbWF5IG5vdCBtYXAgdG8gYW4gaWNvbiBidXQgdGhlaXIgcG9kcyBtYXkgZG8gdmlhIHRoZSBSQ1xyXG4gICAgICAvLyBzbyBsZXRzIGRlZmF1bHQgaXQuLi5cclxuICAgICAgdGhpcy5zZXJ2aWNlcy5mb3JFYWNoKChzZXJ2aWNlKSA9PiB7XHJcbiAgICAgICAgdmFyIGljb25VcmwgPSBzZXJ2aWNlLiRpY29uVXJsO1xyXG4gICAgICAgIHZhciBzZWxlY3RlZFBvZHMgPSBzZXJ2aWNlLiRwb2RzO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZFBvZHMpIHtcclxuICAgICAgICAgIGlmICghaWNvblVybCB8fCBpY29uVXJsID09PSBkZWZhdWx0SWNvblVybCkge1xyXG4gICAgICAgICAgICBpY29uVXJsID0gbnVsbDtcclxuICAgICAgICAgICAgc2VsZWN0ZWRQb2RzLmZvckVhY2goKHBvZCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICghaWNvblVybCkge1xyXG4gICAgICAgICAgICAgICAgaWNvblVybCA9IHBvZC4kaWNvblVybDtcclxuICAgICAgICAgICAgICAgIGlmIChpY29uVXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgIHNlcnZpY2UuJGljb25VcmwgPSBpY29uVXJsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlQXBwcygpO1xyXG5cclxuICAgICAgdmFyIHBvZHNCeUhvc3QgPSB7fTtcclxuICAgICAgdGhpcy5wb2RzLmZvckVhY2goKHBvZCkgPT4ge1xyXG4gICAgICAgIHZhciBob3N0ID0gZ2V0SG9zdChwb2QpO1xyXG4gICAgICAgIHZhciBwb2RzRm9ySG9zdCA9IHBvZHNCeUhvc3RbaG9zdF07XHJcbiAgICAgICAgaWYgKCFwb2RzRm9ySG9zdCkge1xyXG4gICAgICAgICAgcG9kc0Zvckhvc3QgPSBbXTtcclxuICAgICAgICAgIHBvZHNCeUhvc3RbaG9zdF0gPSBwb2RzRm9ySG9zdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcG9kc0Zvckhvc3QucHVzaChwb2QpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5wb2RzQnlIb3N0ID0gcG9kc0J5SG9zdDtcclxuXHJcbiAgICAgIHZhciB0bXBIb3N0cyA9IFtdO1xyXG4gICAgICBmb3IgKHZhciBob3N0S2V5IGluIHBvZHNCeUhvc3QpIHtcclxuICAgICAgICB2YXIgaG9zdFBvZHMgPSBbXTtcclxuICAgICAgICB2YXIgcG9kQ291bnRlcnMgPSBjcmVhdGVQb2RDb3VudGVycygocG9kKSA9PiBnZXRIb3N0KHBvZCkgPT09IGhvc3RLZXksIHRoaXMucG9kcywgaG9zdFBvZHMsIFwiaG9zdD1cIiArIGhvc3RLZXkpO1xyXG4gICAgICAgIHZhciBob3N0SVAgPSBudWxsO1xyXG4gICAgICAgIGlmIChob3N0UG9kcy5sZW5ndGgpIHtcclxuICAgICAgICAgIHZhciBwb2QgPSBob3N0UG9kc1swXTtcclxuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBwb2Quc3RhdHVzO1xyXG4gICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSkge1xyXG4gICAgICAgICAgICBob3N0SVAgPSBjdXJyZW50U3RhdGUuaG9zdElQO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaG9zdERldGFpbHMgPSB7XHJcbiAgICAgICAgICBuYW1lOiBob3N0S2V5LFxyXG4gICAgICAgICAgaWQ6IGhvc3RLZXksXHJcbiAgICAgICAgICBlbGVtZW50SWQ6IGhvc3RLZXkucmVwbGFjZSgvXFwuL2csICdfJyksXHJcbiAgICAgICAgICBob3N0SVA6IGhvc3RJUCxcclxuICAgICAgICAgIHBvZHM6IGhvc3RQb2RzLFxyXG4gICAgICAgICAga2luZDogXCJIb3N0XCIsXHJcbiAgICAgICAgICAgICRwb2RDb3VudGVyczogcG9kQ291bnRlcnMsXHJcbiAgICAgICAgICAgICRpY29uVXJsOiBob3N0SWNvblVybFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdG1wSG9zdHMucHVzaChob3N0RGV0YWlscyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaG9zdHMgPSB0bXBIb3N0cztcclxuXHJcbiAgICAgIGVucmljaEJ1aWxkQ29uZmlncyh0aGlzLmJ1aWxkY29uZmlncyk7XHJcbiAgICAgIGVucmljaEV2ZW50cyh0aGlzLmV2ZW50cywgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUFwcHMoKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gbGV0cyBjcmVhdGUgdGhlIGFwcCB2aWV3cyBieSB0cnlpbmcgdG8gam9pbiBjb250cm9sbGVycyAvIHNlcnZpY2VzIC8gcG9kcyB0aGF0IGFyZSByZWxhdGVkXHJcbiAgICAgICAgdmFyIGFwcFZpZXdzID0gW107XHJcblxyXG4gICAgICAgIHRoaXMucmVwbGljYXRpb25Db250cm9sbGVycy5mb3JFYWNoKChyZXBsaWNhdGlvbkNvbnRyb2xsZXIpID0+IHtcclxuICAgICAgICAgIHZhciBuYW1lID0gZ2V0TmFtZShyZXBsaWNhdGlvbkNvbnRyb2xsZXIpO1xyXG4gICAgICAgICAgdmFyICRpY29uVXJsID0gcmVwbGljYXRpb25Db250cm9sbGVyLiRpY29uVXJsO1xyXG4gICAgICAgICAgYXBwVmlld3MucHVzaCh7XHJcbiAgICAgICAgICAgIGFwcFBhdGg6IFwiL2R1bW15UGF0aC9cIiArIG5hbWUsXHJcbiAgICAgICAgICAgICRuYW1lOiBuYW1lLFxyXG4gICAgICAgICAgICAkaW5mbzoge1xyXG4gICAgICAgICAgICAgICRpY29uVXJsOiAkaWNvblVybFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAkaWNvblVybDogJGljb25VcmwsXHJcbiAgICAgICAgICAgIHJlcGxpY2F0aW9uQ29udHJvbGxlcnM6IFtyZXBsaWNhdGlvbkNvbnRyb2xsZXJdLFxyXG4gICAgICAgICAgICBwb2RzOiByZXBsaWNhdGlvbkNvbnRyb2xsZXIuJHBvZHMgfHwgW10sXHJcbiAgICAgICAgICAgIHNlcnZpY2VzOiBbXVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZhciBub01hdGNoZXMgPSBbXTtcclxuICAgICAgICB0aGlzLnNlcnZpY2VzLmZvckVhY2goKHNlcnZpY2UpID0+IHtcclxuICAgICAgICAgIC8vIG5vdyBsZXRzIHNlZSBpZiB3ZSBjYW4gZmluZCBhbiBhcHAgd2l0aCBhbiBSQyBvZiB0aGUgc2FtZSBzZWxlY3RvclxyXG4gICAgICAgICAgdmFyIG1hdGNoZXNBcHAgPSBudWxsO1xyXG4gICAgICAgICAgYXBwVmlld3MuZm9yRWFjaCgoYXBwVmlldykgPT4ge1xyXG4gICAgICAgICAgICBhcHBWaWV3LnJlcGxpY2F0aW9uQ29udHJvbGxlcnMuZm9yRWFjaCgocmVwbGljYXRpb25Db250cm9sbGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgdmFyIHJlcFNlbGVjdG9yID0gZ2V0U2VsZWN0b3IocmVwbGljYXRpb25Db250cm9sbGVyKTtcclxuICAgICAgICAgICAgICBpZiAocmVwU2VsZWN0b3IgJiZcclxuICAgICAgICAgICAgICAgICAgc2VsZWN0b3JNYXRjaGVzKHJlcFNlbGVjdG9yLCBnZXRTZWxlY3RvcihzZXJ2aWNlKSkgJiZcclxuICAgICAgICAgICAgICAgICAgZ2V0TmFtZXNwYWNlKHNlcnZpY2UpID09PSBnZXROYW1lc3BhY2UocmVwbGljYXRpb25Db250cm9sbGVyKSkge1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hlc0FwcCA9IGFwcFZpZXc7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGlmIChtYXRjaGVzQXBwKSB7XHJcbiAgICAgICAgICAgIG1hdGNoZXNBcHAuc2VydmljZXMucHVzaChzZXJ2aWNlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5vTWF0Y2hlcy5wdXNoKHNlcnZpY2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhcIm5vIG1hdGNoZXM6IFwiLCBub01hdGNoZXMpO1xyXG4gICAgICAgIG5vTWF0Y2hlcy5mb3JFYWNoKChzZXJ2aWNlKSA9PiB7XHJcbiAgICAgICAgICB2YXIgYXBwVmlldyA9IF8uZmluZChhcHBWaWV3cywgKGFwcFZpZXcpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIF8uYW55KGFwcFZpZXcucmVwbGljYXRpb25Db250cm9sbGVycywgKHJjKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIF8uc3RhcnRzV2l0aChnZXROYW1lKHJjKSwgZ2V0TmFtZShzZXJ2aWNlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZiAoYXBwVmlldykge1xyXG4gICAgICAgICAgICBhcHBWaWV3LnNlcnZpY2VzLnB1c2goc2VydmljZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgJGljb25VcmwgPSBzZXJ2aWNlLiRpY29uVXJsO1xyXG4gICAgICAgICAgICBhcHBWaWV3cy5wdXNoKHtcclxuICAgICAgICAgICAgICBhcHBQYXRoOiBcIi9kdW1teVBhdGgvXCIgKyBuYW1lLFxyXG4gICAgICAgICAgICAgICRuYW1lOiBuYW1lLFxyXG4gICAgICAgICAgICAgICRpbmZvOiB7XHJcbiAgICAgICAgICAgICAgICAkaWNvblVybDogJGljb25VcmxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgJGljb25Vcmw6ICRpY29uVXJsLFxyXG4gICAgICAgICAgICAgIHJlcGxpY2F0aW9uQ29udHJvbGxlcnM6IFtdLFxyXG4gICAgICAgICAgICAgIHBvZHM6IHNlcnZpY2UuJHBvZHMgfHwgW10sXHJcbiAgICAgICAgICAgICAgc2VydmljZXM6IFtzZXJ2aWNlXVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYW5ndWxhci5mb3JFYWNoKHRoaXMucm91dGVzLCAocm91dGUpID0+IHtcclxuICAgICAgICAgIHZhciBtZXRhZGF0YSA9IHJvdXRlLm1ldGFkYXRhIHx8IHt9O1xyXG4gICAgICAgICAgdmFyIHNwZWMgPSByb3V0ZS5zcGVjIHx8IHt9O1xyXG4gICAgICAgICAgdmFyIHNlcnZpY2VOYW1lID0gQ29yZS5wYXRoR2V0KHNwZWMsIFtcInRvXCIsIFwibmFtZVwiXSk7XHJcbiAgICAgICAgICB2YXIgaG9zdCA9IHNwZWMuaG9zdDtcclxuICAgICAgICAgIHZhciBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2Uocm91dGUpO1xyXG4gICAgICAgICAgaWYgKHNlcnZpY2VOYW1lICYmIGhvc3QpIHtcclxuICAgICAgICAgICAgdmFyIHNlcnZpY2UgPSB0aGlzLmdldFNlcnZpY2UobmFtZXNwYWNlLCBzZXJ2aWNlTmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgc2VydmljZS4kaG9zdCA9IGhvc3Q7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFRPRE8gd2UgY291bGQgdXNlIHNvbWUgYW5ub3RhdGlvbnMgLyBtZXRhZGF0YSB0byBkZWR1Y2Ugd2hhdCBVUkwgd2Ugc2hvdWxkIHVzZSB0byBvcGVuIHRoaXNcclxuICAgICAgICAgICAgICAvLyBzZXJ2aWNlIGluIHRoZSBjb25zb2xlLiBGb3Igbm93IGp1c3QgYXNzdW1lIGl0cyBodHRwOlxyXG5cclxuICAgICAgICAgICAgICBpZiAoaG9zdCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGhvc3RVcmwgPSAgaG9zdDtcclxuICAgICAgICAgICAgICAgIGlmIChob3N0VXJsLmluZGV4T2YoXCI6Ly9cIikgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGhvc3RVcmwgPSBcImh0dHA6Ly9cIiArIGhvc3Q7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLiRjb25uZWN0VXJsID0gVXJsSGVscGVycy5qb2luKGhvc3RVcmwsICBcIi9cIik7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyBUT0RPIGRlZmluaXRlbHkgbmVlZCB0aGF0IGFubm90YXRpb24sIHRlbXAgaGFjayBmb3IgYXBpbWFuIGxpbmtcclxuICAgICAgICAgICAgICBpZiAoZ2V0TmFtZShzZXJ2aWNlKSA9PT0gJ2FwaW1hbicgJiYgaG9zdCkge1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS4kY29ubmVjdFVybCA9ICg8YW55PiBuZXcgVVJJKCkuaG9zdChzZXJ2aWNlLiRob3N0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGgoJ2FwaW1hbnVpL2luZGV4Lmh0bWwnKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5xdWVyeSh7fSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNoKFVSSS5lbmNvZGUoYW5ndWxhci50b0pzb24oe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrVG86IG5ldyBVUkkoKS50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogSGF3dGlvT0F1dGguZ2V0T0F1dGhUb2tlbigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBsb2cuZGVidWcoXCJDb3VsZCBub3QgZmluZCBzZXJ2aWNlIFwiICsgc2VydmljZU5hbWUgKyBcIiBuYW1lc3BhY2UgXCIgKyBuYW1lc3BhY2UgKyBcIiBmb3Igcm91dGU6IFwiICsgbWV0YWRhdGEubmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYXBwVmlld3MgPSBfLnNvcnRCeShwb3B1bGF0ZUtleXMoYXBwVmlld3MpLCAoYXBwVmlldykgPT4gYXBwVmlldy5fa2V5KTtcclxuXHJcbiAgICAgICAgQXJyYXlIZWxwZXJzLnN5bmModGhpcy5hcHBWaWV3cywgYXBwVmlld3MsICckbmFtZScpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hcHBJbmZvcyAmJiB0aGlzLmFwcFZpZXdzKSB7XHJcbiAgICAgICAgICB2YXIgZm9sZGVyTWFwID0ge307XHJcbiAgICAgICAgICB2YXIgZm9sZGVycyA9IFtdO1xyXG4gICAgICAgICAgdmFyIGFwcE1hcCA9IHt9O1xyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHRoaXMuYXBwSW5mb3MsIChhcHBJbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghYXBwSW5mby4kaWNvblVybCAmJiBhcHBJbmZvLmljb25QYXRoICYmIGFwcEluZm8uaWNvblBhdGggIT09IFwibnVsbFwiKSB7XHJcbiAgICAgICAgICAgICAgYXBwSW5mby4kaWNvblVybCA9IGdpdFBhdGhUb1VybChhcHBJbmZvLmljb25QYXRoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgYXBwUGF0aCA9IGFwcEluZm8uYXBwUGF0aDtcclxuICAgICAgICAgICAgaWYgKGFwcFBhdGgpIHtcclxuICAgICAgICAgICAgICBhcHBNYXBbYXBwUGF0aF0gPSBhcHBJbmZvO1xyXG4gICAgICAgICAgICAgIHZhciBpZHggPSBhcHBQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcclxuICAgICAgICAgICAgICB2YXIgZm9sZGVyUGF0aCA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb2xkZXJQYXRoID0gYXBwUGF0aC5zdWJzdHJpbmcoMCwgaWR4KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZm9sZGVyUGF0aCA9IENvcmUudHJpbUxlYWRpbmcoZm9sZGVyUGF0aCwgXCIvXCIpO1xyXG4gICAgICAgICAgICAgIHZhciBmb2xkZXIgPSBmb2xkZXJNYXBbZm9sZGVyUGF0aF07XHJcbiAgICAgICAgICAgICAgaWYgKCFmb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgIGZvbGRlciA9IHtcclxuICAgICAgICAgICAgICAgICAgcGF0aDogZm9sZGVyUGF0aCxcclxuICAgICAgICAgICAgICAgICAgZXhwYW5kZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIGFwcHM6IFtdXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgZm9sZGVycy5wdXNoKGZvbGRlcik7XHJcbiAgICAgICAgICAgICAgICBmb2xkZXJNYXBbZm9sZGVyUGF0aF0gPSBmb2xkZXI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGZvbGRlci5hcHBzLnB1c2goYXBwSW5mbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5hcHBGb2xkZXJzID0gXy5zb3J0QnkoZm9sZGVycywgXCJwYXRoXCIpO1xyXG5cclxuICAgICAgICAgIHZhciBhcHBzID0gW107XHJcbiAgICAgICAgICB2YXIgZGVmYXVsdEluZm8gPSB7XHJcbiAgICAgICAgICAgICRpY29uVXJsOiBkZWZhdWx0SWNvblVybFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBhbmd1bGFyLmZvckVhY2godGhpcy5hcHBWaWV3cywgKGFwcFZpZXc6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgdmFyIGFwcFBhdGggPSBhcHBWaWV3LmFwcFBhdGg7XHJcblxyXG4gICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgIFRPRE9cclxuICAgICAgICAgICAgICAgYXBwVmlldy4kc2VsZWN0ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICBLdWJlcm5ldGVzLnNldEpzb24oJHNjb3BlLCBhcHBWaWV3LmlkLCAkc2NvcGUubW9kZWwuYXBwcyk7XHJcbiAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICovXHJcblxyXG4gICAgICAgICAgICAgIHZhciBhcHBJbmZvOmFueSA9IGFuZ3VsYXIuY29weShkZWZhdWx0SW5mbyk7XHJcbiAgICAgICAgICAgICAgaWYgKGFwcFBhdGgpIHtcclxuICAgICAgICAgICAgICAgIGFwcEluZm8gPSBhcHBNYXBbYXBwUGF0aF0gfHwgYXBwSW5mbztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKCFhcHBWaWV3LiRpbmZvKSB7XHJcbiAgICAgICAgICAgICAgICBhcHBWaWV3LiRpbmZvID0gZGVmYXVsdEluZm87XHJcbiAgICAgICAgICAgICAgICBhcHBWaWV3LiRpbmZvID0gYXBwSW5mbztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYXBwVmlldy5pZCA9IGFwcFBhdGg7XHJcbiAgICAgICAgICAgICAgaWYgKCFhcHBWaWV3LiRuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBhcHBWaWV3LiRuYW1lID0gYXBwSW5mby5uYW1lIHx8IGFwcFZpZXcuJG5hbWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmICghYXBwVmlldy4kaWNvblVybCkge1xyXG4gICAgICAgICAgICAgICAgYXBwVmlldy4kaWNvblVybCA9IGFwcEluZm8uJGljb25Vcmw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGFwcHMucHVzaChhcHBWaWV3KTtcclxuICAgICAgICAgICAgICBhcHBWaWV3LiRwb2RDb3VudGVycyA9IGNyZWF0ZUFwcFZpZXdQb2RDb3VudGVycyhhcHBWaWV3KTtcclxuICAgICAgICAgICAgICBhcHBWaWV3LiRwb2RDb3VudCA9IChhcHBWaWV3LnBvZHMgfHwgW10pLmxlbmd0aDtcclxuICAgICAgICAgICAgICBhcHBWaWV3LiRyZXBsaWNhdGlvbkNvbnRyb2xsZXJzVGV4dCA9IChhcHBWaWV3LnJlcGxpY2F0aW9uQ29udHJvbGxlcnMgfHwgW10pLm1hcCgoaSkgPT4gaVtcIl9rZXlcIl0pLmpvaW4oXCIgXCIpO1xyXG4gICAgICAgICAgICAgIGFwcFZpZXcuJHNlcnZpY2VzVGV4dD0gKGFwcFZpZXcuc2VydmljZXMgfHwgW10pLm1hcCgoaSkgPT4gaVtcIl9rZXlcIl0pLmpvaW4oXCIgXCIpO1xyXG4gICAgICAgICAgICAgIGFwcFZpZXcuJHNlcnZpY2VWaWV3cyA9IGNyZWF0ZUFwcFZpZXdTZXJ2aWNlVmlld3MoYXBwVmlldyk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byB1cGRhdGUgYXBwVmlld3M6IFwiICsgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgLy90aGlzLmFwcHMgPSBhcHBzO1xyXG4gICAgICAgICAgdGhpcy5hcHBzID0gdGhpcy5hcHBWaWV3cztcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBsb2cud2FybihcIkNhdWdodCBlcnJvcjogXCIgKyBlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkaXNjb3ZlclBvZENvbm5lY3Rpb25zKGVudGl0eSkge1xyXG4gICAgICB2YXIgaW5mbyA9IENvcmUucGF0aEdldChlbnRpdHksIFtcInN0YXR1c1wiLCBcImluZm9cIl0pO1xyXG4gICAgICB2YXIgaG9zdFBvcnQgPSBudWxsO1xyXG4gICAgICB2YXIgY3VycmVudFN0YXRlID0gZW50aXR5LnN0YXR1cyB8fCB7fTtcclxuICAgICAgdmFyIGRlc2lyZWRTdGF0ZSA9IGVudGl0eS5zcGVjIHx8IHt9O1xyXG4gICAgICB2YXIgcG9kSWQgPSBnZXROYW1lKGVudGl0eSk7XHJcbiAgICAgIHZhciBob3N0ID0gY3VycmVudFN0YXRlW1wiaG9zdElQXCJdO1xyXG4gICAgICB2YXIgcG9kSVAgPSBjdXJyZW50U3RhdGVbXCJwb2RJUFwiXTtcclxuICAgICAgdmFyIGhhc0RvY2tlciA9IGZhbHNlO1xyXG4gICAgICB2YXIgZm91bmRDb250YWluZXJQb3J0ID0gbnVsbDtcclxuICAgICAgaWYgKGRlc2lyZWRTdGF0ZSkge1xyXG4gICAgICAgIHZhciBjb250YWluZXJzID0gZGVzaXJlZFN0YXRlLmNvbnRhaW5lcnM7XHJcbiAgICAgICAgYW5ndWxhci5mb3JFYWNoKGNvbnRhaW5lcnMsIChjb250YWluZXIpID0+IHtcclxuICAgICAgICAgIGlmICghaG9zdFBvcnQpIHtcclxuICAgICAgICAgICAgdmFyIHBvcnRzID0gY29udGFpbmVyLnBvcnRzO1xyXG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocG9ydHMsIChwb3J0KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKCFob3N0UG9ydCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lclBvcnQgPSBwb3J0LmNvbnRhaW5lclBvcnQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgcG9ydE5hbWUgPSBwb3J0Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVySG9zdFBvcnQgPSBwb3J0Lmhvc3RQb3J0O1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lclBvcnQgPT09IDg3NzggfHwgXCJqb2xva2lhXCIgPT09IHBvcnROYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJQb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvZElQKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3VuZENvbnRhaW5lclBvcnQgPSBjb250YWluZXJQb3J0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVySG9zdFBvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGhvc3RQb3J0ID0gY29udGFpbmVySG9zdFBvcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZm91bmRDb250YWluZXJQb3J0ICYmIHBvZElkICYmIGlzUnVubmluZyhjdXJyZW50U3RhdGUpKSB7XHJcbiAgICAgICAgaWYgKCFLdWJlcm5ldGVzLmlzT3BlblNoaWZ0KSB7XHJcbiAgICAgICAgICAvLyBUT0RPIHRlbXAgd29ya2Fyb3VuZCBmb3IgazhzIG9uIEdLRSBodHRwczovL2dpdGh1Yi5jb20va3ViZXJuZXRlcy9rdWJlcm5ldGVzL2lzc3Vlcy8xNzE3MlxyXG4gICAgICAgICAgZW50aXR5LiRqb2xva2lhVXJsID0gVXJsSGVscGVycy5qb2luKEt1YmVybmV0ZXMubWFzdGVyQXBpVXJsKCksXHJcbiAgICAgICAgICAgICAgXCJhcGlcIixcclxuICAgICAgICAgICAgICBLdWJlcm5ldGVzLmRlZmF1bHRBcGlWZXJzaW9uLFxyXG4gICAgICAgICAgICAgIFwicHJveHlcIixcclxuICAgICAgICAgICAgICBcIm5hbWVzcGFjZXNcIixcclxuICAgICAgICAgICAgICBlbnRpdHkubWV0YWRhdGEubmFtZXNwYWNlICxcclxuICAgICAgICAgICAgICBcInBvZHNcIixcclxuICAgICAgICAgICAgICAvL1wiaHR0cHM6XCIgKyBwb2RJZCArIFwiOlwiICsgZm91bmRDb250YWluZXJQb3J0LFxyXG4gICAgICAgICAgICAgIHBvZElkICsgXCI6XCIgKyBmb3VuZENvbnRhaW5lclBvcnQsXHJcbiAgICAgICAgICAgICAgXCJqb2xva2lhL1wiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZW50aXR5LiRqb2xva2lhVXJsID0gVXJsSGVscGVycy5qb2luKEt1YmVybmV0ZXMubWFzdGVyQXBpVXJsKCksXHJcbiAgICAgICAgICAgICAgXCJhcGlcIixcclxuICAgICAgICAgICAgICBLdWJlcm5ldGVzLmRlZmF1bHRBcGlWZXJzaW9uLFxyXG4gICAgICAgICAgICAgIFwibmFtZXNwYWNlc1wiLFxyXG4gICAgICAgICAgICAgIGVudGl0eS5tZXRhZGF0YS5uYW1lc3BhY2UgLFxyXG4gICAgICAgICAgICAgIFwicG9kc1wiLFxyXG4gICAgICAgICAgICAgIFwiaHR0cHM6XCIgKyBwb2RJZCArIFwiOlwiICsgZm91bmRDb250YWluZXJQb3J0LFxyXG4gICAgICAgICAgICAgIFwicHJveHkvam9sb2tpYS9cIik7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0VGVtcGxhdGVTZXJ2aWNlKG1vZGVsKSB7XHJcbiAgICB2YXIga2V5ID0gY3JlYXRlS2V5KCdkZWZhdWx0JywgJ3RlbXBsYXRlcycsICdzZXJ2aWNlJyk7XHJcbiAgICB2YXIgYW5zd2VyID0gbW9kZWwuc2VydmljZXNCeUtleVtrZXldO1xyXG4gICAgbG9nLmRlYnVnKFwiZm91bmQgdGVtcGxhdGUgc2VydmljZTogXCIsIGFuc3dlcik7XHJcbiAgICByZXR1cm4gYW5zd2VyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG1vZGVsIHNlcnZpY2Ugd2hpY2gga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBwb2RzLCByZXBsaWNhdGlvbiBjb250cm9sbGVycyBhbmQgc2VydmljZXMgYWxvbmdcclxuICAgKiB3aXRoIHRoZWlyIGFzc29jaWF0aW9ucyBhbmQgc3RhdHVzXHJcbiAgICovXHJcbiAgX21vZHVsZS5mYWN0b3J5KCdLdWJlcm5ldGVzTW9kZWwnLCBbJyRyb290U2NvcGUnLCAnJGh0dHAnLCAnS3ViZXJuZXRlc0FwaVVSTCcsICdLdWJlcm5ldGVzU3RhdGUnLCAnV2F0Y2hlclNlcnZpY2UnLCAnJGxvY2F0aW9uJywgJyRyZXNvdXJjZScsICgkcm9vdFNjb3BlLCAkaHR0cCwgQXBwTGlicmFyeVVSTCwgS3ViZXJuZXRlc1N0YXRlLCB3YXRjaGVyOldhdGNoZXJTZXJ2aWNlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJlc291cmNlOm5nLnJlc291cmNlLklSZXNvdXJjZVNlcnZpY2UpID0+IHtcclxuXHJcbiAgICB2YXIgJHNjb3BlID0gbmV3IEt1YmVybmV0ZXNNb2RlbFNlcnZpY2UoKTtcclxuICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG5cclxuICAgIC8vIGNyZWF0ZSBhbGwgb2Ygb3VyIHJlc291cmNlIGNsYXNzZXNcclxuICAgIHZhciB0eXBlTmFtZXMgPSB3YXRjaGVyLmdldFR5cGVzKCk7XHJcbiAgICBfLmZvckVhY2godHlwZU5hbWVzLCAodHlwZTpzdHJpbmcpID0+IHtcclxuICAgICAgdmFyIHVybFRlbXBsYXRlID0gdXJpVGVtcGxhdGVGb3JLdWJlcm5ldGVzS2luZCh0eXBlKTtcclxuICAgICAgJHNjb3BlW3R5cGUgKyAnUmVzb3VyY2UnXSA9IGNyZWF0ZVJlc291cmNlKHR5cGUsIHVybFRlbXBsYXRlLCAkcmVzb3VyY2UsICRzY29wZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIWlzT3BlblNoaWZ0KSB7XHJcbiAgICAgIC8vIHJlZ2lzdGVyIGN1c3RvbSBVUkwgZmFjdG9yaWVzIGZvciB0ZW1wbGF0ZXMvcHJvamVjdHNcclxuICAgICAgd2F0Y2hlci5yZWdpc3RlckN1c3RvbVVybEZ1bmN0aW9uKEt1YmVybmV0ZXNBUEkuV2F0Y2hUeXBlcy5CVUlMRF9DT05GSUdTLCAob3B0aW9uczpLdWJlcm5ldGVzQVBJLks4U09wdGlvbnMpID0+IHtcclxuICAgICAgICB2YXIgdGVtcGxhdGVTZXJ2aWNlID0gZ2V0VGVtcGxhdGVTZXJ2aWNlKCRzY29wZSk7XHJcbiAgICAgICAgaWYgKHRlbXBsYXRlU2VydmljZSkge1xyXG4gICAgICAgICAgcmV0dXJuIFVybEhlbHBlcnMuam9pbih0ZW1wbGF0ZVNlcnZpY2UucHJveHlVcmwsICcvb2FwaS92MS9uYW1lc3BhY2VzL2RlZmF1bHQvYnVpbGRjb25maWdzLycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIHJlZ2lzdGVyIGN1c3RvbSBVUkwgZmFjdG9yaWVzIGZvciB0ZW1wbGF0ZXMvcHJvamVjdHNcclxuICAgICAgd2F0Y2hlci5yZWdpc3RlckN1c3RvbVVybEZ1bmN0aW9uKEt1YmVybmV0ZXNBUEkuV2F0Y2hUeXBlcy5URU1QTEFURVMsIChvcHRpb25zOkt1YmVybmV0ZXNBUEkuSzhTT3B0aW9ucykgPT4ge1xyXG4gICAgICAgIHZhciB0ZW1wbGF0ZVNlcnZpY2UgPSBnZXRUZW1wbGF0ZVNlcnZpY2UoJHNjb3BlKTtcclxuICAgICAgICBpZiAodGVtcGxhdGVTZXJ2aWNlKSB7XHJcbiAgICAgICAgICByZXR1cm4gVXJsSGVscGVycy5qb2luKHRlbXBsYXRlU2VydmljZS5wcm94eVVybCwgJy9vYXBpL3YxL25hbWVzcGFjZXMvZGVmYXVsdC90ZW1wbGF0ZXMvJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZWdpc3RlciBmb3IgYWxsIHVwZGF0ZXMgb24gb2JqZWN0c1xyXG5cdFx0d2F0Y2hlci5yZWdpc3Rlckxpc3RlbmVyKChvYmplY3RzOk9iamVjdE1hcCkgPT4ge1xyXG5cdFx0XHR2YXIgdHlwZXMgPSB3YXRjaGVyLmdldFR5cGVzKCk7XHJcblx0XHRcdF8uZm9yRWFjaCh0eXBlcywgKHR5cGU6c3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRcdFx0XHRjYXNlIFdhdGNoVHlwZXMuU0VSVklDRVM6XHJcblx0XHRcdFx0XHRcdHZhciBpdGVtcyA9IHBvcHVsYXRlS2V5cyhvYmplY3RzW3R5cGVdKTtcclxuXHRcdFx0XHRcdFx0YW5ndWxhci5mb3JFYWNoKGl0ZW1zLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgIGl0ZW0ucHJveHlVcmwgPSBrdWJlcm5ldGVzUHJveHlVcmxGb3JTZXJ2aWNlKGt1YmVybmV0ZXNBcGlVcmwoKSwgaXRlbSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cdFx0XHRcdFx0XHQkc2NvcGVbdHlwZV0gPSBpdGVtcztcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFdhdGNoVHlwZXMuVEVNUExBVEVTOlxyXG4gICAgICAgICAgY2FzZSBXYXRjaFR5cGVzLlJPVVRFUzpcclxuICAgICAgICAgIGNhc2UgV2F0Y2hUeXBlcy5CVUlMRFM6XHJcbiAgICAgICAgICBjYXNlIFdhdGNoVHlwZXMuQlVJTERfQ09ORklHUzpcclxuICAgICAgICAgIGNhc2UgV2F0Y2hUeXBlcy5JTUFHRV9TVFJFQU1TOlxyXG4gICAgICAgICAgICAvLyBkb24ndCBwdXQgYSBicmVhayBoZXJlIDotKVxyXG5cdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0JHNjb3BlW3R5cGVdID0gcG9wdWxhdGVLZXlzKG9iamVjdHNbdHlwZV0pO1xyXG5cdFx0XHRcdH1cclxuICAgICAgICBsb2cuZGVidWcoXCJUeXBlOiBcIiwgdHlwZSwgXCIgb2JqZWN0OiBcIiwgJHNjb3BlW3R5cGVdKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdCRzY29wZS5tYXliZUluaXQoKTtcclxuICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCdrdWJlcm5ldGVzTW9kZWxVcGRhdGVkJywgJHNjb3BlKTtcclxuICAgICAgQ29yZS4kYXBwbHkoJHJvb3RTY29wZSk7XHJcblx0XHR9KTtcclxuXHJcbiAgICAvLyBzZXQgdGhlIHNlbGVjdGVkIG5hbWVzcGFjZSBpZiBzZXQgaW4gdGhlIGxvY2F0aW9uIGJhclxyXG4gICAgLy8gb3RoZXJ3aXNlIHVzZSB3aGF0ZXZlciBwcmV2aW91c2x5IHNlbGVjdGVkIG5hbWVzcGFjZSBpc1xyXG4gICAgLy8gYXZhaWxhYmxlXHJcbiAgICB2YXIgc2VhcmNoID0gJGxvY2F0aW9uLnNlYXJjaCgpO1xyXG4gICAgaWYgKCduYW1lc3BhY2UnIGluIHNlYXJjaCkge1xyXG4gICAgICB3YXRjaGVyLnNldE5hbWVzcGFjZShzZWFyY2hbJ25hbWVzcGFjZSddKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZWxlY3RQb2RzKHBvZHMsIG5hbWVzcGFjZSwgbGFiZWxzKSB7XHJcbiAgICAgIHJldHVybiBwb2RzLmZpbHRlcigocG9kKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZShwb2QpID09PSBuYW1lc3BhY2UgJiYgc2VsZWN0b3JNYXRjaGVzKGxhYmVscywgZ2V0TGFiZWxzKHBvZCkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiAkc2NvcGU7XHJcbiAgfV0pO1xyXG5cclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9rdWJlcm5ldGVzL3RzL2t1YmVybmV0ZXNIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4va3ViZXJuZXRlcy90cy9rdWJlcm5ldGVzSW50ZXJmYWNlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2t1YmVybmV0ZXMvdHMva3ViZXJuZXRlc01vZGVsLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVyUGx1Z2luLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVyRW5yaWNoZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVySGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRldmVsb3Blck5hdmlnYXRpb24udHNcIi8+XHJcblxyXG5tb2R1bGUgRGV2ZWxvcGVyIHtcclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGNsaWNrQXBwcm92ZShlbGVtZW50LCB1cmwpIHtcclxuICAgIHZhciAkc2NvcGU6IGFueSA9IGFuZ3VsYXIuZWxlbWVudChlbGVtZW50KS5zY29wZSgpO1xyXG4gICAgaWYgKCRzY29wZSkge1xyXG4gICAgICAkc2NvcGUuYXBwcm92ZSh1cmwsIGVsZW1lbnQudGV4dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgdmFyIEplbmtpbnNMb2dDb250cm9sbGVyID0gX21vZHVsZS5jb250cm9sbGVyKFwiRGV2ZWxvcGVyLkplbmtpbnNMb2dDb250cm9sbGVyXCIsICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDpLdWJlcm5ldGVzLkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc1NjaGVtYSxcclxuICAgICAgICAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlLCAkcm91dGVQYXJhbXMsICRodHRwLCAkdGltZW91dCwgJG1vZGFsLCBLdWJlcm5ldGVzQXBpVVJMLCBTZXJ2aWNlUmVnaXN0cnksICRlbGVtZW50KSA9PiB7XHJcblxyXG4gICAgJHNjb3BlLmt1YmVybmV0ZXMgPSBLdWJlcm5ldGVzU3RhdGU7XHJcbiAgICAkc2NvcGUubW9kZWwgPSBLdWJlcm5ldGVzTW9kZWw7XHJcblxyXG4gICAgJHNjb3BlLnNlbGVjdGVkQnVpbGQgPSAkc2NvcGUuJGV2YWwoJ2J1aWxkJykgfHwgJHNjb3BlLiRldmFsKCdzZWxlY3RlZEJ1aWxkJyk7XHJcblxyXG4gICAgJHNjb3BlLmlkID0gJHNjb3BlLiRldmFsKCdidWlsZC5pZCcpIHx8ICRyb3V0ZVBhcmFtc1tcImlkXCJdO1xyXG4gICAgJHNjb3BlLnNjaGVtYSA9IEt1YmVybmV0ZXNTY2hlbWE7XHJcbiAgICAkc2NvcGUuZW50aXR5Q2hhbmdlZENhY2hlID0ge307XHJcblxyXG4gICAgJGVsZW1lbnQub24oJyRkZXN0cm95JywgKCkgPT4ge1xyXG4gICAgICAkc2NvcGUuJGRlc3Ryb3koKTtcclxuICAgIH0pO1xyXG5cclxuICAgICRzY29wZS5sb2cgPSB7XHJcbiAgICAgIGh0bWw6IFwiXCIsXHJcbiAgICAgIHN0YXJ0OiAwLFxyXG4gICAgICBmaXJzdElkeDogbnVsbFxyXG4gICAgfTtcclxuXHJcbiAgICAkc2NvcGUuJG9uKCdrdWJlcm5ldGVzTW9kZWxVcGRhdGVkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICB1cGRhdGVKZW5raW5zTGluaygpO1xyXG4gICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgJHNjb3BlLiRvbignamVua2luc1NlbGVjdGVkQnVpbGQnLCAoZXZlbnQsIGJ1aWxkKSA9PiB7XHJcbiAgICAgIGxvZy5pbmZvKFwiPT09PSBqZW5raW5zIGJ1aWxkIHNlbGVjdGVkISBcIiArIGJ1aWxkLmlkICsgXCIgXCIgKyBidWlsZC4kam9iSWQpO1xyXG4gICAgICAkc2NvcGUuc2VsZWN0ZWRCdWlsZCA9IGJ1aWxkO1xyXG4gICAgfSk7XHJcblxyXG5cclxuICAgICRzY29wZS4kd2F0Y2goJ3NlbGVjdGVkQnVpbGQnLCAoc2VsZWN0ZWRCdWlsZCkgPT4ge1xyXG4gICAgICBsb2cuaW5mbyhcIlNlbGVjdGVkIGJ1aWxkIHVwZGF0ZWQ6IFwiLCBzZWxlY3RlZEJ1aWxkKTtcclxuICAgICAgJHNjb3BlLmZldGNoKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBLdWJlcm5ldGVzLmluaXRTaGFyZWQoJHNjb3BlLCAkbG9jYXRpb24sICRodHRwLCAkdGltZW91dCwgJHJvdXRlUGFyYW1zLCBLdWJlcm5ldGVzTW9kZWwsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc0FwaVVSTCk7XHJcbiAgICAkc2NvcGUuYnJlYWRjcnVtYkNvbmZpZyA9IGNyZWF0ZUplbmtpbnNCcmVhZGNydW1icygkc2NvcGUuaWQsIGdldEpvYklkKCksIGdldEJ1aWxkSWQoKSk7XHJcbiAgICAkc2NvcGUuc3ViVGFiQ29uZmlnID0gY3JlYXRlSmVua2luc1N1Yk5hdkJhcnMoJHNjb3BlLmlkLCBnZXRKb2JJZCgpLCBnZXRCdWlsZElkKCksIHtcclxuICAgICAgbGFiZWw6IFwiTG9nXCIsXHJcbiAgICAgIHRpdGxlOiBcIlZpZXdzIHRoZSBsb2dzIG9mIHRoaXMgYnVpbGRcIlxyXG4gICAgfSk7XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Sm9iSWQoKSB7XHJcbiAgICAgIC8vIGxldHMgYWxsb3cgdGhlIHBhcmVudCBzY29wZSB0byBiZSB1c2VkIHRvbyBmb3Igd2hlbiB0aGlzIGlzIHVzZWQgYXMgYSBwYW5lbFxyXG4gICAgICByZXR1cm4gJHJvdXRlUGFyYW1zW1wiam9iXCJdIHx8ICgkc2NvcGUuc2VsZWN0ZWRCdWlsZCB8fCB7fSkuJGpvYklkO1xyXG4gICAgfVxyXG4gICAgJHNjb3BlLmdldEpvYklkID0gZ2V0Sm9iSWQ7XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0QnVpbGRJZCgpIHtcclxuICAgICAgLy8gbGV0cyBhbGxvdyB0aGUgcGFyZW50IHNjb3BlIHRvIGJlIHVzZWQgdG9vIGZvciB3aGVuIHRoaXMgaXMgdXNlZCBhcyBhIHBhbmVsXHJcbiAgICAgIHJldHVybiAkcm91dGVQYXJhbXNbXCJidWlsZFwiXSB8fCAoJHNjb3BlLnNlbGVjdGVkQnVpbGQgfHwge30pLmlkO1xyXG4gICAgfVxyXG4gICAgJHNjb3BlLmdldEJ1aWxkSWQgPSBnZXRCdWlsZElkO1xyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZUplbmtpbnNMaW5rKCkge1xyXG4gICAgICB2YXIgamVua2luc1VybCA9IGplbmtpbnNMaW5rKCk7XHJcbiAgICAgIGlmIChqZW5raW5zVXJsKSB7XHJcbiAgICAgICAgJHNjb3BlLiR2aWV3SmVua2luc0J1aWxkTGluayA9IFVybEhlbHBlcnMuam9pbihqZW5raW5zVXJsLCBcImpvYlwiLCBnZXRKb2JJZCgpLCBnZXRCdWlsZElkKCkpO1xyXG4gICAgICAgICRzY29wZS4kdmlld0plbmtpbnNMb2dMaW5rID0gVXJsSGVscGVycy5qb2luKCRzY29wZS4kdmlld0plbmtpbnNCdWlsZExpbmssIFwiY29uc29sZVwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBxdWVyeVNpemUgPSA1MDAwMDtcclxuXHJcbiAgICAkc2NvcGUuYXBwcm92ZSA9ICh1cmwsIG9wZXJhdGlvbikgPT4ge1xyXG4gICAgICB2YXIgbW9kYWwgPSAkbW9kYWwub3Blbih7XHJcbiAgICAgIHRlbXBsYXRlVXJsOiBVcmxIZWxwZXJzLmpvaW4odGVtcGxhdGVQYXRoLCAnamVua2luc0FwcHJvdmVNb2RhbC5odG1sJyksXHJcbiAgICAgIGNvbnRyb2xsZXI6IFsnJHNjb3BlJywgJyRtb2RhbEluc3RhbmNlJywgKCRzY29wZSwgJG1vZGFsSW5zdGFuY2UpID0+IHtcclxuICAgICAgICAkc2NvcGUub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xyXG4gICAgICAgICRzY29wZS5oZWFkZXIgPSBvcGVyYXRpb24gKyBcIj9cIjtcclxuICAgICAgICAkc2NvcGUub2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICBtb2RhbC5jbG9zZSgpO1xyXG4gICAgICAgICAgcG9zdFRvSmVua2lucyh1cmwsIG9wZXJhdGlvbik7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAkc2NvcGUuY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgbW9kYWwuZGlzbWlzcygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1dXHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBwb3N0VG9KZW5raW5zKHVyaSwgb3BlcmF0aW9uKSB7XHJcbiAgICAgIHZhciB1cmwgPSAgS3ViZXJuZXRlcy5rdWJlcm5ldGVzUHJveHlVcmxGb3JTZXJ2aWNlQ3VycmVudE5hbWVzcGFjZShqZW5raW5zU2VydmljZU5hbWVBbmRQb3J0LCB1cmkpO1xyXG4gICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgdmFyIGJvZHkgPSBudWxsO1xyXG4gICAgICAgIHZhciBjb25maWcgPSB7XHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGxvZy5pbmZvKFwicG9zdGluZyB0byBqZW5raW5zVXJsOiBcIiArIHVybCk7XHJcbiAgICAgICAgJGh0dHAucG9zdCh1cmwsIGJvZHksIGNvbmZpZykuXHJcbiAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICBsb2cuaW5mbyhcIk1hbmFnZWQgdG8gXCIgKyBvcGVyYXRpb24gKyBcIiBhdCBcIiArIHVybCk7XHJcbiAgICAgICAgICB9KS5cclxuICAgICAgICBlcnJvcihmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgIGxvZy53YXJuKFwiRmFpbGVkIFwiICsgb3BlcmF0aW9uICsgXCIgam9iIGF0IFwiICsgdXJsICsgXCIgXCIgKyBkYXRhICsgXCIgXCIgKyBzdGF0dXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxvZy53YXJuKFwiQ2Fubm90IHBvc3QgdG8gamVua2lucyBVUkk6IFwiICsgdXJpICsgXCIgYXMgbm8gamVua2lucyBmb3VuZCFcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAkc2NvcGUuJGtlZXBQb2xsaW5nID0gKCkgPT4gS3ViZXJuZXRlcy5rZWVwUG9sbGluZ01vZGVsO1xyXG5cclxuICAgICRzY29wZS5mZXRjaCA9IFBvbGxIZWxwZXJzLnNldHVwUG9sbGluZygkc2NvcGUsIChuZXh0OigpID0+IHZvaWQpID0+IHtcclxuICAgICAgaWYgKCRzY29wZS4kZXZhbCgnaGlkZUxvZ3MgJiYgIWJ1aWxkLmJ1aWxkaW5nJykpIHtcclxuICAgICAgICBsb2cuZGVidWcoXCJMb2cgaGlkZGVuLCBub3QgZmV0Y2hpbmcgbG9nc1wiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKFwiRmV0Y2hpbmcgbG9ncyBmb3IgYnVpbGQ6IFwiLCAkc2NvcGUuJGV2YWwoJ2J1aWxkJykpO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciBidWlsZElkID0gZ2V0QnVpbGRJZCgpO1xyXG4gICAgICB2YXIgam9iSWQgPSBnZXRKb2JJZCgpO1xyXG4gICAgICAvL2xvZy5pbmZvKFwiPT09IGplbmtpbnMgbG9nIHF1ZXJ5aW5nIGpvYiBcIiArIGpvYklkICsgXCIgYnVpbGQgXCIgKyBidWlsZElkICsgXCIgc2VsZWN0ZWQgYnVpbGQgXCIgKyAgJHNjb3BlLnNlbGVjdGVkQnVpbGQpO1xyXG4gICAgICBpZiAoam9iSWQgJiYgYnVpbGRJZCkge1xyXG4gICAgICAgIGlmICgkc2NvcGUuYnVpbGRJZCAhPT0gYnVpbGRJZCB8fCAkc2NvcGUuam9iSWQgIT09IGpvYklkKSB7XHJcbiAgICAgICAgICAvLyBsZXRzIGNsZWFyIHRoZSBxdWVyeVxyXG4gICAgICAgICAgJHNjb3BlLmxvZyA9IHtcclxuICAgICAgICAgICAgaHRtbDogXCJcIixcclxuICAgICAgICAgICAgc3RhcnQ6IDAsXHJcbiAgICAgICAgICAgIGZpcnN0SWR4OiBudWxsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAkc2NvcGUuYnVpbGRJZCA9IGJ1aWxkSWQ7XHJcbiAgICAgICAgJHNjb3BlLmpvYklkID0gam9iSWQ7XHJcblxyXG4gICAgICAgIHZhciB1cmwgPSBLdWJlcm5ldGVzLmt1YmVybmV0ZXNQcm94eVVybEZvclNlcnZpY2VDdXJyZW50TmFtZXNwYWNlKGplbmtpbnNTZXJ2aWNlTmFtZUFuZFBvcnQsIFVybEhlbHBlcnMuam9pbihcImpvYlwiLCBqb2JJZCwgYnVpbGRJZCwgXCJmYWJyaWM4L2xvZ0h0bWw/dGFpbD0xJnN0YXJ0PVwiICsgJHNjb3BlLmxvZy5zdGFydCArIFwiJnNpemU9XCIgKyBxdWVyeVNpemUpKTtcclxuICAgICAgICBpZiAoJHNjb3BlLmxvZy5maXJzdElkeCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdXJsICs9IFwiJmZpcnN0PVwiICsgJHNjb3BlLmxvZy5maXJzdElkeDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHVybCAmJiAoISRzY29wZS5sb2cuZmV0Y2hlZCB8fCBLdWJlcm5ldGVzLmtlZXBQb2xsaW5nTW9kZWwpKSB7XHJcbiAgICAgICAgICAkaHR0cC5nZXQodXJsKS5cclxuICAgICAgICAgICAgc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VDbHVzdGVySVBzSW5IdG1sID0gcmVwbGFjZUNsdXN0ZXJJcEZ1bmN0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCEkc2NvcGUubG9nLmxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgJHNjb3BlLmxvZy5sb2dzID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBkYXRhLmxpbmVzO1xyXG4gICAgICAgICAgICAgICAgdmFyIHJldHVybmVkTGVuZ3RoID0gZGF0YS5yZXR1cm5lZExlbmd0aDtcclxuICAgICAgICAgICAgICAgIHZhciBsb2dMZW5ndGggPSBkYXRhLmxvZ0xlbmd0aDtcclxuICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZFN0YXJ0ID0gZGF0YS5zdGFydDtcclxuICAgICAgICAgICAgICAgIHZhciBlYXJsaWVyTG9nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQocmV0dXJuZWRTdGFydCkpIHtcclxuICAgICAgICAgICAgICAgICAgZWFybGllckxvZyA9IHJldHVybmVkU3RhcnQgPCAkc2NvcGUubG9nLnN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIGxpbmVTcGxpdCA9IGRhdGEubGluZVNwbGl0O1xyXG4gICAgICAgICAgICAgICAgLy8gbG9nLmluZm8oXCJzdGFydCB3YXM6IFwiICsgJHNjb3BlLmxvZy5zdGFydCArIFwiIGZpcnN0OiBcIiArICRzY29wZS5sb2cuZmlyc3RJZHggKyBcIiA9PiByZXR1cm5lZExlbmd0aDogXCIgKyByZXR1cm5lZExlbmd0aCArIFwiIGxvZ0xlbmd0aDogXCIgKyBsb2dMZW5ndGggKyAgXCIgcmV0dXJuZWRTdGFydDogXCIgKyByZXR1cm5lZFN0YXJ0ICsgXCIgZWFybGllckxvZzogXCIgKyBlYXJsaWVyTG9nICsgXCIgbGluZVNwbGl0OiBcIiArIGxpbmVTcGxpdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobGluZXMpIHtcclxuICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRMb2dzID0gJHNjb3BlLmxvZy5sb2dzO1xyXG5cclxuICAgICAgICAgICAgICAgICAgLy8gbGV0cyByZS1qb2luIHNwbGl0IGxpbmVzXHJcbiAgICAgICAgICAgICAgICAgIGlmIChsaW5lU3BsaXQgJiYgY3VycmVudExvZ3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdE9mTGluZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWFybGllckxvZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3RPZkxpbmUgPSBsaW5lcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0T2ZMaW5lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMb2dzW2xhc3RJbmRleF0gPSByZXBsYWNlQ2x1c3RlcklQc0luSHRtbChyZXN0T2ZMaW5lICsgY3VycmVudExvZ3NbbGFzdEluZGV4XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IGN1cnJlbnRMb2dzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXN0T2ZMaW5lID0gbGluZXMuc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0T2ZMaW5lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMb2dzW2xhc3RJbmRleF0gPSByZXBsYWNlQ2x1c3RlcklQc0luSHRtbChjdXJyZW50TG9nc1tsYXN0SW5kZXhdICsgcmVzdE9mTGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9IHJlcGxhY2VDbHVzdGVySVBzSW5IdG1sKGxpbmVzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZiAoZWFybGllckxvZykge1xyXG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5sb2cubG9ncyA9IGxpbmVzLmNvbmNhdChjdXJyZW50TG9ncyk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmxvZy5sb2dzID0gY3VycmVudExvZ3MuY29uY2F0KGxpbmVzKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIG1vdmVGb3J3YXJkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChyZXR1cm5lZFN0YXJ0KSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWRTdGFydCA+ICRzY29wZS5sb2cuc3RhcnQgJiYgJHNjb3BlLmxvZy5zdGFydCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlJ3ZlIGp1bXBlZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIHRvIHJlYWQgdGhlIHRhaWwgb2YgaXRcclxuICAgICAgICAgICAgICAgICAgICAkc2NvcGUubG9nLnN0YXJ0ID0gcmV0dXJuZWRTdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAkc2NvcGUubG9nLmZpcnN0SWR4ID0gcmV0dXJuZWRTdGFydDtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUubG9nLmZpcnN0SWR4ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyByZW1lbWJlciB3aGVyZSB0aGUgZmlyc3QgcmVxdWVzdCBzdGFydGVkXHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmxvZy5maXJzdElkeCA9IHJldHVybmVkU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0dXJuZWRTdGFydCA8ICRzY29wZS5sb2cuZmlyc3RJZHgpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSd2ZSBnb3QgYW4gZWFybGllciBiaXQgb2YgdGhlIGxvZ1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIHN0YXJ0aW5nIGF0IHRoZSB0YWlsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gbGV0cyBtb3ZlIGZpcnN0SWR4IGJhY2t3YXJkcyBhbmQgbGVhdmUgc3RhcnQgYXMgaXQgaXMgKGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUpXHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmxvZy5maXJzdElkeCA9IHJldHVybmVkU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbW92ZUZvcndhcmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKG1vdmVGb3J3YXJkICYmIHJldHVybmVkTGVuZ3RoICYmICFlYXJsaWVyTG9nKSB7XHJcbiAgICAgICAgICAgICAgICAgICRzY29wZS5sb2cuc3RhcnQgKz0gcmV0dXJuZWRMZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChsb2dMZW5ndGggJiYgJHNjb3BlLmxvZy5zdGFydCA+IGxvZ0xlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5sb2cuc3RhcnQgPSBsb2dMZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHVwZGF0ZUplbmtpbnNMaW5rKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICRzY29wZS5sb2cuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgLy8gQ29yZS4kYXBwbHkoJHNjb3BlKTtcclxuICAgICAgICAgICAgICBuZXh0KCk7XHJcbiAgICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgIGxvZy53YXJuKFwiRmFpbGVkIHRvIGxvYWQgXCIgKyB1cmwgKyBcIiBcIiArIGRhdGEgKyBcIiBcIiArIHN0YXR1cyk7XHJcbiAgICAgICAgICAgIG5leHQoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkc2NvcGUubG9nLmZldGNoZWQgPSB0cnVlO1xyXG4gICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgbmV4dCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoYW5ndWxhci5pc0Z1bmN0aW9uKCRzY29wZS5mZXRjaCkpIHtcclxuICAgICAgJHNjb3BlLmZldGNoKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGZ1bmN0aW9uIHJlcGxhY2VDbHVzdGVySXBGdW5jdGlvbigpIHtcclxuICAgICAgZnVuY3Rpb24gY3JlYXRlUmVwbGFjZUZ1bmN0aW9uKGZyb20sIHRvKSB7XHJcbiAgICAgICAgcmV0dXJuICh0ZXh0KSA9PiByZXBsYWNlVGV4dCh0ZXh0LCBmcm9tLCB0byk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciByZXBsYWNlbWVudHMgPSBbXTtcclxuICAgICAgYW5ndWxhci5mb3JFYWNoKCRzY29wZS5tb2RlbC5zZXJ2aWNlcywgKHNlcnZpY2UpID0+IHtcclxuICAgICAgICB2YXIgJHBvcnRhbElQID0gc2VydmljZS4kcG9ydGFsSVA7XHJcbiAgICAgICAgdmFyICRzZXJ2aWNlVXJsID0gc2VydmljZS4kc2VydmljZVVybDtcclxuICAgICAgICB2YXIgJHBvcnRzVGV4dCA9IHNlcnZpY2UuJHBvcnRzVGV4dDtcclxuICAgICAgICBpZiAoJHBvcnRhbElQICYmICRzZXJ2aWNlVXJsKSB7XHJcbiAgICAgICAgICB2YXIgaWR4ID0gJHNlcnZpY2VVcmwuaW5kZXhPZihcIjovL1wiKTtcclxuICAgICAgICAgIGlmIChpZHggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciByZXBsYWNlV2l0aCA9ICRzZXJ2aWNlVXJsLnN1YnN0cmluZyhpZHgsICRzZXJ2aWNlVXJsLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGlmICghcmVwbGFjZVdpdGguZW5kc1dpdGgoXCIvXCIpKSB7XHJcbiAgICAgICAgICAgICAgcmVwbGFjZVdpdGggKz0gXCIvXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJlcGxhY2VXaXRoLmxlbmd0aCA+IDQpIHtcclxuICAgICAgICAgICAgICByZXBsYWNlbWVudHMucHVzaChjcmVhdGVSZXBsYWNlRnVuY3Rpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgXCI6Ly9cIiArICRwb3J0YWxJUCArIFwiL1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VXaXRoXHJcbiAgICAgICAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgICAgaWYgKCRwb3J0c1RleHQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzdWZmaXggPSBcIjpcIiArICRwb3J0c1RleHQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VydmljZVdpdGhQb3J0ID0gcmVwbGFjZVdpdGguc3Vic3RyaW5nKDAsIHJlcGxhY2VXaXRoLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZXJ2aWNlV2l0aFBvcnQuZW5kc1dpdGgoc3VmZml4KSkge1xyXG4gICAgICAgICAgICAgICAgICBzZXJ2aWNlV2l0aFBvcnQgKz0gc3VmZml4O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2VydmljZVdpdGhQb3J0ICs9IFwiL1wiO1xyXG4gICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzLnB1c2goY3JlYXRlUmVwbGFjZUZ1bmN0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCI6Ly9cIiArICRwb3J0YWxJUCArIFwiOlwiICsgJHBvcnRzVGV4dCArIFwiL1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgc2VydmljZVdpdGhQb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgICApKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZnVuY3Rpb24gYWRkUmVwbGFjZUZuKGZyb20sIHRvKSB7XHJcbiAgICAgICAgcmVwbGFjZW1lbnRzLnB1c2goKHRleHQpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXBsYWNlVGV4dCh0ZXh0LCBmcm9tLCB0byk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIGFkZFJlcGxhY2VGbihcIltJTkZPXVwiLCBcIjxzcGFuIGNsYXNzPSdsb2ctc3VjY2Vzcyc+W0lORk9dPC9zcGFuPlwiKTtcclxuICAgICAgYWRkUmVwbGFjZUZuKFwiW1dBUk5dXCIsIFwiPHNwYW4gY2xhc3M9J2xvZy13YXJuJz5bV0FSTl08L3NwYW4+XCIpO1xyXG4gICAgICBhZGRSZXBsYWNlRm4oXCJbV0FSTklOR11cIiwgXCI8c3BhbiBjbGFzcz0nbG9nLXdhcm4nPltXQVJOSU5HXTwvc3Bhbj5cIik7XHJcbiAgICAgIGFkZFJlcGxhY2VGbihcIltFUlJPUl1cIiwgXCI8c3BhbiBjbGFzcz0nbG9nLWVycm9yJz5bRVJST1JdPC9zcGFuPlwiKTtcclxuICAgICAgYWRkUmVwbGFjZUZuKFwiRkFJTFVSRVwiLCBcIjxzcGFuIGNsYXNzPSdsb2ctZXJyb3InPkZBSUxVUkU8L3NwYW4+XCIpO1xyXG4gICAgICBhZGRSZXBsYWNlRm4oXCJTVUNDRVNTXCIsIFwiPHNwYW4gY2xhc3M9J2xvZy1zdWNjZXNzJz5TVUNDRVNTPC9zcGFuPlwiKTtcclxuXHJcbiAgICAgIC8vIGxldHMgdHJ5IGNvbnZlcnQgdGhlIFByb2NlZWQgLyBBYm9ydCBsaW5rc1xyXG4gICAgICByZXBsYWNlbWVudHMucHVzaCgodGV4dCkgPT4ge1xyXG4gICAgICAgIHZhciBwcmVmaXggPSBcIjxhIGhyZWY9JyMnIG9uY2xpY2s9XFxcIm5ldyBBamF4LlJlcXVlc3QoJ1wiO1xyXG4gICAgICAgIHZhciBpZHggPSAwO1xyXG4gICAgICAgIHdoaWxlIChpZHggPj0gMCkge1xyXG4gICAgICAgICAgaWR4ID0gdGV4dC5pbmRleE9mKHByZWZpeCwgaWR4KTtcclxuICAgICAgICAgIGlmIChpZHggPj0gMCkge1xyXG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBpZHggKyBwcmVmaXgubGVuZ3RoO1xyXG4gICAgICAgICAgICB2YXIgZW5kUXVvdGUgPSB0ZXh0LmluZGV4T2YoXCInXCIsIHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgIGlmIChlbmRRdW90ZSA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGVuZERvdWJsZVF1b3RlID0gdGV4dC5pbmRleE9mKCdcIicsIGVuZFF1b3RlICsgMSk7XHJcbiAgICAgICAgICAgIGlmIChlbmREb3VibGVRdW90ZSA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHVybCA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmRRdW90ZSk7XHJcbiAgICAgICAgICAgIC8vIFRPRE8gdXNpbmcgJGNvbXBpbGUgaXMgYSB0YWQgY29tcGxleCwgZm9yIG5vdyBsZXRzIGNoZWF0IHdpdGggYSBsaXR0bGUgb25jbGljayA7KVxyXG4gICAgICAgICAgICAvL3RleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBpZHgpICsgXCI8YSBjbGFzcz0nYnRuIGJ0bi1kZWZhdWx0IGJ0bi1sZycgbmctY2xpY2s9XFxcImFwcHJvdmUoJ1wiICsgdXJsICsgXCInKVxcXCJcIiArIHRleHQuc3Vic3RyaW5nKGVuZERvdWJsZVF1b3RlICsgMSk7XHJcbiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBpZHgpICsgXCI8YSBjbGFzcz0nYnRuIGJ0bi1kZWZhdWx0IGJ0bi1sZycgb25jbGljaz1cXFwiRGV2ZWxvcGVyLmNsaWNrQXBwcm92ZSh0aGlzLCAnXCIgKyB1cmwgKyBcIicpXFxcIlwiICsgdGV4dC5zdWJzdHJpbmcoZW5kRG91YmxlUXVvdGUgKyAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRleHQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZnVuY3Rpb24odGV4dCkge1xyXG4gICAgICAgIHZhciBhbnN3ZXIgPSB0ZXh0O1xyXG4gICAgICAgIGFuZ3VsYXIuZm9yRWFjaChyZXBsYWNlbWVudHMsIChmbikgPT4ge1xyXG4gICAgICAgICAgYW5zd2VyID0gZm4oYW5zd2VyKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gYW5zd2VyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVwbGFjZVRleHQodGV4dCwgZnJvbSwgdG8pIHtcclxuICAgICAgaWYgKGZyb20gJiYgdG8gJiYgdGV4dCkge1xyXG4gICAgICAgIC8vbG9nLmluZm8oXCJSZXBsYWNpbmcgJ1wiICsgZnJvbSArIFwiJyA9PiAnXCIgKyB0byArIFwiJ1wiKTtcclxuICAgICAgICB2YXIgaWR4ID0gMDtcclxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICAgaWR4ID0gdGV4dC5pbmRleE9mKGZyb20sIGlkeCk7XHJcbiAgICAgICAgICBpZiAoaWR4ID49IDApIHtcclxuICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGlkeCkgKyB0byArIHRleHQuc3Vic3RyaW5nKGlkeCArIGZyb20ubGVuZ3RoKTtcclxuICAgICAgICAgICAgaWR4ICs9IHRvLmxlbmd0aDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGV4dDtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4va3ViZXJuZXRlcy90cy9rdWJlcm5ldGVzSGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRldmVsb3BlckVucmljaGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRldmVsb3BlckhlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJOYXZpZ2F0aW9uLnRzXCIvPlxyXG5cclxubW9kdWxlIERldmVsb3BlciB7XHJcblxyXG4gIGV4cG9ydCB2YXIgSmVua2luc01ldHJpY3NDb250cm9sbGVyID0gY29udHJvbGxlcihcIkplbmtpbnNNZXRyaWNzQ29udHJvbGxlclwiLFxyXG4gICAgW1wiJHNjb3BlXCIsIFwiS3ViZXJuZXRlc01vZGVsXCIsIFwiS3ViZXJuZXRlc1N0YXRlXCIsIFwiS3ViZXJuZXRlc1NjaGVtYVwiLCBcIiR0ZW1wbGF0ZUNhY2hlXCIsIFwiJGxvY2F0aW9uXCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwiJGh0dHBcIiwgXCIkdGltZW91dFwiLCBcIkt1YmVybmV0ZXNBcGlVUkxcIiwgXCJTZXJ2aWNlUmVnaXN0cnlcIixcclxuICAgICAgKCRzY29wZSwgS3ViZXJuZXRlc01vZGVsOkt1YmVybmV0ZXMuS3ViZXJuZXRlc01vZGVsU2VydmljZSwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzU2NoZW1hLFxyXG4gICAgICAgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJvdXRlUGFyYW1zLCAkaHR0cCwgJHRpbWVvdXQsIEt1YmVybmV0ZXNBcGlVUkwsIFNlcnZpY2VSZWdpc3RyeSkgPT4ge1xyXG5cclxuICAgICAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICAgICAkc2NvcGUubW9kZWwgPSBLdWJlcm5ldGVzTW9kZWw7XHJcbiAgICAgICAgJHNjb3BlLmlkID0gJHJvdXRlUGFyYW1zW1wiaWRcIl07XHJcbiAgICAgICAgJHNjb3BlLmpvYklkID0gJHJvdXRlUGFyYW1zW1wiam9iXCJdO1xyXG4gICAgICAgICRzY29wZS5zY2hlbWEgPSBLdWJlcm5ldGVzU2NoZW1hO1xyXG4gICAgICAgICRzY29wZS5qZW5raW5zID0gbnVsbDtcclxuICAgICAgICAkc2NvcGUuZW50aXR5Q2hhbmdlZENhY2hlID0ge307XHJcblxyXG4gICAgICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuICAgICAgICAkc2NvcGUuYnJlYWRjcnVtYkNvbmZpZyA9IERldmVsb3Blci5jcmVhdGVQcm9qZWN0QnJlYWRjcnVtYnMoJHNjb3BlLmlkKTtcclxuICAgICAgICAkc2NvcGUuc3ViVGFiQ29uZmlnID0gRGV2ZWxvcGVyLmNyZWF0ZVByb2plY3RTdWJOYXZCYXJzKCRzY29wZS5pZCwgJHNjb3BlLmpvYklkKTtcclxuXHJcbiAgICAgICAgJHNjb3BlLiRvbigna3ViZXJuZXRlc01vZGVsVXBkYXRlZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJHNjb3BlLiRvbignJHJvdXRlVXBkYXRlJywgKCRldmVudCkgPT4ge1xyXG4gICAgICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkc2NvcGUub3B0aW9ucyA9IHtcclxuICAgICAgICAgIGNoYXJ0OiB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdkaXNjcmV0ZUJhckNoYXJ0JyxcclxuICAgICAgICAgICAgYXV0b3JlZnJlc2g6IGZhbHNlLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IDQ1MCxcclxuICAgICAgICAgICAgbWFyZ2luOiB7XHJcbiAgICAgICAgICAgICAgdG9wOiAyMCxcclxuICAgICAgICAgICAgICByaWdodDogMjAsXHJcbiAgICAgICAgICAgICAgYm90dG9tOiA2MCxcclxuICAgICAgICAgICAgICBsZWZ0OiA0NVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjbGlwRWRnZTogdHJ1ZSxcclxuICAgICAgICAgICAgc3RhZ2dlckxhYmVsczogZmFsc2UsXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogNTAwLFxyXG4gICAgICAgICAgICBzdGFja2VkOiBmYWxzZSxcclxuICAgICAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIHRvb2x0aXA6IHtcclxuICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgIGNvbnRlbnRHZW5lcmF0b3I6IChhcmdzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGFyZ3MuZGF0YSB8fCB7fTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLnRvb2x0aXA7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY29sb3I6IChkLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGQuY29sb3I7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHhBeGlzOiB7XHJcbiAgICAgICAgICAgICAgYXhpc0xhYmVsOiAnQnVpbGRzJyxcclxuICAgICAgICAgICAgICBzaG93TWF4TWluOiBmYWxzZSxcclxuICAgICAgICAgICAgICB0aWNrRm9ybWF0OiBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI1wiICsgZDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHlBeGlzOiB7XHJcbiAgICAgICAgICAgICAgYXhpc0xhYmVsOiAnQnVpbGQgRHVyYXRpb24gKHNlY29uZHMpJyxcclxuICAgICAgICAgICAgICB0aWNrRm9ybWF0OiBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGQzLmZvcm1hdCgnLC4xZicpKGQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgICRzY29wZS5kYXRhID0gW107XHJcblxyXG4gICAgICAgIHVwZGF0ZURhdGEoKTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gYmFyQ29sb3VyRm9yQnVpbGRSZXN1bHQocmVzdWx0KSB7XHJcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IFwiRkFJTFVSRVwiIHx8IHJlc3VsdCA9PT0gXCJGQUlMRURcIikge1xyXG4gICAgICAgICAgICAgIHJldHVybiBcInJlZFwiO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gXCJBQk9SVEVEXCIgfHwgcmVzdWx0ID09PSBcIklOVEVSVVBURURcIikge1xyXG4gICAgICAgICAgICAgIHJldHVybiBcInRhblwiO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gXCJTVUNDRVNTXCIpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gXCJncmVlblwiO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gXCJOT1RfU1RBUlRFRFwiKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIFwibGlnaHRncmV5XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIFwiZGFya2dyZXlcIjtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVDaGFydERhdGEoKSB7XHJcbiAgICAgICAgICB2YXIgdXNlU2luZ2xlU2V0ID0gdHJ1ZTtcclxuICAgICAgICAgIHZhciBidWlsZHNTdWNjZWVkZWQgPSBbXTtcclxuICAgICAgICAgIHZhciBidWlsZHNGYWlsZWQgPSBbXTtcclxuICAgICAgICAgIHZhciBzdWNjZXNzQnVpbGRLZXkgPSBcIlN1Y2NlZWRlZCBidWlsZHNcIjtcclxuICAgICAgICAgIHZhciBmYWlsZWRCdWlsZEtleSA9IFwiRmFpbGVkIGJ1aWxkc1wiO1xyXG5cclxuICAgICAgICAgIGlmICh1c2VTaW5nbGVTZXQpIHtcclxuICAgICAgICAgICAgc3VjY2Vzc0J1aWxkS2V5ID0gXCJCdWlsZHNcIjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB2YXIgY291bnQgPSAwO1xyXG4gICAgICAgICAgdmFyIGJ1aWxkcyA9IF8uc29ydEJ5KCRzY29wZS5tZXRyaWNzLmJ1aWxkcyB8fCBbXSwgXCJudW1iZXJcIik7XHJcbiAgICAgICAgICBhbmd1bGFyLmZvckVhY2goYnVpbGRzLCAoYnVpbGQ6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIHZhciB4ID0gYnVpbGQubnVtYmVyO1xyXG4gICAgICAgICAgICB2YXIgeSA9IGJ1aWxkLmR1cmF0aW9uIC8gMTAwMDtcclxuICAgICAgICAgICAgdmFyIGRhdGUgPSBEZXZlbG9wZXIuYXNEYXRlKGJ1aWxkLnRpbWVJbk1pbGxpcyk7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBidWlsZC5yZXN1bHQgfHwgXCJOT1RfU1RBUlRFRFwiO1xyXG4gICAgICAgICAgICB2YXIgY29sb3IgPSBiYXJDb2xvdXJGb3JCdWlsZFJlc3VsdChyZXN1bHQpO1xyXG4gICAgICAgICAgICB2YXIgaWNvbkNsYXNzID0gY3JlYXRlQnVpbGRTdGF0dXNJY29uQ2xhc3MocmVzdWx0KTtcclxuICAgICAgICAgICAgdmFyIHRvb2x0aXAgPSAnPGgzPjxpIGNsYXNzPVwiJyArIGljb25DbGFzcyArICdcIj48L2k+ICcgKyBidWlsZC5kaXNwbGF5TmFtZSArICc8L2gzPicgK1xyXG4gICAgICAgICAgICAgICc8cD5kdXJhdGlvbjogPGI+JyArIHkgKyAnPC9iPiBzZWNvbmRzPC9wPic7XHJcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XHJcbiAgICAgICAgICAgICAgdG9vbHRpcCArPSAnPHA+c3RhcnRlZDogPGI+JyArIGRhdGUgKyAnPC9iPjwvcD4nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICB0b29sdGlwICs9ICc8cD5yZXN1bHQ6IDxiPicgKyByZXN1bHQgKyAnPC9iPjwvcD4nO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoeCkge1xyXG4gICAgICAgICAgICAgIHZhciBkYXRhID0gYnVpbGRzU3VjY2VlZGVkO1xyXG4gICAgICAgICAgICAgIHZhciBrZXkgPSBzdWNjZXNzQnVpbGRLZXk7XHJcbiAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzQnVpbGRLZXkgJiYgKCFyZXN1bHQgfHwgIXJlc3VsdC5zdGFydHNXaXRoKFwiU1VDQ1wiKSkpIHtcclxuICAgICAgICAgICAgICAgIGRhdGEgPSBidWlsZHNGYWlsZWQ7XHJcbiAgICAgICAgICAgICAgICBrZXkgPSBmYWlsZWRCdWlsZEtleTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZGF0YS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHRvb2x0aXA6IHRvb2x0aXAsXHJcbiAgICAgICAgICAgICAgICBjb2xvcjogY29sb3IsXHJcbiAgICAgICAgICAgICAgICB4OiB4LCB5OiB5fSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgJHNjb3BlLmRhdGEgPSBbXTtcclxuICAgICAgICAgIGlmIChidWlsZHNTdWNjZWVkZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICRzY29wZS5kYXRhLnB1c2goe1xyXG4gICAgICAgICAgICAgIGtleTogc3VjY2Vzc0J1aWxkS2V5LFxyXG4gICAgICAgICAgICAgIHZhbHVlczogYnVpbGRzU3VjY2VlZGVkXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGJ1aWxkc0ZhaWxlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgJHNjb3BlLmRhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAga2V5OiBmYWlsZWRCdWlsZEtleSxcclxuICAgICAgICAgICAgICB2YWx1ZXM6IGJ1aWxkc0ZhaWxlZFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICRzY29wZS5hcGkudXBkYXRlV2l0aERhdGEoJHNjb3BlLmRhdGEpO1xyXG5cclxuICAgICAgICAgICR0aW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgJHNjb3BlLmFwaS51cGRhdGUoKTtcclxuICAgICAgICAgIH0sIDUwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZURhdGEoKSB7XHJcbiAgICAgICAgICB2YXIgbWV0cmljc1BhdGggPSAkc2NvcGUuam9iSWQgPyBVcmxIZWxwZXJzLmpvaW4oXCJqb2JcIiwgJHNjb3BlLmpvYklkLCBcImZhYnJpYzgvbWV0cmljc1wiKSA6IFwiZmFicmljOC9tZXRyaWNzXCI7XHJcbiAgICAgICAgICB2YXIgdXJsID0gS3ViZXJuZXRlcy5rdWJlcm5ldGVzUHJveHlVcmxGb3JTZXJ2aWNlQ3VycmVudE5hbWVzcGFjZShqZW5raW5zU2VydmljZU5hbWVBbmRQb3J0LCBtZXRyaWNzUGF0aCk7XHJcbiAgICAgICAgICBsb2cuaW5mbyhcIlwiKTtcclxuICAgICAgICAgIGlmICh1cmwgJiYgKCEkc2NvcGUuamVua2lucyB8fCBLdWJlcm5ldGVzLmtlZXBQb2xsaW5nTW9kZWwpKSB7XHJcbiAgICAgICAgICAgICRodHRwLmdldCh1cmwsIGplbmtpbnNIdHRwQ29uZmlnKS5cclxuICAgICAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGhhc09iamVjdENoYW5nZWQoZGF0YSwgJHNjb3BlLmVudGl0eUNoYW5nZWRDYWNoZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhcImVudGl0eSBoYXMgY2hhbmdlZCFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLm1ldHJpY3MgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNoYXJ0RGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAkc2NvcGUubW9kZWwuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgICAgIGVycm9yKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgbG9nLndhcm4oXCJGYWlsZWQgdG8gbG9hZCBcIiArIHVybCArIFwiIFwiICsgZGF0YSArIFwiIFwiICsgc3RhdHVzKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1dKTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9rdWJlcm5ldGVzL3RzL2t1YmVybmV0ZXNIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVyRW5yaWNoZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVySGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRldmVsb3Blck5hdmlnYXRpb24udHNcIi8+XHJcblxyXG5tb2R1bGUgRGV2ZWxvcGVyIHtcclxuXHJcbiAgZXhwb3J0IHZhciBOYXZCYXJDb250cm9sbGVyID0gY29udHJvbGxlcihcIk5hdkJhckNvbnRyb2xsZXJcIixcclxuICAgIFtcIiRzY29wZVwiLCBcIiRsb2NhdGlvblwiLCBcIiRyb3V0ZVBhcmFtc1wiLCBcIiR0aW1lb3V0XCIsIFwiS3ViZXJuZXRlc0FwaVVSTFwiLFxyXG4gICAgICAoJHNjb3BlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJvdXRlUGFyYW1zLCAkdGltZW91dCkgPT4ge1xyXG5cclxuICAgICAgICAkc2NvcGUuaXNWYWxpZCA9IChpdGVtKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBpdGVtLmlzVmFsaWQ7XHJcbiAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRnVuY3Rpb24odmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlKGl0ZW0pXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGFuZ3VsYXIuaXNVbmRlZmluZWQodmFsdWUpIHx8IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XSk7XHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4va3ViZXJuZXRlcy90cy9rdWJlcm5ldGVzSGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRldmVsb3BlckVucmljaGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRldmVsb3BlckhlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJOYXZpZ2F0aW9uLnRzXCIvPlxyXG5cclxubW9kdWxlIERldmVsb3BlciB7XHJcblxyXG4gIGV4cG9ydCB2YXIgUGlwZWxpbmVDb250cm9sbGVyID0gY29udHJvbGxlcihcIlBpcGVsaW5lQ29udHJvbGxlclwiLFxyXG4gICAgW1wiJHNjb3BlXCIsIFwiS3ViZXJuZXRlc01vZGVsXCIsIFwiS3ViZXJuZXRlc1N0YXRlXCIsIFwiS3ViZXJuZXRlc1NjaGVtYVwiLCBcIiR0ZW1wbGF0ZUNhY2hlXCIsIFwiJGxvY2F0aW9uXCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwiJGh0dHBcIiwgXCIkdGltZW91dFwiLCBcIkt1YmVybmV0ZXNBcGlVUkxcIiwgXCJTZXJ2aWNlUmVnaXN0cnlcIixcclxuICAgICAgKCRzY29wZSwgS3ViZXJuZXRlc01vZGVsOkt1YmVybmV0ZXMuS3ViZXJuZXRlc01vZGVsU2VydmljZSwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzU2NoZW1hLFxyXG4gICAgICAgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJvdXRlUGFyYW1zLCAkaHR0cCwgJHRpbWVvdXQsIEt1YmVybmV0ZXNBcGlVUkwsIFNlcnZpY2VSZWdpc3RyeSkgPT4ge1xyXG5cclxuICAgICAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICAgICAkc2NvcGUua3ViZU1vZGVsID0gS3ViZXJuZXRlc01vZGVsO1xyXG4gICAgICAgICRzY29wZS5pZCA9ICRyb3V0ZVBhcmFtc1tcImlkXCJdO1xyXG4gICAgICAgICRzY29wZS5qb2JJZCA9ICRyb3V0ZVBhcmFtc1tcImpvYlwiXTtcclxuICAgICAgICAkc2NvcGUuYnVpbGRJZCA9ICRyb3V0ZVBhcmFtc1tcImJ1aWxkXCJdO1xyXG4gICAgICAgICRzY29wZS5zY2hlbWEgPSBLdWJlcm5ldGVzU2NoZW1hO1xyXG4gICAgICAgICRzY29wZS5lbnRpdHlDaGFuZ2VkQ2FjaGUgPSB7fTtcclxuXHJcbiAgICAgICAgJHNjb3BlLm1vZGVsID0ge1xyXG4gICAgICAgICAgc3RhZ2VzOiBudWxsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBLdWJlcm5ldGVzLmluaXRTaGFyZWQoJHNjb3BlLCAkbG9jYXRpb24sICRodHRwLCAkdGltZW91dCwgJHJvdXRlUGFyYW1zLCBLdWJlcm5ldGVzTW9kZWwsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc0FwaVVSTCk7XHJcbiAgICAgICAgJHNjb3BlLmJyZWFkY3J1bWJDb25maWcgPSBEZXZlbG9wZXIuY3JlYXRlUHJvamVjdEJyZWFkY3J1bWJzKCRzY29wZS5pZCk7XHJcbiAgICAgICAgJHNjb3BlLnN1YlRhYkNvbmZpZyA9IERldmVsb3Blci5jcmVhdGVQcm9qZWN0U3ViTmF2QmFycygkc2NvcGUuaWQsICRzY29wZS5qb2JJZCk7XHJcblxyXG4gICAgICAgICRzY29wZS4kb24oJ2t1YmVybmV0ZXNNb2RlbFVwZGF0ZWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICRzY29wZS4kb24oJyRyb3V0ZVVwZGF0ZScsICgkZXZlbnQpID0+IHtcclxuICAgICAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdXBkYXRlRGF0YSgpO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVEYXRhKCkge1xyXG4gICAgICAgICAgaWYgKCRzY29wZS5qb2JJZCkge1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gS3ViZXJuZXRlcy5rdWJlcm5ldGVzUHJveHlVcmxGb3JTZXJ2aWNlQ3VycmVudE5hbWVzcGFjZShqZW5raW5zU2VydmljZU5hbWVBbmRQb3J0LCBVcmxIZWxwZXJzLmpvaW4oXCJqb2JcIiwgJHNjb3BlLmpvYklkLCAkc2NvcGUuYnVpbGRJZCwgXCJmYWJyaWM4L3N0YWdlcy9cIikpO1xyXG4gICAgICAgICAgICBpZiAodXJsICYmICghJHNjb3BlLm1vZGVsLnN0YWdlcyB8fCBLdWJlcm5ldGVzLmtlZXBQb2xsaW5nTW9kZWwpKSB7XHJcbiAgICAgICAgICAgICAgJGh0dHAuZ2V0KHVybCkuXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVucmljaEplbmtpbnNTdGFnZXMoZGF0YSwgJHNjb3BlLmlkLCAkc2NvcGUuam9iSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNPYmplY3RDaGFuZ2VkKGRhdGEsICRzY29wZS5lbnRpdHlDaGFuZ2VkQ2FjaGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhcImVudGl0eSBoYXMgY2hhbmdlZCFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYnVpbGQgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLm1vZGVsLnN0YWdlcyA9IGRhdGEuc3RhZ2VzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAkc2NvcGUubW9kZWwuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICAgICAgICB9KS5cclxuICAgICAgICAgICAgICAgIGVycm9yKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byBsb2FkIFwiICsgdXJsICsgXCIgXCIgKyBkYXRhICsgXCIgXCIgKyBzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAkc2NvcGUubW9kZWwuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJHNjb3BlLm1vZGVsLmZldGNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2t1YmVybmV0ZXMvdHMva3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJFbnJpY2hlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVyTmF2aWdhdGlvbi50c1wiLz5cclxuXHJcbm1vZHVsZSBEZXZlbG9wZXIge1xyXG4gIF9tb2R1bGUuZGlyZWN0aXZlKFwicGlwZWxpbmVWaWV3XCIsICgpID0+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRlbXBsYXRlVXJsOiB0ZW1wbGF0ZVBhdGggKyAncGlwZWxpbmVWaWV3Lmh0bWwnXHJcbiAgICB9O1xyXG4gIH0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2t1YmVybmV0ZXMvdHMva3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJQbHVnaW4udHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJFbnJpY2hlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVyTmF2aWdhdGlvbi50c1wiLz5cclxuXHJcbm1vZHVsZSBEZXZlbG9wZXIge1xyXG5cclxuICBleHBvcnQgdmFyIFBpcGVsaW5lc0NvbnRyb2xsZXIgPSBfbW9kdWxlLmNvbnRyb2xsZXIoXCJEZXZlbG9wZXIuUGlwZWxpbmVzQ29udHJvbGxlclwiLCAoJHNjb3BlLCBLdWJlcm5ldGVzTW9kZWw6S3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNTY2hlbWEsXHJcbiAgICAgICAgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJvdXRlUGFyYW1zLCAkaHR0cCwgJHRpbWVvdXQsIEt1YmVybmV0ZXNBcGlVUkwsIFNlcnZpY2VSZWdpc3RyeSwgJGVsZW1lbnQpID0+IHtcclxuXHJcbiAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICRzY29wZS5rdWJlTW9kZWwgPSBLdWJlcm5ldGVzTW9kZWw7XHJcbiAgICAkc2NvcGUuaWQgPSAkcm91dGVQYXJhbXNbXCJpZFwiXTtcclxuICAgICRzY29wZS5qb2JJZCA9ICRzY29wZS5qb2JJZCB8fCAkcm91dGVQYXJhbXNbXCJqb2JcIl07XHJcbiAgICAkc2NvcGUuc2NoZW1hID0gS3ViZXJuZXRlc1NjaGVtYTtcclxuICAgICRzY29wZS5lbnRpdHlDaGFuZ2VkQ2FjaGUgPSB7fTtcclxuXHJcbiAgICAkZWxlbWVudC5vbignJGRlc3Ryb3knLCAoKSA9PiB7XHJcbiAgICAgICRzY29wZS4kZGVzdHJveSgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgJHNjb3BlLm1vZGVsID0ge1xyXG4gICAgICBqb2I6IG51bGwsXHJcbiAgICAgIHBlbmRpbmdPbmx5OiAkc2NvcGUucGVuZGluZ1BpcGVsaW5lc09ubHlcclxuICAgIH07XHJcbiAgICBLdWJlcm5ldGVzLmluaXRTaGFyZWQoJHNjb3BlLCAkbG9jYXRpb24sICRodHRwLCAkdGltZW91dCwgJHJvdXRlUGFyYW1zLCBLdWJlcm5ldGVzTW9kZWwsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc0FwaVVSTCk7XHJcbiAgICAkc2NvcGUuYnJlYWRjcnVtYkNvbmZpZyA9IERldmVsb3Blci5jcmVhdGVQcm9qZWN0QnJlYWRjcnVtYnMoJHNjb3BlLmlkKTtcclxuICAgICRzY29wZS5zdWJUYWJDb25maWcgPSBEZXZlbG9wZXIuY3JlYXRlUHJvamVjdFN1Yk5hdkJhcnMoJHNjb3BlLmlkLCAkc2NvcGUuam9iSWQpO1xyXG5cclxuICAgICRzY29wZS4kb24oJ2t1YmVybmV0ZXNNb2RlbFVwZGF0ZWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgIH0pO1xyXG5cclxuICAgICRzY29wZS4kb24oJyRyb3V0ZVVwZGF0ZScsICgkZXZlbnQpID0+IHtcclxuICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgJHNjb3BlLiR3YXRjaCgnbW9kZWwucGVuZGluZ09ubHknLCAoJGV2ZW50KSA9PiB7XHJcbiAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgIH0pO1xyXG5cclxuICAgICRzY29wZS5zZWxlY3RCdWlsZCA9IChidWlsZCkgPT4ge1xyXG4gICAgICB2YXIgaWQgPSBidWlsZC5pZDtcclxuICAgICAgaWYgKGlkKSB7XHJcbiAgICAgICAgaWYgKGlkICE9PSAkc2NvcGUuc2VsZWN0ZWRCdWlsZElkKSB7XHJcbiAgICAgICAgICAkc2NvcGUuc2VsZWN0ZWRCdWlsZElkID0gaWQ7XHJcbiAgICAgICAgICAkc2NvcGUuJGJyb2FkY2FzdChcImplbmtpbnNTZWxlY3RlZEJ1aWxkXCIsIGJ1aWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdmFyIHVwZGF0ZURhdGEgPSBfLmRlYm91bmNlKCgpID0+IHtcclxuICAgICAgdmFyIGVudGl0eSA9ICRzY29wZS5lbnRpdHk7XHJcbiAgICAgIGlmICgkc2NvcGUuam9iSWQpIHtcclxuICAgICAgICBpZiAoKCFlbnRpdHkgfHwgZW50aXR5LiRqZW5raW5zSm9iKSkge1xyXG4gICAgICAgICAgdmFyIHF1ZXJ5UGF0aCA9IFwiZmFicmljOC9zdGFnZXMvXCI7XHJcbiAgICAgICAgICBpZiAoJHNjb3BlLm1vZGVsLnBlbmRpbmdPbmx5KSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5UGF0aCA9IFwiZmFicmljOC9wZW5kaW5nU3RhZ2VzL1wiO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdmFyIHVybCA9IEt1YmVybmV0ZXMua3ViZXJuZXRlc1Byb3h5VXJsRm9yU2VydmljZUN1cnJlbnROYW1lc3BhY2UoamVua2luc1NlcnZpY2VOYW1lQW5kUG9ydCwgVXJsSGVscGVycy5qb2luKFwiam9iXCIsICRzY29wZS5qb2JJZCwgcXVlcnlQYXRoKSk7XHJcbiAgICAgICAgICBpZiAodXJsICYmICghJHNjb3BlLm1vZGVsLmpvYiB8fCBLdWJlcm5ldGVzLmtlZXBQb2xsaW5nTW9kZWwpKSB7XHJcbiAgICAgICAgICAgICRodHRwLmdldCh1cmwpLlxyXG4gICAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBlbnJpY2hKZW5raW5zUGlwZWxpbmVKb2IoZGF0YSwgJHNjb3BlLmlkLCAkc2NvcGUuam9iSWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGhhc09iamVjdENoYW5nZWQoZGF0YSwgJHNjb3BlLmVudGl0eUNoYW5nZWRDYWNoZSkpIHtcclxuICAgICAgICAgICAgICAgICAgbG9nLmluZm8oXCJlbnRpdHkgaGFzIGNoYW5nZWQhXCIpO1xyXG4gICAgICAgICAgICAgICAgICAkc2NvcGUubW9kZWwuam9iID0gZGF0YTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIHZhciBidWlsZHMgPSBkYXRhLmJ1aWxkcztcclxuICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkcyAmJiBidWlsZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnNlbGVjdEJ1aWxkKGJ1aWxkc1swXSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgJHNjb3BlLm1vZGVsLmZldGNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgICBlcnJvcihmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byBsb2FkIFwiICsgdXJsICsgXCIgXCIgKyBkYXRhICsgXCIgXCIgKyBzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICRzY29wZS5tb2RlbC5mZXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICgkc2NvcGUubW9kZWwpIHtcclxuICAgICAgICAgICAgS3ViZXJuZXRlcy5lbnJpY2hCdWlsZHMoJHNjb3BlLmt1YmVNb2RlbC5idWlsZHMpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGJ1aWxkcyA9IFtdO1xyXG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goJHNjb3BlLmt1YmVNb2RlbC5idWlsZHMsIChidWlsZCkgPT4ge1xyXG4gICAgICAgICAgICAgIHZhciBsYWJlbHMgPSBLdWJlcm5ldGVzLmdldExhYmVscyhidWlsZCk7XHJcbiAgICAgICAgICAgICAgdmFyIGFwcCA9IGxhYmVsc1tcImFwcFwiXTtcclxuICAgICAgICAgICAgICBpZiAoYXBwID09PSAkc2NvcGUucHJvamVjdElkKSB7XHJcbiAgICAgICAgICAgICAgICBidWlsZHMucHVzaChidWlsZCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgYnVpbGRzID0gXy5zb3J0QnkoYnVpbGRzLCBcIiRjcmVhdGlvbkRhdGVcIikucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICB2YXIgYWxsQnVpbGRzID0gYnVpbGRzO1xyXG4gICAgICAgICAgICBpZiAoYWxsQnVpbGRzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICBidWlsZHMgPSBfLmZpbHRlcihhbGxCdWlsZHMsIChiKSA9PiAhYi4kY3JlYXRpb25EYXRlKTtcclxuICAgICAgICAgICAgICBpZiAoIWJ1aWxkcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGJ1aWxkcyA9IFthbGxCdWlsZHNbMF1dO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcGlwZWxpbmVzID0gW107XHJcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChidWlsZHMsIChidWlsZCkgPT4ge1xyXG4gICAgICAgICAgICAgIHZhciBidWlsZFN0YXR1cyA9IGJ1aWxkLnN0YXR1cyB8fCB7fTtcclxuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gYnVpbGRTdGF0dXMucGhhc2UgfHwgXCJcIjtcclxuICAgICAgICAgICAgICB2YXIgcmVzdWx0VXBwZXJDYXNlID0gcmVzdWx0LnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgICAgICAgIHZhciBkZXNjcmlwdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgdmFyICR2aWV3TGluayA9IGJ1aWxkLiR2aWV3TGluaztcclxuICAgICAgICAgICAgICB2YXIgJGxvZ0xpbmsgPSBidWlsZC4kbG9nc0xpbms7XHJcbiAgICAgICAgICAgICAgdmFyICR0aW1lc3RhbXAgPSBidWlsZC4kY3JlYXRpb25EYXRlO1xyXG4gICAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IGJ1aWxkU3RhdHVzLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgIGlmIChkdXJhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgLy8gMTdzID0gMTcsMDAwLDAwMCwwMDAgb24gb3BlbnNoaWZ0XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGR1cmF0aW9uIC8gMTAwMDAwMDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdmFyIGRpc3BsYXlOYW1lID0gS3ViZXJuZXRlcy5nZXROYW1lKGJ1aWxkKTtcclxuICAgICAgICAgICAgICB2YXIgJGljb25DbGFzcyA9IGNyZWF0ZUJ1aWxkU3RhdHVzSWNvbkNsYXNzKHJlc3VsdFVwcGVyQ2FzZSk7XHJcbiAgICAgICAgICAgICAgdmFyICRiYWNrZ3JvdW5kQ2xhc3MgPSBjcmVhdGVCdWlsZFN0YXR1c0JhY2tncm91bmRDbGFzcyhyZXN1bHRVcHBlckNhc2UpO1xyXG4gICAgICAgICAgICAgIHZhciBzdGFnZSA9IHtcclxuICAgICAgICAgICAgICAgIHN0YWdlTmFtZTogXCJPcGVuU2hpZnQgQnVpbGRcIixcclxuICAgICAgICAgICAgICAgICR2aWV3TGluazogJHZpZXdMaW5rLFxyXG4gICAgICAgICAgICAgICAgJGxvZ0xpbms6ICRsb2dMaW5rLFxyXG4gICAgICAgICAgICAgICAgJHN0YXJ0VGltZTogJHRpbWVzdGFtcCxcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcclxuICAgICAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LFxyXG4gICAgICAgICAgICAgICAgJGljb25DbGFzczogJGljb25DbGFzcyxcclxuICAgICAgICAgICAgICAgICRiYWNrZ3JvdW5kQ2xhc3M6ICRiYWNrZ3JvdW5kQ2xhc3NcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIHZhciBwaXBlbGluZSA9IHtcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBkaXNwbGF5TmFtZSxcclxuICAgICAgICAgICAgICAgICR2aWV3TGluazogJHZpZXdMaW5rLFxyXG4gICAgICAgICAgICAgICAgJGxvZ0xpbms6ICRsb2dMaW5rLFxyXG4gICAgICAgICAgICAgICAgJHRpbWVzdGFtcDogJHRpbWVzdGFtcCxcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcclxuICAgICAgICAgICAgICAgIHN0YWdlczogW3N0YWdlXVxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgcGlwZWxpbmVzLnB1c2gocGlwZWxpbmUpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIGxldHMgZmlsdGVyIHRoZSBPcGVuU2hpZnQgYnVpbGRzIGFuZCBtYWtlIGEgcGlwZWxpbmUgZnJvbSB0aGF0XHJcbiAgICAgICAgICAgICRzY29wZS5tb2RlbC5qb2IgPSB7XHJcbiAgICAgICAgICAgICAgJGpvYklkOiAkc2NvcGUuam9iSWQsXHJcbiAgICAgICAgICAgICAgJHByb2plY3Q6ICRzY29wZS5wcm9qZWN0SWQsXHJcbiAgICAgICAgICAgICAgYnVpbGRzOiBwaXBlbGluZXNcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICRzY29wZS5tb2RlbC5mZXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICRzY29wZS5tb2RlbC5mZXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICB9XHJcbiAgICB9LCA1MCk7XHJcblxyXG4gICAgdXBkYXRlRGF0YSgpO1xyXG5cclxuICB9KTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9rdWJlcm5ldGVzL3RzL2t1YmVybmV0ZXNIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVyRW5yaWNoZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVySGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRldmVsb3Blck5hdmlnYXRpb24udHNcIi8+XHJcblxyXG5tb2R1bGUgRGV2ZWxvcGVyIHtcclxuXHJcbiAgZXhwb3J0IHZhciBQcm9qZWN0Q29udHJvbGxlciA9IGNvbnRyb2xsZXIoXCJQcm9qZWN0Q29udHJvbGxlclwiLFxyXG4gICAgW1wiJHNjb3BlXCIsIFwiJGVsZW1lbnRcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCJLdWJlcm5ldGVzU2NoZW1hXCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkbG9jYXRpb25cIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiS3ViZXJuZXRlc0FwaVVSTFwiLFxyXG4gICAgICAoJHNjb3BlLCAkZWxlbWVudCwgS3ViZXJuZXRlc01vZGVsOkt1YmVybmV0ZXMuS3ViZXJuZXRlc01vZGVsU2VydmljZSwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzU2NoZW1hLFxyXG4gICAgICAgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJvdXRlUGFyYW1zLCAkaHR0cCwgJHRpbWVvdXQsIEt1YmVybmV0ZXNBcGlVUkwpID0+IHtcclxuXHJcbiAgICAgICAgJHNjb3BlLmt1YmVybmV0ZXMgPSBLdWJlcm5ldGVzU3RhdGU7XHJcbiAgICAgICAgJHNjb3BlLm1vZGVsID0gS3ViZXJuZXRlc01vZGVsO1xyXG4gICAgICAgICRzY29wZS5pZCA9ICRyb3V0ZVBhcmFtc1tcImlkXCJdO1xyXG5cclxuICAgICAgICAkc2NvcGUuc2NoZW1hID0gS3ViZXJuZXRlc1NjaGVtYTtcclxuICAgICAgICAkc2NvcGUuY29uZmlnID0gS3ViZXJuZXRlc1NjaGVtYS5kZWZpbml0aW9ucy5vc19idWlsZF9CdWlsZENvbmZpZztcclxuICAgICAgICAkc2NvcGUuZW50aXR5Q2hhbmdlZENhY2hlID0ge307XHJcbiAgICAgICAgJHNjb3BlLmVudlZlcnNpb25zQ2FjaGUgPSB7fTtcclxuICAgICAgICAkc2NvcGUuZW52TlNDYWNoZXMgPSB7fTtcclxuICAgICAgICAkc2NvcGUuZW52VmVyc2lvbnMgPSB7fTtcclxuXHJcbiAgICAgICAgS3ViZXJuZXRlcy5pbml0U2hhcmVkKCRzY29wZSwgJGxvY2F0aW9uLCAkaHR0cCwgJHRpbWVvdXQsICRyb3V0ZVBhcmFtcywgS3ViZXJuZXRlc01vZGVsLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNBcGlVUkwpO1xyXG4gICAgICAgICRzY29wZS5icmVhZGNydW1iQ29uZmlnID0gW107IC8vRGV2ZWxvcGVyLmNyZWF0ZVByb2plY3RCcmVhZGNydW1icygkc2NvcGUuaWQpO1xyXG4gICAgICAgIHVwZGF0ZVRhYnMoKTtcclxuICAgICAgICAvLyB0aGlzIGlzIHVzZWQgZm9yIHRoZSBwZW5kaW5nUGlwZWxpbmVzIHZpZXdcclxuICAgICAgICAkc2NvcGUuam9iSWQgPSAkc2NvcGUuaWQ7XHJcbiAgICAgICAgJHNjb3BlLnBlbmRpbmdQaXBlbGluZXNPbmx5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgJHNjb3BlLiRvbignamVua2luc1NlbGVjdGVkQnVpbGQnLCAoZXZlbnQsIGJ1aWxkKSA9PiB7XHJcbiAgICAgICAgICAkc2NvcGUuc2VsZWN0ZWRCdWlsZCA9IGJ1aWxkO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBUT0RPIHRoaXMgc2hvdWxkIGJlIHVubmVjZXNzYXJ5IGJ1dCBzZWVtcyBzb21ldGllbXMgdGhpcyB3YXRjaCBkb2Vzbid0IGFsd2F5cyB0cmlnZ2VyIHVubGVzcyB5b3UgaGl0IHJlbG9hZCBvbiB0aGlzIHBhZ2VcclxuICAgICAgICBpZiAoJHNjb3BlLm1vZGVsLmJ1aWxkY29uZmlncykge1xyXG4gICAgICAgICAgb25CdWlsZENvbmZpZ3MoJHNjb3BlLm1vZGVsLmJ1aWxkY29uZmlncyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEt1YmVybmV0ZXMud2F0Y2goJHNjb3BlLCAkZWxlbWVudCwgXCJidWlsZGNvbmZpZ3NcIiwgJHNjb3BlLm5hbWVzcGFjZSwgb25CdWlsZENvbmZpZ3MpO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBvbkJ1aWxkQ29uZmlncyhidWlsZENvbmZpZ3MpIHtcclxuICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChidWlsZENvbmZpZ3MsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBuYW1lID0gS3ViZXJuZXRlcy5nZXROYW1lKGRhdGEpO1xyXG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJHNjb3BlLmlkKSB7XHJcbiAgICAgICAgICAgICAgdmFyIHNvcnRlZEJ1aWxkcyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgS3ViZXJuZXRlcy5lbnJpY2hCdWlsZENvbmZpZyhkYXRhLCBzb3J0ZWRCdWlsZHMpO1xyXG4gICAgICAgICAgICAgIGlmIChoYXNPYmplY3RDaGFuZ2VkKGRhdGEsICRzY29wZS5lbnRpdHlDaGFuZ2VkQ2FjaGUpKSB7XHJcbiAgICAgICAgICAgICAgICBsb2cuaW5mbyhcImVudGl0eSBoYXMgY2hhbmdlZCFcIik7XHJcbiAgICAgICAgICAgICAgICAkc2NvcGUuZW50aXR5ID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICRzY29wZS5lbnRpdHkuJGJ1aWxkID0gKGRhdGEuJGZhYnJpYzhDb2RlVmlld3MgfHwge30pWydmYWJyaWM4LmxpbmsuYnJvd3NlR29ncy52aWV3J107XHJcbiAgICAgICAgICAgICAgICAkc2NvcGUubW9kZWwuc2V0UHJvamVjdCgkc2NvcGUuZW50aXR5KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdXBkYXRlRW52aXJvbm1lbnRXYXRjaCgpO1xyXG4gICAgICAgICAgICAgIHVwZGF0ZVRhYnMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAkc2NvcGUubW9kZWwuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdlIGhhdmUgdXBkYXRlZCB0aGUgZW50aXR5IHNvIGxldHMgbWFrZSBzdXJlIHdlIGFyZSB3YXRjaGluZyBhbGwgdGhlIGVudmlyb25tZW50cyB0byBmaW5kXHJcbiAgICAgICAgICogdGhlIHByb2plY3QgdmVyc2lvbnMgZm9yIGVhY2ggbmFtZXNwYWNlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlRW52aXJvbm1lbnRXYXRjaCgpIHtcclxuICAgICAgICAgIHZhciBwcm9qZWN0ID0gJHNjb3BlLmVudGl0eTtcclxuICAgICAgICAgIGlmIChwcm9qZWN0KSB7XHJcbiAgICAgICAgICAgIHZhciBqZW5raW5zSm9iID0gcHJvamVjdC4kamVua2luc0pvYjtcclxuICAgICAgICAgICAgaWYgKGplbmtpbnNKb2IpIHtcclxuICAgICAgICAgICAgICB2YXIgYnVpbGRzVGFiID0gXy5maW5kKCRzY29wZS5zdWJUYWJDb25maWcsIHtpZDogXCJidWlsZHNcIn0pO1xyXG4gICAgICAgICAgICAgIGlmIChidWlsZHNUYWIpIHtcclxuICAgICAgICAgICAgICAgIGJ1aWxkc1RhYltcImhyZWZcIl0gPSBVcmxIZWxwZXJzLmpvaW4oXCIvd29ya3NwYWNlc1wiLCBLdWJlcm5ldGVzLmN1cnJlbnRLdWJlcm5ldGVzTmFtZXNwYWNlKCksIFwicHJvamVjdHNcIiwgJHNjb3BlLmlkLCBcImplbmtpbnNKb2JcIiwgamVua2luc0pvYik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocHJvamVjdC5lbnZpcm9ubWVudHMsIChlbnYpID0+IHtcclxuICAgICAgICAgICAgICB2YXIgbnMgPSBlbnYubmFtZXNwYWNlO1xyXG4gICAgICAgICAgICAgIHZhciBjYWNoZXMgPSAkc2NvcGUuZW52TlNDYWNoZXNbbnNdO1xyXG4gICAgICAgICAgICAgIGlmICghY2FjaGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjYWNoZXMgPSB7fTtcclxuICAgICAgICAgICAgICAgICRzY29wZS5lbnZOU0NhY2hlc1tuc10gPSBjYWNoZXM7XHJcbiAgICAgICAgICAgICAgICBsb2FkUHJvamVjdFZlcnNpb25zKCRzY29wZSwgJGVsZW1lbnQsIHByb2plY3QsIGVudiwgbnMsICRzY29wZS5lbnZWZXJzaW9ucywgY2FjaGVzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlVGFicygpIHtcclxuICAgICAgICAgICRzY29wZS5zdWJUYWJDb25maWcgPSBEZXZlbG9wZXIuY3JlYXRlUHJvamVjdFN1Yk5hdkJhcnMoJHNjb3BlLmlkLCBudWxsLCAkc2NvcGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1dKTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVyUGx1Z2luLnRzXCIvPlxyXG5cclxubW9kdWxlIERldmVsb3BlciB7XHJcblxyXG4gIF9tb2R1bGUuY29udHJvbGxlcignRGV2ZWxvcGVyLlByb2plY3RTZWxlY3RvcicsIFsnJHNjb3BlJywgJyRyb3V0ZVBhcmFtcycsICdLdWJlcm5ldGVzTW9kZWwnLCAoJHNjb3BlLCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCkgPT4ge1xyXG4gICAgdmFyIHByb2plY3RJZCA9ICRyb3V0ZVBhcmFtc1sncHJvamVjdElkJ10gfHwgJHJvdXRlUGFyYW1zWydwcm9qZWN0J10gfHwgJHJvdXRlUGFyYW1zWydpZCddO1xyXG4gICAgaWYgKHByb2plY3RJZCkge1xyXG4gICAgICAkc2NvcGUucHJvamVjdElkID0gcHJvamVjdElkO1xyXG4gICAgICAkc2NvcGUubW9kZWwgPSBLdWJlcm5ldGVzTW9kZWxcclxuICAgICAgJHNjb3BlLiR3YXRjaCgnbW9kZWwuYnVpbGRjb25maWdzJywgKGJ1aWxkY29uZmlncykgPT4ge1xyXG4gICAgICAgICRzY29wZS5wcm9qZWN0cyA9IGJ1aWxkY29uZmlncztcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsb2cuaW5mbyhcIm5vIHByb2plY3QgSUQgaW4gcm91dGVQYXJhbXM6IFwiLCAkcm91dGVQYXJhbXMpO1xyXG4gICAgfVxyXG4gIH1dKTtcclxuXHJcbn1cclxuXHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2t1YmVybmV0ZXMvdHMva3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJFbnJpY2hlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVyTmF2aWdhdGlvbi50c1wiLz5cclxuXHJcbm1vZHVsZSBEZXZlbG9wZXIge1xyXG5cclxuICBleHBvcnQgdmFyIFByb2plY3RzQ29udHJvbGxlciA9IGNvbnRyb2xsZXIoXCJQcm9qZWN0c0NvbnRyb2xsZXJcIiwgW1wiJHNjb3BlXCIsIFwiS3ViZXJuZXRlc01vZGVsXCIsIFwiS3ViZXJuZXRlc1N0YXRlXCIsIFwiJGRpYWxvZ1wiLCBcIiR3aW5kb3dcIiwgXCIkdGVtcGxhdGVDYWNoZVwiLCBcIiRyb3V0ZVBhcmFtc1wiLCBcIiRsb2NhdGlvblwiLCBcImxvY2FsU3RvcmFnZVwiLCBcIiRodHRwXCIsIFwiJHRpbWVvdXRcIiwgXCJLdWJlcm5ldGVzQXBpVVJMXCIsXHJcbiAgICAoJHNjb3BlLCBLdWJlcm5ldGVzTW9kZWw6S3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzU3RhdGUsICRkaWFsb2csICR3aW5kb3csICR0ZW1wbGF0ZUNhY2hlLCAkcm91dGVQYXJhbXMsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlLCBsb2NhbFN0b3JhZ2UsICRodHRwLCAkdGltZW91dCwgS3ViZXJuZXRlc0FwaVVSTCkgPT4ge1xyXG5cclxuICAgICAgJHNjb3BlLmt1YmVybmV0ZXMgPSBLdWJlcm5ldGVzU3RhdGU7XHJcbiAgICAgICRzY29wZS5tb2RlbCA9IEt1YmVybmV0ZXNNb2RlbDtcclxuXHJcbiAgICAgICRzY29wZS50YWJsZUNvbmZpZyA9IHtcclxuICAgICAgICBkYXRhOiAnbW9kZWwuYnVpbGRjb25maWdzJyxcclxuICAgICAgICBzaG93U2VsZWN0aW9uQ2hlY2tib3g6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlUm93Q2xpY2tTZWxlY3Rpb246IGZhbHNlLFxyXG4gICAgICAgIG11bHRpU2VsZWN0OiB0cnVlLFxyXG4gICAgICAgIHNlbGVjdGVkSXRlbXM6IFtdLFxyXG4gICAgICAgIGZpbHRlck9wdGlvbnM6IHtcclxuICAgICAgICAgIGZpbHRlclRleHQ6ICRsb2NhdGlvbi5zZWFyY2goKVtcInFcIl0gfHwgJydcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbHVtbkRlZnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICckbmFtZScsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTmFtZScsXHJcbiAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiaWRUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgICB9LFxyXG4vKlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZDogJ3NwZWMuc291cmNlLnR5cGUnLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1NvdXJjZSdcclxuICAgICAgICAgIH0sXHJcbiovXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnc3BlYy5zb3VyY2UuZ2l0LnVyaScsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnUmVwb3NpdG9yeSdcclxuICAgICAgICAgIH0sXHJcbi8qXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnc3BlYy5zdHJhdGVneS50eXBlJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdTdHJhdGVneSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnc3BlYy5zdHJhdGVneS5zdGlTdHJhdGVneS5pbWFnZScsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnU291cmNlIEltYWdlJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICdzcGVjLm91dHB1dC5pbWFnZVRhZycsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnT3V0cHV0IEltYWdlJ1xyXG4gICAgICAgICAgfSxcclxuKi9cclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICdtZXRhZGF0YS5kZXNjcmlwdGlvbicsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnRGVzY3JpcHRpb24nXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZDogJyRjcmVhdGlvbkRhdGUnLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0NyZWF0ZWQnLFxyXG4gICAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcImNyZWF0aW9uVGltZVRlbXBsYXRlLmh0bWxcIilcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnJGxhYmVsc1RleHQnLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0xhYmVscycsXHJcbiAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwibGFiZWxUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgS3ViZXJuZXRlcy5pbml0U2hhcmVkKCRzY29wZSwgJGxvY2F0aW9uLCAkaHR0cCwgJHRpbWVvdXQsICRyb3V0ZVBhcmFtcywgS3ViZXJuZXRlc01vZGVsLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNBcGlVUkwpO1xyXG5cclxuICAgICAgJHNjb3BlLmJyZWFkY3J1bWJDb25maWcgPSBjcmVhdGVQcm9qZWN0QnJlYWRjcnVtYnMoKTtcclxuICAgICAgJHNjb3BlLnN1YlRhYkNvbmZpZyA9IERldmVsb3Blci5jcmVhdGVXb3Jrc3BhY2VTdWJOYXZCYXJzKCk7XHJcblxyXG4gICAgICAvLyBUT0RPXHJcbiAgICAgIC8vJHNjb3BlLmlzTG9nZ2VkSW50b0dvZ3MgPSBGb3JnZS5pc0xvZ2dlZEludG9Hb2dzO1xyXG5cclxuICAgICAgJHNjb3BlLmRlbGV0ZVByb21wdCA9IChzZWxlY3RlZCkgPT4ge1xyXG4gICAgICAgIFVJLm11bHRpSXRlbUNvbmZpcm1BY3Rpb25EaWFsb2coPFVJLk11bHRpSXRlbUNvbmZpcm1BY3Rpb25PcHRpb25zPntcclxuICAgICAgICAgIGNvbGxlY3Rpb246IHNlbGVjdGVkLFxyXG4gICAgICAgICAgaW5kZXg6ICckbmFtZScsXHJcbiAgICAgICAgICBvbkNsb3NlOiAocmVzdWx0OmJvb2xlYW4pID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGRlbGV0ZVNlbGVjdGVkKHNlbGVjdGVkLCBuZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV4dCkge1xyXG4gICAgICAgICAgICAgICAgICBkZWxldGVFbnRpdHkobmV4dCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZVNlbGVjdGVkKHNlbGVjdGVkLCBzZWxlY3RlZC5zaGlmdCgpKTtcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAvLyBUT0RPXHJcbiAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZURhdGEoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGRlbGV0ZVNlbGVjdGVkKHNlbGVjdGVkLCBzZWxlY3RlZC5zaGlmdCgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHRpdGxlOiAnRGVsZXRlIEFwcHMnLFxyXG4gICAgICAgICAgYWN0aW9uOiAnVGhlIGZvbGxvd2luZyBBcHBzIHdpbGwgYmUgZGVsZXRlZDonLFxyXG4gICAgICAgICAgb2tUZXh0OiAnRGVsZXRlJyxcclxuICAgICAgICAgIG9rQ2xhc3M6ICdidG4tZGFuZ2VyJyxcclxuICAgICAgICAgIGN1c3RvbTogXCJUaGlzIG9wZXJhdGlvbiBpcyBwZXJtYW5lbnQgb25jZSBjb21wbGV0ZWQhXCIsXHJcbiAgICAgICAgICBjdXN0b21DbGFzczogXCJhbGVydCBhbGVydC13YXJuaW5nXCJcclxuICAgICAgICB9KS5vcGVuKCk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmdW5jdGlvbiBkZWxldGVFbnRpdHkoc2VsZWN0aW9uLCBuZXh0Q2FsbGJhY2spIHtcclxuICAgICAgICB2YXIgbmFtZSA9IChzZWxlY3Rpb24gfHwge30pLiRuYW1lO1xyXG4gICAgICAgIHZhciBqZW5raW5zSm9iID0gc2VsZWN0aW9uLiRqZW5raW5zSm9iO1xyXG4gICAgICAgIHZhciBwdWJsaWNKZW5raW5zVXJsID0gamVua2luc0xpbmsoKTtcclxuICAgICAgICAvL3ZhciBqZW5raW5zVXJsID0gQ29yZS5wYXRoR2V0KHNlbGVjdGlvbiwgW1wiJGZhYnJpYzhWaWV3c1wiLCBcImZhYnJpYzgubGluay5qZW5raW5zLmpvYlwiLCBcInVybFwiXSk7XHJcbiAgICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWJvdXQgdG8gZGVsZXRlIGJ1aWxkIGNvbmZpZzogXCIgKyBuYW1lKTtcclxuICAgICAgICAgIHZhciB1cmwgPSBLdWJlcm5ldGVzLmJ1aWxkQ29uZmlnUmVzdFVybChuYW1lKTtcclxuICAgICAgICAgICRodHRwLmRlbGV0ZSh1cmwpLlxyXG4gICAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgIG5leHRDYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9KS5cclxuICAgICAgICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgbG9nLndhcm4oXCJGYWlsZWQgdG8gZGVsZXRlIGJ1aWxkIGNvbmZpZyBvbiBcIiArIHVybCArIFwiIFwiICsgZGF0YSArIFwiIFwiICsgc3RhdHVzKTtcclxuICAgICAgICAgICAgICBuZXh0Q2FsbGJhY2soKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwid2FybmluZzogbm8gbmFtZSBmb3Igc2VsZWN0aW9uOiBcIiArIGFuZ3VsYXIudG9Kc29uKHNlbGVjdGlvbikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGplbmtpbnNKb2IgJiYgcHVibGljSmVua2luc1VybCkge1xyXG4gICAgICAgICAgdmFyIHVybCA9IEt1YmVybmV0ZXMua3ViZXJuZXRlc1Byb3h5VXJsRm9yU2VydmljZUN1cnJlbnROYW1lc3BhY2UoamVua2luc1NlcnZpY2VOYW1lQW5kUG9ydCwgVXJsSGVscGVycy5qb2luKFwiam9iXCIsIGplbmtpbnNKb2IsIFwiZG9EZWxldGVcIikpO1xyXG4gICAgICAgICAgdmFyIGJvZHkgPSBcIlwiO1xyXG4gICAgICAgICAgdmFyIGNvbmZpZyA9IHtcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiBcInRleHQvcGxhaW5cIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgbG9nLmluZm8oXCJwb3N0aW5nIHRvIGplbmtpbnNVcmw6IFwiICsgdXJsKTtcclxuICAgICAgICAgICRodHRwLnBvc3QodXJsLCBib2R5LCBjb25maWcpLlxyXG4gICAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgIGxvZy5pbmZvKFwiTWFuYWdlZCB0byBkZWxldGUgXCIgKyB1cmwpO1xyXG4gICAgICAgICAgICB9KS5cclxuICAgICAgICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgbG9nLndhcm4oXCJGYWlsZWQgdG8gZGVsZXRlIGplbmtpbnMgam9iIGF0IFwiICsgdXJsICsgXCIgXCIgKyBkYXRhICsgXCIgXCIgKyBzdGF0dXMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbi8qXHJcbiAgICAgICRzY29wZS4ka2VlcFBvbGxpbmcgPSAoKSA9PiBLdWJlcm5ldGVzLmtlZXBQb2xsaW5nTW9kZWw7XHJcbiAgICAgICRzY29wZS5mZXRjaCA9IFBvbGxIZWxwZXJzLnNldHVwUG9sbGluZygkc2NvcGUsIChuZXh0OigpID0+IHZvaWQpID0+IHtcclxuICAgICAgICB2YXIgdXJsID0gS3ViZXJuZXRlcy5idWlsZENvbmZpZ3NSZXN0VVJMKCk7XHJcbiAgICAgICAgJGh0dHAuZ2V0KHVybCkuXHJcbiAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJnb3QgZGF0YSBcIiArIGFuZ3VsYXIudG9Kc29uKGRhdGEsIHRydWUpKTtcclxuICAgICAgICAgICAgICB2YXIgc29ydGVkQnVpbGRzID0gbnVsbDtcclxuICAgICAgICAgICAgICAkc2NvcGUuYnVpbGRDb25maWdzID0gS3ViZXJuZXRlcy5lbnJpY2hCdWlsZENvbmZpZ3MoZGF0YS5pdGVtcywgc29ydGVkQnVpbGRzKTtcclxuICAgICAgICAgICAgICAkc2NvcGUubW9kZWwuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgQ29yZS4kYXBwbHkoJHNjb3BlKTtcclxuICAgICAgICAgICAgICBuZXh0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgIGxvZy53YXJuKFwiRmFpbGVkIHRvIGxvYWQgXCIgKyB1cmwgKyBcIiBcIiArIGRhdGEgKyBcIiBcIiArIHN0YXR1cyk7XHJcbiAgICAgICAgICAgIG5leHQoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgICRzY29wZS5mZXRjaCgpO1xyXG4qL1xyXG4gICAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2t1YmVybmV0ZXMvdHMva3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJFbnJpY2hlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkZXZlbG9wZXJIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiZGV2ZWxvcGVyTmF2aWdhdGlvbi50c1wiLz5cclxuXHJcbm1vZHVsZSBEZXZlbG9wZXIge1xyXG5cclxuICBleHBvcnQgdmFyIFdvcmtzcGFjZUNvbnRyb2xsZXIgPSBjb250cm9sbGVyKFwiV29ya3NwYWNlQ29udHJvbGxlclwiLFxyXG4gICAgW1wiJHNjb3BlXCIsIFwiS3ViZXJuZXRlc01vZGVsXCIsIFwiS3ViZXJuZXRlc1N0YXRlXCIsIFwiS3ViZXJuZXRlc1NjaGVtYVwiLCBcIiR0ZW1wbGF0ZUNhY2hlXCIsIFwiJGxvY2F0aW9uXCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwiJGh0dHBcIiwgXCIkdGltZW91dFwiLCBcIkt1YmVybmV0ZXNBcGlVUkxcIixcclxuICAgICAgKCRzY29wZSwgS3ViZXJuZXRlc01vZGVsOkt1YmVybmV0ZXMuS3ViZXJuZXRlc01vZGVsU2VydmljZSwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzU2NoZW1hLFxyXG4gICAgICAgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJvdXRlUGFyYW1zLCAkaHR0cCwgJHRpbWVvdXQsIEt1YmVybmV0ZXNBcGlVUkwpID0+IHtcclxuXHJcbiAgICAgICAgJHNjb3BlLmt1YmVybmV0ZXMgPSBLdWJlcm5ldGVzU3RhdGU7XHJcbiAgICAgICAgJHNjb3BlLm1vZGVsID0gS3ViZXJuZXRlc01vZGVsO1xyXG4gICAgICAgICRzY29wZS5pZCA9ICRyb3V0ZVBhcmFtc1tcIm5hbWVzcGFjZVwiXTtcclxuICAgICAgICAkc2NvcGUuc2NoZW1hID0gS3ViZXJuZXRlc1NjaGVtYTtcclxuICAgICAgICAkc2NvcGUuY29uZmlnID0gS3ViZXJuZXRlc1NjaGVtYS5kZWZpbml0aW9ucy5rdWJlcm5ldGVzX05hbWVzcGFjZTtcclxuXHJcbiAgICAgICAgS3ViZXJuZXRlcy5pbml0U2hhcmVkKCRzY29wZSwgJGxvY2F0aW9uLCAkaHR0cCwgJHRpbWVvdXQsICRyb3V0ZVBhcmFtcywgS3ViZXJuZXRlc01vZGVsLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNBcGlVUkwpO1xyXG4gICAgICAgICRzY29wZS5icmVhZGNydW1iQ29uZmlnID0gY3JlYXRlV29ya3NwYWNlQnJlYWRjcnVtYnMoKTtcclxuICAgICAgICAkc2NvcGUuc3ViVGFiQ29uZmlnID0gRGV2ZWxvcGVyLmNyZWF0ZVdvcmtzcGFjZVN1Yk5hdkJhcnMoKTtcclxuXHJcbiAgICAgICAgJHNjb3BlLiRrZWVwUG9sbGluZyA9ICgpID0+IEt1YmVybmV0ZXMua2VlcFBvbGxpbmdNb2RlbDtcclxuICAgICAgICAkc2NvcGUuZmV0Y2ggPSBQb2xsSGVscGVycy5zZXR1cFBvbGxpbmcoJHNjb3BlLCAobmV4dDooKSA9PiB2b2lkKSA9PiB7XHJcbiAgICAgICAgICAkc2NvcGUuaXRlbSA9IG51bGw7XHJcbiAgICAgICAgICBpZiAoJHNjb3BlLmlkKSB7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSBVcmxIZWxwZXJzLmpvaW4oS3ViZXJuZXRlcy5yZXNvdXJjZXNVcmlGb3JLaW5kKFwiUHJvamVjdHNcIiksICRzY29wZS5pZCk7XHJcbiAgICAgICAgICAgIGxvZy5pbmZvKFwiTG9hZGluZyB1cmw6IFwiICsgdXJsKTtcclxuICAgICAgICAgICAgJGh0dHAuZ2V0KHVybCkuXHJcbiAgICAgICAgICAgICAgc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICRzY29wZS5lbnRpdHkgPSBlbnJpY2hXb3Jrc3BhY2UoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAkc2NvcGUubW9kZWwuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgICAgICAgICAgbmV4dCgpO1xyXG4gICAgICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgICAgIGVycm9yKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgbG9nLndhcm4oXCJGYWlsZWQgdG8gbG9hZCBcIiArIHVybCArIFwiIFwiICsgZGF0YSArIFwiIFwiICsgc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgIG5leHQoKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICRzY29wZS5tb2RlbC5mZXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgQ29yZS4kYXBwbHkoJHNjb3BlKTtcclxuICAgICAgICAgICAgbmV4dCgpO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJHNjb3BlLmZldGNoKCk7XHJcbiAgICAgIH1dKTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9rdWJlcm5ldGVzL3RzL2t1YmVybmV0ZXNIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4va3ViZXJuZXRlcy90cy9rdWJlcm5ldGVzTW9kZWwudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9jb25maWdzL3RzL2NvbmZpZ3NEYXRhU2VydmljZS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRldmVsb3BlckVucmljaGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRldmVsb3BlckhlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJkYXRhTWFuYWdlckhlbHBlci50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImRhdGFNYW5hZ2VyTW9kZWwudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9jb25maWdzL3RzL2NvbmZpZ3NIZWxwZXIudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9jb25maWdzL3RzL2N1c3RvbUFsZXJ0LnRzXCIvPlxyXG5cclxubW9kdWxlIERldmVsb3BlciB7XHJcbiAgZXhwb3J0IHZhciBXb3Jrc3BhY2VzQ29udHJvbGxlciA9IGNvbnRyb2xsZXIoXCJXb3Jrc3BhY2VzQ29udHJvbGxlclwiLCBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJEYXRhTW9kZWxcIiwgXCJDb25maWdzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCIkdGVtcGxhdGVDYWNoZVwiLCBcIiRsb2NhdGlvblwiLCBcIiRyb3V0ZVBhcmFtc1wiLCBcIiRodHRwXCIsIFwiJHRpbWVvdXRcIiwgXCJLdWJlcm5ldGVzQXBpVVJMXCIsIFwiJGVsZW1lbnRcIiwgXCJuZ0RpYWxvZ1wiLFxyXG4gICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDogS3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBEYXRhTW9kZWw6RGV2ZWxvcGVyLkRhdGFNb2RlbFNlcnZpY2UsIENvbmZpZ3NNb2RlbDpDb25maWdzLkNvbmZpZ3NNb2RlbFNlcnZpY2UsIEt1YmVybmV0ZXNTdGF0ZSwgICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgJGxvY2F0aW9uOm5nLklMb2NhdGlvblNlcnZpY2UsICRyb3V0ZVBhcmFtcywgJGh0dHAsICR0aW1lb3V0LCBLdWJlcm5ldGVzQXBpVVJMLCAkZWxlbWVudCwgbmdEaWFsb2cpID0+IHsgICAgXHJcbiAgICAkc2NvcGUubW9kZWw9RGF0YU1vZGVsOyBcclxuICAgICRzY29wZS5yZXBsaWNhc01vZGVsID0gS3ViZXJuZXRlc01vZGVsOyAgXHJcbiAgICBpbml0KCRzY29wZSwgJGxvY2F0aW9uLCAkcm91dGVQYXJhbXMpOyAgIFxyXG4gICAgJHNjb3BlLm9wdGlvbnMgPSBEYXRhTW9kZWwucGFyYW1PcHRpb25zO1xyXG4gICAgJHNjb3BlLnBhZ2VTaXplQ2hvc2VzID0gRGF0YU1vZGVsLnBhcmFtT3B0aW9ucy5wYWdlclNpemVPcHRpb247XHJcbiAgICB2YXIgcmVzdWx0ID0gZ2V0RGF0YVR5cGUoJGxvY2F0aW9uKVxyXG4gICAgJHNjb3BlLm9wdGlvbnMuZGF0YVR5cGUgPSByZXN1bHRbXCJkYXRhVHlwZVwiXTsgXHJcbiAgICAkc2NvcGUub3B0aW9ucy52b2x1bWVUeXBlID0gcmVzdWx0W1widm9sdW1lVHlwZVwiXTsgIFxyXG5cclxuICAgICRzY29wZS50cmVlT3B0aW9ucyA9IHtcclxuICAgICAgbm9kZUNoaWxkcmVuOiBcImNoaWxkTm9kZXNcIixcclxuICAgICAgZGlyU2VsZWN0YWJsZTogdHJ1ZSxcclxuICAgICAgaW5qZWN0Q2xhc3Nlczoge1xyXG4gICAgICAgIHVsOiBcImExXCIsXHJcbiAgICAgICAgbGk6IFwiYTJcIixcclxuICAgICAgICBsaVNlbGVjdGVkOiBcImE3XCIsXHJcbiAgICAgICAgaUV4cGFuZGVkOiBcImEzXCIsXHJcbiAgICAgICAgaUNvbGxhcHNlZDogXCJhNFwiLFxyXG4gICAgICAgIGlMZWFmOiBcImE1XCIsXHJcbiAgICAgICAgbGFiZWw6IFwiYTZcIixcclxuICAgICAgICBsYWJlbFNlbGVjdGVkOiBcImE4XCJcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8v6YWN572u5pWw5o2u6KGo5qC86ZyA6KaB5pi+56S655qE5YaF5a655Y+K5pi+56S65qC85byPXHJcbiAgICAkc2NvcGUudGFibGVDb25maWcgPSB7XHJcbiAgICAgIGRhdGE6ICdtb2RlbC5kYXRhJywgICAgIFxyXG4gICAgICBzaG93U2VsZWN0aW9uQ2hlY2tib3g6IHRydWUsXHJcbiAgICAgIGVuYWJsZVJvd0NsaWNrU2VsZWN0aW9uOiBmYWxzZSxcclxuICAgICAgbXVsdGlTZWxlY3Q6IHRydWUsICAgICBcclxuICAgICAgc2VsZWN0ZWRJdGVtczogW10sICAgICBcclxuICAgICAgZmlsdGVyT3B0aW9uczoge1xyXG4gICAgICAgIGZpbHRlclRleHQ6ICRsb2NhdGlvbi5zZWFyY2goKVtcInFcIl0gfHwgJydcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uRGVmczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGZpZWxkOiBcIl9rZXlcIixcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiAn57yW56CBJyAgICAgICAgICAgICAgIFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZmllbGQ6IFwibmFtZVwiLFxyXG4gICAgICAgICAgZGlzcGxheU5hbWU6ICfluIIt5Yy6L+WOvycsXHJcbiAgICAgICAgICBjdXN0b21Tb3J0RmllbGQ6IChmaWVsZCkgPT4geyAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJldHVybiBmaWVsZC5yZWdpb25hbGlzbUNvZGU7XHJcbiAgICAgICAgICB9ICAgICAgIFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeyBcclxuICAgICAgICAgIGZpZWxkOiBcInN5c3RlbU5hbWVcIixcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiAn57O757uf5ZCN56ewJyxcclxuICAgICAgICAgIGN1c3RvbVNvcnRGaWVsZDogKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBmaWVsZC5zeXN0ZW1Db2RlO1xyXG4gICAgICAgICAgfSAgICAgICAgIFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZmllbGQ6IFwiZGF0YUJhc2VUeXBlXCIsXHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogJ+aVsOaNruW6k+exu+WeiycsXHJcbiAgICAgICAgfSwgICAgICAgICBcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZDogXCJsYWJlbHNcIixcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiAn5pWw5o2u5qCH562+JyxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiZGF0YUxhYmVsc1RlbXBsYXRlLmh0bWxcIikgICAgICBcclxuICAgICAgICB9LCBcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZDogXCJ5ZWFyXCIsXHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogJ+W5tOW6picsICAgICAgICBcclxuICAgICAgICB9LCAgICBcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZDogXCJjb2xsZWN0aW5nVGltZVwiLFxyXG4gICAgICAgICAgZGlzcGxheU5hbWU6ICfph4fpm4bml7bpl7QnICAgICAgICBcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGZpZWxkOiBcImV4dHJhY3RTdGF0dXNcIixcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiAn5rGH5oC754q25oCBJyxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiZGF0YUV4dHJhY3RUZW1wbGF0ZS5odG1sXCIpICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgXSxcclxuICAgICAgc29ydEluZm86IHtcclxuICAgICAgICBzb3J0Qnk6IFwiX2tleVwiLFxyXG4gICAgICAgIGFzY2VuZGluZzogdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgICRzY29wZS4kb24oXCJkYXRhTGFiZWxGaWx0ZXJVcGRhdGVcIiwgKCRldmVudCwgdGV4dCwga2V5KSA9PiB7XHJcbiAgICAgICRzY29wZS5rZXlRdWVyeSArPSBcIiBcIiArIHRleHQ7ICAgICAgICAgICAgICAgICAgICBcclxuICAgIH0pXHJcblxyXG4gICAgJHNjb3BlLnNlbGVjdEJhdGNoSXRlbSA9IChpdGVtKT0+IHsgICAgICBcclxuICAgICAgJHNjb3BlLm5hdmJhckl0ZW1zLmZvckVhY2goKG5hdikgPT57XHJcbiAgICAgICAgbmF2LmNsYXNzPVwiXCI7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpdGVtLmNsYXNzPVwiYWN0aXZlXCI7XHJcbiAgICAgICRzY29wZS5tb2RlbC51cGRhdGVQYXJhbU9wdGlvbihcImN1cnJlbnRQYWdlTnVtXCIsIDEpO1xyXG4gICAgICAkc2NvcGUubW9kZWwudXBkYXRlUGFyYW1PcHRpb24oXCJrZXlRdWVyeVwiLCAkc2NvcGUua2V5UXVlcnkpOyBcclxuICAgICAgJHNjb3BlLm1vZGVsLnVwZGF0ZVBhcmFtT3B0aW9uKFwiZGF0YUJhdGNoXCIsIGl0ZW0uYWxpYXMpOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgJHNjb3BlLmlzRW1wdHlPckZpcnN0ID0gKCkgPT4ge1xyXG4gICAgICB2YXIgaWR4ID0gJHNjb3BlLm1vZGVsLmdldFBhcmFtT3B0aW9uKFwiY3VycmVudFBhZ2VOdW1cIik7XHJcbiAgICAgIHZhciBsZW5ndGggPSRzY29wZS5vcHRpb25zLmdldFBhZ2VTaXplTnVtKCk7ICAgICAgXHJcbiAgICAgIHJldHVybiBsZW5ndGggPD0gMCB8fCBpZHggPD0gMTtcclxuICAgIH1cclxuXHJcbiAgICAkc2NvcGUuaXNFbXB0eU9yTGFzdCA9ICgpID0+e1xyXG4gICAgICB2YXIgaWR4ID0gJHNjb3BlLm1vZGVsLmdldFBhcmFtT3B0aW9uKFwiY3VycmVudFBhZ2VOdW1cIik7XHJcbiAgICAgIHZhciBsZW5ndGggPSRzY29wZS5vcHRpb25zLmdldFBhZ2VTaXplTnVtKCk7XHJcbiAgICAgIHJldHVybiBsZW5ndGggPCAxIHx8IGlkeCA+PSBsZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgJHNjb3BlLmZpcnN0ID0gKCkgPT4geyAgICAgIFxyXG4gICAgICB2YXIgaWR4ID0gJHNjb3BlLm1vZGVsLmdldFBhcmFtT3B0aW9uKFwiY3VycmVudFBhZ2VOdW1cIik7ICAgICAgXHJcbiAgICAgIGlmKGlkeCA+MSl7XHJcbiAgICAgICAgS3ViZXJuZXRlcy5lbGltaW5hdGVDaGVjaEJveENsaWNrKCk7ICAgICAgIFxyXG4gICAgICAgICRzY29wZS5tb2RlbC51cGRhdGVQYXJhbU9wdGlvbihcImN1cnJlbnRQYWdlTnVtXCIsIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgJHNjb3BlLmxhc3QgPSAoKSA9PnsgICAgICBcclxuICAgICAgdmFyIGlkeCA9ICRzY29wZS5tb2RlbC5nZXRQYXJhbU9wdGlvbihcImN1cnJlbnRQYWdlTnVtXCIpOyBcclxuICAgICAgdmFyIGxlbmd0aCA9JHNjb3BlLm9wdGlvbnMuZ2V0UGFnZVNpemVOdW0oKTtcclxuICAgICAgaWYoaWR4IDwgbGVuZ3RoKXtcclxuICAgICAgICBLdWJlcm5ldGVzLmVsaW1pbmF0ZUNoZWNoQm94Q2xpY2soKTtcclxuICAgICAgICAkc2NvcGUubW9kZWwudXBkYXRlUGFyYW1PcHRpb24oXCJjdXJyZW50UGFnZU51bVwiLCBsZW5ndGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgJHNjb3BlLnByZXZpb3VzID0gKCkgPT4geyAgICAgIFxyXG4gICAgICB2YXIgaWR4ID0gJHNjb3BlLm1vZGVsLmdldFBhcmFtT3B0aW9uKFwiY3VycmVudFBhZ2VOdW1cIik7IFxyXG4gICAgICB2YXIgbGVuZ3RoID0kc2NvcGUub3B0aW9ucy5nZXRQYWdlU2l6ZU51bSgpO1xyXG4gICAgICBpZihpZHggPiAxKXtcclxuICAgICAgICBLdWJlcm5ldGVzLmVsaW1pbmF0ZUNoZWNoQm94Q2xpY2soKTtcclxuICAgICAgICAkc2NvcGUubW9kZWwudXBkYXRlUGFyYW1PcHRpb24oXCJjdXJyZW50UGFnZU51bVwiLCBpZHgtMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAkc2NvcGUubmV4dCA9ICgpID0+e1xyXG4gICAgICB2YXIgbGVuZ3RoID0kc2NvcGUub3B0aW9ucy5nZXRQYWdlU2l6ZU51bSgpO1xyXG4gICAgICB2YXIgaWR4ID0gJHNjb3BlLm1vZGVsLmdldFBhcmFtT3B0aW9uKFwiY3VycmVudFBhZ2VOdW1cIik7XHJcbiAgICAgIGlmKGlkeCA8IGxlbmd0aCl7XHJcbiAgICAgICAgS3ViZXJuZXRlcy5lbGltaW5hdGVDaGVjaEJveENsaWNrKCk7ICAgICAgXHJcbiAgICAgICAgJHNjb3BlLm1vZGVsLnVwZGF0ZVBhcmFtT3B0aW9uKFwiY3VycmVudFBhZ2VOdW1cIiwgaWR4KzEpOyAgICAgIFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgJHNjb3BlLiR3YXRjaCgnb3B0aW9ucycsIChuZXdWYWx1ZSwgb2xkVmFsdWUpID0+IHsgICAgICAgICAgICAgIFxyXG4gICAgICBpZihuZXdWYWx1ZSl7XHJcbiAgICAgICAgaWYobmV3VmFsdWUuY3VycmVudFRhYmxlU2l6ZSAhPT0gb2xkVmFsdWUuY3VycmVudFRhYmxlU2l6ZSlcclxuICAgICAgICAgICRzY29wZS5vcHRpb25zLnByaW9yVGFibGVTaXplID0gb2xkVmFsdWUuY3VycmVudFRhYmxlU2l6ZTsgICAgICAgIFxyXG4gICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAkc2NvcGUub3B0aW9ucy5wcmlvclRhYmxlU2l6ZSA9IG5ld1ZhbHVlLmN1cnJlbnRUYWJsZVNpemU7ICAgICAgICBcclxuICAgICAgICBEYXRhTW9kZWwudXBkYXRlTW9kZWwoKTtcclxuICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgIH0sIHRydWUpOyAgXHJcblxyXG4gICAgJHNjb3BlLnNlYXJjaCA9ICgpID0+IHtcclxuICAgICAgLy8kc2NvcGUubW9kZWwuaW5pdFBhcmFtT3B0aW9ucygpO1xyXG4gICAgICAkc2NvcGUubW9kZWwucGFyYW1PcHRpb25zLmN1cnJlbnRQYWdlTnVtID0gMTtcclxuICAgICAgJHNjb3BlLm1vZGVsLnVwZGF0ZVBhcmFtT3B0aW9uKFwia2V5UXVlcnlcIiwgJHNjb3BlLmtleVF1ZXJ5KTtcclxuICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgJHNjb3BlLmRlbGV0ZVByb21wdCA9IChzZWxlY3RlZCkgPT4ge1xyXG4gICAgICBpZiAoYW5ndWxhci5pc1N0cmluZyhzZWxlY3RlZCkpIHtcclxuICAgICAgICBzZWxlY3RlZCA9IFt7XHJcbiAgICAgICAgICBpZDogc2VsZWN0ZWRcclxuICAgICAgICB9XTtcclxuICAgICAgfVxyXG4gICAgICAvKlxyXG4gICAgICAgIOWIpOaWreaVsOaNruaYr+WQpuW3suaMgui9veS9v+eUqOWSjOato+WcqOi/geenu+OAglxyXG4gICAgICAqL1xyXG4gICAgICB2YXIgbWVzc2FnZSA9IEt1YmVybmV0ZXMuY2hlY2tGb3JNaWdyYXRpb24oJHNjb3BlLnJlcGxpY2FzTW9kZWwucmVwbGljYXRpb25Db250cm9sbGVycywgJHNjb3BlLm1vZGVsLnRyYW5zZmVyVGFza3MgLCAkc2NvcGUudGFibGVDb25maWcuc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICAgIGlmKG1lc3NhZ2UgIT0gXCJcIil7XHJcbiAgICAgICAgQ29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuaTjeS9nOWksei0pTpcIiArIG1lc3NhZ2UgKyBcIizkuI3og73liKDpmaTvvIFcIiwgJycsbnVsbCwgMCwgXCJlcnJvclwiKTtcclxuICAgICAgICByZXR1cm47IFxyXG4gICAgICB9XHJcblxyXG4gICAgICBVSS5tdWx0aUl0ZW1Db25maXJtQWN0aW9uRGlhbG9nKDxVSS5NdWx0aUl0ZW1Db25maXJtQWN0aW9uT3B0aW9ucz57XHJcbiAgICAgICAgY29sbGVjdGlvbjogc2VsZWN0ZWQsXHJcbiAgICAgICAgaW5kZXg6ICdhbGlhcycsXHJcbiAgICAgICAgb25DbG9zZTogKHJlc3VsdDpib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICB2YXIgaWRDb2xsID0gW107XHJcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChzZWxlY3RlZCwgKHNlbGVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlkQ29sbC5wdXNoKHNlbGVjdC5pZCk7ICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgJGh0dHAoeyAgXHJcbiAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIiwgIFxyXG4gICAgICAgICAgICAgIHVybDogXCIvamF2YS9jb25zb2xlL2FwaS9kZWxldGUvZGF0YVwiLCAgICAgICAgIFxyXG4gICAgICAgICAgICAgIHBhcmFtczoge1wiZGF0YVwiOiBpZENvbGx9ICAgXHJcbiAgICAgICAgICAgIH0pLnN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHsgIFxyXG4gICAgICAgICAgICAgIC8v5oiQ5Yqf5LmL5ZCO5YGa5LiA5Lqb5LqL5oOFIFxyXG4gICAgICAgICAgICAgIERhdGFNb2RlbC51cGRhdGVNb2RlbCgpOyAgICAgIFxyXG4gICAgICAgICAgICB9KS5lcnJvcihmdW5jdGlvbihkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykgeyAgXHJcbiAgICAgICAgICBcclxuICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHRpdGxlOiAn5piv5ZCm6ZyA6KaB5Yig6Zmk6YeH6ZuG5pWw5o2u77yfJyxcclxuICAgICAgICBhY3Rpb246ICfku6XkuIvph4fpm4bmlbDmja7mlofku7blsIbkvJrooqvliKDpmaQ6JyxcclxuICAgICAgICBva1RleHQ6ICfliKDpmaQnLFxyXG4gICAgICAgIG9rQ2xhc3M6ICdidG4tZGFuZ2VyIHNqX2J0bl9jaXInLFxyXG4gICAgICAgIGN1c3RvbTogXCLor6XliKDpmaTmk43kvZzlsIbkvJrlvbvlupXliKDpmaTmlbDmja7mlofku7Ys5piv5ZCm5Yig6Zmk77yM6K+356Gu6K6k77yBXCIsXHJcbiAgICAgICAgY3VzdG9tQ2xhc3M6IFwiYWxlcnQgYWxlcnQtd2FybmluZyBzal9hbGVydC13YXJuaW5nXCIsXHJcbiAgICAgICAgY2FuY2VsVGV4dDogXCLlj5bmtohcIixcclxuICAgICAgICBjYW5jZWxDbGFzczogJ3NqX2J0bl9ncmV5J1xyXG4gICAgICB9KS5vcGVuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgJHNjb3BlLm1pZ3JhdGlvbkNsaWNrID0ge1xyXG4gICAgICBpdGVtczpudWxsLFxyXG4gICAgICBzZWxlY3RlZEl0ZW06IHtcIm5hbWVcIjogXCLlvZPliY3msqHmnInlj6/ku6Xov4Hnp7vnmoTpm4bnvqRcIn0sXHJcbiAgICAgIGRpYWxvZzogbmV3IFVJLkRpYWxvZygpLFxyXG4gICAgICBvbk9rOiAoKSA9PiB7ICAgICAgICBcclxuICAgICAgICB2YXIgbWlncmF0aW9uQ2xpY2sgPSAkc2NvcGUubWlncmF0aW9uQ2xpY2s7XHJcbiAgICAgICAgLypcclxuICAgICAgICAgIOWQkeWQjuWPsOWPkeeUn+aVsOaNrui/geenu+ivt+axgiwkaHR0cDrlj5HnlJ9odHRw5byC5q2l6K+35rGC77yb56ys5LqM5Liq5Y+C5pWw77ya6K+35rGCdXJsO+esrOS4ieS4quWPguaVsO+8muivt+axguaTjeS9nOexu+Wei++8m+esrOWbm+S4quWPguaVsO+8muivt+axguaQuuW4pueahOaVsOaNru+8m+esrOS6lOS4quWPguaVsO+8mlxyXG4gICAgICAgICAg5LiA5Liq5Zue6LCD5Ye95pWw77yM6K+35rGC5ZON5bqU5ZCO55qE5Zue6LCD5Ye95pWw44CCXHJcbiAgICAgICAgKi8gIFxyXG4gICAgICAgIGlmKEt1YmVybmV0ZXMuYWxyZWFkeUV4aXRJbkZvbGRlcigkc2NvcGUudGFibGVDb25maWcuc2VsZWN0ZWRJdGVtcywgJHNjb3BlLnNlbGVjdE5vZGUpKXtcclxuICAgICAgICAgIG1pZ3JhdGlvbkNsaWNrLmNsb3NlKCk7XHJcbiAgICAgICAgICBDb25maWdzLmN1c3RvbUFsZXJ0KFwi5o+Q56S6XCIsIFwi5pON5L2c5aSx6LSlOlwiICsgXCLmlbDmja7lt7LlnKjlvZPliY3nm67lvZXvvIFcIiwgJycsbnVsbCwgMCwgXCJlcnJvclwiKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9O1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgQ29uZmlncy5vcmFjbGVJbmZvT3BlcmF0ZSgkaHR0cCwgXCIvamF2YS9jb25zb2xlL2FwaS92b2x1bWVcIiwgQ29uZmlncy5PcGVyYXRlVHlwZS5NT1ZFLCBcclxuICAgICAgICB7XHJcbiAgICAgICAgICBcIm5hbWVcIjogbWlncmF0aW9uQ2xpY2suc2VsZWN0ZWRJdGVtLm5hbWUsXHJcbiAgICAgICAgICBcInNlbGVjdEl0ZW1zXCI6ICRzY29wZS50YWJsZUNvbmZpZy5zZWxlY3RlZEl0ZW1zLFxyXG4gICAgICAgICAgXCJzZWxlY3ROb2RlXCI6ICRzY29wZS5zZWxlY3ROb2RlXHJcbiAgICAgICAgfSwgKHJlc3VsdCwgc3RhdHVzKSA9PiB7XHJcbiAgICAgICAgICBpZihzdGF0dXM9PT0yMDApe1xyXG4gICAgICAgICAgICAgICAgLy8kc2NvcGUubW9kZWwudXBkYXRlT3JhY2xlUGFyYW0oKTtcclxuICAgICAgICAgIH1lbHNlXHJcbiAgICAgICAgICAgIHRocm93IFwi6LWE5rqQ6K+35rGC5aSx6LSlXCI7ICAgICAgICAgICBcclxuICAgICAgICB9KTtcclxuICAgICAgICAvKlxyXG4gICAgICAgICDpobXpnaLot7PovaxcclxuICAgICAgICAqL1xyXG4gICAgICAgICR0aW1lb3V0KCgpID0+e1xyXG4gICAgICAgICAgICAkbG9jYXRpb24ucGF0aChcIi93b3Jrc3BhY2VzL092ZXJ2aWV3L3Rhc2tcIik7XHJcbiAgICAgICAgfSwyNTApO1xyXG4gICAgICAgIG1pZ3JhdGlvbkNsaWNrLmNsb3NlKCk7ICAgICBcclxuICAgICAgfSxcclxuICAgICAgb3BlbjogKHNlbGVjdGVkKSA9PntcclxuICAgICAgICB2YXIgbWlncmF0aW9uQ2xpY2sgPSAkc2NvcGUubWlncmF0aW9uQ2xpY2s7ICAgXHJcbiAgICAgICAgLypcclxuICAgICAgICAgIOWIpOaWreaVsOaNruaYr+WQpuW3suaMgui9veS9v+eUqOWSjOato+WcqOi/geenu+OAglxyXG4gICAgICAgICovICAgIFxyXG4gICAgICAgIHZhciBtZXNzYWdlID0gS3ViZXJuZXRlcy5jaGVja0Zvck1pZ3JhdGlvbigkc2NvcGUucmVwbGljYXNNb2RlbC5yZXBsaWNhdGlvbkNvbnRyb2xsZXJzLCAkc2NvcGUubW9kZWwudHJhbnNmZXJUYXNrcyAsICRzY29wZS50YWJsZUNvbmZpZy5zZWxlY3RlZEl0ZW1zKTtcclxuXHJcbiAgICAgICAgaWYobWVzc2FnZSA9PSBcIlwiKXtcclxuICAgICAgICAgIGlmKCRzY29wZS52b2x1bWVzICYmICRzY29wZS52b2x1bWVzIGluc3RhbmNlb2YgQXJyYXkgJiYgJHNjb3BlLnZvbHVtZXMubGVuZ3RoID4wKVxyXG4gICAgICAgICAgICBtaWdyYXRpb25DbGljay5zZWxlY3RlZEl0ZW0gPSAkc2NvcGUudm9sdW1lc1swXTsgXHJcbiAgICAgICAgICBtaWdyYXRpb25DbGljay5kaWFsb2cub3BlbigpOyAgICAgICAgICAgICAgICBcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIENvbmZpZ3MuY3VzdG9tQWxlcnQoXCLmj5DnpLpcIiwgXCLmk43kvZzlpLHotKU6XCIgKyBtZXNzYWdlICsgXCIsIOS4jeiDvei/geenu++8gVwiLCAnJyxudWxsLCAwLCBcImVycm9yXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgY2xvc2U6ICgpID0+IHtcclxuICAgICAgICAkc2NvcGUubWlncmF0aW9uQ2xpY2suc2VsZWN0ZWRJdGVtID0ge1wibmFtZVwiOiBcIuW9k+WJjeayoeacieWPr+S7pei/geenu+eahOmbhue+pFwifTtcclxuICAgICAgICAkc2NvcGUubWlncmF0aW9uQ2xpY2suZGlhbG9nLmNsb3NlKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgJHNjb3BlLmNyZWF0ZU9yYWNsZVNlcnZpY2UgPSAoaXRlbXMpID0+eyAgICAgICAgICBcclxuICAgICAgdmFyICBleGl0ZWRJdGVtcyA9ICBLdWJlcm5ldGVzLmNoZWNrRm9yQ3JlYXRlT3JhY2xlKCRzY29wZS5tb2RlbC50cmFuc2ZlclRhc2tzLCBpdGVtcyk7IFxyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICAgIC8vIGNvZGUuLi5cclxuICAgICAgICBpZihpdGVtc1tpXS5kYXRhQmFzZVR5cGUgIT0gJ09SQUNMRScpe1xyXG4gICAgICAgICAgQ29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuaTjeS9nOWksei0pTog6Z2eT1JBQ0xF5pWw5o2u5LiN6ZyA6KaB5oyC6L295ZCv5Yqo77yBXCIsICcnLCBudWxsLCAwLCBcImVycm9yXCIpOyBcclxuICAgICAgICAgIHJldHVybjsgICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgIH0gICAgXHJcbiAgICAgIGlmKGV4aXRlZEl0ZW1zLmxlbmd0aCA9PSAwKXsgICAgXHJcbiAgICAgICAgYW5ndWxhci5mb3JFYWNoKGl0ZW1zLChpdGVtKT0+eyAgXHJcbiAgICAgICAgY29uc29sZS5sb2coaXRlbSk7ICAgICAgICBcclxuICAgICAgICAgIHZhciBpc0V4aXRlZCA9IEt1YmVybmV0ZXMuY2hlY2tGb3JFeGl0KCRzY29wZS5yZXBsaWNhc01vZGVsLnJlcGxpY2F0aW9uQ29udHJvbGxlcnMsIGl0ZW0pO1xyXG4gICAgICAgICAgaWYoIWlzRXhpdGVkKXsgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIEt1YmVybmV0ZXMuY3JlYXRlUkMoe1xyXG4gICAgICAgICAgICAgIG5hbWU6IGl0ZW0uX2tleSxcclxuICAgICAgICAgICAgICBsYWJlbHM6IHtcclxuICAgICAgICAgICAgICAgIHN5c3RlbTogaXRlbS5zeXN0ZW1Db2RlLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBpdGVtLmRhdGFWZXJzaW9uLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICByZWdpb246IGl0ZW0ucmVnaW9uYWxpc21Db2RlLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGFubm90YXRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICBjaXR5TmFtZTogaXRlbS5jaXR5TmFtZSxcclxuICAgICAgICAgICAgICAgIGRpc3RyaWN0TmFtZTogaXRlbS5kaXN0cmljdE5hbWUsXHJcbiAgICAgICAgICAgICAgICBzeXN0ZW1OYW1lOiBpdGVtLnN5c3RlbU5hbWUsXHJcbiAgICAgICAgICAgICAgICBpZDogaXRlbS5pZCtcIlwiLFxyXG4gICAgICAgICAgICAgICAgeWVhcjogaXRlbS55ZWFyLFxyXG4gICAgICAgICAgICAgICAgY2hlY2tvdXRGbGFnOiBpdGVtLmNoZWNrb3V0RmxhZ1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgcGF0aDogaXRlbS5kYXRhUGF0aCtcImFwcC9cIixcclxuICAgICAgICAgICAgICBpc1RhcmdldDogXCJmYWxzZVwiLFxyXG4gICAgICAgICAgICAgIGlzRXh0cmFjdDogaXRlbS5leHRyYWN0U3RhdHVzXHJcbiAgICAgICAgICAgIH0sIChyYykgPT57IFxyXG4gICAgICAgICAgICAgICAgS3ViZXJuZXRlcy5jb25uZWN0T3JhY2xlKCRodHRwLCAkdGltZW91dCwgXCIvamF2YS9jb25zb2xlL2FwaS9jb25uZWN0T3JhY2xlXCIsIFwiY3JlYXRlXCIsIHJjLCAwKTsgIFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gICAgICAgICAgICAgIFxyXG4gICAgICAgIH0pOyAgICBcclxuICAgICAgIFxyXG4gICAgICAgICR0aW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCcva3ViZXJuZXRlcy9uYW1lc3BhY2UvZGVmYXVsdC9yZXBsaWNhdGlvbkNvbnRyb2xsZXJzJyk7ICAgICAgICAgICAgXHJcbiAgICAgICAgfSwgMjAwKTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB2YXIgbmFtZSA9IFwiXCI7XHJcbiAgICAgICAgICBhbmd1bGFyLmZvckVhY2goZXhpdGVkSXRlbXMsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIG5hbWUgKz0gaXRlbS5uYW1lICsgXCItXCIgKyBpdGVtLnN5c3RlbU5hbWUgKyBcIixcIjtcclxuICAgICAgICAgIH0pOyAgICBcclxuICAgICAgICAgIENvbmZpZ3MuY3VzdG9tQWxlcnQoXCLmj5DnpLpcIiwgXCLmk43kvZzlpLHotKU6IOato+WcqOi/geenu+eahOaVsOaNruS4jeiDveiiq+WQr+WKqO+8gVwiLCAnJywgbnVsbCwgMCwgXCJlcnJvclwiKTsgICAgICAgICAgXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpbml0KCRzY29wZSwkbG9jYXRpb24sJHJvdXRlUGFyYW1zKXtcclxuICAgICAgLy8kc2NvcGUubW9kZWwudXBkYXRlTW9kZWwoKTtcclxuICAgICAgLy9jb25zb2xlLmxvZygkc2NvcGUub3B0aW9ucy5jdXJyZW50UGFnZU51bSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCIpO1xyXG4gICAgICAkc2NvcGUua2V5UXVlcnkgPSBcIlwiOyBcclxuICAgICAgJHNjb3BlLm1vZGVsLmluaXRQYXJhbU9wdGlvbnMoKTtcclxuICAgICAgJHNjb3BlLm1vZGVsLnVwZGF0ZVBhcmFtT3B0aW9uKFwia2V5UXVlcnlcIiwgJHNjb3BlLmtleVF1ZXJ5KTsgXHJcbiAgICAgIGlmKENvbmZpZ3NNb2RlbC5jbHVzdGVyIT1udWxsKVxyXG4gICAgICAgICRzY29wZS52b2x1bWVzID0gQ29uZmlnc01vZGVsLmNsdXN0ZXI7ICBcclxuXHJcbiAgICAgIC8v5Yib5bu65LqM57qn6I+c5Y2VICAgICAgXHJcbiAgICAgICRzY29wZS5zdWJUYWJDb25maWcgPSBEZXZlbG9wZXIuY3JlYXRlQ3VycmVudFN1Yk5hdkJhcigkc2NvcGUsICRsb2NhdGlvbiwgJHJvdXRlUGFyYW1zKTtcclxuICAgICAgJHNjb3BlLm5hdmJhckl0ZW1zID1beyAgICAgICBcclxuICAgICAgICBoZXJmOiBcIlwiLFxyXG4gICAgICAgIGxhYmVsOiBcIuWFqOmDqFwiLFxyXG4gICAgICAgIHRpdGxlOiBcIuafpeeci+WFqOmDqOaVsOaNrlwiLFxyXG4gICAgICAgIGNsYXNzOiBcImFjdGl2ZVwiLFxyXG4gICAgICAgIGFsaWFzOiBudWxsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBoZXJmOiBcIlwiLFxyXG4gICAgICAgIGxhYmVsOiBcIuaJueasoUFcIixcclxuICAgICAgICB0aXRsZTogXCLmn6XnnIvmibnmrKFB55qE5pWw5o2uXCIsXHJcbiAgICAgICAgY2xhc3M6IFwiXCIsXHJcbiAgICAgICAgYWxpYXM6IFwiQVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBoZXJmOiBcIlwiLFxyXG4gICAgICAgIGxhYmVsOiBcIuaJueasoUJcIixcclxuICAgICAgICB0aXRsZTogXCLmn6XnnIvmibnmrKFC55qE5pWw5o2uXCIsXHJcbiAgICAgICAgY2xhc3M6IFwiXCIsXHJcbiAgICAgICAgYWxpYXM6IFwiQlwiXHJcbiAgICAgIH1dXHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0RGF0YVR5cGUoJGxvY2F0aW9uKXtcclxuICAgICAgdmFyIHBhdGggPSAkbG9jYXRpb24ucGF0aCgpO1xyXG4gICAgICB2YXIgZGF0YVR5cGU7XHJcbiAgICAgIHZhciB2b2x1bWVUeXBlO1xyXG4gICAgICB2YXIgc3ViUGF0aCA9IHBhdGguc3BsaXQoXCIvXCIpOyAgICAgIFxyXG4gICAgICBzd2l0Y2ggKHN1YlBhdGhbc3ViUGF0aC5sZW5ndGggLTFdKSB7XHJcbiAgICAgICAgY2FzZSBcImZpbmFuY2lhbFwiOlxyXG4gICAgICAgICAgZGF0YVR5cGUgPSBcIui0ouaUv1wiO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcInNvY2lhbC1zZWN1cml0eVwiOlxyXG4gICAgICAgICAgZGF0YVR5cGUgPSBcIuekvuS/nVwiO1xyXG4gICAgICAgICAgYnJlYWs7ICAgICAgICAgIFxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBkYXRhVHlwZSA9IG51bGw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfTsgICAgICBcclxuICAgICAgc3dpdGNoIChzdWJQYXRoWzNdKSB7XHJcbiAgICAgICAgY2FzZSBcImhvdFwiOlxyXG4gICAgICAgICAgdm9sdW1lVHlwZSA9IDBcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB2b2x1bWVUeXBlID0gMVxyXG4gICAgICB9ICAgIFxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIFwiZGF0YVR5cGVcIjogZGF0YVR5cGUsXHJcbiAgICAgICAgXCJ2b2x1bWVUeXBlXCI6IHZvbHVtZVR5cGVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1dKTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG5cclxubW9kdWxlIEt1YmVybmV0ZXMge1xyXG4gIFxyXG4gIGV4cG9ydCB2YXIgQXBwcyA9IGNvbnRyb2xsZXIoXCJBcHBzXCIsXHJcbiAgICBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU2VydmljZXNcIiwgXCJLdWJlcm5ldGVzUmVwbGljYXRpb25Db250cm9sbGVyc1wiLCBcIkt1YmVybmV0ZXNQb2RzXCIsIFwiS3ViZXJuZXRlc1N0YXRlXCIsIFwiS3ViZXJuZXRlc0FwaVVSTFwiLCBcIiR0ZW1wbGF0ZUNhY2hlXCIsIFwiJGxvY2F0aW9uXCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwiJGh0dHBcIiwgXCIkZGlhbG9nXCIsIFwiJHRpbWVvdXRcIiwgXHJcbiAgICAgICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDogS3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzU2VydmljZXM6bmcucmVzb3VyY2UuSVJlc291cmNlQ2xhc3M8YW55PiwgS3ViZXJuZXRlc1JlcGxpY2F0aW9uQ29udHJvbGxlcnM6bmcucmVzb3VyY2UuSVJlc291cmNlQ2xhc3M8YW55PiwgS3ViZXJuZXRlc1BvZHM6bmcucmVzb3VyY2UuSVJlc291cmNlQ2xhc3M8YW55PiwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMLFxyXG4gICAgICAgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJvdXRlUGFyYW1zLCAkaHR0cCwgJGRpYWxvZywgJHRpbWVvdXQpID0+IHtcclxuXHJcbiAgICAkc2NvcGUubW9kZWwgPSBLdWJlcm5ldGVzTW9kZWw7XHJcblxyXG4gICAgJHNjb3BlLmFwcHMgPSBbXTtcclxuICAgICRzY29wZS5hbGxBcHBzID0gW107XHJcbiAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICRzY29wZS5mZXRjaGVkID0gZmFsc2U7XHJcbiAgICAkc2NvcGUuanNvbiA9ICcnO1xyXG4gICAgQ29udHJvbGxlckhlbHBlcnMuYmluZE1vZGVsVG9TZWFyY2hQYXJhbSgkc2NvcGUsICRsb2NhdGlvbiwgJ2lkJywgJ19pZCcsIHVuZGVmaW5lZCk7XHJcbiAgICBDb250cm9sbGVySGVscGVycy5iaW5kTW9kZWxUb1NlYXJjaFBhcmFtKCRzY29wZSwgJGxvY2F0aW9uLCAnYXBwU2VsZWN0b3JTaG93JywgJ29wZW5BcHAnLCB1bmRlZmluZWQpO1xyXG4gICAgQ29udHJvbGxlckhlbHBlcnMuYmluZE1vZGVsVG9TZWFyY2hQYXJhbSgkc2NvcGUsICRsb2NhdGlvbiwgJ21vZGUnLCAnbW9kZScsICdkZXRhaWwnKTtcclxuXHJcbiAgICB2YXIgYnJhbmNoID0gJHNjb3BlLmJyYW5jaCB8fCBcIm1hc3RlclwiO1xyXG4gICAgdmFyIG5hbWVzcGFjZSA9IG51bGw7XHJcblxyXG4gICAgZnVuY3Rpb24gYXBwTWF0Y2hlcyhhcHApIHtcclxuICAgICAgdmFyIGZpbHRlclRleHQgPSAkc2NvcGUuYXBwU2VsZWN0b3IuZmlsdGVyVGV4dDtcclxuICAgICAgaWYgKGZpbHRlclRleHQpIHtcclxuICAgICAgICByZXR1cm4gQ29yZS5tYXRjaEZpbHRlcklnbm9yZUNhc2UoYXBwLmdyb3VwSWQsIGZpbHRlclRleHQpIHx8XHJcbiAgICAgICAgICBDb3JlLm1hdGNoRmlsdGVySWdub3JlQ2FzZShhcHAuYXJ0aWZhY3RJZCwgZmlsdGVyVGV4dCkgfHxcclxuICAgICAgICAgIENvcmUubWF0Y2hGaWx0ZXJJZ25vcmVDYXNlKGFwcC5uYW1lLCBmaWx0ZXJUZXh0KSB8fFxyXG4gICAgICAgICAgQ29yZS5tYXRjaEZpbHRlcklnbm9yZUNhc2UoYXBwLmRlc2NyaXB0aW9uLCBmaWx0ZXJUZXh0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGFwcFJ1bm5pbmcoYXBwKSB7XHJcbiAgICAgIHJldHVybiAkc2NvcGUubW9kZWwuYXBwcy5hbnkoKHJ1bm5pbmcpID0+IHJ1bm5pbmcuYXBwUGF0aCA9PT0gYXBwLmFwcFBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgICRzY29wZS50YWJsZUNvbmZpZyA9IHtcclxuICAgICAgZGF0YTogJ21vZGVsLmFwcHMnLFxyXG4gICAgICBzaG93U2VsZWN0aW9uQ2hlY2tib3g6IHRydWUsXHJcbiAgICAgIGVuYWJsZVJvd0NsaWNrU2VsZWN0aW9uOiBmYWxzZSxcclxuICAgICAgbXVsdGlTZWxlY3Q6IHRydWUsXHJcbiAgICAgIHNlbGVjdGVkSXRlbXM6IFtdLFxyXG4gICAgICBmaWx0ZXJPcHRpb25zOiB7XHJcbiAgICAgICAgZmlsdGVyVGV4dDogJGxvY2F0aW9uLnNlYXJjaCgpW1wicVwiXSB8fCAnJ1xyXG4gICAgICB9LFxyXG4gICAgICBjb2x1bW5EZWZzOiBbXHJcbiAgICAgICAgeyBmaWVsZDogJyRuYW1lJywgZGlzcGxheU5hbWU6ICdBcHAnLCBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChVcmxIZWxwZXJzLmpvaW4odGVtcGxhdGVQYXRoLCBcImFwcEljb25UZW1sYXRlLmh0bWxcIikpIH0sXHJcbiAgICAgICAgeyBmaWVsZDogJyRzZXJ2aWNlc1RleHQnLCBkaXNwbGF5TmFtZTogJ1NlcnZpY2VzJywgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoVXJsSGVscGVycy5qb2luKHRlbXBsYXRlUGF0aCwgXCJhcHBTZXJ2aWNlc1RlbXBsYXRlLmh0bWxcIikpIH0sXHJcbiAgICAgICAgeyBmaWVsZDogJyRyZXBsaWNhdGlvbkNvbnRyb2xsZXJzVGV4dCcsIGRpc3BsYXlOYW1lOiAnQ29udHJvbGxlcnMnLCBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChVcmxIZWxwZXJzLmpvaW4odGVtcGxhdGVQYXRoLCBcImFwcFJlcGxpY2F0aW9uQ29udHJvbGxlclRlbXBsYXRlLmh0bWxcIikpIH0sXHJcbiAgICAgICAgeyBmaWVsZDogJyRwb2RDb3VudCcsIGRpc3BsYXlOYW1lOiAnUG9kcycsIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFVybEhlbHBlcnMuam9pbih0ZW1wbGF0ZVBhdGgsIFwiYXBwUG9kQ291bnRzQW5kTGlua1RlbXBsYXRlLmh0bWxcIikpIH0sXHJcbiAgICAgICAgeyBmaWVsZDogJyRjcmVhdGlvbkRhdGUnLCBkaXNwbGF5TmFtZTogJ0RlcGxveWVkJywgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoVXJsSGVscGVycy5qb2luKHRlbXBsYXRlUGF0aCwgXCJhcHBEZXBsb3llZFRlbXBsYXRlLmh0bWxcIikpIH1cclxuICAgICAgXVxyXG4gICAgfTtcclxuXHJcbiAgICBLdWJlcm5ldGVzLmluaXRTaGFyZWQoJHNjb3BlLCAkbG9jYXRpb24sICRodHRwLCAkdGltZW91dCwgJHJvdXRlUGFyYW1zLCBLdWJlcm5ldGVzTW9kZWwsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc0FwaVVSTCk7XHJcblxyXG5cclxuICAgICRzY29wZS5leHBhbmRlZFBvZHMgPSBbXTtcclxuXHJcbiAgICAkc2NvcGUuJG9uKCdkby1yZXNpemUnLCAoJGV2ZW50LCBjb250cm9sbGVyKSA9PiB7XHJcbiAgICAgICRzY29wZS5yZXNpemVEaWFsb2cub3Blbihjb250cm9sbGVyKTtcclxuICAgIH0pO1xyXG5cclxuICAgICAgICBcclxuICAgICRzY29wZS5wb2RFeHBhbmRlZCA9IChwb2QpID0+IHtcclxuICAgICAgdmFyIGlkID0gZ2V0TmFtZShwb2QpXHJcbiAgICAgIHJldHVybiBpZCAmJiAoJHNjb3BlLmV4cGFuZGVkUG9kcyB8fCBbXSkuaW5kZXhPZihpZCkgPj0gMDtcclxuICAgIH07XHJcblxyXG4gICAgJHNjb3BlLmV4cGFuZFBvZCA9IChwb2QpID0+IHtcclxuICAgICAgdmFyIGlkID0gZ2V0TmFtZShwb2QpO1xyXG4gICAgICBpZiAoaWQpIHtcclxuICAgICAgICAkc2NvcGUuZXhwYW5kZWRQb2RzLnB1c2goaWQpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgICRzY29wZS5jb2xsYXBzZVBvZCA9IChwb2QpID0+IHtcclxuICAgICAgdmFyIGlkID0gZ2V0TmFtZShwb2QpO1xyXG4gICAgICBpZiAoaWQpIHtcclxuICAgICAgICBfLnJlbW92ZSgkc2NvcGUuZXhwYW5kZWRQb2RzLCAodikgPT4gaWQgPT09IHYpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgICRzY29wZS4kb24oJyRyb3V0ZVVwZGF0ZScsICgkZXZlbnQpID0+IHtcclxuICAgICAgS3ViZXJuZXRlcy5zZXRKc29uKCRzY29wZSwgJGxvY2F0aW9uLnNlYXJjaCgpWydfaWQnXSwgJHNjb3BlLm1vZGVsLmFwcHMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZnVuY3Rpb24gZGVsZXRlQXBwKGFwcCwgb25Db21wbGV0ZUZuKSB7XHJcbiAgICAgIGZ1bmN0aW9uIGRlbGV0ZVNlcnZpY2VzKHNlcnZpY2VzLCBzZXJ2aWNlLCBvbkNvbXBsZXRlZEZuKSB7XHJcbiAgICAgICAgaWYgKCFzZXJ2aWNlIHx8ICFzZXJ2aWNlcykge1xyXG4gICAgICAgICAgcmV0dXJuIG9uQ29tcGxldGVkRm4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGlkID0gZ2V0TmFtZShzZXJ2aWNlKTtcclxuICAgICAgICBpZiAoIWlkKSB7XHJcbiAgICAgICAgICBsb2cud2FybihcIk5vIElEIGZvciBzZXJ2aWNlIFwiICsgYW5ndWxhci50b0pzb24oc2VydmljZSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBLdWJlcm5ldGVzU2VydmljZXMuZGVsZXRlKHtcclxuICAgICAgICAgICAgaWQ6IGlkXHJcbiAgICAgICAgICB9LCB1bmRlZmluZWQsICgpID0+IHtcclxuICAgICAgICAgICAgbG9nLmRlYnVnKFwiRGVsZXRlZCBzZXJ2aWNlOiBcIiwgaWQpO1xyXG4gICAgICAgICAgICBkZWxldGVTZXJ2aWNlcyhzZXJ2aWNlcywgc2VydmljZXMuc2hpZnQoKSwgb25Db21wbGV0ZWRGbik7XHJcbiAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgbG9nLmRlYnVnKFwiRXJyb3IgZGVsZXRpbmcgc2VydmljZTogXCIsIGVycm9yKTtcclxuICAgICAgICAgICAgZGVsZXRlU2VydmljZXMoc2VydmljZXMsIHNlcnZpY2VzLnNoaWZ0KCksIG9uQ29tcGxldGVkRm4pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBkZWxldGVSZXBsaWNhdGlvbkNvbnRyb2xsZXJzKHJlcGxpY2F0aW9uQ29udHJvbGxlcnMsIHJlcGxpY2F0aW9uQ29udHJvbGxlciwgb25Db21wbGV0ZWRGbikge1xyXG4gICAgICAgIGlmICghcmVwbGljYXRpb25Db250cm9sbGVyIHx8ICFyZXBsaWNhdGlvbkNvbnRyb2xsZXJzKSB7XHJcbiAgICAgICAgICByZXR1cm4gb25Db21wbGV0ZWRGbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaWQgPSBnZXROYW1lKHJlcGxpY2F0aW9uQ29udHJvbGxlcik7XHJcbiAgICAgICAgaWYgKCFpZCkge1xyXG4gICAgICAgICAgbG9nLndhcm4oXCJObyBJRCBmb3IgcmVwbGljYXRpb25Db250cm9sbGVyIFwiICsgYW5ndWxhci50b0pzb24ocmVwbGljYXRpb25Db250cm9sbGVyKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIEt1YmVybmV0ZXNSZXBsaWNhdGlvbkNvbnRyb2xsZXJzLmRlbGV0ZSh7XHJcbiAgICAgICAgICAgIGlkOiBpZFxyXG4gICAgICAgICAgfSwgdW5kZWZpbmVkLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhcIkRlbGV0ZWQgcmVwbGljYXRpb25Db250cm9sbGVyOiBcIiwgaWQpO1xyXG4gICAgICAgICAgICBkZWxldGVSZXBsaWNhdGlvbkNvbnRyb2xsZXJzKHJlcGxpY2F0aW9uQ29udHJvbGxlcnMsIHJlcGxpY2F0aW9uQ29udHJvbGxlcnMuc2hpZnQoKSwgb25Db21wbGV0ZWRGbik7XHJcbiAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgbG9nLmRlYnVnKFwiRXJyb3IgZGVsZXRpbmcgcmVwbGljYXRpb25Db250cm9sbGVyOiBcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICBkZWxldGVSZXBsaWNhdGlvbkNvbnRyb2xsZXJzKHJlcGxpY2F0aW9uQ29udHJvbGxlcnMsIHJlcGxpY2F0aW9uQ29udHJvbGxlcnMuc2hpZnQoKSwgb25Db21wbGV0ZWRGbik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIGRlbGV0ZVBvZHMocG9kcywgcG9kLCBvbkNvbXBsZXRlZEZuKSB7XHJcbiAgICAgICAgaWYgKCFwb2QgfHwgIXBvZHMpIHtcclxuICAgICAgICAgIHJldHVybiBvbkNvbXBsZXRlZEZuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpZCA9IGdldE5hbWUocG9kKTtcclxuICAgICAgICBpZiAoIWlkKSB7XHJcbiAgICAgICAgICBsb2cud2FybihcIk5vIElEIGZvciBwb2QgXCIgKyBhbmd1bGFyLnRvSnNvbihwb2QpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgS3ViZXJuZXRlc1BvZHMuZGVsZXRlKHtcclxuICAgICAgICAgICAgaWQ6IGlkXHJcbiAgICAgICAgICB9LCB1bmRlZmluZWQsICgpID0+IHtcclxuICAgICAgICAgICAgbG9nLmRlYnVnKFwiRGVsZXRlZCBwb2Q6IFwiLCBpZCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZVBvZHMocG9kcywgcG9kcy5zaGlmdCgpLCBvbkNvbXBsZXRlZEZuKTtcclxuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBsb2cuZGVidWcoXCJFcnJvciBkZWxldGluZyBwb2Q6IFwiLCBlcnJvcik7XHJcbiAgICAgICAgICAgIGRlbGV0ZVBvZHMocG9kcywgcG9kcy5zaGlmdCgpLCBvbkNvbXBsZXRlZEZuKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdmFyIHNlcnZpY2VzID0gW10uY29uY2F0KGFwcC5zZXJ2aWNlcyk7XHJcbiAgICAgIGRlbGV0ZVNlcnZpY2VzKHNlcnZpY2VzLCBzZXJ2aWNlcy5zaGlmdCgpLCAoKSA9PiB7XHJcblxyXG4gICAgICAgIHZhciByZXBsaWNhdGlvbkNvbnRyb2xsZXJzID0gW10uY29uY2F0KGFwcC5yZXBsaWNhdGlvbkNvbnRyb2xsZXJzKTtcclxuICAgICAgICBkZWxldGVSZXBsaWNhdGlvbkNvbnRyb2xsZXJzKHJlcGxpY2F0aW9uQ29udHJvbGxlcnMsIHJlcGxpY2F0aW9uQ29udHJvbGxlcnMuc2hpZnQoKSwgKCkgPT4ge1xyXG5cclxuICAgICAgICAgIHZhciBwb2RzID0gW10uY29uY2F0KGFwcC5wb2RzKTtcclxuICAgICAgICAgIGRlbGV0ZVBvZHMocG9kcywgcG9kcy5zaGlmdCgpLCBvbkNvbXBsZXRlRm4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAkc2NvcGUuZGVsZXRlU2luZ2xlQXBwID0gKGFwcCkgPT4ge1xyXG4gICAgICAkc2NvcGUuZGVsZXRlUHJvbXB0KFthcHBdKTtcclxuICAgIH1cclxuXHJcbiAgICAkc2NvcGUuZGVsZXRlUHJvbXB0ID0gKHNlbGVjdGVkKSA9PiB7XHJcbiAgICAgIGlmIChhbmd1bGFyLmlzU3RyaW5nKHNlbGVjdGVkKSkge1xyXG4gICAgICAgIHNlbGVjdGVkID0gW3tcclxuICAgICAgICAgIGlkOiBzZWxlY3RlZFxyXG4gICAgICAgIH1dO1xyXG4gICAgICB9XHJcbiAgICAgIFVJLm11bHRpSXRlbUNvbmZpcm1BY3Rpb25EaWFsb2coPFVJLk11bHRpSXRlbUNvbmZpcm1BY3Rpb25PcHRpb25zPntcclxuICAgICAgICBjb2xsZWN0aW9uOiBzZWxlY3RlZCxcclxuICAgICAgICBpbmRleDogJyRuYW1lJyxcclxuICAgICAgICBvbkNsb3NlOiAocmVzdWx0OmJvb2xlYW4pID0+IHtcclxuICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgZnVuY3Rpb24gZGVsZXRlU2VsZWN0ZWQoc2VsZWN0ZWQsIG5leHQpIHtcclxuICAgICAgICAgICAgICBpZiAobmV4dCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGlkID0gbmV4dC5uYW1lO1xyXG4gICAgICAgICAgICAgICAgbG9nLmRlYnVnKFwiZGVsZXRpbmc6IFwiLCBpZCk7XHJcbiAgICAgICAgICAgICAgICBkZWxldGVBcHAobmV4dCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBsb2cuZGVidWcoXCJkZWxldGVkOiBcIiwgaWQpO1xyXG4gICAgICAgICAgICAgICAgICBkZWxldGVTZWxlY3RlZChzZWxlY3RlZCwgc2VsZWN0ZWQuc2hpZnQoKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRlbGV0ZVNlbGVjdGVkKHNlbGVjdGVkLCBzZWxlY3RlZC5zaGlmdCgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHRpdGxlOiAnRGVsZXRlIEFwcHM/JyxcclxuICAgICAgICBhY3Rpb246ICdUaGUgZm9sbG93aW5nIEFwcHMgd2lsbCBiZSBkZWxldGVkOicsXHJcbiAgICAgICAgb2tUZXh0OiAnRGVsZXRlJyxcclxuICAgICAgICBva0NsYXNzOiAnYnRuLWRhbmdlcicsXHJcbiAgICAgICAgY3VzdG9tOiBcIlRoaXMgb3BlcmF0aW9uIGlzIHBlcm1hbmVudCBvbmNlIGNvbXBsZXRlZCFcIixcclxuICAgICAgICBjdXN0b21DbGFzczogXCJhbGVydCBhbGVydC13YXJuaW5nXCJcclxuICAgICAgfSkub3BlbigpO1xyXG4gICAgfTtcclxuXHJcbiAgICAkc2NvcGUuYXBwU2VsZWN0b3IgPSB7XHJcbiAgICAgIGZpbHRlclRleHQ6IFwiXCIsXHJcbiAgICAgIGZvbGRlcnM6IFtdLFxyXG4gICAgICBzZWxlY3RlZEFwcHM6IFtdLFxyXG5cclxuICAgICAgaXNPcGVuOiAoZm9sZGVyKSA9PiB7XHJcbiAgICAgICAgaWYgKCRzY29wZS5hcHBTZWxlY3Rvci5maWx0ZXJUZXh0ICE9PSAnJyB8fCBmb2xkZXIuZXhwYW5kZWQpIHtcclxuICAgICAgICAgIHJldHVybiBcIm9wZW5lZFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gXCJjbG9zZWRcIjtcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGdldFNlbGVjdGVkQ2xhc3M6IChhcHApID0+IHtcclxuICAgICAgICBpZiAoYXBwLmFic3RyYWN0KSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJhYnN0cmFjdFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYXBwLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCJzZWxlY3RlZFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgICAgfSxcclxuXHJcbiAgICAgIHNob3dBcHA6IChhcHApID0+IHtcclxuICAgICAgICByZXR1cm4gYXBwTWF0Y2hlcyhhcHApICYmICFhcHBSdW5uaW5nKGFwcCk7XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBzaG93Rm9sZGVyOiAoZm9sZGVyKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICEkc2NvcGUuYXBwU2VsZWN0b3IuZmlsdGVyVGV4dCB8fCBmb2xkZXIuYXBwcy5zb21lKChhcHApID0+IGFwcE1hdGNoZXMoYXBwKSAmJiAhYXBwUnVubmluZyhhcHApKTtcclxuICAgICAgfSxcclxuXHJcbiAgICAgIGNsZWFyU2VsZWN0ZWQ6ICgpID0+IHtcclxuICAgICAgICBhbmd1bGFyLmZvckVhY2goJHNjb3BlLm1vZGVsLmFwcEZvbGRlcnMsIChmb2xkZXIpID0+IHtcclxuICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChmb2xkZXIuYXBwcywgKGFwcCkgPT4ge1xyXG4gICAgICAgICAgICBhcHAuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICRzY29wZS5hcHBTZWxlY3Rvci5zZWxlY3RlZEFwcHMgPSBbXTtcclxuICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgdXBkYXRlU2VsZWN0ZWQ6ICgpID0+IHtcclxuICAgICAgICAvLyBsZXRzIHVwZGF0ZSB0aGUgc2VsZWN0ZWQgYXBwc1xyXG4gICAgICAgIHZhciBzZWxlY3RlZEFwcHMgPSBbXTtcclxuICAgICAgICBhbmd1bGFyLmZvckVhY2goJHNjb3BlLm1vZGVsLmFwcEZvbGRlcnMsIChmb2xkZXIpID0+IHtcclxuICAgICAgICAgIHZhciBhcHBzID0gZm9sZGVyLmFwcHMuZmlsdGVyKChhcHApID0+IGFwcC5zZWxlY3RlZCk7XHJcbiAgICAgICAgICBpZiAoYXBwcykge1xyXG4gICAgICAgICAgICBzZWxlY3RlZEFwcHMgPSBzZWxlY3RlZEFwcHMuY29uY2F0KGFwcHMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICRzY29wZS5hcHBTZWxlY3Rvci5zZWxlY3RlZEFwcHMgPSBfLnNvcnRCeShzZWxlY3RlZEFwcHMsIFwibmFtZVwiKTtcclxuICAgICAgfSxcclxuXHJcbiAgICAgIHNlbGVjdDogKGFwcCwgZmxhZykgPT4ge1xyXG4gICAgICAgIGFwcC5zZWxlY3RlZCA9IGZsYWc7XHJcbiAgICAgICAgJHNjb3BlLmFwcFNlbGVjdG9yLnVwZGF0ZVNlbGVjdGVkKCk7XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBoYXNTZWxlY3Rpb246ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gJHNjb3BlLm1vZGVsLmFwcEZvbGRlcnMuYW55KChmb2xkZXIpID0+IGZvbGRlci5hcHBzLmFueSgoYXBwKSA9PiBhcHAuc2VsZWN0ZWQpKTtcclxuICAgICAgfSxcclxuXHJcblxyXG4gICAgICBydW5TZWxlY3RlZEFwcHM6ICgpID0+IHtcclxuICAgICAgICAvLyBsZXRzIHJ1biBhbGwgdGhlIHNlbGVjdGVkIGFwcHNcclxuICAgICAgICBhbmd1bGFyLmZvckVhY2goJHNjb3BlLmFwcFNlbGVjdG9yLnNlbGVjdGVkQXBwcywgKGFwcCkgPT4ge1xyXG4gICAgICAgICAgdmFyIG5hbWUgPSBhcHAubmFtZTtcclxuICAgICAgICAgIHZhciBtZXRhZGF0YVBhdGggPSBhcHAubWV0YWRhdGFQYXRoO1xyXG4gICAgICAgICAgaWYgKG1ldGFkYXRhUGF0aCkge1xyXG4gICAgICAgICAgICAvLyBsZXRzIGxvYWQgdGhlIGpzb24veWFtbFxyXG4gICAgICAgICAgICAvL3ZhciB1cmwgPSBnaXRQYXRoVG9VcmwoV2lraS5naXRSZWxhdGl2ZVVSTChicmFuY2gsIG1ldGFkYXRhUGF0aCkpO1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gZ2l0UGF0aFRvVXJsKG1ldGFkYXRhUGF0aCwgYnJhbmNoKTtcclxuICAgICAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICAgICRodHRwLmdldCh1cmwpLlxyXG4gICAgICAgICAgICAgICAgc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBsZXRzIGNvbnZlcnQgdGhlIGpzb24gb2JqZWN0IHN0cnVjdHVyZSBpbnRvIGEgc3RyaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGpzb24gPSBhbmd1bGFyLnRvSnNvbihkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZm4gPSAoKSA9PiB7fTtcclxuICAgICAgICAgICAgICAgICAgICBLdWJlcm5ldGVzLnJ1bkFwcCgkbG9jYXRpb24sICRzY29wZSwgJGh0dHAsIEt1YmVybmV0ZXNBcGlVUkwsIGpzb24sIG5hbWUsIGZuLCBuYW1lc3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KS5cclxuICAgICAgICAgICAgICAgIGVycm9yKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAkc2NvcGUuc3VtbWFyeUh0bWwgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byBsb2FkIFwiICsgdXJsICsgXCIgXCIgKyBkYXRhICsgXCIgXCIgKyBzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBsZXRzIGdvIGJhY2sgdG8gdGhlIGFwcHMgdmlld1xyXG4gICAgICAgICRzY29wZS5hcHBTZWxlY3Rvci5jbGVhclNlbGVjdGVkKCk7XHJcbiAgICAgICAgJHNjb3BlLmFwcFNlbGVjdG9yU2hvdyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICB9XSk7XHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG5cclxubW9kdWxlIEt1YmVybmV0ZXMge1xyXG5cclxuICBfbW9kdWxlLmRpcmVjdGl2ZShcImhhd3Rpb0JyZWFkY3J1bWJzXCIsIFsnSGF3dGlvQnJlYWRjcnVtYnMnLCAoSGF3dGlvQnJlYWRjcnVtYnMpID0+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC8qXHJcbiAgICAgIHRlbXBsYXRlVXJsOiBLdWJlcm5ldGVzLnRlbXBsYXRlUGF0aCArICdicmVhZGNydW1icy5odG1sJ1xyXG4gICAgICAqL1xyXG4gICAgICBsaW5rOiAoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSA9PiB7XHJcbiAgICAgICAgSGF3dGlvQnJlYWRjcnVtYnMuYXBwbHkoc2NvcGUuJGV2YWwoJ2JyZWFkY3J1bWJDb25maWcnKSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc1BsdWdpbi50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgZXhwb3J0IHZhciBCdWlsZENvbnRyb2xsZXIgPSBjb250cm9sbGVyKFwiQnVpbGRDb250cm9sbGVyXCIsXHJcbiAgICBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCJLdWJlcm5ldGVzU2NoZW1hXCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkbG9jYXRpb25cIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiS3ViZXJuZXRlc0FwaVVSTFwiLFxyXG4gICAgICAoJHNjb3BlLCBLdWJlcm5ldGVzTW9kZWw6S3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNTY2hlbWEsXHJcbiAgICAgICAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlLCAkcm91dGVQYXJhbXMsICRodHRwLCAkdGltZW91dCwgS3ViZXJuZXRlc0FwaVVSTCkgPT4ge1xyXG5cclxuICAgICAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICAgICAkc2NvcGUubW9kZWwgPSBLdWJlcm5ldGVzTW9kZWw7XHJcbiAgICAgICAgJHNjb3BlLmlkID0gJHJvdXRlUGFyYW1zW1wiaWRcIl07XHJcbiAgICAgICAgJHNjb3BlLnNjaGVtYSA9IEt1YmVybmV0ZXNTY2hlbWE7XHJcbiAgICAgICAgJHNjb3BlLmNvbmZpZyA9IEt1YmVybmV0ZXNTY2hlbWEuZGVmaW5pdGlvbnMub3NfYnVpbGRfQnVpbGQ7XHJcblxyXG4gICAgICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuICAgICAgICAkc2NvcGUuYnJlYWRjcnVtYkNvbmZpZyA9IERldmVsb3Blci5jcmVhdGVQcm9qZWN0QnJlYWRjcnVtYnMoJHNjb3BlLmlkKTtcclxuICAgICAgICAkc2NvcGUuc3ViVGFiQ29uZmlnID0gRGV2ZWxvcGVyLmNyZWF0ZVByb2plY3RTdWJOYXZCYXJzKCRzY29wZS5pZCwgbnVsbCwgJHNjb3BlKTtcclxuXHJcbiAgICAgICAgJHNjb3BlLiRvbigna3ViZXJuZXRlc01vZGVsVXBkYXRlZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJHNjb3BlLiRvbignJHJvdXRlVXBkYXRlJywgKCRldmVudCkgPT4ge1xyXG4gICAgICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB1cGRhdGVEYXRhKCk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZURhdGEoKSB7XHJcbiAgICAgICAgICAkc2NvcGUuaXRlbSA9IG51bGw7XHJcbiAgICAgICAgICBpZiAoJHNjb3BlLmlkKSB7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSBidWlsZFJlc3RVcmwoJHNjb3BlLmlkKTtcclxuICAgICAgICAgICAgJGh0dHAuZ2V0KHVybCkuXHJcbiAgICAgICAgICAgICAgc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICRzY29wZS5lbnRpdHkgPSBlbnJpY2hCdWlsZChkYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICRzY29wZS5mZXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICAgICAgfSkuXHJcbiAgICAgICAgICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byBsb2FkIFwiICsgdXJsICsgXCIgXCIgKyBkYXRhICsgXCIgXCIgKyBzdGF0dXMpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJHNjb3BlLmZldGNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc1BsdWdpbi50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgZXhwb3J0IHZhciBCdWlsZENvbmZpZ0NvbnRyb2xsZXIgPSBjb250cm9sbGVyKFwiQnVpbGRDb25maWdDb250cm9sbGVyXCIsXHJcbiAgICBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCJLdWJlcm5ldGVzU2NoZW1hXCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkbG9jYXRpb25cIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiS3ViZXJuZXRlc0FwaVVSTFwiLFxyXG4gICAgICAoJHNjb3BlLCBLdWJlcm5ldGVzTW9kZWw6S3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNTY2hlbWEsXHJcbiAgICAgICAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlLCAkcm91dGVQYXJhbXMsICRodHRwLCAkdGltZW91dCwgS3ViZXJuZXRlc0FwaVVSTCkgPT4ge1xyXG5cclxuICAgICAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICAgICAkc2NvcGUubW9kZWwgPSBLdWJlcm5ldGVzTW9kZWw7XHJcbiAgICAgICAgJHNjb3BlLmlkID0gJHJvdXRlUGFyYW1zW1wiaWRcIl07XHJcbiAgICAgICAgJHNjb3BlLnNjaGVtYSA9IEt1YmVybmV0ZXNTY2hlbWE7XHJcbiAgICAgICAgJHNjb3BlLmNvbmZpZyA9IEt1YmVybmV0ZXNTY2hlbWEuZGVmaW5pdGlvbnMub3NfYnVpbGRfQnVpbGRDb25maWc7XHJcblxyXG4gICAgICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuICAgICAgICAkc2NvcGUuYnJlYWRjcnVtYkNvbmZpZyA9IERldmVsb3Blci5jcmVhdGVQcm9qZWN0QnJlYWRjcnVtYnMoJHNjb3BlLmlkKTtcclxuICAgICAgICAkc2NvcGUuc3ViVGFiQ29uZmlnID0gRGV2ZWxvcGVyLmNyZWF0ZVByb2plY3RTdWJOYXZCYXJzKCRzY29wZS5pZCk7XHJcblxyXG4gICAgICAgICRzY29wZS4kb24oJ2t1YmVybmV0ZXNNb2RlbFVwZGF0ZWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICRzY29wZS4kb24oJyRyb3V0ZVVwZGF0ZScsICgkZXZlbnQpID0+IHtcclxuICAgICAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdXBkYXRlRGF0YSgpO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVEYXRhKCkge1xyXG4gICAgICAgICAgJHNjb3BlLml0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgaWYgKCRzY29wZS5pZCkge1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gYnVpbGRDb25maWdSZXN0VXJsKCRzY29wZS5pZCk7XHJcbiAgICAgICAgICAgICRodHRwLmdldCh1cmwpLlxyXG4gICAgICAgICAgICAgIHN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAkc2NvcGUuZW50aXR5ID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgdmFyIHNvcnRlZEJ1aWxkcyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgIGVucmljaEJ1aWxkQ29uZmlnKGRhdGEsIHNvcnRlZEJ1aWxkcyk7XHJcbiAgICAgICAgICAgICAgICAgICRzY29wZS5tb2RlbC5zZXRQcm9qZWN0KCRzY29wZS5lbnRpdHkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgJHNjb3BlLmZldGNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgQ29yZS4kYXBwbHkoJHNjb3BlKTtcclxuICAgICAgICAgICAgICB9KS5cclxuICAgICAgICAgICAgICBlcnJvcihmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICAgIGxvZy53YXJuKFwiRmFpbGVkIHRvIGxvYWQgXCIgKyB1cmwgKyBcIiBcIiArIGRhdGEgKyBcIiBcIiArIHN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkc2NvcGUuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XSk7XHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG5cclxubW9kdWxlIEt1YmVybmV0ZXMge1xyXG5cclxuICBleHBvcnQgdmFyIEJ1aWxkQ29uZmlnRWRpdENvbnRyb2xsZXIgPSBfbW9kdWxlLmNvbnRyb2xsZXIoXCJLdWJlcm5ldGVzLkJ1aWxkQ29uZmlnRWRpdENvbnRyb2xsZXJcIiwgKCRzY29wZSwgJGVsZW1lbnQsIEt1YmVybmV0ZXNNb2RlbDpLdWJlcm5ldGVzLkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc1NjaGVtYSwgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJvdXRlUGFyYW1zLCAkaHR0cCwgJHRpbWVvdXQsIEt1YmVybmV0ZXNBcGlVUkwsIEs4U0NsaWVudEZhY3RvcnksIFNjaGVtYVJlZ2lzdHJ5Okhhd3Rpb0Zvcm1zLlNjaGVtYVJlZ2lzdHJ5KSA9PiB7XHJcblxyXG4gICAgICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG4gICAgICAgICRzY29wZS5tb2RlbCA9IEt1YmVybmV0ZXNNb2RlbDtcclxuICAgICAgICAkc2NvcGUuaWQgPSAkcm91dGVQYXJhbXNbXCJwcm9qZWN0XCJdIHx8ICRyb3V0ZVBhcmFtc1tcImlkXCJdO1xyXG4gICAgICAgICRzY29wZS5zY2hlbWEgPSBLdWJlcm5ldGVzU2NoZW1hO1xyXG5cclxuICAgICAgICB2YXIgbW9kZSA9ICRzY29wZS4kZXZhbCgnbW9kZScpIHx8ICdlZGl0JztcclxuXHJcbiAgICAgICAgbG9nLmRlYnVnKFwiTW9kZTogXCIsIG1vZGUpO1xyXG5cclxuXHJcbiAgICAgICAgdmFyIHNwZWNDb25maWcgPSBTY2hlbWFSZWdpc3RyeS5nZXRTY2hlbWEoJ2lvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5CdWlsZENvbmZpZ1NwZWMnKTtcclxuICAgICAgICB2YXIgZ2l0QnVpbGRTb3VyY2UgPSBTY2hlbWFSZWdpc3RyeS5nZXRTY2hlbWEoJ2lvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5HaXRCdWlsZFNvdXJjZScpO1xyXG4gICAgICAgIHZhciBidWlsZFNvdXJjZSA9IFNjaGVtYVJlZ2lzdHJ5LmdldFNjaGVtYSgnaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkJ1aWxkU291cmNlJyk7XHJcbiAgICAgICAgdmFyIGJ1aWxkT3V0cHV0ID0gU2NoZW1hUmVnaXN0cnkuZ2V0U2NoZW1hKCdpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQnVpbGRPdXRwdXQnKTtcclxuICAgICAgICB2YXIgcmVzb3VyY2VzID0gU2NoZW1hUmVnaXN0cnkuZ2V0U2NoZW1hKCdpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJlc291cmNlUmVxdWlyZW1lbnRzJyk7XHJcbiAgICAgICAgdmFyIHJldmlzaW9uID0gU2NoZW1hUmVnaXN0cnkuZ2V0U2NoZW1hKCdpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuU291cmNlUmV2aXNpb24nKTtcclxuICAgICAgICB2YXIgc3RyYXRlZ3kgPSBTY2hlbWFSZWdpc3RyeS5nZXRTY2hlbWEoJ2lvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5CdWlsZFN0cmF0ZWd5Jyk7XHJcbiAgICAgICAgdmFyIGN1c3RvbVN0cmF0ZWd5ID0gU2NoZW1hUmVnaXN0cnkuZ2V0U2NoZW1hKCdpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQ3VzdG9tQnVpbGRTdHJhdGVneScpO1xyXG4gICAgICAgIHZhciBidWlsZFRyaWdnZXJQb2xpY3kgPSBTY2hlbWFSZWdpc3RyeS5nZXRTY2hlbWEoJ2lvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5CdWlsZFRyaWdnZXJQb2xpY3knKTtcclxuXHJcbiAgICAgICAgdmFyIGdldFNlY3JldHMgPSAoKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gJHNjb3BlLnNlY3JldHM7XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHZhciBzZWNyZXRTY2hlbWFUeXBlID0gXCJmYWJyaWM4X1NlY3JldFJlZmVyZW5jZVwiO1xyXG4gICAgICAgIHZhciBzZWNyZXRTY2hlbWFSZWYgPSBcIiMvZGVmaW5pdGlvbnMvXCIgKyBzZWNyZXRTY2hlbWFUeXBlO1xyXG4gICAgICAgIHZhciBzZWNyZXRTY2hlbWFKYXZhVHlwZSA9IFwiaW8uZmFicmljOC5jb25zb2xlLlNlY3JldFJlZmVyZW5jZVwiO1xyXG5cclxuICAgICAgICB2YXIgc2VjcmV0TmFtZUVsZW1lbnQgPSA8SGF3dGlvRm9ybXMuRm9ybUVsZW1lbnQ+IHtcclxuICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgXCJlbnVtXCI6IGdldFNlY3JldHMsXHJcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHZhciBzZWNyZXRTY2hlbWE6IEhhd3Rpb0Zvcm1zLkZvcm1Db25maWd1cmF0aW9uID0gPGFueT4ge1xyXG4gICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBzZWNyZXROYW1lRWxlbWVudFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGphdmFUeXBlOiBzZWNyZXRTY2hlbWFKYXZhVHlwZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgU2NoZW1hUmVnaXN0cnkuYWRkU2NoZW1hKHNlY3JldFNjaGVtYVR5cGUsIHNlY3JldFNjaGVtYSk7XHJcblxyXG4gICAgICAgIC8vIGxldHMgc3dpdGNoIHRvIHRoZSBuZXcgc2VjcmV0cyB0eXBlczpcclxuICAgICAgICB2YXIgc291cmNlU2VjcmV0UHJvcGVydHkgPSBDb3JlLnBhdGhHZXQoYnVpbGRTb3VyY2UsIFtcInByb3BlcnRpZXNcIiwgXCJzb3VyY2VTZWNyZXRcIl0pO1xyXG4gICAgICAgIGFuZ3VsYXIuZm9yRWFjaChbXHJcbiAgICAgICAgICBDb3JlLnBhdGhHZXQoY3VzdG9tU3RyYXRlZ3ksIFtcInByb3BlcnRpZXNcIiwgXCJwdWxsU2VjcmV0XCJdKSxcclxuICAgICAgICAgIHNvdXJjZVNlY3JldFByb3BlcnR5LFxyXG4gICAgICAgIF0sIChzY2hlbWFUeXBlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoc2NoZW1hVHlwZSkge1xyXG4gICAgICAgICAgICBzY2hlbWFUeXBlW1widHlwZVwiXSA9IHNlY3JldFNjaGVtYVR5cGU7XHJcbiAgICAgICAgICAgIHNjaGVtYVR5cGVbXCIkcmVmXCJdID0gc2VjcmV0U2NoZW1hUmVmO1xyXG4gICAgICAgICAgICBzY2hlbWFUeXBlW1wiamF2YVR5cGVcIl0gPSBzZWNyZXRTY2hlbWFKYXZhVHlwZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gbGV0cyB0cnkgbWFrZSB0aGUgYnVpbGRTb3VyY2UncyBzb3VyY2VTZWNyZXQgbWFuZGF0b3J5XHJcbiAgICAgICAgLy9zY2hlbWFTZXRSZXF1aXJlZChjdXN0b21TdHJhdGVneSwgJ3B1bGxTZWNyZXQnKTtcclxuICAgICAgICBzY2hlbWFTZXRSZXF1aXJlZChidWlsZFNvdXJjZSwgJ3NvdXJjZVNlY3JldCcpO1xyXG4gICAgICAgIGlmIChzb3VyY2VTZWNyZXRQcm9wZXJ0eSkge1xyXG4gICAgICAgICAgQ29yZS5wYXRoU2V0KHNvdXJjZVNlY3JldFByb3BlcnR5LCBbJ3Byb3BlcnRpZXMnLCAncmVxdWlyZWQnXSwgdHJ1ZSk7XHJcbiAgICAgICAgICBDb3JlLnBhdGhTZXQoc291cmNlU2VjcmV0UHJvcGVydHksIFsncHJvcGVydGllcycsICdpbnB1dC1hdHRyaWJ1dGVzJywgJ3JlcXVpcmVkJ10sIHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJHNjb3BlLmN1c3RvbVN0cmF0ZWd5ID0gY3VzdG9tU3RyYXRlZ3k7XHJcbiAgICAgICAgJHNjb3BlLmJ1aWxkU291cmNlID0gYnVpbGRTb3VyY2U7XHJcblxyXG4gICAgICAgICRzY29wZS5zZWNyZXRzID0gW107XHJcblxyXG4gICAgICAgIC8vICRzY29wZS5jb25maWcgPSBLdWJlcm5ldGVzU2NoZW1hLmRlZmluaXRpb25zLm9zX2J1aWxkX0J1aWxkQ29uZmlnO1xyXG4gICAgICAgIC8vJHNjb3BlLnNwZWNDb25maWcgPSBLdWJlcm5ldGVzU2NoZW1hLmRlZmluaXRpb25zLm9zX2J1aWxkX0J1aWxkQ29uZmlnU3BlYztcclxuICAgICAgICAvL1xyXG4gICAgICAgIHNwZWNDb25maWcuc3R5bGUgPSBIYXd0aW9Gb3Jtcy5Gb3JtU3R5bGUuU1RBTkRBUkQ7XHJcbiAgICAgICAgc3BlY0NvbmZpZy5wcm9wZXJ0aWVzWyd0cmlnZ2VycyddWydsYWJlbC1hdHRyaWJ1dGVzJ10gPSB7XHJcbiAgICAgICAgICBzdHlsZTogJ2Rpc3BsYXk6IG5vbmU7J1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGdpdEJ1aWxkU291cmNlLmNvbnRyb2xzID0gWyd1cmknLCAncmVmJywgJyonXTtcclxuICAgICAgICBidWlsZFNvdXJjZS5wcm9wZXJ0aWVzWyd0eXBlJ10udHlwZSA9ICdoaWRkZW4nO1xyXG4gICAgICAgIGJ1aWxkU291cmNlLnByb3BlcnRpZXNbJ3R5cGUnXVsnZGVmYXVsdCddID0gJ0dpdCc7XHJcbiAgICAgICAgYnVpbGRTb3VyY2UuY29udHJvbHMgPSBbJ2dpdCcsICdjb250ZXh0RGlyJywgJ3NvdXJjZVNlY3JldCcsICcqJ107XHJcblxyXG4gICAgICAgIGdpdEJ1aWxkU291cmNlWydoaWRlTGVnZW5kJ10gPSB0cnVlO1xyXG4gICAgICAgIGJ1aWxkU291cmNlWydoaWRlTGVnZW5kJ10gPSB0cnVlO1xyXG4gICAgICAgIGJ1aWxkT3V0cHV0WydoaWRlTGVnZW5kJ10gPSB0cnVlO1xyXG4gICAgICAgIHJlc291cmNlc1snaGlkZUxlZ2VuZCddID0gdHJ1ZTtcclxuICAgICAgICByZXZpc2lvblsnaGlkZUxlZ2VuZCddID0gdHJ1ZTtcclxuICAgICAgICBzdHJhdGVneVsnaGlkZUxlZ2VuZCddID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgc3RyYXRlZ3kuY29udHJvbHMgPSBbJ3R5cGUnLCAnKiddO1xyXG4gICAgICAgIHN0cmF0ZWd5LnByb3BlcnRpZXNbJ3R5cGUnXSA9IHtcclxuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcclxuICAgICAgICAgIGVudW06IFt7XHJcbiAgICAgICAgICAgICd2YWx1ZSc6ICdDdXN0b20nLFxyXG4gICAgICAgICAgICAnbGFiZWwnOiAnQ3VzdG9tJ1xyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAndmFsdWUnOiAnRG9ja2VyJyxcclxuICAgICAgICAgICAgJ2xhYmVsJzogJ0RvY2tlcidcclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgJ3ZhbHVlJzogJ1NvdXJjZScsXHJcbiAgICAgICAgICAgICdsYWJlbCc6ICdTb3VyY2UnXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY3VzdG9tU3RyYXRlZ3lbJ2NvbnRyb2wtZ3JvdXAtYXR0cmlidXRlcyddID0ge1xyXG4gICAgICAgICAgJ25nLXNob3cnOiBcImVudGl0eS50eXBlID09ICdDdXN0b20nXCJcclxuICAgICAgICB9O1xyXG4gICAgICAgIHN0cmF0ZWd5LnByb3BlcnRpZXNbJ2RvY2tlclN0cmF0ZWd5J11bJ2NvbnRyb2wtZ3JvdXAtYXR0cmlidXRlcyddID0ge1xyXG4gICAgICAgICAgJ25nLXNob3cnOiBcImVudGl0eS50eXBlID09ICdEb2NrZXInXCJcclxuICAgICAgICB9O1xyXG4gICAgICAgIHN0cmF0ZWd5LnByb3BlcnRpZXNbJ3NvdXJjZVN0cmF0ZWd5J11bJ2NvbnRyb2wtZ3JvdXAtYXR0cmlidXRlcyddID0ge1xyXG4gICAgICAgICAgJ25nLXNob3cnOiBcImVudGl0eS50eXBlID09ICdTb3VyY2UnXCJcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBidWlsZFRyaWdnZXJQb2xpY3kuY29udHJvbHMgPSBbJ3R5cGUnLCAnKiddO1xyXG4gICAgICAgIGJ1aWxkVHJpZ2dlclBvbGljeS5wcm9wZXJ0aWVzWyd0eXBlJ10gPSB7XHJcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcclxuICAgICAgICAgIGVudW06IFt7XHJcbiAgICAgICAgICAgICd2YWx1ZSc6ICdHaXRodWInLFxyXG4gICAgICAgICAgICAnbGFiZWwnOiAnR2l0aHViJ1xyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAndmFsdWUnOiAnSW1hZ2VDaGFuZ2UnLFxyXG4gICAgICAgICAgICAnbGFiZWwnOiAnSW1hZ2UgQ2hhbmdlJ1xyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAndmFsdWUnOiAnR2VuZXJpYycsXHJcbiAgICAgICAgICAgICdsYWJlbCc6ICdHZW5lcmljJ1xyXG4gICAgICAgICAgfV1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGJ1aWxkVHJpZ2dlclBvbGljeS5wcm9wZXJ0aWVzWydnZW5lcmljJ11bJ2NvbnRyb2wtZ3JvdXAtYXR0cmlidXRlcyddID0ge1xyXG4gICAgICAgICAgJ25nLXNob3cnOiBcImVudGl0eS50eXBlID09ICdHZW5lcmljJ1wiXHJcbiAgICAgICAgfTtcclxuICAgICAgICBidWlsZFRyaWdnZXJQb2xpY3kucHJvcGVydGllc1snZ2l0aHViJ11bJ2NvbnRyb2wtZ3JvdXAtYXR0cmlidXRlcyddID0ge1xyXG4gICAgICAgICAgJ25nLXNob3cnOiBcImVudGl0eS50eXBlID09ICdHaXRodWInXCJcclxuICAgICAgICB9O1xyXG4gICAgICAgIGJ1aWxkVHJpZ2dlclBvbGljeS5wcm9wZXJ0aWVzWydpbWFnZUNoYW5nZSddWydjb250cm9sLWdyb3VwLWF0dHJpYnV0ZXMnXSA9IHtcclxuICAgICAgICAgICduZy1zaG93JzogXCJlbnRpdHkudHlwZSA9PSAnSW1hZ2VDaGFuZ2UnXCJcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyByZS1hcnJhbmdpbmcgdGhlIGNvbnRyb2xzXHJcbiAgICAgICAgLy9zcGVjQ29uZmlnLmNvbnRyb2xzID0gWydzb3VyY2UnLCAnKiddO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHRhYnNcclxuICAgICAgICBzcGVjQ29uZmlnLnRhYnMgPSB7XHJcbiAgICAgICAgICBcIlNvdXJjZVwiOiBbXCJzb3VyY2VcIl0sXHJcbiAgICAgICAgICBcIlJldmlzaW9uXCI6IFtcInJldmlzaW9uXCJdLFxyXG4gICAgICAgICAgXCJPdXRwdXRcIjogW1wib3V0cHV0XCJdLFxyXG4gICAgICAgICAgXCJSZXNvdXJjZXNcIjogW1wicmVzb3VyY2VzXCJdLFxyXG4gICAgICAgICAgXCJTdHJhdGVneVwiOiBbXCJzdHJhdGVneVwiXSxcclxuICAgICAgICAgIFwiVHJpZ2dlcnNcIjogW1widHJpZ2dlcnNcIl0sXHJcbiAgICAgICAgICBcIlNlcnZpY2UgQWNjb3VudFwiOiBbXCJzZXJ2aWNlQWNjb3VudFwiXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiB3aXphcmQsIG5lZWRzIGFuICdvbkZpbmlzaCcgZnVuY3Rpb24gaW4gdGhlIHNjb3BlXHJcbiAgICAgICAgc3BlY0NvbmZpZy53aXphcmQgPSA8YW55PntcclxuICAgICAgICAgIHBhZ2VzOiB7XHJcbiAgICAgICAgICAgIFNvdXJjZToge1xyXG4gICAgICAgICAgICAgIGNvbnRyb2xzOiBbXCJzb3VyY2VcIl1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgUmV2aXNpb246IHtcclxuICAgICAgICAgICAgICBjb250cm9sczogW1wicmV2aXNpb25cIl1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgT3V0cHV0OiB7XHJcbiAgICAgICAgICAgICAgY29udHJvbHM6IFtcIm91dHB1dFwiXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBSZXNvdXJjZXM6IHtcclxuICAgICAgICAgICAgICBjb250cm9sczogW1wicmVzb3VyY2VzXCJdXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFN0cmF0ZWd5OiB7XHJcbiAgICAgICAgICAgICAgY29udHJvbHM6IFtcInN0cmF0ZWd5XCJdXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFRyaWdnZXJzOiB7XHJcbiAgICAgICAgICAgICAgY29udHJvbHM6IFtcInRyaWdnZXJzXCJdXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFwiU2VydmljZSBBY2NvdW50XCI6IHtcclxuICAgICAgICAgICAgICBjb250cm9sczogW1wic2VydmljZUFjY291bnRcIl1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgKi9cclxuXHJcbiAgICAgICAgJHNjb3BlLmVudGl0eSA9IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiBcInYxXCIsXHJcbiAgICAgICAgICBcImtpbmRcIjogXCJCdWlsZENvbmZpZ1wiLFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImxhYmVsc1wiOiB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNwZWNcIjoge1xyXG4gICAgICAgICAgICBcInNvdXJjZVwiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiR2l0XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXCJzdHJhdGVneVwiOiB7XHJcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJDdXN0b21cIixcclxuICAgICAgICAgICAgICAgIFwiY3VzdG9tU3RyYXRlZ3lcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiZnJvbVwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwia2luZFwiOiBcIkRvY2tlckltYWdlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcImZhYnJpYzgvb3BlbnNoaWZ0LXMyaS1qZW5raW5zLXRyaWdnZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgXCJlbnZcIjogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJCQVNFX1VSSVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiBqZW5raW5zVXJsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkpPQl9OQU1FXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCI6IGpvYk5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgICRzY29wZS4kd2F0Y2goJ2VudGl0eS5zcGVjLnNvdXJjZS5naXQudXJpJywgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF2YWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdmFyIGxhc3RCaXQgPSB2YWwubWF0Y2goL1teXFwvXSskLylbMF07XHJcbiAgICAgICAgICBpZiAobGFzdEJpdCkge1xyXG4gICAgICAgICAgICB2YXIgbmFtZSA9IGxhc3RCaXQucmVwbGFjZSgvXFwuZ2l0JC8sICcnKTtcclxuICAgICAgICAgICAgbG9nLmRlYnVnKFwibmFtZTogXCIsIG5hbWUpO1xyXG4gICAgICAgICAgICBpZiAoIUNvcmUuaXNCbGFuayhuYW1lKSBcclxuICAgICAgICAgICAgICAmJiBDb3JlLmlzQmxhbmsoQ29yZS5wYXRoR2V0KCRzY29wZS5lbnRpdHksIFsnbWV0YWRhdGEnLCAnbmFtZSddKSkpIHtcclxuICAgICAgICAgICAgICBDb3JlLnBhdGhTZXQoJHNjb3BlLmVudGl0eSwgWydtZXRhZGF0YScsICduYW1lJ10sIG5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuICAgICAgICAkc2NvcGUuYnJlYWRjcnVtYkNvbmZpZyA9IERldmVsb3Blci5jcmVhdGVQcm9qZWN0U2V0dGluZ3NCcmVhZGNydW1icygkc2NvcGUucHJvamVjdElkKTtcclxuICAgICAgICAkc2NvcGUuc3ViVGFiQ29uZmlnID0gRGV2ZWxvcGVyLmNyZWF0ZVByb2plY3RTdWJOYXZCYXJzKCRzY29wZS5wcm9qZWN0SWQpO1xyXG4gICAgICAgICRzY29wZS50YWJzID0gRGV2ZWxvcGVyLmNyZWF0ZVByb2plY3RTZXR0aW5nc1N1Yk5hdkJhcnMoJHNjb3BlLnByb2plY3RJZCk7XHJcblxyXG4gICAgICAgIHdhdGNoKCRzY29wZSwgJGVsZW1lbnQsIFwic2VjcmV0c1wiLCAkc2NvcGUubmFtZXNwYWNlLCBvblNlY3JldHMpO1xyXG5cclxuXHJcbiAgICAgICAgJHNjb3BlLmJ1aWxkQ29uZmlnQ2xpZW50ID0gSzhTQ2xpZW50RmFjdG9yeS5jcmVhdGUoXCJidWlsZGNvbmZpZ3NcIiwgJHNjb3BlLm5hbWVzcGFjZSk7XHJcblxyXG4gICAgICAgICRlbGVtZW50Lm9uKCckZGVzdHJveScsICgpID0+IHtcclxuICAgICAgICAgICRzY29wZS4kZGVzdHJveSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICRzY29wZS4kb24oJyRkZXN0cm95JywgKCkgPT4ge1xyXG4gICAgICAgICAgSzhTQ2xpZW50RmFjdG9yeS5kZXN0cm95KCRzY29wZS5idWlsZENvbmZpZ0NsaWVudCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4vKlxyXG4gICAgICAgICRzY29wZS4kb24oJ2t1YmVybmV0ZXNNb2RlbFVwZGF0ZWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4qL1xyXG4gICAgICAgICRzY29wZS4kb24oJyRyb3V0ZVVwZGF0ZScsICgkZXZlbnQpID0+IHtcclxuICAgICAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJHNjb3BlLnNhdmUgPSAoKSA9PiB7XHJcbiAgICAgICAgICBsb2cuaW5mbyhcIlNhdmluZyFcIik7XHJcblxyXG5cclxuICAgICAgICAgIHZhciBlbnRpdHkgPSAkc2NvcGUuZW50aXR5O1xyXG4gICAgICAgICAgdmFyIHNwZWMgPSAoZW50aXR5IHx8IHt9KS5zcGVjIHx8IHt9O1xyXG5cclxuICAgICAgICAgIC8vIFRPRE8gdXBkYXRlIHRoZSBqZW5raW5zIGpvYiBuYW1lIVxyXG5cclxuICAgICAgICAgIC8vIGxldHMgZGVsZXRlIGxvdHMgb2YgY3J1ZnRcclxuICAgICAgICAgIHZhciBzdHJhdGVneSA9IHNwZWMuc3RyYXRlZ3kgfHwge307XHJcbiAgICAgICAgICBkZWxldGUgc3RyYXRlZ3lbXCJkb2NrZXJTdHJhdGVneVwiXTtcclxuICAgICAgICAgIGRlbGV0ZSBzdHJhdGVneVtcInNvdXJjZVN0cmF0ZWd5XCJdO1xyXG5cclxuICAgICAgICAgIGRlbGV0ZSBzcGVjW1wicmV2aXNpb25cIl07XHJcbiAgICAgICAgICBkZWxldGUgc3BlY1tcIm91dHB1dFwiXTtcclxuICAgICAgICAgIGRlbGV0ZSBzcGVjW1wicmVzb3VyY2VzXCJdO1xyXG5cclxuICAgICAgICAgIHZhciBzdHJhdGVneVB1bGxTZWNyZXROYW1lID0gQ29yZS5wYXRoR2V0KHNwZWMsIFtcInN0cmF0ZWd5XCIsIFwiY3VzdG9tU3RyYXRlZ3lcIiwgXCJwdWxsU2VjcmV0XCIsIFwibmFtZVwiXSk7XHJcbiAgICAgICAgICB2YXIgc291cmNlU2VjcmV0TmFtZSA9IENvcmUucGF0aEdldChzcGVjLCBbXCJzb3VyY2VcIiwgXCJzb3VyY2VTZWNyZXRcIiwgXCJuYW1lXCJdKTtcclxuICAgICAgICAgIGxvZy5pbmZvKFwic291cmNlU2VjcmV0TmFtZTogXCIgKyBzb3VyY2VTZWNyZXROYW1lKTtcclxuICAgICAgICAgIGxvZy5pbmZvKFwic3RyYXRlZ3lQdWxsU2VjcmV0TmFtZTogXCIgKyBzdHJhdGVneVB1bGxTZWNyZXROYW1lKTtcclxuICAgICAgICAgIGlmICghc3RyYXRlZ3lQdWxsU2VjcmV0TmFtZSAmJiBzb3VyY2VTZWNyZXROYW1lKSB7XHJcbiAgICAgICAgICAgIENvcmUucGF0aFNldChzcGVjLCBbXCJzdHJhdGVneVwiLCBcImN1c3RvbVN0cmF0ZWd5XCIsIFwicHVsbFNlY3JldFwiLCBcIm5hbWVcIl0sIHNvdXJjZVNlY3JldE5hbWUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuLypcclxuICAgICAgICAgIC8vIFRPRE8gaGFjayB1bnRpbCB0aGUgcHV0IGRlYWxzIHdpdGggdXBkYXRlc1xyXG4gICAgICAgICAgdmFyIG1ldGFkYXRhID0gZW50aXR5Lm1ldGFkYXRhO1xyXG4gICAgICAgICAgaWYgKG1ldGFkYXRhKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YVtcInJlc291cmNlVmVyc2lvblwiXTtcclxuICAgICAgICAgIH1cclxuKi9cclxuXHJcbiAgICAgICAgICBsb2cuaW5mbyhhbmd1bGFyLnRvSnNvbihlbnRpdHksIHRydWUpKTtcclxuXHJcbiAgICAgICAgICAkc2NvcGUuYnVpbGRDb25maWdDbGllbnQucHV0KGVudGl0eSwgKG9iaikgPT4ge1xyXG4gICAgICAgICAgICBsb2cuaW5mbyhcImJ1aWxkIGNvbmZpZyBjcmVhdGVkIVwiKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBsaW5rID0gRGV2ZWxvcGVyLnByb2plY3RTZWNyZXRzTGluaygkc2NvcGUubmFtZXNwYWNlLCBnZXROYW1lKGVudGl0eSkpO1xyXG4gICAgICAgICAgICBpZiAobGluaykge1xyXG4gICAgICAgICAgICAgIGxvZy5pbmZvKFwiTmF2aWdhdGluZyB0bzogXCIrIGxpbmspO1xyXG4gICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKGxpbmspO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxvZy53YXJuKFwiQ291bGQgbm90IGZpbmQgdGhlIGVkaXQgcGlwZWxpbmUgbGluayFcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdXBkYXRlRGF0YSgpO1xyXG5cclxuXHJcbiAgICAgICAgdmFyIGplbmtpbnNVcmwgPSBEZXZlbG9wZXIuamVua2luc0xpbmsoKTtcclxuICAgICAgICB2YXIgam9iTmFtZSA9IFwiXCI7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZURhdGEoKSB7XHJcbiAgICAgICAgICAkc2NvcGUuaXRlbSA9IG51bGw7XHJcbiAgICAgICAgICBpZiAoJHNjb3BlLmlkKSB7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSBidWlsZENvbmZpZ1Jlc3RVcmwoJHNjb3BlLmlkKTtcclxuICAgICAgICAgICAgJGh0dHAuZ2V0KHVybCkuXHJcbiAgICAgICAgICAgICAgc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICRzY29wZS5lbnRpdHkgPSBkYXRhO1xyXG5cclxuICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkQ29uZmlnID0gYW5ndWxhci5jb3B5KGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICB2YXIgc29ydGVkQnVpbGRzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgS3ViZXJuZXRlcy5lbnJpY2hCdWlsZENvbmZpZyhidWlsZENvbmZpZywgc29ydGVkQnVpbGRzKTtcclxuICAgICAgICAgICAgICAgICAgJHNjb3BlLmJ1aWxkQ29uZmlnID0gYnVpbGRDb25maWc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAkc2NvcGUuc3BlYyA9ICgkc2NvcGUuZW50aXR5IHx8IHt9KS5zcGVjIHx8IHt9O1xyXG4gICAgICAgICAgICAgICAgJHNjb3BlLmZldGNoZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGxldHMgdXBkYXRlIHRoZSB0YWJzXHJcbiAgICAgICAgICAgICAgICAkc2NvcGUuc3ViVGFiQ29uZmlnID0gRGV2ZWxvcGVyLmNyZWF0ZVByb2plY3RTdWJOYXZCYXJzKCRzY29wZS5wcm9qZWN0SWQsIG51bGwsICRzY29wZSk7XHJcbiAgICAgICAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgICAgIGVycm9yKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgbG9nLndhcm4oXCJGYWlsZWQgdG8gbG9hZCBcIiArIHVybCArIFwiIFwiICsgZGF0YSArIFwiIFwiICsgc3RhdHVzKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICRzY29wZS5mZXRjaGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICRzY29wZS5zcGVjID0gJHNjb3BlLmVudGl0eS5zcGVjO1xyXG4gICAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gb25TZWNyZXRzKHNlY3JldHMpIHtcclxuICAgICAgICAgIHZhciBhcnJheSA9IFtdO1xyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHNlY3JldHMsIChzZWNyZXQpID0+IHtcclxuICAgICAgICAgICAgdmFyIG5hbWUgPSBnZXROYW1lKHNlY3JldCk7XHJcbiAgICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgICAgYXJyYXkucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBsYWJlbDogbmFtZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBuYW1lLFxyXG4gICAgICAgICAgICAgICAgXCJhdHRyaWJ1dGVzXCI6IHtcclxuICAgICAgICAgICAgICAgICAgXCJ0aXRsZVwiOiBuYW1lXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgJHNlY3JldDogc2VjcmV0XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgJHNjb3BlLnNlY3JldHMgPSBfLnNvcnRCeShhcnJheSwgXCJsYWJlbFwiKTtcclxuXHJcbiAgICAgICAgICB2YXIgc3BlY1NvdXJjZVNlY3JldE5hbWVQYXRoID0gWydzcGVjJywgJ3NvdXJjZScsICdzb3VyY2VTZWNyZXQnLCAnbmFtZSddO1xyXG4gICAgICAgICAgaWYgKCRzY29wZS5lbnRpdHkgJiYgIUNvcmUucGF0aEdldCgkc2NvcGUuZW50aXR5LCBzcGVjU291cmNlU2VjcmV0TmFtZVBhdGgpKSB7XHJcbiAgICAgICAgICAgIHZhciBkZWZhdWx0U2VjcmV0TmFtZSA9IGZpbmREZWZhdWx0SW1wb3J0U2VjcmV0TmFtZShzZWNyZXRzKTtcclxuICAgICAgICAgICAgQ29yZS5wYXRoU2V0KCRzY29wZS5lbnRpdHksIHNwZWNTb3VyY2VTZWNyZXROYW1lUGF0aCwgZGVmYXVsdFNlY3JldE5hbWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZmluZERlZmF1bHRJbXBvcnRTZWNyZXROYW1lKHNlY3JldHMpIHtcclxuICAgICAgICAgIHZhciBhbnN3ZXIgPSBudWxsO1xyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHNlY3JldHMsIChzZWNyZXQpID0+IHtcclxuICAgICAgICAgICAgdmFyIG5hbWUgPSBnZXROYW1lKHNlY3JldCk7XHJcbiAgICAgICAgICAgIGlmICghYW5zd2VyICYmIG5hbWUgJiYgbmFtZS5zdGFydHNXaXRoKFwiamVua2lucy1sb2dpblwiKSkge1xyXG4gICAgICAgICAgICAgIGFuc3dlciA9IG5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYgKCFhbnN3ZXIpIHtcclxuICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHNlY3JldHMsIChzZWNyZXQpID0+IHtcclxuICAgICAgICAgICAgICB2YXIgbmFtZSA9IGdldE5hbWUoc2VjcmV0KTtcclxuICAgICAgICAgICAgICBpZiAoIWFuc3dlciAmJiBuYW1lICYmIG5hbWUuc3RhcnRzV2l0aChcImplbmtpbnMtdG9rZW5cIikpIHtcclxuICAgICAgICAgICAgICAgIGFuc3dlciA9IG5hbWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBhbnN3ZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcclxuICAgICAgICAgIGNhc2UgJ2NyZWF0ZSc6XHJcbiAgICAgICAgICAgIGRlbGV0ZSBzcGVjQ29uZmlnLnRhYnM7XHJcbiAgICAgICAgICAgIF8uZm9ySW4oYnVpbGRTb3VyY2UucHJvcGVydGllcywgKHByb3BlcnR5OmFueSwgbmFtZTpzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICBpZiAobmFtZSAhPT0gJ2dpdCcpIHtcclxuICAgICAgICAgICAgICAgIGxvZy5pbmZvKFwiSGlkaW5nIHByb3BlcnR5OiBcIiwgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eS5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIF8uZm9ySW4oZ2l0QnVpbGRTb3VyY2UucHJvcGVydGllcywgKHByb3BlcnR5OmFueSwgbmFtZTpzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICBpZiAobmFtZSAhPT0gJ3VyaScpIHtcclxuICAgICAgICAgICAgICAgIGxvZy5pbmZvKFwiSGlkaW5nIHByb3BlcnR5OiBcIiwgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eS5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eS5sYWJlbCA9IFwiR2l0IFVSTFwiO1xyXG4gICAgICAgICAgICAgICAgcHJvcGVydHlbJ2lucHV0LWF0dHJpYnV0ZXMnXSA9IHtcclxuICAgICAgICAgICAgICAgICAgJ3JlcXVpcmVkJzogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7IFxyXG4gICAgICAgICAgICBfLmZvckluKHNwZWNDb25maWcucHJvcGVydGllcywgKHByb3BlcnR5OmFueSwgbmFtZTpzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICBpZiAobmFtZSAhPT0gJ3NvdXJjZScpIHtcclxuICAgICAgICAgICAgICAgIGxvZy5pbmZvKFwiSGlkaW5nIHByb3BlcnR5OiBcIiwgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eS5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnZWRpdCc6XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJHNjb3BlLnNwZWNDb25maWcgPSBzcGVjQ29uZmlnO1xyXG4gIH0pO1xyXG5cclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG5cclxubW9kdWxlIEt1YmVybmV0ZXMge1xyXG5cclxuICBleHBvcnQgdmFyIEJ1aWxkQ29uZmlnc0NvbnRyb2xsZXIgPSBjb250cm9sbGVyKFwiQnVpbGRDb25maWdzQ29udHJvbGxlclwiLCBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCIkZGlhbG9nXCIsIFwiJHdpbmRvd1wiLCBcIiR0ZW1wbGF0ZUNhY2hlXCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwiJGxvY2F0aW9uXCIsIFwibG9jYWxTdG9yYWdlXCIsIFwiJGh0dHBcIiwgXCIkdGltZW91dFwiLCBcIkt1YmVybmV0ZXNBcGlVUkxcIixcclxuICAgICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDpLdWJlcm5ldGVzLkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UsIEt1YmVybmV0ZXNTdGF0ZSwgJGRpYWxvZywgJHdpbmRvdywgJHRlbXBsYXRlQ2FjaGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uOm5nLklMb2NhdGlvblNlcnZpY2UsIGxvY2FsU3RvcmFnZSwgJGh0dHAsICR0aW1lb3V0LCBLdWJlcm5ldGVzQXBpVVJMKSA9PiB7XHJcblxyXG4gICAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICAgJHNjb3BlLm1vZGVsID0gS3ViZXJuZXRlc01vZGVsO1xyXG5cclxuICAgICAgJHNjb3BlLnRhYmxlQ29uZmlnID0ge1xyXG4gICAgICAgIGRhdGE6ICdtb2RlbC5idWlsZGNvbmZpZ3MnLFxyXG4gICAgICAgIHNob3dTZWxlY3Rpb25DaGVja2JveDogdHJ1ZSxcclxuICAgICAgICBlbmFibGVSb3dDbGlja1NlbGVjdGlvbjogZmFsc2UsXHJcbiAgICAgICAgbXVsdGlTZWxlY3Q6IHRydWUsXHJcbiAgICAgICAgc2VsZWN0ZWRJdGVtczogW10sXHJcbiAgICAgICAgZmlsdGVyT3B0aW9uczoge1xyXG4gICAgICAgICAgZmlsdGVyVGV4dDogJGxvY2F0aW9uLnNlYXJjaCgpW1wicVwiXSB8fCAnJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29sdW1uRGVmczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZDogJ21ldGFkYXRhLm5hbWUnLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ05hbWUnLFxyXG4gICAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcImJ1aWxkQ29uZmlnTGlua1RlbXBsYXRlLmh0bWxcIilcclxuICAgICAgICAgIH0sXHJcbi8qXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnc3BlYy5zb3VyY2UudHlwZScsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnU291cmNlJ1xyXG4gICAgICAgICAgfSxcclxuKi9cclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICdzcGVjLnNvdXJjZS5naXQudXJpJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdSZXBvc2l0b3J5J1xyXG4gICAgICAgICAgfSxcclxuLypcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICdzcGVjLnN0cmF0ZWd5LnR5cGUnLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1N0cmF0ZWd5J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICdzcGVjLnN0cmF0ZWd5LnN0aVN0cmF0ZWd5LmltYWdlJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdTb3VyY2UgSW1hZ2UnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZDogJ3NwZWMub3V0cHV0LmltYWdlVGFnJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdPdXRwdXQgSW1hZ2UnXHJcbiAgICAgICAgICB9LFxyXG4qL1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZDogJyRmYWJyaWM4Q29kZVZpZXdzJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdDb2RlJyxcclxuICAgICAgICAgICAgd2lkdGg6IFwiKioqXCIsXHJcbiAgICAgICAgICAgIG1pbldpZHRoOiA1MDAsXHJcbiAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiYnVpbGRDb25maWdDb2RlVmlld3NUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZDogJyRmYWJyaWM4QnVpbGRWaWV3cycsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnQnVpbGRzJyxcclxuICAgICAgICAgICAgd2lkdGg6IFwiKioqXCIsXHJcbiAgICAgICAgICAgIG1pbldpZHRoOiA1MDAsXHJcbiAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiYnVpbGRDb25maWdCdWlsZFZpZXdzVGVtcGxhdGUuaHRtbFwiKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICckZmFicmljOEVudmlyb25tZW50Vmlld3MnLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0Vudmlyb25tZW50cycsXHJcbiAgICAgICAgICAgIHdpZHRoOiBcIioqKlwiLFxyXG4gICAgICAgICAgICBtaW5XaWR0aDogNTAwLFxyXG4gICAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcImJ1aWxkQ29uZmlnRW52aXJvbm1lbnRWaWV3c1RlbXBsYXRlLmh0bWxcIilcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnJGZhYnJpYzhUZWFtVmlld3MnLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1Blb3BsZScsXHJcbiAgICAgICAgICAgIHdpZHRoOiBcIioqKlwiLFxyXG4gICAgICAgICAgICBtaW5XaWR0aDogNTAwLFxyXG4gICAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcImJ1aWxkQ29uZmlnVGVhbVZpZXdzVGVtcGxhdGUuaHRtbFwiKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuXHJcbiAgICAgIC8vIFRPRE9cclxuICAgICAgLy8gJHNjb3BlLmlzTG9nZ2VkSW50b0dvZ3MgPSBGb3JnZS5pc0xvZ2dlZEludG9Hb2dzO1xyXG5cclxuICAgICAgJHNjb3BlLmRlbGV0ZVByb21wdCA9IChzZWxlY3RlZCkgPT4ge1xyXG4gICAgICAgIFVJLm11bHRpSXRlbUNvbmZpcm1BY3Rpb25EaWFsb2coPFVJLk11bHRpSXRlbUNvbmZpcm1BY3Rpb25PcHRpb25zPntcclxuICAgICAgICAgIGNvbGxlY3Rpb246IHNlbGVjdGVkLFxyXG4gICAgICAgICAgaW5kZXg6ICckbmFtZScsXHJcbiAgICAgICAgICBvbkNsb3NlOiAocmVzdWx0OmJvb2xlYW4pID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGRlbGV0ZVNlbGVjdGVkKHNlbGVjdGVkLCBuZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV4dCkge1xyXG4gICAgICAgICAgICAgICAgICBkZWxldGVFbnRpdHkobmV4dCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZVNlbGVjdGVkKHNlbGVjdGVkLCBzZWxlY3RlZC5zaGlmdCgpKTtcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBkZWxldGVTZWxlY3RlZChzZWxlY3RlZCwgc2VsZWN0ZWQuc2hpZnQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB0aXRsZTogJ0RlbGV0ZSBCdWlsZCBDb25maWdzPycsXHJcbiAgICAgICAgICBhY3Rpb246ICdUaGUgZm9sbG93aW5nIEJ1aWxkIENvbmZpZ3Mgd2lsbCBiZSBkZWxldGVkOicsXHJcbiAgICAgICAgICBva1RleHQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgb2tDbGFzczogJ2J0bi1kYW5nZXInLFxyXG4gICAgICAgICAgY3VzdG9tOiBcIlRoaXMgb3BlcmF0aW9uIGlzIHBlcm1hbmVudCBvbmNlIGNvbXBsZXRlZCFcIixcclxuICAgICAgICAgIGN1c3RvbUNsYXNzOiBcImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIlxyXG4gICAgICAgIH0pLm9wZW4oKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGZ1bmN0aW9uIGRlbGV0ZUVudGl0eShzZWxlY3Rpb24sIG5leHRDYWxsYmFjaykge1xyXG4gICAgICAgIHZhciBuYW1lID0gKHNlbGVjdGlvbiB8fCB7fSkuJG5hbWU7XHJcbiAgICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWJvdXQgdG8gZGVsZXRlIGJ1aWxkIGNvbmZpZzogXCIgKyBuYW1lKTtcclxuICAgICAgICAgIHZhciB1cmwgPSBidWlsZENvbmZpZ1Jlc3RVcmwobmFtZSk7XHJcbiAgICAgICAgICAkaHR0cC5kZWxldGUodXJsKS5cclxuICAgICAgICAgICAgc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICBuZXh0Q2FsbGJhY2soKTtcclxuICAgICAgICAgICAgfSkuXHJcbiAgICAgICAgICAgIGVycm9yKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgIGxvZy53YXJuKFwiRmFpbGVkIHRvIGRlbGV0ZSBidWlsZCBjb25maWcgb24gXCIgKyB1cmwgKyBcIiBcIiArIGRhdGEgKyBcIiBcIiArIHN0YXR1cyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIndhcm5pbmc6IG5vIG5hbWUgZm9yIHNlbGVjdGlvbjogXCIgKyBhbmd1bGFyLnRvSnNvbihzZWxlY3Rpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZURhdGEoKSB7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgIH1dKTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzSGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNQbHVnaW4udHNcIi8+XHJcblxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIGV4cG9ydCB2YXIgQnVpbGRMb2dzQ29udHJvbGxlciA9IGNvbnRyb2xsZXIoXCJCdWlsZExvZ3NDb250cm9sbGVyXCIsXHJcbiAgICBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCJLdWJlcm5ldGVzU2NoZW1hXCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkbG9jYXRpb25cIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiS3ViZXJuZXRlc0FwaVVSTFwiLFxyXG4gICAgICAoJHNjb3BlLCBLdWJlcm5ldGVzTW9kZWw6S3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNTY2hlbWEsXHJcbiAgICAgICAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlLCAkcm91dGVQYXJhbXMsICRodHRwLCAkdGltZW91dCwgS3ViZXJuZXRlc0FwaVVSTCkgPT4ge1xyXG5cclxuICAgICAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICAgICAkc2NvcGUubW9kZWwgPSBLdWJlcm5ldGVzTW9kZWw7XHJcbiAgICAgICAgJHNjb3BlLmlkID0gJHJvdXRlUGFyYW1zW1wiaWRcIl07XHJcbiAgICAgICAgJHNjb3BlLnNjaGVtYSA9IEt1YmVybmV0ZXNTY2hlbWE7XHJcbiAgICAgICAgJHNjb3BlLmNvbmZpZyA9IEt1YmVybmV0ZXNTY2hlbWEuZGVmaW5pdGlvbnMub3NfYnVpbGRfQnVpbGQ7XHJcblxyXG4gICAgICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuXHJcbiAgICAgICAgJHNjb3BlLiRvbigna3ViZXJuZXRlc01vZGVsVXBkYXRlZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJHNjb3BlLiRvbignJHJvdXRlVXBkYXRlJywgKCRldmVudCkgPT4ge1xyXG4gICAgICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkc2NvcGUubG9nc1RleHQgPSBcIkxvYWRpbmcgbG9ncy4uLlwiO1xyXG5cclxuICAgICAgICB1cGRhdGVEYXRhKCk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZURhdGEoKSB7XHJcbiAgICAgICAgICAkc2NvcGUuaXRlbSA9IG51bGw7XHJcbiAgICAgICAgICBpZiAoJHNjb3BlLmlkKSB7XHJcbiAgICAgICAgICAgIHZhciB1cmwgPSBidWlsZFJlc3RVcmwoJHNjb3BlLmlkKTtcclxuICAgICAgICAgICAgJGh0dHAuZ2V0KHVybCkuXHJcbiAgICAgICAgICAgICAgc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICRzY29wZS5lbnRpdHkgPSBlbnJpY2hCdWlsZChkYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICRzY29wZS5mZXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICAgICAgfSkuXHJcbiAgICAgICAgICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byBsb2FkIFwiICsgdXJsICsgXCIgXCIgKyBkYXRhICsgXCIgXCIgKyBzdGF0dXMpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdXJsID0gYnVpbGRMb2dzUmVzdFVybCgkc2NvcGUuaWQpO1xyXG4gICAgICAgICAgICAkaHR0cC5nZXQodXJsKS5cclxuICAgICAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgICRzY29wZS5sb2dzVGV4dCA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgICAgIGVycm9yKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgICRzY29wZS5sb2dzVGV4dCA9IFwiRmFpbGVkIHRvIGxvYWQgbG9ncyBmcm9tOiBcIiArIHVybCArIFwiIFwiICsgZGF0YSArIFwiIHN0YXR1czogXCIgKyBzdGF0dXM7XHJcbiAgICAgICAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgICAgIGNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgJHNjb3BlLmxvZ3NUZXh0ID0gXCJGYWlsZWQgdG8gbG9hZCBsb2dzOiBcIiArIGFuZ3VsYXIudG9Kc29uKGVycm9yLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkc2NvcGUuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XSk7XHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc1BsdWdpbi50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgZXhwb3J0IHZhciBCdWlsZHNDb250cm9sbGVyID0gY29udHJvbGxlcihcIkJ1aWxkc0NvbnRyb2xsZXJcIiwgW1wiJHNjb3BlXCIsIFwiS3ViZXJuZXRlc01vZGVsXCIsIFwiS3ViZXJuZXRlc1N0YXRlXCIsIFwiJGRpYWxvZ1wiLCBcIiR3aW5kb3dcIiwgXCIkdGVtcGxhdGVDYWNoZVwiLCBcIiRyb3V0ZVBhcmFtc1wiLCBcIiRsb2NhdGlvblwiLCBcImxvY2FsU3RvcmFnZVwiLCBcIiRodHRwXCIsIFwiJHRpbWVvdXRcIiwgXCJLdWJlcm5ldGVzQXBpVVJMXCIsXHJcbiAgICAoJHNjb3BlLCBLdWJlcm5ldGVzTW9kZWw6S3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzU3RhdGUsICRkaWFsb2csICR3aW5kb3csICR0ZW1wbGF0ZUNhY2hlLCAkcm91dGVQYXJhbXMsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlLCBsb2NhbFN0b3JhZ2UsICRodHRwLCAkdGltZW91dCwgS3ViZXJuZXRlc0FwaVVSTCkgPT4ge1xyXG5cclxuICAgICAgJHNjb3BlLmt1YmVybmV0ZXMgPSBLdWJlcm5ldGVzU3RhdGU7XHJcbiAgICAgICRzY29wZS5tb2RlbCA9IEt1YmVybmV0ZXNNb2RlbDtcclxuICAgICAgJHNjb3BlLmJ1aWxkQ29uZmlnSWQgPSAkcm91dGVQYXJhbXNbXCJpZFwiXTtcclxuXHJcbiAgICAgICRzY29wZS4kb24oJ2t1YmVybmV0ZXNNb2RlbFVwZGF0ZWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgQ29yZS4kYXBwbHkoJHNjb3BlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAkc2NvcGUudGFibGVDb25maWcgPSB7XHJcbiAgICAgICAgZGF0YTogJ21vZGVsLmJ1aWxkcycsXHJcbiAgICAgICAgc2hvd1NlbGVjdGlvbkNoZWNrYm94OiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZVJvd0NsaWNrU2VsZWN0aW9uOiBmYWxzZSxcclxuICAgICAgICBtdWx0aVNlbGVjdDogdHJ1ZSxcclxuICAgICAgICBzZWxlY3RlZEl0ZW1zOiBbXSxcclxuICAgICAgICBmaWx0ZXJPcHRpb25zOiB7XHJcbiAgICAgICAgICBmaWx0ZXJUZXh0OiAkbG9jYXRpb24uc2VhcmNoKClbXCJxXCJdIHx8ICcnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb2x1bW5EZWZzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnbWV0YWRhdGEubmFtZScsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTmFtZScsXHJcbiAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiYnVpbGRMaW5rVGVtcGxhdGUuaHRtbFwiKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICckY3JlYXRpb25EYXRlJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdUaW1lJyxcclxuICAgICAgICAgICAgZGVmYXVsdFNvcnQ6IHRydWUsXHJcbiAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiYnVpbGRUaW1lVGVtcGxhdGUuaHRtbFwiKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICdzdGF0dXMnLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1N0YXR1cycsXHJcbiAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiYnVpbGRTdGF0dXNUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZDogJyRsb2dzTGluaycsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTG9ncycsXHJcbiAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiYnVpbGRMb2dzVGVtcGxhdGUuaHRtbFwiKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICckcG9kTGluaycsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnQnVpbGQgUG9kJyxcclxuICAgICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJidWlsZFBvZFRlbXBsYXRlLmh0bWxcIilcclxuICAgICAgICAgIH0sXHJcbi8qXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAncGFyYW1ldGVycy5zb3VyY2UudHlwZScsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnU291cmNlJ1xyXG4gICAgICAgICAgfSxcclxuKi9cclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICdzcGVjLnNvdXJjZS5naXQudXJpJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdSZXBvc2l0b3J5JyxcclxuICAgICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJidWlsZFJlcG9zaXRvcnlUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZDogJ3NwZWMuc3RyYXRlZ3kudHlwZScsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnU3RyYXRlZ3knXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZDogJ3NwZWMuc3RyYXRlZ3kuc291cmNlU3RyYXRlZ3kuZnJvbS5uYW1lJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdTb3VyY2UgSW1hZ2UnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZDogJ3NwZWMub3V0cHV0LnRvLm5hbWUnLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ091dHB1dCBJbWFnZSdcclxuICAgICAgICAgIH1dXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBLdWJlcm5ldGVzLmluaXRTaGFyZWQoJHNjb3BlLCAkbG9jYXRpb24sICRodHRwLCAkdGltZW91dCwgJHJvdXRlUGFyYW1zLCBLdWJlcm5ldGVzTW9kZWwsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc0FwaVVSTCk7XHJcbiAgICAgICRzY29wZS5icmVhZGNydW1iQ29uZmlnID0gRGV2ZWxvcGVyLmNyZWF0ZVByb2plY3RCcmVhZGNydW1icygkc2NvcGUuYnVpbGRDb25maWdJZCk7XHJcbiAgICAgICRzY29wZS5zdWJUYWJDb25maWcgPSBEZXZlbG9wZXIuY3JlYXRlUHJvamVjdFN1Yk5hdkJhcnMoJHNjb3BlLmJ1aWxkQ29uZmlnSWQsIG51bGwsICRzY29wZSk7XHJcblxyXG4gICAgICAkc2NvcGUuJG9uKCdrdWJlcm5ldGVzTW9kZWxVcGRhdGVkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBmdW5jdGlvbiB1cGRhdGVEYXRhKCkge1xyXG4gICAgICAgIGlmICgkc2NvcGUubW9kZWwpIHtcclxuICAgICAgICAgIHZhciBidWlsZHMgPSAkc2NvcGUubW9kZWwuYnVpbGRzO1xyXG4gICAgICAgICAgdmFyIGJ1aWxkQ29uZmlnSWQgPSAkc2NvcGUuYnVpbGRDb25maWdJZDtcclxuXHJcbiAgICAgICAgICBlbnJpY2hCdWlsZHMoYnVpbGRzKTtcclxuICAgICAgICAgICRzY29wZS5mZXRjaGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICBpZiAoYnVpbGRDb25maWdJZCkge1xyXG4gICAgICAgICAgICAkc2NvcGUuYnVpbGRDb25maWcgPSAkc2NvcGUubW9kZWwuZ2V0QnVpbGRDb25maWcoYnVpbGRDb25maWdJZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB1cGRhdGVEYXRhKCk7XHJcblxyXG5cclxuICAgICAgLypcclxuICAgICAgJHNjb3BlLiRrZWVwUG9sbGluZyA9ICgpID0+IGtlZXBQb2xsaW5nTW9kZWw7XHJcbiAgICAgICRzY29wZS5mZXRjaCA9IFBvbGxIZWxwZXJzLnNldHVwUG9sbGluZygkc2NvcGUsIChuZXh0OigpID0+IHZvaWQpID0+IHtcclxuICAgICAgICB2YXIgdXJsID0gYnVpbGRzUmVzdFVSTCgpO1xyXG4gICAgICAgICRodHRwLmdldCh1cmwpLlxyXG4gICAgICAgICAgc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiZ290IGRhdGEgXCIgKyBhbmd1bGFyLnRvSnNvbihkYXRhLCB0cnVlKSk7XHJcbiAgICAgICAgICAgICAgJHNjb3BlLmJ1aWxkcyA9IGVucmljaEJ1aWxkcyhkYXRhLml0ZW1zKTtcclxuICAgICAgICAgICAgICAkc2NvcGUuZmV0Y2hlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgIGlmICgkc2NvcGUubW9kZWwpIHtcclxuICAgICAgICAgICAgICAgICRzY29wZS5idWlsZENvbmZpZyA9ICRzY29wZS5tb2RlbC5nZXRCdWlsZENvbmZpZygkc2NvcGUuYnVpbGRDb25maWdJZCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICAgIG5leHQoKTtcclxuICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgIGxvZy53YXJuKFwiRmFpbGVkIHRvIGxvYWQgXCIgKyB1cmwgKyBcIiBcIiArIGRhdGEgKyBcIiBcIiArIHN0YXR1cyk7XHJcbiAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICAgIG5leHQoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgICRzY29wZS5mZXRjaCgpO1xyXG4gICAgICAqL1xyXG4gICAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc1BsdWdpbi50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgLy8gY29udHJvbGxlciBmb3IgY29ubmVjdGluZyB0byBhIHJlbW90ZSBjb250YWluZXIgdmlhIGpvbG9raWFcclxuICBleHBvcnQgdmFyIENvbm5lY3RDb250cm9sbGVyID0gY29udHJvbGxlcihcIkNvbm5lY3RDb250cm9sbGVyXCIsIFtcclxuICAgIFwiJHNjb3BlXCIsIFwibG9jYWxTdG9yYWdlXCIsIFwidXNlckRldGFpbHNcIiwgXCJDb25uZWN0RGlhbG9nU2VydmljZVwiLCBcIiRicm93c2VyXCIsXHJcbiAgICAoJHNjb3BlLCBsb2NhbFN0b3JhZ2UsIHVzZXJEZXRhaWxzLCBDb25uZWN0RGlhbG9nU2VydmljZSwgJGJyb3dzZXI6bmcuSUJyb3dzZXJTZXJ2aWNlKSA9PiB7XHJcblxyXG4gICAgICAkc2NvcGUuZG9Db25uZWN0ID0gKGVudGl0eSkgPT4ge1xyXG4gICAgICAgIHZhciBjb25uZWN0VXJsOmFueSA9IG5ldyBVUkkoKS5wYXRoKFVybEhlbHBlcnMuam9pbihIYXd0aW9Db3JlLmRvY3VtZW50QmFzZSgpLCAnL2phdmEvaW5kZXguaHRtbCcpKTtcclxuICAgICAgICB2YXIgcmV0dXJuVG8gPSBuZXcgVVJJKCkudG9TdHJpbmcoKTtcclxuICAgICAgICB2YXIgdGl0bGUgPSBlbnRpdHkubWV0YWRhdGEubmFtZSB8fCAnVW50aXRsZWQgQ29udGFpbmVyJztcclxuICAgICAgICB2YXIgdG9rZW4gPSB1c2VyRGV0YWlscy50b2tlbiB8fCAnJztcclxuICAgICAgICBjb25uZWN0VXJsLmhhc2godG9rZW4pLnF1ZXJ5KHtcclxuICAgICAgICAgIGpvbG9raWFVcmw6IGVudGl0eS4kam9sb2tpYVVybCxcclxuICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgIHJldHVyblRvOiByZXR1cm5Ub1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhcIkNvbm5lY3QgVVJJOiBcIiwgY29ubmVjdFVybC50b1N0cmluZygpKTtcclxuICAgICAgICB3aW5kb3cub3Blbihjb25uZWN0VXJsLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9O1xyXG5cclxuICAgIH1dKTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzSGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNQbHVnaW4udHNcIi8+XHJcblxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIGV4cG9ydCB2YXIgRGVwbG95bWVudENvbmZpZ0NvbnRyb2xsZXIgPSBjb250cm9sbGVyKFwiRGVwbG95bWVudENvbmZpZ0NvbnRyb2xsZXJcIixcclxuICAgIFtcIiRzY29wZVwiLCBcIkt1YmVybmV0ZXNNb2RlbFwiLCBcIkt1YmVybmV0ZXNTdGF0ZVwiLCBcIkt1YmVybmV0ZXNTY2hlbWFcIiwgXCIkdGVtcGxhdGVDYWNoZVwiLCBcIiRsb2NhdGlvblwiLCBcIiRyb3V0ZVBhcmFtc1wiLCBcIiRodHRwXCIsIFwiJHRpbWVvdXRcIiwgXCJLdWJlcm5ldGVzQXBpVVJMXCIsXHJcbiAgICAgICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDpLdWJlcm5ldGVzLkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc1NjaGVtYSxcclxuICAgICAgICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgJGxvY2F0aW9uOm5nLklMb2NhdGlvblNlcnZpY2UsICRyb3V0ZVBhcmFtcywgJGh0dHAsICR0aW1lb3V0LCBLdWJlcm5ldGVzQXBpVVJMKSA9PiB7XHJcblxyXG4gICAgICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG4gICAgICAgICRzY29wZS5tb2RlbCA9IEt1YmVybmV0ZXNNb2RlbDtcclxuICAgICAgICAkc2NvcGUuaWQgPSAkcm91dGVQYXJhbXNbXCJpZFwiXTtcclxuICAgICAgICAkc2NvcGUuc2NoZW1hID0gS3ViZXJuZXRlc1NjaGVtYTtcclxuICAgICAgICAkc2NvcGUuY29uZmlnID0gS3ViZXJuZXRlc1NjaGVtYS5kZWZpbml0aW9ucy5vc19kZXBsb3lfRGVwbG95bWVudENvbmZpZztcclxuXHJcbiAgICAgICAgS3ViZXJuZXRlcy5pbml0U2hhcmVkKCRzY29wZSwgJGxvY2F0aW9uLCAkaHR0cCwgJHRpbWVvdXQsICRyb3V0ZVBhcmFtcywgS3ViZXJuZXRlc01vZGVsLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNBcGlVUkwpO1xyXG5cclxuICAgICAgICAkc2NvcGUuJG9uKCdrdWJlcm5ldGVzTW9kZWxVcGRhdGVkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkc2NvcGUuJG9uKCckcm91dGVVcGRhdGUnLCAoJGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHVwZGF0ZURhdGEoKTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlRGF0YSgpIHtcclxuICAgICAgICAgICRzY29wZS5pdGVtID0gbnVsbDtcclxuICAgICAgICAgIGlmICgkc2NvcGUuaWQpIHtcclxuICAgICAgICAgICAgdmFyIHVybCA9IGRlcGxveW1lbnRDb25maWdSZXN0VXJsKCRzY29wZS5pZCk7XHJcbiAgICAgICAgICAgICRodHRwLmdldCh1cmwpLlxyXG4gICAgICAgICAgICAgIHN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAkc2NvcGUuZW50aXR5ID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgZW5yaWNoRGVwbG95bWVudENvbmZpZyhkYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICRzY29wZS5mZXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICAgICAgfSkuXHJcbiAgICAgICAgICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byBsb2FkIFwiICsgdXJsICsgXCIgXCIgKyBkYXRhICsgXCIgXCIgKyBzdGF0dXMpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJHNjb3BlLmZldGNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNQbHVnaW4udHNcIi8+XHJcblxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIGV4cG9ydCB2YXIgRGVwbG95bWVudENvbmZpZ3NDb250cm9sbGVyID0gY29udHJvbGxlcihcIkRlcGxveW1lbnRDb25maWdzQ29udHJvbGxlclwiLCBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCIkZGlhbG9nXCIsIFwiJHdpbmRvd1wiLCBcIiR0ZW1wbGF0ZUNhY2hlXCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwiJGxvY2F0aW9uXCIsIFwibG9jYWxTdG9yYWdlXCIsIFwiJGh0dHBcIiwgXCIkdGltZW91dFwiLCBcIkt1YmVybmV0ZXNBcGlVUkxcIixcclxuICAgICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDpLdWJlcm5ldGVzLkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UsIEt1YmVybmV0ZXNTdGF0ZSwgJGRpYWxvZywgJHdpbmRvdywgJHRlbXBsYXRlQ2FjaGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uOm5nLklMb2NhdGlvblNlcnZpY2UsIGxvY2FsU3RvcmFnZSwgJGh0dHAsICR0aW1lb3V0LCBLdWJlcm5ldGVzQXBpVVJMKSA9PiB7XHJcblxyXG4gICAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICAgJHNjb3BlLm1vZGVsID0gS3ViZXJuZXRlc01vZGVsO1xyXG4gICAgICAkc2NvcGUuJG9uKCdrdWJlcm5ldGVzTW9kZWxVcGRhdGVkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICAkc2NvcGUubGFiZWxDbGFzcyA9IGNvbnRhaW5lckxhYmVsQ2xhc3M7XHJcblxyXG4gICAgICAkc2NvcGUudGFibGVDb25maWcgPSB7XHJcbiAgICAgICAgZGF0YTogJ2RlcGxveW1lbnRDb25maWdzJyxcclxuICAgICAgICBzaG93U2VsZWN0aW9uQ2hlY2tib3g6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlUm93Q2xpY2tTZWxlY3Rpb246IGZhbHNlLFxyXG4gICAgICAgIG11bHRpU2VsZWN0OiB0cnVlLFxyXG4gICAgICAgIHNlbGVjdGVkSXRlbXM6IFtdLFxyXG4gICAgICAgIGZpbHRlck9wdGlvbnM6IHtcclxuICAgICAgICAgIGZpbHRlclRleHQ6ICRsb2NhdGlvbi5zZWFyY2goKVtcInFcIl0gfHwgJydcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbHVtbkRlZnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICdtZXRhZGF0YS5uYW1lJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdOYW1lJyxcclxuICAgICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJkZXBsb3ltZW50Q29uZmlnTGlua1RlbXBsYXRlLmh0bWxcIilcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnbWV0YWRhdGEubmFtZXNwYWNlJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdOYW1lc3BhY2UnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZDogJyRpbWFnZUNoYW5nZVBhcmFtcy5hdXRvbWF0aWMnLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0F1dG9tYXRpYydcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnJGltYWdlQ2hhbmdlUGFyYW1zLiRjb250YWluZXJOYW1lcycsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnQ29udGFpbmVyIE5hbWVzJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICckaW1hZ2VDaGFuZ2VQYXJhbXMuZnJvbS5uYW1lJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdGcm9tIGltYWdlJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGQ6ICckaW1hZ2VDaGFuZ2VQYXJhbXMudGFnJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdUYWcnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZDogJ3RlbXBsYXRlLmNvbnRyb2xsZXJUZW1wbGF0ZS5wb2RUZW1wbGF0ZS50YWdzJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdMYWJlbHMnLFxyXG4gICAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcImRlcGxveW1lbnRDb25maWdMYWJlbFRlbXBsYXRlLmh0bWxcIilcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBLdWJlcm5ldGVzLmluaXRTaGFyZWQoJHNjb3BlLCAkbG9jYXRpb24sICRodHRwLCAkdGltZW91dCwgJHJvdXRlUGFyYW1zLCBLdWJlcm5ldGVzTW9kZWwsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc0FwaVVSTCk7XHJcblxyXG4gICAgICAkc2NvcGUuZGVsZXRlUHJvbXB0ID0gKHNlbGVjdGVkKSA9PiB7XHJcbiAgICAgICAgVUkubXVsdGlJdGVtQ29uZmlybUFjdGlvbkRpYWxvZyg8VUkuTXVsdGlJdGVtQ29uZmlybUFjdGlvbk9wdGlvbnM+e1xyXG4gICAgICAgICAgY29sbGVjdGlvbjogc2VsZWN0ZWQsXHJcbiAgICAgICAgICBpbmRleDogJyRuYW1lJyxcclxuICAgICAgICAgIG9uQ2xvc2U6IChyZXN1bHQ6Ym9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgZnVuY3Rpb24gZGVsZXRlU2VsZWN0ZWQoc2VsZWN0ZWQsIG5leHQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZUVudGl0eShuZXh0LCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlU2VsZWN0ZWQoc2VsZWN0ZWQsIHNlbGVjdGVkLnNoaWZ0KCkpO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGRlbGV0ZVNlbGVjdGVkKHNlbGVjdGVkLCBzZWxlY3RlZC5zaGlmdCgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHRpdGxlOiAnRGVsZXRlIERlcGxveW1lbnQ/JyxcclxuICAgICAgICAgIGFjdGlvbjogJ1RoZSBmb2xsb3dpbmcgRGVwbG95bWVudHMgd2lsbCBiZSBkZWxldGVkOicsXHJcbiAgICAgICAgICBva1RleHQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgb2tDbGFzczogJ2J0bi1kYW5nZXInLFxyXG4gICAgICAgICAgY3VzdG9tOiBcIlRoaXMgb3BlcmF0aW9uIGlzIHBlcm1hbmVudCBvbmNlIGNvbXBsZXRlZCFcIixcclxuICAgICAgICAgIGN1c3RvbUNsYXNzOiBcImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIlxyXG4gICAgICAgIH0pLm9wZW4oKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGZ1bmN0aW9uIGRlbGV0ZUVudGl0eShzZWxlY3Rpb24sIG5leHRDYWxsYmFjaykge1xyXG4gICAgICAgIHZhciBuYW1lID0gKHNlbGVjdGlvbiB8fCB7fSkuJG5hbWU7XHJcbiAgICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWJvdXQgdG8gZGVsZXRlIGRlcGxveW1lbnQgY29uZmlnOiBcIiArIG5hbWUpO1xyXG4gICAgICAgICAgdmFyIHVybCA9IGRlcGxveW1lbnRDb25maWdSZXN0VXJsKG5hbWUpO1xyXG4gICAgICAgICAgJGh0dHAuZGVsZXRlKHVybCkuXHJcbiAgICAgICAgICAgIHN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgbmV4dENhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgICBlcnJvcihmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byBkZWxldGUgZGVwbG95bWVudCBjb25maWcgb24gXCIgKyB1cmwgKyBcIiBcIiArIGRhdGEgKyBcIiBcIiArIHN0YXR1cyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIndhcm5pbmc6IG5vIG5hbWUgZm9yIHNlbGVjdGlvbjogXCIgKyBhbmd1bGFyLnRvSnNvbihzZWxlY3Rpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZURhdGEoKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGRlcGxveW1lbnRDb25maWdzUmVzdFVSTCgpO1xyXG4gICAgICAgICRodHRwLmdldCh1cmwpLlxyXG4gICAgICAgICAgc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiZ290IGRhdGEgXCIgKyBhbmd1bGFyLnRvSnNvbihkYXRhLCB0cnVlKSk7XHJcbiAgICAgICAgICAgICAgJHNjb3BlLmRlcGxveW1lbnRDb25maWdzID0gZW5yaWNoRGVwbG95bWVudENvbmZpZ3MoZGF0YS5pdGVtcyk7XHJcbiAgICAgICAgICAgICAgJHNjb3BlLmZldGNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgIGxvZy53YXJuKFwiRmFpbGVkIHRvIGxvYWQgXCIgKyB1cmwgKyBcIiBcIiArIGRhdGEgKyBcIiBcIiArIHN0YXR1cyk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc1BsdWdpbi50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgZXhwb3J0IHZhciBFdmVudHNDb250cm9sbGVyID0gY29udHJvbGxlcihcIkV2ZW50c0NvbnRyb2xsZXJcIixcclxuICAgIFtcIiRzY29wZVwiLCBcIkt1YmVybmV0ZXNNb2RlbFwiLCBcIkt1YmVybmV0ZXNTZXJ2aWNlc1wiLCBcIkt1YmVybmV0ZXNQb2RzXCIsIFwiS3ViZXJuZXRlc1N0YXRlXCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkbG9jYXRpb25cIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiS3ViZXJuZXRlc0FwaVVSTFwiLFxyXG4gICAgICAoJHNjb3BlLCBLdWJlcm5ldGVzTW9kZWw6IEt1YmVybmV0ZXMuS3ViZXJuZXRlc01vZGVsU2VydmljZSwgS3ViZXJuZXRlc1NlcnZpY2VzOm5nLnJlc291cmNlLklSZXNvdXJjZUNsYXNzPGFueT4sIEt1YmVybmV0ZXNQb2RzOm5nLnJlc291cmNlLklSZXNvdXJjZUNsYXNzPGFueT4sIEt1YmVybmV0ZXNTdGF0ZSxcclxuICAgICAgICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgJGxvY2F0aW9uOm5nLklMb2NhdGlvblNlcnZpY2UsICRyb3V0ZVBhcmFtcywgJGh0dHAsICR0aW1lb3V0LCBLdWJlcm5ldGVzQXBpVVJMKSA9PiB7XHJcblxyXG4gICAgJHNjb3BlLmt1YmVybmV0ZXMgPSBLdWJlcm5ldGVzU3RhdGU7XHJcbiAgICAkc2NvcGUubW9kZWwgPSBLdWJlcm5ldGVzTW9kZWw7XHJcblxyXG4gICAgQ29udHJvbGxlckhlbHBlcnMuYmluZE1vZGVsVG9TZWFyY2hQYXJhbSgkc2NvcGUsICRsb2NhdGlvbiwgJ21vZGUnLCAnbW9kZScsICdsaXN0Jyk7XHJcblxyXG4gICAgJHNjb3BlLnRhYmxlQ29uZmlnID0ge1xyXG4gICAgICBkYXRhOiAnbW9kZWwuZXZlbnRzJyxcclxuICAgICAgc2hvd1NlbGVjdGlvbkNoZWNrYm94OiB0cnVlLFxyXG4gICAgICBlbmFibGVSb3dDbGlja1NlbGVjdGlvbjogZmFsc2UsXHJcbiAgICAgIG11bHRpU2VsZWN0OiB0cnVlLFxyXG4gICAgICBzZWxlY3RlZEl0ZW1zOiBbXSxcclxuICAgICAgZmlsdGVyT3B0aW9uczoge1xyXG4gICAgICAgIGZpbHRlclRleHQ6ICRsb2NhdGlvbi5zZWFyY2goKVtcInFcIl0gfHwgJydcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uRGVmczogW1xyXG4gICAgICAgIHsgZmllbGQ6ICckZmlyc3RUaW1lc3RhbXAnLFxyXG4gICAgICAgICAgZGlzcGxheU5hbWU6ICdGaXJzdCBTZWVuJyxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiZmlyc3RUaW1lc3RhbXBUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IGZpZWxkOiAnJGxhc3RUaW1lc3RhbXAnLFxyXG4gICAgICAgICAgZGlzcGxheU5hbWU6ICdMYXN0IFNlZW4nLFxyXG4gICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJsYXN0VGltZXN0YW1wVGVtcGxhdGUuaHRtbFwiKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeyBmaWVsZDogJ2NvdW50JyxcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiAnQ291bnQnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IGZpZWxkOiAnaW52b2x2ZWRPYmplY3QubmFtZScsXHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogJ05hbWUnLFxyXG4gICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJldmVudE5hbWVUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IGZpZWxkOiAnaW52b2x2ZWRPYmplY3Qua2luZCcsXHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogJ0tpbmQnLFxyXG4gICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJldmVudEtpbmRUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IGZpZWxkOiAnaW52b2x2ZWRPYmplY3QuZmllbGRQYXRoJyxcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiAnU3ViamVjdCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgZmllbGQ6ICdyZWFzb24nLFxyXG4gICAgICAgICAgZGlzcGxheU5hbWU6ICdSZWFzb24nXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IGZpZWxkOiAnc291cmNlJyxcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiAnU291cmNlJyxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiZXZlbnRTb3VyY2VUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IGZpZWxkOiAnbWVzc2FnZScsXHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogJ01lc3NhZ2UnXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG5cclxuICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuICB9XSk7XHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc01vZGVsLnRzXCIvPlxyXG5cclxubW9kdWxlIEt1YmVybmV0ZXMge1xyXG5cclxuICBleHBvcnQgdmFyIEhvc3RDb250cm9sbGVyID0gY29udHJvbGxlcihcIkhvc3RDb250cm9sbGVyXCIsXHJcbiAgICBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCIkdGVtcGxhdGVDYWNoZVwiLCBcIiRsb2NhdGlvblwiLCBcIiRyb3V0ZVBhcmFtc1wiLCBcIiRodHRwXCIsIFwiJHRpbWVvdXRcIiwgXCJLdWJlcm5ldGVzQXBpVVJMXCIsXHJcbiAgICAgICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDpLdWJlcm5ldGVzLkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UsIEt1YmVybmV0ZXNTdGF0ZSxcclxuICAgICAgICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgJGxvY2F0aW9uOm5nLklMb2NhdGlvblNlcnZpY2UsICRyb3V0ZVBhcmFtcywgJGh0dHAsICR0aW1lb3V0LCBLdWJlcm5ldGVzQXBpVVJMKSA9PiB7XHJcblxyXG4gICAgICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG4gICAgICAgICRzY29wZS5tb2RlbCA9IEt1YmVybmV0ZXNNb2RlbDtcclxuICAgICAgICAkc2NvcGUucmF3TW9kZWwgPSBudWxsO1xyXG5cclxuICAgICAgICAkc2NvcGUuaXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgIHByb3BlcnRpZXM6IHt9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgS3ViZXJuZXRlcy5pbml0U2hhcmVkKCRzY29wZSwgJGxvY2F0aW9uLCAkaHR0cCwgJHRpbWVvdXQsICRyb3V0ZVBhcmFtcywgS3ViZXJuZXRlc01vZGVsLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNBcGlVUkwpO1xyXG5cclxuICAgICAgICAkc2NvcGUuJG9uKCdrdWJlcm5ldGVzTW9kZWxVcGRhdGVkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkc2NvcGUuJG9uKCckcm91dGVVcGRhdGUnLCAoJGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICRzY29wZS5mbGlwUmF3ID0gKCkgPT4ge1xyXG4gICAgICAgICAgJHNjb3BlLnJhd01vZGUgPSAhJHNjb3BlLnJhd01vZGU7XHJcbiAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHVwZGF0ZURhdGEoKTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlRGF0YSgpIHtcclxuICAgICAgICAgICRzY29wZS5pZCA9ICRyb3V0ZVBhcmFtc1tcImlkXCJdO1xyXG4gICAgICAgICAgJHNjb3BlLml0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgaWYgKCRzY29wZS5pZCkge1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gVXJsSGVscGVycy5qb2luKEt1YmVybmV0ZXNBcGlVUkwsIFwibm9kZXNcIiwgJHNjb3BlLmlkKTtcclxuICAgICAgICAgICAgJGh0dHAuZ2V0KHVybCkuXHJcbiAgICAgICAgICAgICAgc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICRzY29wZS5pdGVtID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAkc2NvcGUucmF3TW9kZWwgPSB0b1Jhd1lhbWwoJHNjb3BlLml0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgICBlcnJvcihmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byBsb2FkIFwiICsgdXJsICsgXCIgXCIgKyBkYXRhICsgXCIgXCIgKyBzdGF0dXMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICRzY29wZS5yYXdNb2RlbCA9IG51bGw7XHJcbiAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XSk7XHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc1BsdWdpbi50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNNb2RlbC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cInV0aWxIZWxwZXJzLnRzXCIvPlxyXG5cclxubW9kdWxlIEt1YmVybmV0ZXMge1xyXG5cclxuICBleHBvcnQgdmFyIEhvc3RzQ29udHJvbGxlciA9IGNvbnRyb2xsZXIoXCJIb3N0c0NvbnRyb2xsZXJcIiwgW1wiJHNjb3BlXCIsIFwiS3ViZXJuZXRlc01vZGVsXCIsIFwiS3ViZXJuZXRlc1BvZHNcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCJTZXJ2aWNlUmVnaXN0cnlcIiwgXCIkZGlhbG9nXCIsIFwiJHdpbmRvd1wiLCBcIiR0ZW1wbGF0ZUNhY2hlXCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwiJGxvY2F0aW9uXCIsIFwibG9jYWxTdG9yYWdlXCIsIFwiJGh0dHBcIiwgXCIkdGltZW91dFwiLCBcIkt1YmVybmV0ZXNBcGlVUkxcIixcclxuICAgICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDogS3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzUG9kczpuZy5JUHJvbWlzZTxuZy5yZXNvdXJjZS5JUmVzb3VyY2VDbGFzczxhbnk+PiwgS3ViZXJuZXRlc1N0YXRlLCBTZXJ2aWNlUmVnaXN0cnksICRkaWFsb2csICR3aW5kb3csICR0ZW1wbGF0ZUNhY2hlLCAkcm91dGVQYXJhbXMsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlLCBsb2NhbFN0b3JhZ2UsICRodHRwLCAkdGltZW91dCwgS3ViZXJuZXRlc0FwaVVSTCkgPT4ge1xyXG5cclxuICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG4gICAgJHNjb3BlLm1vZGVsID0gS3ViZXJuZXRlc01vZGVsO1xyXG4gICAgJHNjb3BlLiRvbigna3ViZXJuZXRlc01vZGVsVXBkYXRlZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgQ29yZS4kYXBwbHkoJHNjb3BlKTtcclxuICAgIH0pO1xyXG5cclxuICAgICRzY29wZS50YWJsZUNvbmZpZyA9IHtcclxuICAgICAgZGF0YTogJ21vZGVsLmhvc3RzJyxcclxuICAgICAgc2hvd1NlbGVjdGlvbkNoZWNrYm94OiBmYWxzZSxcclxuICAgICAgZW5hYmxlUm93Q2xpY2tTZWxlY3Rpb246IGZhbHNlLFxyXG4gICAgICBtdWx0aVNlbGVjdDogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGVkSXRlbXM6IFtdLFxyXG4gICAgICBmaWx0ZXJPcHRpb25zOiB7XHJcbiAgICAgICAgZmlsdGVyVGV4dDogJGxvY2F0aW9uLnNlYXJjaCgpW1wicVwiXSB8fCAnJ1xyXG4gICAgICB9LFxyXG4gICAgICBjb2x1bW5EZWZzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZmllbGQ6ICdpZCcsXHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogJ05hbWUnLFxyXG4gICAgICAgICAgZGVmYXVsdFNvcnQ6IHRydWUsXHJcbiAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcImlkVGVtcGxhdGUuaHRtbFwiKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZmllbGQ6ICdob3N0SVAnLFxyXG4gICAgICAgICAgZGlzcGxheU5hbWU6ICdJUCcsXHJcbiAgICAgICAgICBjdXN0b21Tb3J0RmllbGQ6IChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgICAvLyB1c2UgYSBjdXN0b20gc29ydCB0byBzb3J0IGlwIGFkZHJlc3NcclxuICAgICAgICAgICAgcmV0dXJuIEt1YmVybmV0ZXMuc29ydEJ5UG9kSXAoZmllbGQuaG9zdElQKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgZmllbGQ6ICckcG9kc0xpbmsnLFxyXG4gICAgICAgICAgZGlzcGxheU5hbWU6ICdQb2RzJyxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwicG9kQ291bnRzQW5kTGlua1RlbXBsYXRlLmh0bWxcIiksXHJcbiAgICAgICAgICBjdXN0b21Tb3J0RmllbGQ6IChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBuZWVkIHRvIGNvbmNhdCBhbGwgdGhlIHBvZCBjb3VudGVyc1xyXG4gICAgICAgICAgICB2YXIgcmVhZHkgPSBmaWVsZC4kcG9kQ291bnRlcnMucmVhZHkgfHwgMDtcclxuICAgICAgICAgICAgdmFyIHZhbGlkID0gZmllbGQuJHBvZENvdW50ZXJzLnZhbGlkIHx8IDA7XHJcbiAgICAgICAgICAgIHZhciB3YWl0aW5nID0gZmllbGQuJHBvZENvdW50ZXJzLndhaXRpbmcgfHwgMDtcclxuICAgICAgICAgICAgdmFyIGVycm9yID0gZmllbGQuJHBvZENvdW50ZXJzLmVycm9yIHx8IDA7XHJcbiAgICAgICAgICAgIHJldHVybiByZWFkeSArIHZhbGlkICsgd2FpdGluZyArIGVycm9yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfTtcclxuXHJcbiAgICBLdWJlcm5ldGVzLmluaXRTaGFyZWQoJHNjb3BlLCAkbG9jYXRpb24sICRodHRwLCAkdGltZW91dCwgJHJvdXRlUGFyYW1zLCBLdWJlcm5ldGVzTW9kZWwsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc0FwaVVSTCk7XHJcbiAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNQbHVnaW4udHNcIi8+XHJcblxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIGV4cG9ydCB2YXIgSW1hZ2VSZXBvc2l0b3JpZXNDb250cm9sbGVyID0gY29udHJvbGxlcihcIkltYWdlUmVwb3NpdG9yaWVzQ29udHJvbGxlclwiLCBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCIkZGlhbG9nXCIsIFwiJHdpbmRvd1wiLCBcIiR0ZW1wbGF0ZUNhY2hlXCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwiJGxvY2F0aW9uXCIsIFwibG9jYWxTdG9yYWdlXCIsIFwiJGh0dHBcIiwgXCIkdGltZW91dFwiLCBcIkt1YmVybmV0ZXNBcGlVUkxcIixcclxuICAgICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDpLdWJlcm5ldGVzLkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UsIEt1YmVybmV0ZXNTdGF0ZSwgJGRpYWxvZywgJHdpbmRvdywgJHRlbXBsYXRlQ2FjaGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uOm5nLklMb2NhdGlvblNlcnZpY2UsIGxvY2FsU3RvcmFnZSwgJGh0dHAsICR0aW1lb3V0LCBLdWJlcm5ldGVzQXBpVVJMKSA9PiB7XHJcblxyXG4gICAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICAgJHNjb3BlLm1vZGVsID0gS3ViZXJuZXRlc01vZGVsO1xyXG4gICAgICAkc2NvcGUuJG9uKCdrdWJlcm5ldGVzTW9kZWxVcGRhdGVkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgJHNjb3BlLnRhYmxlQ29uZmlnID0ge1xyXG4gICAgICAgIGRhdGE6ICdpbWFnZVJlcG9zaXRvcmllcycsXHJcbiAgICAgICAgc2hvd1NlbGVjdGlvbkNoZWNrYm94OiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZVJvd0NsaWNrU2VsZWN0aW9uOiBmYWxzZSxcclxuICAgICAgICBtdWx0aVNlbGVjdDogdHJ1ZSxcclxuICAgICAgICBzZWxlY3RlZEl0ZW1zOiBbXSxcclxuICAgICAgICBmaWx0ZXJPcHRpb25zOiB7XHJcbiAgICAgICAgICBmaWx0ZXJUZXh0OiAkbG9jYXRpb24uc2VhcmNoKClbXCJxXCJdIHx8ICcnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb2x1bW5EZWZzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnbWV0YWRhdGEubmFtZScsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTmFtZSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnbWV0YWRhdGEubmFtZXNwYWNlJyxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdOYW1lc3BhY2UnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZDogJ3N0YXR1cy5kb2NrZXJJbWFnZVJlcG9zaXRvcnknLFxyXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0RvY2tlciBSZWdpc3RyeSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAndGFncycsXHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnVGFncycsXHJcbiAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KCdpbWFnZVJlZ2lzdHJ5TGFiZWxUZW1wbGF0ZS5odG1sJylcclxuICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB2YXIgbGFiZWxDb2xvcnMgPSB7XHJcbiAgICAgICAgJ3Byb2QnOiAnYmFja2dyb3VuZC1ibHVlJyxcclxuICAgICAgICAndmFsaWQnOiAnYmFja2dyb3VuZC1saWdodC1ncmVlbicsXHJcbiAgICAgICAgJ3Rlc3QnOiAnYmFja2dyb3VuZC1saWdodC1ncmV5J1xyXG4gICAgICB9O1xyXG4gICAgICAkc2NvcGUubGFiZWxDbGFzcyA9IChsYWJlbFR5cGU6c3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKCEobGFiZWxUeXBlIGluIGxhYmVsQ29sb3JzKSkge1xyXG4gICAgICAgICAgcmV0dXJuICdtb3VzZS1wb2ludGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSByZXR1cm4gbGFiZWxDb2xvcnNbbGFiZWxUeXBlXSArICcgbW91c2UtcG9pbnRlcic7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuXHJcbiAgICAgICRzY29wZS5kZWxldGVQcm9tcHQgPSAoc2VsZWN0ZWQpID0+IHtcclxuICAgICAgICBVSS5tdWx0aUl0ZW1Db25maXJtQWN0aW9uRGlhbG9nKDxVSS5NdWx0aUl0ZW1Db25maXJtQWN0aW9uT3B0aW9ucz57XHJcbiAgICAgICAgICBjb2xsZWN0aW9uOiBzZWxlY3RlZCxcclxuICAgICAgICAgIGluZGV4OiAnJG5hbWUnLFxyXG4gICAgICAgICAgb25DbG9zZTogKHJlc3VsdDpib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICBmdW5jdGlvbiBkZWxldGVTZWxlY3RlZChzZWxlY3RlZCwgbmV4dCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5leHQpIHtcclxuICAgICAgICAgICAgICAgICAgZGVsZXRlRW50aXR5KG5leHQsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGVTZWxlY3RlZChzZWxlY3RlZCwgc2VsZWN0ZWQuc2hpZnQoKSk7XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgZGVsZXRlU2VsZWN0ZWQoc2VsZWN0ZWQsIHNlbGVjdGVkLnNoaWZ0KCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdGl0bGU6ICdEZWxldGUgSW1hZ2UgUmVwb3NpdG9yeT8nLFxyXG4gICAgICAgICAgYWN0aW9uOiAnVGhlIGZvbGxvd2luZyBJbWFnZSBSZXBvc2l0b3JpZXMgd2lsbCBiZSBkZWxldGVkOicsXHJcbiAgICAgICAgICBva1RleHQ6ICdEZWxldGUnLFxyXG4gICAgICAgICAgb2tDbGFzczogJ2J0bi1kYW5nZXInLFxyXG4gICAgICAgICAgY3VzdG9tOiBcIlRoaXMgb3BlcmF0aW9uIGlzIHBlcm1hbmVudCBvbmNlIGNvbXBsZXRlZCFcIixcclxuICAgICAgICAgIGN1c3RvbUNsYXNzOiBcImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIlxyXG4gICAgICAgIH0pLm9wZW4oKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGZ1bmN0aW9uIGRlbGV0ZUVudGl0eShzZWxlY3Rpb24sIG5leHRDYWxsYmFjaykge1xyXG4gICAgICAgIHZhciBuYW1lID0gKHNlbGVjdGlvbiB8fCB7fSkuJG5hbWU7XHJcbiAgICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWJvdXQgdG8gZGVsZXRlIGltYWdlIHJlcG9zaXRvcnk6IFwiICsgbmFtZSk7XHJcbiAgICAgICAgICB2YXIgdXJsID0gaW1hZ2VSZXBvc2l0b3J5UmVzdFVybChuYW1lKTtcclxuICAgICAgICAgICRodHRwLmRlbGV0ZSh1cmwpLlxyXG4gICAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICAgIG5leHRDYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9KS5cclxuICAgICAgICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgbG9nLndhcm4oXCJGYWlsZWQgdG8gZGVsZXRlIGltYWdlIHJlcG9zaXRvcnkgb24gXCIgKyB1cmwgKyBcIiBcIiArIGRhdGEgKyBcIiBcIiArIHN0YXR1cyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIndhcm5pbmc6IG5vIG5hbWUgZm9yIHNlbGVjdGlvbjogXCIgKyBhbmd1bGFyLnRvSnNvbihzZWxlY3Rpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZURhdGEoKSB7XHJcbiAgICAgICAgdmFyIHVybCA9IGltYWdlUmVwb3NpdG9yaWVzUmVzdFVSTCgpO1xyXG4gICAgICAgICRodHRwLmdldCh1cmwpLlxyXG4gICAgICAgICAgc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiZ290IGRhdGEgXCIgKyBhbmd1bGFyLnRvSnNvbihkYXRhLCB0cnVlKSk7XHJcbiAgICAgICAgICAgICAgJHNjb3BlLmltYWdlUmVwb3NpdG9yaWVzID0gZW5yaWNoSW1hZ2VSZXBvc2l0b3JpZXMoZGF0YS5pdGVtcyk7XHJcbiAgICAgICAgICAgICAgJHNjb3BlLmZldGNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgIGxvZy53YXJuKFwiRmFpbGVkIHRvIGxvYWQgXCIgKyB1cmwgKyBcIiBcIiArIGRhdGEgKyBcIiBcIiArIHN0YXR1cyk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNIZWxwZXJzLnRzXCIvPlxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBzZWxlY3RTdWJOYXZCYXIoJHNjb3BlLCB0YWJOYW1lLCBuZXdTdWJUYWJMYWJlbCkge1xyXG4gICAgdmFyIGZvdW5kVGFiID0gbnVsbDtcclxuICAgIGFuZ3VsYXIuZm9yRWFjaCgkc2NvcGUuc3ViVGFiQ29uZmlnLCAodGFiKSA9PiB7XHJcbiAgICAgIGlmICh0YWJOYW1lID09PSB0YWIubGFiZWwgfHwgdGFiTmFtZSA9PT0gdGFiLmlkKSB7XHJcbiAgICAgICAgZm91bmRUYWIgPSB0YWI7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdmFyIGJyZWFkY3J1bWJDb25maWcgPSAkc2NvcGUuYnJlYWRjcnVtYkNvbmZpZztcclxuICAgIGlmIChmb3VuZFRhYiAmJiBicmVhZGNydW1iQ29uZmlnKSB7XHJcbiAgICAgIGJyZWFkY3J1bWJDb25maWcucHVzaChmb3VuZFRhYik7XHJcbiAgICAgICRzY29wZS5zdWJUYWJDb25maWcgPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGFiZWw6IG5ld1N1YlRhYkxhYmVsXHJcbiAgICAgICAgfVxyXG4gICAgICBdO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuIFxyXG4gIGV4cG9ydCB2YXIgc2NoZW1hID0gXHJcbiAge1xyXG4gICAgXCJpZFwiOiBcImh0dHA6Ly9mYWJyaWM4LmlvL2ZhYnJpYzgvdjIvU2NoZW1hI1wiLFxyXG4gICAgXCIkc2NoZW1hXCI6IFwiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9zY2hlbWEjXCIsXHJcbiAgICBcImRlZmluaXRpb25zXCI6IHtcclxuICAgICAgXCJhcGlfUm9vdFBhdGhzXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwicGF0aHNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUm9vdFBhdGhzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0FXU0VsYXN0aWNCbG9ja1N0b3JlVm9sdW1lU291cmNlXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiZnNUeXBlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJmaWxlIHN5c3RlbSB0eXBlIHRvIG1vdW50XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInBhcnRpdGlvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImludGVnZXJcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInBhcnRpdGlvbiBvbiB0aGUgZGlzayB0byBtb3VudCAoZS5nLlwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZWFkT25seVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInJlYWQtb25seSBpZiB0cnVlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInZvbHVtZUlEXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ1bmlxdWUgaWQgb2YgdGhlIFBEIHJlc291cmNlIGluIEFXUzsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvdm9sdW1lcy5tZCNhd3NlbGFzdGljYmxvY2tzdG9yZVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQVdTRWxhc3RpY0Jsb2NrU3RvcmVWb2x1bWVTb3VyY2VcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfQ2FwYWJpbGl0aWVzXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYWRkXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFkZGVkIGNhcGFiaWxpdGllc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYWRkZWQgY2FwYWJpbGl0aWVzXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZHJvcFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJkcm9wZWQgY2FwYWJpbGl0aWVzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJkcm9wZWQgY2FwYWJpbGl0aWVzXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkNhcGFiaWxpdGllc1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19DZXBoRlNWb2x1bWVTb3VyY2VcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJtb25pdG9yc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhIGNvbGxlY3Rpb24gb2YgQ2VwaCBtb25pdG9yc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYSBjb2xsZWN0aW9uIG9mIENlcGggbW9uaXRvcnNcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZWFkT25seVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkNlcGggZnMgdG8gYmUgbW91bnRlZCB3aXRoIHJlYWQtb25seSBwZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzZWNyZXRGaWxlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwYXRoIHRvIHNlY3JldCBmb3IgcmFkb3MgdXNlcjsgZGVmYXVsdCBpcyAvZXRjL2NlcGgvdXNlci5zZWNyZXQ7IG9wdGlvbmFsXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNlY3JldFJlZlwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Mb2NhbE9iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Mb2NhbE9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ1c2VyXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyYWRvcyB1c2VyIG5hbWU7IGRlZmF1bHQgaXMgYWRtaW47IG9wdGlvbmFsXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5DZXBoRlNWb2x1bWVTb3VyY2VcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfQ29udGFpbmVyXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXJnc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJjb21tYW5kIGFycmF5OyB0aGUgZG9ja2VyIGltYWdlJ3MgY21kIGlzIHVzZWQgaWYgdGhpcyBpcyBub3QgcHJvdmlkZWQ7IGFyZ3VtZW50cyB0byB0aGUgZW50cnlwb2ludDsgY2Fubm90IGJlIHVwZGF0ZWQ7IHZhcmlhYmxlIHJlZmVyZW5jZXMgJChWQVJfTkFNRSkgYXJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjb250YWluZXIncyBlbnZpcm9ubWVudCB2YXJpYWJsZXM7IGlmIGEgdmFyaWFibGUgY2Fubm90IGJlIHJlc29sdmVkXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJjb21tYW5kIGFycmF5OyB0aGUgZG9ja2VyIGltYWdlJ3MgY21kIGlzIHVzZWQgaWYgdGhpcyBpcyBub3QgcHJvdmlkZWQ7IGFyZ3VtZW50cyB0byB0aGUgZW50cnlwb2ludDsgY2Fubm90IGJlIHVwZGF0ZWQ7IHZhcmlhYmxlIHJlZmVyZW5jZXMgJChWQVJfTkFNRSkgYXJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjb250YWluZXIncyBlbnZpcm9ubWVudCB2YXJpYWJsZXM7IGlmIGEgdmFyaWFibGUgY2Fubm90IGJlIHJlc29sdmVkXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiY29tbWFuZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJlbnRyeXBvaW50IGFycmF5OyBub3QgZXhlY3V0ZWQgd2l0aGluIGEgc2hlbGw7IHRoZSBkb2NrZXIgaW1hZ2UncyBlbnRyeXBvaW50IGlzIHVzZWQgaWYgdGhpcyBpcyBub3QgcHJvdmlkZWQ7IGNhbm5vdCBiZSB1cGRhdGVkOyB2YXJpYWJsZSByZWZlcmVuY2VzICQoVkFSX05BTUUpIGFyZSBleHBhbmRlZCB1c2luZyB0aGUgY29udGFpbmVyJ3MgZW52aXJvbm1lbnQgdmFyaWFibGVzOyBpZiBhIHZhcmlhYmxlIGNhbm5vdCBiZSByZXNvbHZlZFwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZW50cnlwb2ludCBhcnJheTsgbm90IGV4ZWN1dGVkIHdpdGhpbiBhIHNoZWxsOyB0aGUgZG9ja2VyIGltYWdlJ3MgZW50cnlwb2ludCBpcyB1c2VkIGlmIHRoaXMgaXMgbm90IHByb3ZpZGVkOyBjYW5ub3QgYmUgdXBkYXRlZDsgdmFyaWFibGUgcmVmZXJlbmNlcyAkKFZBUl9OQU1FKSBhcmUgZXhwYW5kZWQgdXNpbmcgdGhlIGNvbnRhaW5lcidzIGVudmlyb25tZW50IHZhcmlhYmxlczsgaWYgYSB2YXJpYWJsZSBjYW5ub3QgYmUgcmVzb2x2ZWRcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJlbnZcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0IGluIHRoZSBjb250YWluZXI7IGNhbm5vdCBiZSB1cGRhdGVkXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19FbnZWYXJcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5FbnZWYXJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpbWFnZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiRG9ja2VyIGltYWdlIG5hbWU7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL2ltYWdlcy5tZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpbWFnZVB1bGxQb2xpY3lcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImltYWdlIHB1bGwgcG9saWN5OyBvbmUgb2YgQWx3YXlzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImxpZmVjeWNsZVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaWZlY3ljbGVcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTGlmZWN5Y2xlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImxpdmVuZXNzUHJvYmVcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUHJvYmVcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUHJvYmVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibmFtZSBvZiB0aGUgY29udGFpbmVyOyBtdXN0IGJlIGEgRE5TX0xBQkVMIGFuZCB1bmlxdWUgd2l0aGluIHRoZSBwb2Q7IGNhbm5vdCBiZSB1cGRhdGVkXCIsXHJcbiAgICAgICAgICAgIFwibWF4TGVuZ3RoXCI6IDYzLFxyXG4gICAgICAgICAgICBcInBhdHRlcm5cIjogXCJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInBvcnRzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgcG9ydHMgdG8gZXhwb3NlIGZyb20gdGhlIGNvbnRhaW5lcjsgY2Fubm90IGJlIHVwZGF0ZWRcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0NvbnRhaW5lclBvcnRcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Db250YWluZXJQb3J0XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVhZGluZXNzUHJvYmVcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUHJvYmVcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUHJvYmVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1Jlc291cmNlUmVxdWlyZW1lbnRzXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJlc291cmNlUmVxdWlyZW1lbnRzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNlY3VyaXR5Q29udGV4dFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19TZWN1cml0eUNvbnRleHRcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU2VjdXJpdHlDb250ZXh0XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInN0ZGluXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiV2hldGhlciB0aGlzIGNvbnRhaW5lciBzaG91bGQgYWxsb2NhdGUgYSBidWZmZXIgZm9yIHN0ZGluIGluIHRoZSBjb250YWluZXIgcnVudGltZTsgZGVmYXVsdCBpcyBmYWxzZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0ZXJtaW5hdGlvbk1lc3NhZ2VQYXRoXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwYXRoIGF0IHdoaWNoIHRoZSBmaWxlIHRvIHdoaWNoIHRoZSBjb250YWluZXIncyB0ZXJtaW5hdGlvbiBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiBpcyBtb3VudGVkIGludG8gdGhlIGNvbnRhaW5lcidzIGZpbGVzeXN0ZW07IG1lc3NhZ2Ugd3JpdHRlbiBpcyBpbnRlbmRlZCB0byBiZSBicmllZiBmaW5hbCBzdGF0dXNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidHR5XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiV2hldGhlciB0aGlzIGNvbnRhaW5lciBzaG91bGQgYWxsb2NhdGUgYSBUVFkgZm9yIGl0c2VsZlwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ2b2x1bWVNb3VudHNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicG9kIHZvbHVtZXMgdG8gbW91bnQgaW50byB0aGUgY29udGFpbmVyJ3MgZmlsZXN5c3RlOyBjYW5ub3QgYmUgdXBkYXRlZFwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfVm9sdW1lTW91bnRcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Wb2x1bWVNb3VudFwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIndvcmtpbmdEaXJcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImNvbnRhaW5lcidzIHdvcmtpbmcgZGlyZWN0b3J5OyBkZWZhdWx0cyB0byBpbWFnZSdzIGRlZmF1bHQ7IGNhbm5vdCBiZSB1cGRhdGVkXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Db250YWluZXJcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfQ29udGFpbmVyUG9ydFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImNvbnRhaW5lclBvcnRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJudW1iZXIgb2YgcG9ydCB0byBleHBvc2Ugb24gdGhlIHBvZCdzIElQIGFkZHJlc3NcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaG9zdElQXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJob3N0IElQIHRvIGJpbmQgdGhlIHBvcnQgdG9cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaG9zdFBvcnRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJudW1iZXIgb2YgcG9ydCB0byBleHBvc2Ugb24gdGhlIGhvc3Q7IG1vc3QgY29udGFpbmVycyBkbyBub3QgbmVlZCB0aGlzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm5hbWUgZm9yIHRoZSBwb3J0IHRoYXQgY2FuIGJlIHJlZmVycmVkIHRvIGJ5IHNlcnZpY2VzOyBtdXN0IGJlIGFuIElBTkFfU1ZDX05BTUUgYW5kIHVuaXF1ZSB3aXRoaW4gdGhlIHBvZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwcm90b2NvbFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicHJvdG9jb2wgZm9yIHBvcnQ7IG11c3QgYmUgVURQIG9yIFRDUDsgVENQIGlmIHVuc3BlY2lmaWVkXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Db250YWluZXJQb3J0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0NvbnRhaW5lclN0YXRlXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwicnVubmluZ1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Db250YWluZXJTdGF0ZVJ1bm5pbmdcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQ29udGFpbmVyU3RhdGVSdW5uaW5nXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInRlcm1pbmF0ZWRcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfQ29udGFpbmVyU3RhdGVUZXJtaW5hdGVkXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkNvbnRhaW5lclN0YXRlVGVybWluYXRlZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ3YWl0aW5nXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0NvbnRhaW5lclN0YXRlV2FpdGluZ1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Db250YWluZXJTdGF0ZVdhaXRpbmdcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkNvbnRhaW5lclN0YXRlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0NvbnRhaW5lclN0YXRlUnVubmluZ1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcInN0YXJ0ZWRBdFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGltZSBhdCB3aGljaCB0aGUgY29udGFpbmVyIHdhcyBsYXN0IChyZS0pc3RhcnRlZFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQ29udGFpbmVyU3RhdGVSdW5uaW5nXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0NvbnRhaW5lclN0YXRlVGVybWluYXRlZFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImNvbnRhaW5lcklEXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJjb250YWluZXIncyBJRCBpbiB0aGUgZm9ybWF0ICdkb2NrZXI6Ly9cXHUwMDNjY29udGFpbmVyX2lkXFx1MDAzZSdcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZXhpdENvZGVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJleGl0IHN0YXR1cyBmcm9tIHRoZSBsYXN0IHRlcm1pbmF0aW9uIG9mIHRoZSBjb250YWluZXJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZmluaXNoZWRBdFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGltZSBhdCB3aGljaCB0aGUgY29udGFpbmVyIGxhc3QgdGVybWluYXRlZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXNzYWdlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJtZXNzYWdlIHJlZ2FyZGluZyB0aGUgbGFzdCB0ZXJtaW5hdGlvbiBvZiB0aGUgY29udGFpbmVyXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlYXNvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiKGJyaWVmKSByZWFzb24gZnJvbSB0aGUgbGFzdCB0ZXJtaW5hdGlvbiBvZiB0aGUgY29udGFpbmVyXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNpZ25hbFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImludGVnZXJcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInNpZ25hbCBmcm9tIHRoZSBsYXN0IHRlcm1pbmF0aW9uIG9mIHRoZSBjb250YWluZXJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3RhcnRlZEF0XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aW1lIGF0IHdoaWNoIHByZXZpb3VzIGV4ZWN1dGlvbiBvZiB0aGUgY29udGFpbmVyIHN0YXJ0ZWRcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkNvbnRhaW5lclN0YXRlVGVybWluYXRlZFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19Db250YWluZXJTdGF0ZVdhaXRpbmdcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJyZWFzb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIihicmllZikgcmVhc29uIHRoZSBjb250YWluZXIgaXMgbm90IHlldCBydW5uaW5nXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Db250YWluZXJTdGF0ZVdhaXRpbmdcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfQ29udGFpbmVyU3RhdHVzXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiY29udGFpbmVySURcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImNvbnRhaW5lcidzIElEIGluIHRoZSBmb3JtYXQgJ2RvY2tlcjovL1xcdTAwM2Njb250YWluZXJfaWRcXHUwMDNlJzsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvY29udGFpbmVyLWVudmlyb25tZW50Lm1kI2NvbnRhaW5lci1pbmZvcm1hdGlvblwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpbWFnZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaW1hZ2Ugb2YgdGhlIGNvbnRhaW5lcjsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvaW1hZ2VzLm1kXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImltYWdlSURcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIklEIG9mIHRoZSBjb250YWluZXIncyBpbWFnZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJsYXN0U3RhdGVcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfQ29udGFpbmVyU3RhdGVcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQ29udGFpbmVyU3RhdGVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibmFtZSBvZiB0aGUgY29udGFpbmVyOyBtdXN0IGJlIGEgRE5TX0xBQkVMIGFuZCB1bmlxdWUgd2l0aGluIHRoZSBwb2Q7IGNhbm5vdCBiZSB1cGRhdGVkXCIsXHJcbiAgICAgICAgICAgIFwibWF4TGVuZ3RoXCI6IDYzLFxyXG4gICAgICAgICAgICBcInBhdHRlcm5cIjogXCJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlYWR5XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwic3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvbnRhaW5lciBoYXMgcGFzc2VkIGl0cyByZWFkaW5lc3MgcHJvYmVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVzdGFydENvdW50XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIG51bWJlciBvZiB0aW1lcyB0aGUgY29udGFpbmVyIGhhcyBiZWVuIHJlc3RhcnRlZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzdGF0ZVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Db250YWluZXJTdGF0ZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Db250YWluZXJTdGF0ZVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQ29udGFpbmVyU3RhdHVzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0VtcHR5RGlyVm9sdW1lU291cmNlXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwibWVkaXVtXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0eXBlIG9mIHN0b3JhZ2UgdXNlZCB0byBiYWNrIHRoZSB2b2x1bWU7IG11c3QgYmUgYW4gZW1wdHkgc3RyaW5nIChkZWZhdWx0KSBvciBNZW1vcnk7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL3ZvbHVtZXMubWQjZW1wdHlkaXJcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkVtcHR5RGlyVm9sdW1lU291cmNlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0VuZHBvaW50QWRkcmVzc1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImlwXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJJUCBhZGRyZXNzIG9mIHRoZSBlbmRwb2ludFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0YXJnZXRSZWZcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0UmVmZXJlbmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuRW5kcG9pbnRBZGRyZXNzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0VuZHBvaW50UG9ydFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcIm5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm5hbWUgb2YgdGhpcyBwb3J0XCIsXHJcbiAgICAgICAgICAgIFwibWF4TGVuZ3RoXCI6IDYzLFxyXG4gICAgICAgICAgICBcInBhdHRlcm5cIjogXCJeW2EtejAtOV0oWy1hLXowLTldKlthLXowLTldKT8kXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInBvcnRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwb3J0IG51bWJlciBvZiB0aGUgZW5kcG9pbnRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicHJvdG9jb2xcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInByb3RvY29sIGZvciB0aGlzIHBvcnQ7IG11c3QgYmUgVURQIG9yIFRDUDsgVENQIGlmIHVuc3BlY2lmaWVkXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5FbmRwb2ludFBvcnRcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfRW5kcG9pbnRTdWJzZXRcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhZGRyZXNzZXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiSVAgYWRkcmVzc2VzIHdoaWNoIG9mZmVyIHRoZSByZWxhdGVkIHBvcnRzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19FbmRwb2ludEFkZHJlc3NcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5FbmRwb2ludEFkZHJlc3NcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwb3J0c1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwb3J0IG51bWJlcnMgYXZhaWxhYmxlIG9uIHRoZSByZWxhdGVkIElQIGFkZHJlc3Nlc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfRW5kcG9pbnRQb3J0XCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuRW5kcG9pbnRQb3J0XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkVuZHBvaW50U3Vic2V0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0VuZHBvaW50c1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJFbmRwb2ludHNcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3Vic2V0c1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzZXRzIG9mIGFkZHJlc3NlcyBhbmQgcG9ydHMgdGhhdCBjb21wcmlzZSBhIHNlcnZpY2VcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0VuZHBvaW50U3Vic2V0XCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuRW5kcG9pbnRTdWJzZXRcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuRW5kcG9pbnRzXCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0VuZHBvaW50c0xpc3RcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIGVuZHBvaW50c1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfRW5kcG9pbnRzXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuRW5kcG9pbnRzXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIkVuZHBvaW50c0xpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuRW5kcG9pbnRzTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZVwiLFxyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZUxpc3RcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0VudlZhclwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcIm5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlOyBtdXN0IGJlIGEgQ19JREVOVElGSUVSXCIsXHJcbiAgICAgICAgICAgIFwicGF0dGVyblwiOiBcIl5bQS1aYS16X11bQS1aYS16MC05X10qJFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ2YWx1ZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlOyBkZWZhdWx0cyB0byBlbXB0eSBzdHJpbmc7IHZhcmlhYmxlIHJlZmVyZW5jZXMgJChWQVJfTkFNRSkgYXJlIGV4cGFuZGVkIHVzaW5nIHRoZSBwcmV2aW91c2x5IGRlZmluZWQgZW52aXJvbm1lbnQgdmFyaWJsZXMgaW4gdGhlIGNvbnRhaW5lciBhbmQgYW55IHNlcnZpY2UgZW52aXJvbm1lbnQgdmFyaWFibGVzOyBpZiBhIHZhcmlhYmxlIGNhbm5vdCBiZSByZXNvbHZlZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ2YWx1ZUZyb21cIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfRW52VmFyU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkVudlZhclNvdXJjZVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuRW52VmFyXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0VudlZhclNvdXJjZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImZpZWxkUmVmXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdEZpZWxkU2VsZWN0b3JcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0RmllbGRTZWxlY3RvclwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuRW52VmFyU291cmNlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0V2ZW50XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiY291bnRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZXZlbnQgaGFzIG9jY3VycmVkXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImZpcnN0VGltZXN0YW1wXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgd2FzIGZpcnN0IHJlY29yZGVkXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImludm9sdmVkT2JqZWN0XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RSZWZlcmVuY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIkV2ZW50XCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibGFzdFRpbWVzdGFtcFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIHRpbWUgYXQgd2hpY2ggdGhlIG1vc3QgcmVjZW50IG9jY3VycmVuY2Ugb2YgdGhpcyBldmVudCB3YXMgcmVjb3JkZWRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWVzc2FnZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHN0YXR1cyBvZiB0aGlzIG9wZXJhdGlvblwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVhc29uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzaG9ydFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzb3VyY2VcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfRXZlbnRTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuRXZlbnRTb3VyY2VcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkV2ZW50XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0V2ZW50TGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgZXZlbnRzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19FdmVudFwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkV2ZW50XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIkV2ZW50TGlzdFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xpc3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxpc3RNZXRhXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5FdmVudExpc3RcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VcIixcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VMaXN0XCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19FdmVudFNvdXJjZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImNvbXBvbmVudFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiY29tcG9uZW50IHRoYXQgZ2VuZXJhdGVkIHRoZSBldmVudFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJob3N0XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJuYW1lIG9mIHRoZSBob3N0IHdoZXJlIHRoZSBldmVudCBpcyBnZW5lcmF0ZWRcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkV2ZW50U291cmNlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0V4ZWNBY3Rpb25cIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJjb21tYW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImNvbW1hbmQgbGluZSB0byBleGVjdXRlIGluc2lkZSB0aGUgY29udGFpbmVyOyB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIGNvbW1hbmQgaXMgcm9vdCAoJy8nKSBpbiB0aGUgY29udGFpbmVyJ3MgZmlsZSBzeXN0ZW07IHRoZSBjb21tYW5kIGlzIGV4ZWMnZFwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiY29tbWFuZCBsaW5lIHRvIGV4ZWN1dGUgaW5zaWRlIHRoZSBjb250YWluZXI7IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgY29tbWFuZCBpcyByb290ICgnLycpIGluIHRoZSBjb250YWluZXIncyBmaWxlIHN5c3RlbTsgdGhlIGNvbW1hbmQgaXMgZXhlYydkXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkV4ZWNBY3Rpb25cIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfR0NFUGVyc2lzdGVudERpc2tWb2x1bWVTb3VyY2VcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJmc1R5cGVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImZpbGUgc3lzdGVtIHR5cGUgdG8gbW91bnRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicGFydGl0aW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicGFydGl0aW9uIG9uIHRoZSBkaXNrIHRvIG1vdW50IChlLmcuXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInBkTmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidW5pcXVlIG5hbWUgb2YgdGhlIFBEIHJlc291cmNlIGluIEdDRTsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvdm9sdW1lcy5tZCNnY2VwZXJzaXN0ZW50ZGlza1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZWFkT25seVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInJlYWQtb25seSBpZiB0cnVlXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5HQ0VQZXJzaXN0ZW50RGlza1ZvbHVtZVNvdXJjZVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19HaXRSZXBvVm9sdW1lU291cmNlXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwicmVwb3NpdG9yeVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicmVwb3NpdG9yeSBVUkxcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmV2aXNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImNvbW1pdCBoYXNoIGZvciB0aGUgc3BlY2lmaWVkIHJldmlzaW9uXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5HaXRSZXBvVm9sdW1lU291cmNlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0dsdXN0ZXJmc1ZvbHVtZVNvdXJjZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImVuZHBvaW50c1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZ2x1c3RlciBob3N0cyBlbmRwb2ludHMgbmFtZTsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9leGFtcGxlcy9nbHVzdGVyZnMvUkVBRE1FLm1kI2NyZWF0ZS1hLXBvZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwYXRoXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwYXRoIHRvIGdsdXN0ZXIgdm9sdW1lOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2V4YW1wbGVzL2dsdXN0ZXJmcy9SRUFETUUubWQjY3JlYXRlLWEtcG9kXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlYWRPbmx5XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZ2x1c3RlcmZzIHZvbHVtZSB0byBiZSBtb3VudGVkIHdpdGggcmVhZC1vbmx5IHBlcm1pc3Npb25zOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2V4YW1wbGVzL2dsdXN0ZXJmcy9SRUFETUUubWQjY3JlYXRlLWEtcG9kXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5HbHVzdGVyZnNWb2x1bWVTb3VyY2VcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfSFRUUEdldEFjdGlvblwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImhvc3RcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImhvc3RuYW1lIHRvIGNvbm5lY3QgdG87IGRlZmF1bHRzIHRvIHBvZCBJUFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwYXRoXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwYXRoIHRvIGFjY2VzcyBvbiB0aGUgSFRUUCBzZXJ2ZXJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicG9ydFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc191dGlsX0ludE9yU3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkludE9yU3RyaW5nXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNjaGVtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwic2NoZW1lIHRvIGNvbm5lY3Qgd2l0aFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSFRUUEdldEFjdGlvblwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19IYW5kbGVyXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiZXhlY1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19FeGVjQWN0aW9uXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkV4ZWNBY3Rpb25cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaHR0cEdldFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19IVFRQR2V0QWN0aW9uXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhUVFBHZXRBY3Rpb25cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidGNwU29ja2V0XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1RDUFNvY2tldEFjdGlvblwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5UQ1BTb2NrZXRBY3Rpb25cIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhbmRsZXJcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfSG9zdFBhdGhWb2x1bWVTb3VyY2VcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJwYXRoXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwYXRoIG9mIHRoZSBkaXJlY3Rvcnkgb24gdGhlIGhvc3Q7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL3ZvbHVtZXMubWQjaG9zdHBhdGhcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhvc3RQYXRoVm9sdW1lU291cmNlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0lTQ1NJVm9sdW1lU291cmNlXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiZnNUeXBlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJmaWxlIHN5c3RlbSB0eXBlIHRvIG1vdW50XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImlxblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaVNDU0kgUXVhbGlmaWVkIE5hbWVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibHVuXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaXNjc2kgdGFyZ2V0IGx1biBudW1iZXJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVhZE9ubHlcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyZWFkLW9ubHkgaWYgdHJ1ZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0YXJnZXRQb3J0YWxcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImlTQ1NJIHRhcmdldCBwb3J0YWxcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLklTQ1NJVm9sdW1lU291cmNlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX0xpZmVjeWNsZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcInBvc3RTdGFydFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19IYW5kbGVyXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhbmRsZXJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicHJlU3RvcFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19IYW5kbGVyXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhbmRsZXJcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxpZmVjeWNsZVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19MaXN0XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBvYmplY3RzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19ydW50aW1lX1Jhd0V4dGVuc2lvblwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIkxpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQmFzZUt1YmVybmV0ZXNMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlXCIsXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlTGlzdFwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfTGlzdE1ldGFcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJyZXNvdXJjZVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlIGludGVybmFsIHZlcnNpb24gb2YgdGhpcyBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBieSBjbGllbnRzIHRvIGRldGVybWluZSB3aGVuIG9iamVjdHMgaGF2ZSBjaGFuZ2VkOyBwb3B1bGF0ZWQgYnkgdGhlIHN5c3RlbVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzZWxmTGlua1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiVVJMIGZvciB0aGUgb2JqZWN0OyBwb3B1bGF0ZWQgYnkgdGhlIHN5c3RlbVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTGlzdE1ldGFcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfTG9hZEJhbGFuY2VySW5ncmVzc1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImhvc3RuYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJob3N0bmFtZSBvZiBpbmdyZXNzIHBvaW50XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImlwXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJJUCBhZGRyZXNzIG9mIGluZ3Jlc3MgcG9pbnRcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxvYWRCYWxhbmNlckluZ3Jlc3NcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfTG9hZEJhbGFuY2VyU3RhdHVzXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiaW5ncmVzc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsb2FkLWJhbGFuY2VyIGluZ3Jlc3MgcG9pbnRzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Mb2FkQmFsYW5jZXJJbmdyZXNzXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTG9hZEJhbGFuY2VySW5ncmVzc1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Mb2FkQmFsYW5jZXJTdGF0dXNcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfTG9jYWxPYmplY3RSZWZlcmVuY2VcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJuYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJuYW1lIG9mIHRoZSByZWZlcmVudDsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvaWRlbnRpZmllcnMubWQjbmFtZXNcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxvY2FsT2JqZWN0UmVmZXJlbmNlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX01ldGFkYXRhRmlsZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImZpZWxkUmVmXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdEZpZWxkU2VsZWN0b3JcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0RmllbGRTZWxlY3RvclwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJuYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBiZSBjcmVhdGVkXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5NZXRhZGF0YUZpbGVcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfTWV0YWRhdGFWb2x1bWVTb3VyY2VcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIG1ldGFkYXRhIGZpbGVzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19NZXRhZGF0YUZpbGVcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5NZXRhZGF0YUZpbGVcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTWV0YWRhdGFWb2x1bWVTb3VyY2VcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfTkZTVm9sdW1lU291cmNlXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwicGF0aFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIHBhdGggdGhhdCBpcyBleHBvcnRlZCBieSB0aGUgTkZTIHNlcnZlcjsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvdm9sdW1lcy5tZCNuZnNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVhZE9ubHlcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJmb3JjZXMgdGhlIE5GUyBleHBvcnQgdG8gYmUgbW91bnRlZCB3aXRoIHJlYWQtb25seSBwZXJtaXNzaW9uczsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvdm9sdW1lcy5tZCNuZnNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic2VydmVyXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgaG9zdG5hbWUgb3IgSVAgYWRkcmVzcyBvZiB0aGUgTkZTIHNlcnZlcjsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvdm9sdW1lcy5tZCNuZnNcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk5GU1ZvbHVtZVNvdXJjZVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19OYW1lc3BhY2VcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiTmFtZXNwYWNlXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RNZXRhXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNwZWNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTmFtZXNwYWNlU3BlY1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5OYW1lc3BhY2VTcGVjXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInN0YXR1c1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19OYW1lc3BhY2VTdGF0dXNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTmFtZXNwYWNlU3RhdHVzXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5OYW1lc3BhY2VcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfTmFtZXNwYWNlTGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIml0ZW1zIGlzIHRoZSBsaXN0IG9mIE5hbWVzcGFjZSBvYmplY3RzIGluIHRoZSBsaXN0OyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9uYW1lc3BhY2VzLm1kXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19OYW1lc3BhY2VcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5OYW1lc3BhY2VcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiTmFtZXNwYWNlTGlzdFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xpc3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxpc3RNZXRhXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5OYW1lc3BhY2VMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlXCIsXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlTGlzdFwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfTmFtZXNwYWNlU3BlY1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImZpbmFsaXplcnNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYW4gb3BhcXVlIGxpc3Qgb2YgdmFsdWVzIHRoYXQgbXVzdCBiZSBlbXB0eSB0byBwZXJtYW5lbnRseSByZW1vdmUgb2JqZWN0IGZyb20gc3RvcmFnZTsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL2Rlc2lnbi9uYW1lc3BhY2VzLm1kI2ZpbmFsaXplcnNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFuIG9wYXF1ZSBsaXN0IG9mIHZhbHVlcyB0aGF0IG11c3QgYmUgZW1wdHkgdG8gcGVybWFuZW50bHkgcmVtb3ZlIG9iamVjdCBmcm9tIHN0b3JhZ2U7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy9kZXNpZ24vbmFtZXNwYWNlcy5tZCNmaW5hbGl6ZXJzXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk5hbWVzcGFjZVNwZWNcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfTmFtZXNwYWNlU3RhdHVzXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwicGhhc2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInBoYXNlIGlzIHRoZSBjdXJyZW50IGxpZmVjeWNsZSBwaGFzZSBvZiB0aGUgbmFtZXNwYWNlOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvZGVzaWduL25hbWVzcGFjZXMubWQjcGhhc2VzXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5OYW1lc3BhY2VTdGF0dXNcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfTm9kZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJOb2RlXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RNZXRhXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNwZWNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTm9kZVNwZWNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTm9kZVNwZWNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3RhdHVzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX05vZGVTdGF0dXNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTm9kZVN0YXR1c1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTm9kZVwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19Ob2RlQWRkcmVzc1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFkZHJlc3NcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBub2RlIGFkZHJlc3NcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidHlwZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibm9kZSBhZGRyZXNzIHR5cGVcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk5vZGVBZGRyZXNzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX05vZGVDb25kaXRpb25cIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJsYXN0SGVhcnRiZWF0VGltZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGFzdCB0aW1lIHdlIGdvdCBhbiB1cGRhdGUgb24gYSBnaXZlbiBjb25kaXRpb25cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibGFzdFRyYW5zaXRpb25UaW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsYXN0IHRpbWUgdGhlIGNvbmRpdGlvbiB0cmFuc2l0IGZyb20gb25lIHN0YXR1cyB0byBhbm90aGVyXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1lc3NhZ2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImh1bWFuIHJlYWRhYmxlIG1lc3NhZ2UgaW5kaWNhdGluZyBkZXRhaWxzIGFib3V0IGxhc3QgdHJhbnNpdGlvblwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZWFzb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIihicmllZikgcmVhc29uIGZvciB0aGUgY29uZGl0aW9uJ3MgbGFzdCB0cmFuc2l0aW9uXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInN0YXR1c1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwic3RhdHVzIG9mIHRoZSBjb25kaXRpb25cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidHlwZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidHlwZSBvZiBub2RlIGNvbmRpdGlvblwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTm9kZUNvbmRpdGlvblwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19Ob2RlTGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2Ygbm9kZXNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX05vZGVcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Ob2RlXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIk5vZGVMaXN0XCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTGlzdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTGlzdE1ldGFcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk5vZGVMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlXCIsXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlTGlzdFwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfTm9kZVNwZWNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJleHRlcm5hbElEXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJkZXByZWNhdGVkLiBFeHRlcm5hbCBJRCBhc3NpZ25lZCB0byB0aGUgbm9kZSBieSBzb21lIG1hY2hpbmUgZGF0YWJhc2UgKGUuZy4gYSBjbG91ZCBwcm92aWRlcikuIERlZmF1bHRzIHRvIG5vZGUgbmFtZSB3aGVuIGVtcHR5LlwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwb2RDSURSXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwb2QgSVAgcmFuZ2UgYXNzaWduZWQgdG8gdGhlIG5vZGVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicHJvdmlkZXJJRFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiSUQgb2YgdGhlIG5vZGUgYXNzaWduZWQgYnkgdGhlIGNsb3VkIHByb3ZpZGVyIGluIHRoZSBmb3JtYXQ6IFxcdTAwM2NQcm92aWRlck5hbWVcXHUwMDNlOi8vXFx1MDAzY1Byb3ZpZGVyU3BlY2lmaWNOb2RlSURcXHUwMDNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInVuc2NoZWR1bGFibGVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJkaXNhYmxlIHBvZCBzY2hlZHVsaW5nIG9uIHRoZSBub2RlOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvYWRtaW4vbm9kZS5tZCNtYW51YWwtbm9kZS1hZG1pbmlzdHJhdGlvblwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTm9kZVNwZWNcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfTm9kZVN0YXR1c1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFkZHJlc3Nlc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIGFkZHJlc3NlcyByZWFjaGFibGUgdG8gdGhlIG5vZGU7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy9hZG1pbi9ub2RlLm1kI25vZGUtYWRkcmVzc2VzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Ob2RlQWRkcmVzc1wiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk5vZGVBZGRyZXNzXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiY2FwYWNpdHlcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImNvbXB1dGUgcmVzb3VyY2UgY2FwYWNpdHkgb2YgdGhlIG5vZGU7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL2NvbXB1dGUtcmVzb3VyY2VzLm1kXCIsXHJcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19yZXNvdXJjZV9RdWFudGl0eVwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlF1YW50aXR5XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImphdmEudXRpbC5NYXBcXHUwMDNjU3RyaW5nLGlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUXVhbnRpdHlcXHUwMDNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImNvbmRpdGlvbnNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBub2RlIGNvbmRpdGlvbnMgb2JzZXJ2ZWQ7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy9hZG1pbi9ub2RlLm1kI25vZGUtY29uZGl0aW9uXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Ob2RlQ29uZGl0aW9uXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTm9kZUNvbmRpdGlvblwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm5vZGVJbmZvXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX05vZGVTeXN0ZW1JbmZvXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk5vZGVTeXN0ZW1JbmZvXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInBoYXNlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJtb3N0IHJlY2VudGx5IG9ic2VydmVkIGxpZmVjeWNsZSBwaGFzZSBvZiB0aGUgbm9kZTsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL2FkbWluL25vZGUubWQjbm9kZS1waGFzZVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTm9kZVN0YXR1c1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19Ob2RlU3lzdGVtSW5mb1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImJvb3RJRFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYm9vdCBpZCBpcyB0aGUgYm9vdC1pZCByZXBvcnRlZCBieSB0aGUgbm9kZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJjb250YWluZXJSdW50aW1lVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQ29udGFpbmVyIHJ1bnRpbWUgdmVyc2lvbiByZXBvcnRlZCBieSB0aGUgbm9kZSB0aHJvdWdoIHJ1bnRpbWUgcmVtb3RlIEFQSSAoZS5nLiBkb2NrZXI6Ly8xLjUuMClcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2VybmVsVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiS2VybmVsIHZlcnNpb24gcmVwb3J0ZWQgYnkgdGhlIG5vZGUgZnJvbSAndW5hbWUgLXInIChlLmcuIDMuMTYuMC0wLmJwby40LWFtZDY0KVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJrdWJlUHJveHlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJLdWJlLXByb3h5IHZlcnNpb24gcmVwb3J0ZWQgYnkgdGhlIG5vZGVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia3ViZWxldFZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkt1YmVsZXQgdmVyc2lvbiByZXBvcnRlZCBieSB0aGUgbm9kZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtYWNoaW5lSURcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm1hY2hpbmUtaWQgcmVwb3J0ZWQgYnkgdGhlIG5vZGVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwib3NJbWFnZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiT1MgaW1hZ2UgdXNlZCByZXBvcnRlZCBieSB0aGUgbm9kZSBmcm9tIC9ldGMvb3MtcmVsZWFzZSAoZS5nLiBEZWJpYW4gR05VL0xpbnV4IDcgKHdoZWV6eSkpXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInN5c3RlbVVVSURcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInN5c3RlbS11dWlkIHJlcG9ydGVkIGJ5IHRoZSBub2RlXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Ob2RlU3lzdGVtSW5mb1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19PYmplY3RGaWVsZFNlbGVjdG9yXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidmVyc2lvbiBvZiB0aGUgc2NoZW1hIHRoYXQgZmllbGRQYXRoIGlzIHdyaXR0ZW4gaW4gdGVybXMgb2Y7IGRlZmF1bHRzIHRvIHYxXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImZpZWxkUGF0aFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicGF0aCBvZiB0aGUgZmllbGQgdG8gc2VsZWN0IGluIHRoZSBzcGVjaWZpZWQgQVBJIHZlcnNpb25cIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdEZpZWxkU2VsZWN0b3JcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfT2JqZWN0TWV0YVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFubm90YXRpb25zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJtYXAgb2Ygc3RyaW5nIGtleXMgYW5kIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IGV4dGVybmFsIHRvb2xpbmcgdG8gc3RvcmUgYW5kIHJldHJpZXZlIGFyYml0cmFyeSBtZXRhZGF0YSBhYm91dCBvYmplY3RzOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9hbm5vdGF0aW9ucy5tZFwiLFxyXG4gICAgICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibWFwIG9mIHN0cmluZyBrZXlzIGFuZCB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCBieSBleHRlcm5hbCB0b29saW5nIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBhcmJpdHJhcnkgbWV0YWRhdGEgYWJvdXQgb2JqZWN0czsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvYW5ub3RhdGlvbnMubWRcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiamF2YS51dGlsLk1hcFxcdTAwM2NTdHJpbmcsU3RyaW5nXFx1MDAzZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJjcmVhdGlvblRpbWVzdGFtcFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiUkZDIDMzMzkgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkOyBwb3B1bGF0ZWQgYnkgdGhlIHN5c3RlbVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJkZWxldGlvblRpbWVzdGFtcFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiUkZDIDMzMzkgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgb2JqZWN0IHdpbGwgYmUgZGVsZXRlZDsgcG9wdWxhdGVkIGJ5IHRoZSBzeXN0ZW0gd2hlbiBhIGdyYWNlZnVsIGRlbGV0aW9uIGlzIHJlcXVlc3RlZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJnZW5lcmF0ZU5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFuIG9wdGlvbmFsIHByZWZpeCB0byB1c2UgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgbmFtZTsgaGFzIHRoZSBzYW1lIHZhbGlkYXRpb24gcnVsZXMgYXMgbmFtZTsgb3B0aW9uYWxcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZ2VuZXJhdGlvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImludGVnZXJcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImEgc2VxdWVuY2UgbnVtYmVyIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIGdlbmVyYXRpb24gb2YgdGhlIGRlc2lyZWQgc3RhdGU7IHBvcHVsYXRlZCBieSB0aGUgc3lzdGVtOyByZWFkLW9ubHlcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcIkxvbmdcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibGFiZWxzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJtYXAgb2Ygc3RyaW5nIGtleXMgYW5kIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG9yZ2FuaXplIGFuZCBjYXRlZ29yaXplIG9iamVjdHM7IG1heSBtYXRjaCBzZWxlY3RvcnMgb2YgcmVwbGljYXRpb24gY29udHJvbGxlcnMgYW5kIHNlcnZpY2VzOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9sYWJlbHMubWRcIixcclxuICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm1hcCBvZiBzdHJpbmcga2V5cyBhbmQgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3JnYW5pemUgYW5kIGNhdGVnb3JpemUgb2JqZWN0czsgbWF5IG1hdGNoIHNlbGVjdG9ycyBvZiByZXBsaWNhdGlvbiBjb250cm9sbGVycyBhbmQgc2VydmljZXM7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL2xhYmVscy5tZFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJqYXZhLnV0aWwuTWFwXFx1MDAzY1N0cmluZyxTdHJpbmdcXHUwMDNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInN0cmluZyB0aGF0IGlkZW50aWZpZXMgYW4gb2JqZWN0LiBNdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBuYW1lc3BhY2U7IGNhbm5vdCBiZSB1cGRhdGVkOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9pZGVudGlmaWVycy5tZCNuYW1lc1wiLFxyXG4gICAgICAgICAgICBcIm1heExlbmd0aFwiOiA2MyxcclxuICAgICAgICAgICAgXCJwYXR0ZXJuXCI6IFwiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJuYW1lc3BhY2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm5hbWVzcGFjZSBvZiB0aGUgb2JqZWN0OyBtdXN0IGJlIGEgRE5TX0xBQkVMOyBjYW5ub3QgYmUgdXBkYXRlZDsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvbmFtZXNwYWNlcy5tZFwiLFxyXG4gICAgICAgICAgICBcIm1heExlbmd0aFwiOiAyNTMsXHJcbiAgICAgICAgICAgIFwicGF0dGVyblwiOiBcIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyhcXFxcLlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/KSokXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlc291cmNlVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwic3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgaW50ZXJuYWwgdmVyc2lvbiBvZiB0aGlzIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgdG8gZGV0ZXJtaW5lIHdoZW4gb2JqZWN0cyBoYXZlIGNoYW5nZWQ7IHBvcHVsYXRlZCBieSB0aGUgc3lzdGVtXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNlbGZMaW5rXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJVUkwgZm9yIHRoZSBvYmplY3Q7IHBvcHVsYXRlZCBieSB0aGUgc3lzdGVtXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInVpZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidW5pcXVlIFVVSUQgYWNyb3NzIHNwYWNlIGFuZCB0aW1lOyBwb3B1bGF0ZWQgYnkgdGhlIHN5c3RlbTsgcmVhZC1vbmx5OyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9pZGVudGlmaWVycy5tZCN1aWRzXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RNZXRhXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX09iamVjdFJlZmVyZW5jZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkFQSSB2ZXJzaW9uIG9mIHRoZSByZWZlcmVudFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJmaWVsZFBhdGhcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImlmIHJlZmVycmluZyB0byBhIHBpZWNlIG9mIGFuIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGVudGlyZSBvYmplY3RcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwia2luZCBvZiB0aGUgcmVmZXJlbnQ7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy9kZXZlbC9hcGktY29udmVudGlvbnMubWQjdHlwZXMta2luZHNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibmFtZSBvZiB0aGUgcmVmZXJlbnQ7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL2lkZW50aWZpZXJzLm1kI25hbWVzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm5hbWVzcGFjZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibmFtZXNwYWNlIG9mIHRoZSByZWZlcmVudDsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvbmFtZXNwYWNlcy5tZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZXNvdXJjZVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInNwZWNpZmljIHJlc291cmNlVmVyc2lvbiB0byB3aGljaCB0aGlzIHJlZmVyZW5jZSBpcyBtYWRlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInVpZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidWlkIG9mIHRoZSByZWZlcmVudDsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvaWRlbnRpZmllcnMubWQjdWlkc1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0UmVmZXJlbmNlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1BlcnNpc3RlbnRWb2x1bWVcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiUGVyc2lzdGVudFZvbHVtZVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzcGVjXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1BlcnNpc3RlbnRWb2x1bWVTcGVjXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlBlcnNpc3RlbnRWb2x1bWVTcGVjXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInN0YXR1c1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19QZXJzaXN0ZW50Vm9sdW1lU3RhdHVzXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlBlcnNpc3RlbnRWb2x1bWVTdGF0dXNcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlBlcnNpc3RlbnRWb2x1bWVcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfUGVyc2lzdGVudFZvbHVtZUNsYWltXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlBlcnNpc3RlbnRWb2x1bWVDbGFpbVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzcGVjXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1BlcnNpc3RlbnRWb2x1bWVDbGFpbVNwZWNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUGVyc2lzdGVudFZvbHVtZUNsYWltU3BlY1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzdGF0dXNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUGVyc2lzdGVudFZvbHVtZUNsYWltU3RhdHVzXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlBlcnNpc3RlbnRWb2x1bWVDbGFpbVN0YXR1c1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUGVyc2lzdGVudFZvbHVtZUNsYWltXCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1BlcnNpc3RlbnRWb2x1bWVDbGFpbUxpc3RcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhIGxpc3Qgb2YgcGVyc2lzdGVudCB2b2x1bWUgY2xhaW1zOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9wZXJzaXN0ZW50LXZvbHVtZXMubWQjcGVyc2lzdGVudHZvbHVtZWNsYWltc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUGVyc2lzdGVudFZvbHVtZUNsYWltXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUGVyc2lzdGVudFZvbHVtZUNsYWltXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlBlcnNpc3RlbnRWb2x1bWVDbGFpbUxpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUGVyc2lzdGVudFZvbHVtZUNsYWltTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZVwiLFxyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZUxpc3RcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1BlcnNpc3RlbnRWb2x1bWVDbGFpbVNwZWNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhY2Nlc3NNb2Rlc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgZGVzaXJlZCBhY2Nlc3MgbW9kZXMgdGhlIHZvbHVtZSBzaG91bGQgaGF2ZTsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvcGVyc2lzdGVudC12b2x1bWVzLm1kI2FjY2Vzcy1tb2Rlcy0xXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgZGVzaXJlZCBhY2Nlc3MgbW9kZXMgdGhlIHZvbHVtZSBzaG91bGQgaGF2ZTsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvcGVyc2lzdGVudC12b2x1bWVzLm1kI2FjY2Vzcy1tb2Rlcy0xXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1Jlc291cmNlUmVxdWlyZW1lbnRzXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJlc291cmNlUmVxdWlyZW1lbnRzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInZvbHVtZU5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBiaW5kaW5nIHJlZmVyZW5jZSB0byB0aGUgcGVyc2lzdGVudCB2b2x1bWUgYmFja2luZyB0aGlzIGNsYWltXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1TcGVjXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1BlcnNpc3RlbnRWb2x1bWVDbGFpbVN0YXR1c1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFjY2Vzc01vZGVzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBhY3R1YWwgYWNjZXNzIG1vZGVzIHRoZSB2b2x1bWUgaGFzOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9wZXJzaXN0ZW50LXZvbHVtZXMubWQjYWNjZXNzLW1vZGVzLTFcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBhY3R1YWwgYWNjZXNzIG1vZGVzIHRoZSB2b2x1bWUgaGFzOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9wZXJzaXN0ZW50LXZvbHVtZXMubWQjYWNjZXNzLW1vZGVzLTFcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJjYXBhY2l0eVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIGFjdHVhbCByZXNvdXJjZXMgdGhlIHZvbHVtZSBoYXNcIixcclxuICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX3Jlc291cmNlX1F1YW50aXR5XCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUXVhbnRpdHlcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiamF2YS51dGlsLk1hcFxcdTAwM2NTdHJpbmcsaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5RdWFudGl0eVxcdTAwM2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicGhhc2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBjdXJyZW50IHBoYXNlIG9mIHRoZSBjbGFpbVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUGVyc2lzdGVudFZvbHVtZUNsYWltU3RhdHVzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1BlcnNpc3RlbnRWb2x1bWVDbGFpbVZvbHVtZVNvdXJjZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImNsYWltTmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIG5hbWUgb2YgdGhlIGNsYWltIGluIHRoZSBzYW1lIG5hbWVzcGFjZSB0byBiZSBtb3VudGVkIGFzIGEgdm9sdW1lOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9wZXJzaXN0ZW50LXZvbHVtZXMubWQjcGVyc2lzdGVudHZvbHVtZWNsYWltc1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZWFkT25seVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm1vdW50IHZvbHVtZSBhcyByZWFkLW9ubHkgd2hlbiB0cnVlOyBkZWZhdWx0IGZhbHNlXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1Wb2x1bWVTb3VyY2VcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfUGVyc2lzdGVudFZvbHVtZUxpc3RcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIHBlcnNpc3RlbnQgdm9sdW1lczsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvcGVyc2lzdGVudC12b2x1bWVzLm1kXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19QZXJzaXN0ZW50Vm9sdW1lXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUGVyc2lzdGVudFZvbHVtZVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJQZXJzaXN0ZW50Vm9sdW1lTGlzdFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xpc3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxpc3RNZXRhXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5QZXJzaXN0ZW50Vm9sdW1lTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZVwiLFxyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZUxpc3RcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1BlcnNpc3RlbnRWb2x1bWVTb3VyY2VcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhd3NFbGFzdGljQmxvY2tTdG9yZVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19BV1NFbGFzdGljQmxvY2tTdG9yZVZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5BV1NFbGFzdGljQmxvY2tTdG9yZVZvbHVtZVNvdXJjZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJjZXBoZnNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfQ2VwaEZTVm9sdW1lU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkNlcGhGU1ZvbHVtZVNvdXJjZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJnY2VQZXJzaXN0ZW50RGlza1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19HQ0VQZXJzaXN0ZW50RGlza1ZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5HQ0VQZXJzaXN0ZW50RGlza1ZvbHVtZVNvdXJjZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJnbHVzdGVyZnNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfR2x1c3RlcmZzVm9sdW1lU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkdsdXN0ZXJmc1ZvbHVtZVNvdXJjZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJob3N0UGF0aFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Ib3N0UGF0aFZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Ib3N0UGF0aFZvbHVtZVNvdXJjZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpc2NzaVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19JU0NTSVZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5JU0NTSVZvbHVtZVNvdXJjZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJuZnNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTkZTVm9sdW1lU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk5GU1ZvbHVtZVNvdXJjZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyYmRcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUkJEVm9sdW1lU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJCRFZvbHVtZVNvdXJjZVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUGVyc2lzdGVudFZvbHVtZVNvdXJjZVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19QZXJzaXN0ZW50Vm9sdW1lU3BlY1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFjY2Vzc01vZGVzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFsbCB3YXlzIHRoZSB2b2x1bWUgY2FuIGJlIG1vdW50ZWQ7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL3BlcnNpc3RlbnQtdm9sdW1lcy5tZCNhY2Nlc3MtbW9kZXNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFsbCB3YXlzIHRoZSB2b2x1bWUgY2FuIGJlIG1vdW50ZWQ7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL3BlcnNpc3RlbnQtdm9sdW1lcy5tZCNhY2Nlc3MtbW9kZXNcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJhd3NFbGFzdGljQmxvY2tTdG9yZVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19BV1NFbGFzdGljQmxvY2tTdG9yZVZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5BV1NFbGFzdGljQmxvY2tTdG9yZVZvbHVtZVNvdXJjZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJjYXBhY2l0eVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYSBkZXNjcmlwdGlvbiBvZiB0aGUgcGVyc2lzdGVudCB2b2x1bWUncyByZXNvdXJjZXMgYW5kIGNhcGFjaXR5cjsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvcGVyc2lzdGVudC12b2x1bWVzLm1kI2NhcGFjaXR5XCIsXHJcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19yZXNvdXJjZV9RdWFudGl0eVwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlF1YW50aXR5XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImphdmEudXRpbC5NYXBcXHUwMDNjU3RyaW5nLGlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUXVhbnRpdHlcXHUwMDNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImNlcGhmc1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19DZXBoRlNWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQ2VwaEZTVm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImNsYWltUmVmXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RSZWZlcmVuY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZ2NlUGVyc2lzdGVudERpc2tcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfR0NFUGVyc2lzdGVudERpc2tWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuR0NFUGVyc2lzdGVudERpc2tWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZ2x1c3RlcmZzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0dsdXN0ZXJmc1ZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5HbHVzdGVyZnNWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaG9zdFBhdGhcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfSG9zdFBhdGhWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSG9zdFBhdGhWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaXNjc2lcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfSVNDU0lWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSVNDU0lWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibmZzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX05GU1ZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5ORlNWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicGVyc2lzdGVudFZvbHVtZVJlY2xhaW1Qb2xpY3lcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIndoYXQgaGFwcGVucyB0byBhIHZvbHVtZSB3aGVuIHJlbGVhc2VkIGZyb20gaXRzIGNsYWltOyBWYWxpZCBvcHRpb25zIGFyZSBSZXRhaW4gKGRlZmF1bHQpIGFuZCBSZWN5Y2xlLiAgUmVjeWxpbmcgbXVzdCBiZSBzdXBwb3J0ZWQgYnkgdGhlIHZvbHVtZSBwbHVnaW4gdW5kZXJseWluZyB0aGlzIHBlcnNpc3RlbnQgdm9sdW1lLiBTZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9wZXJzaXN0ZW50LXZvbHVtZXMubWQjcmVjeWNsaW5nLXBvbGljeVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyYmRcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUkJEVm9sdW1lU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJCRFZvbHVtZVNvdXJjZVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUGVyc2lzdGVudFZvbHVtZVNwZWNcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfUGVyc2lzdGVudFZvbHVtZVN0YXR1c1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcIm1lc3NhZ2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UgaW5kaWNhdGluZyBkZXRhaWxzIGFib3V0IHdoeSB0aGUgdm9sdW1lIGlzIGluIHRoaXMgc3RhdGVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicGhhc2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBjdXJyZW50IHBoYXNlIG9mIGEgcGVyc2lzdGVudCB2b2x1bWU7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL3BlcnNpc3RlbnQtdm9sdW1lcy5tZCNwaGFzZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZWFzb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIihicmllZikgcmVhc29uIHRoZSB2b2x1bWUgaXMgbm90IGlzIG5vdCBhdmFpbGFibGVcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlBlcnNpc3RlbnRWb2x1bWVTdGF0dXNcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfUG9kXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlBvZFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzcGVjXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1BvZFNwZWNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUG9kU3BlY1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzdGF0dXNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUG9kU3RhdHVzXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlBvZFN0YXR1c1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUG9kXCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1BvZENvbmRpdGlvblwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcInN0YXR1c1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwic3RhdHVzIG9mIHRoZSBjb25kaXRpb25cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidHlwZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwia2luZCBvZiB0aGUgY29uZGl0aW9uXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Qb2RDb25kaXRpb25cIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfUG9kTGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgcG9kczsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvcG9kcy5tZFwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUG9kXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUG9kXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlBvZExpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUG9kTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZVwiLFxyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZUxpc3RcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1BvZFNwZWNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhY3RpdmVEZWFkbGluZVNlY29uZHNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcIkxvbmdcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiY29udGFpbmVyc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIGNvbnRhaW5lcnMgYmVsb25naW5nIHRvIHRoZSBwb2Q7IGNhbm5vdCBiZSB1cGRhdGVkOyBjb250YWluZXJzIGNhbm5vdCBjdXJyZW50bHkgYmUgYWRkZWQgb3IgcmVtb3ZlZDsgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgY29udGFpbmVyIGluIGEgUG9kOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9jb250YWluZXJzLm1kXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Db250YWluZXJcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Db250YWluZXJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJkbnNQb2xpY3lcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkROUyBwb2xpY3kgZm9yIGNvbnRhaW5lcnMgd2l0aGluIHRoZSBwb2Q7IG9uZSBvZiAnQ2x1c3RlckZpcnN0JyBvciAnRGVmYXVsdCdcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaG9zdFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZGVwcmVjYXRlZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJob3N0TmV0d29ya1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImhvc3QgbmV0d29ya2luZyByZXF1ZXN0ZWQgZm9yIHRoaXMgcG9kXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImltYWdlUHVsbFNlY3JldHNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiByZWZlcmVuY2VzIHRvIHNlY3JldHMgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIGF2YWlsYWJsZSBmb3IgcHVsbGluZyB0aGUgY29udGFpbmVyIGltYWdlczsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvaW1hZ2VzLm1kI3NwZWNpZnlpbmctaW1hZ2VwdWxsc2VjcmV0cy1vbi1hLXBvZFwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTG9jYWxPYmplY3RSZWZlcmVuY2VcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Mb2NhbE9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm5vZGVOYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJub2RlIHJlcXVlc3RlZCBmb3IgdGhpcyBwb2RcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibm9kZVNlbGVjdG9yXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzZWxlY3RvciB3aGljaCBtdXN0IG1hdGNoIGEgbm9kZSdzIGxhYmVscyBmb3IgdGhlIHBvZCB0byBiZSBzY2hlZHVsZWQgb24gdGhhdCBub2RlOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9ub2RlLXNlbGVjdGlvbi9SRUFETUUubWRcIixcclxuICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInNlbGVjdG9yIHdoaWNoIG11c3QgbWF0Y2ggYSBub2RlJ3MgbGFiZWxzIGZvciB0aGUgcG9kIHRvIGJlIHNjaGVkdWxlZCBvbiB0aGF0IG5vZGU7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL25vZGUtc2VsZWN0aW9uL1JFQURNRS5tZFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJqYXZhLnV0aWwuTWFwXFx1MDAzY1N0cmluZyxTdHJpbmdcXHUwMDNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlc3RhcnRQb2xpY3lcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInJlc3RhcnQgcG9saWN5IGZvciBhbGwgY29udGFpbmVycyB3aXRoaW4gdGhlIHBvZDsgb25lIG9mIEFsd2F5c1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzZXJ2aWNlQWNjb3VudFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZGVwcmVjYXRlZDsgdXNlIHNlcnZpY2VBY2NvdW50TmFtZSBpbnN0ZWFkXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNlcnZpY2VBY2NvdW50TmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibmFtZSBvZiB0aGUgU2VydmljZUFjY291bnQgdG8gdXNlIHRvIHJ1biB0aGlzIHBvZDsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL2Rlc2lnbi9zZXJ2aWNlX2FjY291bnRzLm1kXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInRlcm1pbmF0aW9uR3JhY2VQZXJpb2RTZWNvbmRzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwib3B0aW9uYWwgZHVyYXRpb24gaW4gc2Vjb25kcyB0aGUgcG9kIG5lZWRzIHRvIHRlcm1pbmF0ZSBncmFjZWZ1bGx5OyBtYXkgYmUgZGVjcmVhc2VkIGluIGRlbGV0ZSByZXF1ZXN0OyB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyOyB0aGUgdmFsdWUgemVybyBpbmRpY2F0ZXMgZGVsZXRlIGltbWVkaWF0ZWx5OyBpZiB0aGlzIHZhbHVlIGlzIG5vdCBzZXRcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcIkxvbmdcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidm9sdW1lc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIHZvbHVtZXMgdGhhdCBjYW4gYmUgbW91bnRlZCBieSBjb250YWluZXJzIGJlbG9uZ2luZyB0byB0aGUgcG9kOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS92b2x1bWVzLm1kXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Wb2x1bWVcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Wb2x1bWVcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUG9kU3BlY1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19Qb2RTdGF0dXNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJjb25kaXRpb25zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImN1cnJlbnQgc2VydmljZSBzdGF0ZSBvZiBwb2Q7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL3BvZC1zdGF0ZXMubWQjcG9kLWNvbmRpdGlvbnNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1BvZENvbmRpdGlvblwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlBvZENvbmRpdGlvblwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImNvbnRhaW5lclN0YXR1c2VzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgY29udGFpbmVyIHN0YXR1c2VzOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9wb2Qtc3RhdGVzLm1kI2NvbnRhaW5lci1zdGF0dXNlc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfQ29udGFpbmVyU3RhdHVzXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQ29udGFpbmVyU3RhdHVzXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaG9zdElQXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBwb2QgaXMgYXNzaWduZWQ7IGVtcHR5IGlmIG5vdCB5ZXQgc2NoZWR1bGVkXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1lc3NhZ2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImh1bWFuIHJlYWRhYmxlIG1lc3NhZ2UgaW5kaWNhdGluZyBkZXRhaWxzIGFib3V0IHdoeSB0aGUgcG9kIGlzIGluIHRoaXMgY29uZGl0aW9uXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInBoYXNlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJjdXJyZW50IGNvbmRpdGlvbiBvZiB0aGUgcG9kOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9wb2Qtc3RhdGVzLm1kI3BvZC1waGFzZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwb2RJUFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiSVAgYWRkcmVzcyBhbGxvY2F0ZWQgdG8gdGhlIHBvZDsgcm91dGFibGUgYXQgbGVhc3Qgd2l0aGluIHRoZSBjbHVzdGVyOyBlbXB0eSBpZiBub3QgeWV0IGFsbG9jYXRlZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZWFzb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIihicmllZi1DYW1lbENhc2UpIHJlYXNvbiBpbmRpY2F0aW5nIGRldGFpbHMgYWJvdXQgd2h5IHRoZSBwb2QgaXMgaW4gdGhpcyBjb25kaXRpb25cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3RhcnRUaW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJSRkMgMzMzOSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBvYmplY3Qgd2FzIGFja25vd2xlZGdlZCBieSB0aGUgS3ViZWxldC4gIFRoaXMgaXMgYmVmb3JlIHRoZSBLdWJlbGV0IHB1bGxlZCB0aGUgY29udGFpbmVyIGltYWdlKHMpIGZvciB0aGUgcG9kLlwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUG9kU3RhdHVzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1BvZFRlbXBsYXRlU3BlY1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzcGVjXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1BvZFNwZWNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUG9kU3BlY1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUG9kVGVtcGxhdGVTcGVjXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1Byb2JlXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiZXhlY1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19FeGVjQWN0aW9uXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkV4ZWNBY3Rpb25cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaHR0cEdldFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19IVFRQR2V0QWN0aW9uXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhUVFBHZXRBY3Rpb25cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaW5pdGlhbERlbGF5U2Vjb25kc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImludGVnZXJcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm51bWJlciBvZiBzZWNvbmRzIGFmdGVyIHRoZSBjb250YWluZXIgaGFzIHN0YXJ0ZWQgYmVmb3JlIGxpdmVuZXNzIHByb2JlcyBhcmUgaW5pdGlhdGVkOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9wb2Qtc3RhdGVzLm1kI2NvbnRhaW5lci1wcm9iZXNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcIkxvbmdcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidGNwU29ja2V0XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1RDUFNvY2tldEFjdGlvblwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5UQ1BTb2NrZXRBY3Rpb25cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidGltZW91dFNlY29uZHNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJudW1iZXIgb2Ygc2Vjb25kcyBhZnRlciB3aGljaCBsaXZlbmVzcyBwcm9iZXMgdGltZW91dDsgZGVmYXVsdHMgdG8gMSBzZWNvbmQ7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL3BvZC1zdGF0ZXMubWQjY29udGFpbmVyLXByb2Jlc1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiTG9uZ1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUHJvYmVcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfUkJEVm9sdW1lU291cmNlXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiZnNUeXBlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJmaWxlIHN5c3RlbSB0eXBlIHRvIG1vdW50XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImltYWdlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyYWRvcyBpbWFnZSBuYW1lOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2V4YW1wbGVzL3JiZC9SRUFETUUubWQjaG93LXRvLXVzZS1pdFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJrZXlyaW5nXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJrZXlyaW5nIGlzIHRoZSBwYXRoIHRvIGtleSByaW5nIGZvciByYWRvcyB1c2VyOyBkZWZhdWx0IGlzIC9ldGMvY2VwaC9rZXlyaW5nOyBvcHRpb25hbDsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9leGFtcGxlcy9yYmQvUkVBRE1FLm1kI2hvdy10by11c2UtaXRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibW9uaXRvcnNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYSBjb2xsZWN0aW9uIG9mIENlcGggbW9uaXRvcnM7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZXhhbXBsZXMvcmJkL1JFQURNRS5tZCNob3ctdG8tdXNlLWl0XCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhIGNvbGxlY3Rpb24gb2YgQ2VwaCBtb25pdG9yczsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9leGFtcGxlcy9yYmQvUkVBRE1FLm1kI2hvdy10by11c2UtaXRcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwb29sXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyYWRvcyBwb29sIG5hbWU7IGRlZmF1bHQgaXMgcmJkOyBvcHRpb25hbDsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9leGFtcGxlcy9yYmQvUkVBRE1FLm1kI2hvdy10by11c2UtaXRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVhZE9ubHlcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyYmQgdm9sdW1lIHRvIGJlIG1vdW50ZWQgd2l0aCByZWFkLW9ubHkgcGVybWlzc2lvbnM7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZXhhbXBsZXMvcmJkL1JFQURNRS5tZCNob3ctdG8tdXNlLWl0XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNlY3JldFJlZlwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Mb2NhbE9iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Mb2NhbE9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ1c2VyXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyYWRvcyB1c2VyIG5hbWU7IGRlZmF1bHQgaXMgYWRtaW47IG9wdGlvbmFsOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2V4YW1wbGVzL3JiZC9SRUFETUUubWQjaG93LXRvLXVzZS1pdFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUkJEVm9sdW1lU291cmNlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1JlcGxpY2F0aW9uQ29udHJvbGxlclwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJSZXBsaWNhdGlvbkNvbnRyb2xsZXJcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3BlY1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19SZXBsaWNhdGlvbkNvbnRyb2xsZXJTcGVjXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJlcGxpY2F0aW9uQ29udHJvbGxlclNwZWNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3RhdHVzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1JlcGxpY2F0aW9uQ29udHJvbGxlclN0YXR1c1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5SZXBsaWNhdGlvbkNvbnRyb2xsZXJTdGF0dXNcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJlcGxpY2F0aW9uQ29udHJvbGxlclwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19SZXBsaWNhdGlvbkNvbnRyb2xsZXJMaXN0XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiByZXBsaWNhdGlvbiBjb250cm9sbGVyczsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvcmVwbGljYXRpb24tY29udHJvbGxlci5tZFwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUmVwbGljYXRpb25Db250cm9sbGVyXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUmVwbGljYXRpb25Db250cm9sbGVyXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlJlcGxpY2F0aW9uQ29udHJvbGxlckxpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUmVwbGljYXRpb25Db250cm9sbGVyTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZVwiLFxyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZUxpc3RcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1JlcGxpY2F0aW9uQ29udHJvbGxlclNwZWNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJyZXBsaWNhc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImludGVnZXJcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm51bWJlciBvZiByZXBsaWNhcyBkZXNpcmVkOyBkZWZhdWx0cyB0byAxOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9yZXBsaWNhdGlvbi1jb250cm9sbGVyLm1kI3doYXQtaXMtYS1yZXBsaWNhdGlvbi1jb250cm9sbGVyXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNlbGVjdG9yXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsYWJlbCBrZXlzIGFuZCB2YWx1ZXMgdGhhdCBtdXN0IG1hdGNoIGluIG9yZGVyIHRvIGJlIGNvbnRyb2xsZWQgYnkgdGhpcyByZXBsaWNhdGlvbiBjb250cm9sbGVyXCIsXHJcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsYWJlbCBrZXlzIGFuZCB2YWx1ZXMgdGhhdCBtdXN0IG1hdGNoIGluIG9yZGVyIHRvIGJlIGNvbnRyb2xsZWQgYnkgdGhpcyByZXBsaWNhdGlvbiBjb250cm9sbGVyXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImphdmEudXRpbC5NYXBcXHUwMDNjU3RyaW5nLFN0cmluZ1xcdTAwM2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidGVtcGxhdGVcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUG9kVGVtcGxhdGVTcGVjXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlBvZFRlbXBsYXRlU3BlY1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUmVwbGljYXRpb25Db250cm9sbGVyU3BlY1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19SZXBsaWNhdGlvbkNvbnRyb2xsZXJTdGF0dXNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJvYnNlcnZlZEdlbmVyYXRpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyZWZsZWN0cyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgbW9zdCByZWNlbnRseSBvYnNlcnZlZCByZXBsaWNhdGlvbiBjb250cm9sbGVyXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJMb25nXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlcGxpY2FzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibW9zdCByZWNlbnRseSBvYmVydmVkIG51bWJlciBvZiByZXBsaWNhczsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvcmVwbGljYXRpb24tY29udHJvbGxlci5tZCN3aGF0LWlzLWEtcmVwbGljYXRpb24tY29udHJvbGxlclwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUmVwbGljYXRpb25Db250cm9sbGVyU3RhdHVzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1Jlc291cmNlUXVvdGFcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiUmVzb3VyY2VRdW90YVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzcGVjXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1Jlc291cmNlUXVvdGFTcGVjXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJlc291cmNlUXVvdGFTcGVjXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInN0YXR1c1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19SZXNvdXJjZVF1b3RhU3RhdHVzXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJlc291cmNlUXVvdGFTdGF0dXNcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJlc291cmNlUXVvdGFcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfUmVzb3VyY2VRdW90YUxpc3RcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJpdGVtcyBpcyBhIGxpc3Qgb2YgUmVzb3VyY2VRdW90YSBvYmplY3RzOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvZGVzaWduL2FkbWlzc2lvbl9jb250cm9sX3Jlc291cmNlX3F1b3RhLm1kI2FkbWlzc2lvbmNvbnRyb2wtcGx1Z2luLXJlc291cmNlcXVvdGFcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1Jlc291cmNlUXVvdGFcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5SZXNvdXJjZVF1b3RhXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlJlc291cmNlUXVvdGFMaXN0XCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTGlzdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTGlzdE1ldGFcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJlc291cmNlUXVvdGFMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlXCIsXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlTGlzdFwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfUmVzb3VyY2VRdW90YVNwZWNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJoYXJkXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJoYXJkIGlzIHRoZSBzZXQgb2YgZGVzaXJlZCBoYXJkIGxpbWl0cyBmb3IgZWFjaCBuYW1lZCByZXNvdXJjZTsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL2Rlc2lnbi9hZG1pc3Npb25fY29udHJvbF9yZXNvdXJjZV9xdW90YS5tZCNhZG1pc3Npb25jb250cm9sLXBsdWdpbi1yZXNvdXJjZXF1b3RhXCIsXHJcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19yZXNvdXJjZV9RdWFudGl0eVwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlF1YW50aXR5XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImphdmEudXRpbC5NYXBcXHUwMDNjU3RyaW5nLGlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUXVhbnRpdHlcXHUwMDNlXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5SZXNvdXJjZVF1b3RhU3BlY1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19SZXNvdXJjZVF1b3RhU3RhdHVzXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiaGFyZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaGFyZCBpcyB0aGUgc2V0IG9mIGVuZm9yY2VkIGhhcmQgbGltaXRzIGZvciBlYWNoIG5hbWVkIHJlc291cmNlOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvZGVzaWduL2FkbWlzc2lvbl9jb250cm9sX3Jlc291cmNlX3F1b3RhLm1kI2FkbWlzc2lvbmNvbnRyb2wtcGx1Z2luLXJlc291cmNlcXVvdGFcIixcclxuICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX3Jlc291cmNlX1F1YW50aXR5XCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUXVhbnRpdHlcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiamF2YS51dGlsLk1hcFxcdTAwM2NTdHJpbmcsaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5RdWFudGl0eVxcdTAwM2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidXNlZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidXNlZCBpcyB0aGUgY3VycmVudCBvYnNlcnZlZCB0b3RhbCB1c2FnZSBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIG5hbWVzcGFjZVwiLFxyXG4gICAgICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfcmVzb3VyY2VfUXVhbnRpdHlcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5RdWFudGl0eVwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJqYXZhLnV0aWwuTWFwXFx1MDAzY1N0cmluZyxpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlF1YW50aXR5XFx1MDAzZVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUmVzb3VyY2VRdW90YVN0YXR1c1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19SZXNvdXJjZVJlcXVpcmVtZW50c1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImxpbWl0c1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiTWF4aW11bSBhbW91bnQgb2YgY29tcHV0ZSByZXNvdXJjZXMgYWxsb3dlZDsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL2Rlc2lnbi9yZXNvdXJjZXMubWQjcmVzb3VyY2Utc3BlY2lmaWNhdGlvbnNcIixcclxuICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX3Jlc291cmNlX1F1YW50aXR5XCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUXVhbnRpdHlcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiamF2YS51dGlsLk1hcFxcdTAwM2NTdHJpbmcsaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5RdWFudGl0eVxcdTAwM2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVxdWVzdHNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIk1pbmltdW0gYW1vdW50IG9mIHJlc291cmNlcyByZXF1ZXN0ZWQ7IGlmIFJlcXVlc3RzIGlzIG9taXR0ZWQgZm9yIGEgY29udGFpbmVyXCIsXHJcbiAgICAgICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19yZXNvdXJjZV9RdWFudGl0eVwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlF1YW50aXR5XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImphdmEudXRpbC5NYXBcXHUwMDNjU3RyaW5nLGlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUXVhbnRpdHlcXHUwMDNlXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5SZXNvdXJjZVJlcXVpcmVtZW50c1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19SdW5Bc1VzZXJTdHJhdGVneU9wdGlvbnNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJ0eXBlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzdHJhdGVneSB1c2VkIHRvIGdlbmVyYXRlIFJ1bkFzVXNlclwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ1aWRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgdWlkIHRvIGFsd2F5cyBydW4gYXM7IHJlcXVpcmVkIGZvciBNdXN0UnVuQXNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcIkxvbmdcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidWlkUmFuZ2VNYXhcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJtYXggdmFsdWUgZm9yIHJhbmdlIGJhc2VkIGFsbG9jYXRvcnNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcIkxvbmdcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidWlkUmFuZ2VNaW5cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJtaW4gdmFsdWUgZm9yIHJhbmdlIGJhc2VkIGFsbG9jYXRvcnNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcIkxvbmdcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJ1bkFzVXNlclN0cmF0ZWd5T3B0aW9uc1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19TRUxpbnV4Q29udGV4dFN0cmF0ZWd5T3B0aW9uc1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcInNlTGludXhPcHRpb25zXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1NFTGludXhPcHRpb25zXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlNFTGludXhPcHRpb25zXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInR5cGVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInN0cmF0ZWd5IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIFNFTGludXggY29udGV4dFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU0VMaW51eENvbnRleHRTdHJhdGVneU9wdGlvbnNcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfU0VMaW51eE9wdGlvbnNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJsZXZlbFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIGxldmVsIGxhYmVsIHRvIGFwcGx5IHRvIHRoZSBjb250YWluZXI7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL2xhYmVscy5tZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyb2xlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgcm9sZSBsYWJlbCB0byBhcHBseSB0byB0aGUgY29udGFpbmVyOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9sYWJlbHMubWRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidHlwZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIHR5cGUgbGFiZWwgdG8gYXBwbHkgdG8gdGhlIGNvbnRhaW5lcjsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvbGFiZWxzLm1kXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInVzZXJcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSB1c2VyIGxhYmVsIHRvIGFwcGx5IHRvIHRoZSBjb250YWluZXI7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL2xhYmVscy5tZFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU0VMaW51eE9wdGlvbnNcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfU2VjcmV0XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZGF0YSBjb250YWlucyB0aGUgc2VjcmV0IGRhdGEuICBFYWNoIGtleSBtdXN0IGJlIGEgdmFsaWQgRE5TX1NVQkRPTUFJTiBvciBsZWFkaW5nIGRvdCBmb2xsb3dlZCBieSB2YWxpZCBETlNfU1VCRE9NQUlOLiAgRWFjaCB2YWx1ZSBtdXN0IGJlIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIGFzIGRlc2NyaWJlZCBpbiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OCNzZWN0aW9uLTRcIixcclxuICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImRhdGEgY29udGFpbnMgdGhlIHNlY3JldCBkYXRhLiAgRWFjaCBrZXkgbXVzdCBiZSBhIHZhbGlkIEROU19TVUJET01BSU4gb3IgbGVhZGluZyBkb3QgZm9sbG93ZWQgYnkgdmFsaWQgRE5TX1NVQkRPTUFJTi4gIEVhY2ggdmFsdWUgbXVzdCBiZSBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyBhcyBkZXNjcmliZWQgaW4gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgjc2VjdGlvbi00XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImphdmEudXRpbC5NYXBcXHUwMDNjU3RyaW5nLFN0cmluZ1xcdTAwM2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlNlY3JldFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0eXBlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0eXBlIGZhY2lsaXRhdGVzIHByb2dyYW1tYXRpYyBoYW5kbGluZyBvZiBzZWNyZXQgZGF0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU2VjcmV0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1NlY3JldExpc3RcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJpdGVtcyBpcyBhIGxpc3Qgb2Ygc2VjcmV0IG9iamVjdHM7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL3NlY3JldHMubWRcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1NlY3JldFwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlNlY3JldFwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJTZWNyZXRMaXN0XCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTGlzdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTGlzdE1ldGFcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlNlY3JldExpc3RcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VcIixcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VMaXN0XCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19TZWNyZXRWb2x1bWVTb3VyY2VcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJzZWNyZXROYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzZWNyZXROYW1lIGlzIHRoZSBuYW1lIG9mIGEgc2VjcmV0IGluIHRoZSBwb2QncyBuYW1lc3BhY2U7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL3ZvbHVtZXMubWQjc2VjcmV0c1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU2VjcmV0Vm9sdW1lU291cmNlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1NlY3VyaXR5Q29udGV4dFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImNhcGFiaWxpdGllc1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19DYXBhYmlsaXRpZXNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQ2FwYWJpbGl0aWVzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInByaXZpbGVnZWRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJydW4gdGhlIGNvbnRhaW5lciBpbiBwcml2aWxlZ2VkIG1vZGU7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy9kZXNpZ24vc2VjdXJpdHlfY29udGV4dC5tZCNzZWN1cml0eS1jb250ZXh0XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJ1bkFzTm9uUm9vdFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImluZGljYXRlcyB0aGUgY29udGFpbmVyIG11c3QgYmUgcnVuIGFzIGEgbm9uLXJvb3QgdXNlciBlaXRoZXIgYnkgc3BlY2lmeWluZyB0aGUgcnVuQXNVc2VyIG9yIGluIHRoZSBpbWFnZSBzcGVjaWZpY2F0aW9uXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJ1bkFzVXNlclwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImludGVnZXJcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSB1c2VyIGlkIHRoYXQgcnVucyB0aGUgZmlyc3QgcHJvY2VzcyBpbiB0aGUgY29udGFpbmVyOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvZGVzaWduL3NlY3VyaXR5X2NvbnRleHQubWQjc2VjdXJpdHktY29udGV4dFwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiTG9uZ1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzZUxpbnV4T3B0aW9uc1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19TRUxpbnV4T3B0aW9uc1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5TRUxpbnV4T3B0aW9uc1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU2VjdXJpdHlDb250ZXh0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1NlY3VyaXR5Q29udGV4dENvbnN0cmFpbnRzXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYWxsb3dIb3N0RGlyVm9sdW1lUGx1Z2luXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYWxsb3cgdGhlIHVzZSBvZiB0aGUgaG9zdCBkaXIgdm9sdW1lIHBsdWdpblwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJhbGxvd0hvc3ROZXR3b3JrXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYWxsb3cgdGhlIHVzZSBvZiB0aGUgaG9zdE5ldHdvcmsgaW4gdGhlIHBvZCBzcGVjXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImFsbG93SG9zdFBvcnRzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYWxsb3cgdGhlIHVzZSBvZiB0aGUgaG9zdCBwb3J0cyBpbiB0aGUgY29udGFpbmVyc1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJhbGxvd1ByaXZpbGVnZWRDb250YWluZXJcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhbGxvdyBjb250YWluZXJzIHRvIHJ1biBhcyBwcml2aWxlZ2VkXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImFsbG93ZWRDYXBhYmlsaXRpZXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiY2FwYWJpbGl0aWVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgYWRkZWRcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImNhcGFiaWxpdGllcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIGFkZGVkXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZ3JvdXBzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImdyb3VwcyBhbGxvd2VkIHRvIHVzZSB0aGlzIFNlY3VyaXR5Q29udGV4dENvbnN0cmFpbnRzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJncm91cHMgYWxsb3dlZCB0byB1c2UgdGhpcyBTZWN1cml0eUNvbnRleHRDb25zdHJhaW50c1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJTZWN1cml0eUNvbnRleHRDb25zdHJhaW50c1wiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJydW5Bc1VzZXJcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUnVuQXNVc2VyU3RyYXRlZ3lPcHRpb25zXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJ1bkFzVXNlclN0cmF0ZWd5T3B0aW9uc1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzZUxpbnV4Q29udGV4dFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19TRUxpbnV4Q29udGV4dFN0cmF0ZWd5T3B0aW9uc1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5TRUxpbnV4Q29udGV4dFN0cmF0ZWd5T3B0aW9uc1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ1c2Vyc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ1c2VycyBhbGxvd2VkIHRvIHVzZSB0aGlzIFNlY3VyaXR5Q29udGV4dENvbnN0cmFpbnRzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ1c2VycyBhbGxvd2VkIHRvIHVzZSB0aGlzIFNlY3VyaXR5Q29udGV4dENvbnN0cmFpbnRzXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlNlY3VyaXR5Q29udGV4dENvbnN0cmFpbnRzXCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1NlY3VyaXR5Q29udGV4dENvbnN0cmFpbnRzTGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfU2VjdXJpdHlDb250ZXh0Q29uc3RyYWludHNcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5TZWN1cml0eUNvbnRleHRDb25zdHJhaW50c1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJTZWN1cml0eUNvbnRleHRDb25zdHJhaW50c0xpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU2VjdXJpdHlDb250ZXh0Q29uc3RyYWludHNMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlXCIsXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlTGlzdFwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfU2VydmljZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJTZXJ2aWNlXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RNZXRhXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNwZWNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfU2VydmljZVNwZWNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU2VydmljZVNwZWNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3RhdHVzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1NlcnZpY2VTdGF0dXNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU2VydmljZVN0YXR1c1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU2VydmljZVwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19TZXJ2aWNlQWNjb3VudFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImltYWdlUHVsbFNlY3JldHNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiByZWZlcmVuY2VzIHRvIHNlY3JldHMgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIGF2YWlsYWJsZSBmb3IgcHVsbGluZyBjb250YWluZXIgaW1hZ2VzOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9zZWNyZXRzLm1kI21hbnVhbGx5LXNwZWNpZnlpbmctYW4taW1hZ2VwdWxsc2VjcmV0XCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Mb2NhbE9iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxvY2FsT2JqZWN0UmVmZXJlbmNlXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlNlcnZpY2VBY2NvdW50XCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RNZXRhXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNlY3JldHNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBzZWNyZXRzIHRoYXQgY2FuIGJlIHVzZWQgYnkgcG9kcyBydW5uaW5nIGFzIHRoaXMgc2VydmljZSBhY2NvdW50OyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvdXNlci1ndWlkZS9zZWNyZXRzLm1kXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RSZWZlcmVuY2VcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RSZWZlcmVuY2VcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU2VydmljZUFjY291bnRcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfU2VydmljZUFjY291bnRMaXN0XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBTZXJ2aWNlQWNjb3VudHM7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy9kZXNpZ24vc2VydmljZV9hY2NvdW50cy5tZCNzZXJ2aWNlLWFjY291bnRzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19TZXJ2aWNlQWNjb3VudFwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlNlcnZpY2VBY2NvdW50XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlNlcnZpY2VBY2NvdW50TGlzdFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xpc3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxpc3RNZXRhXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5TZXJ2aWNlQWNjb3VudExpc3RcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VcIixcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VMaXN0XCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19TZXJ2aWNlTGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2Ygc2VydmljZXNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1NlcnZpY2VcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5TZXJ2aWNlXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlNlcnZpY2VMaXN0XCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTGlzdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTGlzdE1ldGFcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlNlcnZpY2VMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlXCIsXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlTGlzdFwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfU2VydmljZVBvcnRcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJuYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgbmFtZSBvZiB0aGlzIHBvcnQ7IG9wdGlvbmFsIGlmIG9ubHkgb25lIHBvcnQgaXMgZGVmaW5lZFwiLFxyXG4gICAgICAgICAgICBcIm1heExlbmd0aFwiOiA2MyxcclxuICAgICAgICAgICAgXCJwYXR0ZXJuXCI6IFwiXlthLXowLTldKFstYS16MC05XSpbYS16MC05XSk/JFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJub2RlUG9ydFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImludGVnZXJcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBwb3J0IG9uIGVhY2ggbm9kZSBvbiB3aGljaCB0aGlzIHNlcnZpY2UgaXMgZXhwb3NlZCB3aGVuIHR5cGU9Tm9kZVBvcnQgb3IgTG9hZEJhbGFuY2VyOyB1c3VhbGx5IGFzc2lnbmVkIGJ5IHRoZSBzeXN0ZW07IGlmIHNwZWNpZmllZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwb3J0XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIHBvcnQgbnVtYmVyIHRoYXQgaXMgZXhwb3NlZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwcm90b2NvbFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIHByb3RvY29sIHVzZWQgYnkgdGhpcyBwb3J0OyBtdXN0IGJlIFVEUCBvciBUQ1A7IFRDUCBpZiB1bnNwZWNpZmllZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0YXJnZXRQb3J0XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX3V0aWxfSW50T3JTdHJpbmdcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSW50T3JTdHJpbmdcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlNlcnZpY2VQb3J0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1NlcnZpY2VTcGVjXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiY2x1c3RlcklQXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJJUCBhZGRyZXNzIG9mIHRoZSBzZXJ2aWNlOyB1c3VhbGx5IGFzc2lnbmVkIGJ5IHRoZSBzeXN0ZW07IGlmIHNwZWNpZmllZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJkZXByZWNhdGVkUHVibGljSVBzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImRlcHJlY2F0ZWQuIGV4dGVybmFsbHkgdmlzaWJsZSBJUHMgKGUuZy4gbG9hZCBiYWxhbmNlcnMpIHRoYXQgc2hvdWxkIGJlIHByb3hpZWQgdG8gdGhpcyBzZXJ2aWNlXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJkZXByZWNhdGVkLiBleHRlcm5hbGx5IHZpc2libGUgSVBzIChlLmcuIGxvYWQgYmFsYW5jZXJzKSB0aGF0IHNob3VsZCBiZSBwcm94aWVkIHRvIHRoaXMgc2VydmljZVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInBvcnRhbElQXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJkZXByZWNhdGVkXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInBvcnRzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInBvcnRzIGV4cG9zZWQgYnkgdGhlIHNlcnZpY2U7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy91c2VyLWd1aWRlL3NlcnZpY2VzLm1kI3ZpcnR1YWwtaXBzLWFuZC1zZXJ2aWNlLXByb3hpZXNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1NlcnZpY2VQb3J0XCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU2VydmljZVBvcnRcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzZWxlY3RvclwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGFiZWwga2V5cyBhbmQgdmFsdWVzIHRoYXQgbXVzdCBtYXRjaCBpbiBvcmRlciB0byByZWNlaXZlIHRyYWZmaWMgZm9yIHRoaXMgc2VydmljZTsgaWYgZW1wdHlcIixcclxuICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxhYmVsIGtleXMgYW5kIHZhbHVlcyB0aGF0IG11c3QgbWF0Y2ggaW4gb3JkZXIgdG8gcmVjZWl2ZSB0cmFmZmljIGZvciB0aGlzIHNlcnZpY2U7IGlmIGVtcHR5XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImphdmEudXRpbC5NYXBcXHUwMDNjU3RyaW5nLFN0cmluZ1xcdTAwM2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic2Vzc2lvbkFmZmluaXR5XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJlbmFibGUgY2xpZW50IElQIGJhc2VkIHNlc3Npb24gYWZmaW5pdHk7IG11c3QgYmUgQ2xpZW50SVAgb3IgTm9uZTsgZGVmYXVsdHMgdG8gTm9uZTsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvc2VydmljZXMubWQjdmlydHVhbC1pcHMtYW5kLXNlcnZpY2UtcHJveGllc1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0eXBlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0eXBlIG9mIHRoaXMgc2VydmljZTsgbXVzdCBiZSBDbHVzdGVySVBcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlNlcnZpY2VTcGVjXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1NlcnZpY2VTdGF0dXNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJsb2FkQmFsYW5jZXJcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTG9hZEJhbGFuY2VyU3RhdHVzXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxvYWRCYWxhbmNlclN0YXR1c1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU2VydmljZVN0YXR1c1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19TdGF0dXNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJjb2RlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwic3VnZ2VzdGVkIEhUVFAgcmV0dXJuIGNvZGUgZm9yIHRoaXMgc3RhdHVzOyAwIGlmIG5vdCBzZXRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZGV0YWlsc1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19TdGF0dXNEZXRhaWxzXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlN0YXR1c0RldGFpbHNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlN0YXR1c1wiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1lc3NhZ2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBzdGF0dXMgb2YgdGhpcyBvcGVyYXRpb25cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTGlzdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTGlzdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVhc29uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJtYWNoaW5lLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGlzIG9wZXJhdGlvbiBpcyBpbiB0aGUgJ0ZhaWx1cmUnIHN0YXR1czsgaWYgdGhpcyB2YWx1ZSBpcyBlbXB0eSB0aGVyZSBpcyBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGU7IGEgcmVhc29uIGNsYXJpZmllcyBhbiBIVFRQIHN0YXR1cyBjb2RlIGJ1dCBkb2VzIG5vdCBvdmVycmlkZSBpdFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzdGF0dXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uOyBlaXRoZXIgU3VjY2Vzc1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU3RhdHVzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1N0YXR1c0NhdXNlXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiZmllbGRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImZpZWxkIG9mIHRoZSByZXNvdXJjZSB0aGF0IGhhcyBjYXVzZWQgdGhpcyBlcnJvclwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXNzYWdlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yOyB0aGlzIGZpZWxkIG1heSBiZSBwcmVzZW50ZWQgYXMtaXMgdG8gYSByZWFkZXJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVhc29uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJtYWNoaW5lLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3I7IGlmIHRoaXMgdmFsdWUgaXMgZW1wdHkgdGhlcmUgaXMgbm8gaW5mb3JtYXRpb24gYXZhaWxhYmxlXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5TdGF0dXNDYXVzZVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19TdGF0dXNEZXRhaWxzXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiY2F1c2VzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBDYXVzZXMgYXJyYXkgaW5jbHVkZXMgbW9yZSBkZXRhaWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgU3RhdHVzUmVhc29uIGZhaWx1cmU7IG5vdCBhbGwgU3RhdHVzUmVhc29ucyBtYXkgcHJvdmlkZSBkZXRhaWxlZCBjYXVzZXNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1N0YXR1c0NhdXNlXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU3RhdHVzQ2F1c2VcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUga2luZCBhdHRyaWJ1dGUgb2YgdGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIFN0YXR1c1JlYXNvbjsgb24gc29tZSBvcGVyYXRpb25zIG1heSBkaWZmZXIgZnJvbSB0aGUgcmVxdWVzdGVkIHJlc291cmNlIEtpbmQ7IHNlZSBodHRwOi8vcmVsZWFzZXMuazhzLmlvL0hFQUQvZG9jcy9kZXZlbC9hcGktY29udmVudGlvbnMubWQjdHlwZXMta2luZHNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIG5hbWUgYXR0cmlidXRlIG9mIHRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXR1cyBTdGF0dXNSZWFzb24gKHdoZW4gdGhlcmUgaXMgYSBzaW5nbGUgbmFtZSB3aGljaCBjYW4gYmUgZGVzY3JpYmVkKVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZXRyeUFmdGVyU2Vjb25kc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImludGVnZXJcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiZWZvcmUgdGhlIGNsaWVudCBzaG91bGQgYXR0ZW1wdCB0byByZXRyeSB0aGlzIG9wZXJhdGlvblwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU3RhdHVzRGV0YWlsc1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19UQ1BTb2NrZXRBY3Rpb25cIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJwb3J0XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX3V0aWxfSW50T3JTdHJpbmdcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSW50T3JTdHJpbmdcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlRDUFNvY2tldEFjdGlvblwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19UeXBlTWV0YVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInZlcnNpb24gb2YgdGhlIHNjaGVtYSB0aGUgb2JqZWN0IHNob3VsZCBoYXZlOyBzZWUgaHR0cDovL3JlbGVhc2VzLms4cy5pby9IRUFEL2RvY3MvZGV2ZWwvYXBpLWNvbnZlbnRpb25zLm1kI3Jlc291cmNlc1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJraW5kIG9mIG9iamVjdFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuVHlwZU1ldGFcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfVm9sdW1lXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXdzRWxhc3RpY0Jsb2NrU3RvcmVcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfQVdTRWxhc3RpY0Jsb2NrU3RvcmVWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQVdTRWxhc3RpY0Jsb2NrU3RvcmVWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiY2VwaGZzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0NlcGhGU1ZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5DZXBoRlNWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZW1wdHlEaXJcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfRW1wdHlEaXJWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuRW1wdHlEaXJWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZ2NlUGVyc2lzdGVudERpc2tcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfR0NFUGVyc2lzdGVudERpc2tWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuR0NFUGVyc2lzdGVudERpc2tWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZ2l0UmVwb1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19HaXRSZXBvVm9sdW1lU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkdpdFJlcG9Wb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZ2x1c3RlcmZzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0dsdXN0ZXJmc1ZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5HbHVzdGVyZnNWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaG9zdFBhdGhcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfSG9zdFBhdGhWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSG9zdFBhdGhWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaXNjc2lcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfSVNDU0lWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSVNDU0lWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTWV0YWRhdGFWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTWV0YWRhdGFWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidm9sdW1lIG5hbWU7IG11c3QgYmUgYSBETlNfTEFCRUwgYW5kIHVuaXF1ZSB3aXRoaW4gdGhlIHBvZDsgc2VlIGh0dHA6Ly9yZWxlYXNlcy5rOHMuaW8vSEVBRC9kb2NzL3VzZXItZ3VpZGUvaWRlbnRpZmllcnMubWQjbmFtZXNcIixcclxuICAgICAgICAgICAgXCJtYXhMZW5ndGhcIjogNjMsXHJcbiAgICAgICAgICAgIFwicGF0dGVyblwiOiBcIl5bYS16MC05XShbLWEtejAtOV0qW2EtejAtOV0pPyRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibmZzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX05GU1ZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5ORlNWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicGVyc2lzdGVudFZvbHVtZUNsYWltXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1BlcnNpc3RlbnRWb2x1bWVDbGFpbVZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1Wb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmJkXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1JCRFZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5SQkRWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic2VjcmV0XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1NlY3JldFZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5TZWNyZXRWb2x1bWVTb3VyY2VcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlZvbHVtZVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19Wb2x1bWVNb3VudFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcIm1vdW50UGF0aFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicGF0aCB3aXRoaW4gdGhlIGNvbnRhaW5lciBhdCB3aGljaCB0aGUgdm9sdW1lIHNob3VsZCBiZSBtb3VudGVkXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm5hbWUgb2YgdGhlIHZvbHVtZSB0byBtb3VudFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZWFkT25seVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm1vdW50ZWQgcmVhZC1vbmx5IGlmIHRydWVcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlZvbHVtZU1vdW50XCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX1ZvbHVtZVNvdXJjZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImF3c0VsYXN0aWNCbG9ja1N0b3JlXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0FXU0VsYXN0aWNCbG9ja1N0b3JlVm9sdW1lU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkFXU0VsYXN0aWNCbG9ja1N0b3JlVm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImNlcGhmc1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19DZXBoRlNWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQ2VwaEZTVm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImVtcHR5RGlyXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0VtcHR5RGlyVm9sdW1lU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkVtcHR5RGlyVm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImdjZVBlcnNpc3RlbnREaXNrXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0dDRVBlcnNpc3RlbnREaXNrVm9sdW1lU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkdDRVBlcnNpc3RlbnREaXNrVm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImdpdFJlcG9cIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfR2l0UmVwb1ZvbHVtZVNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5HaXRSZXBvVm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImdsdXN0ZXJmc1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19HbHVzdGVyZnNWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuR2x1c3RlcmZzVm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImhvc3RQYXRoXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0hvc3RQYXRoVm9sdW1lU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhvc3RQYXRoVm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImlzY3NpXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0lTQ1NJVm9sdW1lU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLklTQ1NJVm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX01ldGFkYXRhVm9sdW1lU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk1ldGFkYXRhVm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm5mc1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19ORlNWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTkZTVm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInBlcnNpc3RlbnRWb2x1bWVDbGFpbVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1Wb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUGVyc2lzdGVudFZvbHVtZUNsYWltVm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJiZFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19SQkRWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUkJEVm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNlY3JldFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19TZWNyZXRWb2x1bWVTb3VyY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU2VjcmV0Vm9sdW1lU291cmNlXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Wb2x1bWVTb3VyY2VcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfY29uZmlnX0F1dGhJbmZvXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiY2xpZW50LWNlcnRpZmljYXRlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiY2xpZW50LWNlcnRpZmljYXRlLWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJjbGllbnQta2V5XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiY2xpZW50LWtleS1kYXRhXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZXh0ZW5zaW9uc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX2NvbmZpZ19OYW1lZEV4dGVuc2lvblwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk5hbWVkRXh0ZW5zaW9uXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicGFzc3dvcmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0b2tlblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInVzZXJuYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkF1dGhJbmZvXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX2NvbmZpZ19DbHVzdGVyXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpLXZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJjZXJ0aWZpY2F0ZS1hdXRob3JpdHlcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJjZXJ0aWZpY2F0ZS1hdXRob3JpdHktZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImV4dGVuc2lvbnNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19jb25maWdfTmFtZWRFeHRlbnNpb25cIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5OYW1lZEV4dGVuc2lvblwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImluc2VjdXJlLXNraXAtdGxzLXZlcmlmeVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzZXJ2ZXJcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQ2x1c3RlclwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19jb25maWdfQ29uZmlnXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImNsdXN0ZXJzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfY29uZmlnX05hbWVkQ2x1c3RlclwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk5hbWVkQ2x1c3RlclwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImNvbnRleHRzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfY29uZmlnX05hbWVkQ29udGV4dFwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk5hbWVkQ29udGV4dFwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImN1cnJlbnQtY29udGV4dFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImV4dGVuc2lvbnNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19jb25maWdfTmFtZWRFeHRlbnNpb25cIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5OYW1lZEV4dGVuc2lvblwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwcmVmZXJlbmNlc1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19jb25maWdfUHJlZmVyZW5jZXNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUHJlZmVyZW5jZXNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidXNlcnNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19jb25maWdfTmFtZWRBdXRoSW5mb1wiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk5hbWVkQXV0aEluZm9cIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQ29uZmlnXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX2NvbmZpZ19Db250ZXh0XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiY2x1c3RlclwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImV4dGVuc2lvbnNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19jb25maWdfTmFtZWRFeHRlbnNpb25cIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5OYW1lZEV4dGVuc2lvblwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm5hbWVzcGFjZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInVzZXJcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQ29udGV4dFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19jb25maWdfTmFtZWRBdXRoSW5mb1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcIm5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ1c2VyXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX2NvbmZpZ19BdXRoSW5mb1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5BdXRoSW5mb1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTmFtZWRBdXRoSW5mb1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19jb25maWdfTmFtZWRDbHVzdGVyXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiY2x1c3RlclwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19jb25maWdfQ2x1c3RlclwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5DbHVzdGVyXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTmFtZWRDbHVzdGVyXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX2NvbmZpZ19OYW1lZENvbnRleHRcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJjb250ZXh0XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX2NvbmZpZ19Db250ZXh0XCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkNvbnRleHRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5OYW1lZENvbnRleHRcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfY29uZmlnX05hbWVkRXh0ZW5zaW9uXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiZXh0ZW5zaW9uXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX3J1bnRpbWVfUmF3RXh0ZW5zaW9uXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTmFtZWRFeHRlbnNpb25cIlxyXG4gICAgICB9LFxyXG4gICAgICBcImt1YmVybmV0ZXNfY29uZmlnX1ByZWZlcmVuY2VzXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiY29sb3JzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImV4dGVuc2lvbnNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19jb25maWdfTmFtZWRFeHRlbnNpb25cIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5OYW1lZEV4dGVuc2lvblwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5QcmVmZXJlbmNlc1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc19yZXNvdXJjZV9RdWFudGl0eVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcIkFtb3VudFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvc3BldGVyX2luZl9EZWNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5EZWNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiRm9ybWF0XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlF1YW50aXR5XCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX3J1bnRpbWVfUmF3RXh0ZW5zaW9uXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiUmF3SlNPTlwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwia3ViZXJuZXRlc191dGlsX0ludE9yU3RyaW5nXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiSW50VmFsXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIktpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiU3RyVmFsXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkludE9yU3RyaW5nXCJcclxuICAgICAgfSxcclxuICAgICAgXCJrdWJlcm5ldGVzX3dhdGNoX1dhdGNoRXZlbnRcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJvYmplY3RcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfcnVudGltZV9SYXdFeHRlbnNpb25cIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidHlwZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIHR5cGUgb2Ygd2F0Y2ggZXZlbnQ7IG1heSBiZSBBRERFRFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuV2F0Y2hFdmVudFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYXV0aG9yaXphdGlvbl9BdXRob3JpemF0aW9uQXR0cmlidXRlc1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImNvbnRlbnRcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfcnVudGltZV9SYXdFeHRlbnNpb25cIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibmFtZXNwYWNlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJuYW1lc3BhY2Ugb2YgdGhlIGFjdGlvbiBiZWluZyByZXF1ZXN0ZWRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVzb3VyY2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm9uZSBvZiB0aGUgZXhpc3RpbmcgcmVzb3VyY2UgdHlwZXNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVzb3VyY2VOYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJuYW1lIG9mIHRoZSByZXNvdXJjZSBiZWluZyByZXF1ZXN0ZWQgZm9yIGEgZ2V0IG9yIGRlbGV0ZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ2ZXJiXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJvbmUgb2YgZ2V0XCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkF1dGhvcml6YXRpb25BdHRyaWJ1dGVzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19hdXRob3JpemF0aW9uX0NsdXN0ZXJQb2xpY3lcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiQ2x1c3RlclBvbGljeVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImxhc3RNb2RpZmllZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGFzdCB0aW1lIGFueSBwYXJ0IG9mIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RNZXRhXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJvbGVzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFsbCB0aGUgcm9sZXMgaGVsZCBieSB0aGlzIHBvbGljeVwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2F1dGhvcml6YXRpb25fTmFtZWRDbHVzdGVyUm9sZVwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuTmFtZWRDbHVzdGVyUm9sZVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkNsdXN0ZXJQb2xpY3lcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2F1dGhvcml6YXRpb25fQ2x1c3RlclBvbGljeUJpbmRpbmdcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiQ2x1c3RlclBvbGljeUJpbmRpbmdcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJsYXN0TW9kaWZpZWRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxhc3QgdGltZSBhbnkgcGFydCBvZiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwb2xpY3lSZWZcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0UmVmZXJlbmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyb2xlQmluZGluZ3NcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYWxsIHRoZSByb2xlIGJpbmRpbmdzIGhlbGQgYnkgdGhpcyBwb2xpY3lcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX05hbWVkQ2x1c3RlclJvbGVCaW5kaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5OYW1lZENsdXN0ZXJSb2xlQmluZGluZ1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkNsdXN0ZXJQb2xpY3lCaW5kaW5nXCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc19hdXRob3JpemF0aW9uX0NsdXN0ZXJQb2xpY3lCaW5kaW5nTGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgY2x1c3RlciBwb2xpY3kgYmluZGluZ3NcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX0NsdXN0ZXJQb2xpY3lCaW5kaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5DbHVzdGVyUG9saWN5QmluZGluZ1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJDbHVzdGVyUG9saWN5QmluZGluZ0xpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5DbHVzdGVyUG9saWN5QmluZGluZ0xpc3RcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VcIixcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VMaXN0XCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYXV0aG9yaXphdGlvbl9DbHVzdGVyUG9saWN5TGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgY2x1c3RlciBwb2xpY2llc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2F1dGhvcml6YXRpb25fQ2x1c3RlclBvbGljeVwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQ2x1c3RlclBvbGljeVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJDbHVzdGVyUG9saWN5TGlzdFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xpc3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxpc3RNZXRhXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkNsdXN0ZXJQb2xpY3lMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlXCIsXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlTGlzdFwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2F1dGhvcml6YXRpb25fQ2x1c3RlclJvbGVcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiQ2x1c3RlclJvbGVcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicnVsZXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBwb2xpY3kgcnVsZXNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX1BvbGljeVJ1bGVcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlBvbGljeVJ1bGVcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5DbHVzdGVyUm9sZVwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYXV0aG9yaXphdGlvbl9DbHVzdGVyUm9sZUJpbmRpbmdcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJncm91cE5hbWVzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFsbCB0aGUgZ3JvdXBzIGRpcmVjdGx5IGJvdW5kIHRvIHRoZSByb2xlXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhbGwgdGhlIGdyb3VwcyBkaXJlY3RseSBib3VuZCB0byB0aGUgcm9sZVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJDbHVzdGVyUm9sZUJpbmRpbmdcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicm9sZVJlZlwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RSZWZlcmVuY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0UmVmZXJlbmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInN1YmplY3RzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInJlZmVyZW5jZXMgdG8gc3ViamVjdHMgYm91bmQgdG8gdGhlIHJvbGUuICBPbmx5IFVzZXJcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInVzZXJOYW1lc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhbGwgdXNlciBuYW1lcyBkaXJlY3RseSBib3VuZCB0byB0aGUgcm9sZVwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYWxsIHVzZXIgbmFtZXMgZGlyZWN0bHkgYm91bmQgdG8gdGhlIHJvbGVcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5DbHVzdGVyUm9sZUJpbmRpbmdcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2F1dGhvcml6YXRpb25fQ2x1c3RlclJvbGVCaW5kaW5nTGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgY2x1c3RlciByb2xlIGJpbmRpbmdzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYXV0aG9yaXphdGlvbl9DbHVzdGVyUm9sZUJpbmRpbmdcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkNsdXN0ZXJSb2xlQmluZGluZ1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJDbHVzdGVyUm9sZUJpbmRpbmdMaXN0XCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTGlzdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTGlzdE1ldGFcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQ2x1c3RlclJvbGVCaW5kaW5nTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZVwiLFxyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZUxpc3RcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc19hdXRob3JpemF0aW9uX0xvY2FsU3ViamVjdEFjY2Vzc1Jldmlld1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcIlR5cGVNZXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1R5cGVNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlR5cGVNZXRhXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImNvbnRlbnRcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfcnVudGltZV9SYXdFeHRlbnNpb25cIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZ3JvdXBzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm9wdGlvbmFsXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJvcHRpb25hbFwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm5hbWVzcGFjZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibmFtZXNwYWNlIG9mIHRoZSBhY3Rpb24gYmVpbmcgcmVxdWVzdGVkXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlc291cmNlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJvbmUgb2YgdGhlIGV4aXN0aW5nIHJlc291cmNlIHR5cGVzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlc291cmNlTmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibmFtZSBvZiB0aGUgcmVzb3VyY2UgYmVpbmcgcmVxdWVzdGVkIGZvciBhIGdldCBvciBkZWxldGVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidXNlclwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwib3B0aW9uYWxcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidmVyYlwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwib25lIG9mIGdldFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Mb2NhbFN1YmplY3RBY2Nlc3NSZXZpZXdcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2F1dGhvcml6YXRpb25fTmFtZWRDbHVzdGVyUm9sZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcIm5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm5hbWUgb2YgdGhlIGNsdXN0ZXIgcm9sZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyb2xlXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX0NsdXN0ZXJSb2xlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQ2x1c3RlclJvbGVcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuTmFtZWRDbHVzdGVyUm9sZVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYXV0aG9yaXphdGlvbl9OYW1lZENsdXN0ZXJSb2xlQmluZGluZ1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcIm5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm5hbWUgb2YgdGhlIGNsdXN0ZXIgcm9sZSBiaW5kaW5nXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJvbGVCaW5kaW5nXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX0NsdXN0ZXJSb2xlQmluZGluZ1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkNsdXN0ZXJSb2xlQmluZGluZ1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5OYW1lZENsdXN0ZXJSb2xlQmluZGluZ1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYXV0aG9yaXphdGlvbl9OYW1lZFJvbGVcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJuYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJuYW1lIG9mIHRoZSByb2xlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJvbGVcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2F1dGhvcml6YXRpb25fUm9sZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlJvbGVcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuTmFtZWRSb2xlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19hdXRob3JpemF0aW9uX05hbWVkUm9sZUJpbmRpbmdcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJuYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJuYW1lIG9mIHRoZSByb2xlQmluZGluZ1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyb2xlQmluZGluZ1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYXV0aG9yaXphdGlvbl9Sb2xlQmluZGluZ1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlJvbGVCaW5kaW5nXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLk5hbWVkUm9sZUJpbmRpbmdcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2F1dGhvcml6YXRpb25fUG9saWN5XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlBvbGljeVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImxhc3RNb2RpZmllZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGFzdCB0aW1lIHRoYXQgYW55IHBhcnQgb2YgdGhlIHBvbGljeSB3YXMgY3JlYXRlZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicm9sZXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicm9sZXMgaGVsZCBieSB0aGlzIHBvbGljeVwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2F1dGhvcml6YXRpb25fTmFtZWRSb2xlXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5OYW1lZFJvbGVcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Qb2xpY3lcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2F1dGhvcml6YXRpb25fUG9saWN5QmluZGluZ1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJQb2xpY3lCaW5kaW5nXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibGFzdE1vZGlmaWVkXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsYXN0IHRpbWUgdGhhdCBhbnkgcGFydCBvZiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwb2xpY3lSZWZcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0UmVmZXJlbmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyb2xlQmluZGluZ3NcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYWxsIHJvbGVCaW5kaW5ncyBoZWxkIGJ5IHRoaXMgcG9saWN5QmluZGluZ1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2F1dGhvcml6YXRpb25fTmFtZWRSb2xlQmluZGluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuTmFtZWRSb2xlQmluZGluZ1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlBvbGljeUJpbmRpbmdcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2F1dGhvcml6YXRpb25fUG9saWN5QmluZGluZ0xpc3RcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIHBvbGljeSBiaW5kaW5nc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2F1dGhvcml6YXRpb25fUG9saWN5QmluZGluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuUG9saWN5QmluZGluZ1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJQb2xpY3lCaW5kaW5nTGlzdFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xpc3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxpc3RNZXRhXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlBvbGljeUJpbmRpbmdMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlXCIsXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlTGlzdFwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2F1dGhvcml6YXRpb25fUG9saWN5TGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgcG9saWNpZXNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX1BvbGljeVwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuUG9saWN5XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlBvbGljeUxpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Qb2xpY3lMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlXCIsXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlTGlzdFwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2F1dGhvcml6YXRpb25fUG9saWN5UnVsZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImF0dHJpYnV0ZVJlc3RyaWN0aW9uc1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19ydW50aW1lX1Jhd0V4dGVuc2lvblwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJub25SZXNvdXJjZVVSTHNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwic2V0IG9mIHBhcnRpYWwgdXJscyB0aGF0IGEgdXNlciBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8uICpzIGFyZSBhbGxvd2VkXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzZXQgb2YgcGFydGlhbCB1cmxzIHRoYXQgYSB1c2VyIHNob3VsZCBoYXZlIGFjY2VzcyB0by4gKnMgYXJlIGFsbG93ZWRcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZXNvdXJjZU5hbWVzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm9wdGlvbmFsIHdoaXRlIGxpc3Qgb2YgbmFtZXMgdGhhdCB0aGUgcnVsZSBhcHBsaWVzIHRvLiAgQW4gZW1wdHkgc2V0IG1lYW5zIHRoYXQgZXZlcnl0aGluZyBpcyBhbGxvd2VkLlwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwib3B0aW9uYWwgd2hpdGUgbGlzdCBvZiBuYW1lcyB0aGF0IHRoZSBydWxlIGFwcGxpZXMgdG8uICBBbiBlbXB0eSBzZXQgbWVhbnMgdGhhdCBldmVyeXRoaW5nIGlzIGFsbG93ZWQuXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgcmVzb3VyY2VzIHRoaXMgcnVsZSBhcHBsaWVzIHRvLiAgKiByZXByZXNlbnRzIGFsbCByZXNvdXJjZXMuXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIHJlc291cmNlcyB0aGlzIHJ1bGUgYXBwbGllcyB0by4gICogcmVwcmVzZW50cyBhbGwgcmVzb3VyY2VzLlwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInZlcmJzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgdmVyYnMgdGhhdCBhcHBseSB0byBBTEwgdGhlIHJlc291cmNlS2luZHMgYW5kIGF0dHJpYnV0ZVJlc3RyaWN0aW9ucyBjb250YWluZWQgaW4gdGhpcyBydWxlLiAgVGhlIHZlcmIgKiByZXByZXNlbnRzIGFsbCBraW5kcy5cIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgdmVyYnMgdGhhdCBhcHBseSB0byBBTEwgdGhlIHJlc291cmNlS2luZHMgYW5kIGF0dHJpYnV0ZVJlc3RyaWN0aW9ucyBjb250YWluZWQgaW4gdGhpcyBydWxlLiAgVGhlIHZlcmIgKiByZXByZXNlbnRzIGFsbCBraW5kcy5cIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Qb2xpY3lSdWxlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19hdXRob3JpemF0aW9uX1JvbGVcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiUm9sZVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJydWxlc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhbGwgdGhlIHJ1bGVzIGZvciB0aGlzIHJvbGVcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX1BvbGljeVJ1bGVcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlBvbGljeVJ1bGVcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Sb2xlXCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc19hdXRob3JpemF0aW9uX1JvbGVCaW5kaW5nXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZ3JvdXBOYW1lc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhbGwgdGhlIGdyb3VwcyBkaXJlY3RseSBib3VuZCB0byB0aGUgcm9sZVwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYWxsIHRoZSBncm91cHMgZGlyZWN0bHkgYm91bmQgdG8gdGhlIHJvbGVcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiUm9sZUJpbmRpbmdcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicm9sZVJlZlwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RSZWZlcmVuY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0UmVmZXJlbmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInN1YmplY3RzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInJlZmVyZW5jZXMgdG8gc3ViamVjdHMgYm91bmQgdG8gdGhlIHJvbGUuICBPbmx5IFVzZXJcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInVzZXJOYW1lc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhbGwgdGhlIHVzZXJuYW1lcyBkaXJlY3RseSBib3VuZCB0byB0aGUgcm9sZVwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYWxsIHRoZSB1c2VybmFtZXMgZGlyZWN0bHkgYm91bmQgdG8gdGhlIHJvbGVcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Sb2xlQmluZGluZ1wiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYXV0aG9yaXphdGlvbl9Sb2xlQmluZGluZ0xpc3RcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIHJvbGUgYmluZGluZ3NcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX1JvbGVCaW5kaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Sb2xlQmluZGluZ1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJSb2xlQmluZGluZ0xpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Sb2xlQmluZGluZ0xpc3RcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VcIixcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VMaXN0XCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYXV0aG9yaXphdGlvbl9Sb2xlTGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2Ygcm9sZXNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX1JvbGVcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlJvbGVcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiUm9sZUxpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Sb2xlTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZVwiLFxyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZUxpc3RcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc19hdXRob3JpemF0aW9uX1N1YmplY3RBY2Nlc3NSZXZpZXdcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJjb250ZW50XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX3J1bnRpbWVfUmF3RXh0ZW5zaW9uXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImdyb3Vwc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJvcHRpb25hbFwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwib3B0aW9uYWxcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiU3ViamVjdEFjY2Vzc1Jldmlld1wiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm5hbWVzcGFjZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibmFtZXNwYWNlIG9mIHRoZSBhY3Rpb24gYmVpbmcgcmVxdWVzdGVkXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlc291cmNlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJvbmUgb2YgdGhlIGV4aXN0aW5nIHJlc291cmNlIHR5cGVzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlc291cmNlTmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibmFtZSBvZiB0aGUgcmVzb3VyY2UgYmVpbmcgcmVxdWVzdGVkIGZvciBhIGdldCBvciBkZWxldGVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidXNlclwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwib3B0aW9uYWxcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidmVyYlwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwib25lIG9mIGdldFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5TdWJqZWN0QWNjZXNzUmV2aWV3XCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19hdXRob3JpemF0aW9uX1N1YmplY3RBY2Nlc3NSZXZpZXdSZXNwb25zZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFsbG93ZWRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0cnVlIGlmIHRoZSBhY3Rpb24gd291bGQgYmUgYWxsb3dlZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiU3ViamVjdEFjY2Vzc1Jldmlld1Jlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibmFtZXNwYWNlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgbmFtZXNwYWNlIHVzZWQgZm9yIHRoZSBhY2Nlc3MgcmV2aWV3XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlYXNvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicmVhc29uIGlzIG9wdGlvbmFsXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlN1YmplY3RBY2Nlc3NSZXZpZXdSZXNwb25zZVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYnVpbGRfQnVpbGRcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiQnVpbGRcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3BlY1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYnVpbGRfQnVpbGRTcGVjXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQnVpbGRTcGVjXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInN0YXR1c1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYnVpbGRfQnVpbGRTdGF0dXNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5CdWlsZFN0YXR1c1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5CdWlsZFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYnVpbGRfQnVpbGRDb25maWdcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiQnVpbGRDb25maWdcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3BlY1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYnVpbGRfQnVpbGRDb25maWdTcGVjXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQnVpbGRDb25maWdTcGVjXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInN0YXR1c1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYnVpbGRfQnVpbGRDb25maWdTdGF0dXNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5CdWlsZENvbmZpZ1N0YXR1c1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5CdWlsZENvbmZpZ1wiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYnVpbGRfQnVpbGRDb25maWdMaXN0XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBidWlsZCBjb25maWdzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYnVpbGRfQnVpbGRDb25maWdcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkJ1aWxkQ29uZmlnXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIkJ1aWxkQ29uZmlnTGlzdFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xpc3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxpc3RNZXRhXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkJ1aWxkQ29uZmlnTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZVwiLFxyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZUxpc3RcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc19idWlsZF9CdWlsZENvbmZpZ1NwZWNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJvdXRwdXRcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2J1aWxkX0J1aWxkT3V0cHV0XCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQnVpbGRPdXRwdXRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1Jlc291cmNlUmVxdWlyZW1lbnRzXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJlc291cmNlUmVxdWlyZW1lbnRzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJldmlzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19idWlsZF9Tb3VyY2VSZXZpc2lvblwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlNvdXJjZVJldmlzaW9uXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNlcnZpY2VBY2NvdW50XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgbmFtZSBvZiB0aGUgc2VydmljZSBhY2NvdW50IHRvIHVzZSB0byBydW4gcG9kcyBjcmVhdGVkIGJ5IHRoZSBidWlsZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzb3VyY2VcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2J1aWxkX0J1aWxkU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQnVpbGRTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3RyYXRlZ3lcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2J1aWxkX0J1aWxkU3RyYXRlZ3lcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5CdWlsZFN0cmF0ZWd5XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInRyaWdnZXJzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImRldGVybWluZXMgaG93IG5ldyBidWlsZHMgY2FuIGJlIGxhdW5jaGVkIGZyb20gYSBidWlsZCBjb25maWcuICBpZiBubyB0cmlnZ2VycyBhcmUgZGVmaW5lZFwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2J1aWxkX0J1aWxkVHJpZ2dlclBvbGljeVwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQnVpbGRUcmlnZ2VyUG9saWN5XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQnVpbGRDb25maWdTcGVjXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19idWlsZF9CdWlsZENvbmZpZ1N0YXR1c1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImxhc3RWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidXNlZCB0byBpbmZvcm0gYWJvdXQgbnVtYmVyIG9mIGxhc3QgdHJpZ2dlcmVkIGJ1aWxkXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkJ1aWxkQ29uZmlnU3RhdHVzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19idWlsZF9CdWlsZExpc3RcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIGJ1aWxkc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2J1aWxkX0J1aWxkXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5CdWlsZFwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJCdWlsZExpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5CdWlsZExpc3RcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VcIixcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VMaXN0XCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYnVpbGRfQnVpbGRPdXRwdXRcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJwdXNoU2VjcmV0XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xvY2FsT2JqZWN0UmVmZXJlbmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxvY2FsT2JqZWN0UmVmZXJlbmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInRvXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RSZWZlcmVuY2VcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQnVpbGRPdXRwdXRcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2J1aWxkX0J1aWxkUmVxdWVzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImZyb21cIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0UmVmZXJlbmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiQnVpbGRSZXF1ZXN0XCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibGFzdFZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJMYXN0VmVyc2lvbiBvZiB0aGUgQnVpbGRDb25maWcgdGhhdCB0cmlnZ2VyZWQgdGhpcyBidWlsZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmV2aXNpb25cIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2J1aWxkX1NvdXJjZVJldmlzaW9uXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuU291cmNlUmV2aXNpb25cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidHJpZ2dlcmVkQnlJbWFnZVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RSZWZlcmVuY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0UmVmZXJlbmNlXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkJ1aWxkUmVxdWVzdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYnVpbGRfQnVpbGRTb3VyY2VcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJjb250ZXh0RGlyXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzcGVjaWZpZXMgc3ViLWRpcmVjdG9yeSB3aGVyZSB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBhcHBsaWNhdGlvbiBleGlzdHNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZ2l0XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19idWlsZF9HaXRCdWlsZFNvdXJjZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkdpdEJ1aWxkU291cmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNvdXJjZVNlY3JldFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Mb2NhbE9iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Mb2NhbE9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0eXBlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0eXBlIG9mIHNvdXJjZSBjb250cm9sIG1hbmFnZW1lbnQgc3lzdGVtXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkJ1aWxkU291cmNlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19idWlsZF9CdWlsZFNwZWNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJvdXRwdXRcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2J1aWxkX0J1aWxkT3V0cHV0XCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQnVpbGRPdXRwdXRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1Jlc291cmNlUmVxdWlyZW1lbnRzXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJlc291cmNlUmVxdWlyZW1lbnRzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJldmlzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19idWlsZF9Tb3VyY2VSZXZpc2lvblwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlNvdXJjZVJldmlzaW9uXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNlcnZpY2VBY2NvdW50XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgbmFtZSBvZiB0aGUgc2VydmljZSBhY2NvdW50IHRvIHVzZSB0byBydW4gcG9kcyBjcmVhdGVkIGJ5IHRoZSBidWlsZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzb3VyY2VcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2J1aWxkX0J1aWxkU291cmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQnVpbGRTb3VyY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3RyYXRlZ3lcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2J1aWxkX0J1aWxkU3RyYXRlZ3lcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5CdWlsZFN0cmF0ZWd5XCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkJ1aWxkU3BlY1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYnVpbGRfQnVpbGRTdGF0dXNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJjYW5jZWxsZWRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJkZXNjcmliZXMgaWYgYSBjYW5jZWxpbmcgZXZlbnQgd2FzIHRyaWdnZXJlZCBmb3IgdGhlIGJ1aWxkXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImNvbXBsZXRpb25UaW1lc3RhbXBcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInNlcnZlciB0aW1lIHdoZW4gdGhlIHBvZCBydW5uaW5nIHRoaXMgYnVpbGQgc3RvcHBlZCBydW5uaW5nXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImNvbmZpZ1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RSZWZlcmVuY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0UmVmZXJlbmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImR1cmF0aW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYW1vdW50IG9mIHRpbWUgdGhlIGJ1aWxkIGhhcyBiZWVuIHJ1bm5pbmdcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcIkxvbmdcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWVzc2FnZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaHVtYW4tcmVhZGFibGUgbWVzc2FnZSBpbmRpY2F0aW5nIGRldGFpbHMgYWJvdXQgd2h5IHRoZSBidWlsZCBoYXMgdGhpcyBzdGF0dXNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicGhhc2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm9ic2VydmVkIHBvaW50IGluIHRoZSBidWlsZCBsaWZlY3ljbGVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3RhcnRUaW1lc3RhbXBcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInNlcnZlciB0aW1lIHdoZW4gdGhpcyBidWlsZCBzdGFydGVkIHJ1bm5pbmcgaW4gYSBwb2RcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQnVpbGRTdGF0dXNcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2J1aWxkX0J1aWxkU3RyYXRlZ3lcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJjdXN0b21TdHJhdGVneVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYnVpbGRfQ3VzdG9tQnVpbGRTdHJhdGVneVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkN1c3RvbUJ1aWxkU3RyYXRlZ3lcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZG9ja2VyU3RyYXRlZ3lcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2J1aWxkX0RvY2tlckJ1aWxkU3RyYXRlZ3lcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Eb2NrZXJCdWlsZFN0cmF0ZWd5XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNvdXJjZVN0cmF0ZWd5XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19idWlsZF9Tb3VyY2VCdWlsZFN0cmF0ZWd5XCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuU291cmNlQnVpbGRTdHJhdGVneVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0eXBlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGJ1aWxkIHN0cmF0ZWd5XCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkJ1aWxkU3RyYXRlZ3lcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2J1aWxkX0J1aWxkVHJpZ2dlclBvbGljeVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImdlbmVyaWNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2J1aWxkX1dlYkhvb2tUcmlnZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuV2ViSG9va1RyaWdnZXJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZ2l0aHViXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19idWlsZF9XZWJIb29rVHJpZ2dlclwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLldlYkhvb2tUcmlnZ2VyXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImltYWdlQ2hhbmdlXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19idWlsZF9JbWFnZUNoYW5nZVRyaWdnZXJcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5JbWFnZUNoYW5nZVRyaWdnZXJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidHlwZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidHlwZSBvZiBidWlsZCB0cmlnZ2VyXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkJ1aWxkVHJpZ2dlclBvbGljeVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYnVpbGRfQ3VzdG9tQnVpbGRTdHJhdGVneVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImVudlwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyB5b3Ugd2FudCB0byBwYXNzIGludG8gYSBidWlsZGVyIGNvbnRhaW5lclwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfRW52VmFyXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuRW52VmFyXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZXhwb3NlRG9ja2VyU29ja2V0XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYWxsb3cgcnVubmluZyBEb2NrZXIgY29tbWFuZHMgKGFuZCBidWlsZCBEb2NrZXIgaW1hZ2VzKSBmcm9tIGluc2lkZSB0aGUgY29udGFpbmVyXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImZvcmNlUHVsbFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImZvcmNlcyBwdWxsaW5nIG9mIGJ1aWxkZXIgaW1hZ2UgZnJvbSByZW1vdGUgcmVnaXN0cnkgaWYgdHJ1ZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJmcm9tXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RSZWZlcmVuY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicHVsbFNlY3JldFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Mb2NhbE9iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Mb2NhbE9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5DdXN0b21CdWlsZFN0cmF0ZWd5XCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19idWlsZF9Eb2NrZXJCdWlsZFN0cmF0ZWd5XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiZW52XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHlvdSB3YW50IHRvIHBhc3MgaW50byBhIGJ1aWxkZXIgY29udGFpbmVyXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19FbnZWYXJcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5FbnZWYXJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJmb3JjZVB1bGxcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJmb3JjZXMgdGhlIHNvdXJjZSBidWlsZCB0byBwdWxsIHRoZSBpbWFnZSBpZiB0cnVlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImZyb21cIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0UmVmZXJlbmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJub0NhY2hlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaWYgdHJ1ZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwdWxsU2VjcmV0XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xvY2FsT2JqZWN0UmVmZXJlbmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxvY2FsT2JqZWN0UmVmZXJlbmNlXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkRvY2tlckJ1aWxkU3RyYXRlZ3lcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2J1aWxkX0dpdEJ1aWxkU291cmNlXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiaHR0cFByb3h5XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzcGVjaWZpZXMgYSBodHRwIHByb3h5IHRvIGJlIHVzZWQgZHVyaW5nIGdpdCBjbG9uZSBvcGVyYXRpb25zXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImh0dHBzUHJveHlcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInNwZWNpZmllcyBhIGh0dHBzIHByb3h5IHRvIGJlIHVzZWQgZHVyaW5nIGdpdCBjbG9uZSBvcGVyYXRpb25zXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlZlwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaWRlbnRpZmllcyB0aGUgYnJhbmNoL3RhZy9yZWYgdG8gYnVpbGRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidXJpXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwb2ludHMgdG8gdGhlIHNvdXJjZSB0aGF0IHdpbGwgYmUgYnVpbHRcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuR2l0QnVpbGRTb3VyY2VcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2J1aWxkX0dpdFNvdXJjZVJldmlzaW9uXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXV0aG9yXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19idWlsZF9Tb3VyY2VDb250cm9sVXNlclwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlNvdXJjZUNvbnRyb2xVc2VyXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImNvbW1pdFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaGFzaCBpZGVudGlmeWluZyBhIHNwZWNpZmljIGNvbW1pdFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJjb21taXR0ZXJcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2J1aWxkX1NvdXJjZUNvbnRyb2xVc2VyXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuU291cmNlQ29udHJvbFVzZXJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWVzc2FnZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyBjb21taXRcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuR2l0U291cmNlUmV2aXNpb25cIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2J1aWxkX0ltYWdlQ2hhbmdlVHJpZ2dlclwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImZyb21cIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0UmVmZXJlbmNlXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJsYXN0VHJpZ2dlcmVkSW1hZ2VJRFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidXNlZCBpbnRlcm5hbGx5IHRvIHNhdmUgbGFzdCB1c2VkIGltYWdlIElEIGZvciBidWlsZFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5JbWFnZUNoYW5nZVRyaWdnZXJcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2J1aWxkX1NvdXJjZUJ1aWxkU3RyYXRlZ3lcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJlbnZcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgeW91IHdhbnQgdG8gcGFzcyBpbnRvIGEgYnVpbGRlciBjb250YWluZXJcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0VudlZhclwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkVudlZhclwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImZvcmNlUHVsbFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImZvcmNlcyB0aGUgc291cmNlIGJ1aWxkIHRvIHB1bGwgdGhlIGltYWdlIGlmIHRydWVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZnJvbVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RSZWZlcmVuY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0UmVmZXJlbmNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImluY3JlbWVudGFsXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYm9vbGVhblwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZm9yY2VzIHRoZSBzb3VyY2UgYnVpbGQgdG8gZG8gaW5jcmVtZW50YWwgYnVpbGRzIGlmIHRydWVcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicHVsbFNlY3JldFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Mb2NhbE9iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Mb2NhbE9iamVjdFJlZmVyZW5jZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzY3JpcHRzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsb2NhdGlvbiBvZiB0aGUgc291cmNlIHNjcmlwdHNcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuU291cmNlQnVpbGRTdHJhdGVneVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYnVpbGRfU291cmNlQ29udHJvbFVzZXJcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJlbWFpbFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZS1tYWlsIG9mIHRoZSBzb3VyY2UgY29udHJvbCB1c2VyXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm5hbWUgb2YgdGhlIHNvdXJjZSBjb250cm9sIHVzZXJcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuU291cmNlQ29udHJvbFVzZXJcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2J1aWxkX1NvdXJjZVJldmlzaW9uXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiZ2l0XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19idWlsZF9HaXRTb3VyY2VSZXZpc2lvblwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkdpdFNvdXJjZVJldmlzaW9uXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInR5cGVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInR5cGUgb2YgdGhlIGJ1aWxkIHNvdXJjZVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Tb3VyY2VSZXZpc2lvblwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfYnVpbGRfV2ViSG9va1RyaWdnZXJcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJzZWNyZXRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInNlY3JldCB1c2VkIHRvIHZhbGlkYXRlIHJlcXVlc3RzXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLldlYkhvb2tUcmlnZ2VyXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19kZXBsb3lfQ3VzdG9tRGVwbG95bWVudFN0cmF0ZWd5UGFyYW1zXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiY29tbWFuZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJvcHRpb25hbGx5IG92ZXJyaWRlcyB0aGUgY29udGFpbmVyIGNvbW1hbmQgKGRlZmF1bHQgaXMgc3BlY2lmaWVkIGJ5IHRoZSBpbWFnZSlcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm9wdGlvbmFsbHkgb3ZlcnJpZGVzIHRoZSBjb250YWluZXIgY29tbWFuZCAoZGVmYXVsdCBpcyBzcGVjaWZpZWQgYnkgdGhlIGltYWdlKVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImVudmlyb25tZW50XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImVudmlyb25tZW50IHZhcmlhYmxlcyBwcm92aWRlZCB0byB0aGUgZGVwbG95bWVudCBwcm9jZXNzIGNvbnRhaW5lclwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfRW52VmFyXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuRW52VmFyXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaW1hZ2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImEgRG9ja2VyIGltYWdlIHdoaWNoIGNhbiBjYXJyeSBvdXQgYSBkZXBsb3ltZW50XCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkN1c3RvbURlcGxveW1lbnRTdHJhdGVneVBhcmFtc1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfZGVwbG95X0RlcGxveW1lbnRDYXVzZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImltYWdlVHJpZ2dlclwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfZGVwbG95X0RlcGxveW1lbnRDYXVzZUltYWdlVHJpZ2dlclwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkRlcGxveW1lbnRDYXVzZUltYWdlVHJpZ2dlclwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0eXBlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgdHlwZSBvZiB0cmlnZ2VyIHRoYXQgcmVzdWx0ZWQgaW4gYSBuZXcgZGVwbG95bWVudFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5EZXBsb3ltZW50Q2F1c2VcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2RlcGxveV9EZXBsb3ltZW50Q2F1c2VJbWFnZVRyaWdnZXJcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJmcm9tXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RSZWZlcmVuY2VcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuRGVwbG95bWVudENhdXNlSW1hZ2VUcmlnZ2VyXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19kZXBsb3lfRGVwbG95bWVudENvbmZpZ1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJEZXBsb3ltZW50Q29uZmlnXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RNZXRhXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNwZWNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2RlcGxveV9EZXBsb3ltZW50Q29uZmlnU3BlY1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkRlcGxveW1lbnRDb25maWdTcGVjXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInN0YXR1c1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfZGVwbG95X0RlcGxveW1lbnRDb25maWdTdGF0dXNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5EZXBsb3ltZW50Q29uZmlnU3RhdHVzXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkRlcGxveW1lbnRDb25maWdcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2RlcGxveV9EZXBsb3ltZW50Q29uZmlnTGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImEgbGlzdCBvZiBkZXBsb3ltZW50IGNvbmZpZ3NcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19kZXBsb3lfRGVwbG95bWVudENvbmZpZ1wiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuRGVwbG95bWVudENvbmZpZ1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJEZXBsb3ltZW50Q29uZmlnTGlzdFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xpc3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxpc3RNZXRhXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkRlcGxveW1lbnRDb25maWdMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlXCIsXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlTGlzdFwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2RlcGxveV9EZXBsb3ltZW50Q29uZmlnU3BlY1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcInJlcGxpY2FzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIGRlc2lyZWQgbnVtYmVyIG9mIHJlcGxpY2FzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNlbGVjdG9yXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhIGxhYmVsIHF1ZXJ5IG92ZXIgcG9kcyB0aGF0IHNob3VsZCBtYXRjaCB0aGUgcmVwbGljYXMgY291bnRcIixcclxuICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImEgbGFiZWwgcXVlcnkgb3ZlciBwb2RzIHRoYXQgc2hvdWxkIG1hdGNoIHRoZSByZXBsaWNhcyBjb3VudFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJqYXZhLnV0aWwuTWFwXFx1MDAzY1N0cmluZyxTdHJpbmdcXHUwMDNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInN0cmF0ZWd5XCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19kZXBsb3lfRGVwbG95bWVudFN0cmF0ZWd5XCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuRGVwbG95bWVudFN0cmF0ZWd5XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInRlbXBsYXRlXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1BvZFRlbXBsYXRlU3BlY1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Qb2RUZW1wbGF0ZVNwZWNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidHJpZ2dlcnNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaG93IG5ldyBkZXBsb3ltZW50cyBhcmUgdHJpZ2dlcmVkXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfZGVwbG95X0RlcGxveW1lbnRUcmlnZ2VyUG9saWN5XCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5EZXBsb3ltZW50VHJpZ2dlclBvbGljeVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkRlcGxveW1lbnRDb25maWdTcGVjXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19kZXBsb3lfRGVwbG95bWVudENvbmZpZ1N0YXR1c1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImRldGFpbHNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2RlcGxveV9EZXBsb3ltZW50RGV0YWlsc1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkRlcGxveW1lbnREZXRhaWxzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImxhdGVzdFZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjdXJyZW50IGRlcGxveW1lbnQgaXMgb3V0IG9mIHN5bmNcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuRGVwbG95bWVudENvbmZpZ1N0YXR1c1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfZGVwbG95X0RlcGxveW1lbnREZXRhaWxzXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiY2F1c2VzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImV4dGVuZGVkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGFsbCB0aGUgY2F1c2VzIGZvciBjcmVhdGluZyBhIG5ldyBkZXBsb3ltZW50XCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfZGVwbG95X0RlcGxveW1lbnRDYXVzZVwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuRGVwbG95bWVudENhdXNlXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWVzc2FnZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiYSB1c2VyIHNwZWNpZmllZCBjaGFuZ2UgbWVzc2FnZVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5EZXBsb3ltZW50RGV0YWlsc1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfZGVwbG95X0RlcGxveW1lbnRTdHJhdGVneVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImN1c3RvbVBhcmFtc1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfZGVwbG95X0N1c3RvbURlcGxveW1lbnRTdHJhdGVneVBhcmFtc1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkN1c3RvbURlcGxveW1lbnRTdHJhdGVneVBhcmFtc1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZWNyZWF0ZVBhcmFtc1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfZGVwbG95X1JlY3JlYXRlRGVwbG95bWVudFN0cmF0ZWd5UGFyYW1zXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuUmVjcmVhdGVEZXBsb3ltZW50U3RyYXRlZ3lQYXJhbXNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVzb3VyY2VzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1Jlc291cmNlUmVxdWlyZW1lbnRzXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJlc291cmNlUmVxdWlyZW1lbnRzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJvbGxpbmdQYXJhbXNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2RlcGxveV9Sb2xsaW5nRGVwbG95bWVudFN0cmF0ZWd5UGFyYW1zXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuUm9sbGluZ0RlcGxveW1lbnRTdHJhdGVneVBhcmFtc1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0eXBlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgbmFtZSBvZiBhIGRlcGxveW1lbnQgc3RyYXRlZ3lcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuRGVwbG95bWVudFN0cmF0ZWd5XCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19kZXBsb3lfRGVwbG95bWVudFRyaWdnZXJJbWFnZUNoYW5nZVBhcmFtc1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImF1dG9tYXRpY1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIndoZXRoZXIgZGV0ZWN0aW9uIG9mIGEgbmV3IHRhZyB2YWx1ZSBzaG91bGQgdHJpZ2dlciBhIGRlcGxveW1lbnRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiY29udGFpbmVyTmFtZXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicmVzdHJpY3RzIHRhZyB1cGRhdGVzIHRvIGEgc2V0IG9mIGNvbnRhaW5lciBuYW1lcyBpbiB0aGUgcG9kXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyZXN0cmljdHMgdGFnIHVwZGF0ZXMgdG8gYSBzZXQgb2YgY29udGFpbmVyIG5hbWVzIGluIHRoZSBwb2RcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJmcm9tXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RSZWZlcmVuY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibGFzdFRyaWdnZXJlZEltYWdlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgbGFzdCBpbWFnZSB0byBiZSB0cmlnZ2VyZWRcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuRGVwbG95bWVudFRyaWdnZXJJbWFnZUNoYW5nZVBhcmFtc1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfZGVwbG95X0RlcGxveW1lbnRUcmlnZ2VyUG9saWN5XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiaW1hZ2VDaGFuZ2VQYXJhbXNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2RlcGxveV9EZXBsb3ltZW50VHJpZ2dlckltYWdlQ2hhbmdlUGFyYW1zXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuRGVwbG95bWVudFRyaWdnZXJJbWFnZUNoYW5nZVBhcmFtc1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0eXBlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgdHlwZSBvZiB0aGUgdHJpZ2dlclwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5EZXBsb3ltZW50VHJpZ2dlclBvbGljeVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfZGVwbG95X0V4ZWNOZXdQb2RIb29rXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiY29tbWFuZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgaG9vayBjb21tYW5kIGFuZCBpdHMgYXJndW1lbnRzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgaG9vayBjb21tYW5kIGFuZCBpdHMgYXJndW1lbnRzXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiY29udGFpbmVyTmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIG5hbWUgb2YgYSBjb250YWluZXIgZnJvbSB0aGUgcG9kIHRlbXBsYXRlIHdob3NlIGltYWdlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGhvb2sgY29udGFpbmVyXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImVudlwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJlbnZpcm9ubWVudCB2YXJpYWJsZXMgcHJvdmlkZWQgdG8gdGhlIGhvb2sgY29udGFpbmVyXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19FbnZWYXJcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5FbnZWYXJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5FeGVjTmV3UG9kSG9va1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfZGVwbG95X0xpZmVjeWNsZUhvb2tcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJleGVjTmV3UG9kXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19kZXBsb3lfRXhlY05ld1BvZEhvb2tcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5FeGVjTmV3UG9kSG9va1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJmYWlsdXJlUG9saWN5XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ3aGF0IGFjdGlvbiB0byB0YWtlIGlmIHRoZSBob29rIGZhaWxzXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkxpZmVjeWNsZUhvb2tcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2RlcGxveV9SZWNyZWF0ZURlcGxveW1lbnRTdHJhdGVneVBhcmFtc1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcInBvc3RcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2RlcGxveV9MaWZlY3ljbGVIb29rXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuTGlmZWN5Y2xlSG9va1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwcmVcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2RlcGxveV9MaWZlY3ljbGVIb29rXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuTGlmZWN5Y2xlSG9va1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5SZWNyZWF0ZURlcGxveW1lbnRTdHJhdGVneVBhcmFtc1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfZGVwbG95X1JvbGxpbmdEZXBsb3ltZW50U3RyYXRlZ3lQYXJhbXNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJpbnRlcnZhbFNlY29uZHNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgdGltZSB0byB3YWl0IGJldHdlZW4gcG9sbGluZyBkZXBsb3ltZW50IHN0YXR1cyBhZnRlciB1cGRhdGVcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcIkxvbmdcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicG9zdFwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfZGVwbG95X0xpZmVjeWNsZUhvb2tcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5MaWZlY3ljbGVIb29rXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInByZVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfZGVwbG95X0xpZmVjeWNsZUhvb2tcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5MaWZlY3ljbGVIb29rXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInRpbWVvdXRTZWNvbmRzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIHRpbWUgdG8gd2FpdCBmb3IgdXBkYXRlcyBiZWZvcmUgZ2l2aW5nIHVwXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJMb25nXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInVwZGF0ZVBlcmNlbnRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ0aGUgcGVyY2VudGFnZSBvZiByZXBsaWNhcyB0byBzY2FsZSB1cCBvciBkb3duIGVhY2ggaW50ZXJ2YWwgKG5lZ2F0aXZlIHZhbHVlIHN3aXRjaGVzIHNjYWxlIG9yZGVyIHRvIGRvd24vdXAgaW5zdGVhZCBvZiB1cC9kb3duKVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ1cGRhdGVQZXJpb2RTZWNvbmRzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidGhlIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIGluZGl2aWR1YWwgcG9kIHVwZGF0ZXNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcIkxvbmdcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuUm9sbGluZ0RlcGxveW1lbnRTdHJhdGVneVBhcmFtc1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfaW1hZ2VfSW1hZ2VcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJkb2NrZXJJbWFnZU1hbmlmZXN0XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyYXcgSlNPTiBvZiB0aGUgbWFuaWZlc3RcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZG9ja2VySW1hZ2VNZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19ydW50aW1lX1Jhd0V4dGVuc2lvblwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJkb2NrZXJJbWFnZU1ldGFkYXRhVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiY29udmV5cyB2ZXJzaW9uIG9mIHRoZSBvYmplY3RcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZG9ja2VySW1hZ2VSZWZlcmVuY2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIHB1bGwgdGhpcyBpbWFnZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiSW1hZ2VcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuSW1hZ2VcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2ltYWdlX0ltYWdlTGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgaW1hZ2Ugb2JqZWN0c1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2ltYWdlX0ltYWdlXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5JbWFnZVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJJbWFnZUxpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5JbWFnZUxpc3RcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VcIixcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VMaXN0XCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfaW1hZ2VfSW1hZ2VTdHJlYW1cIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiSW1hZ2VTdHJlYW1cIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3BlY1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfaW1hZ2VfSW1hZ2VTdHJlYW1TcGVjXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuSW1hZ2VTdHJlYW1TcGVjXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInN0YXR1c1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfaW1hZ2VfSW1hZ2VTdHJlYW1TdGF0dXNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5JbWFnZVN0cmVhbVN0YXR1c1wiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5JbWFnZVN0cmVhbVwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfaW1hZ2VfSW1hZ2VTdHJlYW1MaXN0XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBpbWFnZSBzdHJlYW0gb2JqZWN0c1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2ltYWdlX0ltYWdlU3RyZWFtXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5JbWFnZVN0cmVhbVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJJbWFnZVN0cmVhbUxpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5JbWFnZVN0cmVhbUxpc3RcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VcIixcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VMaXN0XCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfaW1hZ2VfSW1hZ2VTdHJlYW1TcGVjXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiZG9ja2VySW1hZ2VSZXBvc2l0b3J5XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJvcHRpb25hbCBmaWVsZCBpZiBzcGVjaWZpZWQgdGhpcyBzdHJlYW0gaXMgYmFja2VkIGJ5IGEgRG9ja2VyIHJlcG9zaXRvcnkgb24gdGhpcyBzZXJ2ZXJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidGFnc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJtYXAgYXJiaXRyYXJ5IHN0cmluZyB2YWx1ZXMgdG8gc3BlY2lmaWMgaW1hZ2UgbG9jYXRvcnNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19pbWFnZV9OYW1lZFRhZ1JlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuTmFtZWRUYWdSZWZlcmVuY2VcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5JbWFnZVN0cmVhbVNwZWNcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2ltYWdlX0ltYWdlU3RyZWFtU3RhdHVzXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiZG9ja2VySW1hZ2VSZXBvc2l0b3J5XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyZXByZXNlbnRzIHRoZSBlZmZlY3RpdmUgbG9jYXRpb24gdGhpcyBzdHJlYW0gbWF5IGJlIGFjY2Vzc2VkIGF0XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInRhZ3NcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiaGlzdG9yaWNhbCByZWNvcmQgb2YgaW1hZ2VzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHRhZ1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2ltYWdlX05hbWVkVGFnRXZlbnRMaXN0XCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5OYW1lZFRhZ0V2ZW50TGlzdFwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkltYWdlU3RyZWFtU3RhdHVzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19pbWFnZV9OYW1lZFRhZ0V2ZW50TGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgdGFnIGV2ZW50cyByZWxhdGVkIHRvIHRoZSB0YWdcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19pbWFnZV9UYWdFdmVudFwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuVGFnRXZlbnRcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ0YWdcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSB0YWdcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuTmFtZWRUYWdFdmVudExpc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2ltYWdlX05hbWVkVGFnUmVmZXJlbmNlXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYW5ub3RhdGlvbnNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBpbWFnZXMgdXNpbmcgdGhpcyB0YWdcIixcclxuICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBpbWFnZXMgdXNpbmcgdGhpcyB0YWdcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiamF2YS51dGlsLk1hcFxcdTAwM2NTdHJpbmcsU3RyaW5nXFx1MDAzZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJmcm9tXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RSZWZlcmVuY2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibmFtZSBvZiB0YWdcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuTmFtZWRUYWdSZWZlcmVuY2VcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX2ltYWdlX1RhZ0V2ZW50XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiY3JlYXRlZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwid2hlbiB0aGUgZXZlbnQgd2FzIGNyZWF0ZWRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZG9ja2VySW1hZ2VSZWZlcmVuY2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byBwdWxsIHRoaXMgaW1hZ2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaW1hZ2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInRoZSBpbWFnZVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5UYWdFdmVudFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3Nfb2F1dGhfT0F1dGhBY2Nlc3NUb2tlblwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImF1dGhvcml6ZVRva2VuXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJjb250YWlucyB0aGUgdG9rZW4gdGhhdCBhdXRob3JpemVkIHRoaXMgdG9rZW5cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiY2xpZW50TmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicmVmZXJlbmNlcyB0aGUgY2xpZW50IHRoYXQgY3JlYXRlZCB0aGlzIHRva2VuXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImV4cGlyZXNJblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImludGVnZXJcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImlzIHRoZSBzZWNvbmRzIGZyb20gY3JlYXRpb24gdGltZSBiZWZvcmUgdGhpcyB0b2tlbiBleHBpcmVzXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJMb25nXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJPQXV0aEFjY2Vzc1Rva2VuXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RNZXRhXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlZGlyZWN0VVJJXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyZWRpcmVjdGlvbiBVUkkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0b2tlblwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZWZyZXNoVG9rZW5cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm9wdGlvbmFsIHZhbHVlIGJ5IHdoaWNoIHRoaXMgdG9rZW4gY2FuIGJlIHJlbmV3ZWRcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic2NvcGVzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgcmVxdWVzdGVkIHNjb3Blc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiByZXF1ZXN0ZWQgc2NvcGVzXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidXNlck5hbWVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInVzZXIgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b2tlblwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJ1c2VyVUlEXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ1bmlxdWUgVUlEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRva2VuXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLk9BdXRoQWNjZXNzVG9rZW5cIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX29hdXRoX09BdXRoQWNjZXNzVG9rZW5MaXN0XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBvYXV0aCBhY2Nlc3MgdG9rZW5zXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3Nfb2F1dGhfT0F1dGhBY2Nlc3NUb2tlblwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuT0F1dGhBY2Nlc3NUb2tlblwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJPQXV0aEFjY2Vzc1Rva2VuTGlzdFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xpc3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxpc3RNZXRhXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLk9BdXRoQWNjZXNzVG9rZW5MaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlXCIsXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlTGlzdFwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX29hdXRoX09BdXRoQXV0aG9yaXplVG9rZW5cIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJjbGllbnROYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJyZWZlcmVuY2VzIHRoZSBjbGllbnQgdGhhdCBjcmVhdGVkIHRoaXMgdG9rZW5cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZXhwaXJlc0luXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwic2Vjb25kcyBmcm9tIGNyZWF0aW9uIHRpbWUgYmVmb3JlIHRoaXMgdG9rZW4gZXhwaXJlc1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiTG9uZ1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiT0F1dGhBdXRob3JpemVUb2tlblwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJyZWRpcmVjdFVSSVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicmVkaXJlY3Rpb24gVVJJIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9rZW5cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic2NvcGVzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgcmVxdWVzdGVkIHNjb3Blc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiByZXF1ZXN0ZWQgc2NvcGVzXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3RhdGVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInN0YXRlIGRhdGEgZnJvbSByZXF1ZXN0XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInVzZXJOYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ1c2VyIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdG9rZW5cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidXNlclVJRFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidW5pcXVlIFVJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b2tlbi4gIHVzZXJVSUQgYW5kIHVzZXJOYW1lIG11c3QgYm90aCBtYXRjaCBmb3IgdGhpcyB0b2tlbiB0byBiZSB2YWxpZFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5PQXV0aEF1dGhvcml6ZVRva2VuXCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc19vYXV0aF9PQXV0aEF1dGhvcml6ZVRva2VuTGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2Ygb2F1dGggYXV0aG9yaXphdGlvbiB0b2tlbnNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19vYXV0aF9PQXV0aEF1dGhvcml6ZVRva2VuXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5PQXV0aEF1dGhvcml6ZVRva2VuXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIk9BdXRoQXV0aG9yaXplVG9rZW5MaXN0XCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTGlzdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTGlzdE1ldGFcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuT0F1dGhBdXRob3JpemVUb2tlbkxpc3RcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VcIixcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VMaXN0XCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3Nfb2F1dGhfT0F1dGhDbGllbnRcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiT0F1dGhDbGllbnRcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVkaXJlY3RVUklzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInZhbGlkIHJlZGlyZWN0aW9uIFVSSXMgYXNzb2NpYXRlZCB3aXRoIGEgY2xpZW50XCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ2YWxpZCByZWRpcmVjdGlvbiBVUklzIGFzc29jaWF0ZWQgd2l0aCBhIGNsaWVudFwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInJlc3BvbmRXaXRoQ2hhbGxlbmdlc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImJvb2xlYW5cIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImluZGljYXRlcyB3aGV0aGVyIHRoZSBjbGllbnQgd2FudHMgYXV0aGVudGljYXRpb24gbmVlZGVkIHJlc3BvbnNlcyBtYWRlIGluIHRoZSBmb3JtIG9mIGNoYWxsZW5nZXMgaW5zdGVhZCBvZiByZWRpcmVjdHNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic2VjcmV0XCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ1bmlxdWUgc2VjcmV0IGFzc29jaWF0ZWQgd2l0aCBhIGNsaWVudFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5PQXV0aENsaWVudFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3Nfb2F1dGhfT0F1dGhDbGllbnRBdXRob3JpemF0aW9uXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiY2xpZW50TmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicmVmZXJlbmNlcyB0aGUgY2xpZW50IHRoYXQgY3JlYXRlZCB0aGlzIGF1dGhvcml6YXRpb25cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIk9BdXRoQ2xpZW50QXV0aG9yaXphdGlvblwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzY29wZXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBncmFudGVkIHNjb3Blc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBncmFudGVkIHNjb3Blc1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInVzZXJOYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJ1c2VyIG5hbWUgdGhhdCBhdXRob3JpemVkIHRoaXMgY2xpZW50XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInVzZXJVSURcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInVuaXF1ZSBVSUQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXV0aG9yaXphdGlvbi4gdXNlclVJRCBhbmQgdXNlck5hbWUgbXVzdCBib3RoIG1hdGNoIGZvciB0aGlzIGF1dGhvcml6YXRpb24gdG8gYmUgdmFsaWRcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuT0F1dGhDbGllbnRBdXRob3JpemF0aW9uXCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc19vYXV0aF9PQXV0aENsaWVudEF1dGhvcml6YXRpb25MaXN0XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBvYXV0aCBjbGllbnQgYXV0aG9yaXphdGlvbnNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19vYXV0aF9PQXV0aENsaWVudEF1dGhvcml6YXRpb25cIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLk9BdXRoQ2xpZW50QXV0aG9yaXphdGlvblwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJPQXV0aENsaWVudEF1dGhvcml6YXRpb25MaXN0XCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTGlzdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTGlzdE1ldGFcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuT0F1dGhDbGllbnRBdXRob3JpemF0aW9uTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZVwiLFxyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZUxpc3RcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc19vYXV0aF9PQXV0aENsaWVudExpc3RcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIG9hdXRoIGNsaWVudHNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19vYXV0aF9PQXV0aENsaWVudFwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuT0F1dGhDbGllbnRcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiT0F1dGhDbGllbnRMaXN0XCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTGlzdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTGlzdE1ldGFcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuT0F1dGhDbGllbnRMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlXCIsXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlTGlzdFwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX3Byb2plY3RfUHJvamVjdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJQcm9qZWN0XCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RNZXRhXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInNwZWNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX3Byb2plY3RfUHJvamVjdFNwZWNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Qcm9qZWN0U3BlY1wiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzdGF0dXNcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX3Byb2plY3RfUHJvamVjdFN0YXR1c1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlByb2plY3RTdGF0dXNcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuUHJvamVjdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfcHJvamVjdF9Qcm9qZWN0TGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgcHJvamVjdHNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19wcm9qZWN0X1Byb2plY3RcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlByb2plY3RcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiUHJvamVjdExpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Qcm9qZWN0TGlzdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZVwiLFxyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZUxpc3RcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc19wcm9qZWN0X1Byb2plY3RSZXF1ZXN0XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImRlc2NyaXB0aW9uIHRvIGFwcGx5IHRvIGEgcHJvamVjdFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJkaXNwbGF5TmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZGlzcGxheSBuYW1lIHRvIGFwcGx5IHRvIGEgcHJvamVjdFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiUHJvamVjdFJlcXVlc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuUHJvamVjdFJlcXVlc3RcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX3Byb2plY3RfUHJvamVjdFNwZWNcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJmaW5hbGl6ZXJzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFuIG9wYXF1ZSBsaXN0IG9mIHZhbHVlcyB0aGF0IG11c3QgYmUgZW1wdHkgdG8gcGVybWFuZW50bHkgcmVtb3ZlIG9iamVjdCBmcm9tIHN0b3JhZ2VcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImFuIG9wYXF1ZSBsaXN0IG9mIHZhbHVlcyB0aGF0IG11c3QgYmUgZW1wdHkgdG8gcGVybWFuZW50bHkgcmVtb3ZlIG9iamVjdCBmcm9tIHN0b3JhZ2VcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Qcm9qZWN0U3BlY1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfcHJvamVjdF9Qcm9qZWN0U3RhdHVzXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwicGhhc2VcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInBoYXNlIGlzIHRoZSBjdXJyZW50IGxpZmVjeWNsZSBwaGFzZSBvZiB0aGUgcHJvamVjdFwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Qcm9qZWN0U3RhdHVzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19yb3V0ZV9Sb3V0ZVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJSb3V0ZVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJzcGVjXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19yb3V0ZV9Sb3V0ZVNwZWNcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Sb3V0ZVNwZWNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwic3RhdHVzXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19yb3V0ZV9Sb3V0ZVN0YXR1c1wiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlJvdXRlU3RhdHVzXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlJvdXRlXCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc19yb3V0ZV9Sb3V0ZUxpc3RcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIHJvdXRlc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX3JvdXRlX1JvdXRlXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Sb3V0ZVwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJSb3V0ZUxpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Sb3V0ZUxpc3RcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VcIixcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VMaXN0XCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3Nfcm91dGVfUm91dGVTcGVjXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiaG9zdFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwib3B0aW9uYWw6IGFsaWFzL2RucyB0aGF0IHBvaW50cyB0byB0aGUgc2VydmljZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJwYXRoXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJvcHRpb25hbDogcGF0aCB0aGF0IHRoZSByb3V0ZXIgd2F0Y2hlcyB0byByb3V0ZSB0cmFmZmljIHRvIHRoZSBzZXJ2aWNlXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInRsc1wiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3Nfcm91dGVfVExTQ29uZmlnXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuVExTQ29uZmlnXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInRvXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdFJlZmVyZW5jZVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RSZWZlcmVuY2VcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuUm91dGVTcGVjXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19yb3V0ZV9Sb3V0ZVN0YXR1c1wiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlJvdXRlU3RhdHVzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc19yb3V0ZV9UTFNDb25maWdcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJjYUNlcnRpZmljYXRlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJwcm92aWRlcyB0aGUgY2VydCBhdXRob3JpdHkgY2VydGlmaWNhdGUgY29udGVudHNcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiY2VydGlmaWNhdGVcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInByb3ZpZGVzIGNlcnRpZmljYXRlIGNvbnRlbnRzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImRlc3RpbmF0aW9uQ0FDZXJ0aWZpY2F0ZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwicHJvdmlkZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjYSBjZXJ0aWZpY2F0ZSBvZiB0aGUgZmluYWwgZGVzdGluYXRpb24uICBXaGVuIHVzaW5nIHJlLWVuY3J5cHQgdGVybWluYXRpb24gdGhpcyBmaWxlIHNob3VsZCBiZSBwcm92aWRlZCBpbiBvcmRlciB0byBoYXZlIHJvdXRlcnMgdXNlIGl0IGZvciBoZWFsdGggY2hlY2tzIG9uIHRoZSBzZWN1cmUgY29ubmVjdGlvblwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJrZXlcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcInByb3ZpZGVzIGtleSBmaWxlIGNvbnRlbnRzXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInRlcm1pbmF0aW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJpbmRpY2F0ZXMgdGVybWluYXRpb24gdHlwZS4gIGlmIG5vdCBzZXRcIlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuVExTQ29uZmlnXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvc190ZW1wbGF0ZV9QYXJhbWV0ZXJcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwib3B0aW9uYWw6IGRlc2NyaWJlcyB0aGUgcGFyYW1ldGVyXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImZyb21cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImlucHV0IHZhbHVlIGZvciB0aGUgZ2VuZXJhdG9yXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImdlbmVyYXRlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJvcHRpb25hbDogZ2VuZXJhdGUgc3BlY2lmaWVzIHRoZSBnZW5lcmF0b3IgdG8gYmUgdXNlZCB0byBnZW5lcmF0ZSByYW5kb20gc3RyaW5nIGZyb20gYW4gaW5wdXQgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSBmcm9tIGZpZWxkLiAgdGhlIHJlc3VsdCBzdHJpbmcgaXMgc3RvcmVkIGluIHRoZSB2YWx1ZSBmaWVsZC4gaWYgbm90IHNwZWNpZmllZFwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJuYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJuYW1lIG9mIHRoZSBwYXJhbWV0ZXJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicmVxdWlyZWRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJib29sZWFuXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJpbmRpY2F0ZXMgdGhlIHBhcmFtZXRlciBtdXN0IGhhdmUgYSBub24tZW1wdHkgdmFsdWUgb3IgYmUgZ2VuZXJhdGVkXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInZhbHVlXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJvcHRpb25hbDogaG9sZHMgdGhlIHBhcmFtZXRlciBkYXRhLiAgaWYgc3BlY2lmaWVkXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlBhcmFtZXRlclwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfdGVtcGxhdGVfVGVtcGxhdGVcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiVGVtcGxhdGVcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJsYWJlbHNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIm9wdGlvbmFsOiBsaXN0IG9mIGxhYmxlcyB0aGF0IGFyZSBhcHBsaWVkIHRvIGV2ZXJ5IG9iamVjdCBkdXJpbmcgdGhlIHRlbXBsYXRlIHRvIGNvbmZpZyB0cmFuc2Zvcm1hdGlvblwiLFxyXG4gICAgICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwib3B0aW9uYWw6IGxpc3Qgb2YgbGFibGVzIHRoYXQgYXJlIGFwcGxpZWQgdG8gZXZlcnkgb2JqZWN0IGR1cmluZyB0aGUgdGVtcGxhdGUgdG8gY29uZmlnIHRyYW5zZm9ybWF0aW9uXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImphdmEudXRpbC5NYXBcXHUwMDNjU3RyaW5nLFN0cmluZ1xcdTAwM2VcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RNZXRhXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm9iamVjdHNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBvYmplY3RzIHRvIGluY2x1ZGUgaW4gdGhlIHRlbXBsYXRlXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19ydW50aW1lX1Jhd0V4dGVuc2lvblwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkhhc01ldGFkYXRhXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicGFyYW1ldGVyc1wiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJvcHRpb25hbDogbGlzdCBvZiBwYXJhbWV0ZXJzIHVzZWQgZHVyaW5nIHRlbXBsYXRlIHRvIGNvbmZpZyB0cmFuc2Zvcm1hdGlvblwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX3RlbXBsYXRlX1BhcmFtZXRlclwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuUGFyYW1ldGVyXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuVGVtcGxhdGVcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX3RlbXBsYXRlX1RlbXBsYXRlTGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgdGVtcGxhdGVzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfdGVtcGxhdGVfVGVtcGxhdGVcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlRlbXBsYXRlXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIlRlbXBsYXRlTGlzdFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xpc3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxpc3RNZXRhXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlRlbXBsYXRlTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZVwiLFxyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZUxpc3RcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc191c2VyX0dyb3VwXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIkdyb3VwXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwibWV0YWRhdGFcIjoge1xyXG4gICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfT2JqZWN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RNZXRhXCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcInVzZXJzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgdXNlcnMgaW4gdGhpcyBncm91cFwiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiB1c2VycyBpbiB0aGlzIGdyb3VwXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuR3JvdXBcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5IYXNNZXRhZGF0YVwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcIm9zX3VzZXJfR3JvdXBMaXN0XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBncm91cHNcIixcclxuICAgICAgICAgICAgXCJpdGVtc1wiOiB7XHJcbiAgICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc191c2VyX0dyb3VwXCIsXHJcbiAgICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Hcm91cFwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJHcm91cExpc3RcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0TWV0YVwiLFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5MaXN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Hcm91cExpc3RcIixcclxuICAgICAgICBcImphdmFJbnRlcmZhY2VzXCI6IFtcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VcIixcclxuICAgICAgICAgIFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5LdWJlcm5ldGVzUmVzb3VyY2VMaXN0XCJcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIFwib3NfdXNlcl9JZGVudGl0eVwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImV4dHJhXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJleHRyYSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBpZGVudGl0eVwiLFxyXG4gICAgICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZXh0cmEgaW5mb3JtYXRpb24gZm9yIHRoaXMgaWRlbnRpdHlcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiamF2YS51dGlsLk1hcFxcdTAwM2NTdHJpbmcsU3RyaW5nXFx1MDAzZVwiXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiSWRlbnRpdHlcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJtZXRhZGF0YVwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk9iamVjdE1ldGFcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicHJvdmlkZXJOYW1lXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJzb3VyY2Ugb2YgaWRlbnRpdHkgaW5mb3JtYXRpb25cIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwicHJvdmlkZXJVc2VyTmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwidW5pcXVlbHkgcmVwcmVzZW50cyB0aGlzIGlkZW50aXR5IGluIHRoZSBzY29wZSBvZiB0aGUgcHJvdmlkZXJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwidXNlclwiOiB7XHJcbiAgICAgICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19PYmplY3RSZWZlcmVuY2VcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0UmVmZXJlbmNlXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLklkZW50aXR5XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc191c2VyX0lkZW50aXR5TGlzdFwiOiB7XHJcbiAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgIFwicHJvcGVydGllc1wiOiB7XHJcbiAgICAgICAgICBcImFwaVZlcnNpb25cIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJ2MVwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWUsXHJcbiAgICAgICAgICAgIFwiZW51bVwiOiBbXHJcbiAgICAgICAgICAgICAgXCJ2MVwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgaWRlbnRpdGllc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX3VzZXJfSWRlbnRpdHlcIixcclxuICAgICAgICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLklkZW50aXR5XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwia2luZFwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcIklkZW50aXR5TGlzdFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xpc3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxpc3RNZXRhXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLklkZW50aXR5TGlzdFwiLFxyXG4gICAgICAgIFwiamF2YUludGVyZmFjZXNcIjogW1xyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZVwiLFxyXG4gICAgICAgICAgXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkt1YmVybmV0ZXNSZXNvdXJjZUxpc3RcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc191c2VyX1VzZXJcIjoge1xyXG4gICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICAgICAgXCJhcGlWZXJzaW9uXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwidjFcIixcclxuICAgICAgICAgICAgXCJyZXF1aXJlZFwiOiB0cnVlLFxyXG4gICAgICAgICAgICBcImVudW1cIjogW1xyXG4gICAgICAgICAgICAgIFwidjFcIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJmdWxsTmFtZVwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiZnVsbCBuYW1lIG9mIHVzZXJcIlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiZ3JvdXBzXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImxpc3Qgb2YgZ3JvdXBzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIGdyb3Vwc1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImlkZW50aXRpZXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiBpZGVudGl0aWVzXCIsXHJcbiAgICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJsaXN0IG9mIGlkZW50aXRpZXNcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgXCJraW5kXCI6IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXHJcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJcIixcclxuICAgICAgICAgICAgXCJkZWZhdWx0XCI6IFwiVXNlclwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuT2JqZWN0TWV0YVwiXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHRydWUsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Vc2VyXCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuSGFzTWV0YWRhdGFcIlxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAgXCJvc191c2VyX1VzZXJMaXN0XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIFwiYXBpVmVyc2lvblwiOiB7XHJcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiZGVmYXVsdFwiOiBcInYxXCIsXHJcbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogdHJ1ZSxcclxuICAgICAgICAgICAgXCJlbnVtXCI6IFtcclxuICAgICAgICAgICAgICBcInYxXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFwiaXRlbXNcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJhcnJheVwiLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwibGlzdCBvZiB1c2Vyc1wiLFxyXG4gICAgICAgICAgICBcIml0ZW1zXCI6IHtcclxuICAgICAgICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX3VzZXJfVXNlclwiLFxyXG4gICAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuVXNlclwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcImtpbmRcIjoge1xyXG4gICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcclxuICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICAgICAgICBcImRlZmF1bHRcIjogXCJVc2VyTGlzdFwiLFxyXG4gICAgICAgICAgICBcInJlcXVpcmVkXCI6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBcIm1ldGFkYXRhXCI6IHtcclxuICAgICAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0xpc3RNZXRhXCIsXHJcbiAgICAgICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkxpc3RNZXRhXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZSxcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlVzZXJMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhSW50ZXJmYWNlc1wiOiBbXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlXCIsXHJcbiAgICAgICAgICBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuS3ViZXJuZXRlc1Jlc291cmNlTGlzdFwiXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICBcInNwZXRlcl9pbmZfRGVjXCI6IHtcclxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiB0cnVlLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuRGVjXCJcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxyXG4gICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgXCJCYXNlS3ViZXJuZXRlc0xpc3RcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19MaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQmFzZUt1YmVybmV0ZXNMaXN0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJCdWlsZENvbmZpZ0xpc3RcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYnVpbGRfQnVpbGRDb25maWdMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5CdWlsZENvbmZpZ0xpc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIkJ1aWxkTGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19idWlsZF9CdWlsZExpc3RcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkJ1aWxkTGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiQnVpbGRSZXF1ZXN0XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2J1aWxkX0J1aWxkUmVxdWVzdFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQnVpbGRSZXF1ZXN0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJDbHVzdGVyUG9saWN5XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2F1dGhvcml6YXRpb25fQ2x1c3RlclBvbGljeVwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQ2x1c3RlclBvbGljeVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiQ2x1c3RlclBvbGljeUJpbmRpbmdcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYXV0aG9yaXphdGlvbl9DbHVzdGVyUG9saWN5QmluZGluZ1wiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQ2x1c3RlclBvbGljeUJpbmRpbmdcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIkNsdXN0ZXJQb2xpY3lCaW5kaW5nTGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX0NsdXN0ZXJQb2xpY3lCaW5kaW5nTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuQ2x1c3RlclBvbGljeUJpbmRpbmdMaXN0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJDbHVzdGVyUG9saWN5TGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX0NsdXN0ZXJQb2xpY3lMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5DbHVzdGVyUG9saWN5TGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiQ2x1c3RlclJvbGVCaW5kaW5nXCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2F1dGhvcml6YXRpb25fQ2x1c3RlclJvbGVCaW5kaW5nXCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5DbHVzdGVyUm9sZUJpbmRpbmdcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIkNsdXN0ZXJSb2xlQmluZGluZ0xpc3RcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYXV0aG9yaXphdGlvbl9DbHVzdGVyUm9sZUJpbmRpbmdMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5DbHVzdGVyUm9sZUJpbmRpbmdMaXN0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJDb25maWdcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19jb25maWdfQ29uZmlnXCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuQ29uZmlnXCJcclxuICAgICAgfSxcclxuICAgICAgXCJDb250YWluZXJTdGF0dXNcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Db250YWluZXJTdGF0dXNcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5Db250YWluZXJTdGF0dXNcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIkRlcGxveW1lbnRDb25maWdMaXN0XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2RlcGxveV9EZXBsb3ltZW50Q29uZmlnTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuRGVwbG95bWVudENvbmZpZ0xpc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIkVuZHBvaW50c1wiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0VuZHBvaW50c1wiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkVuZHBvaW50c1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiRW5kcG9pbnRzTGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0VuZHBvaW50c0xpc3RcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5FbmRwb2ludHNMaXN0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJFbnZWYXJcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19FbnZWYXJcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5FbnZWYXJcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIkV2ZW50TGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX0V2ZW50TGlzdFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLkV2ZW50TGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiR3JvdXBcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfdXNlcl9Hcm91cFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuR3JvdXBcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIkdyb3VwTGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc191c2VyX0dyb3VwTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuR3JvdXBMaXN0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJJZGVudGl0eVwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc191c2VyX0lkZW50aXR5XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5JZGVudGl0eVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiSWRlbnRpdHlMaXN0XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX3VzZXJfSWRlbnRpdHlMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5JZGVudGl0eUxpc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIkltYWdlTGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19pbWFnZV9JbWFnZUxpc3RcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkltYWdlTGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiSW1hZ2VTdHJlYW1MaXN0XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2ltYWdlX0ltYWdlU3RyZWFtTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuSW1hZ2VTdHJlYW1MaXN0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJMb2NhbFN1YmplY3RBY2Nlc3NSZXZpZXdcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYXV0aG9yaXphdGlvbl9Mb2NhbFN1YmplY3RBY2Nlc3NSZXZpZXdcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLkxvY2FsU3ViamVjdEFjY2Vzc1Jldmlld1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiTmFtZXNwYWNlXCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTmFtZXNwYWNlXCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTmFtZXNwYWNlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJOYW1lc3BhY2VMaXN0XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfTmFtZXNwYWNlTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk5hbWVzcGFjZUxpc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIk5vZGVcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Ob2RlXCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuTm9kZVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiTm9kZUxpc3RcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Ob2RlTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLk5vZGVMaXN0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJPQXV0aEFjY2Vzc1Rva2VuXCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX29hdXRoX09BdXRoQWNjZXNzVG9rZW5cIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLk9BdXRoQWNjZXNzVG9rZW5cIlxyXG4gICAgICB9LFxyXG4gICAgICBcIk9BdXRoQWNjZXNzVG9rZW5MaXN0XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX29hdXRoX09BdXRoQWNjZXNzVG9rZW5MaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5PQXV0aEFjY2Vzc1Rva2VuTGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiT0F1dGhBdXRob3JpemVUb2tlblwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19vYXV0aF9PQXV0aEF1dGhvcml6ZVRva2VuXCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5PQXV0aEF1dGhvcml6ZVRva2VuXCJcclxuICAgICAgfSxcclxuICAgICAgXCJPQXV0aEF1dGhvcml6ZVRva2VuTGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19vYXV0aF9PQXV0aEF1dGhvcml6ZVRva2VuTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuT0F1dGhBdXRob3JpemVUb2tlbkxpc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIk9BdXRoQ2xpZW50XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX29hdXRoX09BdXRoQ2xpZW50XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5PQXV0aENsaWVudFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiT0F1dGhDbGllbnRBdXRob3JpemF0aW9uXCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX29hdXRoX09BdXRoQ2xpZW50QXV0aG9yaXphdGlvblwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuT0F1dGhDbGllbnRBdXRob3JpemF0aW9uXCJcclxuICAgICAgfSxcclxuICAgICAgXCJPQXV0aENsaWVudEF1dGhvcml6YXRpb25MaXN0XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX29hdXRoX09BdXRoQ2xpZW50QXV0aG9yaXphdGlvbkxpc3RcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLk9BdXRoQ2xpZW50QXV0aG9yaXphdGlvbkxpc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIk9BdXRoQ2xpZW50TGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19vYXV0aF9PQXV0aENsaWVudExpc3RcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLk9BdXRoQ2xpZW50TGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiT2JqZWN0TWV0YVwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX09iamVjdE1ldGFcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5PYmplY3RNZXRhXCJcclxuICAgICAgfSxcclxuICAgICAgXCJQZXJzaXN0ZW50Vm9sdW1lXCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUGVyc2lzdGVudFZvbHVtZVwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlBlcnNpc3RlbnRWb2x1bWVcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIlBlcnNpc3RlbnRWb2x1bWVDbGFpbVwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1BlcnNpc3RlbnRWb2x1bWVDbGFpbVwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlBlcnNpc3RlbnRWb2x1bWVDbGFpbVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiUGVyc2lzdGVudFZvbHVtZUNsYWltTGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1BlcnNpc3RlbnRWb2x1bWVDbGFpbUxpc3RcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5QZXJzaXN0ZW50Vm9sdW1lQ2xhaW1MaXN0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJQZXJzaXN0ZW50Vm9sdW1lTGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1BlcnNpc3RlbnRWb2x1bWVMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUGVyc2lzdGVudFZvbHVtZUxpc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIlBvZExpc3RcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19Qb2RMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUG9kTGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiUG9saWN5XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2F1dGhvcml6YXRpb25fUG9saWN5XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Qb2xpY3lcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIlBvbGljeUJpbmRpbmdcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYXV0aG9yaXphdGlvbl9Qb2xpY3lCaW5kaW5nXCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Qb2xpY3lCaW5kaW5nXCJcclxuICAgICAgfSxcclxuICAgICAgXCJQb2xpY3lCaW5kaW5nTGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX1BvbGljeUJpbmRpbmdMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Qb2xpY3lCaW5kaW5nTGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiUG9saWN5TGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX1BvbGljeUxpc3RcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlBvbGljeUxpc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIlByb2plY3RcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfcHJvamVjdF9Qcm9qZWN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Qcm9qZWN0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJQcm9qZWN0TGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19wcm9qZWN0X1Byb2plY3RMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Qcm9qZWN0TGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiUHJvamVjdFJlcXVlc3RcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfcHJvamVjdF9Qcm9qZWN0UmVxdWVzdFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuUHJvamVjdFJlcXVlc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIlF1YW50aXR5XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfcmVzb3VyY2VfUXVhbnRpdHlcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5RdWFudGl0eVwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiUmVwbGljYXRpb25Db250cm9sbGVyTGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1JlcGxpY2F0aW9uQ29udHJvbGxlckxpc3RcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5SZXBsaWNhdGlvbkNvbnRyb2xsZXJMaXN0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJSZXNvdXJjZVF1b3RhXCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUmVzb3VyY2VRdW90YVwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlJlc291cmNlUXVvdGFcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIlJlc291cmNlUXVvdGFMaXN0XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfUmVzb3VyY2VRdW90YUxpc3RcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5SZXNvdXJjZVF1b3RhTGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiUm9sZVwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc19hdXRob3JpemF0aW9uX1JvbGVcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlJvbGVcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIlJvbGVCaW5kaW5nXCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2F1dGhvcml6YXRpb25fUm9sZUJpbmRpbmdcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlJvbGVCaW5kaW5nXCJcclxuICAgICAgfSxcclxuICAgICAgXCJSb2xlQmluZGluZ0xpc3RcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYXV0aG9yaXphdGlvbl9Sb2xlQmluZGluZ0xpc3RcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlJvbGVCaW5kaW5nTGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiUm9sZUxpc3RcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfYXV0aG9yaXphdGlvbl9Sb2xlTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuUm9sZUxpc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIlJvb3RQYXRoc1wiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9hcGlfUm9vdFBhdGhzXCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuUm9vdFBhdGhzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJSb3V0ZUxpc3RcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3Nfcm91dGVfUm91dGVMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Sb3V0ZUxpc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIlNlY3JldFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1NlY3JldFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlNlY3JldFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiU2VjcmV0TGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1NlY3JldExpc3RcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5TZWNyZXRMaXN0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJTZWN1cml0eUNvbnRleHRDb25zdHJhaW50c1wiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1NlY3VyaXR5Q29udGV4dENvbnN0cmFpbnRzXCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU2VjdXJpdHlDb250ZXh0Q29uc3RyYWludHNcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIlNlY3VyaXR5Q29udGV4dENvbnN0cmFpbnRzTGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX1NlY3VyaXR5Q29udGV4dENvbnN0cmFpbnRzTGlzdFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlNlY3VyaXR5Q29udGV4dENvbnN0cmFpbnRzTGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiU2VydmljZUFjY291bnRcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19TZXJ2aWNlQWNjb3VudFwiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlNlcnZpY2VBY2NvdW50XCJcclxuICAgICAgfSxcclxuICAgICAgXCJTZXJ2aWNlQWNjb3VudExpc3RcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMva3ViZXJuZXRlc19TZXJ2aWNlQWNjb3VudExpc3RcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5TZXJ2aWNlQWNjb3VudExpc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIlNlcnZpY2VMaXN0XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfU2VydmljZUxpc3RcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5TZXJ2aWNlTGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiU3RhdHVzXCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL2t1YmVybmV0ZXNfU3RhdHVzXCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgua3ViZXJuZXRlcy5hcGkubW9kZWwuU3RhdHVzXCJcclxuICAgICAgfSxcclxuICAgICAgXCJTdWJqZWN0QWNjZXNzUmV2aWV3XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2F1dGhvcml6YXRpb25fU3ViamVjdEFjY2Vzc1Jldmlld1wiLFxyXG4gICAgICAgIFwiamF2YVR5cGVcIjogXCJpby5mYWJyaWM4Lm9wZW5zaGlmdC5hcGkubW9kZWwuU3ViamVjdEFjY2Vzc1Jldmlld1wiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiU3ViamVjdEFjY2Vzc1Jldmlld1Jlc3BvbnNlXCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2F1dGhvcml6YXRpb25fU3ViamVjdEFjY2Vzc1Jldmlld1Jlc3BvbnNlXCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5TdWJqZWN0QWNjZXNzUmV2aWV3UmVzcG9uc2VcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIlRhZ0V2ZW50XCI6IHtcclxuICAgICAgICBcIiRyZWZcIjogXCIjL2RlZmluaXRpb25zL29zX2ltYWdlX1RhZ0V2ZW50XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5UYWdFdmVudFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiVGVtcGxhdGVcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfdGVtcGxhdGVfVGVtcGxhdGVcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5vcGVuc2hpZnQuYXBpLm1vZGVsLlRlbXBsYXRlXCJcclxuICAgICAgfSxcclxuICAgICAgXCJUZW1wbGF0ZUxpc3RcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfdGVtcGxhdGVfVGVtcGxhdGVMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5UZW1wbGF0ZUxpc3RcIlxyXG4gICAgICB9LFxyXG4gICAgICBcIlVzZXJcIjoge1xyXG4gICAgICAgIFwiJHJlZlwiOiBcIiMvZGVmaW5pdGlvbnMvb3NfdXNlcl9Vc2VyXCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Vc2VyXCJcclxuICAgICAgfSxcclxuICAgICAgXCJVc2VyTGlzdFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9vc191c2VyX1VzZXJMaXN0XCIsXHJcbiAgICAgICAgXCJqYXZhVHlwZVwiOiBcImlvLmZhYnJpYzgub3BlbnNoaWZ0LmFwaS5tb2RlbC5Vc2VyTGlzdFwiXHJcbiAgICAgIH0sXHJcbiAgICAgIFwiV2F0Y2hFdmVudFwiOiB7XHJcbiAgICAgICAgXCIkcmVmXCI6IFwiIy9kZWZpbml0aW9ucy9rdWJlcm5ldGVzX3dhdGNoX1dhdGNoRXZlbnRcIixcclxuICAgICAgICBcImphdmFUeXBlXCI6IFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5XYXRjaEV2ZW50XCJcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZVxyXG4gIH1cclxuXHJcblxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cInNjaGVtYS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNQbHVnaW4udHNcIi8+XHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuICBcclxuICBcclxuICB2YXIgaGlkZGVuUHJvcGVydGllcyA9IFsnc3RhdHVzJywgJ2RlbGV0aW9uVGltZXN0YW1wJ107XHJcblxyXG4gIGZ1bmN0aW9uIHdpdGhQcm9wZXJ0eShzY2hlbWE6YW55LCBuYW1lOnN0cmluZywgYWN0aW9uOihhbnkpID0+IHZvaWQpIHtcclxuICAgIGlmIChzY2hlbWEucHJvcGVydGllc1tuYW1lXSkge1xyXG4gICAgICBhY3Rpb24oc2NoZW1hLnByb3BlcnRpZXNbbmFtZV0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBmdW5jdGlvbiBoaWRlUHJvcGVydGllcyhzY2hlbWEpIHtcclxuICAgIF8uZm9yRWFjaChoaWRkZW5Qcm9wZXJ0aWVzLCAocHJvcGVydHkpID0+IHtcclxuICAgICAgd2l0aFByb3BlcnR5KHNjaGVtYSwgcHJvcGVydHksIChwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgIHByb3BlcnR5LmhpZGRlbiA9IHRydWU7XHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICB9XHJcbiAgXHJcbiAgX21vZHVsZS5mYWN0b3J5KCdLdWJlcm5ldGVzU2NoZW1hJywgWydTY2hlbWFSZWdpc3RyeScsIChzY2hlbWFzOkhhd3Rpb0Zvcm1zLlNjaGVtYVJlZ2lzdHJ5KSA9PiB7XHJcbiAgICBjb25maWd1cmVTY2hlbWEoKTtcclxuICAgIFxyXG4gICAgc2NoZW1hcy5hZGRMaXN0ZW5lcihcIms4cyBzY2hlbWEgY3VzdG9taXplclwiLCAobmFtZSwgc2NoZW1hKSA9PiB7XHJcbiAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykge1xyXG4gICAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcy5uYW1lKSB7XHJcbiAgICAgICAgICBzY2hlbWEuY29udHJvbHMgPSBbJ25hbWUnLCAnKiddO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aXRoUHJvcGVydHkoc2NoZW1hLCAncG9ydGFsSVAnLCAocHJvcGVydHkpID0+IHtcclxuICAgICAgICAgIHByb3BlcnR5LmxhYmVsID0gXCJQb3J0YWwgSVBcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHdpdGhQcm9wZXJ0eShzY2hlbWEsICdwdWJsaWNJUHMnLCAocHJvcGVydHkpID0+IHtcclxuICAgICAgICAgIHByb3BlcnR5LmxhYmVsID0gXCJQdWJsaWMgSVBzXCJcclxuICAgICAgICB9KTtcclxuICAgICAgICB3aXRoUHJvcGVydHkoc2NoZW1hLCAnU3BlYycsIChwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgcHJvcGVydHkubGFiZWwgPSAnZmFsc2UnO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHdpdGhQcm9wZXJ0eShzY2hlbWEsICdNZXRhZGF0YScsIChwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgcHJvcGVydHkubGFiZWwgPSAnZmFsc2UnO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGhpZGVQcm9wZXJ0aWVzKHNjaGVtYSk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGlmIChfLmVuZHNXaXRoKG5hbWUsIFwiU2VydmljZVNwZWNcIikpIHtcclxuICAgICAgICBzY2hlbWEuY29udHJvbHMgPSBbXCJwb3J0YWxJUFwiLCBcImNyZWF0ZUV4dGVybmFsTG9hZEJhbGFuY2VyXCIsIFwic2Vzc2lvbkFmZmluaXR5XCIsIFwicHVibGljSVBzXCIsIFwicG9ydHNcIiwgXCJzZWxlY3RvclwiLCBcIipcIl07XHJcbiAgICAgICAgd2l0aFByb3BlcnR5KHNjaGVtYSwgJ3Nlc3Npb25BZmZpbml0eScsIChwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgbG9nLmRlYnVnKFwiU2NoZW1hOiBcIiwgc2NoZW1hKTtcclxuICAgICAgICAgIHByb3BlcnR5LmVudW0gPSBbJ05vbmUnLCAnQ2xpZW50SVAnXTtcclxuICAgICAgICAgIHByb3BlcnR5LmRlZmF1bHQgPSAnTm9uZSc7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGlmIChfLmVuZHNXaXRoKG5hbWUsIFwiU2VydmljZVwiKSkge1xyXG4gICAgICAgIHNjaGVtYS5jb250cm9scyA9IHVuZGVmaW5lZDtcclxuICAgICAgICBzY2hlbWEudGFicyA9IHtcclxuICAgICAgICAgICdCYXNpYyBJbmZvcm1hdGlvbic6IFsnbWV0YWRhdGEnXSxcclxuICAgICAgICAgICdEZXRhaWxzJzogWycqJ11cclxuICAgICAgICB9XHJcbiAgICAgICAgbG9nLmRlYnVnKFwiTmFtZTogXCIsIG5hbWUsIFwiIFNjaGVtYTogXCIsIHNjaGVtYSk7XHJcbiAgICAgIH1cclxuICAgICBcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICBcclxuICAgIHNjaGVtYXMuYWRkU2NoZW1hKCdrdWJlcm5ldGVzJywgPGFueT4gc2NoZW1hKTtcclxuICAgIC8vIG5vdyBsZXRzIGl0ZXJhdGUgYW5kIGFkZCBhbGwgdGhlIGRlZmluaXRpb25zIHRvb1xyXG4gICAgYW5ndWxhci5mb3JFYWNoKHNjaGVtYS5kZWZpbml0aW9ucywgKGRlZmluaXRpb24sIHR5cGVOYW1lKSA9PiB7XHJcbiAgICAgIC8vc2NoZW1hcy5hZGRTY2hlbWEodHlwZU5hbWUsIGRlZmluaXRpb24pO1xyXG4gICAgICBzY2hlbWFzLmFkZFNjaGVtYShcIiMvZGVmaW5pdGlvbnMvXCIgKyB0eXBlTmFtZSwgZGVmaW5pdGlvbik7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBzY2hlbWE7XHJcbiAgfV0pO1xyXG5cclxuXHJcbiAgXHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc1BsdWdpbi50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgLy8gZmFjYWRlIHRoaXMgdG8gdGhlIHdhdGNoZXIgc2VydmljZVxyXG4gIGNsYXNzIEt1YmVybmV0ZXNTdGF0ZUltcGwgaW1wbGVtZW50cyBLdWJlcm5ldGVzU3RhdGUge1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB3YXRjaGVyOldhdGNoZXJTZXJ2aWNlKSB7XHJcbiAgICB9XHJcbiAgICBnZXQgbmFtZXNwYWNlcygpOkFycmF5PHN0cmluZz4ge1xyXG4gICAgICByZXR1cm4gXy5tYXAodGhpcy53YXRjaGVyLmdldE9iamVjdHMoV2F0Y2hUeXBlcy5OQU1FU1BBQ0VTKSwgKG5hbWVzcGFjZSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBuYW1lc3BhY2UubWV0YWRhdGEubmFtZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBnZXQgc2VsZWN0ZWROYW1lc3BhY2UoKTpzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy53YXRjaGVyLmdldE5hbWVzcGFjZSgpO1xyXG4gICAgfVxyXG4gICAgc2V0IHNlbGVjdGVkTmFtZXNwYWNlKG5hbWVzcGFjZTpzdHJpbmcpIHtcclxuICAgICAgdGhpcy53YXRjaGVyLnNldE5hbWVzcGFjZShuYW1lc3BhY2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgX21vZHVsZS5mYWN0b3J5KCdLdWJlcm5ldGVzU3RhdGUnLCBbJ1dhdGNoZXJTZXJ2aWNlJywgKHdhdGNoZXI6V2F0Y2hlclNlcnZpY2UpID0+IHtcclxuICAgIHJldHVybiBuZXcgS3ViZXJuZXRlc1N0YXRlSW1wbCh3YXRjaGVyKTtcclxuICB9XSk7XHJcblxyXG4gIC8vIFRPRE8gdGhpcyBkb2Vzbid0IG5lZWQgdG8gYmUgYSBzZXJ2aWNlIHJlYWxseVxyXG4gIF9tb2R1bGUuZmFjdG9yeSgnS3ViZXJuZXRlc0FwaVVSTCcsICgpID0+IGt1YmVybmV0ZXNBcGlVcmwoKSk7XHJcblxyXG4gIC8vIFRPRE8gd2UnbGwgZ2V0IHJpZCBvZiB0aGlzLi4uXHJcbiAgX21vZHVsZS5mYWN0b3J5KCdLdWJlcm5ldGVzVmVyc2lvbicsIFsoKSA9PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBxdWVyeTogKCkgPT4gbnVsbFxyXG4gICAgfVxyXG4gIH1dKTtcclxuXHJcbiAgLy8gVE9ETyBsZXQncyBtb3ZlIHRoZXNlIGludG8gS3ViZXJuZXRlc01vZGVsIHNvIGNvbnRyb2xsZXJzIGRvbid0IGhhdmUgdG8gaW5qZWN0IHRoZW0gc2VwYXJhdGVseVxyXG4gIF9tb2R1bGUuZmFjdG9yeSgnS3ViZXJuZXRlc1BvZHMnLCBbJ0t1YmVybmV0ZXNNb2RlbCcsIChLdWJlcm5ldGVzTW9kZWwpID0+IHtcclxuICAgIHJldHVybiBLdWJlcm5ldGVzTW9kZWxbJ3BvZHNSZXNvdXJjZSddO1xyXG4gIH1dKTtcclxuXHJcbiAgX21vZHVsZS5mYWN0b3J5KCdLdWJlcm5ldGVzUmVwbGljYXRpb25Db250cm9sbGVycycsIFsnS3ViZXJuZXRlc01vZGVsJywgKEt1YmVybmV0ZXNNb2RlbCkgPT4ge1xyXG4gICAgcmV0dXJuIEt1YmVybmV0ZXNNb2RlbFsncmVwbGljYXRpb25jb250cm9sbGVyc1Jlc291cmNlJ107XHJcbiAgfV0pO1xyXG5cclxuICBfbW9kdWxlLmZhY3RvcnkoJ0t1YmVybmV0ZXNTZXJ2aWNlcycsIFsnS3ViZXJuZXRlc01vZGVsJywgKEt1YmVybmV0ZXNNb2RlbCkgPT4ge1xyXG4gICAgcmV0dXJuIEt1YmVybmV0ZXNNb2RlbFsnc2VydmljZXNSZXNvdXJjZSddO1xyXG4gIH1dKTtcclxuXHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc01vZGVsLnRzXCIvPlxyXG4vLy8gXHJcblxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIGV4cG9ydCB2YXIgRmlsZURyb3BDb250cm9sbGVyID0gY29udHJvbGxlcihcIkZpbGVEcm9wQ29udHJvbGxlclwiLCBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJGaWxlVXBsb2FkZXJcIiwgJyRodHRwJywgKCRzY29wZSwgbW9kZWw6S3ViZXJuZXRlc01vZGVsU2VydmljZSwgRmlsZVVwbG9hZGVyLCAkaHR0cDpuZy5JSHR0cFNlcnZpY2UpID0+IHtcclxuXHJcbiAgICAgIHZhciBsb2cgPSBMb2dnZXIuZ2V0KCdrdWJlcm5ldGVzLWZpbGUtdXBsb2FkZXInKTsgICAgICBcclxuXHJcbiAgICAgIHZhciB1cGxvYWRlciA9ICRzY29wZS51cGxvYWRlciA9IDxGaWxlVXBsb2FkLkZpbGVVcGxvYWRlcj4gbmV3IEZpbGVVcGxvYWRlcig8RmlsZVVwbG9hZC5JT3B0aW9ucz57XHJcbiAgICAgICAgYXV0b1VwbG9hZDogZmFsc2UsXHJcbiAgICAgICAgcmVtb3ZlQWZ0ZXJVcGxvYWQ6IHRydWUsXHJcbiAgICAgICAgdXJsOiBrdWJlcm5ldGVzQXBpVXJsKClcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAkc2NvcGUudXBsb2FkZXIub25BZnRlckFkZGluZ0ZpbGUgPSAoZmlsZSkgPT4ge1xyXG4gICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVhZGVyLnJlYWR5U3RhdGUgPT09IDIpIHtcclxuICAgICAgICAgICAgbG9nLmRlYnVnKFwiRmlsZSBhZGRlZDogXCIsIGZpbGUpOyAgICAgICAgXHJcbiAgICAgICAgICAgIHZhciBkYXRhID0gcmVhZGVyLnJlc3VsdDtcclxuICAgICAgICAgICAgdmFyIG9iaiA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChfLmVuZHNXaXRoKGZpbGUuX2ZpbGUubmFtZSwgJy5qc29uJykpIHtcclxuICAgICAgICAgICAgICBsb2cuZGVidWcoXCJQYXJzaW5nIEpTT04gZmlsZVwiKTtcclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgb2JqID0gYW5ndWxhci5mcm9tSnNvbihkYXRhKTtcclxuICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcIkZhaWxlZCB0byByZWFkIGRyb3BwZWQgZmlsZSBcIiwgZmlsZS5fZmlsZS5uYW1lLCBcIjogXCIsIGVycik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uZW5kc1dpdGgoZmlsZS5fZmlsZS5uYW1lLCAnLnlhbWwnKSkge1xyXG4gICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcIlBhcnNpbmcgWUFNTCBmaWxlXCIpO1xyXG4gICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBvYmogPSBqc3lhbWwubG9hZChkYXRhKTtcclxuICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcIkZhaWxlZCB0byByZWFkIGRyb3BwZWQgZmlsZSBcIiwgZmlsZS5fZmlsZS5uYW1lLCBcIjogXCIsIGVycik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcIlVua25vd24gZmlsZSB0eXBlIGZvciBmaWxlOiBcIiwgZmlsZS5fZmlsZS5uYW1lKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9nLmRlYnVnKFwiRHJvcHBlZCBvYmplY3Q6IFwiLCBvYmopO1xyXG4gICAgICAgICAgICBpZiAoIUt1YmVybmV0ZXNBUEkuZ2V0TmFtZXNwYWNlKG9iaikpIHtcclxuICAgICAgICAgICAgICBvYmoubWV0YWRhdGEubmFtZXNwYWNlID0gbW9kZWwuY3VycmVudE5hbWVzcGFjZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEt1YmVybmV0ZXNBUEkucHV0KHtcclxuICAgICAgICAgICAgICBvYmplY3Q6IG9iaixcclxuICAgICAgICAgICAgICBzdWNjZXNzOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgQ29yZS5ub3RpZmljYXRpb24oXCJzdWNjZXNzXCIsIFwiQXBwbGllZCBcIiArIGZpbGUuX2ZpbGUubmFtZSk7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgbG9nLmluZm8oXCJHb3QgZXJyb3IgYXBwbHlpbmdcIiwgZmlsZS5fZmlsZS5uYW1lLCBcIjogXCIsIGVycik7XHJcbiAgICAgICAgICAgICAgICBDb3JlLm5vdGlmaWNhdGlvbihcIndhcm5pbmdcIiwgXCJGYWlsZWQgdG8gYXBwbHkgXCIgKyBmaWxlLl9maWxlLm5hbWUgKyBcIiwgZXJyb3I6IFwiICsgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUuX2ZpbGUpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgJHNjb3BlLnVwbG9hZGVyLm9uQmVmb3JlVXBsb2FkSXRlbSA9IChpdGVtKSA9PiB7XHJcbiAgICAgICAgbG9nLmRlYnVnKFwiVXBsb2FkaW5nOiBcIiwgaXRlbSk7XHJcbiAgICAgICAgLy9Db3JlLm5vdGlmaWNhdGlvbignaW5mbycsICdVcGxvYWRpbmcgJyArIGl0ZW0pO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgJHNjb3BlLnVwbG9hZGVyLm9uU3VjY2Vzc0l0ZW0gPSAoaXRlbTpGaWxlVXBsb2FkLklGaWxlSXRlbSkgPT4ge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhcIm9uU3VjY2Vzc0l0ZW06IFwiLCBpdGVtKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgICRzY29wZS51cGxvYWRlci5vbkVycm9ySXRlbSA9IChpdGVtLCByZXNwb25zZSwgc3RhdHVzKSA9PiB7XHJcbiAgICAgICAgbG9nLmRlYnVnKFwiRmFpbGVkIHRvIGFwcGx5LCByZXNwb25zZTogXCIsIHJlc3BvbnNlLCBcIiBzdGF0dXM6IFwiLCBzdGF0dXMpO1xyXG4gICAgICB9XHJcblxyXG4gIH1dKTtcclxuXHRcclxuXHRleHBvcnQgdmFyIE5hbWVzcGFjZUNvbnRyb2xsZXIgPSBjb250cm9sbGVyKCdOYW1lc3BhY2VDb250cm9sbGVyJywgWyckc2NvcGUnLCAnV2F0Y2hlclNlcnZpY2UnLCAoJHNjb3BlLCB3YXRjaGVyOldhdGNoZXJTZXJ2aWNlKSA9PiB7XHJcblx0XHQkc2NvcGUubmFtZXNwYWNlcyA9IHdhdGNoZXIuZ2V0T2JqZWN0cygnbmFtZXNwYWNlcycpO1xyXG5cdFx0JHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ25hbWVzcGFjZXMnLCAobmV3VmFsdWUsIG9sZFZhbHVlKSA9PiB7XHJcblx0XHRcdGlmIChuZXdWYWx1ZSAhPT0gb2xkVmFsdWUpIHtcclxuXHRcdFx0XHQkc2NvcGUubmFtZXNwYWNlID0gd2F0Y2hlci5nZXROYW1lc3BhY2UoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHQkc2NvcGUuJHdhdGNoKCduYW1lc3BhY2UnLCAobmV3VmFsdWUsIG9sZFZhbHVlKSA9PiB7XHJcblx0XHRcdGlmIChuZXdWYWx1ZSAhPT0gb2xkVmFsdWUpIHtcclxuXHRcdFx0XHRpZiAobmV3VmFsdWUgIT09IG9sZFZhbHVlKSB7XHJcblx0XHRcdFx0XHR3YXRjaGVyLnNldE5hbWVzcGFjZShuZXdWYWx1ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XSk7XHJcblxyXG4gIGV4cG9ydCB2YXIgVG9wTGV2ZWwgPSBjb250cm9sbGVyKFwiVG9wTGV2ZWxcIiwgW1wiJHNjb3BlXCIsIFwiS3ViZXJuZXRlc1ZlcnNpb25cIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgKCRzY29wZSwgS3ViZXJuZXRlc1ZlcnNpb246bmcucmVzb3VyY2UuSVJlc291cmNlQ2xhc3M8YW55PiwgS3ViZXJuZXRlc1N0YXRlKSA9PiB7XHJcblxyXG4gICAgJHNjb3BlLnZlcnNpb24gPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgJHNjb3BlLnNob3dBcHBWaWV3ID0gaXNBcHBWaWV3KCk7XHJcblxyXG4gICAgJHNjb3BlLmlzQWN0aXZlID0gKGhyZWYpID0+IHtcclxuICAgICAgcmV0dXJuIGlzTGlua0FjdGl2ZShocmVmKTtcclxuICAgIH07XHJcblxyXG4gICAgJHNjb3BlLm1vZGUgPSAneWFtbCc7XHJcbiAgICAkc2NvcGUucmF3TW9kZSA9IHRydWU7XHJcbiAgICAkc2NvcGUuZGlydHkgPSBmYWxzZTtcclxuICAgICRzY29wZS5yZWFkT25seSA9IHRydWU7XHJcbiAgICAkc2NvcGUucmF3TW9kZWwgPSBudWxsO1xyXG5cclxuICAgICRzY29wZS4kb24oJ2hhd3Rpb0VkaXRvcl9kZWZhdWx0X2RpcnR5JywgKCRldmVudCwgZGlydHkpID0+IHtcclxuICAgICAgJHNjb3BlLmRpcnR5ID0gZGlydHk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAkc2NvcGUuc2F2ZSA9IChyYXdNb2RlbCkgPT4ge1xyXG4gICAgICB2YXIgb2JqOmFueSA9IG51bGw7XHJcbiAgICAgIHZhciBzdHIgPSByYXdNb2RlbC5yZXBsYWNlKC9cXHQvZywgXCIgICAgXCIpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIG9iaiA9IGpzeWFtbC5sb2FkKHN0cik7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIENvcmUubm90aWZpY2F0aW9uKFwid2FybmluZ1wiLCBcIkZhaWxlZCB0byBzYXZlIG9iamVjdCwgZXJyb3I6IFxcXCJcIiArIGVyciArIFwiXFxcIlwiKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIW9iaikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICAkc2NvcGUucmVhZE9ubHkgPSB0cnVlO1xyXG4gICAgICBLdWJlcm5ldGVzQVBJLnB1dCh7XHJcbiAgICAgICAgb2JqZWN0OiBvYmosXHJcbiAgICAgICAgc3VjY2VzczogKGRhdGEpID0+IHtcclxuICAgICAgICAgICRzY29wZS5kaXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgICAgQ29yZS5ub3RpZmljYXRpb24oXCJzdWNjZXNzXCIsIFwiU2F2ZWQgb2JqZWN0IFwiICsgZ2V0TmFtZShvYmopKTtcclxuICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJHb3QgZXJyb3I6IFwiLCBlcnIpO1xyXG4gICAgICAgICAgQ29yZS5ub3RpZmljYXRpb24oXCJ3YXJuaW5nXCIsIFwiRmFpbGVkIHRvIHNhdmUgb2JqZWN0LCBlcnJvcjogXFxcIlwiICsgZXJyLm1lc3NhZ2UgKyBcIlxcXCJcIik7XHJcbiAgICAgICAgICAkc2NvcGUuZGlydHkgPSBmYWxzZTtcclxuICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG5cclxuICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG5cclxuICAgIEt1YmVybmV0ZXNWZXJzaW9uLnF1ZXJ5KChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAkc2NvcGUudmVyc2lvbiA9IHJlc3BvbnNlO1xyXG4gICAgfSk7XHJcblxyXG4gIH1dKTtcclxuXHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNQbHVnaW4udHNcIi8+XHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHRcclxuXHRleHBvcnQgdmFyIE5hbWVzcGFjZUNvbnRyb2xsZXIgPSBjb250cm9sbGVyKFwiTmFtZXNwYWNlQ29udHJvbGxlclwiLCBbXCIkc2NvcGVcIiwgXCJXYXRjaGVyU2VydmljZVwiLCAoJHNjb3BlLCB3YXRjaGVyOldhdGNoZXJTZXJ2aWNlKSA9PiB7XHJcblx0XHQkc2NvcGUud2F0Y2hlciA9IHdhdGNoZXI7XHJcblx0XHQkc2NvcGUubmFtZXNwYWNlT2JqZWN0cyA9IHdhdGNoZXIuZ2V0T2JqZWN0cygnbmFtZXNwYWNlcycpO1xyXG5cdFx0JHNjb3BlLm5hbWVzcGFjZSA9IHdhdGNoZXIuZ2V0TmFtZXNwYWNlKCk7XHJcblx0XHQkc2NvcGUubmFtZXNwYWNlcyA9IFtdO1xyXG5cdFx0JHNjb3BlLiR3YXRjaCgnbmFtZXNwYWNlJywgKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgPT4ge1xyXG5cdFx0XHRpZiAobmV3VmFsdWUgIT09IG9sZFZhbHVlKSB7XHJcblx0XHRcdFx0d2F0Y2hlci5zZXROYW1lc3BhY2UobmV3VmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdCRzY29wZS4kd2F0Y2goJ3dhdGNoZXIuZ2V0TmFtZXNwYWNlKCknLCAobmV3VmFsdWUsIG9sZFZhbHVlKSA9PiB7XHJcblx0XHRcdGlmIChuZXdWYWx1ZSAhPT0gb2xkVmFsdWUpIHtcclxuXHRcdFx0XHQkc2NvcGUubmFtZXNwYWNlID0gbmV3VmFsdWU7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0JHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ25hbWVzcGFjZU9iamVjdHMnLCAobmFtZXNwYWNlT2JqZWN0cykgPT4ge1xyXG5cdFx0XHQkc2NvcGUubmFtZXNwYWNlcyA9IF8ubWFwKG5hbWVzcGFjZU9iamVjdHMsIChuYW1lc3BhY2U6YW55KSA9PiBuYW1lc3BhY2UubWV0YWRhdGEubmFtZSk7XHJcblx0XHR9KVx0XHRcclxuXHR9XSk7XHJcblx0XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzSGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNQbHVnaW4udHNcIi8+XHJcblxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIHZhciBPdmVydmlld0RpcmVjdGl2ZSA9IF9tb2R1bGUuZGlyZWN0aXZlKFwia3ViZXJuZXRlc092ZXJ2aWV3XCIsIFtcIiR0ZW1wbGF0ZUNhY2hlXCIsIFwiJGNvbXBpbGVcIiwgXCIkaW50ZXJwb2xhdGVcIiwgXCIkdGltZW91dFwiLCBcIiR3aW5kb3dcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgJ0t1YmVybmV0ZXNNb2RlbCcsICgkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRjb21waWxlOm5nLklDb21waWxlU2VydmljZSwgJGludGVycG9sYXRlOm5nLklJbnRlcnBvbGF0ZVNlcnZpY2UsICR0aW1lb3V0Om5nLklUaW1lb3V0U2VydmljZSwgJHdpbmRvdzpuZy5JV2luZG93U2VydmljZSwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzTW9kZWwpID0+IHtcclxuXHJcbiAgICB2YXIgbG9nID0gTG9nZ2VyLmdldCgna3ViZXJuZXRlcy1vdmVydmlldycpO1xyXG4gICAgdmFyIG1vZGVsID0gS3ViZXJuZXRlc01vZGVsO1xyXG4gICAgdmFyIHN0YXRlID0gS3ViZXJuZXRlc1N0YXRlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlc3RyaWN0OiAnRScsXHJcbiAgICAgIHJlcGxhY2U6IHRydWUsXHJcbiAgICAgIGxpbms6IChzY29wZSwgZWxlbWVudCwgYXR0cikgPT4ge1xyXG4gICAgICAgIHNjb3BlLm1vZGVsID0gbW9kZWw7XHJcbiAgICAgICAgZWxlbWVudC5jc3Moe3Zpc2liaWxpdHk6ICdoaWRkZW4nfSk7XHJcbiAgICAgICAgc2NvcGUuZ2V0RW50aXR5ID0gKHR5cGU6c3RyaW5nLCBrZXk6c3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnaG9zdCc6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsLnBvZHNCeUhvc3Rba2V5XTtcclxuICAgICAgICAgICAgY2FzZSAncG9kJzpcclxuICAgICAgICAgICAgICByZXR1cm4gbW9kZWwucG9kc0J5S2V5W2tleV07XHJcbiAgICAgICAgICAgIGNhc2UgJ3JlcGxpY2F0aW9uQ29udHJvbGxlcic6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsLnJlcGxpY2F0aW9uQ29udHJvbGxlcnNCeUtleVtrZXldO1xyXG4gICAgICAgICAgICBjYXNlICdzZXJ2aWNlJzpcclxuICAgICAgICAgICAgICByZXR1cm4gbW9kZWwuc2VydmljZXNCeUtleVtrZXldO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgc2NvcGUua3ViZXJuZXRlcyA9IHN0YXRlO1xyXG5cclxuICAgICAgICBzY29wZS5jdXN0b21pemVEZWZhdWx0T3B0aW9ucyA9IChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgICBvcHRpb25zLkVuZHBvaW50ID0gWydCbGFuaycsIHt9XTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHNjb3BlLm1vdXNlRW50ZXIgPSAoJGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBpZiAoc2NvcGUuanNQbHVtYikge1xyXG4gICAgICAgICAgICBhbmd1bGFyLmVsZW1lbnQoJGV2ZW50LmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKFwiaG92ZXJlZFwiKTtcclxuICAgICAgICAgICAgc2NvcGUuanNQbHVtYi5nZXRFbmRwb2ludHMoJGV2ZW50LmN1cnJlbnRUYXJnZXQpLmZvckVhY2goKGVuZHBvaW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgZW5kcG9pbnQuY29ubmVjdGlvbnMuZm9yRWFjaCgoY29ubmVjdGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0aW9uLmlzSG92ZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldEhvdmVyKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmVuZHBvaW50cy5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUubW91c2VFbnRlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0OiBlLmVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzY29wZS5tb3VzZUxlYXZlID0gKCRldmVudCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHNjb3BlLmpzUGx1bWIpIHtcclxuICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KCRldmVudC5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcyhcImhvdmVyZWRcIik7XHJcbiAgICAgICAgICAgIHNjb3BlLmpzUGx1bWIuZ2V0RW5kcG9pbnRzKCRldmVudC5jdXJyZW50VGFyZ2V0KS5mb3JFYWNoKChlbmRwb2ludCkgPT4ge1xyXG4gICAgICAgICAgICAgIGVuZHBvaW50LmNvbm5lY3Rpb25zLmZvckVhY2goKGNvbm5lY3Rpb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLmlzSG92ZXIoKSkge1xyXG4gICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldEhvdmVyKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5lbmRwb2ludHMuZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLm1vdXNlTGVhdmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhcmdldDogZS5lbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLypcclxuICAgICAgICBzY29wZS5jdXN0b21pemVFbmRwb2ludE9wdGlvbnMgPSAoanNQbHVtYiwgbm9kZSwgb3B0aW9ucykgPT4ge1xyXG4gICAgICAgICAgdmFyIHR5cGUgPSBub2RlLmVsLmF0dHIoJ2RhdGEtdHlwZScpO1xyXG4gICAgICAgICAgLy8gbG9nLmRlYnVnKFwiZW5kcG9pbnQgdHlwZTogXCIsIHR5cGUpO1xyXG4gICAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3BvZCc6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3NlcnZpY2UnOlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdyZXBsaWNhdGlvbkNvbnRyb2xsZXInOlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgKi9cclxuICAgICAgICBzY29wZS5jdXN0b21pemVDb25uZWN0aW9uT3B0aW9ucyA9IChqc1BsdW1iLCBlZGdlLCBwYXJhbXMsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICAgIHZhciB0eXBlID0gZWRnZS5zb3VyY2UuZWwuYXR0cignZGF0YS10eXBlJyk7XHJcbiAgICAgICAgICBvcHRpb25zLmNvbm5lY3RvciA9IFsgXCJCZXppZXJcIiwgeyBjdXJ2aW5lc3M6IDUwLCBzdHViOiAyNSwgYWx3YXlzUmVzcGVjdFN0dWJzOiB0cnVlIH0gXTtcclxuICAgICAgICAgIHBhcmFtcy5wYWludFN0eWxlID0ge1xyXG4gICAgICAgICAgICBsaW5lV2lkdGg6IDIsXHJcbiAgICAgICAgICAgIHN0cm9rZVN0eWxlOiAnIzU1NTVjYydcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAncG9kJzpcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnc2VydmljZSc6XHJcbiAgICAgICAgICAgICAgcGFyYW1zLmFuY2hvcnMgPSBbXHJcbiAgICAgICAgICAgICAgICBbIFwiQ29udGludW91c1wiLCB7IGZhY2VzOiBbXCJyaWdodFwiXSB9IF0sXHJcbiAgICAgICAgICAgICAgICBbIFwiQ29udGludW91c1wiLCB7IGZhY2VzOiBbXCJsZWZ0XCJdIH0gXSBcclxuICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICBbMSwgMC41LCAwLCAwLCAtMTAsIC05MF0sXHJcbiAgICAgICAgICAgICAgICBbMCwgMC41LCAwLCAwLCAtMTAsIC05MF1cclxuICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAncmVwbGljYXRpb25Db250cm9sbGVyJzpcclxuICAgICAgICAgICAgICBwYXJhbXMuYW5jaG9ycyA9IFtcclxuICAgICAgICAgICAgICAgIFsgXCJQZXJpbWV0ZXJcIiwgeyBzaGFwZTogXCJDaXJjbGVcIiB9IF0sXHJcbiAgICAgICAgICAgICAgICBbIFwiQ29udGludW91c1wiLCB7IGZhY2VzOiBbXCJyaWdodFwiXSB9IF1cclxuICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICBbMCwgMC41LCAwLCAwLCAtMTAsIC05MF0sXHJcbiAgICAgICAgICAgICAgICBbMSwgMC41LCAwLCAwLCAtMTAsIC05MF1cclxuICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vbG9nLmRlYnVnKFwiY29ubmVjdGlvbiBzb3VyY2UgdHlwZTogXCIsIHR5cGUpO1xyXG4gICAgICAgICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZSh0ZW1wbGF0ZSwgY29uZmlnKSB7XHJcbiAgICAgICAgICByZXR1cm4gJGludGVycG9sYXRlKHRlbXBsYXRlKShjb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRlbXBsYXRlLCB0aGluZ05hbWUsIHRoaW5nKSB7XHJcbiAgICAgICAgICB2YXIgY29uZmlnID0ge307XHJcbiAgICAgICAgICBjb25maWdbdGhpbmdOYW1lXSA9IHRoaW5nO1xyXG4gICAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKHRlbXBsYXRlLCBjb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50cyh0ZW1wbGF0ZSwgdGhpbmdOYW1lLCB0aGluZ3MpIHtcclxuICAgICAgICAgIHJldHVybiB0aGluZ3MubWFwKCh0aGluZykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudCh0ZW1wbGF0ZSwgdGhpbmdOYW1lLCB0aGluZyk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnVuY3Rpb24gYXBwZW5kTmV3RWxlbWVudHMocGFyZW50RWwsIHRlbXBsYXRlLCB0aGluZ05hbWUsIHRoaW5ncykge1xyXG4gICAgICAgICAgdGhpbmdzLmZvckVhY2goKHRoaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBrZXkgPSB0aGluZ1snX2tleSddIHx8IHRoaW5nWydlbGVtZW50SWQnXSB8fCB0aGluZ1snaWQnXVxyXG4gICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSBwYXJlbnRFbC5maW5kKFwiI1wiICsga2V5ICk7XHJcbiAgICAgICAgICAgIGlmICghZXhpc3RpbmcubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgbG9nLmRlYnVnKFwiZXhpc3Rpbmc6IFwiLCBleGlzdGluZywgXCIga2V5OiBcIiwga2V5KTtcclxuICAgICAgICAgICAgICBwYXJlbnRFbC5hcHBlbmQoJGNvbXBpbGUoY3JlYXRlRWxlbWVudCh0ZW1wbGF0ZSwgdGhpbmdOYW1lLCB0aGluZykpKHNjb3BlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmdW5jdGlvbiBuYW1lc3BhY2VGaWx0ZXIoaXRlbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2V0TmFtZXNwYWNlKGl0ZW0pID09PSBzY29wZS5rdWJlcm5ldGVzLnNlbGVjdGVkTmFtZXNwYWNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmdW5jdGlvbiBmaXJzdERyYXcoKSB7XHJcbiAgICAgICAgICBsb2cuZGVidWcoXCJGaXJzdCBkcmF3XCIpO1xyXG4gICAgICAgICAgZWxlbWVudC5lbXB0eSgpO1xyXG4gICAgICAgICAgdmFyIHNlcnZpY2VzID0gbW9kZWwuc2VydmljZXM7XHJcbiAgICAgICAgICB2YXIgcmVwbGljYXRpb25Db250cm9sbGVycyA9IG1vZGVsLnJlcGxpY2F0aW9uQ29udHJvbGxlcnM7XHJcbiAgICAgICAgICB2YXIgcG9kcyA9IG1vZGVsLnBvZHM7XHJcbiAgICAgICAgICB2YXIgaG9zdHMgPSBtb2RlbC5ob3N0cztcclxuICAgICAgICAgIC8vIGxvZy5kZWJ1ZyhcImhvc3RzOiBcIiwgbW9kZWwuaG9zdHMpO1xyXG4gICAgICAgICAgdmFyIHBhcmVudEVsID0gYW5ndWxhci5lbGVtZW50KCR0ZW1wbGF0ZUNhY2hlLmdldChcIm92ZXJ2aWV3VGVtcGxhdGUuaHRtbFwiKSk7XHJcbiAgICAgICAgICB2YXIgc2VydmljZXNFbCA9IHBhcmVudEVsLmZpbmQoXCIuc2VydmljZXNcIik7XHJcbiAgICAgICAgICB2YXIgaG9zdHNFbCA9IHBhcmVudEVsLmZpbmQoXCIuaG9zdHNcIik7XHJcbiAgICAgICAgICB2YXIgcmVwbGljYXRpb25Db250cm9sbGVyc0VsID0gcGFyZW50RWwuZmluZChcIi5yZXBsaWNhdGlvbkNvbnRyb2xsZXJzXCIpO1xyXG5cclxuICAgICAgICAgIHNlcnZpY2VzRWwuYXBwZW5kKGNyZWF0ZUVsZW1lbnRzKCR0ZW1wbGF0ZUNhY2hlLmdldChcInNlcnZpY2VUZW1wbGF0ZS5odG1sXCIpLCAnc2VydmljZScsIHNlcnZpY2VzLmZpbHRlcihuYW1lc3BhY2VGaWx0ZXIpKSk7XHJcbiAgICAgICAgICByZXBsaWNhdGlvbkNvbnRyb2xsZXJzRWwuYXBwZW5kKGNyZWF0ZUVsZW1lbnRzKCR0ZW1wbGF0ZUNhY2hlLmdldChcInJlcGxpY2F0aW9uQ29udHJvbGxlclRlbXBsYXRlLmh0bWxcIiksICdyZXBsaWNhdGlvbkNvbnRyb2xsZXInLCByZXBsaWNhdGlvbkNvbnRyb2xsZXJzLmZpbHRlcihuYW1lc3BhY2VGaWx0ZXIpKSk7XHJcblxyXG4gICAgICAgICAgaG9zdHMuZm9yRWFjaCgoaG9zdCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgaG9zdEVsID0gYW5ndWxhci5lbGVtZW50KGNyZWF0ZUVsZW1lbnQoJHRlbXBsYXRlQ2FjaGUuZ2V0KFwib3ZlcnZpZXdIb3N0VGVtcGxhdGUuaHRtbFwiKSwgJ2hvc3QnLCBob3N0KSk7XHJcbiAgICAgICAgICAgIHZhciBwb2RDb250YWluZXIgPSBhbmd1bGFyLmVsZW1lbnQoaG9zdEVsLmZpbmQoJy5wb2QtY29udGFpbmVyJykpO1xyXG4gICAgICAgICAgICBwb2RDb250YWluZXIuYXBwZW5kKGNyZWF0ZUVsZW1lbnRzKCR0ZW1wbGF0ZUNhY2hlLmdldChcInBvZFRlbXBsYXRlLmh0bWxcIiksIFwicG9kXCIsIGhvc3QucG9kcykpO1xyXG4gICAgICAgICAgICBob3N0c0VsLmFwcGVuZChob3N0RWwpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAvL3BhcmVudEVsLmFwcGVuZChjcmVhdGVFbGVtZW50cygkdGVtcGxhdGVDYWNoZS5nZXQoXCJwb2RUZW1wbGF0ZS5odG1sXCIpLCAncG9kJywgcG9kcykpO1xyXG4gICAgICAgICAgZWxlbWVudC5hcHBlbmQoJGNvbXBpbGUocGFyZW50RWwpKHNjb3BlKSk7XHJcbiAgICAgICAgICAkdGltZW91dCgoKSA9PiB7IGVsZW1lbnQuY3NzKHt2aXNpYmlsaXR5OiAndmlzaWJsZSd9KTsgfSwgMjUwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcclxuICAgICAgICAgIHNjb3BlLiRlbWl0KCdqc3BsdW1iRG9XaGlsZVN1c3BlbmRlZCcsICgpID0+IHtcclxuICAgICAgICAgICAgbG9nLmRlYnVnKFwiVXBkYXRlXCIpO1xyXG4gICAgICAgICAgICB2YXIgc2VydmljZXMgPSBtb2RlbC5zZXJ2aWNlcztcclxuICAgICAgICAgICAgdmFyIHJlcGxpY2F0aW9uQ29udHJvbGxlcnMgPSBtb2RlbC5yZXBsaWNhdGlvbkNvbnRyb2xsZXJzO1xyXG4gICAgICAgICAgICB2YXIgcG9kcyA9IG1vZGVsLnBvZHM7XHJcbiAgICAgICAgICAgIHZhciBob3N0cyA9IG1vZGVsLmhvc3RzO1xyXG4gICAgICAgICAgICB2YXIgcGFyZW50RWwgPSBlbGVtZW50LmZpbmQoJ1toYXd0aW8tanNwbHVtYl0nKTtcclxuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gcGFyZW50RWwuZmluZCgnLmpzcGx1bWItbm9kZScpO1xyXG4gICAgICAgICAgICBjaGlsZHJlbi5lYWNoKChpbmRleCwgYykgPT4ge1xyXG4gICAgICAgICAgICAgIHZhciBjaGlsZCA9IGFuZ3VsYXIuZWxlbWVudChjKTtcclxuICAgICAgICAgICAgICB2YXIga2V5ID0gY2hpbGQuYXR0cignaWQnKTtcclxuICAgICAgICAgICAgICBsb2cuZGVidWcoJ2tleTogJywga2V5KTtcclxuICAgICAgICAgICAgICBpZiAoQ29yZS5pc0JsYW5rKGtleSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdmFyIHR5cGUgPSBjaGlsZC5hdHRyKCdkYXRhLXR5cGUnKTtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2hvc3QnOlxyXG4gICAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1vZGVsLnBvZHNCeUhvc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdzZXJ2aWNlJzpcclxuICAgICAgICAgICAgICAgICAgaWYgKGtleSBpbiBtb2RlbC5zZXJ2aWNlc0J5S2V5ICYmIGdldE5hbWVzcGFjZShtb2RlbC5zZXJ2aWNlc0J5S2V5W2tleV0pID09IHNjb3BlLmt1YmVybmV0ZXMuc2VsZWN0ZWROYW1lc3BhY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VydmljZSA9IG1vZGVsLnNlcnZpY2VzQnlLZXlba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5hdHRyKCdjb25uZWN0LXRvJywgc2VydmljZS5jb25uZWN0VG8pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3BvZCc6XHJcbiAgICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAgIGlmIChoYXNJZChwb2RzLCBpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgICAgaWYgKGtleSBpbiBtb2RlbC5wb2RzQnlLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdyZXBsaWNhdGlvbkNvbnRyb2xsZXInOlxyXG4gICAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1vZGVsLnJlcGxpY2F0aW9uQ29udHJvbGxlcnNCeUtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXBsaWNhdGlvbkNvbnRyb2xsZXIgPSBtb2RlbC5yZXBsaWNhdGlvbkNvbnRyb2xsZXJzQnlLZXlba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5hdHRyKCdjb25uZWN0LXRvJywgcmVwbGljYXRpb25Db250cm9sbGVyLmNvbm5lY3RUbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKFwiSWdub3JpbmcgZWxlbWVudCB3aXRoIHVua25vd24gdHlwZVwiKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBsb2cuZGVidWcoXCJSZW1vdmluZzogXCIsIGtleSk7XHJcbiAgICAgICAgICAgICAgY2hpbGQucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB2YXIgc2VydmljZXNFbCA9IGVsZW1lbnQuZmluZChcIi5zZXJ2aWNlc1wiKTtcclxuICAgICAgICAgICAgdmFyIHJlcGxpY2F0aW9uQ29udHJvbGxlcnNFbCA9IGVsZW1lbnQuZmluZChcIi5yZXBsaWNhdGlvbkNvbnRyb2xsZXJzXCIpO1xyXG4gICAgICAgICAgICB2YXIgaG9zdHNFbCA9IGVsZW1lbnQuZmluZChcIi5ob3N0c1wiKTtcclxuXHJcbiAgICAgICAgICAgIGFwcGVuZE5ld0VsZW1lbnRzKHNlcnZpY2VzRWwsICR0ZW1wbGF0ZUNhY2hlLmdldChcInNlcnZpY2VUZW1wbGF0ZS5odG1sXCIpLCBcInNlcnZpY2VcIiwgc2VydmljZXMpO1xyXG4gICAgICAgICAgICBhcHBlbmROZXdFbGVtZW50cyhyZXBsaWNhdGlvbkNvbnRyb2xsZXJzRWwsICR0ZW1wbGF0ZUNhY2hlLmdldChcInJlcGxpY2F0aW9uQ29udHJvbGxlclRlbXBsYXRlLmh0bWxcIiksIFwicmVwbGljYXRpb25Db250cm9sbGVyXCIsIHJlcGxpY2F0aW9uQ29udHJvbGxlcnMpO1xyXG4gICAgICAgICAgICBhcHBlbmROZXdFbGVtZW50cyhob3N0c0VsLCAkdGVtcGxhdGVDYWNoZS5nZXQoXCJvdmVydmlld0hvc3RUZW1wbGF0ZS5odG1sXCIpLCBcImhvc3RcIiwgaG9zdHMpO1xyXG4gICAgICAgICAgICBob3N0cy5mb3JFYWNoKChob3N0KSA9PiB7XHJcbiAgICAgICAgICAgICAgdmFyIGhvc3RFbCA9IGFuZ3VsYXIuZWxlbWVudChob3N0c0VsLmZpbmQoXCIjXCIgKyBob3N0LmVsZW1lbnRJZCkpO1xyXG4gICAgICAgICAgICAgIHZhciBwb2RDb250YWluZXIgPSBhbmd1bGFyLmVsZW1lbnQoaG9zdEVsLmZpbmQoJy5wb2QtY29udGFpbmVyJykpO1xyXG4gICAgICAgICAgICAgIGFwcGVuZE5ld0VsZW1lbnRzKHBvZENvbnRhaW5lciwgJHRlbXBsYXRlQ2FjaGUuZ2V0KFwicG9kVGVtcGxhdGUuaHRtbFwiKSwgXCJwb2RcIiwgaG9zdC5wb2RzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHJlZnJlc2hEcmF3aW5nKCkge1xyXG4gICAgICAgICAgbG9nLmRlYnVnKFwiUmVmcmVzaGluZyBkcmF3aW5nXCIpO1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4oKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgZmlyc3REcmF3KCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB1cGRhdGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIENvcmUuJGFwcGx5KHNjb3BlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjb3BlLiRvbigna3ViZXJuZXRlc01vZGVsVXBkYXRlZCcsIF8uZGVib3VuY2UocmVmcmVzaERyYXdpbmcsIDUwMCwgeyB0cmFpbGluZzogdHJ1ZX0pKTtcclxuICAgICAgICBzZXRUaW1lb3V0KHJlZnJlc2hEcmF3aW5nLCAxMDApO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1dKTtcclxuXHJcbiAgdmFyIE92ZXJ2aWV3Qm94Q29udHJvbGxlciA9IGNvbnRyb2xsZXIoXCJPdmVydmlld0JveENvbnRyb2xsZXJcIiwgW1wiJHNjb3BlXCIsIFwiJGxvY2F0aW9uXCIsICgkc2NvcGUsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlKSA9PiB7XHJcbiAgICAkc2NvcGUudmlld0RldGFpbHMgPSAoZW50aXR5LCBwYXRoOnN0cmluZykgPT4ge1xyXG4gICAgICBpZiAoZW50aXR5KSB7XHJcbiAgICAgICAgdmFyIG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZShlbnRpdHkpO1xyXG4gICAgICAgIHZhciBpZCA9IGdldE5hbWUoZW50aXR5KTtcclxuICAgICAgICAkbG9jYXRpb24ucGF0aChVcmxIZWxwZXJzLmpvaW4oJy9rdWJlcm5ldGVzL25hbWVzcGFjZScsIG5hbWVzcGFjZSwgcGF0aCwgaWQpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsb2cud2FybihcIk5vIGVudGl0eSBmb3Igdmlld0RldGFpbHMhXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfV0pO1xyXG5cclxuICB2YXIgc2NvcGVOYW1lID0gXCJPdmVydmlld0NvbnRyb2xsZXJcIjtcclxuXHJcbiAgdmFyIE92ZXJ2aWV3Q29udHJvbGxlciA9IGNvbnRyb2xsZXIoc2NvcGVOYW1lLCBbXCIkc2NvcGVcIiwgXCIkbG9jYXRpb25cIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwiS3ViZXJuZXRlc01vZGVsXCIsXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCJLdWJlcm5ldGVzQXBpVVJMXCIsICgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKSA9PiB7XHJcbiAgICAkc2NvcGUubmFtZSA9IHNjb3BlTmFtZTtcclxuICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG4gICAgJHNjb3BlLm1vZGVsID0gS3ViZXJuZXRlc01vZGVsO1xyXG5cclxuICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuXHJcbiAgICAvLyRzY29wZS5zdWJUYWJDb25maWcgPSBbXTtcclxuICB9XSk7XHJcblxyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNQbHVnaW4udHNcIi8+XHJcblxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIGV4cG9ydCB2YXIgUGlwZWxpbmVzQ29udHJvbGxlciA9IGNvbnRyb2xsZXIoXCJQaXBlbGluZXNDb250cm9sbGVyXCIsIFtcIiRzY29wZVwiLCBcIkt1YmVybmV0ZXNNb2RlbFwiLCBcIkt1YmVybmV0ZXNTdGF0ZVwiLCBcIiRkaWFsb2dcIiwgXCIkd2luZG93XCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkbG9jYXRpb25cIiwgXCJsb2NhbFN0b3JhZ2VcIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiS3ViZXJuZXRlc0FwaVVSTFwiLFxyXG4gICAgKCRzY29wZSwgS3ViZXJuZXRlc01vZGVsOkt1YmVybmV0ZXMuS3ViZXJuZXRlc01vZGVsU2VydmljZSwgS3ViZXJuZXRlc1N0YXRlLCAkZGlhbG9nLCAkd2luZG93LCAkdGVtcGxhdGVDYWNoZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgbG9jYWxTdG9yYWdlLCAkaHR0cCwgJHRpbWVvdXQsIEt1YmVybmV0ZXNBcGlVUkwpID0+IHtcclxuXHJcbiAgICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG4gICAgICAkc2NvcGUubW9kZWwgPSBLdWJlcm5ldGVzTW9kZWw7XHJcblxyXG4gICAgICBLdWJlcm5ldGVzLmluaXRTaGFyZWQoJHNjb3BlLCAkbG9jYXRpb24sICRodHRwLCAkdGltZW91dCwgJHJvdXRlUGFyYW1zLCBLdWJlcm5ldGVzTW9kZWwsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc0FwaVVSTCk7XHJcblxyXG4gICAgICAvKipcclxuICAgICAgICogTGV0cyB1cGRhdGUgdGhlIHZhcmlvdXMgZGF0YSB0byBqb2luIHRoZW0gdG9nZXRoZXIgdG8gYSBwaXBlbGluZSBtb2RlbFxyXG4gICAgICAgKi9cclxuICAgICAgZnVuY3Rpb24gdXBkYXRlRGF0YSgpIHtcclxuICAgICAgICB2YXIgcGlwZWxpbmVTdGVwcyA9IHt9O1xyXG4gICAgICAgIGlmICgkc2NvcGUuYnVpbGRDb25maWdzICYmICRzY29wZS5idWlsZHMgJiYgJHNjb3BlLmRlcGxveW1lbnRDb25maWdzKSB7XHJcbiAgICAgICAgICBlbnJpY2hCdWlsZENvbmZpZ3MoJHNjb3BlLmJ1aWxkQ29uZmlncywgJHNjb3BlLmJ1aWxkcyk7XHJcbiAgICAgICAgICAkc2NvcGUuZmV0Y2hlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKCRzY29wZS5idWlsZENvbmZpZ3MsIChidWlsZENvbmZpZykgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcGlwZWxpbmVLZXkgPSBjcmVhdGVQaXBlbGluZUtleShidWlsZENvbmZpZyk7XHJcbiAgICAgICAgICAgIGlmIChwaXBlbGluZUtleSkge1xyXG4gICAgICAgICAgICAgIHBpcGVsaW5lU3RlcHNbcGlwZWxpbmVLZXldID0ge1xyXG4gICAgICAgICAgICAgICAgYnVpbGRDb25maWc6IGJ1aWxkQ29uZmlnLFxyXG4gICAgICAgICAgICAgICAgYnVpbGRzOiBbXSxcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJlZEJ5OiBudWxsLFxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlcnNTdGVwczogW10sXHJcbiAgICAgICAgICAgICAgICAkY2xhc3M6ICdwaXBlbGluZS1idWlsZCdcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKCRzY29wZS5idWlsZHMsIChidWlsZCkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcGlwZWxpbmVLZXkgPSBjcmVhdGVQaXBlbGluZUtleShidWlsZCk7XHJcbiAgICAgICAgICAgIGlmIChwaXBlbGluZUtleSkge1xyXG4gICAgICAgICAgICAgIHZhciBwaXBlbGluZSA9IHBpcGVsaW5lU3RlcHNbcGlwZWxpbmVLZXldO1xyXG4gICAgICAgICAgICAgIGlmICghcGlwZWxpbmUpIHtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJ3YXJuaW5nIG5vIHBpcGVsaW5lIGdlbmVyYXRlZCBmb3IgYnVpbGRDb25maWcgZm9yIGtleSBcIiArIHBpcGVsaW5lS2V5ICsgXCIgZm9yIGJ1aWxkIFwiICsgYW5ndWxhci50b0pzb24oYnVpbGQsIHRydWUpKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwid2FybmluZyBubyBwaXBlbGluZSBnZW5lcmF0ZWQgZm9yIGJ1aWxkQ29uZmlnIGZvciBrZXkgXCIgKyBwaXBlbGluZUtleSArIFwiIGZvciBidWlsZCBcIiArIGJ1aWxkLiRuYW1lKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGlwZWxpbmUuYnVpbGRzLnB1c2goYnVpbGQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gVE9ETyBub3cgd2UgbmVlZCB0byBsb29rIGF0IHRoZSB0cmlnZ2VycyB0byBmaWd1cmUgb3V0IHdoaWNoIHBpcGVsaW5lU3RlcHMgdHJpZ2dlcnMgZWFjaCBwaXBlbGluZVN0ZXBcclxuXHJcblxyXG4gICAgICAgICAgLy8gbm93IGxldHMgY3JlYXRlIGFuIGFycmF5IG9mIGFsbCBwaXBlbGluZXMsIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IGtub3duIHN0ZXAgd2l0aCBhIGxpc3Qgb2YgdGhlIHN0ZXBzXHJcblxyXG4gICAgICAgICAgdmFyIHBpcGVsaW5lcyA9IFtdO1xyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHBpcGVsaW5lU3RlcHMsIChwaXBlbGluZVN0ZXAsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXBpcGVsaW5lU3RlcC50cmlnZ2VyZWRCeSkge1xyXG4gICAgICAgICAgICAgIC8vIHdlIGFyZSBhIHJvb3Qgc3RlcC4uLi5cclxuICAgICAgICAgICAgICBwaXBlbGluZXMucHVzaChwaXBlbGluZVN0ZXApO1xyXG4gICAgICAgICAgICAgIC8vIG5vdyBsZXRzIGFkZCBhbGwgdGhlIHN0ZXBzIGZvciB0aGlzIGtleS4uLlxyXG4gICAgICAgICAgICAgIHBpcGVsaW5lU3RlcC50cmlnZ2Vyc1N0ZXBzLnB1c2gocGlwZWxpbmVTdGVwKTtcclxuICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocGlwZWxpbmVTdGVwcywgKHN0ZXApID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzdGVwLnRyaWdnZXJlZEJ5ID09PSBrZXkpIHtcclxuICAgICAgICAgICAgICAgICAgcGlwZWxpbmVTdGVwLnRyaWdnZXJzU3RlcHMucHVzaChzdGVwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKCRzY29wZS5kZXBsb3ltZW50Q29uZmlncywgKGRlcGxveW1lbnRDb25maWcpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFkZXBsb3ltZW50Q29uZmlnLmtpbmQpIHtcclxuICAgICAgICAgICAgICBkZXBsb3ltZW50Q29uZmlnLmtpbmQgPSBcIkRlcGxveW1lbnRDb25maWdcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goZGVwbG95bWVudENvbmZpZy50cmlnZ2VycywgKHRyaWdnZXIpID0+IHtcclxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IHRyaWdnZXIudHlwZTtcclxuICAgICAgICAgICAgICB2YXIgaW1hZ2VDaGFuZ2VQYXJhbXMgPSB0cmlnZ2VyLmltYWdlQ2hhbmdlUGFyYW1zO1xyXG4gICAgICAgICAgICAgIGlmIChpbWFnZUNoYW5nZVBhcmFtcyAmJiB0eXBlID09PSBcIkltYWdlQ2hhbmdlXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmcm9tID0gaW1hZ2VDaGFuZ2VQYXJhbXMuZnJvbTtcclxuICAgICAgICAgICAgICAgIGlmIChmcm9tKSB7XHJcbiAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gZnJvbS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZnJvbS5raW5kID09PSBcIkltYWdlUmVwb3NpdG9yeVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZyA9IGltYWdlQ2hhbmdlUGFyYW1zLnRhZyB8fCBcImxhdGVzdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBub3cgbGV0cyBmaW5kIGEgcGlwZWxpbmUgc3RlcCB3aGljaCBmaXJlcyBmcm9tIHRoaXNcclxuICAgICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChwaXBlbGluZVN0ZXBzLCAocGlwZWxpbmVTdGVwLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvID0gQ29yZS5wYXRoR2V0KHBpcGVsaW5lU3RlcCwgW1wiYnVpbGRDb25maWdcIiwgXCJwYXJhbWV0ZXJzXCIsIFwib3V0cHV0XCIsIFwidG9cIl0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG8gJiYgKHRvLmtpbmQgPT09IFwiSW1hZ2VSZXBvc2l0b3J5XCIgfHwgdG8ua2luZCA9PT0gXCJJbWFnZVN0cmVhbVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b05hbWUgPSB0by5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b05hbWUgPT09IG5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IENvcmUucGF0aEdldChkZXBsb3ltZW50Q29uZmlnLCBbXCJ0ZW1wbGF0ZVwiLCBcImNvbnRyb2xsZXJUZW1wbGF0ZVwiLCBcInNlbGVjdG9yXCJdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb2RzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJHBvZENvdW50ZXJzID0gc2VsZWN0b3IgPyBjcmVhdGVQb2RDb3VudGVycyhzZWxlY3RvciwgS3ViZXJuZXRlc01vZGVsLnBvZHNGb3JOYW1lc3BhY2UoKSwgcG9kcykgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlcGxveVBpcGVsaW5lU3RlcCA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRDb25maWc6IGRlcGxveW1lbnRDb25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzczogJ3BpcGVsaW5lLWRlcGxveScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwb2RDb3VudGVyczogJHBvZENvdW50ZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcG9kczogcG9kc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lU3RlcC50cmlnZ2Vyc1N0ZXBzLnB1c2goZGVwbG95UGlwZWxpbmVTdGVwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgICRzY29wZS5waXBlbGluZXMgPSBwaXBlbGluZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvKipcclxuICAgICAgICogTGV0cyBjcmVhdGUgYSB1bmlxdWUga2V5IGZvciBidWlsZCAvIGNvbmZpZyB3ZSBjYW4gdXNlIHRvIGRvIGxpbmtpbmcgb2YgYnVpbGRzIC8gY29uZmlncyAvIHRyaWdnZXJzXHJcbiAgICAgICAqL1xyXG4gICAgICBmdW5jdGlvbiBjcmVhdGVQaXBlbGluZUtleShidWlsZENvbmZpZykge1xyXG4gICAgICAgIHJldHVybiBDb3JlLnBhdGhHZXQoYnVpbGRDb25maWcsIFtcInBhcmFtZXRlcnNcIiwgXCJzb3VyY2VcIiwgXCJnaXRcIiwgXCJ1cmlcIl0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAkc2NvcGUuJGtlZXBQb2xsaW5nID0gKCkgPT4ga2VlcFBvbGxpbmdNb2RlbDtcclxuICAgICAgJHNjb3BlLmZldGNoID0gUG9sbEhlbHBlcnMuc2V0dXBQb2xsaW5nKCRzY29wZSwgKG5leHQ6KCkgPT4gdm9pZCkgPT4ge1xyXG4gICAgICAgIHZhciByZWFkeSA9IDA7XHJcbiAgICAgICAgdmFyIG51bVNlcnZpY2VzID0gMztcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gbWF5YmVOZXh0KCkge1xyXG4gICAgICAgICAgaWYgKCsrcmVhZHkgPj0gbnVtU2VydmljZXMpIHtcclxuICAgICAgICAgICAgbmV4dCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHVybCA9IGJ1aWxkc1Jlc3RVUkwoKTtcclxuICAgICAgICAkaHR0cC5nZXQodXJsKS5cclxuICAgICAgICAgIHN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgICAgJHNjb3BlLmJ1aWxkcyA9IGVucmljaEJ1aWxkcyhkYXRhLml0ZW1zKTtcclxuICAgICAgICAgICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbWF5YmVOZXh0KCk7XHJcbiAgICAgICAgICB9KS5cclxuICAgICAgICAgIGVycm9yKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byBsb2FkIFwiICsgdXJsICsgXCIgXCIgKyBkYXRhICsgXCIgXCIgKyBzdGF0dXMpO1xyXG4gICAgICAgICAgICBtYXliZU5leHQoKTtcclxuXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB1cmwgPSBidWlsZENvbmZpZ3NSZXN0VVJMKCk7XHJcbiAgICAgICAgJGh0dHAuZ2V0KHVybCkuXHJcbiAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICRzY29wZS5idWlsZENvbmZpZ3MgPSBkYXRhLml0ZW1zO1xyXG4gICAgICAgICAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBtYXliZU5leHQoKTtcclxuICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgZXJyb3IoZnVuY3Rpb24gKGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKSB7XHJcbiAgICAgICAgICAgIGxvZy53YXJuKFwiRmFpbGVkIHRvIGxvYWQgXCIgKyB1cmwgKyBcIiBcIiArIGRhdGEgKyBcIiBcIiArIHN0YXR1cyk7XHJcbiAgICAgICAgICAgIG1heWJlTmV4dCgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgdXJsID0gZGVwbG95bWVudENvbmZpZ3NSZXN0VVJMKCk7XHJcbiAgICAgICAgJGh0dHAuZ2V0KHVybCkuXHJcbiAgICAgICAgICBzdWNjZXNzKGZ1bmN0aW9uIChkYXRhLCBzdGF0dXMsIGhlYWRlcnMsIGNvbmZpZykge1xyXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICRzY29wZS5kZXBsb3ltZW50Q29uZmlncyA9IGRhdGEuaXRlbXM7XHJcbiAgICAgICAgICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1heWJlTmV4dCgpO1xyXG4gICAgICAgICAgfSkuXHJcbiAgICAgICAgICBlcnJvcihmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWcpIHtcclxuICAgICAgICAgICAgbG9nLndhcm4oXCJGYWlsZWQgdG8gbG9hZCBcIiArIHVybCArIFwiIFwiICsgZGF0YSArIFwiIFwiICsgc3RhdHVzKTtcclxuICAgICAgICAgICAgbWF5YmVOZXh0KCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAkc2NvcGUuZmV0Y2goKTtcclxuICAgIH1dKTtcclxuXHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG5cclxubW9kdWxlIEt1YmVybmV0ZXMge1xyXG5cclxuICBleHBvcnQgdmFyIFBvZENvbnRyb2xsZXIgPSBjb250cm9sbGVyKFwiUG9kQ29udHJvbGxlclwiLFxyXG4gICAgW1wiJHNjb3BlXCIsIFwiS3ViZXJuZXRlc01vZGVsXCIsIFwiS3ViZXJuZXRlc1N0YXRlXCIsIFwiU2VydmljZVJlZ2lzdHJ5XCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkbG9jYXRpb25cIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiJHdpbmRvd1wiLCBcIkt1YmVybmV0ZXNBcGlVUkxcIixcclxuICAgICAgKCRzY29wZSwgS3ViZXJuZXRlc01vZGVsOiBLdWJlcm5ldGVzLkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UsIEt1YmVybmV0ZXNTdGF0ZSwgU2VydmljZVJlZ2lzdHJ5LFxyXG4gICAgICAgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJvdXRlUGFyYW1zLCAkaHR0cCwgJHRpbWVvdXQsICR3aW5kb3csIEt1YmVybmV0ZXNBcGlVUkwpID0+IHtcclxuXHJcbiAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICRzY29wZS5tb2RlbCA9IEt1YmVybmV0ZXNNb2RlbDtcclxuICAgICRzY29wZS5yYXdNb2RlbCA9IG51bGw7XHJcblxyXG4gICAgJHNjb3BlLml0ZW1Db25maWcgPSB7XHJcbiAgICAgIHByb3BlcnRpZXM6IHtcclxuICAgICAgICAnY29udGFpbmVycy9pbWFnZSQnOiB7XHJcbiAgICAgICAgICB0ZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KCdpbWFnZVRlbXBsYXRlLmh0bWwnKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ3N0YXR1cy9waGFzZSc6IHtcclxuICAgICAgICAgIHRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoJ3N0YXR1c1RlbXBsYXRlLmh0bWwnKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ1xcXFwvRW52XFxcXC8nOiB7XHJcbiAgICAgICAgICB0ZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KCdlbnZJdGVtVGVtcGxhdGUuaHRtbCcpXHJcbiAgICAgICAgfSxcclxuICAgICAgICAnXlxcXFwvbGFiZWxzJCc6IHtcclxuICAgICAgICAgIHRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoJ2xhYmVsVGVtcGxhdGUuaHRtbCcpXHJcbiAgICAgICAgfSxcclxuICAgICAgICAnXFxcXC9lbnZcXFxcL2tleSQnOiB7XHJcbiAgICAgICAgICBoaWRkZW46IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgS3ViZXJuZXRlcy5pbml0U2hhcmVkKCRzY29wZSwgJGxvY2F0aW9uLCAkaHR0cCwgJHRpbWVvdXQsICRyb3V0ZVBhcmFtcywgS3ViZXJuZXRlc01vZGVsLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNBcGlVUkwpO1xyXG5cclxuICAgICRzY29wZS4kb24oJ2t1YmVybmV0ZXNNb2RlbFVwZGF0ZWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgIH0pO1xyXG5cclxuICAgICRzY29wZS4kb24oJyRyb3V0ZVVwZGF0ZScsICgkZXZlbnQpID0+IHtcclxuICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgJHNjb3BlLiR3YXRjaCgnbW9kZWwucG9kcycsIChuZXdWYWx1ZSwgb2xkVmFsdWUpID0+IHtcclxuICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgJHNjb3BlLmZsaXBSYXcgPSAoKSA9PiB7XHJcbiAgICAgICRzY29wZS5yYXdNb2RlID0gISRzY29wZS5yYXdNb2RlO1xyXG4gICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgfTtcclxuXHJcbiAgICAkc2NvcGUub3BlbkxvZ3MgPSAoKSA9PiB7XHJcbiAgICAgIHZhciBwb2RzID0gWyRzY29wZS5pdGVtXTtcclxuICAgICAgb3BlbkxvZ3NGb3JQb2RzKFNlcnZpY2VSZWdpc3RyeSwgJHdpbmRvdywgS3ViZXJuZXRlc01vZGVsLmN1cnJlbnROYW1lc3BhY2UoKSwgcG9kcyk7XHJcbiAgICB9O1xyXG5cclxuICAgIHVwZGF0ZURhdGEoKTtcclxuXHJcbiAgICBmdW5jdGlvbiB1cGRhdGVEYXRhKCkge1xyXG4gICAgICAkc2NvcGUuaWQgPSAkcm91dGVQYXJhbXNbXCJpZFwiXTtcclxuICAgICAgJHNjb3BlLml0ZW0gPSAkc2NvcGUubW9kZWwuZ2V0UG9kKEt1YmVybmV0ZXNTdGF0ZS5zZWxlY3RlZE5hbWVzcGFjZSwgJHNjb3BlLmlkKTtcclxuICAgICAgaWYgKCRzY29wZS5pdGVtKSB7XHJcbiAgICAgICAgJHNjb3BlLnJhd01vZGVsID0gdG9SYXdZYW1sKCRzY29wZS5pdGVtKTtcclxuICAgICAgfVxyXG4gICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgfVxyXG4gIH1dKTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzSGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNQbHVnaW4udHNcIi8+XHJcblxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIGV4cG9ydCB2YXIgUG9kRWRpdENvbnRyb2xsZXIgPSBjb250cm9sbGVyKFwiUG9kRWRpdENvbnRyb2xsZXJcIixcclxuICAgIFtcIiRzY29wZVwiLCBcIkt1YmVybmV0ZXNNb2RlbFwiLCBcIkt1YmVybmV0ZXNTdGF0ZVwiLCBcIkt1YmVybmV0ZXNTY2hlbWFcIiwgXCIkdGVtcGxhdGVDYWNoZVwiLCBcIiRsb2NhdGlvblwiLCBcIiRyb3V0ZVBhcmFtc1wiLCBcIiRodHRwXCIsIFwiJHRpbWVvdXRcIiwgXCJLdWJlcm5ldGVzQXBpVVJMXCIsIFwiU2NoZW1hUmVnaXN0cnlcIixcclxuICAgICAgKCRzY29wZSwgS3ViZXJuZXRlc01vZGVsOiBLdWJlcm5ldGVzLkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc1NjaGVtYSxcclxuICAgICAgICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgJGxvY2F0aW9uOm5nLklMb2NhdGlvblNlcnZpY2UsICRyb3V0ZVBhcmFtcywgJGh0dHAsICR0aW1lb3V0LCBLdWJlcm5ldGVzQXBpVVJMLCBzY2hlbWFzOkhhd3Rpb0Zvcm1zLlNjaGVtYVJlZ2lzdHJ5KSA9PiB7XHJcblxyXG4gICAgJHNjb3BlLmt1YmVybmV0ZXMgPSBLdWJlcm5ldGVzU3RhdGU7XHJcbiAgICAkc2NvcGUubW9kZWwgPSBLdWJlcm5ldGVzTW9kZWw7XHJcbiAgICAkc2NvcGUuaWQgPSAkcm91dGVQYXJhbXNbXCJpZFwiXTtcclxuICAgICRzY29wZS5zY2hlbWEgPSBLdWJlcm5ldGVzU2NoZW1hO1xyXG4gICAgJHNjb3BlLmNvbmZpZyA9IHNjaGVtYXMuY2xvbmVTY2hlbWEoXCJpby5mYWJyaWM4Lmt1YmVybmV0ZXMuYXBpLm1vZGVsLlBvZFwiKTtcclxuICAgIC8vJHNjb3BlLmNvbmZpZyA9IEt1YmVybmV0ZXNTY2hlbWEuZGVmaW5pdGlvbnMua3ViZXJuZXRlc192MWJldGEyX1BvZDtcclxuXHJcbiAgICBLdWJlcm5ldGVzLmluaXRTaGFyZWQoJHNjb3BlLCAkbG9jYXRpb24sICRodHRwLCAkdGltZW91dCwgJHJvdXRlUGFyYW1zLCBLdWJlcm5ldGVzTW9kZWwsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc0FwaVVSTCk7XHJcblxyXG4gICAgJHNjb3BlLiRvbignJHJvdXRlVXBkYXRlJywgKCRldmVudCkgPT4ge1xyXG4gICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB1cGRhdGVEYXRhKCk7XHJcblxyXG4gICAgZnVuY3Rpb24gdXBkYXRlRGF0YSgpIHtcclxuICAgICAgaWYgKCRzY29wZS5pZCkge1xyXG4gICAgICAgICRzY29wZS5lbnRpdHkgPSAkc2NvcGUubW9kZWwuZ2V0UG9kKEt1YmVybmV0ZXNTdGF0ZS5zZWxlY3RlZE5hbWVzcGFjZSwgJHNjb3BlLmlkKTtcclxuICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgICRzY29wZS5mZXRjaGVkID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkc2NvcGUuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAkc2NvcGUuc2F2ZSA9ICgpPT57XHJcbiAgICAgIGNvbnNvbGUubG9nKCRzY29wZS5lbnRpdHkpO1xyXG4gICAgfVxyXG4gIH1dKTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc1BsdWdpbi50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cInRlcm0udHNcIi8+XHJcblxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIHZhciBsb2cgPSBMb2dnZXIuZ2V0KFwia3ViZXJuZXRlcy1wb2QtbG9nc1wiKTtcclxuXHJcbiAgX21vZHVsZS5zZXJ2aWNlKFwiUG9kTG9nUmVwbGFjZW1lbnRzXCIsICgpID0+IHtcclxuICAgIHJldHVybiBbXTtcclxuICB9KTtcclxuXHJcbiAgX21vZHVsZS5ydW4oKFBvZExvZ1JlcGxhY2VtZW50cykgPT4ge1xyXG4gICAgdmFyIGxvZyA9IExvZ2dlci5nZXQoXCJwb2QtbG9nLXJlcGxhY2Vyc1wiKTtcclxuICAgIC8vIEFkZCBBTlNJIGVzY2FwZSBjaGFyYWN0ZXIgcmVwbGFjZXJcclxuICAgIC8vIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbW1hbGVja2kvYW5zaXNwYW5cclxuICAgIHZhciBjb2xvcnMgPSB7XHJcbiAgICAgICczMCc6ICdibGFjaycsXHJcbiAgICAgICczMSc6ICdyZWQnLFxyXG4gICAgICAnMzInOiAnZ3JlZW4nLFxyXG4gICAgICAnMzMnOiAneWVsbG93JyxcclxuICAgICAgJzM0JzogJ2JsdWUnLFxyXG4gICAgICAnMzUnOiAncHVycGxlJyxcclxuICAgICAgJzM2JzogJ2N5YW4nLFxyXG4gICAgICAnMzcnOiAnd2hpdGUnIFxyXG4gICAgfVxyXG4gICAgUG9kTG9nUmVwbGFjZW1lbnRzLnB1c2goKG1zZykgPT4ge1xyXG4gICAgICBpZiAoIW1zZykge1xyXG4gICAgICAgIHJldHVybiBtc2c7XHJcbiAgICAgIH1cclxuICAgICAgdmFyIGVuZCA9IFwiPC9zcGFuPlwiO1xyXG4gICAgICBfLmZvck93bihjb2xvcnMsIChjb2xvciwgY29kZSkgPT4ge1xyXG4gICAgICAgIHZhciBzdGFydCA9IGA8c3BhbiBjbGFzcz1cImAgKyBjb2xvciArIGBcIj5gO1xyXG4gICAgICAgIG1zZyA9IG1zZy5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcMDMzXFxcXFsnICsgY29kZSArICdtJywgJ2cnKSwgc3RhcnQpXHJcbiAgICAgICAgbXNnID0gbXNnLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFwwMzNcXFxcWzA7JyArIGNvZGUgKyAnbScsICdnJyksIHN0YXJ0KTtcclxuICAgICAgfSk7XHJcbiAgICAgIG1zZyA9IG1zZy5yZXBsYWNlKC9cXDAzM1xcWzFtL2csICc8Yj4nKS5yZXBsYWNlKC9cXDAzM1xcWzIybS9nLCAnPC9iPicpO1xyXG4gICAgICBtc2cgPSBtc2cucmVwbGFjZSgvXFwwMzNcXFszbS9nLCAnPGk+JykucmVwbGFjZSgvXFwwMzNcXFsyM20vZywgJzwvaT4nKTtcclxuICAgICAgbXNnID0gbXNnLnJlcGxhY2UoL1xcMDMzXFxbbS9nLCBlbmQpO1xyXG4gICAgICBtc2cgPSBtc2cucmVwbGFjZSgvXFwwMzNcXFswbS9nLCBlbmQpO1xyXG4gICAgICBtc2cgPSBtc2cucmVwbGFjZSgvXFwwMzNcXFszOW0vZywgZW5kKTtcclxuICAgICAgbXNnID0gbXNnLnJlcGxhY2UoL1xcMDMzXFxbMm0vZywgJzxzcGFuPicpO1xyXG4gICAgICBtc2cgPSBtc2cucmVwbGFjZSgvXFwwMzNcXFswOzM5bS9nLCBlbmQpO1xyXG4gICAgICBsb2cuZGVidWcoXCJSdW5uaW5nIHJlcGxhY2VtZW50IG9uIG1lc3NhZ2U6IFwiLCBtc2cpO1xyXG4gICAgICByZXR1cm4gbXNnO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIF9tb2R1bGUuY29udHJvbGxlcihcIkt1YmVybmV0ZXMuUG9kTG9nTGlua0NvbnRyb2xsZXJcIiwgKCRzY29wZSwgJGludGVydmFsLCBUZXJtaW5hbFNlcnZpY2UsICR0ZW1wbGF0ZUNhY2hlKSA9PiB7XHJcblxyXG4gICAgJHNjb3BlLm9wZW5Mb2dzID0gKGVudGl0eSkgPT4ge1xyXG4gICAgICBsb2cuZGVidWcoXCJPcGVuIGxvZ3M6IFwiLCBlbnRpdHkpO1xyXG4gICAgICBUZXJtaW5hbFNlcnZpY2UubmV3VGVybWluYWwoJGludGVydmFsLCBlbnRpdHkubWV0YWRhdGEuc2VsZkxpbmssIGVudGl0eS4kb3JhY2xlTmFtZSwgZW50aXR5LCBcIi9qYXZhL2NvbnNvbGUvYXBpL29yYWNsZS9leHRyYWN0L2xvZz9yY05hbWU9XCIgKyBnZXROYW1lKGVudGl0eSksICR0ZW1wbGF0ZUNhY2hlLmdldChVcmxIZWxwZXJzLmpvaW4odGVtcGxhdGVQYXRoLCAnbG9nU2hlbGwuaHRtbCcpKSk7XHJcbiAgICB9XHJcblxyXG4gIH0pO1xyXG5cclxuICBfbW9kdWxlLmRpcmVjdGl2ZSgncG9kTG9nRGlzcGxheScsICh1c2VyRGV0YWlscywgUG9kTG9nUmVwbGFjZW1lbnRzKSA9PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZXN0cmljdDogJ0UnLFxyXG4gICAgICB0ZW1wbGF0ZTogYFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwb2QtbG9nLWxpbmVzXCI+XHJcbiAgICAgICAgICA8cCBuZy1oaWRlPVwiZmV0Y2hlZFwiPlBsZWFzZSB3YWl0LCBmZXRjaGluZyBsb2dzLi4uPC9wPlxyXG4gICAgICAgICAgPHAgbmctaGlkZT1cIm1lc3NhZ2VzLmxlbmd0aCB8fCBwcmV2aW91c1wiPlZpZXcgPGEgaHJlZj1cIlwiIG5nLWNsaWNrPVwicHJldmlvdXM9IXByZXZpb3VzXCI+cHJldmlvdXMgY29udGFpbmVyIGxvZ3M8L2E+PzwvcD5cclxuICAgICAgICAgIDxwIG5nLXJlcGVhdD1cIm1lc3NhZ2UgaW4gbWVzc2FnZXMgdHJhY2sgYnkgJGluZGV4XCIgbmctYmluZC1odG1sPVwibWVzc2FnZVwiPjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgYCxcclxuICAgICAgbGluazogKHNjb3BlOmFueSwgZWxlbWVudCwgYXR0cikgPT4ge1xyXG4gICAgICAgIHZhciBsaW5rID0gc2NvcGUuJGV2YWwoJ3BvZExpbmsnKTtcclxuICAgICAgICB2YXIgbmFtZSA9IHNjb3BlLiRldmFsKCdjb250YWluZXJOYW1lJyk7XHJcblxyXG4gICAgICAgIGlmICghbGluaykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2NvcGUuZmV0Y2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIHNjb3BlLnByZXZpb3VzID0gZmFsc2U7XHJcbiAgICAgICAgc2NvcGUubWVzc2FnZXMgPSBbXTtcclxuXHJcbiAgICAgICAgbGluayA9IFVybEhlbHBlcnMuam9pbihtYXN0ZXJBcGlVcmwoKSwgbGluaywgJ2xvZycpO1xyXG4gICAgICAgIGxpbmsgPSBLdWJlcm5ldGVzQVBJLndzVXJsKGxpbmspO1xyXG4gICAgICAgIGxpbmsuc2VhcmNoKHtcclxuICAgICAgICAgIGZvbGxvdzogdHJ1ZSxcclxuICAgICAgICAgIHRhaWxMaW5lczogMTAwMCxcclxuICAgICAgICAgIGFjY2Vzc190b2tlbjogdXNlckRldGFpbHMudG9rZW5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107XHJcblxyXG4gICAgICAgIHZhciBwdWxsTWVzc2FnZXMgPSBfLmRlYm91bmNlKCgpID0+IHtcclxuICAgICAgICAgIHNjb3BlLm1lc3NhZ2VzID0gc2NvcGUubWVzc2FnZXMuY29uY2F0KF8ucmVtb3ZlKG1lc3NhZ2VzLCAoKSA9PiB0cnVlKS5tYXAoKG1zZykgPT4ge1xyXG4gICAgICAgICAgICBQb2RMb2dSZXBsYWNlbWVudHMuZm9yRWFjaCgocmVwbEZ1bmM6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNGdW5jdGlvbihyZXBsRnVuYykpIHtcclxuICAgICAgICAgICAgICAgIG1zZyA9IHJlcGxGdW5jKG1zZyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG1zZztcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIGlmICghc2NvcGUuZmV0Y2hlZCkge1xyXG4gICAgICAgICAgICBzY29wZS5mZXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIENvcmUuJGFwcGx5KHNjb3BlKTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gaW5pdFNvY2tldChsaW5rKSB7XHJcbiAgICAgICAgICBzY29wZS5mZXRjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgICBtZXNzYWdlcy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgc2NvcGUubWVzc2FnZXMubGVuZ3RoID0gMDtcclxuICAgICAgICAgIHZhciB3cyA9IG5ldyBXZWJTb2NrZXQobGluay50b1N0cmluZygpLCAnYmFzZTY0LmJpbmFyeS5rOHMuaW8nKTtcclxuICAgICAgICAgIHdzLm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gd2luZG93LmF0b2IoZXZlbnQuZGF0YSk7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaChtZXNzYWdlKTtcclxuICAgICAgICAgICAgICBwdWxsTWVzc2FnZXMoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgLy8gd2UnbGwganVzdCBpZ25vcmUgdGhlc2VcclxuICAgICAgICAgICAgICAvL2xvZy5kZWJ1ZyhcIkZhaWxlZCB0byBkZWNvZGUgbWVzc2FnZTogXCIsIGV2ZW50LmRhdGEsIFwiIGVycm9yOiBcIiwgZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHdzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHdzID0gaW5pdFNvY2tldChsaW5rKTtcclxuXHJcbiAgICAgICAgc2NvcGUuJHdhdGNoKCdwcmV2aW91cycsICh2YWx1ZSwgb2xkKSA9PiB7XHJcbiAgICAgICAgICBpZiAodmFsdWUgIT09IG9sZCkge1xyXG4gICAgICAgICAgICBpZiAobGluay5oYXNTZWFyY2goJ3ByZXZpb3VzJykpIHtcclxuICAgICAgICAgICAgICBsaW5rLnJlbW92ZVNlYXJjaCgncHJldmlvdXMnKS5hZGRTZWFyY2goJ3ByZXZpb3VzJywgc2NvcGUucHJldmlvdXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxpbmsuYWRkU2VhcmNoKCdwcmV2aW91cycsIHNjb3BlLnByZXZpb3VzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3cy5jbG9zZSgpO1xyXG4gICAgICAgICAgICB3cyA9IGluaXRTb2NrZXQobGluayk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGVsZW1lbnQub24oJyRkZXN0cm95JywgKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHdzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgd3MuY2xvc2UoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkb1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3cztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBfbW9kdWxlLmRpcmVjdGl2ZSgncG9kTG9nV2luZG93JywgKCRjb21waWxlLCBUZXJtaW5hbFNlcnZpY2UpID0+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlc3RyaWN0OiAnQScsXHJcbiAgICAgIHNjb3BlOiBmYWxzZSxcclxuICAgICAgbGluazogKHNjb3BlOmFueSwgZWxlbWVudCwgYXR0cikgPT4ge1xyXG4gICAgICAgIGFkZFdpbmRvd0FjdGlvbnMoc2NvcGUsIGVsZW1lbnQsIFRlcm1pbmFsU2VydmljZSk7XHJcbiAgICAgICAgc2NvcGUuYXRCb3R0b20gPSB0cnVlO1xyXG4gICAgICAgIHNjb3BlLiR3YXRjaCgnYXRCb3R0b20nLCAodmFsKSA9PiB7ICAgICAgICAgXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfSk7XHJcblxyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNQbHVnaW4udHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJ1dGlsSGVscGVycy50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgZXhwb3J0IHZhciBFbnZJdGVtID0gY29udHJvbGxlcihcIkVudkl0ZW1cIiwgW1wiJHNjb3BlXCIsICgkc2NvcGUpID0+IHtcclxuICAgIHZhciBwYXJ0cyA9ICRzY29wZS5kYXRhLnNwbGl0KCc9Jyk7XHJcbiAgICAkc2NvcGUua2V5ID0gcGFydHMuc2hpZnQoKTtcclxuICAgICRzY29wZS52YWx1ZSA9IHBhcnRzLmpvaW4oJz0nKTtcclxuICB9XSk7XHJcblxyXG4gIC8vIG1haW4gY29udHJvbGxlciBmb3IgdGhlIHBhZ2VcclxuICBleHBvcnQgdmFyIFBvZHMgPSBjb250cm9sbGVyKFwiUG9kc1wiLCBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzUG9kc1wiLCBcIkt1YmVybmV0ZXNTdGF0ZVwiLCBcIlNlcnZpY2VSZWdpc3RyeVwiLCBcIiRkaWFsb2dcIiwgXCIkd2luZG93XCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkbG9jYXRpb25cIiwgXCJsb2NhbFN0b3JhZ2VcIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiS3ViZXJuZXRlc0FwaVVSTFwiLFxyXG4gICAgKCRzY29wZSwgS3ViZXJuZXRlc01vZGVsOiBLdWJlcm5ldGVzLkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UsIEt1YmVybmV0ZXNQb2RzOm5nLnJlc291cmNlLklSZXNvdXJjZUNsYXNzPGFueT4sIEt1YmVybmV0ZXNTdGF0ZSwgU2VydmljZVJlZ2lzdHJ5LCAkZGlhbG9nLCAkd2luZG93LCAkdGVtcGxhdGVDYWNoZSwgJHJvdXRlUGFyYW1zLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgbG9jYWxTdG9yYWdlLCAkaHR0cCwgJHRpbWVvdXQsIEt1YmVybmV0ZXNBcGlVUkwpID0+IHtcclxuXHJcbiAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICRzY29wZS5tb2RlbCA9IEt1YmVybmV0ZXNNb2RlbDtcclxuICAgICRzY29wZS4kb24oJ2t1YmVybmV0ZXNNb2RlbFVwZGF0ZWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAkc2NvcGUuaXRlbVNjaGVtYSA9IEZvcm1zLmNyZWF0ZUZvcm1Db25maWd1cmF0aW9uKCk7XHJcblxyXG4gICAgJHNjb3BlLnRhYmxlQ29uZmlnID0ge1xyXG4gICAgICBkYXRhOiAnbW9kZWwucG9kcycsXHJcbiAgICAgIHNob3dTZWxlY3Rpb25DaGVja2JveDogdHJ1ZSxcclxuICAgICAgZW5hYmxlUm93Q2xpY2tTZWxlY3Rpb246IGZhbHNlLFxyXG4gICAgICBtdWx0aVNlbGVjdDogdHJ1ZSxcclxuICAgICAgc2VsZWN0ZWRJdGVtczogW10sXHJcbiAgICAgIGZpbHRlck9wdGlvbnM6IHtcclxuICAgICAgICBmaWx0ZXJUZXh0OiAkbG9jYXRpb24uc2VhcmNoKClbXCJxXCJdIHx8ICcnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbkRlZnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZDogJ19rZXknLFxyXG4gICAgICAgICAgZGlzcGxheU5hbWU6ICdOYW1lJyxcclxuICAgICAgICAgIGRlZmF1bHRTb3J0OiB0cnVlLFxyXG4gICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJpZFRlbXBsYXRlLmh0bWxcIilcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGZpZWxkOiAnJHN0YXR1c0NzcycsXHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogJ1N0YXR1cycsXHJcbiAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcInN0YXR1c1RlbXBsYXRlLmh0bWxcIilcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgZmllbGQ6ICckZXZlbnRDb3VudCcsXHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogJ0V2ZW50cycsXHJcbiAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcImV2ZW50U3VtbWFyeVRlbXBsYXRlLmh0bWxcIilcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGZpZWxkOiAnJHJlc3RhcnRDb3VudCcsXHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogJ1Jlc3RhcnRzJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZmllbGQ6ICckY3JlYXRlZFRpbWUnLFxyXG4gICAgICAgICAgZGlzcGxheU5hbWU6ICdBZ2UnLFxyXG4gICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJhZ2VUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZDogJyRpbWFnZU5hbWVzJyxcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiAnSW1hZ2VzJyxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiaW1hZ2VUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZDogJyRob3N0JyxcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiAnSG9zdCcsXHJcbiAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcImhvc3RUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZDogJyRsYWJlbHNUZXh0JyxcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTGFiZWxzJyxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwibGFiZWxUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZDogJyRwb2RJUCcsXHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogJ1BvZCBJUCcsXHJcbiAgICAgICAgICBjdXN0b21Tb3J0RmllbGQ6IChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gS3ViZXJuZXRlcy5zb3J0QnlQb2RJcChmaWVsZC4kcG9kSVApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfTtcclxuXHJcbiAgICAkc2NvcGUub3BlbkxvZ3MgPSAoKSA9PiB7XHJcbiAgICAgIHZhciBwb2RzID0gJHNjb3BlLnRhYmxlQ29uZmlnLnNlbGVjdGVkSXRlbXM7XHJcbiAgICAgIGlmICghcG9kcyB8fCAhcG9kcy5sZW5ndGgpIHtcclxuICAgICAgICBpZiAoJHNjb3BlLmlkKSB7XHJcbiAgICAgICAgICB2YXIgaXRlbSA9ICRzY29wZS5pdGVtO1xyXG4gICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgcG9kcyA9IFtpdGVtXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgb3BlbkxvZ3NGb3JQb2RzKFNlcnZpY2VSZWdpc3RyeSwgJHdpbmRvdywgS3ViZXJuZXRlc01vZGVsLmN1cnJlbnROYW1lc3BhY2UoKSwgcG9kcyk7XHJcbiAgICB9O1xyXG5cclxuICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuXHJcbiAgICAkc2NvcGUuZGVsZXRlUHJvbXB0ID0gKHNlbGVjdGVkKSA9PiB7XHJcbiAgICAgIGlmIChhbmd1bGFyLmlzU3RyaW5nKHNlbGVjdGVkKSkge1xyXG4gICAgICAgIHNlbGVjdGVkID0gW3tcclxuICAgICAgICAgIGlkOiBzZWxlY3RlZFxyXG4gICAgICAgIH1dO1xyXG4gICAgICB9XHJcbiAgICAgIFVJLm11bHRpSXRlbUNvbmZpcm1BY3Rpb25EaWFsb2coPFVJLk11bHRpSXRlbUNvbmZpcm1BY3Rpb25PcHRpb25zPntcclxuICAgICAgICBjb2xsZWN0aW9uOiBzZWxlY3RlZCxcclxuICAgICAgICBpbmRleDogJ21ldGFkYXRhLm5hbWUnLFxyXG4gICAgICAgIG9uQ2xvc2U6IChyZXN1bHQ6Ym9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICBmdW5jdGlvbiBkZWxldGVTZWxlY3RlZChzZWxlY3RlZDpBcnJheTxLdWJlUG9kPiwgbmV4dDpLdWJlUG9kKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5leHQpIHtcclxuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcImRlbGV0aW5nOiBcIiwgZ2V0TmFtZShuZXh0KSk7XHJcbiAgICAgICAgICAgICAgICBLdWJlcm5ldGVzUG9kcy5kZWxldGUoe1xyXG4gICAgICAgICAgICAgICAgICBpZDogZ2V0TmFtZShuZXh0KVxyXG4gICAgICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcImRlbGV0ZWQ6IFwiLCBnZXROYW1lKG5leHQpKTtcclxuICAgICAgICAgICAgICAgICAgZGVsZXRlU2VsZWN0ZWQoc2VsZWN0ZWQsIHNlbGVjdGVkLnNoaWZ0KCkpO1xyXG4gICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcIkVycm9yIGRlbGV0aW5nOiBcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICBkZWxldGVTZWxlY3RlZChzZWxlY3RlZCwgc2VsZWN0ZWQuc2hpZnQoKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVsZXRlU2VsZWN0ZWQoc2VsZWN0ZWQsIHNlbGVjdGVkLnNoaWZ0KCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdGl0bGU6ICdEZWxldGUgcG9kcz8nLFxyXG4gICAgICAgIGFjdGlvbjogJ1RoZSBmb2xsb3dpbmcgcG9kcyB3aWxsIGJlIGRlbGV0ZWQ6JyxcclxuICAgICAgICBva1RleHQ6ICdEZWxldGUnLFxyXG4gICAgICAgIG9rQ2xhc3M6ICdidG4tZGFuZ2VyJyxcclxuICAgICAgICBjdXN0b206IFwiVGhpcyBvcGVyYXRpb24gaXMgcGVybWFuZW50IG9uY2UgY29tcGxldGVkIVwiLFxyXG4gICAgICAgIGN1c3RvbUNsYXNzOiBcImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIlxyXG4gICAgICB9KS5vcGVuKCk7XHJcbiAgICB9O1xyXG5cclxuICAgICRzY29wZS5jcmVhdGVQb2RzPSAoKSA9PiB7XHJcbiAgICAgIHZhciB4aHI9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xyXG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PSA0KSB7Ly806KGo56S65pWw5o2u5bey57uP6LCD55So5a6M5oiQXHJcbiAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDApIHsvL0hUVFDnmoTnirbmgIHnoIFcclxuICAgICAgICAgICAgdmFyIG9iaj1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAgICBcIm5hbWVcIjogXCJuZXdwb2RcIixcclxuICAgICAgICAgICAgICAgXCJsYWJlbHNcIjoge1xyXG4gICAgICAgICAgICAgICAgIFwiYWltXCI6IFwidGVzdFwiLFxyXG4gICAgICAgICAgICAgICAgIFwiYXBwXCI6IFwib3JhY2xlXCJcclxuICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgXCJwYXRoXCI6ICcvaG9tZS8nLFxyXG4gICAgICAgICAgICAgICBcInBvcnRcIjogMTUyNVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEt1YmVybmV0ZXMuY3JlYXRlUkMob2JqZWN0KTtcclxuXHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgIC8vYWx0ZXIoXCJzaGliYWlcIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICB4aHIub3BlbihcIlBPU1RcIiwgXCIvb3JhY2xlQXBwUGF0aFwiLCBmYWxzZSk7Ly/kuI7mnI3liqHlmajov57mjqXlubblj5HpgIFcclxuICAgICAgeGhyLnNlbmQobnVsbCk7XHJcbiAgICB9O1xyXG4gIH1dKTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzSGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNQbHVnaW4udHNcIi8+XHJcblxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIGV4cG9ydCB2YXIgUmVwbGljYXRpb25Db250cm9sbGVyQ29udHJvbGxlciA9IGNvbnRyb2xsZXIoXCJSZXBsaWNhdGlvbkNvbnRyb2xsZXJDb250cm9sbGVyXCIsXHJcbiAgICBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCIkdGVtcGxhdGVDYWNoZVwiLCBcIiRsb2NhdGlvblwiLCBcIiRyb3V0ZVBhcmFtc1wiLCBcIiRodHRwXCIsIFwiJHRpbWVvdXRcIiwgXCJLdWJlcm5ldGVzQXBpVVJMXCIsXHJcbiAgICAgICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDogS3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzU3RhdGUsXHJcbiAgICAgICAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlLCAkcm91dGVQYXJhbXMsICRodHRwLCAkdGltZW91dCwgS3ViZXJuZXRlc0FwaVVSTCkgPT4ge1xyXG5cclxuICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG4gICAgJHNjb3BlLm1vZGVsID0gS3ViZXJuZXRlc01vZGVsO1xyXG4gICAgJHNjb3BlLnJhd01vZGVsID0gbnVsbFxyXG5cclxuICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuXHJcbiAgICAkc2NvcGUuaXRlbUNvbmZpZyA9IHtcclxuICAgICAgcHJvcGVydGllczoge1xyXG4gICAgICAgICdeXFxcXC9sYWJlbHMkJzoge1xyXG4gICAgICAgICAgdGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldCgnbGFiZWxUZW1wbGF0ZS5odG1sJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgJHNjb3BlLiRvbigna3ViZXJuZXRlc01vZGVsVXBkYXRlZCcsICgpID0+IHtcclxuICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgJHNjb3BlLiRvbignJHJvdXRlVXBkYXRlJywgKCRldmVudCkgPT4ge1xyXG4gICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAkc2NvcGUuJHdhdGNoKCdtb2RlbC5wb2RzJywgKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgPT4ge1xyXG4gICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICB9LCB0cnVlKTtcclxuXHJcbiAgICAkc2NvcGUuZmxpcFJhdyA9ICgpID0+IHtcclxuICAgICAgJHNjb3BlLnJhd01vZGUgPSAhJHNjb3BlLnJhd01vZGU7XHJcbiAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHVwZGF0ZURhdGEoKTtcclxuXHJcbiAgICBmdW5jdGlvbiB1cGRhdGVEYXRhKCkge1xyXG4gICAgICBpZiAoJHNjb3BlLmRpcnR5KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgICRzY29wZS5pZCA9ICRyb3V0ZVBhcmFtc1tcImlkXCJdO1xyXG4gICAgICAkc2NvcGUuaXRlbSA9ICRzY29wZS5tb2RlbC5nZXRSZXBsaWNhdGlvbkNvbnRyb2xsZXIoS3ViZXJuZXRlc1N0YXRlLnNlbGVjdGVkTmFtZXNwYWNlLCAkc2NvcGUuaWQpO1xyXG4gICAgICBpZiAoJHNjb3BlLml0ZW0pIHtcclxuICAgICAgICAkc2NvcGUucmF3TW9kZWwgPSB0b1Jhd1lhbWwoJHNjb3BlLml0ZW0pO1xyXG4gICAgICB9XHJcbiAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICB9XHJcbiAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc1BsdWdpbi50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgZXhwb3J0IHZhciBSZXBsaWNhdGlvbkNvbnRyb2xsZXJFZGl0Q29udHJvbGxlciA9IGNvbnRyb2xsZXIoXCJSZXBsaWNhdGlvbkNvbnRyb2xsZXJFZGl0Q29udHJvbGxlclwiLFxyXG4gICAgW1wiJHNjb3BlXCIsIFwiS3ViZXJuZXRlc01vZGVsXCIsIFwiS3ViZXJuZXRlc1N0YXRlXCIsIFwiS3ViZXJuZXRlc1NjaGVtYVwiLCBcIiR0ZW1wbGF0ZUNhY2hlXCIsIFwiJGxvY2F0aW9uXCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwiJGh0dHBcIiwgXCIkdGltZW91dFwiLCBcIkt1YmVybmV0ZXNBcGlVUkxcIiwgXCJTY2hlbWFSZWdpc3RyeVwiLFxyXG4gICAgICAoJHNjb3BlLCBLdWJlcm5ldGVzTW9kZWw6IEt1YmVybmV0ZXMuS3ViZXJuZXRlc01vZGVsU2VydmljZSwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzU2NoZW1hLFxyXG4gICAgICAgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJvdXRlUGFyYW1zLCAkaHR0cCwgJHRpbWVvdXQsIEt1YmVybmV0ZXNBcGlVUkwsIHNjaGVtYXM6SGF3dGlvRm9ybXMuU2NoZW1hUmVnaXN0cnkpID0+IHtcclxuXHJcbiAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICRzY29wZS5tb2RlbCA9IEt1YmVybmV0ZXNNb2RlbDtcclxuICAgICRzY29wZS5pZCA9ICRyb3V0ZVBhcmFtc1tcImlkXCJdO1xyXG4gICAgJHNjb3BlLnNjaGVtYSA9IEt1YmVybmV0ZXNTY2hlbWE7XHJcbiAgICBsb2cuZGVidWcoXCJTY2hlbWE6IFwiLCAkc2NvcGUuc2NoZW1hKTtcclxuICAgICRzY29wZS5jb25maWcgPSBzY2hlbWFzLmNsb25lU2NoZW1hKFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5SZXBsaWNhdGlvbkNvbnRyb2xsZXJcIik7XHJcbiAgICAvLyQkc2NvcGUuY29uZmlnID0gS3ViZXJuZXRlc1NjaGVtYS5kZWZpbml0aW9ucy5rdWJlcm5ldGVzX3YxYmV0YTNfUmVwbGljYXRpb25Db250cm9sbGVyO1xyXG5cclxuICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuXHJcbiAgICAkc2NvcGUuJG9uKCckcm91dGVVcGRhdGUnLCAoJGV2ZW50KSA9PiB7XHJcbiAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHVwZGF0ZURhdGEoKTtcclxuXHJcbiAgICBmdW5jdGlvbiB1cGRhdGVEYXRhKCkge1xyXG4gICAgICBpZiAoJHNjb3BlLmlkKSB7XHJcbiAgICAgICAgJHNjb3BlLmVudGl0eSA9ICRzY29wZS5tb2RlbC5nZXRSZXBsaWNhdGlvbkNvbnRyb2xsZXIoS3ViZXJuZXRlc1N0YXRlLnNlbGVjdGVkTmFtZXNwYWNlLCAkc2NvcGUuaWQpO1xyXG4gICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgJHNjb3BlLmZldGNoZWQgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICRzY29wZS5mZXRjaGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1dKTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzSGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNQbHVnaW4udHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzTW9kZWwudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9jb25maWdzL3RzL2N1c3RvbUFsZXJ0LnRzXCIvPlxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIGV4cG9ydCB2YXIgUmVwbGljYXRpb25Db250cm9sbGVycyA9IGNvbnRyb2xsZXIoXCJSZXBsaWNhdGlvbkNvbnRyb2xsZXJzXCIsXHJcbiAgICBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzUmVwbGljYXRpb25Db250cm9sbGVyc1wiLCBcIkt1YmVybmV0ZXNQb2RzXCIsIFwiQ29uZmlnc01vZGVsXCIsIFwiS3ViZXJuZXRlc1N0YXRlXCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkbG9jYXRpb25cIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiS3ViZXJuZXRlc0FwaVVSTFwiLFxyXG4gICAgICAoJHNjb3BlLCAgS3ViZXJuZXRlc01vZGVsOiBLdWJlcm5ldGVzLkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UsICBLdWJlcm5ldGVzUmVwbGljYXRpb25Db250cm9sbGVyczpuZy5yZXNvdXJjZS5JUmVzb3VyY2VDbGFzczxhbnk+LCBLdWJlcm5ldGVzUG9kczpuZy5yZXNvdXJjZS5JUmVzb3VyY2VDbGFzczxhbnk+LCBDb25maWdzTW9kZWwsIEt1YmVybmV0ZXNTdGF0ZSxcclxuICAgICAgICR0ZW1wbGF0ZUNhY2hlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJvdXRlUGFyYW1zLCAkaHR0cCwgJHRpbWVvdXQsIEt1YmVybmV0ZXNBcGlVUkwpID0+IHtcclxuXHJcbiAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICRzY29wZS5jb25maWdzID0gQ29uZmlnc01vZGVsO1xyXG4gICAgJHNjb3BlLm1vZGVsID0gS3ViZXJuZXRlc01vZGVsOyAgICBcclxuXHJcbiAgICAkc2NvcGUudGFibGVDb25maWcgPSB7XHJcbiAgICAgIGRhdGE6ICdtb2RlbC5yZXBsaWNhdGlvbkNvbnRyb2xsZXJzJyxcclxuICAgICAgc2hvd1NlbGVjdGlvbkNoZWNrYm94OiB0cnVlLFxyXG4gICAgICBlbmFibGVSb3dDbGlja1NlbGVjdGlvbjogZmFsc2UsXHJcbiAgICAgIG11bHRpU2VsZWN0OiB0cnVlLFxyXG4gICAgICBzZWxlY3RlZEl0ZW1zOiBbXSxcclxuICAgICAgZmlsdGVyT3B0aW9uczoge1xyXG4gICAgICAgIGZpbHRlclRleHQ6ICRsb2NhdGlvbi5zZWFyY2goKVtcInFcIl0gfHwgJydcclxuICAgICAgfSxcclxuICAgICAgY29sdW1uRGVmczogW1xyXG4gICAgICAgICB7IGZpZWxkOiAnJG9yYWNsZU5hbWUnLFxyXG4gICAgICAgICAgIGRpc3BsYXlOYW1lOiAn5pyN5Yqh5ZCN56ewJyxcclxuICAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcImlkVGVtcGxhdGUuaHRtbFwiKSxcclxuICAgICAgICAgICBjdXN0b21Tb3J0RmllbGQ6IChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xyXG4gICAgICAgICAgIH1cclxuICAgICAgICAgfSxcclxuICAgICAgICAgLy97IGZpZWxkOiAnJHJlcGxpY2FzJyxcclxuICAgICAgICAgLy8gIGRpc3BsYXlOYW1lOiAnU2NhbGUnLFxyXG4gICAgICAgICAvLyAgY2VsbFRlbXBsYXRlOiR0ZW1wbGF0ZUNhY2hlLmdldChcImRlc2lyZWRSZXBsaWNhcy5odG1sXCIpXHJcbiAgICAgICAgIC8vfSxcclxuICAgICAgICAgeyBmaWVsZDogJyRwb2RzLmFnZScsXHJcbiAgICAgICAgICAgZGlzcGxheU5hbWU6ICflkK/liqjml7bpl7QnLFxyXG4gICAgICAgICAgIGNlbGxUZW1wbGF0ZTokdGVtcGxhdGVDYWNoZS5nZXQoXCJhZ2VUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgIH0sXHJcbiAgICAgICAgIHsgZmllbGQ6ICckbGFiZWxzVGV4dCcsXHJcbiAgICAgICAgICAgZGlzcGxheU5hbWU6ICfmlbDmja7moIfnrb4nLFxyXG4gICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwibGFiZWxUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgIH0sXHJcbiAgICAgICAgIHsgZmllbGQ6ICckcG9kcycsXHJcbiAgICAgICAgICAgZGlzcGxheU5hbWU6ICfov57mjqXlj4LmlbAnLFxyXG4gICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiY29ubmVjdFBhcmFtVGVtcGxhdGUuaHRtbFwiKVxyXG4gICAgICAgICB9LCAgICAgICAgXHJcbiAgICAgICAgIHsgZmllbGQ6ICckcG9kQ291bnRlcnMnLFxyXG4gICAgICAgICAgIGRpc3BsYXlOYW1lOiAn5pyN5Yqh54q25oCBJyxcclxuICAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcInBvZENvdW50c0FuZExpbmtUZW1wbGF0ZS5odG1sXCIpLFxyXG4gICAgICAgICAgIGN1c3RvbVNvcnRGaWVsZDogKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICAgICBjb25zb2xlLmxvZyhmaWVsZCk7XHJcbiAgICAgICAgICAgICBpZihmaWVsZC4kcG9kQ291bnRlcnMucmVhZHkgKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiAzO1xyXG4gICAgICAgICAgICAgfWVsc2UgaWYoZmllbGQuJHBvZENvdW50ZXJzLnZhbGlkIHx8IGZpZWxkLiRwb2RDb3VudGVycy53YWl0aW5nKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiAyO1xyXG4gICAgICAgICAgICAgfWVsc2UgaWYoZmllbGQuJHBvZENvdW50ZXJzLmVycm9yKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgIH1cclxuICAgICAgICAgICB9XHJcbiAgICAgICAgIH0sXHJcbiAgICAgICAgIHsgZmllbGQ6ICckZXh0cmFjdFN0YXR1cycsXHJcbiAgICAgICAgICAgZGlzcGxheU5hbWU6ICfmlbDmja7msYfmgLvnirbmgIEnLFxyXG4gICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiZGF0YVN1bW1hcnlUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgIH0sXHJcbiAgICAgICAgIHtcclxuICAgICAgICAgICBmaWVsZDogJyRjaGVja1N0YXR1cycsXHJcbiAgICAgICAgICAgZGlzcGxheU5hbWU6ICfmo4DpqoznirbmgIEnLCBcclxuICAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcImRhdGFDaGVja1N0YXR1cy5odG1sXCIpICAgICAgICAgIFxyXG4gICAgICAgICB9XHJcbiAgICAgIF0sXHJcbiAgICAgIHNvcnRJbmZvOiB7XHJcbiAgICAgICAgc29ydEJ5OiBcIiRvcmFjbGVOYW1lXCIsXHJcbiAgICAgICAgYXNjZW5kaW5nOiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgIFxyXG4gICAgS3ViZXJuZXRlcy5pbml0U2hhcmVkKCRzY29wZSwgJGxvY2F0aW9uLCAkaHR0cCwgJHRpbWVvdXQsICRyb3V0ZVBhcmFtcywgS3ViZXJuZXRlc01vZGVsLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNBcGlVUkwpO1xyXG5cclxuICAgICRzY29wZS5kZWxldGVQcm9tcHQgPSAoc2VsZWN0ZWQpID0+IHsgICAgICBcclxuICAgICAgaWYgKGFuZ3VsYXIuaXNTdHJpbmcoc2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgc2VsZWN0ZWQgPSBbe1xyXG4gICAgICAgICAgaWQ6IHNlbGVjdGVkXHJcbiAgICAgICAgfV07XHJcbiAgICAgIH1cclxuICAgICAgdmFyIGV4dHJhY3RJdGVtcyA9IGNoZWNrRm9yRXh0cmFjdChzZWxlY3RlZCk7XHJcbiAgICAgIGlmKGV4dHJhY3RJdGVtcy5sZW5ndGggPT0gMCl7XHJcbiAgICAgICAgVUkubXVsdGlJdGVtQ29uZmlybUFjdGlvbkRpYWxvZyg8VUkuTXVsdGlJdGVtQ29uZmlybUFjdGlvbk9wdGlvbnM+e1xyXG4gICAgICAgICAgY29sbGVjdGlvbjogc2VsZWN0ZWQsXHJcbiAgICAgICAgICBpbmRleDogJyRhbGlhcycsXHJcbiAgICAgICAgICBvbkNsb3NlOiAocmVzdWx0OmJvb2xlYW4pID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGRlbGV0ZVNlbGVjdGVkKHNlbGVjdGVkOkFycmF5PEt1YmVQb2Q+LCBuZXh0Okt1YmVQb2QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICBLdWJlcm5ldGVzLnJlc2l6ZUNvbnRyb2xsZXIoJGh0dHAsIEt1YmVybmV0ZXNBcGlVUkwsIG5leHQsIDAsICgpID0+IHsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgIEt1YmVybmV0ZXNSZXBsaWNhdGlvbkNvbnRyb2xsZXJzLmRlbGV0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGdldE5hbWUobmV4dClcclxuICAgICAgICAgICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCAoKSA9PiB7ICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgaWYobmV4dC5tZXRhZGF0YS5sYWJlbHMuc3R5bGUgPT09IFwib3JhY2xlXCIpeyAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgS3ViZXJuZXRlcy5jb25uZWN0T3JhY2xlKCRodHRwLCAkdGltZW91dCwgXCIvamF2YS9jb25zb2xlL2FwaS9jYW5jZWxPcmFjbGVDb25lY3Rpb25cIiwgXCJkZWxldGVcIiwgbmV4dCwgMCk7ICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVNlbGVjdGVkKHNlbGVjdGVkLCBzZWxlY3RlZC5zaGlmdCgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKFwiRXJyb3IgZGVsZXRpbmc6IFwiLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlU2VsZWN0ZWQoc2VsZWN0ZWQsIHNlbGVjdGVkLnNoaWZ0KCkpO1xyXG4gICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBkZWxldGVTZWxlY3RlZChzZWxlY3RlZCwgc2VsZWN0ZWQuc2hpZnQoKSk7ICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHRpdGxlOiAn5piv5ZCm6ZyA6KaB5Yig6Zmkb3JhY2xl5pyN5Yqh77yfJyxcclxuICAgICAgICAgIGFjdGlvbjogJ+S7peS4i+eahG9yYWNsZeacjeWKoeWwhuS8muiiq+WIoOmZpDonLFxyXG4gICAgICAgICAgb2tUZXh0OiAn5Yig6ZmkJyxcclxuICAgICAgICAgIG9rQ2xhc3M6ICdidG4tZGFuZ2VyIHNqX2J0bl9jaXInLFxyXG4gICAgICAgICAgY3VzdG9tOiBcIuivpeacjeWKoeWIoOmZpOWQjuWwhuS8mua4hemZpG9yYWNsZeWvueW6lOacjeWKoeeahOerr+WPo+etiei1hOa6kOWNoOeUqO+8jOS9huS4jeWIoOmZpOaVsOaNruaWh+S7tu+8jOaYr+WQpuWIoOmZpO+8jOivt+ehruiupO+8gVwiLFxyXG4gICAgICAgICAgY3VzdG9tQ2xhc3M6IFwiYWxlcnQgYWxlcnQtd2FybmluZyBzal9hbGVydC13YXJuaW5nXCIsXHJcbiAgICAgICAgICBjYW5jZWxUZXh0OiBcIuWPlua2iFwiLFxyXG4gICAgICAgICAgY2FuY2VsQ2xhc3M6ICdzal9idG5fZ3JleSdcclxuICAgICAgICB9KS5vcGVuKCk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdmFyIG5hbWUgPSBcIlwiO1xyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGV4dHJhY3RJdGVtcywgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgbmFtZSArPSBpdGVtLiRvcmFjbGVOYW1lICsgXCIsXCI7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLy9hbGVydChcIuWIoOmZpOacjeWKoeWksei0pTpcIiArIG5hbWUgKyAgXCLmnI3liqHmraPlnKjmiafooYzmsYfmgLvmk43kvZzvvIzkuI3og73ooqvliKDpmaRcIik7XHJcbiAgICAgICAgICBDb25maWdzLmN1c3RvbUFsZXJ0KFwi5o+Q56S6XCIsIFwi5pON5L2c5aSx6LSlOuato+WcqOaJp+ihjOaxh+aAu+aTjeS9nOeahOacjeWKoeS4jeiDveiiq+WIoOmZpO+8gVwiLCAnJyxudWxsLCAwLCBcImVycm9yXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgJHNjb3BlLmNyZWF0ZVJDcz0gKCkgPT4geyBcclxuICAgICAgICRodHRwKHtcclxuICAgICAgICAgICAgICAgdXJsOiAnL2phdmEvY29uc29sZS9hcGkvY2FuY2VsT3JhY2xlQ29uZWN0aW9uJyxcclxuICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgICAgbWV0aG9kOidQT1NUJyxcclxuICAgICAgICAgICAgICAgcGFyYW1zOntwYXJhbTogXCJkYXRhXCJ9XHJcbiAgICAgICAgICAgfSkuc3VjY2VzcyhmdW5jdGlvbihkYXRhLGhlYWRlcixjb25maWcsc3RhdHVzKXtcclxuICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWNjZXNzXCIpO1xyXG4gICAgICAgICAgIH0pLmVycm9yKGZ1bmN0aW9uKGRhdGEsaGVhZGVyLGNvbmZpZyxzdGF0dXMpe1xyXG4gICAgICAgICAgICAgICAvL2xvZy53YXJuKFwiRmFpbGVkIHRvIGNvbm5lY3QgXCIgKyBjb25uZWN0UGFyYW0gKyBcIiBcIiArIGRhdGEgKyBcIiBcIiArIHN0YXR1cyk7XHJcbiAgICAgICAgICAgfSk7ICBcclxuICAgIH1cclxuXHJcbiAgICAkc2NvcGUuc3RvcFByb21wdCA9IChzZWxlY3RlZCkgPT57ICAgICAgICAgIFxyXG4gICAgICBpZiAoYW5ndWxhci5pc1N0cmluZyhzZWxlY3RlZCkpIHtcclxuICAgICAgICBzZWxlY3RlZCA9IFt7XHJcbiAgICAgICAgICBpZDogc2VsZWN0ZWRcclxuICAgICAgICB9XTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgZXh0cmFjdEl0ZW1zID0gY2hlY2tGb3JFeHRyYWN0KHNlbGVjdGVkKTtcclxuICAgICAgaWYoZXh0cmFjdEl0ZW1zLmxlbmd0aCA9PSAwKXtcclxuICAgICAgICBVSS5tdWx0aUl0ZW1Db25maXJtQWN0aW9uRGlhbG9nKDxVSS5NdWx0aUl0ZW1Db25maXJtQWN0aW9uT3B0aW9ucz57XHJcbiAgICAgICAgICBjb2xsZWN0aW9uOiBzZWxlY3RlZCxcclxuICAgICAgICAgIGluZGV4OiAnJGFsaWFzJyxcclxuICAgICAgICAgIG9uQ2xvc2U6IChyZXN1bHQ6Ym9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkgeyAgICAgICAgICBcclxuICAgICAgICAgICAgIGZ1bmN0aW9uIHN0b3BTZWxlY3RlZChzZWxlY3RlZDpBcnJheTxLdWJlUG9kPiwgbmV4dDpLdWJlUG9kKSB7XHJcbiAgICAgICAgICAgICAgIGlmIChuZXh0KSB7ICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgS3ViZXJuZXRlcy5yZXNpemVDb250cm9sbGVyKCRodHRwLCBLdWJlcm5ldGVzQXBpVVJMLCBuZXh0LCAwLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICBpZihuZXh0Lm1ldGFkYXRhLmxhYmVscy5zdHlsZSA9PT0gXCJvcmFjbGVcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICBLdWJlcm5ldGVzLmNvbm5lY3RPcmFjbGUoJGh0dHAsICR0aW1lb3V0LCBcIi9qYXZhL2NvbnNvbGUvYXBpL2NhbmNlbE9yYWNsZUNvbmVjdGlvblwiLCBcInN0b3BcIiwgbmV4dCwgMCk7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgIHN0b3BTZWxlY3RlZChzZWxlY3RlZCwgc2VsZWN0ZWQuc2hpZnQoKSk7XHJcbiAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIHN0b3BTZWxlY3RlZChzZWxlY3RlZCwgc2VsZWN0ZWQuc2hpZnQoKSk7ICAgICAgICAgIFxyXG4gICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHRpdGxlOiAn5piv5ZCm6ZyA6KaB5YGc5q2ib3JhY2xl5pyN5Yqh77yfJyxcclxuICAgICAgICBhY3Rpb246ICfku6XkuIvnmoRvcmFjbGXmnI3liqHlsIbkvJrooqvlgZzmraI6JyxcclxuICAgICAgICBva1RleHQ6ICflgZzmraInLFxyXG4gICAgICAgIG9rQ2xhc3M6ICdidG4tZGFuZ2VyIHNqX2J0bl9jaXInLFxyXG4gICAgICAgIGN1c3RvbTogXCLor6XmnI3liqHlgZzmraLlkI7lsIbml6Dms5Xnu6fnu63mj5Dkvpvov57mjqXorr/pl67mnI3liqHvvIzkvYblj6/pgJrov4flkK/liqjmjInpkq7ph43mlrDlkK/liqjor6XmnI3liqHku6Xov5vooYzorr/pl67jgILmmK/lkKblgZzmraLvvIzor7fnoa7orqRcIixcclxuICAgICAgICBjdXN0b21DbGFzczogXCJhbGVydCBhbGVydC13YXJuaW5nIHNqX2FsZXJ0LXdhcm5pbmdcIixcclxuICAgICAgICBjYW5jZWxUZXh0OiBcIuWPlua2iFwiLFxyXG4gICAgICAgIGNhbmNlbENsYXNzOiAnc2pfYnRuX2dyZXknXHJcbiAgICAgICAgfSkub3BlbigpO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICAgdmFyIG5hbWUgPSBcIlwiO1xyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGV4dHJhY3RJdGVtcywgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgbmFtZSArPSBpdGVtLiRvcmFjbGVOYW1lICsgXCIsXCI7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLy9hbGVydChcIuWBnOatouacjeWKoeWksei0pTpcIiArIG5hbWUgKyAgXCLmnI3liqHmraPlnKjmiafooYzmsYfmgLvmk43kvZzvvIzkuI3og73lgZzmraJcIik7IFxyXG4gICAgICAgICAgQ29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuaTjeS9nOWksei0pTrmraPlnKjmiafooYzmsYfmgLvmk43kvZznmoTmnI3liqHkuI3og73ooqvlgZzmraLvvIFcIiwgJycsbnVsbCwgMCwgXCJlcnJvclwiKTtcclxuICAgICAgfVxyXG4gICB9O1xyXG5cclxuICAgJHNjb3BlLnJlU3RhcnRQcm9tcHQgPSAoc2VsZWN0ZWQpID0+IHsgICAgXHJcbiAgICAgIGZ1bmN0aW9uIHN0YXJ0U2VsZWN0ZWQoc2VsZWN0ZWQ6QXJyYXk8S3ViZVBvZD4sIG5leHQ6S3ViZVBvZCl7XHJcbiAgICAgICAgIGlmKG5leHQpe1xyXG4gICAgICAgICAgIGNvbnNvbGUubG9nKGdldExhYmVscyhuZXh0KS5zdGF0dXMpO1xyXG4gICAgICAgICAgICBpZihuZXh0LiRyZXBsaWNhcyA9PT0gMCl7XHJcbiAgICAgICAgICAgICAgS3ViZXJuZXRlcy5yZXNpemVDb250cm9sbGVyKCRodHRwLCBLdWJlcm5ldGVzQXBpVVJMLCBuZXh0LCAxLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBLdWJlcm5ldGVzLmNvbm5lY3RPcmFjbGUoJGh0dHAsICR0aW1lb3V0LCBcIi9qYXZhL2NvbnNvbGUvYXBpL2Nvbm5lY3RPcmFjbGVcIiwgXCJyZVN0YXJ0XCIsIG5leHQsIDIwMCk7XHJcbiAgICAgICAgICAgICAgICBzdGFydFNlbGVjdGVkKHNlbGVjdGVkLCBzZWxlY3RlZC5zaGlmdCgpKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgaWYoZ2V0TGFiZWxzKG5leHQpLnN0YXR1cyA9PSBcIjFcIilcclxuICAgICAgICAgICAgICAgIEt1YmVybmV0ZXMuY29ubmVjdE9yYWNsZSgkaHR0cCwgJHRpbWVvdXQsIFwiL2phdmEvY29uc29sZS9hcGkvY29ubmVjdE9yYWNsZVwiLCBcInJlU3RhcnRcIiwgbmV4dCwgMjAwKTtcclxuICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0ZWQoc2VsZWN0ZWQsIHNlbGVjdGVkLnNoaWZ0KCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBzdGFydFNlbGVjdGVkKHNlbGVjdGVkLCBzZWxlY3RlZC5zaGlmdCgpKTsgICAgIFxyXG4gICB9O1xyXG5cclxuICAgLyoqXHJcbiAgICAg5aSE55CG5oq95Y+W5qCH5YeG6KGoXHJcbiAgICoqL1xyXG4gICRzY29wZS5leHRyYWN0T3JhY2xlID0gKHNlbGVjdGVkKSA9PnsgIFxyXG4gICAgdmFyIGFuc3dlciA9IGZhbHNlO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBDb25maWdzTW9kZWwub3JhY2xlUGFyYW0ubGVuZ3RoOyArK2kpIHtcclxuICAgICAgaWYoQ29uZmlnc01vZGVsLm9yYWNsZVBhcmFtW2ldLnR5cGUgPT0gMSl7XHJcbiAgICAgICAgYW5zd2VyID0gdHJ1ZVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihhbnN3ZXIgPT0gZmFsc2Upe1xyXG4gICAgICAvKipcclxuICAgICAg5o+Q56S65rKh5pyJ6YWN572u5qCH5YeG6KGo5rGH5oC75bqTXHJcbiAgICAgICoqL1xyXG4gICAgICBDb25maWdzLmN1c3RvbUFsZXJ0KFwi5o+Q56S6XCIsIFwi5pON5L2c5aSx6LSlOuayoeaciemFjee9rum7mOiupOeahOagh+WHhuihqOaxh+aAu+W6k1wiLCAnJyxudWxsLCAwLCBcImVycm9yXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyDmo4Dmn6XmlbDmja7lupPmmK/lkKblt7LlkK/liqhcclxuICAgIHZhciByZXN1bHQgPSBjaGVja0lzU3RhcnRTdWNjZXNzKHNlbGVjdGVkKTsgXHJcbiAgICBpZihyZXN1bHQubGVuZ3RoID4gMCl7XHJcbiAgICAgIENvbmZpZ3MuY3VzdG9tQWxlcnQoXCLmj5DnpLpcIiwgXCLmk43kvZzlpLHotKU66YCJ5oup5pyN5Yqh5Lit5a2Y5Zyo5pyq5ZCv5Yqo55qE5pWw5o2u5bqT77yM6K+35YWI5ZCv5Yqo5pyN5YqhXCIsICcnLG51bGwsIDAsIFwiZXJyb3JcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHZhciBhbnN3ZXIgPSBmYWxzZTtcclxuICAgIHZhciBzZWxlY3RlZEl0ZW0gPSBudWxsO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBDb25maWdzTW9kZWwub3JhY2xlUGFyYW0ubGVuZ3RoOyArK2kpIHtcclxuICAgICAgaWYoQ29uZmlnc01vZGVsLm9yYWNsZVBhcmFtW2ldLnR5cGUgPT0gMSl7XHJcbiAgICAgICAgc2VsZWN0ZWRJdGVtID0gQ29uZmlnc01vZGVsLm9yYWNsZVBhcmFtW2ldO1xyXG4gICAgICAgIGFuc3dlciA9IHRydWVcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYoYW5zd2VyID09IGZhbHNlKXtcclxuICAgICAgLyoqXHJcbiAgICAgICAg5o+Q56S65rKh5pyJ6YWN572u5qCH5YeG6KGo5rGH5oC75bqTXHJcbiAgICAgICoqL1xyXG4gICAgICBDb25maWdzLmN1c3RvbUFsZXJ0KFwi5o+Q56S6XCIsIFwi5pON5L2c5aSx6LSlOuayoeaciemFjee9rum7mOiupOeahOagh+WHhuihqOaxh+aAu+W6k1wiLCAnJyxudWxsLCAwLCBcImVycm9yXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgS3ViZXJuZXRlcy5leHRyYWN0RGF0YVRvT3JhY2xlKCRodHRwLCBcIi9qYXZhL2NvbnNvbGUvYXBpL29yYWNsZS9zdGFuZGFyZGV4dHJhY3RcIiwgc2VsZWN0ZWQsIHNlbGVjdGVkSXRlbSk7XHJcbiAgfVxyXG5cclxuICAgJHNjb3BlLmV4dHJhY3RDbGljayA9IHtcclxuICAgICAgaXRlbXM6IG51bGwsXHJcbiAgICAgIHNlbGVjdGVkSXRlbTogIHtuYW1lOiBcIuW9k+WJjeayoeacieWPr+eUqOeahOaxh+aAu+W6k1wifSxcclxuICAgICAgZGlhbG9nOiBuZXcgVUkuRGlhbG9nKCksXHJcbiAgICAgIG9uT2s6ICgpID0+IHsgICAgICAgICAgICAgIFxyXG4gICAgICAgIHZhciBleHRyYWN0Q2xpY2sgPSAkc2NvcGUuZXh0cmFjdENsaWNrOyAgICBcclxuICAgICAgICBleHRyYWN0Q2xpY2suaXRlbXMgPSAkc2NvcGUudGFibGVDb25maWcuc2VsZWN0ZWRJdGVtcztcclxuICAgICAgICBLdWJlcm5ldGVzLmV4dHJhY3REYXRhVG9PcmFjbGUoJGh0dHAsIFwiL2phdmEvY29uc29sZS9hcGkvb3JhY2xlXCIsIGV4dHJhY3RDbGljay5pdGVtcywgZXh0cmFjdENsaWNrLnNlbGVjdGVkSXRlbSk7XHJcbiAgICAgICAgLy9leHRyYWN0Q2xpY2suc2VsZWN0ZWRJdGVtID0gJHNjb3BlLmZpbHRlclJlcGxpY2F0aW9uQ29udHJvbGxlcnNbMF0gfHwgXCJcIjtcclxuICAgICAgICBleHRyYWN0Q2xpY2suZGlhbG9nLmNsb3NlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9wZW46IChzZWxlY3RlZCkgPT4geyAgICAgICAgICAgXHJcbiAgICAgICAgdmFyIGV4dHJhY3RDbGljayA9ICRzY29wZS5leHRyYWN0Q2xpY2s7IFxyXG4gICAgICAgIGlmKCRzY29wZS5jb25maWdzICYmICRzY29wZS5jb25maWdzLm9yYWNsZVBhcmFtIGluc3RhbmNlb2YgQXJyYXkgJiYgJHNjb3BlLmNvbmZpZ3Mub3JhY2xlUGFyYW0ubGVuZ3RoPjApXHJcbiAgICAgICAgICAgZXh0cmFjdENsaWNrLnNlbGVjdGVkSXRlbSA9ICRzY29wZS5jb25maWdzLm9yYWNsZVBhcmFtWzBdO1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBjaGVja0lzU3RhcnRTdWNjZXNzKCRzY29wZS50YWJsZUNvbmZpZy5zZWxlY3RlZEl0ZW1zKTsgICAgICAgIFxyXG4gICAgICAgIGlmKHJlc3VsdC5sZW5ndGggPjApe1xyXG4gICAgICAgICAgQ29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuaTjeS9nOWksei0pTrpgInmi6nmnI3liqHkuK3lrZjlnKjmnKrlkK/liqjnmoTmlbDmja7lupPvvIzor7flhYjlkK/liqjmnI3liqFcIiwgJycsbnVsbCwgMCwgXCJlcnJvclwiKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9ICAgICAgICBcclxuICAgICAgICBleHRyYWN0Q2xpY2suZGlhbG9nLm9wZW4oKTtcclxuICAgICAgICAvKmV4dHJhY3REYXRhLnNlbGVjdGVkSXRlbSA9ICRzY29wZS5maWx0ZXJSZXBsaWNhdGlvbkNvbnRyb2xsZXJzWzBdIHx8IFwiXCI7XHJcbiAgICAgICAgICBleHRyYWN0RGF0YS5pdGVtcyA9IHNlbGVjdGVkOyovXHJcbiAgICAgICAgICAkdGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICQoJyNuZXdEYXRhTmFtZScpLmZvY3VzKCk7XHJcbiAgICAgICAgICB9LCA1MCk7XHJcbiAgICAgICB9LFxyXG4gICAgICAgY2xvc2U6ICgpID0+IHtcclxuICAgICAgICAgICAkc2NvcGUuZXh0cmFjdENsaWNrLnNlbGVjdGVkSXRlbSA9IHtuYW1lOiBcIuW9k+WJjeayoeacieWPr+eUqOeahOaxh+aAu+W6k1wifTtcclxuICAgICAgICAgICAkc2NvcGUuZXh0cmFjdENsaWNrLmRpYWxvZy5jbG9zZSgpO1xyXG4gICAgICAgfVxyXG4gICB9O1xyXG5cclxuICB9XSk7XHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc0ludGVyZmFjZXMudHNcIi8+XHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIHNjaGVtYVNldFJlcXVpcmVkKHNjaGVtYSwgcHJvcGVydHlOYW1lLCBpc1JlcXVpcmVkID0gdHJ1ZSkge1xyXG4gICAgaWYgKHNjaGVtYSAmJiBwcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgdmFyIHJlcXVpcmVkID0gc2NoZW1hLnJlcXVpcmVkO1xyXG4gICAgICBpZiAoaXNSZXF1aXJlZCkge1xyXG4gICAgICAgIGlmICghcmVxdWlyZWQpIHtcclxuICAgICAgICAgIHJlcXVpcmVkID0gW107XHJcbiAgICAgICAgICBzY2hlbWEucmVxdWlyZWQgPSByZXF1aXJlZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFfLmNvbnRhaW5zKHJlcXVpcmVkLCBwcm9wZXJ0eU5hbWUpKSB7XHJcbiAgICAgICAgICByZXF1aXJlZC5wdXNoKHByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChyZXF1aXJlZCkge1xyXG4gICAgICAgICAgdmFyIGlkeCA9IHJlcXVpcmVkLmluZGV4T2YocHJvcGVydHlOYW1lKTtcclxuICAgICAgICAgIGlmIChpZHggPj0gMCkge1xyXG4gICAgICAgICAgICByZXF1aXJlZC5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG5cclxubW9kdWxlIEt1YmVybmV0ZXMge1xyXG5cclxuICBleHBvcnQgdmFyIFNlY3JldENvbnRyb2xsZXIgPSBjb250cm9sbGVyKFwiU2VjcmV0Q29udHJvbGxlclwiLFxyXG4gICAgW1wiJHNjb3BlXCIsIFwiS3ViZXJuZXRlc01vZGVsXCIsIFwiS3ViZXJuZXRlc1N0YXRlXCIsIFwiS3ViZXJuZXRlc1NjaGVtYVwiLCBcIiR0ZW1wbGF0ZUNhY2hlXCIsIFwiJGxvY2F0aW9uXCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwiJGh0dHBcIiwgXCIkdGltZW91dFwiLCBcIkt1YmVybmV0ZXNBcGlVUkxcIiwgXCJLOFNDbGllbnRGYWN0b3J5XCIsXHJcbiAgICAgICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDpLdWJlcm5ldGVzLkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc1NjaGVtYSxcclxuICAgICAgICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgJGxvY2F0aW9uOm5nLklMb2NhdGlvblNlcnZpY2UsICRyb3V0ZVBhcmFtcywgJGh0dHAsICR0aW1lb3V0LCBLdWJlcm5ldGVzQXBpVVJMLCBLOFNDbGllbnRGYWN0b3J5KSA9PiB7XHJcblxyXG4gICAgICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG4gICAgICAgICRzY29wZS5tb2RlbCA9IEt1YmVybmV0ZXNNb2RlbDtcclxuICAgICAgICAkc2NvcGUuaWQgPSAkcm91dGVQYXJhbXNbXCJpZFwiXTtcclxuXHJcbiAgICAgICAgS3ViZXJuZXRlcy5pbml0U2hhcmVkKCRzY29wZSwgJGxvY2F0aW9uLCAkaHR0cCwgJHRpbWVvdXQsICRyb3V0ZVBhcmFtcywgS3ViZXJuZXRlc01vZGVsLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNBcGlVUkwpO1xyXG4gICAgICAgIHNlbGVjdFN1Yk5hdkJhcigkc2NvcGUsIFwiU2VjcmV0c1wiLCAkc2NvcGUuaWQgPyBcIkVkaXQgU2VjcmV0OiBcIiArICRzY29wZS5pZCA6IFwiQ3JlYXRlIFNlY3JldFwiKTtcclxuXHJcbiAgICAgICAgdmFyIGt1YmVDbGllbnQgPSBjcmVhdGVLdWJlcm5ldGVzQ2xpZW50KFwic2VjcmV0c1wiKTtcclxuXHJcbiAgICAgICAgdmFyIG9uU2F2ZVVybCA9ICRsb2NhdGlvbi5zZWFyY2goKVtcInNhdmVkVXJsXCJdO1xyXG4gICAgICAgIHZhciBjcmVhdGVLaW5kID0gJGxvY2F0aW9uLnNlYXJjaCgpW1wia2luZFwiXTtcclxuXHJcbiAgICAgICAgJHNjb3BlLnNzaEtleXMgPSBzc2hTZWNyZXREYXRhS2V5cztcclxuICAgICAgICAkc2NvcGUuaHR0cHNLZXlzID0gaHR0cHNTZWNyZXREYXRhS2V5cztcclxuXHJcbiAgICAgICAgdmFyIHNlY3JldExhYmVscyA9IHtcclxuICAgICAgICAgIFwic3NoLWtleVwiOiBcIlNTSCBwcml2YXRlIGtleVwiLFxyXG4gICAgICAgICAgXCJzc2gta2V5LnB1YlwiOiBcIlNTSCBwdWJsaWMga2V5XCIsXHJcbiAgICAgICAgICBcImNhLmNydFwiOiBcIkNBIENlcnRpZmljYXRlXCIsXHJcbiAgICAgICAgICBcIi5kb2NrZXJjZmdcIjogXCJEb2NrZXIgY29uZmlnXCIsXHJcbiAgICAgICAgICBcInVzZXJuYW1lXCI6IFwiVXNlciBuYW1lXCJcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciBzZWNyZXRUb29sdGlwcyA9IHtcclxuICAgICAgICAgIFwic3NoLWtleVwiOiBcIlNTSCBwcml2YXRlIGtleSB0ZXh0IGNvbnRlbnRzXCIsXHJcbiAgICAgICAgICBcImNhLmNydFwiOiBcIkNlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpIENlcnRpZmljYXRlXCIsXHJcbiAgICAgICAgICBcIi5kb2NrZXJjZmdcIjogXCJEb2NrZXIgY29uZmlndXJhdGlvbiB0b2tlblwiXHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgICRzY29wZS4kb24oJ2t1YmVybmV0ZXNNb2RlbFVwZGF0ZWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBpZiAoJHNjb3BlLmlkICYmICEkc2NvcGUuc2VjcmV0KSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJHNjb3BlLiRvbignJHJvdXRlVXBkYXRlJywgKCRldmVudCkgPT4ge1xyXG4gICAgICAgICAgdXBkYXRlRGF0YSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkc2NvcGUucHJvcGVydHlLZXlzID0gKCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIF8ua2V5cyhzZWNyZXRMYWJlbHMpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgICRzY29wZS5jaGVja05hbWVVbmlxdWUgPSAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHZhciBhbnN3ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKCRzY29wZS5tb2RlbC5zZWNyZXRzLCAoc2VjcmV0KSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBuYW1lID0gZ2V0TmFtZShzZWNyZXQpO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG5hbWUpIHtcclxuICAgICAgICAgICAgICBhbnN3ZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICByZXR1cm4gYW5zd2VyO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgICRzY29wZS5jaGVja0ZpZWxkVW5pcXVlID0gKGtleSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuICRzY29wZS5lbnRpdHkucHJvcGVydGllc1trZXldID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgICRzY29wZS5oYXNBbGxLZXlzID0gKGtleXMpID0+IHtcclxuICAgICAgICAgIHZhciBhbnN3ZXIgPSBrZXlzICYmIGtleXMubGVuZ3RoO1xyXG4gICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGtleXMsIChrZXkpID0+IHtcclxuICAgICAgICAgICAgaWYgKCEkc2NvcGUuZW50aXR5LnByb3BlcnRpZXNba2V5XSkge1xyXG4gICAgICAgICAgICAgIGFuc3dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybiBhbnN3ZXI7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgJHNjb3BlLmFkZEZpZWxkRGlhbG9nID0ge1xyXG4gICAgICAgICAgY29udHJvbGxlcjogbnVsbCxcclxuICAgICAgICAgIG5ld1JlcGxpY2FzOiAwLFxyXG4gICAgICAgICAgZGlhbG9nOiBuZXcgVUkuRGlhbG9nKCksXHJcbiAgICAgICAgICBvbk9rOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICRzY29wZS5hZGRGaWVsZERpYWxvZy5kaWFsb2cuY2xvc2UoKTtcclxuICAgICAgICAgICAgJHNjb3BlLmFkZERhdGFGaWVsZCgpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9wZW46IChjb250cm9sbGVyKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBhZGRGaWVsZERpYWxvZyA9ICRzY29wZS5hZGRGaWVsZERpYWxvZztcclxuICAgICAgICAgICAgYWRkRmllbGREaWFsb2cuZGlhbG9nLm9wZW4oKTtcclxuXHJcbiAgICAgICAgICAgICR0aW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAkKCcjbmV3RGF0YU5hbWUnKS5mb2N1cygpO1xyXG4gICAgICAgICAgICB9LCA1MCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY2xvc2U6ICgpID0+IHtcclxuICAgICAgICAgICAgJHNjb3BlLmFkZEZpZWxkRGlhbG9nLmRpYWxvZy5jbG9zZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG5cclxuXHJcbiAgICAgICAgJHNjb3BlLmVudGl0eUNoYW5nZWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAkc2NvcGUuY2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgJHNjb3BlLmFkZEZpZWxkcyA9IChrZXlzKSA9PiB7XHJcbiAgICAgICAgICBhbmd1bGFyLmZvckVhY2goa2V5cywgKGtleSkgPT4gYWRkRmllbGQoa2V5KSk7XHJcbiAgICAgICAgICBDb3JlLiRhcHBseSgkc2NvcGUpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGFkZEZpZWxkKGtleSkge1xyXG4gICAgICAgICAgdmFyIHByb3BlcnR5ID0gY3JlYXRlUHJvcGVydHkoa2V5LCBcIlwiKTtcclxuICAgICAgICAgICRzY29wZS5lbnRpdHkucHJvcGVydGllc1trZXldID0gcHJvcGVydHk7XHJcbiAgICAgICAgICAkc2NvcGUuZW50aXR5Lm5ld0RhdGFLZXkgPSBcIlwiO1xyXG4gICAgICAgICAgJHNjb3BlLnNob3dBZGREYXRhRmllbGRGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgICAkc2NvcGUuZW50aXR5Q2hhbmdlZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJHNjb3BlLmFkZERhdGFGaWVsZCA9ICgpID0+IHtcclxuICAgICAgICAgIHZhciBrZXkgPSAkc2NvcGUuZW50aXR5Lm5ld0RhdGFLZXk7XHJcbiAgICAgICAgICBpZiAoa2V5KSB7XHJcbiAgICAgICAgICAgIGFkZEZpZWxkKGtleSk7XHJcbiAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgJHNjb3BlLmRlbGV0ZVByb3BlcnR5ID0gKGtleSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGtleSkge1xyXG4gICAgICAgICAgICBkZWxldGUgJHNjb3BlLmVudGl0eS5wcm9wZXJ0aWVzW2tleV07XHJcbiAgICAgICAgICAgICRzY29wZS5lbnRpdHlDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgJHNjb3BlLmNhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAkc2NvcGUuc2F2ZSA9ICgpID0+IHtcclxuICAgICAgICAgIHZhciBlbnRpdHkgPSAkc2NvcGUuZW50aXR5IHx8IHt9O1xyXG4gICAgICAgICAgdmFyIG5hbWUgPSBlbnRpdHkubmFtZTtcclxuICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgIGlmICghJHNjb3BlLnNlY3JldCkge1xyXG4gICAgICAgICAgICAgICRzY29wZS5zZWNyZXQgPSB7XHJcbiAgICAgICAgICAgICAgICBhcGlWZXJzaW9uOiBLdWJlcm5ldGVzLmRlZmF1bHRBcGlWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAga2luZDogXCJTZWNyZXRcIixcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwiXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBkYXRhOiB7fVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goZW50aXR5LnByb3BlcnRpZXMsIChwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgICAgIHZhciBrZXkgPSBwcm9wZXJ0eS5rZXk7XHJcbiAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcHJvcGVydHkudmFsdWUgfHwgXCJcIjtcclxuICAgICAgICAgICAgICBpZiAoa2V5KSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSB3aW5kb3cuYnRvYSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgJHNjb3BlLnNlY3JldC5tZXRhZGF0YS5uYW1lID0gbmFtZTtcclxuICAgICAgICAgICAgJHNjb3BlLnNlY3JldC5kYXRhID0gZGF0YTtcclxuXHJcbiAgICAgICAgICAgIENvcmUubm90aWZpY2F0aW9uKCdpbmZvJywgXCJTYXZpbmcgc2VjcmV0IFwiICsgbmFtZSk7XHJcblxyXG4gICAgICAgICAgICBrdWJlQ2xpZW50LnB1dCgkc2NvcGUuc2VjcmV0LFxyXG4gICAgICAgICAgICAgIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VjcmV0c0xpbmsgPSBvblNhdmVVcmwgfHwgRGV2ZWxvcGVyLm5hbWVzcGFjZUxpbmsoJHNjb3BlLCAkcm91dGVQYXJhbXMsIFwic2VjcmV0c1wiKTtcclxuICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7fTtcclxuICAgICAgICAgICAgICAgIGlmIChvblNhdmVVcmwpIHtcclxuICAgICAgICAgICAgICAgICAgcGFyYW1zWydzZWNyZXQnXSA9IG5hbWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAkbG9jYXRpb24ucGF0aChzZWNyZXRzTGluayk7XHJcbiAgICAgICAgICAgICAgICAkbG9jYXRpb24uc2VhcmNoKHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICBsb2cuaW5mbyhcIm5hdmlnYXRpbmcgdG8gVVJMOiBcIiArIHNlY3JldHNMaW5rICsgXCIgd2l0aCBwYXJhbXMgXCIgKyBhbmd1bGFyLnRvSnNvbigkbG9jYXRpb24uc2VhcmNoKCkpKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgIENvcmUubm90aWZpY2F0aW9uKCdlcnJvcicsIFwiRmFpbGVkIHRvIHNlY3JldCBcIiArIG5hbWUgKyBcIlxcblwiICsgZXJyKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB1cGRhdGVEYXRhKCk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5KGtleSwgdGV4dCkge1xyXG4gICAgICAgICAgdmFyIGxhYmVsID0gc2VjcmV0TGFiZWxzW2tleV0gfHwgQ29yZS5odW1hbml6ZVZhbHVlKGtleSk7XHJcbiAgICAgICAgICB2YXIgdG9vbHRpcCA9IHNlY3JldFRvb2x0aXBzW2tleV0gfHwgXCJWYWx1ZSBvZiB0aGUgXCIgKyBsYWJlbDtcclxuXHJcbiAgICAgICAgICB2YXIgcm93cyA9IDU7XHJcbiAgICAgICAgICB2YXIgbGluZXMgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpLmxlbmd0aCArIDE7XHJcbiAgICAgICAgICBpZiAobGluZXMgPiByb3dzKSB7XHJcbiAgICAgICAgICAgIHJvd3MgPSBsaW5lcztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhciB0eXBlID0gXCJ0ZXh0YXJlYVwiO1xyXG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJ1c2VybmFtZVwiKSB7XHJcbiAgICAgICAgICAgIHR5cGUgPSBcInRleHRcIjtcclxuICAgICAgICAgICAgaWYgKCF0ZXh0KSB7XHJcbiAgICAgICAgICAgICAgdGV4dCA9IGN1cnJlbnRVc2VyTmFtZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJwYXNzd29yZFwiKSB7XHJcbiAgICAgICAgICAgIHR5cGUgPSBcInBhc3N3b3JkXCI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB2YXIgcHJvcGVydHkgPSB7XHJcbiAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICBsYWJlbDogbGFiZWwsXHJcbiAgICAgICAgICAgIHRvb2x0aXA6IHRvb2x0aXAsXHJcbiAgICAgICAgICAgIHJvd3M6IHJvd3MsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0ZXh0LFxyXG4gICAgICAgICAgICB0eXBlOiB0eXBlXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgcmV0dXJuIHByb3BlcnR5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlRGF0YSgpIHtcclxuICAgICAgICAgICRzY29wZS5pdGVtID0gbnVsbDtcclxuICAgICAgICAgICRzY29wZS5jaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAkc2NvcGUuZW50aXR5ID0ge1xyXG4gICAgICAgICAgICBuYW1lOiAkc2NvcGUuaWQsXHJcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHt9XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgaWYgKCRzY29wZS5pZCkge1xyXG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goJHNjb3BlLm1vZGVsLnNlY3JldHMsIChzZWNyZXQpID0+IHtcclxuICAgICAgICAgICAgICB2YXIgbmFtZSA9IGdldE5hbWUoc2VjcmV0KTtcclxuICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJHNjb3BlLmlkKSB7XHJcbiAgICAgICAgICAgICAgICAkc2NvcGUuc2VjcmV0ID0gc2VjcmV0O1xyXG4gICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHNlY3JldC5kYXRhLCAodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSB3aW5kb3cuYXRvYih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gY3JlYXRlUHJvcGVydHkoa2V5LCB0ZXh0KTtcclxuICAgICAgICAgICAgICAgICAgJHNjb3BlLmVudGl0eS5wcm9wZXJ0aWVzW2tleV0gPSBwcm9wZXJ0eTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgJHNjb3BlLmZldGNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgQ29yZS4kYXBwbHkoJHNjb3BlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNyZWF0ZUtpbmQgPT09IFwic3NoXCIpIHtcclxuICAgICAgICAgICAgICAkc2NvcGUuYWRkRmllbGRzKCRzY29wZS5zc2hLZXlzKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjcmVhdGVLaW5kID09PSBcImh0dHBzXCIpIHtcclxuICAgICAgICAgICAgICAkc2NvcGUuYWRkRmllbGRzKCRzY29wZS5odHRwc0tleXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICRzY29wZS5mZXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgQ29yZS4kYXBwbHkoJHNjb3BlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1dKTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc01vZGVsLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwidXRpbEhlbHBlcnMudHNcIi8+XHJcblxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIGV4cG9ydCB2YXIgU2VjcmV0c0NvbnRyb2xsZXIgPSBjb250cm9sbGVyKFwiU2VjcmV0c0NvbnRyb2xsZXJcIiwgW1wiJHNjb3BlXCIsIFwiS3ViZXJuZXRlc01vZGVsXCIsIFwiS3ViZXJuZXRlc1N0YXRlXCIsIFwiU2VydmljZVJlZ2lzdHJ5XCIsIFwiJGRpYWxvZ1wiLCBcIiR3aW5kb3dcIiwgXCIkdGVtcGxhdGVDYWNoZVwiLCBcIiRyb3V0ZVBhcmFtc1wiLCBcIiRsb2NhdGlvblwiLCBcImxvY2FsU3RvcmFnZVwiLCBcIiRodHRwXCIsIFwiJHRpbWVvdXRcIiwgXCJLdWJlcm5ldGVzQXBpVVJMXCIsXHJcbiAgICAoJHNjb3BlLCBLdWJlcm5ldGVzTW9kZWw6IEt1YmVybmV0ZXMuS3ViZXJuZXRlc01vZGVsU2VydmljZSwgS3ViZXJuZXRlc1N0YXRlLCBTZXJ2aWNlUmVnaXN0cnksICRkaWFsb2csICR3aW5kb3csICR0ZW1wbGF0ZUNhY2hlLCAkcm91dGVQYXJhbXMsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlLCBsb2NhbFN0b3JhZ2UsICRodHRwLCAkdGltZW91dCwgS3ViZXJuZXRlc0FwaVVSTCkgPT4ge1xyXG5cclxuICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG4gICAgJHNjb3BlLm1vZGVsID0gS3ViZXJuZXRlc01vZGVsO1xyXG4gICAgJHNjb3BlLiRvbigna3ViZXJuZXRlc01vZGVsVXBkYXRlZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgQ29yZS4kYXBwbHkoJHNjb3BlKTtcclxuICAgIH0pO1xyXG5cclxuICAgICRzY29wZS4kY3JlYXRlU2VjcmV0TGluayA9IERldmVsb3Blci5uYW1lc3BhY2VMaW5rKCRzY29wZSwgJHJvdXRlUGFyYW1zLCBcInNlY3JldENyZWF0ZVwiKTtcclxuXHJcbiAgICB2YXIga3ViZUNsaWVudCA9IGNyZWF0ZUt1YmVybmV0ZXNDbGllbnQoXCJzZWNyZXRzXCIpO1xyXG5cclxuICAgICRzY29wZS50YWJsZUNvbmZpZyA9IHtcclxuICAgICAgZGF0YTogJ21vZGVsLnNlY3JldHMnLFxyXG4gICAgICBzaG93U2VsZWN0aW9uQ2hlY2tib3g6IHRydWUsXHJcbiAgICAgIGVuYWJsZVJvd0NsaWNrU2VsZWN0aW9uOiBmYWxzZSxcclxuICAgICAgbXVsdGlTZWxlY3Q6IHRydWUsXHJcbiAgICAgIHNlbGVjdGVkSXRlbXM6IFtdLFxyXG4gICAgICBmaWx0ZXJPcHRpb25zOiB7XHJcbiAgICAgICAgZmlsdGVyVGV4dDogJGxvY2F0aW9uLnNlYXJjaCgpW1wicVwiXSB8fCAnJ1xyXG4gICAgICB9LFxyXG4gICAgICBjb2x1bW5EZWZzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZmllbGQ6ICdfa2V5JyxcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTmFtZScsXHJcbiAgICAgICAgICBkZWZhdWx0U29ydDogdHJ1ZSxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwiaWRUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZDogJyRsYWJlbHNUZXh0JyxcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTGFiZWxzJyxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwibGFiZWxUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgfSxcclxuICAgICAgXVxyXG4gICAgfTtcclxuXHJcbiAgICAkc2NvcGUuZGVsZXRlUHJvbXB0ID0gKHNlbGVjdGVkKSA9PiB7XHJcbiAgICAgICBVSS5tdWx0aUl0ZW1Db25maXJtQWN0aW9uRGlhbG9nKDxVSS5NdWx0aUl0ZW1Db25maXJtQWN0aW9uT3B0aW9ucz57XHJcbiAgICAgICAgIGNvbGxlY3Rpb246IHNlbGVjdGVkLFxyXG4gICAgICAgICBpbmRleDogJ21ldGFkYXRhLm5hbWUnLFxyXG4gICAgICAgICBvbkNsb3NlOiAocmVzdWx0OmJvb2xlYW4pID0+IHtcclxuICAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICBmdW5jdGlvbiBkZWxldGVTZWxlY3RlZChzZWxlY3RlZCwgbmV4dCkge1xyXG4gICAgICAgICAgICAgICBpZiAobmV4dCkge1xyXG4gICAgICAgICAgICAgICAgIGt1YmVDbGllbnQuZGVsZXRlKG5leHQsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgIGRlbGV0ZVNlbGVjdGVkKHNlbGVjdGVkLCBzZWxlY3RlZC5zaGlmdCgpKTtcclxuICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAvLyBUT0RPXHJcbiAgICAgICAgICAgICAgICAgLy8gdXBkYXRlRGF0YSgpO1xyXG4gICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgZGVsZXRlU2VsZWN0ZWQoc2VsZWN0ZWQsIHNlbGVjdGVkLnNoaWZ0KCkpO1xyXG4gICAgICAgICAgIH1cclxuICAgICAgICAgfSxcclxuICAgICAgICAgdGl0bGU6ICdEZWxldGUgU2VjcmV0cycsXHJcbiAgICAgICAgIGFjdGlvbjogJ1RoZSBmb2xsb3dpbmcgU2VjcmV0cyB3aWxsIGJlIGRlbGV0ZWQ6JyxcclxuICAgICAgICAgb2tUZXh0OiAnRGVsZXRlJyxcclxuICAgICAgICAgb2tDbGFzczogJ2J0bi1kYW5nZXInLFxyXG4gICAgICAgICBjdXN0b206IFwiVGhpcyBvcGVyYXRpb24gaXMgcGVybWFuZW50IG9uY2UgY29tcGxldGVkIVwiLFxyXG4gICAgICAgICBjdXN0b21DbGFzczogXCJhbGVydCBhbGVydC13YXJuaW5nXCJcclxuICAgICAgIH0pLm9wZW4oKTtcclxuICAgICB9O1xyXG5cclxuICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuICB9XSk7XHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG5cclxubW9kdWxlIEt1YmVybmV0ZXMge1xyXG5cclxuICBleHBvcnQgdmFyIFNlcnZpY2VDb250cm9sbGVyID0gY29udHJvbGxlcihcIlNlcnZpY2VDb250cm9sbGVyXCIsXHJcbiAgICBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCIkdGVtcGxhdGVDYWNoZVwiLCBcIiRsb2NhdGlvblwiLCBcIiRyb3V0ZVBhcmFtc1wiLCBcIiRodHRwXCIsIFwiJHRpbWVvdXRcIiwgXCJLdWJlcm5ldGVzQXBpVVJMXCIsXHJcbiAgICAgICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDogS3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzU3RhdGUsXHJcbiAgICAgICAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlLCAkcm91dGVQYXJhbXMsICRodHRwLCAkdGltZW91dCwgS3ViZXJuZXRlc0FwaVVSTCkgPT4ge1xyXG5cclxuICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG4gICAgJHNjb3BlLm1vZGVsID0gS3ViZXJuZXRlc01vZGVsO1xyXG4gICAgJHNjb3BlLnJhd01vZGVsID0gbnVsbDtcclxuXHJcbiAgICBLdWJlcm5ldGVzLmluaXRTaGFyZWQoJHNjb3BlLCAkbG9jYXRpb24sICRodHRwLCAkdGltZW91dCwgJHJvdXRlUGFyYW1zLCBLdWJlcm5ldGVzTW9kZWwsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc0FwaVVSTCk7XHJcblxyXG4gICAgJHNjb3BlLml0ZW1Db25maWcgPSB7XHJcbiAgICAgIHByb3BlcnRpZXM6IHtcclxuICAgICAgICAnXlxcXFwvbGFiZWxzJCc6IHtcclxuICAgICAgICAgIHRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoJ2xhYmVsVGVtcGxhdGUuaHRtbCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgICRzY29wZS4kb24oJ2t1YmVybmV0ZXNNb2RlbFVwZGF0ZWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgIH0pO1xyXG5cclxuICAgICRzY29wZS4kd2F0Y2goJ21vZGVsLnNlcnZpY2VzJywgKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgPT4ge1xyXG4gICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICB9LCB0cnVlKTtcclxuXHJcbiAgICAkc2NvcGUuJG9uKCckcm91dGVVcGRhdGUnLCAoJGV2ZW50KSA9PiB7XHJcbiAgICAgIHVwZGF0ZURhdGEoKTtcclxuICAgIH0pO1xyXG5cclxuICAgICRzY29wZS5mbGlwUmF3ID0gKCkgPT4ge1xyXG4gICAgICAkc2NvcGUucmF3TW9kZSA9ICEkc2NvcGUucmF3TW9kZTtcclxuICAgICAgQ29yZS4kYXBwbHkoJHNjb3BlKTtcclxuICAgIH07XHJcblxyXG4gICAgdXBkYXRlRGF0YSgpO1xyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZURhdGEoKSB7XHJcbiAgICAgICRzY29wZS5pZCA9ICRyb3V0ZVBhcmFtc1tcImlkXCJdO1xyXG4gICAgICAkc2NvcGUubmFtZXNwYWNlID0gJHJvdXRlUGFyYW1zW1wibmFtZXNwYWNlXCJdIHx8IEt1YmVybmV0ZXNTdGF0ZS5zZWxlY3RlZE5hbWVzcGFjZTtcclxuICAgICAgJHNjb3BlLml0ZW0gPSAkc2NvcGUubW9kZWwuZ2V0U2VydmljZSgkc2NvcGUubmFtZXNwYWNlLCAkc2NvcGUuaWQpO1xyXG4gICAgICBpZiAoJHNjb3BlLml0ZW0pIHtcclxuICAgICAgICAkc2NvcGUucmF3TW9kZWwgPSB0b1Jhd1lhbWwoJHNjb3BlLml0ZW0pO1xyXG4gICAgICB9XHJcbiAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICB9XHJcbiAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc1BsdWdpbi50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgZXhwb3J0IHZhciBTZXJ2aWNlRWRpdENvbnRyb2xsZXIgPSBjb250cm9sbGVyKFwiU2VydmljZUVkaXRDb250cm9sbGVyXCIsXHJcbiAgICBbXCIkc2NvcGVcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCJLdWJlcm5ldGVzU2NoZW1hXCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkbG9jYXRpb25cIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiS3ViZXJuZXRlc0FwaVVSTFwiLCBcIlNjaGVtYVJlZ2lzdHJ5XCIsXHJcbiAgICAgICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDogS3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNTY2hlbWEsXHJcbiAgICAgICAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsICRsb2NhdGlvbjpuZy5JTG9jYXRpb25TZXJ2aWNlLCAkcm91dGVQYXJhbXMsICRodHRwLCAkdGltZW91dCwgS3ViZXJuZXRlc0FwaVVSTCwgc2NoZW1hczpIYXd0aW9Gb3Jtcy5TY2hlbWFSZWdpc3RyeSkgPT4ge1xyXG5cclxuICAgICRzY29wZS5rdWJlcm5ldGVzID0gS3ViZXJuZXRlc1N0YXRlO1xyXG4gICAgJHNjb3BlLm1vZGVsID0gS3ViZXJuZXRlc01vZGVsO1xyXG4gICAgJHNjb3BlLmlkID0gJHJvdXRlUGFyYW1zW1wiaWRcIl07XHJcbiAgICAkc2NvcGUuc2NoZW1hID0gS3ViZXJuZXRlc1NjaGVtYTtcclxuICAgICRzY29wZS5jb25maWcgPSBzY2hlbWFzLmNsb25lU2NoZW1hKFwiaW8uZmFicmljOC5rdWJlcm5ldGVzLmFwaS5tb2RlbC5TZXJ2aWNlXCIpO1xyXG4gICAgLy8kc2NvcGUuY29uZmlnID0gS3ViZXJuZXRlc1NjaGVtYS5kZWZpbml0aW9ucy5rdWJlcm5ldGVzX3YxYmV0YTJfU2VydmljZTtcclxuXHJcbiAgICBLdWJlcm5ldGVzLmluaXRTaGFyZWQoJHNjb3BlLCAkbG9jYXRpb24sICRodHRwLCAkdGltZW91dCwgJHJvdXRlUGFyYW1zLCBLdWJlcm5ldGVzTW9kZWwsIEt1YmVybmV0ZXNTdGF0ZSwgS3ViZXJuZXRlc0FwaVVSTCk7XHJcblxyXG4gICAgJHNjb3BlLiRvbignJHJvdXRlVXBkYXRlJywgKCRldmVudCkgPT4ge1xyXG4gICAgICB1cGRhdGVEYXRhKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB1cGRhdGVEYXRhKCk7XHJcblxyXG4gICAgZnVuY3Rpb24gdXBkYXRlRGF0YSgpIHtcclxuICAgICAgaWYgKCRzY29wZS5pZCkge1xyXG4gICAgICAgICRzY29wZS5lbnRpdHkgPSAkc2NvcGUubW9kZWwuZ2V0U2VydmljZShLdWJlcm5ldGVzU3RhdGUuc2VsZWN0ZWROYW1lc3BhY2UsICRzY29wZS5pZCk7XHJcbiAgICAgICAgQ29yZS4kYXBwbHkoJHNjb3BlKTtcclxuICAgICAgICAkc2NvcGUuZmV0Y2hlZCA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgJHNjb3BlLmZldGNoZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc1BsdWdpbi50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNNb2RlbC50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgX21vZHVsZS5mYWN0b3J5KCdTZXJ2aWNlUmVnaXN0cnknLCBbKCkgPT4ge1xyXG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlUmVnaXN0cnlTZXJ2aWNlKCk7XHJcbiAgfV0pO1xyXG5cclxuICAvKipcclxuICAgKiBSZXByZXNlbnRzIGEgc2ltcGxlIGludGVyZmFjZSB0byBzZXJ2aWNlIGRpc2NvdmVyeSB0aGF0IGNhbiBiZSB1c2VkIGVhcmx5IG9uIGluIHRoZSBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgYmVmb3JlIHRoZVxyXG4gICAqIHVuZGVybHlpbmcgbW9kZWwgaGFzIGJlZW4gY3JlYXRlZCB2aWEgZGVwZW5kZW5jeSBpbmplY3Rpb25cclxuICAgKi9cclxuICBleHBvcnQgY2xhc3MgU2VydmljZVJlZ2lzdHJ5U2VydmljZSB7XHJcbiAgICBwcml2YXRlIG1vZGVsOkt1YmVybmV0ZXNNb2RlbFNlcnZpY2UgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgc2VydmljZSBhdmFpbGFibGUgZm9yIHRoZSBnaXZlbiBJRCBvciBmYWxzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFzU2VydmljZShzZXJ2aWNlTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmZpbmRTZXJ2aWNlKHNlcnZpY2VOYW1lKSA/IHRydWUgOiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHNlcnZpY2UgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlIG5hbWUgKElEKSBvciBudWxsIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSB0byBsb29rIGZvclxyXG4gICAgICogQHJldHVybiB7bnVsbH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbmRTZXJ2aWNlKHNlcnZpY2VOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgdmFyIGFuc3dlciA9IG51bGw7XHJcbiAgICAgIGlmIChzZXJ2aWNlTmFtZSkge1xyXG4gICAgICAgIHZhciBtb2RlbCA9IHRoaXMuZ2V0TW9kZWwoKTtcclxuICAgICAgICBpZiAobW9kZWwpIHtcclxuICAgICAgICAgIHZhciBuYW1lc3BhY2UgPSBtb2RlbC5jdXJyZW50TmFtZXNwYWNlKCk7XHJcbiAgICAgICAgICByZXR1cm4gbW9kZWwuZ2V0U2VydmljZShuYW1lc3BhY2UgLHNlcnZpY2VOYW1lKTtcclxuLypcclxuICAgICAgICBUT0RPIGxldHMgb25seSBsb29rIGluIHRoZSBjdXJyZW50IG5hbWVzcGFjZVxyXG4gICAgICAgIGFuZ3VsYXIuZm9yRWFjaChtb2RlbC5zZXJ2aWNlcywgKHNlcnZpY2UpID0+IHtcclxuICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PT0gZ2V0TmFtZShzZXJ2aWNlKSkge1xyXG4gICAgICAgICAgICBhbnN3ZXIgPSBzZXJ2aWNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4qL1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYW5zd2VyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc2VydmljZSBsaW5rIGZvciB0aGUgZ2l2ZW4gc2VydmljZSBuYW1lXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlXHJcbiAgICAgKiBAcmV0dXJuIHtudWxsfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2VydmljZUxpbmsoc2VydmljZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgIHZhciBzZXJ2aWNlID0gdGhpcy5maW5kU2VydmljZShzZXJ2aWNlTmFtZSk7XHJcbiAgICAgIHJldHVybiBzZXJ2aWNlTGlua1VybChzZXJ2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHNlcnZpY2UgbGluayBmb3IgdGhlIGdpdmVuIHNlcnZpY2UgbmFtZSBpZiBpdHMgcmVhZHkgKGhhcyBhdCBsZWFzdCBvbmUgcmVhZHkgcG9kKVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZVxyXG4gICAgICogQHJldHVybiB7bnVsbH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNlcnZpY2VSZWFkeUxpbmsoc2VydmljZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgIHZhciBzZXJ2aWNlID0gdGhpcy5maW5kU2VydmljZShzZXJ2aWNlTmFtZSk7XHJcbiAgICAgIGlmIChyZWFkeVBvZENvdW50KHNlcnZpY2UpKSB7XHJcbiAgICAgICAgcmV0dXJuIHNlcnZpY2VMaW5rVXJsKHNlcnZpY2UpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRNb2RlbCgpOkt1YmVybmV0ZXNNb2RlbFNlcnZpY2Uge1xyXG4gICAgICB2YXIgYW5zd2VyID0gdGhpcy5tb2RlbDtcclxuICAgICAgLy8gbGV0cyBhbGxvdyBsYXp5IGxvYWQgc28gd2UgY2FuIGJlIGludm9rZWQgYmVmb3JlIHRoZSBpbmplY3RvciBoYXMgYmVlbiBjcmVhdGVkXHJcbiAgICAgIGlmICghYW5zd2VyKSB7XHJcbiAgICAgICAgdmFyIGluamVjdG9yID0gSGF3dGlvQ29yZS5pbmplY3RvcjtcclxuICAgICAgICBpZiAoaW5qZWN0b3IpIHtcclxuICAgICAgICAgIHRoaXMubW9kZWwgPSBpbmplY3Rvci5nZXQ8S3ViZXJuZXRlc01vZGVsU2VydmljZT4oJ0t1YmVybmV0ZXNNb2RlbCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBhbnN3ZXIgPSB0aGlzLm1vZGVsO1xyXG4gICAgICByZXR1cm4gYW5zd2VyO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzSGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNQbHVnaW4udHNcIi8+XHJcblxyXG5tb2R1bGUgS3ViZXJuZXRlcyB7XHJcblxyXG4gIGV4cG9ydCB2YXIgU2VydmljZUFwcHMgPSBfbW9kdWxlLmNvbnRyb2xsZXIoJ0t1YmVybmV0ZXMuU2VydmljZUFwcHMnLCAoJHNjb3BlLCBLdWJlcm5ldGVzTW9kZWwpID0+IHtcclxuICAgICRzY29wZS5tb2RlbCA9IEt1YmVybmV0ZXNNb2RlbDtcclxuICB9KTtcclxuXHJcbiAgZXhwb3J0IHZhciBTZXJ2aWNlcyA9IGNvbnRyb2xsZXIoXCJTZXJ2aWNlc1wiLFxyXG4gICAgW1wiJHNjb3BlXCIsIFwiS3ViZXJuZXRlc01vZGVsXCIsIFwiS3ViZXJuZXRlc1NlcnZpY2VzXCIsIFwiS3ViZXJuZXRlc1BvZHNcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCIkdGVtcGxhdGVDYWNoZVwiLCBcIiRsb2NhdGlvblwiLCBcIiRyb3V0ZVBhcmFtc1wiLCBcIiRodHRwXCIsIFwiJHRpbWVvdXRcIiwgXCJLdWJlcm5ldGVzQXBpVVJMXCIsXHJcbiAgICAgICgkc2NvcGUsIEt1YmVybmV0ZXNNb2RlbDogS3ViZXJuZXRlcy5LdWJlcm5ldGVzTW9kZWxTZXJ2aWNlLCBLdWJlcm5ldGVzU2VydmljZXM6bmcucmVzb3VyY2UuSVJlc291cmNlQ2xhc3M8YW55PiwgS3ViZXJuZXRlc1BvZHM6bmcucmVzb3VyY2UuSVJlc291cmNlQ2xhc3M8YW55PiwgS3ViZXJuZXRlc1N0YXRlLFxyXG4gICAgICAgJHRlbXBsYXRlQ2FjaGU6bmcuSVRlbXBsYXRlQ2FjaGVTZXJ2aWNlLCAkbG9jYXRpb246bmcuSUxvY2F0aW9uU2VydmljZSwgJHJvdXRlUGFyYW1zLCAkaHR0cCwgJHRpbWVvdXQsIEt1YmVybmV0ZXNBcGlVUkwpID0+IHtcclxuXHJcbiAgICAkc2NvcGUua3ViZXJuZXRlcyA9IEt1YmVybmV0ZXNTdGF0ZTtcclxuICAgICRzY29wZS5tb2RlbCA9IEt1YmVybmV0ZXNNb2RlbDtcclxuXHJcbiAgICBDb250cm9sbGVySGVscGVycy5iaW5kTW9kZWxUb1NlYXJjaFBhcmFtKCRzY29wZSwgJGxvY2F0aW9uLCAnbW9kZScsICdtb2RlJywgJ2xpc3QnKTtcclxuXHJcbiAgICAkc2NvcGUudGFibGVDb25maWcgPSB7XHJcbiAgICAgIGRhdGE6ICdtb2RlbC5zZXJ2aWNlcycsXHJcbiAgICAgIHNob3dTZWxlY3Rpb25DaGVja2JveDogdHJ1ZSxcclxuICAgICAgZW5hYmxlUm93Q2xpY2tTZWxlY3Rpb246IGZhbHNlLFxyXG4gICAgICBtdWx0aVNlbGVjdDogdHJ1ZSxcclxuICAgICAgc2VsZWN0ZWRJdGVtczogW10sXHJcbiAgICAgIGZpbHRlck9wdGlvbnM6IHtcclxuICAgICAgICBmaWx0ZXJUZXh0OiAkbG9jYXRpb24uc2VhcmNoKClbXCJxXCJdIHx8ICcnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbHVtbkRlZnM6IFtcclxuICAgICAgICB7IGZpZWxkOiAnX2tleScsXHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogJ05hbWUnLFxyXG4gICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJpZFRlbXBsYXRlLmh0bWxcIilcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgZmllbGQ6ICckc2VydmljZVVybCcsXHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogJ0FkZHJlc3MnLFxyXG4gICAgICAgICAgY2VsbFRlbXBsYXRlOiAkdGVtcGxhdGVDYWNoZS5nZXQoXCJwb3J0YWxBZGRyZXNzLmh0bWxcIilcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgZmllbGQ6ICckcG9kQ291bnQnLFxyXG4gICAgICAgICAgZGlzcGxheU5hbWU6ICdQb2RzJyxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwicG9kQ291bnRzQW5kTGlua1RlbXBsYXRlLmh0bWxcIiksXHJcbiAgICAgICAgICBjdXN0b21Tb3J0RmllbGQ6IChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBuZWVkIHRvIGNvbmNhdCBhbGwgdGhlIHBvZCBjb3VudGVyc1xyXG4gICAgICAgICAgICB2YXIgcmVhZHkgPSBmaWVsZC4kcG9kQ291bnRlcnMucmVhZHkgfHwgMDtcclxuICAgICAgICAgICAgdmFyIHZhbGlkID0gZmllbGQuJHBvZENvdW50ZXJzLnZhbGlkIHx8IDA7XHJcbiAgICAgICAgICAgIHZhciB3YWl0aW5nID0gZmllbGQuJHBvZENvdW50ZXJzLndhaXRpbmcgfHwgMDtcclxuICAgICAgICAgICAgdmFyIGVycm9yID0gZmllbGQuJHBvZENvdW50ZXJzLmVycm9yIHx8IDA7XHJcbiAgICAgICAgICAgIHJldHVybiByZWFkeSArIHZhbGlkICsgd2FpdGluZyArIGVycm9yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeyBmaWVsZDogJyRzZWxlY3RvclRleHQnLFxyXG4gICAgICAgICAgZGlzcGxheU5hbWU6ICdTZWxlY3RvcicsXHJcbiAgICAgICAgICBjZWxsVGVtcGxhdGU6ICR0ZW1wbGF0ZUNhY2hlLmdldChcInNlbGVjdG9yVGVtcGxhdGUuaHRtbFwiKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeyBmaWVsZDogJyRsYWJlbHNUZXh0JyxcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTGFiZWxzJyxcclxuICAgICAgICAgIGNlbGxUZW1wbGF0ZTogJHRlbXBsYXRlQ2FjaGUuZ2V0KFwibGFiZWxUZW1wbGF0ZS5odG1sXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG5cclxuICAgIEt1YmVybmV0ZXMuaW5pdFNoYXJlZCgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0aW1lb3V0LCAkcm91dGVQYXJhbXMsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKTtcclxuXHJcbiAgICAkc2NvcGUuZGVsZXRlUHJvbXB0ID0gKHNlbGVjdGVkKSA9PiB7XHJcbiAgICAgIGlmIChhbmd1bGFyLmlzU3RyaW5nKHNlbGVjdGVkKSkge1xyXG4gICAgICAgIHNlbGVjdGVkID0gW3tcclxuICAgICAgICAgIGlkOiBzZWxlY3RlZFxyXG4gICAgICAgIH1dO1xyXG4gICAgICB9XHJcbiAgICAgIFVJLm11bHRpSXRlbUNvbmZpcm1BY3Rpb25EaWFsb2coPFVJLk11bHRpSXRlbUNvbmZpcm1BY3Rpb25PcHRpb25zPntcclxuICAgICAgICBjb2xsZWN0aW9uOiBzZWxlY3RlZCxcclxuICAgICAgICBpbmRleDogJ21ldGFkYXRhLm5hbWUnLFxyXG4gICAgICAgIG9uQ2xvc2U6IChyZXN1bHQ6Ym9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICBmdW5jdGlvbiBkZWxldGVTZWxlY3RlZChzZWxlY3RlZDpBcnJheTxLdWJlUG9kPiwgbmV4dDpLdWJlUG9kKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5leHQpIHtcclxuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhcImRlbGV0aW5nOiBcIiwgZ2V0TmFtZShuZXh0KSk7XHJcbiAgICAgICAgICAgICAgICBLdWJlcm5ldGVzU2VydmljZXMuZGVsZXRlKHtcclxuICAgICAgICAgICAgICAgICAgaWQ6IGdldE5hbWUobmV4dClcclxuICAgICAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBsb2cuZGVidWcoXCJkZWxldGVkOiBcIiwgZ2V0TmFtZShuZXh0KSk7XHJcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZVNlbGVjdGVkKHNlbGVjdGVkLCBzZWxlY3RlZC5zaGlmdCgpKTtcclxuICAgICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBsb2cuZGVidWcoXCJFcnJvciBkZWxldGluZzogXCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgZGVsZXRlU2VsZWN0ZWQoc2VsZWN0ZWQsIHNlbGVjdGVkLnNoaWZ0KCkpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlbGV0ZVNlbGVjdGVkKHNlbGVjdGVkLCBzZWxlY3RlZC5zaGlmdCgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHRpdGxlOiAnRGVsZXRlIHNlcnZpY2VzPycsXHJcbiAgICAgICAgYWN0aW9uOiAnVGhlIGZvbGxvd2luZyBzZXJ2aWNlcyB3aWxsIGJlIGRlbGV0ZWQ6JyxcclxuICAgICAgICBva1RleHQ6ICdEZWxldGUnLFxyXG4gICAgICAgIG9rQ2xhc3M6ICdidG4tZGFuZ2VyJyxcclxuICAgICAgICBjdXN0b206IFwiVGhpcyBvcGVyYXRpb24gaXMgcGVybWFuZW50IG9uY2UgY29tcGxldGVkIVwiLFxyXG4gICAgICAgIGN1c3RvbUNsYXNzOiBcImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIlxyXG4gICAgICB9KS5vcGVuKCk7XHJcbiAgICB9O1xyXG5cclxuICB9XSk7XHJcbn1cclxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJrdWJlcm5ldGVzUGx1Z2luLnRzXCIvPlxyXG5cclxubW9kdWxlIEt1YmVybmV0ZXMge1xyXG5cclxuICAvLyBjb250cm9sbGVyIGZvciB0aGUgc3RhdHVzIGljb24gY2VsbFxyXG4gIGV4cG9ydCB2YXIgUG9kU3RhdHVzID0gY29udHJvbGxlcihcIlBvZFN0YXR1c1wiLCBbXCIkc2NvcGVcIiwgKCRzY29wZSkgPT4ge1xyXG4gICAgJHNjb3BlLnN0YXR1c01hcHBpbmcgPSAodGV4dCkgPT4ge1xyXG4gICAgICByZXR1cm4gc3RhdHVzVGV4dFRvQ3NzQ2xhc3ModGV4dCk7XHJcbiAgICB9XHJcbiAgfV0pO1xyXG5cclxuICBfbW9kdWxlLmNvbnRyb2xsZXIoXCJLdWJlcm5ldGVzLlRlcm1Db250cm9sbGVyXCIsICgkc2NvcGUsIFRlcm1pbmFsU2VydmljZSkgPT4ge1xyXG4gICAgJHNjb3BlLmNhbkNvbm5lY3RUbyA9IChjb250YWluZXIpID0+IHtcclxuICAgICAgaWYgKGNvbnRhaW5lci5zZWN1cml0eUNvbnRleHQgJiYgY29udGFpbmVyLnNlY3VyaXR5Q29udGV4dC5wcml2aWxlZ2VkKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgJHNjb3BlLm9wZW5UZXJtaW5hbCA9IChzZWxmTGluaywgY29udGFpbmVyTmFtZSkgPT4ge1xyXG4gICAgICB2YXIgaWQgPSBUZXJtaW5hbFNlcnZpY2UubmV3VGVybWluYWwoc2VsZkxpbmssIGNvbnRhaW5lck5hbWUpO1xyXG4gICAgICBsb2cuZGVidWcoXCJDcmVhdGVkIHRlcm1pbmFsLCBpZDogXCIsIGlkKTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgZXhwb3J0IHZhciBEYXRhTGFiZWxzID0gY29udHJvbGxlcihcIkRhdGFMYWJlbHNcIixbJyRzY29wZScsJyRsb2NhdGlvbicsICgkc2NvcGUsICRsb2NhdGlvbikgPT57XHJcbiAgICBcclxuICAgICAgJHNjb3BlLmxhYmVsQ2xpY2sgPSAoZW50aXR5LCBrZXk6c3RyaW5nLCB2YWx1ZTpzdHJpbmcpID0+IHsgICAgICAgICAgICAgIFxyXG4gICAgICAgICRzY29wZS4kZW1pdCgnZGF0YUxhYmVsRmlsdGVyVXBkYXRlJywgdmFsdWUsIGtleSlcclxuICAgIH1cclxuICAgICRzY29wZS5sYWJlbENsYXNzID0gY29udGFpbmVyTGFiZWxDbGFzcztcclxuICB9XSk7XHJcblxyXG4gIC8vIGNvbnRyb2xsZXIgdGhhdCBkZWFscyB3aXRoIHRoZSBsYWJlbHMgcGVyIHBvZFxyXG4gIGV4cG9ydCB2YXIgTGFiZWxzID0gY29udHJvbGxlcihcIkxhYmVsc1wiLCBbXCIkc2NvcGVcIiwgXCIkbG9jYXRpb25cIiwgKCRzY29wZSwgJGxvY2F0aW9uKSA9PiB7ICAgXHJcbiAgICAkc2NvcGUubGFiZWxzID0gW107XHJcbiAgICB2YXIgbGFiZWxLZXlXZWlnaHRzID0ge1xyXG4gICAgICBcImNpdHlOYW1lXCI6IDEsXHJcbiAgICAgIFwiZGlzdHJpY3ROYW1lXCI6IDIsXHJcbiAgICAgIFwic3lzdGVtTmFtZVwiOiAzLFxyXG4gICAgICBcInllYXJcIjogNCxcclxuICAgICAgXCJ2ZXJzaW9uXCI6IDVcclxuICAgIH07XHJcbiAgICAkc2NvcGUuJHdhdGNoKCdlbnRpdHknLCAobmV3VmFsdWUsIG9sZFZhbHVlKSA9PiB7XHJcbiAgICAgIGlmIChuZXdWYWx1ZSkge1xyXG4gICAgICAgIC8vIGxvZy5kZWJ1ZyhcImxhYmVsczogXCIsIG5ld1ZhbHVlKTtcclxuICAgICAgICAvLyBtYXNzYWdlIHRoZSBsYWJlbHMgYSBiaXRcclxuICAgICAgICAkc2NvcGUubGFiZWxzID0gW107XHJcbiAgICAgICAgYW5ndWxhci5mb3JFYWNoKENvcmUucGF0aEdldCgkc2NvcGUuZW50aXR5LCBbXCJtZXRhZGF0YVwiLCBcImxhYmVsc1wiXSksICh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgICAgICBpZiAoa2V5ID09PSAnZmFicmljOCcgfHwga2V5ID09PSAnc3R5bGUnIHx8IGtleSA9PT0gJ3N0YXR1cycgfHwgKGtleSA9PT0gJ2lzVGFyZ2V0JyAmJiB2YWx1ZSA9PT0gJ2ZhbHNlJykgfHwga2V5ID09PSAnaXNFeHRyYWN0JyB8fCBrZXkgPT09ICduYW1lJykge1xyXG4gICAgICAgICAgICAvLyBUT0RPIG5vdCBzdXJlIHdoYXQgdGhpcyBpcyBmb3IsIHRoZSBjb250YWluZXIgdHlwZT9cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICRzY29wZS5sYWJlbHMucHVzaCh7XHJcbiAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICB0aXRsZTogdmFsdWVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyAgbGV0cyBzb3J0IGJ5IGtleSBidXQgbGV0cyBtYWtlIHN1cmUgdGhhdCB3ZSB3ZWlnaHQgY2VydGFpbiBsYWJlbHMgc28gdGhleSBhcmUgZmlyc3RcclxuICAgICAgICAkc2NvcGUubGFiZWxzID0gJHNjb3BlLmxhYmVscy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICBmdW5jdGlvbiBnZXRXZWlnaHQoa2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsYWJlbEtleVdlaWdodHNba2V5XSB8fCAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdmFyIG4xID0gYVtcImtleVwiXTtcclxuICAgICAgICAgIHZhciBuMiA9IGJbXCJrZXlcIl07XHJcbiAgICAgICAgICB2YXIgdzEgPSBnZXRXZWlnaHQobjEpO1xyXG4gICAgICAgICAgdmFyIHcyID0gZ2V0V2VpZ2h0KG4yKTtcclxuICAgICAgICAgIHZhciBkaWZmID0gdzEgLSB3MjtcclxuICAgICAgICAgIGlmIChkaWZmIDwgMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKG4xICYmIG4yKSB7XHJcbiAgICAgICAgICAgIGlmIChuMSA+IG4yKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobjEgPCBuMikge1xyXG4gICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG4xID09PSBuMikge1xyXG4gICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG4xKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgICRzY29wZS5oYW5kbGVDbGljayA9IChlbnRpdHksIGxhYmVsVHlwZTpzdHJpbmcsIHZhbHVlKSA9PiB7XHJcbiAgICAgIC8vIGxvZy5kZWJ1ZyhcImhhbmRsZUNsaWNrLCBlbnRpdHk6IFwiLCBlbnRpdHksIFwiIGtleTogXCIsIGxhYmVsVHlwZSwgXCIgdmFsdWU6IFwiLCB2YWx1ZSk7XHJcbiAgICAgICRzY29wZS4kZW1pdCgnbGFiZWxGaWx0ZXJVcGRhdGUnLCB2YWx1ZS50aXRsZSlcclxuICAgIH1cclxuXHJcbiAgICAkc2NvcGUubGFiZWxDbGFzcyA9IGNvbnRhaW5lckxhYmVsQ2xhc3M7XHJcbiAgfV0pO1xyXG5cclxuICAvL+acjeWKoeeKtuaAgei/h+a7pFxyXG4gIGV4cG9ydCB2YXIgU3RhdHVzID0gY29udHJvbGxlcignU3RhdHVzJywgW1wiJHNjb3BlXCIsIFwiJGh0dHBcIiwgXCIkaW50ZXJ2YWxcIiwgXCIkbG9jYXRpb25cIiwgXCJLdWJlcm5ldGVzQXBpVVJMXCIsICgkc2NvcGUsICRodHRwLCAkaW50ZXJ2YWwsICRsb2NhdGlvbiwgS3ViZXJuZXRlc0FwaVVSTCkgPT4ge1xyXG4gICAgICAvKiRzY29wZS4kd2F0Y2goJ2VudGl0eScsIChuZXdWYWx1ZSwgb2xkVmFsdWUpID0+IHtcclxuICAgICAgICAgIGlmKG5ld1ZhbHVlKVxyXG4gICAgICAgICAgICAgY29uc29sZS5sb2cobmV3VmFsdWUpO1xyXG4gICAgICB9LHRydWUpOyovXHJcbiAgfV0pO1xyXG5cclxuICBleHBvcnQgdmFyIFRhc2tFZGl0ID0gY29udHJvbGxlcignVGFza0VkaXQnLCBbJyRzY29wZScsICgkc2NvcGUpID0+IHtcclxuXHJcbiAgICAkc2NvcGUuc2hvd0RlbGV0ZU9uZSA9IHtcclxuICAgICAgIHNob3c6IGZhbHNlLFxyXG4gICAgICAgaXRlbTogbnVsbCxcclxuICAgICAgIG9wZW46IChlbnRpdHkpID0+IHtcclxuICAgICAgICAgaWYoZW50aXR5LnN0YXR1cyA9PSAxKVxyXG4gICAgICAgICAgQ29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuaTjeS9nOWksei0pTog5q2j5Zyo6L+B56e755qE5Lu75YqhLOS4jeiDveWIoOmZpO+8gVwiLCAnJyxudWxsLCAwLCBcImVycm9yXCIpO1xyXG4gICAgICAgICBlbHNle1xyXG4gICAgICAgICAgIHZhciBzaG93RGVsZXRlT25lID0gJHNjb3BlLnNob3dEZWxldGVPbmU7XHJcbiAgICAgICAgICAgc2hvd0RlbGV0ZU9uZS5zaG93ID0gdHJ1ZTtcclxuICAgICAgICAgICBzaG93RGVsZXRlT25lLml0ZW0gPSBlbnRpdHk7XHJcbiAgICAgICAgIH1cclxuICAgICAgIH0sXHJcbiAgICAgICBvbk9rOiAoKSA9PiB7XHJcbiAgICAgICAgIHZhciBzaG93RGVsZXRlT25lID0gJHNjb3BlLnNob3dEZWxldGVPbmU7ICAgICAgICBcclxuICAgICAgICAgJHNjb3BlLiRlbWl0KCdkZWxldGVSb3cnLCBzaG93RGVsZXRlT25lLml0ZW0pO1xyXG4gICAgICAgfSxcclxuICAgICAgIG9uQ2FuY2VsOiAoKT0+e1xyXG4gICAgICAgICB2YXIgc2hvd0RlbGV0ZU9uZSA9ICRzY29wZS5zaG93RGVsZXRlT25lO1xyXG4gICAgICAgICBzaG93RGVsZXRlT25lLnNob3cgPSBmYWxzZTtcclxuICAgICAgICAgc2hvd0RlbGV0ZU9uZS5pdGVtID0gbnVsbDtcclxuICAgICAgIH1cclxuICAgIH07XHJcbiAgICAvKiRzY29wZS5kZWxldGVSb3cgPSAoZW50aXR5KSA9PntcclxuICAgICAgJHNjb3BlLiRlbWl0KCdkZWxldGVSb3cnLCBlbnRpdHkpO1xyXG4gICAgfSovXHJcbiAgfV0pO1xyXG5cclxuICBleHBvcnQgdmFyIExvYWRNYXNrID0gY29udHJvbGxlcignTG9hZE1hc2snLCBbJyRzY29wZScsICgkc2NvcGUpID0+IHsgICAgXHJcbiAgfV0pO1xyXG59XHJcbiIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImt1YmVybmV0ZXNIZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc1BsdWdpbi50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuXHJcbiAgX21vZHVsZS5kaXJlY3RpdmUoXCJoYXd0aW9UYWJzXCIsIFsnSGF3dGlvU3ViVGFicycsIChIYXd0aW9TdWJUYWJzKSA9PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsaW5rOiAoc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSA9PiB7XHJcbiAgICAgICAgSGF3dGlvU3ViVGFicy5hcHBseShzY29wZS4kZXZhbCgnc3ViVGFiQ29uZmlnJykpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1dKTtcclxufVxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwia3ViZXJuZXRlc1BsdWdpbi50c1wiLz5cclxuXHJcbm1vZHVsZSBLdWJlcm5ldGVzIHtcclxuICBleHBvcnQgdmFyIFRlbXBsYXRlQ29udHJvbGxlciA9IGNvbnRyb2xsZXIoXCJUZW1wbGF0ZUNvbnRyb2xsZXJcIiwgW1xyXG4gICAgXCIkc2NvcGVcIiwgXCIkbG9jYXRpb25cIiwgXCIkaHR0cFwiLCBcIiR0aW1lb3V0XCIsIFwiJHJvdXRlUGFyYW1zXCIsIFwibWFya2VkXCIsIFwiJHRlbXBsYXRlQ2FjaGVcIiwgXCIkbW9kYWxcIiwgXCJLdWJlcm5ldGVzTW9kZWxcIiwgXCJLdWJlcm5ldGVzU3RhdGVcIiwgXCJLdWJlcm5ldGVzQXBpVVJMXCIsXHJcbiAgICAoJHNjb3BlLCAkbG9jYXRpb24sICRodHRwLCAkdGltZW91dCwgJHJvdXRlUGFyYW1zLCBtYXJrZWQsICR0ZW1wbGF0ZUNhY2hlLCAkbW9kYWwsIEt1YmVybmV0ZXNNb2RlbCwgS3ViZXJuZXRlc1N0YXRlLCBLdWJlcm5ldGVzQXBpVVJMKSA9PiB7XHJcbiAgICB2YXIgbW9kZWwgPSAkc2NvcGUubW9kZWwgPSBLdWJlcm5ldGVzTW9kZWw7XHJcbiAgICAkc2NvcGUuZmlsdGVyVGV4dCA9ICRsb2NhdGlvbi5zZWFyY2goKVtcInFcIl07XHJcblxyXG4gICAgJHNjb3BlLnRhcmdldE5hbWVzcGFjZSA9ICRyb3V0ZVBhcmFtcy50YXJnZXROYW1lc3BhY2U7XHJcbiAgICBpbml0U2hhcmVkKCRzY29wZSwgJGxvY2F0aW9uLCAkaHR0cCwgJHRpbWVvdXQsICRyb3V0ZVBhcmFtcywgS3ViZXJuZXRlc01vZGVsLCBLdWJlcm5ldGVzU3RhdGUsIEt1YmVybmV0ZXNBcGlVUkwpO1xyXG5cclxuICAgICRzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdtb2RlbC5uYW1lc3BhY2VzJywgKCkgPT4ge1xyXG4gICAgICBpZiAoISRzY29wZS50YXJnZXROYW1lc3BhY2UpIHtcclxuICAgICAgICAkc2NvcGUudGFyZ2V0TmFtZXNwYWNlID0gbW9kZWwuY3VycmVudE5hbWVzcGFjZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB2YXIgcmV0dXJuVG8gPSBuZXcgVVJJKCRsb2NhdGlvbi5zZWFyY2goKVsncmV0dXJuVG8nXSB8fCAnL2t1YmVybmV0ZXMvYXBwcycpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGdvQmFjaygpIHtcclxuICAgICAgJGxvY2F0aW9uLnBhdGgocmV0dXJuVG8ucGF0aCgpKS5zZWFyY2gocmV0dXJuVG8ucXVlcnkodHJ1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldEFubm90YXRpb25zKG9iaikge1xyXG4gICAgICByZXR1cm4gQ29yZS5wYXRoR2V0KG9iaiwgWydtZXRhZGF0YScsICdhbm5vdGF0aW9ucyddKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRWYWx1ZUZvcihvYmosIGtleSkge1xyXG4gICAgICB2YXIgYW5ub3RhdGlvbnMgPSBnZXRBbm5vdGF0aW9ucyhvYmopO1xyXG4gICAgICBpZiAoIWFubm90YXRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgIH1cclxuICAgICAgdmFyIG5hbWUgPSBnZXROYW1lKG9iaik7XHJcbiAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgdmFyIGZ1bGxLZXkgPSBcImZhYnJpYzguXCIgKyBuYW1lICsgXCIvXCIgKyBrZXk7XHJcbiAgICAgICAgdmFyIGFuc3dlciA9IGFubm90YXRpb25zW2Z1bGxLZXldO1xyXG4gICAgICAgIGlmIChhbnN3ZXIpIHtcclxuICAgICAgICAgIHJldHVybiBhbnN3ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHZhciBrZXk6IGFueSA9IF8uZmluZChfLmtleXMoYW5ub3RhdGlvbnMpLCAoazogc3RyaW5nKSA9PiBfLmVuZHNXaXRoKGssIGtleSkpO1xyXG4gICAgICBpZiAoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIGFubm90YXRpb25zW2tleV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAkc2NvcGUuY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICBpZiAoJHNjb3BlLmZvcm1Db25maWcpIHtcclxuICAgICAgICBkZWxldGUgJHNjb3BlLmZvcm1Db25maWc7XHJcbiAgICAgICAgZGVsZXRlICRzY29wZS5lbnRpdHk7XHJcbiAgICAgICAgJHNjb3BlLm9iamVjdHMgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGdvQmFjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAkc2NvcGUuJHdhdGNoKCdtb2RlbC50ZW1wbGF0ZXMubGVuZ3RoJywgKG5ld1ZhbHVlKSA9PiB7XHJcbiAgICAgIGlmIChuZXdWYWx1ZSA9PT0gMCkge1xyXG4gICAgICAgIGdvQmFjaygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgICovXHJcblxyXG4gICAgJHNjb3BlLmZpbHRlclRlbXBsYXRlcyA9ICh0ZW1wbGF0ZSkgPT4ge1xyXG4gICAgICBpZiAoQ29yZS5pc0JsYW5rKCRzY29wZS5maWx0ZXJUZXh0KSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBfLmNvbnRhaW5zKGFuZ3VsYXIudG9Kc29uKHRlbXBsYXRlKSwgJHNjb3BlLmZpbHRlclRleHQudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9O1xyXG5cclxuICAgICRzY29wZS5vcGVuRnVsbERlc2NyaXB0aW9uID0gKHRlbXBsYXRlKSA9PiB7XHJcbiAgICAgIHZhciB0ZXh0ID0gbWFya2VkKGdldFZhbHVlRm9yKHRlbXBsYXRlLCAnZGVzY3JpcHRpb24nKSB8fCAnTm8gZGVzY3JpcHRpb24nKTtcclxuICAgICAgdmFyIG1vZGFsID0gJG1vZGFsLm9wZW4oe1xyXG4gICAgICAgIHRlbXBsYXRlVXJsOiBVcmxIZWxwZXJzLmpvaW4odGVtcGxhdGVQYXRoLCAndGVtcGxhdGVEZXNjcmlwdGlvbi5odG1sJyksXHJcbiAgICAgICAgY29udHJvbGxlcjogWyckc2NvcGUnLCAnJG1vZGFsSW5zdGFuY2UnLCAoJHNjb3BlLCAkbW9kYWxJbnN0YW5jZSkgPT4ge1xyXG4gICAgICAgICAgJHNjb3BlLnRleHQgPSB0ZXh0LFxyXG4gICAgICAgICAgJHNjb3BlLm9rID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBtb2RhbC5jbG9zZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1dXHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICAkc2NvcGUuZ2V0RGVzY3JpcHRpb24gPSAodGVtcGxhdGUpID0+IHtcclxuICAgICAgdmFyIGFuc3dlcjphbnkgPSAkKG1hcmtlZChnZXRWYWx1ZUZvcih0ZW1wbGF0ZSwgJ2Rlc2NyaXB0aW9uJykgfHwgJ05vIGRlc2NyaXB0aW9uJykpO1xyXG4gICAgICB2YXIgdGV4dERlZmF1bHQgPSBhbnN3ZXIuaHRtbCgpO1xyXG4gICAgICB2YXIgbWF4TGVuZ3RoID0gMjAwO1xyXG4gICAgICBpZiAodGV4dERlZmF1bHQubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XHJcbiAgICAgICAgdmFyIHRydW5jYXRlZCA9ICQudHJpbSh0ZXh0RGVmYXVsdCkuc3Vic3RyaW5nKDAsIG1heExlbmd0aCkuc3BsaXQoJyAnKS5zbGljZSgwLCAtMSkuam9pbignICcpO1xyXG4gICAgICAgIGFuc3dlci5odG1sKHRydW5jYXRlZCArICcuLi4nKTtcclxuICAgICAgICBhbnN3ZXIuYXBwZW5kKCR0ZW1wbGF0ZUNhY2hlLmdldCgndHJ1bmNhdGVkRGVzY3JpcHRpb25UYWcuaHRtbCcpKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYW5zd2VyLmh0bWwoKTtcclxuICAgIH07XHJcblxyXG4gICAgJHNjb3BlLmdldEljb25VcmwgPSAodGVtcGxhdGUpID0+IHtcclxuICAgICAgcmV0dXJuIGdldFZhbHVlRm9yKHRlbXBsYXRlLCAnaWNvblVybCcpIHx8IGRlZmF1bHRJY29uVXJsO1xyXG4gICAgfTtcclxuXHJcbiAgICAkc2NvcGUuZGVwbG95VGVtcGxhdGUgPSAodGVtcGxhdGUpID0+IHtcclxuICAgICAgbG9nLmRlYnVnKFwiVGVtcGxhdGUgcGFyYW1ldGVyczogXCIsIHRlbXBsYXRlLnBhcmFtZXRlcnMpO1xyXG4gICAgICBsb2cuZGVidWcoXCJUZW1wbGF0ZSBvYmplY3RzOiBcIiwgdGVtcGxhdGUub2JqZWN0cyk7XHJcbiAgICAgIGxvZy5kZWJ1ZyhcIlRlbXBsYXRlIGFubm90YXRpb25zOiBcIiwgdGVtcGxhdGUubWV0YWRhdGEuYW5ub3RhdGlvbnMpO1xyXG4gICAgICB2YXIgdGVtcGxhdGVBbm5vdGF0aW9ucyA9IHRlbXBsYXRlLm1ldGFkYXRhLmFubm90YXRpb25zO1xyXG4gICAgICBpZiAodGVtcGxhdGVBbm5vdGF0aW9ucykge1xyXG4gICAgICAgIF8uZm9yRWFjaCh0ZW1wbGF0ZS5vYmplY3RzLCAob2JqZWN0OmFueSkgPT4ge1xyXG4gICAgICAgICAgdmFyIGFubm90YXRpb25zID0gb2JqZWN0Lm1ldGFkYXRhLmFubm90YXRpb25zIHx8IHt9O1xyXG4gICAgICAgICAgdmFyIG5hbWUgPSBnZXROYW1lKG9iamVjdCk7XHJcbiAgICAgICAgICB2YXIgbWF0Y2hlcyA9IF8uZmlsdGVyKF8ua2V5cyh0ZW1wbGF0ZUFubm90YXRpb25zKSwgKGtleSkgPT4ga2V5Lm1hdGNoKCcuJyArIG5hbWUgKyAnLycpKTtcclxuICAgICAgICAgIG1hdGNoZXMuZm9yRWFjaCgobWF0Y2gpID0+IHtcclxuICAgICAgICAgICAgaWYgKCEobWF0Y2ggaW4gYW5ub3RhdGlvbnMpKSB7XHJcbiAgICAgICAgICAgICAgYW5ub3RhdGlvbnNbbWF0Y2hdID0gdGVtcGxhdGVBbm5vdGF0aW9uc1ttYXRjaF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgb2JqZWN0Lm1ldGFkYXRhLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgdmFyIHJvdXRlU2VydmljZU5hbWUgPSA8c3RyaW5nPiB1bmRlZmluZWQ7XHJcbiAgICAgIHZhciBzZXJ2aWNlID0gXy5maW5kKHRlbXBsYXRlLm9iamVjdHMsIChvYmopID0+IHtcclxuICAgICAgICBpZiAoZ2V0S2luZChvYmopID09PSBcIlNlcnZpY2VcIikge1xyXG4gICAgICAgICAgdmFyIHBvcnRzID0gZ2V0UG9ydHMob2JqKTtcclxuICAgICAgICAgIGlmIChwb3J0cyAmJiBwb3J0cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoc2VydmljZSkge1xyXG4gICAgICAgIHJvdXRlU2VydmljZU5hbWUgPSBnZXROYW1lKHNlcnZpY2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGxvZy5kZWJ1ZyhcIlNlcnZpY2U6IFwiLCBzZXJ2aWNlKTtcclxuICAgICAgaWYgKCghcm91dGVTZXJ2aWNlTmFtZSB8fCAhaXNPcGVuU2hpZnQpICYmICghdGVtcGxhdGUucGFyYW1ldGVycyB8fCB0ZW1wbGF0ZS5wYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkpIHtcclxuICAgICAgICBsb2cuZGVidWcoXCJObyBwYXJhbWV0ZXJzIHJlcXVpcmVkLCBkZXBsb3lpbmcgb2JqZWN0c1wiKTtcclxuICAgICAgICBhcHBseU9iamVjdHModGVtcGxhdGUub2JqZWN0cyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciBmb3JtQ29uZmlnID0ge1xyXG4gICAgICAgIHN0eWxlOiBIYXd0aW9Gb3Jtcy5Gb3JtU3R5bGUuU1RBTkRBUkQsXHJcbiAgICAgICAgaGlkZUxlZ2VuZDogdHJ1ZSxcclxuICAgICAgICBwcm9wZXJ0aWVzOiA8YW55PiB7fVxyXG4gICAgICB9O1xyXG4gICAgICB2YXIgcGFyYW1zID0gdGVtcGxhdGUucGFyYW1ldGVycztcclxuICAgICAgXy5mb3JFYWNoKHBhcmFtcywgKHBhcmFtOmFueSkgPT4ge1xyXG4gICAgICAgIHZhciBwcm9wZXJ0eSA9IDxhbnk+IHt9O1xyXG4gICAgICAgIHByb3BlcnR5LmxhYmVsID0gXy5zdGFydENhc2UocGFyYW0ubmFtZSk7XHJcbiAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gPSBwYXJhbS5kZXNjcmlwdGlvbjtcclxuICAgICAgICBwcm9wZXJ0eS5kZWZhdWx0ID0gcGFyYW0udmFsdWU7XHJcbiAgICAgICAgLy8gVE9ETywgZG8gcGFyYW1ldGVycyBzdXBwb3J0IHR5cGVzP1xyXG4gICAgICAgIHByb3BlcnR5LnR5cGUgPSAnc3RyaW5nJztcclxuICAgICAgICBmb3JtQ29uZmlnLnByb3BlcnRpZXNbcGFyYW0ubmFtZV0gPSBwcm9wZXJ0eTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChyb3V0ZVNlcnZpY2VOYW1lICYmIGlzT3BlblNoaWZ0KSB7XHJcbiAgICAgICAgZm9ybUNvbmZpZy5wcm9wZXJ0aWVzLmNyZWF0ZVJvdXRlID0ge1xyXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxyXG4gICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcclxuICAgICAgICAgIGxhYmVsOiBcIkNyZWF0ZSBSb3V0ZVwiXHJcbiAgICAgICAgfTtcclxuLypcclxuICAgICAgICBmb3JtQ29uZmlnLnByb3BlcnRpZXMucm91dGVOYW1lID0ge1xyXG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXHJcbiAgICAgICAgICBsYWJlbDogJ1JvdXRlIE5hbWUnLFxyXG4gICAgICAgICAgZGVmYXVsdDogcm91dGVTZXJ2aWNlTmFtZSxcclxuICAgICAgICAgICdjb250cm9sLWdyb3VwLWF0dHJpYnV0ZXMnOiB7XHJcbiAgICAgICAgICAgICduZy1zaG93JzogJ2VudGl0eS5jcmVhdGVSb3V0ZSdcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4qL1xyXG4gICAgICAgIGZvcm1Db25maWcucHJvcGVydGllcy5yb3V0ZVNlcnZpY2VOYW1lID0ge1xyXG4gICAgICAgICAgdHlwZTogJ2hpZGRlbicsXHJcbiAgICAgICAgICBkZWZhdWx0OiByb3V0ZVNlcnZpY2VOYW1lXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgbmFtZXNwYWNlID0gY3VycmVudEt1YmVybmV0ZXNOYW1lc3BhY2UoKTtcclxuICAgICAgICAvLyBUT0RPIHN0b3JlIHRoaXMgaW4gbG9jYWxTdG9yYWdlIVxyXG4gICAgICAgIHZhciBkb21haW4gPSBcInZhZ3JhbnQuZjhcIjtcclxuICAgICAgICB2YXIgZGVmYXVsdFJvdXRlSG9zdFN1ZmZpeCA9ICcuJyArIChuYW1lc3BhY2UgPT09IFwiZGVmYXVsdFwiID8gXCJcIiA6IG5hbWVzcGFjZSArIFwiLlwiKSArIGRvbWFpbjtcclxuICAgICAgICBmb3JtQ29uZmlnLnByb3BlcnRpZXMucm91dGVIb3N0bmFtZSA9IHtcclxuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxyXG4gICAgICAgICAgZGVmYXVsdDogZGVmYXVsdFJvdXRlSG9zdFN1ZmZpeCxcclxuICAgICAgICAgIGxhYmVsOiBcIlJvdXRlIGhvc3QgbmFtZSBzdWZmaXhcIixcclxuICAgICAgICAgICdjb250cm9sLWdyb3VwLWF0dHJpYnV0ZXMnOiB7XHJcbiAgICAgICAgICAgICduZy1zaG93JzogJ2VudGl0eS5jcmVhdGVSb3V0ZSdcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgICRzY29wZS5lbnRpdHkgPSA8YW55PiB7fTtcclxuICAgICAgJHNjb3BlLmZvcm1Db25maWcgPSBmb3JtQ29uZmlnO1xyXG4gICAgICAkc2NvcGUub2JqZWN0cyA9IHRlbXBsYXRlLm9iamVjdHM7XHJcbiAgICAgIGxvZy5kZWJ1ZyhcIkZvcm0gY29uZmlnOiBcIiwgZm9ybUNvbmZpZyk7XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIHN1YnN0aXR1dGUoc3RyLCBkYXRhKSB7XHJcbiAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvXFwke1xcdyp9L2csIChtYXRjaCkgPT4ge1xyXG4gICAgICAgIHZhciBrZXkgPSBtYXRjaC5yZXBsYWNlKC9cXCR7LywgJycpLnJlcGxhY2UoL30vLCAnJykudHJpbSgpO1xyXG4gICAgICAgIHJldHVybiBkYXRhW2tleV0gfHwgbWF0Y2g7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICAkc2NvcGUuc3Vic3RpdHV0ZUFuZERlcGxveVRlbXBsYXRlID0gKCkgPT4ge1xyXG4gICAgICB2YXIgb2JqZWN0cyA9ICRzY29wZS5vYmplY3RzO1xyXG4gICAgICB2YXIgb2JqZWN0c1RleHQgPSBhbmd1bGFyLnRvSnNvbihvYmplY3RzLCB0cnVlKTtcclxuICAgICAgLy8gcHVsbCB0aGVzZSBvdXQgb2YgdGhlIGVudGl0eSBvYmplY3Qgc28gdGhleSdyZSBub3QgdXNlZCBpbiBzdWJzdGl0dXRpb25zXHJcbiAgICAgIHZhciBjcmVhdGVSb3V0ZSA9ICRzY29wZS5lbnRpdHkuY3JlYXRlUm91dGU7XHJcbiAgICAgIHZhciByb3V0ZUhvc3RuYW1lU3VmZml4ID0gJHNjb3BlLmVudGl0eS5yb3V0ZUhvc3RuYW1lIHx8IFwiXCI7XHJcbiAgICAgIHZhciByb3V0ZU5hbWUgPSAkc2NvcGUuZW50aXR5LnJvdXRlTmFtZTtcclxuICAgICAgdmFyIHJvdXRlU2VydmljZU5hbWUgPSAkc2NvcGUuZW50aXR5LnJvdXRlU2VydmljZU5hbWU7XHJcbiAgICAgIGRlbGV0ZSAkc2NvcGUuZW50aXR5LmNyZWF0ZVJvdXRlO1xyXG4gICAgICBkZWxldGUgJHNjb3BlLmVudGl0eS5yb3V0ZUhvc3RuYW1lO1xyXG4gICAgICBkZWxldGUgJHNjb3BlLmVudGl0eS5yb3V0ZU5hbWU7XHJcbiAgICAgIGRlbGV0ZSAkc2NvcGUuZW50aXR5LnJvdXRlU2VydmljZU5hbWU7XHJcbiAgICAgIG9iamVjdHNUZXh0ID0gc3Vic3RpdHV0ZShvYmplY3RzVGV4dCwgJHNjb3BlLmVudGl0eSk7XHJcbiAgICAgIG9iamVjdHMgPSBhbmd1bGFyLmZyb21Kc29uKG9iamVjdHNUZXh0KTtcclxuICAgICAgaWYgKGNyZWF0ZVJvdXRlKSB7XHJcbiAgICAgICAgdmFyIHJvdXRlcyA9IFtdO1xyXG4gICAgICAgIGFuZ3VsYXIuZm9yRWFjaChvYmplY3RzLCAob2JqZWN0KSA9PiB7XHJcbiAgICAgICAgICB2YXIga2luZCA9IG9iamVjdC5raW5kO1xyXG4gICAgICAgICAgdmFyIG5hbWUgPSBnZXROYW1lKG9iamVjdCk7XHJcbiAgICAgICAgICBpZiAobmFtZSAmJiBcIlNlcnZpY2VcIiA9PT0ga2luZCkge1xyXG4gICAgICAgICAgICB2YXIgcm91dGVIb3N0bmFtZSA9IG5hbWUgKyByb3V0ZUhvc3RuYW1lU3VmZml4O1xyXG4gICAgICAgICAgICB2YXIgcm91dGUgPSB7XHJcbiAgICAgICAgICAgICAga2luZDogXCJSb3V0ZVwiLFxyXG4gICAgICAgICAgICAgIGFwaVZlcnNpb246IGRlZmF1bHRPU0FwaVZlcnNpb24sXHJcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBzcGVjOiB7XHJcbiAgICAgICAgICAgICAgICBob3N0OiByb3V0ZUhvc3RuYW1lLFxyXG4gICAgICAgICAgICAgICAgdG86IHtcclxuICAgICAgICAgICAgICAgICAga2luZDogXCJTZXJ2aWNlXCIsXHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJvdXRlcy5wdXNoKHJvdXRlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBvYmplY3RzID0gb2JqZWN0cy5jb25jYXQocm91dGVzKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoJHNjb3BlLnRhcmdldE5hbWVzcGFjZSAhPT0gbW9kZWwuY3VycmVudE5hbWVzcGFjZSgpKSB7XHJcbiAgICAgICAgJHNjb3BlLiRvbignV2F0Y2hlck5hbWVzcGFjZUNoYW5nZWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICBsb2cuZGVidWcoXCJOYW1lc3BhY2UgY2hhbmdlZFwiKTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBhcHBseU9iamVjdHMob2JqZWN0cyk7XHJcbiAgICAgICAgICAgIENvcmUuJGFwcGx5KCRzY29wZSk7XHJcbiAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIENvcmUubm90aWZpY2F0aW9uKCdpbmZvJywgXCJTd2l0Y2hpbmcgdG8gbmFtZXNwYWNlIFwiICsgJHNjb3BlLnRhcmdldE5hbWVzcGFjZSArIFwiIGFuZCBkZXBsb3lpbmcgdGVtcGxhdGVcIik7XHJcbiAgICAgICAgbW9kZWwua3ViZXJuZXRlcy5zZWxlY3RlZE5hbWVzcGFjZSA9ICRzY29wZS50YXJnZXROYW1lc3BhY2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXBwbHlPYmplY3RzKG9iamVjdHMpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGFwcGx5T2JqZWN0cyhvYmplY3RzKSB7XHJcbiAgICAgIHZhciBwcm9qZWN0Q2xpZW50ID0gS3ViZXJuZXRlcy5jcmVhdGVLdWJlcm5ldGVzQ2xpZW50KFwicHJvamVjdHNcIik7XHJcblxyXG4gICAgICBfLmZvckVhY2gob2JqZWN0cywgKG9iamVjdDphbnkpID0+IHtcclxuICAgICAgICBsb2cuZGVidWcoXCJPYmplY3Q6IFwiLCBvYmplY3QpO1xyXG5cclxuICAgICAgICB2YXIga2luZCA9IGdldEtpbmQob2JqZWN0KTtcclxuICAgICAgICB2YXIgbmFtZSA9IGdldE5hbWUob2JqZWN0KTtcclxuICAgICAgICB2YXIgbnMgPSBnZXROYW1lc3BhY2Uob2JqZWN0KTtcclxuXHJcbiAgICAgICAgaWYgKGtpbmQgJiYgbmFtZSkge1xyXG4gICAgICAgICAgaWYgKG5zICYmIG5zICE9PSBjdXJyZW50S3ViZXJuZXRlc05hbWVzcGFjZSgpKSB7XHJcbiAgICAgICAgICAgIHZhciBwcm9qZWN0ID0ge1xyXG4gICAgICAgICAgICAgIGFwaVZlcnNpb246IEt1YmVybmV0ZXMuZGVmYXVsdEFwaVZlcnNpb24sXHJcbiAgICAgICAgICAgICAga2luZDogXCJQcm9qZWN0XCIsXHJcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IG5zLFxyXG4gICAgICAgICAgICAgICAgbGFiZWxzOiB7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBwcm9qZWN0Q2xpZW50LnB1dChwcm9qZWN0LFxyXG4gICAgICAgICAgICAgIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsb2cuaW5mbyhcIkNyZWF0ZWQgbmFtZXNwYWNlOiBcIiArIG5zKVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgbG9nLndhcm4oXCJGYWlsZWQgdG8gY3JlYXRlIG5hbWVzcGFjZTogXCIgKyBucyArIFwiOiBcIiArIGFuZ3VsYXIudG9Kc29uKGVycikpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHZhciBwbHVyYWxLaW5kID0ga2luZC50b0xvd2VyQ2FzZSgpICsgXCJzXCI7XHJcbiAgICAgICAgICB2YXIga3ViZUNsaWVudCA9IEt1YmVybmV0ZXMuY3JlYXRlS3ViZXJuZXRlc0NsaWVudChwbHVyYWxLaW5kLCBucyk7XHJcbiAgICAgICAgICBrdWJlQ2xpZW50LnB1dChvYmplY3QsXHJcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgbG9nLmluZm8oXCJ1cGRhdGVkIFwiICsga2luZCArIFwiIG5hbWU6IFwiICsgbmFtZSArIChucyA/IFwiIG5zOiBcIiArIG5zOiBcIlwiKSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgICAgICBsb2cud2FybihcIkZhaWxlZCB0byB1cGRhdGUgXCIgKyBraW5kICsgXCIgbmFtZTogXCIgKyBuYW1lICsgKG5zID8gXCIgbnM6IFwiICsgbnM6IFwiXCIpICsgXCIgZXJyb3I6IFwiICsgYW5ndWxhci50b0pzb24oZXJyKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGdvQmFjaygpO1xyXG4gICAgfVxyXG5cclxuICAgICRzY29wZS5kZWxldGVUZW1wbGF0ZSA9ICh0ZW1wbGF0ZSkgPT4ge1xyXG4gICAgICBVSS5tdWx0aUl0ZW1Db25maXJtQWN0aW9uRGlhbG9nKDxVSS5NdWx0aUl0ZW1Db25maXJtQWN0aW9uT3B0aW9ucz57XHJcbiAgICAgICAgY29sbGVjdGlvbjogW3RlbXBsYXRlXSxcclxuICAgICAgICBpbmRleDogJ21ldGFkYXRhLm5hbWUnLFxyXG4gICAgICAgIG9uQ2xvc2U6IChyZXN1bHQ6Ym9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICBLdWJlcm5ldGVzTW9kZWxbJ3RlbXBsYXRlc1Jlc291cmNlJ10uZGVsZXRlKHtcclxuICAgICAgICAgICAgICBpZDogdGVtcGxhdGUubWV0YWRhdGEubmFtZVxyXG4gICAgICAgICAgICB9LCB1bmRlZmluZWQsICgpID0+IHtcclxuICAgICAgICAgICAgICBLdWJlcm5ldGVzTW9kZWxbJ3RlbXBsYXRlc1Jlc291cmNlJ10ucXVlcnkoKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIEt1YmVybmV0ZXNNb2RlbC50ZW1wbGF0ZXMgPSBkYXRhLml0ZW1zO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICBsb2cuZGVidWcoXCJFcnJvciBkZWxldGluZyB0ZW1wbGF0ZTogXCIsIGVycm9yKTsgXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdGl0bGU6ICdEZWxldGUgVGVtcGxhdGU/JyxcclxuICAgICAgICBhY3Rpb246ICdUaGUgZm9sbG93aW5nIHRlbXBsYXRlIHdpbGwgYmUgZGVsZXRlZDonLFxyXG4gICAgICAgIG9rVGV4dDogJ0RlbGV0ZScsXHJcbiAgICAgICAgb2tDbGFzczogJ2J0bi1kYW5nZXInLFxyXG4gICAgICAgIGN1c3RvbTogXCJUaGlzIG9wZXJhdGlvbiBpcyBwZXJtYW5lbnQgb25jZSBjb21wbGV0ZWQhXCIsXHJcbiAgICAgICAgY3VzdG9tQ2xhc3M6IFwiYWxlcnQgYWxlcnQtd2FybmluZ1wiXHJcbiAgICAgIH0pLm9wZW4oKTtcclxuICAgIH07XHJcbiAgfV0pO1xyXG59XHJcblxyXG4iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9kZXZlbG9wZXIvdHMvZGV2ZWxvcGVyTmF2aWdhdGlvbi50c1wiLz5cclxuXHJcbm1vZHVsZSBTeXN0ZW17XHJcblx0ZXhwb3J0IHZhciAgcGx1Z2luTmFtZSA9IFwiU3lzdGVtXCI7XHJcblx0ZXhwb3J0IHZhciBjb250ZXh0ID0gXCIvc3lzdGVtXCI7XHRcclxuXHRleHBvcnQgdmFyIHBsdWdpblBhdGggPSBcInBsdWdpbnMvc3lzdGVtL1wiXHJcblx0ZXhwb3J0IHZhciB0ZW1wbGF0ZVBhdGggPSBwbHVnaW5QYXRoICsgJ2h0bWwvJztcclxuXHJcblx0ZXhwb3J0IGZ1bmN0aW9uIHNoYXJlSW5pdCgkc2NvcGUpe1xyXG5cdFx0Ly/liJvlu7rkuoznuqflrZDoj5zljZVcclxuXHRcdCRzY29wZS5zdWJUYWJDb25maWcgPSBEZXZlbG9wZXIuYWN0aXZhdGVDdXJyZW50KFtcclxuXHRcdHtcclxuXHRcdFx0aHJlZjogVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdzeXN0ZW0tbGlzdCcpLFxyXG5cdFx0XHRsYWJlbDogJ+S/oeaBr+ezu+e7n+a4heWNlScsXHJcblx0XHRcdHRpdGxlOiAn5p+l55yL5L+h5oGv57O757uf5riF5Y2VJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0aHJlZjogVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdzeXN0ZW0tdmVyaWZpY2F0aW9uJyksXHJcblx0XHRcdGxhYmVsOiAn5L+h5oGv57O757uf5qCh6aqMJyxcclxuXHRcdFx0dGl0bGU6ICfmoKHpqozkv6Hmga/ns7vnu58nXHRcdFx0XHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRocmVmOiBVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ3N5c3RlbS1zcWxNYW5hZ2VtZW50JyksXHJcblx0XHRcdGxhYmVsOiAn5L+h5oGv57O757uf6ISa5pys566h55CGJyxcclxuXHRcdFx0dGl0bGU6ICfnrqHnkIZzcWzohJrmnKwnXHRcdFx0XHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRocmVmOiBVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ3N5c3RlbS1oZWxwJyksXHJcblx0XHRcdGxhYmVsOiAn5biu5YqpJyxcclxuXHRcdFx0dGl0bGU6ICfooYzmlL/ljLrliJLku6PnoIHmiJbns7vnu5/ku6PnoIHmo4DntKInLFxyXG5cdFx0XHRpdGVtczogW3tcclxuXHRcdFx0XHRocmVmOiBVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ3N5c3RlbS1oZWxwJywgJ3JlZ2lvbmFsaXNtLXNlYXJjaCcpLFxyXG5cdFx0XHRcdHRpdGxlOiAn6KGM5pS/5Yy65YiS5Luj56CB5qOA57SiJyxcclxuXHRcdFx0XHRsYWJlbDogJ+ihjOaUv+WMuuWIkuajgOe0oidcclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGhyZWY6IFVybEhlbHBlcnMuam9pbihjb250ZXh0LCAnc3lzdGVtLWhlbHAnLCAnc3lzdGVtLXNlYXJjaCcpLFxyXG5cdFx0XHRcdHRpdGxlOiAn57O757uf5Luj56CB5qOA57SiJyxcclxuXHRcdFx0XHRsYWJlbDogJ+ezu+e7n+S7o+eggeajgOe0oidcclxuXHRcdFx0fV1cdFx0XHJcblx0XHR9XSk7XHJcblx0fVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwic3lzdGVtSGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2NvbmZpZ3MvdHMvY29uZmlnUGx1Z2luLnRzXCIvPlxyXG5cclxubW9kdWxlIFN5c3RlbXtcclxuXHRleHBvcnQgdmFyIF9tb2R1bGUgPSBhbmd1bGFyLm1vZHVsZShwbHVnaW5OYW1lLCBbJ2hhd3Rpby1jb3JlJywgJ2hhd3Rpby11aScsICd1aS5jb2RlbWlycm9yJywgJ3VpLnZhbGlkYXRlJywgJ2t1YmVybmV0ZXNVSScsICduZ0ZpbGVVcGxvYWQnLCAnbmdEaWFsb2cnXSk7XHJcbiAgXHRleHBvcnQgdmFyIGNvbnRyb2xsZXIgPSBQbHVnaW5IZWxwZXJzLmNyZWF0ZUNvbnRyb2xsZXJGdW5jdGlvbihfbW9kdWxlLCBwbHVnaW5OYW1lKTtcclxuXHRleHBvcnQgdmFyIHJvdXRlID0gUGx1Z2luSGVscGVycy5jcmVhdGVSb3V0aW5nRnVuY3Rpb24odGVtcGxhdGVQYXRoKTtcclxuXHJcblx0LypcclxuXHRcdOmhtemdoui3r+eUsemFjee9rlxyXG5cdCovXHJcblx0X21vZHVsZS5jb25maWcoWyckcHJvdmlkZScsICckcm91dGVQcm92aWRlcicsICgkcHJvdmlkZSwgJHJvdXRlUHJvdmlkZXIpID0+e1xyXG5cdFx0JHJvdXRlUHJvdmlkZXIud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJy8nKSwgcm91dGUoJ3N5c3RlbUxpc3QuaHRtbCcsIGZhbHNlKSlcclxuXHRcdFx0XHRcdCAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdzeXN0ZW0tbGlzdCcpLCByb3V0ZSgnc3lzdGVtTGlzdC5odG1sJywgZmFsc2UpKVxyXG5cdFx0XHRcdFx0ICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ3N5c3RlbS1oZWxwJyksIHJvdXRlKCdyZWdpb25hbGlzbUNvZGVTZWFyY2guaHRtbCcsIGZhbHNlKSlcclxuXHRcdFx0XHRcdCAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdzeXN0ZW0taGVscCcsICdyZWdpb25hbGlzbS1zZWFyY2gnKSwgcm91dGUoJ3JlZ2lvbmFsaXNtQ29kZVNlYXJjaC5odG1sJywgZmFsc2UpKVxyXG5cdFx0XHRcdFx0ICAud2hlbihVcmxIZWxwZXJzLmpvaW4oY29udGV4dCwgJ3N5c3RlbS1oZWxwJywgJ3N5c3RlbS1zZWFyY2gnKSwgcm91dGUoJ3N5c3RlbUNvZGVTZWFyY2guaHRtbCcsIGZhbHNlKSlcclxuXHRcdFx0XHRcdCAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdzeXN0ZW0tdmVyaWZpY2F0aW9uJyksIHJvdXRlKCdzeXN0ZW1WZXJpZmljYXRpb24uaHRtbCcsIGZhbHNlKSlcclxuXHRcdFx0XHRcdCAgLndoZW4oVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdzeXN0ZW0tc3FsTWFuYWdlbWVudCcpLCByb3V0ZSgnc3lzdGVtU1FMTWFuYWdlbWVudC5odG1sJywgZmFsc2UpKVxyXG5cdFx0XHRcdFx0ICAud2hlbihjb250ZXh0LCB7cmVkaXJlY3RUbzogVXJsSGVscGVycy5qb2luKGNvbnRleHQsICdzeXN0ZW0tbGlzdCcpfSk7XHRcdCAgIFx0XHRcdCAgXHJcblx0fV0pO1xyXG5cclxuXHQvKlxyXG5cdFx05qih5Z2X5Yqg6L295ZCO5Yid5aeL5YyW6YWN572uXHJcblx0Ki9cclxuXHRfbW9kdWxlLnJ1bihbJ3ZpZXdSZWdpc3RyeScsICckdGVtcGxhdGVDYWNoZScsICdIYXd0aW9OYXYnLCAnJGNvbXBpbGUnLCAodmlld1JlZ2lzdHJ5LCAkdGVtcGxhdGVDYWNoZTpuZy5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsIEhhd3Rpb05hdiwgICRjb21waWxlOm5nLklDb21waWxlU2VydmljZSkgPT4ge1xyXG4gICAgICAgIHZpZXdSZWdpc3RyeVsnc3lzdGVtJ10gPSBDb25maWdzLnRlbXBsYXRlUGF0aCArIFwic2hhcmVMYXlvdXQuaHRtbFwiOyBcclxuICAgICAgICAvKlxyXG4gICAgICAgIFx05L+h5oGv57O757uf5LiA57qn6I+c5Y2V5a+86IiqXHJcbiAgICAgICAgKi9cclxuICAgICAgICB2YXIgYnVpbGRlciA9IEhhd3Rpb05hdi5idWlsZGVyKCk7IFxyXG4gICAgICAgIHZhciBzeXN0ZW1UYWIgPSBidWlsZGVyLmlkKCdzeXN0ZW1UYWInKVxyXG4gICAgICAgICAgICAgICAgICAgICAucmFuaygxMClcclxuICAgICAgICAgICAgICAgICAgICAgLmhyZWYoKCkgPT4gY29udGV4dClcclxuICAgICAgICAgICAgICAgICAgICAgLnRpdGxlKCgpID0+ICfkv6Hmga/ns7vnu58nKVxyXG4gICAgICAgICAgICAgICAgICAgICAvLy5pc1ZhbGlkKCgpID0+ICFDb3JlLmlzUmVtb3RlQ29ubmVjdGlvbigpKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7ICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgIEhhd3Rpb05hdi5hZGQoc3lzdGVtVGFiKTtcclxuICAgIH1dKTtcclxuXHJcblx0Ly8g5Yqg6L295qih5Z2XIFxyXG5cdGhhd3Rpb1BsdWdpbkxvYWRlci5hZGRNb2R1bGUocGx1Z2luTmFtZSk7IFxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwic3lzdGVtUGx1Z2luLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwic3lzdGVtSGVscGVycy50c1wiLz5cXFxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vY29uZmlncy90cy9jb25maWdzRGF0YVNlcnZpY2UudHNcIi8+XHJcbm1vZHVsZSBTeXN0ZW17XHJcblxyXG5cdGV4cG9ydCB2YXIgUmVnaW9uYWxpc21Db2RlQ29udHJvbGxlciA9IGNvbnRyb2xsZXIoJ1JlZ2lvbmFsaXNtQ29kZUNvbnRyb2xsZXInLCBbXCIkc2NvcGVcIiwgXCIkdGVtcGxhdGVDYWNoZVwiLCBcIiRsb2NhdGlvblwiLCBcIiRyb3V0ZVBhcmFtc1wiLCBcIiRodHRwXCIsIFwiJHRpbWVvdXRcIiwgJ1N5c3RlbU1vZGVsJywgJ05nVGFibGVQYXJhbXMnLCBcclxuXHRcdCgkc2NvcGUsICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgJGxvY2F0aW9uLCAkcm91dGVQYXJhbXMsICRodHRwLCAkdGltZW91dCwgU3lzdGVtTW9kZWwsIE5nVGFibGVQYXJhbXMpID0+e1x0XHRcclxuXHQgICAgXHJcblx0ICAgIHNoYXJlSW5pdCgkc2NvcGUpO1xyXG5cdCAgICAgICAgXHJcblx0ICAgICRzY29wZS5tb2RlbCA9IFN5c3RlbU1vZGVsO1x0ICAgXHJcblxyXG5cdCAgICAvL2NvbnNvbGUubG9nKCRzY29wZS5tb2RlbC5yZWdpb25hbGlzbUluZm8pOyBcclxuXHJcblx0ICAgICRzY29wZS50YWJsZVBhcmFtcyA9IG5ldyBOZ1RhYmxlUGFyYW1zKHtjb3VudDogMjV9LCB7XHJcblx0ICAgIFx0Y291bnRzOiBbMjUsIDUwLCAxMDBdLFxyXG4gICAgICBcdFx0ZGF0YXNldDogJHNjb3BlLm1vZGVsLnJlZ2lvbmFsaXNtSW5mb1xyXG4gICBcdFx0IH0pO1x0ICBcclxuXHR9XSk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJzeXN0ZW1QbHVnaW4udHNcIi8+XHJcbm1vZHVsZSBTeXN0ZW17XHJcblxyXG5cdGV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeUNpdHkocmVnaW9uYWxpc21JbmZvOiBBcnJheTxhbnk+KXtcclxuXHRcdHZhciByZXN1bHQgPSBbXTtcclxuXHRcdGFuZ3VsYXIuZm9yRWFjaChyZWdpb25hbGlzbUluZm8sIChpdGVtKSA9PntcclxuXHRcdFx0aWYocmVzdWx0LmluZGV4T2YoaXRlbS5jaXR5TmFtZSkgPT0gLTEpXHJcblx0XHRcdFx0cmVzdWx0LnB1c2goaXRlbS5jaXR5TmFtZSk7XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRleHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlDb3VudHJ5KHJlZ2lvbmFsaXNtSW5mbzogQXJyYXk8YW55PiwgY2l0eU5hbWU6IHN0cmluZyl7XHJcblx0XHR2YXIgcmVzdWx0ID0gW107XHJcblx0XHRhbmd1bGFyLmZvckVhY2gocmVnaW9uYWxpc21JbmZvLCAoaXRlbSkgPT57XHJcblx0XHRcdGlmKGl0ZW0uY2l0eU5hbWUgPT0gY2l0eU5hbWUpXHJcblx0XHRcdFx0cmVzdWx0LnB1c2goe1xyXG5cdFx0XHRcdFx0bmFtZTogaXRlbS5kaXN0cmljdE5hbWUsIFxyXG5cdFx0XHRcdFx0Y29kZTogaXRlbS5jb2RlXHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRjbGFzcyBzeXN0ZW1Nb2RlbFNlcnZpY2Vze1xyXG5cdFx0cHVibGljIHN5c3RlbUluZm9MaXN0OiBBcnJheTxhbnk+ID0gW107XHJcblx0XHRwdWJsaWMgc3lzdGVtSW5mbzogQXJyYXk8YW55PiA9IFtdO1xyXG5cdFx0cHVibGljIHJlZ2lvbmFsaXNtSW5mbzogQXJyYXk8YW55PiA9IFtdO1xyXG5cdFx0cHVibGljIHNxbEluZm86IEFycmF5PGFueT4gPSBbXTtcclxuXHRcdC8vcHVibGljIGNoZWNrSW5mbzogQXJyYXk8YW55PiA9IFtdO1xyXG5cclxuXHRcdHB1YmxpYyBjb25zdHJ1Y3Rvcigpe1x0XHRcdFxyXG5cdFx0XHR0aGlzLnVwZGF0ZUNvZGVJbmZvKCk7XHJcblx0XHRcdHRoaXMudXBkYXRlRXhjZWxJbmZvKCk7XHJcblx0XHRcdHRoaXMudXBkYXRlU3FsSW5mbygpO1xyXG5cdFx0XHQvL3RoaXMudXBkYXRlQ2hlY2tJbmZvKCk7XHJcblx0XHRcdC8vY29uc29sZS5sb2coY2xhc3NpZnlDb3VudHJ5KHRoaXMucmVnaW9uYWxpc21JbmZvLCAn5Y2X5Lqs5biCJykpO1xyXG5cdFx0fVx0XHRcclxuXHJcblx0XHRwdWJsaWMgdXBkYXRlRXhjZWxJbmZvKCl7XHJcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcclxuXHRcdFx0JC5hamF4KHtcclxuXHRcdFx0XHRhc3luYzogZmFsc2UsXHJcblx0XHRcdFx0dHlwZTogXCJQT1NUXCIsXHJcblx0XHRcdFx0dXJsOiBcIi9qYXZhL2NvbnNvbGUvYXBpL2ZpbGVPcGVyYXRpb24vZmluZEFsbFwiLFxyXG5cdFx0XHRcdHN1Y2Nlc3M6IChkYXRhKSA9PntcclxuXHRcdFx0XHRcdGlmKGRhdGEpXHJcblx0XHRcdFx0XHRcdHJlc3VsdCA9IGRhdGEuZGF0YTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLnN5c3RlbUluZm9MaXN0ID0gcmVzdWx0O1x0XHRcdFxyXG5cdFx0fVxyXG5cclxuXHRcdHB1YmxpYyB1cGRhdGVTcWxJbmZvKCl7XHJcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcclxuXHRcdFx0JC5hamF4KHtcclxuXHRcdFx0XHRhc3luYzogZmFsc2UsXHJcblx0XHRcdFx0dHlwZTogXCJQT1NUXCIsXHJcblx0XHRcdFx0dXJsOiBcIi9qYXZhL2NvbnNvbGUvYXBpL2ZpbGVQYWNrYWdlL2ZpbmRBbGxcIixcclxuXHRcdFx0XHRzdWNjZXNzOiAoZGF0YSkgPT57XHJcblx0XHRcdFx0XHRpZihkYXRhKVxyXG5cdFx0XHRcdFx0XHRyZXN1bHQgPSBkYXRhLmRhdGE7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5zcWxJbmZvID0gcmVzdWx0O1x0XHRcdFx0XHJcblx0XHR9XHJcblxyXG5cdFx0cHVibGljIHVwZGF0ZUNvZGVJbmZvKCl7XHJcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcclxuXHQgICAgXHQkLmFqYXgoeyBcclxuXHRcdFx0XHRhc3luYzogZmFsc2UsIFxyXG5cdFx0XHRcdHR5cGUgOiBcIlBPU1RcIiwgXHJcblx0XHRcdFx0dXJsIDogXCIvamF2YS9jb25zb2xlL2FwaS9jb2RlL2xpc3RcIixcdFx0XHRcdFx0XHJcblx0XHRcdFx0c3VjY2VzcyA6IGZ1bmN0aW9uKGRhdGEpIHsgXHJcblx0XHRcdFx0ICAgIGlmKGRhdGEpe1x0XHRcdFx0ICAgIFx0XHRcclxuXHRcdFx0XHRcdCAgICByZXN1bHQgPSBkYXRhO1xyXG5cdFx0XHRcdFx0fVx0XHRcdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdH0gXHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLnJlZ2lvbmFsaXNtSW5mbyA9IHJlc3VsdFtcInJlZ2lvbmFsaXNtXCJdO1xyXG5cdFx0XHR0aGlzLnN5c3RlbUluZm8gPSByZXN1bHRbXCJzeXN0ZW1cIl07XHJcblx0XHR9XHJcblxyXG5cdFx0LypwdWJsaWMgdXBkYXRlQ2hlY2tJbmZvKCl7XHJcblx0XHRcdHZhciByZXN1bHQgPSBudWxsO1xyXG5cdCAgICBcdCQuYWpheCh7IFxyXG5cdFx0XHRcdGFzeW5jOiBmYWxzZSwgXHJcblx0XHRcdFx0dHlwZSA6IFwiUE9TVFwiLCBcclxuXHRcdFx0XHR1cmwgOiBcIi9qYXZhL2NvbnNvbGUvYXBpL2NoZWNrb3V0L2ZpbmRBbGxcIixcdFx0XHRcdFx0XHJcblx0XHRcdFx0c3VjY2VzcyA6IGZ1bmN0aW9uKGRhdGEpIHsgXHJcblx0XHRcdFx0ICAgIGlmKGRhdGEpe1x0XHRcdFx0ICAgIFx0XHRcclxuXHRcdFx0XHRcdCAgICByZXN1bHQgPSBkYXRhLmRhdGE7XHRcdFx0XHRcdCAgICBcclxuXHRcdFx0XHRcdH1cdFx0XHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHR9IFxyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5jaGVja0luZm8gPSByZXN1bHQ7XHJcblx0XHR9Ki9cclxuXHR9XHJcblxyXG5cdF9tb2R1bGUuZmFjdG9yeSgnU3lzdGVtTW9kZWwnLCBbJyRyb290U2NvcGUnLCAnJGh0dHAnLCAoJHJvb3RTY29wZSwgJGh0dHApID0+IHtcclxuXHRcdHJldHVybiBuZXcgc3lzdGVtTW9kZWxTZXJ2aWNlcygpO1xyXG5cdH1dKTtcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cInN5c3RlbVBsdWdpbi50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cInN5c3RlbUhlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJzeXN0ZW1TZXJ2aWNlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2NvbmZpZ3MvdHMvY29uZmlnc1V0aWxzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vY29uZmlncy90cy9jdXN0b21BbGVydC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2t1YmVybmV0ZXMvdHMva3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcblxyXG5tb2R1bGUgU3lzdGVte1xyXG5cdGV4cG9ydCB2YXIgU3lzdGVtU1FMTWFuYWdlbWVudCA9IGNvbnRyb2xsZXIoJ1N5c3RlbVNRTE1hbmFnZW1lbnQnLCBbJyRzY29wZScsICckbG9jYXRpb24nLCAnJGh0dHAnLCAnJGVsZW1lbnQnLCAnJHRlbXBsYXRlQ2FjaGUnLCAnTmdUYWJsZVBhcmFtcycsICduZ0RpYWxvZycsICdTeXN0ZW1Nb2RlbCcsICgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICRlbGVtZW50LCAkdGVtcGxhdGVDYWNoZSwgTmdUYWJsZVBhcmFtcywgbmdEaWFsb2csIFN5c3RlbU1vZGVsKSA9PiB7XHJcblx0XHRzaGFyZUluaXQoJHNjb3BlKTtcclxuXHRcdCRzY29wZS5jaXRpZXMgPSAgY2xhc3NpZnlDaXR5KFN5c3RlbU1vZGVsLnJlZ2lvbmFsaXNtSW5mbyk7XHJcblxyXG5cdFx0JHNjb3BlLnN0YXR1cyA9IFt7aWQ6IDAsIGxhYmVsOiBcIuaciee8uuWksVwifSwge2lkOiAxLCBsYWJlbDogXCLmraPluLhcIn0sIHtpZDogMiwgbGFiZWw6XCLlvoXlvZLmoaNcIn0sIHtpZDogMywgbGFiZWw6IFwi5b6F5a6h5qC4XCJ9XTtcdFxyXG5cclxuICAgIFN5c3RlbU1vZGVsLnVwZGF0ZVNxbEluZm8oKTtcdFxyXG5cclxuICAgICRzY29wZS5jaXR5RmlsdGVyID0gJHNjb3BlLm1vZGVsID0gU3lzdGVtTW9kZWwuc3FsSW5mbzsgXHJcblxyXG4gICAgJHNjb3BlLmNoZWNrYm94ZXMgPSB7XHJcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxyXG4gICAgICBpdGVtczoge31cclxuICAgIH07XHJcblxyXG5cdFx0JHNjb3BlLnRhYmxlUGFyYW1zID0gbmV3IE5nVGFibGVQYXJhbXMoe2NvdW50OiAyNX0sIHtcclxuXHQgICAgY291bnRzOiBbMjUsIDUwLCAxMDBdLFxyXG4gICAgICBkYXRhc2V0OiAkc2NvcGUubW9kZWxcclxuICAgXHR9KTtcclxuXHJcbiAgICAkc2NvcGUuY2l0eVNlbGVjdCA9ICh4KSA9PiB7XHJcbiAgICAgIGlmKCRzY29wZS56ICE9ICdhbGwnKXtcclxuICAgICAgICAkc2NvcGUuc3RhdHVzRmlsdGVyID0gW107XHJcbiAgICAgICAgYW5ndWxhci5mb3JFYWNoKCRzY29wZS5tb2RlbCwgKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGlmKCRzY29wZS5zdGF0dXNbaXRlbS5zeXNTdGF0dXNdLmxhYmVsID09ICRzY29wZS56KVxyXG4gICAgICAgICAgICAkc2NvcGUuc3RhdHVzRmlsdGVyLnB1c2goaXRlbSlcclxuICAgICAgICB9KTtcclxuICAgICAgfWVsc2VcclxuICAgICAgICAkc2NvcGUuc3RhdHVzRmlsdGVyID0gJHNjb3BlLm1vZGVsO1xyXG4gICAgICAgICAgICAgICBcclxuICAgICAgaWYoeCAhPSAnYWxsJyl7XHJcbiAgICAgIFx0JHNjb3BlLmNvdW50cmllcyA9IGNsYXNzaWZ5Q291bnRyeShTeXN0ZW1Nb2RlbC5yZWdpb25hbGlzbUluZm8sIHgpOyAgLy/ojrflj5blvZPliY3luILkuIvmiYDmnInljLrljr9cclxuICAgICAgXHQkc2NvcGUuY2l0eUZpbHRlciA9IFtdO1xyXG4gICAgICBcdGFuZ3VsYXIuZm9yRWFjaCgkc2NvcGUuc3RhdHVzRmlsdGVyLCAoaXRlbSkgPT4ge1xyXG4gICAgICBcdFx0aWYoeCA9PSBpdGVtLmNpdHlOYW1lKVxyXG4gICAgICBcdFx0XHQkc2NvcGUuY2l0eUZpbHRlci5wdXNoKGl0ZW0pO1xyXG4gICAgICBcdH0pOyAgICAgICBcclxuICAgICAgfWVsc2V7ICBcclxuICAgICAgXHQkc2NvcGUuY291bnRyaWVzPVtdOyBcclxuICAgICAgICAkc2NvcGUueSA9ICdhbGwnOyBcclxuICAgICAgICAkc2NvcGUuY2l0eUZpbHRlciA9ICRzY29wZS5zdGF0dXNGaWx0ZXI7ICAgICAgICAgXHJcbiAgICAgIH1cclxuICAgICAgJHNjb3BlLmNvdW50cnlGaWx0ZXIgPSAkc2NvcGUuY2l0eUZpbHRlcjtcclxuICAgICAgJHNjb3BlLnRhYmxlUGFyYW1zLnNldHRpbmdzKHtcclxuICAgICAgICBkYXRhc2V0OiAkc2NvcGUuY2l0eUZpbHRlclxyXG4gICAgICB9KTsgICBcclxuICAgIH0gXHJcblxyXG4gICAgJHNjb3BlLmNvdW50cnlTZWxlY3QgPSAoeSkgPT4geyAgICAgICAgIFxyXG4gICAgICBpZih5ICE9ICdhbGwnKXtcclxuICAgICAgICAkc2NvcGUuY291bnRyeUZpbHRlciA9IFtdO1xyXG4gICAgICAgIGFuZ3VsYXIuZm9yRWFjaCgkc2NvcGUuY2l0eUZpbHRlciwgKGl0ZW0pID0+IHtcclxuICAgICAgICAgIGlmKGl0ZW0uZGlzdHJpY3ROYW1lID09IHkpXHJcbiAgICAgICAgICAgXHQkc2NvcGUuY291bnRyeUZpbHRlci5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH0pOyAgICBcclxuICAgICAgfWVsc2VcclxuICAgICAgICAkc2NvcGUuY291bnRyeUZpbHRlciA9ICRzY29wZS5jaXR5RmlsdGVyICAgXHJcbiAgICAgICRzY29wZS50YWJsZVBhcmFtcy5zZXR0aW5ncyh7XHJcbiAgICAgICAgZGF0YXNldDogJHNjb3BlLmNvdW50cnlGaWx0ZXJcclxuICAgICAgfSk7IFxyXG4gICAgfVxyXG5cclxuICAgICRzY29wZS5zdGF0dXNTZWxlY3QgPSAoeikgPT4ge1xyXG4gICAgXHR2YXIgdG1wID0gW107XHJcbiAgICAgIGlmKCRzY29wZS54ID09ICdhbGwnKVxyXG4gICAgICAgIHRtcCA9ICRzY29wZS5tb2RlbDtcclxuICAgICAgZWxzZSAgXHJcbiAgICAgICAgdG1wID0gJHNjb3BlLmNvdW50cnlGaWx0ZXIgO1xyXG4gICAgICB2YXIgcmVzdWx0ID0gW107ICAgICAgIFxyXG4gICAgXHRpZih6ICE9ICdhbGwnKXsgICAgICAgXHJcbiAgICAgICAgYW5ndWxhci5mb3JFYWNoKHRtcCwgKGl0ZW0pID0+IHsgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgaWYoJHNjb3BlLnN0YXR1c1tpdGVtLnN5c1N0YXR1c10ubGFiZWwgPT0geilcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goaXRlbSk7ICAgICAgICAgIFxyXG4gICAgICAgIH0pOyBcclxuICAgICAgICAkc2NvcGUudGFibGVQYXJhbXMuc2V0dGluZ3Moe1xyXG4gICAgICAgICAgZGF0YXNldDogcmVzdWx0XHJcbiAgICAgICAgfSk7ICAgIFxyXG4gICAgICB9ZWxzZXsgICAgICAgXHJcbiAgICAgICAgJHNjb3BlLnRhYmxlUGFyYW1zLnNldHRpbmdzKHtcclxuICAgICAgICAgIGRhdGFzZXQ6IHRtcFxyXG4gICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICBcclxuICAgICAgfSAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgJHNjb3BlLnF1aWNrQ2hlY2sgPSAoKSA9PiB7XHJcbiAgICAgIHVwZGF0ZVNxbFN0YXR1cyhcIi9qYXZhL2NvbnNvbGUvYXBpL2ZpbGVQYWNrYWdlL3RvdGFsVmVyaWZ5U3FsRmlsZVwiKTsgICAgIFxyXG4gICAgfVxyXG5cclxuICAgICRzY29wZS5xdWl0RmlsZSA9ICgpID0+IHtcclxuICAgICAgdXBkYXRlU3FsU3RhdHVzKFwiL2phdmEvY29uc29sZS9hcGkvZmlsZVBhY2thZ2UvdG90YWxPbmhvbGVTcWxGaWxlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgICRzY29wZS5oZWxwID0gKCkgPT4ge1xyXG4gICAgICBuZ0RpYWxvZy5vcGVuKHtcclxuICAgICAgICB0ZW1wbGF0ZTogJ3N0YXR1c0hlbHAuaHRtbCcsICAgICAgICBcclxuICAgICAgICB3aWR0aDogNjAwLCBcclxuICAgICAgICBoZWlnaHQ6IDM3MCwgICAgICAgICBcclxuICAgICAgICBjbG9zZUJ5RG9jdW1lbnQ6IGZhbHNlLCBcclxuICAgICAgICBjbGFzc05hbWU6ICduZ2RpYWxvZy10aGVtZS1kZWZhdWx0J1xyXG4gICAgICB9KTsgIFxyXG4gICAgfVxyXG5cclxuICAgICBcdC8vIHdhdGNoIGZvciBjaGVjayBhbGwgY2hlY2tib3hcclxuIFx0XHQkc2NvcGUuJHdhdGNoKGZ1bmN0aW9uKCkge1xyXG4gICAgXHRcdHJldHVybiAkc2NvcGUuY2hlY2tib3hlcy5jaGVja2VkO1xyXG4gIFx0fSwgZnVuY3Rpb24odmFsdWUpIHtcclxuICAgIFx0XHRhbmd1bGFyLmZvckVhY2goJHNjb3BlLm1vZGVsLCBmdW5jdGlvbihpdGVtKSB7XHJcbiAgICAgIFx0XHQkc2NvcGUuY2hlY2tib3hlcy5pdGVtc1tpdGVtLmlkXSA9IHZhbHVlO1xyXG4gICAgXHRcdH0pO1xyXG4gIFx0fSk7XHJcbiAgICBcclxuICAgIFx0Ly8gd2F0Y2ggZm9yIGRhdGEgY2hlY2tib3hlc1xyXG4gICAgXHQkc2NvcGUuJHdhdGNoKGZ1bmN0aW9uKCkge1xyXG4gICAgICBcdFx0cmV0dXJuICRzY29wZS5jaGVja2JveGVzLml0ZW1zO1xyXG4gICBcdFx0fSwgZnVuY3Rpb24odmFsdWVzKSB7ICBcclxuICAgICAgICAgICRzY29wZS5jaGVja2FibGUgPSBmYWxzZTtcclxuICAgICAgICAgIGZvcih2YXIgaW5kZXggaW4gdmFsdWVzKXtcclxuICAgICAgICAgICAgaWYodmFsdWVzW2luZGV4XSA9PSB0cnVlKXtcclxuICAgICAgICAgICAgICAkc2NvcGUuY2hlY2thYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSAgXHJcblxyXG4gICAgICBcdFx0dmFyIGNoZWNrZWQgPSAwLCB1bmNoZWNrZWQgPSAwLFxyXG4gICAgICAgICAgdG90YWwgPSAkc2NvcGUubW9kZWwubGVuZ3RoO1xyXG4gICAgICBcdFx0YW5ndWxhci5mb3JFYWNoKCRzY29wZS5tb2RlbCwgZnVuY3Rpb24oaXRlbSkge1xyXG4gICAgICAgIFx0XHRjaGVja2VkICs9ICgkc2NvcGUuY2hlY2tib3hlcy5pdGVtc1tpdGVtLmlkXSkgfHwgMDtcclxuICAgICAgICBcdFx0dW5jaGVja2VkICs9IE51bWJlcigoISRzY29wZS5jaGVja2JveGVzLml0ZW1zW2l0ZW0uaWRdKSkgfHwgMDtcclxuICAgICAgXHRcdH0pO1xyXG4gICAgICBcdFx0aWYgKCh1bmNoZWNrZWQgPT0gMCkgfHwgKGNoZWNrZWQgPT0gMCkpIHtcclxuICAgICAgICBcdCRzY29wZS5jaGVja2JveGVzLmNoZWNrZWQgPSAoY2hlY2tlZCA9PSB0b3RhbCk7XHJcbiAgICAgIFx0fVxyXG4gICAgICBcdC8vIGdyYXllZCBjaGVja2JveFxyXG4gICAgICBcdGFuZ3VsYXIuZWxlbWVudCgkZWxlbWVudFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwic2VsZWN0LWFsbFwiKSkucHJvcChcImluZGV0ZXJtaW5hdGVcIiwgKGNoZWNrZWQgIT0gMCAmJiB1bmNoZWNrZWQgIT0gMCkpO1xyXG4gICAgXHR9LCB0cnVlKTsgXHJcblxyXG4gICAgXHQvL+afpeeci1xyXG4gICAgXHQkc2NvcGUudmlld1NxbCA9IChzZWxlY3RlZCwgdHlwZSkgPT4geyAgICBcdFx0XHJcbiAgICBcdFx0bmdEaWFsb2cub3Blbih7IFxyXG5cdCAgICBcdFx0dGVtcGxhdGU6ICdzcWxWaWV3Lmh0bWwnLFxyXG5cdCAgICBcdFx0Y29udHJvbGxlcjonQ29uZmlncy5TcWxWaWV3Q29udHJvbGxlcicsXHJcblx0ICAgIFx0XHR3aWR0aDogMTAwMCxcclxuXHQgICAgXHRcdGhlaWdodDogNjAwLFxyXG5cdCAgICBcdFx0c2NvcGU6ICRzY29wZSwgXHJcblx0ICAgIFx0XHRjbG9zZUJ5RG9jdW1lbnQgOiBmYWxzZSxcclxuXHQgICAgXHRcdGRhdGE6IHt0eXBlOiB0eXBlLCBpdGVtOiBzZWxlY3RlZCB9LFx0XHJcblx0ICAgIFx0XHRjbGFzc05hbWU6ICduZ2RpYWxvZy10aGVtZS1kZWZhdWx0J1xyXG5cdCAgICBcdH0pO1x0IFxyXG4gICAgXHR9XHJcblxyXG4gICAgXHQvL+S4iuS8oFxyXG4gICAgXHQkc2NvcGUuYWRkU3FsID0gKHNlbGVjdGVkLCB0eXBlKSA9PiB7ICAgIFx0XHRcclxuICAgIFx0XHRuZ0RpYWxvZy5vcGVuKHsgXHJcblx0ICAgIFx0XHR0ZW1wbGF0ZTogJ3NxbEFkZC5odG1sJyxcclxuXHQgICAgXHRcdGNvbnRyb2xsZXI6J0NvbmZpZ3MuU3FsQWRkQ29udHJvbGxlcicsXHJcblx0ICAgIFx0XHR3aWR0aDogNjAwLFxyXG5cdCAgICBcdFx0aGVpZ2h0OiA2MDAsXHJcblx0ICAgIFx0XHRzY29wZTogJHNjb3BlLCBcclxuXHQgICAgXHRcdGNsb3NlQnlEb2N1bWVudCA6IGZhbHNlLFxyXG5cdCAgICBcdFx0ZGF0YToge3R5cGU6IHR5cGUsIGl0ZW06IHNlbGVjdGVkIH0sXHRcclxuXHQgICAgXHRcdGNsYXNzTmFtZTogJ25nZGlhbG9nLXRoZW1lLWRlZmF1bHQnXHJcblx0ICAgIFx0fSk7XHRcclxuICAgIFx0fSBcclxuXHJcbiAgICBcdCRzY29wZS52ZXJpZnlTcWwgPSAoc2VsZWN0ZWQsIHR5cGUpID0+IHtcclxuICAgIFx0XHRuZ0RpYWxvZy5vcGVuKHsgXHJcblx0ICAgIFx0XHR0ZW1wbGF0ZTogJ3NxbFZlcmlmaWNhdGlvbi5odG1sJyxcclxuXHQgICAgXHRcdGNvbnRyb2xsZXI6J0NvbmZpZ3Muc3FsVmVyaWZpY2F0aW9uQ29udHJvbGxlcicsXHJcblx0ICAgIFx0XHR3aWR0aDogMTAwMCxcclxuXHQgICAgXHRcdGhlaWdodDogNjAwLFxyXG5cdCAgICBcdFx0c2NvcGU6ICRzY29wZSwgXHJcblx0ICAgIFx0XHRjbG9zZUJ5RG9jdW1lbnQgOiBmYWxzZSxcclxuXHQgICAgXHRcdGRhdGE6IHt0eXBlOiB0eXBlLCBpdGVtOiBzZWxlY3RlZCB9LFx0XHJcblx0ICAgIFx0XHRjbGFzc05hbWU6ICduZ2RpYWxvZy10aGVtZS1kZWZhdWx0J1xyXG5cdCAgICBcdH0pO1xyXG4gICAgXHR9XHJcblxyXG4gICAgXHQkc2NvcGUubW92ZVNxbCA9IChzZWxlY3RlZCwgdHlwZSkgPT4ge1xyXG4gICAgIFx0XHRuZ0RpYWxvZy5vcGVuKHsgXHJcblx0ICAgIFx0XHR0ZW1wbGF0ZTogJ3NxbE1vdmUuaHRtbCcsXHJcblx0ICAgIFx0XHRjb250cm9sbGVyOidDb25maWdzLnNxbE1vdmVDb250cm9sbGVyJyxcclxuXHQgICAgXHRcdHdpZHRoOiA2MDAsXHJcblx0ICAgIFx0XHRoZWlnaHQ6IDYwMCxcclxuXHQgICAgXHRcdHNjb3BlOiAkc2NvcGUsIFxyXG5cdCAgICBcdFx0Y2xvc2VCeURvY3VtZW50IDogZmFsc2UsXHJcblx0ICAgIFx0XHRkYXRhOiB7dHlwZTogdHlwZSwgaXRlbTogc2VsZWN0ZWQgfSxcdFxyXG5cdCAgICBcdFx0Y2xhc3NOYW1lOiAnbmdkaWFsb2ctdGhlbWUtZGVmYXVsdCdcclxuXHQgICAgXHR9KTsgICBcdFx0XHJcbiAgICBcdH1cclxuXHJcbiAgICBcdCRzY29wZS4kb24oJ29uT2snLCAoZXZlbnQsIGRhdGEpID0+IHtcclxuICAgIFx0XHRDb25maWdzLmNyZWF0ZV9tYXNrKCk7ICAvL+WIm+W7uumBrue9qeWxglxyXG5cdFx0XHQgIEt1YmVybmV0ZXMuY3JlYXRlX2xvY2FkRWZmZWN0KFwi5q2j5Zyo5pu05paw5paH5Lu2LOivt+eojeetie+8gVwiKTsgLy/liJvlu7rmlbDmja7liqDovb3mlYjmnpzlsYJcclxuICAgICAgICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmcnKVxyXG4gICAgICAgIHZhciBzcGlubmVyID0gbmV3IFNwaW5uZXIoS3ViZXJuZXRlcy5sb2FkQ29uZmlncygpKS5zcGluKHRhcmdldCk7ICAgIFxyXG4gICAgXHRcdCRodHRwKHtcclxuXHRcdFx0XHR1cmw6IFwiL2phdmEvY29uc29sZS9hcGkvZmlsZVBhY2thZ2UvaGFuZGxlU3FsRmlsZVwiLFxyXG5cdFx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXHJcblx0XHRcdFx0cGFyYW1zOiB7dHlwZTogZGF0YS50eXBlLCBvcHQ6IGRhdGEub3B0fSxcdFx0XHRcdFxyXG5cdFx0XHRcdGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcclxuXHRcdFx0XHRcdGl0ZW06IGRhdGEuaXRlbSwgXHJcblx0XHRcdFx0XHRjb250ZW50OiBkYXRhLmNvbnRlbnRcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHR9KS5zdWNjZXNzKChkYXRhLGhlYWRlcixjb25maWcsc3RhdHVzKSA9PiB7XHJcblx0XHRcdCBcdCAgJChcIiNsb2FkXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgS3ViZXJuZXRlcy5yZW1vdmVNYXNrKCk7XHJcbiAgICAgICAgICBzaGFyZVVwZGF0ZShkYXRhKTtcclxuXHRcdFx0fSkuZXJyb3IoKGRhdGEsaGVhZGVyLGNvbmZpZyxzdGF0dXMpID0+IHtcdFxyXG4gICAgICAgICAgJChcIiNsb2FkXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgS3ViZXJuZXRlcy5yZW1vdmVNYXNrKCk7XHRcdFx0XHRcclxuXHRcdFx0fSk7XHJcbiAgICBcdH0pO1xyXG5cclxuICAgIFx0JHNjb3BlLiRvbihcInJlcGxhY2VcIiwgKGV2ZW50LCBkYXRhKSA9PiB7XHJcbiAgICBcdFx0JGh0dHAoe1xyXG5cdFx0XHRcdHVybDogXCIvamF2YS9jb25zb2xlL2FwaS9maWxlUGFja2FnZS9oYW5kbGVTcWxGaWxlXCIsXHJcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcclxuXHRcdFx0XHRwYXJhbXM6IHt0eXBlOiBkYXRhLnR5cGUsIG9wdDogZGF0YS5vcHR9LFx0XHRcdFx0XHJcblx0XHRcdFx0ZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xyXG5cdFx0XHRcdFx0aXRlbTogZGF0YS5pdGVtLCBcclxuXHRcdFx0XHRcdGNvbnRlbnQ6IGRhdGEuY29udGVudFxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdH0pLnN1Y2Nlc3MoKGRhdGEsaGVhZGVyLGNvbmZpZyxzdGF0dXMpID0+IHtcclxuXHRcdFx0XHRzaGFyZVVwZGF0ZShkYXRhKTtcclxuXHRcdFx0fSkuZXJyb3IoKGRhdGEsaGVhZGVyLGNvbmZpZyxzdGF0dXMpID0+IHtcclxuXHRcdFx0XHRDb25maWdzLmN1c3RvbUFsZXJ0KFwi5o+Q56S6XCIsIFwi6ISa5pys5pu/5o2i5oiW5b2S5qGj5aSx6LSl77yBXCIsICcnLG51bGwsIDAsIFwiZXJyb3JcIik7XHJcblx0XHRcdH0pICAgIFx0XHRcclxuICAgIFx0fSk7IFxyXG5cclxuICAgIFx0ZnVuY3Rpb24gc2hhcmVVcGRhdGUgKGRhdGEpe1xyXG4gICAgICAgICAgICAkc2NvcGUuZmlsdGVyUmVzdWx0ID0gJHNjb3BlLm1vZGVsID0gU3lzdGVtTW9kZWwuc3FsSW5mbyA9IGRhdGEuZGF0YTsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcclxuICAgICAgICAgICAgaWYoJHNjb3BlLnggIT0gXCJhbGxcIil7XHJcbiAgICAgICAgXHRcdGFuZ3VsYXIuZm9yRWFjaCgkc2NvcGUuZmlsdGVyUmVzdWx0LCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgXHRcdGlmKGl0ZW0uY2l0eU5hbWUgPT0gJHNjb3BlLngpXHJcbiAgICAgICAgICAgXHRcdCBcdHJlc3VsdC5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIFx0XHR9KTtcclxuICAgICAgICBcdFx0JHNjb3BlLmZpbHRlclJlc3VsdCA9IHJlc3VsdDtcclxuICAgICAgICBcdFx0cmVzdWx0ID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmKCRzY29wZS55ICE9IFwiYWxsXCIpe1xyXG4gICAgICAgIFx0XHRhbmd1bGFyLmZvckVhY2goJHNjb3BlLmZpbHRlclJlc3VsdCwgKGl0ZW0pID0+IHtcclxuICAgICAgICAgIFx0XHRcdGlmKGl0ZW0uZGlzdHJpY3ROYW1lID09ICRzY29wZS55KVxyXG4gICAgICAgICAgIFx0XHQgXHRcdHJlc3VsdC5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIFx0XHR9KTtcclxuICAgICAgICBcdFx0JHNjb3BlLmZpbHRlclJlc3VsdCA9IHJlc3VsdDtcclxuICAgICAgICBcdFx0cmVzdWx0ID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgXHQkc2NvcGUudGFibGVQYXJhbXMuc2V0dGluZ3Moe1xyXG4gICAgICAgICAgXHRcdGRhdGFzZXQ6ICRzY29wZS5maWx0ZXJSZXN1bHRcclxuICAgICAgICBcdH0pOyBcclxuICAgIFx0fSBcclxuXHJcbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZVNxbFN0YXR1cyh1cmw6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBpdGVtcyA9IFtdO1xyXG4gICAgICAgIGlmKCRzY29wZS5tb2RlbCAmJiAkc2NvcGUubW9kZWwubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICBhbmd1bGFyLmZvckVhY2goJHNjb3BlLm1vZGVsLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBpZigkc2NvcGUuY2hlY2tib3hlcy5pdGVtc1tpdGVtLmlkXSlcclxuICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZihpdGVtcy5sZW5ndGggPD0gMClcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgQ29uZmlncy5jcmVhdGVfbWFzaygpOyAgLy/liJvlu7rpga7nvanlsYJcclxuICAgICAgICBLdWJlcm5ldGVzLmNyZWF0ZV9sb2NhZEVmZmVjdChcIuato+WcqOabtOaWsOaWh+S7tizor7fnqI3nrYnvvIFcIik7IC8v5Yib5bu65pWw5o2u5Yqg6L295pWI5p6c5bGCXHJcblxyXG4gICAgICAgICRodHRwKHtcclxuICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsICAgICAgICAgICAgXHJcbiAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShpdGVtcylcclxuICAgICAgICB9KS5zdWNjZXNzKGZ1bmN0aW9uKGRhdGEsaGVhZGVyLGNvbmZpZyxzdGF0dXMpe1xyXG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGRhdGEuZGF0YSwgZmlsdGVyOyAgICAgICAgICBcclxuICAgICAgICAgIGlmKCRzY29wZS56ICE9ICdhbGwnKXtcclxuICAgICAgICAgICAgcmVzdWx0ID0gW107XHJcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChkYXRhLmRhdGEsIChpdGVtKSA9PntcclxuICAgICAgICAgICAgICBpZigkc2NvcGUuc3RhdHVzW2l0ZW0uc3lzU3RhdHVzXS5sYWJlbCA9PSAkc2NvcGUueilcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZpbHRlciA9IHJlc3VsdDtcclxuXHJcbiAgICAgICAgICBpZigkc2NvcGUueCAhPSAnYWxsJyl7XHJcbiAgICAgICAgICAgIGZpbHRlciA9IFtdO1xyXG4gICAgICAgICAgICB2YXIgdG1wID0gW107XHJcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChyZXN1bHQsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYoJHNjb3BlLnggPT0gaXRlbS5jaXR5TmFtZSlcclxuICAgICAgICAgICAgICAgIHRtcC5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGZpbHRlciA9IHRtcDtcclxuXHJcbiAgICAgICAgICAgIGlmKCRzY29wZS55ICE9ICdhbGwnKXtcclxuICAgICAgICAgICAgICBmaWx0ZXIgPSBbXTtcclxuICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2godG1wLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoJHNjb3BlLnkgPT0gaXRlbS5kaXN0cmljdE5hbWUpXHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlci5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBcclxuICAgICAgICAgICQoXCIjbG9hZFwiKS5yZW1vdmUoKTtcclxuICAgICAgICAgIEt1YmVybmV0ZXMucmVtb3ZlTWFzaygpO1xyXG4gICAgICAgICAgJHNjb3BlLnRhYmxlUGFyYW1zLnNldHRpbmdzKHtcclxuICAgICAgICAgICAgZGF0YXNldDogZmlsdGVyXHJcbiAgICAgICAgICB9KTsgXHJcbiAgICAgICAgICAvL+WTjeW6lOaIkOWKn1xyXG4gICAgICAgIH0pLmVycm9yKGZ1bmN0aW9uKGRhdGEsaGVhZGVyLGNvbmZpZyxzdGF0dXMpe1xyXG4gICAgICAgICAgLy/lpITnkIblk43lupTlpLHotKUgXHJcbiAgICAgICAgICAkKFwiI2xvYWRcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICBLdWJlcm5ldGVzLnJlbW92ZU1hc2soKTsgXHJcbiAgICAgICAgICBDb25maWdzLmN1c3RvbUFsZXJ0KFwi5o+Q56S6XCIsIFwi5LiA6ZSu5a6h5qC45oiW5b2S5qGj5aSx6LSl77yBXCIsICcnLG51bGwsIDAsIFwiZXJyb3JcIik7ICAgICAgICBcclxuICAgICAgICB9KTsgIFxyXG4gICAgICAgXHJcbiAgICAgIH0gICAgIFxyXG5cdH1dKVxyXG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2luY2x1ZGVzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwic3lzdGVtUGx1Z2luLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwic3lzdGVtSGVscGVycy50c1wiLz5cclxubW9kdWxlIFN5c3RlbXtcclxuXHJcbiAgICBleHBvcnQgdmFyIFN5c3RlbUNvZGVDb250cm9sbGVyID0gY29udHJvbGxlcignU3lzdGVtQ29kZUNvbnRyb2xsZXInLCBbXCIkc2NvcGVcIiwgXCIkdGVtcGxhdGVDYWNoZVwiLCBcIiRsb2NhdGlvblwiLCBcIiRyb3V0ZVBhcmFtc1wiLCBcIiRodHRwXCIsIFwiJHRpbWVvdXRcIiwgJ1N5c3RlbU1vZGVsJywgJ05nVGFibGVQYXJhbXMnLFxyXG4gICAgICAgICgkc2NvcGUsICR0ZW1wbGF0ZUNhY2hlOm5nLklUZW1wbGF0ZUNhY2hlU2VydmljZSwgJGxvY2F0aW9uLCAkcm91dGVQYXJhbXMsICRodHRwLCAkdGltZW91dCwgU3lzdGVtTW9kZWwsIE5nVGFibGVQYXJhbXMpID0+eyAgICAgICAgICAgICAgXHJcblxyXG4gICAgICAgIHNoYXJlSW5pdCgkc2NvcGUpO1xyXG5cclxuICAgICAgICAkc2NvcGUubW9kZWwgPSBTeXN0ZW1Nb2RlbDtcclxuXHJcbiAgICAgICAgJHNjb3BlLnRhYmxlUGFyYW1zID0gbmV3IE5nVGFibGVQYXJhbXMoe2NvdW50OiAyNX0sIHtcclxuXHQgICAgXHRjb3VudHM6IFsyNSwgNTAsIDEwMF0sXHJcbiAgICAgIFx0XHRkYXRhc2V0OiAkc2NvcGUubW9kZWwuc3lzdGVtSW5mb1xyXG4gICBcdFx0fSk7XHJcbiAgICB9XSk7XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJzeXN0ZW1QbHVnaW4udHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJzeXN0ZW1IZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vY29uZmlncy90cy9jdXN0b21BbGVydC50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2t1YmVybmV0ZXMvdHMva3ViZXJuZXRlc0hlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJzeXN0ZW1IZWxwZXJzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vY29uZmlncy90cy9jb25maWdzVXRpbHMudHNcIi8+XHJcblxyXG5tb2R1bGUgU3lzdGVte1xyXG5cdGV4cG9ydCB2YXIgU3lzdGVtTGlzdENvbnRyb2xsZXIgPSBjb250cm9sbGVyKCdTeXN0ZW1MaXN0Q29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRsb2NhdGlvbicsICckaHR0cCcsICckdGVtcGxhdGVDYWNoZScsICdVcGxvYWQnLCAnTmdUYWJsZVBhcmFtcycsICduZ0RpYWxvZycsICdTeXN0ZW1Nb2RlbCcsICgkc2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICR0ZW1wbGF0ZUNhY2hlLCBVcGxvYWQsIE5nVGFibGVQYXJhbXMsIG5nRGlhbG9nLCBTeXN0ZW1Nb2RlbCkgPT4ge1xyXG5cdFx0c2hhcmVJbml0KCRzY29wZSk7XHJcblxyXG4gICAgJHNjb3BlLm1vZGVsU2VydmljZXMgPSBTeXN0ZW1Nb2RlbDtcclxuICAgICRzY29wZS5tb2RlbFNlcnZpY2VzLnVwZGF0ZUV4Y2VsSW5mbygpO1xyXG4gICAgJHNjb3BlLm1vZGVsID0gU3lzdGVtTW9kZWwuc3lzdGVtSW5mb0xpc3Q7ICAgXHJcblxyXG5cdFx0Ly8g6KGo5aS05pi+56S655qE5L+h5oGvXHJcblx0XHQkc2NvcGUuY29sdW1ucz0gW1xyXG4gICAgICAgICAgeyBmaWVsZDogJ2lkJywgdGl0bGU6ICfmk43kvZwnLCBzaG93OiB0cnVlfSxcdFx0XHRcclxuICAgICAgXHRcdHsgZmllbGQ6IFwiY29sbGVjdGlvblwiLCB0aXRsZTogXCLph4fpm4blr7nosaFcIiwgZmlsdGVyOiB7IGNvbGxlY3Rpb246IFwic2VsZWN0XCIgfSwgZmlsdGVyRGF0YTogYm9vbGVhbkNob29zZSgpLCBzaG93OiB0cnVlIH0sXHJcbiAgICAgIFx0XHR7IGZpZWxkOiBcImNpdHlOYW1lXCIsIHRpdGxlOiBcIuW4glwiLCBmaWx0ZXI6IHsgY2l0eU5hbWU6ICd0ZXh0JyB9LCBzaG93OiB0cnVlIH0sXHJcbiAgICAgIFx0XHR7IGZpZWxkOiBcImRpc3RyaWN0TmFtZVwiLCB0aXRsZTogXCLljLov5Y6/XCIsIGZpbHRlcjogeyBkaXN0cmljdE5hbWU6ICd0ZXh0JyB9LCBzaG93OiB0cnVlIH0sXHJcbiAgICAgIFx0XHR7IGZpZWxkOiBcImFyZWFDb2RlXCIsIHRpdGxlOiBcIuihjOaUv+WMuuWIkuS7o+eggVwiLCBmaWx0ZXI6IHthcmVhQ29kZTogJ3RleHQnfSwgc2hvdzogdHJ1ZSB9LFxyXG4gICAgICBcdFx0eyBmaWVsZDogXCJhcmVhTGV2ZWxcIiwgdGl0bGU6IFwi5Zyw5Yy657qn5qyhXCIsIGZpbHRlcjogeyBhcmVhTGV2ZWw6IFwic2VsZWN0XCIgfSwgZmlsdGVyRGF0YTogbGV2ZWxUeXBlKCksIHNob3c6IHRydWUgfSwgICAgICBcdFx0XHJcbiAgICAgIFx0XHR7IGZpZWxkOiBcInN5c05hbWVcIiwgdGl0bGU6IFwi5L+h5oGv57O757uf5ZCN56ewXCIsIGZpbHRlcjogeyBzeXNOYW1lOiBcInRleHRcIiB9LCBzaG93OiB0cnVlIH0sXHJcbiAgICAgIFx0XHR7IGZpZWxkOiBcImRlcGFydG1lbnRNYW5hZ2VyXCIsIHRpdGxlOiBcIuiBlOezu+S6ulwiLCBmaWx0ZXI6IHsgZGVwYXJ0bWVudE1hbmFnZXI6IFwidGV4dFwiIH0sIHNob3c6IHRydWUgfSxcclxuICAgICAgXHRcdHsgZmllbGQ6IFwibWFuYWdlckNvbnRhY3RzXCIsIHRpdGxlOiBcIuiBlOezu+aWueW8j1wiLCBmaWx0ZXI6IHsgbWFuYWdlckNvbnRhY3RzOiBcInRleHRcIiB9LCBzaG93OiB0cnVlIH0sXHJcbiAgICAgIFx0XHR7IGZpZWxkOiBcImRhdGFCYXNlVHlwZVwiLCB0aXRsZTogXCLmlbDmja7lupPnsbvlnotcIiwgZmlsdGVyOiB7IGRhdGFCYXNlVHlwZTogXCJzZWxlY3RcIiB9LCBmaWx0ZXJEYXRhOiBkYXRhYmFzZVR5cGUoKSwgc2hvdzogdHJ1ZX0sXHJcbiAgICAgIFx0XHR7IGZpZWxkOiBcInVzZXJUYWJsZXNwYWNlU3RhdHVzXCIsIHRpdGxlOiBcIm9yYWNsZeeUqOaIt+WQjeihqOepuumXtFwiLCBmaWx0ZXI6IHsgdXNlclRhYmxlc3BhY2VTdGF0dXM6IFwic2VsZWN0XCIgfSwgZmlsdGVyRGF0YTogYm9vbGVhbkNob29zZSgpLCBzaG93OiB0cnVlfSxcclxuICAgICAgXHRcdHsgZmllbGQ6IFwiY2hlY2tvdXRQYXlTdGF0dXNcIiwgdGl0bGU6IFwi5pSv5LuY5L+h5oGv5qCH5YeG6KGo6ISa5pysXCIsIGZpbHRlcjogeyBjaGVja291dFBheVN0YXR1czogXCJzZWxlY3RcIiB9LCBmaWx0ZXJEYXRhOiBib29sZWFuQ2hvb3NlKCksIHNob3c6IHRydWV9LFxyXG4gICAgICBcdFx0eyBmaWVsZDogXCJjaGVja291dEluZGljYXRlU3RhdHVzXCIsIHRpdGxlOiBcIuWPr+aJp+ihjOagh+WHhuihqOiEmuacrFwiLCBmaWx0ZXI6IHsgY2hlY2tvdXRJbmRpY2F0ZVN0YXR1czogXCJzZWxlY3RcIiB9LCBmaWx0ZXJEYXRhOiBib29sZWFuQ2hvb3NlKCksIHNob3c6IHRydWV9LFxyXG4gICAgXHRdO1xyXG5cclxuICBcdC8vIOeCueWHu+afpeeci+aMiemSruS6i+S7tuWkhOeQhuWHveaVsFxyXG4gIFx0JHNjb3BlLnZpZXdDbGljayA9IChzZWxlY3RlZCkgPT4ge1xyXG4gIFx0XHRuZ0RpYWxvZy5vcGVuKHtcclxuICBcdFx0XHR0ZW1wbGF0ZTogJ3N5c3RlbUluZm8uaHRtbCcsXHJcbiAgXHRcdFx0Y29udHJvbGxlcjogJ0NvbmZpZ3MuU3lzdGVtSW5mb0NvbnRyb2xsZXInLFxyXG4gIFx0XHRcdHdpZHRoOiA3OTAsICAgIFx0XHRcdFxyXG4gIFx0XHRcdGNsb3NlQnlEb2N1bWVudDogZmFsc2UsXHJcbiAgXHRcdFx0ZGF0YTogc2VsZWN0ZWQsXHJcbiAgXHRcdFx0Y2xhc3NOYW1lOiAnbmdkaWFsb2ctdGhlbWUtZGVmYXVsdCdcclxuICBcdFx0fSk7ICAgIFx0ICAgIFx0XHRcclxuICBcdH1cclxuICAgIFx0Ly8g6KGo5pWw5o2uXHJcblx0XHQkc2NvcGUudGFibGVQYXJhbXMgPSBuZXcgTmdUYWJsZVBhcmFtcyh7Y291bnQ6IDI1fSwge1xyXG5cdCAgICBcdGNvdW50czogWzI1LCA1MCwgMTAwXSxcclxuICAgICAgXHRkYXRhc2V0OiAkc2NvcGUubW9kZWxcclxuICAgXHR9KTtcclxuXHRcdFxyXG4gICAgLy8g5paH5Lu25LiK5LygXHJcbiAgICAkc2NvcGUudXBMb2FkRXhjZWxGaWxlID0gKCkgPT4ge1xyXG4gICAgICBDb25maWdzLkZpbGVJbnB1dFBsdWdpbigoZmlsZXMpID0+e1xyXG4gICAgICAgIHZhciBmaWxlTmFtZUxpc3QgPSBbXTsgLy/ojrflj5bmlofku7blkI3liJfooahcclxuICAgICAgICBhbmd1bGFyLmZvckVhY2goZmlsZXMsIChmaWxlKSA9PiB7XHJcbiAgICAgICAgICBmaWxlTmFtZUxpc3QucHVzaChmaWxlLm5hbWUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIENvbmZpZ3MuY3JlYXRlX21hc2soKTsgXHJcbiAgICAgICAgS3ViZXJuZXRlcy5jcmVhdGVfbG9jYWRFZmZlY3QoXCLmraPlnKjkuIrkvKDmlofku7YuLi5cIik7XHJcbiAgICAgICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkaW5nJyk7XHJcbiAgICAgICAgdmFyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihLdWJlcm5ldGVzLmxvYWRDb25maWdzKCkpLnNwaW4odGFyZ2V0KTtcclxuXHJcbiAgICAgICAgdmFyIHIgPSBuZXcgUmVzdW1hYmxlKHtcclxuICAgICAgICAgICAgdGFyZ2V0OicvamF2YS9jb25zb2xlL2FwaS9maWxlT3BlcmF0aW9uL2ZpbGUvdXBsb2FkJyxcclxuICAgICAgICAgICAgY2h1bmtTaXplOjEqMTAyNCoxMDI0LFxyXG4gICAgICAgICAgICBzaW11bHRhbmVvdXNVcGxvYWRzOjQsXHJcbiAgICAgICAgICAgIHRlc3RDaHVua3M6IGZhbHNlLFxyXG4gICAgICAgICAgICB0aHJvdHRsZVByb2dyZXNzQ2FsbGJhY2tzOjEsXHJcbiAgICAgICAgICAgIG1ldGhvZDogXCJvY3RldFwiICAgICAgICAgIFxyXG4gICAgICAgICAgICAvKmhlYWRlcnM6IHsgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOFwiXHJcbiAgICAgICAgICAgIH0qL1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmKCFyLnN1cHBvcnQpe1xyXG4gICAgICAgICAgICB0aHJvdyBcIuW9k+WJjea1j+iniOWZqOS4jeaUr+aMgVJlc3VtYWJsZS5qc+aWh+S7tuS4iuS8oFwiOyAgICAgICAgICBcclxuICAgICAgICB9ZWxzZXsgICAgICAgICAgIFxyXG4gICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goZmlsZXMsIChmaWxlKSA9PiB7XHJcbiAgICAgICAgICAgICAgIHIuYWRkRmlsZShmaWxlKTtcclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgIHIub24oJ2ZpbGVBZGRlZCcsIGZ1bmN0aW9uKGZpbGUpeyAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgci51cGxvYWQoKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByLm9uKCdjb21wbGV0ZScsIGZ1bmN0aW9uKCl7ICAgXHJcbiAgICAgICAgICAgICAgICAkKCcjbG9hZG1zZycpLmh0bWwoXCLmiYDku6Xmlofku7bkuIrkvKDlrozmr5Us5q2j5Zyo6K+75Y+W5paH5Lu25Lit55qE5pWw5o2uLOatpOi/h+eoi+aXtumXtOWPr+iDveS8mui+g+mVvyzor7fnqI3nrYkuLi5cIik7ICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgICB0eXBlOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgICAgICAgdXJsOiBVcmxIZWxwZXJzLmpvaW4oXCIvamF2YS9jb25zb2xlL2FwaS9maWxlT3BlcmF0aW9uL2ltcG9ydEV4Y2VsXCIpLFxyXG4gICAgICAgICAgICAgICAgICB0aW1lb3V0OiA4MDAwICogZmlsZU5hbWVMaXN0Lmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZmlsZU5hbWVMaXN0KSxcclxuICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxyXG4gICAgICAgICAgICAgICAgICBjb21wbGV0ZTogKFhNTEh0dHBSZXF1ZXN0LCB0ZXh0U3RhdHVzKSA9PntcclxuICAgICAgICAgICAgICAgICAgICAkKFwiI2xvYWRcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgS3ViZXJuZXRlcy5yZW1vdmVNYXNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoWE1MSHR0cFJlcXVlc3Quc3RhdHVzID09IDIwMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBDb25maWdzLmN1c3RvbUFsZXJ0KFwi5o+Q56S6XCIsIFwi5pON5L2c5oiQ5YqfOiDmnKzmrKFleGNlbOaWh+S7tuW9leWFpeaIkOWKn++8gVwiLCAnJyxudWxsLCAwLCBcInN1Y2Nlc3NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICBDb25maWdzLmN1c3RvbUFsZXJ0KFwi5o+Q56S6XCIsIFwi5pON5L2c5aSx6LSlOiDmnKzmrKFleGNlbOaWh+S7tuW9leWFpeWksei0pVwiLCAnJyxudWxsLCAwLCBcImVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgc3VjY2VzcyA6IChkYXRhKSA9PnsgXHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLm1vZGVsID0gU3lzdGVtTW9kZWwuc3lzdGVtSW5mb0xpc3QgPSBkYXRhLmRhdGE7ICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAkc2NvcGUudGFibGVQYXJhbXMuc2V0dGluZ3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YXNldDogJHNjb3BlLm1vZGVsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7ICAgIFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBlcnJvcjogKE1MSHR0cFJlcXVlc3QsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSA9PntcclxuICAgICAgICAgICAgICAgICAgICAvL0NvbmZpZ3MuY3VzdG9tQWxlcnQoXCLmj5DnpLpcIiwgXCLmk43kvZzlpLHotKU6IOacrOasoWV4Y2Vs5paH5Lu25b2V5YWl5aSx6LSlLCBcIiArIHRleHRTdGF0dXMsICcnLG51bGwsIDAsIFwiZXJyb3JcIik7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pOyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHIub24oJ2ZpbGVQcm9ncmVzcycsIGZ1bmN0aW9uKGZpbGUpeyAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgJCgnI2xvYWRtc2cnKS5odG1sKFwi5LiK5Lyg5paH5Lu2OlwiICsgZmlsZS5maWxlTmFtZSArIFwiIFwiICsgTWF0aC5mbG9vcihyLnByb2dyZXNzKCkqMTAwKSArICclJyk7XHJcbiAgICAgICAgICAgICAgICAvL0t1YmVybmV0ZXMuY3JlYXRlX2xvY2FkRWZmZWN0KFwi5LiK5Lyg5paH5Lu2OlwiICsgZmlsZS5uYW1lICsgXCIgXCIgKyBNYXRoLmZsb29yKHIucHJvZ3Jlc3MoKSoxMDApICsgJyUnKTsgLy/liJvlu7rmlbDmja7liqDovb3mlYjmnpzlsYJcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvL+ino+WGs+S4jeWQjOmHjeWkjemAieaLqeebuOWQjOaWh+S7tlxyXG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZmlsZS11cGxvYWRzXCIpO1xyXG4gICAgICAgICAgICBpZihudWxsICE9IGVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgZWxlbWVudC5vdXRlckhUTUwgPSAgZWxlbWVudC5vdXRlckhUTUw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0sIHRydWUpO1xyXG4gICAgfSBcclxuXHJcblx0XHQkc2NvcGUudXBMb2FkRXhjZWxGaWxlcyA9IChmaWxlcykgPT57XHJcbiAgICAgICAgdmFyIGZpbGVOYW1lTGlzdCA9IFtdOyAvL+iOt+WPluaWh+S7tuWQjeWIl+ihqFxyXG4gICAgICAgIGFuZ3VsYXIuZm9yRWFjaChmaWxlcywgKGZpbGUpID0+IHtcclxuICAgICAgICAgIGZpbGVOYW1lTGlzdC5wdXNoKGZpbGUubmFtZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICBcclxuICAgICAgICBDb25maWdzLmNyZWF0ZV9tYXNrKCk7IFxyXG4gICAgICAgIEt1YmVybmV0ZXMuY3JlYXRlX2xvY2FkRWZmZWN0KFwi5q2j5Zyo5LiK5Lyg5paH5Lu2Li4uXCIpO1xyXG4gICAgICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGluZycpO1xyXG4gICAgICAgIHZhciBzcGlubmVyID0gbmV3IFNwaW5uZXIoS3ViZXJuZXRlcy5sb2FkQ29uZmlncygpKS5zcGluKHRhcmdldCk7XHJcblxyXG4gICAgICAgIHZhciByID0gbmV3IFJlc3VtYWJsZSh7XHJcbiAgICAgICAgICAgIHRhcmdldDonL2phdmEvY29uc29sZS9hcGkvZmlsZU9wZXJhdGlvbi9maWxlL3VwbG9hZCcsXHJcbiAgICAgICAgICAgIGNodW5rU2l6ZToxKjEwMjQqMTAyNCxcclxuICAgICAgICAgICAgc2ltdWx0YW5lb3VzVXBsb2Fkczo0LFxyXG4gICAgICAgICAgICB0ZXN0Q2h1bmtzOiBmYWxzZSxcclxuICAgICAgICAgICAgdGhyb3R0bGVQcm9ncmVzc0NhbGxiYWNrczoxLFxyXG4gICAgICAgICAgICBtZXRob2Q6IFwib2N0ZXRcIiAgICAgICAgICBcclxuICAgICAgICAgICAgLypoZWFkZXJzOiB7ICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLThcIlxyXG4gICAgICAgICAgICB9Ki9cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZighci5zdXBwb3J0KXtcclxuICAgICAgICAgICAgdGhyb3cgXCLlvZPliY3mtY/op4jlmajkuI3mlK/mjIFSZXN1bWFibGUuanPmlofku7bkuIrkvKBcIjsgICAgICAgICAgXHJcbiAgICAgICAgfWVsc2V7ICAgICAgICAgICBcclxuICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGZpbGVzLCAoZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICByLmFkZEZpbGUoZmlsZSk7XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICByLm9uKCdmaWxlQWRkZWQnLCBmdW5jdGlvbihmaWxlKXsgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHIudXBsb2FkKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgci5vbignY29tcGxldGUnLCBmdW5jdGlvbigpeyAgIFxyXG4gICAgICAgICAgICAgICAgJCgnI2xvYWRtc2cnKS5odG1sKFwi5omA5Lul5paH5Lu25LiK5Lyg5a6M5q+VLOato+WcqOivu+WPluaWh+S7tuS4reeahOaVsOaNrizmraTov4fnqIvml7bpl7Tlj6/og73kvJrovoPplb8s6K+356iN562JLi4uXCIpOyAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgdHlwZTogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICAgIHVybDogVXJsSGVscGVycy5qb2luKFwiL2phdmEvY29uc29sZS9hcGkvZmlsZU9wZXJhdGlvbi9pbXBvcnRFeGNlbFwiKSxcclxuICAgICAgICAgICAgICAgICAgdGltZW91dDogODAwMCAqIGZpbGVOYW1lTGlzdC5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGZpbGVOYW1lTGlzdCksXHJcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcclxuICAgICAgICAgICAgICAgICAgY29tcGxldGU6IChYTUxIdHRwUmVxdWVzdCwgdGV4dFN0YXR1cykgPT57XHJcbiAgICAgICAgICAgICAgICAgICAgJChcIiNsb2FkXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIEt1YmVybmV0ZXMucmVtb3ZlTWFzaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKFhNTEh0dHBSZXF1ZXN0LnN0YXR1cyA9PSAyMDApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgQ29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuaTjeS9nOaIkOWKnzog5pys5qyhZXhjZWzmlofku7blvZXlhaXmiJDlip/vvIFcIiwgJycsbnVsbCwgMCwgXCJzdWNjZXNzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgQ29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuaTjeS9nOWksei0pTog5pys5qyhZXhjZWzmlofku7blvZXlhaXlpLHotKVcIiwgJycsbnVsbCwgMCwgXCJlcnJvclwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgOiAoZGF0YSkgPT57IFxyXG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5tb2RlbCA9IFN5c3RlbU1vZGVsLnN5c3RlbUluZm9MaXN0ID0gZGF0YS5kYXRhOyAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnRhYmxlUGFyYW1zLnNldHRpbmdzKHtcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXQ6ICRzY29wZS5tb2RlbFxyXG4gICAgICAgICAgICAgICAgICAgIH0pOyAgICBcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgZXJyb3I6IChNTEh0dHBSZXF1ZXN0LCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgPT57XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Db25maWdzLmN1c3RvbUFsZXJ0KFwi5o+Q56S6XCIsIFwi5pON5L2c5aSx6LSlOiDmnKzmrKFleGNlbOaWh+S7tuW9leWFpeWksei0pSwgXCIgKyB0ZXh0U3RhdHVzLCAnJyxudWxsLCAwLCBcImVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByLm9uKCdmaWxlUHJvZ3Jlc3MnLCBmdW5jdGlvbihmaWxlKXsgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICQoJyNsb2FkbXNnJykuaHRtbChcIuS4iuS8oOaWh+S7tjpcIiArIGZpbGUuZmlsZU5hbWUgKyBcIiBcIiArIE1hdGguZmxvb3Ioci5wcm9ncmVzcygpKjEwMCkgKyAnJScpO1xyXG4gICAgICAgICAgICAgICAgLy9LdWJlcm5ldGVzLmNyZWF0ZV9sb2NhZEVmZmVjdChcIuS4iuS8oOaWh+S7tjpcIiArIGZpbGUubmFtZSArIFwiIFwiICsgTWF0aC5mbG9vcihyLnByb2dyZXNzKCkqMTAwKSArICclJyk7IC8v5Yib5bu65pWw5o2u5Yqg6L295pWI5p6c5bGCXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy/op6PlhrPkuI3lkIzph43lpI3pgInmi6nnm7jlkIzmlofku7ZcclxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImZpbGUtdXBsb2Fkc1wiKTtcclxuICAgICAgICAgICAgZWxlbWVudC5vdXRlckhUTUwgPSAgZWxlbWVudC5vdXRlckhUTUw7XHJcbiAgICAgICAgfSAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICAvL2V4Y2Vs5LiL6L29XHJcbiAgICAkc2NvcGUuZG93bkxvYWRFeGNlbEZpbGUgPSAoKSA9PnsgICAgICAgIFxyXG4gICAgICAgIENvbmZpZ3MuZG93bmxvYWRGaWxlKCRzY29wZSwgJGh0dHAsICcvamF2YS9jb25zb2xlL2FwaS9maWxlT3BlcmF0aW9uL2ZpbGUvZG93bmxvYWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAkc2NvcGUuZG93bmxvYWRGaWxlUGFja2FnZSA9ICgpID0+e1xyXG4gICAgICAgIENvbmZpZ3MuY3JlYXRlX21hc2soKTsgXHJcbiAgICAgICAgS3ViZXJuZXRlcy5jcmVhdGVfbG9jYWRFZmZlY3QoXCLmraPlnKjkuIvovb3mlofku7Ys6K+356iN562JLi4uXCIpO1xyXG4gICAgICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGluZycpO1xyXG4gICAgICAgIHZhciBzcGlubmVyID0gbmV3IFNwaW5uZXIoS3ViZXJuZXRlcy5sb2FkQ29uZmlncygpKS5zcGluKHRhcmdldCk7XHJcbiAgICAgICAgQ29uZmlncy5kb3dubG9hZEZpbGUoJHNjb3BlLCAkaHR0cCwgJy9qYXZhL2NvbnNvbGUvYXBpL2ZpbGVQYWNrYWdlL2Rvd25sb2FkJywgKCkgPT57XHJcbiAgICAgICAgICAkKFwiI2xvYWRcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICBLdWJlcm5ldGVzLnJlbW92ZU1hc2soKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblx0XHQvL2Jvb2xlYW7pgInmi6nmnaHku7bvvJrmmK8v5ZCmXHJcblx0XHRmdW5jdGlvbiBib29sZWFuQ2hvb3NlKCl7XHJcblx0XHRcdHJldHVybiBbe2lkOiAn5pivJywgdGl0bGU6ICfmmK8nfSwge2lkOiAn5ZCmJywgdGl0bGU6ICflkKYnfV07XHJcblx0XHR9XHJcblx0XHQvLyDmlbDmja7lupPnsbvlnovpgInmi6nmnaHku7bvvJpvcmFjbGUvc3FsIFNlcnZlclxyXG5cdFx0ZnVuY3Rpb24gZGF0YWJhc2VUeXBlKCl7XHJcblx0XHRcdHJldHVybiBbe2lkOiAnb3JhY2xlJywgdGl0bGU6ICdPUkFDTEUnfSwge2lkOiAnc3FsIFNlcnZlcicsIHRpdGxlOiAnU1FMIFNFUlZFUid9XTtcclxuXHRcdH1cclxuXHJcblx0XHQvL2xldmVs6YCJ5oup5p2h5Lu2XHJcblx0XHRmdW5jdGlvbiBsZXZlbFR5cGUoKXtcclxuXHRcdFx0cmV0dXJuIFt7aWQ6ICfnnIEnLCB0aXRsZTogJ+ecgSd9LCB7aWQ6ICfluIInLCB0aXRsZTogJ+W4gid9LCB7aWQ6ICfljr8nLCB0aXRsZTogJ+WOvyd9XTtcclxuXHRcdH1cclxuXHR9XSlcclxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9pbmNsdWRlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cInN5c3RlbVBsdWdpbi50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cInN5c3RlbUhlbHBlcnMudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJzeXN0ZW1TZXJ2aWNlcy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2NvbmZpZ3MvdHMvY29uZmlnc1V0aWxzLnRzXCIvPlxyXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4va3ViZXJuZXRlcy90cy9rdWJlcm5ldGVzSGVscGVycy50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2NvbmZpZ3MvdHMvY3VzdG9tQWxlcnQudHNcIi8+XHJcbi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi9jb25maWdzL3RzL2NvbmZpZ3NEYXRhU2VydmljZS50c1wiLz5cclxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uL2t1YmVybmV0ZXMvdHMvdGVybS50c1wiLz5cclxuXHJcbm1vZHVsZSBTeXN0ZW17XHJcbiAgICBleHBvcnQgdmFyIFN5c3RlbVZlcmlmaWNhdGlvbkNvbnRyb2xsZXIgPSBjb250cm9sbGVyKCdTeXN0ZW1WZXJpZmljYXRpb25Db250cm9sbGVyJywgWyckc2NvcGUnLCAnJGludGVydmFsJywgJyRsb2NhdGlvbicsICckaHR0cCcsICckdGVtcGxhdGVDYWNoZScsICdVcGxvYWQnLCAnTmdUYWJsZVBhcmFtcycsICduZ0RpYWxvZycsICdTeXN0ZW1Nb2RlbCcsICckZWxlbWVudCcsICckdGltZW91dCcsICdDb25maWdzTW9kZWwnLCAnRGF0YU1vZGVsJywgJ1Rlcm1pbmFsU2VydmljZScsICgkc2NvcGUsICRpbnRlcnZhbCwgJGxvY2F0aW9uLCAkaHR0cCwgJHRlbXBsYXRlQ2FjaGUsIFVwbG9hZCwgTmdUYWJsZVBhcmFtcywgbmdEaWFsb2csIFN5c3RlbU1vZGVsLCAkZWxlbWVudCwgJHRpbWVvdXQsIENvbmZpZ3NNb2RlbCwgRGF0YU1vZGVsLCBUZXJtaW5hbFNlcnZpY2UpID0+IHtcclxuXHRcdCAgICBzaGFyZUluaXQoJHNjb3BlKTtcclxuICAgICAgICAkc2NvcGUuY2l0aWVzID0gIGNsYXNzaWZ5Q2l0eShTeXN0ZW1Nb2RlbC5yZWdpb25hbGlzbUluZm8pO1xyXG4gICAgICAgICRzY29wZS5tb2RlbCA9IFN5c3RlbU1vZGVsO1xyXG4gICAgICAgICRzY29wZS50YWJsZURhdGEgPSBudWxsOyAgICAgICBcclxuICAgICAgICAkc2NvcGUuY2hlY2tib3hlcyA9IHtcclxuICAgICAgICAgICAgY2hlY2tlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIGl0ZW1zOiB7fVxyXG4gICAgICAgIH07ICAgICAgICBcclxuICAgICAgICAgIC8vIOihqOaVsOaNrlxyXG4gICAgICAgICRzY29wZS50YWJsZVBhcmFtcyA9IG5ldyBOZ1RhYmxlUGFyYW1zKHtjb3VudDogMjV9LCB7XHJcbiAgICAgICAgICAgIGNvdW50czogWzI1LCA1MCwgMTAwXSxcclxuICAgICAgICAgICAgZGF0YXNldDogJHNjb3BlLnRhYmxlRGF0YVxyXG4gICAgICAgIH0pOyAgXHJcblxyXG4gICAgICAgICRzY29wZS5jaXR5U2VsZWN0ID0gKHgpID0+eyAgICAgICAgICAgXHJcbiAgICAgICAgICBpZih4ICE9ICdhbGwnKXtcclxuICAgICAgICAgICAgJHNjb3BlLmNvdW50cmllcyA9IGNsYXNzaWZ5Q291bnRyeShTeXN0ZW1Nb2RlbC5yZWdpb25hbGlzbUluZm8sIHgpOyAgXHJcbiAgICAgICAgICAgICRodHRwKHtcclxuICAgICAgICAgICAgICB1cmw6IFwiL2phdmEvY29uc29sZS9hcGkvY2hlY2tvdXQvZmluZEJ5Q2l0eVwiLFxyXG4gICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgZGF0YTogeFxyXG4gICAgICAgICAgICB9KS5zdWNjZXNzKChkYXRhLCBoZWFkZXIsIGNvbmZpZywgc3RhdHVzKSA9PiB7IFxyXG4gICAgICAgICAgICAgICAgJHNjb3BlLnRhYmxlRGF0YSA9ZGF0YS5kYXRhOyAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgJHNjb3BlLnRhYmxlUGFyYW1zLnNldHRpbmdzKHtcclxuICAgICAgICAgICAgICAgICAgZGF0YXNldDogJHNjb3BlLnRhYmxlRGF0YVxyXG4gICAgICAgICAgICAgICAgfSk7ICAgICAgICBcclxuICAgICAgICAgICAgfSkuZXJyb3IoKGRhdGEsIGhlYWRlciwgY29uZmlnLCBzdGF0dXMpID0+IHsgXHJcbiAgICAgICAgICAgICAgdGhyb3cgXCLor7fmsYLlpLHotKVcIiAgICAgICAgIFxyXG4gICAgICAgICAgICB9KTsgICAgICAgXHJcbiAgICAgICAgICB9ZWxzZXsgXHJcbiAgICAgICAgICAgICRzY29wZS5jb3VudHJpZXM9W107ICAgICAgICAgIFxyXG4gICAgICAgICAgICAkc2NvcGUueSA9IFwiYWxsXCI7XHJcbiAgICAgICAgICAgICRzY29wZS50YWJsZURhdGEgPSBudWxsO1xyXG4gICAgICAgICAgICAkc2NvcGUuY2hlY2tib3hlcyA9IHtcclxuICAgICAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcclxuICAgICAgICAgICAgICBpdGVtczoge31cclxuICAgICAgICAgICAgfTsgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBcclxuXHJcbiAgICAgICAgJHNjb3BlLmNvdW50cnlTZWxlY3QgPSAoeSkgPT4geyAgICAgICAgIFxyXG4gICAgICAgICAgaWYoeSAhPSAnYWxsJyl7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcclxuICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKCRzY29wZS50YWJsZURhdGEsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYoaXRlbS5kaXN0cmljdE5hbWUgPT0geSlcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgJHNjb3BlLnRhYmxlUGFyYW1zLnNldHRpbmdzKHtcclxuICAgICAgICAgICAgICBkYXRhc2V0OiByZXN1bHRcclxuICAgICAgICAgICAgfSk7IFxyXG4gICAgICAgICAgfWVsc2V7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICRzY29wZS50YWJsZVBhcmFtcy5zZXR0aW5ncyh7XHJcbiAgICAgICAgICAgICAgZGF0YXNldDogJHNjb3BlLnRhYmxlRGF0YVxyXG4gICAgICAgICAgICB9KTsgICAgICAgICAgICBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICRzY29wZS5jaGVja1NRTFNFUlZFUiA9ICgpID0+IHtcclxuICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICoqICDmo4Dmn6XmmK/lkKbmnInpu5jorqTmoIflh4booajmsYfmgLvlupNcclxuICAgICAgICAgICoqL1xyXG4gICAgICAgICAgdmFyIGFuc3dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBDb25maWdzTW9kZWwub3JhY2xlUGFyYW0ubGVuZ3RoOyArK2kpIHtcclxuICAgICAgICAgICAgaWYoQ29uZmlnc01vZGVsLm9yYWNsZVBhcmFtW2ldLnR5cGUgPT0gMSl7XHJcbiAgICAgICAgICAgICAgYW5zd2VyID0gdHJ1ZVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYoYW5zd2VyID09IGZhbHNlKXtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAg5o+Q56S65rKh5pyJ6YWN572u5qCH5YeG6KGo5rGH5oC75bqTXHJcbiAgICAgICAgICAgICoqL1xyXG4gICAgICAgICAgICBDb25maWdzLmN1c3RvbUFsZXJ0KFwi5o+Q56S6XCIsIFwi5pON5L2c5aSx6LSlOuayoeaciemFjee9rum7mOiupOeahOagh+WHhuihqOaxh+aAu+W6k1wiLCAnJyxudWxsLCAwLCBcImVycm9yXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdmFyIHNlbGVjdGVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgIGlmKCRzY29wZS50YWJsZURhdGEgJiYgJHNjb3BlLnRhYmxlRGF0YS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkc2NvcGUudGFibGVEYXRhLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICAgICAgdmFyIGl0ZW0gPSAkc2NvcGUudGFibGVEYXRhW2ldO1xyXG4gICAgICAgICAgICAgIGlmKCRzY29wZS5jaGVja2JveGVzLml0ZW1zW2l0ZW0uaWRdKXtcclxuICAgICAgICAgICAgICAgIGlmKGl0ZW0uY29sbGVjdGlvbiA9PSAn5ZCmJyl7ICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAgICAqKuaPkOekuuWHuueOsOayoeaciemHh+mbhuaVsOaNrueahOS/oeaBr+ezu+e7n1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZGVcclxuICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgICAgQ29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuaTjeS9nOWksei0pTrpgInmi6nnmoTns7vnu5/lrZjlnKjmsqHmnInmlbDmja7nmoTns7vnu59cIiwgJycsbnVsbCwgMCwgXCJlcnJvclwiKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaXRlbVtcIl9rZXlcIl0gPSBpdGVtLmFyZWFDb2RlICsgXCItXCIgKyBpdGVtLnN5c0NvZGUgKyBcIi1cIiArIGl0ZW0uZGF0YVZlcnNpb247ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYoaXRlbS5kYXRhQmFzZVR5cGUgPT0gJ09SQUNMRScpeyAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICBDb25maWdzLmN1c3RvbUFsZXJ0KFwi5o+Q56S6XCIsIFwi5pON5L2c5aSx6LSlOk9SQUNMReaVsOaNruivt+WcqOacjeWKoembhue+pOeVjOmdouS4reaKveWPluagh+WHhuihqO+8gVwiLCAnJyxudWxsLCAwLCBcImVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICRodHRwKHtcclxuICAgICAgICAgICAgICB1cmw6IFwiL2phdmEvY29uc29sZS9hcGkvY2hlY2tvdXQvZXh0cmFjdExpc3RcIixcclxuICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICAgIGRhdGE6IHNlbGVjdGVkSXRlbXNcclxuICAgICAgICAgICAgfSkuc3VjY2VzcygoZGF0YSwgaGVhZGVyLCBjb25maWcsIHN0YXR1cykgPT4geyAgXHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhkYXRhKTsgICAgICAgICAgICBcclxuICAgICAgIFxyXG4gICAgICAgICAgICB9KS5lcnJvcigoZGF0YSwgaGVhZGVyLCBjb25maWcsIHN0YXR1cykgPT4geyBcclxuICAgICAgICAgICAgICAgIHRocm93IFwi6K+35rGC5aSx6LSlXCIgICAgICAgICBcclxuICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJHNjb3BlLmRlbGV0ZVJvd3MgPSAoKSA9PntcclxuICAgICAgICAgIHZhciAgZmlsdGVyID0gW107XHJcbiAgICAgICAgICBpZigkc2NvcGUudGFibGVEYXRhICYmICRzY29wZS50YWJsZURhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaCgkc2NvcGUudGFibGVEYXRhLCAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmKCRzY29wZS5jaGVja2JveGVzLml0ZW1zW2l0ZW0uaWRdKXtcclxuICAgICAgICAgICAgICAgIGl0ZW1bXCJpbmRleFwiXSA9IGl0ZW0uY2l0eU5hbWUgKyBcIl9cIiArIGl0ZW0uZGlzdHJpY3ROYW1lICsgXCJfXCIgKyBpdGVtLnN5c05hbWUgKyBcIl9cIiArIGl0ZW0ueWVhciArIFwiX+eJiOacrFwiICsgaXRlbS5kYXRhVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgIGZpbHRlci5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7ICAgICAgICAgICAgIFxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIFVJLm11bHRpSXRlbUNvbmZpcm1BY3Rpb25EaWFsb2coPFVJLk11bHRpSXRlbUNvbmZpcm1BY3Rpb25PcHRpb25zPntcclxuICAgICAgICAgICAgY29sbGVjdGlvbjogZmlsdGVyLFxyXG4gICAgICAgICAgICBpbmRleDogJ2luZGV4JyxcclxuICAgICAgICAgICAgb25DbG9zZTogKHJlc3VsdDpib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgICRodHRwKHtcclxuICAgICAgICAgICAgICAgICAgdXJsOiBcIi9qYXZhL2NvbnNvbGUvYXBpL2NoZWNrb3V0L2RlbGV0ZUxpc3RcIixcclxuICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgICAgICAgZGF0YTogZmlsdGVyXHJcbiAgICAgICAgICAgICAgICB9KS5zdWNjZXNzKChkYXRhLCBoZWFkZXIsIGNvbmZpZywgc3RhdHVzKSA9PiB7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgJHNjb3BlLnRhYmxlRGF0YSA9IGRhdGEuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICBpZigkc2NvcGUueSAhPSAnYWxsJyl7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaCgkc2NvcGUudGFibGVEYXRhLCAoaXRlbSkgPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmRpc3RyaWN0TmFtZSA9PSAkc2NvcGUueSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICRzY29wZS50YWJsZURhdGE7XHJcbiAgICAgICAgICAgICAgICAgIH0gICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICRzY29wZS50YWJsZVBhcmFtcy5zZXR0aW5ncyh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YXNldDogcmVzdWx0XHJcbiAgICAgICAgICAgICAgICAgIH0pOyAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9KS5lcnJvcigoZGF0YSwgaGVhZGVyLCBjb25maWcsIHN0YXR1cykgPT4geyBcclxuICAgICAgICAgICAgICAgICAgdGhyb3cgXCLor7fmsYLlpLHotKVcIiAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRpdGxlOiAn5piv5ZCm6ZyA6KaB5Yig6Zmk6YeH6ZuG5pWw5o2u77yfJyxcclxuICAgICAgICAgICAgYWN0aW9uOiAn5Lul5LiL6YeH6ZuG5pWw5o2u5paH5Lu25bCG5Lya6KKr5Yig6ZmkOicsXHJcbiAgICAgICAgICAgIG9rVGV4dDogJ+WIoOmZpCcsXHJcbiAgICAgICAgICAgIG9rQ2xhc3M6ICdidG4tZGFuZ2VyIHNqX2J0bl9jaXInLFxyXG4gICAgICAgICAgICBjdXN0b206IFwi6K+l5Yig6Zmk5pON5L2c5bCG5Lya5b275bqV5Yig6Zmk5pWw5o2u5paH5Lu2LOaYr+WQpuWIoOmZpO+8jOivt+ehruiupO+8gVwiLFxyXG4gICAgICAgICAgICBjdXN0b21DbGFzczogXCJhbGVydCBhbGVydC13YXJuaW5nIHNqX2FsZXJ0LXdhcm5pbmdcIixcclxuICAgICAgICAgICAgY2FuY2VsVGV4dDogXCLlj5bmtohcIixcclxuICAgICAgICAgICAgY2FuY2VsQ2xhc3M6ICdzal9idG5fZ3JleSdcclxuICAgICAgICAgIH0pLm9wZW4oKTsgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJHNjb3BlLmNoZWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgLy92YXIgIHNxbFNlcnZlckRCID0gW107XHJcbiAgICAgICAgICB2YXIgb3JhY2xlREIgPSBbXTsgXHJcbiAgICAgICAgICB2YXIgc2VsZWN0ZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgKiogIOajgOafpeaYr+WQpuaciem7mOiupOagh+WHhuihqOaxh+aAu+W6k1xyXG4gICAgICAgICAgKiovXHJcbiAgICAgICAgICB2YXIgYW5zd2VyID0gZmFsc2U7XHJcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IENvbmZpZ3NNb2RlbC5vcmFjbGVQYXJhbS5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICBpZihDb25maWdzTW9kZWwub3JhY2xlUGFyYW1baV0udHlwZSA9PSAxKXtcclxuICAgICAgICAgICAgICBhbnN3ZXIgPSB0cnVlXHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGFuc3dlciA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgIOaPkOekuuayoeaciemFjee9ruagh+WHhuihqOaxh+aAu+W6k1xyXG4gICAgICAgICAgICAqKi9cclxuICAgICAgICAgICAgQ29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuaTjeS9nOWksei0pTrmsqHmnInphY3nva7pu5jorqTnmoTmoIflh4booajmsYfmgLvlupNcIiwgJycsbnVsbCwgMCwgXCJlcnJvclwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmKCRzY29wZS50YWJsZURhdGEgJiYgJHNjb3BlLnRhYmxlRGF0YS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkc2NvcGUudGFibGVEYXRhLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICAgICAgdmFyIGl0ZW0gPSAkc2NvcGUudGFibGVEYXRhW2ldO1xyXG4gICAgICAgICAgICAgIGlmKCRzY29wZS5jaGVja2JveGVzLml0ZW1zW2l0ZW0uaWRdKXtcclxuICAgICAgICAgICAgICAgIGlmKGl0ZW0uY29sbGVjdGlvbiA9PSAn5ZCmJyl7ICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAgICAqKuaPkOekuuWHuueOsOayoeaciemHh+mbhuaVsOaNrueahOS/oeaBr+ezu+e7n1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZGVcclxuICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgICAgQ29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuaTjeS9nOWksei0pTrpgInmi6nnmoTns7vnu5/lrZjlnKjmsqHmnInmlbDmja7nmoTns7vnu59cIiwgJycsbnVsbCwgMCwgXCJlcnJvclwiKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaXRlbVtcIl9rZXlcIl0gPSBpdGVtLmFyZWFDb2RlICsgXCItXCIgKyBpdGVtLnN5c0NvZGUgKyBcIi1cIiArIGl0ZW0uZGF0YVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICBpZihpdGVtLmRhdGFCYXNlVHlwZSA9PSAnT1JBQ0xFJyl7ICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIG9yYWNsZURCLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgIOatpOWkhOmcgOimgeajgOafpeaVsOaNruaYr+WQpuW3suaMgui9veOAgeato+WcqOi/geenu+OAglxyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICB2YXIgIGV4aXRlZCA9ICBLdWJlcm5ldGVzLmNoZWNrRm9yQ3JlYXRlT3JhY2xlKERhdGFNb2RlbC50cmFuc2ZlclRhc2tzLCBzZWxlY3RlZEl0ZW1zKTsgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZihleGl0ZWQubGVuZ3RoID4gMCApe1xyXG4gICAgICAgICAgICAgIENvbmZpZ3MuY3VzdG9tQWxlcnQoXCLmj5DnpLpcIiwgXCLmk43kvZzlpLHotKU6IOato+WcqOi/geenu+eahOaVsOaNruS4jeiDveaJp+ihjOagoemqjOaTjeS9nO+8gVwiLCAnJywgbnVsbCwgMCwgXCJlcnJvclwiKTsgXHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgIOWmguaenOaYr09yYWNsZeaVsOaNru+8jOWFiOWQr+WKqG9yYWNsZeaVsOaNrlxyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZihvcmFjbGVEQi5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gob3JhY2xlREIsIChpdGVtKSA9PntcclxuICAgICAgICAgICAgICAgIEt1YmVybmV0ZXMuY3JlYXRlUkMoe1xyXG4gICAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLl9rZXksXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHN5c3RlbTogaXRlbS5zeXNDb2RlLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogaXRlbS5kYXRhVmVyc2lvbi50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvbjogaXRlbS5hcmVhQ29kZS50b1N0cmluZygpXHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBjaXR5TmFtZTogaXRlbS5jaXR5TmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBkaXN0cmljdE5hbWU6IGl0ZW0uZGlzdHJpY3ROYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIHN5c3RlbU5hbWU6IGl0ZW0uc3lzTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBpZDogaXRlbS5kYXRhSWQrXCJcIixcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiBpdGVtLnllYXIsXHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGbGFnOiBpdGVtLmNoZWNrb3V0RmxhZ1xyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBwYXRoOiBpdGVtLnBhdGgrXCJhcHAvXCIsXHJcbiAgICAgICAgICAgICAgICAgIGlzVGFyZ2V0OiBcImZhbHNlXCIsXHJcbiAgICAgICAgICAgICAgICAgIGlzRXh0cmFjdDogaXRlbS5leHRyYWN0U3RhdHVzXHJcbiAgICAgICAgICAgICAgfSwgKHJjKSA9PnsgXHJcbiAgICAgICAgICAgICAgICAgIC8vS3ViZXJuZXRlcy5jb25uZWN0T3JhY2xlKCRodHRwLCAkdGltZW91dCwgXCIvamF2YS9jb25zb2xlL2FwaS9jb25uZWN0T3JhY2xlXCIsIFwiY3JlYXRlXCIsIHJjLCAwKTsgIFxyXG4gICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICR0aW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCcva3ViZXJuZXRlcy9uYW1lc3BhY2UvZGVmYXVsdC9yZXBsaWNhdGlvbkNvbnRyb2xsZXJzJyk7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICAkaHR0cCh7XHJcbiAgICAgICAgICAgICAgdXJsOiBcIi9qYXZhL2NvbnNvbGUvYXBpL2NoZWNrb3V0L2NoZWNrTGlzdFwiLFxyXG4gICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgZGF0YTogc2VsZWN0ZWRJdGVtc1xyXG4gICAgICAgICAgICB9KS5zdWNjZXNzKChkYXRhLCBoZWFkZXIsIGNvbmZpZywgc3RhdHVzKSA9PiB7ICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAkc2NvcGUudGFibGVEYXRhID0gZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcclxuICAgICAgICAgICAgICBpZigkc2NvcGUueSAhPSAnYWxsJyl7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKCRzY29wZS50YWJsZURhdGEsIChpdGVtKSA9PntcclxuICAgICAgICAgICAgICAgICAgaWYoaXRlbS5kaXN0cmljdE5hbWUgPT0gJHNjb3BlLnkpXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICRzY29wZS50YWJsZURhdGE7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAkc2NvcGUudGFibGVQYXJhbXMuc2V0dGluZ3Moe1xyXG4gICAgICAgICAgICAgICAgZGF0YXNldDogcmVzdWx0XHJcbiAgICAgICAgICAgICAgfSk7ICAgICAgIFxyXG4gICAgICAgICAgICB9KS5lcnJvcigoZGF0YSwgaGVhZGVyLCBjb25maWcsIHN0YXR1cykgPT4geyBcclxuICAgICAgICAgICAgICAgIHRocm93IFwi6K+35rGC5aSx6LSlXCIgICAgICAgICBcclxuICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgfSAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB3YXRjaCBmb3IgY2hlY2sgYWxsIGNoZWNrYm94XHJcbiAgICAgICAgJHNjb3BlLiR3YXRjaChmdW5jdGlvbigpIHtcclxuICAgICAgICAgIHJldHVybiAkc2NvcGUuY2hlY2tib3hlcy5jaGVja2VkO1xyXG4gICAgICAgIH0sIGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICAgICAgICBhbmd1bGFyLmZvckVhY2goJHNjb3BlLnRhYmxlRGF0YSwgZnVuY3Rpb24oaXRlbSkge1xyXG4gICAgICAgICAgICAkc2NvcGUuY2hlY2tib3hlcy5pdGVtc1tpdGVtLmlkXSA9IHZhbHVlOyAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIFxyXG4gICAgICAgIC8vIHdhdGNoIGZvciBkYXRhIGNoZWNrYm94ZXNcclxuICAgICAgICAkc2NvcGUuJHdhdGNoKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgcmV0dXJuICRzY29wZS5jaGVja2JveGVzLml0ZW1zO1xyXG4gICAgICAgIH0sIGZ1bmN0aW9uKHZhbHVlcykge1xyXG4gICAgICAgICAgJHNjb3BlLmNoZWNrYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgZm9yKHZhciBpbmRleCBpbiB2YWx1ZXMpe1xyXG4gICAgICAgICAgICBpZih2YWx1ZXNbaW5kZXhdID09IHRydWUpe1xyXG4gICAgICAgICAgICAgICRzY29wZS5jaGVja2FibGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ICAgICAgIFxyXG4gICAgICAgICAgdmFyIGNoZWNrZWQgPSAwLCB1bmNoZWNrZWQgPSAwLCB0b3RhbCA9IC0xO1xyXG4gICAgICAgICAgaWYoJHNjb3BlLnRhYmxlRGF0YSAmJiAoJHNjb3BlLnRhYmxlRGF0YSBpbnN0YW5jZW9mIEFycmF5KSlcclxuICAgICAgICAgICAgdG90YWwgPSAkc2NvcGUudGFibGVEYXRhLmxlbmd0aDtcclxuICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaCgkc2NvcGUudGFibGVEYXRhLCBmdW5jdGlvbihpdGVtKSB7XHJcbiAgICAgICAgICAgIGNoZWNrZWQgICArPSAgKCRzY29wZS5jaGVja2JveGVzLml0ZW1zW2l0ZW0uaWRdKSB8fCAwO1xyXG4gICAgICAgICAgICB1bmNoZWNrZWQgKz0gTnVtYmVyKCEkc2NvcGUuY2hlY2tib3hlcy5pdGVtc1tpdGVtLmlkXSkgfHwgMDtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGlmICgodW5jaGVja2VkID09IDApIHx8IChjaGVja2VkID09IDApKSB7XHJcbiAgICAgICAgICAgICRzY29wZS5jaGVja2JveGVzLmNoZWNrZWQgPSAoY2hlY2tlZCA9PSB0b3RhbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBncmF5ZWQgY2hlY2tib3hcclxuICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudCgkZWxlbWVudFswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwic2VsZWN0LWFsbFwiKSkucHJvcChcImluZGV0ZXJtaW5hdGVcIiwgKGNoZWNrZWQgIT0gMCAmJiB1bmNoZWNrZWQgIT0gMCkpO1xyXG4gICAgICAgIH0sIHRydWUpOyBcclxuXHJcbiAgICAgICAgJHNjb3BlLnVwZGF0ZSA9IChlbnRpdHkpID0+IHtcclxuICAgICAgICAgIG5nRGlhbG9nLm9wZW4oe1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJ3N5c1ZlcmlmaWNhdGlvblVwZGF0ZS5odG1sJyxcclxuICAgICAgICAgICAgY29udHJvbGxlcjogJ0NvbmZpZ3Muc3lzVmVyVXBkYXRlQ29udHJvbGxlcicsXHJcbiAgICAgICAgICAgIHdpZHRoOiA5MDAsIFxyXG4gICAgICAgICAgICBoZWlnaHQ6IDYwMCwgICAgICAgICBcclxuICAgICAgICAgICAgY2xvc2VCeURvY3VtZW50OiBmYWxzZSxcclxuICAgICAgICAgICAgZGF0YTogZW50aXR5LFxyXG4gICAgICAgICAgICBzY29wZTogJHNjb3BlLCBcclxuICAgICAgICAgICAgY2xhc3NOYW1lOiAnbmdkaWFsb2ctdGhlbWUtZGVmYXVsdCdcclxuICAgICAgICAgIH0pOyAgXHJcbiAgICAgICAgfSBcclxuXHJcbiAgICAgICAgJHNjb3BlLiRvbigndXBkYXRlUm93JywgKGV2ZW50LCBkYXRhKSA9PiB7XHJcbiAgICAgICAgICAkaHR0cCh7XHJcbiAgICAgICAgICAgIHVybDogXCIvamF2YS9jb25zb2xlL2FwaS9jaGVja291dC91cGRhdGVcIixcclxuICAgICAgICAgICAgbWV0aG9kOidQT1NUJywgICAgICAgICAgICBcclxuICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcclxuICAgICAgICAgIH0pLnN1Y2Nlc3MoZnVuY3Rpb24oZGF0YSxoZWFkZXIsY29uZmlnLHN0YXR1cyl7XHJcbiAgICAgICAgICAgIGlmKGhlYWRlciA9PSAyMDApe1xyXG4gICAgICAgICAgICAgIENvbmZpZ3MuY3VzdG9tQWxlcnQoXCLmj5DnpLpcIiwgXCLmk43kvZzmiJDlip8hXCIsICcnLG51bGwsIDAsIFwic3VjY2Vzc1wiKTtcclxuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XHJcbiAgICAgICAgICAgICAgaWYoJHNjb3BlLnkgIT0gJ2FsbCcpe1xyXG4gICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGRhdGEuZGF0YSwgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYoJHNjb3BlLnkgPT0gaXRlbS5kaXN0cmljdE5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH1lbHNlXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBkYXRhLmRhdGE7XHJcbiAgICAgICAgICAgICAgJHNjb3BlLnRhYmxlUGFyYW1zLnNldHRpbmdzKHtcclxuICAgICAgICAgICAgICAgIGRhdGFzZXQ6IHJlc3VsdFxyXG4gICAgICAgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIENvbmZpZ3MuY3VzdG9tQWxlcnQoXCLmj5DnpLpcIiwgXCLmk43kvZzlpLHotKUhXCIsICcnLG51bGwsIDAsIFwiZXJyb3JcIik7XHJcbiAgICAgICAgICB9KS5lcnJvcihmdW5jdGlvbihkYXRhLGhlYWRlcixjb25maWcsc3RhdHVzKXtcclxuICAgICAgICAgICAgQ29uZmlncy5jdXN0b21BbGVydChcIuaPkOekulwiLCBcIuaTjeS9nOWksei0pTrlj5HnlJ/or7fmsYLlpLHotKUs5LiN6IO95Yig6Zmk77yBXCIsICcnLG51bGwsIDAsIFwiZXJyb3JcIik7XHJcbiAgICAgICAgICB9KTsgICAgICAgICBcclxuICAgICAgICB9KTsgXHJcblxyXG4gICAgICAgICRzY29wZS5vcGVuTG9nID0gKGVudGl0eSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coZW50aXR5KTtcclxuICAgICAgICAgIHZhciBuYW1lID0gZW50aXR5LmFyZWFDb2RlICsgXCJfXCIgKyBlbnRpdHkuc3lzQ29kZSArIFwiX1wiICsgZW50aXR5LmRhdGFWZXJzaW9uXHJcbiAgICAgICAgICB2YXIgY29udGFpbmVyTmFtZSA9IGVudGl0eS5jaXR5TmFtZSArIFwiLVwiICsgZW50aXR5LmRpc3RyaWN0TmFtZSArIFwiLVwiICsgZW50aXR5LnN5c05hbWUgKyBcIi3niYjmnKxcIiArIGVudGl0eS5kYXRhVmVyc2lvbjtcclxuICAgICAgICAgIGVudGl0eVtcIm5hbWVcIl0gPSBuYW1lO1xyXG4gICAgICAgICAgVGVybWluYWxTZXJ2aWNlLm5ld1Rlcm1pbmFsKCRpbnRlcnZhbCwgZW50aXR5LmlkK1wiXCIsIGNvbnRhaW5lck5hbWUsIGVudGl0eSwgXCIvamF2YS9jb25zb2xlL2FwaS9zdGFuZGFyZGV4dHJhY3QvbG9nP3JjTmFtZT1cIiArIG5hbWUsICR0ZW1wbGF0ZUNhY2hlLmdldChVcmxIZWxwZXJzLmpvaW4oS3ViZXJuZXRlcy50ZW1wbGF0ZVBhdGgsICdsb2dTaGVsbC5odG1sJykpKTsgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG5cdCAgfV0pO1x0XHJcbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vaW5jbHVkZXMudHNcIi8+XHJcbm1vZHVsZSBOYXZpZ2F0aW9uIHtcclxuXHJcbiAgZXhwb3J0IHZhciBwbHVnaW5OYW1lID0gJ2hhd3Rpby1uYXZpZ2F0aW9uJztcclxuICBleHBvcnQgdmFyIGxvZyA9IExvZ2dlci5nZXQocGx1Z2luTmFtZSk7XHJcbiAgZXhwb3J0IHZhciBfbW9kdWxlID0gYW5ndWxhci5tb2R1bGUocGx1Z2luTmFtZSwgW10pO1xyXG5cclxuICBfbW9kdWxlLnJ1bigoKSA9PnsgICAgXHJcbiAgfSk7XHJcblxyXG4gIF9tb2R1bGUuc2VydmljZSgnSGF3dGlvQnJlYWRjcnVtYnMnLCAoKSA9PiB7XHJcbiAgICB2YXIgX2NvbmZpZyA9IFtdO1xyXG4gICAgdmFyIHNlbGYgPSB7XHJcbiAgICAgIGFwcGx5OiAoY29uZmlnKSA9PiB7XHJcbiAgICAgICAgX2NvbmZpZy5sZW5ndGggPSAwO1xyXG4gICAgICAgIF8uZm9yRWFjaChjb25maWcsIChjcnVtYikgPT4ge1xyXG4gICAgICAgICAgX2NvbmZpZy5wdXNoKGNydW1iKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgZ2V0OiAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIF9jb25maWc7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gc2VsZjtcclxuICB9KTtcclxuXHJcbiAgX21vZHVsZS5zZXJ2aWNlKCdIYXd0aW9TdWJUYWJzJywgKCkgPT4ge1xyXG4gICAgdmFyIF9jb25maWcgPSBbXTtcclxuICAgIHZhciBzZWxmID0ge1xyXG4gICAgICBhcHBseTogKGNvbmZpZykgPT4ge1xyXG4gICAgICAgIF9jb25maWcubGVuZ3RoID0gMDtcclxuICAgICAgICBfLmZvckVhY2goY29uZmlnLCAoY3J1bWIpID0+IHtcclxuICAgICAgICAgIF9jb25maWcucHVzaChjcnVtYik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGdldDogKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBfY29uZmlnO1xyXG4gICAgICB9IFxyXG4gICAgfSBcclxuICAgIHJldHVybiBzZWxmO1xyXG4gIH0pO1xyXG5cclxuICBfbW9kdWxlLmRpcmVjdGl2ZSgnaGF3dGlvUmVsYXRpdmVIcmVmJywgWyckbG9jYXRpb24nLCAoJGxvY2F0aW9uKSA9PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZXN0cmljdDogJ0EnLFxyXG4gICAgICBsaW5rOiAoc2NvcGUsIGVsZW1lbnQsIGF0dHIpID0+IHtcclxuICAgICAgICB2YXIgdGFyZ2V0UGF0aCA9IGF0dHJbJ2hhd3Rpb1JlbGF0aXZlSHJlZiddO1xyXG4gICAgICAgIHZhciB0YXJnZXRIcmVmID0gbmV3IFVSSSgkbG9jYXRpb24udXJsKCkpO1xyXG4gICAgICAgIHRhcmdldEhyZWYuc2VnbWVudCh0YXJnZXRQYXRoKTtcclxuICAgICAgICBlbGVtZW50LmF0dHIoJ2hyZWYnLCB0YXJnZXRIcmVmLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfV0pO1xyXG5cclxuICBfbW9kdWxlLmRpcmVjdGl2ZSgndmlld3BvcnRIZWlnaHQnLCBbJyR3aW5kb3cnLCAnJGRvY3VtZW50JywgKCR3aW5kb3csICRkb2N1bWVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVzdHJpY3Q6ICdBJyxcclxuICAgICAgbGluazogKHNjb3BlLCBlbGVtZW50LCBhdHRyKSA9PiB7XHJcbiAgICAgICAgLy8gbG9nLmRlYnVnKFwiV2luZG93OiBcIiwgJHdpbmRvdyk7XHJcbiAgICAgICAgLy8gbG9nLmRlYnVnKFwiZWxlbWVudDogXCIsIGVsZW1lbnQpO1xyXG4gICAgICAgIHZhciB3aW4gPSAkKCR3aW5kb3cpO1xyXG4gICAgICAgIHZhciByZXNpemVGdW5jID0gKCkgPT4ge1xyXG4gICAgICAgICAgdmFyIHZpZXdwb3J0SGVpZ2h0ID0gd2luLmlubmVySGVpZ2h0KCk7XHJcbiAgICAgICAgICAvLyBsb2cuZGVidWcoXCJWaWV3cG9ydCBoZWlnaHQ6IFwiLCB2aWV3cG9ydEhlaWdodCk7XHJcbiAgICAgICAgICB2YXIgZWxUb3AgPSBlbGVtZW50Lm9mZnNldCgpLnRvcDtcclxuICAgICAgICAgIC8vIGxvZy5kZWJ1ZyhcIkVsZW1lbnQgdG9wOiBcIiwgZWxUb3ApO1xyXG4gICAgICAgICAgdmFyIGhlaWdodCA9IHZpZXdwb3J0SGVpZ2h0IC0gZWxUb3A7XHJcbiAgICAgICAgICBlbGVtZW50LmNzcygnaGVpZ2h0JywgaGVpZ2h0KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHdpbi5vbigncmVzaXplJywgcmVzaXplRnVuYyk7XHJcbiAgICAgICAgZWxlbWVudC5vbignJGRlc3Ryb3knLCAoKSA9PiB7XHJcbiAgICAgICAgICB3aW4ub2ZmKCdyZXNpemUnLCByZXNpemVGdW5jKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzZXRUaW1lb3V0KHJlc2l6ZUZ1bmMsIDUwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1dKTtcclxuXHJcbiAgX21vZHVsZS5kaXJlY3RpdmUoJ2hhd3Rpb01haW5PdXRsZXQnLCBbJ0hhd3Rpb1N1YlRhYnMnLCAoSGF3dGlvU3ViVGFicykgPT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVzdHJpY3Q6ICdBJyxcclxuICAgICAgbGluazogKHNjb3BlLCBlbGVtZW50LCBhdHRycykgPT4ge1xyXG4gICAgICAgIHNjb3BlLnRhYnMgPSBIYXd0aW9TdWJUYWJzO1xyXG4gICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ3RhYnMuZ2V0KCknLCAodGFicykgPT4ge1xyXG4gICAgICAgICAgLy8gbG9nLmRlYnVnKFwic3ViVGFiQ29uZmlnOiBcIiwgc3ViVGFiQ29uZmlnKTtcclxuICAgICAgICAgIGlmICh0YWJzICYmIHRhYnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNsYXNzKCdoaWRkZW4tbmF2Jyk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY3NzKHsgJ21hcmdpbi1sZWZ0JzogJycgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKCdoaWRkZW4tbmF2Jyk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY3NzKHsgJ21hcmdpbi1sZWZ0JzogJ2F1dG8nIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICB9XSk7XHJcblxyXG4gIF9tb2R1bGUuZGlyZWN0aXZlKCdoYXd0aW9UYWJzT3V0bGV0JywgWydIYXd0aW9TdWJUYWJzJywgKEhhd3Rpb1N1YlRhYnMpID0+IHtcclxuICAgIHZhciBpbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVzdHJpY3Q6ICdBRScsXHJcbiAgICAgIHJlcGxhY2U6IHRydWUsXHJcbiAgICAgIHRlbXBsYXRlOiBgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1wZi12ZXJ0aWNhbCBuYXYtcGYtdmVydGljYWwtd2l0aC1zZWNvbmRhcnktbmF2XCIgbmctY29udHJvbGxlcj1cIkRldmVsb3Blci5OYXZCYXJDb250cm9sbGVyXCIgbmctY2xhc3M9XCJnZXRDbGFzcygpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cFwiPlxyXG4gICAgICAgICAgICA8ZGl2IG5nLXJlcGVhdD1cInN1YlRhYiBpbiBzdWJUYWJDb25maWdcIiBuZy1zaG93PVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSB7e3N1YlRhYi5hY3RpdmUgPyAnYWN0aXZlJyA6ICcnfX1cIiA+XHJcbiAgICAgICAgICAgICAgICA8YSBuZy1oaWRlPVwic3ViVGFiLnRlbXBsYXRlXCIgaHJlZj1cInt7c3ViVGFiLmhyZWZ9fVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBuZy1zaG93PVwic3ViVGFiLmNsYXNzXCIgbmctY2xhc3M9XCJzdWJUYWIuY2xhc3NcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxpbWcgbmctc2hvdz1cInN1YlRhYi5pY29uXCIgbmctc3JjPVwie3tzdWJUYWIuaWNvbn19XCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7c3ViVGFiLmxhYmVsfX1cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmctc2hvdz1cInN1YlRhYi50ZW1wbGF0ZVwiIGNvbXBpbGU9XCJzdWJUYWIudGVtcGxhdGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8Lz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgYCxcclxuICAgICAgbGluazogKHNjb3BlLCBlbGVtZW50LCBhdHRycykgPT4ge1xyXG4gICAgICAgIGlmICghaW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vKDxhbnk+JCkoKS5zZXR1cFZlcnRpY2FsTmF2aWdhdGlvbihmYWxzZSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgLy8gaWdub3JlIGlmIHdlIGhhdmVuJ3QgbG9hZGVkIHBhdHRlcm5mbHlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2NvcGUuSGF3dGlvU3ViVGFicyA9IEhhd3Rpb1N1YlRhYnM7XHJcblxyXG4gICAgICAgIHZhciBjb2xsYXBzZWQgPSBmYWxzZTtcclxuICAgICAgICBzY29wZS5nZXRDbGFzcyA9ICgpID0+IHtcclxuICAgICAgICAgIC8vbG9nLmRlYnVnKFwiTXkgY2xhc3M6IFwiLCBlbGVtZW50LmF0dHIoJ2NsYXNzJykpO1xyXG4gICAgICAgICAgaWYgKCFzY29wZS5zdWJUYWJDb25maWcgfHwgIXNjb3BlLnN1YlRhYkNvbmZpZy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdoaWRkZW4nO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGNvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2NvbGxhcHNlZCc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNjb3BlLiRvbignaGF3dGlvQ29sbGFwc2VOYXYnLCAoKSA9PiB7XHJcbiAgICAgICAgICBjb2xsYXBzZWQgPSAhY29sbGFwc2VkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNjb3BlLiR3YXRjaCgnSGF3dGlvU3ViVGFicy5nZXQoKScsIChzdWJUYWJDb25maWcpID0+IHtcclxuICAgICAgICAgIHNjb3BlLnN1YlRhYkNvbmZpZyA9IHN1YlRhYkNvbmZpZztcclxuXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfV0pO1xyXG5cclxuICBfbW9kdWxlLmRpcmVjdGl2ZSgnaGF3dGlvQnJlYWRjcnVtYnNPdXRsZXQnLCBbJ0hhd3Rpb0JyZWFkY3J1bWJzJywgJ0hhd3Rpb1N1YlRhYnMnLCAoSGF3dGlvQnJlYWRjcnVtYnMsIEhhd3Rpb1N1YlRhYnMpID0+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlc3RyaWN0OiAnRScsXHJcbiAgICAgIHNjb3BlOiB7fSxcclxuICAgICAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwibmF2IG5hdmJhci1uYXYgbmF2LWJyZWFkY3J1bWIgbmF2LWJyZWFkY3J1bWJzXCIgbmctc2hvdz1cImJyZWFkY3J1bWJDb25maWdcIiBuZy1jb250cm9sbGVyPVwiRGV2ZWxvcGVyLk5hdkJhckNvbnRyb2xsZXJcIj5cclxuICAgICAgICAgIDxvbCBjbGFzcz1cImJyZWFkY3J1bWJcIj5cclxuICAgICAgICAgICAgPGxpIG5nLXJlcGVhdD1cImJyZWFkY3J1bWIgaW4gYnJlYWRjcnVtYkNvbmZpZ1wiIG5nLXNob3c9XCJpc1ZhbGlkKGJyZWFkY3J1bWIpICYmIGxhYmVsKGJyZWFkY3J1bWIpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwie3ticmVhZGNydW1iLmFjdGl2ZSA/ICdhY3RpdmUnIDogJyd9fVwiXHJcbiAgICAgICAgICAgICAgICBuZy1jbGFzcz1cIiRsYXN0ID8gJ2Ryb3Bkb3duJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8YSBuZy1zaG93PVwiYnJlYWRjcnVtYi5ocmVmXCIgaHJlZj1cInt7YnJlYWRjcnVtYi5ocmVmfX1cIj57e2xhYmVsKGJyZWFkY3J1bWIpfX08L2E+XHJcbiAgICAgICAgICAgICAgPHNwYW4gbmctaGlkZT1cImJyZWFkY3J1bWIuaHJlZlwiPnt7bGFiZWwoYnJlYWRjcnVtYil9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPGxpIG5nLXNob3c9XCJwYWdlVGl0bGVcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBuZy1iaW5kPVwicGFnZVRpdGxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgPC9vbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgYCxcclxuICAgICAgbGluazogKHNjb3BlLCBlbGVtZW50LCBhdHRycykgPT4gIHtcclxuICAgICAgICBzY29wZS5icmVhZGNydW1icyA9IEhhd3Rpb0JyZWFkY3J1bWJzO1xyXG4gICAgICAgIHNjb3BlLnRhYnMgPSBIYXd0aW9TdWJUYWJzO1xyXG4gICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ2JyZWFkY3J1bWJzLmdldCgpJywgKGJyZWFkY3J1bWJDb25maWcpID0+IHtcclxuICAgICAgICAgIHNjb3BlLmJyZWFkY3J1bWJDb25maWcgPSBicmVhZGNydW1iQ29uZmlnOyAgICAgICAgICBcclxuICAgICAgICB9KTtcclxuICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCd0YWJzLmdldCgpJywgKHRhYnMpID0+IHsgICAgICAgIFxyXG4gICAgICAgICAgdmFyIGFjdGl2ZSA9IF8uZmluZCh0YWJzLCAodGFiOmFueSkgPT4gdGFiLmFjdGl2ZSk7XHJcbiAgICAgICAgICBpZiAoYWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHNjb3BlLnBhZ2VUaXRsZSA9IGFjdGl2ZS5sYWJlbDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNjb3BlLnBhZ2VUaXRsZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XSk7XHJcblxyXG4gIF9tb2R1bGUuZGlyZWN0aXZlKCdwbGF0Zm9ybVN1YlRhYnNPdXRsZXQnLCBbJ0hhd3Rpb1N1YlRhYnMnLCAoSGF3dGlvU3ViVGFicykgPT4ge1xyXG4gICAgdmFyIGluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByZXN0cmljdDogJ0FFJyxcclxuICAgICAgcmVwbGFjZTogdHJ1ZSxcclxuICAgICAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LXBmLXZlcnRpY2FsIG5hdi1wZi12ZXJ0aWNhbC13aXRoLXNlY29uZGFyeS1uYXYgc2pfbWVudVwiICBuZy1jb250cm9sbGVyPVwiRGV2ZWxvcGVyLk5hdkJhckNvbnRyb2xsZXJcIiBuZy1jbGFzcz1cImdldENsYXNzKClcIj5cclxuICAgICAgICAgIDx1bCBjbGFzcz1cIm5hdmJhci1sZi1tZW51IFwiICA+XHJcbiAgICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9XCJzdWJUYWIgaW4gc3ViVGFiQ29uZmlnIFwiID5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhwYW5kYWJsZSBjbG9zZWQgXCIgIG5nLXNob3c9XCJzdWJUYWIuaXRlbXMubGVuZ3RoXCIgc3R5bGU9XCIgcGFkZGluZzowO1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlIHNqX21lbnVfbmF2XCIgPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiBzal9tZW51XzAxXCIgPnt7c3ViVGFiLmxhYmVsfX08L2k+IFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJleHBhbmRhYmxlLWJvZHkgIHNqX21lbnVfdWxcIiA+XHJcbiAgICAgICAgICAgICAgICAgIDxsaSBuZy1yZXBlYXQ9XCJpdGVtIGluIHN1YlRhYi5pdGVtc1wiID5cclxuICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwie3tpdGVtLmhyZWZ9fVwiID57e2l0ZW0ubGFiZWx9fTwvYT5cclxuICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZy1oaWRlPVwic3ViVGFiLml0ZW1zLmxlbmd0aFwiIGNsYXNzPVwic2pfbWVudV9uYXZcIiA+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIiBzal9tZW51XzAyXCIgPjwvaT48YSBocmVmPVwie3tzdWJUYWIuaHJlZn19XCI+e3tzdWJUYWIubGFiZWx9fTwvYT4gICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9saT4gIFxyXG4gICAgICAgICAgPC91bD5cclxuICAgICAgICA8L2Rpdj4gXHJcbiAgICAgIGAsXHJcbiAgICAgIGxpbms6IChzY29wZSwgZWxlbWVudCwgYXR0cnMpID0+IHtcclxuICAgICAgICBpZiAoIWluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyg8YW55PiQpKCkuc2V0dXBWZXJ0aWNhbE5hdmlnYXRpb24oZmFsc2UpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBpZiB3ZSBoYXZlbid0IGxvYWRlZCBwYXR0ZXJuZmx5XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNjb3BlLkhhd3Rpb1N1YlRhYnMgPSBIYXd0aW9TdWJUYWJzO1xyXG5cclxuICAgICAgICB2YXIgY29sbGFwc2VkID0gZmFsc2U7XHJcbiAgICAgICAgc2NvcGUuZ2V0Q2xhc3MgPSAoKSA9PiB7XHJcbiAgICAgICAgICAvL2xvZy5kZWJ1ZyhcIk15IGNsYXNzOiBcIiwgZWxlbWVudC5hdHRyKCdjbGFzcycpKTtcclxuICAgICAgICAgIGlmICghc2NvcGUuc3ViVGFiQ29uZmlnIHx8ICFzY29wZS5zdWJUYWJDb25maWcubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnaGlkZGVuJztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChjb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdjb2xsYXBzZWQnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzY29wZS4kb24oJ2hhd3Rpb0NvbGxhcHNlTmF2JywgKCkgPT4ge1xyXG4gICAgICAgICAgY29sbGFwc2VkID0gIWNvbGxhcHNlZDtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzY29wZS4kd2F0Y2goJ0hhd3Rpb1N1YlRhYnMuZ2V0KCknLCAoc3ViVGFiQ29uZmlnKSA9PiB7XHJcbiAgICAgICAgICBzY29wZS5zdWJUYWJDb25maWcgPSBzdWJUYWJDb25maWc7XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1dKTtcclxuXHJcbiAgLy9oYXd0aW9QbHVnaW5Mb2FkZXIuYWRkTW9kdWxlKCdwYXR0ZXJuZmx5Jyk7XHJcblxyXG4gIGhhd3Rpb1BsdWdpbkxvYWRlci5hZGRNb2R1bGUocGx1Z2luTmFtZSk7XHJcblxyXG59XHJcblxyXG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=
angular.module("hawtio-kubernetes-templates", []).run(["$templateCache", function($templateCache) {$templateCache.put("plugins/configs/html/configMenuItem.html","<ul ng-controller=\"Configs.MenuItemController\" class=\"nav nav-pills\" role=\"tablist\">\r\n <li ng-repeat=\"item in menuItem\" role=\"presentation\">\r\n <a href=\"{{item.href}}\"><span class=\"{{item.icon}}\"></span> {{item.label}}</a>\r\n </li>\r\n</ul>\r\n");
$templateCache.put("plugins/configs/html/glusterfsSetting.html","<div ng-controller=\"Configs.GfsController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n \r\n <div class=\"container-content sj_content\" ng-model=\"volumes\">\r\n <div class=\"row\">\r\n <div class=\"mb10\">\r\n <button class=\"btn sj_btn_green\" style=\"color:#fff;\r\n \" ng-click=\"createGfs()\">\r\n <span class=\"glyphicon glyphicon-plus \"></span> 添加\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row\" ng-repeat=\"volume in volumes\">\r\n <table class=\"table sj_content_table sj_table_border\">\r\n <thead class=\"no-scope\">\r\n <tr>\r\n <th ng-show=\"volume.status\" class=\"sj_c_green table-header sj_table_td00\">已启用</th>\r\n <th ng-hide=\"volume.status\" class=\"sj_c_green table-header sj_table_td00\">已停止</th>\r\n <th class=\"no-fade table-header sj_table_td06\">\r\n <span class=\"\">{{volume.name}}</span>\r\n </th>\r\n <th class=\"no-fade table-header sj_table_td02\">\r\n <span class=\"\">云路径:{{volume.path}}</span>\r\n </th>\r\n <th class=\"no-fade table-header sj_table_td02\">\r\n <span class=\"\"></span>\r\n </th>\r\n <th class=\"no-fade table-header\">\r\n <span class=\"\">已用&nbsp;{{volume.formatUsedSize}}&nbsp;&nbsp;/&nbsp;&nbsp;共&nbsp;{{volume.formatTotalSize}}</span>\r\n </th>\r\n <th class=\"no-fade table-header sj_table_td01\">\r\n <button class=\"btn sj_btn\" ng-click=\"editRow(volume)\">\r\n <span class=\"glyphicon glyphicon-pencil\"></span>&nbsp;&nbsp;编辑\r\n </button>\r\n <button class=\"btn sj_btn\" ng-click=\"showDeleteVolume.open(volume)\">\r\n <span class=\"glyphicon glyphicon-trash\"></span>&nbsp;&nbsp;刪除\r\n </button>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr ng-repeat=\"row in volume.brick track by $index\" class=\"row.class\">\r\n <td>\r\n <span ng-show=\"row.status\" class=\"glyphicon glyphicon-ok sj_c_green \"></span>\r\n <span ng-hide=\"row.status\" class=\"glyphicon glyphicon-remove sj_c_green \"></span>\r\n </td>\r\n <td>\r\n <span class=\"\">服务器{{$index+1}}</span>\r\n </td>\r\n <td>\r\n <span class=\"sj_table_td02\">{{row.ip}}</span>\r\n </td>\r\n <td>\r\n <span class=\"sj_table_td02\">存储路径:{{row.path}}</span>\r\n </td>\r\n <td>\r\n <span class=\"\">已用&nbsp;{{row.formatUsedSize}}&nbsp;&nbsp;/&nbsp;&nbsp;可用&nbsp;{{row.formatAllSize}}</span>\r\n </td>\r\n <td></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div hawtio-confirm-dialog=\"showDeleteVolume.show\" title=\"是否删除任务?\" ok-button-text=\"确认\" cancel-button-text=\"取消\" on-cancel=\"showDeleteVolume.onCancelled()\" on-ok=\"showDeleteVolume.onOk()\">\r\n <div class=\"dialog-body\">\r\n <p>\r\n 是否删除:{{showDeleteVolume.item.name}} 云盘?\r\n </p>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/configs/html/kubeClusterSetting.html","<div ng-controller=\"Configs.KubeController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n \r\n <div class=\"container-content\">\r\n <div class=\"row align-center mb10\" ng-hide=\"model.oracleParam.length\">\r\n <p class=\"alert alert-info\">当前没有配置汇总库信息,请配置,否则汇总操作将不可用!</p>\r\n </div>\r\n <div class=\"row mb10\" ng-show=\"model.oracleParam.length\">\r\n <table class=\"table table-bordered table-striped sj_content_table\" hawtio-simple-table=\"tableConfig\" />\r\n </div>\r\n <div class=\"row\">\r\n <div>\r\n <button class=\"btn sj_btn_green mb10\" style=\"color:#fff;\" ng-click=\"create()\">\r\n <span class=\"glyphicon glyphicon-plus\"></span> 添加\r\n </button>\r\n </div>\r\n </div>\r\n <hr>\r\n <div class=\"row \" style=\"padding-top:10px;\" ng-show=\"tableForm && (edit || add)\">\r\n <h3 class=\"mb10\" ng-show=\"edit\">编辑汇总库连接信息:</h3>\r\n <h3 class=\"mb10\" ng-show=\"add\">添加汇总库信息:</h3>\r\n <div class=\"col-md-6 col-md-offset-1 \">\r\n <form class=\"form-horizontal\" novalidate=\"novalidate\" name=\"validForm\" ng-submit=\"onSubmit(tableForm)\">\r\n <div class=\"form-group\">\r\n <label class=\"col-sm-2 control-label\">名称</label>\r\n <div class=\"col-sm-10 sj_form_input\">\r\n <input class=\"form-control \" type=\"text\" ng-model=\"tableForm.name\" name=\"orcName\" ng-minlength=\"2\" ng-maxlength=\"20\" required=\"required\"/>\r\n <div class=\"form-error\" ng-show=\"validForm.orcName.$invalid && submitted\">\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcName.$error.required\">名称不能为空</span> <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"!validForm.orcName.$error.required && validForm.orcName.$invalid\">请输入输入2-20个字符的数据名称</span> \r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label class=\"col-sm-2 control-label\">IP</label>\r\n <div class=\"col-sm-10 sj_form_input\">\r\n <input class=\"form-control\" type=\"text\" ng-model=\"tableForm.ip\" name=\"orcIP\" ng-pattern=\"/((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))/\" required=\"required\"/>\r\n <div class=\"form-error\" ng-show=\"validForm.orcIP.$invalid && submitted\">\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcIP.$error.required\">IP不能为空</span>\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcIP.$error.pattern\">请输入正确的IP地址</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label class=\"col-sm-2 control-label\">端口号</label>\r\n <div class=\"col-sm-10 sj_form_input\">\r\n <input class=\"form-control\" type=\"text\" ng-model=\"tableForm.port\" name=\"orcPort\" ng-pattern=\"/^([0-9]|[1-9]\\d|[1-9]\\d{2}|[1-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])$/\" required=\"required\"/>\r\n <div class=\"form-error\" ng-show=\"validForm.orcPort.$invalid && submitted\">\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcPort.$error.required\">端口号不能为空</span>\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcPort.$error.pattern\">端口号必须为1~65535的数字</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label class=\"col-sm-2 control-label\">用戶名</label>\r\n <div class=\"col-sm-10 sj_form_input\">\r\n <input class=\"form-control\" type=\"text\" ng-model=\"tableForm.user\" name=\"orcUser\" ng-pattern=\"/^\\w{2,15}$/\" required=\"required\"/>\r\n <div class=\"form-error\" ng-show=\"validForm.orcUser.$invalid && submitted\">\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcUser.$error.required\">用户名不能为空</span>\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcUser.$error.pattern\">用户名必须为2-15个字母、数字或下划线</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label class=\"col-sm-2 control-label\">密码</label>\r\n <div class=\"col-sm-10 sj_form_input\">\r\n <input class=\"form-control\" type=\"text\" ng-model=\"tableForm.password\" name=\"orcPassword\" ng-pattern=\"/^\\w{2,15}$/\" required=\"required\"/>\r\n <div class=\"form-error\" ng-show=\"validForm.orcPassword.$invalid && submitted\">\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcPassword.$error.required\">密码不能为空</span>\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcPassword.$error.pattern\">密码必须为2-15个字母、数字或下划线</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label class=\"col-sm-2 control-label\">服务名</label>\r\n <div class=\"col-sm-10 sj_form_input\">\r\n <input class=\"form-control\" type=\"text\" ng-model=\"tableForm.databaseName\" name=\"orcService\" ng-pattern=\"/^[a-zA-Z]{1,10}$/\" required=\"required\"/>\r\n <div class=\"form-error\" ng-show=\"validForm.orcService.$invalid && submitted\">\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcService.$error.required\">服务名不能为空</span>\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcService.$error.pattern\">服务名必须为1-10个字母</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label class=\"col-sm-2 control-label\">表空间名</label>\r\n <div class=\"col-sm-10 sj_form_input\">\r\n <input class=\"form-control\" type=\"text\" ng-model=\"tableForm.tableName\" name=\"orcTable\" ng-pattern=\"/^\\w{1,15}$/\" required=\"required\"/>\r\n <div class=\"form-error\" ng-show=\"validForm.orcTable.$invalid && submitted\">\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcTable.$error.required\">表空间名不能为空</span>\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcTable.$error.pattern\">表空间名必须为1-15个字母、数字或下划线</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label class=\"col-sm-2 control-label\">表后缀名</label>\r\n <div class=\"col-sm-10 sj_form_input\">\r\n <input class=\"form-control\" type=\"text\" ng-model=\"tableForm.suffix\" name=\"orcSuffix\" ng-pattern=\"/^\\w{1,10}$/\" required=\"required\"/>\r\n <div class=\"form-error\" ng-show=\"validForm.orcSuffix.$invalid && submitted\">\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcSuffix.$error.required\">表后缀名不能为空</span>\r\n <span class=\"alert alert-danger\" role=\"alert\" ng-show=\"validForm.orcSuffix.$error.pattern\">表后缀名必须为1-10个字母、数字或下划线</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label class=\"col-sm-2 control-label\">标准表汇总库</label>\r\n <div class=\"col-sm-10 sj_form_input\">\r\n <select class=\"form-control\" ng-model=\"tableForm.type\">\r\n <option value=0 ng-selected=\"tableForm.type==0\" selected>否</option>\r\n <option value=1 ng-selected=\"tableForm.type==1\">是</option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" style=\"margin-left:140px;\">\r\n <button class=\"btn sj_btn_blue\" type=\'submit\' style=\"color:#fff;\" >\r\n <span class=\"glyphicon glyphicon-save \"></span> 保存\r\n </button>\r\n <button class=\"btn sj_btn_grey\" ng-click=\'cancel()\'>\r\n <span class=\"glyphicon glyphicon-remove \"></span> 取消\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n <hr>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/configs/html/shareLayout.html","<script type=\"text/ng-template\" id=\"tableEdit.html\">\r\n <div class=\"ngCellText\" ng-init=\"entity=row.entity\" ng-controller=\"Configs.TableEdit\">\r\n <button class=\"btn sj_btn\" ng-click=\"editRow(entity)\">\r\n <span class=\"glyphicon glyphicon-pencil\"></span>&nbsp;&nbsp;编辑\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button class=\"btn sj_btn\" ng-click=\"deleteRowOne.open(entity)\">\r\n <span class=\"glyphicon glyphicon-trash\"></span>&nbsp;&nbsp;删除\r\n </button>\r\n <div hawtio-confirm-dialog=\"deleteRowOne.show\" title=\"是否删除任务?\" ok-button-text=\"确认\" cancel-button-text=\"取消\" on-cancel=\"deleteRowOne.onCancelled()\" on-ok=\"deleteRowOne.onOk()\">\r\n <div class=\"dialog-body\">\r\n <p>\r\n 是否删除:{{deleteRowOne.item.name}} 服务?\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"connectStatus.html\">\r\n <div class=\"ngCellText\" ng-init=\"entity=row.entity\">\r\n <div ng-show=\"true\" title=\"汇总库的连接状态\">\r\n <span ng-show=\"entity.status== 0\" class=\"glyphicon glyphicon-minus\">&nbsp;未连接</span>\r\n <span ng-show=\"entity.status== 1\" class=\"glyphicon glyphicon-ok\">&nbsp;连接成功</span>\r\n <span ng-show=\"entity.status== 2\" class=\"glyphicon glyphicon-import\">&nbsp;使用中</span>\r\n <span ng-show=\"entity.status== 3\" class=\"glyphicon glyphicon-remove\">&nbsp;连接失败</span>\r\n </div>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"newDialog.html\">\r\n <div class=\"sj_new_box\">\r\n <form name=\"volumeForm\" class=\" mb10\" novalidate=\"novalidate\">\r\n <table class=\"sj_new_table clear\">\r\n <tbody>\r\n <tr>\r\n <th class=\"new_left\">云盘名</th>\r\n <th colspan=\"10\">\r\n <input type=\"text\" class=\"sj_txt_box03 mr10\" name=\"volumeName\" ng-model=\"ngDialogData.name \" ng-disabled=\"!{{ngDialogData.editable}}\" ng-pattern=\"/^\\w{2,15}$/\" required=\"required\" />\r\n </th>\r\n <th>云目录:</th>\r\n <th>\r\n <input type=\"text\" class=\"sj_txt_box02 mr5\" name=\"volumePath\" ng-model=\"ngDialogData.path\" ng-disabled=\"!{{ngDialogData.editable}}\" ng-pattern=\"/^(\\/[a-z0-9A-Z _\\-.%]+)+$/\" required=\"required\" />\r\n </th>\r\n <!--<th>\r\n <button ng-show=\"ngDialogData.status\" class=\"sj_btn_red fl\" ng-click=\"stopVolume(ngDialogData)\">停止</button>\r\n <button ng-hide=\"ngDialogData.status\" class=\"sj_btn_blue fl\" ng-click=\"startVolume(ngDialogData)\">启动</button>\r\n </th> -->\r\n </tr>\r\n <tr ng-repeat=\"row in ngDialogData.brick\">\r\n <th class=\"new_left\">\r\n <span ng-show=\"row.status\" class=\"sj_icon_ok\"></span>\r\n <span ng-hide=\"row.status\" class=\"sj_icon_warning\"></span>\r\n </th>\r\n <th colspan=\"3\">\r\n <input type=\"text\" class=\"sj_txt_box04 mr5\" value=\"服务器 {{$index + 1}} \" ng-disabled=\"true\" />\r\n </th>\r\n <th>\r\n <input type=\"text\" class=\"sj_txt_box05\" ng-model=\"row.ip[0]\" name=\"brickIp0\" ng-disabled=\"!{{row.editable}}\" ng-pattern=\"/^(([0-9]|([1-9]\\d)|(1\\d\\d)|(2([0-4]\\d|5[0-5]))))$/\" required=\"required\" />\r\n </th>\r\n <th>.</th>\r\n <th>\r\n <input type=\"text\" class=\"sj_txt_box05\" ng-model=\"row.ip[1]\" name=\"brickIp1\" ng-disabled=\"!{{row.editable}}\" ng-pattern=\"/^(([0-9]|([1-9]\\d)|(1\\d\\d)|(2([0-4]\\d|5[0-5]))))$/\" required=\"required\" />\r\n </th>\r\n <th>.</th>\r\n <th>\r\n <input type=\"text\" class=\"sj_txt_box05\" ng-model=\"row.ip[2]\" name=\"brickIp2\" ng-disabled=\"!{{row.editable}}\" ng-pattern=\"/^(([0-9]|([1-9]\\d)|(1\\d\\d)|(2([0-4]\\d|5[0-5]))))$/\" required=\"required\" />\r\n </th>\r\n <th>.</th>\r\n <th>\r\n <input type=\"text\" class=\"sj_txt_box05 mr10\" ng-model=\"row.ip[3]\" name=\"brickIp3\" ng-disabled=\"!{{row.editable}}\" ng-pattern=\"/^(([0-9]|([1-9]\\d)|(1\\d\\d)|(2([0-4]\\d|5[0-5]))))$/\" required=\"required\" />\r\n </th>\r\n <th>存储块:</th>\r\n <th>\r\n <input type=\"text\" class=\"sj_txt_box02 mr5\" ng-model=\"row.path\" name=\"brickPath\" ng-disabled=\"!{{row.editable}}\" ng-pattern=\"/^(\\/[a-z0-9A-Z \\-_.%]+)+$/\" required=\"required\" />\r\n </th>\r\n <th>\r\n <!--<button class=\"sj_btn_grey fl\">连接</button>-->\r\n <a href=\"#\" class=\"sj_icon_del ml5 fl\" ng-show=\"ngDialogData.brick.length>1\" ng-click=\"deleteBrock(ngDialogData, row)\"></a>\r\n <a href=\"#\" ng-hide=\"$index < ngDialogData.brick.length-1\" class=\"sj_icon_add ml5 fl\" ng-click=\"addBrock(ngDialogData)\"></a>\r\n </th>\r\n </tr>\r\n <tr>\r\n <th>&nbsp;</th>\r\n <th>\r\n <button class=\"sj_btn_blue mr5\" ng-click=\"onSubmit(ngDialogData)\">保存</button>\r\n </th>\r\n <th>\r\n <button class=\"sj_btn_grey mr5\" ng-click=\"cancel()\">取消</button>\r\n </th>\r\n <!--<th>\r\n <button class=\"sj_btn_grey mr5\" ng-click=\"cancel()\">取消</button>\r\n </th> \r\n <!--<th colspan=\"5\">&nbsp;{{message}}</th>-->\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div class=\"alert alert-warning\" role=\"alert\" ng-show=\"showMessage\">\"删除存储块失败:集群中至少包含一个存储块!\"</div>\r\n <div class=\"alert alert-warning\" role=\"alert\" ng-show=\"volumeForm.$invalid && submitted\">云盘的名称、路径或IP输入不正确</div>\r\n </form>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"systemInfo.html\">\r\n <div class=\"sj_new_box mt10\">\r\n <div class=\" mb10\">\r\n <ul class=\"box_chakan\">\r\n <h2 class=\"mb10\">查看详情</h2>\r\n <li class=\"clear\">\r\n <span class=\"fl box_chakan_leftinfo\">行政区划代码:</span>\r\n <p class=\"fl box_chakan_mininfo\">{{ngDialogData.areaCode}}</p>\r\n </li>\r\n <li class=\"clear\">\r\n <span class=\"fl box_chakan_leftinfo\">行政区划:</span>\r\n <p class=\"fl box_chakan_mininfo\"><span class=\"mr5\">{{ngDialogData.cityName}}</span><span class=\"mr5\">{{ngDialogData.districtName}}</span><span class=\"mr5\">{{ngDialogData.areaLevel}}</span></p>\r\n </li>\r\n <li class=\"clear\">\r\n <span class=\"fl box_chakan_leftinfo\">信息系统名称:</span>\r\n <p class=\"fl box_chakan_mininfo\">{{ngDialogData.sysName}}</p>\r\n <span class=\"fl box_chakan_leftinfo\">信息系统版本:</span>\r\n <p class=\"fl box_chakan_mininfo\">{{ngDialogData.sysVersion}}</p>\r\n </li>\r\n <li class=\"clear\">\r\n <span class=\"fl box_chakan_leftinfo\">数据库类型:</span>\r\n <p class=\"fl box_chakan_mininfo\"><span>{{ngDialogData.dataBaseType}}</span><span class=\"ml5 mr5\">/</span><span>{{ngDialogData.dataBaseVersion}}</span></p>\r\n <!--<span class=\"fl box_chakan_leftinfo\">字符集:</span>\r\n <p class=\"fl box_chakan_mininfo\">{{ngDialogData.charset}}}</p>-->\r\n </li>\r\n <li class=\"clear\">\r\n <span class=\"fl box_chakan_leftinfo\">投入使用时间:</span>\r\n <p class=\"fl box_chakan_mininfo\"><span class=\"mr5\">{{ngDialogData.beginUseTime}}</span></p>\r\n </li>\r\n <li class=\"clear\">\r\n <span class=\"fl box_chakan_leftinfo\">开发商全称:</span>\r\n <p class=\"fl box_chakan_maxinfo\">{{ngDialogData.developerFullName}}</p>\r\n </li>\r\n <li class=\"clear\">\r\n <span class=\"fl box_chakan_leftinfo\">联系人:</span>\r\n <p class=\"fl box_chakan_mininfo\">{{ngDialogData.departmentManager}}</p>\r\n <span class=\"fl box_chakan_leftinfo\">联系电话(手机)</span>\r\n <p class=\"fl box_chakan_mininfo\">{{ngDialogData.managerContacts}}</p>\r\n </li>\r\n <li class=\"clear\">\r\n <span class=\"fl box_chakan_leftinfo\">功能描述:</span>\r\n <p class=\"fl box_chakan_maxinfo\">{{ngDialogData.functionDetails}}</p>\r\n </li>\r\n <li class=\"clear\">\r\n <span class=\"fl box_chakan_leftinfo\">业务范围:</span>\r\n <p class=\"fl box_chakan_maxinfo\">\r\n <span class=\"mr5\" ng-repeat=\'item in ngDialogData.workRange\'>{{item}}</span>\r\n </p>\r\n </li>\r\n <li class=\"clear\">\r\n <span class=\"fl box_chakan_leftinfo\">脚本文件:</span>\r\n <p class=\"fl box_chakan_maxinfo\">\r\n <span ng-repeat=\"sql in ngDialogData.sqlList\">{{sql}} <br /></span>\r\n <br/>\r\n </p>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"headerCheckbox.html\">\r\n <input type=\"checkbox\" ng-model=\"checkboxes.checked\" class=\"select-all\" value=\" \" />\r\n</script>\r\n<script type=\"text/ng-template\" id=\"sqlView.html\">\r\n <div class=\"sj_new_box04\">\r\n <h2 class=\"sj_popup_h2 mb10\">{{title}}_{{ngDialogData.item.areaCode}}_{{ngDialogData.item.sysCode}}.sql</h2>\r\n <div class=\"clear mb10\">\r\n <ul class=\"fl sj_width470\">\r\n <li><span class=\"fb\">默认脚本:</span>{{ngDialogData.item[ngDialogData.type + \'StandardModified\']}}</li>\r\n <li class=\"sj_link\">{{ngDialogData.item[ngDialogData.type + \'PathStandard\']}}</li>\r\n </ul>\r\n <div class=\"fr sj_width470 mr5 mt10\">\r\n <button class=\"sj_btn_green fr\" ng-click=\"upLoadSqlFile()\">上传</button>\r\n </div>\r\n <div class=\"cl\"></div>\r\n </div>\r\n <div class=\"clear mb10\">\r\n <div class=\"sj_box_w470 fl\">\r\n <p ng-bind=\"old_content\">\r\n </p>\r\n </div>\r\n <div class=\" sj_box_w470 fl ml15\">\r\n <p ng-bind=\"new_content\">\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\" clear\">\r\n <button class=\"btn pull-right sj_btn_blue \" ng-disabled=\"!enable\" ng-click=\"onOk()\">\r\n 确定\r\n </button>\r\n <button class=\"sj_btn_grey mr5 fr\" ng-click=\"cancel()\">取消</button>\r\n </div>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"sqlAdd.html\">\r\n <div class=\"sj_new_box02\">\r\n <h2 class=\"sj_popup_h2 mt10 fl\">{{title}}_{{ngDialogData.item.areaCode}}_{{ngDialogData.item.sysCode}}.sql</h2>\r\n <div class=\"clear mb10 fr mr5\">\r\n <button class=\"sj_btn_green fl\" ng-click=\"sqlFileUpload()\">上传</button>\r\n </div>\r\n <div class=\"cl\"></div>\r\n <div class=\"sj_box_w535 mb10\">\r\n <p>{{content}}</p>\r\n </div>\r\n <div class=\" clear\">\r\n <button class=\"btn pull-right sj_btn_blue \" ng-disabled=\"!enable\" ng-click=\"onOk()\">确定</button>\r\n <button class=\"sj_btn_grey mr5 fr\" ng-click=\"cancel()\">取消</button>\r\n </div>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"sqlVerification.html\">\r\n <div class=\"sj_new_box03\">\r\n <h2 class=\"sj_popup_h2 mb10\">{{title}}_{{ngDialogData.item.areaCode}}_{{ngDialogData.item.sysCode}}.sql</h2>\r\n <div class=\"clear mb10\">\r\n <ul class=\"fl sj_width440\">\r\n <li><span class=\"fb\">默认脚本:</span>{{ngDialogData.item[ngDialogData.type + \'StandardModified\']}}</li>\r\n <li class=\"sj_link\">{{ngDialogData.item[ngDialogData.type + \'PathStandard\']}}</li>\r\n </ul>\r\n <ul class=\"fl sj_width440\">\r\n <li><span class=\"fb\">默认脚本:</span>{{ngDialogData.item[ngDialogData.type + \'LastModified\']}}</li>\r\n <li class=\"sj_link\">{{ngDialogData.item[ngDialogData.type + \'PathLast\']}}</li>\r\n </ul>\r\n <!--<div class=\"fl sj_width440\">\r\n <input type=\"text\" class=\"sj_txt_box02 mr5 fl\">\r\n <button class=\"sj_btn_green fl\" ng-click=\"upLoadSqlFile()\">上传</button>\r\n </div> -->\r\n </div>\r\n <div class=\"clear mb10\">\r\n <div class=\"sj_box_w440 fl\">\r\n <p ng-bind=\"standard\">\r\n </p>\r\n </div>\r\n <div class=\" sj_box_w440 fl ml15\">\r\n <p ng-bind=\"unnormal\">\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\" clear\">\r\n <button class=\"btn pull-right sj_btn_blue \" ng-click=\"replace()\">\r\n 替换\r\n </button>\r\n <button class=\"sj_btn_grey mr5 fr\" ng-click=\"cancel()\">保留</button>\r\n </div>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"sqlMove.html\">\r\n <div class=\"sj_new_box02\">\r\n <h2 class=\"sj_popup_h2 mb10\">{{title}}_{{ngDialogData.item.areaCode}}_{{ngDialogData.item.sysCode}}.sql</h2>\r\n <div class=\"clear mb10\">\r\n <ul class=\"fl sj_width440\">\r\n <li><span class=\"fb\">默认脚本:</span>{{ngDialogData.item[ngDialogData.type + \'LastModified\']}}</li>\r\n <li class=\"sj_link\">{{ngDialogData.item[ngDialogData.type + \'PathLast\']}}</li>\r\n </ul>\r\n </div>\r\n <div class=\"sj_box_w535 mb10\">\r\n <p ng-bind=\"content\"></p>\r\n </div>\r\n <div class=\" clear\">\r\n <button class=\"btn pull-right sj_btn_blue \" style=\"color:#fff;\" ng-disabled=\"!content && content != \'\'\" ng-click=\"move()\">归档</button>\r\n <button class=\"sj_btn_grey mr5 fr\" ng-click=\"cancel()\">取消</button>\r\n </div>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"sysVerificationUpdate.html\">\r\n <div class=\"sj_new_box03 mt10 \">\r\n <h2 class=\"sj_popup_h2 mb10 ml10 mt15\">{{ngDialogData.areaCode}} {{ngDialogData.cityName}} {{ngDialogData.districtName}} {{ngDialogData.sysName}}</h2>\r\n <table class=\"sj_new_table02 mb10 ml10\" cellpadding=\"0\" cellspacing=\"0\">\r\n <thead>\r\n <tr class=\"sj_popup_toptxt \">\r\n <th>&nbsp;</th>\r\n <th>默认描述信息</th>\r\n <th>采集描述信息</th>\r\n <td>&nbsp;</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n <td class=\"sj_popup_lefttxt\">行政区划级次</td>\r\n <td class=\"sj_popup_midtxt\">{{data1.areaLevel}}</td>\r\n <td class=\"sj_popup_midtxt\">{{data2.areaLevel}}</td>\r\n <td class=\"sj_popup_righttxt\">\r\n <input type=\"checkbox\" id=\'areaLevel\' ng-show=\"null != data2.areaLevel && data2.areaLevel != \'\'\" ng-click=\"click($event, \'areaLevel\')\">\r\n </td>\r\n </tr>\r\n <tr>\r\n <td class=\"sj_popup_lefttxt\">信息系统版本</td>\r\n <td class=\"sj_popup_midtxt\">{{data1.sysVersion}}</td>\r\n <td class=\"sj_popup_midtxt\">{{data2.sysVersion}}</td>\r\n <td class=\"sj_popup_righttxt\">\r\n <input type=\"checkbox\" id=\'sysVersion\' ng-show=\"null != data2.sysVersion && data2.sysVersion != \'\'\" ng-click=\"click($event, \'sysVersion\')\">\r\n </td>\r\n </tr>\r\n <tr>\r\n <td class=\"sj_popup_lefttxt\">投入使用时间</td>\r\n <td class=\"sj_popup_midtxt\">{{data1.beginUseTime}}</td>\r\n <td class=\"sj_popup_midtxt\">{{data2.beginUseTime}}</td>\r\n <td class=\"sj_popup_righttxt\">\r\n <input type=\"checkbox\" id=\'beginUseTime\' ng-show=\"null != data2.beginUseTime && data2.beginUseTime != \'\'\" ng-click=\"click($event, \'beginUseTime\')\">\r\n </td>\r\n </tr>\r\n <tr>\r\n <td class=\"sj_popup_lefttxt\">功能描述</td>\r\n <td class=\"sj_popup_midtxt\">{{data1.functionDetails}}</td>\r\n <td class=\"sj_popup_midtxt\">{{data2.functionDetails}}\r\n </td>\r\n <td class=\"sj_popup_righttxt\">\r\n <input type=\"checkbox\" ng-show=\"null != data2.functionDetails && data2.functionDetails != \'\'\" ng-click=\"click($event, \'functionDetails\')\">\r\n </td>\r\n </tr>\r\n <tr>\r\n <td class=\"sj_popup_lefttxt\">开发商全称</td>\r\n <td class=\"sj_popup_midtxt\">{{data1.developerFullName}}</td>\r\n <td class=\"sj_popup_midtxt\">{{data2.developerFullName}}</td>\r\n <td class=\"sj_popup_righttxt\">\r\n <input type=\"checkbox\" ng-show=\"null != data2.developerFullName && data2.developerFullName != \'\'\" ng-click=\"click($event, \'developerFullName\')\">\r\n </td>\r\n </tr>\r\n <tr>\r\n <td class=\"sj_popup_lefttxt\">联系人</td>\r\n <td class=\"sj_popup_midtxt\">{{data1.departmentManager}}</td>\r\n <td class=\"sj_popup_midtxt\">{{data2.departmentManager}}</td>\r\n <td class=\"sj_popup_righttxt\">\r\n <input type=\"checkbox\" ng-show=\"null != data2.departmentManager && data2.departmentManager != \'\'\" ng-click=\"click($event, \'departmentManager\')\">\r\n </td>\r\n </tr>\r\n <tr>\r\n <td class=\"sj_popup_lefttxt\">联系电话(手机)</td>\r\n <td class=\"sj_popup_midtxt\">{{data1.managerContacts}}</td>\r\n <td class=\"sj_popup_midtxt\">{{data2.managerContacts}}</td>\r\n <td class=\"sj_popup_righttxt\">\r\n <input type=\"checkbox\" ng-show=\"null != data2.managerContacts && data2.managerContacts != \'\'\" ng-click=\"click($event, \'managerContacts\')\">\r\n </td>\r\n </tr>\r\n <tr>\r\n <td class=\"sj_popup_lefttxt\">数据库类型</td>\r\n <td class=\"sj_popup_midtxt\">{{data1.dataBaseType}}</td>\r\n <td class=\"sj_popup_midtxt\">{{data2.dataBaseType}}</td>\r\n <td class=\"sj_popup_righttxt\">\r\n <input type=\"checkbox\" ng-show=\"null != data2.dataBaseType && data2.dataBaseType != \'\'\" ng-click=\"click($event, \'dataBaseType\')\">\r\n </td>\r\n </tr>\r\n <tr>\r\n <td class=\"sj_popup_lefttxt\">数据库版本</td>\r\n <td class=\"sj_popup_midtxt\">{{data1.dataBaseVersion}}</td>\r\n <td class=\"sj_popup_midtxt\">{{data2.dataBaseVersion}}</td>\r\n <td class=\"sj_popup_righttxt\">\r\n <input type=\"checkbox\" ng-show=\"null != data2.dataBaseVersion && data2.dataBaseVersion != \'\'\" ng-click=\"click($event, \'dataBaseVersion\')\">\r\n </td>\r\n </tr>\r\n <tr>\r\n <td class=\"sj_popup_lefttxt\">业务范围</td>\r\n <td class=\"sj_popup_midtxt\">\r\n <span ng-repeat=\"item in data1.workRange\" class=\"mr5\">{{item}}</span>\r\n </td>\r\n <td class=\"sj_popup_midtxt\">\r\n <span ng-repeat=\"item in data2.workRange\" class=\"mr5\">{{item}} </span>\r\n </td>\r\n <td class=\"sj_popup_righttxt\">\r\n <input type=\"checkbox\" ng-show=\"data2.workRange && data2.workRange.length > 0\" ng-click=\"click($event, \'workRange\')\">\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div class=\" clear\">\r\n <button class=\"btn pull-right sj_btn_blue mr15\" ng-disabled=\"checkboxItmes.length==0\" ng-click=\"replace()\">更新</button>\r\n <button class=\"sj_btn_grey mr5 fr\" ng-click=\"cancel()\">取消</button>\r\n </div>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"statusHelp.html\"> \r\n <div class=\"sj_new_box05\">\r\n <h2 class=\"sj_popup_h2 mb10 mt10\">帮助</h2>\r\n <table class=\"sj_new_table02 mb10\" cellpadding=\"0\" cellspacing=\"0\">\r\n <thead >\r\n <tr class=\"sj_popup_toptxt \">\r\n <th >操作</th>\r\n <th >归档脚本</th>\r\n <th >新版版本</th>\r\n <th >详细说明</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr >\r\n <td class=\"sj_popup_txtbold\">审核</td>\r\n <td class=\"sj_popup_txtbold\">有</td>\r\n <td class=\"sj_popup_txtbold\">有</td>\r\n <td class=\" sj_popup_midtxt\">保留:删除新版脚本文件,保留现有归档脚本\r\n<br/>替换:新版脚本文件移动并覆盖原有归档脚本</td>\r\n </tr>\r\n <tr>\r\n <td class=\"sj_popup_txtbold\">上传</td>\r\n <td class=\"sj_popup_txtbold\">无</td>\r\n <td class=\"sj_popup_txtbold\">无</td>\r\n <td class=\" sj_popup_midtxt\">选择本地脚本文件,系统按照命名规范重命名文件并归档</td>\r\n </tr>\r\n <tr>\r\n <td class=\"sj_popup_txtbold\">归档</td>\r\n <td class=\"sj_popup_txtbold\">无</td>\r\n <td class=\"sj_popup_txtbold\">有</td>\r\n <td class=\" sj_popup_midtxt\">将上报的脚本文件移动到归档路径进行归档</td>\r\n </tr>\r\n <tr>\r\n <td class=\"sj_popup_txtbold\">查看</td>\r\n <td class=\"sj_popup_txtbold\">有</td>\r\n <td class=\"sj_popup_txtbold\">无</td>\r\n <td class=\" sj_popup_midtxt\">重新上传:选择本地脚本文件,系统按照命名规范重命名文件并覆盖现有的归档脚本</td>\r\n </tr>\r\n </tbody> \r\n </table>\r\n <div class=\"sj_popup_p\">\r\n <p>一键归档:待归档状态的所有脚本文件,后台一次性全部归档</p>\r\n <p>一键审核:待审核状态的所有脚本文件,后台一次性全部替换</p>\r\n </div>\r\n </div>\r\n \r\n</script>\r\n<script type=\"text/ng-template\" id=\"strandColumn.html\">\r\n <div class=\"ngCellText\" ng-init=\"entity=row.entity\">\r\n <div ng-show=\"true\" title=\"是否是标准表汇总库\">\r\n <span ng-show=\"entity.type== 0\" >&nbsp;否</span>\r\n <span ng-show=\"entity.type== 1\" >&nbsp;是</span> \r\n </div>\r\n </div> \r\n</script>\r\n<div ng-controller=\"Kubernetes.TopLevel\">\r\n <div class=\"wiki-icon-view\" ng-controller=\"Kubernetes.FileDropController\" nv-file-drop nv-file-over uploader=\"uploader\" over-class=\"ready-drop\">\r\n <div class=\"row kubernetes-view\" ng-view></div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/addDataFile.html","<div class=\"data_container\" ng-controller=\"Developer.DataOverView\">\r\n <header class=\"data_heaer\">\r\n <h2 >江苏省审计厅数据汇总平台</h2>\r\n </header>\r\n <div class=\"data_content\">\r\n <div class=\"data_leftside fl\">\r\n <h3 class=\"data_h3\">本地文件列表</h3>\r\n <ul class=\"fl data_leftside_files\">\r\n <li class=\" data_title\">文件名</li>\r\n <li><label class=\"fl date_label\">列表项1列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n <li><label class=\"fl date_label\">列表项1列表项1列表项1列表项11列表项11列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n <li><label class=\"fl date_label\">列表项1列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n <li><label class=\"fl date_label\">列表项1列表项1列表项1列表项11列表项11列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n <li><label class=\"fl date_label\">列表项1列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n <li><label class=\"fl date_label\">列表项1列表项1列表项1列表项11列表项11列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n </ul>\r\n <ul class=\"fl data_leftside_files data_leftside_shu\">\r\n <li class=\" data_title\">文件属性</li>\r\n <li><label class=\"fl date_label\">列表项1列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n <li><label class=\"fl date_label\">列表项1列表项1列表项1列表项11列表项11列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n </ul>\r\n <div class=\"cl\"></div>\r\n </div><!--data_leftside end-->\r\n <div class=\"data_conbar fl\">\r\n <div class=\"date_btns\">\r\n <a href=\"#\" class=\"data_file_btn\" >选择本地xml<input type=\"file\" /></a>\r\n <a href=\"#\" class=\"data_file_btn\" style=\"font-size:12px;\" >选择服务器端xml<input type=\"file\" /></a>\r\n </div>\r\n <div class=\"date_btns\">\r\n <a href=\"#\" class=\"data_file_btn\" >导入到服务器<input type=\"file\" /></a>\r\n <a href=\"#\" class=\"data_file_btn\" >导出到硬盘<input type=\"file\" /></a>\r\n </div>\r\n </div><!--data_conbar end-->\r\n <div class=\"data_rightside fr\">\r\n <h3 class=\"data_h3\">服务器文件列表</h3>\r\n <div class=\"data_rightside_tree fl\">\r\n <div treecontrol class=\"tree-classic\"\r\n tree-model=\"dataForTheTree\"\r\n options=\"treeOptions\"\r\n on-selection=\"showSelected(node)\"\r\n selected-node=\"node1\">\r\n employee: {{node.name}} age {{node.age}}\r\n </div>\r\n <!-- <div class=\"tree well\">\r\n <ul>\r\n <li >\r\n <p class=\"icon-plus-sign\" style=\"padding-left:20px;\"> 数据类型1</p>\r\n <ul>\r\n <li>\r\n <p> 数据批次1</p>\r\n <ul>\r\n <li>\r\n <p> 行政区划1</p>\r\n <ul>\r\n <li>\r\n <p>数据版本1</p>\r\n </li>\r\n <li>\r\n <p>数据版本1</p>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </li>\r\n\r\n </ul>\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"tree well\">\r\n <ul>\r\n <li >\r\n <p class=\"icon-plus-sign\" style=\"padding-left:20px;\"> 数据类型1</p>\r\n <ul>\r\n <li>\r\n <p> 数据批次1</p>\r\n <ul>\r\n <li>\r\n <p> 行政区划1</p>\r\n <ul>\r\n <li>\r\n <p>数据版本1</p>\r\n </li>\r\n <li>\r\n <p>数据版本1</p>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </li>\r\n\r\n </ul>\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"tree well\">\r\n <ul>\r\n <li >\r\n <p class=\"icon-plus-sign\" style=\"padding-left:20px;\"> 数据类型1</p>\r\n <ul>\r\n <li>\r\n <p> 数据批次1</p>\r\n <ul>\r\n <li>\r\n <p> 行政区划1</p>\r\n <ul>\r\n <li>\r\n <p>数据版本1</p>\r\n </li>\r\n <li>\r\n <p>数据版本1</p>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </li>\r\n\r\n </ul>\r\n </li>\r\n </ul>\r\n </div> -->\r\n </div><!--data_rightside_tree end-->\r\n <div class=\"data_leftside fl data_rightside_w\">\r\n <ul class=\"fl data_leftside_files\">\r\n <li class=\" data_title data_title_w\">文件名</li>\r\n <li><label class=\"fl date_label date_label_w\">列表项1列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n <li><label class=\"fl date_label date_label_w\">列表项1列表项1列表项1列表项11列表项11列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n <li><label class=\"fl date_label date_label_w\">列表项1列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n <li><label class=\"fl date_label date_label_w\">列表项1列表项1列表项1列表项11列表项11列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n <li><label class=\"fl date_label date_label_w\">列表项1列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n <li><label class=\"fl date_label date_label_w\">列表项1列表项1列表项1列表项11列表项11列表项1</label><input type=\"checkbox\" class=\"fr\"/></li>\r\n </ul>\r\n <ul class=\"fl data_leftside_files data_leftside_shu\">\r\n <li class=\" data_title data_title_w\">文件属性</li>\r\n </ul>\r\n <div class=\"cl\"></div>\r\n </div><!--data_leftside end-->\r\n </div>\r\n <div class=\"cl\"></div>\r\n\r\n </div>\r\n\r\n\r\n\r\n</div>");
$templateCache.put("plugins/developer/html/code.html","<div ng-controller=\"Kubernetes.BuildConfigController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\" ng-show=\"model.tools.length\">\r\n <span ng-show=\"!id\">\r\n <hawtio-filter ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter tools...\"></hawtio-filter>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"entity.tools.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no tools currently available.</p>\r\n </div>\r\n <div ng-show=\"entity.tools.length\">\r\n <div ng-hide=\"entity.tools.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no tools currently available.</p>\r\n </div>\r\n <div ng-repeat=\"env in entity.tools | filter:filterTemplates | orderBy:\'label\' track by $index\">\r\n <div class=\"row\"\r\n title=\"{{env.description}}\">\r\n <div class=\"col-md-9\">\r\n <a href=\"{{env.url}}\">\r\n <h3>\r\n <i class=\"{{env.iconClass}}\"></i>\r\n {{env.label}}\r\n </h3>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/environment.html","environment!!!!");
$templateCache.put("plugins/developer/html/environmentPanel.html","<div class=\"inline-block environment-row\" ng-controller=\"Developer.EnvironmentPanelController\">\r\n <div class=\"panel-group\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h2 class=\"panel-title inline-block\">\r\n <a href=\"{{env.url}}\" title=\"namespace: {{env.namespace}}\">\r\n <!-- <i class=\"{{env.iconClass}}\"></i>&nbsp; -->\r\n {{env.label}}\r\n </a>\r\n </h2>\r\n </div>\r\n\r\n <div class=\"panel-body\">\r\n <div class=\"environment-deploy-block\"\r\n ng-repeat=\"(project, versions) in envVersions[env.namespace] | orderBy:\'project\' track by $index\">\r\n <div ng-repeat=\"(version, versionInfo) in versions.versions | orderBy:\'version\' track by $index\">\r\n <div ng-repeat=\"(rcname, rc) in versionInfo.replicationControllers\">\r\n <div class=\"environment-deploy-version-and-pods\">\r\n <a href=\"{{rc.$viewLink}}\" ng-show=\"rc.$viewLink\"\r\n title=\"View the Replication Controller from project {{project}} of version {{version}}\">\r\n <i class=\"fa fa-cubes\"></i>\r\n {{rc.$name}}\r\n : {{version}}\r\n </a>\r\n <span ng-hide=\"rc.$viewLink\"\r\n title=\"View the Replication Controller from project {{project}} of version {{version}}\">\r\n <i class=\"fa fa-cubes\"></i>\r\n {{rc.$name}}\r\n : {{version}}\r\n </span>\r\n <span class=\"pull-right\" ng-show=\"rc.$serviceLink.href\">\r\n &nbsp;\r\n &nbsp;\r\n &nbsp;\r\n <a target=\"test-service\" href=\"{{rc.$serviceLink.href}}\" title=\"Open this service in a new tab\">\r\n <i class=\"fa fa-external-link\"></i>\r\n </a>\r\n </span>\r\n &nbsp;\r\n &nbsp;\r\n &nbsp;\r\n <span class=\"pull-right\">\r\n <a ng-show=\"rc.$podCounters.podsLink\" href=\"{{rc.$podCounters.podsLink}}\" title=\"View pods\">\r\n <span ng-show=\"rc.$podCounters.ready\"\r\n class=\"badge badge-success\">{{rc.$podCounters.ready}}</span>\r\n <span ng-show=\"rc.$podCounters.valid\"\r\n class=\"badge badge-info\">{{rc.$podCounters.valid}}</span>\r\n <span ng-show=\"rc.$podCounters.waiting\" class=\"badge\">{{rc.$podCounters.waiting}}</span>\r\n <span ng-show=\"rc.$podCounters.error\"\r\n class=\"badge badge-warning\">{{rc.$podCounters.error}}</span>\r\n </a>\r\n </span>\r\n </div>\r\n <div class=\"environment-deploy-build-info\">\r\n <a href=\"{{rc.$buildUrl}}\" target=\"builds\" ng-show=\"rc.$buildUrl && rc.$buildId\" class=\"=\"\r\n title=\"View the build which created this Replication Controller\">\r\n <i class=\"fa fa-tasks\"></i>\r\n Build #{{rc.$buildId}}\r\n </a>\r\n &nbsp;\r\n &nbsp;\r\n &nbsp;\r\n <a href=\"{{rc.$gitUrl}}\" target=\"git\" ng-show=\"rc.$gitUrl\" class=\"pull-right\"\r\n title=\"{{rc.$gitCommit}}\r\n {{rc.$gitCommitAuthor}}\r\n {{rc.$gitCommitDate}}\r\n {{rc.$gitCommitMessage}}\">\r\n <i class=\"fa fa-code-fork\"></i>\r\n Commit {{rc.$gitCommit | limitTo:7}}\r\n </a>\r\n <span ng-hide=\"rc.$gitUrl || !rc.$gitCommit\" class=\"pull-right\"\r\n title=\"{{rc.$gitCommit}}\r\n {{rc.$gitCommitAuthor}}\r\n {{rc.$gitCommitDate}}\r\n {{rc.$gitCommitMessage}}\">\r\n <i class=\"fa fa-code-fork\"></i>\r\n Commit {{rc.$gitCommit | limitTo:7}}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n");
$templateCache.put("plugins/developer/html/environments.html","<div class=\"project-dashboard\" ng-controller=\"Developer.ProjectController\" hawtio-card-bg>\r\n\r\n <div hawtio-breadcrumbs></div>\r\n <div hawtio-tabs></div>\r\n\r\n <!--\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\" ng-show=\"model.environments.length\">\r\n <span ng-show=\"!id\">\r\n <hawtio-filter ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter environments...\"></hawtio-filter>\r\n </span>\r\n </div>\r\n </div>\r\n -->\r\n\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div class=\"align-center\">\r\n <div class=\"spinner spinner-lg\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div ng-show=\"model.fetched\" style=\"float: none; position: static;\">\r\n<!--\r\n <div class=\"row page-header-row\">\r\n <div class=\"col-md-12\">\r\n <h1 class=\"inline-block\">{{id}}</h1>\r\n </div>\r\n </div>\r\n-->\r\n\r\n <!--\r\n <div class=\"pull-right\">\r\n <a href=\"{{entity.$build.url}}\" class=\"btn btn-default\" target=\"browse\">\r\n <i class=\"{{entity.$build.iconClass}}\"></i>\r\n {{entity.$build.label}}\r\n </a>\r\n </div>\r\n -->\r\n\r\n <div class=\"row row-cards-pf\" title=\"{{env.description}}\">\r\n <div class=\"col-md-12 environment-rows\">\r\n <div class=\"card-pf\">\r\n <div class=\"card-pf-heading\">\r\n <h2 class=\"card-pf-title inline-block\">Environments Overview</h2>\r\n </div>\r\n <div class=\"card-pf-body\">\r\n <div ng-hide=\"entity.environments.length\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12 align-center\">\r\n <h2>No Environment Available</h2>\r\n <p>Environment is a logical place where deployments happen which maps to a kubernetes / openshift namespace. You will see environments here after you add a build.</p>\r\n <a class=\"btn btn-primary\" ng-href=\"{{settingsLink}}\"><i class=\"fa fa-plus\"></i> New Build</a>\r\n </div>\r\n </div>\r\n </div>\r\n <div ng-show=\"entity.environments.length\">\r\n <div ng-repeat=\"env in entity.environments | filter:filterTemplates track by $index\"\r\n class=\"inline-block environment-block\" ng-include=\"\'plugins/developer/html/environmentPanel.html\'\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row row-cards-pf\">\r\n <div class=\"col-md-12\">\r\n <div class=\"card-pf pipeline\">\r\n <div class=\"card-pf-heading no-border\">\r\n <h2 class=\"card-pf-title inline-block\">Active Pipelines</h4>\r\n <a ng-href=\"{{$projectLink}}/jenkinsJob/{{jobId}}/pipelines\">View All Pipelines >></a>\r\n </div>\r\n <div class=\"card-pf-body no-top-margin\">\r\n <div class=\"full-card-width\" ng-controller=\"Developer.PipelinesController\" ng-include=\"\'plugins/kubernetes/html/pendingPipelines.html\'\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row row-cards-pf\">\r\n <div class=\"col-md-12\">\r\n <div class=\"card-pf\">\r\n <div class=\"card-pf-heading\">\r\n <h2 class=\"card-pf-title inline-block\">Commits</h2>\r\n <a ng-href=\"{{$projectLink}}/wiki/history//\">View All Commits >></a>\r\n </div>\r\n <div class=\"card-pf-body\">\r\n <div ng-include=\"\'plugins/wiki/html/projectCommitsPanel.html\'\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/fileMigrationTask.html","<div ng-controller=\"Developer.KubeTaskController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n <div class=\"container-content \">\r\n <div class=\"row align-center mb10\" ng-hide=\"model.transferTasks.length\">\r\n <p class=\"alert alert-info\">当前没有可以查看的任务列表!</p>\r\n </div>\r\n <div class=\"row mb10\" ng-show=\"model.transferTasks.length\">\r\n <table class=\"table table-bordered table-striped sj_content_table\" hawtio-simple-table=\"tableConfig\" />\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/home.html","<div ng-controller=\"Developer.HomeController\">\r\n <div class=\"jumbotron\">\r\n <h1>Perspectives</h1>\r\n\r\n <p>\r\n Please choose the perspective you would like to use:\r\n </p>\r\n </div>\r\n <div class=\"row\">\r\n\r\n <div class=\"col-md-6\">\r\n <p class=\"text-center\">\r\n <a class=\"btn btn-lg btn-primary\" href=\"/workspaces\" role=\"button\"\r\n title=\"Create or work on Projects\">\r\n <i class=\"fa fa-tasks\"></i>\r\n &nbspDevelop »\r\n </a>\r\n </p>\r\n\r\n <p class=\"text-center\">\r\n Work on projects and source code\r\n </p>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <p class=\"text-center\">\r\n <a class=\"btn btn-lg btn-primary\" href=\"/namespaces\" role=\"button\"\r\n title=\"Look around the various Namespaces at running Pods and Services\">\r\n <i class=\"fa fa-cubes\"></i>\r\n &nbsp;Operate »\r\n </a>\r\n </p>\r\n\r\n <p class=\"text-center\">\r\n Manage and run Pods and Services\r\n </p>\r\n </div>\r\n </div>\r\n</div>");
$templateCache.put("plugins/developer/html/jenkinsApproveModal.html","<div class=\"modal-header\">\r\n <h3 class=\"modal-title\">{{operation}}?</h3>\r\n</div>\r\n<div class=\"modal-body\">\r\n Are you sure you wish to {{operation}}?\r\n</div>\r\n<div class=\"modal-footer\">\r\n <button class=\"btn btn-primary\" ng-click=\"ok()\">{{operation}}</button>\r\n <button class=\"btn btn-warning\" ng-click=\"cancel()\">Cancel</button>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/jenkinsJob.html","<div class=\"row\" ng-controller=\"Developer.JenkinsJobController\">\r\n <script type=\"text/ng-template\" id=\"jenkinsBuildIdTemplate.html\">\r\n <div class=\"ngCellText\" title=\"{{row.entity.fullDisplayName}} {{row.entity.result}}\">\r\n <a href=\"{{row.entity.$logsLink}}\" title=\"View the build logs\">\r\n <i class=\"{{row.entity.$iconClass}}\"></i>&nbsp;&nbsp;{{row.entity.displayName}}\r\n </a>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"jenkinsBuildButtonsTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <a class=\"btn btn-default\" href=\"{{row.entity.$pipelineLink}}\" ng-show=\"row.entity.$pipelineLink\" target=\"View the pipeline for this build\">\r\n <i class=\"fa fa-tasks\"></i> Pipeline\r\n </a>\r\n &nbsp;&nbsp;\r\n <a class=\"btn btn-default\" href=\"{{row.entity.$logsLink}}\" ng-show=\"row.entity.$logsLink\" title=\"View the build logs\">\r\n <i class=\"fa fa-tasks\"></i> Logs\r\n </a>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"jenkinsBuildTimestampTemplate.html\">\r\n <div class=\"ngCellText\" title=\"Build started at: {{row.entity.$timestamp}}\">\r\n {{row.entity.$timestamp.relative()}}\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"jenkinsBuildDurationTemplate.html\">\r\n <div class=\"ngCellText\" title=\"Build took {{row.entity.$duration}} milliseconds\">\r\n {{row.entity.$duration.duration()}}\r\n </div>\r\n </script>\r\n\r\n\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <span>\r\n <hawtio-filter ng-show=\"job.builds.length\"\r\n ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter builds...\"></hawtio-filter>\r\n </span>\r\n <button ng-show=\"fetched\"\r\n title=\"Delete this build history\"\r\n class=\"btn btn-danger pull-right\"\r\n ng-disabled=\"tableConfig.selectedItems.length == 0\"\r\n ng-click=\"deletePrompt(tableConfig.selectedItems)\">\r\n <i class=\"fa fa-remove\"></i> Delete\r\n </button>\r\n\r\n <a class=\"btn btn-primary pull-right\" ng-click=\"triggerBuild()\"\r\n title=\"Trigger this build\">\r\n <i class=\"fa fa-play-circle-o\"></i> Trigger</a>\r\n </a>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"job.builds.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no builds in this job.</p>\r\n </div>\r\n <div ng-show=\"job.builds.length\">\r\n <table class=\"table table-bordered table-striped\" hawtio-simple-table=\"tableConfig\"></table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/jenkinsJobs.html","<div class=\"row\" ng-controller=\"Developer.JenkinsJobsController\">\r\n <script type=\"text/ng-template\" id=\"jenkinsJobNameTemplate.html\">\r\n <div class=\"ngCellText\" title=\"{{row.entity.fullDisplayName}} {{row.entity.result}}\">\r\n <a href=\"{{row.entity.$buildsLink}}\">\r\n <i class=\"{{row.entity.$iconClass}}\"></i>&nbsp;&nbsp;{{row.entity.displayName}}\r\n </a>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"jenkinsJobButtonsTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <a class=\"btn btn-default\" href=\"{{row.entity.$pipelinesLink}}\" ng-show=\"row.entity.$pipelinesLink\" title=\"View the pipelines for this build\">\r\n <i class=\"fa fa-tasks\"></i> Pipelines\r\n </a>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"jenkinsBuildTimestampTemplate.html\">\r\n <div class=\"ngCellText\" title=\"Build started at: {{row.entity.$timestamp}}\">\r\n {{row.entity.$timestamp.relative()}}\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"jenkinsBuildDurationTemplate.html\">\r\n <div class=\"ngCellText\" title=\"Build took {{row.entity.$duration}} milliseconds\">\r\n {{row.entity.$duration.duration()}}\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"jenkinsLastSuccessTemplate.html\">\r\n <div class=\"ngCellText\" ng-init=\"success=row.entity.lastSuccessfulBuild\">\r\n <span title=\"Build took {{success.$duration.duration()}} milliseconds\">\r\n <span ng-show=\"success\">\r\n {{success.$timestamp.relative()}}\r\n </span>\r\n <span ng-show=\"success.$buildLink\">\r\n -\r\n <a href=\"{{success.$buildLink}}\" target=\"build\" title=\"View the builds\">\r\n {{success.displayName}}\r\n </a>\r\n </span>\r\n </span>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"jenkinsLastFailureTemplate.html\">\r\n <div class=\"ngCellText\" ng-init=\"fail=row.entity.lastFailedBuild\">\r\n <span title=\"Build took {{fail.$duration.duration()}} milliseconds\">\r\n <span ng-show=\"fail\">\r\n {{fail.$timestamp.relative()}}\r\n </span>\r\n <span ng-show=\"fail.$buildLink\">\r\n -\r\n <a href=\"{{fail.$buildLink}}\" target=\"build\" title=\"View the builds\">\r\n {{fail.displayName}}\r\n </a>\r\n </span>\r\n </span>\r\n </div>\r\n </script>\r\n\r\n\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <span>\r\n <hawtio-filter ng-show=\"jenkins.jobs.length\"\r\n ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter jobs...\"></hawtio-filter>\r\n </span>\r\n <a class=\"btn btn-primary pull-right\" ng-click=\"triggerBuild()\"\r\n title=\"Trigger this build\">\r\n <i class=\"fa fa-play-circle-o\"></i> Trigger</a>\r\n </a>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"jenkins.jobs.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no jobs in this jenkins.</p>\r\n </div>\r\n <div ng-show=\"jenkins.jobs.length\">\r\n <table class=\"table table-bordered table-striped\" hawtio-simple-table=\"tableConfig\"></table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/jenkinsLog.html","<div class=\"row\" ng-controller=\"Developer.JenkinsLogController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <span>\r\n <hawtio-filter ng-model=\"log.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter logs...\"></hawtio-filter>\r\n </span>\r\n <a class=\"btn btn-default pull-right\" target=\"jenkins\" href=\"{{$viewJenkinsLogLink}}\" ng-show=\"$viewJenkinsLogLink\"\r\n title=\"View this log inside Jenkins\">\r\n <i class=\"fa fa-external-link\"></i> Log in Jenkins</a>\r\n </a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\" target=\"jenkins\" href=\"{{$viewJenkinsBuildLink}}\" ng-show=\"$viewJenkinsBuildLink\"\r\n title=\"View this build inside Jenkins\">\r\n <i class=\"fa fa-external-link\"></i> Build in Jenkins</a>\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div class=\"log-window\" viewport-height scroll-glue>\r\n <div class=\"log-window-inner\" >\r\n <p ng-repeat=\"log in log.logs | filter:log.filterText track by $index\" ng-bind-html=\"log | asTrustedHtml\"></p>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/jenkinsMetrics.html","<div class=\"row\" ng-controller=\"Developer.JenkinsMetricsController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"metrics.builds.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no completed builds in this job.</p>\r\n </div>\r\n <div ng-show=\"metrics.builds.length\">\r\n <nvd3 options=\"options\" data=\"data\" api=\"api\"></nvd3>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/logPanel.html","<div class=\"log-panel\" ng-controller=\"Developer.JenkinsLogController\" scroll-glue>\r\n <div class=\"log-panel-inner\" style=\"height: 25px;\">\r\n <p ng-repeat=\"log in log.logs track by $index\" ng-bind-html=\"log | asTrustedHtml\"></p>\r\n </div>\r\n</div>\r\n\r\n\r\n");
$templateCache.put("plugins/developer/html/overview.html","");
$templateCache.put("plugins/developer/html/pipeline.html","<div class=\"row\" ng-controller=\"Developer.PipelineController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <span>\r\n <hawtio-filter ng-show=\"model.stages.length\"\r\n ng-model=\"model.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter pipeline...\"></hawtio-filter>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"model.stages.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no pipeline stages in this build.</p>\r\n </div>\r\n <div ng-show=\"model.stages.length\">\r\n\r\n <h2>Pipeline for {{jobId}}</h2>\r\n\r\n <div pipeline-view></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/pipelineView.html","<div class=\"panel-group\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h2 class=\"panel-title\">\r\n <a data-toggle=\"collapse\" data-parent=\".panel-group\" href=\"#build-{{build.id}}\">\r\n Build {{build.displayName}}\r\n </a>\r\n <span class=\"pull-right\" title=\"This build started at {{build.$timestamp}}\">\r\n started {{build.$timestamp.relative()}}\r\n </span>\r\n </h2>\r\n </div>\r\n\r\n <div id=\"build-{{build.id}}\" class=\"panel-collapse collapse in\">\r\n <div class=\"panel-body\">\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <!--\r\n <div class=\"pipeline-build inline-block\"\r\n title=\"{{build.description || \'Pipeline build number \' + build.displayName}}\">\r\n <div class=\"buildName\">\r\n <a href=\"{{build.$viewLink}}\" title=\"View the build details\">\r\n {{build.displayName}}\r\n </a>\r\n <span class=\"buildParameters pull-right\" ng-show=\"$parameterText\">\r\n <i class=\"fa fa-ellipsis-v\" title=\"build parameters: {{build.$parameterText}}\"></i>\r\n </span>\r\n </div>\r\n\r\n <div class=\"buildDuration text-center\">\r\n <a href=\"{{build.$logLink}}\" title=\"This build started at {{build.$timestamp}}\">\r\n started {{build.$timestamp.relative()}}\r\n </a>\r\n </div>\r\n </div>\r\n -->\r\n\r\n <div ng-repeat=\"stage in build.stages | filter:model.filterText track by $index\" class=\"inline-block\">\r\n <div class=\"pipeline-arrow inline-block\" ng-show=\"$index\">\r\n <i class=\"fa fa-angle-double-right\"></i>\r\n </div>\r\n <div class=\"pipeline-deploy {{stage.$backgroundClass}} inline-block\">\r\n <div class=\"text-center stageName\" title=\"{{stage.status}}\"><i class=\"{{stage.$iconClass}}\"></i>\r\n <a href=\"{{stage.$viewLink}}\" title=\"This stage started at {{stage.$startTime}}\" target=\"jenkins\">\r\n {{stage.stageName}}\r\n </a>\r\n </div>\r\n <div class=\"text-center stageStartTime\" title=\"Stage started at {{stage.$startTime}}\">\r\n <a href=\"{{stage.$logLink}}\" title=\"View the logs of this stage\">\r\n {{stage.duration.duration()}}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"row\" ng-show=\"hideLogs && !build.building\">\r\n <div class=\"col-md-12\">\r\n <a href=\"{{build.$logLink}}\" class=\"pull-right\">View Full Log</a>\r\n </div>\r\n </div>\r\n <div class=\"row\" ng-hide=\"hideLogs && !build.building\">\r\n <div class=\"col-md-12\">\r\n <h4 class=\"inline-block\">Logs</h4>\r\n <a href=\"{{build.$logLink}}\" class=\"pull-right\">View Full Log</a>\r\n <div style=\"height: 250px;\" ng-include=\"\'plugins/developer/html/logPanel.html\'\"></div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/pipelines.html","<div class=\"row\" ng-controller=\"Developer.PipelinesController\">\r\n <div hawtio-breadcrumbs></div>\r\n <div hawtio-tabs></div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-4\">\r\n <span>\r\n <hawtio-filter ng-show=\"model.job.builds.length\"\r\n ng-model=\"model.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter pipelines...\"></hawtio-filter>\r\n </span>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <form class=\"form-inline\">\r\n <div class=\"checkbox\" title=\"Only show build pipelines which are pending\">\r\n <label>\r\n <input type=\"checkbox\" ng-model=\"model.pendingOnly\"> &nbsp;Only pending builds\r\n </label>\r\n </div>\r\n </form>\r\n\r\n </div>\r\n </div>\r\n <div class=\"row\" ng-init=\"hideLogs = true\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"model.job.builds.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no pipelines for this job.</p>\r\n </div>\r\n <div ng-show=\"model.job.builds.length\">\r\n <div ng-repeat=\"build in model.job.builds | filter:model.filterText track by $index\">\r\n <div pipeline-view></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/projectDetail.html","<div ng-controller=\"Kubernetes.BuildConfigController\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n href=\"{{baseUri}}/kubernetes/buildConfigs\"><i class=\"fa fa-list\"></i></a>\r\n <div class=\"pull-right\" ng-repeat=\"view in entity.$fabric8Views | orderBy:\'label\'\">\r\n <a title=\"{{view.description}}\" ng-show=\"view.url\" ng-href=\"{{view.url}}\" class=\"btn btn-default\">\r\n <i class=\"{{view.iconClass}}\" ng-show=\"view.iconClass\"></i>\r\n {{view.label}}\r\n </a>\r\n <span class=\"pull-right\" ng-show=\"view.url\" >&nbsp;</span>\r\n </div>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button class=\"btn btn-primary pull-right\"\r\n title=\"Trigger this build\"\r\n ng-disabled=\"!entity.$triggerUrl\"\r\n ng-click=\"triggerBuild(entity)\"><i class=\"fa fa-play-circle-o\"></i> Trigger</button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div hawtio-object=\"entity\" config=\"config\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/projectSelector.html","<ul class=\"project-selector\" ng-controller=\"Developer.ProjectSelector\" ng-show=\'projectId\'>\r\n <li class=\"dropdown\">\r\n <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">\r\n <strong ng-bind=\"projectId\"></strong>\r\n <b class=\"caret\"></b>\r\n </a>\r\n <ul class=\"dropdown-menu\">\r\n <li ng-repeat=\'project in projects\'>\r\n <a ng-href=\"{{project.$viewLink}}\">{{project.$name}}</a>\r\n </li>\r\n </ul>\r\n </li>\r\n</ul>\r\n");
$templateCache.put("plugins/developer/html/projects.html","<div class=\"row\" ng-controller=\"Developer.ProjectsController\">\r\n <script type=\"text/ng-template\" id=\"buildConfigLinkTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <a title=\"View details for this build configuration\"\r\n href=\"{{baseUri}}/kubernetes/buildConfigs/{{row.entity.metadata.name}}\">\r\n<!--\r\n <img class=\"app-icon-small\" ng-src=\"{{row.entity.$iconUrl}}\">\r\n-->\r\n {{row.entity.metadata.name}}</a>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildConfigViewsTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <span ng-repeat=\"view in row.entity.$fabric8Views track by $index\">\r\n <a title=\"{{view.description}}\" ng-show=\"view.url\" ng-href=\"{{view.url}}\" class=\"btn btn-default\">\r\n <i class=\"{{view.iconClass}}\" ng-show=\"view.iconClass\"></i>\r\n {{view.label}}\r\n </a>\r\n </span>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildConfigCodeViewsTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <span ng-repeat=\"view in row.entity.$fabric8CodeViews track by $index\">\r\n <a title=\"{{view.description}}\" ng-show=\"view.url\" ng-href=\"{{view.url}}\" class=\"btn btn-default\">\r\n <i class=\"{{view.iconClass}}\" ng-show=\"view.iconClass\"></i>\r\n {{view.label}}\r\n </a>\r\n </span>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildConfigBuildViewsTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <span ng-repeat=\"view in row.entity.$fabric8BuildViews track by $index\">\r\n <a title=\"{{view.description}}\" ng-show=\"view.url\" ng-href=\"{{view.url}}\" class=\"btn btn-default\">\r\n <i class=\"{{view.iconClass}}\" ng-show=\"view.iconClass\"></i>\r\n {{view.label}}\r\n </a>\r\n </span>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildConfigEnvironmentViewsTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <span ng-repeat=\"view in row.entity.$fabric8EnvironmentViews track by $index\">\r\n <a title=\"{{view.description}}\" ng-show=\"view.url\" ng-href=\"{{view.url}}\" class=\"btn btn-default\">\r\n <i class=\"{{view.iconClass}}\" ng-show=\"view.iconClass\"></i>\r\n {{view.label}}\r\n </a>\r\n </span>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildConfigTeamViewsTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <span ng-repeat=\"view in row.entity.$fabric8TeamViews track by $index\">\r\n <a title=\"{{view.description}}\" ng-show=\"view.url\" ng-href=\"{{view.url}}\" class=\"btn btn-default\">\r\n <i class=\"{{view.iconClass}}\" ng-show=\"view.iconClass\"></i>\r\n {{view.label}}\r\n </a>\r\n </span>\r\n </div>\r\n </script>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <span>\r\n <hawtio-filter ng-show=\"model.buildconfigs.length\"\r\n ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter apps...\"></hawtio-filter>\r\n </span>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button ng-show=\"fetched\"\r\n title=\"Delete the selected build configuration\"\r\n class=\"btn btn-danger pull-right\"\r\n ng-disabled=\"tableConfig.selectedItems.length == 0\"\r\n ng-click=\"deletePrompt(tableConfig.selectedItems)\">\r\n <i class=\"fa fa-remove\"></i> Delete\r\n </button>\r\n\r\n <button ng-show=\"model.fetched\"\r\n class=\"btn btn-danger pull-right\"\r\n ng-disabled=\"!id && tableConfig.selectedItems.length == 0\"\r\n ng-click=\"deletePrompt(id || tableConfig.selectedItems)\"\r\n title=\"Delete the selected apps\">\r\n <i class=\"fa fa-remove\"></i> Delete\r\n </button>\r\n\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-primary pull-right\" href=\"{{baseUri}}/workspaces/{{namespace}}/forge/createProject\"\r\n title=\"Create a new app in this project\">\r\n <i class=\"fa fa-plus\"></i> Create App</a>\r\n </a>\r\n\r\n<!--\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <button class=\"btn btn-default pull-right\"\r\n title=\"Trigger the given build\"\r\n ng-disabled=\"tableConfig.selectedItems.length != 1 || !tableConfig.selectedItems[0].$triggerUrl\"\r\n ng-click=\"triggerBuild(tableConfig.selectedItems[0])\"><i class=\"fa fa-play-circle-o\"></i> Trigger</button>\r\n-->\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"model.buildconfigs.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no projects in this workspace.</p>\r\n </div>\r\n <div ng-show=\"model.buildconfigs.length\">\r\n <table class=\"table table-bordered table-striped\" hawtio-simple-table=\"tableConfig\"></table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/tools.html","<div ng-controller=\"Kubernetes.BuildConfigController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\" ng-show=\"model.tools.length\">\r\n <span ng-show=\"!id\">\r\n <hawtio-filter ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter tools...\"></hawtio-filter>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"entity.tools.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no tools currently available.</p>\r\n </div>\r\n <div ng-show=\"entity.tools.length\">\r\n <div ng-hide=\"entity.tools.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no tools currently available.</p>\r\n </div>\r\n <div ng-repeat=\"env in entity.tools | filter:filterTemplates | orderBy:\'label\' track by $index\">\r\n <div class=\"row\"\r\n title=\"{{env.description}}\">\r\n <div class=\"col-md-9\">\r\n <a href=\"{{env.url}}\">\r\n <h3>\r\n <i class=\"{{env.iconClass}}\"></i>\r\n {{env.label}}\r\n </h3>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/workspace.html","<div ng-controller=\"Developer.WorkspaceController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <a class=\"btn btn-default pull-right\"\r\n href=\"{{baseUri}}/kubernetes/workspaces\"><i class=\"fa fa-list\"></i></a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\" ng-show=\"entity.$configLink\"\r\n title=\"View the workspace configuration\"\r\n href=\"{{entity.$configLink}}\">\r\n Configuration\r\n </a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\" ng-show=\"entity.$podLink\"\r\n title=\"View the workspace pod\"\r\n href=\"{{entity.$podLink}}\">\r\n Pod\r\n </a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-primary pull-right\" ng-show=\"entity.$logsLink\"\r\n title=\"View the workspace logs\"\r\n href=\"{{entity.$logsLink}}\">\r\n View Log\r\n </a>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div hawtio-object=\"entity\" config=\"config\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/developer/html/workspaces.html","<div ng-controller=\"Developer.WorkspacesController\" hawtio-card-bg>\r\n <div hawtio-breadcrumbs></div>\r\n <div hawtio-tabs></div>\r\n <div class=\"container-content \">\r\n <div class=\"container-fluid sj_fluid\">\r\n <div class=\"row nav-content mb10 clear \">\r\n <ul class=\"nav nav-tabs sj_nav_taps fl\" ng-show=\"navbarItems.length\">\r\n <li role=\"presentation\" ng-repeat=\"item in navbarItems\" class=\"{{item.class}}\"><a href=\"#\" ng-click=\"selectBatchItem(item)\">{{item.label}}</a></li>\r\n </ul>\r\n <div class=\"fr sj_searchbox\">\r\n <input type=\"text\" class=\"sj_search_input\" ng-model=\"keyQuery\" placeholder=\"请选择或输入关键字,多关键字请用空格隔开\" onkeydown=\"if(event.keyCode==13){searchButton.click()}\"/>\r\n <a href=\"#\" class=\"sj_search_btn\" id=\"searchButton\" ng-click=\"search()\"></a>\r\n </div>\r\n </div>\r\n <div ng-hide=\"model.data.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">当前没有可以查看的数据.</p>\r\n </div>\r\n <div ng-show=\"model.data.length\">\r\n <table class=\"table table-striped table-bordered sj_content_table\" hawtio-simple-table=\"tableConfig\" id=\"tableConfig\"></table>\r\n <div class=\"row clear\">\r\n <div class=\" fl\">\r\n <!--<input type=\"checkbox\" class=\"fl mr5 \" style=\"margin-top: 8px;\" />\r\n <label class=\"fl mr5 \" style=\"margin-top: 5px; font-style:nomal;\">全选</label>-->\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button class=\"btn pull-right sj_btn_grey \" ng-disabled=\"!id && tableConfig.selectedItems.length == 0\" ng-click=\"deletePrompt(id || tableConfig.selectedItems)\">\r\n <i class=\"glyphicon glyphicon-trash\"></i> 删除\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button class=\"btn pull-right sj_btn_grey \" ng-disabled=\"!id && tableConfig.selectedItems.length == 0\" ng-click=\"migrationClick.open(id || tableConfig.selectedItems)\">\r\n <i class=\"glyphicon glyphicon-export\"></i> 迁移\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button class=\"btn pull-right sj_btn_grey \" ng-disabled=\"!id && tableConfig.selectedItems.length == 0\" ng-click=\"createOracleService(id || tableConfig.selectedItems)\">\r\n <i class=\"glyphicon glyphicon-play-circle\"></i> 启动\r\n </button>\r\n </div>\r\n <ul class=\"fr sj_table_bottom\">\r\n <li class=\"mr5 \">当前显示{{(options.currentPageNum-1)*20 + 1}}~{{(options.currentPageNum-1)*20 + model.data.length}}行,共{{model.paramOptions.totalSize}}行,</li>\r\n <!--<li class=\"mr5 \">每页显示\r\n <select ng-options=\"value for value in pageSizeChoses\" ng-cha=nge=\"selectAction()\" ng-model=\"options.currentTableSize\"></select>行\r\n </li>-->\r\n <li class=\"mr5 \">当前页码</li>\r\n <li>\r\n <div class=\"hawtio-pager clearfix\">\r\n <label>{{options.currentPageNum}} / {{options.getPageSizeNum()}}</label>\r\n <div class=btn-group>\r\n <button class=\"btn sj_btn_grey\" ng-disabled=\"isEmptyOrFirst()\" ng-click=\"first()\"><i class=\"fa fa-fast-backward\"></i></button>\r\n <button class=\"btn sj_btn_grey\" ng-disabled=\"isEmptyOrFirst()\" ng-click=\"previous()\"><i class=\"fa fa-step-backward\"></i></button>\r\n <button class=\"btn sj_btn_grey \" ng-disabled=\"isEmptyOrLast()\" ng-click=\"next()\"><i class=\"fa fa-step-forward\"></i></button>\r\n <button class=\"btn sj_btn_grey\" ng-disabled=\"isEmptyOrLast()\" ng-click=\"last()\"><i class=\"fa fa-fast-forward\"></i></button>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div modal=\"migrationClick.dialog.show \">\r\n <form name=\"selectFolder \" class=\" \" ng-submit=\"migrationClick.onOk() \">\r\n <div class=\"modal-header sj_modal-header\">\r\n <h4>数据迁移</h4></div>\r\n <div class=\"modal-body sj_modal_body\">\r\n <div class=\"row sj_model_row\">\r\n <label class=\"col-sm-3 control-label sj_contro_label\" for=\"selectedItem \">\r\n 请选择迁移集群\r\n </label>\r\n <select ng-model=\"migrationClick.selectedItem \" class=\"col-sm-3 sj_modal_select\" title=\"name of the new namespace \" id=\"selectedItem \" ng-options=\"x.name for x in volumes \" />\r\n </div>\r\n <div class=\"form-group\">\r\n <div class=\"col-sm-12 alert alert-warning\" ng-show=\"!volumes || volumes.length == 0\">\r\n <span class=\"help-block\">\r\n\r\n 当前没有可以迁移的集群,请在数据集群配置页面进行配置!\r\n </span>\r\n </div>\r\n </div>\r\n <div ng-hide=\"!volumes || volumes.length == 0\">\r\n <treecontrol class=\"tree-classic\" tree-model=\"migrationClick.selectedItem.folder\" options=\"treeOptions\" on-selection=\"showSelected(node)\" selected-node=\"selectNode\">\r\n {{node.name}}\r\n </treecontrol>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer \">\r\n <input class=\"btn btn-primary sj_btn_blue\" type=\"submit\" ng-disabled=\"!selectNode || selectNode.children.length <= 0\" value=\"确定\">\r\n <button class=\"btn btn-warning cancel sj_btn_grey\" type=\"button\" ng-click=\"migrationClick.close()\">取消</button>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"prettify \"></div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/appDeployedTemplate.html","<div class=\"ngCellText\" title=\"deployed at: {{row.entity.$creationDate | date:\'yyyy-MMM-dd HH:mm:ss Z\'}}\">\r\n {{row.entity.$creationDate ? (row.entity.$creationDate | relativeTime) : \'\'}}\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/appDetailTemplate.html","<div class=\"service-view-rectangle\" ng-repeat=\"view in item.$serviceViews\" ng-hide=\"view.appName === \'kubernetes\'\">\r\n <div class=\"service-view-header row\">\r\n <div class=\"col-md-4\">\r\n <span class=\"service-view-icon\">\r\n <a ng-href=\"{{view.service | kubernetesPageLink}}\" title=\"View the service detail page\">\r\n <img ng-show=\"item.$iconUrl\" ng-src=\"{{item.$iconUrl}}\">\r\n </a>\r\n </span>\r\n <span class=\"service-view-name\" title=\"{{view.name}}\">\r\n <a ng-href=\"{{view.service | kubernetesPageLink}}\" title=\"View the service detail page\">\r\n {{view.appName}}\r\n </a>\r\n </span>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <span class=\"service-view-address\" title=\"The service address\">\r\n <a ng-show=\"view.service.$connectUrl\" target=\"_blank\" href=\"{{view.service.$connectUrl}}\" title=\"Connect to the service\">\r\n {{view.service.$host}}\r\n </a>\r\n <span ng-hide=\"view.service.$connectUrl\">{{view.service.$host}}</span>\r\n </span>\r\n </div>\r\n <div class=\"col-md-2 align-right\">\r\n <a class=\"service-view-header-delete\" href=\"\" ng-click=\"deleteSingleApp(item)\" title=\"Delete this app\"><i\r\n class=\"fa fa-remove red\"></i></a>\r\n </div>\r\n </div>\r\n\r\n <div class=\"service-view-detail-rectangle\">\r\n <div class=\"service-view-detail-header row\">\r\n <div class=\"col-md-3\">\r\n <div class=\"service-view-detail-deployed\" ng-show=\"view.createdDate\"\r\n title=\"deployed at: {{view.createdDate | date:\'yyyy-MMM-dd HH:mm:ss Z\'}}\">\r\n deployed:\r\n <span class=\"value\">{{view.createdDate | relativeTime}}</span>\r\n </div>\r\n <div class=\"service-view-detail-deployed\" ng-hide=\"view.createdDate\">\r\n not deployed\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <div class=\"service-view-detail-pod-template\" ng-show=\"view.controllerId\">\r\n pod template:\r\n <span class=\"value\" title=\"Go to the replication controller detail page\"><a\r\n ng-href=\"{{view.replicationController | kubernetesPageLink}}\">{{view.controllerId}}</a></span>\r\n </div>\r\n <div class=\"service-view-detail-pod-template\" ng-hide=\"view.controllerId\">\r\n no pod template\r\n </div>\r\n </div>\r\n <div class=\"col-md-3 service-view-detail-pod-counts align-right\">\r\n <span>\r\n pods:\r\n <a href=\"\" ng-show=\"view.replicationController\" class=\"badge badge-success\"\r\n ng-click=\"resizeDialog.open(view.replicationController)\"\r\n title=\"Resize the number of pods\">\r\n {{view.podCount}}\r\n </a>\r\n <span ng-hide=\"view.replicationController\" class=\"badge badge-info\">\r\n {{view.podCount}}\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"service-view-detail-pod-box row\">\r\n <div class=\"col-md-12\">\r\n <div class=\"inline-block\" ng-repeat=\"pod in item.pods track by $index\">\r\n <div ng-show=\"podExpanded(pod)\" class=\"service-view-detail-pod-summary-expand\">\r\n <table>\r\n <tr>\r\n <td class=\"service-view-detail-pod-status\">\r\n <i ng-class=\"pod.statusClass\"></i>\r\n </td>\r\n <td class=\"service-view-detail-pod-connect\" ng-show=\"pod.$jolokiaUrl\"\r\n ng-controller=\"Kubernetes.ConnectController\">\r\n <a class=\"clickable\"\r\n ng-click=\"doConnect(pod)\"\r\n title=\"Open a new window and connect to this container\">\r\n <i class=\"fa fa-sign-in\"></i>\r\n </a>\r\n </td>\r\n <td>\r\n <div class=\"service-view-detail-pod-id\" title=\"{{pod.id}}\">\r\n <span class=\"value\">Pod <a title=\"Go to the pod detail page\" ng-href=\"{{pod | kubernetesPageLink}}\">{{pod.idAbbrev}}</a></span>\r\n </div>\r\n <div class=\"service-view-detail-pod-ip\">\r\n IP:\r\n <span class=\"value\">{{pod.status.podIP}}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"service-view-detail-pod-ports\">\r\n ports: <span class=\"value\">{{pod.$containerPorts.join(\", \")}}</span>\r\n </div>\r\n <div class=\"service-view-detail-pod-minion\">\r\n minion:\r\n <span class=\"value\">\r\n <a ng-show=\"pod.$host\" ng-href=\"{{baseUri}}/kubernetes/hosts/{{pod.$host}}\">{{pod.$host}}</a>\r\n </span>\r\n </div>\r\n </td>\r\n <td class=\"service-view-detail-pod-expand\" ng-click=\"collapsePod(pod)\">\r\n <i class=\"fa fa-chevron-left\"></i>\r\n </td>\r\n </tr>\r\n </table>\r\n <!--\r\n <div class=\"service-view-detail-pod-status\">\r\n status:\r\n <span class=\"value\">{{pod.status}}</span>\r\n </div>\r\n -->\r\n </div>\r\n\r\n <div ng-hide=\"podExpanded(pod)\" class=\"service-view-detail-pod-summary\">\r\n <table>\r\n <tr>\r\n <td class=\"service-view-detail-pod-status\">\r\n <i ng-class=\"pod.statusClass\"></i>\r\n </td>\r\n <td class=\"service-view-detail-pod-connect\" ng-show=\"pod.$jolokiaUrl\"\r\n ng-controller=\"Kubernetes.ConnectController\">\r\n <a class=\"clickable\"\r\n ng-click=\"doConnect(pod)\"\r\n title=\"Open a new window and connect to this container\">\r\n <i class=\"fa fa-sign-in\"></i>\r\n </a>\r\n </td>\r\n <td>\r\n <div class=\"service-view-detail-pod-id\" title=\"{{pod.id}}\">\r\n <span class=\"value\">Pod <a title=\"Go to the pod detail page\" ng-href=\"{{pod | kubernetesPageLink}}\">{{pod.idAbbrev}}</a></span>\r\n </div>\r\n <div class=\"service-view-detail-pod-ip\">\r\n IP:\r\n <span class=\"value\">{{pod.status.podIP}}</span>\r\n </div>\r\n </td>\r\n <td class=\"service-view-detail-pod-expand\" ng-click=\"expandPod(pod)\">\r\n <i class=\"fa fa-chevron-right\"></i>\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/appIconTemplate.html","<div class=\"ngCellText\" title=\"{{row.entity.$info.description}}\">\r\n <a ng-href=\"row.entity.$appUrl\">\r\n <img ng-show=\"row.entity.$iconUrl\" class=\"app-icon-small\" ng-src=\"{{row.entity.$iconUrl}}\">\r\n </a>\r\n <span class=\"app-name\">\r\n <a ng-click=\"row.entity.$select()\">\r\n {{row.entity.$info.name}}\r\n </a>\r\n </span>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/appPodCountsAndLinkTemplate.html","<div class=\"ngCellText\" title=\"Number of running pods for this controller\">\r\n <div ng-repeat=\"podCounters in row.entity.$podCounters track by $index\">\r\n <a ng-show=\"podCounters.podsLink\" href=\"{{podCounters.podsLink}}\" title=\"{{podCounters.labelText}}\">\r\n <span ng-show=\"podCounters.valid\" class=\"badge badge-success\">{{podCounters.valid}}</span>\r\n <span ng-show=\"podCounters.waiting\" class=\"badge\">{{podCounters.waiting}}</span>\r\n <span ng-show=\"podCounters.error\" class=\"badge badge-warning\">{{podCounters.error}}</span>\r\n </a>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/appReplicationControllerTemplate.html","<div class=\"ngCellText\">\r\n <span ng-repeat=\"controller in row.entity.replicationControllers\">\r\n <a ng-href=\"{{controller | kubernetesPageLink}}\"\r\n title=\"View controller details\">\r\n <span>{{controller.metadata.name || controller.id}}</span>\r\n </a>\r\n &nbsp;\r\n <span class=\"pull-right\">\r\n <a class=\"badge badge-info\" href=\"\" ng-click=\"$emit(\'do-resize\', controller)\"\r\n title=\"Resize the number of replicas of this controller\">\r\n {{controller.spec.replicas || 0}}</a>\r\n </span>\r\n </span>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/appServicesTemplate.html","<div class=\"ngCellText\">\r\n <span ng-repeat=\"service in row.entity.services\">\r\n <a ng-href=\"{{service | kubernetesPageLink}}\"\r\n title=\"View service details\">\r\n <span>{{service.metadata.name ||service.name || service.id}}</span>\r\n </a>\r\n </span>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/apps.html","<div ng-controller=\"Kubernetes.Apps\">\r\n\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div ng-hide=\"appSelectorShow\">\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <span ng-show=\"model.apps.length && !id\">\r\n <hawtio-filter ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter apps...\"></hawtio-filter>\r\n </span>\r\n <span ng-hide=\"id\" class=\"pull-right\">\r\n <div class=\"btn-group\">\r\n <a class=\"btn btn-default\" ng-disabled=\"mode == \'list\'\" href=\"\" ng-click=\"mode = \'list\'\">\r\n <i class=\"fa fa-list\"></i></a>\r\n <a class=\"btn btn-default\" ng-disabled=\"mode == \'detail\'\" href=\"\" ng-click=\"mode = \'detail\'\">\r\n <i class=\"fa fa-table\"></i></a>\r\n </div>\r\n </span>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button ng-show=\"model.apps.length && mode == \'list\'\"\r\n class=\"btn btn-danger pull-right\"\r\n ng-disabled=\"!id && tableConfig.selectedItems.length == 0\"\r\n ng-click=\"deletePrompt(id || tableConfig.selectedItems)\">\r\n <i class=\"fa fa-remove\"></i> Delete\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n<!--\r\n <button ng-show=\"model.showRunButton\"\r\n class=\"btn btn-success pull-right\"\r\n ng-click=\"appSelectorShow = true\"\r\n title=\"Run an application\">\r\n <i class=\"fa fa-play-circle\"></i> Run ...\r\n </button>\r\n-->\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <span ng-include=\"\'runButton.html\'\"></span>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button ng-show=\"id\"\r\n class=\"btn btn-primary pull-right\"\r\n ng-click=\"id = undefined\"><i class=\"fa fa-list\"></i></button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched && !id\">\r\n <div ng-hide=\"model.apps.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no apps currently available.</p>\r\n </div>\r\n <div ng-show=\"model.apps.length\">\r\n <div ng-show=\"mode == \'list\'\">\r\n <table class=\"table table-bordered table-striped\" hawtio-simple-table=\"tableConfig\"></table>\r\n </div>\r\n <div ng-show=\"mode == \'detail\'\">\r\n <div class=\"app-detail\" ng-repeat=\"item in model.apps | filter:tableConfig.filterOptions.filterText | orderBy:\'$name\' track by $index\">\r\n <ng-include src=\"\'plugins/kubernetes/html/appDetailTemplate.html\'\"/>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched && id\">\r\n <div class=\"app-detail\">\r\n <ng-include src=\"\'plugins/kubernetes/html/appDetailTemplate.html\'\"/>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div ng-show=\"appSelectorShow\">\r\n <div class=\"col-md-7\">\r\n <div class=\"row\">\r\n <hawtio-filter ng-model=\"appSelector.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter apps...\"></hawtio-filter>\r\n </div>\r\n <div class=\"row\">\r\n <ul>\r\n <li class=\"no-list profile-selector-folder\" ng-repeat=\"folder in model.appFolders\"\r\n ng-show=\"appSelector.showFolder(folder)\">\r\n <div class=\"expandable\" ng-class=\"appSelector.isOpen(folder)\">\r\n <div title=\"{{folder.path}}\" class=\"title\">\r\n <i class=\"expandable-indicator folder\"></i> <span class=\"folder-title\" ng-show=\"folder.path\">{{folder.path.capitalize(true)}}</span><span\r\n class=\"folder-title\" ng-hide=\"folder.path\">Uncategorized</span>\r\n </div>\r\n <div class=\"expandable-body\">\r\n <ul>\r\n <li class=\"no-list profile\" ng-repeat=\"profile in folder.apps\" ng-show=\"appSelector.showApp(profile)\">\r\n <div class=\"profile-selector-item\">\r\n <div class=\"inline-block profile-selector-checkbox\">\r\n <input type=\"checkbox\" ng-model=\"profile.selected\"\r\n ng-change=\"appSelector.updateSelected()\">\r\n </div>\r\n <div class=\"inline-block profile-selector-name\" ng-class=\"appSelector.getSelectedClass(profile)\">\r\n <span class=\"contained c-max\">\r\n <a href=\"\" ng-click=\"appSelector.select(profile, !profile.selected)\"\r\n title=\"Details for {{profile.id}}\">\r\n <img ng-show=\"profile.$iconUrl\" class=\"icon-small-app\" ng-src=\"{{profile.$iconUrl}}\">\r\n <span class=\"app-name\">{{profile.name}}</span>\r\n </a>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-md-5\">\r\n <div class=\"row\">\r\n <button class=\"btn btn-primary pull-right\"\r\n ng-click=\"appSelectorShow = undefined\"><i class=\"fa fa-circle-arrow-left\"></i> Back\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button class=\"btn pull-right\"\r\n ng-disabled=\"!appSelector.selectedApps.length\"\r\n title=\"Clears the selected Apps\"\r\n ng-click=\"appSelector.clearSelected()\"><i class=\"fa fa-check-empty\"></i> Clear\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button class=\"btn btn-success pull-right\"\r\n ng-disabled=\"!appSelector.selectedApps.length\"\r\n ng-click=\"appSelector.runSelectedApps()\"\r\n title=\"Run the selected apps\">\r\n <i class=\"fa fa-play-circle\"></i>\r\n <ng-pluralize count=\"appSelector.selectedApps.length\"\r\n when=\"{\'0\': \'No App Selected\',\r\n \'1\': \'Run App\',\r\n \'other\': \'Run {} Apps\'}\"></ng-pluralize>\r\n\r\n </button>\r\n </div>\r\n <div class=\"row\">\r\n <!--\r\n <div ng-hide=\"appSelector.selectedApps.length\">\r\n <p class=\"alert pull-right\">\r\n Please select an App\r\n </p>\r\n </div>\r\n -->\r\n\r\n <div ng-show=\"appSelector.selectedApps.length\">\r\n\r\n <ul class=\"zebra-list pull-right\">\r\n <li ng-repeat=\"app in appSelector.selectedApps\">\r\n <img ng-show=\"app.$iconUrl\" class=\"icon-selected-app\" ng-src=\"{{app.$iconUrl}}\">\r\n <strong class=\"green selected-app-name\">{{app.name}}</strong>\r\n &nbsp;\r\n <i class=\"red clickable fa fa-remove\"\r\n title=\"Remove appp\"\r\n ng-click=\"appSelector.select(app, false)\"></i>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-include src=\"\'resizeDialog.html\'\"/>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/breadcrumbs.html","<div ng-show=\"breadcrumbConfig\" ng-init=\"breadcrumbConfig = $parent.breadcrumbConfig\"\r\n ng-controller=\"Developer.NavBarController\">\r\n <ol class=\"breadcrumb\">\r\n <li ng-repeat=\"breadcrumb in breadcrumbConfig\" ng-show=\"isValid(breadcrumb)\"\r\n class=\"{{breadcrumb.active ? \'active\' : \'\'}}\"\r\n title=\"{{breadcrumb.title}}\">\r\n <a ng-show=\"breadcrumb.href && !breadcrumb.active\" href=\"{{breadcrumb.href}}\">{{breadcrumb.label}}</a>\r\n <span ng-hide=\"breadcrumb.href && !breadcrumb.active\">{{breadcrumb.label}}</span>\r\n </ol>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/build.html","<div ng-controller=\"Kubernetes.BuildController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <a class=\"btn btn-default pull-right\"\r\n href=\"{{baseUri}}/kubernetes/builds\"><i class=\"fa fa-list\"></i></a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\" ng-show=\"entity.$configLink\"\r\n title=\"View the build configuration\"\r\n href=\"{{entity.$configLink}}\">\r\n Configuration\r\n </a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\" ng-show=\"entity.$podLink\"\r\n title=\"View the build pod\"\r\n href=\"{{entity.$podLink}}\">\r\n Pod\r\n </a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-primary pull-right\" ng-show=\"entity.$logsLink\"\r\n title=\"View the build logs\"\r\n href=\"{{entity.$logsLink}}\">\r\n View Log\r\n </a>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <div hawtio-object=\"entity\" config=\"config\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/buildConfig.html","<div ng-controller=\"Kubernetes.BuildConfigController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\" ng-show=\"entity.$editLink\" href=\"{{entity.$editLink}}\">\r\n <i class=\"fa fa-pencil-square-o\"></i> Edit\r\n </a>\r\n <div class=\"pull-right\" ng-repeat=\"view in entity.$fabric8Views | orderBy:\'label\'\">\r\n <a title=\"{{view.description}}\" ng-show=\"view.url\" ng-href=\"{{view.url}}\" class=\"btn btn-default\">\r\n <i class=\"{{view.iconClass}}\" ng-show=\"view.iconClass\"></i>\r\n {{view.label}}\r\n </a>\r\n <span class=\"pull-right\" ng-show=\"view.url\" >&nbsp;</span>\r\n </div>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button class=\"btn btn-primary pull-right\"\r\n title=\"Trigger this build\"\r\n ng-disabled=\"!entity.$triggerUrl\"\r\n ng-click=\"triggerBuild(entity)\"><i class=\"fa fa-play-circle-o\"></i> Trigger</button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <div hawtio-object=\"entity\" config=\"config\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/buildConfigEdit.html","<div ng-init=\"mode=\'edit\'\">\r\n <div ng-controller=\"Kubernetes.BuildConfigEditController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div ng-init=\"subTabConfig = tabs\" ng-include=\"\'plugins/kubernetes/html/tabs.html\'\"></div>\r\n <div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <button class=\"btn btn-primary pull-right\"\r\n title=\"Saves changes to this project configuration\"\r\n ng-disabled=\"!entity.metadata.name\"\r\n ng-click=\"save()\">\r\n Save Changes\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n\r\n <form name=\"nameForm\" ng-disabled=\"config.mode == 0\" class=\"form-horizontal\">\r\n <fieldset>\r\n <legend ng-show=\"config.label || config.description\" ng-hide=\"config.hideLegend\"\r\n class=\"ng-binding\"></legend>\r\n <div class=\"row\">\r\n <div class=\"clearfix col-md-12\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\">Name</label>\r\n <input type=\"text\" class=\"form-control\" placeholder=\"project name\" pattern=\"[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\" ng-model=\"entity.metadata.name\" required>\r\n\r\n <p class=\"form-warning bg-danger\" ng-show=\"nameForm.$error.pattern\">\r\n Project name must be a lower case DNS name with letters, numbers and dots or dashes such as `example.com`\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </fieldset>\r\n </form>\r\n\r\n\r\n <!--\r\n <div hawtio-form-2=\"config\" entity=\"entity\"></div>\r\n -->\r\n <div hawtio-form-2=\"specConfig\" entity=\"spec\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/buildConfigs.html","<div class=\"row\" ng-controller=\"Kubernetes.BuildConfigsController\">\r\n <script type=\"text/ng-template\" id=\"buildConfigLinkTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <a title=\"View details for this build configuration\"\r\n href=\"{{baseUri}}/kubernetes/buildConfigs/{{row.entity.metadata.name}}\">\r\n<!--\r\n <img class=\"app-icon-small\" ng-src=\"{{row.entity.$iconUrl}}\">\r\n-->\r\n {{row.entity.metadata.name}}</a>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildConfigViewsTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <span ng-repeat=\"view in row.entity.$fabric8Views track by $index\">\r\n <a title=\"{{view.description}}\" ng-show=\"view.url\" ng-href=\"{{view.url}}\" class=\"btn btn-default\">\r\n <i class=\"{{view.iconClass}}\" ng-show=\"view.iconClass\"></i>\r\n {{view.label}}\r\n </a>\r\n </span>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildConfigCodeViewsTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <span ng-repeat=\"view in row.entity.$fabric8CodeViews track by $index\">\r\n <a title=\"{{view.description}}\" ng-show=\"view.url\" ng-href=\"{{view.url}}\" class=\"btn btn-default\">\r\n <i class=\"{{view.iconClass}}\" ng-show=\"view.iconClass\"></i>\r\n {{view.label}}\r\n </a>\r\n </span>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildConfigBuildViewsTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <span ng-repeat=\"view in row.entity.$fabric8BuildViews track by $index\">\r\n <a title=\"{{view.description}}\" ng-show=\"view.url\" ng-href=\"{{view.url}}\" class=\"btn btn-default\">\r\n <i class=\"{{view.iconClass}}\" ng-show=\"view.iconClass\"></i>\r\n {{view.label}}\r\n </a>\r\n </span>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildConfigEnvironmentViewsTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <span ng-repeat=\"view in row.entity.$fabric8EnvironmentViews track by $index\">\r\n <a title=\"{{view.description}}\" ng-show=\"view.url\" ng-href=\"{{view.url}}\" class=\"btn btn-default\">\r\n <i class=\"{{view.iconClass}}\" ng-show=\"view.iconClass\"></i>\r\n {{view.label}}\r\n </a>\r\n </span>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildConfigTeamViewsTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <span ng-repeat=\"view in row.entity.$fabric8TeamViews track by $index\">\r\n <a title=\"{{view.description}}\" ng-show=\"view.url\" ng-href=\"{{view.url}}\" class=\"btn btn-default\">\r\n <i class=\"{{view.iconClass}}\" ng-show=\"view.iconClass\"></i>\r\n {{view.label}}\r\n </a>\r\n </span>\r\n </div>\r\n </script>\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <span>\r\n <hawtio-filter ng-show=\"buildConfigs.length\"\r\n ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter build configurations...\"></hawtio-filter>\r\n </span>\r\n <button ng-show=\"fetched\"\r\n title=\"Delete the selected build configuration\"\r\n class=\"btn btn-danger pull-right\"\r\n ng-disabled=\"tableConfig.selectedItems.length == 0\"\r\n ng-click=\"deletePrompt(tableConfig.selectedItems)\">\r\n <i class=\"fa fa-remove\"></i> Delete\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n title=\"Add a build configuration for an existing project\"\r\n href=\"{{baseUri}}/kubernetes/buildConfigCreate\"><i class=\"fa fa-wrench\"></i> Add Build</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-primary pull-right\" href=\"/workspaces/{{namespace}}/forge/createProject\"\r\n ng-show=\"isLoggedIntoGogs()\"\r\n title=\"Create a new app and repository\">\r\n <i class=\"fa fa-plus\"></i> Create Project</a>\r\n </a>\r\n <span class=\"pull-right\" ng-show=\"isLoggedIntoGogs()\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-primary pull-right\" href=\"/workspaces/{{namespace}}/forge/repos\"\r\n ng-hide=\"isLoggedIntoGogs()\"\r\n title=\"Sign in to gogs so that you can create a new app\">\r\n <i class=\"fa fa-sign-in\"></i> Sign In</a>\r\n </a>\r\n <span class=\"pull-right\" ng-hide=\"isLoggedIntoGogs()\">&nbsp;</span>\r\n\r\n <button class=\"btn btn-default pull-right\"\r\n title=\"Trigger the given build\"\r\n ng-disabled=\"tableConfig.selectedItems.length != 1 || !tableConfig.selectedItems[0].$triggerUrl\"\r\n ng-click=\"triggerBuild(tableConfig.selectedItems[0])\"><i class=\"fa fa-play-circle-o\"></i> Trigger</button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"model.buildconfigs.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no build configurations available.</p>\r\n <a class=\"btn btn-primary\" href=\"{{baseUri}}/kubernetes/buildConfigCreate\"><i class=\"fa fa-wrench\"></i> Add Build Configuration</a>\r\n </div>\r\n <div ng-show=\"model.buildconfigs.length\">\r\n <table class=\"table table-bordered table-striped\" ui-if=\"kubernetes.selectedNamespace\"\r\n hawtio-simple-table=\"tableConfig\"></table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/buildLogs.html","<div ng-controller=\"Kubernetes.BuildLogsController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\" ng-show=\"entity.$viewLink\"\r\n title=\"View the build detail\"\r\n href=\"{{entity.$viewLink}}\">\r\n Build\r\n </a>\r\n <a class=\"btn btn-primary pull-right\" ng-show=\"entity.$configLink\"\r\n title=\"View the build configuration\"\r\n href=\"{{entity.$configLink}}\">\r\n Configuration\r\n </a>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <h3>logs for {{entity.$configId}}</h3>\r\n\r\n <p>\r\n <pre>\r\n <code>\r\n {{logsText}}\r\n </code>\r\n </pre>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/builds.html","<div class=\"row\" ng-controller=\"Kubernetes.BuildsController\">\r\n <script type=\"text/ng-template\" id=\"buildLinkTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <a title=\"View details for this build: {{row.entity.$name}}\"\r\n href=\"{{row.entity.$viewLink}}\">\r\n <!--\r\n <img class=\"app-icon-small\" ng-src=\"{{row.entity.$iconUrl}}\">\r\n -->\r\n {{row.entity.$shortName}}\r\n </a>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildPodTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <a title=\"View the pod for this build: {{row.entity.podName}}\" ng-show=\"row.entity.$podLink\"\r\n href=\"{{row.entity.$podLink}}\">\r\n {{row.entity.$podShortName}}</a>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildLogsTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <a title=\"View the log for this build\" ng-show=\"row.entity.$logsLink\"\r\n href=\"{{row.entity.$logsLink}}\">\r\n <i class=\"fa fa-file-text-o\"></i> Logs\r\n </a>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildRepositoryTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <a ng-show=\"row.entity.spec.source.git.uri\" target=\"gitRepository\"\r\n title=\"View the git based source repository\"\r\n href=\"{{row.entity.spec.source.git.uri}}\">\r\n {{row.entity.spec.source.git.uri}}\r\n </a>\r\n <span ng-hide=\"row.entity.spec.source.git.uri\">\r\n {{row.entity.spec.source.git.uri}}\r\n </span>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildStatusTemplate.html\">\r\n <div class=\"ngCellText\" ng-switch=\"row.entity.status.phase\">\r\n <span ng-switch-when=\"New\" class=\"text-primary\">\r\n <i class=\"fa fa-spin fa-spinner\"></i> New\r\n </span>\r\n <span ng-switch-when=\"Pending\" class=\"text-primary\">\r\n <i class=\"fa fa-spin fa-spinner\"></i> Pending\r\n </span>\r\n <span ng-switch-when=\"Running\" class=\"text-primary\">\r\n <i class=\"fa fa-spin fa-spinner\"></i> Running\r\n </span>\r\n <span ng-switch-when=\"Complete\" class=\"text-success\">\r\n <i class=\"fa fa-check-circle\"></i> Complete\r\n </span>\r\n <span ng-switch-when=\"Failed\" class=\"text-danger\">\r\n <i class=\"fa fa-exclamation-circle\"></i> Failed\r\n </span>\r\n <span ng-switch-default class=\"text-warning\">\r\n <i class=\"fa fa-exclamation-triangle\"></i> {{row.entity.status}}\r\n </span>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"buildTimeTemplate.html\">\r\n <div class=\"ngCellText\" title=\"built at: {{row.entity.$creationDate | date : \'h:mm:ss a, EEE MMM yyyy\'}}\">\r\n {{row.entity.$creationDate.relative()}}\r\n </div>\r\n </script>\r\n\r\n\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\" >\r\n <span ng-show=\"!id\">\r\n <hawtio-filter ng-show=\"model.builds.length\"\r\n ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter builds...\"></hawtio-filter>\r\n </span>\r\n <div class=\"pull-right\" ng-repeat=\"view in buildConfig.$fabric8BuildViews | orderBy:\'label\'\">\r\n <a title=\"{{view.description}}\" ng-show=\"view.url\" ng-href=\"{{view.url}}\" class=\"btn btn-default\">\r\n <i class=\"{{view.iconClass}}\" ng-show=\"view.iconClass\"></i>\r\n {{view.label}}\r\n </a>\r\n <span class=\"pull-right\" ng-show=\"view.url\" >&nbsp;</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <div ng-hide=\"model.builds.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no builds currently running.</p>\r\n </div>\r\n <div ng-show=\"model.builds.length\">\r\n <table class=\"table table-bordered table-striped\" hawtio-simple-table=\"tableConfig\"></table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/deploymentConfig.html","<div ng-controller=\"Kubernetes.DeploymentConfigController\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n href=\"{{baseUri}}/kubernetes/deploymentConfigs\"><i class=\"fa fa-list\"></i></a>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <div hawtio-object=\"entity\" config=\"config\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/deploymentConfigs.html","<div class=\"row\" ng-controller=\"Kubernetes.DeploymentConfigsController\">\r\n <script type=\"text/ng-template\" id=\"deploymentConfigLinkTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <a title=\"View details for this build configuration\"\r\n href=\"{{baseUri}}/kubernetes/deploymentConfigs/{{row.entity.metadata.name}}\">\r\n<!--\r\n <img class=\"app-icon-small\" ng-src=\"{{row.entity.$iconUrl}}\">\r\n-->\r\n {{row.entity.metadata.name}}</a>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"deploymentConfigLabelTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <span ng-repeat=\"(key, label) in row.entity.template.controllerTemplate.template.metadata.labels track by $index\"\r\n class=\"pod-label badge\"\r\n ng-class=\"labelClass(key)\"\r\n ng-click=\"clickTag(entity, key, label)\"\r\n title=\"{{key}}\">{{label}}</span>\r\n </div>\r\n </script>\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <span>\r\n <hawtio-filter ng-show=\"deploymentConfigs.length\"\r\n ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter deployment configurations...\"></hawtio-filter>\r\n </span>\r\n <button ng-show=\"fetched && deploymentConfigs.length\"\r\n title=\"Delete the selected build configuration\"\r\n class=\"btn btn-danger pull-right\"\r\n ng-disabled=\"tableConfig.selectedItems.length == 0\"\r\n ng-click=\"deletePrompt(tableConfig.selectedItems)\">\r\n <i class=\"fa fa-remove\"></i> Delete\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n title=\"Create a new build configuration\"\r\n href=\"{{baseUri}}/kubernetes/buildConfigCreate\"><i class=\"fa fa-plus\"></i> Create</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button class=\"btn btn-primary pull-right\"\r\n ng-show=\"fetched && deploymentConfigs.length\"\r\n title=\"Trigger the given build\"\r\n ng-disabled=\"tableConfig.selectedItems.length != 1 || !tableConfig.selectedItems[0].$triggerUrl\"\r\n ng-click=\"triggerBuild(tableConfig.selectedItems[0])\"><i class=\"fa fa-play-circle-o\"></i> Trigger</button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <div ng-hide=\"deploymentConfigs.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no deployment configurations available.</p>\r\n <a class=\"btn btn-primary\" href=\"{{baseUri}}/kubernetes/deploymentConfigCreate\"><i class=\"fa fa-plus\"></i> Create Deployment Configuration</a>\r\n </div>\r\n <div ng-show=\"deploymentConfigs.length\">\r\n <table class=\"table table-bordered table-striped\" ui-if=\"kubernetes.selectedNamespace\"\r\n hawtio-simple-table=\"tableConfig\"></table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/events.html","<div ng-controller=\"Kubernetes.EventsController\">\r\n\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\" ng-show=\"model.events.length\">\r\n <span ng-show=\"!id\">\r\n <hawtio-filter ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"筛选日志信息...\"></hawtio-filter>\r\n </span>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button ng-show=\"id\"\r\n class=\"btn btn-primary pull-right\"\r\n ng-click=\"id = undefined\"><i class=\"fa fa-list\"></i></button>\r\n <span ng-include=\"\'runButton.html\'\"></span>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"model.events.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no events currently available.</p>\r\n </div>\r\n <div ng-show=\"model.events.length\">\r\n <div ng-show=\"mode == \'list\'\">\r\n <table class=\"table table-bordered table-striped\" ui-if=\"kubernetes.selectedNamespace\"\r\n hawtio-simple-table=\"tableConfig\"></table>\r\n </div>\r\n\r\n <div ng-hide=\"mode == \'list\'\">\r\n <div class=\"column-box\"\r\n ng-repeat=\"service in model.serviceApps | filter:filterTemplates | orderBy:\'metadata.name\' track by $index\">\r\n <div class=\"row\">\r\n <div class=\"col-md-2\">\r\n <a href=\"{{service.$serviceUrl}}\"\r\n target=\"_blank\"\r\n title=\"Click to open this app\">\r\n <img style=\"width: 64px; height: 64px;\" ng-src=\"{{service.$iconUrl}}\">\r\n </a>\r\n </div>\r\n <div class=\"col-md-9\">\r\n <a href=\"{{service.$serviceUrl}}\"\r\n target=\"_blank\"\r\n title=\"Click to open this app\">\r\n <h3 ng-bind=\"service.metadata.name\"></h3>\r\n </a>\r\n </div>\r\n<!--\r\n <div class=\"col-md-1\">\r\n <a href=\"\" ng-click=\"deleteService(service)\"><i class=\"fa fa-remove red\"></i></a>\r\n </div>\r\n-->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/host.html","<div ng-controller=\"Kubernetes.HostController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n href=\"{{baseUri}}/kubernetes/hosts\"><i class=\"fa fa-list\"></i></a>\r\n <a class=\"btn btn-default pull-right\"\r\n ng-click=\"flipRaw()\"\r\n title=\"{{rawMode ? \'Raw mode\' : \'Form mode\'}}\">{{rawMode ? \'Form\' : \'Raw\'}}</a>\r\n <a class=\"btn btn-default pull-right\" ng-show=\"rawMode\" ng-click=\"readOnly = !readOnly\" ng-class=\"!readOnly ? \'btn-primary\' : \'\'\">Edit</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-success pull-right\" ng-show=\"dirty\" ng-click=\"save(rawModel)\">Save</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-primary pull-right\"\r\n title=\"View all the pods on this host\"\r\n href=\"{{baseUri}}/kubernetes/pods/?q=host={{item.id}}\">\r\n Pods\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched && !rawMode\">\r\n <div hawtio-object=\"item\" config=\"itemConfig\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"span12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched && rawMode\">\r\n <div class=\"row-fluid wiki-fixed form-horizontal\">\r\n <div class=\"control-group editor-autoresize\">\r\n <div hawtio-editor=\"rawModel\" mode=\"mode\" read-only=\"readOnly\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/hosts.html","<div class=\"row\" ng-controller=\"Kubernetes.HostsController\">\r\n <script type=\"text/ng-template\" id=\"hostLinkTemplate.html\">\r\n <div class=\"ngCellText\">\r\n </div>\r\n </script>\r\n\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <span ng-show=\"!id\">\r\n <hawtio-filter ng-show=\"model.hosts.length\"\r\n ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter hosts...\"></hawtio-filter>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"model.hosts.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no hosts currently running.</p>\r\n </div>\r\n <div ng-show=\"model.hosts.length\">\r\n <table class=\"table table-bordered table-striped\" ui-if=\"kubernetes.selectedNamespace\"\r\n hawtio-simple-table=\"tableConfig\"></table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/imageRepositories.html","<div class=\"row\" ng-controller=\"Kubernetes.ImageRepositoriesController\">\r\n <script type=\"text/ng-template\" id=\"imageRegistryLabelTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <span ng-repeat=\"(key, label) in row.entity.tags track by $index\"\r\n class=\"pod-label badge\"\r\n ng-class=\"labelClass(key)\"\r\n ng-click=\"clickTag(entity, key, label)\"\r\n title=\"{{key}}\">{{label}}</span>\r\n </div>\r\n </script>\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <span>\r\n <hawtio-filter ng-show=\"imageRepositories.length\"\r\n ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter image repositories...\"></hawtio-filter>\r\n </span>\r\n <button ng-show=\"fetched && imageRepositories.length\"\r\n title=\"Delete the selected build configuration\"\r\n class=\"btn btn-danger pull-right\"\r\n ng-disabled=\"tableConfig.selectedItems.length == 0\"\r\n ng-click=\"deletePrompt(tableConfig.selectedItems)\">\r\n <i class=\"fa fa-remove\"></i> Delete\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n title=\"Create a new image repository\"\r\n href=\"{{baseUri}}/kubernetes/imageRepositoryCreate\"><i class=\"fa fa-plus\"></i> Create</a>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <div ng-hide=\"imageRepositories.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no image repositories available.</p>\r\n <a class=\"btn btn-primary\" href=\"{{baseUri}}/kubernetes/imageRepositoryCreate\"><i class=\"fa fa-plus\"></i> Create Image Repository</a>\r\n </div>\r\n <div ng-show=\"imageRepositories.length\">\r\n <table class=\"table table-bordered table-striped\" ui-if=\"kubernetes.selectedNamespace\"\r\n hawtio-simple-table=\"tableConfig\"></table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/importProject.html","<div ng-init=\"mode=\'create\'\">\r\n <div ng-controller=\"Kubernetes.BuildConfigEditController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <button class=\"btn btn-primary pull-right\"\r\n title=\"Saves changes to this project configuration\"\r\n ng-disabled=\"!entity.metadata.name\"\r\n ng-click=\"save()\">\r\n Save Changes\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n\r\n <p class=\"hero-unit\">\r\n Create a project by entering or copy/pasting the Git URL for a repository, and give the project a name. By default the name will be based on the repository name.\r\n </p>\r\n\r\n <div hawtio-form-2=\"specConfig\" entity=\"spec\"></div>\r\n\r\n <form name=\"nameForm\" ng-disabled=\"config.mode == 0\" class=\"form-horizontal\">\r\n <fieldset>\r\n <div class=\"row\">\r\n <div class=\"clearfix col-md-12\">\r\n <div class=\"form-group\">\r\n <label class=\"control-label\">Name</label>\r\n <input type=\"text\" class=\"form-control\" pattern=\"[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\" ng-model=\"entity.metadata.name\" required>\r\n\r\n <p class=\"form-warning bg-danger\" ng-show=\"nameForm.$error.pattern\">\r\n Project name must be a lower case DNS name with letters, numbers and dots or dashes such as `example.com`\r\n </p>\r\n <p class=\"help-block\">Name of this project</p>\r\n </div>\r\n </div>\r\n </div>\r\n </fieldset>\r\n </form>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/kubernetesJsonDirective.html","<div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div class=\"fabric-page-header row\">\r\n\r\n <div class=\"pull-left\" ng-show=\"iconURL\">\r\n <div class=\"app-logo\">\r\n <img ng-src=\"{{iconURL}}\">&nbsp;\r\n </div>\r\n </div>\r\n <div class=\"pull-left\">\r\n <h2 class=\"list-inline\"><span class=\"contained c-wide3\">&nbsp;{{displayName || appTitle}}</span></h2>\r\n </div>\r\n <div class=\"pull-right\">\r\n <button class=\"btn btn-success pull-right\"\r\n title=\"Run this application\"\r\n ng-disabled=\"!config || config.error\"\r\n ng-click=\"apply()\">\r\n <i class=\"fa fa-play-circle\"></i> Run\r\n </button>\r\n </div>\r\n <div class=\"pull-left col-md-10 profile-summary-wide\">\r\n <div\r\n ng-show=\"summaryHtml\"\r\n ng-bind-html-unsafe=\"summaryHtml\"></div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/layoutKubernetes.html","<script type=\"text/ng-template\" id=\"runButton.html\">\r\n <button ng-show=\"model.showRunButton\" class=\"btn btn-success pull-right\" ng-click=\"viewTemplates()\" title=\"Run an application from a template\">\r\n <i class=\"fa fa-play-circle\"></i> Run ...\r\n </button>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"idTemplate.html\">\r\n <div class=\"ngCellText nowrap\">\r\n <a href=\"\" title=\"View details for {{row.entity.metadata.name || row.entity.name}}\">\r\n <!--<img class=\"app-icon-small\" ng-src=\"{{row.entity.$iconUrl}}\" ng-show=\"row.entity.$iconUrl\">-->\r\n <strong>{{row.entity.$oracleName || row.entity.name}}</strong></a>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"selectorTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <span ng-repeat=\"(name, value) in row.entity.spec.selector track by $index\">\r\n <strong>{{name}}</strong>: {{value}}\r\n </span>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"podCountsAndLinkTemplate.html\">\r\n <div class=\"ngCellText\" ng-init=\"entity=row.entity\" ng-controller=\"Kubernetes.Status\">\r\n <a ng-show=\"row.entity.$podCounters.podsLink\" title=\"pods status\">\r\n <span ng-show=\"row.entity.$podCounters.ready && (row.entity.$oracleStatus===2)\" class=\"badge badge-success\"> 启动</span>\r\n <span ng-show=\"row.entity.$podCounters.ready && (row.entity.$oracleStatus===0)\" class=\"badge badge-info\"> 等待</span>\r\n <span ng-show=\"row.entity.$podCounters.ready && (row.entity.$oracleStatus===1)\" class=\"badge badge-important \"> 失败</span>\r\n <span ng-show=\"row.entity.$podCounters.valid || row.entity.$podCounters.waiting\" class=\"badge badge-info\"> 等待</span>\r\n <span ng-show=\"!(row.entity.$podCounters.waiting || row.entity.$podCounters.ready || row.entity.$podCounters.valid || row.entity.$podCounters.error)\" class=\"badge\"> 停止</span>\r\n <span ng-show=\"row.entity.$podCounters.error\" class=\"badge badge-important\"> 失败</span>\r\n </a>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"dataSummaryTemplate.html\">\r\n <div class=\"ngCellText\" ng-init=\"entity=row.entity\">\r\n <a ng-show=\"row.entity.$podCounters.podsLink\" title=\"pods status\">\r\n <span ng-show=\"row.entity.$extractStatus === 0\" class=\"badge badge-info\"> 待汇总</span>\r\n <div ng-show=\"row.entity.$extractStatus === 1\">\r\n <span class=\"badge badge-success\" > 汇总中</span>\r\n <span ng-include=\"\'oracleLogTemplate.html\'\"></span>\r\n </div>\r\n <div ng-show=\"row.entity.$extractStatus === 2\">\r\n <span class=\"badge\" > 已完成</span>\r\n <span ng-include=\"\'oracleLogTemplate.html\'\"></span>\r\n </div> \r\n </a>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"labelTemplate.html\">\r\n <div class=\"ngCellText\" ng-init=\"entity=row.entity\" ng-controller=\"Kubernetes.Labels\">\r\n <p ng-show=\"data\"><strong>Labels</strong></p>\r\n <span ng-repeat=\"label in labels track by $index\" class=\"pod-label badge\" ng-class=\"labelClass(label.key)\" ng-click=\"handleClick(entity, label.key, label)\" title=\"{{label.key}}\"><span class=\"glyphicon glyphicon-tag\"/> {{label.title}}</span>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"eventSourceTemplate.html\">\r\n <div class=\"ngCellText\" ng-init=\"labels=row.entity.source\">\r\n <p ng-show=\"data\"><strong>Labels</strong></p>\r\n <span ng-repeat=\"(key, value) in labels track by $index\" class=\"pod-label badge\" class=\"background-light-grey mouse-pointer\" title=\"{{key}}\" ng-click=\"$emit(\'labelFilterUpdate\', key + \'=\' + value)\">{{value}}</span>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"dataLabelsTemplate.html\">\r\n <div class=\"ngCellText\" ng-init=\"labels=row.entity.labels\" ng-controller=\"Kubernetes.DataLabels\">\r\n <p ng-show=\"data\"><strong>Labels</strong></p>\r\n <span ng-repeat=\"(key, value) in labels track by $index\" class=\"pod-label badge\" ng-class=\"labelClass(key)\" ng-click=\"labelClick(entity, key, value)\" title=\"{{key}}\"><span class=\"glyphicon glyphicon-tag\"/> {{value}}</span>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"hostTemplate.html\">\r\n <div class=\"ngCellText\" ng-init=\"host=row.entity.$host\">\r\n <span class=\"pod-label badge background-light-grey mouse-pointer\" ng-click=\"$emit(\'labelFilterUpdate\', \'host=\' + host)\">{{host}}</span>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"portalAddress.html\">\r\n <div class=\"ngCellText\">\r\n <div ng-repeat=\"port in row.entity.$ports track by $index\">\r\n <a target=\"_blank\" href=\"{{row.entity.$connectUrl}}\" ng-show=\"row.entity.$connectUrl && row.entity.$podCounters.ready\" title=\"Protocol {{row.entity.spec.protocol}}\">\r\n {{row.entity.$host}}\r\n </a>\r\n <span ng-hide=\"row.entity.$connectUrl && row.entity.$podCounters.ready\">{{row.entity.spec.portalIP || row.entity.spec.clusterIP}}:{{port}}</span>\r\n </div>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"iconCellTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <img class=\"app-icon-small\" ng-src=\"{{row.entity.$iconUrl}}\">\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"ageTemplate.html\">\r\n <div class=\"ngCellText \" ng-model=\"row.entity.$pods[0].$age\">\r\n {{row.entity.$pods[0].$age}}\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"firstTimestampTemplate.html\">\r\n <div class=\"ngCellText\" title=\"{{row.entity.$firstTimestamp}}\">\r\n {{row.entity.$firstTimestamp | relativeTime}}\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"lastTimestampTemplate.html\">\r\n <div class=\"ngCellText\" title=\"{{row.entity.$lastTimestamp}}\">\r\n {{row.entity.$lastTimestamp | relativeTime}}\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"eventKindTemplate.html\">\r\n <div class=\"ngCellText\" ng-init=\"kind=row.entity.involvedObject.kind\">\r\n <span class=\"pod-label badge\" class=\"background-light-grey mouse-pointer\" ng-click=\"$emit(\'labelFilterUpdate\', \'kind=\' + kind)\">{{kind}}</span>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"eventNameTemplate.html\">\r\n <div class=\"ngCellText\" ng-init=\"name=row.entity.involvedObject.name\">\r\n <span class=\"pod-label badge\" class=\"background-light-grey mouse-pointer\" ng-click=\"$emit(\'labelFilterUpdate\', \'name=\' + name)\">{{name}}</span>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"eventSummaryTemplate.html\">\r\n <div class=\"ngCellText\" title=\"Number of events on this resource\">\r\n <a ng-show=\"row.entity.$pods[0].$eventsLink\" href=\"{{row.entity.$pods[0].$eventsLink}}\">\r\n <span class=\"badge\">{{row.entity.$pods[0].$events.length}}</span>\r\n </a>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"connectTemplate.html\">\r\n <span ng-show=\"entity.$jolokiaUrl && entity.$ready\" ng-controller=\"Kubernetes.ConnectController\">\r\n <a class=\"clickable\"\r\n ng-click=\"doConnect(row.entity)\"\r\n title=\"Open a new window and connect to this container\">\r\n <i class=\"fa fa-sign-in\"></i>\r\n </a>\r\n </span>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"termTemplate.html\">\r\n <span ng-show=\"entity.status.phase === \'Running\'\" ng-controller=\"Kubernetes.TermController\">\r\n <span ng-repeat=\"container in entity.spec.containers\" ng-show=\"canConnectTo(container)\">\r\n <i class=\"fa fa-television clickable\" title=\"Open up a terminal to {{container.name}}\" ng-click=\"openTerminal(entity.metadata.selfLink, container.name)\"></i>\r\n </span>\r\n </span>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"logIconTemplate.html\">\r\n <span ng-show=\"entity.status.phase === \'Running\'\" ng-controller=\"Kubernetes.PodLogLinkController\">\r\n <i class=\"fa fa-file-text\" title=\"Open up the logs for {{entity.metadata.name}}\" ng-click=\"openLogs(entity)\"></i>\r\n </span>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"oracleLogTemplate.html\">\r\n <span ng-controller=\"Kubernetes.PodLogLinkController\">\r\n <i class=\"fa fa-file-text\" title=\"打开{{entity.$oracleName}}的汇总日志\" ng-click=\"openLogs(entity)\"></i>\r\n </span>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"connectParamTemplate.html\">\r\n <div class=\"ngCellText\" ng-init=\"entity=row.entity\">\r\n <div ng-show=\"row.entity.$pods.length && row.entity.$pods[0].$host && row.entity.$pods[0].spec.containers[0].ports[0].hostPort\"><strong>{{row.entity.$pods[0].$host}}:{{row.entity.$pods[0].spec.containers[0].ports[0].hostPort}}/orcl</strong>\r\n <button class=\"btn\" zero-clipboard data-clipboard-text=\"{{row.entity.$pods[0].$host}}:{{row.entity.$pods[0].spec.containers[0].ports[0].hostPort}}/orcl\" title=\"点击复制\">\r\n <i class=\"fa fa-copy\"></i></button>\r\n </div>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"statusTemplate.html\">\r\n <div class=\"ngCellText nowrap\" ng-init=\"entity=row.entity\" ng-controller=\"Kubernetes.PodStatus\" title=\"Pod {{entity.metadata.name}} is {{entity.status.phase}}\">\r\n <!-- in detail view -->\r\n <p ng-show=\"data\"><strong>Status: </strong></p>\r\n <i class=\"fa {{entity.$statusCss}}\"></i>\r\n <span ng-show=\"data\">{{data}}</span>\r\n <!-- in table -->\r\n <span ng-include=\"\'connectTemplate.html\'\"></span>\r\n <span ng-include=\"\'termTemplate.html\'\"></span>\r\n <span ng-include=\"\'logIconTemplate.html\'\"></span>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"resizeDialog.html\">\r\n <div modal=\"resizeDialog.dialog.show\">\r\n <form class=\"form-horizontal\" ng-submit=\"resizeDialog.onOk()\">\r\n <div class=\"modal-header\">\r\n <h4>Scale {{resizeDialog.controller.metadata.name}}</h4></div>\r\n <div class=\"modal-body\">\r\n <div class=\"control-group\">\r\n <label class=\"control-label\" for=\"replicas\">Number of pods you would like to scale to?</label>\r\n <div class=\"controls\">\r\n <input type=\"number\" min=\"0\" id=\"replicas\" ng-model=\"resizeDialog.newReplicas\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <input class=\"btn btn-primary\" type=\"submit\" ng-disabled=\"resizeDialog.newReplicas === resizeDialog.controller.status.replicas\" value=\"Resize\">\r\n <button class=\"btn btn-warning cancel sj_btn_grey\" type=\"button\" ng-click=\"resizeDialog.close()\">取消</button>\r\n </div>\r\n </form>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"namespaceSelector.html\">\r\n <span ng-controller=\"Kubernetes.NamespaceController\">\r\n namespace:\r\n <select ng-model=\"namespace\" ng-options=\"namespace for namespace in namespaces\"\r\n title=\"choose the namespace - which is a selection of resources in kubernetes\">\r\n </select>\r\n </span>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"pendingPipelines.html\">\r\n <div class=\"row\" ng-controller=\"Developer.PipelinesController\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"model.job.builds.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no pipelines for this job.</p>\r\n </div>\r\n <div ng-show=\"model.job.builds.length\">\r\n <div class=\"pipeline-build-block\" ng-repeat=\"build in model.job.builds | filter:model.filterText track by $index\">\r\n <div pipeline-view></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"taskEdit.html\">\r\n <div class=\"ngCellText\" ng-init=\"entity=row.entity\" ng-controller=\"Kubernetes.TaskEdit\">\r\n <button class=\"btn sj_btn\" ng-click=\"showDeleteOne.open(entity)\">\r\n <span class=\"glyphicon glyphicon-trash\"></span>&nbsp;&nbsp;删除\r\n </button>\r\n <div hawtio-confirm-dialog=\"showDeleteOne.show\" title=\"是否删除任务?\" ok-button-text=\"确认\" cancel-button-text=\"取消\" on-cancel=\"showDeleteOne.onCancelled()\" on-ok=\"showDeleteOne.onOk()\">\r\n <div class=\"dialog-body\">\r\n <p>\r\n 是否删除:{{entity.name}}-{{entity.systemName}} 任务?\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n</script>\r\n<!-- 迁移进度条 -->\r\n<script type=\"text/ng-template\" id=\"taskProcess.html\">\r\n <div class=\"ngCellText progress\" ng-init=\"entity=row.entity\">\r\n <div ng-show=\"entity.status!==3\" class=\"progress-bar progress-bar-success active sj_progress_bar \" role=\"progressbar\" aria-valuenow=\"{{entity.process}}\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: {{entity.process}}%\">\r\n <span class=\"sj_progress_font\">{{entity.process}}%</span>\r\n </div>\r\n <div ng-show=\"entity.status ===3\" class=\"progress-bar progress-bar-danger active sj_progress_bar\" role=\"progressbar\" aria-valuenow=\"{{entity.process}}\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: {{entity.process}}%\" title=\"{{entity.process}}%\">\r\n <span class=\"sj_progress_font\">{{entity.process}}%</span>\r\n </div>\r\n </div>\r\n</script>\r\n<!--迁移状态显示 -->\r\n<script type=\"text/ng-template\" id=\"taskStatus.html\">\r\n <div class=\"ngCellText\" ng-init=\"entity=row.entity\">\r\n <div ng-show=\"entity.status == 0\">\r\n <sapn class=\"glyphicon glyphicon-minus\"> 待迁移\r\n </div>\r\n <div ng-show=\"entity.status == 1\"> \r\n <span class=\"glyphicon glyphicon-transfer\"> 迁移中\r\n </div>\r\n <div ng-show=\"entity.status == 2\"> \r\n <span class=\"glyphicon glyphicon-ok\"> 已完成\r\n </div>\r\n <div ng-show=\"entity.status == 3\"> \r\n <span class=\"glyphicon glyphicon-remove\"> 失败\r\n </div>\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"creationTimeTemplate.html\">\r\n <div class=\"ngCellText\" title=\"created at: {{row.entity.$creationDate | date : \'h:mm:ss a, EEE MMM yyyy\'}}\">\r\n {{row.entity.$creationDate.relative()}}\r\n </div>\r\n</script>\r\n<script type=\"text/ng-template\" id=\"dataExtractTemplate.html\">\r\n <div class=\"ngCellText\" ng-init=\"entity=row.entity\">\r\n <span ng-show=\"entity.extractStatus == 0\" class=\"badge badge-info\"> 待汇总</span>\r\n <span ng-show=\"entity.extractStatus == 1\" class=\"badge badge-success\"> 汇总中</span>\r\n <span ng-show=\"entity.extractStatus == 2\" class=\"badge\"> 已完成</span>\r\n </div>\r\n</script>\r\n\r\n<script type=\"text/ng-template\" id=\"loadingMask.html\">\r\n <div class=\"custom-alert\"> \r\n <div id=\"loading\">\r\n <span ng-bind=\"ngDialogData.msg\" />\r\n </div> \r\n </div>\r\n</script>\r\n\r\n<script type=\"text/ng-template\" id=\"dataCheckStatus.html\">\r\n <div class=\"ngCellText\" ng-init=\"entity=row.entity\">\r\n <span ng-show=\"entity.metadata.annotations.checkoutFlag == 0\">未校验</span>\r\n <span ng-show=\"entity.metadata.annotations.checkoutFlag == 1\">已校验</span>\r\n <span ng-show=\"entity.metadata.annotations.checkoutFlag == 2\">校验中</span> \r\n </div>\r\n</script>\r\n\r\n<div ng-controller=\"Kubernetes.TopLevel\">\r\n <div class=\"wiki-icon-view\" ng-controller=\"Kubernetes.FileDropController\" nv-file-drop nv-file-over uploader=\"uploader\" over-class=\"ready-drop\">\r\n <div class=\"row kubernetes-view\" ng-view></div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/logShell.html","<div class=\"terminal-window pod-log-window\" pod-log-window ng-mousedown=\"raise()\">\r\n <div class=\"resize-dot\" ng-mousedown=\"startResize($event)\" ng-hide=\"docked\"></div>\r\n <div class=\"centered scroll-indicator\" ng-hide=\"atBottom\" ng-click=\"atBottom = true\">\r\n <span class=\"fa fa-caret-down\"></span>\r\n </div>\r\n <div class=\"terminal-title\" ng-mousedown=\"mouseDown($event)\" ng-mouseup=\"mouseUp($event)\" ng-mousemove=\"mouseMove($event)\">\r\n <h5 class=\"top-bottom-middle\">{{containerName}}的汇总日志</h5>\r\n <i class=\"fa fa-remove pull-right clickable\" title=\"Close and exit this log\" ng-click=\"close()\"></i>\r\n <i class=\"fa fa-square-o pull-right clickable\" title=\"Maximize this log\" ng-click=\"maximize($event)\"></i>\r\n <i class=\"fa fa-sort-desc pull-right clickable\" ng-hide=\"maximized()\" title=\"Minimize this log\" ng-click=\"minimize($event)\"></i>\r\n </div>\r\n <!--<div class=\"terminal-body\" scroll-glue ng-model=\"atBottom\" style=\"overflow-y:hidden\"> -->\r\n <textarea style=\"height:100%; width:100%\" disabled=\"disabled\">{{logs}}</textarea>\r\n <!--</div>-->\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/overview.html","<div ng-controller=\"Kubernetes.OverviewController\">\r\n <script type=\"text/ng-template\" id=\"serviceBoxTemplate.html\">\r\n <div>\r\n <div class=\"align-left node-body\">{{entity.$portsText}}</div>\r\n <div class=\"align-right node-header\" title=\"{{entity.metadata.name}}\" ng-bind=\"entity.metadata.name\"></div>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"serviceTemplate.html\">\r\n <div class=\"kubernetes-overview-row\">\r\n <div class=\"kubernetes-overview-cell\">\r\n <div id=\"{{service._key}}\"\r\n namespace=\"{{service.metadata.namespace}}\"\r\n connect-to=\"{{service.connectTo}}\"\r\n data-type=\"service\"\r\n class=\"jsplumb-node kubernetes-node kubernetes-service-node\"\r\n ng-controller=\"Kubernetes.OverviewBoxController\"\r\n ng-init=\"entity=getEntity(\'service\', \'{{service._key}}\')\"\r\n ng-mouseenter=\"mouseEnter($event)\"\r\n ng-mouseleave=\"mouseLeave($event)\"\r\n ng-click=\"viewDetails(entity, \'services\')\">\r\n <div ng-init=\"entity=entity\" ng-include=\"\'serviceBoxTemplate.html\'\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"overviewHostTemplate.html\">\r\n <div class=\"kubernetes-overview-row\">\r\n <div class=\"kubernetes-overview-cell\">\r\n <div id=\"{{host.elementId}}\"\r\n data-type=\"host\"\r\n class=\"kubernetes-host-container host\">\r\n <h5><img ng-src=\"{{host.$iconUrl}}\" style=\"width: 32px; height: 32px;\">\r\n <a ng-href=\"{{baseUri}}/kubernetes/hosts/{{host.id}}\">{{host.id}}</a>\r\n </h5>\r\n <div class=\"pod-container\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"podTemplate.html\">\r\n <div id=\"{{pod._key}}\"\r\n data-type=\"pod\"\r\n title=\"Pod ID: {{pod.metadata.name}}\"\r\n class=\"jsplumb-node kubernetes-node kubernetes-pod-node\"\r\n ng-mouseenter=\"mouseEnter($event)\"\r\n ng-mouseleave=\"mouseLeave($event)\"\r\n ng-controller=\"Kubernetes.OverviewBoxController\"\r\n ng-init=\"entity=getEntity(\'pod\', \'{{pod._key}}\')\"\r\n ng-click=\"viewDetails(entity, \'pods\')\">\r\n <div class=\"css-table\">\r\n <div class=\"css-table-row\">\r\n <div class=\"pod-status-cell css-table-cell\">\r\n <span ng-init=\"row={ entity: entity }\" ng-include=\"\'statusTemplate.html\'\"></span>\r\n </div>\r\n <div class=\"pod-label-cell css-table-cell\">\r\n <span ng-init=\"row={ entity: entity }\" ng-include=\"\'labelTemplate.html\'\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"replicationControllerTemplate.html\">\r\n <div class=\"kubernetes-overview-row\">\r\n <div class=\"kubernetes-overview-cell\">\r\n <div\r\n id=\"{{replicationController._key}}\"\r\n title=\"{{replicationController.id}}\"\r\n data-type=\"replicationController\"\r\n data-placement=\"top\"\r\n connect-to=\"{{replicationController.connectTo}}\"\r\n ng-mouseenter=\"mouseEnter($event)\"\r\n ng-mouseleave=\"mouseLeave($event)\"\r\n class=\"jsplumb-node kubernetes-replicationController-node kubernetes-node\"\r\n ng-controller=\"Kubernetes.OverviewBoxController\"\r\n ng-init=\"entity=getEntity(\'replicationController\', \'{{replicationController._key}}\')\"\r\n ng-click=\"viewDetails(entity, \'replicationControllers\')\">\r\n <img class=\"app-icon-medium\" ng-src=\"{{replicationController.$iconUrl}}\">\r\n </div>\r\n </div>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"overviewTemplate.html\">\r\n <div class=\"kubernetes-overview\"\r\n hawtio-jsplumb\r\n draggable=\"false\"\r\n layout=\"false\"\r\n node-sep=\"50\"\r\n rank-sep=\"300\">\r\n <div class=\"kubernetes-overview-row\">\r\n <div class=\"kubernetes-overview-cell\">\r\n <div class=\"kubernetes-overview services\">\r\n <h6>Services</h6>\r\n </div>\r\n </div>\r\n <div class=\"kubernetes-overview-cell\">\r\n <div class=\"kubernetes-overview hosts\">\r\n <h6>Hosts and Pods</h6>\r\n </div>\r\n </div>\r\n <div class=\"kubernetes-overview-cell\">\r\n <div class=\"kubernetes-overview replicationControllers\">\r\n <h6>Replication controllers</h6>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </script>\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <kubernetes-overview></kubernetes-overview>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/pendingPipelines.html","<div class=\"pipeline-panel\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <div class=\"spinner spinner-lg\"></div>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"model.job.builds.length\" class=\"align-center\">\r\n <div>\r\n <h2>No Pipeline Available</h2>\r\n <p>Pipeline is a kind of build which uses Jenkins Workflow internally which has multiple Stages. You will see the active pipelines here after you add a build to this project</p>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.job.builds.length\">\r\n <div ng-repeat=\"build in model.job.builds | filter:model.filterText track by $index\">\r\n <div pipeline-view></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/pipelines.html","<div class=\"row\" ng-controller=\"Kubernetes.PipelinesController\">\r\n <script type=\"text/ng-template\" id=\"hostLinkTemplate.html\">\r\n <div class=\"ngCellText\">\r\n </div>\r\n </script>\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <span>\r\n <hawtio-filter ng-show=\"pipelines.length\"\r\n ng-model=\"filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter builds...\"></hawtio-filter>\r\n </span>\r\n <a class=\"btn btn-default pull-right\"\r\n title=\"Create a new project\"\r\n ng-show=\"forgeEnabled\"\r\n href=\"/workspaces/{{namespace}}/forge/createProject\"><i class=\"fa fa-plus\"></i> Create Project</a>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <div ng-hide=\"pipelines.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no build pipelines available.</p>\r\n <a class=\"btn btn-primary\" href=\"{{baseUri}}/kubernetes/buildConfig\">Create Build Configuration</a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched && pipelines.length\">\r\n <div ng-repeat=\"pipeline in pipelines | filter:filterText\">\r\n <div class=\"row\">\r\n\r\n <div class=\"pipeline-row\">\r\n <div ng-repeat=\"step in pipeline.triggersSteps\">\r\n <div ng-switch=\"step.buildConfig.kind\">\r\n <div ng-switch-default=\"\">\r\n <div class=\"col-md-1\" ng-hide=\"$first\">\r\n <div class=\"pipeline-arrow\">\r\n <i class=\"fa fa-long-arrow-right\"></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-2 pipeline-build\" title=\"Build configuration\">\r\n <span class=\"pipeline-build-details\">\r\n <a title=\"View details for this build configuration\"\r\n href=\"{{baseUri}}/kubernetes/buildConfigs/{{step.buildConfig.metadata.name}}\">\r\n <i class=\"fa fa-cog\"></i>\r\n {{step.buildConfig.metadata.name}}\r\n </a>\r\n </span>\r\n &nbsp;&nbsp;&nbsp;\r\n <span class=\"pipeline-last-build\" ng-show=\"step.buildConfig.$lastBuild\">\r\n <a href=\"{{step.buildConfig.$lastBuild.$viewLink}}\" title=\"view this build\">\r\n <i class=\"fa fa-info\"></i>\r\n build\r\n </a>\r\n </span>\r\n\r\n <div class=\"ngCellText\" class=\"pipeline-last-build-time\"\r\n title=\"last build was at: {{step.buildConfig.$lastBuild.$creationDate | date : \'h:mm:ss a, EEE MMM yyyy\'}}\">\r\n <div ng-switch=\"step.buildConfig.$lastBuild.status\">\r\n <span ng-switch-when=\"New\" class=\"text-primary\">\r\n <i class=\"fa fa-spin fa-spinner\"></i> new: {{step.buildConfig.$lastBuild.$creationDate.relative()}}\r\n </span>\r\n <span ng-switch-when=\"Pending\" class=\"text-primary\">\r\n <i class=\"fa fa-spin fa-spinner\"></i> pending: {{step.buildConfig.$lastBuild.$creationDate.relative()}}\r\n </span>\r\n <span ng-switch-when=\"Running\" class=\"text-primary\">\r\n <i class=\"fa fa-spin fa-spinner\"></i> running {{step.buildConfig.$lastBuild.$creationDate.relative()}}\r\n </span>\r\n <span ng-switch-when=\"Complete\" class=\"text-success\">\r\n <i class=\"fa fa-check-circle\"></i> completed {{step.buildConfig.$lastBuild.$creationDate.relative()}}\r\n </span>\r\n <span ng-switch-when=\"Failed\" class=\"text-danger\">\r\n <i class=\"fa fa-exclamation-circle\"></i> failed {{step.buildConfig.$lastBuild.$creationDate.relative()}}\r\n </span>\r\n <span ng-switch-default class=\"text-warning\">\r\n <i class=\"fa fa-exclamation-triangle\"></i> {{step.buildConfig.$lastBuild.status}}: {{step.buildConfig.$lastBuild.$creationDate.relative()}}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"pipeline-last-build-logs\">\r\n <a href=\"{{step.buildConfig.$lastBuild.$logsLink}}\" title=\"view the logs of this build\">\r\n <i class=\"fa fa-file-text-o\"></i>\r\n logs\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n <div ng-switch-when=\"DeploymentConfig\">\r\n <div class=\"col-md-1\">\r\n <div class=\"pipeline-arrow\">\r\n <i class=\"fa fa-long-arrow-right\"></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-2 pipeline-deploy\" title=\"Deployment Configuration\">\r\n <div class=\"pipeline-build-details\">\r\n <a title=\"View details for this deployment configuration\"\r\n href=\"{{baseUri}}/kubernetes/deploymentConfigs/{{step.buildConfig.metadata.name}}\">\r\n <i class=\"fa fa-cogs\"></i>\r\n {{step.buildConfig.metadata.name}}\r\n </a>\r\n </div>\r\n <div class=\"pipeline-deploy-pods\">\r\n <div class=\"pipeline-pod-counts\" ng-show=\"step.$podCounters\">pods:\r\n <a ng-show=\"step.$podCounters.podsLink\" target=\"pods\" href=\"{{step.$podCounters.podsLink}}\"\r\n title=\"View pods for this deployment\">\r\n <span class=\"badge badge-success\">{{step.$podCounters.ready}}</span>\r\n <span class=\"badge badge-info\">{{step.$podCounters.valid}}</span>\r\n <span ng-show=\"step.$podCounters.waiting\" class=\"badge\">{{step.$podCounters.waiting}}</span>\r\n <span ng-show=\"step.$podCounters.error\"\r\n class=\"badge badge-warning\">{{step.$podCounters.error}}</span>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/pod.html","<div ng-controller=\"Kubernetes.PodController\">\r\n\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row row-header\">\r\n <div class=\"col-md-12\">\r\n <span ng-show=\"model.fetched && !rawMode\" class=\"icon-heading\">\r\n <i ng-show=\"item.$statusCss\" class=\"icon-selected-app fa {{item.$statusCss}}\"></i>\r\n\r\n <img ng-show=\"item.$iconUrl\" class=\"icon-selected-app\" ng-src=\"{{item.$iconUrl}}\">&nbsp;{{item.metadata.name}}\r\n </span>\r\n\r\n <button class=\"btn btn-danger pull-right\"\r\n title=\"Delete this Pod\"\r\n ng-click=\"deleteEntity()\">\r\n <i class=\"fa fa-remove\"></i> Delete\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-default pull-right\"\r\n href=\"{{baseUri}}/kubernetes/pods?namespace={{item.metadata.namespace}}\"><i class=\"fa fa-list\"></i></a>\r\n <span ng-show=\"hasServiceKibana()\" class=\"pull-right\">&nbsp;</span>\r\n <button ng-show=\"hasServiceKibana()\"\r\n class=\"btn btn-default pull-right\"\r\n title=\"View the logs for this pod\"\r\n ng-click=\"openLogs()\">\r\n <i class=\"fa fa-file-text-o\"></i> Logs\r\n </button>\r\n\r\n <a class=\"btn btn-default pull-right\"\r\n ng-click=\"flipRaw()\"\r\n title=\"{{rawMode ? \'Raw mode\' : \'Form mode\'}}\">{{rawMode ? \'Form\' : \'Raw\'}}</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-default pull-right\" ng-show=\"rawMode\" ng-click=\"readOnly = !readOnly\" ng-class=\"!readOnly ? \'btn-primary\' : \'\'\">Edit</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-success pull-right\" ng-show=\"dirty\" ng-click=\"save(rawModel)\">Save</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-primary pull-right\"\r\n href=\"/kubernetes/namespace/{{item.metadata.namespace}}/events?q=kind%3DPod%20name%3D{{item.metadata.name}}\"\r\n title=\"View the events for this Pod\">\r\n <i class=\"fa fa-ellipsis-v\"></i> Events\r\n </a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <div ng-show=\"item.$jolokiaUrl && item.$ready\" ng-controller=\"Kubernetes.ConnectController\" class=\"pull-right\">\r\n <span>&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n ng-click=\"doConnect(item)\"\r\n title=\"Open a new window and connect to this container\">\r\n <i class=\"fa fa-sign-in\"></i> Connect\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched && !rawMode\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div hawtio-object=\"item\" config=\"itemConfig\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div ng-show=\"model.fetched && rawMode\">\r\n <div class=\"raw-json-view\">\r\n <div hawtio-editor=\"rawModel\" mode=\"mode\" read-only=\"readOnly\"></div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/podCreate.html","<div ng-controller=\"Kubernetes.PodEditController\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n title=\"Go back to viewing all the pods\"\r\n href=\"{{baseUri}}/kubernetes/pods\"><i class=\"fa fa-list\"></i></a>\r\n <button class=\"btn btn-primary pull-right\"\r\n title=\"Create a new pod\"\r\n ng-click=\"save()\">\r\n Create Pod\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <div hawtio-form-2=\"config\" entity=\"entity\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/podEdit.html","<div ng-controller=\"Kubernetes.PodEditController\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n title=\"Go back to viewing all the pods\"\r\n href=\"{{baseUri}}/kubernetes/pods\"><i class=\"fa fa-list\"></i></a>\r\n <button class=\"btn btn-primary pull-right\"\r\n title=\"Saves changes to this pod\"\r\n ng-click=\"save()\">\r\n Save\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <div hawtio-form-2=\"config\" entity=\"entity\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/pods.html","<div class=\"row\" ng-controller=\"Kubernetes.Pods\">\r\n <script type=\"text/ng-template\" id=\"imageTemplate.html\">\r\n <div class=\"ngCellText\">\r\n <!-- in table -->\r\n <span ng-hide=\"data\">\r\n <span ng-repeat=\"container in row.entity.spec.containers\">\r\n <span ng-hide=\"container.$imageLink\">{{container.image}}</span>\r\n <a ng-show=\"container.$imageLink\" target=\"dockerRegistry\" href=\"{{container.$imageLink}}\" title=\"{{container.name}}\">{{container.image}}</a>\r\n </span>\r\n </span>\r\n <!-- in detail view -->\r\n <span ng-show=\"data\">\r\n <a target=\"dockerRegistry\" ng-href=\"https://registry.hub.docker.com/u/{{data}}\" title=\"{{data}}\">{{data}}</a>\r\n </span>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"configDetail.html\">\r\n <pre>{{data}}</pre>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"envItemTemplate.html\">\r\n <span ng-controller=\"Kubernetes.EnvItem\">\r\n <span class=\"blue\">{{key}}</span>=<span class=\"green\">{{value}}</span>\r\n </span>\r\n </script>\r\n\r\n\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\" ng-show=\"true\">\r\n <span ng-show=\"!id\">\r\n <hawtio-filter ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter pods...\"></hawtio-filter>\r\n </span>\r\n <button ng-show=\"model.fetched\"\r\n class=\"btn btn-danger pull-right\"\r\n ng-disabled=\"!id && tableConfig.selectedItems.length == 0\"\r\n ng-click=\"deletePrompt(id || tableConfig.selectedItems)\">\r\n <i class=\"fa fa-remove\"></i> Delete\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button ng-show=\"id\"\r\n class=\"btn btn-primary pull-right\"\r\n ng-click=\"id = undefined\"><i class=\"fa fa-list\"></i></button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button ng-show=\"hasServiceKibana()\"\r\n class=\"btn btn-primary pull-right\"\r\n title=\"View the logs for the selected pods\"\r\n ng-disabled=\"!id && tableConfig.selectedItems.length == 0\"\r\n ng-click=\"openLogs()\">\r\n <i class=\"fa fa-file-text-o\"></i> Logs\r\n </button>\r\n <span ng-show=\"hasServiceKibana()\" class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n title=\"Create a new pod\"\r\n ng-click=\"createPods()\"><i class=\"fa fa-plus\"></i> 创建新服务</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <span ng-include=\"\'runButton.html\'\"></span>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"model.pods.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no pods currently running.</p>\r\n </div>\r\n <div ng-show=\"model.pods.length\">\r\n <table class=\"table table-striped table-bordered\" ui-if=\"kubernetes.selectedNamespace\"\r\n hawtio-simple-table=\"tableConfig\"></table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/replicationController.html","<div ng-controller=\"Kubernetes.ReplicationControllerController\">\r\n\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row row-header\">\r\n <div class=\"col-md-12\">\r\n <span ng-show=\"model.fetched && !rawMode\" class=\"icon-heading\">\r\n <img ng-show=\"item.$iconUrl\" class=\"icon-selected-app\" ng-src=\"{{item.$iconUrl}}\">&nbsp;{{item.metadata.name}}\r\n </span>\r\n\r\n <button class=\"btn btn-danger pull-right\"\r\n title=\"Delete this ReplicationController\"\r\n ng-click=\"deleteEntity()\">\r\n <i class=\"fa fa-remove\"></i> Delete\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-default pull-right\"\r\n title=\"Return to table of controllers\"\r\n href=\"{{baseUri}}/kubernetes/replicationControllers?namespace={{item.metadata.namespace}}\"><i class=\"fa fa-list\"></i></a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-default pull-right\"\r\n ng-click=\"flipRaw()\"\r\n title=\"{{rawMode ? \'Raw mode\' : \'Form mode\'}}\">{{rawMode ? \'Form\' : \'Raw\'}}</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-default pull-right\" ng-show=\"rawMode\" ng-click=\"readOnly = !readOnly\" ng-class=\"!readOnly ? \'btn-primary\' : \'\'\">Edit</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-success pull-right\" ng-show=\"dirty\" ng-click=\"save(rawModel)\">Save</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-default pull-right\"\r\n href=\"/kubernetes/namespace/{{item.metadata.namespace}}/events?q=kind%3DReplicationController%20name%3D{{item.metadata.name}}\"\r\n title=\"View the events for this Replication Controller\">\r\n <i class=\"fa fa-ellipsis-v\"></i> Events\r\n </a>\r\n\r\n <span class=\"pull-right\">&nbsp;&nbsp;&nbsp;</span>\r\n\r\n <a class=\"btn btn-default pull-right\"\r\n ng-click=\"resizeDialog.open(item)\"\r\n title=\"Scale this controller, changing the number of pods you wish to run\">\r\n <i class=\"fa fa-server\"></i> Scale\r\n </a>\r\n\r\n <span class=\"pull-right controller-pod-counts\" ng-show=\"item.$podCounters\">Pods:\r\n <a ng-show=\"item.$podCounters.podsLink\" href=\"{{link(item.$podCounters.podsLink)}}\" title=\"View pods\">\r\n <span ng-show=\"item.$podCounters.ready\" class=\"badge badge-success\">{{item.$podCounters.ready}}</span>\r\n <span ng-show=\"item.$podCounters.valid\" class=\"badge badge-info\">{{item.$podCounters.valid}}</span>\r\n <span ng-show=\"item.$podCounters.waiting\" class=\"badge\">{{item.$podCounters.waiting}}</span>\r\n <span ng-show=\"item.$podCounters.error\" class=\"badge badge-warning\">{{item.$podCounters.error}}</span>\r\n </a>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched && !rawMode\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div hawtio-object=\"item\" config=\"itemConfig\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div ng-show=\"model.fetched && rawMode\">\r\n <div class=\"raw-json-view\">\r\n <div hawtio-editor=\"rawModel\" mode=\"mode\" read-only=\"readOnly\"></div>\r\n </div>\r\n </div>\r\n\r\n <ng-include src=\"\'resizeDialog.html\'\"/>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/replicationControllerCreate.html","<div ng-controller=\"Kubernetes.ReplicationControllerEditController\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n title=\"Go back to viewing all the replication controllers\"\r\n href=\"{{baseUri}}/kubernetes/replicationControllers\"><i class=\"fa fa-list\"></i></a>\r\n <button class=\"btn btn-primary pull-right\"\r\n title=\"Create a new controller\"\r\n ng-click=\"save()\">\r\n Create Controller\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <div hawtio-form-2=\"config\" entity=\"entity\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/replicationControllerEdit.html","<div ng-controller=\"Kubernetes.ReplicationControllerEditController\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n title=\"Go back to viewing all the replication controllers\"\r\n href=\"{{baseUri}}/kubernetes/replicationControllers\"><i class=\"fa fa-list\"></i></a>\r\n <button class=\"btn btn-primary pull-right\"\r\n title=\"Saves changes to the controller\"\r\n ng-click=\"save()\">\r\n Save\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <div hawtio-form-2=\"config\" entity=\"entity\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/replicationControllers.html","<div ng-controller=\"Kubernetes.ReplicationControllers\">\r\n <script type=\"text/ng-template\" id=\"currentReplicasTemplate.html\">\r\n <div class=\"ngCellText\" title=\"Number of running pods for this controller\">\r\n <a ng-show=\"row.entity.podsLink\" href=\"{{row.entity.podsLink}}\">\r\n <span class=\"badge {{row.entity.status.replicas > 0 ? \'badge-success\' : \'badge-warning\'}}\">{{row.entity.status.replicas}}</span>\r\n </a>\r\n <span ng-hide=\"row.entity.podsLink\" class=\"badge\">{{row.entity.status.replicas}}</span>\r\n </div>\r\n </script>\r\n <script type=\"text/ng-template\" id=\"desiredReplicas.html\">\r\n <div class=\"ngCellText\">\r\n <a href=\"\" class=\"badge badge-info\" \r\n ng-click=\"$parent.$parent.resizeDialog.open(row.entity)\" \r\n title=\"Edit the number of replicas of this controller\">{{row.entity.spec.replicas || 0}}</a>\r\n </div>\r\n </script>\r\n\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12 sj_fluid\" >\r\n <span ng-show=\"!id\">\r\n <hawtio-filter ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge sj_txt_box\"\r\n placeholder=\"通过数据标签筛选相应的oracle服务...\"\r\n save-as=\"kubernetes-replication-controllers-text-filter\"></hawtio-filter>\r\n </span>\r\n <button ng-show=\"model.fetched\"\r\n class=\"btn btn-danger pull-right sj_btn_grey \"\r\n ng-disabled=\"!id && tableConfig.selectedItems.length == 0\"\r\n ng-click=\"deletePrompt(id || tableConfig.selectedItems)\">\r\n <i class=\"glyphicon glyphicon-trash\"></i> 删除\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <button ng-show=\"model.fetched\"\r\n class=\"btn btn-warning pull-right sj_btn_grey \"\r\n ng-disabled=\"!id && tableConfig.selectedItems.length == 0\"\r\n ng-click=\"stopPrompt(id || tableConfig.selectedItems)\">\r\n <i class=\"glyphicon glyphicon-off\"></i> 停止\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <button ng-show=\"model.fetched\"\r\n class=\"btn btn-info pull-right sj_btn_grey\"\r\n ng-disabled=\"!id && tableConfig.selectedItems.length == 0\"\r\n ng-click=\"reStartPrompt(id || tableConfig.selectedItems)\">\r\n <i class=\"glyphicon glyphicon-play\"></i> 启动\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <button ng-show=\"model.fetched\"\r\n ng-disabled=\"!id && tableConfig.selectedItems.length == 0\"\r\n class=\"btn btn-success pull-right sj_btn_grey\"\r\n ng-click=\"extractClick.open(id || tableConfig.selectedItems)\">\r\n <i class=\"glyphicon glyphicon-cloud-download\"></i> 汇总\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n \r\n <button ng-show=\"model.fetched\"\r\n ng-disabled=\"!id && tableConfig.selectedItems.length == 0\"\r\n class=\"btn btn-success pull-right sj_btn_grey\"\r\n ng-click=\"extractOracle(id || tableConfig.selectedItems)\">\r\n <i class=\"glyphicon glyphicon-cloud-download\"></i> 抽取\r\n </button> \r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12 sj_fluid\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"model.replicationControllers.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">当前没有正在运行的oracle服务.</p>\r\n </div>\r\n <div ng-show=\"model.replicationControllers.length\">\r\n <table class=\"table table-bordered table-striped sj_content_table\"\r\n hawtio-simple-table=\"tableConfig\" ></table>\r\n </div>\r\n </div>\r\n </div>\r\n </div> \r\n\r\n <div modal=\"extractClick.dialog.show\">\r\n <form name=\"selectOracle\" class=\"\" ng-submit=\"extractClick.onOk()\">\r\n <div class=\"modal-header\"><h4>数据汇总</h4></div>\r\n <div class=\"modal-body\">\r\n\r\n <div class=\"form-group\" ng-class=\"{\'has-error\': selectOracle.$invalid}\">\r\n <label class=\"fl control-label sj_control-label\" for=\"selectedItem\">\r\n 数据库名称\r\n <a tabindex=\"0\" role=\"button\" data-toggle=\"popover\" data-trigger=\"focus\" data-html=\"true\" title=\"\"\r\n data-content=\"name of the new project\" data-placement=\"top\" data-original-title=\"\">\r\n <span class=\"fa fa-info-circle\"></span>\r\n </a>\r\n </label>\r\n\r\n <div class=\"col-sm-9\">\r\n <select ng-model=\"extractClick.selectedItem\" class=\"form-control sj_txt_box02\"\r\n title=\"name of the new namespace\"\r\n id =\"selectedItem\"\r\n ng-options=\"x.name for x in configs.oracleParam\">\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <hr/>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-sm-12 alert alert-warning sj_alert-warning\">\r\n <span class=\"help-block \" ng-show=\"configs.oracleParam.length >0 && extractClick.selectedItem\">\r\n <br>\r\n 您所选择的数据库数据将会被抽取到汇总数据库:\r\n <font color=\"Red\"><strong>{{extractClick.selectedItem.name}}</strong></font> 中,是否继续请确认!\r\n </span>\r\n <span class=\"help-block\" ng-show=\"configs.oracleParam.length == 0\">\r\n 当前没有汇总数据库可以选择,请先创建,可以点击创建汇总数据库按钮进行创建或从汇总页面中的服务器数据列表中启动已创建的汇总数据库!\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <input class=\"btn btn-primary sj_btn_blue\" type=\"submit\"\r\n ng-disabled=\"configs.oracleParam.length == 0\"\r\n value=\"确定\">\r\n\r\n <button class=\"btn btn-warning cancel sj_btn_grey\" type=\"button\" ng-click=\"extractClick.close()\">取消</button>\r\n </div>\r\n </form>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/secret.html","<div ng-controller=\"Kubernetes.SecretController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <button class=\"btn btn-default pull-right\"\r\n title=\"Cancel changes to this secret\"\r\n ng-click=\"cancel()\">\r\n Cancel\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button class=\"btn btn-primary pull-right\"\r\n title=\"Saves changes to this secret\"\r\n ng-disabled=\"!entity.name || !changed\"\r\n ng-click=\"save()\">\r\n Save Changes\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div ng-hide=\"fetched\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div ng-show=\"fetched\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <form name=\"secretForm\" class=\"form-horizontal\">\r\n <div class=\"form-group\" ng-hide=\"id\" ng-class=\"{\'has-error\': secretForm.$error.validator}\">\r\n <label class=\"col-sm-2 control-label\" for=\"secretName\">\r\n Name\r\n <a tabindex=\"0\" role=\"button\" data-toggle=\"popover\" data-trigger=\"focus\" data-html=\"true\" title=\"\"\r\n data-content=\"name of the secret\" data-placement=\"top\" data-original-title=\"\">\r\n <span class=\"fa fa-info-circle\"></span>\r\n </a>\r\n </label>\r\n\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" id=\"secretName\" name=\"secretName\" ng-model=\"entity.name\" ng-change=\"entityChanged()\" class=\"form-control\"\r\n ui-validate=\"\'checkNameUnique($value)\'\"\r\n required=\"required\">\r\n <span class=\"help-block\" ng-show=\"secretForm.secretName.$error.validator\">\r\n There is already a secret with that name!\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\" ng-repeat=\"property in entity.properties track by $index\">\r\n <label class=\"col-sm-2 control-label\" for=\"{{property.key}}\">\r\n {{property.label}}\r\n <a tabindex=\"0\" role=\"button\" data-toggle=\"popover\" data-trigger=\"focus\" data-html=\"true\" title=\"\"\r\n data-content=\"{{property.description}}\" data-placement=\"top\" data-original-title=\"\">\r\n <span class=\"fa fa-info-circle\"></span>\r\n </a>\r\n </label>\r\n\r\n <div class=\"col-sm-9\" ng-switch=\"property.type\">\r\n <textarea ng-switch-when=\"textarea\" class=\"form-control\" rows=\"{{property.rows}}\" id=\"{{property.key}}\" ng-change=\"entityChanged()\"\r\n ng-model=\"entity.properties[property.key].value\"></textarea>\r\n <input ng-switch-default=\"\" type=\"{{property.type}}\" class=\"form-control\" id=\"{{property.key}}\" ng-change=\"entityChanged()\"\r\n ng-model=\"entity.properties[property.key].value\">\r\n </div>\r\n\r\n <div class=\"col-sm-1\">\r\n <button class=\"btn btn-danger pull-right\" ng-click=\"deleteProperty(property.key)\"\r\n title=\"Remove this property from the secret\">\r\n <i class=\"fa fa-remove\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n\r\n <div class=\"form-group\" ng-show=\"entity.name\">\r\n <div class=\"col-sm-12\">\r\n <div class=\"text-center\">\r\n <button class=\"btn btn-default btn-padding\" ng-click=\"addFields(httpsKeys)\" ng-hide=\"hasAllKeys(httpsKeys)\"\r\n title=\"Adds fields to store HTTPS user and password fields\">\r\n <i class=\"fa fa-plus\"></i> HTTPS User &amp; Password Fields\r\n </button>\r\n <button class=\"btn btn-default btn-padding\" ng-click=\"addFields(sshKeys)\" ng-hide=\"hasAllKeys(sshKeys)\"\r\n title=\"Adds the fields to store SSH private and public keys\">\r\n <i class=\"fa fa-plus\"></i> SSH Key Fields\r\n </button>\r\n <button class=\"btn btn-default btn-padding\" ng-click=\"addFieldDialog.dialog.open()\"\r\n title=\"Adds a new data field to store new data in this secret\">\r\n <i class=\"fa fa-plus\"></i> Custom Field\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div modal=\"addFieldDialog.dialog.show\">\r\n <form name=\"addDataFieldForm\" class=\"\" ng-submit=\"addFieldDialog.onOk()\">\r\n <div class=\"modal-header\"><h4>Add New Data Field</h4></div>\r\n <div class=\"modal-body\">\r\n\r\n <div class=\"form-group\" ng-class=\"{\'has-error\': addDataFieldForm.$invalid}\">\r\n <label class=\"col-sm-2 control-label\" for=\"newDataName\">\r\n Name\r\n <a tabindex=\"0\" role=\"button\" data-toggle=\"popover\" data-trigger=\"focus\" data-html=\"true\" title=\"\"\r\n data-content=\"name of the new field to add to the secret\" data-placement=\"top\" data-original-title=\"\">\r\n <span class=\"fa fa-info-circle\"></span>\r\n </a>\r\n </label>\r\n\r\n <div class=\"col-sm-10\">\r\n <input type=\"text\" id=\"newDataName\" name=\"newDataName\" ng-model=\"entity.newDataKey\" class=\"form-control\"\r\n ui-validate=\"\'checkFieldUnique($value)\'\"\r\n typeahead=\"title for title in propertyKeys() | filter:$viewValue\"\r\n typeahead-editable=\"true\"\r\n autocomplete=\"off\"\r\n title=\"name of the new field to add to the secret\"\r\n placeholder=\"new data field name\">\r\n\r\n <span class=\"help-block\" ng-show=\"addDataFieldForm.newDataName.$error.validator\">\r\n That field name is already in use!\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <hr/>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-sm-12\">\r\n <span class=\"help-block\">\r\n Enter the name of the new data field to add to the secret\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <input class=\"btn btn-primary\" type=\"submit\"\r\n ng-disabled=\"!entity.newDataKey\"\r\n value=\"Add\">\r\n\r\n <button class=\"btn btn-warning cancel\" type=\"button\" ng-click=\"addFieldDialog.close()\">Cancel</button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/secrets.html","<div class=\"row\" ng-controller=\"Kubernetes.SecretsController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <span ng-show=\"!id\">\r\n <hawtio-filter ng-show=\"model.secrets.length\"\r\n ng-model=\"tableConfig.filterOptions.filterText\"\r\n save-as=\"kubernetes-secrets-text-filter\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter secrets...\"></hawtio-filter>\r\n\r\n <button class=\"btn btn-danger pull-right\"\r\n title=\"Deletes the selected secrets\"\r\n ng-disabled=\"!tableConfig.selectedItems.length\"\r\n ng-click=\"deletePrompt(tableConfig.selectedItems)\">\r\n <i class=\"fa fa-remove\"></i> Delete\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-primary pull-right\"\r\n title=\"Create a new secret\"\r\n ng-show=\"$createSecretLink\" href=\"{{$createSecretLink}}\">\r\n <i class=\"fa fa-plus\"></i> Create\r\n </a>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"model.secrets.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no secrets currently available.</p>\r\n </div>\r\n <div ng-show=\"model.secrets.length\">\r\n <table class=\"table table-bordered table-striped\" ui-if=\"kubernetes.selectedNamespace\"\r\n hawtio-simple-table=\"tableConfig\"></table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/service.html","<div ng-controller=\"Kubernetes.ServiceController\">\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row row-header\">\r\n <div class=\"col-md-12\">\r\n <span ng-show=\"model.fetched && !rawMode\" class=\"icon-heading\">\r\n <img ng-show=\"item.$iconUrl\" class=\"icon-selected-app\" ng-src=\"{{item.$iconUrl}}\">&nbsp;{{item.metadata.name}}\r\n </span>\r\n\r\n <button class=\"btn btn-danger pull-right\"\r\n title=\"Delete this Service\"\r\n ng-click=\"deleteEntity()\">\r\n <i class=\"fa fa-remove\"></i> Delete\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-default pull-right\"\r\n href=\"{{baseUri}}/kubernetes/services?namespace={{item.metadata.namespace}}\"><i class=\"fa fa-list\"></i></a>\r\n\r\n <a class=\"btn btn-default pull-right\"\r\n ng-click=\"flipRaw()\"\r\n title=\"{{rawMode ? \'Raw mode\' : \'Form mode\'}}\">{{rawMode ? \'Form\' : \'Raw\'}}</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-default pull-right\" ng-show=\"rawMode\" ng-click=\"readOnly = !readOnly\" ng-class=\"!readOnly ? \'btn-primary\' : \'\'\">Edit</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-success pull-right\" ng-show=\"dirty\" ng-click=\"save(rawModel)\">Save</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n\r\n <a class=\"btn btn-primary pull-right\"\r\n title=\"Open this service in your browser\"\r\n ng-show=\"item.$connectUrl\" href=\"{{item.$connectUrl}}\">\r\n <i class=\"fa fa-sign-in\"></i> Connect\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched && !rawMode\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div hawtio-object=\"item\" config=\"itemConfig\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div ng-show=\"model.fetched && rawMode\">\r\n <div class=\"raw-json-view\">\r\n <div hawtio-editor=\"rawModel\" mode=\"mode\" read-only=\"readOnly\"></div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/serviceApps.html","<div class=\"dropdown\" ng-controller=\"Kubernetes.ServiceApps\">\r\n <a href=\"\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">\r\n <i class=\"fa fa-ellipsis-v\" title=\"View the available tools\"></i>\r\n </a>\r\n <ul class=\"dropdown-menu right k8sServiceApp-menu\">\r\n <li class=\"k8sServiceApp\" \r\n ng-repeat=\"service in model.serviceApps | filter:filterTemplates | orderBy:\'metadata.name\' track by $index\">\r\n <a href=\"{{service.$connectUrl}}\"\r\n target=\"_blank\"\r\n title=\"Click to open this app\">\r\n <img style=\"width: 32px; height: 32px;\" ng-src=\"{{service.$iconUrl}}\">&nbsp;\r\n <span ng-bind=\"service.metadata.name\"></span>\r\n </a>\r\n </li>\r\n </ul>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/serviceCreate.html","<div ng-controller=\"Kubernetes.ServiceEditController\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n title=\"Go back to viewing all the services\"\r\n href=\"{{baseUri}}/kubernetes/services\"><i class=\"fa fa-list\"></i></a>\r\n <button class=\"btn btn-primary pull-right\"\r\n title=\"Create a new service\"\r\n ng-click=\"save()\">\r\n Create Service\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <div hawtio-form-2=\"config\" entity=\"entity\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/serviceEdit.html","<div ng-controller=\"Kubernetes.ServiceEditController\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n title=\"Go back to viewing all the services\"\r\n href=\"{{baseUri}}/kubernetes/services\"><i class=\"fa fa-list\"></i></a>\r\n <button class=\"btn btn-primary pull-right\"\r\n title=\"Save changes to this service\"\r\n ng-click=\"save()\">\r\n Save\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"fetched\">\r\n <div hawtio-form-2=\"config\" entity=\"entity\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/services.html","<div ng-controller=\"Kubernetes.Services\">\r\n\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\" ng-show=\"model.services.length\">\r\n <span ng-show=\"!id\">\r\n <hawtio-filter ng-model=\"tableConfig.filterOptions.filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter services...\"\r\n save-as=\"kubernetes-services-text-filter\"></hawtio-filter>\r\n </span>\r\n <span ng-hide=\"id\" class=\"pull-right\">\r\n <div class=\"btn-group\">\r\n <a class=\"btn\" ng-disabled=\"mode == \'list\'\" href=\"\" ng-click=\"mode = \'list\'\">\r\n <i class=\"fa fa-list\"></i></a>\r\n <a class=\"btn\" ng-disabled=\"mode == \'icon\'\" href=\"\" ng-click=\"mode = \'icon\'\">\r\n <i class=\"fa fa-table\"></i></a>\r\n </div>\r\n </span>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button ng-show=\"model.fetched\"\r\n class=\"btn btn-danger pull-right\"\r\n ng-disabled=\"!id && tableConfig.selectedItems.length == 0\"\r\n ng-click=\"deletePrompt(id || tableConfig.selectedItems)\">\r\n <i class=\"fa fa-remove\"></i> Delete\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button ng-show=\"id\"\r\n class=\"btn btn-primary pull-right\"\r\n ng-click=\"id = undefined\"><i class=\"fa fa-list\"></i></button>\r\n <span ng-show=\"id\" class=\"pull-right\">&nbsp;</span>\r\n <a class=\"btn btn-default pull-right\"\r\n title=\"Create a new service\"\r\n href=\"{{baseUri}}/kubernetes/namespace/{{namespace}}/serviceCreate\"><i class=\"fa fa-plus\"></i> Create</a>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <span ng-include=\"\'runButton.html\'\"></span>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div ng-hide=\"model.fetched\">\r\n <div class=\"align-center\">\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n </div>\r\n </div>\r\n <div ng-show=\"model.fetched\">\r\n <div ng-hide=\"model.services.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">There are no services currently available.</p>\r\n </div>\r\n <div ng-show=\"model.services.length\">\r\n <div ng-show=\"mode == \'list\'\">\r\n <table class=\"table table-bordered table-striped\" ui-if=\"kubernetes.selectedNamespace\"\r\n hawtio-simple-table=\"tableConfig\"></table>\r\n </div>\r\n\r\n <div ng-hide=\"mode == \'list\'\">\r\n <div class=\"column-box\"\r\n ng-repeat=\"service in model.serviceApps | filter:filterTemplates | orderBy:\'metadata.name\' track by $index\">\r\n <div class=\"row\">\r\n <div class=\"col-md-2\">\r\n <a href=\"{{service.$serviceUrl}}\"\r\n target=\"_blank\"\r\n title=\"Click to open this app\">\r\n <img style=\"width: 64px; height: 64px;\" ng-src=\"{{service.$iconUrl}}\">\r\n </a>\r\n </div>\r\n <div class=\"col-md-9\">\r\n <a href=\"{{service.$serviceUrl}}\"\r\n target=\"_blank\"\r\n title=\"Click to open this app\">\r\n <h3 ng-bind=\"service.metadata.name\"></h3>\r\n </a>\r\n </div>\r\n<!--\r\n <div class=\"col-md-1\">\r\n <a href=\"\" ng-click=\"deleteService(service)\"><i class=\"fa fa-remove red\"></i></a>\r\n </div>\r\n-->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/tabs.html","<div ng-show=\"subTabConfig\" ng-init=\"subTabConfig = $parent.subTabConfig\" class=\"breadcrumb-tabs\"\r\n ng-controller=\"Developer.NavBarController\">\r\n <ul class=\"nav nav-tabs\">\r\n <li ng-repeat=\"breadcrumb in subTabConfig\" ng-show=\"isValid(breadcrumb)\"\r\n class=\"{{breadcrumb.active ? \'active\' : \'\'}}\"\r\n title=\"{{breadcrumb.title}}\">\r\n <a href=\"{{breadcrumb.href}}\">{{breadcrumb.label}}</a>\r\n </li>\r\n </ul>\r\n<div class=\"pull-right inline-block\"\r\n ng-show=\"model.serviceApps && model.serviceApps.length\"\r\n ng-include=\"\'plugins/kubernetes/html/serviceApps.html\'\"></div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/templateDescription.html","<div class=\"modal-header\">\r\n <h3 class=\"modal-title\">Description</h3>\r\n</div>\r\n<div class=\"modal-body\">\r\n <div compile=\"text\"></div>\r\n</div>\r\n<div class=\"modal-footer\">\r\n <button class=\"btn btn-primary\" ng-click=\"ok()\">Close</button>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/templates.html","<div ng-controller=\"Kubernetes.TemplateController\">\r\n <script type=\"text/ng-template\" id=\"truncatedDescriptionTag.html\">\r\n <a href=\"\" ng-click=\"openFullDescription(template)\">More...</a>\r\n </script>\r\n\r\n <div class=\"row\">\r\n <div hawtio-breadcrumbs></div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div hawtio-tabs></div>\r\n </div>\r\n\r\n\r\n <div class=\"row filter-header\">\r\n <div class=\"col-md-12\">\r\n <span ng-show=\"model.templates.length && !formConfig\">\r\n <hawtio-filter ng-model=\"filterText\"\r\n css-class=\"input-xxlarge\"\r\n placeholder=\"Filter templates...\"></hawtio-filter>\r\n </span>\r\n\r\n <button ng-show=\"formConfig\" \r\n class=\"btn btn-success pull-right\"\r\n title=\"Click to deploy this app\" \r\n ng-click=\"substituteAndDeployTemplate()\">\r\n <i class=\"fa fa-play-circle\"></i> Run\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button class=\"btn btn-info pull-right\"\r\n ng-click=\"cancel()\"\r\n title=\"Go back to app view\">\r\n Cancel\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <span class=\"pull-right\">\r\n Target namespace: <select ng-model=\"targetNamespace\" ng-options=\"namespace for namespace in model.namespaces\" title=\"Select the namespace to deploy these objects in\">\r\n </select>\r\n\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"row\" ng-hide=\"formConfig || model.templates.length != 0\">\r\n <div class=\"col-md-12\">\r\n <div class=\"alert alert-info centered\">\r\n There are no templates currently available. Add templates by dragging and dropping template files into this area.\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\" ng-hide=\"formConfig\">\r\n <div class=\"col-md-12\">\r\n <div class=\"column-box\" \r\n ng-repeat=\"template in model.templates | filter:filterTemplates | orderBy:\'metadata.name\' track by $index\">\r\n <div class=\"row\">\r\n <div class=\"col-md-2\">\r\n <img style=\"width: 64px; height: 64px;\" ng-src=\"{{getIconUrl(template)}}\">\r\n </div>\r\n <div class=\"col-md-9\">\r\n <h3 ng-bind=\"template.metadata.name\"></h3>\r\n </div>\r\n <div class=\"col-md-1\">\r\n <a href=\"\" ng-click=\"deleteTemplate(template)\"><i class=\"fa fa-remove red\"></i></a>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-10\">\r\n <div compile=\"getDescription(template)\"></div>\r\n </div>\r\n <div class=\"col-md-2\">\r\n <a href=\"\" \r\n title=\"Click to deploy this app\" \r\n ng-click=\"deployTemplate(template)\">\r\n <i class=\"fa fa-play-circle green fa-3x\"></i>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\" ng-show=\"formConfig\">\r\n <div class=\"col-md-4\">\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div hawtio-form-2=\"formConfig\" entity=\"entity\"></div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n </div>\r\n\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/kubernetes/html/termShell.html","<div class=\"terminal-window\" terminal-window ng-mousedown=\"raise()\">\r\n <div class=\"terminal-title\" ng-mousedown=\"mouseDown($event)\">\r\n <h5 ng-bind=\"containerName\"></h5>\r\n <i class=\"fa fa-remove pull-right clickable\" title=\"Close and exit this terminal\" ng-click=\"close()\"></i>\r\n <i class=\"fa fa-sort-desc pull-right clickable\" title=\"Minimize this terminal\" ng-click=\"minimize($event)\"></i>\r\n </div>\r\n <div class=\"terminal-body\">\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/system/html/regionalismCodeSearch.html","<div ng-controller=\"System.RegionalismCodeController\">\r\n <div hawtio-breadcrumbs></div>\r\n <div hawtio-tabs></div>\r\n <div class=\"container-content \">\r\n <div class=\"container-fluid sj_fluid\"> \r\n <div ng-hide=\"model.regionalismInfo.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">当前没有可以查看的数据.</p>\r\n </div>\r\n <div ng-show=\"model.regionalismInfo.length\" class=\"mr20\">\r\n <table ng-table=\"tableParams\" class=\"table table-condensed table-bordered table-striped\" show-filter=\"true\">\r\n <tr ng-repeat=\"row in $data\">\r\n <td title=\"\'行政区划代码\'\" filter=\"{ code: \'text\'}\" sortable=\"\'code\'\">\r\n {{row.code}}</td>\r\n <td title=\"\'市\'\" filter=\"{ cityName: \'text\'}\" sortable=\"\'cityName\'\">\r\n {{row.cityName}}</td>\r\n <td title=\"\'区县\'\" filter=\"{ districtName: \'text\'}\" sortable=\"\'districtName\'\">\r\n {{row.districtName}}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/system/html/systemCodeSearch.html","<div ng-controller=\"System.SystemCodeController\">\r\n <div hawtio-breadcrumbs></div>\r\n <div hawtio-tabs></div>\r\n <div class=\"container-content \">\r\n <div class=\"container-fluid sj_fluid\"> \r\n <div ng-hide=\"model.systemInfo.length\" class=\"align-center\">\r\n <p class=\"alert alert-info\">当前没有可以查看的数据.</p>\r\n </div>\r\n <div ng-show=\"model.systemInfo.length\" class=\"mr20\">\r\n <table ng-table=\"tableParams\" class=\"table table-condensed table-bordered table-striped\" show-filter=\"true\">\r\n <tr ng-repeat=\"row in $data\">\r\n <td title=\"\'系统编码\'\" filter=\"{ code: \'text\'}\" sortable=\"\'code\'\">\r\n {{row.code}}</td>\r\n <td title=\"\'系统名称\'\" filter=\"{ systemName: \'text\'}\" sortable=\"\'systemName\'\">\r\n {{row.systemName}}</td> \r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/system/html/systemList.html","<div ng-controller=\"System.SystemListController\">\r\n <div hawtio-tabs></div>\r\n <div class=\"container-content \">\r\n <div class=\"container-fluid sj_fluid\">\r\n <div class=\"row clear fl mb10\">\r\n <!--<input type=\"checkbox\" class=\"fl mr5 \" style=\"margin-top: 8px;\" />\r\n <label class=\"fl mr5 \" style=\"margin-top: 5px; font-style:nomal;\">全选</label>-->\r\n <button class=\"btn pull-right sj_btn_grey \" ng-click=\"downloadFilePackage()\">\r\n <i class=\"glyphicon glyphicon-save\"></i> 文件包导出\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span>\r\n <button class=\"btn pull-right sj_btn_grey mr5\" ng-click=\"downLoadExcelFile()\">\r\n <i class=\"glyphicon glyphicon-export\"></i> Excel导出\r\n </button>\r\n <span class=\"pull-right\">&nbsp;</span> \r\n <button class=\"sj_btn_green fl mr5\" ng-click=\"upLoadExcelFile()\">\r\n <i class=\"glyphicon glyphicon-import\"></i>Excel导入\r\n </button> \r\n </div>\r\n <div ng-show=\"true\">\r\n <div class=\"col-md-12\" style=\"padding-left:0; padding-right:20px;\">\r\n <div ng-show=\"model.length == 0\" class=\"alert alert-warning sj_alert-warning\">\r\n <span class=\"help-block\">\r\n 当前没有可以查看的数据请点击Excel导入按钮导入Excel数据</span></div>\r\n <table ng-show=\"model.length != 0\" ng-table-dynamic=\"tableParams with columns\" class=\"table table-condensed table-bordered table-striped table_sj_td_center\">\r\n <tr ng-repeat=\"row in $data\">\r\n <td ng-repeat=\"col in $columns\">\r\n <span ng-show=\"col.field != \'id\'\">{{row[col.field]}}</span>\r\n <button class=\"btn sj_btn\" ng-hide=\"col.field != \'id\'\" ng-click=\"viewClick(row)\">查看</button>\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/system/html/systemSQLManagement.html","<div ng-controller=\"System.SystemSQLManagement\">\r\n <div hawtio-tabs></div>\r\n <div class=\"container-fluid sj_fluid\">\r\n <div class=\"mb10 clear\">\r\n <div class=\"row clear fl mr5 mt5\">\r\n <label>行政区划代码</label>\r\n </div>\r\n <div class=\"row clear fl\">\r\n <select class=\"form-control sj_select_box\" ng-change=\"citySelect(x)\" ng-model=\"x\" ng-init=\"x=\'all\'\">\r\n <option value=\"all\">全部</option>\r\n <option ng-repeat=\"city in cities\">{{city}}</option>\r\n </select>\r\n </div>\r\n <div class=\"row clear fl\">\r\n <select class=\"form-control sj_select_box\" ng-change=\"countrySelect(y)\" ng-model=\"y\" ng-init=\"y=\'all\'\">\r\n <option value=\"all\">全部</option>\r\n <option ng-repeat=\"country in countries\">{{country.name}}</option>\r\n </select>\r\n </div>\r\n <div class=\"row clear fl mr10\">\r\n <select class=\"form-control sj_select_box\" ng-change=\"statusSelect(z)\" ng-model=\"z\" ng-init=\"z=\'all\'\">\r\n <option value=\"all\">全部</option>\r\n <option ng-repeat=\"value in status\">{{value.label}}</option>\r\n </select>\r\n </div>\r\n <div class=\"row clear fr mt5 ml5 mr20\">\r\n <!--<button class=\"btn btn-danger pull-right sj_btn_grey \" ng-click=\"help()\">-->\r\n <i style=\"cursor:pointer; font-size:18px;\" class=\"glyphicon glyphicon-question-sign \" ng-click=\"help()\" title=\"查看状态详情\"></i>\r\n <!--</button> -->\r\n </div>\r\n <div class=\"row clear fr\">\r\n <button class=\"btn pull-right sj_btn_grey \" ng-disabled=\"!checkable\" ng-click=\"quitFile()\">\r\n <i class=\"glyphicon glyphicon-save\"></i> 一键归档\r\n </button>\r\n </div>\r\n <div class=\"row clear fr\">\r\n <button class=\"btn pull-right sj_btn_grey mr5\" ng-disabled=\"!checkable\" ng-click=\"quickCheck()\">\r\n <i class=\"glyphicon glyphicon-save\"></i> 一键审核\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <div ng-show=\"tableParams.dataset.length<=0\" class=\"alert alert-warning sj_alert-warning\">\r\n <span class=\"help-block\">\r\n 当前没有查到符合过滤条件的数据,请重新选择过滤条件</span></div> \r\n <table ng-table=\"tableParams\" class=\"table table-condensed table-bordered table-striped table_sj_td_center\">\r\n <colgroup>\r\n <col width=\"2%\" />\r\n <col width=\"10%\" />\r\n <col width=\"10%\" />\r\n <col width=\"10%\" />\r\n <col width=\"10%\" />\r\n <col width=\"15%\" />\r\n </colgroup>\r\n <tr ng-repeat=\"row in $data\">\r\n <td header=\"\'headerCheckbox.html\'\">\r\n <input type=\"checkbox\" ng-model=\"checkboxes.items[row.id]\" />\r\n </td>\r\n <td title=\"\'状态\'\">\r\n <span ng-show=\"row.sysStatus == 0\">有缺失</span>\r\n <span ng-show=\"row.sysStatus == 1\">正常</span>\r\n <span ng-show=\"row.sysStatus == 2\">待归档</span>\r\n <span ng-show=\"row.sysStatus == 3\">待审核</span>\r\n </td>\r\n <td title=\"\'行政区划代码\'\">{{row.areaCode}}</td>\r\n <td title=\"\'市\'\">{{row.cityName}}</td>\r\n <td title=\"\'区/县\'\">{{row.districtName}}</td>\r\n <td title=\"\'信息系统名称\'\">{{row.sysName}}</td>\r\n <td title=\"\'数据库类型\'\">{{row.dataBaseType}}</td>\r\n <td title=\"\'oracle用户表空间脚本\'\">\r\n <button ng-show=\"row.userTableStatus == 0\" class=\"btn sj_btn\" ng-click=\"addSql(row, \'userTableStatus\')\">&nbsp;&nbsp;上传</button>\r\n <button ng-show=\"row.userTableStatus == 1\" class=\"btn sj_btn\" ng-click=\"viewSql(row, \'userTableStatus\')\">&nbsp;&nbsp;查看</button>\r\n <button ng-show=\"row.userTableStatus == 2\" class=\"btn sj_btn\" ng-click=\"moveSql(row, \'userTableStatus\')\">&nbsp;&nbsp;归档</button>\r\n <button ng-show=\"row.userTableStatus == 3\" class=\"btn sj_btn\" ng-click=\"verifySql(row, \'userTableStatus\')\">&nbsp;&nbsp;审核</button>\r\n <span ng-show=\"row.userTableStatus == 4 \">—</span>\r\n </td>\r\n <td title=\"\'支付信息标准表脚本\'\">\r\n <button ng-show=\"row.ckPayStatus == 0\" class=\"btn sj_btn\" ng-click=\"addSql(row, \'ckPayStatus\')\">&nbsp;&nbsp;上传</button>\r\n <button ng-show=\"row.ckPayStatus == 1\" class=\"btn sj_btn\" ng-click=\"viewSql(row, \'ckPayStatus\')\">&nbsp;&nbsp;查看</button>\r\n <button ng-show=\"row.ckPayStatus == 2\" class=\"btn sj_btn\" ng-click=\"moveSql(row, \'ckPayStatus\')\">&nbsp;&nbsp;归档</button>\r\n <button ng-show=\"row.ckPayStatus == 3\" class=\"btn sj_btn\" ng-click=\"verifySql(row, \'ckPayStatus\')\">&nbsp;&nbsp;审核</button>\r\n <span ng-show=\"row.ckPayStatus == 4 \">—</span>\r\n </td>\r\n <td title=\"\'可执行标准表脚本\'\">\r\n <button ng-show=\"row.ckIndicateStatus == 0\" class=\"btn sj_btn\" ng-click=\"addSql(row, \'ckIndicateStatus\')\">&nbsp;&nbsp;上传</button>\r\n <button ng-show=\"row.ckIndicateStatus == 1\" class=\"btn sj_btn\" ng-click=\"viewSql(row, \'ckIndicateStatus\')\">&nbsp;&nbsp;查看</button>\r\n <button ng-show=\"row.ckIndicateStatus == 2\" class=\"btn sj_btn\" ng-click=\"moveSql(row, \'ckIndicateStatus\')\">&nbsp;&nbsp;归档</button>\r\n <button ng-show=\"row.ckIndicateStatus == 3\" class=\"btn sj_btn\" ng-click=\"verifySql(row, \'ckIndicateStatus\')\">&nbsp;&nbsp;审核</button>\r\n <span ng-show=\"row.ckIndicateStatus == 4 \">—</span>\r\n </td>\r\n </tr>\r\n </table> \r\n </div>\r\n </div>\r\n</div>\r\n");
$templateCache.put("plugins/system/html/systemVerification.html","<div ng-controller=\"System.SystemVerificationController\">\r\n <div hawtio-tabs></div>\r\n <div class=\"container-content \">\r\n <div class=\"container-fluid sj_fluid \">\r\n <div class=\"mb10 clear\">\r\n <div class=\"row clear fl mr5 mt5\">\r\n <label>行政区划代码</label>\r\n </div>\r\n <div class=\"row clear fl\">\r\n <select class=\"form-control sj_select_box\" ng-change=\"citySelect(x)\" ng-model=\"x\" ng-init=\"x=\'all\'\">\r\n <option value=\"all\">请选择市级</option>\r\n <option ng-repeat=\"city in cities\">{{city}}</option>\r\n </select>\r\n </div>\r\n <div class=\"row clear fl mr10\">\r\n <select class=\"form-control sj_select_box\" ng-change=\"countrySelect(y)\" ng-model=\"y\" ng-init=\"y=\'all\'\">\r\n <option value=\"all\">请选择区/县</option>\r\n <option ng-repeat=\"country in countries\">{{country.name}}</option>\r\n </select>\r\n </div>\r\n <div class=\"row clear fr mr20\">\r\n <button class=\"btn pull-right sj_btn_grey \" ng-disabled=\"!checkable\" ng-click=\"deleteRows()\">\r\n <i class=\"glyphicon glyphicon-save\"></i> 删除\r\n </button>\r\n </div>\r\n <div class=\"row clear fr mr5\">\r\n <button class=\"btn pull-right sj_btn_grey \" ng-disabled=\"!checkable\" ng-click=\"check()\">\r\n <i class=\"glyphicon glyphicon-save\"></i> 校验\r\n </button>\r\n </div>\r\n <div class=\"row clear fr mr5\">\r\n <button class=\"btn pull-right sj_btn_grey \" ng-disabled=\"!checkable\" ng-click=\"checkSQLSERVER()\">\r\n <i class=\"glyphicon glyphicon-save\"></i> 抽取\r\n </button>\r\n </div> \r\n </div>\r\n <div class=\"col-md-12 clear\">\r\n <table ng-show=\"tableData.length > 0\" ng-table=\"tableParams\" class=\"table table-condensed table-bordered table-striped table_sj_td_center\">\r\n <colgroup>\r\n <col width=\"2%\" />\r\n </colgroup>\r\n <tr ng-repeat=\"row in $data\" ng-class=\"{\'danger\': row.checkResult == \'否\', \'success\': row.checkResult == \'是\'}\">\r\n <td header=\"\'headerCheckbox.html\'\">\r\n <input type=\"checkbox\" ng-model=\"checkboxes.items[row.id]\" />\r\n </td>\r\n <td title=\"\'验证结果\'\">{{row.checkResult}}</td>\r\n <td title=\"\'采集\'\">{{row.collection}}</td>\r\n <td title=\"\'支付信息标准表\'\">\r\n <span ng-show=\"row.payResultLast == 0\">未校验</span>\r\n <span ng-show=\"row.payResultLast == 1\">不需校验</span>\r\n <span ng-show=\"row.payResultLast == 2\">校验中</span>\r\n <span ng-show=\"row.payResultLast == 3\">标准表存在</span>\r\n <span ng-show=\"row.payResultLast == 4\">标准表不存在</span>\r\n <span ng-show=\"row.payResultLast == 5\">待抽取</span>\r\n <span ng-show=\"row.payResultLast == 6\">正在抽取</span>\r\n <span ng-show=\"row.payResultLast == 7\">抽取完成</span>\r\n </td>\r\n <td title=\"\'可执行标准表\'\">\r\n <span ng-show=\"row.execResultLast == 0\">未校验</span>\r\n <span ng-show=\"row.execResultLast == 1\">不需校验</span>\r\n <span ng-show=\"row.execResultLast == 2\">校验中</span>\r\n <span ng-show=\"row.execResultLast == 3\">标准表存在</span>\r\n <span ng-show=\"row.execResultLast == 4\">标准表不存在</span>\r\n <span ng-show=\"row.execResultLast == 5\">待抽取</span>\r\n <span ng-show=\"row.execResultLast == 6\">正在抽取</span>\r\n <span ng-show=\"row.execResultLast == 7\">抽取完成</span>\r\n </td> \r\n <td title=\"\'市\'\">{{row.cityName}}</td>\r\n <td title=\"\'区/县\'\">{{row.districtName}}</td>\r\n <td title=\"\'行政区划代码\'\">{{row.areaCode}}</td>\r\n <td title=\"\'更新\'\" class=\"sj_td_center\">\r\n <button ng-show=\"row.collUpdate == \'是\'\" class=\"sj_link_blue\" ng-click=\"update(row)\">&nbsp;&nbsp;是</button>\r\n <span ng-hide=\"row.collUpdate == \'是\'\">否</span>\r\n </td>\r\n <td title=\"\'系统名称\'\">{{row.sysName}}</td>\r\n <td title=\"\'版本号\'\">{{row.dataVersion}}</td>\r\n <td title=\"\'联系人\'\">{{row.departmentManager}}</td>\r\n <td title=\"\'联系方式\'\">{{row.managerContacts}}</td>\r\n <td title=\"\'数据库类型\'\">{{row.dataBaseType}}</td>\r\n <td title=\"\'抽取日志\'\">\r\n <button class=\"btn sj_btn\" ng-click=\"openLog(row)\">\r\n <span>查看日志</span>\r\n </button>\r\n </td>\r\n </tr>\r\n </table>\r\n <div ng-hide=\"tableData.length > 0\" class=\"col-sm-12 alert alert-warning sj_alert-warning\">\r\n <span class=\"help-block\" >\r\n 当前没有选择需要校验的数据,请选择需要校验的数据!\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n");}]); hawtioPluginLoader.addModule("hawtio-kubernetes-templates");